| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 #include "src/ast-this-access-visitor.h" | 5 #include "src/ast-this-access-visitor.h" |
| 6 #include "src/parser.h" | 6 #include "src/parser.h" |
| 7 | 7 |
| 8 namespace v8 { | 8 namespace v8 { |
| 9 namespace internal { | 9 namespace internal { |
| 10 | 10 |
| 11 typedef class AstThisAccessVisitor ATAV; // for code shortitude. | 11 typedef class AstThisAccessVisitor ATAV; // for code shortitude. |
| 12 | 12 |
| 13 ATAV::AstThisAccessVisitor(Zone* zone) : uses_this_(false) { | 13 ATAV::AstThisAccessVisitor(Zone* zone) : uses_this_(false) { |
| 14 InitializeAstVisitor(zone); | 14 InitializeAstVisitor(zone); |
| 15 } | 15 } |
| 16 | 16 |
| 17 | 17 |
| 18 void ATAV::VisitVariableProxy(VariableProxy* proxy) { | 18 void ATAV::VisitVariableProxy(VariableProxy* proxy) { |
| 19 if (proxy->is_this()) { | 19 if (proxy->is_this()) { |
| 20 uses_this_ = true; | 20 uses_this_ = true; |
| 21 } | 21 } |
| 22 } | 22 } |
| 23 | 23 |
| 24 | 24 |
| 25 void ATAV::VisitSuperReference(SuperReference* leaf) { |
| 26 // disallow super.method() and super(...). |
| 27 uses_this_ = true; |
| 28 } |
| 29 |
| 30 |
| 31 void ATAV::VisitCallNew(CallNew* e) { |
| 32 // new super(..) does not use 'this'. |
| 33 if (!e->expression()->IsSuperReference()) { |
| 34 Visit(e->expression()); |
| 35 } |
| 36 VisitExpressions(e->arguments()); |
| 37 } |
| 38 |
| 39 |
| 25 // --------------------------------------------------------------------------- | 40 // --------------------------------------------------------------------------- |
| 26 // -- Leaf nodes ------------------------------------------------------------- | 41 // -- Leaf nodes ------------------------------------------------------------- |
| 27 // --------------------------------------------------------------------------- | 42 // --------------------------------------------------------------------------- |
| 28 | 43 |
| 29 void ATAV::VisitVariableDeclaration(VariableDeclaration* leaf) {} | 44 void ATAV::VisitVariableDeclaration(VariableDeclaration* leaf) {} |
| 30 void ATAV::VisitFunctionDeclaration(FunctionDeclaration* leaf) {} | 45 void ATAV::VisitFunctionDeclaration(FunctionDeclaration* leaf) {} |
| 31 void ATAV::VisitModuleDeclaration(ModuleDeclaration* leaf) {} | 46 void ATAV::VisitModuleDeclaration(ModuleDeclaration* leaf) {} |
| 32 void ATAV::VisitImportDeclaration(ImportDeclaration* leaf) {} | 47 void ATAV::VisitImportDeclaration(ImportDeclaration* leaf) {} |
| 33 void ATAV::VisitExportDeclaration(ExportDeclaration* leaf) {} | 48 void ATAV::VisitExportDeclaration(ExportDeclaration* leaf) {} |
| 34 void ATAV::VisitModuleVariable(ModuleVariable* leaf) {} | 49 void ATAV::VisitModuleVariable(ModuleVariable* leaf) {} |
| 35 void ATAV::VisitModulePath(ModulePath* leaf) {} | 50 void ATAV::VisitModulePath(ModulePath* leaf) {} |
| 36 void ATAV::VisitModuleUrl(ModuleUrl* leaf) {} | 51 void ATAV::VisitModuleUrl(ModuleUrl* leaf) {} |
| 37 void ATAV::VisitEmptyStatement(EmptyStatement* leaf) {} | 52 void ATAV::VisitEmptyStatement(EmptyStatement* leaf) {} |
| 38 void ATAV::VisitContinueStatement(ContinueStatement* leaf) {} | 53 void ATAV::VisitContinueStatement(ContinueStatement* leaf) {} |
| 39 void ATAV::VisitBreakStatement(BreakStatement* leaf) {} | 54 void ATAV::VisitBreakStatement(BreakStatement* leaf) {} |
| 40 void ATAV::VisitDebuggerStatement(DebuggerStatement* leaf) {} | 55 void ATAV::VisitDebuggerStatement(DebuggerStatement* leaf) {} |
| 41 void ATAV::VisitFunctionLiteral(FunctionLiteral* leaf) {} | 56 void ATAV::VisitFunctionLiteral(FunctionLiteral* leaf) {} |
| 42 void ATAV::VisitNativeFunctionLiteral(NativeFunctionLiteral* leaf) {} | 57 void ATAV::VisitNativeFunctionLiteral(NativeFunctionLiteral* leaf) {} |
| 43 void ATAV::VisitLiteral(Literal* leaf) {} | 58 void ATAV::VisitLiteral(Literal* leaf) {} |
| 44 void ATAV::VisitRegExpLiteral(RegExpLiteral* leaf) {} | 59 void ATAV::VisitRegExpLiteral(RegExpLiteral* leaf) {} |
| 45 void ATAV::VisitThisFunction(ThisFunction* leaf) {} | 60 void ATAV::VisitThisFunction(ThisFunction* leaf) {} |
| 46 void ATAV::VisitSuperReference(SuperReference* leaf) {} | |
| 47 | |
| 48 | 61 |
| 49 // --------------------------------------------------------------------------- | 62 // --------------------------------------------------------------------------- |
| 50 // -- Pass-through nodes------------------------------------------------------ | 63 // -- Pass-through nodes------------------------------------------------------ |
| 51 // --------------------------------------------------------------------------- | 64 // --------------------------------------------------------------------------- |
| 52 void ATAV::VisitModuleLiteral(ModuleLiteral* e) { Visit(e->body()); } | 65 void ATAV::VisitModuleLiteral(ModuleLiteral* e) { Visit(e->body()); } |
| 53 | 66 |
| 54 | 67 |
| 55 void ATAV::VisitBlock(Block* stmt) { VisitStatements(stmt->statements()); } | 68 void ATAV::VisitBlock(Block* stmt) { VisitStatements(stmt->statements()); } |
| 56 | 69 |
| 57 | 70 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 88 | 101 |
| 89 | 102 |
| 90 void ATAV::VisitTryFinallyStatement(TryFinallyStatement* stmt) { | 103 void ATAV::VisitTryFinallyStatement(TryFinallyStatement* stmt) { |
| 91 Visit(stmt->try_block()); | 104 Visit(stmt->try_block()); |
| 92 Visit(stmt->finally_block()); | 105 Visit(stmt->finally_block()); |
| 93 } | 106 } |
| 94 | 107 |
| 95 | 108 |
| 96 void ATAV::VisitClassLiteral(ClassLiteral* e) { | 109 void ATAV::VisitClassLiteral(ClassLiteral* e) { |
| 97 VisitIfNotNull(e->extends()); | 110 VisitIfNotNull(e->extends()); |
| 98 VisitIfNotNull(e->constructor()); | 111 Visit(e->constructor()); |
| 99 ZoneList<ObjectLiteralProperty*>* properties = e->properties(); | 112 ZoneList<ObjectLiteralProperty*>* properties = e->properties(); |
| 100 for (int i = 0; i < properties->length(); i++) { | 113 for (int i = 0; i < properties->length(); i++) { |
| 101 Visit(properties->at(i)->value()); | 114 Visit(properties->at(i)->value()); |
| 102 } | 115 } |
| 103 } | 116 } |
| 104 | 117 |
| 105 | 118 |
| 106 void ATAV::VisitConditional(Conditional* e) { | 119 void ATAV::VisitConditional(Conditional* e) { |
| 107 Visit(e->condition()); | 120 Visit(e->condition()); |
| 108 Visit(e->then_expression()); | 121 Visit(e->then_expression()); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 135 Visit(e->key()); | 148 Visit(e->key()); |
| 136 } | 149 } |
| 137 | 150 |
| 138 | 151 |
| 139 void ATAV::VisitCall(Call* e) { | 152 void ATAV::VisitCall(Call* e) { |
| 140 Visit(e->expression()); | 153 Visit(e->expression()); |
| 141 VisitExpressions(e->arguments()); | 154 VisitExpressions(e->arguments()); |
| 142 } | 155 } |
| 143 | 156 |
| 144 | 157 |
| 145 void ATAV::VisitCallNew(CallNew* e) { | |
| 146 Visit(e->expression()); | |
| 147 VisitExpressions(e->arguments()); | |
| 148 } | |
| 149 | |
| 150 | |
| 151 void ATAV::VisitCallRuntime(CallRuntime* e) { | 158 void ATAV::VisitCallRuntime(CallRuntime* e) { |
| 152 VisitExpressions(e->arguments()); | 159 VisitExpressions(e->arguments()); |
| 153 } | 160 } |
| 154 | 161 |
| 155 | 162 |
| 156 void ATAV::VisitUnaryOperation(UnaryOperation* e) { Visit(e->expression()); } | 163 void ATAV::VisitUnaryOperation(UnaryOperation* e) { Visit(e->expression()); } |
| 157 | 164 |
| 158 | 165 |
| 159 void ATAV::VisitBinaryOperation(BinaryOperation* e) { | 166 void ATAV::VisitBinaryOperation(BinaryOperation* e) { |
| 160 Visit(e->left()); | 167 Visit(e->left()); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 Visit(stmt->value()); | 230 Visit(stmt->value()); |
| 224 } | 231 } |
| 225 | 232 |
| 226 | 233 |
| 227 void ATAV::VisitCountOperation(CountOperation* e) { | 234 void ATAV::VisitCountOperation(CountOperation* e) { |
| 228 Expression* l = e->expression(); | 235 Expression* l = e->expression(); |
| 229 Visit(l); | 236 Visit(l); |
| 230 } | 237 } |
| 231 } | 238 } |
| 232 } // namespace v8::internal | 239 } // namespace v8::internal |
| OLD | NEW |