Line data Source code
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/objects/frame-array-inl.h"
11 : #include "src/string-builder.h"
12 : #include "src/wasm/wasm-module.h"
13 :
14 : namespace v8 {
15 : namespace internal {
16 :
17 : #define CHECK_CALLSITE(recv, method) \
18 : CHECK_RECEIVER(JSObject, recv, method); \
19 : if (!JSReceiver::HasOwnProperty( \
20 : recv, isolate->factory()->call_site_frame_array_symbol()) \
21 : .FromMaybe(false)) { \
22 : THROW_NEW_ERROR_RETURN_FAILURE( \
23 : isolate, \
24 : NewTypeError(MessageTemplate::kCallSiteMethod, \
25 : isolate->factory()->NewStringFromAsciiChecked(method))); \
26 : }
27 :
28 : namespace {
29 :
30 1740 : Object* PositiveNumberOrNull(int value, Isolate* isolate) {
31 3480 : if (value >= 0) return *isolate->factory()->NewNumberFromInt(value);
32 0 : return isolate->heap()->null_value();
33 : }
34 :
35 : Handle<FrameArray> GetFrameArray(Isolate* isolate, Handle<JSObject> object) {
36 : Handle<Object> frame_array_obj = JSObject::GetDataProperty(
37 75426 : object, isolate->factory()->call_site_frame_array_symbol());
38 : return Handle<FrameArray>::cast(frame_array_obj);
39 : }
40 :
41 : int GetFrameIndex(Isolate* isolate, Handle<JSObject> object) {
42 : Handle<Object> frame_index_obj = JSObject::GetDataProperty(
43 75426 : object, isolate->factory()->call_site_frame_index_symbol());
44 : return Smi::cast(*frame_index_obj)->value();
45 : }
46 :
47 : } // namespace
48 :
49 2070 : BUILTIN(CallSitePrototypeGetColumnNumber) {
50 : HandleScope scope(isolate);
51 2070 : CHECK_CALLSITE(recv, "getColumnNumber");
52 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
53 690 : GetFrameIndex(isolate, recv));
54 690 : return PositiveNumberOrNull(it.Frame()->GetColumnNumber(), isolate);
55 : }
56 :
57 711 : BUILTIN(CallSitePrototypeGetEvalOrigin) {
58 : HandleScope scope(isolate);
59 711 : CHECK_CALLSITE(recv, "getEvalOrigin");
60 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
61 237 : GetFrameIndex(isolate, recv));
62 474 : return *it.Frame()->GetEvalOrigin();
63 : }
64 :
65 2970 : BUILTIN(CallSitePrototypeGetFileName) {
66 : HandleScope scope(isolate);
67 2970 : CHECK_CALLSITE(recv, "getFileName");
68 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
69 990 : GetFrameIndex(isolate, recv));
70 1980 : return *it.Frame()->GetFileName();
71 : }
72 :
73 2070 : BUILTIN(CallSitePrototypeGetFunction) {
74 : HandleScope scope(isolate);
75 2070 : CHECK_CALLSITE(recv, "getFunction");
76 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
77 690 : GetFrameIndex(isolate, recv));
78 :
79 690 : StackFrameBase* frame = it.Frame();
80 690 : if (frame->IsStrict()) return isolate->heap()->undefined_value();
81 1140 : return *frame->GetFunction();
82 : }
83 :
84 69966 : BUILTIN(CallSitePrototypeGetFunctionName) {
85 : HandleScope scope(isolate);
86 69966 : CHECK_CALLSITE(recv, "getFunctionName");
87 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
88 23322 : GetFrameIndex(isolate, recv));
89 46644 : return *it.Frame()->GetFunctionName();
90 : }
91 :
92 3150 : BUILTIN(CallSitePrototypeGetLineNumber) {
93 : HandleScope scope(isolate);
94 3150 : CHECK_CALLSITE(recv, "getLineNumber");
95 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
96 1050 : GetFrameIndex(isolate, recv));
97 1050 : return PositiveNumberOrNull(it.Frame()->GetLineNumber(), isolate);
98 : }
99 :
100 495 : BUILTIN(CallSitePrototypeGetMethodName) {
101 : HandleScope scope(isolate);
102 600 : CHECK_CALLSITE(recv, "getMethodName");
103 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
104 120 : GetFrameIndex(isolate, recv));
105 240 : return *it.Frame()->GetMethodName();
106 : }
107 :
108 540 : BUILTIN(CallSitePrototypeGetPosition) {
109 : HandleScope scope(isolate);
110 540 : CHECK_CALLSITE(recv, "getPosition");
111 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
112 180 : GetFrameIndex(isolate, recv));
113 180 : return Smi::FromInt(it.Frame()->GetPosition());
114 : }
115 :
116 0 : BUILTIN(CallSitePrototypeGetScriptNameOrSourceURL) {
117 : HandleScope scope(isolate);
118 0 : CHECK_CALLSITE(recv, "getScriptNameOrSourceUrl");
119 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
120 0 : GetFrameIndex(isolate, recv));
121 0 : return *it.Frame()->GetScriptNameOrSourceUrl();
122 : }
123 :
124 2565 : BUILTIN(CallSitePrototypeGetThis) {
125 : HandleScope scope(isolate);
126 2565 : CHECK_CALLSITE(recv, "getThis");
127 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
128 855 : GetFrameIndex(isolate, recv));
129 :
130 855 : StackFrameBase* frame = it.Frame();
131 855 : if (frame->IsStrict()) return isolate->heap()->undefined_value();
132 1470 : return *frame->GetReceiver();
133 : }
134 :
135 360 : BUILTIN(CallSitePrototypeGetTypeName) {
136 : HandleScope scope(isolate);
137 360 : CHECK_CALLSITE(recv, "getTypeName");
138 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
139 120 : GetFrameIndex(isolate, recv));
140 240 : return *it.Frame()->GetTypeName();
141 : }
142 :
143 0 : BUILTIN(CallSitePrototypeIsConstructor) {
144 : HandleScope scope(isolate);
145 0 : CHECK_CALLSITE(recv, "isConstructor");
146 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
147 0 : GetFrameIndex(isolate, recv));
148 0 : return isolate->heap()->ToBoolean(it.Frame()->IsConstructor());
149 : }
150 :
151 0 : BUILTIN(CallSitePrototypeIsEval) {
152 : HandleScope scope(isolate);
153 0 : CHECK_CALLSITE(recv, "isEval");
154 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
155 0 : GetFrameIndex(isolate, recv));
156 0 : return isolate->heap()->ToBoolean(it.Frame()->IsEval());
157 : }
158 :
159 0 : BUILTIN(CallSitePrototypeIsNative) {
160 : HandleScope scope(isolate);
161 0 : CHECK_CALLSITE(recv, "isNative");
162 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
163 0 : GetFrameIndex(isolate, recv));
164 0 : return isolate->heap()->ToBoolean(it.Frame()->IsNative());
165 : }
166 :
167 0 : BUILTIN(CallSitePrototypeIsToplevel) {
168 : HandleScope scope(isolate);
169 0 : CHECK_CALLSITE(recv, "isToplevel");
170 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
171 0 : GetFrameIndex(isolate, recv));
172 0 : return isolate->heap()->ToBoolean(it.Frame()->IsToplevel());
173 : }
174 :
175 141516 : BUILTIN(CallSitePrototypeToString) {
176 : HandleScope scope(isolate);
177 141516 : CHECK_CALLSITE(recv, "toString");
178 : FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
179 47172 : GetFrameIndex(isolate, recv));
180 141516 : RETURN_RESULT_OR_FAILURE(isolate, it.Frame()->ToString());
181 : }
182 :
183 : #undef CHECK_CALLSITE
184 :
185 : } // namespace internal
186 : } // namespace v8
|