helly Fri Dec 22 00:47:27 2006 UTC
Modified files:
/php-src/ext/standard var.c var_unserializer.c var_unserializer.re
/php-src/ext/standard/tests/serialize 005.phpt
Log:
- Make custom serializing work with zstr (as discussed with andrei)
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/var.c?r1=1.256&r2=1.257&diff_format=u
Index: php-src/ext/standard/var.c
diff -u php-src/ext/standard/var.c:1.256 php-src/ext/standard/var.c:1.257
--- php-src/ext/standard/var.c:1.256 Thu Dec 21 23:19:48 2006
+++ php-src/ext/standard/var.c Fri Dec 22 00:47:27 2006
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: var.c,v 1.256 2006/12/21 23:19:48 helly Exp $ */
+/* $Id: var.c,v 1.257 2006/12/22 00:47:27 helly Exp $ */
@@ -972,10 +972,12 @@
if(ce && ce->serialize != NULL) {
/* has custom handler */
- unsigned char *serialized_data = NULL;
+ int serialized_type;
+ zstr serialized_data;
zend_uint serialized_length;
- if(ce->serialize(struc,
&serialized_data, &serialized_length, (zend_serialize_data *)var_hash
TSRMLS_CC) == SUCCESS) {
+ serialized_data.v = NULL;
+ if(ce->serialize(struc,
&serialized_type, &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_P(struc)->name_length);
smart_str_appendl(buf, ":\"",
2);
@@ -989,15 +991,21 @@
smart_str_appendl(buf, "\":",
2);
smart_str_append_long(buf,
serialized_length);
- smart_str_appendl(buf, ":{", 2);
- /* we need binary or ascii at
least not unicode */
- smart_str_appendl(buf,
serialized_data, serialized_length);
+ if (serialized_type ==
IS_UNICODE) {
+ smart_str_appendl(buf,
":U:{", 4);
+
php_var_serialize_ustr(buf, serialized_data.u, serialized_length);
+ } else if (serialized_type ==
IS_STRING) {
+ smart_str_appendl(buf,
":{", 2);
+ smart_str_appendl(buf,
serialized_data.s, serialized_length);
+ } else {
+ smart_str_appendc(buf,
'N');
+ }
smart_str_appendc(buf, '}');
} else {
smart_str_appendl(buf, "N;", 2);
}
- if(serialized_data) {
- efree(serialized_data);
+ if(serialized_data.v) {
+ efree(serialized_data.v);
}
return;
}
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/var_unserializer.c?r1=1.82&r2=1.83&diff_format=u
Index: php-src/ext/standard/var_unserializer.c
diff -u php-src/ext/standard/var_unserializer.c:1.82
php-src/ext/standard/var_unserializer.c:1.83
--- php-src/ext/standard/var_unserializer.c:1.82 Thu Dec 14 23:41:57 2006
+++ php-src/ext/standard/var_unserializer.c Fri Dec 22 00:47:27 2006
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.9.12 on Thu Dec 14 15:32:34 2006 */
+/* Generated by re2c 0.10.2 on Thu Dec 21 19:19:25 2006 */
#line 1 "ext/standard/var_unserializer.re"
/*
+----------------------------------------------------------------------+
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: var_unserializer.c,v 1.82 2006/12/14 23:41:57 andrei Exp $ */
+/* $Id: var_unserializer.c,v 1.83 2006/12/22 00:47:27 helly Exp $ */
#include "php.h"
#include "ext/standard/php_var.h"
@@ -347,6 +347,7 @@
static inline int object_custom(UNSERIALIZE_PARAMETER, zend_class_entry *ce)
{
long datalen;
+ int type;
if(ce->unserialize == NULL) {
zend_error(E_WARNING, "Class %v has no unserializer", ce->name);
@@ -355,14 +356,29 @@
datalen = parse_iv2((*p) + 2, p);
- (*p) += 2;
-
+ switch((*p)[1]) {
+ case 'U':
+ type = IS_UNICODE;
+ (*p) += 4;
+ break;
+ case 'N':
+ (*p) += 2;
+ return finish_nested_data(UNSERIALIZE_PASSTHRU);
+ case '{':
+ type = IS_STRING;
+ (*p) += 2;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal data for unserializing");
+ return 0;
+ }
+
if(datalen < 0 || (*p) + datalen >= max) {
zend_error(E_WARNING, "Insufficient data for unserializing -
%ld required, %d present", datalen, max - (*p));
return 0;
}
- if(ce->unserialize(rval, ce, (const unsigned char*)*p, datalen,
(zend_unserialize_data *)var_hash TSRMLS_CC) != SUCCESS) {
+ if(ce->unserialize(rval, ce, type, ZSTR((char*)*p), datalen,
(zend_unserialize_data *)var_hash TSRMLS_CC) != SUCCESS) {
return 0;
}
@@ -424,160 +440,154 @@
{
static unsigned char yybm[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
};
-#line 462 "ext/standard/var_unserializer.c"
-{
- YYCTYPE yych;
- unsigned int yyaccept = 0;
- goto yy0;
- ++YYCURSOR;
-yy0:
- if((YYLIMIT - YYCURSOR) < 7) YYFILL(7);
- yych = *YYCURSOR;
- switch(yych){
- case 'C': case 'O': goto yy14;
- case 'N': goto yy5;
- case 'R': goto yy2;
- case 'S': goto yy10;
- case 'U': goto yy11;
- case 'a': goto yy12;
- case 'b': goto yy6;
- case 'd': goto yy8;
- case 'i': goto yy7;
- case 'o': goto yy13;
- case 'r': goto yy4;
- case 's': goto yy9;
- case '}': goto yy15;
- default: goto yy17;
- }
-yy2: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == ':') goto yy103;
- goto yy3;
+#line 478 "ext/standard/var_unserializer.c"
+ {
+ YYCTYPE yych;
+
+ if((YYLIMIT - YYCURSOR) < 7) YYFILL(7);
+ yych = *YYCURSOR;
+ switch(yych){
+ case 'C':
+ case 'O': goto yy14;
+ case 'N': goto yy5;
+ case 'R': goto yy2;
+ case 'S': goto yy10;
+ case 'U': goto yy11;
+ case 'a': goto yy12;
+ case 'b': goto yy6;
+ case 'd': goto yy8;
+ case 'i': goto yy7;
+ case 'o': goto yy13;
+ case 'r': goto yy4;
+ case 's': goto yy9;
+ case '}': goto yy15;
+ default: goto yy17;
+ }
+yy2:
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == ':') goto yy103;
yy3:
-#line 753 "ext/standard/var_unserializer.re"
-{ return 0; }
-#line 494 "ext/standard/var_unserializer.c"
-yy4: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == ':') goto yy97;
- goto yy3;
-yy5: yych = *++YYCURSOR;
- if(yych == ';') goto yy95;
- goto yy3;
-yy6: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == ':') goto yy91;
- goto yy3;
-yy7: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == ':') goto yy85;
- goto yy3;
-yy8: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == ':') goto yy61;
- goto yy3;
-yy9: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == ':') goto yy54;
- goto yy3;
-yy10: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == ':') goto yy47;
- goto yy3;
-yy11: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == ':') goto yy40;
- goto yy3;
-yy12: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == ':') goto yy33;
- goto yy3;
-yy13: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == ':') goto yy26;
- goto yy3;
-yy14: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == ':') goto yy18;
- goto yy3;
-yy15: ++YYCURSOR;
- goto yy16;
-yy16:
-#line 747 "ext/standard/var_unserializer.re"
-{
+#line 769 "ext/standard/var_unserializer.re"
+ { return 0; }
+#line 507 "ext/standard/var_unserializer.c"
+yy4:
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == ':') goto yy97;
+ goto yy3;
+yy5:
+ yych = *++YYCURSOR;
+ if(yych == ';') goto yy95;
+ goto yy3;
+yy6:
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == ':') goto yy91;
+ goto yy3;
+yy7:
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == ':') goto yy85;
+ goto yy3;
+yy8:
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == ':') goto yy61;
+ goto yy3;
+yy9:
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == ':') goto yy54;
+ goto yy3;
+yy10:
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == ':') goto yy47;
+ goto yy3;
+yy11:
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == ':') goto yy40;
+ goto yy3;
+yy12:
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == ':') goto yy33;
+ goto yy3;
+yy13:
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == ':') goto yy26;
+ goto yy3;
+yy14:
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == ':') goto yy18;
+ goto yy3;
+yy15:
+ ++YYCURSOR;
+#line 763 "ext/standard/var_unserializer.re"
+ {
/* this is the case where we have less data than planned */
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unexpected end of
serialized data");
return 0; /* not sure if it should be 0 or 1 here? */
}
-#line 547 "ext/standard/var_unserializer.c"
-yy17: yych = *++YYCURSOR;
- goto yy3;
-yy18: yych = *++YYCURSOR;
- if(yybm[0+yych] & 128) {
- goto yy21;
- }
- if(yych == '+') goto yy20;
- goto yy19;
-yy19: YYCURSOR = YYMARKER;
- switch(yyaccept){
- case 0: goto yy3;
- }
-yy20: yych = *++YYCURSOR;
- if(yybm[0+yych] & 128) {
- goto yy21;
- }
- goto yy19;
-yy21: ++YYCURSOR;
- if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- goto yy22;
-yy22: if(yybm[0+yych] & 128) {
- goto yy21;
- }
- if(yych != ':') goto yy19;
- goto yy23;
-yy23: yych = *++YYCURSOR;
- if(yych != '"') goto yy19;
- goto yy24;
-yy24: ++YYCURSOR;
- goto yy25;
-yy25:
-#line 634 "ext/standard/var_unserializer.re"
-{
+#line 560 "ext/standard/var_unserializer.c"
+yy17:
+ yych = *++YYCURSOR;
+ goto yy3;
+yy18:
+ yych = *++YYCURSOR;
+ if(yybm[0+yych] & 128) {
+ goto yy21;
+ }
+ if(yych == '+') goto yy20;
+yy19:
+ YYCURSOR = YYMARKER;
+ goto yy3;
+yy20:
+ yych = *++YYCURSOR;
+ if(yybm[0+yych] & 128) {
+ goto yy21;
+ }
+ goto yy19;
+yy21:
+ ++YYCURSOR;
+ if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if(yybm[0+yych] & 128) {
+ goto yy21;
+ }
+ if(yych != ':') goto yy19;
+ yych = *++YYCURSOR;
+ if(yych != '"') goto yy19;
+ ++YYCURSOR;
+#line 650 "ext/standard/var_unserializer.re"
+ {
size_t len, len2, len3, maxlen;
long elements;
zstr class_name;
@@ -689,69 +699,62 @@
return object_common2(UNSERIALIZE_PASSTHRU, elements);
}
-#line 693 "ext/standard/var_unserializer.c"
-yy26: yych = *++YYCURSOR;
- if(yych <= ','){
- if(yych != '+') goto yy19;
- goto yy27;
- } else {
- if(yych <= '-') goto yy27;
- if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy28;
- goto yy19;
- }
-yy27: yych = *++YYCURSOR;
- if(yych <= '/') goto yy19;
- if(yych >= ':') goto yy19;
- goto yy28;
-yy28: ++YYCURSOR;
- if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- goto yy29;
-yy29: if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy28;
- if(yych >= ';') goto yy19;
- goto yy30;
-yy30: yych = *++YYCURSOR;
- if(yych != '"') goto yy19;
- goto yy31;
-yy31: ++YYCURSOR;
- goto yy32;
-yy32:
-#line 626 "ext/standard/var_unserializer.re"
-{
+#line 703 "ext/standard/var_unserializer.c"
+yy26:
+ yych = *++YYCURSOR;
+ if(yych <= ',') {
+ if(yych != '+') goto yy19;
+ } else {
+ if(yych <= '-') goto yy27;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy28;
+ goto yy19;
+ }
+yy27:
+ yych = *++YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych >= ':') goto yy19;
+yy28:
+ ++YYCURSOR;
+ if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy28;
+ if(yych >= ';') goto yy19;
+ yych = *++YYCURSOR;
+ if(yych != '"') goto yy19;
+ ++YYCURSOR;
+#line 642 "ext/standard/var_unserializer.re"
+ {
INIT_PZVAL(*rval);
return object_common2(UNSERIALIZE_PASSTHRU,
object_common1(UNSERIALIZE_PASSTHRU,
ZEND_STANDARD_CLASS_DEF_PTR));
}
-#line 730 "ext/standard/var_unserializer.c"
-yy33: yych = *++YYCURSOR;
- if(yych == '+') goto yy34;
- if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy35;
- goto yy19;
-yy34: yych = *++YYCURSOR;
- if(yych <= '/') goto yy19;
- if(yych >= ':') goto yy19;
- goto yy35;
-yy35: ++YYCURSOR;
- if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- goto yy36;
-yy36: if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy35;
- if(yych >= ';') goto yy19;
- goto yy37;
-yy37: yych = *++YYCURSOR;
- if(yych != '{') goto yy19;
- goto yy38;
-yy38: ++YYCURSOR;
- goto yy39;
-yy39:
-#line 604 "ext/standard/var_unserializer.re"
-{
+#line 736 "ext/standard/var_unserializer.c"
+yy33:
+ yych = *++YYCURSOR;
+ if(yych == '+') goto yy34;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy35;
+ goto yy19;
+yy34:
+ yych = *++YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych >= ':') goto yy19;
+yy35:
+ ++YYCURSOR;
+ if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy35;
+ if(yych >= ';') goto yy19;
+ yych = *++YYCURSOR;
+ if(yych != '{') goto yy19;
+ ++YYCURSOR;
+#line 620 "ext/standard/var_unserializer.re"
+ {
long elements = parse_iv(start + 2);
/* use iv() not uiv() in order to check data range */
*p = YYCURSOR;
@@ -772,32 +775,29 @@
return finish_nested_data(UNSERIALIZE_PASSTHRU);
}
-#line 776 "ext/standard/var_unserializer.c"
-yy40: yych = *++YYCURSOR;
- if(yych == '+') goto yy41;
- if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy42;
- goto yy19;
-yy41: yych = *++YYCURSOR;
- if(yych <= '/') goto yy19;
- if(yych >= ':') goto yy19;
- goto yy42;
-yy42: ++YYCURSOR;
- if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- goto yy43;
-yy43: if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy42;
- if(yych >= ';') goto yy19;
- goto yy44;
-yy44: yych = *++YYCURSOR;
- if(yych != '"') goto yy19;
- goto yy45;
-yy45: ++YYCURSOR;
- goto yy46;
-yy46:
-#line 575 "ext/standard/var_unserializer.re"
-{
+#line 779 "ext/standard/var_unserializer.c"
+yy40:
+ yych = *++YYCURSOR;
+ if(yych == '+') goto yy41;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy42;
+ goto yy19;
+yy41:
+ yych = *++YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych >= ':') goto yy19;
+yy42:
+ ++YYCURSOR;
+ if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy42;
+ if(yych >= ';') goto yy19;
+ yych = *++YYCURSOR;
+ if(yych != '"') goto yy19;
+ ++YYCURSOR;
+#line 591 "ext/standard/var_unserializer.re"
+ {
size_t len, maxlen;
UChar *ustr;
@@ -826,31 +826,28 @@
return 1;
}
#line 829 "ext/standard/var_unserializer.c"
-yy47: yych = *++YYCURSOR;
- if(yych == '+') goto yy48;
- if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy49;
- goto yy19;
-yy48: yych = *++YYCURSOR;
- if(yych <= '/') goto yy19;
- if(yych >= ':') goto yy19;
- goto yy49;
-yy49: ++YYCURSOR;
- if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- goto yy50;
-yy50: if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy49;
- if(yych >= ';') goto yy19;
- goto yy51;
-yy51: yych = *++YYCURSOR;
- if(yych != '"') goto yy19;
- goto yy52;
-yy52: ++YYCURSOR;
- goto yy53;
-yy53:
-#line 546 "ext/standard/var_unserializer.re"
-{
+yy47:
+ yych = *++YYCURSOR;
+ if(yych == '+') goto yy48;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy49;
+ goto yy19;
+yy48:
+ yych = *++YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych >= ':') goto yy19;
+yy49:
+ ++YYCURSOR;
+ if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy49;
+ if(yych >= ';') goto yy19;
+ yych = *++YYCURSOR;
+ if(yych != '"') goto yy19;
+ ++YYCURSOR;
+#line 562 "ext/standard/var_unserializer.re"
+ {
size_t len, maxlen;
char *str;
@@ -878,32 +875,29 @@
ZVAL_STRINGL(*rval, str, len, 0);
return 1;
}
-#line 882 "ext/standard/var_unserializer.c"
-yy54: yych = *++YYCURSOR;
- if(yych == '+') goto yy55;
- if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy56;
- goto yy19;
-yy55: yych = *++YYCURSOR;
- if(yych <= '/') goto yy19;
- if(yych >= ':') goto yy19;
- goto yy56;
-yy56: ++YYCURSOR;
- if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- goto yy57;
-yy57: if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy56;
- if(yych >= ';') goto yy19;
- goto yy58;
-yy58: yych = *++YYCURSOR;
- if(yych != '"') goto yy19;
- goto yy59;
-yy59: ++YYCURSOR;
- goto yy60;
-yy60:
-#line 518 "ext/standard/var_unserializer.re"
-{
+#line 879 "ext/standard/var_unserializer.c"
+yy54:
+ yych = *++YYCURSOR;
+ if(yych == '+') goto yy55;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy56;
+ goto yy19;
+yy55:
+ yych = *++YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych >= ':') goto yy19;
+yy56:
+ ++YYCURSOR;
+ if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy56;
+ if(yych >= ';') goto yy19;
+ yych = *++YYCURSOR;
+ if(yych != '"') goto yy19;
+ ++YYCURSOR;
+#line 534 "ext/standard/var_unserializer.re"
+ {
size_t len, maxlen;
char *str;
@@ -930,164 +924,162 @@
ZVAL_STRINGL(*rval, str, len, 1);
return 1;
}
-#line 934 "ext/standard/var_unserializer.c"
-yy61: yych = *++YYCURSOR;
- if(yych <= '/'){
- if(yych <= ','){
- if(yych == '+') goto yy65;
- goto yy19;
+#line 928 "ext/standard/var_unserializer.c"
+yy61:
+ yych = *++YYCURSOR;
+ if(yych <= '/') {
+ if(yych <= ',') {
+ if(yych == '+') goto yy65;
+ goto yy19;
+ } else {
+ if(yych <= '-') goto yy63;
+ if(yych <= '.') goto yy68;
+ goto yy19;
+ }
} else {
- if(yych <= '-') goto yy63;
- if(yych <= '.') goto yy68;
- goto yy19;
+ if(yych <= 'I') {
+ if(yych <= '9') goto yy66;
+ if(yych <= 'H') goto yy19;
+ goto yy64;
+ } else {
+ if(yych != 'N') goto yy19;
+ }
}
- } else {
- if(yych <= 'I'){
- if(yych <= '9') goto yy66;
- if(yych <= 'H') goto yy19;
- goto yy64;
+ yych = *++YYCURSOR;
+ if(yych == 'A') goto yy84;
+ goto yy19;
+yy63:
+ yych = *++YYCURSOR;
+ if(yych <= '/') {
+ if(yych == '.') goto yy68;
+ goto yy19;
} else {
- if(yych != 'N') goto yy19;
- goto yy62;
+ if(yych <= '9') goto yy66;
+ if(yych != 'I') goto yy19;
}
- }
-yy62: yych = *++YYCURSOR;
- if(yych == 'A') goto yy84;
- goto yy19;
-yy63: yych = *++YYCURSOR;
- if(yych <= '/'){
- if(yych == '.') goto yy68;
+yy64:
+ yych = *++YYCURSOR;
+ if(yych == 'N') goto yy80;
goto yy19;
- } else {
- if(yych <= '9') goto yy66;
- if(yych != 'I') goto yy19;
- goto yy64;
- }
-yy64: yych = *++YYCURSOR;
- if(yych == 'N') goto yy80;
- goto yy19;
-yy65: yych = *++YYCURSOR;
- if(yych == '.') goto yy68;
- if(yych <= '/') goto yy19;
- if(yych >= ':') goto yy19;
- goto yy66;
-yy66: ++YYCURSOR;
- if((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
- yych = *YYCURSOR;
- goto yy67;
-yy67: if(yych <= ':'){
- if(yych <= '.'){
- if(yych <= '-') goto yy19;
- goto yy78;
+yy65:
+ yych = *++YYCURSOR;
+ if(yych == '.') goto yy68;
+ if(yych <= '/') goto yy19;
+ if(yych >= ':') goto yy19;
+yy66:
+ ++YYCURSOR;
+ if((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
+ yych = *YYCURSOR;
+ if(yych <= ':') {
+ if(yych <= '.') {
+ if(yych <= '-') goto yy19;
+ goto yy78;
+ } else {
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy66;
+ goto yy19;
+ }
} else {
- if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy66;
- goto yy19;
+ if(yych <= 'E') {
+ if(yych <= ';') goto yy71;
+ if(yych <= 'D') goto yy19;
+ goto yy73;
+ } else {
+ if(yych == 'e') goto yy73;
+ goto yy19;
+ }
}
- } else {
- if(yych <= 'E'){
- if(yych <= ';') goto yy71;
- if(yych <= 'D') goto yy19;
- goto yy73;
+yy68:
+ yych = *++YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych >= ':') goto yy19;
+yy69:
+ ++YYCURSOR;
+ if((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
+ yych = *YYCURSOR;
+ if(yych <= ';') {
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy69;
+ if(yych <= ':') goto yy19;
} else {
- if(yych == 'e') goto yy73;
- goto yy19;
- }
- }
-yy68: yych = *++YYCURSOR;
- if(yych <= '/') goto yy19;
- if(yych >= ':') goto yy19;
- goto yy69;
-yy69: ++YYCURSOR;
- if((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
- yych = *YYCURSOR;
- goto yy70;
-yy70: if(yych <= ';'){
- if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy69;
- if(yych <= ':') goto yy19;
- goto yy71;
- } else {
- if(yych <= 'E'){
- if(yych <= 'D') goto yy19;
- goto yy73;
- } else {
- if(yych == 'e') goto yy73;
- goto yy19;
+ if(yych <= 'E') {
+ if(yych <= 'D') goto yy19;
+ goto yy73;
+ } else {
+ if(yych == 'e') goto yy73;
+ goto yy19;
+ }
}
- }
-yy71: ++YYCURSOR;
- goto yy72;
-yy72:
-#line 511 "ext/standard/var_unserializer.re"
-{
+yy71:
+ ++YYCURSOR;
+#line 527 "ext/standard/var_unserializer.re"
+ {
*p = YYCURSOR;
INIT_PZVAL(*rval);
ZVAL_DOUBLE(*rval, zend_strtod((const char *)start + 2, NULL));
return 1;
}
-#line 1030 "ext/standard/var_unserializer.c"
-yy73: yych = *++YYCURSOR;
- if(yych <= ','){
- if(yych != '+') goto yy19;
- goto yy74;
- } else {
- if(yych <= '-') goto yy74;
- if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy75;
+#line 1023 "ext/standard/var_unserializer.c"
+yy73:
+ yych = *++YYCURSOR;
+ if(yych <= ',') {
+ if(yych != '+') goto yy19;
+ } else {
+ if(yych <= '-') goto yy74;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy75;
+ goto yy19;
+ }
+yy74:
+ yych = *++YYCURSOR;
+ if(yych <= ',') {
+ if(yych == '+') goto yy77;
+ goto yy19;
+ } else {
+ if(yych <= '-') goto yy77;
+ if(yych <= '/') goto yy19;
+ if(yych >= ':') goto yy19;
+ }
+yy75:
+ ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy75;
+ if(yych == ';') goto yy71;
goto yy19;
- }
-yy74: yych = *++YYCURSOR;
- if(yych <= ','){
- if(yych == '+') goto yy77;
+yy77:
+ yych = *++YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy75;
goto yy19;
- } else {
- if(yych <= '-') goto yy77;
- if(yych <= '/') goto yy19;
- if(yych >= ':') goto yy19;
- goto yy75;
- }
-yy75: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- goto yy76;
-yy76: if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy75;
- if(yych == ';') goto yy71;
- goto yy19;
-yy77: yych = *++YYCURSOR;
- if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy75;
- goto yy19;
-yy78: ++YYCURSOR;
- if((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
- yych = *YYCURSOR;
- goto yy79;
-yy79: if(yych <= ';'){
- if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy78;
- if(yych <= ':') goto yy19;
- goto yy71;
- } else {
- if(yych <= 'E'){
- if(yych <= 'D') goto yy19;
- goto yy73;
+yy78:
+ ++YYCURSOR;
+ if((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
+ yych = *YYCURSOR;
+ if(yych <= ';') {
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy78;
+ if(yych <= ':') goto yy19;
+ goto yy71;
} else {
- if(yych == 'e') goto yy73;
- goto yy19;
+ if(yych <= 'E') {
+ if(yych <= 'D') goto yy19;
+ goto yy73;
+ } else {
+ if(yych == 'e') goto yy73;
+ goto yy19;
+ }
}
- }
-yy80: yych = *++YYCURSOR;
- if(yych != 'F') goto yy19;
- goto yy81;
-yy81: yych = *++YYCURSOR;
- if(yych != ';') goto yy19;
- goto yy82;
-yy82: ++YYCURSOR;
- goto yy83;
-yy83:
-#line 496 "ext/standard/var_unserializer.re"
-{
+yy80:
+ yych = *++YYCURSOR;
+ if(yych != 'F') goto yy19;
+yy81:
+ yych = *++YYCURSOR;
+ if(yych != ';') goto yy19;
+ ++YYCURSOR;
+#line 512 "ext/standard/var_unserializer.re"
+ {
*p = YYCURSOR;
INIT_PZVAL(*rval);
@@ -1101,99 +1093,90 @@
return 1;
}
-#line 1105 "ext/standard/var_unserializer.c"
-yy84: yych = *++YYCURSOR;
- if(yych == 'N') goto yy81;
- goto yy19;
-yy85: yych = *++YYCURSOR;
- if(yych <= ','){
- if(yych != '+') goto yy19;
- goto yy86;
- } else {
- if(yych <= '-') goto yy86;
- if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy87;
+#line 1097 "ext/standard/var_unserializer.c"
+yy84:
+ yych = *++YYCURSOR;
+ if(yych == 'N') goto yy81;
goto yy19;
- }
-yy86: yych = *++YYCURSOR;
- if(yych <= '/') goto yy19;
- if(yych >= ':') goto yy19;
- goto yy87;
-yy87: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- goto yy88;
-yy88: if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy87;
- if(yych != ';') goto yy19;
- goto yy89;
-yy89: ++YYCURSOR;
- goto yy90;
-yy90:
-#line 489 "ext/standard/var_unserializer.re"
-{
+yy85:
+ yych = *++YYCURSOR;
+ if(yych <= ',') {
+ if(yych != '+') goto yy19;
+ } else {
+ if(yych <= '-') goto yy86;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy87;
+ goto yy19;
+ }
+yy86:
+ yych = *++YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych >= ':') goto yy19;
+yy87:
+ ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy87;
+ if(yych != ';') goto yy19;
+ ++YYCURSOR;
+#line 505 "ext/standard/var_unserializer.re"
+ {
*p = YYCURSOR;
INIT_PZVAL(*rval);
ZVAL_LONG(*rval, parse_iv(start + 2));
return 1;
}
-#line 1141 "ext/standard/var_unserializer.c"
-yy91: yych = *++YYCURSOR;
- if(yych <= '/') goto yy19;
- if(yych >= '2') goto yy19;
- goto yy92;
-yy92: yych = *++YYCURSOR;
- if(yych != ';') goto yy19;
- goto yy93;
-yy93: ++YYCURSOR;
- goto yy94;
-yy94:
-#line 482 "ext/standard/var_unserializer.re"
-{
+#line 1131 "ext/standard/var_unserializer.c"
+yy91:
+ yych = *++YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych >= '2') goto yy19;
+ yych = *++YYCURSOR;
+ if(yych != ';') goto yy19;
+ ++YYCURSOR;
+#line 498 "ext/standard/var_unserializer.re"
+ {
*p = YYCURSOR;
INIT_PZVAL(*rval);
ZVAL_BOOL(*rval, parse_iv(start + 2));
return 1;
}
-#line 1159 "ext/standard/var_unserializer.c"
-yy95: ++YYCURSOR;
- goto yy96;
-yy96:
-#line 475 "ext/standard/var_unserializer.re"
-{
+#line 1146 "ext/standard/var_unserializer.c"
+yy95:
+ ++YYCURSOR;
+#line 491 "ext/standard/var_unserializer.re"
+ {
*p = YYCURSOR;
INIT_PZVAL(*rval);
ZVAL_NULL(*rval);
return 1;
}
-#line 1170 "ext/standard/var_unserializer.c"
-yy97: yych = *++YYCURSOR;
- if(yych <= ','){
- if(yych != '+') goto yy19;
- goto yy98;
- } else {
- if(yych <= '-') goto yy98;
- if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy99;
- goto yy19;
- }
-yy98: yych = *++YYCURSOR;
- if(yych <= '/') goto yy19;
- if(yych >= ':') goto yy19;
- goto yy99;
-yy99: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- goto yy100;
-yy100: if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy99;
- if(yych != ';') goto yy19;
- goto yy101;
-yy101: ++YYCURSOR;
- goto yy102;
-yy102:
-#line 452 "ext/standard/var_unserializer.re"
-{
+#line 1156 "ext/standard/var_unserializer.c"
+yy97:
+ yych = *++YYCURSOR;
+ if(yych <= ',') {
+ if(yych != '+') goto yy19;
+ } else {
+ if(yych <= '-') goto yy98;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy99;
+ goto yy19;
+ }
+yy98:
+ yych = *++YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych >= ':') goto yy19;
+yy99:
+ ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy99;
+ if(yych != ';') goto yy19;
+ ++YYCURSOR;
+#line 468 "ext/standard/var_unserializer.re"
+ {
long id;
*p = YYCURSOR;
@@ -1215,34 +1198,31 @@
return 1;
}
-#line 1219 "ext/standard/var_unserializer.c"
-yy103: yych = *++YYCURSOR;
- if(yych <= ','){
- if(yych != '+') goto yy19;
- goto yy104;
- } else {
- if(yych <= '-') goto yy104;
- if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy105;
- goto yy19;
- }
-yy104: yych = *++YYCURSOR;
- if(yych <= '/') goto yy19;
- if(yych >= ':') goto yy19;
- goto yy105;
-yy105: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- goto yy106;
-yy106: if(yych <= '/') goto yy19;
- if(yych <= '9') goto yy105;
- if(yych != ';') goto yy19;
- goto yy107;
-yy107: ++YYCURSOR;
- goto yy108;
-yy108:
-#line 431 "ext/standard/var_unserializer.re"
-{
+#line 1202 "ext/standard/var_unserializer.c"
+yy103:
+ yych = *++YYCURSOR;
+ if(yych <= ',') {
+ if(yych != '+') goto yy19;
+ } else {
+ if(yych <= '-') goto yy104;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy105;
+ goto yy19;
+ }
+yy104:
+ yych = *++YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych >= ':') goto yy19;
+yy105:
+ ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if(yych <= '/') goto yy19;
+ if(yych <= '9') goto yy105;
+ if(yych != ';') goto yy19;
+ ++YYCURSOR;
+#line 447 "ext/standard/var_unserializer.re"
+ {
long id;
*p = YYCURSOR;
@@ -1262,10 +1242,10 @@
return 1;
}
-#line 1266 "ext/standard/var_unserializer.c"
-}
+#line 1246 "ext/standard/var_unserializer.c"
+ }
}
-#line 755 "ext/standard/var_unserializer.re"
+#line 771 "ext/standard/var_unserializer.re"
return 0;
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/var_unserializer.re?r1=1.61&r2=1.62&diff_format=u
Index: php-src/ext/standard/var_unserializer.re
diff -u php-src/ext/standard/var_unserializer.re:1.61
php-src/ext/standard/var_unserializer.re:1.62
--- php-src/ext/standard/var_unserializer.re:1.61 Thu Dec 14 23:41:57 2006
+++ php-src/ext/standard/var_unserializer.re Fri Dec 22 00:47:27 2006
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: var_unserializer.re,v 1.61 2006/12/14 23:41:57 andrei Exp $ */
+/* $Id: var_unserializer.re,v 1.62 2006/12/22 00:47:27 helly Exp $ */
#include "php.h"
#include "ext/standard/php_var.h"
@@ -351,6 +351,7 @@
static inline int object_custom(UNSERIALIZE_PARAMETER, zend_class_entry *ce)
{
long datalen;
+ int type;
if(ce->unserialize == NULL) {
zend_error(E_WARNING, "Class %v has no unserializer", ce->name);
@@ -359,14 +360,29 @@
datalen = parse_iv2((*p) + 2, p);
- (*p) += 2;
-
+ switch((*p)[1]) {
+ case 'U':
+ type = IS_UNICODE;
+ (*p) += 4;
+ break;
+ case 'N':
+ (*p) += 2;
+ return finish_nested_data(UNSERIALIZE_PASSTHRU);
+ case '{':
+ type = IS_STRING;
+ (*p) += 2;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal data for unserializing");
+ return 0;
+ }
+
if(datalen < 0 || (*p) + datalen >= max) {
zend_error(E_WARNING, "Insufficient data for unserializing -
%ld required, %d present", datalen, max - (*p));
return 0;
}
- if(ce->unserialize(rval, ce, (const unsigned char*)*p, datalen,
(zend_unserialize_data *)var_hash TSRMLS_CC) != SUCCESS) {
+ if(ce->unserialize(rval, ce, type, ZSTR((char*)*p), datalen,
(zend_unserialize_data *)var_hash TSRMLS_CC) != SUCCESS) {
return 0;
}
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/serialize/005.phpt?r1=1.4&r2=1.5&diff_format=u
Index: php-src/ext/standard/tests/serialize/005.phpt
diff -u php-src/ext/standard/tests/serialize/005.phpt:1.4
php-src/ext/standard/tests/serialize/005.phpt:1.5
--- php-src/ext/standard/tests/serialize/005.phpt:1.4 Mon Mar 27 13:37:47 2006
+++ php-src/ext/standard/tests/serialize/005.phpt Fri Dec 22 00:47:27 2006
@@ -197,7 +197,7 @@
NULL
===N2===
TestNew::serialize()
-unicode(19) "C:7:"TestNew":1:{2}"
+unicode(21) "C:7:"TestNew":1:U:{2}"
TestNew::unserialize()
object(TestNew)#%d (0) {
}
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php