stas            Tue Jun 28 05:46:30 2005 EDT

  Modified files:              
    /php-src/ext/standard       php_incomplete_class.h var.c 
  Log:
  fix handling of non-PHP classes (John Coggeshall)
  
  
http://cvs.php.net/diff.php/php-src/ext/standard/php_incomplete_class.h?r1=1.13&r2=1.14&ty=u
Index: php-src/ext/standard/php_incomplete_class.h
diff -u php-src/ext/standard/php_incomplete_class.h:1.13 
php-src/ext/standard/php_incomplete_class.h:1.14
--- php-src/ext/standard/php_incomplete_class.h:1.13    Thu Mar 18 11:54:36 2004
+++ php-src/ext/standard/php_incomplete_class.h Tue Jun 28 05:46:30 2005
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_incomplete_class.h,v 1.13 2004/03/18 16:54:36 dmitry Exp $ */
+/* $Id: php_incomplete_class.h,v 1.14 2005/06/28 09:46:30 stas Exp $ */
 
 #ifndef PHP_INCOMPLETE_CLASS_H
 #define PHP_INCOMPLETE_CLASS_H
@@ -26,18 +26,18 @@
 #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                                                   
                                \
http://cvs.php.net/diff.php/php-src/ext/standard/var.c?r1=1.200&r2=1.201&ty=u
Index: php-src/ext/standard/var.c
diff -u php-src/ext/standard/var.c:1.200 php-src/ext/standard/var.c:1.201
--- php-src/ext/standard/var.c:1.200    Wed Jun  8 11:48:12 2005
+++ php-src/ext/standard/var.c  Tue Jun 28 05:46:30 2005
@@ -18,7 +18,8 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: var.c,v 1.200 2005/06/08 15:48:12 dmitry Exp $ */
+/* $Id: var.c,v 1.201 2005/06/28 09:46:30 stas Exp $ */
+
 
 
 /* {{{ includes 
@@ -463,7 +464,7 @@
        /* 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) {
                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)))
@@ -670,13 +671,18 @@
                                zval *retval_ptr = NULL;
                                zval fname;
                                int res;
+                               zend_class_entry *ce = NULL;
+
+                               if(Z_OBJ_HT_PP(struc)->get_class_entry) {
+                                       ce = Z_OBJCE_PP(struc);
+                               } 
 
-                               if(Z_OBJCE_PP(struc)->serialize != NULL) {
+                               if(ce && ce->serialize != NULL) {
                                        /* has custom handler */
                                        unsigned char *serialized_data = NULL;
                                        zend_uint serialized_length;
 
-                                       if(Z_OBJCE_PP(struc)->serialize(*struc, 
&serialized_data, &serialized_length, (zend_serialize_data *)var_hash 
TSRMLS_CC) == SUCCESS) {
+                                       if(ce->serialize(*struc, 
&serialized_data, &serialized_length, (zend_serialize_data *)var_hash 
TSRMLS_CC) == SUCCESS) {
                                                smart_str_appendl(buf, "C:", 2);
                                                smart_str_append_long(buf, 
Z_OBJCE_PP(struc)->name_length);
                                                smart_str_appendl(buf, ":\"", 
2);
@@ -696,8 +702,8 @@
                                        return;
                                }
                                
-                               if (Z_OBJCE_PP(struc) != PHP_IC_ENTRY &&
-                                   
zend_hash_exists(&Z_OBJCE_PP(struc)->function_table, "__sleep", 
sizeof("__sleep"))) {
+                               if (ce && ce != PHP_IC_ENTRY &&
+                                   zend_hash_exists(&ce->function_table, 
"__sleep", sizeof("__sleep"))) {
                                        INIT_PZVAL(&fname);
                                        ZVAL_STRINGL(&fname, "__sleep", 
sizeof("__sleep") - 1, 0);
                                        res = 
call_user_function_ex(CG(function_table), struc, &fname, 

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to