Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/api.h" | 7 #include "src/api.h" |
| 8 #include "src/ast.h" | 8 #include "src/ast.h" |
| 9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
| 10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
| (...skipping 1164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1175 ? FunctionLiteral::ANONYMOUS_EXPRESSION | 1175 ? FunctionLiteral::ANONYMOUS_EXPRESSION |
| 1176 : FunctionLiteral::NAMED_EXPRESSION) | 1176 : FunctionLiteral::NAMED_EXPRESSION) |
| 1177 : FunctionLiteral::DECLARATION; | 1177 : FunctionLiteral::DECLARATION; |
| 1178 bool ok = true; | 1178 bool ok = true; |
| 1179 | 1179 |
| 1180 if (shared_info->is_arrow()) { | 1180 if (shared_info->is_arrow()) { |
| 1181 Scope* scope = | 1181 Scope* scope = |
| 1182 NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); | 1182 NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); |
| 1183 scope->set_start_position(shared_info->start_position()); | 1183 scope->set_start_position(shared_info->start_position()); |
| 1184 ExpressionClassifier formals_classifier; | 1184 ExpressionClassifier formals_classifier; |
| 1185 bool has_rest = false; | 1185 ParserFormalParameterParsingState parsing_state(scope); |
| 1186 { | 1186 { |
| 1187 // Parsing patterns as variable reference expression creates | 1187 // Parsing patterns as variable reference expression creates |
| 1188 // NewUnresolved references in current scope. Entrer arrow function | 1188 // NewUnresolved references in current scope. Entrer arrow function |
| 1189 // scope for formal parameter parsing. | 1189 // scope for formal parameter parsing. |
| 1190 BlockState block_state(&scope_, scope); | 1190 BlockState block_state(&scope_, scope); |
| 1191 if (Check(Token::LPAREN)) { | 1191 if (Check(Token::LPAREN)) { |
| 1192 // '(' StrictFormalParameters ')' | 1192 // '(' StrictFormalParameters ')' |
| 1193 ParseFormalParameterList(scope, &has_rest, &formals_classifier, &ok); | 1193 ParseFormalParameterList(&parsing_state, &formals_classifier, &ok); |
| 1194 if (ok) ok = Check(Token::RPAREN); | 1194 if (ok) ok = Check(Token::RPAREN); |
| 1195 } else { | 1195 } else { |
| 1196 // BindingIdentifier | 1196 // BindingIdentifier |
| 1197 ParseFormalParameter(scope, has_rest, &formals_classifier, &ok); | 1197 const bool is_rest = false; |
| 1198 ParseFormalParameter(is_rest, &parsing_state, &formals_classifier, | |
| 1199 &ok); | |
| 1198 } | 1200 } |
| 1199 } | 1201 } |
| 1200 | 1202 |
| 1201 if (ok) { | 1203 if (ok) { |
| 1202 Expression* expression = | 1204 Expression* expression = |
| 1203 ParseArrowFunctionLiteral(scope, has_rest, formals_classifier, &ok); | 1205 ParseArrowFunctionLiteral(parsing_state, formals_classifier, &ok); |
| 1204 if (ok) { | 1206 if (ok) { |
| 1205 // Scanning must end at the same position that was recorded | 1207 // Scanning must end at the same position that was recorded |
| 1206 // previously. If not, parsing has been interrupted due to a stack | 1208 // previously. If not, parsing has been interrupted due to a stack |
| 1207 // overflow, at which point the partially parsed arrow function | 1209 // overflow, at which point the partially parsed arrow function |
| 1208 // concise body happens to be a valid expression. This is a problem | 1210 // concise body happens to be a valid expression. This is a problem |
| 1209 // only for arrow functions with single expression bodies, since there | 1211 // only for arrow functions with single expression bodies, since there |
| 1210 // is no end token such as "}" for normal functions. | 1212 // is no end token such as "}" for normal functions. |
| 1211 if (scanner()->location().end_pos == shared_info->end_position()) { | 1213 if (scanner()->location().end_pos == shared_info->end_position()) { |
| 1212 // The pre-parser saw an arrow function here, so the full parser | 1214 // The pre-parser saw an arrow function here, so the full parser |
| 1213 // must produce a FunctionLiteral. | 1215 // must produce a FunctionLiteral. |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1540 ReportMessage(MessageTemplate::kStrictEvalArguments); | 1542 ReportMessage(MessageTemplate::kStrictEvalArguments); |
| 1541 return NULL; | 1543 return NULL; |
| 1542 } else if (is_strong(language_mode()) && IsUndefined(local_name)) { | 1544 } else if (is_strong(language_mode()) && IsUndefined(local_name)) { |
| 1543 *ok = false; | 1545 *ok = false; |
| 1544 ReportMessage(MessageTemplate::kStrongUndefined); | 1546 ReportMessage(MessageTemplate::kStrongUndefined); |
| 1545 return NULL; | 1547 return NULL; |
| 1546 } | 1548 } |
| 1547 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); | 1549 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); |
| 1548 ImportDeclaration* declaration = | 1550 ImportDeclaration* declaration = |
| 1549 factory()->NewImportDeclaration(proxy, import_name, NULL, scope_, pos); | 1551 factory()->NewImportDeclaration(proxy, import_name, NULL, scope_, pos); |
| 1550 Declare(declaration, true, CHECK_OK); | 1552 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); |
| 1551 result->Add(declaration, zone()); | 1553 result->Add(declaration, zone()); |
| 1552 if (peek() == Token::RBRACE) break; | 1554 if (peek() == Token::RBRACE) break; |
| 1553 Expect(Token::COMMA, CHECK_OK); | 1555 Expect(Token::COMMA, CHECK_OK); |
| 1554 } | 1556 } |
| 1555 | 1557 |
| 1556 Expect(Token::RBRACE, CHECK_OK); | 1558 Expect(Token::RBRACE, CHECK_OK); |
| 1557 | 1559 |
| 1558 return result; | 1560 return result; |
| 1559 } | 1561 } |
| 1560 | 1562 |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 1588 } | 1590 } |
| 1589 | 1591 |
| 1590 // Parse ImportedDefaultBinding if present. | 1592 // Parse ImportedDefaultBinding if present. |
| 1591 ImportDeclaration* import_default_declaration = NULL; | 1593 ImportDeclaration* import_default_declaration = NULL; |
| 1592 if (tok != Token::MUL && tok != Token::LBRACE) { | 1594 if (tok != Token::MUL && tok != Token::LBRACE) { |
| 1593 const AstRawString* local_name = | 1595 const AstRawString* local_name = |
| 1594 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); | 1596 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); |
| 1595 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); | 1597 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); |
| 1596 import_default_declaration = factory()->NewImportDeclaration( | 1598 import_default_declaration = factory()->NewImportDeclaration( |
| 1597 proxy, ast_value_factory()->default_string(), NULL, scope_, pos); | 1599 proxy, ast_value_factory()->default_string(), NULL, scope_, pos); |
| 1598 Declare(import_default_declaration, true, CHECK_OK); | 1600 Declare(import_default_declaration, DeclarationDescriptor::NORMAL, true, |
| 1601 CHECK_OK); | |
| 1599 } | 1602 } |
| 1600 | 1603 |
| 1601 const AstRawString* module_instance_binding = NULL; | 1604 const AstRawString* module_instance_binding = NULL; |
| 1602 ZoneList<ImportDeclaration*>* named_declarations = NULL; | 1605 ZoneList<ImportDeclaration*>* named_declarations = NULL; |
| 1603 if (import_default_declaration == NULL || Check(Token::COMMA)) { | 1606 if (import_default_declaration == NULL || Check(Token::COMMA)) { |
| 1604 switch (peek()) { | 1607 switch (peek()) { |
| 1605 case Token::MUL: { | 1608 case Token::MUL: { |
| 1606 Consume(Token::MUL); | 1609 Consume(Token::MUL); |
| 1607 ExpectContextualKeyword(CStrVector("as"), CHECK_OK); | 1610 ExpectContextualKeyword(CStrVector("as"), CHECK_OK); |
| 1608 module_instance_binding = | 1611 module_instance_binding = |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1975 // truly local variable, and the scope of the variable is always the function | 1978 // truly local variable, and the scope of the variable is always the function |
| 1976 // scope. | 1979 // scope. |
| 1977 // Let/const variables in harmony mode are always added to the immediately | 1980 // Let/const variables in harmony mode are always added to the immediately |
| 1978 // enclosing scope. | 1981 // enclosing scope. |
| 1979 return DeclarationScope(mode)->NewUnresolved( | 1982 return DeclarationScope(mode)->NewUnresolved( |
| 1980 factory(), name, Variable::NORMAL, scanner()->location().beg_pos, | 1983 factory(), name, Variable::NORMAL, scanner()->location().beg_pos, |
| 1981 scanner()->location().end_pos); | 1984 scanner()->location().end_pos); |
| 1982 } | 1985 } |
| 1983 | 1986 |
| 1984 | 1987 |
| 1985 Variable* Parser::Declare(Declaration* declaration, bool resolve, bool* ok) { | 1988 Variable* Parser::Declare(Declaration* declaration, |
| 1989 DeclarationDescriptor::Kind declaration_kind, | |
| 1990 bool resolve, bool* ok) { | |
| 1986 VariableProxy* proxy = declaration->proxy(); | 1991 VariableProxy* proxy = declaration->proxy(); |
| 1987 DCHECK(proxy->raw_name() != NULL); | 1992 DCHECK(proxy->raw_name() != NULL); |
| 1988 const AstRawString* name = proxy->raw_name(); | 1993 const AstRawString* name = proxy->raw_name(); |
| 1989 VariableMode mode = declaration->mode(); | 1994 VariableMode mode = declaration->mode(); |
| 1990 Scope* declaration_scope = DeclarationScope(mode); | 1995 Scope* declaration_scope = DeclarationScope(mode); |
| 1991 Variable* var = NULL; | 1996 Variable* var = NULL; |
| 1992 | 1997 |
| 1993 // If a suitable scope exists, then we can statically declare this | 1998 // If a suitable scope exists, then we can statically declare this |
| 1994 // variable and also set its mode. In any case, a Declaration node | 1999 // variable and also set its mode. In any case, a Declaration node |
| 1995 // will be added to the scope so that the declaration can be added | 2000 // will be added to the scope so that the declaration can be added |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2034 // the special case | 2039 // the special case |
| 2035 // | 2040 // |
| 2036 // function () { let x; { var x; } } | 2041 // function () { let x; { var x; } } |
| 2037 // | 2042 // |
| 2038 // because the var declaration is hoisted to the function scope where 'x' | 2043 // because the var declaration is hoisted to the function scope where 'x' |
| 2039 // is already bound. | 2044 // is already bound. |
| 2040 DCHECK(IsDeclaredVariableMode(var->mode())); | 2045 DCHECK(IsDeclaredVariableMode(var->mode())); |
| 2041 if (is_strict(language_mode())) { | 2046 if (is_strict(language_mode())) { |
| 2042 // In harmony we treat re-declarations as early errors. See | 2047 // In harmony we treat re-declarations as early errors. See |
| 2043 // ES5 16 for a definition of early errors. | 2048 // ES5 16 for a definition of early errors. |
| 2044 ParserTraits::ReportMessage(MessageTemplate::kVarRedeclaration, name); | 2049 if (declaration_kind == DeclarationDescriptor::NORMAL) { |
| 2050 ParserTraits::ReportMessage(MessageTemplate::kVarRedeclaration, name); | |
| 2051 } else { | |
| 2052 ParserTraits::ReportMessage(MessageTemplate::kStrictParamDupe); | |
| 2053 } | |
| 2045 *ok = false; | 2054 *ok = false; |
| 2046 return nullptr; | 2055 return nullptr; |
| 2047 } | 2056 } |
| 2048 Expression* expression = NewThrowTypeError( | 2057 Expression* expression = NewThrowSyntaxError( |
|
wingo
2015/06/22 10:43:18
nice!
| |
| 2049 MessageTemplate::kVarRedeclaration, name, declaration->position()); | 2058 MessageTemplate::kVarRedeclaration, name, declaration->position()); |
| 2050 declaration_scope->SetIllegalRedeclaration(expression); | 2059 declaration_scope->SetIllegalRedeclaration(expression); |
| 2051 } else if (mode == VAR) { | 2060 } else if (mode == VAR) { |
| 2052 var->set_maybe_assigned(); | 2061 var->set_maybe_assigned(); |
| 2053 } | 2062 } |
| 2054 } | 2063 } |
| 2055 | 2064 |
| 2056 // We add a declaration node for every declaration. The compiler | 2065 // We add a declaration node for every declaration. The compiler |
| 2057 // will only generate code if necessary. In particular, declarations | 2066 // will only generate code if necessary. In particular, declarations |
| 2058 // for inner local variables that do not represent functions won't | 2067 // for inner local variables that do not represent functions won't |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2148 // accessible while parsing the first time not when reparsing | 2157 // accessible while parsing the first time not when reparsing |
| 2149 // because of lazy compilation. | 2158 // because of lazy compilation. |
| 2150 DeclarationScope(VAR)->ForceEagerCompilation(); | 2159 DeclarationScope(VAR)->ForceEagerCompilation(); |
| 2151 | 2160 |
| 2152 // TODO(1240846): It's weird that native function declarations are | 2161 // TODO(1240846): It's weird that native function declarations are |
| 2153 // introduced dynamically when we meet their declarations, whereas | 2162 // introduced dynamically when we meet their declarations, whereas |
| 2154 // other functions are set up when entering the surrounding scope. | 2163 // other functions are set up when entering the surrounding scope. |
| 2155 VariableProxy* proxy = NewUnresolved(name, VAR); | 2164 VariableProxy* proxy = NewUnresolved(name, VAR); |
| 2156 Declaration* declaration = | 2165 Declaration* declaration = |
| 2157 factory()->NewVariableDeclaration(proxy, VAR, scope_, pos); | 2166 factory()->NewVariableDeclaration(proxy, VAR, scope_, pos); |
| 2158 Declare(declaration, true, CHECK_OK); | 2167 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); |
| 2159 NativeFunctionLiteral* lit = factory()->NewNativeFunctionLiteral( | 2168 NativeFunctionLiteral* lit = factory()->NewNativeFunctionLiteral( |
| 2160 name, extension_, RelocInfo::kNoPosition); | 2169 name, extension_, RelocInfo::kNoPosition); |
| 2161 return factory()->NewExpressionStatement( | 2170 return factory()->NewExpressionStatement( |
| 2162 factory()->NewAssignment( | 2171 factory()->NewAssignment( |
| 2163 Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition), | 2172 Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition), |
| 2164 pos); | 2173 pos); |
| 2165 } | 2174 } |
| 2166 | 2175 |
| 2167 | 2176 |
| 2168 Statement* Parser::ParseFunctionDeclaration( | 2177 Statement* Parser::ParseFunctionDeclaration( |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 2193 is_strong(language_mode()) | 2202 is_strong(language_mode()) |
| 2194 ? CONST | 2203 ? CONST |
| 2195 : is_strict(language_mode()) && | 2204 : is_strict(language_mode()) && |
| 2196 !(scope_->is_script_scope() || scope_->is_eval_scope() || | 2205 !(scope_->is_script_scope() || scope_->is_eval_scope() || |
| 2197 scope_->is_function_scope()) | 2206 scope_->is_function_scope()) |
| 2198 ? LET | 2207 ? LET |
| 2199 : VAR; | 2208 : VAR; |
| 2200 VariableProxy* proxy = NewUnresolved(name, mode); | 2209 VariableProxy* proxy = NewUnresolved(name, mode); |
| 2201 Declaration* declaration = | 2210 Declaration* declaration = |
| 2202 factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos); | 2211 factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos); |
| 2203 Declare(declaration, true, CHECK_OK); | 2212 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); |
| 2204 if (names) names->Add(name, zone()); | 2213 if (names) names->Add(name, zone()); |
| 2205 return factory()->NewEmptyStatement(RelocInfo::kNoPosition); | 2214 return factory()->NewEmptyStatement(RelocInfo::kNoPosition); |
| 2206 } | 2215 } |
| 2207 | 2216 |
| 2208 | 2217 |
| 2209 Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names, | 2218 Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names, |
| 2210 bool* ok) { | 2219 bool* ok) { |
| 2211 // ClassDeclaration :: | 2220 // ClassDeclaration :: |
| 2212 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}' | 2221 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}' |
| 2213 // | 2222 // |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 2234 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 2243 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
| 2235 ClassLiteral* value = ParseClassLiteral(name, scanner()->location(), | 2244 ClassLiteral* value = ParseClassLiteral(name, scanner()->location(), |
| 2236 is_strict_reserved, pos, CHECK_OK); | 2245 is_strict_reserved, pos, CHECK_OK); |
| 2237 | 2246 |
| 2238 VariableMode mode = is_strong(language_mode()) ? CONST : LET; | 2247 VariableMode mode = is_strong(language_mode()) ? CONST : LET; |
| 2239 VariableProxy* proxy = NewUnresolved(name, mode); | 2248 VariableProxy* proxy = NewUnresolved(name, mode); |
| 2240 const bool is_class_declaration = true; | 2249 const bool is_class_declaration = true; |
| 2241 Declaration* declaration = factory()->NewVariableDeclaration( | 2250 Declaration* declaration = factory()->NewVariableDeclaration( |
| 2242 proxy, mode, scope_, pos, is_class_declaration, | 2251 proxy, mode, scope_, pos, is_class_declaration, |
| 2243 scope_->class_declaration_group_start()); | 2252 scope_->class_declaration_group_start()); |
| 2244 Variable* outer_class_variable = Declare(declaration, true, CHECK_OK); | 2253 Variable* outer_class_variable = |
| 2254 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); | |
| 2245 proxy->var()->set_initializer_position(position()); | 2255 proxy->var()->set_initializer_position(position()); |
| 2246 // This is needed because a class ("class Name { }") creates two bindings (one | 2256 // This is needed because a class ("class Name { }") creates two bindings (one |
| 2247 // in the outer scope, and one in the class scope). The method is a function | 2257 // in the outer scope, and one in the class scope). The method is a function |
| 2248 // scope inside the inner scope (class scope). The consecutive class | 2258 // scope inside the inner scope (class scope). The consecutive class |
| 2249 // declarations are in the outer scope. | 2259 // declarations are in the outer scope. |
| 2250 if (value->class_variable_proxy() && value->class_variable_proxy()->var() && | 2260 if (value->class_variable_proxy() && value->class_variable_proxy()->var() && |
| 2251 outer_class_variable->is_class()) { | 2261 outer_class_variable->is_class()) { |
| 2252 // In some cases, the outer variable is not detected as a class variable; | 2262 // In some cases, the outer variable is not detected as a class variable; |
| 2253 // this happens e.g., for lazy methods. They are excluded from strong mode | 2263 // this happens e.g., for lazy methods. They are excluded from strong mode |
| 2254 // checks for now. TODO(marja, rossberg): re-create variables with the | 2264 // checks for now. TODO(marja, rossberg): re-create variables with the |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2390 // ConstDeclaration :: | 2400 // ConstDeclaration :: |
| 2391 // const ConstBinding (',' ConstBinding)* ';' | 2401 // const ConstBinding (',' ConstBinding)* ';' |
| 2392 // ConstBinding :: | 2402 // ConstBinding :: |
| 2393 // Identifier '=' AssignmentExpression | 2403 // Identifier '=' AssignmentExpression |
| 2394 // | 2404 // |
| 2395 // TODO(ES6): | 2405 // TODO(ES6): |
| 2396 // ConstBinding :: | 2406 // ConstBinding :: |
| 2397 // BindingPattern '=' AssignmentExpression | 2407 // BindingPattern '=' AssignmentExpression |
| 2398 | 2408 |
| 2399 parsing_result->descriptor.parser = this; | 2409 parsing_result->descriptor.parser = this; |
| 2410 parsing_result->descriptor.declaration_kind = DeclarationDescriptor::NORMAL; | |
| 2400 parsing_result->descriptor.declaration_pos = peek_position(); | 2411 parsing_result->descriptor.declaration_pos = peek_position(); |
| 2401 parsing_result->descriptor.initialization_pos = peek_position(); | 2412 parsing_result->descriptor.initialization_pos = peek_position(); |
| 2402 parsing_result->descriptor.mode = VAR; | 2413 parsing_result->descriptor.mode = VAR; |
| 2403 // True if the binding needs initialization. 'let' and 'const' declared | 2414 // True if the binding needs initialization. 'let' and 'const' declared |
| 2404 // bindings are created uninitialized by their declaration nodes and | 2415 // bindings are created uninitialized by their declaration nodes and |
| 2405 // need initialization. 'var' declared bindings are always initialized | 2416 // need initialization. 'var' declared bindings are always initialized |
| 2406 // immediately by their declaration nodes. | 2417 // immediately by their declaration nodes. |
| 2407 parsing_result->descriptor.needs_init = false; | 2418 parsing_result->descriptor.needs_init = false; |
| 2408 parsing_result->descriptor.is_const = false; | 2419 parsing_result->descriptor.is_const = false; |
| 2409 parsing_result->descriptor.init_op = Token::INIT_VAR; | 2420 parsing_result->descriptor.init_op = Token::INIT_VAR; |
| (...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3321 Block* ignore_completion_block = factory()->NewBlock( | 3332 Block* ignore_completion_block = factory()->NewBlock( |
| 3322 NULL, names->length() + 2, true, RelocInfo::kNoPosition); | 3333 NULL, names->length() + 2, true, RelocInfo::kNoPosition); |
| 3323 ZoneList<Variable*> inner_vars(names->length(), zone()); | 3334 ZoneList<Variable*> inner_vars(names->length(), zone()); |
| 3324 // For each let variable x: | 3335 // For each let variable x: |
| 3325 // make statement: let/const x = temp_x. | 3336 // make statement: let/const x = temp_x. |
| 3326 VariableMode mode = is_const ? CONST : LET; | 3337 VariableMode mode = is_const ? CONST : LET; |
| 3327 for (int i = 0; i < names->length(); i++) { | 3338 for (int i = 0; i < names->length(); i++) { |
| 3328 VariableProxy* proxy = NewUnresolved(names->at(i), mode); | 3339 VariableProxy* proxy = NewUnresolved(names->at(i), mode); |
| 3329 Declaration* declaration = factory()->NewVariableDeclaration( | 3340 Declaration* declaration = factory()->NewVariableDeclaration( |
| 3330 proxy, mode, scope_, RelocInfo::kNoPosition); | 3341 proxy, mode, scope_, RelocInfo::kNoPosition); |
| 3331 Declare(declaration, true, CHECK_OK); | 3342 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); |
| 3332 inner_vars.Add(declaration->proxy()->var(), zone()); | 3343 inner_vars.Add(declaration->proxy()->var(), zone()); |
| 3333 VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i)); | 3344 VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i)); |
| 3334 Assignment* assignment = | 3345 Assignment* assignment = |
| 3335 factory()->NewAssignment(is_const ? Token::INIT_CONST : Token::INIT_LET, | 3346 factory()->NewAssignment(is_const ? Token::INIT_CONST : Token::INIT_LET, |
| 3336 proxy, temp_proxy, RelocInfo::kNoPosition); | 3347 proxy, temp_proxy, RelocInfo::kNoPosition); |
| 3337 Statement* assignment_statement = | 3348 Statement* assignment_statement = |
| 3338 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); | 3349 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); |
| 3339 DCHECK(init->position() != RelocInfo::kNoPosition); | 3350 DCHECK(init->position() != RelocInfo::kNoPosition); |
| 3340 proxy->var()->set_initializer_position(init->position()); | 3351 proxy->var()->set_initializer_position(init->position()); |
| 3341 ignore_completion_block->AddStatement(assignment_statement, zone()); | 3352 ignore_completion_block->AddStatement(assignment_statement, zone()); |
| (...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3777 return static_cast<LiteralType>(literal_type->value()); | 3788 return static_cast<LiteralType>(literal_type->value()); |
| 3778 } | 3789 } |
| 3779 | 3790 |
| 3780 | 3791 |
| 3781 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { | 3792 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { |
| 3782 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); | 3793 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); |
| 3783 } | 3794 } |
| 3784 | 3795 |
| 3785 | 3796 |
| 3786 void ParserTraits::ParseArrowFunctionFormalParameters( | 3797 void ParserTraits::ParseArrowFunctionFormalParameters( |
| 3787 Scope* scope, Expression* expr, const Scanner::Location& params_loc, | 3798 ParserFormalParameterParsingState* parsing_state, Expression* expr, |
| 3788 bool* has_rest, Scanner::Location* duplicate_loc, bool* ok) { | 3799 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, |
| 3789 if (scope->num_parameters() >= Code::kMaxArguments) { | 3800 bool* ok) { |
| 3801 if (parsing_state->scope->num_parameters() >= Code::kMaxArguments) { | |
| 3790 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); | 3802 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); |
| 3791 *ok = false; | 3803 *ok = false; |
| 3792 return; | 3804 return; |
| 3793 } | 3805 } |
| 3794 | 3806 |
| 3795 // ArrowFunctionFormals :: | 3807 // ArrowFunctionFormals :: |
| 3796 // Binary(Token::COMMA, NonTailArrowFunctionFormals, Tail) | 3808 // Binary(Token::COMMA, NonTailArrowFunctionFormals, Tail) |
| 3797 // Tail | 3809 // Tail |
| 3798 // NonTailArrowFunctionFormals :: | 3810 // NonTailArrowFunctionFormals :: |
| 3799 // Binary(Token::COMMA, NonTailArrowFunctionFormals, VariableProxy) | 3811 // Binary(Token::COMMA, NonTailArrowFunctionFormals, VariableProxy) |
| 3800 // VariableProxy | 3812 // VariableProxy |
| 3801 // Tail :: | 3813 // Tail :: |
| 3802 // VariableProxy | 3814 // VariableProxy |
| 3803 // Spread(VariableProxy) | 3815 // Spread(VariableProxy) |
| 3804 // | 3816 // |
| 3805 // As we need to visit the parameters in left-to-right order, we recurse on | 3817 // As we need to visit the parameters in left-to-right order, we recurse on |
| 3806 // the left-hand side of comma expressions. | 3818 // the left-hand side of comma expressions. |
| 3807 // | 3819 // |
| 3808 if (expr->IsBinaryOperation()) { | 3820 if (expr->IsBinaryOperation()) { |
| 3809 BinaryOperation* binop = expr->AsBinaryOperation(); | 3821 BinaryOperation* binop = expr->AsBinaryOperation(); |
| 3810 // The classifier has already run, so we know that the expression is a valid | 3822 // The classifier has already run, so we know that the expression is a valid |
| 3811 // arrow function formals production. | 3823 // arrow function formals production. |
| 3812 DCHECK_EQ(binop->op(), Token::COMMA); | 3824 DCHECK_EQ(binop->op(), Token::COMMA); |
| 3813 Expression* left = binop->left(); | 3825 Expression* left = binop->left(); |
| 3814 Expression* right = binop->right(); | 3826 Expression* right = binop->right(); |
| 3815 ParseArrowFunctionFormalParameters(scope, left, params_loc, has_rest, | 3827 ParseArrowFunctionFormalParameters(parsing_state, left, params_loc, |
| 3816 duplicate_loc, ok); | 3828 duplicate_loc, ok); |
| 3817 if (!*ok) return; | 3829 if (!*ok) return; |
| 3818 // LHS of comma expression should be unparenthesized. | 3830 // LHS of comma expression should be unparenthesized. |
| 3819 expr = right; | 3831 expr = right; |
| 3820 } | 3832 } |
| 3821 | 3833 |
| 3822 // Only the right-most expression may be a rest parameter. | 3834 // Only the right-most expression may be a rest parameter. |
| 3823 DCHECK(!*has_rest); | 3835 DCHECK(!parsing_state->has_rest); |
| 3824 | 3836 |
| 3837 bool is_rest = false; | |
| 3825 if (expr->IsSpread()) { | 3838 if (expr->IsSpread()) { |
| 3826 *has_rest = true; | 3839 is_rest = true; |
| 3827 expr = expr->AsSpread()->expression(); | 3840 expr = expr->AsSpread()->expression(); |
| 3828 } | 3841 } |
| 3829 | 3842 |
| 3830 if (!expr->IsVariableProxy()) { | 3843 if (expr->IsVariableProxy()) { |
| 3831 // TODO(dslomov): support pattern desugaring | 3844 // When the formal parameter was originally seen, it was parsed as a |
| 3832 return; | 3845 // VariableProxy and recorded as unresolved in the scope. Here we undo that |
| 3846 // parse-time side-effect for parameters that are single-names (not | |
| 3847 // patterns). | |
| 3848 parser_->scope_->RemoveUnresolved(expr->AsVariableProxy()); | |
|
wingo
2015/06/22 10:43:18
I see, for patterns this happens in Parser::Patter
Dmitry Lomov (no reviews)
2015/06/22 11:11:42
Done.
| |
| 3833 } | 3849 } |
| 3834 DCHECK(!expr->AsVariableProxy()->is_this()); | |
| 3835 | |
| 3836 const AstRawString* raw_name = expr->AsVariableProxy()->raw_name(); | |
| 3837 Scanner::Location param_location(expr->position(), | |
| 3838 expr->position() + raw_name->length()); | |
| 3839 | |
| 3840 // When the formal parameter was originally seen, it was parsed as a | |
| 3841 // VariableProxy and recorded as unresolved in the scope. Here we undo that | |
| 3842 // parse-time side-effect. | |
| 3843 parser_->scope_->RemoveUnresolved(expr->AsVariableProxy()); | |
| 3844 | 3850 |
| 3845 ExpressionClassifier classifier; | 3851 ExpressionClassifier classifier; |
| 3846 DeclareFormalParameter(scope, expr, &classifier, *has_rest); | 3852 DeclareFormalParameter(parsing_state, expr, &classifier, is_rest); |
| 3847 if (!duplicate_loc->IsValid()) { | 3853 if (!duplicate_loc->IsValid()) { |
| 3848 *duplicate_loc = classifier.duplicate_formal_parameter_error().location; | 3854 *duplicate_loc = classifier.duplicate_formal_parameter_error().location; |
| 3849 } | 3855 } |
| 3850 } | 3856 } |
| 3851 | 3857 |
| 3852 | 3858 |
| 3853 FunctionLiteral* Parser::ParseFunctionLiteral( | 3859 FunctionLiteral* Parser::ParseFunctionLiteral( |
| 3854 const AstRawString* function_name, Scanner::Location function_name_location, | 3860 const AstRawString* function_name, Scanner::Location function_name_location, |
| 3855 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos, | 3861 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos, |
| 3856 FunctionLiteral::FunctionType function_type, | 3862 FunctionLiteral::FunctionType function_type, |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3911 Scope* original_declaration_scope = original_scope_->DeclarationScope(); | 3917 Scope* original_declaration_scope = original_scope_->DeclarationScope(); |
| 3912 Scope* scope = function_type == FunctionLiteral::DECLARATION && | 3918 Scope* scope = function_type == FunctionLiteral::DECLARATION && |
| 3913 is_sloppy(language_mode()) && | 3919 is_sloppy(language_mode()) && |
| 3914 (original_scope_ == original_declaration_scope || | 3920 (original_scope_ == original_declaration_scope || |
| 3915 declaration_scope != original_declaration_scope) | 3921 declaration_scope != original_declaration_scope) |
| 3916 ? NewScope(declaration_scope, FUNCTION_SCOPE, kind) | 3922 ? NewScope(declaration_scope, FUNCTION_SCOPE, kind) |
| 3917 : NewScope(scope_, FUNCTION_SCOPE, kind); | 3923 : NewScope(scope_, FUNCTION_SCOPE, kind); |
| 3918 ZoneList<Statement*>* body = NULL; | 3924 ZoneList<Statement*>* body = NULL; |
| 3919 int materialized_literal_count = -1; | 3925 int materialized_literal_count = -1; |
| 3920 int expected_property_count = -1; | 3926 int expected_property_count = -1; |
| 3921 ExpressionClassifier formals_classifier; | 3927 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); |
| 3928 ExpressionClassifier formals_classifier(&duplicate_finder); | |
| 3922 FunctionLiteral::EagerCompileHint eager_compile_hint = | 3929 FunctionLiteral::EagerCompileHint eager_compile_hint = |
| 3923 parenthesized_function_ ? FunctionLiteral::kShouldEagerCompile | 3930 parenthesized_function_ ? FunctionLiteral::kShouldEagerCompile |
| 3924 : FunctionLiteral::kShouldLazyCompile; | 3931 : FunctionLiteral::kShouldLazyCompile; |
| 3925 bool should_be_used_once_hint = false; | 3932 bool should_be_used_once_hint = false; |
| 3926 // Parse function body. | 3933 // Parse function body. |
| 3927 { | 3934 { |
| 3928 AstNodeFactory function_factory(ast_value_factory()); | 3935 AstNodeFactory function_factory(ast_value_factory()); |
| 3929 FunctionState function_state(&function_state_, &scope_, scope, kind, | 3936 FunctionState function_state(&function_state_, &scope_, scope, kind, |
| 3930 &function_factory); | 3937 &function_factory); |
| 3931 scope_->SetScopeName(function_name); | 3938 scope_->SetScopeName(function_name); |
| 3932 | 3939 |
| 3933 if (is_generator) { | 3940 if (is_generator) { |
| 3934 // For generators, allocating variables in contexts is currently a win | 3941 // For generators, allocating variables in contexts is currently a win |
| 3935 // because it minimizes the work needed to suspend and resume an | 3942 // because it minimizes the work needed to suspend and resume an |
| 3936 // activation. | 3943 // activation. |
| 3937 scope_->ForceContextAllocation(); | 3944 scope_->ForceContextAllocation(); |
| 3938 | 3945 |
| 3939 // Calling a generator returns a generator object. That object is stored | 3946 // Calling a generator returns a generator object. That object is stored |
| 3940 // in a temporary variable, a definition that is used by "yield" | 3947 // in a temporary variable, a definition that is used by "yield" |
| 3941 // expressions. This also marks the FunctionState as a generator. | 3948 // expressions. This also marks the FunctionState as a generator. |
| 3942 Variable* temp = scope_->DeclarationScope()->NewTemporary( | 3949 Variable* temp = scope_->DeclarationScope()->NewTemporary( |
| 3943 ast_value_factory()->dot_generator_object_string()); | 3950 ast_value_factory()->dot_generator_object_string()); |
| 3944 function_state.set_generator_object_variable(temp); | 3951 function_state.set_generator_object_variable(temp); |
| 3945 } | 3952 } |
| 3946 | 3953 |
| 3947 bool has_rest = false; | |
| 3948 Expect(Token::LPAREN, CHECK_OK); | 3954 Expect(Token::LPAREN, CHECK_OK); |
| 3949 int start_position = scanner()->location().beg_pos; | 3955 int start_position = scanner()->location().beg_pos; |
| 3950 scope_->set_start_position(start_position); | 3956 scope_->set_start_position(start_position); |
| 3951 num_parameters = ParseFormalParameterList(scope, &has_rest, | 3957 ParserFormalParameterParsingState parsing_state(scope); |
| 3952 &formals_classifier, CHECK_OK); | 3958 num_parameters = |
| 3959 ParseFormalParameterList(&parsing_state, &formals_classifier, CHECK_OK); | |
| 3953 Expect(Token::RPAREN, CHECK_OK); | 3960 Expect(Token::RPAREN, CHECK_OK); |
| 3954 int formals_end_position = scanner()->location().end_pos; | 3961 int formals_end_position = scanner()->location().end_pos; |
| 3955 | 3962 |
| 3956 CheckArityRestrictions(num_parameters, arity_restriction, has_rest, | 3963 CheckArityRestrictions(num_parameters, arity_restriction, |
| 3957 start_position, formals_end_position, CHECK_OK); | 3964 parsing_state.has_rest, start_position, |
| 3958 | 3965 formals_end_position, CHECK_OK); |
| 3959 Expect(Token::LBRACE, CHECK_OK); | 3966 Expect(Token::LBRACE, CHECK_OK); |
| 3960 | 3967 |
| 3961 // If we have a named function expression, we add a local variable | 3968 // If we have a named function expression, we add a local variable |
| 3962 // declaration to the body of the function with the name of the | 3969 // declaration to the body of the function with the name of the |
| 3963 // function and let it refer to the function itself (closure). | 3970 // function and let it refer to the function itself (closure). |
| 3964 // NOTE: We create a proxy and resolve it here so that in the | 3971 // NOTE: We create a proxy and resolve it here so that in the |
| 3965 // future we can change the AST to only refer to VariableProxies | 3972 // future we can change the AST to only refer to VariableProxies |
| 3966 // instead of Variables and Proxis as is the case now. | 3973 // instead of Variables and Proxis as is the case now. |
| 3967 Variable* fvar = NULL; | 3974 Variable* fvar = NULL; |
| 3968 Token::Value fvar_init_op = Token::INIT_CONST_LEGACY; | 3975 Token::Value fvar_init_op = Token::INIT_CONST_LEGACY; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4043 is_lazily_parsed = false; | 4050 is_lazily_parsed = false; |
| 4044 | 4051 |
| 4045 // This is probably an initialization function. Inform the compiler it | 4052 // This is probably an initialization function. Inform the compiler it |
| 4046 // should also eager-compile this function, and that we expect it to be | 4053 // should also eager-compile this function, and that we expect it to be |
| 4047 // used once. | 4054 // used once. |
| 4048 eager_compile_hint = FunctionLiteral::kShouldEagerCompile; | 4055 eager_compile_hint = FunctionLiteral::kShouldEagerCompile; |
| 4049 should_be_used_once_hint = true; | 4056 should_be_used_once_hint = true; |
| 4050 } | 4057 } |
| 4051 } | 4058 } |
| 4052 if (!is_lazily_parsed) { | 4059 if (!is_lazily_parsed) { |
| 4053 body = ParseEagerFunctionBody(function_name, pos, fvar, fvar_init_op, | 4060 body = ParseEagerFunctionBody(function_name, pos, parsing_state, fvar, |
| 4054 kind, CHECK_OK); | 4061 fvar_init_op, kind, CHECK_OK); |
| 4055 materialized_literal_count = function_state.materialized_literal_count(); | 4062 materialized_literal_count = function_state.materialized_literal_count(); |
| 4056 expected_property_count = function_state.expected_property_count(); | 4063 expected_property_count = function_state.expected_property_count(); |
| 4057 | 4064 |
| 4058 if (is_strong(language_mode()) && IsSubclassConstructor(kind)) { | 4065 if (is_strong(language_mode()) && IsSubclassConstructor(kind)) { |
| 4059 if (!function_state.super_location().IsValid()) { | 4066 if (!function_state.super_location().IsValid()) { |
| 4060 ReportMessageAt(function_name_location, | 4067 ReportMessageAt(function_name_location, |
| 4061 MessageTemplate::kStrongSuperCallMissing, | 4068 MessageTemplate::kStrongSuperCallMissing, |
| 4062 kReferenceError); | 4069 kReferenceError); |
| 4063 *ok = false; | 4070 *ok = false; |
| 4064 return nullptr; | 4071 return nullptr; |
| 4065 } | 4072 } |
| 4066 } | 4073 } |
| 4067 } | 4074 } |
| 4068 | 4075 |
| 4069 // Validate name and parameter names. We can do this only after parsing the | 4076 // Validate name and parameter names. We can do this only after parsing the |
| 4070 // function, since the function can declare itself strict. | 4077 // function, since the function can declare itself strict. |
| 4071 CheckFunctionName(language_mode(), kind, function_name, | 4078 CheckFunctionName(language_mode(), kind, function_name, |
| 4072 name_is_strict_reserved, function_name_location, | 4079 name_is_strict_reserved, function_name_location, |
| 4073 CHECK_OK); | 4080 CHECK_OK); |
| 4074 const bool use_strict_params = has_rest || IsConciseMethod(kind); | 4081 const bool use_strict_params = |
| 4082 !parsing_state.is_simple_parameter_list || IsConciseMethod(kind); | |
| 4075 const bool allow_duplicate_parameters = | 4083 const bool allow_duplicate_parameters = |
| 4076 is_sloppy(language_mode()) && !use_strict_params; | 4084 is_sloppy(language_mode()) && !use_strict_params; |
| 4077 ValidateFormalParameters(&formals_classifier, language_mode(), | 4085 ValidateFormalParameters(&formals_classifier, language_mode(), |
| 4078 allow_duplicate_parameters, CHECK_OK); | 4086 allow_duplicate_parameters, CHECK_OK); |
| 4079 | 4087 |
| 4080 if (is_strict(language_mode())) { | 4088 if (is_strict(language_mode())) { |
| 4081 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(), | 4089 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(), |
| 4082 CHECK_OK); | 4090 CHECK_OK); |
| 4083 CheckConflictingVarDeclarations(scope, CHECK_OK); | 4091 CheckConflictingVarDeclarations(scope, CHECK_OK); |
| 4084 } | 4092 } |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4226 RelocInfo::kNoPosition); | 4234 RelocInfo::kNoPosition); |
| 4227 IfStatement* if_statement = factory()->NewIfStatement( | 4235 IfStatement* if_statement = factory()->NewIfStatement( |
| 4228 condition, factory()->NewExpressionStatement(throw_type_error, | 4236 condition, factory()->NewExpressionStatement(throw_type_error, |
| 4229 RelocInfo::kNoPosition), | 4237 RelocInfo::kNoPosition), |
| 4230 factory()->NewEmptyStatement(RelocInfo::kNoPosition), | 4238 factory()->NewEmptyStatement(RelocInfo::kNoPosition), |
| 4231 RelocInfo::kNoPosition); | 4239 RelocInfo::kNoPosition); |
| 4232 return if_statement; | 4240 return if_statement; |
| 4233 } | 4241 } |
| 4234 | 4242 |
| 4235 | 4243 |
| 4244 Block* Parser::BuildParameterInitializationBlock( | |
| 4245 const ParserFormalParameterParsingState& formal_parameters, bool* ok) { | |
| 4246 DCHECK(scope_->is_function_scope()); | |
| 4247 Block* init_block = nullptr; | |
| 4248 for (auto parameter : formal_parameters.params) { | |
| 4249 if (parameter.pattern == nullptr) continue; | |
| 4250 if (init_block == nullptr) { | |
| 4251 init_block = factory()->NewBlock(NULL, 1, true, RelocInfo::kNoPosition); | |
| 4252 } | |
| 4253 | |
| 4254 DeclarationDescriptor descriptor; | |
| 4255 descriptor.declaration_kind = DeclarationDescriptor::PARAMETER; | |
| 4256 descriptor.parser = this; | |
| 4257 descriptor.declaration_scope = scope_; | |
| 4258 descriptor.scope = scope_; | |
| 4259 descriptor.mode = LET; | |
| 4260 descriptor.is_const = false; | |
| 4261 descriptor.needs_init = true; | |
| 4262 descriptor.declaration_pos = parameter.pattern->position(); | |
| 4263 descriptor.initialization_pos = parameter.pattern->position(); | |
| 4264 descriptor.init_op = Token::INIT_LET; | |
| 4265 DeclarationParsingResult::Declaration decl( | |
| 4266 parameter.pattern, parameter.pattern->position(), | |
| 4267 factory()->NewVariableProxy(parameter.var)); | |
| 4268 PatternRewriter::DeclareAndInitializeVariables(init_block, &descriptor, | |
| 4269 &decl, nullptr, CHECK_OK); | |
| 4270 } | |
| 4271 return init_block; | |
| 4272 } | |
| 4273 | |
| 4274 | |
| 4236 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( | 4275 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( |
| 4237 const AstRawString* function_name, int pos, Variable* fvar, | 4276 const AstRawString* function_name, int pos, |
| 4277 const ParserFormalParameterParsingState& formal_parameters, Variable* fvar, | |
| 4238 Token::Value fvar_init_op, FunctionKind kind, bool* ok) { | 4278 Token::Value fvar_init_op, FunctionKind kind, bool* ok) { |
| 4239 // Everything inside an eagerly parsed function will be parsed eagerly | 4279 // Everything inside an eagerly parsed function will be parsed eagerly |
| 4240 // (see comment above). | 4280 // (see comment above). |
| 4241 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); | 4281 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); |
| 4242 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(8, zone()); | 4282 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(8, zone()); |
| 4243 if (fvar != NULL) { | 4283 if (fvar != NULL) { |
| 4244 VariableProxy* fproxy = scope_->NewUnresolved(factory(), function_name); | 4284 VariableProxy* fproxy = scope_->NewUnresolved(factory(), function_name); |
| 4245 fproxy->BindTo(fvar); | 4285 fproxy->BindTo(fvar); |
| 4246 body->Add(factory()->NewExpressionStatement( | 4286 body->Add(factory()->NewExpressionStatement( |
| 4247 factory()->NewAssignment(fvar_init_op, | 4287 factory()->NewAssignment(fvar_init_op, |
| 4248 fproxy, | 4288 fproxy, |
| 4249 factory()->NewThisFunction(pos), | 4289 factory()->NewThisFunction(pos), |
| 4250 RelocInfo::kNoPosition), | 4290 RelocInfo::kNoPosition), |
| 4251 RelocInfo::kNoPosition), zone()); | 4291 RelocInfo::kNoPosition), zone()); |
| 4252 } | 4292 } |
| 4253 | 4293 |
| 4254 | 4294 |
| 4255 // For concise constructors, check that they are constructed, | 4295 // For concise constructors, check that they are constructed, |
| 4256 // not called. | 4296 // not called. |
| 4257 if (i::IsConstructor(kind)) { | 4297 if (i::IsConstructor(kind)) { |
| 4258 AddAssertIsConstruct(body, pos); | 4298 AddAssertIsConstruct(body, pos); |
| 4259 } | 4299 } |
| 4260 | 4300 |
| 4301 auto init_block = | |
| 4302 BuildParameterInitializationBlock(formal_parameters, CHECK_OK); | |
| 4303 if (init_block != nullptr) { | |
| 4304 body->Add(init_block, zone()); | |
| 4305 } | |
| 4306 | |
| 4261 // For generators, allocate and yield an iterator on function entry. | 4307 // For generators, allocate and yield an iterator on function entry. |
| 4262 if (IsGeneratorFunction(kind)) { | 4308 if (IsGeneratorFunction(kind)) { |
| 4263 ZoneList<Expression*>* arguments = | 4309 ZoneList<Expression*>* arguments = |
| 4264 new(zone()) ZoneList<Expression*>(0, zone()); | 4310 new(zone()) ZoneList<Expression*>(0, zone()); |
| 4265 CallRuntime* allocation = factory()->NewCallRuntime( | 4311 CallRuntime* allocation = factory()->NewCallRuntime( |
| 4266 ast_value_factory()->empty_string(), | 4312 ast_value_factory()->empty_string(), |
| 4267 Runtime::FunctionForId(Runtime::kCreateJSGeneratorObject), arguments, | 4313 Runtime::FunctionForId(Runtime::kCreateJSGeneratorObject), arguments, |
| 4268 pos); | 4314 pos); |
| 4269 VariableProxy* init_proxy = factory()->NewVariableProxy( | 4315 VariableProxy* init_proxy = factory()->NewVariableProxy( |
| 4270 function_state_->generator_object_variable()); | 4316 function_state_->generator_object_variable()); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4377 static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); | 4423 static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); |
| 4378 scope_->SetScopeName(name); | 4424 scope_->SetScopeName(name); |
| 4379 | 4425 |
| 4380 VariableProxy* proxy = NULL; | 4426 VariableProxy* proxy = NULL; |
| 4381 if (name != NULL) { | 4427 if (name != NULL) { |
| 4382 proxy = NewUnresolved(name, CONST); | 4428 proxy = NewUnresolved(name, CONST); |
| 4383 const bool is_class_declaration = true; | 4429 const bool is_class_declaration = true; |
| 4384 Declaration* declaration = factory()->NewVariableDeclaration( | 4430 Declaration* declaration = factory()->NewVariableDeclaration( |
| 4385 proxy, CONST, block_scope, pos, is_class_declaration, | 4431 proxy, CONST, block_scope, pos, is_class_declaration, |
| 4386 scope_->class_declaration_group_start()); | 4432 scope_->class_declaration_group_start()); |
| 4387 Declare(declaration, true, CHECK_OK); | 4433 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); |
| 4388 } | 4434 } |
| 4389 | 4435 |
| 4390 Expression* extends = NULL; | 4436 Expression* extends = NULL; |
| 4391 if (Check(Token::EXTENDS)) { | 4437 if (Check(Token::EXTENDS)) { |
| 4392 block_scope->set_start_position(scanner()->location().end_pos); | 4438 block_scope->set_start_position(scanner()->location().end_pos); |
| 4393 ExpressionClassifier classifier; | 4439 ExpressionClassifier classifier; |
| 4394 extends = ParseLeftHandSideExpression(&classifier, CHECK_OK); | 4440 extends = ParseLeftHandSideExpression(&classifier, CHECK_OK); |
| 4395 ValidateExpression(&classifier, CHECK_OK); | 4441 ValidateExpression(&classifier, CHECK_OK); |
| 4396 } else { | 4442 } else { |
| 4397 block_scope->set_start_position(scanner()->location().end_pos); | 4443 block_scope->set_start_position(scanner()->location().end_pos); |
| (...skipping 1453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5851 Expression* Parser::SpreadCallNew(Expression* function, | 5897 Expression* Parser::SpreadCallNew(Expression* function, |
| 5852 ZoneList<v8::internal::Expression*>* args, | 5898 ZoneList<v8::internal::Expression*>* args, |
| 5853 int pos) { | 5899 int pos) { |
| 5854 args->InsertAt(0, function, zone()); | 5900 args->InsertAt(0, function, zone()); |
| 5855 | 5901 |
| 5856 return factory()->NewCallRuntime( | 5902 return factory()->NewCallRuntime( |
| 5857 ast_value_factory()->reflect_construct_string(), NULL, args, pos); | 5903 ast_value_factory()->reflect_construct_string(), NULL, args, pos); |
| 5858 } | 5904 } |
| 5859 } // namespace internal | 5905 } // namespace internal |
| 5860 } // namespace v8 | 5906 } // namespace v8 |
| OLD | NEW |