summaryrefslogtreecommitdiff
path: root/deps/v8/src/builtins/builtins-callsite.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/builtins/builtins-callsite.cc')
-rw-r--r--deps/v8/src/builtins/builtins-callsite.cc178
1 files changed, 62 insertions, 116 deletions
diff --git a/deps/v8/src/builtins/builtins-callsite.cc b/deps/v8/src/builtins/builtins-callsite.cc
index 63e4d7a572..5c32e04f32 100644
--- a/deps/v8/src/builtins/builtins-callsite.cc
+++ b/deps/v8/src/builtins/builtins-callsite.cc
@@ -6,227 +6,173 @@
#include "src/builtins/builtins.h"
#include "src/heap/heap-inl.h" // For ToBoolean.
#include "src/logging/counters.h"
-#include "src/objects/frame-array-inl.h"
#include "src/objects/objects-inl.h"
-#include "src/objects/stack-frame-info.h"
+#include "src/objects/stack-frame-info-inl.h"
namespace v8 {
namespace internal {
-#define CHECK_CALLSITE(recv, method) \
- CHECK_RECEIVER(JSObject, recv, method); \
- if (!JSReceiver::HasOwnProperty( \
- recv, isolate->factory()->call_site_frame_array_symbol()) \
- .FromMaybe(false)) { \
+#define CHECK_CALLSITE(frame, method) \
+ CHECK_RECEIVER(JSObject, receiver, method); \
+ LookupIterator it(isolate, receiver, \
+ isolate->factory()->call_site_frame_info_symbol(), \
+ LookupIterator::OWN_SKIP_INTERCEPTOR); \
+ if (it.state() != LookupIterator::DATA) { \
THROW_NEW_ERROR_RETURN_FAILURE( \
isolate, \
NewTypeError(MessageTemplate::kCallSiteMethod, \
isolate->factory()->NewStringFromAsciiChecked(method))); \
- }
-
+ } \
+ Handle<StackFrameInfo> frame = Handle<StackFrameInfo>::cast(it.GetDataValue())
namespace {
Object PositiveNumberOrNull(int value, Isolate* isolate) {
- if (value >= 0) return *isolate->factory()->NewNumberFromInt(value);
+ if (value > 0) return *isolate->factory()->NewNumberFromInt(value);
return ReadOnlyRoots(isolate).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::ToInt(*frame_index_obj);
-}
-
} // namespace
BUILTIN(CallSitePrototypeGetColumnNumber) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getColumnNumber");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return PositiveNumberOrNull(it.Frame()->GetColumnNumber(), isolate);
+ CHECK_CALLSITE(frame, "getColumnNumber");
+ return PositiveNumberOrNull(StackFrameInfo::GetColumnNumber(frame), isolate);
}
BUILTIN(CallSitePrototypeGetEnclosingColumnNumber) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getEnclosingColumnNumber");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return PositiveNumberOrNull(it.Frame()->GetEnclosingColumnNumber(), isolate);
+ CHECK_CALLSITE(frame, "getEnclosingColumnNumber");
+ return PositiveNumberOrNull(StackFrameInfo::GetEnclosingColumnNumber(frame),
+ isolate);
}
BUILTIN(CallSitePrototypeGetEnclosingLineNumber) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getEnclosingLineNumber");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return PositiveNumberOrNull(it.Frame()->GetEnclosingLineNumber(), isolate);
+ CHECK_CALLSITE(frame, "getEnclosingLineNumber");
+ return PositiveNumberOrNull(StackFrameInfo::GetEnclosingLineNumber(frame),
+ isolate);
}
BUILTIN(CallSitePrototypeGetEvalOrigin) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getEvalOrigin");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return *it.Frame()->GetEvalOrigin();
+ CHECK_CALLSITE(frame, "getEvalOrigin");
+ return *StackFrameInfo::GetEvalOrigin(frame);
}
BUILTIN(CallSitePrototypeGetFileName) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getFileName");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return *it.Frame()->GetFileName();
+ CHECK_CALLSITE(frame, "getFileName");
+ return frame->GetScriptName();
}
BUILTIN(CallSitePrototypeGetFunction) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getFunction");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
-
- StackFrameBase* frame = it.Frame();
+ CHECK_CALLSITE(frame, "getFunction");
if (frame->IsStrict() ||
- (frame->GetFunction()->IsJSFunction() &&
- JSFunction::cast(*frame->GetFunction()).shared().is_toplevel())) {
+ (frame->function().IsJSFunction() &&
+ JSFunction::cast(frame->function()).shared().is_toplevel())) {
return ReadOnlyRoots(isolate).undefined_value();
}
-
isolate->CountUsage(v8::Isolate::kCallSiteAPIGetFunctionSloppyCall);
-
- return *frame->GetFunction();
+ return frame->function();
}
BUILTIN(CallSitePrototypeGetFunctionName) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getFunctionName");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return *it.Frame()->GetFunctionName();
+ CHECK_CALLSITE(frame, "getFunctionName");
+ return *StackFrameInfo::GetFunctionName(frame);
}
BUILTIN(CallSitePrototypeGetLineNumber) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getLineNumber");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return PositiveNumberOrNull(it.Frame()->GetLineNumber(), isolate);
+ CHECK_CALLSITE(frame, "getLineNumber");
+ return PositiveNumberOrNull(StackFrameInfo::GetLineNumber(frame), isolate);
}
BUILTIN(CallSitePrototypeGetMethodName) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getMethodName");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return *it.Frame()->GetMethodName();
+ CHECK_CALLSITE(frame, "getMethodName");
+ return *StackFrameInfo::GetMethodName(frame);
}
BUILTIN(CallSitePrototypeGetPosition) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getPosition");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return Smi::FromInt(it.Frame()->GetPosition());
+ CHECK_CALLSITE(frame, "getPosition");
+ return Smi::FromInt(StackFrameInfo::GetSourcePosition(frame));
}
BUILTIN(CallSitePrototypeGetPromiseIndex) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getPromiseIndex");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return PositiveNumberOrNull(it.Frame()->GetPromiseIndex(), isolate);
+ CHECK_CALLSITE(frame, "getPromiseIndex");
+ if (!frame->IsPromiseAll() && !frame->IsPromiseAny()) {
+ return ReadOnlyRoots(isolate).null_value();
+ }
+ return Smi::FromInt(StackFrameInfo::GetSourcePosition(frame));
}
BUILTIN(CallSitePrototypeGetScriptNameOrSourceURL) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getScriptNameOrSourceUrl");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return *it.Frame()->GetScriptNameOrSourceUrl();
+ CHECK_CALLSITE(frame, "getScriptNameOrSourceUrl");
+ return frame->GetScriptNameOrSourceURL();
}
BUILTIN(CallSitePrototypeGetThis) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getThis");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
-
- StackFrameBase* frame = it.Frame();
+ CHECK_CALLSITE(frame, "getThis");
if (frame->IsStrict()) return ReadOnlyRoots(isolate).undefined_value();
-
isolate->CountUsage(v8::Isolate::kCallSiteAPIGetThisSloppyCall);
-
- return *frame->GetReceiver();
+ if (frame->IsAsmJsWasm()) {
+ return frame->GetWasmInstance().native_context().global_proxy();
+ }
+ return frame->receiver_or_instance();
}
BUILTIN(CallSitePrototypeGetTypeName) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "getTypeName");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return *it.Frame()->GetTypeName();
+ CHECK_CALLSITE(frame, "getTypeName");
+ return *StackFrameInfo::GetTypeName(frame);
}
BUILTIN(CallSitePrototypeIsAsync) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "isAsync");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return isolate->heap()->ToBoolean(it.Frame()->IsAsync());
+ CHECK_CALLSITE(frame, "isAsync");
+ return isolate->heap()->ToBoolean(frame->IsAsync());
}
BUILTIN(CallSitePrototypeIsConstructor) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "isConstructor");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return isolate->heap()->ToBoolean(it.Frame()->IsConstructor());
+ CHECK_CALLSITE(frame, "isConstructor");
+ return isolate->heap()->ToBoolean(frame->IsConstructor());
}
BUILTIN(CallSitePrototypeIsEval) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "isEval");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return isolate->heap()->ToBoolean(it.Frame()->IsEval());
+ CHECK_CALLSITE(frame, "isEval");
+ return isolate->heap()->ToBoolean(frame->IsEval());
}
BUILTIN(CallSitePrototypeIsNative) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "isNative");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return isolate->heap()->ToBoolean(it.Frame()->IsNative());
+ CHECK_CALLSITE(frame, "isNative");
+ return isolate->heap()->ToBoolean(frame->IsNative());
}
BUILTIN(CallSitePrototypeIsPromiseAll) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "isPromiseAll");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return isolate->heap()->ToBoolean(it.Frame()->IsPromiseAll());
+ CHECK_CALLSITE(frame, "isPromiseAll");
+ return isolate->heap()->ToBoolean(frame->IsPromiseAll());
}
BUILTIN(CallSitePrototypeIsToplevel) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "isToplevel");
- FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
- GetFrameIndex(isolate, recv));
- return isolate->heap()->ToBoolean(it.Frame()->IsToplevel());
+ CHECK_CALLSITE(frame, "isToplevel");
+ return isolate->heap()->ToBoolean(frame->IsToplevel());
}
BUILTIN(CallSitePrototypeToString) {
HandleScope scope(isolate);
- CHECK_CALLSITE(recv, "toString");
- Handle<StackTraceFrame> frame = isolate->factory()->NewStackTraceFrame(
- GetFrameArray(isolate, recv), GetFrameIndex(isolate, recv));
- RETURN_RESULT_OR_FAILURE(isolate, SerializeStackTraceFrame(isolate, frame));
+ CHECK_CALLSITE(frame, "toString");
+ RETURN_RESULT_OR_FAILURE(isolate, SerializeStackFrameInfo(isolate, frame));
}
#undef CHECK_CALLSITE