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

Side by Side Diff: src/isolate.cc

Issue 240053010: Return Object* instead of MaybeObject* from runtime calls. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: cmpp Created 6 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « src/isolate.h ('k') | src/mips/code-stubs-mips.cc » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 VMState<EXTERNAL> state(this); 800 VMState<EXTERNAL> state(this);
801 return callback( 801 return callback(
802 v8::Utils::ToLocal(receiver), index, type, v8::Utils::ToLocal(data)); 802 v8::Utils::ToLocal(receiver), index, type, v8::Utils::ToLocal(data));
803 } 803 }
804 804
805 805
806 const char* const Isolate::kStackOverflowMessage = 806 const char* const Isolate::kStackOverflowMessage =
807 "Uncaught RangeError: Maximum call stack size exceeded"; 807 "Uncaught RangeError: Maximum call stack size exceeded";
808 808
809 809
810 Failure* Isolate::StackOverflow() { 810 Object* Isolate::StackOverflow() {
811 HandleScope scope(this); 811 HandleScope scope(this);
812 // At this point we cannot create an Error object using its javascript 812 // At this point we cannot create an Error object using its javascript
813 // constructor. Instead, we copy the pre-constructed boilerplate and 813 // constructor. Instead, we copy the pre-constructed boilerplate and
814 // attach the stack trace as a hidden property. 814 // attach the stack trace as a hidden property.
815 Handle<String> key = factory()->stack_overflow_string(); 815 Handle<String> key = factory()->stack_overflow_string();
816 Handle<JSObject> boilerplate = Handle<JSObject>::cast( 816 Handle<JSObject> boilerplate = Handle<JSObject>::cast(
817 Object::GetProperty(js_builtins_object(), key).ToHandleChecked()); 817 Object::GetProperty(js_builtins_object(), key).ToHandleChecked());
818 Handle<JSObject> exception = JSObject::Copy(boilerplate); 818 Handle<JSObject> exception = JSObject::Copy(boilerplate);
819 DoThrow(*exception, NULL); 819 DoThrow(*exception, NULL);
820 820
821 // Get stack trace limit. 821 // Get stack trace limit.
822 Handle<Object> error = Object::GetProperty( 822 Handle<Object> error = Object::GetProperty(
823 this, js_builtins_object(), "$Error").ToHandleChecked(); 823 this, js_builtins_object(), "$Error").ToHandleChecked();
824 if (!error->IsJSObject()) return Failure::Exception(); 824 if (!error->IsJSObject()) return heap()->exception();
825 825
826 Handle<String> stackTraceLimit = 826 Handle<String> stackTraceLimit =
827 factory()->InternalizeUtf8String("stackTraceLimit"); 827 factory()->InternalizeUtf8String("stackTraceLimit");
828 ASSERT(!stackTraceLimit.is_null()); 828 ASSERT(!stackTraceLimit.is_null());
829 Handle<Object> stack_trace_limit = 829 Handle<Object> stack_trace_limit =
830 JSObject::GetDataProperty(Handle<JSObject>::cast(error), 830 JSObject::GetDataProperty(Handle<JSObject>::cast(error),
831 stackTraceLimit); 831 stackTraceLimit);
832 if (!stack_trace_limit->IsNumber()) return Failure::Exception(); 832 if (!stack_trace_limit->IsNumber()) return heap()->exception();
833 double dlimit = stack_trace_limit->Number(); 833 double dlimit = stack_trace_limit->Number();
834 int limit = std::isnan(dlimit) ? 0 : static_cast<int>(dlimit); 834 int limit = std::isnan(dlimit) ? 0 : static_cast<int>(dlimit);
835 835
836 Handle<JSArray> stack_trace = CaptureSimpleStackTrace( 836 Handle<JSArray> stack_trace = CaptureSimpleStackTrace(
837 exception, factory()->undefined_value(), limit); 837 exception, factory()->undefined_value(), limit);
838 JSObject::SetHiddenProperty(exception, 838 JSObject::SetHiddenProperty(exception,
839 factory()->hidden_stack_trace_string(), 839 factory()->hidden_stack_trace_string(),
840 stack_trace); 840 stack_trace);
841 return Failure::Exception(); 841 return heap()->exception();
842 } 842 }
843 843
844 844
845 Failure* Isolate::TerminateExecution() { 845 Object* Isolate::TerminateExecution() {
846 DoThrow(heap_.termination_exception(), NULL); 846 DoThrow(heap_.termination_exception(), NULL);
847 return Failure::Exception(); 847 return heap()->exception();
848 } 848 }
849 849
850 850
851 void Isolate::CancelTerminateExecution() { 851 void Isolate::CancelTerminateExecution() {
852 if (try_catch_handler()) { 852 if (try_catch_handler()) {
853 try_catch_handler()->has_terminated_ = false; 853 try_catch_handler()->has_terminated_ = false;
854 } 854 }
855 if (has_pending_exception() && 855 if (has_pending_exception() &&
856 pending_exception() == heap_.termination_exception()) { 856 pending_exception() == heap_.termination_exception()) {
857 thread_local_top()->external_caught_exception_ = false; 857 thread_local_top()->external_caught_exception_ = false;
858 clear_pending_exception(); 858 clear_pending_exception();
859 } 859 }
860 if (has_scheduled_exception() && 860 if (has_scheduled_exception() &&
861 scheduled_exception() == heap_.termination_exception()) { 861 scheduled_exception() == heap_.termination_exception()) {
862 thread_local_top()->external_caught_exception_ = false; 862 thread_local_top()->external_caught_exception_ = false;
863 clear_scheduled_exception(); 863 clear_scheduled_exception();
864 } 864 }
865 } 865 }
866 866
867 867
868 Failure* Isolate::Throw(Object* exception, MessageLocation* location) { 868 Object* Isolate::Throw(Object* exception, MessageLocation* location) {
869 DoThrow(exception, location); 869 DoThrow(exception, location);
870 return Failure::Exception(); 870 return heap()->exception();
871 } 871 }
872 872
873 873
874 Failure* Isolate::ReThrow(Object* exception) { 874 Object* Isolate::ReThrow(Object* exception) {
875 bool can_be_caught_externally = false; 875 bool can_be_caught_externally = false;
876 bool catchable_by_javascript = is_catchable_by_javascript(exception); 876 bool catchable_by_javascript = is_catchable_by_javascript(exception);
877 ShouldReportException(&can_be_caught_externally, catchable_by_javascript); 877 ShouldReportException(&can_be_caught_externally, catchable_by_javascript);
878 878
879 thread_local_top()->catcher_ = can_be_caught_externally ? 879 thread_local_top()->catcher_ = can_be_caught_externally ?
880 try_catch_handler() : NULL; 880 try_catch_handler() : NULL;
881 881
882 // Set the exception being re-thrown. 882 // Set the exception being re-thrown.
883 set_pending_exception(exception); 883 set_pending_exception(exception);
884 return Failure::Exception(); 884 return heap()->exception();
885 } 885 }
886 886
887 887
888 Failure* Isolate::ThrowIllegalOperation() { 888 Object* Isolate::ThrowIllegalOperation() {
889 if (FLAG_stack_trace_on_illegal) PrintStack(stdout); 889 if (FLAG_stack_trace_on_illegal) PrintStack(stdout);
890 return Throw(heap_.illegal_access_string()); 890 return Throw(heap_.illegal_access_string());
891 } 891 }
892 892
893 893
894 Failure* Isolate::ThrowInvalidStringLength() { 894 Object* Isolate::ThrowInvalidStringLength() {
895 return Throw(*factory()->NewRangeError( 895 return Throw(*factory()->NewRangeError(
896 "invalid_string_length", HandleVector<Object>(NULL, 0))); 896 "invalid_string_length", HandleVector<Object>(NULL, 0)));
897 } 897 }
898 898
899 899
900 void Isolate::ScheduleThrow(Object* exception) { 900 void Isolate::ScheduleThrow(Object* exception) {
901 // When scheduling a throw we first throw the exception to get the 901 // When scheduling a throw we first throw the exception to get the
902 // error reporting if it is uncaught before rescheduling it. 902 // error reporting if it is uncaught before rescheduling it.
903 Throw(exception); 903 Throw(exception);
904 PropagatePendingExceptionToExternalTryCatch(); 904 PropagatePendingExceptionToExternalTryCatch();
(...skipping 14 matching lines...) Expand all
919 Object* script = reinterpret_cast<Object*>(handler->message_script_); 919 Object* script = reinterpret_cast<Object*>(handler->message_script_);
920 ASSERT(message->IsJSMessageObject() || message->IsTheHole()); 920 ASSERT(message->IsJSMessageObject() || message->IsTheHole());
921 ASSERT(script->IsScript() || script->IsTheHole()); 921 ASSERT(script->IsScript() || script->IsTheHole());
922 thread_local_top()->pending_message_obj_ = message; 922 thread_local_top()->pending_message_obj_ = message;
923 thread_local_top()->pending_message_script_ = script; 923 thread_local_top()->pending_message_script_ = script;
924 thread_local_top()->pending_message_start_pos_ = handler->message_start_pos_; 924 thread_local_top()->pending_message_start_pos_ = handler->message_start_pos_;
925 thread_local_top()->pending_message_end_pos_ = handler->message_end_pos_; 925 thread_local_top()->pending_message_end_pos_ = handler->message_end_pos_;
926 } 926 }
927 927
928 928
929 Failure* Isolate::PromoteScheduledException() { 929 Object* Isolate::PromoteScheduledException() {
930 Object* thrown = scheduled_exception(); 930 Object* thrown = scheduled_exception();
931 clear_scheduled_exception(); 931 clear_scheduled_exception();
932 // Re-throw the exception to avoid getting repeated error reporting. 932 // Re-throw the exception to avoid getting repeated error reporting.
933 return ReThrow(thrown); 933 return ReThrow(thrown);
934 } 934 }
935 935
936 936
937 void Isolate::PrintCurrentStackTrace(FILE* out) { 937 void Isolate::PrintCurrentStackTrace(FILE* out) {
938 StackTraceFrameIterator it(this); 938 StackTraceFrameIterator it(this);
939 while (!it.done()) { 939 while (!it.done()) {
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
1209 return true; 1209 return true;
1210 } 1210 }
1211 1211
1212 1212
1213 void Isolate::ReportPendingMessages() { 1213 void Isolate::ReportPendingMessages() {
1214 ASSERT(has_pending_exception()); 1214 ASSERT(has_pending_exception());
1215 PropagatePendingExceptionToExternalTryCatch(); 1215 PropagatePendingExceptionToExternalTryCatch();
1216 1216
1217 HandleScope scope(this); 1217 HandleScope scope(this);
1218 if (thread_local_top_.pending_exception_ == 1218 if (thread_local_top_.pending_exception_ ==
1219 heap()->termination_exception()) { 1219 heap()->termination_exception()) {
1220 // Do nothing: if needed, the exception has been already propagated to 1220 // Do nothing: if needed, the exception has been already propagated to
1221 // v8::TryCatch. 1221 // v8::TryCatch.
1222 } else { 1222 } else {
1223 if (thread_local_top_.has_pending_message_) { 1223 if (thread_local_top_.has_pending_message_) {
1224 thread_local_top_.has_pending_message_ = false; 1224 thread_local_top_.has_pending_message_ = false;
1225 if (!thread_local_top_.pending_message_obj_->IsTheHole()) { 1225 if (!thread_local_top_.pending_message_obj_->IsTheHole()) {
1226 HandleScope scope(this); 1226 HandleScope scope(this);
1227 Handle<Object> message_obj(thread_local_top_.pending_message_obj_, 1227 Handle<Object> message_obj(thread_local_top_.pending_message_obj_,
1228 this); 1228 this);
1229 if (!thread_local_top_.pending_message_script_->IsTheHole()) { 1229 if (!thread_local_top_.pending_message_script_->IsTheHole()) {
(...skipping 1020 matching lines...) Expand 10 before | Expand all | Expand 10 after
2250 Handle<JSObject> obj = factory()->NewJSObjectFromMap(map); 2250 Handle<JSObject> obj = factory()->NewJSObjectFromMap(map);
2251 JSObject::NormalizeProperties(obj, KEEP_INOBJECT_PROPERTIES, 8); 2251 JSObject::NormalizeProperties(obj, KEEP_INOBJECT_PROPERTIES, 8);
2252 JSObject::SetProperty(registry, name, obj, NONE, STRICT).Assert(); 2252 JSObject::SetProperty(registry, name, obj, NONE, STRICT).Assert();
2253 } 2253 }
2254 } 2254 }
2255 return Handle<JSObject>::cast(factory()->symbol_registry()); 2255 return Handle<JSObject>::cast(factory()->symbol_registry());
2256 } 2256 }
2257 2257
2258 2258
2259 } } // namespace v8::internal 2259 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/isolate.h ('k') | src/mips/code-stubs-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698