OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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/messages.h" | 5 #include "src/messages.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/execution.h" | 8 #include "src/execution.h" |
9 #include "src/isolate-inl.h" | 9 #include "src/isolate-inl.h" |
10 #include "src/keys.h" | 10 #include "src/keys.h" |
11 #include "src/string-builder.h" | 11 #include "src/string-builder.h" |
12 #include "src/wasm/wasm-module.h" | |
12 | 13 |
13 namespace v8 { | 14 namespace v8 { |
14 namespace internal { | 15 namespace internal { |
15 | 16 |
16 MessageLocation::MessageLocation(Handle<Script> script, int start_pos, | 17 MessageLocation::MessageLocation(Handle<Script> script, int start_pos, |
17 int end_pos) | 18 int end_pos) |
18 : script_(script), start_pos_(start_pos), end_pos_(end_pos) {} | 19 : script_(script), start_pos_(start_pos), end_pos_(end_pos) {} |
19 MessageLocation::MessageLocation(Handle<Script> script, int start_pos, | 20 MessageLocation::MessageLocation(Handle<Script> script, int start_pos, |
20 int end_pos, Handle<JSFunction> function) | 21 int end_pos, Handle<JSFunction> function) |
21 : script_(script), | 22 : script_(script), |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
162 Isolate* isolate, Handle<Object> data) { | 163 Isolate* isolate, Handle<Object> data) { |
163 HandleScope scope(isolate); | 164 HandleScope scope(isolate); |
164 return GetMessage(isolate, data)->ToCString(DISALLOW_NULLS); | 165 return GetMessage(isolate, data)->ToCString(DISALLOW_NULLS); |
165 } | 166 } |
166 | 167 |
167 | 168 |
168 CallSite::CallSite(Isolate* isolate, Handle<JSObject> call_site_obj) | 169 CallSite::CallSite(Isolate* isolate, Handle<JSObject> call_site_obj) |
169 : isolate_(isolate) { | 170 : isolate_(isolate) { |
170 Handle<Object> maybe_function = JSObject::GetDataProperty( | 171 Handle<Object> maybe_function = JSObject::GetDataProperty( |
171 call_site_obj, isolate->factory()->call_site_function_symbol()); | 172 call_site_obj, isolate->factory()->call_site_function_symbol()); |
172 if (!maybe_function->IsJSFunction()) return; | 173 if (maybe_function->IsJSFunction()) { |
174 // javascript | |
175 fun_ = Handle<JSFunction>::cast(maybe_function); | |
176 receiver_ = JSObject::GetDataProperty( | |
177 call_site_obj, isolate->factory()->call_site_receiver_symbol()); | |
178 } else { | |
Yang
2016/05/04 19:02:22
I guess I was wrong in my previous comments. Now t
Clemens Hammacher
2016/05/05 12:29:16
OK, I changed it accordingly.
I guess I will still
| |
179 // wasm | |
180 wasm_obj_ = Handle<JSObject>::cast(JSObject::GetDataProperty( | |
181 call_site_obj, isolate->factory()->call_site_wasm_obj_symbol())); | |
182 Handle<Object> wasm_func_index_smi = JSObject::GetDataProperty( | |
183 call_site_obj, isolate->factory()->call_site_wasm_func_index_symbol()); | |
184 wasm_func_index_ = Smi::cast(*wasm_func_index_smi)->value(); | |
185 DCHECK(static_cast<int>(wasm_func_index_) >= 0); | |
186 } | |
173 | 187 |
174 fun_ = Handle<JSFunction>::cast(maybe_function); | |
175 receiver_ = JSObject::GetDataProperty( | |
176 call_site_obj, isolate->factory()->call_site_receiver_symbol()); | |
177 CHECK(JSObject::GetDataProperty( | 188 CHECK(JSObject::GetDataProperty( |
178 call_site_obj, isolate->factory()->call_site_position_symbol()) | 189 call_site_obj, isolate->factory()->call_site_position_symbol()) |
179 ->ToInt32(&pos_)); | 190 ->ToInt32(&pos_)); |
180 } | 191 } |
181 | 192 |
182 | 193 |
183 Handle<Object> CallSite::GetFileName() { | 194 Handle<Object> CallSite::GetFileName() { |
184 Handle<Object> script(fun_->shared()->script(), isolate_); | 195 if (!IsJavaScript()) return isolate_->factory()->null_value(); |
185 if (script->IsScript()) { | 196 Object* script = fun_->shared()->script(); |
186 return Handle<Object>(Handle<Script>::cast(script)->name(), isolate_); | 197 if (!script->IsScript()) return isolate_->factory()->null_value(); |
187 } | 198 return Handle<Object>(Script::cast(script)->name(), isolate_); |
188 return isolate_->factory()->null_value(); | |
189 } | 199 } |
190 | 200 |
191 | 201 |
192 Handle<Object> CallSite::GetFunctionName() { | 202 Handle<Object> CallSite::GetFunctionName() { |
203 if (IsWasm()) { | |
204 if (wasm_obj_->IsUndefined()) return isolate_->factory()->null_value(); | |
205 // wasm_obj_ can be a String if we generate WASM code directly in a test | |
206 // case. | |
207 if (wasm_obj_->IsString()) return wasm_obj_; | |
208 return wasm::GetWasmFunctionName(Handle<JSObject>::cast(wasm_obj_), | |
209 wasm_func_index_); | |
210 } | |
193 Handle<String> result = JSFunction::GetName(fun_); | 211 Handle<String> result = JSFunction::GetName(fun_); |
194 if (result->length() != 0) return result; | 212 if (result->length() != 0) return result; |
195 | 213 |
196 Handle<Object> script(fun_->shared()->script(), isolate_); | 214 Handle<Object> script(fun_->shared()->script(), isolate_); |
197 if (script->IsScript() && | 215 if (script->IsScript() && |
198 Handle<Script>::cast(script)->compilation_type() == | 216 Handle<Script>::cast(script)->compilation_type() == |
199 Script::COMPILATION_TYPE_EVAL) { | 217 Script::COMPILATION_TYPE_EVAL) { |
200 return isolate_->factory()->eval_string(); | 218 return isolate_->factory()->eval_string(); |
201 } | 219 } |
202 return isolate_->factory()->null_value(); | 220 return isolate_->factory()->null_value(); |
203 } | 221 } |
204 | 222 |
205 | |
206 Handle<Object> CallSite::GetScriptNameOrSourceUrl() { | 223 Handle<Object> CallSite::GetScriptNameOrSourceUrl() { |
207 Handle<Object> script_obj(fun_->shared()->script(), isolate_); | 224 if (!IsJavaScript()) return isolate_->factory()->null_value(); |
208 if (script_obj->IsScript()) { | 225 Object* script_obj = fun_->shared()->script(); |
209 Handle<Script> script = Handle<Script>::cast(script_obj); | 226 if (!script_obj->IsScript()) return isolate_->factory()->null_value(); |
210 Object* source_url = script->source_url(); | 227 Handle<Script> script(Script::cast(script_obj), isolate_); |
211 if (source_url->IsString()) return Handle<Object>(source_url, isolate_); | 228 Object* source_url = script->source_url(); |
212 return Handle<Object>(script->name(), isolate_); | 229 if (source_url->IsString()) return Handle<Object>(source_url, isolate_); |
213 } | 230 return Handle<Object>(script->name(), isolate_); |
214 return isolate_->factory()->null_value(); | |
215 } | 231 } |
216 | 232 |
217 | |
218 bool CheckMethodName(Isolate* isolate, Handle<JSObject> obj, Handle<Name> name, | 233 bool CheckMethodName(Isolate* isolate, Handle<JSObject> obj, Handle<Name> name, |
219 Handle<JSFunction> fun, | 234 Handle<JSFunction> fun, |
220 LookupIterator::Configuration config) { | 235 LookupIterator::Configuration config) { |
221 LookupIterator iter = | 236 LookupIterator iter = |
222 LookupIterator::PropertyOrElement(isolate, obj, name, config); | 237 LookupIterator::PropertyOrElement(isolate, obj, name, config); |
223 if (iter.state() == LookupIterator::DATA) { | 238 if (iter.state() == LookupIterator::DATA) { |
224 return iter.GetDataValue().is_identical_to(fun); | 239 return iter.GetDataValue().is_identical_to(fun); |
225 } else if (iter.state() == LookupIterator::ACCESSOR) { | 240 } else if (iter.state() == LookupIterator::ACCESSOR) { |
226 Handle<Object> accessors = iter.GetAccessors(); | 241 Handle<Object> accessors = iter.GetAccessors(); |
227 if (accessors->IsAccessorPair()) { | 242 if (accessors->IsAccessorPair()) { |
228 Handle<AccessorPair> pair = Handle<AccessorPair>::cast(accessors); | 243 Handle<AccessorPair> pair = Handle<AccessorPair>::cast(accessors); |
229 return pair->getter() == *fun || pair->setter() == *fun; | 244 return pair->getter() == *fun || pair->setter() == *fun; |
230 } | 245 } |
231 } | 246 } |
232 return false; | 247 return false; |
233 } | 248 } |
234 | 249 |
235 | 250 |
236 Handle<Object> CallSite::GetMethodName() { | 251 Handle<Object> CallSite::GetMethodName() { |
237 if (receiver_->IsNull() || receiver_->IsUndefined()) { | 252 if (!IsJavaScript() || receiver_->IsNull() || receiver_->IsUndefined()) { |
238 return isolate_->factory()->null_value(); | 253 return isolate_->factory()->null_value(); |
239 } | 254 } |
240 Handle<JSReceiver> receiver = | 255 Handle<JSReceiver> receiver = |
241 Object::ToObject(isolate_, receiver_).ToHandleChecked(); | 256 Object::ToObject(isolate_, receiver_).ToHandleChecked(); |
242 if (!receiver->IsJSObject()) { | 257 if (!receiver->IsJSObject()) { |
243 return isolate_->factory()->null_value(); | 258 return isolate_->factory()->null_value(); |
244 } | 259 } |
245 | 260 |
246 Handle<JSObject> obj = Handle<JSObject>::cast(receiver); | 261 Handle<JSObject> obj = Handle<JSObject>::cast(receiver); |
247 Handle<Object> function_name(fun_->shared()->name(), isolate_); | 262 Handle<Object> function_name(fun_->shared()->name(), isolate_); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
286 result = inner_scope.CloseAndEscape(name_key); | 301 result = inner_scope.CloseAndEscape(name_key); |
287 } | 302 } |
288 } | 303 } |
289 | 304 |
290 if (!result.is_null()) return outer_scope.CloseAndEscape(result); | 305 if (!result.is_null()) return outer_scope.CloseAndEscape(result); |
291 return isolate_->factory()->null_value(); | 306 return isolate_->factory()->null_value(); |
292 } | 307 } |
293 | 308 |
294 | 309 |
295 int CallSite::GetLineNumber() { | 310 int CallSite::GetLineNumber() { |
296 if (pos_ >= 0) { | 311 if (pos_ >= 0 && IsJavaScript()) { |
297 Handle<Object> script_obj(fun_->shared()->script(), isolate_); | 312 Handle<Object> script_obj(fun_->shared()->script(), isolate_); |
298 if (script_obj->IsScript()) { | 313 if (script_obj->IsScript()) { |
299 Handle<Script> script = Handle<Script>::cast(script_obj); | 314 Handle<Script> script = Handle<Script>::cast(script_obj); |
300 return Script::GetLineNumber(script, pos_) + 1; | 315 return Script::GetLineNumber(script, pos_) + 1; |
301 } | 316 } |
302 } | 317 } |
303 return -1; | 318 return -1; |
304 } | 319 } |
305 | 320 |
306 | 321 |
307 int CallSite::GetColumnNumber() { | 322 int CallSite::GetColumnNumber() { |
308 if (pos_ >= 0) { | 323 if (pos_ >= 0 && IsJavaScript()) { |
309 Handle<Object> script_obj(fun_->shared()->script(), isolate_); | 324 Handle<Object> script_obj(fun_->shared()->script(), isolate_); |
310 if (script_obj->IsScript()) { | 325 if (script_obj->IsScript()) { |
311 Handle<Script> script = Handle<Script>::cast(script_obj); | 326 Handle<Script> script = Handle<Script>::cast(script_obj); |
312 return Script::GetColumnNumber(script, pos_) + 1; | 327 return Script::GetColumnNumber(script, pos_) + 1; |
313 } | 328 } |
314 } | 329 } |
315 return -1; | 330 return -1; |
316 } | 331 } |
317 | 332 |
318 | 333 |
319 bool CallSite::IsNative() { | 334 bool CallSite::IsNative() { |
335 if (!IsJavaScript()) return false; | |
320 Handle<Object> script(fun_->shared()->script(), isolate_); | 336 Handle<Object> script(fun_->shared()->script(), isolate_); |
321 return script->IsScript() && | 337 return script->IsScript() && |
322 Handle<Script>::cast(script)->type() == Script::TYPE_NATIVE; | 338 Handle<Script>::cast(script)->type() == Script::TYPE_NATIVE; |
323 } | 339 } |
324 | 340 |
325 | 341 |
326 bool CallSite::IsToplevel() { | 342 bool CallSite::IsToplevel() { |
343 if (IsWasm()) return false; | |
327 return receiver_->IsJSGlobalProxy() || receiver_->IsNull() || | 344 return receiver_->IsJSGlobalProxy() || receiver_->IsNull() || |
328 receiver_->IsUndefined(); | 345 receiver_->IsUndefined(); |
329 } | 346 } |
330 | 347 |
331 | 348 |
332 bool CallSite::IsEval() { | 349 bool CallSite::IsEval() { |
350 if (!IsJavaScript()) return false; | |
333 Handle<Object> script(fun_->shared()->script(), isolate_); | 351 Handle<Object> script(fun_->shared()->script(), isolate_); |
334 return script->IsScript() && | 352 return script->IsScript() && |
335 Handle<Script>::cast(script)->compilation_type() == | 353 Handle<Script>::cast(script)->compilation_type() == |
336 Script::COMPILATION_TYPE_EVAL; | 354 Script::COMPILATION_TYPE_EVAL; |
337 } | 355 } |
338 | 356 |
339 | 357 |
340 bool CallSite::IsConstructor() { | 358 bool CallSite::IsConstructor() { |
341 if (!receiver_->IsJSObject()) return false; | 359 if (!IsJavaScript() || !receiver_->IsJSObject()) return false; |
342 Handle<Object> constructor = | 360 Handle<Object> constructor = |
343 JSReceiver::GetDataProperty(Handle<JSObject>::cast(receiver_), | 361 JSReceiver::GetDataProperty(Handle<JSObject>::cast(receiver_), |
344 isolate_->factory()->constructor_string()); | 362 isolate_->factory()->constructor_string()); |
345 return constructor.is_identical_to(fun_); | 363 return constructor.is_identical_to(fun_); |
346 } | 364 } |
347 | 365 |
348 | 366 |
349 Handle<String> MessageTemplate::FormatMessage(Isolate* isolate, | 367 Handle<String> MessageTemplate::FormatMessage(Isolate* isolate, |
350 int template_index, | 368 int template_index, |
351 Handle<Object> arg) { | 369 Handle<Object> arg) { |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
423 builder.AppendCharacter(*c); | 441 builder.AppendCharacter(*c); |
424 } | 442 } |
425 } | 443 } |
426 | 444 |
427 return builder.Finish(); | 445 return builder.Finish(); |
428 } | 446 } |
429 | 447 |
430 | 448 |
431 } // namespace internal | 449 } // namespace internal |
432 } // namespace v8 | 450 } // namespace v8 |
OLD | NEW |