mirror of
https://github.com/phpv8/v8js.git
synced 2024-11-09 16:28:41 +00:00
adapt PHPJS_OBJECT_KEY from zval* to zend_object*
This commit is contained in:
parent
5acc64610d
commit
2d0aa9b2cc
@ -224,8 +224,10 @@ int v8js_to_zval(v8::Handle<v8::Value> jsValue, zval *return_value, int flags, v
|
|||||||
// if this is a wrapped PHP object, then just unwrap it.
|
// if this is a wrapped PHP object, then just unwrap it.
|
||||||
v8::Local<v8::Value> php_object = self->GetHiddenValue(V8JS_SYM(PHPJS_OBJECT_KEY));
|
v8::Local<v8::Value> php_object = self->GetHiddenValue(V8JS_SYM(PHPJS_OBJECT_KEY));
|
||||||
if (!php_object.IsEmpty()) {
|
if (!php_object.IsEmpty()) {
|
||||||
zval *object = reinterpret_cast<zval *>(v8::External::Cast(*php_object)->Value());
|
zend_object *object = reinterpret_cast<zend_object *>(v8::External::Cast(*php_object)->Value());
|
||||||
RETVAL_ZVAL(object, 1, 0);
|
zval zval_object;
|
||||||
|
ZVAL_OBJ(&zval_object, object)
|
||||||
|
RETVAL_ZVAL(zval_object, 1, 0);
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
if ((flags & V8JS_FLAG_FORCE_ARRAY) || jsValue->IsArray()) {
|
if ((flags & V8JS_FLAG_FORCE_ARRAY) || jsValue->IsArray()) {
|
||||||
|
@ -31,7 +31,7 @@ extern "C" {
|
|||||||
static void v8js_weak_object_callback(const v8::WeakCallbackData<v8::Object, zval> &data);
|
static void v8js_weak_object_callback(const v8::WeakCallbackData<v8::Object, zval> &data);
|
||||||
|
|
||||||
/* Callback for PHP methods and functions */
|
/* Callback for PHP methods and functions */
|
||||||
static void v8js_call_php_func(zval *value, zend_class_entry *ce, zend_function *method_ptr, v8::Isolate *isolate, const v8::FunctionCallbackInfo<v8::Value>& info TSRMLS_DC) /* {{{ */
|
static void v8js_call_php_func(zend_object *object, zend_function *method_ptr, v8::Isolate *isolate, const v8::FunctionCallbackInfo<v8::Value>& info TSRMLS_DC) /* {{{ */
|
||||||
{
|
{
|
||||||
v8::Handle<v8::Value> return_value;
|
v8::Handle<v8::Value> return_value;
|
||||||
zend_fcall_info fci;
|
zend_fcall_info fci;
|
||||||
@ -52,10 +52,10 @@ static void v8js_call_php_func(zval *value, zend_class_entry *ce, zend_function
|
|||||||
|
|
||||||
/* zend_fcall_info */
|
/* zend_fcall_info */
|
||||||
fci.size = sizeof(fci);
|
fci.size = sizeof(fci);
|
||||||
fci.function_table = &ce->function_table;
|
fci.function_table = &object->ce->function_table;
|
||||||
fci.function_name = fname;
|
fci.function_name = fname;
|
||||||
fci.symbol_table = NULL;
|
fci.symbol_table = NULL;
|
||||||
fci.object_ptr = value;
|
fci.object = object;
|
||||||
fci.retval_ptr_ptr = &retval_ptr;
|
fci.retval_ptr_ptr = &retval_ptr;
|
||||||
fci.param_count = 0;
|
fci.param_count = 0;
|
||||||
|
|
||||||
@ -64,7 +64,7 @@ static void v8js_call_php_func(zval *value, zend_class_entry *ce, zend_function
|
|||||||
{
|
{
|
||||||
error_len = spprintf(&error, 0,
|
error_len = spprintf(&error, 0,
|
||||||
"%s::%s() expects %s %d parameter%s, %d given",
|
"%s::%s() expects %s %d parameter%s, %d given",
|
||||||
ce->name,
|
object->ce->name,
|
||||||
method_ptr->common.function_name,
|
method_ptr->common.function_name,
|
||||||
min_num_args == max_num_args ? "exactly" : argc < min_num_args ? "at least" : "at most",
|
min_num_args == max_num_args ? "exactly" : argc < min_num_args ? "at least" : "at most",
|
||||||
argc < min_num_args ? min_num_args : max_num_args,
|
argc < min_num_args ? min_num_args : max_num_args,
|
||||||
@ -72,7 +72,7 @@ static void v8js_call_php_func(zval *value, zend_class_entry *ce, zend_function
|
|||||||
argc);
|
argc);
|
||||||
|
|
||||||
return_value = V8JS_THROW(isolate, TypeError, error, error_len);
|
return_value = V8JS_THROW(isolate, TypeError, error, error_len);
|
||||||
if (ce == zend_ce_closure) {
|
if (object->ce == zend_ce_closure) {
|
||||||
efree(const_cast<char*>(method_ptr->internal_function.function_name));
|
efree(const_cast<char*>(method_ptr->internal_function.function_name));
|
||||||
efree(method_ptr);
|
efree(method_ptr);
|
||||||
}
|
}
|
||||||
@ -93,7 +93,8 @@ static void v8js_call_php_func(zval *value, zend_class_entry *ce, zend_function
|
|||||||
}
|
}
|
||||||
if (!php_object.IsEmpty()) {
|
if (!php_object.IsEmpty()) {
|
||||||
/* This is a PHP object, passed to JS and back. */
|
/* This is a PHP object, passed to JS and back. */
|
||||||
argv[i] = reinterpret_cast<zval *>(v8::External::Cast(*php_object)->Value());
|
zend_object *object = reinterpret_cast<zend_object *>(v8::External::Cast(*php_object)->Value());
|
||||||
|
argv[i] = NULL; // @fixme wrap object in zval and assign
|
||||||
Z_ADDREF_P(argv[i]);
|
Z_ADDREF_P(argv[i]);
|
||||||
} else {
|
} else {
|
||||||
MAKE_STD_ZVAL(argv[i]);
|
MAKE_STD_ZVAL(argv[i]);
|
||||||
@ -125,7 +126,7 @@ static void v8js_call_php_func(zval *value, zend_class_entry *ce, zend_function
|
|||||||
fcc.function_handler = method_ptr;
|
fcc.function_handler = method_ptr;
|
||||||
fcc.calling_scope = ce;
|
fcc.calling_scope = ce;
|
||||||
fcc.called_scope = ce;
|
fcc.called_scope = ce;
|
||||||
fcc.object_ptr = value;
|
fcc.object = object;
|
||||||
|
|
||||||
zend_call_function(&fci, &fcc TSRMLS_CC);
|
zend_call_function(&fci, &fcc TSRMLS_CC);
|
||||||
}
|
}
|
||||||
@ -166,9 +167,8 @@ static void v8js_php_callback(const v8::FunctionCallbackInfo<v8::Value>& info) /
|
|||||||
v8::Local<v8::Object> self = info.Holder();
|
v8::Local<v8::Object> self = info.Holder();
|
||||||
|
|
||||||
V8JS_TSRMLS_FETCH();
|
V8JS_TSRMLS_FETCH();
|
||||||
zval *value = reinterpret_cast<zval *>(v8::External::Cast(*self->GetHiddenValue(V8JS_SYM(PHPJS_OBJECT_KEY)))->Value());
|
zend_object *object = reinterpret_cast<zend_object *>(v8::External::Cast(*self->GetHiddenValue(V8JS_SYM(PHPJS_OBJECT_KEY)))->Value());
|
||||||
zend_function *method_ptr;
|
zend_function *method_ptr;
|
||||||
zend_class_entry *ce = Z_OBJCE_P(value);
|
|
||||||
|
|
||||||
/* Set method_ptr from v8::External or fetch the closure invoker */
|
/* Set method_ptr from v8::External or fetch the closure invoker */
|
||||||
if (!info.Data().IsEmpty() && info.Data()->IsExternal()) {
|
if (!info.Data().IsEmpty() && info.Data()->IsExternal()) {
|
||||||
@ -177,7 +177,7 @@ static void v8js_php_callback(const v8::FunctionCallbackInfo<v8::Value>& info) /
|
|||||||
method_ptr = zend_get_closure_invoke_method(value TSRMLS_CC);
|
method_ptr = zend_get_closure_invoke_method(value TSRMLS_CC);
|
||||||
}
|
}
|
||||||
|
|
||||||
return v8js_call_php_func(value, ce, method_ptr, isolate, info TSRMLS_CC);
|
return v8js_call_php_func(object, method_ptr, isolate, info TSRMLS_CC);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Callback for PHP constructor calls */
|
/* Callback for PHP constructor calls */
|
||||||
@ -204,7 +204,8 @@ static void v8js_construct_callback(const v8::FunctionCallbackInfo<v8::Value>& i
|
|||||||
if (info[0]->IsExternal()) {
|
if (info[0]->IsExternal()) {
|
||||||
// Object created by v8js in v8js_hash_to_jsobj, PHP object passed as v8::External.
|
// Object created by v8js in v8js_hash_to_jsobj, PHP object passed as v8::External.
|
||||||
php_object = v8::Local<v8::External>::Cast(info[0]);
|
php_object = v8::Local<v8::External>::Cast(info[0]);
|
||||||
value = reinterpret_cast<zval *>(php_object->Value());
|
zend_object *object = reinterpret_cast<zval *>(php_object->Value());
|
||||||
|
value = NULL; // @fixme wrap object in zval
|
||||||
|
|
||||||
if(ctx->weak_objects.count(value)) {
|
if(ctx->weak_objects.count(value)) {
|
||||||
// We already exported this object, hence no need to add another
|
// We already exported this object, hence no need to add another
|
||||||
@ -234,9 +235,9 @@ static void v8js_construct_callback(const v8::FunctionCallbackInfo<v8::Value>& i
|
|||||||
|
|
||||||
// Call __construct function
|
// Call __construct function
|
||||||
if (ctor_ptr != NULL) {
|
if (ctor_ptr != NULL) {
|
||||||
v8js_call_php_func(value, ce, ctor_ptr, isolate, info TSRMLS_CC);
|
v8js_call_php_func(value, ctor_ptr, isolate, info TSRMLS_CC);
|
||||||
}
|
}
|
||||||
php_object = v8::External::New(isolate, value);
|
php_object = v8::External::New(isolate, Z_OBJ(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
newobj->SetAlignedPointerInInternalField(0, ext_tmpl->Value());
|
newobj->SetAlignedPointerInInternalField(0, ext_tmpl->Value());
|
||||||
@ -312,8 +313,8 @@ static void v8js_named_property_enumerator(const v8::PropertyCallbackInfo<v8::Ar
|
|||||||
uint key_len;
|
uint key_len;
|
||||||
ulong index;
|
ulong index;
|
||||||
|
|
||||||
zval *object = reinterpret_cast<zval *>(v8::External::Cast(*self->GetHiddenValue(V8JS_SYM(PHPJS_OBJECT_KEY)))->Value());
|
zend_object *object = reinterpret_cast<zend_object *>(v8::External::Cast(*self->GetHiddenValue(V8JS_SYM(PHPJS_OBJECT_KEY)))->Value());
|
||||||
ce = Z_OBJCE_P(object);
|
ce = object->ce;
|
||||||
|
|
||||||
/* enumerate all methods */
|
/* enumerate all methods */
|
||||||
zend_hash_internal_pointer_reset_ex(&ce->function_table, &pos);
|
zend_hash_internal_pointer_reset_ex(&ce->function_table, &pos);
|
||||||
@ -354,7 +355,7 @@ static void v8js_named_property_enumerator(const v8::PropertyCallbackInfo<v8::Ar
|
|||||||
}
|
}
|
||||||
/* enumerate all properties */
|
/* enumerate all properties */
|
||||||
/* Z_OBJPROP uses the get_properties handler */
|
/* Z_OBJPROP uses the get_properties handler */
|
||||||
proptable = Z_OBJPROP_P(object);
|
proptable = Z_OBJPROP_P(object); // @fixme adapt from zval* to zend_object*
|
||||||
zend_hash_internal_pointer_reset_ex(proptable, &pos);
|
zend_hash_internal_pointer_reset_ex(proptable, &pos);
|
||||||
for (;; zend_hash_move_forward_ex(proptable, &pos)) {
|
for (;; zend_hash_move_forward_ex(proptable, &pos)) {
|
||||||
int i = zend_hash_get_current_key_ex(proptable, &key, &key_len, &index, 0, &pos);
|
int i = zend_hash_get_current_key_ex(proptable, &key, &key_len, &index, 0, &pos);
|
||||||
@ -442,8 +443,8 @@ static void v8js_fake_call_impl(const v8::FunctionCallbackInfo<v8::Value>& info)
|
|||||||
|
|
||||||
V8JS_TSRMLS_FETCH();
|
V8JS_TSRMLS_FETCH();
|
||||||
zend_class_entry *ce;
|
zend_class_entry *ce;
|
||||||
zval *object = reinterpret_cast<zval *>(v8::External::Cast(*self->GetHiddenValue(V8JS_SYM(PHPJS_OBJECT_KEY)))->Value());
|
zend_object *object = reinterpret_cast<zend_object *>(v8::External::Cast(*self->GetHiddenValue(V8JS_SYM(PHPJS_OBJECT_KEY)))->Value());
|
||||||
ce = Z_OBJCE_P(object);
|
ce = object->ce;
|
||||||
|
|
||||||
// first arg is method name, second arg is array of args.
|
// first arg is method name, second arg is array of args.
|
||||||
if (info.Length() < 2) {
|
if (info.Length() < 2) {
|
||||||
@ -533,11 +534,11 @@ inline v8::Local<v8::Value> v8js_named_property_callback(v8::Local<v8::String> p
|
|||||||
zend_function *method_ptr = NULL;
|
zend_function *method_ptr = NULL;
|
||||||
zval *php_value;
|
zval *php_value;
|
||||||
|
|
||||||
zval *object = reinterpret_cast<zval *>(v8::External::Cast(*self->GetHiddenValue(V8JS_SYM(PHPJS_OBJECT_KEY)))->Value());
|
zend_object *object = reinterpret_cast<zend_object *>(v8::External::Cast(*self->GetHiddenValue(V8JS_SYM(PHPJS_OBJECT_KEY)))->Value());
|
||||||
v8::Local<v8::FunctionTemplate> tmpl =
|
v8::Local<v8::FunctionTemplate> tmpl =
|
||||||
v8::Local<v8::FunctionTemplate>::New
|
v8::Local<v8::FunctionTemplate>::New
|
||||||
(isolate, *reinterpret_cast<v8js_tmpl_t *>(self->GetAlignedPointerFromInternalField(0)));
|
(isolate, *reinterpret_cast<v8js_tmpl_t *>(self->GetAlignedPointerFromInternalField(0)));
|
||||||
ce = scope = Z_OBJCE_P(object);
|
ce = scope = object->ce;
|
||||||
|
|
||||||
/* First, check the (case-insensitive) method table */
|
/* First, check the (case-insensitive) method table */
|
||||||
php_strtolower(lower, name_len);
|
php_strtolower(lower, name_len);
|
||||||
@ -637,7 +638,7 @@ inline v8::Local<v8::Value> v8js_named_property_callback(v8::Local<v8::String> p
|
|||||||
fci.param_count = 1;
|
fci.param_count = 1;
|
||||||
fci.params = &zname_ptr_ptr;
|
fci.params = &zname_ptr_ptr;
|
||||||
|
|
||||||
fci.object_ptr = object;
|
fci.object = object;
|
||||||
fci.no_separation = 0;
|
fci.no_separation = 0;
|
||||||
|
|
||||||
zend_call_function(&fci, NULL TSRMLS_CC);
|
zend_call_function(&fci, NULL TSRMLS_CC);
|
||||||
@ -684,7 +685,7 @@ inline v8::Local<v8::Value> v8js_named_property_callback(v8::Local<v8::String> p
|
|||||||
fci.params[0] = &zname_ptr;
|
fci.params[0] = &zname_ptr;
|
||||||
fci.params[1] = &php_value;
|
fci.params[1] = &php_value;
|
||||||
|
|
||||||
fci.object_ptr = object;
|
fci.object = object;
|
||||||
fci.no_separation = 1;
|
fci.no_separation = 1;
|
||||||
|
|
||||||
zend_call_function(&fci, NULL TSRMLS_CC);
|
zend_call_function(&fci, NULL TSRMLS_CC);
|
||||||
@ -698,7 +699,7 @@ inline v8::Local<v8::Value> v8js_named_property_callback(v8::Local<v8::String> p
|
|||||||
zval_ptr_dtor(&php_value);
|
zval_ptr_dtor(&php_value);
|
||||||
} else if (callback_type == V8JS_PROP_QUERY ||
|
} else if (callback_type == V8JS_PROP_QUERY ||
|
||||||
callback_type == V8JS_PROP_DELETER) {
|
callback_type == V8JS_PROP_DELETER) {
|
||||||
const zend_object_handlers *h = Z_OBJ_HT_P(object);
|
const zend_object_handlers *h = object->handlers;
|
||||||
zval *prop;
|
zval *prop;
|
||||||
MAKE_STD_ZVAL(prop);
|
MAKE_STD_ZVAL(prop);
|
||||||
ZVAL_STRINGL(prop, name, name_len);
|
ZVAL_STRINGL(prop, name, name_len);
|
||||||
@ -854,7 +855,7 @@ static v8::Handle<v8::Object> v8js_wrap_object(v8::Isolate *isolate, zend_class_
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create v8 wrapper object
|
// Create v8 wrapper object
|
||||||
v8::Handle<v8::Value> external = v8::External::New(isolate, value);
|
v8::Handle<v8::Value> external = v8::External::New(isolate, Z_OBJ(value));
|
||||||
v8::Handle<v8::Object> newobj = new_tpl->GetFunction()->NewInstance(1, &external);
|
v8::Handle<v8::Object> newobj = new_tpl->GetFunction()->NewInstance(1, &external);
|
||||||
|
|
||||||
if (ce == zend_ce_closure) {
|
if (ce == zend_ce_closure) {
|
||||||
|
10
v8js_v8.cc
10
v8js_v8.cc
@ -226,7 +226,8 @@ int v8js_get_properties_hash(v8::Handle<v8::Value> jsValue, HashTable *retval, i
|
|||||||
v8::Local<v8::Value> jsVal = jsObj->Get(jsKey);
|
v8::Local<v8::Value> jsVal = jsObj->Get(jsKey);
|
||||||
v8::String::Utf8Value cstr(jsKey);
|
v8::String::Utf8Value cstr(jsKey);
|
||||||
const char *key = ToCString(cstr);
|
const char *key = ToCString(cstr);
|
||||||
zval *value = NULL;
|
zval value;
|
||||||
|
ZVAL_UNDEF(&value);
|
||||||
|
|
||||||
v8::Local<v8::Value> php_object;
|
v8::Local<v8::Value> php_object;
|
||||||
if (jsVal->IsObject()) {
|
if (jsVal->IsObject()) {
|
||||||
@ -234,14 +235,13 @@ int v8js_get_properties_hash(v8::Handle<v8::Value> jsValue, HashTable *retval, i
|
|||||||
}
|
}
|
||||||
if (!php_object.IsEmpty()) {
|
if (!php_object.IsEmpty()) {
|
||||||
/* This is a PHP object, passed to JS and back. */
|
/* This is a PHP object, passed to JS and back. */
|
||||||
value = reinterpret_cast<zval *>(v8::External::Cast(*php_object)->Value());
|
zend_object object = reinterpret_cast<zend_object *>(v8::External::Cast(*php_object)->Value());
|
||||||
|
ZVAL_OBJ(&value, object);
|
||||||
Z_ADDREF_P(value);
|
Z_ADDREF_P(value);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
MAKE_STD_ZVAL(value);
|
|
||||||
|
|
||||||
if (v8js_to_zval(jsVal, value, flags, isolate TSRMLS_CC) == FAILURE) {
|
if (v8js_to_zval(jsVal, value, flags, isolate TSRMLS_CC) == FAILURE) {
|
||||||
zval_ptr_dtor(&value);
|
zval_dtor(&value);
|
||||||
return FAILURE;
|
return FAILURE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user