kalle                                    Sat, 18 Sep 2010 16:09:28 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=303503

Log:
Improved performance of unserialize(), original patch by galaxy dot mipt at 
gmail dot com

Changed paths:
    U   php/php-src/trunk/NEWS
    U   php/php-src/trunk/ext/standard/php_var.h
    U   php/php-src/trunk/ext/standard/var_unserializer.c
    U   php/php-src/trunk/ext/standard/var_unserializer.re

Modified: php/php-src/trunk/NEWS
===================================================================
--- php/php-src/trunk/NEWS	2010-09-18 16:05:00 UTC (rev 303502)
+++ php/php-src/trunk/NEWS	2010-09-18 16:09:28 UTC (rev 303503)
@@ -97,6 +97,8 @@
   . Don't terminate shell on fatal errors.
 - Improved ext/zlib: re-implemented non-file related functionality. (Mike)
 - Improved output layer. See README.NEW-OUTPUT-API for internals. (Mike)
+- Improved the performance of unserialize(). (galaxy dot mipt at gmail dot com,
+  Kalle)

 - Removed legacy features:
   . allow_call_time_pass_reference. (Pierrick)

Modified: php/php-src/trunk/ext/standard/php_var.h
===================================================================
--- php/php-src/trunk/ext/standard/php_var.h	2010-09-18 16:05:00 UTC (rev 303502)
+++ php/php-src/trunk/ext/standard/php_var.h	2010-09-18 16:09:28 UTC (rev 303503)
@@ -42,7 +42,9 @@

 struct php_unserialize_data {
 	void *first;
+	void *last;
 	void *first_dtor;
+	void *last_dtor;
 };

 typedef struct php_unserialize_data* php_unserialize_data_t;

