0
0
mirror of https://github.com/phpv8/v8js.git synced 2024-12-22 22:51:51 +00:00

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.
This commit is contained in:
Stefan Siegl 2014-10-18 18:48:38 +00:00
parent e3d859d9d7
commit 16af153c3e
2 changed files with 56 additions and 0 deletions

55
tests/ctx_lifetime.phpt Normal file
View File

@ -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

View File

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