Browse Source

Merge pull request #255 from TysonAndre/use-non-zend_string-v2

Use an non-interned zend_string for registerExtension on ZTS
Stefan Siegl 8 years ago
parent
commit
8625f70e2e
2 changed files with 10 additions and 3 deletions
  1. 5 1
      .travis.yml
  2. 5 2
      v8js_class.cc

+ 5 - 1
.travis.yml

@@ -8,7 +8,11 @@ php:
 env:
   - V8VER=5.2
   - V8VER=5.1
+  - V8VER=5.2 VALGRIND=1
 
 before_install: make -f Makefile.travis before_install
-install: make -f Makefile.travis install
+install:
+  - if [ "$VALGRIND" = 1 ]; then sudo apt-get install -qq valgrind; export TEST_PHP_ARGS="-m"; fi
+  - make -f Makefile.travis install
+
 script: make -f Makefile.travis test

+ 5 - 2
v8js_class.cc

@@ -270,6 +270,7 @@ static void v8js_jsext_free_storage(v8js_jsext *jsext) /* {{{ */
 		v8js_free_ext_strarr(jsext->deps, jsext->deps_count);
 	}
 	delete jsext->extension;
+	// Free the persisted non-interned strings we allocated.
 	zend_string_release(jsext->name);
 	zend_string_release(jsext->source);
 
@@ -955,8 +956,10 @@ static int v8js_register_extension(zend_string *name, zend_string *source, zval
 	}
 
 	jsext->auto_enable = auto_enable;
-	jsext->name = zend_string_dup(name, 1);
-	jsext->source = zend_string_dup(source, 1);
+	// Allocate a persistent string which will survive until module shutdown on both ZTS(Persistent) and NTS(Not interned, those would be cleaned up)
+	// (zend_string_dup would return the original interned string, if interned, so we don't use that)
+	jsext->name = zend_string_init(ZSTR_VAL(name), ZSTR_LEN(name), 1);
+	jsext->source = zend_string_init(ZSTR_VAL(source), ZSTR_LEN(source), 1);
 
 	if (jsext->deps) {
 		jsext->deps_ht = (HashTable *) malloc(sizeof(HashTable));