Fix is_object on resources

PHP certainly never runs out of fun surprises to spring on me!
Esse commit está contido em:
Owen Yamauchi
2013-05-08 12:22:42 -07:00
commit de Sara Golemon
commit 09639ff073
4 arquivos alterados com 35 adições e 10 exclusões
+13 -9
Ver Arquivo
@@ -268,14 +268,14 @@ bool isset(CArrRef v, CObjRef offset);
bool isset(CArrRef v, CVarRef offset);
bool isset(CArrRef v, CStrRef offset, bool isString = false);
inline Variant unset(Variant &v) { v.unset(); return uninit_null();}
inline Variant unset(CVarRef v) { return uninit_null();}
inline Variant setNull(Variant &v) { v.setNull(); return uninit_null();}
inline Object setNull(Object &v) { v.reset(); return Object();}
inline Array setNull(Array &v) { v.reset(); return Array();}
inline String setNull(String &v) { v.reset(); return String();}
inline Variant unset(Object &v) { v.reset(); return uninit_null();}
inline Variant unset(Array &v) { v.reset(); return uninit_null();}
inline Variant unset(Variant &v) { v.unset(); return uninit_null();}
inline Variant unset(CVarRef v) { return uninit_null();}
inline Variant setNull(Variant &v) { v.setNull(); return uninit_null();}
inline Object setNull(Object &v) { v.reset(); return Object();}
inline Array setNull(Array &v) { v.reset(); return Array();}
inline String setNull(String &v) { v.reset(); return String();}
inline Variant unset(Object &v) { v.reset(); return uninit_null();}
inline Variant unset(Array &v) { v.reset(); return uninit_null();}
///////////////////////////////////////////////////////////////////////////////
// type testing
@@ -287,7 +287,11 @@ inline bool is_double(CVarRef v) { return v.is(KindOfDouble);}
inline bool is_string(CVarRef v) { return v.isString();}
inline bool is_array(CVarRef v) { return v.is(KindOfArray);}
inline bool is_object(CVarRef var) {
return var.is(KindOfObject) && !var.isResource();
// NB: just doing !var.isResource() is not right. isResource can have custom
// implementations in extension classes, and even if that returns false,
// is_object is still supposed to return false. Because PHP.
return var.is(KindOfObject) &&
var.getObjectData()->getVMClass() != SystemLib::s_resourceClass;
}
inline bool is_empty_string(CVarRef v) {
return v.isString() && v.getStringData()->empty();
+1 -1
Ver Arquivo
@@ -142,7 +142,7 @@ class ObjectData : public CountableNF {
CStrRef o_getClassName() const;
CStrRef o_getParentName() const;
virtual CStrRef o_getClassNameHook() const;
virtual bool isResource() const { return false;}
virtual bool isResource() const { return false; }
int o_getId() const { return o_id;}
// overridable casting
+15
Ver Arquivo
@@ -0,0 +1,15 @@
<?php
// Copyright 2004-present Facebook. All Rights Reserved.
function r($a) {
var_dump(is_resource($a));
var_dump(is_object($a));
var_dump($a);
}
$f = imagecreate(10, 10);
r($f);
imagedestroy($f);
// Now it's not a resource anymore! It's not an object either. What is it?
// It's PHP, that's what.
r($f);
+6
Ver Arquivo
@@ -0,0 +1,6 @@
bool(true)
bool(false)
resource(4) of type (gd)
bool(false)
bool(false)
resource(4) of type (__resource)