Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Unified Diff: src/api.cc

Issue 1423723002: Map v8::Function to JSReceiver + IsCallable (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: updates Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/api.h ('k') | src/debug/debug.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index 36434cd02193ec69cad227330892f38caf7c5a97..4e6fd99b710360340f46240fa2d5dbb73e6e789f 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -1980,7 +1980,8 @@ MaybeLocal<Function> ScriptCompiler::CompileFunctionInContext(
Utils::OpenHandle(*v8_context->Global()), 0,
nullptr).ToHandle(&result);
RETURN_ON_FAILED_EXECUTION(Function);
- RETURN_ESCAPED(Utils::ToLocal(i::Handle<i::JSFunction>::cast(result)));
+ RETURN_ESCAPED(
+ Utils::FunctionToLocal(i::Handle<i::JSFunction>::cast(result)));
}
@@ -2698,9 +2699,7 @@ bool Value::IsFalse() const {
}
-bool Value::IsFunction() const {
- return Utils::OpenHandle(this)->IsJSFunction();
-}
+bool Value::IsFunction() const { return Utils::OpenHandle(this)->IsCallable(); }
bool Value::IsName() const {
@@ -3039,8 +3038,7 @@ void v8::Object::CheckCast(Value* that) {
void v8::Function::CheckCast(Value* that) {
i::Handle<i::Object> obj = Utils::OpenHandle(that);
- Utils::ApiCheck(obj->IsJSFunction(),
- "v8::Function::Cast()",
+ Utils::ApiCheck(obj->IsCallable(), "v8::Function::Cast()",
"Could not convert to function");
}
@@ -4342,8 +4340,8 @@ MaybeLocal<Object> Function::NewInstance(Local<Context> context, int argc,
STATIC_ASSERT(sizeof(v8::Local<v8::Value>) == sizeof(i::Object**));
i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
Local<Object> result;
- has_pending_exception =
- !ToLocal<Object>(i::Execution::New(self, argc, args), &result);
+ has_pending_exception = !ToLocal<Object>(
+ i::Execution::New(isolate, self, self, argc, args), &result);
RETURN_ON_FAILED_EXECUTION(Object);
RETURN_ESCAPED(result);
}
@@ -4381,20 +4379,32 @@ Local<v8::Value> Function::Call(v8::Local<v8::Value> recv, int argc,
void Function::SetName(v8::Local<v8::String> name) {
- i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
+ auto self = Utils::OpenHandle(this);
+ if (!self->IsJSFunction()) return;
+ auto func = i::Handle<i::JSFunction>::cast(self);
func->shared()->set_name(*Utils::OpenHandle(*name));
}
Local<Value> Function::GetName() const {
- i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
+ auto self = Utils::OpenHandle(this);
+ if (!self->IsJSFunction()) {
+ return ToApiHandle<Primitive>(
+ self->GetIsolate()->factory()->undefined_value());
+ }
+ auto func = i::Handle<i::JSFunction>::cast(self);
return Utils::ToLocal(i::Handle<i::Object>(func->shared()->name(),
func->GetIsolate()));
}
Local<Value> Function::GetInferredName() const {
- i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
+ auto self = Utils::OpenHandle(this);
+ if (!self->IsJSFunction()) {
+ return ToApiHandle<Primitive>(
+ self->GetIsolate()->factory()->undefined_value());
+ }
+ auto func = i::Handle<i::JSFunction>::cast(self);
return Utils::ToLocal(i::Handle<i::Object>(func->shared()->inferred_name(),
func->GetIsolate()));
}
@@ -4403,7 +4413,11 @@ Local<Value> Function::GetInferredName() const {
Local<Value> Function::GetDisplayName() const {
i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
ENTER_V8(isolate);
- i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
+ auto self = Utils::OpenHandle(this);
+ if (!self->IsJSFunction()) {
+ return ToApiHandle<Primitive>(isolate->factory()->undefined_value());
+ }
+ auto func = i::Handle<i::JSFunction>::cast(self);
i::Handle<i::String> property_name =
isolate->factory()->NewStringFromStaticChars("displayName");
i::Handle<i::Object> value =
@@ -4417,7 +4431,11 @@ Local<Value> Function::GetDisplayName() const {
ScriptOrigin Function::GetScriptOrigin() const {
- i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
+ auto self = Utils::OpenHandle(this);
+ if (!self->IsJSFunction()) {
+ return v8::ScriptOrigin(Local<Value>());
+ }
+ auto func = i::Handle<i::JSFunction>::cast(self);
if (func->shared()->script()->IsScript()) {
i::Handle<i::Script> script(i::Script::cast(func->shared()->script()));
return GetScriptOriginForScript(func->GetIsolate(), script);
@@ -4430,7 +4448,11 @@ const int Function::kLineOffsetNotFound = -1;
int Function::GetScriptLineNumber() const {
- i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
+ auto self = Utils::OpenHandle(this);
+ if (!self->IsJSFunction()) {
+ return kLineOffsetNotFound;
+ }
+ auto func = i::Handle<i::JSFunction>::cast(self);
if (func->shared()->script()->IsScript()) {
i::Handle<i::Script> script(i::Script::cast(func->shared()->script()));
return i::Script::GetLineNumber(script, func->shared()->start_position());
@@ -4440,7 +4462,11 @@ int Function::GetScriptLineNumber() const {
int Function::GetScriptColumnNumber() const {
- i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
+ auto self = Utils::OpenHandle(this);
+ if (!self->IsJSFunction()) {
+ return kLineOffsetNotFound;
+ }
+ auto func = i::Handle<i::JSFunction>::cast(self);
if (func->shared()->script()->IsScript()) {
i::Handle<i::Script> script(i::Script::cast(func->shared()->script()));
return i::Script::GetColumnNumber(script, func->shared()->start_position());
@@ -4450,13 +4476,21 @@ int Function::GetScriptColumnNumber() const {
bool Function::IsBuiltin() const {
- i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
+ auto self = Utils::OpenHandle(this);
+ if (!self->IsJSFunction()) {
+ return false;
+ }
+ auto func = i::Handle<i::JSFunction>::cast(self);
return func->IsBuiltin();
}
int Function::ScriptId() const {
- i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
+ auto self = Utils::OpenHandle(this);
+ if (!self->IsJSFunction()) {
+ return v8::UnboundScript::kNoScriptId;
+ }
+ auto func = i::Handle<i::JSFunction>::cast(self);
if (!func->shared()->script()->IsScript()) {
return v8::UnboundScript::kNoScriptId;
}
@@ -4466,7 +4500,11 @@ int Function::ScriptId() const {
Local<v8::Value> Function::GetBoundFunction() const {
- i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
+ auto self = Utils::OpenHandle(this);
+ if (!self->IsJSFunction()) {
+ return v8::Undefined(reinterpret_cast<v8::Isolate*>(self->GetIsolate()));
+ }
+ auto func = i::Handle<i::JSFunction>::cast(self);
if (!func->shared()->bound()) {
return v8::Undefined(reinterpret_cast<v8::Isolate*>(func->GetIsolate()));
}
@@ -4474,7 +4512,7 @@ Local<v8::Value> Function::GetBoundFunction() const {
i::BindingsArray::cast(func->function_bindings()));
i::Handle<i::Object> original(bound_args->bound_function(),
func->GetIsolate());
- return Utils::ToLocal(i::Handle<i::JSFunction>::cast(original));
+ return Utils::FunctionToLocal(i::Handle<i::JSFunction>::cast(original));
}
@@ -7702,7 +7740,7 @@ MaybeLocal<Value> Debug::GetMirror(Local<Context> context,
i::Handle<i::JSObject> debug(isolate_debug->debug_context()->global_object());
auto name = isolate->factory()->NewStringFromStaticChars("MakeMirror");
auto fun_obj = i::Object::GetProperty(debug, name).ToHandleChecked();
- auto v8_fun = Utils::ToLocal(i::Handle<i::JSFunction>::cast(fun_obj));
+ auto v8_fun = Utils::FunctionToLocal(i::Handle<i::JSFunction>::cast(fun_obj));
const int kArgc = 1;
v8::Local<v8::Value> argv[kArgc] = {obj};
Local<Value> result;
« no previous file with comments | « src/api.h ('k') | src/debug/debug.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698