Chromium Code Reviews| Index: src/builtins/builtins-callsite.cc |
| diff --git a/src/builtins/builtins-callsite.cc b/src/builtins/builtins-callsite.cc |
| index 7fc2f987162537345da5dcbadd9602c24bf86873..bef1abea3ee5de075c843324f6ba2f776cb81b93 100644 |
| --- a/src/builtins/builtins-callsite.cc |
| +++ b/src/builtins/builtins-callsite.cc |
| @@ -14,7 +14,7 @@ namespace internal { |
| #define CHECK_CALLSITE(recv, method) \ |
| CHECK_RECEIVER(JSObject, recv, method); \ |
| if (!JSReceiver::HasOwnProperty( \ |
| - recv, isolate->factory()->call_site_position_symbol()) \ |
| + recv, isolate->factory()->call_site_frame_array_symbol()) \ |
| .FromMaybe(false)) { \ |
| THROW_NEW_ERROR_RETURN_FAILURE( \ |
| isolate, \ |
| @@ -22,6 +22,17 @@ namespace internal { |
| isolate->factory()->NewStringFromAsciiChecked(method))); \ |
| } |
| +#define CALLSITE_ITER(recv) \ |
| + Handle<Object> frame_array_obj = JSObject::GetDataProperty( \ |
| + recv, isolate->factory()->call_site_frame_array_symbol()); \ |
| + Handle<FrameArray> frame_array = Handle<FrameArray>::cast(frame_array_obj); \ |
| + \ |
| + Handle<Object> frame_index_obj = JSObject::GetDataProperty( \ |
| + recv, isolate->factory()->call_site_frame_index_symbol()); \ |
| + const int frame_index = Smi::cast(*frame_index_obj)->value(); \ |
| + \ |
| + FrameArrayIterator it(isolate, frame_array, frame_index); |
| + |
| namespace { |
| Object* PositiveNumberOrNull(int value, Isolate* isolate) { |
| @@ -34,167 +45,120 @@ Object* PositiveNumberOrNull(int value, Isolate* isolate) { |
| BUILTIN(CallSitePrototypeGetColumnNumber) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "getColumnNumber"); |
| + CALLSITE_ITER(recv); |
|
ulan
2016/08/30 10:15:56
We can avoid this macro altogether and replace it
jgruber
2016/08/30 12:11:33
Done.
|
| - CallSite call_site(isolate, recv); |
| - CHECK(call_site.IsJavaScript() || call_site.IsWasm()); |
| - return PositiveNumberOrNull(call_site.GetColumnNumber(), isolate); |
| + return PositiveNumberOrNull(it.Frame()->GetColumnNumber(), isolate); |
| } |
| BUILTIN(CallSitePrototypeGetEvalOrigin) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "getEvalOrigin"); |
| - |
| - CallSite call_site(isolate, recv); |
| - CHECK(call_site.IsJavaScript() || call_site.IsWasm()); |
| - return *call_site.GetEvalOrigin(); |
| + CALLSITE_ITER(recv); |
| + return *it.Frame()->GetEvalOrigin(); |
| } |
| BUILTIN(CallSitePrototypeGetFileName) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "getFileName"); |
| - |
| - CallSite call_site(isolate, recv); |
| - CHECK(call_site.IsJavaScript() || call_site.IsWasm()); |
| - return *call_site.GetFileName(); |
| -} |
| - |
| -namespace { |
| - |
| -bool CallSiteIsStrict(Isolate* isolate, Handle<JSObject> receiver) { |
| - Handle<Object> strict; |
| - Handle<Symbol> symbol = isolate->factory()->call_site_strict_symbol(); |
| - ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, strict, |
| - JSObject::GetProperty(receiver, symbol)); |
| - return strict->BooleanValue(); |
| + CALLSITE_ITER(recv); |
| + return *it.Frame()->GetFileName(); |
| } |
| -} // namespace |
| - |
| BUILTIN(CallSitePrototypeGetFunction) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "getFunction"); |
| + CALLSITE_ITER(recv); |
| - if (CallSiteIsStrict(isolate, recv)) |
| - return *isolate->factory()->undefined_value(); |
| - |
| - Handle<Symbol> symbol = isolate->factory()->call_site_function_symbol(); |
| - RETURN_RESULT_OR_FAILURE(isolate, JSObject::GetProperty(recv, symbol)); |
| + StackFrameBase* frame = it.Frame(); |
| + if (frame->IsStrict()) return isolate->heap()->undefined_value(); |
| + return *frame->GetFunction(); |
| } |
| BUILTIN(CallSitePrototypeGetFunctionName) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "getFunctionName"); |
| - |
| - CallSite call_site(isolate, recv); |
| - CHECK(call_site.IsJavaScript() || call_site.IsWasm()); |
| - return *call_site.GetFunctionName(); |
| + CALLSITE_ITER(recv); |
| + return *it.Frame()->GetFunctionName(); |
| } |
| BUILTIN(CallSitePrototypeGetLineNumber) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "getLineNumber"); |
| - |
| - CallSite call_site(isolate, recv); |
| - CHECK(call_site.IsJavaScript() || call_site.IsWasm()); |
| - |
| - int line_number = call_site.IsWasm() ? call_site.wasm_func_index() |
| - : call_site.GetLineNumber(); |
| - return PositiveNumberOrNull(line_number, isolate); |
| + CALLSITE_ITER(recv); |
| + return PositiveNumberOrNull(it.Frame()->GetLineNumber(), isolate); |
| } |
| BUILTIN(CallSitePrototypeGetMethodName) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "getMethodName"); |
| - |
| - CallSite call_site(isolate, recv); |
| - CHECK(call_site.IsJavaScript() || call_site.IsWasm()); |
| - return *call_site.GetMethodName(); |
| + CALLSITE_ITER(recv); |
| + return *it.Frame()->GetMethodName(); |
| } |
| BUILTIN(CallSitePrototypeGetPosition) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "getPosition"); |
| - |
| - Handle<Symbol> symbol = isolate->factory()->call_site_position_symbol(); |
| - RETURN_RESULT_OR_FAILURE(isolate, JSObject::GetProperty(recv, symbol)); |
| + CALLSITE_ITER(recv); |
| + return Smi::FromInt(it.Frame()->GetPosition()); |
| } |
| BUILTIN(CallSitePrototypeGetScriptNameOrSourceURL) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "getScriptNameOrSourceUrl"); |
| - |
| - CallSite call_site(isolate, recv); |
| - CHECK(call_site.IsJavaScript() || call_site.IsWasm()); |
| - return *call_site.GetScriptNameOrSourceUrl(); |
| + CALLSITE_ITER(recv); |
| + return *it.Frame()->GetScriptNameOrSourceUrl(); |
| } |
| BUILTIN(CallSitePrototypeGetThis) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "getThis"); |
| + CALLSITE_ITER(recv); |
| - if (CallSiteIsStrict(isolate, recv)) |
| - return *isolate->factory()->undefined_value(); |
| - |
| - Handle<Object> receiver; |
| - Handle<Symbol> symbol = isolate->factory()->call_site_receiver_symbol(); |
| - ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver, |
| - JSObject::GetProperty(recv, symbol)); |
| - |
| - if (*receiver == isolate->heap()->call_site_constructor_symbol()) |
| - return *isolate->factory()->undefined_value(); |
| - |
| - return *receiver; |
| + StackFrameBase* frame = it.Frame(); |
| + if (frame->IsStrict()) return isolate->heap()->undefined_value(); |
| + return *frame->GetReceiver(); |
| } |
| BUILTIN(CallSitePrototypeGetTypeName) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "getTypeName"); |
| - |
| - CallSite call_site(isolate, recv); |
| - CHECK(call_site.IsJavaScript() || call_site.IsWasm()); |
| - return *call_site.GetTypeName(); |
| + CALLSITE_ITER(recv); |
| + return *it.Frame()->GetTypeName(); |
| } |
| BUILTIN(CallSitePrototypeIsConstructor) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "isConstructor"); |
| - |
| - CallSite call_site(isolate, recv); |
| - CHECK(call_site.IsJavaScript() || call_site.IsWasm()); |
| - return isolate->heap()->ToBoolean(call_site.IsConstructor()); |
| + CALLSITE_ITER(recv); |
| + return isolate->heap()->ToBoolean(it.Frame()->IsConstructor()); |
| } |
| BUILTIN(CallSitePrototypeIsEval) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "isEval"); |
| - |
| - CallSite call_site(isolate, recv); |
| - CHECK(call_site.IsJavaScript() || call_site.IsWasm()); |
| - return isolate->heap()->ToBoolean(call_site.IsEval()); |
| + CALLSITE_ITER(recv); |
| + return isolate->heap()->ToBoolean(it.Frame()->IsEval()); |
| } |
| BUILTIN(CallSitePrototypeIsNative) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "isNative"); |
| - |
| - CallSite call_site(isolate, recv); |
| - CHECK(call_site.IsJavaScript() || call_site.IsWasm()); |
| - return isolate->heap()->ToBoolean(call_site.IsNative()); |
| + CALLSITE_ITER(recv); |
| + return isolate->heap()->ToBoolean(it.Frame()->IsNative()); |
| } |
| BUILTIN(CallSitePrototypeIsToplevel) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "isToplevel"); |
| - |
| - CallSite call_site(isolate, recv); |
| - CHECK(call_site.IsJavaScript() || call_site.IsWasm()); |
| - return isolate->heap()->ToBoolean(call_site.IsToplevel()); |
| + CALLSITE_ITER(recv); |
| + return isolate->heap()->ToBoolean(it.Frame()->IsToplevel()); |
| } |
| BUILTIN(CallSitePrototypeToString) { |
| HandleScope scope(isolate); |
| CHECK_CALLSITE(recv, "toString"); |
| - RETURN_RESULT_OR_FAILURE(isolate, CallSiteUtils::ToString(isolate, recv)); |
| + CALLSITE_ITER(recv); |
| + RETURN_RESULT_OR_FAILURE(isolate, it.Frame()->ToString()); |
| } |
| #undef CHECK_CALLSITE |