Annotation of embedaddon/php/ext/standard/incomplete_class.c, revision 1.1.1.4
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
1.1.1.4 ! misho 5: | Copyright (c) 1997-2014 The PHP Group |
1.1 misho 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:
1.1.1.3 misho 112: object_properties_init(object, class_type);
113:
1.1 misho 114: return value;
115: }
116:
117: PHPAPI zend_class_entry *php_create_incomplete_class(TSRMLS_D)
118: {
119: zend_class_entry incomplete_class;
120:
121: INIT_CLASS_ENTRY(incomplete_class, INCOMPLETE_CLASS, NULL);
122: incomplete_class.create_object = php_create_incomplete_object;
123:
124: memcpy(&php_incomplete_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
125: php_incomplete_object_handlers.read_property = incomplete_class_get_property;
126: php_incomplete_object_handlers.has_property = incomplete_class_has_property;
127: php_incomplete_object_handlers.unset_property = incomplete_class_unset_property;
128: php_incomplete_object_handlers.write_property = incomplete_class_write_property;
129: php_incomplete_object_handlers.get_property_ptr_ptr = incomplete_class_get_property_ptr_ptr;
130: php_incomplete_object_handlers.get_method = incomplete_class_get_method;
131:
132: return zend_register_internal_class(&incomplete_class TSRMLS_CC);
133: }
134: /* }}} */
135:
136: /* {{{ php_lookup_class_name
137: */
138: PHPAPI char *php_lookup_class_name(zval *object, zend_uint *nlen)
139: {
140: zval **val;
141: char *retval = NULL;
142: HashTable *object_properties;
143: TSRMLS_FETCH();
144:
145: object_properties = Z_OBJPROP_P(object);
146:
147: if (zend_hash_find(object_properties, MAGIC_MEMBER, sizeof(MAGIC_MEMBER), (void **) &val) == SUCCESS) {
148: retval = estrndup(Z_STRVAL_PP(val), Z_STRLEN_PP(val));
149:
150: if (nlen) {
151: *nlen = Z_STRLEN_PP(val);
152: }
153: }
154:
155: return retval;
156: }
157: /* }}} */
158:
159: /* {{{ php_store_class_name
160: */
161: PHPAPI void php_store_class_name(zval *object, const char *name, zend_uint len)
162: {
163: zval *val;
164: TSRMLS_FETCH();
165:
166: MAKE_STD_ZVAL(val);
167:
168: Z_TYPE_P(val) = IS_STRING;
169: Z_STRVAL_P(val) = estrndup(name, len);
170: Z_STRLEN_P(val) = len;
171:
172: zend_hash_update(Z_OBJPROP_P(object), MAGIC_MEMBER, sizeof(MAGIC_MEMBER), &val, sizeof(val), NULL);
173: }
174: /* }}} */
175:
176: /*
177: * Local variables:
178: * tab-width: 4
179: * c-basic-offset: 4
180: * End:
181: * vim600: sw=4 ts=4 fdm=marker
182: * vim<600: sw=4 ts=4
183: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>