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

Side by Side Diff: src/js/messages.js

Issue 2142933003: Move Error methods to C++ (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 4 years, 5 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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 // ------------------------------------------------------------------- 5 // -------------------------------------------------------------------
6 6
7 (function(global, utils) { 7 (function(global, utils) {
8 8
9 %CheckIsBootstrapping(); 9 %CheckIsBootstrapping();
10 10
(...skipping 15 matching lines...) Expand all
26 var callSiteStrictSymbol = 26 var callSiteStrictSymbol =
27 utils.ImportNow("call_site_strict_symbol"); 27 utils.ImportNow("call_site_strict_symbol");
28 var callSiteWasmObjectSymbol = 28 var callSiteWasmObjectSymbol =
29 utils.ImportNow("call_site_wasm_obj_symbol"); 29 utils.ImportNow("call_site_wasm_obj_symbol");
30 var callSiteWasmFunctionIndexSymbol = 30 var callSiteWasmFunctionIndexSymbol =
31 utils.ImportNow("call_site_wasm_func_index_symbol"); 31 utils.ImportNow("call_site_wasm_func_index_symbol");
32 var Float32x4ToString; 32 var Float32x4ToString;
33 var formattedStackTraceSymbol = 33 var formattedStackTraceSymbol =
34 utils.ImportNow("formatted_stack_trace_symbol"); 34 utils.ImportNow("formatted_stack_trace_symbol");
35 var GlobalObject = global.Object; 35 var GlobalObject = global.Object;
36 var GlobalError = global.Error;
37 var GlobalEvalError = global.EvalError;
38 var GlobalRangeError = global.RangeError;
39 var GlobalReferenceError = global.ReferenceError;
40 var GlobalSyntaxError = global.SyntaxError;
41 var GlobalTypeError = global.TypeError;
42 var GlobalURIError = global.URIError;
36 var Int16x8ToString; 43 var Int16x8ToString;
37 var Int32x4ToString; 44 var Int32x4ToString;
38 var Int8x16ToString; 45 var Int8x16ToString;
39 var InternalArray = utils.InternalArray; 46 var InternalArray = utils.InternalArray;
40 var internalErrorSymbol = utils.ImportNow("internal_error_symbol"); 47 var internalErrorSymbol = utils.ImportNow("internal_error_symbol");
41 var ObjectHasOwnProperty; 48 var ObjectHasOwnProperty;
42 var ObjectToString = utils.ImportNow("object_to_string"); 49 var ObjectToString = utils.ImportNow("object_to_string");
43 var Script = utils.ImportNow("Script"); 50 var Script = utils.ImportNow("Script");
44 var stackTraceSymbol = utils.ImportNow("stack_trace_symbol"); 51 var stackTraceSymbol = utils.ImportNow("stack_trace_symbol");
45 var StringIndexOf; 52 var StringIndexOf;
(...skipping 13 matching lines...) Expand all
59 Int8x16ToString = from.Int8x16ToString; 66 Int8x16ToString = from.Int8x16ToString;
60 ObjectHasOwnProperty = from.ObjectHasOwnProperty; 67 ObjectHasOwnProperty = from.ObjectHasOwnProperty;
61 StringIndexOf = from.StringIndexOf; 68 StringIndexOf = from.StringIndexOf;
62 Uint16x8ToString = from.Uint16x8ToString; 69 Uint16x8ToString = from.Uint16x8ToString;
63 Uint32x4ToString = from.Uint32x4ToString; 70 Uint32x4ToString = from.Uint32x4ToString;
64 Uint8x16ToString = from.Uint8x16ToString; 71 Uint8x16ToString = from.Uint8x16ToString;
65 }); 72 });
66 73
67 // ------------------------------------------------------------------- 74 // -------------------------------------------------------------------
68 75
69 var GlobalError;
70 var GlobalTypeError;
71 var GlobalRangeError;
72 var GlobalURIError;
73 var GlobalSyntaxError;
74 var GlobalReferenceError;
75 var GlobalEvalError;
76 76
77 77
78 function NoSideEffectsObjectToString() { 78 function NoSideEffectsObjectToString() {
79 if (IS_UNDEFINED(this)) return "[object Undefined]"; 79 if (IS_UNDEFINED(this)) return "[object Undefined]";
80 if (IS_NULL(this)) return "[object Null]"; 80 if (IS_NULL(this)) return "[object Null]";
81 var O = TO_OBJECT(this); 81 var O = TO_OBJECT(this);
82 var builtinTag = %_ClassOf(O); 82 var builtinTag = %_ClassOf(O);
83 var tag = %GetDataProperty(O, toStringTagSymbol); 83 var tag = %GetDataProperty(O, toStringTagSymbol);
84 if (!IS_STRING(tag)) { 84 if (!IS_STRING(tag)) {
85 tag = builtinTag; 85 tag = builtinTag;
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 return %_Call(ArrayJoin, lines, "\n"); 595 return %_Call(ArrayJoin, lines, "\n");
596 } 596 }
597 597
598 598
599 function GetTypeName(receiver, requireConstructor) { 599 function GetTypeName(receiver, requireConstructor) {
600 if (IS_NULL_OR_UNDEFINED(receiver)) return null; 600 if (IS_NULL_OR_UNDEFINED(receiver)) return null;
601 if (IS_PROXY(receiver)) return "Proxy"; 601 if (IS_PROXY(receiver)) return "Proxy";
602 return %GetConstructorName(receiver); 602 return %GetConstructorName(receiver);
603 } 603 }
604 604
605
606 // Format the stack trace if not yet done, and return it.
607 // Cache the formatted stack trace on the holder.
608 var StackTraceGetter = function() {
609 var formatted_stack_trace = UNDEFINED;
610 var holder = this;
611 while (holder) {
612 var formatted_stack_trace =
613 GET_PRIVATE(holder, formattedStackTraceSymbol);
614 if (IS_UNDEFINED(formatted_stack_trace)) {
615 // No formatted stack trace available.
616 var stack_trace = GET_PRIVATE(holder, stackTraceSymbol);
617 if (IS_UNDEFINED(stack_trace)) {
618 // Neither formatted nor structured stack trace available.
619 // Look further up the prototype chain.
620 holder = %object_get_prototype_of(holder);
621 continue;
622 }
623 formatted_stack_trace = FormatStackTrace(holder, stack_trace);
624 SET_PRIVATE(holder, stackTraceSymbol, UNDEFINED);
625 SET_PRIVATE(holder, formattedStackTraceSymbol, formatted_stack_trace);
626 }
627 return formatted_stack_trace;
628 }
629 return UNDEFINED;
630 };
631
632
633 // If the receiver equals the holder, set the formatted stack trace that the
634 // getter returns.
635 var StackTraceSetter = function(v) {
636 if (IsErrorObject(this)) {
637 SET_PRIVATE(this, stackTraceSymbol, UNDEFINED);
638 SET_PRIVATE(this, formattedStackTraceSymbol, v);
639 }
640 };
641
642
643 // Use a dummy function since we do not actually want to capture a stack trace
644 // when constructing the initial Error prototytpes.
645 var captureStackTrace = function() {};
646
647
648 // Set up special error type constructors.
649 function SetUpError(error_function) {
650 %FunctionSetInstanceClassName(error_function, 'Error');
651 var name = error_function.name;
652 var prototype = new GlobalObject();
653 if (name !== 'Error') {
654 %InternalSetPrototype(error_function, GlobalError);
655 %InternalSetPrototype(prototype, GlobalError.prototype);
656 }
657 %FunctionSetPrototype(error_function, prototype);
658
659 %AddNamedProperty(error_function.prototype, 'name', name, DONT_ENUM);
660 %AddNamedProperty(error_function.prototype, 'message', '', DONT_ENUM);
661 %AddNamedProperty(
662 error_function.prototype, 'constructor', error_function, DONT_ENUM);
663
664 %SetCode(error_function, function(m) {
665 if (IS_UNDEFINED(new.target)) return new error_function(m);
666
667 try { captureStackTrace(this, error_function); } catch (e) { }
668 // Define all the expected properties directly on the error
669 // object. This avoids going through getters and setters defined
670 // on prototype objects.
671 if (!IS_UNDEFINED(m)) {
672 %AddNamedProperty(this, 'message', TO_STRING(m), DONT_ENUM);
673 }
674 });
675
676 %SetNativeFlag(error_function);
677 return error_function;
678 };
679
680 GlobalError = SetUpError(global.Error);
681 GlobalEvalError = SetUpError(global.EvalError);
682 GlobalRangeError = SetUpError(global.RangeError);
683 GlobalReferenceError = SetUpError(global.ReferenceError);
684 GlobalSyntaxError = SetUpError(global.SyntaxError);
685 GlobalTypeError = SetUpError(global.TypeError);
686 GlobalURIError = SetUpError(global.URIError);
687
688 utils.InstallFunctions(GlobalError.prototype, DONT_ENUM,
689 ['toString', ErrorToString]);
690
691 function ErrorToString() { 605 function ErrorToString() {
692 if (!IS_RECEIVER(this)) { 606 if (!IS_RECEIVER(this)) {
693 throw MakeTypeError(kCalledOnNonObject, "Error.prototype.toString"); 607 throw MakeTypeError(kCalledOnNonObject, "Error.prototype.toString");
694 } 608 }
695 609
696 var name = this.name; 610 var name = this.name;
697 name = IS_UNDEFINED(name) ? "Error" : TO_STRING(name); 611 name = IS_UNDEFINED(name) ? "Error" : TO_STRING(name);
698 612
699 var message = this.message; 613 var message = this.message;
700 message = IS_UNDEFINED(message) ? "" : TO_STRING(message); 614 message = IS_UNDEFINED(message) ? "" : TO_STRING(message);
(...skipping 19 matching lines...) Expand all
720 return MakeGenericError(GlobalTypeError, type, arg0, arg1, arg2); 634 return MakeGenericError(GlobalTypeError, type, arg0, arg1, arg2);
721 } 635 }
722 636
723 function MakeURIError() { 637 function MakeURIError() {
724 return MakeGenericError(GlobalURIError, kURIMalformed); 638 return MakeGenericError(GlobalURIError, kURIMalformed);
725 } 639 }
726 640
727 // Boilerplate for exceptions for stack overflows. Used from 641 // Boilerplate for exceptions for stack overflows. Used from
728 // Isolate::StackOverflow(). 642 // Isolate::StackOverflow().
729 var StackOverflowBoilerplate = MakeRangeError(kStackOverflow); 643 var StackOverflowBoilerplate = MakeRangeError(kStackOverflow);
730 utils.InstallGetterSetter(StackOverflowBoilerplate, 'stack',
731 StackTraceGetter, StackTraceSetter)
732
733 // Define actual captureStackTrace function after everything has been set up.
734 captureStackTrace = function captureStackTrace(obj, cons_opt) {
735 // Define accessors first, as this may fail and throw.
736 %object_define_property(obj, 'stack', { get: StackTraceGetter,
737 set: StackTraceSetter,
738 configurable: true });
739 %CollectStackTrace(obj, cons_opt ? cons_opt : captureStackTrace);
740 };
741
742 GlobalError.captureStackTrace = captureStackTrace;
743 644
744 %InstallToContext([ 645 %InstallToContext([
646 "error_format_stack_trace", FormatStackTrace,
745 "get_stack_trace_line_fun", GetStackTraceLine, 647 "get_stack_trace_line_fun", GetStackTraceLine,
746 "make_error_function", MakeGenericError, 648 "make_error_function", MakeGenericError,
747 "make_range_error", MakeRangeError, 649 "make_range_error", MakeRangeError,
748 "make_type_error", MakeTypeError, 650 "make_type_error", MakeTypeError,
749 "message_get_column_number", GetColumnNumber, 651 "message_get_column_number", GetColumnNumber,
750 "message_get_line_number", GetLineNumber, 652 "message_get_line_number", GetLineNumber,
751 "message_get_source_line", GetSourceLine, 653 "message_get_source_line", GetSourceLine,
752 "no_side_effects_to_string_fun", NoSideEffectsToString, 654 "no_side_effects_to_string_fun", NoSideEffectsToString,
753 "stack_overflow_boilerplate", StackOverflowBoilerplate, 655 "stack_overflow_boilerplate", StackOverflowBoilerplate,
754 ]); 656 ]);
755 657
756 utils.Export(function(to) { 658 utils.Export(function(to) {
757 to.ErrorToString = ErrorToString; 659 to.ErrorToString = ErrorToString;
758 to.MakeError = MakeError; 660 to.MakeError = MakeError;
759 to.MakeRangeError = MakeRangeError; 661 to.MakeRangeError = MakeRangeError;
760 to.MakeSyntaxError = MakeSyntaxError; 662 to.MakeSyntaxError = MakeSyntaxError;
761 to.MakeTypeError = MakeTypeError; 663 to.MakeTypeError = MakeTypeError;
762 to.MakeURIError = MakeURIError; 664 to.MakeURIError = MakeURIError;
763 }); 665 });
764 666
765 }); 667 });
OLDNEW
« src/builtins/builtins.cc ('K') | « src/isolate.cc ('k') | src/runtime/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698