Skip to content

Fix deprecated V8 API calls #311

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Apr 24, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Vagrantfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,17 @@
Vagrant.configure("2") do |config|
# Every Vagrant development environment requires a box. You can search for
# boxes at https://atlas.hashicorp.com/search.
config.vm.box = "ubuntu/trusty64"
config.vm.box = "ubuntu/xenial64"

config.vm.provider "lxc" do |lxc, override|
override.vm.box = "fgrehm/trusty64-lxc"
override.vm.box = "zaikin/xenial64-lxc"
end


#
# mass-define "generic" Ubuntu boxes
#
%w{5.1 5.2 5.4 5.7 5.8 5.9 6.0}.each { |version|
%w{5.7 5.8 5.9 6.0}.each { |version|
config.vm.define "v8-#{version}" do |i|
i.vm.synced_folder ".", "/data/v8js"

Expand Down
2 changes: 2 additions & 0 deletions config.m4
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,8 @@ int main ()
LDFLAGS="$old_LDFLAGS"
CPPFLAGS=$old_CPPFLAGS

AC_DEFINE([V8_DEPRECATION_WARNINGS], [1], [Enable compiler warnings when using V8_DEPRECATED apis.])

PHP_ADD_INCLUDE($V8_DIR)
PHP_NEW_EXTENSION(v8js, [ \
v8js_array_access.cc \
Expand Down
17 changes: 8 additions & 9 deletions v8js_class.cc
Original file line number Diff line number Diff line change
Expand Up @@ -410,8 +410,7 @@ static PHP_METHOD(V8Js, __construct)
v8::HandleScope handle_scope(isolate);

/* Redirect fatal errors to PHP error handler */
// This needs to be done within the context isolate
v8::V8::SetFatalErrorHandler(v8js_fatal_error_handler);
isolate->SetFatalErrorHandler(v8js_fatal_error_handler);

/* Create global template for global object */
// Now we are using multiple isolates this needs to be created for every context
Expand Down Expand Up @@ -486,7 +485,7 @@ static PHP_METHOD(V8Js, __construct)
/* Add the PHP object into global object */
php_obj_t->InstanceTemplate()->SetInternalFieldCount(2);
v8::Local<v8::Object> php_obj = php_obj_t->InstanceTemplate()->NewInstance();
V8JS_GLOBAL(isolate)->ForceSet(object_name_js, php_obj, v8::ReadOnly);
V8JS_GLOBAL(isolate)->DefineOwnProperty(context, object_name_js, php_obj, v8::ReadOnly);

/* Export public property values */
HashTable *properties = zend_std_get_properties(getThis());
Expand All @@ -504,12 +503,12 @@ static PHP_METHOD(V8Js, __construct)
return;
}

v8::Local<v8::Value> key = v8::String::NewFromUtf8(isolate, ZSTR_VAL(member),
v8::Local<v8::Name> key = v8::String::NewFromUtf8(isolate, ZSTR_VAL(member),
v8::String::kInternalizedString, static_cast<int>(ZSTR_LEN(member)));

/* Write value to PHP JS object */
value = OBJ_PROP(Z_OBJ_P(getThis()), property_info->offset);
php_obj->ForceSet(key, zval_to_v8js(value, isolate), v8::ReadOnly);
php_obj->DefineOwnProperty(context, key, zval_to_v8js(value, isolate), v8::ReadOnly);
}
} ZEND_HASH_FOREACH_END();

Expand Down Expand Up @@ -584,7 +583,7 @@ static PHP_METHOD(V8Js, __construct)
persistent_ft->Reset(isolate, ft);
}

php_obj->ForceSet(method_name, ft->GetFunction());
php_obj->CreateDataProperty(context, method_name, ft->GetFunction());
} ZEND_HASH_FOREACH_END();
}
/* }}} */
Expand Down Expand Up @@ -616,7 +615,7 @@ static void v8js_compile_script(zval *this_ptr, const zend_string *str, const ze
V8JS_BEGIN_CTX(c, this_ptr)

/* Catch JS exceptions */
v8::TryCatch try_catch;
v8::TryCatch try_catch(isolate);

/* Set script identifier */
if (identifier && ZSTR_LEN(identifier) > std::numeric_limits<int>::max()) {
Expand Down Expand Up @@ -1289,8 +1288,8 @@ static void v8js_write_property(zval *object, zval *member, zval *value, void **
}

/* Write value to PHP JS object */
v8::Local<v8::Value> key = V8JS_SYML(Z_STRVAL_P(member), static_cast<int>(Z_STRLEN_P(member)));
jsobj->ForceSet(key, zval_to_v8js(value, isolate), v8::ReadOnly);
v8::Local<v8::Name> key = V8JS_SYML(Z_STRVAL_P(member), static_cast<int>(Z_STRLEN_P(member)));
jsobj->DefineOwnProperty(v8_context, key, zval_to_v8js(value, isolate), v8::ReadOnly);
}

/* Write value to PHP object */
Expand Down
8 changes: 5 additions & 3 deletions v8js_exceptions.cc
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ void v8js_create_script_exception(zval *return_value, v8::Isolate *isolate, v8::
v8::Local<v8::Message> tc_message = try_catch->Message();
const char *filename_string, *sourceline_string;
char *message_string;
int linenum, start_col, end_col;
int linenum, start_col;

object_init_ex(return_value, php_ce_v8js_script_exception);

Expand All @@ -70,8 +70,10 @@ void v8js_create_script_exception(zval *return_value, v8::Isolate *isolate, v8::
start_col = tc_message->GetStartColumn();
PHPV8_EXPROP(_long, JsStartColumn, start_col);

end_col = tc_message->GetEndColumn();
PHPV8_EXPROP(_long, JsEndColumn, end_col);
v8::Maybe<int> end_col = tc_message->GetEndColumn(isolate->GetEnteredContext());
if (end_col.IsJust()) {
PHPV8_EXPROP(_long, JsEndColumn, end_col.FromJust());
}

spprintf(&message_string, 0, "%s:%d: %s", filename_string, linenum, exception_string);

Expand Down
2 changes: 1 addition & 1 deletion v8js_generator_export.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ v8::Local<v8::Value> v8js_wrap_generator(v8::Isolate *isolate, v8::Local<v8::Val
assert(!wrapped_object.IsEmpty());
assert(wrapped_object->IsObject());

v8::TryCatch try_catch;
v8::TryCatch try_catch(isolate);
v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, "(\
function(wrapped_object) { \
return (function*() { \
Expand Down
12 changes: 6 additions & 6 deletions v8js_methods.cc
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,15 @@ static void v8js_dumper(v8::Isolate *isolate, v8::Local<v8::Value> var, int leve
return;
}

v8::TryCatch try_catch; /* object.toString() can throw an exception */
v8::TryCatch try_catch(isolate); /* object.toString() can throw an exception */
v8::Local<v8::String> details;

if(var->IsRegExp()) {
v8::RegExp *re = v8::RegExp::Cast(*var);
details = re->GetSource();
}
else {
details = var->ToDetailString();
details = var->ToDetailString(isolate->GetEnteredContext()).FromMaybe(v8::Local<v8::String>());

if (try_catch.HasCaught()) {
details = V8JS_SYM("<toString threw exception>");
Expand Down Expand Up @@ -401,26 +401,26 @@ V8JS_METHOD(require)
}

// Create a template for the global object and set the built-in global functions
v8::Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
v8::Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(isolate);
global_template->Set(V8JS_SYM("print"), v8::FunctionTemplate::New(isolate, V8JS_MN(print)), v8::ReadOnly);
global_template->Set(V8JS_SYM("var_dump"), v8::FunctionTemplate::New(isolate, V8JS_MN(var_dump)), v8::ReadOnly);
global_template->Set(V8JS_SYM("sleep"), v8::FunctionTemplate::New(isolate, V8JS_MN(sleep)), v8::ReadOnly);
global_template->Set(V8JS_SYM("require"), v8::FunctionTemplate::New(isolate, V8JS_MN(require), v8::External::New(isolate, c)), v8::ReadOnly);

// Add the exports object in which the module can return its API
v8::Local<v8::ObjectTemplate> exports_template = v8::ObjectTemplate::New();
v8::Local<v8::ObjectTemplate> exports_template = v8::ObjectTemplate::New(isolate);
global_template->Set(V8JS_SYM("exports"), exports_template);

// Add the module object in which the module can have more fine-grained control over what it can return
v8::Local<v8::ObjectTemplate> module_template = v8::ObjectTemplate::New();
v8::Local<v8::ObjectTemplate> module_template = v8::ObjectTemplate::New(isolate);
module_template->Set(V8JS_SYM("id"), V8JS_STR(normalised_module_id));
global_template->Set(V8JS_SYM("module"), module_template);

// Each module gets its own context so different modules do not affect each other
v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, v8::Context::New(isolate, NULL, global_template));

// Catch JS exceptions
v8::TryCatch try_catch;
v8::TryCatch try_catch(isolate);

v8::Locker locker(isolate);
v8::Isolate::Scope isolate_scope(isolate);
Expand Down
27 changes: 19 additions & 8 deletions v8js_object_export.cc
Original file line number Diff line number Diff line change
Expand Up @@ -438,10 +438,17 @@ static void v8js_invoke_callback(const v8::FunctionCallbackInfo<v8::Value>& info
new_tpl = v8::Local<v8::FunctionTemplate>::New
(isolate, ctx->template_cache.at(ce->name));

result = new_tpl->GetFunction()->NewInstance(argc, argv);
v8::MaybeLocal<v8::Object> maybeResult = new_tpl->GetFunction()->NewInstance(isolate->GetEnteredContext(), argc, argv);

if (!maybeResult.IsEmpty()) {
result = maybeResult.ToLocalChecked();
} else {
result = V8JS_UNDEFINED;
}
} else {
result = cb->Call(self, argc, argv);
}

info.GetReturnValue().Set(result);
}
/* }}} */
Expand Down Expand Up @@ -804,7 +811,7 @@ static void v8js_named_property_deleter(v8::Local<v8::String> property, const v8



static v8::Local<v8::Object> v8js_wrap_object(v8::Isolate *isolate, zend_class_entry *ce, zval *value) /* {{{ */
static v8::MaybeLocal<v8::Object> v8js_wrap_object(v8::Isolate *isolate, zend_class_entry *ce, zval *value) /* {{{ */
{
v8js_ctx *ctx = (v8js_ctx *) isolate->GetData(0);
v8::Local<v8::FunctionTemplate> new_tpl;
Expand Down Expand Up @@ -903,11 +910,11 @@ static v8::Local<v8::Object> v8js_wrap_object(v8::Isolate *isolate, zend_class_e

// Create v8 wrapper object
v8::Local<v8::Value> external = v8::External::New(isolate, Z_OBJ_P(value));
v8::Local<v8::Object> newobj = new_tpl->GetFunction()->NewInstance(1, &external);
v8::MaybeLocal<v8::Object> newobj = new_tpl->GetFunction()->NewInstance(isolate->GetEnteredContext(), 1, &external);

if (ce == zend_ce_closure) {
if (ce == zend_ce_closure && !newobj.IsEmpty()) {
// free uncached function template when object is freed
ctx->weak_closures[persist_tpl_].Reset(isolate, newobj);
ctx->weak_closures[persist_tpl_].Reset(isolate, newobj.ToLocalChecked());
ctx->weak_closures[persist_tpl_].SetWeak(persist_tpl_, v8js_weak_closure_callback, v8::WeakCallbackType::kParameter);
}

Expand Down Expand Up @@ -1025,15 +1032,19 @@ v8::Local<v8::Value> v8js_hash_to_jsobj(zval *value, v8::Isolate *isolate) /* {{

/* If it's a PHP object, wrap it */
if (ce) {
v8::Local<v8::Value> wrapped_object = v8js_wrap_object(isolate, ce, value);
v8::MaybeLocal<v8::Object> wrapped_object = v8js_wrap_object(isolate, ce, value);

if (wrapped_object.IsEmpty()) {
return V8JS_UNDEFINED;
}

if (ce == zend_ce_generator) {
/* Wrap PHP Generator object in a wrapper function that provides
* ES6 style behaviour. */
wrapped_object = v8js_wrap_generator(isolate, wrapped_object);
return v8js_wrap_generator(isolate, wrapped_object.ToLocalChecked());
}

return wrapped_object;
return wrapped_object.ToLocalChecked();
}

/* Associative PHP arrays cannot be wrapped to JS arrays, convert them to
Expand Down
4 changes: 2 additions & 2 deletions v8js_timer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ static void v8js_timer_interrupt_handler(v8::Isolate *isolate, void *data) { /*
if (timer_ctx->memory_limit > 0 && hs.used_heap_size() > timer_ctx->memory_limit) {
if (has_sent_notification) {
timer_ctx->killed = true;
v8::V8::TerminateExecution(c->isolate);
c->isolate->TerminateExecution();
c->memory_limit_hit = true;
} else {
// force garbage collection, then check again
Expand Down Expand Up @@ -98,7 +98,7 @@ void v8js_timer_thread(zend_v8js_globals *globals) /* {{{ */
}
else if(timer_ctx->time_limit > 0 && now > timer_ctx->time_point) {
timer_ctx->killed = true;
v8::V8::TerminateExecution(c->isolate);
c->isolate->TerminateExecution();
c->time_limit_hit = true;
}
else if (timer_ctx->memory_limit > 0) {
Expand Down
10 changes: 6 additions & 4 deletions v8js_v8.cc
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ void v8js_v8_call(v8js_ctx *c, zval **return_value,
V8JSG(timer_mutex).unlock();

/* Catch JS exceptions */
v8::TryCatch try_catch;
v8::TryCatch try_catch(isolate);

/* Set flags for runtime use */
c->flags = flags;
Expand Down Expand Up @@ -246,7 +246,7 @@ void v8js_v8_call(v8js_ctx *c, zval **return_value,

void v8js_terminate_execution(v8::Isolate *isolate) /* {{{ */
{
if(v8::V8::IsExecutionTerminating(isolate)) {
if(isolate->IsExecutionTerminating()) {
/* Execution already terminating, needn't trigger it again and
* especially must not execute the spinning loop (which would cause
* crashes in V8 itself, at least with 4.2 and 4.3 version lines). */
Expand All @@ -264,7 +264,7 @@ void v8js_terminate_execution(v8::Isolate *isolate) /* {{{ */

v8::Local<v8::String> source = V8JS_STR("for(;;);");
v8::Local<v8::Script> script = v8::Script::Compile(source);
v8::V8::TerminateExecution(isolate);
isolate->TerminateExecution();
script->Run();
}
/* }}} */
Expand All @@ -282,7 +282,9 @@ int v8js_get_properties_hash(v8::Local<v8::Value> jsValue, HashTable *retval, in
v8::Local<v8::String> jsKey = jsKeys->Get(i)->ToString();

/* Skip any prototype properties */
if (!jsObj->HasOwnProperty(jsKey) && !jsObj->HasRealNamedProperty(jsKey) && !jsObj->HasRealNamedCallbackProperty(jsKey)) {
if (!jsObj->HasOwnProperty(isolate->GetEnteredContext(), jsKey).FromMaybe(false)
&& !jsObj->HasRealNamedProperty(jsKey)
&& !jsObj->HasRealNamedCallbackProperty(jsKey)) {
continue;
}

Expand Down
2 changes: 1 addition & 1 deletion v8js_v8object_class.cc
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ static void v8js_v8object_write_property(zval *object, zval *member, zval *value
}

if (v8obj->IsObject()) {
v8obj->ToObject()->ForceSet(V8JS_SYML(Z_STRVAL_P(member), static_cast<int>(Z_STRLEN_P(member))), zval_to_v8js(value, isolate));
v8obj->ToObject()->CreateDataProperty(v8_context, V8JS_SYML(Z_STRVAL_P(member), static_cast<int>(Z_STRLEN_P(member))), zval_to_v8js(value, isolate));
}
}
/* }}} */
Expand Down