Modified: php/php-src/trunk/ext/standard/var_unserializer.c
===================================================================
--- php/php-src/trunk/ext/standard/var_unserializer.c	2010-09-18 16:05:00 UTC (rev 303502)
+++ php/php-src/trunk/ext/standard/var_unserializer.c	2010-09-18 16:09:28 UTC (rev 303503)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Fri Aug  6 19:20:07 2010 */
+/* Generated by re2c 0.13.5 on Sat Sep 18 17:59:40 2010 */
 #line 1 "ext/standard/var_unserializer.re"
 /*
   +----------------------------------------------------------------------+
@@ -35,25 +35,23 @@

 static inline void var_push(php_unserialize_data_t *var_hashx, zval **rval)
 {
-	var_entries *var_hash = (*var_hashx)->first, *prev = NULL;
+	var_entries *var_hash = (*var_hashx)->last;
 #if 0
 	fprintf(stderr, "var_push(%ld): %d\n", var_hash?var_hash->used_slots:-1L, Z_TYPE_PP(rval));
 #endif
-
-	while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) {
-		prev = var_hash;
-		var_hash = var_hash->next;
-	}

-	if (!var_hash) {
+	if (!var_hash || var_hash->used_slots == VAR_ENTRIES_MAX) {
 		var_hash = emalloc(sizeof(var_entries));
 		var_hash->used_slots = 0;
 		var_hash->next = 0;

-		if (!(*var_hashx)->first)
+		if (!(*var_hashx)->first) {
 			(*var_hashx)->first = var_hash;
-		else
-			prev->next = var_hash;
+		} else {
+			((var_entries *) (*var_hashx)->last)->next = var_hash;
+		}
+
+		(*var_hashx)->last = var_hash;
 	}

 	var_hash->data[var_hash->used_slots++] = *rval;
@@ -61,25 +59,23 @@

 PHPAPI void var_push_dtor(php_unserialize_data_t *var_hashx, zval **rval)
 {
-	var_entries *var_hash = (*var_hashx)->first_dtor, *prev = NULL;
+	var_entries *var_hash = (*var_hashx)->last_dtor;
 #if 0
 	fprintf(stderr, "var_push_dtor(%ld): %d\n", var_hash?var_hash->used_slots:-1L, Z_TYPE_PP(rval));
 #endif
-
-	while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) {
-		prev = var_hash;
-		var_hash = var_hash->next;
-	}

-	if (!var_hash) {
+	if (!var_hash || var_hash->used_slots == VAR_ENTRIES_MAX) {
 		var_hash = emalloc(sizeof(var_entries));
 		var_hash->used_slots = 0;
 		var_hash->next = 0;

-		if (!(*var_hashx)->first_dtor)
+		if (!(*var_hashx)->first_dtor) {
 			(*var_hashx)->first_dtor = var_hash;
-		else
-			prev->next = var_hash;
+		} else {
+			((var_entries *) (*var_hashx)->last_dtor)->next = var_hash;
+		}
+
+		(*var_hashx)->last_dtor = var_hash;
 	}

 	Z_ADDREF_PP(rval);
@@ -205,7 +201,7 @@
 #define YYMARKER marker


-#line 213 "ext/standard/var_unserializer.re"
+#line 209 "ext/standard/var_unserializer.re"



@@ -411,43 +407,9 @@



-#line 415 "ext/standard/var_unserializer.c"
+#line 411 "ext/standard/var_unserializer.c"
 {
 	YYCTYPE yych;
-	static const 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,
-	};

 	if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7);
 	yych = *YYCURSOR;
@@ -469,90 +431,147 @@
 	}
 yy2:
 	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych == ':') goto yy95;
+	switch (yych) {
+	case ':':	goto yy95;
+	default:	goto yy3;
+	}
 yy3:
-#line 737 "ext/standard/var_unserializer.re"
+#line 733 "ext/standard/var_unserializer.re"
 	{ return 0; }
-#line 477 "ext/standard/var_unserializer.c"
+#line 442 "ext/standard/var_unserializer.c"
 yy4:
 	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych == ':') goto yy89;
-	goto yy3;
+	switch (yych) {
+	case ':':	goto yy89;
+	default:	goto yy3;
+	}
 yy5:
 	yych = *++YYCURSOR;
-	if (yych == ';') goto yy87;
-	goto yy3;
+	switch (yych) {
+	case ';':	goto yy87;
+	default:	goto yy3;
+	}
 yy6:
 	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych == ':') goto yy83;
-	goto yy3;
+	switch (yych) {
+	case ':':	goto yy83;
+	default:	goto yy3;
+	}
 yy7:
 	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych == ':') goto yy77;
-	goto yy3;
+	switch (yych) {
+	case ':':	goto yy77;
+	default:	goto yy3;
+	}
 yy8:
 	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych == ':') goto yy53;
-	goto yy3;
+	switch (yych) {
+	case ':':	goto yy53;
+	default:	goto yy3;
+	}
 yy9:
 	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych == ':') goto yy46;
-	goto yy3;
+	switch (yych) {
+	case ':':	goto yy46;
+	default:	goto yy3;
+	}
 yy10:
 	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych == ':') goto yy39;
-	goto yy3;
+	switch (yych) {
+	case ':':	goto yy39;
+	default:	goto yy3;
+	}
 yy11:
 	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych == ':') goto yy32;
-	goto yy3;
+	switch (yych) {
+	case ':':	goto yy32;
+	default:	goto yy3;
+	}
 yy12:
 	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych == ':') goto yy25;
-	goto yy3;
+	switch (yych) {
+	case ':':	goto yy25;
+	default:	goto yy3;
+	}
 yy13:
 	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych == ':') goto yy17;
-	goto yy3;
+	switch (yych) {
+	case ':':	goto yy17;
+	default:	goto yy3;
+	}
 yy14:
 	++YYCURSOR;
-#line 731 "ext/standard/var_unserializer.re"
+#line 727 "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 526 "ext/standard/var_unserializer.c"
+#line 511 "ext/standard/var_unserializer.c"
 yy16:
 	yych = *++YYCURSOR;
 	goto yy3;
 yy17:
 	yych = *++YYCURSOR;
-	if (yybm[0+yych] & 128) {
-		goto yy20;
+	switch (yych) {
+	case '+':	goto yy19;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy20;
+	default:	goto yy18;
 	}
-	if (yych == '+') goto yy19;
 yy18:
 	YYCURSOR = YYMARKER;
 	goto yy3;
 yy19:
 	yych = *++YYCURSOR;
-	if (yybm[0+yych] & 128) {
-		goto yy20;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy20;
+	default:	goto yy18;
 	}
-	goto yy18;
 yy20:
 	++YYCURSOR;
 	if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
 	yych = *YYCURSOR;
-	if (yybm[0+yych] & 128) {
-		goto yy20;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy20;
+	case ':':	goto yy22;
+	default:	goto yy18;
 	}
-	if (yych != ':') goto yy18;
+yy22:
 	yych = *++YYCURSOR;
-	if (yych != '"') goto yy18;
+	switch (yych) {
+	case '"':	goto yy23;
+	default:	goto yy18;
+	}
+yy23:
 	++YYCURSOR;
-#line 614 "ext/standard/var_unserializer.re"
+#line 610 "ext/standard/var_unserializer.re"
 	{
 	size_t len, len2, len3, maxlen;
 	long elements;
@@ -669,32 +688,66 @@

 	return object_common2(UNSERIALIZE_PASSTHRU, elements);
 }
-#line 673 "ext/standard/var_unserializer.c"
+#line 692 "ext/standard/var_unserializer.c"
 yy25:
 	yych = *++YYCURSOR;
-	if (yych <= ',') {
-		if (yych != '+') goto yy18;
-	} else {
-		if (yych <= '-') goto yy26;
-		if (yych <= '/') goto yy18;
-		if (yych <= '9') goto yy27;
-		goto yy18;
+	switch (yych) {
+	case '+':
+	case '-':	goto yy26;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy27;
+	default:	goto yy18;
 	}
 yy26:
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych >= ':') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy27;
+	default:	goto yy18;
+	}
 yy27:
 	++YYCURSOR;
 	if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
 	yych = *YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych <= '9') goto yy27;
-	if (yych >= ';') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy27;
+	case ':':	goto yy29;
+	default:	goto yy18;
+	}
+yy29:
 	yych = *++YYCURSOR;
-	if (yych != '"') goto yy18;
+	switch (yych) {
+	case '"':	goto yy30;
+	default:	goto yy18;
+	}
+yy30:
 	++YYCURSOR;
-#line 606 "ext/standard/var_unserializer.re"
+#line 602 "ext/standard/var_unserializer.re"
 	{

 	INIT_PZVAL(*rval);
@@ -702,28 +755,65 @@
 	return object_common2(UNSERIALIZE_PASSTHRU,
 			object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR));
 }
-#line 706 "ext/standard/var_unserializer.c"
+#line 759 "ext/standard/var_unserializer.c"
 yy32:
 	yych = *++YYCURSOR;
-	if (yych == '+') goto yy33;
-	if (yych <= '/') goto yy18;
-	if (yych <= '9') goto yy34;
-	goto yy18;
+	switch (yych) {
+	case '+':	goto yy33;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy34;
+	default:	goto yy18;
+	}
 yy33:
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych >= ':') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy34;
+	default:	goto yy18;
+	}
 yy34:
 	++YYCURSOR;
 	if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
 	yych = *YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych <= '9') goto yy34;
-	if (yych >= ';') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy34;
+	case ':':	goto yy36;
+	default:	goto yy18;
+	}
+yy36:
 	yych = *++YYCURSOR;
-	if (yych != '{') goto yy18;
+	switch (yych) {
+	case '{':	goto yy37;
+	default:	goto yy18;
+	}
+yy37:
 	++YYCURSOR;
-#line 586 "ext/standard/var_unserializer.re"
+#line 582 "ext/standard/var_unserializer.re"
 	{
 	long elements = parse_iv(start + 2);
 	/* use iv() not uiv() in order to check data range */
