mirror of
https://github.com/phpv8/v8js.git
synced 2024-12-22 10:31:53 +00:00
Handle non-construct call
This commit is contained in:
parent
5987d5d3da
commit
286b0d8ac0
@ -49,6 +49,7 @@ extern "C" {
|
|||||||
#define V8JS_FLOAT(v) v8::Number::New(v)
|
#define V8JS_FLOAT(v) v8::Number::New(v)
|
||||||
#define V8JS_BOOL(v) v8::Boolean::New(v)
|
#define V8JS_BOOL(v) v8::Boolean::New(v)
|
||||||
#define V8JS_NULL v8::Null()
|
#define V8JS_NULL v8::Null()
|
||||||
|
#define V8JS_UNDEFINED v8::Undefined()
|
||||||
#define V8JS_MN(name) v8js_method_##name
|
#define V8JS_MN(name) v8js_method_##name
|
||||||
#define V8JS_METHOD(name) void V8JS_MN(name)(const v8::FunctionCallbackInfo<v8::Value>& info)
|
#define V8JS_METHOD(name) void V8JS_MN(name)(const v8::FunctionCallbackInfo<v8::Value>& info)
|
||||||
#define V8JS_THROW(type, message, message_len) v8::ThrowException(v8::Exception::type(V8JS_STRL(message, message_len)))
|
#define V8JS_THROW(type, message, message_len) v8::ThrowException(v8::Exception::type(V8JS_STRL(message, message_len)))
|
||||||
|
40
tests/js-construct-direct-call.phpt
Normal file
40
tests/js-construct-direct-call.phpt
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
--TEST--
|
||||||
|
Test V8::executeString() : Test PHP object construction controlled by JavaScript (non-construction call)
|
||||||
|
--SKIPIF--
|
||||||
|
<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$v8 = new V8Js();
|
||||||
|
|
||||||
|
class Greeter {
|
||||||
|
function sayHello($a) {
|
||||||
|
echo "Hello $a\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$v8->greeter = new Greeter();
|
||||||
|
$v8->executeString('
|
||||||
|
function JsGreeter() { };
|
||||||
|
JsGreeter.prototype.sayHello = function(a) {
|
||||||
|
print("Hello " + a + "\n");
|
||||||
|
};
|
||||||
|
|
||||||
|
jsGreeter = new JsGreeter();
|
||||||
|
jsGreeter.sayHello("Paul");
|
||||||
|
print(jsGreeter.constructor());
|
||||||
|
print("\n");
|
||||||
|
|
||||||
|
// ----- now the same using v8Js -----
|
||||||
|
|
||||||
|
PHP.greeter.sayHello("John");
|
||||||
|
print(PHP.greeter.constructor());
|
||||||
|
print("\n");
|
||||||
|
');
|
||||||
|
?>
|
||||||
|
===EOF===
|
||||||
|
--EXPECT--
|
||||||
|
Hello Paul
|
||||||
|
undefined
|
||||||
|
Hello John
|
||||||
|
undefined
|
||||||
|
===EOF===
|
@ -159,13 +159,17 @@ static void php_v8js_php_callback(const v8::FunctionCallbackInfo<v8::Value>& inf
|
|||||||
static void php_v8js_construct_callback(const v8::FunctionCallbackInfo<v8::Value>& info) /* {{{ */
|
static void php_v8js_construct_callback(const v8::FunctionCallbackInfo<v8::Value>& info) /* {{{ */
|
||||||
{
|
{
|
||||||
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||||||
info.GetReturnValue().Set(V8JS_NULL);
|
info.GetReturnValue().Set(V8JS_UNDEFINED);
|
||||||
|
|
||||||
// @todo assert constructor call
|
// @todo assert constructor call
|
||||||
v8::Handle<v8::Object> newobj = info.This();
|
v8::Handle<v8::Object> newobj = info.This();
|
||||||
zval *value;
|
zval *value;
|
||||||
TSRMLS_FETCH();
|
TSRMLS_FETCH();
|
||||||
|
|
||||||
|
if (!info.IsConstructCall()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (info[0]->IsExternal()) {
|
if (info[0]->IsExternal()) {
|
||||||
// Object created by v8js in php_v8js_hash_to_jsobj, PHP object passed as v8::External.
|
// Object created by v8js in php_v8js_hash_to_jsobj, PHP object passed as v8::External.
|
||||||
value = static_cast<zval *>(v8::External::Cast(*info[0])->Value());
|
value = static_cast<zval *>(v8::External::Cast(*info[0])->Value());
|
||||||
|
Loading…
Reference in New Issue
Block a user