| OLD | NEW | 
|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 1245 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1256   // parsed into an empty statement. | 1256   // parsed into an empty statement. | 
| 1257 | 1257 | 
| 1258   // Keep the source position of the statement | 1258   // Keep the source position of the statement | 
| 1259   int statement_pos = scanner().peek_location().beg_pos; | 1259   int statement_pos = scanner().peek_location().beg_pos; | 
| 1260   Statement* stmt = NULL; | 1260   Statement* stmt = NULL; | 
| 1261   switch (peek()) { | 1261   switch (peek()) { | 
| 1262     case Token::LBRACE: | 1262     case Token::LBRACE: | 
| 1263       return ParseBlock(labels, ok); | 1263       return ParseBlock(labels, ok); | 
| 1264 | 1264 | 
| 1265     case Token::CONST:  // fall through | 1265     case Token::CONST:  // fall through | 
|  | 1266     case Token::LET: | 
| 1266     case Token::VAR: | 1267     case Token::VAR: | 
| 1267       stmt = ParseVariableStatement(kStatement, ok); | 1268       stmt = ParseVariableStatement(kStatement, ok); | 
| 1268       break; | 1269       break; | 
| 1269 | 1270 | 
| 1270     case Token::SEMICOLON: | 1271     case Token::SEMICOLON: | 
| 1271       Next(); | 1272       Next(); | 
| 1272       return EmptyStatement(); | 1273       return EmptyStatement(); | 
| 1273 | 1274 | 
| 1274     case Token::IF: | 1275     case Token::IF: | 
| 1275       stmt = ParseIfStatement(labels, ok); | 1276       stmt = ParseIfStatement(labels, ok); | 
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1697   // True if the binding needs initialization. 'let' and 'const' declared | 1698   // True if the binding needs initialization. 'let' and 'const' declared | 
| 1698   // bindings are created uninitialized by their declaration nodes and | 1699   // bindings are created uninitialized by their declaration nodes and | 
| 1699   // need initialization. 'var' declared bindings are always initialized | 1700   // need initialization. 'var' declared bindings are always initialized | 
| 1700   // immediately by their declaration nodes. | 1701   // immediately by their declaration nodes. | 
| 1701   bool needs_init = false; | 1702   bool needs_init = false; | 
| 1702   bool is_const = false; | 1703   bool is_const = false; | 
| 1703   Token::Value init_op = Token::INIT_VAR; | 1704   Token::Value init_op = Token::INIT_VAR; | 
| 1704   if (peek() == Token::VAR) { | 1705   if (peek() == Token::VAR) { | 
| 1705     Consume(Token::VAR); | 1706     Consume(Token::VAR); | 
| 1706   } else if (peek() == Token::CONST) { | 1707   } else if (peek() == Token::CONST) { | 
|  | 1708     // TODO(ES6): The ES6 Draft Rev4 section 12.2.2 reads: | 
|  | 1709     // | 
|  | 1710     // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';' | 
|  | 1711     // | 
|  | 1712     // * It is a Syntax Error if the code that matches this production is not | 
|  | 1713     //   contained in extended code. | 
|  | 1714     // | 
|  | 1715     // However disallowing const in classic mode will break compatibility with | 
|  | 1716     // existing pages. Therefore we keep allowing const with the old | 
|  | 1717     // non-harmony semantics in classic mode. | 
| 1707     Consume(Token::CONST); | 1718     Consume(Token::CONST); | 
| 1708     switch (top_scope_->language_mode()) { | 1719     switch (top_scope_->language_mode()) { | 
| 1709       case CLASSIC_MODE: | 1720       case CLASSIC_MODE: | 
| 1710         mode = CONST; | 1721         mode = CONST; | 
| 1711         init_op = Token::INIT_CONST; | 1722         init_op = Token::INIT_CONST; | 
| 1712         break; | 1723         break; | 
| 1713       case STRICT_MODE: | 1724       case STRICT_MODE: | 
| 1714         ReportMessage("strict_const", Vector<const char*>::empty()); | 1725         ReportMessage("strict_const", Vector<const char*>::empty()); | 
| 1715         *ok = false; | 1726         *ok = false; | 
| 1716         return NULL; | 1727         return NULL; | 
| 1717       case EXTENDED_MODE: | 1728       case EXTENDED_MODE: | 
| 1718         if (var_context != kSourceElement && | 1729         if (var_context != kSourceElement && | 
| 1719             var_context != kForStatement) { | 1730             var_context != kForStatement) { | 
| 1720           // In extended mode 'const' declarations are only allowed in source | 1731           // In extended mode 'const' declarations are only allowed in source | 
| 1721           // element positions. | 1732           // element positions. | 
| 1722           ReportMessage("unprotected_const", Vector<const char*>::empty()); | 1733           ReportMessage("unprotected_const", Vector<const char*>::empty()); | 
| 1723           *ok = false; | 1734           *ok = false; | 
| 1724           return NULL; | 1735           return NULL; | 
| 1725         } | 1736         } | 
| 1726         mode = CONST_HARMONY; | 1737         mode = CONST_HARMONY; | 
| 1727         init_op = Token::INIT_CONST_HARMONY; | 1738         init_op = Token::INIT_CONST_HARMONY; | 
| 1728     } | 1739     } | 
| 1729     is_const = true; | 1740     is_const = true; | 
| 1730     needs_init = true; | 1741     needs_init = true; | 
| 1731   } else if (peek() == Token::LET) { | 1742   } else if (peek() == Token::LET) { | 
| 1732     ASSERT(top_scope_->is_extended_mode()); | 1743     // ES6 Draft Rev4 section 12.2.1: | 
|  | 1744     // | 
|  | 1745     // LetDeclaration : let LetBindingList ; | 
|  | 1746     // | 
|  | 1747     // * It is a Syntax Error if the code that matches this production is not | 
|  | 1748     //   contained in extended code. | 
|  | 1749     if (!is_extended_mode()) { | 
|  | 1750       ReportMessage("illegal_let", Vector<const char*>::empty()); | 
|  | 1751       *ok = false; | 
|  | 1752       return NULL; | 
|  | 1753     } | 
| 1733     Consume(Token::LET); | 1754     Consume(Token::LET); | 
| 1734     if (var_context != kSourceElement && | 1755     if (var_context != kSourceElement && | 
| 1735         var_context != kForStatement) { | 1756         var_context != kForStatement) { | 
| 1736       // Let declarations are only allowed in source element positions. | 1757       // Let declarations are only allowed in source element positions. | 
| 1737       ASSERT(var_context == kStatement); | 1758       ASSERT(var_context == kStatement); | 
| 1738       ReportMessage("unprotected_let", Vector<const char*>::empty()); | 1759       ReportMessage("unprotected_let", Vector<const char*>::empty()); | 
| 1739       *ok = false; | 1760       *ok = false; | 
| 1740       return NULL; | 1761       return NULL; | 
| 1741     } | 1762     } | 
| 1742     mode = LET; | 1763     mode = LET; | 
| (...skipping 918 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2661   if (expression == NULL || !expression->IsValidLeftHandSide()) { | 2682   if (expression == NULL || !expression->IsValidLeftHandSide()) { | 
| 2662     Handle<String> type = | 2683     Handle<String> type = | 
| 2663         isolate()->factory()->invalid_lhs_in_assignment_symbol(); | 2684         isolate()->factory()->invalid_lhs_in_assignment_symbol(); | 
| 2664     expression = NewThrowReferenceError(type); | 2685     expression = NewThrowReferenceError(type); | 
| 2665   } | 2686   } | 
| 2666 | 2687 | 
| 2667   if (!top_scope_->is_classic_mode()) { | 2688   if (!top_scope_->is_classic_mode()) { | 
| 2668     // Assignment to eval or arguments is disallowed in strict mode. | 2689     // Assignment to eval or arguments is disallowed in strict mode. | 
| 2669     CheckStrictModeLValue(expression, "strict_lhs_assignment", CHECK_OK); | 2690     CheckStrictModeLValue(expression, "strict_lhs_assignment", CHECK_OK); | 
| 2670   } | 2691   } | 
|  | 2692   MarkAsLValue(expression); | 
| 2671 | 2693 | 
| 2672   Token::Value op = Next();  // Get assignment operator. | 2694   Token::Value op = Next();  // Get assignment operator. | 
| 2673   int pos = scanner().location().beg_pos; | 2695   int pos = scanner().location().beg_pos; | 
| 2674   Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); | 2696   Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); | 
| 2675 | 2697 | 
| 2676   // TODO(1231235): We try to estimate the set of properties set by | 2698   // TODO(1231235): We try to estimate the set of properties set by | 
| 2677   // constructors. We define a new property whenever there is an | 2699   // constructors. We define a new property whenever there is an | 
| 2678   // assignment to a property of 'this'. We should probably only add | 2700   // assignment to a property of 'this'. We should probably only add | 
| 2679   // properties if we haven't seen them before. Otherwise we'll | 2701   // properties if we haven't seen them before. Otherwise we'll | 
| 2680   // probably overestimate the number of properties. | 2702   // probably overestimate the number of properties. | 
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2894     if (expression == NULL || !expression->IsValidLeftHandSide()) { | 2916     if (expression == NULL || !expression->IsValidLeftHandSide()) { | 
| 2895       Handle<String> type = | 2917       Handle<String> type = | 
| 2896           isolate()->factory()->invalid_lhs_in_prefix_op_symbol(); | 2918           isolate()->factory()->invalid_lhs_in_prefix_op_symbol(); | 
| 2897       expression = NewThrowReferenceError(type); | 2919       expression = NewThrowReferenceError(type); | 
| 2898     } | 2920     } | 
| 2899 | 2921 | 
| 2900     if (!top_scope_->is_classic_mode()) { | 2922     if (!top_scope_->is_classic_mode()) { | 
| 2901       // Prefix expression operand in strict mode may not be eval or arguments. | 2923       // Prefix expression operand in strict mode may not be eval or arguments. | 
| 2902       CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); | 2924       CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); | 
| 2903     } | 2925     } | 
|  | 2926     MarkAsLValue(expression); | 
| 2904 | 2927 | 
| 2905     int position = scanner().location().beg_pos; | 2928     int position = scanner().location().beg_pos; | 
| 2906     return new(zone()) CountOperation(isolate(), | 2929     return new(zone()) CountOperation(isolate(), | 
| 2907                                       op, | 2930                                       op, | 
| 2908                                       true /* prefix */, | 2931                                       true /* prefix */, | 
| 2909                                       expression, | 2932                                       expression, | 
| 2910                                       position); | 2933                                       position); | 
| 2911 | 2934 | 
| 2912   } else { | 2935   } else { | 
| 2913     return ParsePostfixExpression(ok); | 2936     return ParsePostfixExpression(ok); | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 2929     if (expression == NULL || !expression->IsValidLeftHandSide()) { | 2952     if (expression == NULL || !expression->IsValidLeftHandSide()) { | 
| 2930       Handle<String> type = | 2953       Handle<String> type = | 
| 2931           isolate()->factory()->invalid_lhs_in_postfix_op_symbol(); | 2954           isolate()->factory()->invalid_lhs_in_postfix_op_symbol(); | 
| 2932       expression = NewThrowReferenceError(type); | 2955       expression = NewThrowReferenceError(type); | 
| 2933     } | 2956     } | 
| 2934 | 2957 | 
| 2935     if (!top_scope_->is_classic_mode()) { | 2958     if (!top_scope_->is_classic_mode()) { | 
| 2936       // Postfix expression operand in strict mode may not be eval or arguments. | 2959       // Postfix expression operand in strict mode may not be eval or arguments. | 
| 2937       CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); | 2960       CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); | 
| 2938     } | 2961     } | 
|  | 2962     MarkAsLValue(expression); | 
| 2939 | 2963 | 
| 2940     Token::Value next = Next(); | 2964     Token::Value next = Next(); | 
| 2941     int position = scanner().location().beg_pos; | 2965     int position = scanner().location().beg_pos; | 
| 2942     expression = | 2966     expression = | 
| 2943         new(zone()) CountOperation(isolate(), | 2967         new(zone()) CountOperation(isolate(), | 
| 2944                                    next, | 2968                                    next, | 
| 2945                                    false /* postfix */, | 2969                                    false /* postfix */, | 
| 2946                                    expression, | 2970                                    expression, | 
| 2947                                    position); | 2971                                    position); | 
| 2948   } | 2972   } | 
| (...skipping 1338 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4287       next != Token::FUTURE_STRICT_RESERVED_WORD && | 4311       next != Token::FUTURE_STRICT_RESERVED_WORD && | 
| 4288       !Token::IsKeyword(next)) { | 4312       !Token::IsKeyword(next)) { | 
| 4289     ReportUnexpectedToken(next); | 4313     ReportUnexpectedToken(next); | 
| 4290     *ok = false; | 4314     *ok = false; | 
| 4291     return Handle<String>(); | 4315     return Handle<String>(); | 
| 4292   } | 4316   } | 
| 4293   return GetSymbol(ok); | 4317   return GetSymbol(ok); | 
| 4294 } | 4318 } | 
| 4295 | 4319 | 
| 4296 | 4320 | 
|  | 4321 void Parser::MarkAsLValue(Expression* expression) { | 
|  | 4322   VariableProxy* proxy = expression != NULL | 
|  | 4323       ? expression->AsVariableProxy() | 
|  | 4324       : NULL; | 
|  | 4325 | 
|  | 4326   if (proxy != NULL) proxy->MarkAsLValue(); | 
|  | 4327 } | 
|  | 4328 | 
|  | 4329 | 
| 4297 // Checks LHS expression for assignment and prefix/postfix increment/decrement | 4330 // Checks LHS expression for assignment and prefix/postfix increment/decrement | 
| 4298 // in strict mode. | 4331 // in strict mode. | 
| 4299 void Parser::CheckStrictModeLValue(Expression* expression, | 4332 void Parser::CheckStrictModeLValue(Expression* expression, | 
| 4300                                    const char* error, | 4333                                    const char* error, | 
| 4301                                    bool* ok) { | 4334                                    bool* ok) { | 
| 4302   ASSERT(!top_scope_->is_classic_mode()); | 4335   ASSERT(!top_scope_->is_classic_mode()); | 
| 4303   VariableProxy* lhs = expression != NULL | 4336   VariableProxy* lhs = expression != NULL | 
| 4304       ? expression->AsVariableProxy() | 4337       ? expression->AsVariableProxy() | 
| 4305       : NULL; | 4338       : NULL; | 
| 4306 | 4339 | 
| (...skipping 1152 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5459       ASSERT(info->isolate()->has_pending_exception()); | 5492       ASSERT(info->isolate()->has_pending_exception()); | 
| 5460     } else { | 5493     } else { | 
| 5461       result = parser.ParseProgram(info); | 5494       result = parser.ParseProgram(info); | 
| 5462     } | 5495     } | 
| 5463   } | 5496   } | 
| 5464   info->SetFunction(result); | 5497   info->SetFunction(result); | 
| 5465   return (result != NULL); | 5498   return (result != NULL); | 
| 5466 } | 5499 } | 
| 5467 | 5500 | 
| 5468 } }  // namespace v8::internal | 5501 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|