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

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

Issue 115024: Changelist for a readability review. Not for direct commit. (Closed)
Patch Set: Second round of changes Created 11 years, 7 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
« 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
(Empty)
1 // Copyright 2006-2009 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_FUNC_NAME_INFERRER_H_
29 #define V8_FUNC_NAME_INFERRER_H_
30
31 namespace v8 {
32 namespace internal {
33
34 // FuncNameInferrer is a stateful class that is used to perform name
35 // inference for anonymous functions during static analysis of source code.
36 // Inference is performed in cases when an anonymous function is assigned
37 // to a variable or a property (see test-func-name-inference.cc for examples.)
38 //
39 // The basic idea is that during AST traversal LHSs of expressions are
40 // always visited before RHSs. Thus, during visiting the LHS, a name can be
41 // collected, and during visiting the RHS, a function literal can be collected.
42 // Inference is performed while leaving the assignment node.
43 class FuncNameInferrer BASE_EMBEDDED {
44 public:
45 FuncNameInferrer()
46 : entries_stack_(10),
47 names_stack_(5),
48 func_to_infer_(NULL),
49 dot_(Factory::NewStringFromAscii(CStrVector("."))) {
50 }
51
52 // Returns whether we have entered name collection state.
53 bool IsOpen() const { return !entries_stack_.is_empty(); }
54
55 // Pushes an enclosing the name of enclosing function onto names stack.
56 void PushEnclosingName(Handle<String> name);
57
58 // Enters name collection state.
59 void Enter() {
60 entries_stack_.Add(names_stack_.length());
61 }
62
63 // Leaves names collection state.
64 void Leave() {
65 ASSERT(IsOpen());
66 names_stack_.Rewind(entries_stack_.RemoveLast());
67 }
68
69 // Pushes an encountered name onto names stack when in collection state.
70 void PushName(Handle<String> name) {
71 if (IsOpen()) {
72 names_stack_.Add(name);
73 }
74 }
75
76 // Sets a function to infer name for.
77 void SetFuncToInfer(FunctionLiteral* func_to_infer) {
78 if (IsOpen()) {
79 ASSERT(func_to_infer_ == NULL);
80 func_to_infer_ = func_to_infer;
81 }
82 }
83
84 // Infers a function name and leaves names collection state.
85 void InferAndLeave() {
86 ASSERT(IsOpen());
87 MaybeInferFunctionName();
88 Leave();
89 }
90
91 private:
92 // Constructs a full name in dotted notation from gathered names.
93 Handle<String> MakeNameFromStack();
94
95 // A helper function for MakeNameFromStack.
96 Handle<String> MakeNameFromStackHelper(int pos, Handle<String> prev);
97
98 // Performs name inferring if there is a function to infer name for.
99 void MaybeInferFunctionName();
100
101 List<int> entries_stack_;
102 List<Handle<String> > names_stack_;
103 FunctionLiteral* func_to_infer_;
104 Handle<String> dot_;
105
106 DISALLOW_COPY_AND_ASSIGN(FuncNameInferrer);
107 };
108
109
110 // A wrapper class that automatically calls InferAndLeave when
111 // leaving scope.
112 class ScopedFuncNameInferrer BASE_EMBEDDED {
113 public:
114 explicit ScopedFuncNameInferrer(FuncNameInferrer* inferrer)
115 : inferrer_(inferrer),
116 is_entered_(false) {}
117
118 ~ScopedFuncNameInferrer() {
119 if (is_entered_) {
120 inferrer_->InferAndLeave();
121 }
122 }
123
124 // Triggers the wrapped inferrer into name collection state.
125 void Enter() {
126 inferrer_->Enter();
127 is_entered_ = true;
128 }
129
130 private:
131 FuncNameInferrer* inferrer_;
132 bool is_entered_;
133
134 DISALLOW_COPY_AND_ASSIGN(ScopedFuncNameInferrer);
135 };
136
137 } // namespace internal
138 } // namespace v8
139
140 #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