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
scopes.h
Go to the documentation of this file.
1 // Copyright 2012 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 #ifndef V8_SCOPES_H_
29 #define V8_SCOPES_H_
30 
31 #include "ast.h"
32 #include "zone.h"
33 
34 namespace v8 {
35 namespace internal {
36 
37 class CompilationInfo;
38 
39 
40 // A hash map to support fast variable declaration and lookup.
41 class VariableMap: public ZoneHashMap {
42  public:
43  explicit VariableMap(Zone* zone);
44 
45  virtual ~VariableMap();
46 
47  Variable* Declare(Scope* scope,
49  VariableMode mode,
50  bool is_valid_lhs,
51  Variable::Kind kind,
52  InitializationFlag initialization_flag,
53  Interface* interface = Interface::NewValue());
54 
56 
57  Zone* zone() const { return zone_; }
58 
59  private:
60  Zone* zone_;
61 };
62 
63 
64 // The dynamic scope part holds hash maps for the variables that will
65 // be looked up dynamically from within eval and with scopes. The objects
66 // are allocated on-demand from Scope::NonLocal to avoid wasting memory
67 // and setup time for scopes that don't need them.
68 class DynamicScopePart : public ZoneObject {
69  public:
70  explicit DynamicScopePart(Zone* zone) {
71  for (int i = 0; i < 3; i++)
72  maps_[i] = new(zone->New(sizeof(VariableMap))) VariableMap(zone);
73  }
74 
76  int index = mode - DYNAMIC;
77  ASSERT(index >= 0 && index < 3);
78  return maps_[index];
79  }
80 
81  private:
82  VariableMap *maps_[3];
83 };
84 
85 
86 // Global invariants after AST construction: Each reference (i.e. identifier)
87 // to a JavaScript variable (including global properties) is represented by a
88 // VariableProxy node. Immediately after AST construction and before variable
89 // allocation, most VariableProxy nodes are "unresolved", i.e. not bound to a
90 // corresponding variable (though some are bound during parse time). Variable
91 // allocation binds each unresolved VariableProxy to one Variable and assigns
92 // a location. Note that many VariableProxy nodes may refer to the same Java-
93 // Script variable.
94 
95 class Scope: public ZoneObject {
96  public:
97  // ---------------------------------------------------------------------------
98  // Construction
99 
101 
102  // Compute top scope and allocate variables. For lazy compilation the top
103  // scope only contains the single lazily compiled function, so this
104  // doesn't re-allocate variables repeatedly.
105  static bool Analyze(CompilationInfo* info);
106 
107  static Scope* DeserializeScopeChain(Context* context, Scope* global_scope,
108  Zone* zone);
109 
110  // The scope name is only used for printing/debugging.
111  void SetScopeName(Handle<String> scope_name) { scope_name_ = scope_name; }
112 
113  void Initialize();
114 
115  // Checks if the block scope is redundant, i.e. it does not contain any
116  // block scoped declarations. In that case it is removed from the scope
117  // tree and its children are reparented.
119 
120  Zone* zone() const { return zone_; }
121 
122  // ---------------------------------------------------------------------------
123  // Declarations
124 
125  // Lookup a variable in this scope. Returns the variable or NULL if not found.
127 
128  // This lookup corresponds to a lookup in the "intermediate" scope sitting
129  // between this scope and the outer scope. (ECMA-262, 3rd., requires that
130  // the name of named function literal is kept in an intermediate scope
131  // in between this scope and the next outer scope.)
134 
135  // Lookup a variable in this scope or outer scopes.
136  // Returns the variable or NULL if not found.
138 
139  // Declare the function variable for a function literal. This variable
140  // is in an intermediate scope between this function scope and the the
141  // outer scope. Only possible for function scopes; at most one variable.
144  function_ = declaration;
145  }
146 
147  // Declare a parameter in this scope. When there are duplicated
148  // parameters the rightmost one 'wins'. However, the implementation
149  // expects all parameters to be declared and from left to right.
151 
152  // Declare a local variable in this scope. If the variable has been
153  // declared before, the previously declared variable is returned.
155  VariableMode mode,
156  InitializationFlag init_flag,
158 
159  // Declare an implicit global variable in this scope which must be a
160  // global scope. The variable was introduced (possibly from an inner
161  // scope) by a reference to an unresolved variable with no intervening
162  // with statements or eval calls.
164 
165  // Create a new unresolved variable.
166  template<class Visitor>
168  Handle<String> name,
169  int position = RelocInfo::kNoPosition,
171  // Note that we must not share the unresolved variables with
172  // the same name because they may be removed selectively via
173  // RemoveUnresolved().
175  VariableProxy* proxy =
176  factory->NewVariableProxy(name, false, position, interface);
177  unresolved_.Add(proxy, zone_);
178  return proxy;
179  }
180 
181  // Remove a unresolved variable. During parsing, an unresolved variable
182  // may have been added optimistically, but then only the variable name
183  // was used (typically for labels). If the variable was not declared, the
184  // addition introduced a new unresolved variable which may end up being
185  // allocated globally as a "ghost" variable. RemoveUnresolved removes
186  // such a variable again if it was added; otherwise this is a no-op.
187  void RemoveUnresolved(VariableProxy* var);
188 
189  // Creates a new temporary variable in this scope. The name is only used
190  // for printing and cannot be used to find the variable. In particular,
191  // the only way to get hold of the temporary is by keeping the Variable*
192  // around.
194 
195  // Adds the specific declaration node to the list of declarations in
196  // this scope. The declarations are processed as part of entering
197  // the scope; see codegen.cc:ProcessDeclarations.
198  void AddDeclaration(Declaration* declaration);
199 
200  // ---------------------------------------------------------------------------
201  // Illegal redeclaration support.
202 
203  // Set an expression node that will be executed when the scope is
204  // entered. We only keep track of one illegal redeclaration node per
205  // scope - the first one - so if you try to set it multiple times
206  // the additional requests will be silently ignored.
207  void SetIllegalRedeclaration(Expression* expression);
208 
209  // Visit the illegal redeclaration expression. Do not call if the
210  // scope doesn't have an illegal redeclaration node.
211  void VisitIllegalRedeclaration(AstVisitor* visitor);
212 
213  // Check if the scope has (at least) one illegal redeclaration.
214  bool HasIllegalRedeclaration() const { return illegal_redecl_ != NULL; }
215 
216  // For harmony block scoping mode: Check if the scope has conflicting var
217  // declarations, i.e. a var declaration that has been hoisted from a nested
218  // scope over a let binding of the same name.
220 
221  // For harmony block scoping mode: Check if the scope has variable proxies
222  // that are used as lvalues and point to const variables. Assumes that scopes
223  // have been analyzed and variables been resolved.
225 
226  // ---------------------------------------------------------------------------
227  // Scope-specific info.
228 
229  // Inform the scope that the corresponding code contains a with statement.
231 
232  // Inform the scope that the corresponding code contains an eval call.
234 
235  // Set the strict mode flag (unless disabled by a global flag).
238  }
239 
240  // Position in the source where this scope begins and ends.
241  //
242  // * For the scope of a with statement
243  // with (obj) stmt
244  // start position: start position of first token of 'stmt'
245  // end position: end position of last token of 'stmt'
246  // * For the scope of a block
247  // { stmts }
248  // start position: start position of '{'
249  // end position: end position of '}'
250  // * For the scope of a function literal or decalaration
251  // function fun(a,b) { stmts }
252  // start position: start position of '('
253  // end position: end position of '}'
254  // * For the scope of a catch block
255  // try { stms } catch(e) { stmts }
256  // start position: start position of '('
257  // end position: end position of ')'
258  // * For the scope of a for-statement
259  // for (let x ...) stmt
260  // start position: start position of '('
261  // end position: end position of last token of 'stmt'
262  int start_position() const { return start_position_; }
263  void set_start_position(int statement_pos) {
264  start_position_ = statement_pos;
265  }
266  int end_position() const { return end_position_; }
267  void set_end_position(int statement_pos) {
268  end_position_ = statement_pos;
269  }
270 
271  // ---------------------------------------------------------------------------
272  // Predicates.
273 
274  // Specific scope types.
275  bool is_eval_scope() const { return type_ == EVAL_SCOPE; }
276  bool is_function_scope() const { return type_ == FUNCTION_SCOPE; }
277  bool is_module_scope() const { return type_ == MODULE_SCOPE; }
278  bool is_global_scope() const { return type_ == GLOBAL_SCOPE; }
279  bool is_catch_scope() const { return type_ == CATCH_SCOPE; }
280  bool is_block_scope() const { return type_ == BLOCK_SCOPE; }
281  bool is_with_scope() const { return type_ == WITH_SCOPE; }
282  bool is_declaration_scope() const {
284  }
285  bool is_classic_mode() const {
286  return language_mode() == CLASSIC_MODE;
287  }
288  bool is_extended_mode() const {
289  return language_mode() == EXTENDED_MODE;
290  }
292  return is_eval_scope() && !is_classic_mode();
293  }
294 
295  // Information about which scopes calls eval.
296  bool calls_eval() const { return scope_calls_eval_; }
299  }
302  }
303 
304  // Is this scope inside a with statement.
305  bool inside_with() const { return scope_inside_with_; }
306  // Does this scope contain a with statement.
307  bool contains_with() const { return scope_contains_with_; }
308 
309  // ---------------------------------------------------------------------------
310  // Accessors.
311 
312  // The type of this scope.
313  ScopeType type() const { return type_; }
314 
315  // The language mode of this scope.
317 
318  // The variable corresponding the 'this' value.
319  Variable* receiver() { return receiver_; }
320 
321  // The variable holding the function literal for named function
322  // literals, or NULL. Only valid for function scopes.
323  VariableDeclaration* function() const {
325  return function_;
326  }
327 
328  // Parameters. The left-most parameter has index 0.
329  // Only valid for function scopes.
330  Variable* parameter(int index) const {
332  return params_[index];
333  }
334 
335  int num_parameters() const { return params_.length(); }
336 
337  // The local variable 'arguments' if we need to allocate it; NULL otherwise.
338  Variable* arguments() const { return arguments_; }
339 
340  // Declarations list.
342 
343  // Inner scope list.
345 
346  // The scope immediately surrounding this scope, or NULL.
347  Scope* outer_scope() const { return outer_scope_; }
348 
349  // The interface as inferred so far; only for module scopes.
350  Interface* interface() const { return interface_; }
351 
352  // ---------------------------------------------------------------------------
353  // Variable allocation.
354 
355  // Collect stack and context allocated local variables in this scope. Note
356  // that the function variable - if present - is not collected and should be
357  // handled separately.
359  ZoneList<Variable*>* context_locals);
360 
361  // Current number of var or const locals.
363 
364  // Result of variable allocation.
365  int num_stack_slots() const { return num_stack_slots_; }
366  int num_heap_slots() const { return num_heap_slots_; }
367 
368  int StackLocalCount() const;
369  int ContextLocalCount() const;
370 
371  // Make sure this scope and all outer scopes are eagerly compiled.
373 
374  // Determine if we can use lazy compilation for this scope.
375  bool AllowsLazyCompilation() const;
376 
377  // True if we can lazily recompile functions with this scope.
378  bool AllowsLazyRecompilation() const;
379 
380  // True if the outer context of this scope is always the global context.
381  bool HasTrivialOuterContext() const;
382 
383  // True if this scope is inside a with scope and all declaration scopes
384  // between them have empty contexts. Such declaration scopes become
385  // invisible during scope info deserialization.
387 
388  // The number of contexts between this and scope; zero if this == scope.
389  int ContextChainLength(Scope* scope);
390 
391  // Find the first function, global, or eval scope. This is the scope
392  // where var declarations will be hoisted to in the implementation.
394 
396 
397  // Get the chain of nested scopes within this scope for the source statement
398  // position. The scopes will be added to the list from the outermost scope to
399  // the innermost scope. Only nested block, catch or with scopes are tracked
400  // and will be returned, but no inner function scopes.
402  int statement_position);
403 
404  // ---------------------------------------------------------------------------
405  // Strict mode support.
407  // During formal parameter list parsing the scope only contains
408  // two variables inserted at initialization: "this" and "arguments".
409  // "this" is an invalid parameter name and "arguments" is invalid parameter
410  // name in strict mode. Therefore looking up with the map which includes
411  // "this" and "arguments" in addition to all formal parameters is safe.
412  return variables_.Lookup(name) != NULL;
413  }
414 
415  // ---------------------------------------------------------------------------
416  // Debugging.
417 
418 #ifdef DEBUG
419  void Print(int n = 0); // n = indentation; n < 0 => don't print recursively
420 #endif
421 
422  // ---------------------------------------------------------------------------
423  // Implementation.
424  protected:
425  friend class ParserFactory;
426 
428 
429  // Scope tree.
430  Scope* outer_scope_; // the immediately enclosing outer scope, or NULL
431  ZoneList<Scope*> inner_scopes_; // the immediately enclosed inner scopes
432 
433  // The scope type.
435 
436  // Debugging support.
438 
439  // The variables declared in this scope:
440  //
441  // All user-declared variables (incl. parameters). For global scopes
442  // variables may be implicitly 'declared' by being used (possibly in
443  // an inner scope) with no intervening with statements or eval calls.
445  // Compiler-allocated (user-invisible) temporaries.
447  // Parameter list in source order.
449  // Variables that must be looked up dynamically.
451  // Unresolved variables referred to from this scope.
453  // Declarations.
455  // Convenience variable.
457  // Function variable, if any; function scopes only.
459  // Convenience variable; function scopes only.
461  // Interface; module scopes only.
463 
464  // Illegal redeclaration.
466 
467  // Scope-specific information computed during parsing.
468  //
469  // This scope is inside a 'with' of some outer scope.
471  // This scope contains a 'with' statement.
473  // This scope or a nested catch scope or with scope contain an 'eval' call. At
474  // the 'eval' call site this scope is the declaration scope.
476  // The language mode of this scope.
478  // Source positions.
481 
482  // Computed via PropagateScopeInfo.
486 
487  // True if it doesn't need scope resolution (e.g., if the scope was
488  // constructed based on a serialized scope info or a catch context).
490 
491  // Computed as variables are declared.
493 
494  // Computed via AllocateVariables; function, block and catch scopes only.
497 
498  // Serialized scope info support.
501 
502  // Create a non-local variable with a given name.
503  // These variables are looked up dynamically at runtime.
505 
506  // Variable resolution.
507  // Possible results of a recursive variable lookup telling if and how a
508  // variable is bound. These are returned in the output parameter *binding_kind
509  // of the LookupRecursive function.
510  enum BindingKind {
511  // The variable reference could be statically resolved to a variable binding
512  // which is returned. There is no 'with' statement between the reference and
513  // the binding and no scope between the reference scope (inclusive) and
514  // binding scope (exclusive) makes a non-strict 'eval' call.
516 
517  // The variable reference could be statically resolved to a variable binding
518  // which is returned. There is no 'with' statement between the reference and
519  // the binding, but some scope between the reference scope (inclusive) and
520  // binding scope (exclusive) makes a non-strict 'eval' call, that might
521  // possibly introduce variable bindings shadowing the found one. Thus the
522  // found variable binding is just a guess.
524 
525  // The variable reference could not be statically resolved to any binding
526  // and thus should be considered referencing a global variable. NULL is
527  // returned. The variable reference is not inside any 'with' statement and
528  // no scope between the reference scope (inclusive) and global scope
529  // (exclusive) makes a non-strict 'eval' call.
531 
532  // The variable reference could not be statically resolved to any binding
533  // NULL is returned. The variable reference is not inside any 'with'
534  // statement, but some scope between the reference scope (inclusive) and
535  // global scope (exclusive) makes a non-strict 'eval' call, that might
536  // possibly introduce a variable binding. Thus the reference should be
537  // considered referencing a global variable unless it is shadowed by an
538  // 'eval' introduced binding.
540 
541  // The variable could not be statically resolved and needs to be looked up
542  // dynamically. NULL is returned. There are two possible reasons:
543  // * A 'with' statement has been encountered and there is no variable
544  // binding for the name between the variable reference and the 'with'.
545  // The variable potentially references a property of the 'with' object.
546  // * The code is being executed as part of a call to 'eval' and the calling
547  // context chain contains either a variable binding for the name or it
548  // contains a 'with' context.
550  };
551 
552  // Lookup a variable reference given by name recursively starting with this
553  // scope. If the code is executed because of a call to 'eval', the context
554  // parameter should be set to the calling context of 'eval'.
556  BindingKind* binding_kind,
559  bool ResolveVariable(CompilationInfo* info,
560  VariableProxy* proxy,
563  bool ResolveVariablesRecursively(CompilationInfo* info,
565 
566  // Scope analysis.
568  bool HasTrivialContext() const;
569 
570  // Predicates.
571  bool MustAllocate(Variable* var);
572  bool MustAllocateInContext(Variable* var);
573  bool HasArgumentsParameter();
574 
575  // Variable allocation.
576  void AllocateStackSlot(Variable* var);
577  void AllocateHeapSlot(Variable* var);
582 
583  // Resolve and fill in the allocation information for all variables
584  // in this scopes. Must be called *after* all scopes have been
585  // processed (parsed) to ensure that unresolved variables can be
586  // resolved properly.
587  //
588  // In the case of code compiled and run using 'eval', the context
589  // parameter is the context in which eval was called. In all other
590  // cases the context parameter is an empty handle.
592  bool AllocateVariables(CompilationInfo* info,
594 
595  private:
596  // Construct a scope based on the scope info.
597  Scope(Scope* inner_scope, ScopeType type, Handle<ScopeInfo> scope_info,
598  Zone* zone);
599 
600  // Construct a catch scope with a binding for the name.
601  Scope(Scope* inner_scope, Handle<String> catch_variable_name, Zone* zone);
602 
603  void AddInnerScope(Scope* inner_scope) {
604  if (inner_scope != NULL) {
605  inner_scopes_.Add(inner_scope, zone_);
606  inner_scope->outer_scope_ = this;
607  }
608  }
609 
610  void SetDefaults(ScopeType type,
611  Scope* outer_scope,
612  Handle<ScopeInfo> scope_info);
613 
614  Zone* zone_;
615 };
616 
617 } } // namespace v8::internal
618 
619 #endif // V8_SCOPES_H_
bool is_global_scope() const
Definition: scopes.h:278
Scope * DeclarationScope()
Definition: scopes.cc:699
bool scope_contains_with_
Definition: scopes.h:472
Declaration * CheckConflictingVarDeclarations()
Definition: scopes.cc:542
bool scope_calls_eval_
Definition: scopes.h:475
virtual ~VariableMap()
Definition: scopes.cc:63
bool calls_eval() const
Definition: scopes.h:296
Handle< ScopeInfo > GetScopeInfo()
Definition: scopes.cc:708
ZoneList< Scope * > inner_scopes_
Definition: scopes.h:431
Variable * receiver()
Definition: scopes.h:319
bool already_resolved()
Definition: scopes.h:500
bool force_eager_compilation_
Definition: scopes.h:485
void CollectStackAndContextLocals(ZoneList< Variable * > *stack_locals, ZoneList< Variable * > *context_locals)
Definition: scopes.cc:589
bool outer_scope_calls_non_strict_eval() const
Definition: scopes.h:300
Scope * FinalizeBlockScope()
Definition: scopes.cc:364
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
Variable * DeclareGlobal(Handle< String > name)
Definition: scopes.cc:486
Variable * arguments_
Definition: scopes.h:460
static bool Analyze(CompilationInfo *info)
Definition: scopes.cc:263
Scope * outer_scope() const
Definition: scopes.h:347
ScopeType type_
Definition: scopes.h:434
bool HasIllegalRedeclaration() const
Definition: scopes.h:214
ZoneList< VariableProxy * > unresolved_
Definition: scopes.h:452
Expression * illegal_redecl_
Definition: scopes.h:465
bool already_resolved_
Definition: scopes.h:489
bool is_classic_mode() const
Definition: scopes.h:285
Handle< String > scope_name_
Definition: scopes.h:437
Zone * zone() const
Definition: scopes.h:57
void DeclareParameter(Handle< String > name, VariableMode mode)
Definition: scopes.cc:459
VariableProxy * CheckAssignmentToConst()
Definition: scopes.cc:566
bool HasTrivialContext() const
Definition: scopes.cc:645
#define ASSERT(condition)
Definition: checks.h:270
v8::Handle< v8::Value > Print(const v8::Arguments &args)
Variable * NewTemporary(Handle< String > name)
Definition: scopes.cc:509
void ForceEagerCompilation()
Definition: scopes.h:372
VariableMap * GetMap(VariableMode mode)
Definition: scopes.h:75
VariableDeclaration * function_
Definition: scopes.h:458
Variable * LookupRecursive(Handle< String > name, BindingKind *binding_kind, AstNodeFactory< AstNullVisitor > *factory)
Definition: scopes.cc:916
void set_end_position(int statement_pos)
Definition: scopes.h:267
LanguageMode language_mode_
Definition: scopes.h:477
Variable * parameter(int index) const
Definition: scopes.h:330
bool outer_scope_calls_non_strict_eval_
Definition: scopes.h:483
bool is_block_scope() const
Definition: scopes.h:280
bool MustAllocateInContext(Variable *var)
Definition: scopes.cc:1121
ZoneList< Declaration * > decls_
Definition: scopes.h:454
bool is_strict_or_extended_eval_scope() const
Definition: scopes.h:291
Handle< ScopeInfo > scope_info_
Definition: scopes.h:499
int ContextChainLength(Scope *scope)
Definition: scopes.cc:689
bool HasTrivialOuterContext() const
Definition: scopes.cc:659
bool AllowsLazyCompilation() const
Definition: scopes.cc:640
void DeclareFunctionVar(VariableDeclaration *declaration)
Definition: scopes.h:142
void AllocateNonParameterLocal(Variable *var)
Definition: scopes.cc:1216
static Interface * NewValue()
Definition: interface.h:51
int start_position() const
Definition: scopes.h:262
Variable * DeclareLocal(Handle< String > name, VariableMode mode, InitializationFlag init_flag, Interface *interface=Interface::NewValue())
Definition: scopes.cc:468
bool TrivialDeclarationScopesBeforeWithScope() const
Definition: scopes.cc:675
void AllocateVariablesRecursively()
Definition: scopes.cc:1253
#define MUST_USE_RESULT
Definition: globals.h:360
bool is_eval_scope() const
Definition: scopes.h:275
bool HasArgumentsParameter()
Definition: scopes.cc:1139
Variable * arguments() const
Definition: scopes.h:338
int num_stack_slots() const
Definition: scopes.h:365
Isolate *const isolate_
Definition: scopes.h:427
void GetNestedScopeChain(List< Handle< ScopeInfo > > *chain, int statement_position)
Definition: scopes.cc:716
void AllocateHeapSlot(Variable *var)
Definition: scopes.cc:1155
ScopeType type() const
Definition: scopes.h:313
bool AllowsLazyRecompilation() const
Definition: scopes.cc:669
void set_start_position(int statement_pos)
Definition: scopes.h:263
void SetScopeName(Handle< String > scope_name)
Definition: scopes.h:111
ZoneList< Scope * > * inner_scopes()
Definition: scopes.h:344
bool PropagateScopeInfo(bool outer_scope_calls_non_strict_eval)
Definition: scopes.cc:1082
bool calls_non_strict_eval()
Definition: scopes.h:297
bool is_declaration_scope() const
Definition: scopes.h:282
bool inner_scope_calls_eval_
Definition: scopes.h:484
Interface * interface_
Definition: scopes.h:462
void AllocateStackSlot(Variable *var)
Definition: scopes.cc:1150
Variable * receiver_
Definition: scopes.h:456
int num_parameters() const
Definition: scopes.h:335
bool MustAllocate(Variable *var)
Definition: scopes.cc:1103
Variable * LocalLookup(Handle< String > name)
Definition: scopes.cc:393
int end_position() const
Definition: scopes.h:266
bool IsDeclared(Handle< String > name)
Definition: scopes.h:406
ZoneList< Variable * > params_
Definition: scopes.h:448
Interface * interface() const
Definition: scopes.h:350
void AllocateParameterLocals()
Definition: scopes.cc:1160
int StackLocalCount() const
Definition: scopes.cc:1289
VariableMap variables_
Definition: scopes.h:444
void AddDeclaration(Declaration *declaration)
Definition: scopes.cc:522
VariableProxy * NewUnresolved(AstNodeFactory< Visitor > *factory, Handle< String > name, int position=RelocInfo::kNoPosition, Interface *interface=Interface::NewValue())
Definition: scopes.h:167
void SetLanguageMode(LanguageMode language_mode)
Definition: scopes.h:236
int num_heap_slots() const
Definition: scopes.h:366
void VisitIllegalRedeclaration(AstVisitor *visitor)
Definition: scopes.cc:536
bool is_with_scope() const
Definition: scopes.h:281
void AllocateNonParameterLocals()
Definition: scopes.cc:1230
ZoneList< Variable * > temps_
Definition: scopes.h:446
int num_var_or_const()
Definition: scopes.h:362
bool contains_with() const
Definition: scopes.h:307
Zone * zone() const
Definition: scopes.h:120
int ContextLocalCount() const
Definition: scopes.cc:1295
Variable * Lookup(Handle< String > name)
Definition: scopes.cc:91
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
bool inside_with() const
Definition: scopes.h:305
MUST_USE_RESULT bool AllocateVariables(CompilationInfo *info, AstNodeFactory< AstNullVisitor > *factory)
Definition: scopes.cc:619
friend class ParserFactory
Definition: scopes.h:425
Variable * NonLocal(Handle< String > name, VariableMode mode)
Definition: scopes.cc:895
MUST_USE_RESULT bool ResolveVariable(CompilationInfo *info, VariableProxy *proxy, AstNodeFactory< AstNullVisitor > *factory)
Definition: scopes.cc:971
LanguageMode language_mode() const
Definition: scopes.h:316
void RecordEvalCall()
Definition: scopes.h:233
DynamicScopePart * dynamics_
Definition: scopes.h:450
DynamicScopePart(Zone *zone)
Definition: scopes.h:70
bool is_function_scope() const
Definition: scopes.h:276
Variable * Lookup(Handle< String > name)
Definition: scopes.cc:448
VariableMap(Zone *zone)
Definition: scopes.cc:60
Variable * Declare(Scope *scope, Handle< String > name, VariableMode mode, bool is_valid_lhs, Variable::Kind kind, InitializationFlag initialization_flag, Interface *interface=Interface::NewValue())
Definition: scopes.cc:66
void * New(int size)
Definition: zone-inl.h:42
void RecordWithStatement()
Definition: scopes.h:230
bool is_module_scope() const
Definition: scopes.h:277
bool is_catch_scope() const
Definition: scopes.h:279
bool is_extended_mode() const
Definition: scopes.h:288
static Scope * DeserializeScopeChain(Context *context, Scope *global_scope, Zone *zone)
Definition: scopes.cc:211
Scope(Scope *outer_scope, ScopeType type, Zone *zone)
Definition: scopes.cc:106
Scope * outer_scope_
Definition: scopes.h:430
void RemoveUnresolved(VariableProxy *var)
Definition: scopes.cc:497
ZoneList< Declaration * > * declarations()
Definition: scopes.h:341
Variable * LookupFunctionVar(Handle< String > name, AstNodeFactory< AstNullVisitor > *factory)
Definition: scopes.cc:424
bool scope_inside_with_
Definition: scopes.h:470
MUST_USE_RESULT bool ResolveVariablesRecursively(CompilationInfo *info, AstNodeFactory< AstNullVisitor > *factory)
Definition: scopes.cc:1062
void SetIllegalRedeclaration(Expression *expression)
Definition: scopes.cc:527