Annotation of embedaddon/php/ext/standard/incomplete_class.c, revision 1.1.1.2
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
5: | Copyright (c) 1997-2012 The PHP Group |
6: +----------------------------------------------------------------------+
7: | This source file is subject to version 3.01 of the PHP license, |
8: | that is bundled with this package in the file LICENSE, and is |
9: | available through the world-wide-web at the following url: |
10: | http://www.php.net/license/3_01.txt |
11: | If you did not receive a copy of the PHP license and are unable to |
12: | obtain it through the world-wide-web, please send a note to |
13: | license@php.net so we can mail you a copy immediately. |
14: +----------------------------------------------------------------------+
15: | Author: Sascha Schumann <sascha@schumann.cx> |
16: +----------------------------------------------------------------------+
17: */
18:
1.1.1.2 ! misho 19: /* $Id$ */
1.1 misho 20:
21: #include "php.h"
22: #include "basic_functions.h"
23: #include "php_incomplete_class.h"
24:
25: #define INCOMPLETE_CLASS_MSG \
26: "The script tried to execute a method or " \
27: "access a property of an incomplete object. " \
28: "Please ensure that the class definition \"%s\" of the object " \
29: "you are trying to operate on was loaded _before_ " \
30: "unserialize() gets called or provide a __autoload() function " \
31: "to load the class definition "
32:
33: static zend_object_handlers php_incomplete_object_handlers;
34:
35: /* {{{ incomplete_class_message
36: */
37: static void incomplete_class_message(zval *object, int error_type TSRMLS_DC)
38: {
39: char *class_name;
40: zend_bool class_name_alloced = 1;
41:
42: class_name = php_lookup_class_name(object, NULL);
43:
44: if (!class_name) {
45: class_name_alloced = 0;
46: class_name = "unknown";
47: }
48:
49: php_error_docref(NULL TSRMLS_CC, error_type, INCOMPLETE_CLASS_MSG, class_name);
50:
51: if (class_name_alloced) {
52: efree(class_name);
53: }
54: }
55: /* }}} */
56:
1.1.1.2 ! misho 57: static zval *incomplete_class_get_property(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC) /* {{{ */
1.1 misho 58: {
59: incomplete_class_message(object, E_NOTICE TSRMLS_CC);
60:
61: if (type == BP_VAR_W || type == BP_VAR_RW) {
62: return EG(error_zval_ptr);
63: } else {
64: return EG(uninitialized_zval_ptr);
65: }
66: }
67: /* }}} */
68:
1.1.1.2 ! misho 69: static void incomplete_class_write_property(zval *object, zval *member, zval *value, const zend_literal *key TSRMLS_DC) /* {{{ */
1.1 misho 70: {
71: incomplete_class_message(object, E_NOTICE TSRMLS_CC);
72: }
73: /* }}} */
74:
1.1.1.2 ! misho 75: static zval **incomplete_class_get_property_ptr_ptr(zval *object, zval *member, const zend_literal *key TSRMLS_DC) /* {{{ */
1.1 misho 76: {
77: incomplete_class_message(object, E_NOTICE TSRMLS_CC);
78: return &EG(error_zval_ptr);
79: }
80: /* }}} */
81:
1.1.1.2 ! misho 82: static void incomplete_class_unset_property(zval *object, zval *member, const zend_literal *key TSRMLS_DC) /* {{{ */
1.1 misho 83: {
84: incomplete_class_message(object, E_NOTICE TSRMLS_CC);
85: }
86: /* }}} */
87:
1.1.1.2 ! misho 88: static int incomplete_class_has_property(zval *object, zval *member, int check_empty, const zend_literal *key TSRMLS_DC) /* {{{ */
1.1 misho 89: {
90: incomplete_class_message(object, E_NOTICE TSRMLS_CC);
91: return 0;
92: }
93: /* }}} */
94:
1.1.1.2 ! misho 95: static union _zend_function *incomplete_class_get_method(zval **object, char *method, int method_len, const zend_literal *key TSRMLS_DC) /* {{{ */
1.1 misho 96: {
97: incomplete_class_message(*object, E_ERROR TSRMLS_CC);
98: return NULL;
99: }
100: /* }}} */
101:
102: /* {{{ php_create_incomplete_class
103: */
104: static zend_object_value php_create_incomplete_object(zend_class_entry *class_type TSRMLS_DC)
105: {
106: zend_object *object;
107: zend_object_value value;
108:
109: value = zend_objects_new(&object, class_type TSRMLS_CC);
110: value.handlers = &php_incomplete_object_handlers;
111:
112: return value;
113: }
114:
115: PHPAPI zend_class_entry *php_create_incomplete_class(TSRMLS_D)
116: {
117: zend_class_entry incomplete_class;
118:
119: INIT_CLASS_ENTRY(incomplete_class, INCOMPLETE_CLASS, NULL);
120: incomplete_class.create_object = php_create_incomplete_object;
121:
122: memcpy(&php_incomplete_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
123: php_incomplete_object_handlers.read_property = incomplete_class_get_property;
124: php_incomplete_object_handlers.has_property = incomplete_class_has_property;
125: php_incomplete_object_handlers.unset_property = incomplete_class_unset_property;
126: php_incomplete_object_handlers.write_property = incomplete_class_write_property;
127: php_incomplete_object_handlers.get_property_ptr_ptr = incomplete_class_get_property_ptr_ptr;
128: php_incomplete_object_handlers.get_method = incomplete_class_get_method;
129:
130: return zend_register_internal_class(&incomplete_class TSRMLS_CC);
131: }
132: /* }}} */
133:
134: /* {{{ php_lookup_class_name
135: */
136: PHPAPI char *php_lookup_class_name(zval *object, zend_uint *nlen)
137: {
138: zval **val;
139: char *retval = NULL;
140: HashTable *object_properties;
141: TSRMLS_FETCH();
142:
143: object_properties = Z_OBJPROP_P(object);
144:
145: if (zend_hash_find(object_properties, MAGIC_MEMBER, sizeof(MAGIC_MEMBER), (void **) &val) == SUCCESS) {
146: retval = estrndup(Z_STRVAL_PP(val), Z_STRLEN_PP(val));
147:
148: if (nlen) {
149: *nlen = Z_STRLEN_PP(val);
150: }
151: }
152:
153: return retval;
154: }
155: /* }}} */
156:
157: /* {{{ php_store_class_name
158: */
159: PHPAPI void php_store_class_name(zval *object, const char *name, zend_uint len)
160: {
161: zval *val;
162: TSRMLS_FETCH();
163:
164: MAKE_STD_ZVAL(val);
165:
166: Z_TYPE_P(val) = IS_STRING;
167: Z_STRVAL_P(val) = estrndup(name, len);
168: Z_STRLEN_P(val) = len;
169:
170: zend_hash_update(Z_OBJPROP_P(object), MAGIC_MEMBER, sizeof(MAGIC_MEMBER), &val, sizeof(val), NULL);
171: }
172: /* }}} */
173:
174: /*
175: * Local variables:
176: * tab-width: 4
177: * c-basic-offset: 4
178: * End:
179: * vim600: sw=4 ts=4 fdm=marker
180: * vim<600: sw=4 ts=4
181: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>