@@ -743,28 +833,65 @@

 	return finish_nested_data(UNSERIALIZE_PASSTHRU);
 }
-#line 747 "ext/standard/var_unserializer.c"
+#line 837 "ext/standard/var_unserializer.c"
 yy39:
 	yych = *++YYCURSOR;
-	if (yych == '+') goto yy40;
-	if (yych <= '/') goto yy18;
-	if (yych <= '9') goto yy41;
-	goto yy18;
+	switch (yych) {
+	case '+':	goto yy40;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy41;
+	default:	goto yy18;
+	}
 yy40:
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych >= ':') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy41;
+	default:	goto yy18;
+	}
 yy41:
 	++YYCURSOR;
 	if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
 	yych = *YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych <= '9') goto yy41;
-	if (yych >= ';') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy41;
+	case ':':	goto yy43;
+	default:	goto yy18;
+	}
+yy43:
 	yych = *++YYCURSOR;
-	if (yych != '"') goto yy18;
+	switch (yych) {
+	case '"':	goto yy44;
+	default:	goto yy18;
+	}
+yy44:
 	++YYCURSOR;
-#line 557 "ext/standard/var_unserializer.re"
+#line 553 "ext/standard/var_unserializer.re"
 	{
 	size_t len, maxlen;
 	char *str;
@@ -793,28 +920,65 @@
 	ZVAL_STRINGL(*rval, str, len, 0);
 	return 1;
 }
