Arquivos
hhvm/hphp/system/lib/systemlib.cpp
T
mwilliams 71859e5566 Add support for .hhas files in systemlib
Will be needed for array_filter/array_map etc

This sets things up so that if we define a builtin in systemlib, we rename
the corresponding c++ builtin with the prefix __builtin_, so its still available
(in case the php builtin wants to delegate some edge cases, and to make
it easy to run comparisons between the php and c++ implementations).

Also did a little reorganization to get rid of Func::isPHPBuiltin,
and use an Attr to identify functions as builtins. C++ builtins can
still be identified by checking the Func::info() method. This is needed
to allow builtin methods defined in php (such as array_map) to lookup their
arguments in the correct context.
2013-05-30 17:33:02 -07:00

171 linhas
7.3 KiB
C++

/*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010- Facebook, Inc. (http://www.facebook.com) |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#include "hphp/system/lib/systemlib.h"
#include "hphp/runtime/base/hphp_system.h"
#include "hphp/runtime/base/complex_types.h"
#include "hphp/runtime/vm/unit.h"
#include "hphp/runtime/vm/class.h"
#include "hphp/runtime/vm/instance.h"
namespace HPHP {
///////////////////////////////////////////////////////////////////////////////
#define ALLOC_OBJECT_STUB_RETURN(name) \
HPHP::Instance::newInstance(SystemLib::s_##name##Class)
#define ALLOC_OBJECT_STUB(name) \
ObjectData* SystemLib::Alloc##name##Object() { \
return ALLOC_OBJECT_STUB_RETURN(name); \
}
bool SystemLib::s_inited = false;
HPHP::Unit* SystemLib::s_unit = nullptr;
HPHP::Unit* SystemLib::s_hhas_unit = nullptr;
HPHP::Unit* SystemLib::s_nativeFuncUnit = nullptr;
HPHP::Unit* SystemLib::s_nativeClassUnit = nullptr;
HPHP::Func* SystemLib::s_nullFunc = nullptr;
#define DEFINE_SYSTEMLIB_CLASS(cls) \
HPHP::Class* SystemLib::s_ ## cls ## Class = nullptr;
SYSTEMLIB_CLASSES(DEFINE_SYSTEMLIB_CLASS)
#undef DEFINE_SYSTEMLIB_CLASS
ObjectData* SystemLib::AllocStdClassObject() {
return HPHP::Instance::newInstance(SystemLib::s_stdclassClass);
}
ObjectData* SystemLib::AllocPinitSentinel() {
return HPHP::Instance::newInstance(SystemLib::s_pinitSentinelClass);
}
#define CREATE_AND_CONSTRUCT(clsname, params) \
HPHP::Instance* inst = \
HPHP::Instance::newInstance(SystemLib::s_##clsname##Class); \
TypedValue ret; \
{ \
/* Increment refcount across call to ctor, so the object doesn't */ \
/* get destroyed when ctor's frame is torn down */ \
CountableHelper cnt(inst); \
inst->invokeUserMethod(&ret, \
SystemLib::s_##clsname##Class->getCtor(), \
params); \
} \
tvRefcountedDecRef(&ret); \
return inst;
ObjectData* SystemLib::AllocExceptionObject(CVarRef message) {
CREATE_AND_CONSTRUCT(Exception, CREATE_VECTOR1(message));
}
ObjectData* SystemLib::AllocBadMethodCallExceptionObject(CVarRef message) {
CREATE_AND_CONSTRUCT(BadMethodCallException, CREATE_VECTOR1(message));
}
ObjectData* SystemLib::AllocInvalidArgumentExceptionObject(CVarRef message) {
CREATE_AND_CONSTRUCT(InvalidArgumentException, CREATE_VECTOR1(message));
}
ObjectData* SystemLib::AllocRuntimeExceptionObject(CVarRef message) {
CREATE_AND_CONSTRUCT(RuntimeException, CREATE_VECTOR1(message));
}
ObjectData* SystemLib::AllocOutOfBoundsExceptionObject(CVarRef message) {
CREATE_AND_CONSTRUCT(OutOfBoundsException, CREATE_VECTOR1(message));
}
ObjectData* SystemLib::AllocInvalidOperationExceptionObject(CVarRef message) {
CREATE_AND_CONSTRUCT(InvalidOperationException, CREATE_VECTOR1(message));
}
ObjectData* SystemLib::AllocDOMDocumentObject(CStrRef version,
CStrRef encoding) {
CREATE_AND_CONSTRUCT(DOMDocument, CREATE_VECTOR2(version, encoding));
}
ObjectData* SystemLib::AllocDOMExceptionObject(CVarRef message, CVarRef code) {
CREATE_AND_CONSTRUCT(DOMException, CREATE_VECTOR2(message, code));
}
ObjectData*
SystemLib::AllocSoapFaultObject(CVarRef code,
CVarRef message,
CVarRef actor /* = null_variant */,
CVarRef detail /* = null_variant */,
CVarRef name /* = null_variant */,
CVarRef header /* = null_variant */) {
CREATE_AND_CONSTRUCT(SoapFault, CREATE_VECTOR6(code, message, actor,
detail, name, header));
}
ObjectData* SystemLib::AllocSplFileObjectObject(CVarRef filename,
CVarRef open_mode,
CVarRef use_include_path,
CVarRef context) {
CREATE_AND_CONSTRUCT(SplFileObject, CREATE_VECTOR4(filename,
open_mode,
use_include_path,
context));
}
ObjectData* SystemLib::AllocSplFileInfoObject(CVarRef filename) {
CREATE_AND_CONSTRUCT(SplFileInfo, CREATE_VECTOR1(filename));
}
ObjectData* SystemLib::AllocKeysIterableObject(CVarRef mp) {
CREATE_AND_CONSTRUCT(KeysIterable, CREATE_VECTOR1(mp));
}
ObjectData* SystemLib::AllocKVZippedIterableObject(CVarRef mp) {
CREATE_AND_CONSTRUCT(KVZippedIterable, CREATE_VECTOR1(mp));
}
ObjectData* SystemLib::AllocMappedKeyedIterableObject(CVarRef iterable,
CVarRef callback) {
CREATE_AND_CONSTRUCT(MappedKeyedIterable, CREATE_VECTOR2(iterable,
callback));
}
ObjectData* SystemLib::AllocFilteredKeyedIterableObject(CVarRef iterable,
CVarRef callback) {
CREATE_AND_CONSTRUCT(FilteredKeyedIterable, CREATE_VECTOR2(iterable,
callback));
}
ObjectData* SystemLib::AllocZippedKeyedIterableObject(CVarRef iterable1,
CVarRef iterable2) {
CREATE_AND_CONSTRUCT(ZippedKeyedIterable, CREATE_VECTOR2(iterable1,
iterable2));
}
ObjectData* SystemLib::AllocIterableViewObject(CVarRef iterable) {
CREATE_AND_CONSTRUCT(IterableView, CREATE_VECTOR1(iterable));
}
ObjectData* SystemLib::AllocKeyedIterableViewObject(CVarRef iterable) {
CREATE_AND_CONSTRUCT(KeyedIterableView, CREATE_VECTOR1(iterable));
}
#undef CREATE_AND_CONSTRUCT
ALLOC_OBJECT_STUB(Directory);
ALLOC_OBJECT_STUB(RecursiveDirectoryIterator);
ALLOC_OBJECT_STUB(PDOException);
///////////////////////////////////////////////////////////////////////////////
}