summaryrefslogtreecommitdiff
path: root/ext/standard/var_unserializer.re
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2005-02-23 11:17:52 +0000
committerStanislav Malyshev <stas@php.net>2005-02-23 11:17:52 +0000
commitdb3fdce304a9ba026f355fb3d03e9d2eb45cda5d (patch)
tree5d305df1568513c07c66296bffce1c13fc9358c3 /ext/standard/var_unserializer.re
parent5b98a092195a7977fa3f4ab0d6d8918654d50ff9 (diff)
downloadphp-git-db3fdce304a9ba026f355fb3d03e9d2eb45cda5d.tar.gz
Custom object serializer infrastructure - PHP implementation
# The detailed announce on the list will follow
Diffstat (limited to 'ext/standard/var_unserializer.re')
-rw-r--r--ext/standard/var_unserializer.re46
1 files changed, 43 insertions, 3 deletions
diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re
index bc2a477df3..d175731786 100644
--- a/ext/standard/var_unserializer.re
+++ b/ext/standard/var_unserializer.re
@@ -151,6 +151,7 @@ iv = [+-]? [0-9]+;
nv = [+-]? ([0-9]* "." [0-9]+|[0-9]+ "." [0-9]*);
nvexp = (iv | nv) [eE] [+-]? iv;
any = [\000-\277];
+object = [OC];
*/
@@ -280,6 +281,33 @@ static inline int finish_nested_data(UNSERIALIZE_PARAMETER)
return 0;
}
+static inline int object_custom(UNSERIALIZE_PARAMETER, zend_class_entry *ce)
+{
+ int datalen;
+
+ if(ce->unserialize == NULL) {
+ zend_error(E_WARNING, "Class %s has no unserializer", ce->name);
+ return 0;
+ }
+
+ datalen = parse_iv2((*p) + 2, p);
+
+ (*p) += 2;
+
+ if((*p) + datalen >= max) {
+ zend_error(E_WARNING, "Unsifficient data for unserializing - %d required, %d present", datalen, max - (*p));
+ return 0;
+ }
+
+ if(ce->unserialize(rval, *p, datalen, (zend_unserialize_data *)var_hash TSRMLS_CC) != SUCCESS) {
+ return 0;
+ }
+
+ (*p) += datalen;
+
+ return finish_nested_data(UNSERIALIZE_PASSTHRU);
+}
+
static inline int object_common1(UNSERIALIZE_PARAMETER, zend_class_entry *ce)
{
int elements;
@@ -472,18 +500,24 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR));
}
-"O:" uiv ":" ["] {
+object ":" uiv ":" ["] {
size_t len, len2, len3, maxlen;
int elements;
char *class_name;
zend_class_entry *ce;
zend_class_entry **pce;
int incomplete_class = 0;
-
+
+ int custom_object = 0;
+
zval *user_func;
zval *retval_ptr;
zval **args[1];
zval *arg_func_name;
+
+ if(*start == 'C') {
+ custom_object = 1;
+ }
INIT_PZVAL(*rval);
len2 = len = parse_uiv(start + 2);
@@ -560,8 +594,14 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
zval_ptr_dtor(&arg_func_name);
break;
} while (1);
-
+
*p = YYCURSOR;
+
+ if(custom_object) {
+ efree(class_name);
+ return object_custom(UNSERIALIZE_PASSTHRU, ce);
+ }
+
elements = object_common1(UNSERIALIZE_PASSTHRU, ce);
if (incomplete_class) {