1 // Copyright 2006-2009 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef V8_FUNC_NAME_INFERRER_H_
6 #define V8_FUNC_NAME_INFERRER_H_
8 #include "src/handles.h"
14 class FunctionLiteral;
17 // FuncNameInferrer is a stateful class that is used to perform name
18 // inference for anonymous functions during static analysis of source code.
19 // Inference is performed in cases when an anonymous function is assigned
20 // to a variable or a property (see test-func-name-inference.cc for examples.)
22 // The basic idea is that during parsing of LHSs of certain expressions
23 // (assignments, declarations, object literals) we collect name strings,
24 // and during parsing of the RHS, a function literal can be collected. After
25 // parsing the RHS we can infer a name for function literals that do not have
27 class FuncNameInferrer : public ZoneObject {
29 FuncNameInferrer(Isolate* isolate, Zone* zone);
31 // Returns whether we have entered name collection state.
32 bool IsOpen() const { return !entries_stack_.is_empty(); }
34 // Pushes an enclosing the name of enclosing function onto names stack.
35 void PushEnclosingName(Handle<String> name);
37 // Enters name collection state.
39 entries_stack_.Add(names_stack_.length(), zone());
42 // Pushes an encountered name onto names stack when in collection state.
43 void PushLiteralName(Handle<String> name);
45 void PushVariableName(Handle<String> name);
47 // Adds a function to infer name for.
48 void AddFunction(FunctionLiteral* func_to_infer) {
50 funcs_to_infer_.Add(func_to_infer, zone());
54 void RemoveLastFunction() {
55 if (IsOpen() && !funcs_to_infer_.is_empty()) {
56 funcs_to_infer_.RemoveLast();
60 // Infers a function name and leaves names collection state.
63 if (!funcs_to_infer_.is_empty()) {
64 InferFunctionsNames();
68 // Leaves names collection state.
71 names_stack_.Rewind(entries_stack_.RemoveLast());
72 if (entries_stack_.is_empty())
73 funcs_to_infer_.Clear();
78 kEnclosingConstructorName,
83 Name(Handle<String> name, NameType type) : name(name), type(type) { }
88 Isolate* isolate() { return isolate_; }
89 Zone* zone() const { return zone_; }
91 // Constructs a full name in dotted notation from gathered names.
92 Handle<String> MakeNameFromStack();
94 // A helper function for MakeNameFromStack.
95 Handle<String> MakeNameFromStackHelper(int pos, Handle<String> prev);
97 // Performs name inferring for added functions.
98 void InferFunctionsNames();
101 ZoneList<int> entries_stack_;
102 ZoneList<Name> names_stack_;
103 ZoneList<FunctionLiteral*> funcs_to_infer_;
106 DISALLOW_COPY_AND_ASSIGN(FuncNameInferrer);
110 } } // namespace v8::internal
112 #endif // V8_FUNC_NAME_INFERRER_H_