浏览代码

Add GC_(UN)PROTECT_RECURSION, move (un)protecting outside loops

Jan-E 6 年之前
父节点
当前提交
0c2b55d802
共有 3 个文件被更改,包括 44 次插入23 次删除
  1. 11 0
      php_v8js_macros.h
  2. 16 11
      v8js_convert.cc
  3. 17 12
      v8js_object_export.cc

+ 11 - 0
php_v8js_macros.h

@@ -166,6 +166,17 @@ extern struct _v8js_process_globals v8js_process_globals;
 /* Register builtin methods into passed object */
 /* Register builtin methods into passed object */
 void v8js_register_methods(v8::Local<v8::ObjectTemplate>, v8js_ctx *c);
 void v8js_register_methods(v8::Local<v8::ObjectTemplate>, v8js_ctx *c);
 
 
+#ifdef ZEND_HASH_INC_APPLY_COUNT
+#ifndef GC_PROTECT_RECURSION
+#	define GC_PROTECT_RECURSION(ht) ZEND_HASH_INC_APPLY_COUNT(ht)
+#endif
+#endif
+#ifdef ZEND_HASH_DEC_APPLY_COUNT
+#ifndef GC_UNPROTECT_RECURSION
+#	define GC_UNPROTECT_RECURSION(ht) ZEND_HASH_DEC_APPLY_COUNT(ht)
+#endif
+#endif
+
 #endif	/* PHP_V8JS_MACROS_H */
 #endif	/* PHP_V8JS_MACROS_H */
 
 
 /*
 /*

+ 16 - 11
v8js_convert.cc

@@ -84,21 +84,26 @@ static v8::Local<v8::Value> v8js_hash_to_jsarr(zval *value, v8::Isolate *isolate
 	{
 	{
 		zval *data;
 		zval *data;
 		ulong index = 0;
 		ulong index = 0;
-		HashTable *tmp_ht;
 
 
-		ZEND_HASH_FOREACH_VAL(myht, data) {
-			tmp_ht = HASH_OF(data);
-
-			if (tmp_ht) {
-				ZEND_HASH_INC_APPLY_COUNT(myht);
-			}
+#if PHP_VERSION_ID >= 70300
+		if (myht && !(GC_FLAGS(myht) & GC_IMMUTABLE)) {
+#else
+		if (myht) {
+#endif
+			GC_PROTECT_RECURSION(myht);
+		}
 
 
+		ZEND_HASH_FOREACH_VAL(myht, data) {
 			newarr->Set(index++, zval_to_v8js(data, isolate));
 			newarr->Set(index++, zval_to_v8js(data, isolate));
-
-			if (tmp_ht) {
-				ZEND_HASH_DEC_APPLY_COUNT(myht);
-			}
 		} ZEND_HASH_FOREACH_END();
 		} ZEND_HASH_FOREACH_END();
+
+#if PHP_VERSION_ID >= 70300
+		if (myht && !(GC_FLAGS(myht) & GC_IMMUTABLE)) {
+#else
+		if (myht) {
+#endif
+			GC_UNPROTECT_RECURSION(myht);
+		}
 	}
 	}
 	return newarr;
 	return newarr;
 }
 }

+ 17 - 12
v8js_object_export.cc

@@ -955,21 +955,20 @@ static v8::Local<v8::Object> v8js_wrap_array_to_object(v8::Isolate *isolate, zva
 	if (i > 0)
 	if (i > 0)
 	{
 	{
 		zval *data;
 		zval *data;
-		HashTable *tmp_ht;
 
 
-		ZEND_HASH_FOREACH_KEY_VAL(myht, index, key, data) {
-			tmp_ht = HASH_OF(data);
+#if PHP_VERSION_ID >= 70300
+		if (myht && !(GC_FLAGS(myht) & GC_IMMUTABLE)) {
+#else
+		if (myht) {
+#endif
+			GC_PROTECT_RECURSION(myht);
+		}
 
 
-			if (tmp_ht) {
-				ZEND_HASH_INC_APPLY_COUNT(tmp_ht);
-			}
+		ZEND_HASH_FOREACH_KEY_VAL(myht, index, key, data) {
 
 
 			if (key) {
 			if (key) {
 				if (ZSTR_VAL(key)[0] == '\0' && Z_TYPE_P(value) == IS_OBJECT) {
 				if (ZSTR_VAL(key)[0] == '\0' && Z_TYPE_P(value) == IS_OBJECT) {
 					/* Skip protected and private members. */
 					/* Skip protected and private members. */
-					if (tmp_ht) {
-						ZEND_HASH_DEC_APPLY_COUNT(tmp_ht);
-					}
 					continue;
 					continue;
 				}
 				}
 
 
@@ -991,10 +990,16 @@ static v8::Local<v8::Object> v8js_wrap_array_to_object(v8::Isolate *isolate, zva
 				newobj->Set(static_cast<uint32_t>(index), zval_to_v8js(data, isolate));
 				newobj->Set(static_cast<uint32_t>(index), zval_to_v8js(data, isolate));
 			}
 			}
 
 
-			if (tmp_ht) {
-				ZEND_HASH_DEC_APPLY_COUNT(tmp_ht);
-			}
 		} ZEND_HASH_FOREACH_END();
 		} ZEND_HASH_FOREACH_END();
+
+#if PHP_VERSION_ID >= 70300
+		if (myht && !(GC_FLAGS(myht) & GC_IMMUTABLE)) {
+#else
+		if (myht) {
+#endif
+			GC_UNPROTECT_RECURSION(myht);
+		}
+
 	}
 	}
 
 
 	return newobj;
 	return newobj;