-#line 797 "ext/standard/var_unserializer.c"
+#line 924 "ext/standard/var_unserializer.c"
 yy46:
 	yych = *++YYCURSOR;
-	if (yych == '+') goto yy47;
-	if (yych <= '/') goto yy18;
-	if (yych <= '9') goto yy48;
-	goto yy18;
+	switch (yych) {
+	case '+':	goto yy47;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy48;
+	default:	goto yy18;
+	}
 yy47:
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych >= ':') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy48;
+	default:	goto yy18;
+	}
 yy48:
 	++YYCURSOR;
 	if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
 	yych = *YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych <= '9') goto yy48;
-	if (yych >= ';') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy48;
+	case ':':	goto yy50;
+	default:	goto yy18;
+	}
+yy50:
 	yych = *++YYCURSOR;
-	if (yych != '"') goto yy18;
+	switch (yych) {
+	case '"':	goto yy51;
+	default:	goto yy18;
+	}
+yy51:
 	++YYCURSOR;
-#line 529 "ext/standard/var_unserializer.re"
+#line 525 "ext/standard/var_unserializer.re"
 	{
 	size_t len, maxlen;
 	char *str;
@@ -842,95 +1006,131 @@
 	ZVAL_STRINGL(*rval, str, len, 1);
 	return 1;
 }
-#line 846 "ext/standard/var_unserializer.c"
+#line 1010 "ext/standard/var_unserializer.c"
 yy53:
 	yych = *++YYCURSOR;
-	if (yych <= '/') {
-		if (yych <= ',') {
-			if (yych == '+') goto yy57;
-			goto yy18;
-		} else {
-			if (yych <= '-') goto yy55;
-			if (yych <= '.') goto yy60;
-			goto yy18;
-		}
-	} else {
-		if (yych <= 'I') {
-			if (yych <= '9') goto yy58;
-			if (yych <= 'H') goto yy18;
-			goto yy56;
-		} else {
-			if (yych != 'N') goto yy18;
-		}
+	switch (yych) {
+	case '+':	goto yy57;
+	case '-':	goto yy55;
+	case '.':	goto yy60;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy58;
+	case 'I':	goto yy56;
+	case 'N':	goto yy54;
+	default:	goto yy18;
 	}
+yy54:
 	yych = *++YYCURSOR;
-	if (yych == 'A') goto yy76;
-	goto yy18;
+	switch (yych) {
+	case 'A':	goto yy76;
+	default:	goto yy18;
+	}
 yy55:
 	yych = *++YYCURSOR;
-	if (yych <= '/') {
-		if (yych == '.') goto yy60;
-		goto yy18;
-	} else {
-		if (yych <= '9') goto yy58;
-		if (yych != 'I') goto yy18;
+	switch (yych) {
+	case '.':	goto yy60;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy58;
+	case 'I':	goto yy56;
+	default:	goto yy18;
 	}
 yy56:
 	yych = *++YYCURSOR;
-	if (yych == 'N') goto yy72;
-	goto yy18;
+	switch (yych) {
+	case 'N':	goto yy72;
+	default:	goto yy18;
+	}
 yy57:
 	yych = *++YYCURSOR;
-	if (yych == '.') goto yy60;
-	if (yych <= '/') goto yy18;
-	if (yych >= ':') goto yy18;
+	switch (yych) {
+	case '.':	goto yy60;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy58;
+	default:	goto yy18;
+	}
 yy58:
 	++YYCURSOR;
 	if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
 	yych = *YYCURSOR;
-	if (yych <= ':') {
-		if (yych <= '.') {
-			if (yych <= '-') goto yy18;
-			goto yy70;
-		} else {
-			if (yych <= '/') goto yy18;
-			if (yych <= '9') goto yy58;
-			goto yy18;
-		}
-	} else {
-		if (yych <= 'E') {
-			if (yych <= ';') goto yy63;
-			if (yych <= 'D') goto yy18;
-			goto yy65;
-		} else {
-			if (yych == 'e') goto yy65;
-			goto yy18;
-		}
+	switch (yych) {
+	case '.':	goto yy70;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy58;
+	case ';':	goto yy63;
+	case 'E':
+	case 'e':	goto yy65;
+	default:	goto yy18;
 	}
 yy60:
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych >= ':') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy61;
+	default:	goto yy18;
+	}
 yy61:
 	++YYCURSOR;
 	if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
 	yych = *YYCURSOR;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy18;
-		if (yych <= '9') goto yy61;
-		if (yych <= ':') goto yy18;
-	} else {
-		if (yych <= 'E') {
-			if (yych <= 'D') goto yy18;
-			goto yy65;
-		} else {
-			if (yych == 'e') goto yy65;
-			goto yy18;
-		}
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy61;
+	case ';':	goto yy63;
+	case 'E':
+	case 'e':	goto yy65;
+	default:	goto yy18;
 	}
 yy63:
 	++YYCURSOR;
