소스 검색

Merge branch 'cscott/issue-64' (ctx_lifecycle test).

Test adapted to current behaviour of V8Js, that the situation is
properly handled, but not by keeping objects valid, but by
invalidating all of them.
Stefan Siegl 10 년 전
부모
커밋
16af153c3e
2개의 변경된 파일56개의 추가작업 그리고 0개의 파일을 삭제
  1. 55 0
      tests/ctx_lifetime.phpt
  2. 1 0
      v8js.cc

+ 55 - 0
tests/ctx_lifetime.phpt

@@ -0,0 +1,55 @@
+--TEST--
+Test V8::executeString() : Testing lifespan of V8Js context objects
+--SKIPIF--
+<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
+--FILE--
+<?php
+
+class Foo
+{
+	function hello() {
+		echo "Hello!\n";
+	}
+}
+
+class Testing
+{
+	function onectx()
+	{
+		$v8js = new V8Js();
+		$v8js->foo = new Foo;
+		return $v8js->executeString("({ bar: 23, hello: function() { PHP.foo.__call('hello',[]); } })");
+		// $v8js will be dereferenced here, but the result escapes.
+	}
+}
+
+$t = new Testing();
+
+$a = $t->onectx();
+/* $a is no longer valid, since the associated V8Js() object has been
+ * destroyed.  Instead the property access will throw. */
+var_dump($a);
+
+try {
+  var_dump($a->bar);
+}
+catch(Exception $e) {
+  var_dump($e->getMessage());
+}
+
+$a->hello();
+
+?>
+===EOF===
+--EXPECTF--
+object(V8Object)#%d (0) {
+}
+string(55) "Can't access V8Object after V8Js instance is destroyed!"
+
+Warning: Uncaught exception 'V8JsScriptException' with message 'Can't access V8Object after V8Js instance is destroyed!' in %s/tests/ctx_lifetime.php:35
+Stack trace:
+#0 %s/tests/ctx_lifetime.php(35): unknown()
+#1 {main}
+  thrown in %s/tests/ctx_lifetime.php on line 35
+
+Fatal error: Call to undefined method V8Object::hello() in %s/tests/ctx_lifetime.php on line 35

+ 1 - 0
v8js.cc

@@ -205,6 +205,7 @@ static zval *php_v8js_v8_read_property(zval *object, zval *member, int type ZEND
 	if (!obj->ctx) {
 		zend_throw_exception(php_ce_v8js_script_exception,
 			"Can't access V8Object after V8Js instance is destroyed!", 0 TSRMLS_CC);
+		ALLOC_INIT_ZVAL(retval);
 		return retval;
 	}