Don't serialize cppext instances unless they opt-in, and pass the class name for the debugger

Most CPP extension classes don’t think about serialization, and some require more initialization than the default contractor provides. The result is that on deserialization we end up with a partially initialized object, and undefined behavior after that.

Modified the serializer to emit __PHP_Unserializable_Class instead, and just the class name for the debugger case. Modified the deserializer to create a __PHP_Unserializable_Class, too, if we are given a string with a CPP extension instance in it, so we're safe on both sides. I do not raise a warning; the results are pretty clear, I think, and it's also unlikely that most such warnings could (or should) be corrected. Finally, I also removed the odd behavior of emitting "dummy" classes for Closure and Continuation. I found no use of these in any source tree. Closure had no implementation at all, and Continuation had an implementation that simply raised a fatal on any method call. Thus we can safely assume that even if someone was serializing one of these types, they were receiving an object that was useless to them, or would fatal. So I believe this transformation is safe.
Esse commit está contido em:
Mike Magruder
2013-07-08 16:52:13 -07:00
commit de Sara Golemon
commit 8283969d81
64 arquivos alterados com 410 adições e 486 exclusões
+2 -1
Ver Arquivo
@@ -60,8 +60,9 @@ public:
// need a non-zero number for const char * maps
IsNothing = (1 << 13),
HasDocComment = (1 << 14), // x x
HasDocComment = (1 << 14), // x x x
HasGeneratorAsBody = (1 << 15), // x x
IsCppSerializable = (1 << 15), // x
HipHopSpecific = (1 << 16), // x x
VariableArguments = (1 << 17), // x x
+23 -28
Ver Arquivo
@@ -557,6 +557,8 @@ void ObjectData::serialize(VariableSerializer* serializer) const {
static StaticString s_PHP_Incomplete_Class("__PHP_Incomplete_Class");
static StaticString s_PHP_Incomplete_Class_Name("__PHP_Incomplete_Class_Name");
static StaticString s_PHP_Unserializable_Class_Name(
"__PHP_Unserializable_Class_Name");
void ObjectData::serializeImpl(VariableSerializer* serializer) const {
bool handleSleep = false;
@@ -577,6 +579,15 @@ void ObjectData::serializeImpl(VariableSerializer* serializer) const {
}
return;
}
// Only serialize CPP extension type instances which can actually
// be deserialized.
if ((builtinPropSize() > 0) && !getVMClass()->isCppSerializable()) {
Object placeholder = ObjectData::newInstance(
SystemLib::s___PHP_Unserializable_ClassClass);
placeholder->o_set(s_PHP_Unserializable_Class_Name, o_getClassName());
placeholder->serialize(serializer);
return;
}
handleSleep = const_cast<ObjectData*>(this)->php_sleep(ret);
} else if (UNLIKELY(serializer->getType() ==
VariableSerializer::Type::DebuggerSerialize)) {
@@ -602,12 +613,18 @@ void ObjectData::serializeImpl(VariableSerializer* serializer) const {
}
return;
}
// Don't try to serialize a CPP extension class which doesn't
// support serialization. Just send the class name instead.
if ((builtinPropSize() > 0) && !getVMClass()->isCppSerializable()) {
serializer->write(o_getClassName());
return;
}
try {
handleSleep = const_cast<ObjectData*>(this)->php_sleep(ret);
} catch (...) {
raise_warning("%s::sleep() throws exception", o_getClassName().data());
ret = uninit_null();
handleSleep = true;
serializer->writeNull();
return;
}
}
if (UNLIKELY(handleSleep)) {
@@ -639,32 +656,10 @@ void ObjectData::serializeImpl(VariableSerializer* serializer) const {
serializer->setObjectInfo(o_getClassName(), o_getId(), 'O');
wanted.serialize(serializer, true);
} else {
if (instanceof(c_Closure::s_cls)) {
if (serializer->getType() == VariableSerializer::Type::APCSerialize) {
p_DummyClosure dummy(NEWOBJ(c_DummyClosure));
serializer->write(dummy);
} else if (serializer->getType() ==
VariableSerializer::Type::DebuggerSerialize) {
serializer->write("Closure");
} else {
throw_fatal("Serialization of Closure is not allowed");
}
} else if (instanceof(c_Continuation::s_cls)) {
if (serializer->getType() == VariableSerializer::Type::APCSerialize) {
p_DummyContinuation dummy(NEWOBJ(c_DummyContinuation));
serializer->write(dummy);
} else if (serializer->getType() ==
VariableSerializer::Type::DebuggerSerialize) {
serializer->write("Continuation");
} else {
throw_fatal("Serialization of Continuation is not allowed");
}
} else {
raise_warning("serialize(): __sleep should return an array only "
"containing the names of instance-variables to "
"serialize");
uninit_null().serialize(serializer);
}
raise_warning("serialize(): __sleep should return an array only "
"containing the names of instance-variables to "
"serialize");
uninit_null().serialize(serializer);
}
} else {
if (isCollection()) {
+14 -3
Ver Arquivo
@@ -62,6 +62,8 @@ static StaticString s_1("1");
static StaticString s_unserialize("unserialize");
static StaticString s_PHP_Incomplete_Class("__PHP_Incomplete_Class");
static StaticString s_PHP_Incomplete_Class_Name("__PHP_Incomplete_Class_Name");
static StaticString s_PHP_Unserializable_Class_Name(
"__PHP_Unserializable_Class_Name");
///////////////////////////////////////////////////////////////////////////////
// local helpers
@@ -1880,9 +1882,18 @@ void Variant::unserialize(VariableUnserializer *uns,
}
}
if (cls) {
obj = ObjectData::newInstance(cls);
if (UNLIKELY(cls == c_Pair::s_cls && size != 2)) {
throw Exception("Pair objects must have exactly 2 elements");
// Only unserialize CPP extension types which can actually
// support it. Otherwise, we risk creating a CPP object
// without having it intialized completely.
if ((cls->builtinPropSize() > 0) && !cls->isCppSerializable()) {
obj = ObjectData::newInstance(
SystemLib::s___PHP_Unserializable_ClassClass);
obj->o_set(s_PHP_Unserializable_Class_Name, clsName);
} else {
obj = ObjectData::newInstance(cls);
if (UNLIKELY(cls == c_Pair::s_cls && size != 2)) {
throw Exception("Pair objects must have exactly 2 elements");
}
}
} else {
obj = ObjectData::newInstance(
-17
Ver Arquivo
@@ -78,12 +78,6 @@ c_Closure* c_Closure::clone() {
return closure;
}
bool c_Closure::php_sleep(Variant &ret) {
ret = false;
return true;
}
HphpArray* c_Closure::getStaticLocals() {
if (m_VMStatics.get() == NULL) {
m_VMStatics = ArrayData::Make(1);
@@ -91,16 +85,5 @@ HphpArray* c_Closure::getStaticLocals() {
return m_VMStatics.get();
}
///////////////////////////////////////////////////////////////////////////////
c_DummyClosure::c_DummyClosure(Class* cb) :
ExtObjectData(cb) {
}
c_DummyClosure::~c_DummyClosure() {}
void c_DummyClosure::t___construct() {
}
///////////////////////////////////////////////////////////////////////////////
}
-21
Ver Arquivo
@@ -55,33 +55,12 @@ public:
static size_t funcOffset() { return offsetof(c_Closure, m_func); }
static size_t thisOffset() { return offsetof(c_Closure, m_thisOrClass); }
protected:
virtual bool php_sleep(Variant &ret);
private:
SmartPtr<HphpArray> m_VMStatics;
ObjectData* m_thisOrClass;
const Func* m_func;
};
///////////////////////////////////////////////////////////////////////////////
// class DummyClosure
FORWARD_DECLARE_CLASS_BUILTIN(DummyClosure);
class c_DummyClosure : public ExtObjectData {
public:
DECLARE_CLASS(DummyClosure, DummyClosure, ObjectData)
// need to implement
public: c_DummyClosure(Class* cls = c_DummyClosure::s_cls);
public: ~c_DummyClosure();
public: void t___construct();
// implemented by HPHP
public: c_DummyClosure *create();
};
///////////////////////////////////////////////////////////////////////////////
}
#endif // incl_HPHP_EXT_CLOSURE_H_
-39
Ver Arquivo
@@ -104,11 +104,6 @@ Variant c_Continuation::t_key() {
return m_key;
}
bool c_Continuation::php_sleep(Variant &ret) {
ret = false;
return true;
}
void c_Continuation::t_next() {
const_assert(false);
}
@@ -252,39 +247,5 @@ void c_Continuation::call_raise(ObjectData* e) {
g_vmContext->invokeContFunc(func, this, &arg);
}
///////////////////////////////////////////////////////////////////////////////
c_DummyContinuation::c_DummyContinuation(Class* cb) :
ExtObjectData(cb) {
}
c_DummyContinuation::~c_DummyContinuation() {}
void c_DummyContinuation::t___construct() {
}
Variant c_DummyContinuation::t_current() {
throw_fatal("Tring to use a DummyContinuation");
return uninit_null();
}
Variant c_DummyContinuation::t_key() {
throw_fatal("Tring to use a DummyContinuation");
return uninit_null();
}
void c_DummyContinuation::t_next() {
throw_fatal("Tring to use a DummyContinuation");
}
void c_DummyContinuation::t_rewind() {
throw_fatal("Tring to use a DummyContinuation");
}
bool c_DummyContinuation::t_valid() {
throw_fatal("Tring to use a DummyContinuation");
return false;
}
///////////////////////////////////////////////////////////////////////////////
}
-21
Ver Arquivo
@@ -108,7 +108,6 @@ public:
return arOffset;
}
protected: virtual bool php_sleep(Variant &ret);
public:
void call_next();
void call_send(Cell& v);
@@ -160,26 +159,6 @@ public:
}
};
///////////////////////////////////////////////////////////////////////////////
// class DummyContinuation
FORWARD_DECLARE_CLASS_BUILTIN(DummyContinuation);
class c_DummyContinuation : public ExtObjectData {
public:
DECLARE_CLASS(DummyContinuation, DummyContinuation, ObjectData)
// need to implement
public: c_DummyContinuation(Class* cls = c_DummyContinuation::s_cls);
public: ~c_DummyContinuation();
public: void t___construct();
public: Variant t_current();
public: Variant t_key();
public: void t_next();
public: void t_rewind();
public: bool t_valid();
};
///////////////////////////////////////////////////////////////////////////////
}
+7
Ver Arquivo
@@ -2430,4 +2430,11 @@ void Class::getChildren(std::vector<TypedValue *> &out) {
}
}
// True if a CPP extension class has opted into serialization.
bool Class::isCppSerializable() const {
assert(builtinPropSize() > 0); // Only call this on CPP classes
return clsInfo() &&
(clsInfo()->getAttribute() & ClassInfo::IsCppSerializable);
}
} // HPHP::VM
+1
Ver Arquivo
@@ -578,6 +578,7 @@ public:
int builtinPropSize() const { return m_builtinPropSize; }
BuiltinCtorFunction instanceCtor() const { return m_InstanceCtor; }
bool isCppSerializable() const;
// Interfaces this class declares in its "implements" clause.
const std::vector<ClassPtr>& declInterfaces() const {
+1
Ver Arquivo
@@ -130,6 +130,7 @@ define('IsReference', 1 << 11);
define('IsConstructor', 1 << 12);
define('IsNothing', 1 << 13);
define('HasDocComment', 1 << 14);
define('IsCppSerializable', 1 << 15);
define('HipHopSpecific', 1 << 16);
define('VariableArguments', 1 << 17);
define('RefVariableArguments', 1 << 18);
-20
Ver Arquivo
@@ -25,26 +25,6 @@
],
"consts": [
]
},
{
"name": "DummyClosure",
"desc": "Represents an invalid closure which will fatal when used.",
"flags": [
],
"funcs": [
{
"name": "__construct",
"args": [
],
"return": {
"type": null
},
"flags": [
]
}
],
"consts": [
]
}
]
}
+5
Ver Arquivo
@@ -13,6 +13,7 @@
"desc": "An ordered collection where values are keyed using integers 0 thru n-1 in order.",
"flags": [
"IsFinal",
"IsCppSerializable",
"HasDocComment"
],
"footer": "\n private:\n TypedValue* m_data;\n int size;\n int capacity;",
@@ -749,6 +750,7 @@
"desc": "An unordered dictionary-style collection.",
"flags": [
"IsFinal",
"IsCppSerializable",
"HasDocComment"
],
"funcs": [
@@ -1442,6 +1444,7 @@
"desc": "An ordered dictionary-style collection.",
"flags": [
"IsFinal",
"IsCppSerializable",
"HasDocComment"
],
"funcs": [
@@ -2135,6 +2138,7 @@
"desc": "An unordered set-style collection.",
"flags": [
"IsFinal",
"IsCppSerializable",
"HasDocComment"
],
"funcs": [
@@ -2645,6 +2649,7 @@
"desc": "An ordered fixed-sized container.",
"flags": [
"IsFinal",
"IsCppSerializable",
"HasDocComment"
],
"footer": "\n private:\n int size;\n int capacity;",
-73
Ver Arquivo
@@ -194,79 +194,6 @@
],
"consts": [
]
},
{
"name": "DummyContinuation",
"ifaces": [
"Iterator"
],
"desc": "Represents an invalid continuation which will fatal when used.",
"flags": [
],
"funcs": [
{
"name": "__construct",
"args": [
],
"return": {
"type": null
},
"flags": [
]
},
{
"name": "current",
"return": {
"type": "Variant"
},
"flags": [
],
"args": [
]
},
{
"name": "key",
"return": {
"type": "Int64"
},
"flags": [
],
"args": [
]
},
{
"name": "next",
"return": {
"type": null
},
"flags": [
],
"args": [
]
},
{
"name": "rewind",
"return": {
"type": null
},
"flags": [
],
"args": [
]
},
{
"name": "valid",
"return": {
"type": "Boolean"
},
"flags": [
],
"args": [
]
}
],
"consts": [
]
}
]
}
+6
Ver Arquivo
@@ -8,3 +8,9 @@ class stdClass {
class __PHP_Incomplete_Class {
public $__PHP_Incomplete_Class_Name;
}
// Used in serialize() for classes which don't support
// serialization. Typically CPP Extension classes.
class __PHP_Unserializable_Class {
public $__PHP_Unserializable_Class_Name;
}
+1
Ver Arquivo
@@ -64,6 +64,7 @@ namespace Eval {
x(IterableView) \
x(KeyedIterableView) \
x(__PHP_Incomplete_Class) \
x(__PHP_Unserializable_Class) \
class SystemLib {
public:
@@ -1,9 +1,11 @@
Collator
HipHop Warning: Collator::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: Collator::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(Collator)#1 (0) {
}
string(19) "O:8:"Collator":0:{}"
object(Collator)#2 (0) {
string(92) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:8:"Collator";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(8) "Collator"
}
array(13) {
[0]=>
@@ -35,15 +37,15 @@ array(13) {
}
================
A_Collator
HipHop Warning: Collator::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: Collator::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_Collator)#3 (1) {
["___x"]=>
NULL
}
string(35) "O:10:"A_Collator":1:{s:4:"___x";N;}"
object(A_Collator)#4 (1) {
["___x"]=>
NULL
string(95) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:10:"A_Collator";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(10) "A_Collator"
}
array(13) {
[0]=>
@@ -1,9 +1,11 @@
DOMAttr
HipHop Warning: DOMAttr::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: DOMAttr::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(DOMAttr)#1 (0) {
}
string(18) "O:7:"DOMAttr":0:{}"
object(DOMAttr)#2 (0) {
string(91) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:7:"DOMAttr";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(7) "DOMAttr"
}
array(22) {
[0]=>
@@ -53,15 +55,15 @@ array(22) {
}
================
A_DOMAttr
HipHop Warning: DOMAttr::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: DOMAttr::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_DOMAttr)#3 (1) {
["___x"]=>
NULL
}
string(33) "O:9:"A_DOMAttr":1:{s:4:"___x";N;}"
object(A_DOMAttr)#4 (1) {
["___x"]=>
NULL
string(93) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:9:"A_DOMAttr";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(9) "A_DOMAttr"
}
array(22) {
[0]=>
@@ -1,9 +1,11 @@
DOMCDATASection
HipHop Warning: DOMCDATASection::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: DOMCDATASection::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(DOMCDATASection)#1 (0) {
}
string(27) "O:15:"DOMCDATASection":0:{}"
object(DOMCDATASection)#2 (0) {
string(100) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:15:"DOMCDATASection";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(15) "DOMCDATASection"
}
array(28) {
[0]=>
@@ -65,15 +67,15 @@ array(28) {
}
================
A_DOMCDATASection
HipHop Warning: DOMCDATASection::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: DOMCDATASection::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_DOMCDATASection)#3 (1) {
["___x"]=>
NULL
}
string(42) "O:17:"A_DOMCDATASection":1:{s:4:"___x";N;}"
object(A_DOMCDATASection)#4 (1) {
["___x"]=>
NULL
string(102) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:17:"A_DOMCDATASection";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(17) "A_DOMCDATASection"
}
array(28) {
[0]=>
@@ -1,8 +1,10 @@
DOMCharacterData
object(DOMCharacterData)#1 (0) {
}
string(28) "O:16:"DOMCharacterData":0:{}"
object(DOMCharacterData)#2 (0) {
string(101) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:16:"DOMCharacterData";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(16) "DOMCharacterData"
}
array(26) {
[0]=>
@@ -64,10 +66,10 @@ object(A_DOMCharacterData)#3 (1) {
["___x"]=>
NULL
}
string(43) "O:18:"A_DOMCharacterData":1:{s:4:"___x";N;}"
object(A_DOMCharacterData)#4 (1) {
["___x"]=>
NULL
string(103) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:18:"A_DOMCharacterData";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(18) "A_DOMCharacterData"
}
array(26) {
[0]=>
@@ -1,8 +1,10 @@
DOMComment
object(DOMComment)#1 (0) {
}
string(22) "O:10:"DOMComment":0:{}"
object(DOMComment)#2 (0) {
string(95) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:10:"DOMComment";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(10) "DOMComment"
}
array(26) {
[0]=>
@@ -64,10 +66,10 @@ object(A_DOMComment)#3 (1) {
["___x"]=>
NULL
}
string(37) "O:12:"A_DOMComment":1:{s:4:"___x";N;}"
object(A_DOMComment)#4 (1) {
["___x"]=>
NULL
string(97) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:12:"A_DOMComment";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(12) "A_DOMComment"
}
array(26) {
[0]=>
@@ -1,8 +1,10 @@
DOMDocument
object(DOMDocument)#1 (0) {
}
string(23) "O:11:"DOMDocument":0:{}"
object(DOMDocument)#2 (0) {
string(96) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:11:"DOMDocument";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(11) "DOMDocument"
}
array(51) {
[0]=>
@@ -114,10 +116,10 @@ object(A_DOMDocument)#3 (1) {
["___x"]=>
NULL
}
string(38) "O:13:"A_DOMDocument":1:{s:4:"___x";N;}"
object(A_DOMDocument)#4 (1) {
["___x"]=>
NULL
string(98) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:13:"A_DOMDocument";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(13) "A_DOMDocument"
}
array(51) {
[0]=>
@@ -1,8 +1,10 @@
DOMDocumentFragment
object(DOMDocumentFragment)#1 (0) {
}
string(31) "O:19:"DOMDocumentFragment":0:{}"
object(DOMDocumentFragment)#2 (0) {
string(104) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:19:"DOMDocumentFragment";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(19) "DOMDocumentFragment"
}
array(22) {
[0]=>
@@ -56,10 +58,10 @@ object(A_DOMDocumentFragment)#3 (1) {
["___x"]=>
NULL
}
string(46) "O:21:"A_DOMDocumentFragment":1:{s:4:"___x";N;}"
object(A_DOMDocumentFragment)#4 (1) {
["___x"]=>
NULL
string(106) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:21:"A_DOMDocumentFragment";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(21) "A_DOMDocumentFragment"
}
array(22) {
[0]=>
@@ -1,8 +1,10 @@
DOMDocumentType
object(DOMDocumentType)#1 (0) {
}
string(27) "O:15:"DOMDocumentType":0:{}"
object(DOMDocumentType)#2 (0) {
string(100) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:15:"DOMDocumentType";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(15) "DOMDocumentType"
}
array(21) {
[0]=>
@@ -54,10 +56,10 @@ object(A_DOMDocumentType)#3 (1) {
["___x"]=>
NULL
}
string(42) "O:17:"A_DOMDocumentType":1:{s:4:"___x";N;}"
object(A_DOMDocumentType)#4 (1) {
["___x"]=>
NULL
string(102) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:17:"A_DOMDocumentType";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(17) "A_DOMDocumentType"
}
array(21) {
[0]=>
@@ -1,9 +1,11 @@
DOMElement
HipHop Warning: DOMElement::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: DOMElement::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(DOMElement)#1 (0) {
}
string(22) "O:10:"DOMElement":0:{}"
object(DOMElement)#2 (0) {
string(95) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:10:"DOMElement";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(10) "DOMElement"
}
array(39) {
[0]=>
@@ -87,15 +89,15 @@ array(39) {
}
================
A_DOMElement
HipHop Warning: DOMElement::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: DOMElement::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_DOMElement)#3 (1) {
["___x"]=>
NULL
}
string(37) "O:12:"A_DOMElement":1:{s:4:"___x";N;}"
object(A_DOMElement)#4 (1) {
["___x"]=>
NULL
string(97) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:12:"A_DOMElement";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(12) "A_DOMElement"
}
array(39) {
[0]=>
@@ -1,8 +1,10 @@
DOMEntity
object(DOMEntity)#1 (0) {
}
string(20) "O:9:"DOMEntity":0:{}"
object(DOMEntity)#2 (0) {
string(93) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:9:"DOMEntity";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(9) "DOMEntity"
}
array(21) {
[0]=>
@@ -54,10 +56,10 @@ object(A_DOMEntity)#3 (1) {
["___x"]=>
NULL
}
string(36) "O:11:"A_DOMEntity":1:{s:4:"___x";N;}"
object(A_DOMEntity)#4 (1) {
["___x"]=>
NULL
string(96) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:11:"A_DOMEntity";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(11) "A_DOMEntity"
}
array(21) {
[0]=>
@@ -1,9 +1,11 @@
DOMEntityReference
HipHop Warning: DOMEntityReference::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: DOMEntityReference::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(DOMEntityReference)#1 (0) {
}
string(30) "O:18:"DOMEntityReference":0:{}"
object(DOMEntityReference)#2 (0) {
string(103) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:18:"DOMEntityReference";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(18) "DOMEntityReference"
}
array(21) {
[0]=>
@@ -51,15 +53,15 @@ array(21) {
}
================
A_DOMEntityReference
HipHop Warning: DOMEntityReference::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: DOMEntityReference::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_DOMEntityReference)#3 (1) {
["___x"]=>
NULL
}
string(45) "O:20:"A_DOMEntityReference":1:{s:4:"___x";N;}"
object(A_DOMEntityReference)#4 (1) {
["___x"]=>
NULL
string(105) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:20:"A_DOMEntityReference";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(20) "A_DOMEntityReference"
}
array(21) {
[0]=>
@@ -1,8 +1,10 @@
DOMNamedNodeMap
object(DOMNamedNodeMap)#1 (0) {
}
string(27) "O:15:"DOMNamedNodeMap":0:{}"
object(DOMNamedNodeMap)#2 (0) {
string(100) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:15:"DOMNamedNodeMap";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(15) "DOMNamedNodeMap"
}
array(8) {
[0]=>
@@ -28,10 +30,10 @@ object(A_DOMNamedNodeMap)#3 (1) {
["___x"]=>
NULL
}
string(42) "O:17:"A_DOMNamedNodeMap":1:{s:4:"___x";N;}"
object(A_DOMNamedNodeMap)#4 (1) {
["___x"]=>
NULL
string(102) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:17:"A_DOMNamedNodeMap";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(17) "A_DOMNamedNodeMap"
}
array(8) {
[0]=>
@@ -1,8 +1,10 @@
DOMNode
object(DOMNode)#1 (0) {
}
string(18) "O:7:"DOMNode":0:{}"
object(DOMNode)#2 (0) {
string(91) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:7:"DOMNode";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(7) "DOMNode"
}
array(21) {
[0]=>
@@ -54,10 +56,10 @@ object(A_DOMNode)#3 (1) {
["___x"]=>
NULL
}
string(33) "O:9:"A_DOMNode":1:{s:4:"___x";N;}"
object(A_DOMNode)#4 (1) {
["___x"]=>
NULL
string(93) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:9:"A_DOMNode";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(9) "A_DOMNode"
}
array(21) {
[0]=>
@@ -1,8 +1,10 @@
DOMNodeIterator
object(DOMNodeIterator)#1 (0) {
}
string(27) "O:15:"DOMNodeIterator":0:{}"
object(DOMNodeIterator)#2 (0) {
string(100) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:15:"DOMNodeIterator";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(15) "DOMNodeIterator"
}
array(6) {
[0]=>
@@ -24,10 +26,10 @@ object(A_DOMNodeIterator)#3 (1) {
["___x"]=>
NULL
}
string(42) "O:17:"A_DOMNodeIterator":1:{s:4:"___x";N;}"
object(A_DOMNodeIterator)#4 (1) {
["___x"]=>
NULL
string(102) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:17:"A_DOMNodeIterator";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(17) "A_DOMNodeIterator"
}
array(6) {
[0]=>
@@ -1,8 +1,10 @@
DOMNodeList
object(DOMNodeList)#1 (0) {
}
string(23) "O:11:"DOMNodeList":0:{}"
object(DOMNodeList)#2 (0) {
string(96) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:11:"DOMNodeList";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(11) "DOMNodeList"
}
array(6) {
[0]=>
@@ -24,10 +26,10 @@ object(A_DOMNodeList)#3 (1) {
["___x"]=>
NULL
}
string(38) "O:13:"A_DOMNodeList":1:{s:4:"___x";N;}"
object(A_DOMNodeList)#4 (1) {
["___x"]=>
NULL
string(98) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:13:"A_DOMNodeList";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(13) "A_DOMNodeList"
}
array(6) {
[0]=>
@@ -1,8 +1,10 @@
DOMNotation
object(DOMNotation)#1 (0) {
}
string(23) "O:11:"DOMNotation":0:{}"
object(DOMNotation)#2 (0) {
string(96) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:11:"DOMNotation";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(11) "DOMNotation"
}
array(21) {
[0]=>
@@ -54,10 +56,10 @@ object(A_DOMNotation)#3 (1) {
["___x"]=>
NULL
}
string(38) "O:13:"A_DOMNotation":1:{s:4:"___x";N;}"
object(A_DOMNotation)#4 (1) {
["___x"]=>
NULL
string(98) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:13:"A_DOMNotation";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(13) "A_DOMNotation"
}
array(21) {
[0]=>
@@ -1,9 +1,11 @@
DOMProcessingInstruction
HipHop Warning: DOMProcessingInstruction::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: DOMProcessingInstruction::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(DOMProcessingInstruction)#1 (0) {
}
string(36) "O:24:"DOMProcessingInstruction":0:{}"
object(DOMProcessingInstruction)#2 (0) {
string(109) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:24:"DOMProcessingInstruction";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(24) "DOMProcessingInstruction"
}
array(21) {
[0]=>
@@ -51,15 +53,15 @@ array(21) {
}
================
A_DOMProcessingInstruction
HipHop Warning: DOMProcessingInstruction::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: DOMProcessingInstruction::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_DOMProcessingInstruction)#3 (1) {
["___x"]=>
NULL
}
string(51) "O:26:"A_DOMProcessingInstruction":1:{s:4:"___x";N;}"
object(A_DOMProcessingInstruction)#4 (1) {
["___x"]=>
NULL
string(111) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:26:"A_DOMProcessingInstruction";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(26) "A_DOMProcessingInstruction"
}
array(21) {
[0]=>
@@ -1,8 +1,10 @@
DOMText
object(DOMText)#1 (0) {
}
string(18) "O:7:"DOMText":0:{}"
object(DOMText)#2 (0) {
string(91) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:7:"DOMText";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(7) "DOMText"
}
array(28) {
[0]=>
@@ -68,10 +70,10 @@ object(A_DOMText)#3 (1) {
["___x"]=>
NULL
}
string(33) "O:9:"A_DOMText":1:{s:4:"___x";N;}"
object(A_DOMText)#4 (1) {
["___x"]=>
NULL
string(93) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:9:"A_DOMText";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(9) "A_DOMText"
}
array(28) {
[0]=>
@@ -1,9 +1,11 @@
DOMXPath
HipHop Warning: DOMXPath::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: DOMXPath::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(DOMXPath)#1 (0) {
}
string(19) "O:8:"DOMXPath":0:{}"
object(DOMXPath)#2 (0) {
string(92) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:8:"DOMXPath";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(8) "DOMXPath"
}
array(8) {
[0]=>
@@ -25,15 +27,15 @@ array(8) {
}
================
A_DOMXPath
HipHop Warning: DOMXPath::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: DOMXPath::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_DOMXPath)#3 (1) {
["___x"]=>
NULL
}
string(35) "O:10:"A_DOMXPath":1:{s:4:"___x";N;}"
object(A_DOMXPath)#4 (1) {
["___x"]=>
NULL
string(95) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:10:"A_DOMXPath";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(10) "A_DOMXPath"
}
array(8) {
[0]=>
@@ -1,5 +1,5 @@
DateInterval
HipHop Warning: DateInterval::__construct() expects exactly 1 parameter, 0 given in %s on line 5
HipHop Warning: DateInterval::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(DateInterval)#1 (0) {
}
string(24) "O:12:"DateInterval":0:{}"
@@ -19,7 +19,7 @@ array(5) {
}
================
A_DateInterval
HipHop Warning: DateInterval::__construct() expects exactly 1 parameter, 0 given in %s on line 26
HipHop Warning: DateInterval::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_DateInterval)#3 (1) {
["___x"]=>
NULL
@@ -1,5 +1,5 @@
DateTimeZone
HipHop Warning: DateTimeZone::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: DateTimeZone::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(DateTimeZone)#1 (0) {
}
string(24) "O:12:"DateTimeZone":0:{}"
@@ -23,7 +23,7 @@ array(7) {
}
================
A_DateTimeZone
HipHop Warning: DateTimeZone::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: DateTimeZone::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_DateTimeZone)#3 (1) {
["___x"]=>
NULL
@@ -1,8 +1,10 @@
DebuggerClient
object(DebuggerClient)#1 (0) {
}
string(26) "O:14:"DebuggerClient":0:{}"
object(DebuggerClient)#2 (0) {
string(99) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:14:"DebuggerClient";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(14) "DebuggerClient"
}
array(4) {
[0]=>
@@ -20,10 +22,10 @@ object(A_DebuggerClient)#3 (1) {
["___x"]=>
NULL
}
string(41) "O:16:"A_DebuggerClient":1:{s:4:"___x";N;}"
object(A_DebuggerClient)#4 (1) {
["___x"]=>
NULL
string(101) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:16:"A_DebuggerClient";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(16) "A_DebuggerClient"
}
array(4) {
[0]=>
@@ -1,8 +1,10 @@
EncodingDetector
object(EncodingDetector)#1 (0) {
}
string(28) "O:16:"EncodingDetector":0:{}"
object(EncodingDetector)#2 (0) {
string(101) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:16:"EncodingDetector";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(16) "EncodingDetector"
}
array(5) {
[0]=>
@@ -22,10 +24,10 @@ object(A_EncodingDetector)#3 (1) {
["___x"]=>
NULL
}
string(43) "O:18:"A_EncodingDetector":1:{s:4:"___x";N;}"
object(A_EncodingDetector)#4 (1) {
["___x"]=>
NULL
string(103) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:18:"A_EncodingDetector";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(18) "A_EncodingDetector"
}
array(5) {
[0]=>
@@ -1,8 +1,10 @@
Memcache
object(Memcache)#1 (0) {
}
string(19) "O:8:"Memcache":0:{}"
object(Memcache)#2 (0) {
string(92) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:8:"Memcache";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(8) "Memcache"
}
array(21) {
[0]=>
@@ -54,10 +56,10 @@ object(A_Memcache)#3 (1) {
["___x"]=>
NULL
}
string(35) "O:10:"A_Memcache":1:{s:4:"___x";N;}"
object(A_Memcache)#4 (1) {
["___x"]=>
NULL
string(95) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:10:"A_Memcache";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(10) "A_Memcache"
}
array(21) {
[0]=>
@@ -1,8 +1,10 @@
Memcached
object(Memcached)#1 (0) {
}
string(20) "O:9:"Memcached":0:{}"
object(Memcached)#2 (0) {
string(93) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:9:"Memcached";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(9) "Memcached"
}
array(38) {
[0]=>
@@ -88,10 +90,10 @@ object(A_Memcached)#3 (1) {
["___x"]=>
NULL
}
string(36) "O:11:"A_Memcached":1:{s:4:"___x";N;}"
object(A_Memcached)#4 (1) {
["___x"]=>
NULL
string(96) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:11:"A_Memcached";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(11) "A_Memcached"
}
array(38) {
[0]=>
@@ -1,8 +1,10 @@
Normalizer
object(Normalizer)#1 (0) {
}
string(22) "O:10:"Normalizer":0:{}"
object(Normalizer)#2 (0) {
string(95) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:10:"Normalizer";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(10) "Normalizer"
}
array(3) {
[0]=>
@@ -18,10 +20,10 @@ object(A_Normalizer)#3 (1) {
["___x"]=>
NULL
}
string(37) "O:12:"A_Normalizer":1:{s:4:"___x";N;}"
object(A_Normalizer)#4 (1) {
["___x"]=>
NULL
string(97) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:12:"A_Normalizer";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(12) "A_Normalizer"
}
array(3) {
[0]=>
@@ -1,9 +1,11 @@
SQLite3
HipHop Warning: SQLite3::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: SQLite3::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(SQLite3)#1 (0) {
}
string(18) "O:7:"SQLite3":0:{}"
object(SQLite3)#2 (0) {
string(91) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:7:"SQLite3";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(7) "SQLite3"
}
array(18) {
[0]=>
@@ -45,15 +47,15 @@ array(18) {
}
================
A_SQLite3
HipHop Warning: SQLite3::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: SQLite3::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_SQLite3)#3 (1) {
["___x"]=>
NULL
}
string(33) "O:9:"A_SQLite3":1:{s:4:"___x";N;}"
object(A_SQLite3)#4 (1) {
["___x"]=>
NULL
string(93) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:9:"A_SQLite3";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(9) "A_SQLite3"
}
array(18) {
[0]=>
@@ -1,9 +1,11 @@
SQLite3Stmt
HipHop Warning: SQLite3Stmt::__construct() expects exactly 2 parameters, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: SQLite3Stmt::__construct() expects exactly 2 parameters, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(SQLite3Stmt)#1 (0) {
}
string(23) "O:11:"SQLite3Stmt":0:{}"
object(SQLite3Stmt)#2 (0) {
string(96) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:11:"SQLite3Stmt";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(11) "SQLite3Stmt"
}
array(8) {
[0]=>
@@ -25,15 +27,15 @@ array(8) {
}
================
A_SQLite3Stmt
HipHop Warning: SQLite3Stmt::__construct() expects exactly 2 parameters, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: SQLite3Stmt::__construct() expects exactly 2 parameters, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_SQLite3Stmt)#3 (1) {
["___x"]=>
NULL
}
string(38) "O:13:"A_SQLite3Stmt":1:{s:4:"___x";N;}"
object(A_SQLite3Stmt)#4 (1) {
["___x"]=>
NULL
string(98) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:13:"A_SQLite3Stmt";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(13) "A_SQLite3Stmt"
}
array(8) {
[0]=>
@@ -1,9 +1,11 @@
SimpleXMLElement
HipHop Warning: SimpleXMLElement::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: SimpleXMLElement::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(SimpleXMLElement)#1 (0) {
}
string(28) "O:16:"SimpleXMLElement":0:{}"
object(SimpleXMLElement)#2 (0) {
string(101) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:16:"SimpleXMLElement";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(16) "SimpleXMLElement"
}
array(22) {
[0]=>
@@ -53,11 +55,13 @@ array(22) {
}
================
A_SimpleXMLElement
HipHop Warning: SimpleXMLElement::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: SimpleXMLElement::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_SimpleXMLElement)#3 (0) {
}
string(30) "O:18:"A_SimpleXMLElement":0:{}"
object(A_SimpleXMLElement)#4 (0) {
string(103) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:18:"A_SimpleXMLElement";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(18) "A_SimpleXMLElement"
}
array(22) {
[0]=>
@@ -1,8 +1,10 @@
SimpleXMLElementIterator
object(SimpleXMLElementIterator)#1 (0) {
}
string(36) "O:24:"SimpleXMLElementIterator":0:{}"
object(SimpleXMLElementIterator)#2 (0) {
string(109) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:24:"SimpleXMLElementIterator";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(24) "SimpleXMLElementIterator"
}
array(6) {
[0]=>
@@ -24,10 +26,10 @@ object(A_SimpleXMLElementIterator)#3 (1) {
["___x"]=>
NULL
}
string(51) "O:26:"A_SimpleXMLElementIterator":1:{s:4:"___x";N;}"
object(A_SimpleXMLElementIterator)#4 (1) {
["___x"]=>
NULL
string(111) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:26:"A_SimpleXMLElementIterator";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(26) "A_SimpleXMLElementIterator"
}
array(6) {
[0]=>
@@ -1,9 +1,11 @@
SoapClient
HipHop Warning: SoapClient::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: SoapClient::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(SoapClient)#1 (0) {
}
string(22) "O:10:"SoapClient":0:{}"
object(SoapClient)#2 (0) {
string(95) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:10:"SoapClient";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(10) "SoapClient"
}
array(13) {
[0]=>
@@ -35,15 +37,15 @@ array(13) {
}
================
A_SoapClient
HipHop Warning: SoapClient::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: SoapClient::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_SoapClient)#3 (1) {
["___x"]=>
NULL
}
string(37) "O:12:"A_SoapClient":1:{s:4:"___x";N;}"
object(A_SoapClient)#4 (1) {
["___x"]=>
NULL
string(97) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:12:"A_SoapClient";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(12) "A_SoapClient"
}
array(13) {
[0]=>
@@ -1,9 +1,11 @@
SoapHeader
HipHop Warning: SoapHeader::__construct() expects exactly 2 parameters, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: SoapHeader::__construct() expects exactly 2 parameters, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(SoapHeader)#1 (0) {
}
string(22) "O:10:"SoapHeader":0:{}"
object(SoapHeader)#2 (0) {
string(95) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:10:"SoapHeader";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(10) "SoapHeader"
}
array(1) {
[0]=>
@@ -11,15 +13,15 @@ array(1) {
}
================
A_SoapHeader
HipHop Warning: SoapHeader::__construct() expects exactly 2 parameters, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: SoapHeader::__construct() expects exactly 2 parameters, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_SoapHeader)#3 (1) {
["___x"]=>
NULL
}
string(37) "O:12:"A_SoapHeader":1:{s:4:"___x";N;}"
object(A_SoapHeader)#4 (1) {
["___x"]=>
NULL
string(97) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:12:"A_SoapHeader";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(12) "A_SoapHeader"
}
array(1) {
[0]=>
@@ -1,9 +1,11 @@
SoapParam
HipHop Warning: SoapParam::__construct() expects exactly 2 parameters, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: SoapParam::__construct() expects exactly 2 parameters, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(SoapParam)#1 (0) {
}
string(20) "O:9:"SoapParam":0:{}"
object(SoapParam)#2 (0) {
string(93) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:9:"SoapParam";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(9) "SoapParam"
}
array(1) {
[0]=>
@@ -11,15 +13,15 @@ array(1) {
}
================
A_SoapParam
HipHop Warning: SoapParam::__construct() expects exactly 2 parameters, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: SoapParam::__construct() expects exactly 2 parameters, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_SoapParam)#3 (1) {
["___x"]=>
NULL
}
string(36) "O:11:"A_SoapParam":1:{s:4:"___x";N;}"
object(A_SoapParam)#4 (1) {
["___x"]=>
NULL
string(96) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:11:"A_SoapParam";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(11) "A_SoapParam"
}
array(1) {
[0]=>
@@ -1,9 +1,11 @@
SoapServer
HipHop Warning: SoapServer::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: SoapServer::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(SoapServer)#1 (0) {
}
string(22) "O:10:"SoapServer":0:{}"
object(SoapServer)#2 (0) {
string(95) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:10:"SoapServer";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(10) "SoapServer"
}
array(9) {
[0]=>
@@ -27,15 +29,15 @@ array(9) {
}
================
A_SoapServer
HipHop Warning: SoapServer::__construct() expects exactly 1 parameter, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: SoapServer::__construct() expects exactly 1 parameter, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_SoapServer)#3 (1) {
["___x"]=>
NULL
}
string(37) "O:12:"A_SoapServer":1:{s:4:"___x";N;}"
object(A_SoapServer)#4 (1) {
["___x"]=>
NULL
string(97) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:12:"A_SoapServer";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(12) "A_SoapServer"
}
array(9) {
[0]=>
@@ -1,9 +1,11 @@
SoapVar
HipHop Warning: SoapVar::__construct() expects exactly 2 parameters, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 5
HipHop Warning: SoapVar::__construct() expects exactly 2 parameters, 0 given in %s/test/quick/builtin_extensions.inc on line 5
object(SoapVar)#1 (0) {
}
string(18) "O:7:"SoapVar":0:{}"
object(SoapVar)#2 (0) {
string(91) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:7:"SoapVar";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(7) "SoapVar"
}
array(1) {
[0]=>
@@ -11,15 +13,15 @@ array(1) {
}
================
A_SoapVar
HipHop Warning: SoapVar::__construct() expects exactly 2 parameters, 0 given in %s/hphp/test/quick/builtin_extensions.inc on line 26
HipHop Warning: SoapVar::__construct() expects exactly 2 parameters, 0 given in %s/test/quick/builtin_extensions.inc on line 23
object(A_SoapVar)#3 (1) {
["___x"]=>
NULL
}
string(33) "O:9:"A_SoapVar":1:{s:4:"___x";N;}"
object(A_SoapVar)#4 (1) {
["___x"]=>
NULL
string(93) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:9:"A_SoapVar";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(9) "A_SoapVar"
}
array(1) {
[0]=>
@@ -1,8 +1,10 @@
XMLReader
object(XMLReader)#1 (0) {
}
string(20) "O:9:"XMLReader":0:{}"
object(XMLReader)#2 (0) {
string(93) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:9:"XMLReader";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(9) "XMLReader"
}
array(27) {
[0]=>
@@ -66,10 +68,10 @@ object(A_XMLReader)#3 (1) {
["___x"]=>
NULL
}
string(36) "O:11:"A_XMLReader":1:{s:4:"___x";N;}"
object(A_XMLReader)#4 (1) {
["___x"]=>
NULL
string(96) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:11:"A_XMLReader";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(11) "A_XMLReader"
}
array(27) {
[0]=>
@@ -1,8 +1,10 @@
XMLWriter
object(XMLWriter)#1 (0) {
}
string(20) "O:9:"XMLWriter":0:{}"
object(XMLWriter)#2 (0) {
string(93) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:9:"XMLWriter";}"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(9) "XMLWriter"
}
array(43) {
[0]=>
@@ -98,10 +100,10 @@ object(A_XMLWriter)#3 (1) {
["___x"]=>
NULL
}
string(36) "O:11:"A_XMLWriter":1:{s:4:"___x";N;}"
object(A_XMLWriter)#4 (1) {
["___x"]=>
NULL
string(96) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:11:"A_XMLWriter";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(11) "A_XMLWriter"
}
array(43) {
[0]=>
+2 -8
Ver Arquivo
@@ -4,15 +4,12 @@ function test($cls) {
echo $cls . "\n";
$a = new $cls;
var_dump($a);
if ($a instanceof Closure || $a instanceof Continuation) {
continue;
}
// serialize and unserialize
$b = serialize($a);
var_dump($b);
$c = unserialize($b);
var_dump($c);
if ($a != $c) {
if (($a != $c) && (get_class($c) != "__PHP_Unserializable_Class")) {
echo "bad serialization/deserialization\n";
exit(1);
}
@@ -25,15 +22,12 @@ function test($cls) {
echo $cls . "\n";
$a = new $cls;
var_dump($a);
if ($a instanceof Closure || $a instanceof Continuation) {
continue;
}
// serialize and unserialize
$b = serialize($a);
var_dump($b);
$c = unserialize($b);
var_dump($c);
if ($a != $c) {
if (($a != $c) && (get_class($c) != "__PHP_Unserializable_Class")) {
echo "bad serialization/deserialization\n";
exit(1);
}
@@ -1,2 +1 @@
string(7) "Closure"
string(12) "DummyClosure"
+6
Ver Arquivo
@@ -26,9 +26,15 @@ function main() {
// each other's memory. We want to confirm that all fields are
// initialized correctly and that the destructor does not segfault.
$sewh = unserialize($s2);
var_dump($sewh);
$sewh = null; // Let it go
$srwh = unserialize($s1);
var_dump($srwh);
$srwh = null; // Let it go
// Confirm that we can't deserialize one of these as well.
$c1 = unserialize("O:12:\"Continuation\":0:{}");
var_dump($c1);
}
main();
@@ -1,4 +1,16 @@
int(42)
string(3) "Hi!"
string(34) "O:22:"StaticResultWaitHandle":0:{}"
string(37) "O:25:"StaticExceptionWaitHandle":0:{}"
string(107) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:22:"StaticResultWaitHandle";}"
string(110) "O:26:"__PHP_Unserializable_Class":1:{s:31:"__PHP_Unserializable_Class_Name";s:25:"StaticExceptionWaitHandle";}"
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(25) "StaticExceptionWaitHandle"
}
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(22) "StaticResultWaitHandle"
}
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(12) "Continuation"
}
+1 -1
Ver Arquivo
@@ -14,4 +14,4 @@ foreach ($x->cache_gen as $v) {
}
apc_store('key', $x);
$y = apc_fetch('key');
print_r($y->cache_gen);
var_dump($y->cache_gen);
+4 -3
Ver Arquivo
@@ -1,5 +1,6 @@
string(1) "a"
string(1) "b"
DummyContinuation Object
(
)
object(__PHP_Unserializable_Class)#4 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(12) "Continuation"
}
+1 -1
Ver Arquivo
@@ -7,5 +7,5 @@ $f = function($a) {
var_dump($f('x'));
apc_store('key', $f);
$g = apc_fetch('key');
print_r($g);
var_dump($g);
-4
Ver Arquivo
@@ -1,4 +0,0 @@
string(1) "x"
DummyClosure Object
(
)
+5
Ver Arquivo
@@ -0,0 +1,5 @@
string(1) "x"
object(__PHP_Unserializable_Class)#2 (1) {
["__PHP_Unserializable_Class_Name"]=>
string(42) "Closure$$%s$"
}
+1 -1
Ver Arquivo
@@ -267,7 +267,7 @@ static void writeConstant(std::ostream& out, const PhpConst& cns) {
}
#define CLASS_FLAG_MASK (IsAbstract|IsFinal|NoDefaultSweep|\
HipHopSpecific|HasDocComment)
HipHopSpecific|HasDocComment|IsCppSerializable)
#define PROP_FLAG_MASK (IsProtected|IsPrivate|IsPublic|IsStatic)
static void writeClass(std::ostream& out, const PhpClass& cls) {
+1
Ver Arquivo
@@ -96,6 +96,7 @@ static const std::unordered_map<fbstring, FuncFlags> g_flagsMap =
{"IsConstructor", IsConstructor},
{"IsNothing", IsNothing},
{"HasDocComment", HasDocComment},
{"IsCppSerializable", IsCppSerializable},
{"HipHopSpecific", HipHopSpecific},
{"VariableArguments", VariableArguments},
{"RefVariableArguments", RefVariableArguments},
+1
Ver Arquivo
@@ -44,6 +44,7 @@ enum FuncFlags {
IsConstructor = (1 << 12),
IsNothing = (1 << 13),
HasDocComment = (1 << 14),
IsCppSerializable = (1 << 15),
HipHopSpecific = (1 << 16),
VariableArguments = (1 << 17),
RefVariableArguments = (1 << 18),