Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Side by Side Diff: src/builtins/builtins-callsite.cc

Issue 2230953002: Use a custom Struct for stack trace storage (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Tweaks Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/v8.h ('k') | src/execution.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/builtins/builtins.h" 5 #include "src/builtins/builtins.h"
6 #include "src/builtins/builtins-utils.h" 6 #include "src/builtins/builtins-utils.h"
7 7
8 #include "src/string-builder.h" 8 #include "src/string-builder.h"
9 #include "src/wasm/wasm-module.h" 9 #include "src/wasm/wasm-module.h"
10 10
11 namespace v8 { 11 namespace v8 {
12 namespace internal { 12 namespace internal {
13 13
14 #define CHECK_CALLSITE(recv, method) \ 14 #define CHECK_CALLSITE(recv, method) \
15 CHECK_RECEIVER(JSObject, recv, method); \ 15 CHECK_RECEIVER(JSObject, recv, method); \
16 if (!JSReceiver::HasOwnProperty( \ 16 Handle<StackTraceFrame> frame; \
17 recv, isolate->factory()->call_site_position_symbol()) \ 17 { \
18 .FromMaybe(false)) { \ 18 Handle<Object> frame_obj; \
19 THROW_NEW_ERROR_RETURN_FAILURE( \ 19 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( \
20 isolate, \ 20 isolate, frame_obj, \
21 NewTypeError(MessageTemplate::kCallSiteMethod, \ 21 JSObject::GetProperty(recv, \
22 isolate->factory()->NewStringFromAsciiChecked(method))); \ 22 isolate->factory()->call_site_frame_symbol())); \
23 if (!frame_obj->IsStackTraceFrame()) { \
24 THROW_NEW_ERROR_RETURN_FAILURE( \
25 isolate, NewTypeError(MessageTemplate::kCallSiteMethod, \
26 isolate->factory()->NewStringFromAsciiChecked( \
27 method))); \
28 } \
29 frame = Handle<StackTraceFrame>::cast(frame_obj); \
23 } 30 }
24 31
25 namespace { 32 namespace {
26 33
27 Object* PositiveNumberOrNull(int value, Isolate* isolate) { 34 Object* PositiveNumberOrNull(int value, Isolate* isolate) {
28 if (value >= 0) return *isolate->factory()->NewNumberFromInt(value); 35 if (value >= 0) return *isolate->factory()->NewNumberFromInt(value);
29 return isolate->heap()->null_value(); 36 return isolate->heap()->null_value();
30 } 37 }
31 38
32 } // namespace 39 } // namespace
33 40
34 BUILTIN(CallSitePrototypeGetColumnNumber) { 41 BUILTIN(CallSitePrototypeGetColumnNumber) {
35 HandleScope scope(isolate); 42 HandleScope scope(isolate);
36 CHECK_CALLSITE(recv, "getColumnNumber"); 43 CHECK_CALLSITE(recv, "getColumnNumber");
37 44 return PositiveNumberOrNull(frame->GetColumnNumber(), isolate);
38 CallSite call_site(isolate, recv);
39 CHECK(call_site.IsJavaScript() || call_site.IsWasm());
40 return PositiveNumberOrNull(call_site.GetColumnNumber(), isolate);
41 } 45 }
42 46
43 BUILTIN(CallSitePrototypeGetEvalOrigin) { 47 BUILTIN(CallSitePrototypeGetEvalOrigin) {
44 HandleScope scope(isolate); 48 HandleScope scope(isolate);
45 CHECK_CALLSITE(recv, "getEvalOrigin"); 49 CHECK_CALLSITE(recv, "getEvalOrigin");
46 50 return *frame->GetEvalOrigin();
47 CallSite call_site(isolate, recv);
48 CHECK(call_site.IsJavaScript() || call_site.IsWasm());
49 return *call_site.GetEvalOrigin();
50 } 51 }
51 52
52 BUILTIN(CallSitePrototypeGetFileName) { 53 BUILTIN(CallSitePrototypeGetFileName) {
53 HandleScope scope(isolate); 54 HandleScope scope(isolate);
54 CHECK_CALLSITE(recv, "getFileName"); 55 CHECK_CALLSITE(recv, "getFileName");
55 56 return *frame->GetFileName();
56 CallSite call_site(isolate, recv);
57 CHECK(call_site.IsJavaScript() || call_site.IsWasm());
58 return *call_site.GetFileName();
59 } 57 }
60 58
61 namespace {
62
63 bool CallSiteIsStrict(Isolate* isolate, Handle<JSObject> receiver) {
64 Handle<Object> strict;
65 Handle<Symbol> symbol = isolate->factory()->call_site_strict_symbol();
66 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, strict,
67 JSObject::GetProperty(receiver, symbol));
68 return strict->BooleanValue();
69 }
70
71 } // namespace
72
73 BUILTIN(CallSitePrototypeGetFunction) { 59 BUILTIN(CallSitePrototypeGetFunction) {
74 HandleScope scope(isolate); 60 HandleScope scope(isolate);
75 CHECK_CALLSITE(recv, "getFunction"); 61 CHECK_CALLSITE(recv, "getFunction");
76 62
77 if (CallSiteIsStrict(isolate, recv)) 63 if (frame->IsStrict() || frame->IsWasmFrame()) {
78 return *isolate->factory()->undefined_value(); 64 return *isolate->factory()->undefined_value();
65 }
79 66
80 Handle<Symbol> symbol = isolate->factory()->call_site_function_symbol(); 67 return frame->function();
81 RETURN_RESULT_OR_FAILURE(isolate, JSObject::GetProperty(recv, symbol));
82 } 68 }
83 69
84 BUILTIN(CallSitePrototypeGetFunctionName) { 70 BUILTIN(CallSitePrototypeGetFunctionName) {
85 HandleScope scope(isolate); 71 HandleScope scope(isolate);
86 CHECK_CALLSITE(recv, "getFunctionName"); 72 CHECK_CALLSITE(recv, "getFunctionName");
87 73 return *frame->GetFunctionName();
88 CallSite call_site(isolate, recv);
89 CHECK(call_site.IsJavaScript() || call_site.IsWasm());
90 return *call_site.GetFunctionName();
91 } 74 }
92 75
93 BUILTIN(CallSitePrototypeGetLineNumber) { 76 BUILTIN(CallSitePrototypeGetLineNumber) {
94 HandleScope scope(isolate); 77 HandleScope scope(isolate);
95 CHECK_CALLSITE(recv, "getLineNumber"); 78 CHECK_CALLSITE(recv, "getLineNumber");
96 79 return PositiveNumberOrNull(frame->GetLineNumber(), isolate);
97 CallSite call_site(isolate, recv);
98 CHECK(call_site.IsJavaScript() || call_site.IsWasm());
99
100 int line_number = call_site.IsWasm() ? call_site.wasm_func_index()
101 : call_site.GetLineNumber();
102 return PositiveNumberOrNull(line_number, isolate);
103 } 80 }
104 81
105 BUILTIN(CallSitePrototypeGetMethodName) { 82 BUILTIN(CallSitePrototypeGetMethodName) {
106 HandleScope scope(isolate); 83 HandleScope scope(isolate);
107 CHECK_CALLSITE(recv, "getMethodName"); 84 CHECK_CALLSITE(recv, "getMethodName");
108 85 return *frame->GetMethodName();
109 CallSite call_site(isolate, recv);
110 CHECK(call_site.IsJavaScript() || call_site.IsWasm());
111 return *call_site.GetMethodName();
112 } 86 }
113 87
114 BUILTIN(CallSitePrototypeGetPosition) { 88 BUILTIN(CallSitePrototypeGetPosition) {
115 HandleScope scope(isolate); 89 HandleScope scope(isolate);
116 CHECK_CALLSITE(recv, "getPosition"); 90 CHECK_CALLSITE(recv, "getPosition");
117 91 return Smi::FromInt(frame->GetPosition());
118 Handle<Symbol> symbol = isolate->factory()->call_site_position_symbol();
119 RETURN_RESULT_OR_FAILURE(isolate, JSObject::GetProperty(recv, symbol));
120 } 92 }
121 93
122 BUILTIN(CallSitePrototypeGetScriptNameOrSourceURL) { 94 BUILTIN(CallSitePrototypeGetScriptNameOrSourceURL) {
123 HandleScope scope(isolate); 95 HandleScope scope(isolate);
124 CHECK_CALLSITE(recv, "getScriptNameOrSourceUrl"); 96 CHECK_CALLSITE(recv, "getScriptNameOrSourceUrl");
125 97 return *frame->GetScriptNameOrSourceUrl();
126 CallSite call_site(isolate, recv);
127 CHECK(call_site.IsJavaScript() || call_site.IsWasm());
128 return *call_site.GetScriptNameOrSourceUrl();
129 } 98 }
130 99
131 BUILTIN(CallSitePrototypeGetThis) { 100 BUILTIN(CallSitePrototypeGetThis) {
132 HandleScope scope(isolate); 101 HandleScope scope(isolate);
133 CHECK_CALLSITE(recv, "getThis"); 102 CHECK_CALLSITE(recv, "getThis");
134 103
135 if (CallSiteIsStrict(isolate, recv)) 104 if (frame->IsStrict() || frame->ForceConstructor() || frame->IsWasmFrame()) {
136 return *isolate->factory()->undefined_value(); 105 return *isolate->factory()->undefined_value();
106 }
137 107
138 Handle<Object> receiver; 108 return frame->receiver();
139 Handle<Symbol> symbol = isolate->factory()->call_site_receiver_symbol();
140 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver,
141 JSObject::GetProperty(recv, symbol));
142
143 if (*receiver == isolate->heap()->call_site_constructor_symbol())
144 return *isolate->factory()->undefined_value();
145
146 return *receiver;
147 } 109 }
148 110
149 BUILTIN(CallSitePrototypeGetTypeName) { 111 BUILTIN(CallSitePrototypeGetTypeName) {
150 HandleScope scope(isolate); 112 HandleScope scope(isolate);
151 CHECK_CALLSITE(recv, "getTypeName"); 113 CHECK_CALLSITE(recv, "getTypeName");
152 114 return *frame->GetTypeName();
153 CallSite call_site(isolate, recv);
154 CHECK(call_site.IsJavaScript() || call_site.IsWasm());
155 return *call_site.GetTypeName();
156 } 115 }
157 116
158 BUILTIN(CallSitePrototypeIsConstructor) { 117 BUILTIN(CallSitePrototypeIsConstructor) {
159 HandleScope scope(isolate); 118 HandleScope scope(isolate);
160 CHECK_CALLSITE(recv, "isConstructor"); 119 CHECK_CALLSITE(recv, "isConstructor");
161 120 return isolate->heap()->ToBoolean(frame->IsConstructor());
162 CallSite call_site(isolate, recv);
163 CHECK(call_site.IsJavaScript() || call_site.IsWasm());
164 return isolate->heap()->ToBoolean(call_site.IsConstructor());
165 } 121 }
166 122
167 BUILTIN(CallSitePrototypeIsEval) { 123 BUILTIN(CallSitePrototypeIsEval) {
168 HandleScope scope(isolate); 124 HandleScope scope(isolate);
169 CHECK_CALLSITE(recv, "isEval"); 125 CHECK_CALLSITE(recv, "isEval");
170 126 return isolate->heap()->ToBoolean(frame->IsEval());
171 CallSite call_site(isolate, recv);
172 CHECK(call_site.IsJavaScript() || call_site.IsWasm());
173 return isolate->heap()->ToBoolean(call_site.IsEval());
174 } 127 }
175 128
176 BUILTIN(CallSitePrototypeIsNative) { 129 BUILTIN(CallSitePrototypeIsNative) {
177 HandleScope scope(isolate); 130 HandleScope scope(isolate);
178 CHECK_CALLSITE(recv, "isNative"); 131 CHECK_CALLSITE(recv, "isNative");
179 132 return isolate->heap()->ToBoolean(frame->IsNative());
180 CallSite call_site(isolate, recv);
181 CHECK(call_site.IsJavaScript() || call_site.IsWasm());
182 return isolate->heap()->ToBoolean(call_site.IsNative());
183 } 133 }
184 134
185 BUILTIN(CallSitePrototypeIsToplevel) { 135 BUILTIN(CallSitePrototypeIsToplevel) {
186 HandleScope scope(isolate); 136 HandleScope scope(isolate);
187 CHECK_CALLSITE(recv, "isToplevel"); 137 CHECK_CALLSITE(recv, "isToplevel");
188 138 return isolate->heap()->ToBoolean(frame->IsToplevel());
189 CallSite call_site(isolate, recv);
190 CHECK(call_site.IsJavaScript() || call_site.IsWasm());
191 return isolate->heap()->ToBoolean(call_site.IsToplevel());
192 } 139 }
193 140
194 BUILTIN(CallSitePrototypeToString) { 141 BUILTIN(CallSitePrototypeToString) {
195 HandleScope scope(isolate); 142 HandleScope scope(isolate);
196 CHECK_CALLSITE(recv, "toString"); 143 CHECK_CALLSITE(recv, "toString");
197 RETURN_RESULT_OR_FAILURE(isolate, CallSiteUtils::ToString(isolate, recv)); 144 return *frame->ToString();
198 } 145 }
199 146
200 #undef CHECK_CALLSITE 147 #undef CHECK_CALLSITE
201 148
202 } // namespace internal 149 } // namespace internal
203 } // namespace v8 150 } // namespace v8
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/execution.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698