46 StackGuard::StackGuard()
51 void StackGuard::set_interrupt_limits(
const ExecutionAccess& lock) {
54 if (should_postpone_interrupts(lock))
return;
55 thread_local_.jslimit_ = kInterruptLimit;
56 thread_local_.climit_ = kInterruptLimit;
61 void StackGuard::reset_limits(
const ExecutionAccess& lock) {
63 thread_local_.jslimit_ = thread_local_.real_jslimit_;
64 thread_local_.climit_ = thread_local_.real_climit_;
69 static Handle<Object> Invoke(
bool is_construct,
70 Handle<JSFunction>
function,
71 Handle<Object> receiver,
73 Handle<Object> args[],
74 bool* has_pending_exception) {
75 Isolate* isolate =
function->GetIsolate();
78 VMState state(isolate, JS);
83 typedef Object* (*JSEntryFunction)(
byte* entry,
89 Handle<Code>
code = is_construct
90 ? isolate->factory()->js_construct_entry_code()
91 : isolate->factory()->js_entry_code();
96 if (receiver->IsGlobalObject()) {
98 receiver = Handle<JSObject>(global->global_receiver());
103 ASSERT(function->context()->global_object()->IsGlobalObject());
108 SaveContext save(isolate);
109 NoHandleAllocation na;
110 JSEntryFunction stub_entry = FUNCTION_CAST<JSEntryFunction>(code->entry());
113 byte* function_entry =
function->code()->entry();
114 JSFunction* func = *
function;
115 Object* recv = *receiver;
116 Object*** argv =
reinterpret_cast<Object***
>(args);
126 *has_pending_exception = value->IsException();
127 ASSERT(*has_pending_exception == Isolate::Current()->has_pending_exception());
128 if (*has_pending_exception) {
129 isolate->ReportPendingMessages();
131 if (!isolate->ignore_out_of_memory()) {
135 #ifdef ENABLE_DEBUGGER_SUPPORT
137 if (isolate->debugger()->IsDebuggerActive()) {
138 isolate->debug()->ClearStepping();
140 #endif // ENABLE_DEBUGGER_SUPPORT
141 return Handle<Object>();
143 isolate->clear_pending_message();
146 return Handle<Object>(value->ToObjectUnchecked(), isolate);
154 bool* pending_exception,
155 bool convert_receiver) {
156 *pending_exception =
false;
158 if (!callable->IsJSFunction()) {
160 if (*pending_exception)
return callable;
165 if (convert_receiver && !receiver->IsJSReceiver() &&
166 !func->shared()->native() && func->shared()->is_classic_mode()) {
167 if (receiver->IsUndefined() || receiver->IsNull()) {
168 Object* global = func->context()->global_object()->global_receiver();
172 if (!global->IsJSBuiltinsObject()) receiver =
Handle<Object>(global);
174 receiver =
ToObject(receiver, pending_exception);
176 if (*pending_exception)
return callable;
179 return Invoke(
false, func, receiver, argc, argv, pending_exception);
186 bool* pending_exception) {
187 return Invoke(
true, func, Isolate::Current()->global_object(), argc, argv,
196 bool* caught_exception) {
204 *caught_exception =
false;
209 if (*caught_exception) {
211 Isolate* isolate = Isolate::Current();
212 ASSERT(isolate->has_pending_exception());
213 ASSERT(isolate->external_caught_exception());
214 if (isolate->pending_exception() ==
215 isolate->heap()->termination_exception()) {
216 result = isolate->factory()->termination_exception();
218 result = v8::Utils::OpenHandle(*catcher.
Exception());
220 isolate->OptionalRescheduleException(
true);
223 ASSERT(!Isolate::Current()->has_pending_exception());
224 ASSERT(!Isolate::Current()->external_caught_exception());
230 ASSERT(!object->IsJSFunction());
231 Isolate* isolate = Isolate::Current();
232 Factory* factory = isolate->factory();
238 Object* fun = *object;
239 while (fun->IsJSFunctionProxy()) {
246 if (fun->IsHeapObject() &&
249 isolate->native_context()->call_as_function_delegate());
252 return factory->undefined_value();
257 bool* has_pending_exception) {
258 ASSERT(!object->IsJSFunction());
259 Isolate* isolate = Isolate::Current();
262 Object* fun = *object;
263 while (fun->IsJSFunctionProxy()) {
270 if (fun->IsHeapObject() &&
273 isolate->native_context()->call_as_function_delegate());
279 "called_non_callable", i::HandleVector<i::Object>(&
object, 1));
280 isolate->Throw(*error_obj);
281 *has_pending_exception =
true;
283 return isolate->factory()->undefined_value();
288 ASSERT(!object->IsJSFunction());
289 Isolate* isolate = Isolate::Current();
295 Object* fun = *object;
296 while (fun->IsJSFunctionProxy()) {
303 if (fun->IsHeapObject() &&
306 isolate->native_context()->call_as_constructor_delegate());
309 return isolate->factory()->undefined_value();
315 bool* has_pending_exception) {
316 ASSERT(!object->IsJSFunction());
317 Isolate* isolate = Isolate::Current();
323 Object* fun = *object;
324 while (fun->IsJSFunctionProxy()) {
331 if (fun->IsHeapObject() &&
334 isolate->native_context()->call_as_constructor_delegate());
340 "called_non_callable", i::HandleVector<i::Object>(&
object, 1));
341 isolate->Throw(*error_obj);
342 *has_pending_exception =
true;
344 return isolate->factory()->undefined_value();
349 ExecutionAccess access(isolate_);
350 return (thread_local_.jslimit_ != kInterruptLimit &&
351 thread_local_.climit_ != kInterruptLimit);
355 void StackGuard::EnableInterrupts() {
356 ExecutionAccess access(isolate_);
357 if (has_pending_interrupts(access)) {
358 set_interrupt_limits(access);
364 ExecutionAccess access(isolate_);
368 if (thread_local_.jslimit_ == thread_local_.real_jslimit_) {
369 thread_local_.jslimit_ =
jslimit;
371 if (thread_local_.climit_ == thread_local_.real_climit_) {
372 thread_local_.climit_ = limit;
374 thread_local_.real_climit_ = limit;
375 thread_local_.real_jslimit_ =
jslimit;
379 void StackGuard::DisableInterrupts() {
380 ExecutionAccess access(isolate_);
381 reset_limits(access);
386 ExecutionAccess access(isolate_);
387 return should_postpone_interrupts(access);
392 ExecutionAccess access(isolate_);
393 return (thread_local_.interrupt_flags_ &
INTERRUPT) != 0;
398 ExecutionAccess access(isolate_);
399 thread_local_.interrupt_flags_ |=
INTERRUPT;
400 set_interrupt_limits(access);
405 ExecutionAccess access(isolate_);
406 return thread_local_.interrupt_flags_ &
PREEMPT;
411 ExecutionAccess access(isolate_);
412 thread_local_.interrupt_flags_ |=
PREEMPT;
413 set_interrupt_limits(access);
418 ExecutionAccess access(isolate_);
419 return (thread_local_.interrupt_flags_ &
TERMINATE) != 0;
424 ExecutionAccess access(isolate_);
425 thread_local_.interrupt_flags_ |=
TERMINATE;
426 set_interrupt_limits(access);
431 ExecutionAccess access(isolate_);
438 if (FLAG_opt && ExecutionAccess::TryLock(isolate_)) {
440 if (thread_local_.postpone_interrupts_nesting_ == 0) {
441 thread_local_.jslimit_ = thread_local_.climit_ = kInterruptLimit;
444 ExecutionAccess::Unlock(isolate_);
450 ASSERT(FLAG_parallel_recompilation);
451 if (ExecutionAccess::TryLock(isolate_)) {
453 if (thread_local_.postpone_interrupts_nesting_ == 0) {
454 thread_local_.jslimit_ = thread_local_.climit_ = kInterruptLimit;
457 ExecutionAccess::Unlock(isolate_);
463 ExecutionAccess access(isolate_);
464 return (thread_local_.interrupt_flags_ &
CODE_READY) != 0;
469 ExecutionAccess access(isolate_);
470 return (thread_local_.interrupt_flags_ &
GC_REQUEST) != 0;
475 ExecutionAccess access(isolate_);
477 if (thread_local_.postpone_interrupts_nesting_ == 0) {
478 thread_local_.jslimit_ = thread_local_.climit_ = kInterruptLimit;
484 #ifdef ENABLE_DEBUGGER_SUPPORT
485 bool StackGuard::IsDebugBreak() {
486 ExecutionAccess access(isolate_);
487 return thread_local_.interrupt_flags_ &
DEBUGBREAK;
491 void StackGuard::DebugBreak() {
492 ExecutionAccess access(isolate_);
494 set_interrupt_limits(access);
498 bool StackGuard::IsDebugCommand() {
499 ExecutionAccess access(isolate_);
504 void StackGuard::DebugCommand() {
505 if (FLAG_debugger_auto_break) {
506 ExecutionAccess access(isolate_);
508 set_interrupt_limits(access);
514 ExecutionAccess access(isolate_);
515 thread_local_.interrupt_flags_ &= ~static_cast<
int>(after_what);
516 if (!should_postpone_interrupts(access) && !has_pending_interrupts(access)) {
517 reset_limits(access);
523 ExecutionAccess access(isolate_);
524 memcpy(to, reinterpret_cast<char*>(&thread_local_),
sizeof(ThreadLocal));
533 thread_local_ = blank;
535 return to +
sizeof(ThreadLocal);
540 ExecutionAccess access(isolate_);
541 memcpy(reinterpret_cast<char*>(&thread_local_), from,
sizeof(ThreadLocal));
543 return from +
sizeof(ThreadLocal);
549 isolate_->FindOrAllocatePerThreadDataForThisThread();
554 void StackGuard::ThreadLocal::Clear() {
555 real_jslimit_ = kIllegalLimit;
556 jslimit_ = kIllegalLimit;
557 real_climit_ = kIllegalLimit;
558 climit_ = kIllegalLimit;
560 postpone_interrupts_nesting_ = 0;
561 interrupt_flags_ = 0;
565 bool StackGuard::ThreadLocal::Initialize(
Isolate* isolate) {
566 bool should_set_stack_limits =
false;
567 if (real_climit_ == kIllegalLimit) {
570 const uintptr_t kLimitSize = FLAG_stack_size *
KB;
571 uintptr_t limit =
reinterpret_cast<uintptr_t
>(&limit) - kLimitSize;
572 ASSERT(reinterpret_cast<uintptr_t>(&limit) > kLimitSize);
575 real_climit_ = limit;
577 should_set_stack_limits =
true;
580 postpone_interrupts_nesting_ = 0;
581 interrupt_flags_ = 0;
582 return should_set_stack_limits;
587 thread_local_.Clear();
595 isolate_->FindOrAllocatePerThreadDataForThisThread();
596 uintptr_t stored_limit = per_thread->
stack_limit();
598 if (stored_limit != 0) {
606 #define RETURN_NATIVE_CALL(name, args, has_pending_exception) \
608 Isolate* isolate = Isolate::Current(); \
609 Handle<Object> argv[] = args; \
610 ASSERT(has_pending_exception != NULL); \
611 return Call(isolate->name##_fun(), \
612 isolate->js_builtins_object(), \
613 ARRAY_SIZE(argv), argv, \
614 has_pending_exception); \
620 if (obj->IsBoolean())
return obj;
622 if (obj->IsString()) {
624 }
else if (obj->IsNull() || obj->IsUndefined()) {
626 }
else if (obj->IsNumber()) {
627 double value = obj->Number();
628 result = !((value == 0) ||
isnan(value));
650 if (obj->IsSpecObject())
return obj;
676 #undef RETURN_NATIVE_CALL
683 pattern->GetIsolate()->native_context()->regexp_function());
685 function, pattern, flags, exc);
692 Isolate* isolate =
string->GetIsolate();
695 int int_index =
static_cast<int>(index);
696 if (int_index < 0 || int_index >= string->length()) {
697 return factory->undefined_value();
702 factory->char_at_symbol());
703 if (!char_at->IsJSFunction()) {
704 return factory->undefined_value();
707 bool caught_exception;
715 if (caught_exception) {
716 return factory->undefined_value();
725 Isolate* isolate = data->GetIsolate();
727 int serial_number =
Smi::cast(data->serial_number())->value();
730 GetElementNoExceptionThrown(serial_number);
746 Isolate* isolate = data->GetIsolate();
747 if (data->property_list()->IsUndefined() &&
748 !data->constructor()->IsUndefined()) {
750 Object* result =
NULL;
780 Isolate* isolate = Isolate::Current();
794 Isolate* isolate = fun->GetIsolate();
796 bool caught_exception;
802 if (caught_exception || !result->IsString()) {
803 return isolate->
factory()->empty_symbol();
810 static Object* RuntimePreempt() {
811 Isolate* isolate = Isolate::Current();
818 #ifdef ENABLE_DEBUGGER_SUPPORT
819 if (isolate->debug()->InDebugger()) {
822 isolate->debug()->PreemptionWhileInDebugger();
825 v8::Unlocker unlocker(reinterpret_cast<v8::Isolate*>(isolate));
831 v8::Unlocker unlocker(reinterpret_cast<v8::Isolate*>(isolate));
836 return isolate->
heap()->undefined_value();
840 #ifdef ENABLE_DEBUGGER_SUPPORT
841 Object* Execution::DebugBreakHelper() {
842 Isolate* isolate = Isolate::Current();
845 if (isolate->debug()->disable_break()) {
846 return isolate->heap()->undefined_value();
850 if (isolate->bootstrapper()->IsActive()) {
851 return isolate->heap()->undefined_value();
855 if (!isolate->debugger()->IsDebuggerActive()) {
856 return isolate->heap()->undefined_value();
859 StackLimitCheck
check(isolate);
860 if (
check.HasOverflowed()) {
861 return isolate->heap()->undefined_value();
867 Object* fun = it.frame()->function();
868 if (fun && fun->IsJSFunction()) {
871 return isolate->heap()->undefined_value();
875 if (isolate->debug()->IsDebugGlobal(global)) {
876 return isolate->heap()->undefined_value();
882 bool debug_command_only =
883 isolate->stack_guard()->IsDebugCommand() &&
884 !isolate->stack_guard()->IsDebugBreak();
889 ProcessDebugMessages(debug_command_only);
892 return isolate->heap()->undefined_value();
895 void Execution::ProcessDebugMessages(
bool debug_command_only) {
896 Isolate* isolate = Isolate::Current();
900 StackLimitCheck
check(isolate);
901 if (
check.HasOverflowed()) {
905 HandleScope scope(isolate);
907 EnterDebugger debugger;
908 if (debugger.FailedToEnter()) {
914 isolate->debugger()->OnDebugBreak(isolate->factory()->undefined_value(),
924 return isolate->
heap()->undefined_value();
929 "StackGuard GC request");
934 ASSERT(FLAG_parallel_recompilation);
935 if (FLAG_trace_parallel_recompilation) {
936 PrintF(
" ** CODE_READY event received.\n");
944 isolate->
counters()->stack_interrupts()->Increment();
946 if (FLAG_count_based_interrupts ||
948 isolate->
counters()->runtime_profiler_ticks()->Increment();
952 #ifdef ENABLE_DEBUGGER_SUPPORT
953 if (stack_guard->IsDebugBreak() || stack_guard->IsDebugCommand()) {
966 return isolate->
heap()->undefined_value();
static Handle< Object > New(Handle< JSFunction > func, int argc, Handle< Object > argv[], bool *pending_exception)
Failure * StackOverflow()
void InstallOptimizedFunctions()
static Handle< Object > TryCall(Handle< JSFunction > func, Handle< Object > receiver, int argc, Handle< Object > argv[], bool *caught_exception)
static Handle< Object > ToUint32(Handle< Object > obj, bool *exc)
void PrintF(const char *format,...)
Local< Value > Exception() const
bool IsRuntimeProfilerTick()
void SetCaptureMessage(bool value)
void CollectAllGarbage(int flags, const char *gc_reason=NULL)
static HeapObject * cast(Object *obj)
static Handle< T > cast(Handle< S > that)
static Failure * OutOfMemoryException()
static Handle< Object > CreateRegExpLiteral(Handle< JSFunction > constructor, Handle< String > pattern, Handle< String > flags, bool *has_pending_exception)
static Handle< Object > ToInteger(Handle< Object > obj, bool *exc)
static Handle< Object > GetConstructorDelegate(Handle< Object > object)
static Handle< Object > ToObject(Handle< Object > obj, bool *exc)
static Handle< Object > ToInt32(Handle< Object > obj, bool *exc)
#define ASSERT(condition)
static void ConfigureInstance(Handle< Object > instance, Handle< Object > data, bool *exc)
kPropertyAccessorsOffset kNamedPropertyHandlerOffset instance_template
static Handle< Object > ToDetailString(Handle< Object > obj, bool *exc)
void SetVerbose(bool value)
Handle< Object > GetProperty(Handle< JSReceiver > obj, const char *name)
static Smi * cast(Object *object)
StackGuard * stack_guard()
bool has_instance_call_handler()
GlobalObject * global_object()
static JSFunctionProxy * cast(Object *obj)
void RequestRuntimeProfilerTick()
static Handle< Object > CharAt(Handle< String > str, uint32_t index)
static Handle< Object > ToBoolean(Handle< Object > obj)
char * RestoreStackGuard(char *from)
void ClearThread(const ExecutionAccess &lock)
RuntimeProfiler * runtime_profiler()
static void PreemptionReceived()
char * ArchiveStackGuard(char *to)
static MUST_USE_RESULT MaybeObject * HandleStackGuardInterrupt(Isolate *isolate)
bool IsTerminateExecution()
static const int kNoGCFlags
void TerminateExecution()
static uintptr_t JsLimitFromCLimit(v8::internal::Isolate *isolate, uintptr_t c_limit)
static FunctionTemplateInfo * cast(Object *obj)
static Handle< JSRegExp > NewJSRegExp(Handle< String > pattern, Handle< String > flags, bool *exc)
#define CALL_GENERATED_CODE(entry, p0, p1, p2, p3, p4)
static Handle< Object > NewDate(double time, bool *exc)
Handle< JSBuiltinsObject > js_builtins_object()
static Handle< Object > Call(Handle< Object > callable, Handle< Object > receiver, int argc, Handle< Object > argv[], bool *pending_exception, bool convert_receiver=false)
Handle< Object > NewNumberFromInt(int32_t value, PretenureFlag pretenure=NOT_TENURED)
static Handle< JSFunction > InstantiateFunction(Handle< FunctionTemplateInfo > data, bool *exc)
bool ShouldPostponeInterrupts()
void Continue(InterruptFlag after_what)
JavaScriptFrameIteratorTemp< StackFrameIterator > JavaScriptFrameIterator
void RequestCodeReadyEvent()
static Handle< Object > GetFunctionDelegate(Handle< Object > object)
void set_stack_limit(uintptr_t value)
static Handle< T > null()
#define RETURN_NATIVE_CALL(name, args, has_pending_exception)
static Handle< Object > ToNumber(Handle< Object > obj, bool *exc)
static Handle< JSObject > InstantiateObject(Handle< ObjectTemplateInfo > data, bool *exc)
Failure * TerminateExecution()
OptimizingCompilerThread * optimizing_compiler_thread()
static Handle< String > GetStackTraceLine(Handle< Object > recv, Handle< JSFunction > fun, Handle< Object > pos, Handle< Object > is_global)
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination use dead code elimination trace on stack replacement optimize closures cache optimized code for closures functions with arguments object loop weight for representation inference allow uint32 values on optimize frames if they are used only in safe operations track parallel recompilation enable all profiler experiments number of stack frames inspected by the profiler call recompile stub directly when self optimizing trigger profiler ticks based on counting instead of timing weight back edges by jump distance for interrupt triggering percentage of ICs that must have type info to allow optimization watch_ic_patching retry_self_opt interrupt_at_exit extra verbose compilation tracing generate extra emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 and VFP2 enable use of VFP2 instructions if available enable use of SDIV and UDIV instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of MIPS FPU instructions if NULL
static Handle< Object > ToString(Handle< Object > obj, bool *exc)
Handle< Context > native_context()
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination use dead code elimination trace on stack replacement optimize closures cache optimized code for closures functions with arguments object loop weight for representation inference allow uint32 values on optimize frames if they are used only in safe operations track parallel recompilation enable all profiler experiments number of stack frames inspected by the profiler call recompile stub directly when self optimizing trigger profiler ticks based on counting instead of timing weight back edges by jump distance for interrupt triggering percentage of ICs that must have type info to allow optimization watch_ic_patching retry_self_opt interrupt_at_exit extra verbose compilation tracing generate extra code(assertions) for debugging") DEFINE_bool(code_comments
void FreeThreadResources()
static Handle< Object > TryGetConstructorDelegate(Handle< Object > object, bool *has_pending_exception)
void SetStackLimit(uintptr_t limit)
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination use dead code elimination trace on stack replacement optimize closures cache optimized code for closures functions with arguments object loop weight for representation inference allow uint32 values on optimize frames if they are used only in safe operations track parallel recompilation enable all profiler experiments number of stack frames inspected by the profiler call recompile stub directly when self optimizing trigger profiler ticks based on counting instead of timing weight back edges by jump distance for interrupt triggering percentage of ICs that must have type info to allow optimization watch_ic_patching retry_self_opt interrupt_at_exit extra verbose compilation tracing generate extra emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 and VFP2 enable use of VFP2 instructions if available enable use of SDIV and UDIV instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of MIPS FPU instructions if expose natives in global object expose gc extension number of stack frames to capture disable builtin natives files print a stack trace if an assertion failure occurs use random jit cookie to mask large constants trace lazy optimization use adaptive optimizations prepare for turning on always opt minimum length for automatic enable preparsing maximum number of optimization attempts before giving up cache prototype transitions automatically set the debug break flag when debugger commands are in the queue always cause a debug break before aborting maximum length of function source code printed in a stack trace max size of the new max size of the old max size of executable always perform global GCs print one trace line following each garbage collection do not print trace line after scavenger collection print more details following each garbage collection print amount of external allocated memory after each time it is adjusted flush code that we expect not to use again before full gc do incremental marking steps track object counts and memory usage use caching Perform compaction on every full GC Never perform compaction on full GC testing only Compact code space on full incremental collections Default seed for initializing random allows verbose printing trace parsing and preparsing Check icache flushes in ARM and MIPS simulator Stack alingment in bytes in print stack trace when throwing exceptions randomize hashes to avoid predictable hash Fixed seed to use to hash property activate a timer that switches between V8 threads testing_bool_flag float flag Seed used for threading test randomness A filename with extra code to be included in the Print usage including flags
uintptr_t stack_limit() const
void check(i::Vector< const char > string)
static void FatalProcessOutOfMemory(const char *location, bool take_snapshot=false)
static Handle< Object > TryGetFunctionDelegate(Handle< Object > object, bool *has_pending_exception)
static JSObject * cast(Object *obj)
void InitThread(const ExecutionAccess &lock)
static JSFunction * cast(Object *obj)