• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "src/builtins/builtins.h"
6 #include "src/builtins/builtins-utils.h"
7 
8 #include "src/counters.h"
9 #include "src/objects-inl.h"
10 #include "src/string-builder.h"
11 #include "src/wasm/wasm-module.h"
12 
13 namespace v8 {
14 namespace internal {
15 
16 #define CHECK_CALLSITE(recv, method)                                          \
17   CHECK_RECEIVER(JSObject, recv, method);                                     \
18   if (!JSReceiver::HasOwnProperty(                                            \
19            recv, isolate->factory()->call_site_frame_array_symbol())          \
20            .FromMaybe(false)) {                                               \
21     THROW_NEW_ERROR_RETURN_FAILURE(                                           \
22         isolate,                                                              \
23         NewTypeError(MessageTemplate::kCallSiteMethod,                        \
24                      isolate->factory()->NewStringFromAsciiChecked(method))); \
25   }
26 
27 namespace {
28 
PositiveNumberOrNull(int value,Isolate * isolate)29 Object* PositiveNumberOrNull(int value, Isolate* isolate) {
30   if (value >= 0) return *isolate->factory()->NewNumberFromInt(value);
31   return isolate->heap()->null_value();
32 }
33 
GetFrameArray(Isolate * isolate,Handle<JSObject> object)34 Handle<FrameArray> GetFrameArray(Isolate* isolate, Handle<JSObject> object) {
35   Handle<Object> frame_array_obj = JSObject::GetDataProperty(
36       object, isolate->factory()->call_site_frame_array_symbol());
37   return Handle<FrameArray>::cast(frame_array_obj);
38 }
39 
GetFrameIndex(Isolate * isolate,Handle<JSObject> object)40 int GetFrameIndex(Isolate* isolate, Handle<JSObject> object) {
41   Handle<Object> frame_index_obj = JSObject::GetDataProperty(
42       object, isolate->factory()->call_site_frame_index_symbol());
43   return Smi::cast(*frame_index_obj)->value();
44 }
45 
46 }  // namespace
47 
BUILTIN(CallSitePrototypeGetColumnNumber)48 BUILTIN(CallSitePrototypeGetColumnNumber) {
49   HandleScope scope(isolate);
50   CHECK_CALLSITE(recv, "getColumnNumber");
51   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
52                         GetFrameIndex(isolate, recv));
53   return PositiveNumberOrNull(it.Frame()->GetColumnNumber(), isolate);
54 }
55 
BUILTIN(CallSitePrototypeGetEvalOrigin)56 BUILTIN(CallSitePrototypeGetEvalOrigin) {
57   HandleScope scope(isolate);
58   CHECK_CALLSITE(recv, "getEvalOrigin");
59   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
60                         GetFrameIndex(isolate, recv));
61   return *it.Frame()->GetEvalOrigin();
62 }
63 
BUILTIN(CallSitePrototypeGetFileName)64 BUILTIN(CallSitePrototypeGetFileName) {
65   HandleScope scope(isolate);
66   CHECK_CALLSITE(recv, "getFileName");
67   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
68                         GetFrameIndex(isolate, recv));
69   return *it.Frame()->GetFileName();
70 }
71 
BUILTIN(CallSitePrototypeGetFunction)72 BUILTIN(CallSitePrototypeGetFunction) {
73   HandleScope scope(isolate);
74   CHECK_CALLSITE(recv, "getFunction");
75   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
76                         GetFrameIndex(isolate, recv));
77 
78   StackFrameBase* frame = it.Frame();
79   if (frame->IsStrict()) return isolate->heap()->undefined_value();
80   return *frame->GetFunction();
81 }
82 
BUILTIN(CallSitePrototypeGetFunctionName)83 BUILTIN(CallSitePrototypeGetFunctionName) {
84   HandleScope scope(isolate);
85   CHECK_CALLSITE(recv, "getFunctionName");
86   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
87                         GetFrameIndex(isolate, recv));
88   return *it.Frame()->GetFunctionName();
89 }
90 
BUILTIN(CallSitePrototypeGetLineNumber)91 BUILTIN(CallSitePrototypeGetLineNumber) {
92   HandleScope scope(isolate);
93   CHECK_CALLSITE(recv, "getLineNumber");
94   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
95                         GetFrameIndex(isolate, recv));
96   return PositiveNumberOrNull(it.Frame()->GetLineNumber(), isolate);
97 }
98 
BUILTIN(CallSitePrototypeGetMethodName)99 BUILTIN(CallSitePrototypeGetMethodName) {
100   HandleScope scope(isolate);
101   CHECK_CALLSITE(recv, "getMethodName");
102   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
103                         GetFrameIndex(isolate, recv));
104   return *it.Frame()->GetMethodName();
105 }
106 
BUILTIN(CallSitePrototypeGetPosition)107 BUILTIN(CallSitePrototypeGetPosition) {
108   HandleScope scope(isolate);
109   CHECK_CALLSITE(recv, "getPosition");
110   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
111                         GetFrameIndex(isolate, recv));
112   return Smi::FromInt(it.Frame()->GetPosition());
113 }
114 
BUILTIN(CallSitePrototypeGetScriptNameOrSourceURL)115 BUILTIN(CallSitePrototypeGetScriptNameOrSourceURL) {
116   HandleScope scope(isolate);
117   CHECK_CALLSITE(recv, "getScriptNameOrSourceUrl");
118   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
119                         GetFrameIndex(isolate, recv));
120   return *it.Frame()->GetScriptNameOrSourceUrl();
121 }
122 
BUILTIN(CallSitePrototypeGetThis)123 BUILTIN(CallSitePrototypeGetThis) {
124   HandleScope scope(isolate);
125   CHECK_CALLSITE(recv, "getThis");
126   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
127                         GetFrameIndex(isolate, recv));
128 
129   StackFrameBase* frame = it.Frame();
130   if (frame->IsStrict()) return isolate->heap()->undefined_value();
131   return *frame->GetReceiver();
132 }
133 
BUILTIN(CallSitePrototypeGetTypeName)134 BUILTIN(CallSitePrototypeGetTypeName) {
135   HandleScope scope(isolate);
136   CHECK_CALLSITE(recv, "getTypeName");
137   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
138                         GetFrameIndex(isolate, recv));
139   return *it.Frame()->GetTypeName();
140 }
141 
BUILTIN(CallSitePrototypeIsConstructor)142 BUILTIN(CallSitePrototypeIsConstructor) {
143   HandleScope scope(isolate);
144   CHECK_CALLSITE(recv, "isConstructor");
145   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
146                         GetFrameIndex(isolate, recv));
147   return isolate->heap()->ToBoolean(it.Frame()->IsConstructor());
148 }
149 
BUILTIN(CallSitePrototypeIsEval)150 BUILTIN(CallSitePrototypeIsEval) {
151   HandleScope scope(isolate);
152   CHECK_CALLSITE(recv, "isEval");
153   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
154                         GetFrameIndex(isolate, recv));
155   return isolate->heap()->ToBoolean(it.Frame()->IsEval());
156 }
157 
BUILTIN(CallSitePrototypeIsNative)158 BUILTIN(CallSitePrototypeIsNative) {
159   HandleScope scope(isolate);
160   CHECK_CALLSITE(recv, "isNative");
161   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
162                         GetFrameIndex(isolate, recv));
163   return isolate->heap()->ToBoolean(it.Frame()->IsNative());
164 }
165 
BUILTIN(CallSitePrototypeIsToplevel)166 BUILTIN(CallSitePrototypeIsToplevel) {
167   HandleScope scope(isolate);
168   CHECK_CALLSITE(recv, "isToplevel");
169   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
170                         GetFrameIndex(isolate, recv));
171   return isolate->heap()->ToBoolean(it.Frame()->IsToplevel());
172 }
173 
BUILTIN(CallSitePrototypeToString)174 BUILTIN(CallSitePrototypeToString) {
175   HandleScope scope(isolate);
176   CHECK_CALLSITE(recv, "toString");
177   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
178                         GetFrameIndex(isolate, recv));
179   RETURN_RESULT_OR_FAILURE(isolate, it.Frame()->ToString());
180 }
181 
182 #undef CHECK_CALLSITE
183 
184 }  // namespace internal
185 }  // namespace v8
186