-#line 519 "ext/standard/var_unserializer.re"
+#line 515 "ext/standard/var_unserializer.re"
 	{
 #if SIZEOF_LONG == 4
 use_double:
@@ -940,66 +1140,109 @@
 	ZVAL_DOUBLE(*rval, zend_strtod((const char *)start + 2, NULL));
 	return 1;
 }
-#line 944 "ext/standard/var_unserializer.c"
+#line 1144 "ext/standard/var_unserializer.c"
 yy65:
 	yych = *++YYCURSOR;
-	if (yych <= ',') {
-		if (yych != '+') goto yy18;
-	} else {
-		if (yych <= '-') goto yy66;
-		if (yych <= '/') goto yy18;
-		if (yych <= '9') goto yy67;
-		goto yy18;
+	switch (yych) {
+	case '+':
+	case '-':	goto yy66;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy67;
+	default:	goto yy18;
 	}
 yy66:
 	yych = *++YYCURSOR;
-	if (yych <= ',') {
-		if (yych == '+') goto yy69;
-		goto yy18;
-	} else {
-		if (yych <= '-') goto yy69;
-		if (yych <= '/') goto yy18;
-		if (yych >= ':') goto yy18;
+	switch (yych) {
+	case '+':
+	case '-':	goto yy69;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy67;
+	default:	goto yy18;
 	}
 yy67:
 	++YYCURSOR;
 	if (YYLIMIT <= YYCURSOR) YYFILL(1);
 	yych = *YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych <= '9') goto yy67;
-	if (yych == ';') goto yy63;
-	goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy67;
+	case ';':	goto yy63;
+	default:	goto yy18;
+	}
 yy69:
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych <= '9') goto yy67;
-	goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy67;
+	default:	goto yy18;
+	}
 yy70:
 	++YYCURSOR;
 	if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
 	yych = *YYCURSOR;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy18;
-		if (yych <= '9') goto yy70;
-		if (yych <= ':') goto yy18;
-		goto yy63;
-	} else {
-		if (yych <= 'E') {
-			if (yych <= 'D') goto yy18;
-			goto yy65;
-		} else {
-			if (yych == 'e') goto yy65;
-			goto yy18;
-		}
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy70;
+	case ';':	goto yy63;
+	case 'E':
+	case 'e':	goto yy65;
+	default:	goto yy18;
 	}
 yy72:
 	yych = *++YYCURSOR;
-	if (yych != 'F') goto yy18;
+	switch (yych) {
+	case 'F':	goto yy73;
+	default:	goto yy18;
+	}
 yy73:
 	yych = *++YYCURSOR;
-	if (yych != ';') goto yy18;
+	switch (yych) {
+	case ';':	goto yy74;
+	default:	goto yy18;
+	}
+yy74:
 	++YYCURSOR;
-#line 504 "ext/standard/var_unserializer.re"
+#line 500 "ext/standard/var_unserializer.re"
 	{
 	*p = YYCURSOR;
 	INIT_PZVAL(*rval);
@@ -1014,34 +1257,66 @@

 	return 1;
 }
