diff options
| author | Sascha Schumann <sas@php.net> | 2000-06-23 16:46:04 +0000 |
|---|---|---|
| committer | Sascha Schumann <sas@php.net> | 2000-06-23 16:46:04 +0000 |
| commit | 091dc3840d770ed3aaebea63f1af0fae06329fc1 (patch) | |
| tree | 640d0ae45443f3a6b693a88dc4e2df1840c6c7b4 /ext/standard/var.c | |
| parent | 940f58c2dec4f2f6479dee377b0f7d24eb21ffea (diff) | |
| download | php-git-091dc3840d770ed3aaebea63f1af0fae06329fc1.tar.gz | |
Move the incomplete class stuff into its own file, so that we can
make it easier accessible to WDDX.
Diffstat (limited to 'ext/standard/var.c')
| -rw-r--r-- | ext/standard/var.c | 119 |
1 files changed, 2 insertions, 117 deletions
diff --git a/ext/standard/var.c b/ext/standard/var.c index 850a9f02bf..9760f86e22 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -31,6 +31,7 @@ #include "php_string.h" #include "php_var.h" #include "basic_functions.h" +#include "php_incomplete_class.h" #define COMMON ((*struc)->is_ref?"&":"") @@ -52,102 +53,6 @@ static int php_array_element_dump(zval **zv, int num_args, va_list args, zend_ha return 0; } -static char *php_lookup_class_name(zval **object, size_t *nlen, zend_bool del); - -#define INCOMPLETE_CLASS_MSG \ - "The script tried to execute a method or " \ - "access a property of an incomplete object. " \ - "Please ensure that the class definition <b>%s</b> of the object " \ - "you are trying to operate on was loaded _before_ " \ - "the session was started" - -static void incomplete_class_message(zend_property_reference *ref) -{ - char buf[1024]; - char *class_name; - - class_name = php_lookup_class_name(&ref->object, NULL, 0); - - if (!class_name) - class_name = estrdup("unknown"); - - snprintf(buf, 1023, INCOMPLETE_CLASS_MSG, class_name); - - efree(class_name); - - php_error(E_ERROR, buf); -} - -static void incomplete_class_call_func(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference) -{ - incomplete_class_message(property_reference); -} - -static int incomplete_class_set_property(zend_property_reference *property_reference, zval *value) -{ - incomplete_class_message(property_reference); - - /* does not reach this point */ - return (0); -} - -static zval incomplete_class_get_property(zend_property_reference *property_reference) -{ - zval foo; - - incomplete_class_message(property_reference); - - /* does not reach this point */ - return (foo); -} - -#define INCOMPLETE_CLASS "__PHP_Incomplete_Class" - -static void php_create_incomplete_class(BLS_D) -{ - zend_class_entry incomplete_class; - - INIT_OVERLOADED_CLASS_ENTRY(incomplete_class, INCOMPLETE_CLASS, NULL, - incomplete_class_call_func, - incomplete_class_get_property, - incomplete_class_set_property); - - BG(incomplete_class) = zend_register_internal_class(&incomplete_class); -} - -#define MAGIC_MEMBER "__PHP_Incomplete_Class_Name" - -static char *php_lookup_class_name(zval **object, size_t *nlen, zend_bool del) -{ - zval **val; - char *retval = NULL; - - if (zend_hash_find((*object)->value.obj.properties, MAGIC_MEMBER, sizeof(MAGIC_MEMBER), (void **) &val) == SUCCESS) { - retval = estrndup(Z_STRVAL_PP(val), Z_STRLEN_PP(val)); - - if (nlen) - *nlen = Z_STRLEN_PP(val); - - if (del) - zend_hash_del((*object)->value.obj.properties, MAGIC_MEMBER, sizeof(MAGIC_MEMBER)); - } - - return (retval); -} - -static void php_store_class_name(zval **object, const char *name, size_t len) -{ - zval *val; - - MAKE_STD_ZVAL(val); - - Z_TYPE_P(val) = IS_STRING; - Z_STRVAL_P(val) = estrndup(name, len); - Z_STRLEN_P(val) = len; - - zend_hash_update((*object)->value.obj.properties, MAGIC_MEMBER, sizeof(MAGIC_MEMBER), &val, sizeof(val), NULL); -} - void php_var_dump(pval **struc, int level) { HashTable *myht; @@ -246,24 +151,6 @@ PHP_FUNCTION(var_dump) strcat(__p->value.str.val + __i, (S));\ } -#define PHP_SET_CLASS_ATTRIBUTES() \ - if ((*struc)->value.obj.ce == BG(incomplete_class)) { \ - class_name = php_lookup_class_name(struc, &name_len, 1); \ - free_class_name = 1; \ - } else { \ - class_name = (*struc)->value.obj.ce->name; \ - name_len = (*struc)->value.obj.ce->name_length; \ - } - -#define PHP_CLEANUP_CLASS_ATTRIBUTES() \ - if (free_class_name) efree(class_name) - -#define PHP_CLASS_ATTRIBUTES \ - char *class_name; \ - size_t name_len; \ - zend_bool free_class_name = 0 \ - - /* }}} */ /* {{{ php_var_serialize */ @@ -580,9 +467,7 @@ int php_var_unserialize(pval **rval, const char **p, const char *max) if (zend_hash_find(EG(class_table), class_name, i+1, (void **) &ce)==FAILURE) { incomplete_class = 1; - if (BG(incomplete_class) == NULL) - php_create_incomplete_class(BLS_C); - ce = BG(incomplete_class); + ce = PHP_IC_ENTRY_READ; } } else { /* old php 3.0 data 'o' */ ce = &zend_standard_class_def; |
