| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1401 Module* Parser::ParseModuleVariable(bool* ok) { | 1401 Module* Parser::ParseModuleVariable(bool* ok) { |
| 1402 // ModulePath: | 1402 // ModulePath: |
| 1403 // Identifier | 1403 // Identifier |
| 1404 | 1404 |
| 1405 Handle<String> name = ParseIdentifier(CHECK_OK); | 1405 Handle<String> name = ParseIdentifier(CHECK_OK); |
| 1406 #ifdef DEBUG | 1406 #ifdef DEBUG |
| 1407 if (FLAG_print_interface_details) | 1407 if (FLAG_print_interface_details) |
| 1408 PrintF("# Module variable %s ", name->ToAsciiArray()); | 1408 PrintF("# Module variable %s ", name->ToAsciiArray()); |
| 1409 #endif | 1409 #endif |
| 1410 VariableProxy* proxy = top_scope_->NewUnresolved( | 1410 VariableProxy* proxy = top_scope_->NewUnresolved( |
| 1411 factory(), name, scanner().location().beg_pos, | 1411 factory(), name, Interface::NewModule(zone()), |
| 1412 Interface::NewModule(zone())); | 1412 scanner().location().beg_pos); |
| 1413 | 1413 |
| 1414 return factory()->NewModuleVariable(proxy); | 1414 return factory()->NewModuleVariable(proxy); |
| 1415 } | 1415 } |
| 1416 | 1416 |
| 1417 | 1417 |
| 1418 Module* Parser::ParseModuleUrl(bool* ok) { | 1418 Module* Parser::ParseModuleUrl(bool* ok) { |
| 1419 // Module: | 1419 // Module: |
| 1420 // String | 1420 // String |
| 1421 | 1421 |
| 1422 Expect(Token::STRING, CHECK_OK); | 1422 Expect(Token::STRING, CHECK_OK); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1492 module->interface()->Print(); | 1492 module->interface()->Print(); |
| 1493 } | 1493 } |
| 1494 #endif | 1494 #endif |
| 1495 ReportMessage("invalid_module_path", Vector<Handle<String> >(&name, 1)); | 1495 ReportMessage("invalid_module_path", Vector<Handle<String> >(&name, 1)); |
| 1496 return NULL; | 1496 return NULL; |
| 1497 } | 1497 } |
| 1498 VariableProxy* proxy = NewUnresolved(names[i], LET, interface); | 1498 VariableProxy* proxy = NewUnresolved(names[i], LET, interface); |
| 1499 Declaration* declaration = | 1499 Declaration* declaration = |
| 1500 factory()->NewImportDeclaration(proxy, module, top_scope_); | 1500 factory()->NewImportDeclaration(proxy, module, top_scope_); |
| 1501 Declare(declaration, true, CHECK_OK); | 1501 Declare(declaration, true, CHECK_OK); |
| 1502 // TODO(rossberg): Add initialization statement to block. | |
| 1503 } | 1502 } |
| 1504 | 1503 |
| 1505 return block; | 1504 return block; |
| 1506 } | 1505 } |
| 1507 | 1506 |
| 1508 | 1507 |
| 1509 Statement* Parser::ParseExportDeclaration(bool* ok) { | 1508 Statement* Parser::ParseExportDeclaration(bool* ok) { |
| 1510 // ExportDeclaration: | 1509 // ExportDeclaration: |
| 1511 // 'export' Identifier (',' Identifier)* ';' | 1510 // 'export' Identifier (',' Identifier)* ';' |
| 1512 // 'export' VariableDeclaration | 1511 // 'export' VariableDeclaration |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1733 | 1732 |
| 1734 | 1733 |
| 1735 VariableProxy* Parser::NewUnresolved( | 1734 VariableProxy* Parser::NewUnresolved( |
| 1736 Handle<String> name, VariableMode mode, Interface* interface) { | 1735 Handle<String> name, VariableMode mode, Interface* interface) { |
| 1737 // If we are inside a function, a declaration of a var/const variable is a | 1736 // If we are inside a function, a declaration of a var/const variable is a |
| 1738 // truly local variable, and the scope of the variable is always the function | 1737 // truly local variable, and the scope of the variable is always the function |
| 1739 // scope. | 1738 // scope. |
| 1740 // Let/const variables in harmony mode are always added to the immediately | 1739 // Let/const variables in harmony mode are always added to the immediately |
| 1741 // enclosing scope. | 1740 // enclosing scope. |
| 1742 return DeclarationScope(mode)->NewUnresolved( | 1741 return DeclarationScope(mode)->NewUnresolved( |
| 1743 factory(), name, scanner().location().beg_pos, interface); | 1742 factory(), name, interface, scanner().location().beg_pos); |
| 1744 } | 1743 } |
| 1745 | 1744 |
| 1746 | 1745 |
| 1747 void Parser::Declare(Declaration* declaration, bool resolve, bool* ok) { | 1746 void Parser::Declare(Declaration* declaration, bool resolve, bool* ok) { |
| 1748 VariableProxy* proxy = declaration->proxy(); | 1747 VariableProxy* proxy = declaration->proxy(); |
| 1749 Handle<String> name = proxy->name(); | 1748 Handle<String> name = proxy->name(); |
| 1750 VariableMode mode = declaration->mode(); | 1749 VariableMode mode = declaration->mode(); |
| 1751 Scope* declaration_scope = DeclarationScope(mode); | 1750 Scope* declaration_scope = DeclarationScope(mode); |
| 1752 Variable* var = NULL; | 1751 Variable* var = NULL; |
| 1753 | 1752 |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1947 shared->set_construct_stub(*construct_stub); | 1946 shared->set_construct_stub(*construct_stub); |
| 1948 | 1947 |
| 1949 // Copy the function data to the shared function info. | 1948 // Copy the function data to the shared function info. |
| 1950 shared->set_function_data(fun->shared()->function_data()); | 1949 shared->set_function_data(fun->shared()->function_data()); |
| 1951 int parameters = fun->shared()->formal_parameter_count(); | 1950 int parameters = fun->shared()->formal_parameter_count(); |
| 1952 shared->set_formal_parameter_count(parameters); | 1951 shared->set_formal_parameter_count(parameters); |
| 1953 | 1952 |
| 1954 // TODO(1240846): It's weird that native function declarations are | 1953 // TODO(1240846): It's weird that native function declarations are |
| 1955 // introduced dynamically when we meet their declarations, whereas | 1954 // introduced dynamically when we meet their declarations, whereas |
| 1956 // other functions are set up when entering the surrounding scope. | 1955 // other functions are set up when entering the surrounding scope. |
| 1957 VariableProxy* proxy = NewUnresolved(name, VAR); | 1956 VariableProxy* proxy = NewUnresolved(name, VAR, Interface::NewValue()); |
| 1958 Declaration* declaration = | 1957 Declaration* declaration = |
| 1959 factory()->NewVariableDeclaration(proxy, VAR, top_scope_); | 1958 factory()->NewVariableDeclaration(proxy, VAR, top_scope_); |
| 1960 Declare(declaration, true, CHECK_OK); | 1959 Declare(declaration, true, CHECK_OK); |
| 1961 SharedFunctionInfoLiteral* lit = | 1960 SharedFunctionInfoLiteral* lit = |
| 1962 factory()->NewSharedFunctionInfoLiteral(shared); | 1961 factory()->NewSharedFunctionInfoLiteral(shared); |
| 1963 return factory()->NewExpressionStatement( | 1962 return factory()->NewExpressionStatement( |
| 1964 factory()->NewAssignment( | 1963 factory()->NewAssignment( |
| 1965 Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition)); | 1964 Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition)); |
| 1966 } | 1965 } |
| 1967 | 1966 |
| 1968 | 1967 |
| 1969 Statement* Parser::ParseFunctionDeclaration(ZoneStringList* names, bool* ok) { | 1968 Statement* Parser::ParseFunctionDeclaration(ZoneStringList* names, bool* ok) { |
| 1970 // FunctionDeclaration :: | 1969 // FunctionDeclaration :: |
| 1971 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' | 1970 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' |
| 1972 Expect(Token::FUNCTION, CHECK_OK); | 1971 Expect(Token::FUNCTION, CHECK_OK); |
| 1973 int function_token_position = scanner().location().beg_pos; | 1972 int function_token_position = scanner().location().beg_pos; |
| 1974 bool is_strict_reserved = false; | 1973 bool is_strict_reserved = false; |
| 1975 Handle<String> name = ParseIdentifierOrStrictReservedWord( | 1974 Handle<String> name = ParseIdentifierOrStrictReservedWord( |
| 1976 &is_strict_reserved, CHECK_OK); | 1975 &is_strict_reserved, CHECK_OK); |
| 1977 FunctionLiteral* fun = ParseFunctionLiteral(name, | 1976 FunctionLiteral* fun = ParseFunctionLiteral(name, |
| 1978 is_strict_reserved, | 1977 is_strict_reserved, |
| 1979 function_token_position, | 1978 function_token_position, |
| 1980 FunctionLiteral::DECLARATION, | 1979 FunctionLiteral::DECLARATION, |
| 1981 CHECK_OK); | 1980 CHECK_OK); |
| 1982 // Even if we're not at the top-level of the global or a function | 1981 // Even if we're not at the top-level of the global or a function |
| 1983 // scope, we treat is as such and introduce the function with it's | 1982 // scope, we treat is as such and introduce the function with it's |
| 1984 // initial value upon entering the corresponding scope. | 1983 // initial value upon entering the corresponding scope. |
| 1985 VariableMode mode = is_extended_mode() ? LET : VAR; | 1984 VariableMode mode = is_extended_mode() ? LET : VAR; |
| 1986 VariableProxy* proxy = NewUnresolved(name, mode); | 1985 VariableProxy* proxy = NewUnresolved(name, mode, Interface::NewValue()); |
| 1987 Declaration* declaration = | 1986 Declaration* declaration = |
| 1988 factory()->NewFunctionDeclaration(proxy, mode, fun, top_scope_); | 1987 factory()->NewFunctionDeclaration(proxy, mode, fun, top_scope_); |
| 1989 Declare(declaration, true, CHECK_OK); | 1988 Declare(declaration, true, CHECK_OK); |
| 1990 if (names) names->Add(name, zone()); | 1989 if (names) names->Add(name, zone()); |
| 1991 return factory()->NewEmptyStatement(); | 1990 return factory()->NewEmptyStatement(); |
| 1992 } | 1991 } |
| 1993 | 1992 |
| 1994 | 1993 |
| 1995 Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) { | 1994 Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) { |
| 1996 if (top_scope_->is_extended_mode()) return ParseScopedBlock(labels, ok); | 1995 if (top_scope_->is_extended_mode()) return ParseScopedBlock(labels, ok); |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2208 // which the variable or constant is declared. Only function variables have | 2207 // which the variable or constant is declared. Only function variables have |
| 2209 // an initial value in the declaration (because they are initialized upon | 2208 // an initial value in the declaration (because they are initialized upon |
| 2210 // entering the function). | 2209 // entering the function). |
| 2211 // | 2210 // |
| 2212 // If we have a const declaration, in an inner scope, the proxy is always | 2211 // If we have a const declaration, in an inner scope, the proxy is always |
| 2213 // bound to the declared variable (independent of possibly surrounding with | 2212 // bound to the declared variable (independent of possibly surrounding with |
| 2214 // statements). | 2213 // statements). |
| 2215 // For let/const declarations in harmony mode, we can also immediately | 2214 // For let/const declarations in harmony mode, we can also immediately |
| 2216 // pre-resolve the proxy because it resides in the same scope as the | 2215 // pre-resolve the proxy because it resides in the same scope as the |
| 2217 // declaration. | 2216 // declaration. |
| 2218 VariableProxy* proxy = NewUnresolved(name, mode); | 2217 Interface* interface = |
| 2218 is_const ? Interface::NewConst() : Interface::NewValue(); |
| 2219 VariableProxy* proxy = NewUnresolved(name, mode, interface); |
| 2219 Declaration* declaration = | 2220 Declaration* declaration = |
| 2220 factory()->NewVariableDeclaration(proxy, mode, top_scope_); | 2221 factory()->NewVariableDeclaration(proxy, mode, top_scope_); |
| 2221 Declare(declaration, mode != VAR, CHECK_OK); | 2222 Declare(declaration, mode != VAR, CHECK_OK); |
| 2222 nvars++; | 2223 nvars++; |
| 2223 if (declaration_scope->num_var_or_const() > kMaxNumFunctionLocals) { | 2224 if (declaration_scope->num_var_or_const() > kMaxNumFunctionLocals) { |
| 2224 ReportMessageAt(scanner().location(), "too_many_variables", | 2225 ReportMessageAt(scanner().location(), "too_many_variables", |
| 2225 Vector<const char*>::empty()); | 2226 Vector<const char*>::empty()); |
| 2226 *ok = false; | 2227 *ok = false; |
| 2227 return NULL; | 2228 return NULL; |
| 2228 } | 2229 } |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2369 } | 2370 } |
| 2370 | 2371 |
| 2371 // Add an assignment node to the initialization statement block if we still | 2372 // Add an assignment node to the initialization statement block if we still |
| 2372 // have a pending initialization value. | 2373 // have a pending initialization value. |
| 2373 if (value != NULL) { | 2374 if (value != NULL) { |
| 2374 ASSERT(mode == VAR); | 2375 ASSERT(mode == VAR); |
| 2375 // 'var' initializations are simply assignments (with all the consequences | 2376 // 'var' initializations are simply assignments (with all the consequences |
| 2376 // if they are inside a 'with' statement - they may change a 'with' object | 2377 // if they are inside a 'with' statement - they may change a 'with' object |
| 2377 // property). | 2378 // property). |
| 2378 VariableProxy* proxy = | 2379 VariableProxy* proxy = |
| 2379 initialization_scope->NewUnresolved(factory(), name); | 2380 initialization_scope->NewUnresolved(factory(), name, interface); |
| 2380 Assignment* assignment = | 2381 Assignment* assignment = |
| 2381 factory()->NewAssignment(init_op, proxy, value, position); | 2382 factory()->NewAssignment(init_op, proxy, value, position); |
| 2382 block->AddStatement(factory()->NewExpressionStatement(assignment), | 2383 block->AddStatement(factory()->NewExpressionStatement(assignment), |
| 2383 zone()); | 2384 zone()); |
| 2384 } | 2385 } |
| 2385 | 2386 |
| 2386 if (fni_ != NULL) fni_->Leave(); | 2387 if (fni_ != NULL) fni_->Leave(); |
| 2387 } while (peek() == Token::COMMA); | 2388 } while (peek() == Token::COMMA); |
| 2388 | 2389 |
| 2389 // If there was a single non-const declaration, return it in the output | 2390 // If there was a single non-const declaration, return it in the output |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2877 // Create an in-between scope for let-bound iteration variables. | 2878 // Create an in-between scope for let-bound iteration variables. |
| 2878 Scope* saved_scope = top_scope_; | 2879 Scope* saved_scope = top_scope_; |
| 2879 Scope* for_scope = NewScope(top_scope_, BLOCK_SCOPE); | 2880 Scope* for_scope = NewScope(top_scope_, BLOCK_SCOPE); |
| 2880 top_scope_ = for_scope; | 2881 top_scope_ = for_scope; |
| 2881 | 2882 |
| 2882 Expect(Token::FOR, CHECK_OK); | 2883 Expect(Token::FOR, CHECK_OK); |
| 2883 Expect(Token::LPAREN, CHECK_OK); | 2884 Expect(Token::LPAREN, CHECK_OK); |
| 2884 for_scope->set_start_position(scanner().location().beg_pos); | 2885 for_scope->set_start_position(scanner().location().beg_pos); |
| 2885 if (peek() != Token::SEMICOLON) { | 2886 if (peek() != Token::SEMICOLON) { |
| 2886 if (peek() == Token::VAR || peek() == Token::CONST) { | 2887 if (peek() == Token::VAR || peek() == Token::CONST) { |
| 2888 bool is_const = peek() == Token::CONST; |
| 2887 Handle<String> name; | 2889 Handle<String> name; |
| 2888 Block* variable_statement = | 2890 Block* variable_statement = |
| 2889 ParseVariableDeclarations(kForStatement, NULL, NULL, &name, CHECK_OK); | 2891 ParseVariableDeclarations(kForStatement, NULL, NULL, &name, CHECK_OK); |
| 2890 | 2892 |
| 2891 if (peek() == Token::IN && !name.is_null()) { | 2893 if (peek() == Token::IN && !name.is_null()) { |
| 2892 VariableProxy* each = top_scope_->NewUnresolved(factory(), name); | 2894 Interface* interface = |
| 2895 is_const ? Interface::NewConst() : Interface::NewValue(); |
| 2896 VariableProxy* each = |
| 2897 top_scope_->NewUnresolved(factory(), name, interface); |
| 2893 ForInStatement* loop = factory()->NewForInStatement(labels); | 2898 ForInStatement* loop = factory()->NewForInStatement(labels); |
| 2894 Target target(&this->target_stack_, loop); | 2899 Target target(&this->target_stack_, loop); |
| 2895 | 2900 |
| 2896 Expect(Token::IN, CHECK_OK); | 2901 Expect(Token::IN, CHECK_OK); |
| 2897 Expression* enumerable = ParseExpression(true, CHECK_OK); | 2902 Expression* enumerable = ParseExpression(true, CHECK_OK); |
| 2898 Expect(Token::RPAREN, CHECK_OK); | 2903 Expect(Token::RPAREN, CHECK_OK); |
| 2899 | 2904 |
| 2900 Statement* body = ParseStatement(NULL, CHECK_OK); | 2905 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2901 loop->Initialize(each, enumerable, body); | 2906 loop->Initialize(each, enumerable, body); |
| 2902 Block* result = factory()->NewBlock(NULL, 2, false); | 2907 Block* result = factory()->NewBlock(NULL, 2, false); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2929 // for (x' in e) { | 2934 // for (x' in e) { |
| 2930 // let x; | 2935 // let x; |
| 2931 // x = x'; | 2936 // x = x'; |
| 2932 // b; | 2937 // b; |
| 2933 // } | 2938 // } |
| 2934 | 2939 |
| 2935 // TODO(keuchel): Move the temporary variable to the block scope, after | 2940 // TODO(keuchel): Move the temporary variable to the block scope, after |
| 2936 // implementing stack allocated block scoped variables. | 2941 // implementing stack allocated block scoped variables. |
| 2937 Variable* temp = top_scope_->DeclarationScope()->NewTemporary(name); | 2942 Variable* temp = top_scope_->DeclarationScope()->NewTemporary(name); |
| 2938 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); | 2943 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); |
| 2939 VariableProxy* each = top_scope_->NewUnresolved(factory(), name); | 2944 Interface* interface = Interface::NewValue(); |
| 2945 VariableProxy* each = |
| 2946 top_scope_->NewUnresolved(factory(), name, interface); |
| 2940 ForInStatement* loop = factory()->NewForInStatement(labels); | 2947 ForInStatement* loop = factory()->NewForInStatement(labels); |
| 2941 Target target(&this->target_stack_, loop); | 2948 Target target(&this->target_stack_, loop); |
| 2942 | 2949 |
| 2943 Expect(Token::IN, CHECK_OK); | 2950 Expect(Token::IN, CHECK_OK); |
| 2944 Expression* enumerable = ParseExpression(true, CHECK_OK); | 2951 Expression* enumerable = ParseExpression(true, CHECK_OK); |
| 2945 Expect(Token::RPAREN, CHECK_OK); | 2952 Expect(Token::RPAREN, CHECK_OK); |
| 2946 | 2953 |
| 2947 Statement* body = ParseStatement(NULL, CHECK_OK); | 2954 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2948 Block* body_block = factory()->NewBlock(NULL, 3, false); | 2955 Block* body_block = factory()->NewBlock(NULL, 3, false); |
| 2949 Assignment* assignment = factory()->NewAssignment( | 2956 Assignment* assignment = factory()->NewAssignment( |
| (...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3664 case Token::FUTURE_STRICT_RESERVED_WORD: { | 3671 case Token::FUTURE_STRICT_RESERVED_WORD: { |
| 3665 Handle<String> name = ParseIdentifier(CHECK_OK); | 3672 Handle<String> name = ParseIdentifier(CHECK_OK); |
| 3666 if (fni_ != NULL) fni_->PushVariableName(name); | 3673 if (fni_ != NULL) fni_->PushVariableName(name); |
| 3667 // The name may refer to a module instance object, so its type is unknown. | 3674 // The name may refer to a module instance object, so its type is unknown. |
| 3668 #ifdef DEBUG | 3675 #ifdef DEBUG |
| 3669 if (FLAG_print_interface_details) | 3676 if (FLAG_print_interface_details) |
| 3670 PrintF("# Variable %s ", name->ToAsciiArray()); | 3677 PrintF("# Variable %s ", name->ToAsciiArray()); |
| 3671 #endif | 3678 #endif |
| 3672 Interface* interface = Interface::NewUnknown(zone()); | 3679 Interface* interface = Interface::NewUnknown(zone()); |
| 3673 result = top_scope_->NewUnresolved( | 3680 result = top_scope_->NewUnresolved( |
| 3674 factory(), name, scanner().location().beg_pos, interface); | 3681 factory(), name, interface, scanner().location().beg_pos); |
| 3675 break; | 3682 break; |
| 3676 } | 3683 } |
| 3677 | 3684 |
| 3678 case Token::NUMBER: { | 3685 case Token::NUMBER: { |
| 3679 Consume(Token::NUMBER); | 3686 Consume(Token::NUMBER); |
| 3680 ASSERT(scanner().is_literal_ascii()); | 3687 ASSERT(scanner().is_literal_ascii()); |
| 3681 double value = StringToDouble(isolate()->unicode_cache(), | 3688 double value = StringToDouble(isolate()->unicode_cache(), |
| 3682 scanner().literal_ascii_string(), | 3689 scanner().literal_ascii_string(), |
| 3683 ALLOW_HEX | ALLOW_OCTALS); | 3690 ALLOW_HEX | ALLOW_OCTALS); |
| 3684 result = factory()->NewNumberLiteral(value); | 3691 result = factory()->NewNumberLiteral(value); |
| (...skipping 825 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4510 // NOTE: We create a proxy and resolve it here so that in the | 4517 // NOTE: We create a proxy and resolve it here so that in the |
| 4511 // future we can change the AST to only refer to VariableProxies | 4518 // future we can change the AST to only refer to VariableProxies |
| 4512 // instead of Variables and Proxis as is the case now. | 4519 // instead of Variables and Proxis as is the case now. |
| 4513 Variable* fvar = NULL; | 4520 Variable* fvar = NULL; |
| 4514 Token::Value fvar_init_op = Token::INIT_CONST; | 4521 Token::Value fvar_init_op = Token::INIT_CONST; |
| 4515 if (type == FunctionLiteral::NAMED_EXPRESSION) { | 4522 if (type == FunctionLiteral::NAMED_EXPRESSION) { |
| 4516 if (is_extended_mode()) fvar_init_op = Token::INIT_CONST_HARMONY; | 4523 if (is_extended_mode()) fvar_init_op = Token::INIT_CONST_HARMONY; |
| 4517 VariableMode fvar_mode = is_extended_mode() ? CONST_HARMONY : CONST; | 4524 VariableMode fvar_mode = is_extended_mode() ? CONST_HARMONY : CONST; |
| 4518 fvar = new(zone()) Variable(top_scope_, | 4525 fvar = new(zone()) Variable(top_scope_, |
| 4519 function_name, fvar_mode, true /* is valid LHS */, | 4526 function_name, fvar_mode, true /* is valid LHS */, |
| 4520 Variable::NORMAL, kCreatedInitialized); | 4527 Variable::NORMAL, kCreatedInitialized, Interface::NewConst()); |
| 4521 VariableProxy* proxy = factory()->NewVariableProxy(fvar); | 4528 VariableProxy* proxy = factory()->NewVariableProxy(fvar); |
| 4522 VariableDeclaration* fvar_declaration = | 4529 VariableDeclaration* fvar_declaration = |
| 4523 factory()->NewVariableDeclaration(proxy, fvar_mode, top_scope_); | 4530 factory()->NewVariableDeclaration(proxy, fvar_mode, top_scope_); |
| 4524 top_scope_->DeclareFunctionVar(fvar_declaration); | 4531 top_scope_->DeclareFunctionVar(fvar_declaration); |
| 4525 } | 4532 } |
| 4526 | 4533 |
| 4527 // Determine whether the function will be lazily compiled. | 4534 // Determine whether the function will be lazily compiled. |
| 4528 // The heuristics are: | 4535 // The heuristics are: |
| 4529 // - It must not have been prohibited by the caller to Parse (some callers | 4536 // - It must not have been prohibited by the caller to Parse (some callers |
| 4530 // need a full AST). | 4537 // need a full AST). |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4600 expected_property_count = logger.properties(); | 4607 expected_property_count = logger.properties(); |
| 4601 top_scope_->SetLanguageMode(logger.language_mode()); | 4608 top_scope_->SetLanguageMode(logger.language_mode()); |
| 4602 only_simple_this_property_assignments = false; | 4609 only_simple_this_property_assignments = false; |
| 4603 this_property_assignments = isolate()->factory()->empty_fixed_array(); | 4610 this_property_assignments = isolate()->factory()->empty_fixed_array(); |
| 4604 } | 4611 } |
| 4605 } | 4612 } |
| 4606 | 4613 |
| 4607 if (!is_lazily_compiled) { | 4614 if (!is_lazily_compiled) { |
| 4608 body = new(zone()) ZoneList<Statement*>(8, zone()); | 4615 body = new(zone()) ZoneList<Statement*>(8, zone()); |
| 4609 if (fvar != NULL) { | 4616 if (fvar != NULL) { |
| 4610 VariableProxy* fproxy = | 4617 VariableProxy* fproxy = top_scope_->NewUnresolved( |
| 4611 top_scope_->NewUnresolved(factory(), function_name); | 4618 factory(), function_name, Interface::NewConst()); |
| 4612 fproxy->BindTo(fvar); | 4619 fproxy->BindTo(fvar); |
| 4613 body->Add(factory()->NewExpressionStatement( | 4620 body->Add(factory()->NewExpressionStatement( |
| 4614 factory()->NewAssignment(fvar_init_op, | 4621 factory()->NewAssignment(fvar_init_op, |
| 4615 fproxy, | 4622 fproxy, |
| 4616 factory()->NewThisFunction(), | 4623 factory()->NewThisFunction(), |
| 4617 RelocInfo::kNoPosition)), | 4624 RelocInfo::kNoPosition)), |
| 4618 zone()); | 4625 zone()); |
| 4619 } | 4626 } |
| 4620 ParseSourceElements(body, Token::RBRACE, false, CHECK_OK); | 4627 ParseSourceElements(body, Token::RBRACE, false, CHECK_OK); |
| 4621 | 4628 |
| (...skipping 1449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6071 ASSERT(info->isolate()->has_pending_exception()); | 6078 ASSERT(info->isolate()->has_pending_exception()); |
| 6072 } else { | 6079 } else { |
| 6073 result = parser.ParseProgram(); | 6080 result = parser.ParseProgram(); |
| 6074 } | 6081 } |
| 6075 } | 6082 } |
| 6076 info->SetFunction(result); | 6083 info->SetFunction(result); |
| 6077 return (result != NULL); | 6084 return (result != NULL); |
| 6078 } | 6085 } |
| 6079 | 6086 |
| 6080 } } // namespace v8::internal | 6087 } } // namespace v8::internal |
| OLD | NEW |