Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(423)

Side by Side Diff: src/func-name-inferrer.h

Issue 314603004: Parser: Delay internalizing strings and values. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: rebased Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/compiler.cc ('k') | src/func-name-inferrer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_FUNC_NAME_INFERRER_H_ 5 #ifndef V8_FUNC_NAME_INFERRER_H_
6 #define V8_FUNC_NAME_INFERRER_H_ 6 #define V8_FUNC_NAME_INFERRER_H_
7 7
8 #include "src/handles.h" 8 #include "src/handles.h"
9 #include "src/zone.h" 9 #include "src/zone.h"
10 10
11 namespace v8 { 11 namespace v8 {
12 namespace internal { 12 namespace internal {
13 13
14 class AstString;
15 class AstValueFactory;
14 class FunctionLiteral; 16 class FunctionLiteral;
15 class Isolate;
16 17
17 // FuncNameInferrer is a stateful class that is used to perform name 18 // FuncNameInferrer is a stateful class that is used to perform name
18 // inference for anonymous functions during static analysis of source code. 19 // inference for anonymous functions during static analysis of source code.
19 // Inference is performed in cases when an anonymous function is assigned 20 // 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.) 21 // to a variable or a property (see test-func-name-inference.cc for examples.)
21 // 22 //
22 // The basic idea is that during parsing of LHSs of certain expressions 23 // The basic idea is that during parsing of LHSs of certain expressions
23 // (assignments, declarations, object literals) we collect name strings, 24 // (assignments, declarations, object literals) we collect name strings,
24 // and during parsing of the RHS, a function literal can be collected. After 25 // 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 26 // parsing the RHS we can infer a name for function literals that do not have
26 // a name. 27 // a name.
27 class FuncNameInferrer : public ZoneObject { 28 class FuncNameInferrer : public ZoneObject {
28 public: 29 public:
29 FuncNameInferrer(Isolate* isolate, Zone* zone); 30 FuncNameInferrer(AstValueFactory* ast_value_factory, Zone* zone);
30 31
31 // Returns whether we have entered name collection state. 32 // Returns whether we have entered name collection state.
32 bool IsOpen() const { return !entries_stack_.is_empty(); } 33 bool IsOpen() const { return !entries_stack_.is_empty(); }
33 34
34 // Pushes an enclosing the name of enclosing function onto names stack. 35 // Pushes an enclosing the name of enclosing function onto names stack.
35 void PushEnclosingName(Handle<String> name); 36 void PushEnclosingName(const AstString* name);
36 37
37 // Enters name collection state. 38 // Enters name collection state.
38 void Enter() { 39 void Enter() {
39 entries_stack_.Add(names_stack_.length(), zone()); 40 entries_stack_.Add(names_stack_.length(), zone());
40 } 41 }
41 42
42 // Pushes an encountered name onto names stack when in collection state. 43 // Pushes an encountered name onto names stack when in collection state.
43 void PushLiteralName(Handle<String> name); 44 void PushLiteralName(const AstString* name);
44 45
45 void PushVariableName(Handle<String> name); 46 void PushVariableName(const AstString* name);
46 47
47 // Adds a function to infer name for. 48 // Adds a function to infer name for.
48 void AddFunction(FunctionLiteral* func_to_infer) { 49 void AddFunction(FunctionLiteral* func_to_infer) {
49 if (IsOpen()) { 50 if (IsOpen()) {
50 funcs_to_infer_.Add(func_to_infer, zone()); 51 funcs_to_infer_.Add(func_to_infer, zone());
51 } 52 }
52 } 53 }
53 54
54 void RemoveLastFunction() { 55 void RemoveLastFunction() {
55 if (IsOpen() && !funcs_to_infer_.is_empty()) { 56 if (IsOpen() && !funcs_to_infer_.is_empty()) {
(...skipping 17 matching lines...) Expand all
73 funcs_to_infer_.Clear(); 74 funcs_to_infer_.Clear();
74 } 75 }
75 76
76 private: 77 private:
77 enum NameType { 78 enum NameType {
78 kEnclosingConstructorName, 79 kEnclosingConstructorName,
79 kLiteralName, 80 kLiteralName,
80 kVariableName 81 kVariableName
81 }; 82 };
82 struct Name { 83 struct Name {
83 Name(Handle<String> name, NameType type) : name(name), type(type) { } 84 Name(const AstString* name, NameType type) : name(name), type(type) {}
84 Handle<String> name; 85 const AstString* name;
85 NameType type; 86 NameType type;
86 }; 87 };
87 88
88 Isolate* isolate() { return isolate_; }
89 Zone* zone() const { return zone_; } 89 Zone* zone() const { return zone_; }
90 90
91 // Constructs a full name in dotted notation from gathered names. 91 // Constructs a full name in dotted notation from gathered names.
92 Handle<String> MakeNameFromStack(); 92 const AstString* MakeNameFromStack();
93
94 // A helper function for MakeNameFromStack.
95 Handle<String> MakeNameFromStackHelper(int pos, Handle<String> prev);
96 93
97 // Performs name inferring for added functions. 94 // Performs name inferring for added functions.
98 void InferFunctionsNames(); 95 void InferFunctionsNames();
99 96
100 Isolate* isolate_; 97 AstValueFactory* ast_value_factory_;
101 ZoneList<int> entries_stack_; 98 ZoneList<int> entries_stack_;
102 ZoneList<Name> names_stack_; 99 ZoneList<Name> names_stack_;
103 ZoneList<FunctionLiteral*> funcs_to_infer_; 100 ZoneList<FunctionLiteral*> funcs_to_infer_;
104 Zone* zone_; 101 Zone* zone_;
105 102
106 DISALLOW_COPY_AND_ASSIGN(FuncNameInferrer); 103 DISALLOW_COPY_AND_ASSIGN(FuncNameInferrer);
107 }; 104 };
108 105
109 106
110 } } // namespace v8::internal 107 } } // namespace v8::internal
111 108
112 #endif // V8_FUNC_NAME_INFERRER_H_ 109 #endif // V8_FUNC_NAME_INFERRER_H_
OLDNEW
« no previous file with comments | « src/compiler.cc ('k') | src/func-name-inferrer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698