v8  3.11.10(node0.8.26)
V8 is Google's open source JavaScript engine
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
scopeinfo.cc
Go to the documentation of this file.
1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 #include <stdlib.h>
29 
30 #include "v8.h"
31 
32 #include "scopeinfo.h"
33 #include "scopes.h"
34 
35 #include "allocation-inl.h"
36 
37 namespace v8 {
38 namespace internal {
39 
40 
42  // Collect stack and context locals.
43  ZoneList<Variable*> stack_locals(scope->StackLocalCount(), zone);
44  ZoneList<Variable*> context_locals(scope->ContextLocalCount(), zone);
45  scope->CollectStackAndContextLocals(&stack_locals, &context_locals);
46  const int stack_local_count = stack_locals.length();
47  const int context_local_count = context_locals.length();
48  // Make sure we allocate the correct amount.
49  ASSERT(scope->StackLocalCount() == stack_local_count);
50  ASSERT(scope->ContextLocalCount() == context_local_count);
51 
52  // Determine use and location of the function variable if it is present.
53  FunctionVariableInfo function_name_info;
54  VariableMode function_variable_mode;
55  if (scope->is_function_scope() && scope->function() != NULL) {
56  Variable* var = scope->function()->proxy()->var();
57  if (!var->is_used()) {
58  function_name_info = UNUSED;
59  } else if (var->IsContextSlot()) {
60  function_name_info = CONTEXT;
61  } else {
62  ASSERT(var->IsStackLocal());
63  function_name_info = STACK;
64  }
65  function_variable_mode = var->mode();
66  } else {
67  function_name_info = NONE;
68  function_variable_mode = VAR;
69  }
70 
71  const bool has_function_name = function_name_info != NONE;
72  const int parameter_count = scope->num_parameters();
73  const int length = kVariablePartIndex
74  + parameter_count + stack_local_count + 2 * context_local_count
75  + (has_function_name ? 2 : 0);
76 
77  Handle<ScopeInfo> scope_info = FACTORY->NewScopeInfo(length);
78 
79  // Encode the flags.
80  int flags = TypeField::encode(scope->type()) |
81  CallsEvalField::encode(scope->calls_eval()) |
82  LanguageModeField::encode(scope->language_mode()) |
83  FunctionVariableField::encode(function_name_info) |
84  FunctionVariableMode::encode(function_variable_mode);
85  scope_info->SetFlags(flags);
86  scope_info->SetParameterCount(parameter_count);
87  scope_info->SetStackLocalCount(stack_local_count);
88  scope_info->SetContextLocalCount(context_local_count);
89 
90  int index = kVariablePartIndex;
91  // Add parameters.
92  ASSERT(index == scope_info->ParameterEntriesIndex());
93  for (int i = 0; i < parameter_count; ++i) {
94  scope_info->set(index++, *scope->parameter(i)->name());
95  }
96 
97  // Add stack locals' names. We are assuming that the stack locals'
98  // slots are allocated in increasing order, so we can simply add
99  // them to the ScopeInfo object.
100  ASSERT(index == scope_info->StackLocalEntriesIndex());
101  for (int i = 0; i < stack_local_count; ++i) {
102  ASSERT(stack_locals[i]->index() == i);
103  scope_info->set(index++, *stack_locals[i]->name());
104  }
105 
106  // Due to usage analysis, context-allocated locals are not necessarily in
107  // increasing order: Some of them may be parameters which are allocated before
108  // the non-parameter locals. When the non-parameter locals are sorted
109  // according to usage, the allocated slot indices may not be in increasing
110  // order with the variable list anymore. Thus, we first need to sort them by
111  // context slot index before adding them to the ScopeInfo object.
112  context_locals.Sort(&Variable::CompareIndex);
113 
114  // Add context locals' names.
115  ASSERT(index == scope_info->ContextLocalNameEntriesIndex());
116  for (int i = 0; i < context_local_count; ++i) {
117  scope_info->set(index++, *context_locals[i]->name());
118  }
119 
120  // Add context locals' info.
121  ASSERT(index == scope_info->ContextLocalInfoEntriesIndex());
122  for (int i = 0; i < context_local_count; ++i) {
123  Variable* var = context_locals[i];
124  uint32_t value = ContextLocalMode::encode(var->mode()) |
125  ContextLocalInitFlag::encode(var->initialization_flag());
126  scope_info->set(index++, Smi::FromInt(value));
127  }
128 
129  // If present, add the function variable name and its index.
130  ASSERT(index == scope_info->FunctionNameEntryIndex());
131  if (has_function_name) {
132  int var_index = scope->function()->proxy()->var()->index();
133  scope_info->set(index++, *scope->function()->proxy()->name());
134  scope_info->set(index++, Smi::FromInt(var_index));
135  ASSERT(function_name_info != STACK ||
136  (var_index == scope_info->StackLocalCount() &&
137  var_index == scope_info->StackSlotCount() - 1));
138  ASSERT(function_name_info != CONTEXT ||
139  var_index == scope_info->ContextLength() - 1);
140  }
141 
142  ASSERT(index == scope_info->length());
143  ASSERT(scope->num_parameters() == scope_info->ParameterCount());
144  ASSERT(scope->num_stack_slots() == scope_info->StackSlotCount());
145  ASSERT(scope->num_heap_slots() == scope_info->ContextLength() ||
146  (scope->num_heap_slots() == kVariablePartIndex &&
147  scope_info->ContextLength() == 0));
148  return scope_info;
149 }
150 
151 
153  return reinterpret_cast<ScopeInfo*>(HEAP->empty_fixed_array());
154 }
155 
156 
158  ASSERT(length() > 0);
159  return TypeField::decode(Flags());
160 }
161 
162 
164  return length() > 0 && CallsEvalField::decode(Flags());
165 }
166 
167 
169  return length() > 0 ? LanguageModeField::decode(Flags()) : CLASSIC_MODE;
170 }
171 
172 
174  return StackLocalCount() + ContextLocalCount();
175 }
176 
177 
179  if (length() > 0) {
180  bool function_name_stack_slot =
181  FunctionVariableField::decode(Flags()) == STACK;
182  return StackLocalCount() + (function_name_stack_slot ? 1 : 0);
183  }
184  return 0;
185 }
186 
187 
189  if (length() > 0) {
190  int context_locals = ContextLocalCount();
191  bool function_name_context_slot =
192  FunctionVariableField::decode(Flags()) == CONTEXT;
193  bool has_context = context_locals > 0 ||
194  function_name_context_slot ||
195  Type() == WITH_SCOPE ||
196  (Type() == FUNCTION_SCOPE && CallsEval());
197  if (has_context) {
198  return Context::MIN_CONTEXT_SLOTS + context_locals +
199  (function_name_context_slot ? 1 : 0);
200  }
201  }
202  return 0;
203 }
204 
205 
207  if (length() > 0) {
208  return NONE != FunctionVariableField::decode(Flags());
209  } else {
210  return false;
211  }
212 }
213 
214 
216  if (length() > 0) {
217  return ContextLocalCount() > 0;
218  } else {
219  return false;
220  }
221 }
222 
223 
225  if (length() > 0) {
226  return ContextLength() > 0;
227  } else {
228  return false;
229  }
230 }
231 
232 
235  return String::cast(get(FunctionNameEntryIndex()));
236 }
237 
238 
240  ASSERT(0 <= var && var < ParameterCount());
241  int info_index = ParameterEntriesIndex() + var;
242  return String::cast(get(info_index));
243 }
244 
245 
247  ASSERT(0 <= var && var < LocalCount());
248  ASSERT(StackLocalEntriesIndex() + StackLocalCount() ==
249  ContextLocalNameEntriesIndex());
250  int info_index = StackLocalEntriesIndex() + var;
251  return String::cast(get(info_index));
252 }
253 
254 
256  ASSERT(0 <= var && var < StackLocalCount());
257  int info_index = StackLocalEntriesIndex() + var;
258  return String::cast(get(info_index));
259 }
260 
261 
263  ASSERT(0 <= var && var < ContextLocalCount());
264  int info_index = ContextLocalNameEntriesIndex() + var;
265  return String::cast(get(info_index));
266 }
267 
268 
270  ASSERT(0 <= var && var < ContextLocalCount());
271  int info_index = ContextLocalInfoEntriesIndex() + var;
272  int value = Smi::cast(get(info_index))->value();
273  return ContextLocalMode::decode(value);
274 }
275 
276 
278  ASSERT(0 <= var && var < ContextLocalCount());
279  int info_index = ContextLocalInfoEntriesIndex() + var;
280  int value = Smi::cast(get(info_index))->value();
281  return ContextLocalInitFlag::decode(value);
282 }
283 
284 
286  ASSERT(name->IsSymbol());
287  if (length() > 0) {
288  int start = StackLocalEntriesIndex();
289  int end = StackLocalEntriesIndex() + StackLocalCount();
290  for (int i = start; i < end; ++i) {
291  if (name == get(i)) {
292  return i - start;
293  }
294  }
295  }
296  return -1;
297 }
298 
299 
301  VariableMode* mode,
302  InitializationFlag* init_flag) {
303  ASSERT(name->IsSymbol());
304  ASSERT(mode != NULL);
305  ASSERT(init_flag != NULL);
306  if (length() > 0) {
307  ContextSlotCache* context_slot_cache = GetIsolate()->context_slot_cache();
308  int result = context_slot_cache->Lookup(this, name, mode, init_flag);
309  if (result != ContextSlotCache::kNotFound) {
310  ASSERT(result < ContextLength());
311  return result;
312  }
313 
314  int start = ContextLocalNameEntriesIndex();
315  int end = ContextLocalNameEntriesIndex() + ContextLocalCount();
316  for (int i = start; i < end; ++i) {
317  if (name == get(i)) {
318  int var = i - start;
319  *mode = ContextLocalMode(var);
320  *init_flag = ContextLocalInitFlag(var);
321  result = Context::MIN_CONTEXT_SLOTS + var;
322  context_slot_cache->Update(this, name, *mode, *init_flag, result);
323  ASSERT(result < ContextLength());
324  return result;
325  }
326  }
327  context_slot_cache->Update(this, name, INTERNAL, kNeedsInitialization, -1);
328  }
329  return -1;
330 }
331 
332 
334  ASSERT(name->IsSymbol());
335  if (length() > 0) {
336  // We must read parameters from the end since for
337  // multiply declared parameters the value of the
338  // last declaration of that parameter is used
339  // inside a function (and thus we need to look
340  // at the last index). Was bug# 1110337.
341  int start = ParameterEntriesIndex();
342  int end = ParameterEntriesIndex() + ParameterCount();
343  for (int i = end - 1; i >= start; --i) {
344  if (name == get(i)) {
345  return i - start;
346  }
347  }
348  }
349  return -1;
350 }
351 
352 
354  ASSERT(name->IsSymbol());
355  ASSERT(mode != NULL);
356  if (length() > 0) {
357  if (FunctionVariableField::decode(Flags()) == CONTEXT &&
358  FunctionName() == name) {
359  *mode = FunctionVariableMode::decode(Flags());
360  return Smi::cast(get(FunctionNameEntryIndex() + 1))->value();
361  }
362  }
363  return -1;
364 }
365 
366 
367 int ScopeInfo::ParameterEntriesIndex() {
368  ASSERT(length() > 0);
369  return kVariablePartIndex;
370 }
371 
372 
373 int ScopeInfo::StackLocalEntriesIndex() {
374  return ParameterEntriesIndex() + ParameterCount();
375 }
376 
377 
378 int ScopeInfo::ContextLocalNameEntriesIndex() {
379  return StackLocalEntriesIndex() + StackLocalCount();
380 }
381 
382 
383 int ScopeInfo::ContextLocalInfoEntriesIndex() {
384  return ContextLocalNameEntriesIndex() + ContextLocalCount();
385 }
386 
387 
388 int ScopeInfo::FunctionNameEntryIndex() {
389  return ContextLocalInfoEntriesIndex() + ContextLocalCount();
390 }
391 
392 
393 int ContextSlotCache::Hash(Object* data, String* name) {
394  // Uses only lower 32 bits if pointers are larger.
395  uintptr_t addr_hash =
396  static_cast<uint32_t>(reinterpret_cast<uintptr_t>(data)) >> 2;
397  return static_cast<int>((addr_hash ^ name->Hash()) % kLength);
398 }
399 
400 
402  String* name,
403  VariableMode* mode,
404  InitializationFlag* init_flag) {
405  int index = Hash(data, name);
406  Key& key = keys_[index];
407  if ((key.data == data) && key.name->Equals(name)) {
408  Value result(values_[index]);
409  if (mode != NULL) *mode = result.mode();
410  if (init_flag != NULL) *init_flag = result.initialization_flag();
411  return result.index() + kNotFound;
412  }
413  return kNotFound;
414 }
415 
416 
418  String* name,
419  VariableMode mode,
420  InitializationFlag init_flag,
421  int slot_index) {
422  String* symbol;
423  ASSERT(slot_index > kNotFound);
424  if (HEAP->LookupSymbolIfExists(name, &symbol)) {
425  int index = Hash(data, symbol);
426  Key& key = keys_[index];
427  key.data = data;
428  key.name = symbol;
429  // Please note value only takes a uint as index.
430  values_[index] = Value(mode, init_flag, slot_index - kNotFound).raw();
431 #ifdef DEBUG
432  ValidateEntry(data, name, mode, init_flag, slot_index);
433 #endif
434  }
435 }
436 
437 
439  for (int index = 0; index < kLength; index++) keys_[index].data = NULL;
440 }
441 
442 
443 #ifdef DEBUG
444 
445 void ContextSlotCache::ValidateEntry(Object* data,
446  String* name,
447  VariableMode mode,
448  InitializationFlag init_flag,
449  int slot_index) {
450  String* symbol;
451  if (HEAP->LookupSymbolIfExists(name, &symbol)) {
452  int index = Hash(data, name);
453  Key& key = keys_[index];
454  ASSERT(key.data == data);
455  ASSERT(key.name->Equals(name));
456  Value result(values_[index]);
457  ASSERT(result.mode() == mode);
458  ASSERT(result.initialization_flag() == init_flag);
459  ASSERT(result.index() + kNotFound == slot_index);
460  }
461 }
462 
463 
464 static void PrintList(const char* list_name,
465  int nof_internal_slots,
466  int start,
467  int end,
468  ScopeInfo* scope_info) {
469  if (start < end) {
470  PrintF("\n // %s\n", list_name);
471  if (nof_internal_slots > 0) {
472  PrintF(" %2d - %2d [internal slots]\n", 0 , nof_internal_slots - 1);
473  }
474  for (int i = nof_internal_slots; start < end; ++i, ++start) {
475  PrintF(" %2d ", i);
476  String::cast(scope_info->get(start))->ShortPrint();
477  PrintF("\n");
478  }
479  }
480 }
481 
482 
483 void ScopeInfo::Print() {
484  PrintF("ScopeInfo ");
485  if (HasFunctionName()) {
487  } else {
488  PrintF("/* no function name */");
489  }
490  PrintF("{");
491 
492  PrintList("parameters", 0,
493  ParameterEntriesIndex(),
494  ParameterEntriesIndex() + ParameterCount(),
495  this);
496  PrintList("stack slots", 0,
497  StackLocalEntriesIndex(),
498  StackLocalEntriesIndex() + StackLocalCount(),
499  this);
500  PrintList("context slots",
502  ContextLocalNameEntriesIndex(),
503  ContextLocalNameEntriesIndex() + ContextLocalCount(),
504  this);
505 
506  PrintF("}\n");
507 }
508 #endif // DEBUG
509 
510 } } // namespace v8::internal
int StackSlotIndex(String *name)
Definition: scopeinfo.cc:285
ContextSlotCache * context_slot_cache()
Definition: isolate.h:838
VariableDeclaration * function() const
Definition: scopes.h:323
bool calls_eval() const
Definition: scopes.h:296
void PrintF(const char *format,...)
Definition: v8utils.cc:40
static String * cast(Object *obj)
Definition: v8.h:863
static Smi * FromInt(int value)
Definition: objects-inl.h:973
void CollectStackAndContextLocals(ZoneList< Variable * > *stack_locals, ZoneList< Variable * > *context_locals)
Definition: scopes.cc:589
int ContextSlotIndex(String *name, VariableMode *mode, InitializationFlag *init_flag)
Definition: scopeinfo.cc:300
value format" "after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false, "print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false, "print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false, "report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true, "garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true, "flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true, "use incremental marking") DEFINE_bool(incremental_marking_steps, true, "do incremental marking steps") DEFINE_bool(trace_incremental_marking, false, "trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true, "Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false, "Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true, "use inline caching") DEFINE_bool(native_code_counters, false, "generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false, "Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true, "Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false, "Never perform compaction on full GC-testing only") DEFINE_bool(compact_code_space, true, "Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true, "Flush inline caches prior to mark compact collection and" "flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0, "Default seed for initializing random generator" "(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true, "allows verbose printing") DEFINE_bool(allow_natives_syntax, false, "allow natives syntax") DEFINE_bool(trace_sim, false, "Trace simulator execution") DEFINE_bool(check_icache, false, "Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0, "Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8, "Stack alingment in bytes in simulator(4 or 8, 8 is default)") DEFINE_bool(trace_exception, false, "print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false, "preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true, "randomize hashes to avoid predictable hash collisions" "(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0, "Fixed seed to use to hash property keys(0 means random)" "(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false, "activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true, "generate optimized regexp code") DEFINE_bool(testing_bool_flag, true, "testing_bool_flag") DEFINE_int(testing_int_flag, 13, "testing_int_flag") DEFINE_float(testing_float_flag, 2.5, "float-flag") DEFINE_string(testing_string_flag, "Hello, world!", "string-flag") DEFINE_int(testing_prng_seed, 42, "Seed used for threading test randomness") DEFINE_string(testing_serialization_file, "/tmp/serdes", "file in which to serialize heap") DEFINE_bool(help, false, "Print usage message, including flags, on console") DEFINE_bool(dump_counters, false, "Dump counters on exit") DEFINE_string(map_counters, "", "Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT, "Pass all remaining arguments to the script.Alias for\"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#43"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2#define FLAG_MODE_DEFINE_DEFAULTS#1"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flag-definitions.h"1#define FLAG_FULL(ftype, ctype, nam, def, cmt)#define FLAG_READONLY(ftype, ctype, nam, def, cmt)#define DEFINE_implication(whenflag, thenflag)#define DEFINE_bool(nam, def, cmt)#define DEFINE_int(nam, def, cmt)#define DEFINE_float(nam, def, cmt)#define DEFINE_string(nam, def, cmt)#define DEFINE_args(nam, def, cmt)#define FLAG DEFINE_bool(use_strict, false,"enforce strict mode") DEFINE_bool(es5_readonly, false,"activate correct semantics for inheriting readonliness") DEFINE_bool(es52_globals, false,"activate new semantics for global var declarations") DEFINE_bool(harmony_typeof, false,"enable harmony semantics for typeof") DEFINE_bool(harmony_scoping, false,"enable harmony block scoping") DEFINE_bool(harmony_modules, false,"enable harmony modules (implies block scoping)") DEFINE_bool(harmony_proxies, false,"enable harmony proxies") DEFINE_bool(harmony_collections, false,"enable harmony collections (sets, maps, and weak maps)") DEFINE_bool(harmony, false,"enable all harmony features (except typeof)") DEFINE_implication(harmony, harmony_scoping) DEFINE_implication(harmony, harmony_modules) DEFINE_implication(harmony, harmony_proxies) DEFINE_implication(harmony, harmony_collections) DEFINE_implication(harmony_modules, harmony_scoping) DEFINE_bool(packed_arrays, false,"optimizes arrays that have no holes") DEFINE_bool(smi_only_arrays, true,"tracks arrays with only smi values") DEFINE_bool(clever_optimizations, true,"Optimize object size, Array shift, DOM strings and string +") DEFINE_bool(unbox_double_arrays, true,"automatically unbox arrays of doubles") DEFINE_bool(string_slices, true,"use string slices") DEFINE_bool(crankshaft, true,"use crankshaft") DEFINE_string(hydrogen_filter,"","optimization filter") DEFINE_bool(use_range, true,"use hydrogen range analysis") DEFINE_bool(eliminate_dead_phis, true,"eliminate dead phis") DEFINE_bool(use_gvn, true,"use hydrogen global value numbering") DEFINE_bool(use_canonicalizing, true,"use hydrogen instruction canonicalizing") DEFINE_bool(use_inlining, true,"use function inlining") DEFINE_int(max_inlined_source_size, 600,"maximum source size in bytes considered for a single inlining") DEFINE_int(max_inlined_nodes, 196,"maximum number of AST nodes considered for a single inlining") DEFINE_int(max_inlined_nodes_cumulative, 196,"maximum cumulative number of AST nodes considered for inlining") DEFINE_bool(loop_invariant_code_motion, true,"loop invariant code motion") DEFINE_bool(collect_megamorphic_maps_from_stub_cache, true,"crankshaft harvests type feedback from stub cache") DEFINE_bool(hydrogen_stats, false,"print statistics for hydrogen") DEFINE_bool(trace_hydrogen, false,"trace generated hydrogen to file") DEFINE_string(trace_phase,"Z","trace generated IR for specified phases") DEFINE_bool(trace_inlining, false,"trace inlining decisions") DEFINE_bool(trace_alloc, false,"trace register allocator") DEFINE_bool(trace_all_uses, false,"trace all use positions") DEFINE_bool(trace_range, false,"trace range analysis") DEFINE_bool(trace_gvn, false,"trace global value numbering") DEFINE_bool(trace_representation, false,"trace representation types") DEFINE_bool(stress_pointer_maps, false,"pointer map for every instruction") DEFINE_bool(stress_environments, false,"environment for every instruction") DEFINE_int(deopt_every_n_times, 0,"deoptimize every n times a deopt point is passed") DEFINE_bool(trap_on_deopt, false,"put a break point before deoptimizing") DEFINE_bool(deoptimize_uncommon_cases, true,"deoptimize uncommon cases") DEFINE_bool(polymorphic_inlining, true,"polymorphic inlining") DEFINE_bool(use_osr, true,"use on-stack replacement") DEFINE_bool(array_bounds_checks_elimination, false,"perform array bounds checks elimination") DEFINE_bool(array_index_dehoisting, false,"perform array index dehoisting") DEFINE_bool(trace_osr, false,"trace on-stack replacement") DEFINE_int(stress_runs, 0,"number of stress runs") DEFINE_bool(optimize_closures, true,"optimize closures") DEFINE_bool(inline_construct, true,"inline constructor calls") DEFINE_bool(inline_arguments, true,"inline functions with arguments object") DEFINE_int(loop_weight, 1,"loop weight for representation inference") DEFINE_bool(optimize_for_in, true,"optimize functions containing for-in loops") DEFINE_bool(experimental_profiler, true,"enable all profiler experiments") DEFINE_bool(watch_ic_patching, false,"profiler considers IC stability") DEFINE_int(frame_count, 1,"number of stack frames inspected by the profiler") DEFINE_bool(self_optimization, false,"primitive functions trigger their own optimization") DEFINE_bool(direct_self_opt, false,"call recompile stub directly when self-optimizing") DEFINE_bool(retry_self_opt, false,"re-try self-optimization if it failed") DEFINE_bool(count_based_interrupts, false,"trigger profiler ticks based on counting instead of timing") DEFINE_bool(interrupt_at_exit, false,"insert an interrupt check at function exit") DEFINE_bool(weighted_back_edges, false,"weight back edges by jump distance for interrupt triggering") DEFINE_int(interrupt_budget, 5900,"execution budget before interrupt is triggered") DEFINE_int(type_info_threshold, 15,"percentage of ICs that must have type info to allow optimization") DEFINE_int(self_opt_count, 130,"call count before self-optimization") DEFINE_implication(experimental_profiler, watch_ic_patching) DEFINE_implication(experimental_profiler, self_optimization) DEFINE_implication(experimental_profiler, retry_self_opt) DEFINE_implication(experimental_profiler, count_based_interrupts) DEFINE_implication(experimental_profiler, interrupt_at_exit) DEFINE_implication(experimental_profiler, weighted_back_edges) DEFINE_bool(trace_opt_verbose, false,"extra verbose compilation tracing") DEFINE_implication(trace_opt_verbose, trace_opt) DEFINE_bool(debug_code, false,"generate extra code (assertions) for debugging") DEFINE_bool(code_comments, false,"emit comments in code disassembly") DEFINE_bool(enable_sse2, true,"enable use of SSE2 instructions if available") DEFINE_bool(enable_sse3, true,"enable use of SSE3 instructions if available") DEFINE_bool(enable_sse4_1, true,"enable use of SSE4.1 instructions if available") DEFINE_bool(enable_cmov, true,"enable use of CMOV instruction if available") DEFINE_bool(enable_rdtsc, true,"enable use of RDTSC instruction if available") DEFINE_bool(enable_sahf, true,"enable use of SAHF instruction if available (X64 only)") DEFINE_bool(enable_vfp3, true,"enable use of VFP3 instructions if available - this implies ""enabling ARMv7 instructions (ARM only)") DEFINE_bool(enable_armv7, true,"enable use of ARMv7 instructions if available (ARM only)") DEFINE_bool(enable_fpu, true,"enable use of MIPS FPU instructions if available (MIPS only)") DEFINE_string(expose_natives_as, NULL,"expose natives in global object") DEFINE_string(expose_debug_as, NULL,"expose debug in global object") DEFINE_bool(expose_gc, false,"expose gc extension") DEFINE_bool(expose_externalize_string, false,"expose externalize string extension") DEFINE_int(stack_trace_limit, 10,"number of stack frames to capture") DEFINE_bool(builtins_in_stack_traces, false,"show built-in functions in stack traces") DEFINE_bool(disable_native_files, false,"disable builtin natives files") DEFINE_bool(inline_new, true,"use fast inline allocation") DEFINE_bool(stack_trace_on_abort, true,"print a stack trace if an assertion failure occurs") DEFINE_bool(trace, false,"trace function calls") DEFINE_bool(mask_constants_with_cookie, true,"use random jit cookie to mask large constants") DEFINE_bool(lazy, true,"use lazy compilation") DEFINE_bool(trace_opt, false,"trace lazy optimization") DEFINE_bool(trace_opt_stats, false,"trace lazy optimization statistics") DEFINE_bool(opt, true,"use adaptive optimizations") DEFINE_bool(always_opt, false,"always try to optimize functions") DEFINE_bool(prepare_always_opt, false,"prepare for turning on always opt") DEFINE_bool(trace_deopt, false,"trace deoptimization") DEFINE_int(min_preparse_length, 1024,"minimum length for automatic enable preparsing") DEFINE_bool(always_full_compiler, false,"try to use the dedicated run-once backend for all code") DEFINE_bool(trace_bailout, false,"print reasons for falling back to using the classic V8 backend") DEFINE_bool(compilation_cache, true,"enable compilation cache") DEFINE_bool(cache_prototype_transitions, true,"cache prototype transitions") DEFINE_bool(trace_debug_json, false,"trace debugging JSON request/response") DEFINE_bool(debugger_auto_break, true,"automatically set the debug break flag when debugger commands are ""in the queue") DEFINE_bool(enable_liveedit, true,"enable liveedit experimental feature") DEFINE_bool(break_on_abort, true,"always cause a debug break before aborting") DEFINE_int(stack_size, kPointerSize *123,"default size of stack region v8 is allowed to use (in kBytes)") DEFINE_int(max_stack_trace_source_length, 300,"maximum length of function source code printed in a stack trace.") DEFINE_bool(always_inline_smi_code, false,"always inline smi code in non-opt code") DEFINE_int(max_new_space_size, 0,"max size of the new generation (in kBytes)") DEFINE_int(max_old_space_size, 0,"max size of the old generation (in Mbytes)") DEFINE_int(max_executable_size, 0,"max size of executable memory (in Mbytes)") DEFINE_bool(gc_global, false,"always perform global GCs") DEFINE_int(gc_interval,-1,"garbage collect after <n> allocations") DEFINE_bool(trace_gc, false,"print one trace line following each garbage collection") DEFINE_bool(trace_gc_nvp, false,"print one detailed trace line in name=value format ""after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false,"print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false,"print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false,"report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true,"garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true,"flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true,"use incremental marking") DEFINE_bool(incremental_marking_steps, true,"do incremental marking steps") DEFINE_bool(trace_incremental_marking, false,"trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true,"Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false,"Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true,"use inline caching") DEFINE_bool(native_code_counters, false,"generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false,"Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true,"Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false,"Never perform compaction on full GC - testing only") DEFINE_bool(compact_code_space, true,"Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true,"Flush inline caches prior to mark compact collection and ""flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0,"Default seed for initializing random generator ""(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true,"allows verbose printing") DEFINE_bool(allow_natives_syntax, false,"allow natives syntax") DEFINE_bool(trace_sim, false,"Trace simulator execution") DEFINE_bool(check_icache, false,"Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0,"Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8,"Stack alingment in bytes in simulator (4 or 8, 8 is default)") DEFINE_bool(trace_exception, false,"print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false,"preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true,"randomize hashes to avoid predictable hash collisions ""(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0,"Fixed seed to use to hash property keys (0 means random)""(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false,"activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true,"generate optimized regexp code") DEFINE_bool(testing_bool_flag, true,"testing_bool_flag") DEFINE_int(testing_int_flag, 13,"testing_int_flag") DEFINE_float(testing_float_flag, 2.5,"float-flag") DEFINE_string(testing_string_flag,"Hello, world!","string-flag") DEFINE_int(testing_prng_seed, 42,"Seed used for threading test randomness") DEFINE_string(testing_serialization_file,"/tmp/serdes","file in which to serialize heap") DEFINE_bool(help, false,"Print usage message, including flags, on console") DEFINE_bool(dump_counters, false,"Dump counters on exit") DEFINE_string(map_counters,"","Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT,"Pass all remaining arguments to the script. Alias for \"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#47"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2 namespace{struct Flag{enum FlagType{TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS} name
Definition: flags.cc:1349
int ParameterIndex(String *name)
Definition: scopeinfo.cc:333
int Lookup(Object *data, String *name, VariableMode *mode, InitializationFlag *init_flag)
Definition: scopeinfo.cc:401
Flag flags[]
Definition: flags.cc:1467
static const int kNotFound
Definition: scopeinfo.h:61
InitializationFlag initialization_flag() const
Definition: variables.h:155
#define ASSERT(condition)
Definition: checks.h:270
v8::Handle< v8::Value > Print(const v8::Arguments &args)
InitializationFlag ContextLocalInitFlag(int var)
Definition: scopeinfo.cc:277
Variable * parameter(int index) const
Definition: scopes.h:330
Handle< String > name() const
Definition: ast.h:1483
Handle< String > name() const
Definition: variables.h:96
static Smi * cast(Object *object)
static Handle< ScopeInfo > Create(Scope *scope, Zone *zone)
Definition: scopeinfo.cc:41
Variable * var() const
Definition: ast.h:1484
VariableProxy * proxy() const
Definition: ast.h:452
VariableMode mode() const
Definition: variables.h:97
int num_stack_slots() const
Definition: scopes.h:365
ScopeType type() const
Definition: scopes.h:313
static int CompareIndex(Variable *const *v, Variable *const *w)
Definition: variables.cc:91
int index() const
Definition: variables.h:154
void Update(Object *data, String *name, VariableMode mode, InitializationFlag init_flag, int slot_index)
Definition: scopeinfo.cc:417
bool IsContextSlot() const
Definition: variables.h:119
int num_parameters() const
Definition: scopes.h:335
static ScopeInfo * Empty()
Definition: scopeinfo.cc:152
int FunctionContextSlotIndex(String *name, VariableMode *mode)
Definition: scopeinfo.cc:353
bool IsStackLocal() const
Definition: variables.h:117
int StackLocalCount() const
Definition: scopes.cc:1289
int num_heap_slots() const
Definition: scopes.h:366
String * StackLocalName(int var)
Definition: scopeinfo.cc:255
VariableMode ContextLocalMode(int var)
Definition: scopeinfo.cc:269
String * LocalName(int var)
Definition: scopeinfo.cc:246
String * ContextLocalName(int var)
Definition: scopeinfo.cc:262
#define HEAP
Definition: isolate.h:1408
int ContextLocalCount() const
Definition: scopes.cc:1295
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 trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt 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 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
Definition: flags.cc:274
String * ParameterName(int var)
Definition: scopeinfo.cc:239
#define FACTORY
Definition: isolate.h:1409
LanguageMode language_mode() const
Definition: scopes.h:316
bool is_function_scope() const
Definition: scopes.h:276
LanguageMode language_mode()
Definition: scopeinfo.cc:168