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

Side by Side Diff: src/api.cc

Issue 1015083002: convert last api functions which try to handle exceptions to maybes (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 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') | no next file » | 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 // 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/api.h" 5 #include "src/api.h"
6 6
7 #include <string.h> // For memcpy, strlen. 7 #include <string.h> // For memcpy, strlen.
8 #ifdef V8_USE_ADDRESS_SANITIZER 8 #ifdef V8_USE_ADDRESS_SANITIZER
9 #include <sanitizer/asan_interface.h> 9 #include <sanitizer/asan_interface.h>
10 #endif // V8_USE_ADDRESS_SANITIZER 10 #endif // V8_USE_ADDRESS_SANITIZER
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 #include "src/sampler.h" 45 #include "src/sampler.h"
46 #include "src/scanner-character-streams.h" 46 #include "src/scanner-character-streams.h"
47 #include "src/simulator.h" 47 #include "src/simulator.h"
48 #include "src/snapshot.h" 48 #include "src/snapshot.h"
49 #include "src/unicode-inl.h" 49 #include "src/unicode-inl.h"
50 #include "src/v8threads.h" 50 #include "src/v8threads.h"
51 #include "src/version.h" 51 #include "src/version.h"
52 #include "src/vm-state-inl.h" 52 #include "src/vm-state-inl.h"
53 53
54 54
55 namespace v8 {
56
55 #define LOG_API(isolate, expr) LOG(isolate, ApiEntryCall(expr)) 57 #define LOG_API(isolate, expr) LOG(isolate, ApiEntryCall(expr))
56 58
57 #define ENTER_V8(isolate) \
58 i::VMState<v8::OTHER> __state__((isolate))
59 59
60 namespace v8 { 60 #define ENTER_V8(isolate) i::VMState<v8::OTHER> __state__((isolate))
61
62 #define EXCEPTION_PREAMBLE(isolate) \
63 (isolate)->handle_scope_implementer()->IncrementCallDepth(); \
64 DCHECK(!(isolate)->external_caught_exception()); \
65 bool has_pending_exception = false
66
67
68 #define EXCEPTION_BAILOUT_CHECK(isolate, value) \
69 do { \
70 i::HandleScopeImplementer* handle_scope_implementer = \
71 (isolate)->handle_scope_implementer(); \
72 handle_scope_implementer->DecrementCallDepth(); \
73 if (has_pending_exception) { \
74 bool call_depth_is_zero = handle_scope_implementer->CallDepthIsZero(); \
75 (isolate)->OptionalRescheduleException(call_depth_is_zero); \
76 return value; \
77 } \
78 } while (false)
79 61
80 62
81 #define PREPARE_FOR_EXECUTION_GENERIC(isolate, context, function_name, \ 63 #define PREPARE_FOR_EXECUTION_GENERIC(isolate, context, function_name, \
82 bailout_value, HandleScopeClass, \ 64 bailout_value, HandleScopeClass, \
83 do_callback) \ 65 do_callback) \
84 if (IsExecutionTerminatingCheck(isolate)) { \ 66 if (IsExecutionTerminatingCheck(isolate)) { \
85 return bailout_value; \ 67 return bailout_value; \
86 } \ 68 } \
87 HandleScopeClass handle_scope(isolate); \ 69 HandleScopeClass handle_scope(isolate); \
88 CallDepthScope call_depth_scope(isolate, context, do_callback); \ 70 CallDepthScope call_depth_scope(isolate, context, do_callback); \
(...skipping 2004 matching lines...) Expand 10 before | Expand all | Expand 10 after
2093 if (HasCaught()) { 2075 if (HasCaught()) {
2094 // Check for out of memory exception. 2076 // Check for out of memory exception.
2095 i::Object* exception = reinterpret_cast<i::Object*>(exception_); 2077 i::Object* exception = reinterpret_cast<i::Object*>(exception_);
2096 return v8::Utils::ToLocal(i::Handle<i::Object>(exception, isolate_)); 2078 return v8::Utils::ToLocal(i::Handle<i::Object>(exception, isolate_));
2097 } else { 2079 } else {
2098 return v8::Local<Value>(); 2080 return v8::Local<Value>();
2099 } 2081 }
2100 } 2082 }
2101 2083
2102 2084
2085 MaybeLocal<Value> v8::TryCatch::StackTrace(Local<Context> context) const {
2086 if (!HasCaught()) return v8::Local<Value>();
2087 i::Object* raw_obj = reinterpret_cast<i::Object*>(exception_);
2088 if (!raw_obj->IsJSObject()) return v8::Local<Value>();
2089 PREPARE_FOR_EXECUTION(context, "v8::TryCatch::StackTrace", Value);
2090 i::Handle<i::JSObject> obj(i::JSObject::cast(raw_obj), isolate_);
2091 i::Handle<i::String> name = isolate->factory()->stack_string();
2092 Maybe<bool> maybe = i::JSReceiver::HasProperty(obj, name);
2093 has_pending_exception = !maybe.IsJust();
2094 RETURN_ON_FAILED_EXECUTION(Value);
2095 if (!maybe.FromJust()) return v8::Local<Value>();
2096 Local<Value> result;
2097 has_pending_exception =
2098 !ToLocal<Value>(i::Object::GetProperty(obj, name), &result);
2099 RETURN_ON_FAILED_EXECUTION(Value);
2100 RETURN_ESCAPED(result);
2101 }
2102
2103
2103 v8::Local<Value> v8::TryCatch::StackTrace() const { 2104 v8::Local<Value> v8::TryCatch::StackTrace() const {
2104 if (HasCaught()) { 2105 auto context = reinterpret_cast<v8::Isolate*>(isolate_)->GetCurrentContext();
2105 i::Object* raw_obj = reinterpret_cast<i::Object*>(exception_); 2106 RETURN_TO_LOCAL_UNCHECKED(StackTrace(context), Value);
2106 if (!raw_obj->IsJSObject()) return v8::Local<Value>();
2107 i::HandleScope scope(isolate_);
2108 i::Handle<i::JSObject> obj(i::JSObject::cast(raw_obj), isolate_);
2109 i::Handle<i::String> name = isolate_->factory()->stack_string();
2110 {
2111 EXCEPTION_PREAMBLE(isolate_);
2112 Maybe<bool> maybe = i::JSReceiver::HasProperty(obj, name);
2113 has_pending_exception = !maybe.IsJust();
2114 EXCEPTION_BAILOUT_CHECK(isolate_, v8::Local<Value>());
2115 if (!maybe.FromJust()) return v8::Local<Value>();
2116 }
2117 i::Handle<i::Object> value;
2118 EXCEPTION_PREAMBLE(isolate_);
2119 has_pending_exception = !i::Object::GetProperty(obj, name).ToHandle(&value);
2120 EXCEPTION_BAILOUT_CHECK(isolate_, v8::Local<Value>());
2121 return v8::Utils::ToLocal(scope.CloseAndEscape(value));
2122 } else {
2123 return v8::Local<Value>();
2124 }
2125 } 2107 }
2126 2108
2127 2109
2128 v8::Local<v8::Message> v8::TryCatch::Message() const { 2110 v8::Local<v8::Message> v8::TryCatch::Message() const {
2129 i::Object* message = reinterpret_cast<i::Object*>(message_obj_); 2111 i::Object* message = reinterpret_cast<i::Object*>(message_obj_);
2130 DCHECK(message->IsJSMessageObject() || message->IsTheHole()); 2112 DCHECK(message->IsJSMessageObject() || message->IsTheHole());
2131 if (HasCaught() && !message->IsTheHole()) { 2113 if (HasCaught() && !message->IsTheHole()) {
2132 return v8::Utils::MessageToLocal(i::Handle<i::Object>(message, isolate_)); 2114 return v8::Utils::MessageToLocal(i::Handle<i::Object>(message, isolate_));
2133 } else { 2115 } else {
2134 return v8::Local<v8::Message>(); 2116 return v8::Local<v8::Message>();
(...skipping 3866 matching lines...) Expand 10 before | Expand all | Expand 10 after
6001 Local<v8::Symbol> v8::SymbolObject::ValueOf() const { 5983 Local<v8::Symbol> v8::SymbolObject::ValueOf() const {
6002 i::Handle<i::Object> obj = Utils::OpenHandle(this); 5984 i::Handle<i::Object> obj = Utils::OpenHandle(this);
6003 i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); 5985 i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj);
6004 i::Isolate* isolate = jsvalue->GetIsolate(); 5986 i::Isolate* isolate = jsvalue->GetIsolate();
6005 LOG_API(isolate, "SymbolObject::SymbolValue"); 5987 LOG_API(isolate, "SymbolObject::SymbolValue");
6006 return Utils::ToLocal( 5988 return Utils::ToLocal(
6007 i::Handle<i::Symbol>(i::Symbol::cast(jsvalue->value()))); 5989 i::Handle<i::Symbol>(i::Symbol::cast(jsvalue->value())));
6008 } 5990 }
6009 5991
6010 5992
5993 MaybeLocal<v8::Value> v8::Date::New(Local<Context> context, double time) {
5994 if (std::isnan(time)) {
5995 // Introduce only canonical NaN value into the VM, to avoid signaling NaNs.
5996 time = std::numeric_limits<double>::quiet_NaN();
5997 }
5998 PREPARE_FOR_EXECUTION(context, "Date::New", Value);
5999 Local<Value> result;
6000 has_pending_exception =
6001 !ToLocal<Value>(i::Execution::NewDate(isolate, time), &result);
6002 RETURN_ON_FAILED_EXECUTION(Value);
6003 RETURN_ESCAPED(result);
6004 }
6005
6006
6011 Local<v8::Value> v8::Date::New(Isolate* isolate, double time) { 6007 Local<v8::Value> v8::Date::New(Isolate* isolate, double time) {
6012 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 6008 auto context = isolate->GetCurrentContext();
6013 LOG_API(i_isolate, "Date::New"); 6009 RETURN_TO_LOCAL_UNCHECKED(New(context, time), Value);
6014 if (std::isnan(time)) {
6015 // Introduce only canonical NaN value into the VM, to avoid signaling NaNs.
6016 time = std::numeric_limits<double>::quiet_NaN();
6017 }
6018 ENTER_V8(i_isolate);
6019 EXCEPTION_PREAMBLE(i_isolate);
6020 i::Handle<i::Object> obj;
6021 has_pending_exception = !i::Execution::NewDate(
6022 i_isolate, time).ToHandle(&obj);
6023 EXCEPTION_BAILOUT_CHECK(i_isolate, Local<v8::Value>());
6024 return Utils::ToLocal(obj);
6025 } 6010 }
6026 6011
6027 6012
6028 double v8::Date::ValueOf() const { 6013 double v8::Date::ValueOf() const {
6029 i::Handle<i::Object> obj = Utils::OpenHandle(this); 6014 i::Handle<i::Object> obj = Utils::OpenHandle(this);
6030 i::Handle<i::JSDate> jsdate = i::Handle<i::JSDate>::cast(obj); 6015 i::Handle<i::JSDate> jsdate = i::Handle<i::JSDate>::cast(obj);
6031 i::Isolate* isolate = jsdate->GetIsolate(); 6016 i::Isolate* isolate = jsdate->GetIsolate();
6032 LOG_API(isolate, "Date::NumberValue"); 6017 LOG_API(isolate, "Date::NumberValue");
6033 return jsdate->value()->Number(); 6018 return jsdate->value()->Number();
6034 } 6019 }
(...skipping 1990 matching lines...) Expand 10 before | Expand all | Expand 10 after
8025 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); 8010 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate());
8026 Address callback_address = 8011 Address callback_address =
8027 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 8012 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
8028 VMState<EXTERNAL> state(isolate); 8013 VMState<EXTERNAL> state(isolate);
8029 ExternalCallbackScope call_scope(isolate, callback_address); 8014 ExternalCallbackScope call_scope(isolate, callback_address);
8030 callback(info); 8015 callback(info);
8031 } 8016 }
8032 8017
8033 8018
8034 } } // namespace v8::internal 8019 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « include/v8.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698