]> granicus.if.org Git - php/commitdiff
fix non-PHP object handling (from John Coggeshall)
authorStanislav Malyshev <stas@php.net>
Tue, 28 Jun 2005 09:17:19 +0000 (09:17 +0000)
committerStanislav Malyshev <stas@php.net>
Tue, 28 Jun 2005 09:17:19 +0000 (09:17 +0000)
ext/standard/php_incomplete_class.h
ext/standard/var.c

index 8c7f68ae15346387ae4e05e5cab5e86bf60e0112..bfcd6f6a324da50605999415975eeba8f8485860 100644 (file)
 #define PHP_IC_ENTRY \
        BG(incomplete_class)
 
-#define PHP_SET_CLASS_ATTRIBUTES(struc)                                                                \
-       /* OBJECTS_FIXME: Fix for new object model */                                           \
-       if (Z_OBJCE_P(struc) == BG(incomplete_class)) {                                         \
-               class_name = php_lookup_class_name(struc, &name_len);           \
-               free_class_name = 1;                                                                                    \
+#define PHP_SET_CLASS_ATTRIBUTES(struc) \
+       /* OBJECTS_FIXME: Fix for new object model */   \
+       if (Z_OBJ_HT_P(struc)->get_class_entry && \
+            Z_OBJCE_P(struc) == BG(incomplete_class)) {        \
+               class_name = php_lookup_class_name(struc, &name_len); \
+               free_class_name = 1; \
                incomplete_class = 1; \
-       } else {                                                                                                                        \
-               class_name = Z_OBJCE_P(struc)->name;                                                    \
-               name_len   = Z_OBJCE_P(struc)->name_length;                                             \
+       } else { \
+               free_class_name = !zend_get_object_classname(struc, &class_name, &name_len);\
        }
 
-#define PHP_CLEANUP_CLASS_ATTRIBUTES()                                                                 \
+#define PHP_CLEANUP_CLASS_ATTRIBUTES() \
        if (free_class_name) efree(class_name)
 
 #define PHP_CLASS_ATTRIBUTES                                                                                   \
index b0959702e73fea80e063fd6dacdb3563c58ee6f4..28c73b98f4ede4dd22bf91093b3c5d4d6a21a5db 100644 (file)
@@ -21,6 +21,7 @@
 /* $Id$ */
 
 
+
 /* {{{ includes 
 */
 
@@ -463,7 +464,7 @@ static inline int php_add_var_hash(HashTable *var_hash, zval *var, void *var_old
        /* relies on "(long)" being a perfect hash function for data pointers,
           however the actual identity of an object has had to be determined
           by its object handle and the class entry since 5.0. */
-       if (Z_TYPE_P(var) == IS_OBJECT) {
+       if ((Z_TYPE_P(var) == IS_OBJECT) && Z_OBJ_HT_P(var)->get_class_entry != NULL) {
                p = smart_str_print_long(id + sizeof(id) - 1,
                                (((unsigned long)Z_OBJCE_P(var) << 5)
                                | ((unsigned long)Z_OBJCE_P(var) >> (sizeof(long) * 8 - 5)))
@@ -671,7 +672,7 @@ static void php_var_serialize_intern(smart_str *buf, zval **struc, HashTable *va
                                zval fname;
                                int res;
 
-                               if (Z_OBJCE_PP(struc) != PHP_IC_ENTRY &&
+                               if (Z_OBJ_HT_PP(struc)->get_class_entry && Z_OBJCE_PP(struc) != PHP_IC_ENTRY &&
                                    zend_hash_exists(&Z_OBJCE_PP(struc)->function_table, "__sleep", sizeof("__sleep"))) {
                                        INIT_PZVAL(&fname);
                                        ZVAL_STRINGL(&fname, "__sleep", sizeof("__sleep") - 1, 0);