mirror of
https://github.com/phpv8/v8js.git
synced 2024-12-22 15:11:53 +00:00
Throw exception if __construct is not public
This commit is contained in:
parent
49be9aafa1
commit
5987d5d3da
96
tests/js-construct-protected-ctor.phpt
Normal file
96
tests/js-construct-protected-ctor.phpt
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
--TEST--
|
||||||
|
Test V8::executeString() : Test PHP object construction controlled by JavaScript (protected ctor)
|
||||||
|
--SKIPIF--
|
||||||
|
<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$v8 = new V8Js();
|
||||||
|
|
||||||
|
class Greeter {
|
||||||
|
protected $_name = null;
|
||||||
|
|
||||||
|
protected function __construct($name) {
|
||||||
|
echo "ctor called (php)\n";
|
||||||
|
$this->_name = $name;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function getInstance($name) {
|
||||||
|
return new Greeter($name);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sayHello() {
|
||||||
|
echo "Hello ".$this->_name."\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$v8->greeter = Greeter::getInstance("John");
|
||||||
|
|
||||||
|
try {
|
||||||
|
$v8->executeString('
|
||||||
|
PHP.greeter.sayHello();
|
||||||
|
|
||||||
|
var ngGreeter = new PHP.greeter.constructor("Ringo");
|
||||||
|
ngGreeter.sayHello();
|
||||||
|
', 'ctor-test');
|
||||||
|
} catch(V8JsScriptException $e) {
|
||||||
|
echo "caught js exception\n";
|
||||||
|
var_dump($e);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
===EOF===
|
||||||
|
--EXPECTF--
|
||||||
|
ctor called (php)
|
||||||
|
Hello John
|
||||||
|
caught js exception
|
||||||
|
object(V8JsScriptException)#3 (11) {
|
||||||
|
["message":protected]=>
|
||||||
|
string(56) "ctor-test:4: Call to protected __construct() not allowed"
|
||||||
|
["string":"Exception":private]=>
|
||||||
|
string(0) ""
|
||||||
|
["code":protected]=>
|
||||||
|
int(0)
|
||||||
|
["file":protected]=>
|
||||||
|
string(%d) "%s"
|
||||||
|
["line":protected]=>
|
||||||
|
int(29)
|
||||||
|
["trace":"Exception":private]=>
|
||||||
|
array(1) {
|
||||||
|
[0]=>
|
||||||
|
array(6) {
|
||||||
|
["file"]=>
|
||||||
|
string(%d) "%s"
|
||||||
|
["line"]=>
|
||||||
|
int(29)
|
||||||
|
["function"]=>
|
||||||
|
string(13) "executeString"
|
||||||
|
["class"]=>
|
||||||
|
string(4) "V8Js"
|
||||||
|
["type"]=>
|
||||||
|
string(2) "->"
|
||||||
|
["args"]=>
|
||||||
|
array(2) {
|
||||||
|
[0]=>
|
||||||
|
string(109) "
|
||||||
|
PHP.greeter.sayHello();
|
||||||
|
|
||||||
|
var ngGreeter = new PHP.greeter.constructor("Ringo");
|
||||||
|
ngGreeter.sayHello();
|
||||||
|
"
|
||||||
|
[1]=>
|
||||||
|
string(9) "ctor-test"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
["previous":"Exception":private]=>
|
||||||
|
NULL
|
||||||
|
["JsFileName":protected]=>
|
||||||
|
string(9) "ctor-test"
|
||||||
|
["JsLineNumber":protected]=>
|
||||||
|
int(4)
|
||||||
|
["JsSourceLine":protected]=>
|
||||||
|
string(55) " var ngGreeter = new PHP.greeter.constructor("Ringo");"
|
||||||
|
["JsTrace":protected]=>
|
||||||
|
NULL
|
||||||
|
}
|
||||||
|
===EOF===
|
||||||
|
|
@ -172,14 +172,20 @@ static void php_v8js_construct_callback(const v8::FunctionCallbackInfo<v8::Value
|
|||||||
} else {
|
} else {
|
||||||
// Object created from JavaScript context. Need to create PHP object first.
|
// Object created from JavaScript context. Need to create PHP object first.
|
||||||
zend_class_entry *ce = static_cast<zend_class_entry *>(v8::External::Cast(*info.Data())->Value());
|
zend_class_entry *ce = static_cast<zend_class_entry *>(v8::External::Cast(*info.Data())->Value());
|
||||||
|
zend_function *ctor_ptr = ce->constructor;
|
||||||
|
|
||||||
|
// Check access on __construct function, if any
|
||||||
|
if (ctor_ptr != NULL && (ctor_ptr->common.fn_flags & ZEND_ACC_PUBLIC) == 0) {
|
||||||
|
info.GetReturnValue().Set(v8::ThrowException(v8::String::New("Call to protected __construct() not allowed")));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
MAKE_STD_ZVAL(value);
|
MAKE_STD_ZVAL(value);
|
||||||
object_init_ex(value, ce TSRMLS_CC);
|
object_init_ex(value, ce TSRMLS_CC);
|
||||||
|
|
||||||
// Call __construct function
|
// Call __construct function
|
||||||
if(ce->constructor != NULL) {
|
if (ctor_ptr != NULL) {
|
||||||
zend_function *method_ptr = ce->constructor;
|
php_v8js_call_php_func(value, ce, ctor_ptr, isolate, info);
|
||||||
php_v8js_call_php_func(value, ce, method_ptr, isolate, info);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user