-#line 1018 "ext/standard/var_unserializer.c"
+#line 1261 "ext/standard/var_unserializer.c"
 yy76:
 	yych = *++YYCURSOR;
-	if (yych == 'N') goto yy73;
-	goto yy18;
+	switch (yych) {
+	case 'N':	goto yy73;
+	default:	goto yy18;
+	}
 yy77:
 	yych = *++YYCURSOR;
-	if (yych <= ',') {
-		if (yych != '+') goto yy18;
-	} else {
-		if (yych <= '-') goto yy78;
-		if (yych <= '/') goto yy18;
-		if (yych <= '9') goto yy79;
-		goto yy18;
+	switch (yych) {
+	case '+':
+	case '-':	goto yy78;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy79;
+	default:	goto yy18;
 	}
 yy78:
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych >= ':') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy79;
+	default:	goto yy18;
+	}
 yy79:
 	++YYCURSOR;
 	if (YYLIMIT <= YYCURSOR) YYFILL(1);
 	yych = *YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych <= '9') goto yy79;
-	if (yych != ';') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy79;
+	case ';':	goto yy81;
+	default:	goto yy18;
+	}
+yy81:
 	++YYCURSOR;
-#line 477 "ext/standard/var_unserializer.re"
+#line 473 "ext/standard/var_unserializer.re"
 	{
 #if SIZEOF_LONG == 4
 	int digits = YYCURSOR - start - 3;
@@ -1068,55 +1343,93 @@
 	ZVAL_LONG(*rval, parse_iv(start + 2));
 	return 1;
 }
-#line 1072 "ext/standard/var_unserializer.c"
+#line 1347 "ext/standard/var_unserializer.c"
 yy83:
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych >= '2') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':	goto yy84;
+	default:	goto yy18;
+	}
+yy84:
 	yych = *++YYCURSOR;
-	if (yych != ';') goto yy18;
+	switch (yych) {
+	case ';':	goto yy85;
+	default:	goto yy18;
+	}
+yy85:
 	++YYCURSOR;
-#line 470 "ext/standard/var_unserializer.re"
+#line 466 "ext/standard/var_unserializer.re"
 	{
 	*p = YYCURSOR;
 	INIT_PZVAL(*rval);
 	ZVAL_BOOL(*rval, parse_iv(start + 2));
 	return 1;
 }
-#line 1087 "ext/standard/var_unserializer.c"
+#line 1370 "ext/standard/var_unserializer.c"
 yy87:
 	++YYCURSOR;
-#line 463 "ext/standard/var_unserializer.re"
+#line 459 "ext/standard/var_unserializer.re"
 	{
 	*p = YYCURSOR;
 	INIT_PZVAL(*rval);
 	ZVAL_NULL(*rval);
 	return 1;
 }
-#line 1097 "ext/standard/var_unserializer.c"
+#line 1380 "ext/standard/var_unserializer.c"
 yy89:
 	yych = *++YYCURSOR;
-	if (yych <= ',') {
-		if (yych != '+') goto yy18;
-	} else {
-		if (yych <= '-') goto yy90;
-		if (yych <= '/') goto yy18;
-		if (yych <= '9') goto yy91;
-		goto yy18;
+	switch (yych) {
+	case '+':
+	case '-':	goto yy90;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy91;
+	default:	goto yy18;
 	}
 yy90:
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych >= ':') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy91;
+	default:	goto yy18;
+	}
 yy91:
 	++YYCURSOR;
 	if (YYLIMIT <= YYCURSOR) YYFILL(1);
 	yych = *YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych <= '9') goto yy91;
-	if (yych != ';') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy91;
+	case ';':	goto yy93;
+	default:	goto yy18;
+	}
+yy93:
 	++YYCURSOR;
-#line 440 "ext/standard/var_unserializer.re"
+#line 436 "ext/standard/var_unserializer.re"
 	{
 	long id;

@@ -1139,30 +1452,60 @@

 	return 1;
 }
-#line 1143 "ext/standard/var_unserializer.c"
+#line 1456 "ext/standard/var_unserializer.c"
 yy95:
 	yych = *++YYCURSOR;
