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

Side by Side Diff: src/messages.cc

Issue 2404253002: [wasm] Provide better stack traces for asm.js code (Closed)
Patch Set: Pass encoded bytes directly instead of embedding them in the module Created 4 years, 2 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
OLDNEW
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 <memory> 7 #include <memory>
8 8
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/execution.h" 10 #include "src/execution.h"
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 Handle<String> result = JSFunction::GetName(function_); 204 Handle<String> result = JSFunction::GetName(function_);
205 if (result->length() != 0) return result; 205 if (result->length() != 0) return result;
206 206
207 if (HasScript() && 207 if (HasScript() &&
208 GetScript()->compilation_type() == Script::COMPILATION_TYPE_EVAL) { 208 GetScript()->compilation_type() == Script::COMPILATION_TYPE_EVAL) {
209 return isolate_->factory()->eval_string(); 209 return isolate_->factory()->eval_string();
210 } 210 }
211 return isolate_->factory()->null_value(); 211 return isolate_->factory()->null_value();
212 } 212 }
213 213
214 Handle<Object> JSStackFrame::GetScriptNameOrSourceUrl() {
215 if (!HasScript()) return isolate_->factory()->null_value();
216 Handle<Script> script = GetScript();
217 Object* source_url = script->source_url();
218 return (source_url->IsString()) ? handle(source_url, isolate_)
219 : handle(script->name(), isolate_);
220 }
221
222 namespace { 214 namespace {
223 215
224 bool CheckMethodName(Isolate* isolate, Handle<JSObject> obj, Handle<Name> name, 216 bool CheckMethodName(Isolate* isolate, Handle<JSObject> obj, Handle<Name> name,
225 Handle<JSFunction> fun, 217 Handle<JSFunction> fun,
226 LookupIterator::Configuration config) { 218 LookupIterator::Configuration config) {
227 LookupIterator iter = 219 LookupIterator iter =
228 LookupIterator::PropertyOrElement(isolate, obj, name, config); 220 LookupIterator::PropertyOrElement(isolate, obj, name, config);
229 if (iter.state() == LookupIterator::DATA) { 221 if (iter.state() == LookupIterator::DATA) {
230 return iter.GetDataValue().is_identical_to(fun); 222 return iter.GetDataValue().is_identical_to(fun);
231 } else if (iter.state() == LookupIterator::ACCESSOR) { 223 } else if (iter.state() == LookupIterator::ACCESSOR) {
232 Handle<Object> accessors = iter.GetAccessors(); 224 Handle<Object> accessors = iter.GetAccessors();
233 if (accessors->IsAccessorPair()) { 225 if (accessors->IsAccessorPair()) {
234 Handle<AccessorPair> pair = Handle<AccessorPair>::cast(accessors); 226 Handle<AccessorPair> pair = Handle<AccessorPair>::cast(accessors);
235 return pair->getter() == *fun || pair->setter() == *fun; 227 return pair->getter() == *fun || pair->setter() == *fun;
236 } 228 }
237 } 229 }
238 return false; 230 return false;
239 } 231 }
240 232
233 Handle<Object> ScriptNameOrSourceUrl(Handle<Script> script, Isolate* isolate) {
234 Object* name_or_url = script->source_url();
235 if (!name_or_url->IsString()) name_or_url = script->name();
236 return handle(name_or_url, isolate);
237 }
238
241 } // namespace 239 } // namespace
242 240
241 Handle<Object> JSStackFrame::GetScriptNameOrSourceUrl() {
242 if (!HasScript()) return isolate_->factory()->null_value();
243 return ScriptNameOrSourceUrl(GetScript(), isolate_);
244 }
245
243 Handle<Object> JSStackFrame::GetMethodName() { 246 Handle<Object> JSStackFrame::GetMethodName() {
244 if (receiver_->IsNull(isolate_) || receiver_->IsUndefined(isolate_)) { 247 if (receiver_->IsNull(isolate_) || receiver_->IsUndefined(isolate_)) {
245 return isolate_->factory()->null_value(); 248 return isolate_->factory()->null_value();
246 } 249 }
247 250
248 Handle<JSReceiver> receiver = 251 Handle<JSReceiver> receiver =
249 Object::ToObject(isolate_, receiver_).ToHandleChecked(); 252 Object::ToObject(isolate_, receiver_).ToHandleChecked();
250 if (!receiver->IsJSObject()) { 253 if (!receiver->IsJSObject()) {
251 return isolate_->factory()->null_value(); 254 return isolate_->factory()->null_value();
252 } 255 }
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 isolate_->factory()->constructor_string()); 451 isolate_->factory()->constructor_string());
449 return constructor.is_identical_to(function_); 452 return constructor.is_identical_to(function_);
450 } 453 }
451 454
452 namespace { 455 namespace {
453 456
454 bool IsNonEmptyString(Handle<Object> object) { 457 bool IsNonEmptyString(Handle<Object> object) {
455 return (object->IsString() && String::cast(*object)->length() > 0); 458 return (object->IsString() && String::cast(*object)->length() > 0);
456 } 459 }
457 460
458 void AppendFileLocation(Isolate* isolate, JSStackFrame* call_site, 461 void AppendFileLocation(Isolate* isolate, StackFrameBase* call_site,
459 IncrementalStringBuilder* builder) { 462 IncrementalStringBuilder* builder) {
460 if (call_site->IsNative()) { 463 if (call_site->IsNative()) {
461 builder->AppendCString("native"); 464 builder->AppendCString("native");
462 return; 465 return;
463 } 466 }
464 467
465 Handle<Object> file_name = call_site->GetScriptNameOrSourceUrl(); 468 Handle<Object> file_name = call_site->GetScriptNameOrSourceUrl();
466 if (!file_name->IsString() && call_site->IsEval()) { 469 if (!file_name->IsString() && call_site->IsEval()) {
467 Handle<Object> eval_origin = call_site->GetEvalOrigin(); 470 Handle<Object> eval_origin = call_site->GetEvalOrigin();
468 DCHECK(eval_origin->IsString()); 471 DCHECK(eval_origin->IsString());
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
660 } 663 }
661 664
662 int WasmStackFrame::GetPosition() const { 665 int WasmStackFrame::GetPosition() const {
663 return (offset_ < 0) ? (-1 - offset_) : code_->SourcePosition(offset_); 666 return (offset_ < 0) ? (-1 - offset_) : code_->SourcePosition(offset_);
664 } 667 }
665 668
666 Handle<Object> WasmStackFrame::Null() const { 669 Handle<Object> WasmStackFrame::Null() const {
667 return isolate_->factory()->null_value(); 670 return isolate_->factory()->null_value();
668 } 671 }
669 672
673 Handle<Object> AsmJsWasmStackFrame::GetReceiver() const {
674 return isolate_->global_object();
jgruber 2016/10/11 19:07:40 As far I understand, the global object should neve
Clemens Hammacher 2016/10/12 07:37:18 You are right. Fixed it.
675 }
676
677 Handle<Object> AsmJsWasmStackFrame::GetFunction() const {
678 // TODO(clemensh): Return lazily created JSFunction.
679 return Null();
680 }
681
682 Handle<Object> AsmJsWasmStackFrame::GetFileName() {
683 Handle<Script> script =
684 wasm::GetAsmWasmScript(Handle<JSObject>::cast(wasm_obj_));
685 return handle(script->name(), isolate_);
686 }
687
688 Handle<Object> AsmJsWasmStackFrame::GetFunctionName() {
689 return wasm::GetWasmFunctionNameOrNull(isolate_, wasm_obj_, wasm_func_index_);
690 }
691
692 Handle<Object> AsmJsWasmStackFrame::GetScriptNameOrSourceUrl() {
693 Handle<Script> script =
694 wasm::GetAsmWasmScript(Handle<JSObject>::cast(wasm_obj_));
695 return ScriptNameOrSourceUrl(script, isolate_);
696 }
697
698 int AsmJsWasmStackFrame::GetPosition() const {
699 DCHECK_LE(0, offset_);
700 int byte_offset = code_->SourcePosition(offset_);
701 return wasm::GetAsmWasmSourcePosition(Handle<JSObject>::cast(wasm_obj_),
702 wasm_func_index_, byte_offset);
703 }
704
705 int AsmJsWasmStackFrame::GetLineNumber() {
706 DCHECK_LE(0, GetPosition());
707 Handle<Script> script =
708 wasm::GetAsmWasmScript(Handle<JSObject>::cast(wasm_obj_));
709 return Script::GetLineNumber(script, GetPosition()) + 1;
710 }
711
712 int AsmJsWasmStackFrame::GetColumnNumber() {
713 DCHECK_LE(0, GetPosition());
714 Handle<Script> script =
715 wasm::GetAsmWasmScript(Handle<JSObject>::cast(wasm_obj_));
716 return Script::GetColumnNumber(script, GetPosition()) + 1;
717 }
718
719 MaybeHandle<String> AsmJsWasmStackFrame::ToString() {
720 // The string should look exactly as the respective javascript frame string.
721 // Keep this method in line to JSStackFrame::ToString().
722
723 IncrementalStringBuilder builder(isolate_);
724
725 Handle<Object> function_name = GetFunctionName();
726
727 if (IsNonEmptyString(function_name)) {
728 builder.AppendString(Handle<String>::cast(function_name));
729 builder.AppendCString(" (");
730 }
731
732 AppendFileLocation(isolate_, this, &builder);
733
734 if (IsNonEmptyString(function_name)) builder.AppendCString(")");
735
736 RETURN_RESULT(isolate_, builder.Finish(), String);
737 }
738
670 FrameArrayIterator::FrameArrayIterator(Isolate* isolate, 739 FrameArrayIterator::FrameArrayIterator(Isolate* isolate,
671 Handle<FrameArray> array, int frame_ix) 740 Handle<FrameArray> array, int frame_ix)
672 : isolate_(isolate), array_(array), next_frame_ix_(frame_ix) {} 741 : isolate_(isolate), array_(array), next_frame_ix_(frame_ix) {}
673 742
674 bool FrameArrayIterator::HasNext() const { 743 bool FrameArrayIterator::HasNext() const {
675 return (next_frame_ix_ < array_->FrameCount()); 744 return (next_frame_ix_ < array_->FrameCount());
676 } 745 }
677 746
678 void FrameArrayIterator::Next() { next_frame_ix_++; } 747 void FrameArrayIterator::Next() { next_frame_ix_++; }
679 748
680 StackFrameBase* FrameArrayIterator::Frame() { 749 StackFrameBase* FrameArrayIterator::Frame() {
681 DCHECK(HasNext()); 750 DCHECK(HasNext());
682 const int flags = array_->Flags(next_frame_ix_)->value(); 751 const int flags = array_->Flags(next_frame_ix_)->value();
683 const bool is_js_frame = (flags & FrameArray::kIsWasmFrame) == 0; 752 const bool is_js_frame = (flags & FrameArray::kIsWasmFrame) == 0;
684 if (is_js_frame) { 753 if (is_js_frame) {
685 js_frame_.FromFrameArray(isolate_, array_, next_frame_ix_); 754 js_frame_.FromFrameArray(isolate_, array_, next_frame_ix_);
686 return &js_frame_; 755 return &js_frame_;
687 } else {
688 wasm_frame_.FromFrameArray(isolate_, array_, next_frame_ix_);
689 return &wasm_frame_;
690 } 756 }
757 const bool is_asm_wasm_frame = (flags & FrameArray::kIsAsmWasmFrame) != 0;
jgruber 2016/10/11 19:07:40 Can we make this a switch on flags & (kIsWasmFrame
Clemens Hammacher 2016/10/12 07:37:18 Done.
758 if (is_asm_wasm_frame) {
759 asm_wasm_frame_.FromFrameArray(isolate_, array_, next_frame_ix_);
760 return &asm_wasm_frame_;
761 }
762 wasm_frame_.FromFrameArray(isolate_, array_, next_frame_ix_);
763 return &wasm_frame_;
691 } 764 }
692 765
693 namespace { 766 namespace {
694 767
695 MaybeHandle<Object> ConstructCallSite(Isolate* isolate, 768 MaybeHandle<Object> ConstructCallSite(Isolate* isolate,
696 Handle<FrameArray> frame_array, 769 Handle<FrameArray> frame_array,
697 int frame_index) { 770 int frame_index) {
698 Handle<JSFunction> target = 771 Handle<JSFunction> target =
699 handle(isolate->native_context()->callsite_function(), isolate); 772 handle(isolate->native_context()->callsite_function(), isolate);
700 773
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
1099 DCHECK(mode != SKIP_UNTIL_SEEN); 1172 DCHECK(mode != SKIP_UNTIL_SEEN);
1100 1173
1101 Handle<Object> no_caller; 1174 Handle<Object> no_caller;
1102 Handle<String> msg = FormatMessage(isolate, template_index, arg0, arg1, arg2); 1175 Handle<String> msg = FormatMessage(isolate, template_index, arg0, arg1, arg2);
1103 return ErrorUtils::Construct(isolate, constructor, constructor, msg, mode, 1176 return ErrorUtils::Construct(isolate, constructor, constructor, msg, mode,
1104 no_caller, false); 1177 no_caller, false);
1105 } 1178 }
1106 1179
1107 } // namespace internal 1180 } // namespace internal
1108 } // namespace v8 1181 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698