| Index: src/builtins/builtins-callsite.cc
|
| diff --git a/src/builtins/builtins-callsite.cc b/src/builtins/builtins-callsite.cc
|
| index 7fc2f987162537345da5dcbadd9602c24bf86873..ae9c76dc05e8c80197c86ddd9f0e172d09d6e396 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, \
|
| @@ -29,172 +29,152 @@ Object* PositiveNumberOrNull(int value, Isolate* isolate) {
|
| return isolate->heap()->null_value();
|
| }
|
|
|
| +Handle<FrameArray> GetFrameArray(Isolate* isolate, Handle<JSObject> object) {
|
| + Handle<Object> frame_array_obj = JSObject::GetDataProperty(
|
| + object, isolate->factory()->call_site_frame_array_symbol());
|
| + return Handle<FrameArray>::cast(frame_array_obj);
|
| +}
|
| +
|
| +int GetFrameIndex(Isolate* isolate, Handle<JSObject> object) {
|
| + Handle<Object> frame_index_obj = JSObject::GetDataProperty(
|
| + object, isolate->factory()->call_site_frame_index_symbol());
|
| + return Smi::cast(*frame_index_obj)->value();
|
| +}
|
| +
|
| } // namespace
|
|
|
| BUILTIN(CallSitePrototypeGetColumnNumber) {
|
| HandleScope scope(isolate);
|
| CHECK_CALLSITE(recv, "getColumnNumber");
|
| -
|
| - CallSite call_site(isolate, recv);
|
| - CHECK(call_site.IsJavaScript() || call_site.IsWasm());
|
| - return PositiveNumberOrNull(call_site.GetColumnNumber(), isolate);
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, recv));
|
| + 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();
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, 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();
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, recv));
|
| + return *it.Frame()->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();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| BUILTIN(CallSitePrototypeGetFunction) {
|
| HandleScope scope(isolate);
|
| CHECK_CALLSITE(recv, "getFunction");
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, 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();
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, 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);
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, 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();
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, 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));
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, 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();
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, recv));
|
| + return *it.Frame()->GetScriptNameOrSourceUrl();
|
| }
|
|
|
| BUILTIN(CallSitePrototypeGetThis) {
|
| HandleScope scope(isolate);
|
| CHECK_CALLSITE(recv, "getThis");
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, 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();
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, 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());
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, 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());
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, 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());
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, 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());
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, 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));
|
| + FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
|
| + GetFrameIndex(isolate, recv));
|
| + RETURN_RESULT_OR_FAILURE(isolate, it.Frame()->ToString());
|
| }
|
|
|
| #undef CHECK_CALLSITE
|
|
|