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

Side by Side Diff: src/execution.cc

Issue 516913003: Do not expose termination exceptions to the Exception API. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: address comment Created 6 years, 3 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/execution.h ('k') | src/factory.h » ('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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/execution.h" 5 #include "src/execution.h"
6 6
7 #include "src/bootstrapper.h" 7 #include "src/bootstrapper.h"
8 #include "src/codegen.h" 8 #include "src/codegen.h"
9 #include "src/deoptimizer.h" 9 #include "src/deoptimizer.h"
10 #include "src/isolate-inl.h" 10 #include "src/isolate-inl.h"
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 143
144 144
145 MaybeHandle<Object> Execution::New(Handle<JSFunction> func, 145 MaybeHandle<Object> Execution::New(Handle<JSFunction> func,
146 int argc, 146 int argc,
147 Handle<Object> argv[]) { 147 Handle<Object> argv[]) {
148 return Invoke(true, func, handle(func->global_proxy()), argc, argv); 148 return Invoke(true, func, handle(func->global_proxy()), argc, argv);
149 } 149 }
150 150
151 151
152 MaybeHandle<Object> Execution::TryCall(Handle<JSFunction> func, 152 MaybeHandle<Object> Execution::TryCall(Handle<JSFunction> func,
153 Handle<Object> receiver, 153 Handle<Object> receiver, int argc,
154 int argc,
155 Handle<Object> args[], 154 Handle<Object> args[],
156 Handle<Object>* exception_out) { 155 MaybeHandle<Object>* exception_out) {
156 bool is_termination = false;
157 Isolate* isolate = func->GetIsolate();
158 MaybeHandle<Object> maybe_result;
159 if (exception_out != NULL) *exception_out = MaybeHandle<Object>();
157 // Enter a try-block while executing the JavaScript code. To avoid 160 // Enter a try-block while executing the JavaScript code. To avoid
158 // duplicate error printing it must be non-verbose. Also, to avoid 161 // duplicate error printing it must be non-verbose. Also, to avoid
159 // creating message objects during stack overflow we shouldn't 162 // creating message objects during stack overflow we shouldn't
160 // capture messages. 163 // capture messages.
161 v8::TryCatch catcher; 164 {
162 catcher.SetVerbose(false); 165 v8::TryCatch catcher;
163 catcher.SetCaptureMessage(false); 166 catcher.SetVerbose(false);
167 catcher.SetCaptureMessage(false);
164 168
165 // Get isolate now, because handle might be persistent 169 maybe_result = Invoke(false, func, receiver, argc, args);
166 // and get destroyed in the next call.
167 Isolate* isolate = func->GetIsolate();
168 MaybeHandle<Object> maybe_result = Invoke(false, func, receiver, argc, args);
169 170
170 if (maybe_result.is_null()) { 171 if (maybe_result.is_null()) {
171 DCHECK(catcher.HasCaught()); 172 DCHECK(catcher.HasCaught());
172 DCHECK(isolate->has_pending_exception()); 173 DCHECK(isolate->has_pending_exception());
173 DCHECK(isolate->external_caught_exception()); 174 DCHECK(isolate->external_caught_exception());
174 if (exception_out != NULL) { 175 if (exception_out != NULL) {
175 if (isolate->pending_exception() == 176 if (isolate->pending_exception() ==
176 isolate->heap()->termination_exception()) { 177 isolate->heap()->termination_exception()) {
177 *exception_out = isolate->factory()->termination_exception(); 178 is_termination = true;
178 } else { 179 } else {
179 *exception_out = v8::Utils::OpenHandle(*catcher.Exception()); 180 *exception_out = v8::Utils::OpenHandle(*catcher.Exception());
181 }
180 } 182 }
183 isolate->OptionalRescheduleException(true);
181 } 184 }
182 isolate->OptionalRescheduleException(true); 185
186 DCHECK(!isolate->has_pending_exception());
187 DCHECK(!isolate->external_caught_exception());
183 } 188 }
184 189 if (is_termination) isolate->TerminateExecution();
185 DCHECK(!isolate->has_pending_exception());
186 DCHECK(!isolate->external_caught_exception());
187 return maybe_result; 190 return maybe_result;
188 } 191 }
189 192
190 193
191 Handle<Object> Execution::GetFunctionDelegate(Isolate* isolate, 194 Handle<Object> Execution::GetFunctionDelegate(Isolate* isolate,
192 Handle<Object> object) { 195 Handle<Object> object) {
193 DCHECK(!object->IsJSFunction()); 196 DCHECK(!object->IsJSFunction());
194 Factory* factory = isolate->factory(); 197 Factory* factory = isolate->factory();
195 198
196 // If you return a function from here, it will be called when an 199 // If you return a function from here, it will be called when an
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 // Objects created through the API can have an instance-call handler 232 // Objects created through the API can have an instance-call handler
230 // that should be used when calling the object as a function. 233 // that should be used when calling the object as a function.
231 if (fun->IsHeapObject() && 234 if (fun->IsHeapObject() &&
232 HeapObject::cast(fun)->map()->has_instance_call_handler()) { 235 HeapObject::cast(fun)->map()->has_instance_call_handler()) {
233 return Handle<JSFunction>( 236 return Handle<JSFunction>(
234 isolate->native_context()->call_as_function_delegate()); 237 isolate->native_context()->call_as_function_delegate());
235 } 238 }
236 239
237 // If the Object doesn't have an instance-call handler we should 240 // If the Object doesn't have an instance-call handler we should
238 // throw a non-callable exception. 241 // throw a non-callable exception.
239 i::Handle<i::Object> error_obj = isolate->factory()->NewTypeError( 242 THROW_NEW_ERROR(isolate, NewTypeError("called_non_callable",
240 "called_non_callable", i::HandleVector<i::Object>(&object, 1)); 243 i::HandleVector<i::Object>(&object, 1)),
241 244 Object);
242 return isolate->Throw<Object>(error_obj);
243 } 245 }
244 246
245 247
246 Handle<Object> Execution::GetConstructorDelegate(Isolate* isolate, 248 Handle<Object> Execution::GetConstructorDelegate(Isolate* isolate,
247 Handle<Object> object) { 249 Handle<Object> object) {
248 DCHECK(!object->IsJSFunction()); 250 DCHECK(!object->IsJSFunction());
249 251
250 // If you return a function from here, it will be called when an 252 // If you return a function from here, it will be called when an
251 // attempt is made to call the given object as a constructor. 253 // attempt is made to call the given object as a constructor.
252 254
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 // Objects created through the API can have an instance-call handler 288 // Objects created through the API can have an instance-call handler
287 // that should be used when calling the object as a function. 289 // that should be used when calling the object as a function.
288 if (fun->IsHeapObject() && 290 if (fun->IsHeapObject() &&
289 HeapObject::cast(fun)->map()->has_instance_call_handler()) { 291 HeapObject::cast(fun)->map()->has_instance_call_handler()) {
290 return Handle<JSFunction>( 292 return Handle<JSFunction>(
291 isolate->native_context()->call_as_constructor_delegate()); 293 isolate->native_context()->call_as_constructor_delegate());
292 } 294 }
293 295
294 // If the Object doesn't have an instance-call handler we should 296 // If the Object doesn't have an instance-call handler we should
295 // throw a non-callable exception. 297 // throw a non-callable exception.
296 i::Handle<i::Object> error_obj = isolate->factory()->NewTypeError( 298 THROW_NEW_ERROR(isolate, NewTypeError("called_non_callable",
297 "called_non_callable", i::HandleVector<i::Object>(&object, 1)); 299 i::HandleVector<i::Object>(&object, 1)),
298 return isolate->Throw<Object>(error_obj); 300 Object);
299 } 301 }
300 302
301 303
302 void StackGuard::EnableInterrupts() { 304 void StackGuard::EnableInterrupts() {
303 ExecutionAccess access(isolate_); 305 ExecutionAccess access(isolate_);
304 if (has_pending_interrupts(access)) { 306 if (has_pending_interrupts(access)) {
305 set_interrupt_limits(access); 307 set_interrupt_limits(access);
306 } 308 }
307 } 309 }
308 310
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 } 700 }
699 701
700 isolate_->counters()->stack_interrupts()->Increment(); 702 isolate_->counters()->stack_interrupts()->Increment();
701 isolate_->counters()->runtime_profiler_ticks()->Increment(); 703 isolate_->counters()->runtime_profiler_ticks()->Increment();
702 isolate_->runtime_profiler()->OptimizeNow(); 704 isolate_->runtime_profiler()->OptimizeNow();
703 705
704 return isolate_->heap()->undefined_value(); 706 return isolate_->heap()->undefined_value();
705 } 707 }
706 708
707 } } // namespace v8::internal 709 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/execution.h ('k') | src/factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698