| 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 2671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2682 if (expression == NULL || !expression->IsValidLeftHandSide()) { | 2682 if (expression == NULL || !expression->IsValidLeftHandSide()) { |
| 2683 Handle<String> type = | 2683 Handle<String> type = |
| 2684 isolate()->factory()->invalid_lhs_in_assignment_symbol(); | 2684 isolate()->factory()->invalid_lhs_in_assignment_symbol(); |
| 2685 expression = NewThrowReferenceError(type); | 2685 expression = NewThrowReferenceError(type); |
| 2686 } | 2686 } |
| 2687 | 2687 |
| 2688 if (!top_scope_->is_classic_mode()) { | 2688 if (!top_scope_->is_classic_mode()) { |
| 2689 // Assignment to eval or arguments is disallowed in strict mode. | 2689 // Assignment to eval or arguments is disallowed in strict mode. |
| 2690 CheckStrictModeLValue(expression, "strict_lhs_assignment", CHECK_OK); | 2690 CheckStrictModeLValue(expression, "strict_lhs_assignment", CHECK_OK); |
| 2691 } | 2691 } |
| 2692 MarkAsUsedAsLValue(expression); |
| 2692 | 2693 |
| 2693 Token::Value op = Next(); // Get assignment operator. | 2694 Token::Value op = Next(); // Get assignment operator. |
| 2694 int pos = scanner().location().beg_pos; | 2695 int pos = scanner().location().beg_pos; |
| 2695 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); | 2696 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); |
| 2696 | 2697 |
| 2697 // 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 |
| 2698 // constructors. We define a new property whenever there is an | 2699 // constructors. We define a new property whenever there is an |
| 2699 // assignment to a property of 'this'. We should probably only add | 2700 // assignment to a property of 'this'. We should probably only add |
| 2700 // properties if we haven't seen them before. Otherwise we'll | 2701 // properties if we haven't seen them before. Otherwise we'll |
| 2701 // 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... |
| 2915 if (expression == NULL || !expression->IsValidLeftHandSide()) { | 2916 if (expression == NULL || !expression->IsValidLeftHandSide()) { |
| 2916 Handle<String> type = | 2917 Handle<String> type = |
| 2917 isolate()->factory()->invalid_lhs_in_prefix_op_symbol(); | 2918 isolate()->factory()->invalid_lhs_in_prefix_op_symbol(); |
| 2918 expression = NewThrowReferenceError(type); | 2919 expression = NewThrowReferenceError(type); |
| 2919 } | 2920 } |
| 2920 | 2921 |
| 2921 if (!top_scope_->is_classic_mode()) { | 2922 if (!top_scope_->is_classic_mode()) { |
| 2922 // 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. |
| 2923 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); | 2924 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); |
| 2924 } | 2925 } |
| 2926 MarkAsUsedAsLValue(expression); |
| 2925 | 2927 |
| 2926 int position = scanner().location().beg_pos; | 2928 int position = scanner().location().beg_pos; |
| 2927 return new(zone()) CountOperation(isolate(), | 2929 return new(zone()) CountOperation(isolate(), |
| 2928 op, | 2930 op, |
| 2929 true /* prefix */, | 2931 true /* prefix */, |
| 2930 expression, | 2932 expression, |
| 2931 position); | 2933 position); |
| 2932 | 2934 |
| 2933 } else { | 2935 } else { |
| 2934 return ParsePostfixExpression(ok); | 2936 return ParsePostfixExpression(ok); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2950 if (expression == NULL || !expression->IsValidLeftHandSide()) { | 2952 if (expression == NULL || !expression->IsValidLeftHandSide()) { |
| 2951 Handle<String> type = | 2953 Handle<String> type = |
| 2952 isolate()->factory()->invalid_lhs_in_postfix_op_symbol(); | 2954 isolate()->factory()->invalid_lhs_in_postfix_op_symbol(); |
| 2953 expression = NewThrowReferenceError(type); | 2955 expression = NewThrowReferenceError(type); |
| 2954 } | 2956 } |
| 2955 | 2957 |
| 2956 if (!top_scope_->is_classic_mode()) { | 2958 if (!top_scope_->is_classic_mode()) { |
| 2957 // 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. |
| 2958 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); | 2960 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); |
| 2959 } | 2961 } |
| 2962 MarkAsUsedAsLValue(expression); |
| 2960 | 2963 |
| 2961 Token::Value next = Next(); | 2964 Token::Value next = Next(); |
| 2962 int position = scanner().location().beg_pos; | 2965 int position = scanner().location().beg_pos; |
| 2963 expression = | 2966 expression = |
| 2964 new(zone()) CountOperation(isolate(), | 2967 new(zone()) CountOperation(isolate(), |
| 2965 next, | 2968 next, |
| 2966 false /* postfix */, | 2969 false /* postfix */, |
| 2967 expression, | 2970 expression, |
| 2968 position); | 2971 position); |
| 2969 } | 2972 } |
| (...skipping 1338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4308 next != Token::FUTURE_STRICT_RESERVED_WORD && | 4311 next != Token::FUTURE_STRICT_RESERVED_WORD && |
| 4309 !Token::IsKeyword(next)) { | 4312 !Token::IsKeyword(next)) { |
| 4310 ReportUnexpectedToken(next); | 4313 ReportUnexpectedToken(next); |
| 4311 *ok = false; | 4314 *ok = false; |
| 4312 return Handle<String>(); | 4315 return Handle<String>(); |
| 4313 } | 4316 } |
| 4314 return GetSymbol(ok); | 4317 return GetSymbol(ok); |
| 4315 } | 4318 } |
| 4316 | 4319 |
| 4317 | 4320 |
| 4321 void Parser::MarkAsUsedAsLValue(Expression* expression) { |
| 4322 VariableProxy* lhs = expression != NULL |
| 4323 ? expression->AsVariableProxy() |
| 4324 : NULL; |
| 4325 |
| 4326 if (lhs != NULL) lhs->MarkAsUsedAsLValue(); |
| 4327 } |
| 4328 |
| 4329 |
| 4318 // Checks LHS expression for assignment and prefix/postfix increment/decrement | 4330 // Checks LHS expression for assignment and prefix/postfix increment/decrement |
| 4319 // in strict mode. | 4331 // in strict mode. |
| 4320 void Parser::CheckStrictModeLValue(Expression* expression, | 4332 void Parser::CheckStrictModeLValue(Expression* expression, |
| 4321 const char* error, | 4333 const char* error, |
| 4322 bool* ok) { | 4334 bool* ok) { |
| 4323 ASSERT(!top_scope_->is_classic_mode()); | 4335 ASSERT(!top_scope_->is_classic_mode()); |
| 4324 VariableProxy* lhs = expression != NULL | 4336 VariableProxy* lhs = expression != NULL |
| 4325 ? expression->AsVariableProxy() | 4337 ? expression->AsVariableProxy() |
| 4326 : NULL; | 4338 : NULL; |
| 4327 | 4339 |
| (...skipping 1152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5480 ASSERT(info->isolate()->has_pending_exception()); | 5492 ASSERT(info->isolate()->has_pending_exception()); |
| 5481 } else { | 5493 } else { |
| 5482 result = parser.ParseProgram(info); | 5494 result = parser.ParseProgram(info); |
| 5483 } | 5495 } |
| 5484 } | 5496 } |
| 5485 info->SetFunction(result); | 5497 info->SetFunction(result); |
| 5486 return (result != NULL); | 5498 return (result != NULL); |
| 5487 } | 5499 } |
| 5488 | 5500 |
| 5489 } } // namespace v8::internal | 5501 } } // namespace v8::internal |
| OLD | NEW |