| Index: src/execution.cc
|
| ===================================================================
|
| --- src/execution.cc (revision 9531)
|
| +++ src/execution.cc (working copy)
|
| @@ -33,6 +33,7 @@
|
| #include "bootstrapper.h"
|
| #include "codegen.h"
|
| #include "debug.h"
|
| +#include "isolate-inl.h"
|
| #include "runtime-profiler.h"
|
| #include "simulator.h"
|
| #include "v8threads.h"
|
| @@ -88,11 +89,9 @@
|
|
|
| Handle<Code> code;
|
| if (construct) {
|
| - JSConstructEntryStub stub;
|
| - code = stub.GetCode();
|
| + code = isolate->factory()->js_construct_entry_code();
|
| } else {
|
| - JSEntryStub stub;
|
| - code = stub.GetCode();
|
| + code = isolate->factory()->js_entry_code();
|
| }
|
|
|
| // Convert calls on global objects to be calls on the global
|
| @@ -151,6 +150,8 @@
|
| Object*** args,
|
| bool* pending_exception,
|
| bool convert_receiver) {
|
| + *pending_exception = false;
|
| +
|
| if (!callable->IsJSFunction()) {
|
| callable = TryGetFunctionDelegate(callable, pending_exception);
|
| if (*pending_exception) return callable;
|
| @@ -195,6 +196,7 @@
|
| v8::TryCatch catcher;
|
| catcher.SetVerbose(false);
|
| catcher.SetCaptureMessage(false);
|
| + *caught_exception = false;
|
|
|
| Handle<Object> result = Invoke(false, func, receiver, argc, args,
|
| caught_exception);
|
| @@ -377,7 +379,7 @@
|
|
|
| bool StackGuard::IsInterrupted() {
|
| ExecutionAccess access(isolate_);
|
| - return thread_local_.interrupt_flags_ & INTERRUPT;
|
| + return (thread_local_.interrupt_flags_ & INTERRUPT) != 0;
|
| }
|
|
|
|
|
| @@ -403,7 +405,7 @@
|
|
|
| bool StackGuard::IsTerminateExecution() {
|
| ExecutionAccess access(isolate_);
|
| - return thread_local_.interrupt_flags_ & TERMINATE;
|
| + return (thread_local_.interrupt_flags_ & TERMINATE) != 0;
|
| }
|
|
|
|
|
| @@ -416,7 +418,7 @@
|
|
|
| bool StackGuard::IsRuntimeProfilerTick() {
|
| ExecutionAccess access(isolate_);
|
| - return thread_local_.interrupt_flags_ & RUNTIME_PROFILER_TICK;
|
| + return (thread_local_.interrupt_flags_ & RUNTIME_PROFILER_TICK) != 0;
|
| }
|
|
|
|
|
| @@ -433,6 +435,22 @@
|
| }
|
|
|
|
|
| +bool StackGuard::IsGCRequest() {
|
| + ExecutionAccess access(isolate_);
|
| + return (thread_local_.interrupt_flags_ & GC_REQUEST) != 0;
|
| +}
|
| +
|
| +
|
| +void StackGuard::RequestGC() {
|
| + ExecutionAccess access(isolate_);
|
| + thread_local_.interrupt_flags_ |= GC_REQUEST;
|
| + if (thread_local_.postpone_interrupts_nesting_ == 0) {
|
| + thread_local_.jslimit_ = thread_local_.climit_ = kInterruptLimit;
|
| + isolate_->heap()->SetStackLimits();
|
| + }
|
| +}
|
| +
|
| +
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| bool StackGuard::IsDebugBreak() {
|
| ExecutionAccess access(isolate_);
|
| @@ -740,7 +758,7 @@
|
| Handle<Object>::cast(fun).location(),
|
| pos.location(),
|
| is_global.location() };
|
| - bool caught_exception = false;
|
| + bool caught_exception;
|
| Handle<Object> result =
|
| TryCall(isolate->get_stack_trace_line_fun(),
|
| isolate->js_builtins_object(), argc, args,
|
| @@ -852,6 +870,12 @@
|
| MaybeObject* Execution::HandleStackGuardInterrupt() {
|
| Isolate* isolate = Isolate::Current();
|
| StackGuard* stack_guard = isolate->stack_guard();
|
| +
|
| + if (stack_guard->IsGCRequest()) {
|
| + isolate->heap()->CollectAllGarbage(false);
|
| + stack_guard->Continue(GC_REQUEST);
|
| + }
|
| +
|
| isolate->counters()->stack_interrupts()->Increment();
|
| if (stack_guard->IsRuntimeProfilerTick()) {
|
| isolate->counters()->runtime_profiler_ticks()->Increment();
|
|
|