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