44 #ifdef ENABLE_DEBUGGER_SUPPORT
45 #include "../include/v8-debug.h"
69 enum ExceptionBreakType {
71 BreakUncaughtException = 1
76 enum BreakLocatorType {
77 ALL_BREAK_LOCATIONS = 0,
78 SOURCE_BREAK_LOCATIONS = 1
84 class BreakLocationIterator {
86 explicit BreakLocationIterator(Handle<DebugInfo> debug_info,
87 BreakLocatorType type);
88 virtual ~BreakLocationIterator();
92 void FindBreakLocationFromAddress(
Address pc);
93 void FindBreakLocationFromPosition(
int position);
96 void SetBreakPoint(Handle<Object> break_point_object);
97 void ClearBreakPoint(Handle<Object> break_point_object);
100 void PrepareStepIn();
102 bool HasBreakPoint();
104 Object* BreakPointObjects();
105 void ClearAllDebugBreak();
108 inline int code_position() {
109 return static_cast<int>(
pc() - debug_info_->
code()->entry());
111 inline int break_point() {
return break_point_; }
112 inline int position() {
return position_; }
113 inline int statement_position() {
return statement_position_; }
114 inline Address pc() {
return reloc_iterator_->rinfo()->pc(); }
115 inline Code*
code() {
return debug_info_->code(); }
116 inline RelocInfo* rinfo() {
return reloc_iterator_->rinfo(); }
117 inline RelocInfo::Mode rmode()
const {
118 return reloc_iterator_->rinfo()->rmode();
120 inline RelocInfo* original_rinfo() {
121 return reloc_iterator_original_->rinfo();
123 inline RelocInfo::Mode original_rmode()
const {
124 return reloc_iterator_original_->rinfo()->rmode();
127 bool IsDebuggerStatement();
130 bool RinfoDone()
const;
133 BreakLocatorType type_;
136 int statement_position_;
137 Handle<DebugInfo> debug_info_;
138 RelocIterator* reloc_iterator_;
139 RelocIterator* reloc_iterator_original_;
142 void SetDebugBreak();
143 void ClearDebugBreak();
145 void SetDebugBreakAtIC();
146 void ClearDebugBreakAtIC();
148 bool IsDebugBreakAtReturn();
149 void SetDebugBreakAtReturn();
150 void ClearDebugBreakAtReturn();
152 bool IsDebugBreakSlot();
153 bool IsDebugBreakAtSlot();
154 void SetDebugBreakAtSlot();
155 void ClearDebugBreakAtSlot();
165 class ScriptCache :
private HashMap {
167 ScriptCache() :
HashMap(ScriptMatch), collected_scripts_(10) {}
168 virtual ~ScriptCache() { Clear(); }
171 void Add(Handle<Script> script);
174 Handle<FixedArray> GetScripts();
177 void ProcessCollectedScripts();
181 static uint32_t Hash(
int key) {
186 static bool ScriptMatch(
void* key1,
void* key2) {
return key1 == key2; }
195 List<int> collected_scripts_;
201 class DebugInfoListNode {
203 explicit DebugInfoListNode(DebugInfo* debug_info);
204 virtual ~DebugInfoListNode();
206 DebugInfoListNode* next() {
return next_; }
207 void set_next(DebugInfoListNode* next) { next_ = next; }
208 Handle<DebugInfo> debug_info() {
return debug_info_; }
212 Handle<DebugInfo> debug_info_;
215 DebugInfoListNode* next_;
227 void SetUp(
bool create_heap_objects);
230 bool IsLoaded() {
return !debug_context_.is_null(); }
231 bool InDebugger() {
return thread_local_.debugger_entry_ !=
NULL; }
232 void PreemptionWhileInDebugger();
233 void Iterate(ObjectVisitor* v);
236 void SetBreakPoint(Handle<JSFunction>
function,
237 Handle<Object> break_point_object,
238 int* source_position);
239 bool SetBreakPointForScript(Handle<Script> script,
240 Handle<Object> break_point_object,
241 int* source_position);
242 void ClearBreakPoint(Handle<Object> break_point_object);
243 void ClearAllBreakPoints();
244 void FloodWithOneShot(Handle<JSFunction>
function);
245 void FloodBoundFunctionWithOneShot(Handle<JSFunction>
function);
246 void FloodHandlerWithOneShot();
247 void ChangeBreakOnException(ExceptionBreakType type,
bool enable);
248 bool IsBreakOnException(ExceptionBreakType type);
249 void PrepareStep(StepAction step_action,
int step_count);
250 void ClearStepping();
252 bool IsStepping() {
return thread_local_.step_count_ > 0; }
253 bool StepNextContinue(BreakLocationIterator* break_location_iterator,
254 JavaScriptFrame* frame);
255 static Handle<DebugInfo> GetDebugInfo(Handle<SharedFunctionInfo> shared);
256 static bool HasDebugInfo(Handle<SharedFunctionInfo> shared);
258 void PrepareForBreakPoints();
261 Object* FindSharedFunctionInfoInScript(Handle<Script> script,
int position);
266 bool EnsureDebugInfo(Handle<SharedFunctionInfo> shared,
267 Handle<JSFunction>
function);
270 static bool IsDebugBreak(
Address addr);
273 static bool IsDebugBreakAtReturn(RelocInfo* rinfo);
277 static bool IsSourceBreakStub(Code*
code);
278 static bool IsBreakStub(Code*
code);
281 static Handle<Code> FindDebugBreak(Handle<Code>
code, RelocInfo::Mode mode);
283 static Handle<Object> GetSourceBreakLocations(
284 Handle<SharedFunctionInfo> shared);
287 inline Handle<Context> debug_context() {
return debug_context_; }
290 bool IsDebugGlobal(GlobalObject* global);
293 bool IsBreakAtReturn(JavaScriptFrame* frame);
296 inline bool has_break_points() {
return has_break_points_; }
298 void NewBreak(StackFrame::Id break_frame_id);
299 void SetBreak(StackFrame::Id break_frame_id,
int break_id);
300 StackFrame::Id break_frame_id() {
301 return thread_local_.break_frame_id_;
303 int break_id() {
return thread_local_.break_id_; }
305 bool StepInActive() {
return thread_local_.step_into_fp_ != 0; }
306 void HandleStepIn(Handle<JSFunction>
function,
307 Handle<Object> holder,
309 bool is_constructor);
310 Address step_in_fp() {
return thread_local_.step_into_fp_; }
311 Address* step_in_fp_addr() {
return &thread_local_.step_into_fp_; }
313 bool StepOutActive() {
return thread_local_.step_out_fp_ != 0; }
314 Address step_out_fp() {
return thread_local_.step_out_fp_; }
316 EnterDebugger* debugger_entry() {
317 return thread_local_.debugger_entry_;
319 void set_debugger_entry(EnterDebugger* entry) {
320 thread_local_.debugger_entry_ = entry;
325 return (thread_local_.pending_interrupts_ & what) != 0;
330 thread_local_.pending_interrupts_ |= what;
335 thread_local_.pending_interrupts_ &= ~static_cast<
int>(what);
339 bool disable_break() {
return disable_break_; }
340 void set_disable_break(
bool disable_break) {
341 disable_break_ = disable_break;
345 bool break_on_exception() {
return break_on_exception_; }
346 bool break_on_uncaught_exception() {
347 return break_on_uncaught_exception_;
351 k_after_break_target_address,
352 k_debug_break_return_address,
353 k_debug_break_slot_address,
354 k_restarter_frame_function_pointer
358 Address* after_break_target_address() {
359 return reinterpret_cast<Address*
>(&thread_local_.after_break_target_);
361 Address* restarter_frame_function_pointer_address() {
362 Object*** address = &thread_local_.restarter_frame_function_pointer_;
363 return reinterpret_cast<Address*
>(address);
367 Object** register_address(
int r) {
368 return ®isters_[r];
372 Code* debug_break_return() {
return debug_break_return_; }
373 Code** debug_break_return_address() {
374 return &debug_break_return_;
378 Code* debug_break_slot() {
return debug_break_slot_; }
379 Code** debug_break_slot_address() {
380 return &debug_break_slot_;
383 static const int kEstimatedNofDebugInfoEntries = 16;
384 static const int kEstimatedNofBreakPointsInFunction = 16;
389 friend class Debugger;
390 friend Handle<FixedArray> GetDebuggedFunctions();
391 friend void CheckDebuggerUnloaded(
bool check_functions);
394 char* ArchiveDebug(
char* to);
395 char* RestoreDebug(
char* from);
396 static int ArchiveSpacePerThread();
397 void FreeThreadResources() { }
400 void ClearMirrorCache();
403 void CreateScriptCache();
404 void DestroyScriptCache();
405 void AddScriptToScriptCache(Handle<Script> script);
406 Handle<FixedArray> GetLoadedScripts();
409 void AfterGarbageCollection();
412 static void GenerateSlot(MacroAssembler* masm);
413 static void GenerateLoadICDebugBreak(MacroAssembler* masm);
414 static void GenerateStoreICDebugBreak(MacroAssembler* masm);
415 static void GenerateKeyedLoadICDebugBreak(MacroAssembler* masm);
416 static void GenerateKeyedStoreICDebugBreak(MacroAssembler* masm);
417 static void GenerateReturnDebugBreak(MacroAssembler* masm);
418 static void GenerateCallFunctionStubDebugBreak(MacroAssembler* masm);
419 static void GenerateCallFunctionStubRecordDebugBreak(MacroAssembler* masm);
420 static void GenerateCallConstructStubDebugBreak(MacroAssembler* masm);
421 static void GenerateCallConstructStubRecordDebugBreak(MacroAssembler* masm);
422 static void GenerateSlotDebugBreak(MacroAssembler* masm);
423 static void GeneratePlainReturnLiveEdit(MacroAssembler* masm);
429 static void GenerateFrameDropperLiveEdit(MacroAssembler* masm);
432 static void GenerateCallICDebugBreak(MacroAssembler* masm);
439 FRAME_DROPPED_IN_IC_CALL,
442 FRAME_DROPPED_IN_DEBUG_SLOT_CALL,
445 FRAME_DROPPED_IN_DIRECT_CALL,
446 FRAME_DROPPED_IN_RETURN_CALL,
450 void FramesHaveBeenDropped(StackFrame::Id new_break_frame_id,
452 Object** restarter_frame_function_pointer);
465 static const int kFrameDropperFrameSize;
468 static const bool kFrameDropperSupported;
497 class FramePaddingLayout :
public AllStatic {
500 static const bool kIsSupported;
504 static const int kFrameBaseSize = 4;
508 static const int kInitialSize;
511 static const int kPaddingValue;
515 explicit Debug(Isolate* isolate);
518 static bool CompileDebuggerScript(
int index);
523 void ClearStepNext();
525 void RemoveDebugInfo(Handle<DebugInfo> debug_info);
526 void SetAfterBreakTarget(JavaScriptFrame* frame);
527 Handle<Object> CheckBreakPoints(Handle<Object> break_point);
528 bool CheckBreakPoint(Handle<Object> break_point_object);
532 Handle<Context> debug_context_;
535 bool has_break_points_;
538 ScriptCache* script_cache_;
541 DebugInfoListNode* debug_info_list_;
544 bool break_on_exception_;
545 bool break_on_uncaught_exception_;
557 StackFrame::Id break_frame_id_;
560 StepAction last_step_action_;
563 int last_statement_position_;
572 int queued_step_count_;
586 FrameDropMode frame_drop_mode_;
589 EnterDebugger* debugger_entry_;
592 int pending_interrupts_;
597 Object** restarter_frame_function_pointer_;
602 ThreadLocal thread_local_;
606 Code* debug_break_return_;
609 Code* debug_break_slot_;
613 friend class Isolate;
629 Handle<JSObject> exec_state,
630 Handle<JSObject> event_data);
633 static MessageImpl NewResponse(
DebugEvent event,
635 Handle<JSObject> exec_state,
636 Handle<JSObject> event_data,
637 Handle<String> response_json,
641 virtual bool IsEvent()
const;
642 virtual bool IsResponse()
const;
644 virtual bool WillStartRunning()
const;
652 MessageImpl(
bool is_event,
655 Handle<JSObject> exec_state,
656 Handle<JSObject> event_data,
657 Handle<String> response_json,
663 Handle<JSObject> exec_state_;
664 Handle<JSObject> event_data_;
665 Handle<String> response_json_;
674 Handle<JSObject> exec_state,
675 Handle<JSObject> event_data,
676 Handle<Object> callback_data,
686 Handle<JSObject> exec_state_;
687 Handle<JSObject> event_data_;
688 Handle<Object> callback_data_;
698 class CommandMessage {
700 static CommandMessage New(
const Vector<uint16_t>& command,
707 Vector<uint16_t> text()
const {
return text_; }
710 CommandMessage(
const Vector<uint16_t>& text,
713 Vector<uint16_t> text_;
721 explicit CommandMessageQueue(
int size);
722 ~CommandMessageQueue();
723 bool IsEmpty()
const {
return start_ ==
end_; }
724 CommandMessage Get();
725 void Put(
const CommandMessage&
message);
726 void Clear() { start_ =
end_ = 0; }
731 CommandMessage* messages_;
738 class MessageDispatchHelperThread;
747 LockingCommandMessageQueue(Logger* logger,
int size);
748 ~LockingCommandMessageQueue();
749 bool IsEmpty()
const;
750 CommandMessage Get();
751 void Put(
const CommandMessage&
message);
755 CommandMessageQueue queue_;
765 void DebugRequest(
const uint16_t* json_request,
int length);
767 Handle<Object> MakeJSObject(Vector<const char> constructor_name,
769 Handle<Object> argv[],
770 bool* caught_exception);
771 Handle<Object> MakeExecutionState(
bool* caught_exception);
772 Handle<Object> MakeBreakEvent(Handle<Object> exec_state,
773 Handle<Object> break_points_hit,
774 bool* caught_exception);
775 Handle<Object> MakeExceptionEvent(Handle<Object> exec_state,
776 Handle<Object> exception,
778 bool* caught_exception);
779 Handle<Object> MakeNewFunctionEvent(Handle<Object> func,
780 bool* caught_exception);
781 Handle<Object> MakeCompileEvent(Handle<Script> script,
783 bool* caught_exception);
784 Handle<Object> MakeScriptCollectedEvent(
int id,
785 bool* caught_exception);
786 void OnDebugBreak(Handle<Object> break_points_hit,
bool auto_continue);
787 void OnException(Handle<Object> exception,
bool uncaught);
788 void OnBeforeCompile(Handle<Script> script);
790 enum AfterCompileFlags {
791 NO_AFTER_COMPILE_FLAGS,
794 void OnAfterCompile(Handle<Script> script,
795 AfterCompileFlags after_compile_flags);
796 void OnScriptCollected(
int id);
798 Handle<JSObject> event_data,
801 Handle<JSObject> exec_state,
802 Handle<JSObject> event_data,
804 void SetEventListener(Handle<Object> callback, Handle<Object> data);
808 void SetDebugMessageDispatchHandler(
810 bool provide_locker);
813 void InvokeMessageHandler(MessageImpl
message);
816 void ProcessCommand(Vector<const uint16_t> command,
825 Handle<Object> Call(Handle<JSFunction> fun,
827 bool* pending_exception);
830 bool StartAgent(
const char* name,
int port,
831 bool wait_for_connection =
false);
839 void CallMessageDispatchHandler();
841 Handle<Context> GetDebugContext();
845 void UnloadDebugger();
846 friend void ForceUnloadDebugger();
849 ScopedLock with(debugger_access_);
852 if (debugger_unload_pending_) {
853 if (isolate_->debug()->debugger_entry() ==
NULL) {
859 !FLAG_debug_compile_events) {
863 !FLAG_debug_script_collected_events) {
868 return !compiling_natives_ && Debugger::IsDebuggerActive();
871 void set_compiling_natives(
bool compiling_natives) {
872 compiling_natives_ = compiling_natives;
874 bool compiling_natives()
const {
return compiling_natives_; }
875 void set_loading_debugger(
bool v) { is_loading_debugger_ = v; }
876 bool is_loading_debugger()
const {
return is_loading_debugger_; }
877 void set_live_edit_enabled(
bool v) { live_edit_enabled_ = v; }
878 bool live_edit_enabled()
const {
return live_edit_enabled_; }
879 void set_force_debugger_active(
bool force_debugger_active) {
880 force_debugger_active_ = force_debugger_active;
882 bool force_debugger_active()
const {
return force_debugger_active_; }
884 bool IsDebuggerActive();
887 explicit Debugger(Isolate* isolate);
890 Handle<Object> exec_state,
891 Handle<Object> event_data,
894 Handle<Object> exec_state,
895 Handle<Object> event_data,
898 Handle<Object> exec_state,
899 Handle<Object> event_data);
900 void ListenersChanged();
902 Mutex* debugger_access_;
903 Handle<Object> event_listener_;
904 Handle<Object> event_listener_data_;
905 bool compiling_natives_;
906 bool is_loading_debugger_;
907 bool live_edit_enabled_;
908 bool never_unload_debugger_;
909 bool force_debugger_active_;
911 bool debugger_unload_pending_;
913 Mutex* dispatch_handler_access_;
915 MessageDispatchHelperThread* message_dispatch_helper_thread_;
916 int host_dispatch_micros_;
918 DebuggerAgent* agent_;
920 static const int kQueueInitialSize = 4;
921 LockingCommandMessageQueue command_queue_;
922 Semaphore* command_received_;
923 LockingCommandMessageQueue event_command_queue_;
927 friend class EnterDebugger;
928 friend class Isolate;
944 inline bool FailedToEnter() {
return load_failed_; }
947 inline bool HasJavaScriptFrames() {
return has_js_frames_; }
950 inline Handle<Context> GetContext() {
return save_.context(); }
954 EnterDebugger* prev_;
956 const bool has_js_frames_;
957 StackFrame::Id break_frame_id_;
967 explicit DisableBreak(
bool disable_break) : isolate_(Isolate::Current()) {
968 prev_disable_break_ = isolate_->debug()->disable_break();
969 isolate_->debug()->set_disable_break(disable_break);
972 ASSERT(Isolate::Current() == isolate_);
973 isolate_->debug()->set_disable_break(prev_disable_break_);
980 bool prev_disable_break_;
986 class Debug_Address {
988 explicit Debug_Address(Debug::AddressId
id) : id_(id) { }
990 static Debug_Address AfterBreakTarget() {
991 return Debug_Address(Debug::k_after_break_target_address);
994 static Debug_Address DebugBreakReturn() {
995 return Debug_Address(Debug::k_debug_break_return_address);
998 static Debug_Address RestarterFrameFunctionPointer() {
999 return Debug_Address(Debug::k_restarter_frame_function_pointer);
1002 Address address(Isolate* isolate)
const {
1003 Debug* debug = isolate->debug();
1005 case Debug::k_after_break_target_address:
1006 return reinterpret_cast<Address>(debug->after_break_target_address());
1007 case Debug::k_debug_break_return_address:
1008 return reinterpret_cast<Address>(debug->debug_break_return_address());
1009 case Debug::k_debug_break_slot_address:
1010 return reinterpret_cast<Address>(debug->debug_break_slot_address());
1011 case Debug::k_restarter_frame_function_pointer:
1012 return reinterpret_cast<Address>(
1013 debug->restarter_frame_function_pointer_address());
1021 Debug::AddressId id_;
1028 class MessageDispatchHelperThread:
public Thread {
1030 explicit MessageDispatchHelperThread(Isolate* isolate);
1031 ~MessageDispatchHelperThread();
1038 Semaphore*
const sem_;
1039 Mutex*
const mutex_;
1040 bool already_signalled_;
1048 #endif // ENABLE_DEBUGGER_SUPPORT
1050 #endif // V8_DEBUG_H_
void(* DebugMessageDispatchHandler)()
#define ASSERT(condition)
void(* MessageHandler2)(const Message &message)
HANDLE HANDLE LPSTACKFRAME64 StackFrame
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
void(* HostDispatchHandler)()
uint32_t ComputeIntegerHash(uint32_t key, uint32_t seed)
JavaScriptFrameIteratorTemp< StackFrameIterator > JavaScriptFrameIterator
Object * JSCallerSavedBuffer[kNumJSCallerSaved]
v8::Handle< v8::Value > Load(const v8::Arguments &args)
TemplateHashMapImpl< FreeStoreAllocationPolicy > HashMap
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 message
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
DECLARE_RUNTIME_FUNCTION(MaybeObject *, LoadCallbackProperty)
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