-	if (yych <= ',') {
-		if (yych != '+') goto yy18;
-	} else {
-		if (yych <= '-') goto yy96;
-		if (yych <= '/') goto yy18;
-		if (yych <= '9') goto yy97;
-		goto yy18;
+	switch (yych) {
+	case '+':
+	case '-':	goto yy96;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy97;
+	default:	goto yy18;
 	}
 yy96:
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych >= ':') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy97;
+	default:	goto yy18;
+	}
 yy97:
 	++YYCURSOR;
 	if (YYLIMIT <= YYCURSOR) YYFILL(1);
 	yych = *YYCURSOR;
-	if (yych <= '/') goto yy18;
-	if (yych <= '9') goto yy97;
-	if (yych != ';') goto yy18;
+	switch (yych) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy97;
+	case ';':	goto yy99;
+	default:	goto yy18;
+	}
+yy99:
 	++YYCURSOR;
-#line 419 "ext/standard/var_unserializer.re"
+#line 415 "ext/standard/var_unserializer.re"
 	{
 	long id;

@@ -1183,9 +1526,9 @@

 	return 1;
 }
-#line 1187 "ext/standard/var_unserializer.c"
+#line 1530 "ext/standard/var_unserializer.c"
 }
-#line 739 "ext/standard/var_unserializer.re"
+#line 735 "ext/standard/var_unserializer.re"


 	return 0;

Modified: php/php-src/trunk/ext/standard/var_unserializer.re
===================================================================
--- php/php-src/trunk/ext/standard/var_unserializer.re	2010-09-18 16:05:00 UTC (rev 303502)
+++ php/php-src/trunk/ext/standard/var_unserializer.re	2010-09-18 16:09:28 UTC (rev 303503)
@@ -33,25 +33,23 @@

 static inline void var_push(php_unserialize_data_t *var_hashx, zval **rval)
 {
-	var_entries *var_hash = (*var_hashx)->first, *prev = NULL;
+	var_entries *var_hash = (*var_hashx)->last;
 #if 0
 	fprintf(stderr, "var_push(%ld): %d\n", var_hash?var_hash->used_slots:-1L, Z_TYPE_PP(rval));
 #endif
-
-	while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) {
-		prev = var_hash;
-		var_hash = var_hash->next;
-	}

-	if (!var_hash) {
+	if (!var_hash || var_hash->used_slots == VAR_ENTRIES_MAX) {
 		var_hash = emalloc(sizeof(var_entries));
 		var_hash->used_slots = 0;
 		var_hash->next = 0;

-		if (!(*var_hashx)->first)
+		if (!(*var_hashx)->first) {
 			(*var_hashx)->first = var_hash;
-		else
-			prev->next = var_hash;
+		} else {
+			((var_entries *) (*var_hashx)->last)->next = var_hash;
+		}
+
+		(*var_hashx)->last = var_hash;
 	}

 	var_hash->data[var_hash->used_slots++] = *rval;
@@ -59,25 +57,23 @@

 PHPAPI void var_push_dtor(php_unserialize_data_t *var_hashx, zval **rval)
 {
-	var_entries *var_hash = (*var_hashx)->first_dtor, *prev = NULL;
+	var_entries *var_hash = (*var_hashx)->last_dtor;
 #if 0
 	fprintf(stderr, "var_push_dtor(%ld): %d\n", var_hash?var_hash->used_slots:-1L, Z_TYPE_PP(rval));
 #endif
-
-	while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) {
-		prev = var_hash;
-		var_hash = var_hash->next;
-	}

-	if (!var_hash) {
+	if (!var_hash || var_hash->used_slots == VAR_ENTRIES_MAX) {
 		var_hash = emalloc(sizeof(var_entries));
 		var_hash->used_slots = 0;
 		var_hash->next = 0;

-		if (!(*var_hashx)->first_dtor)
+		if (!(*var_hashx)->first_dtor) {
 			(*var_hashx)->first_dtor = var_hash;
-		else
-			prev->next = var_hash;
+		} else {
+			((var_entries *) (*var_hashx)->last_dtor)->next = var_hash;
+		}
+
+		(*var_hashx)->last_dtor = var_hash;
 	}

 	Z_ADDREF_PP(rval);
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to