| 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 3474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3485 } | 3485 } |
| 3486 | 3486 |
| 3487 | 3487 |
| 3488 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { | 3488 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { |
| 3489 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); | 3489 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); |
| 3490 } | 3490 } |
| 3491 | 3491 |
| 3492 | 3492 |
| 3493 Expression* Parser::ParseObjectLiteral(bool* ok) { | 3493 Expression* Parser::ParseObjectLiteral(bool* ok) { |
| 3494 // ObjectLiteral :: | 3494 // ObjectLiteral :: |
| 3495 // '{' ( | 3495 // '{' (( |
| 3496 // ((IdentifierName | String | Number) ':' AssignmentExpression) | 3496 // ((IdentifierName | String | Number) ':' AssignmentExpression) | |
| 3497 // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) | 3497 // (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) |
| 3498 // )*[','] '}' | 3498 // ) ',')* '}' |
| 3499 // (Except that trailing comma is not required and not allowed.) |
| 3499 | 3500 |
| 3500 int pos = peek_position(); | 3501 int pos = peek_position(); |
| 3501 ZoneList<ObjectLiteral::Property*>* properties = | 3502 ZoneList<ObjectLiteral::Property*>* properties = |
| 3502 new(zone()) ZoneList<ObjectLiteral::Property*>(4, zone()); | 3503 new(zone()) ZoneList<ObjectLiteral::Property*>(4, zone()); |
| 3503 int number_of_boilerplate_properties = 0; | 3504 int number_of_boilerplate_properties = 0; |
| 3504 bool has_function = false; | 3505 bool has_function = false; |
| 3505 | 3506 |
| 3506 ObjectLiteralChecker checker(this, scope_->language_mode()); | 3507 ObjectLiteralChecker checker(this, scope_->language_mode()); |
| 3507 | 3508 |
| 3508 Expect(Token::LBRACE, CHECK_OK); | 3509 Expect(Token::LBRACE, CHECK_OK); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3522 bool is_setter = false; | 3523 bool is_setter = false; |
| 3523 Handle<String> id = | 3524 Handle<String> id = |
| 3524 ParseIdentifierNameOrGetOrSet(&is_getter, &is_setter, CHECK_OK); | 3525 ParseIdentifierNameOrGetOrSet(&is_getter, &is_setter, CHECK_OK); |
| 3525 if (fni_ != NULL) fni_->PushLiteralName(id); | 3526 if (fni_ != NULL) fni_->PushLiteralName(id); |
| 3526 | 3527 |
| 3527 if ((is_getter || is_setter) && peek() != Token::COLON) { | 3528 if ((is_getter || is_setter) && peek() != Token::COLON) { |
| 3528 // Special handling of getter and setter syntax: | 3529 // Special handling of getter and setter syntax: |
| 3529 // { ... , get foo() { ... }, ... , set foo(v) { ... v ... } , ... } | 3530 // { ... , get foo() { ... }, ... , set foo(v) { ... v ... } , ... } |
| 3530 // We have already read the "get" or "set" keyword. | 3531 // We have already read the "get" or "set" keyword. |
| 3531 Token::Value next = Next(); | 3532 Token::Value next = Next(); |
| 3532 bool is_keyword = Token::IsKeyword(next); | |
| 3533 if (next != i::Token::IDENTIFIER && | 3533 if (next != i::Token::IDENTIFIER && |
| 3534 next != i::Token::FUTURE_RESERVED_WORD && | 3534 next != i::Token::FUTURE_RESERVED_WORD && |
| 3535 next != i::Token::FUTURE_STRICT_RESERVED_WORD && | 3535 next != i::Token::FUTURE_STRICT_RESERVED_WORD && |
| 3536 next != i::Token::NUMBER && | 3536 next != i::Token::NUMBER && |
| 3537 next != i::Token::STRING && | 3537 next != i::Token::STRING && |
| 3538 !is_keyword) { | 3538 !Token::IsKeyword(next)) { |
| 3539 // Unexpected token. | |
| 3540 ReportUnexpectedToken(next); | 3539 ReportUnexpectedToken(next); |
| 3541 *ok = false; | 3540 *ok = false; |
| 3542 return NULL; | 3541 return NULL; |
| 3543 } | 3542 } |
| 3544 // Validate the property. | 3543 // Validate the property. |
| 3545 PropertyKind type = is_getter ? kGetterProperty : kSetterProperty; | 3544 PropertyKind type = is_getter ? kGetterProperty : kSetterProperty; |
| 3546 checker.CheckProperty(next, type, CHECK_OK); | 3545 checker.CheckProperty(next, type, CHECK_OK); |
| 3547 Handle<String> name = is_keyword | 3546 Handle<String> name = GetSymbol(); |
| 3548 ? isolate_->factory()->InternalizeUtf8String(Token::String(next)) | |
| 3549 : GetSymbol(); | |
| 3550 FunctionLiteral* value = | 3547 FunctionLiteral* value = |
| 3551 ParseFunctionLiteral(name, | 3548 ParseFunctionLiteral(name, |
| 3552 scanner()->location(), | 3549 scanner()->location(), |
| 3553 false, // reserved words are allowed here | 3550 false, // reserved words are allowed here |
| 3554 false, // not a generator | 3551 false, // not a generator |
| 3555 RelocInfo::kNoPosition, | 3552 RelocInfo::kNoPosition, |
| 3556 FunctionLiteral::ANONYMOUS_EXPRESSION, | 3553 FunctionLiteral::ANONYMOUS_EXPRESSION, |
| 3557 CHECK_OK); | 3554 CHECK_OK); |
| 3558 // Allow any number of parameters for compatibilty with JSC. | 3555 // Allow any number of parameters for compatibilty with JSC. |
| 3559 // Specification only allows zero parameters for get and one for set. | 3556 // Specification only allows zero parameters for get and one for set. |
| 3560 ObjectLiteral::Property* property = | 3557 ObjectLiteral::Property* property = |
| 3561 factory()->NewObjectLiteralProperty(is_getter, value, next_pos); | 3558 factory()->NewObjectLiteralProperty(is_getter, value, next_pos); |
| 3562 if (ObjectLiteral::IsBoilerplateProperty(property)) { | 3559 if (ObjectLiteral::IsBoilerplateProperty(property)) { |
| 3563 number_of_boilerplate_properties++; | 3560 number_of_boilerplate_properties++; |
| 3564 } | 3561 } |
| 3565 properties->Add(property, zone()); | 3562 properties->Add(property, zone()); |
| 3566 if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK); | 3563 if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK); |
| 3567 | 3564 |
| 3568 if (fni_ != NULL) { | 3565 if (fni_ != NULL) { |
| 3569 fni_->Infer(); | 3566 fni_->Infer(); |
| 3570 fni_->Leave(); | 3567 fni_->Leave(); |
| 3571 } | 3568 } |
| 3572 continue; // restart the while | 3569 continue; // restart the while |
| 3573 } | 3570 } |
| 3574 // Failed to parse as get/set property, so it's just a property | 3571 // Failed to parse as get/set property, so it's just a normal property |
| 3575 // called "get" or "set". | 3572 // (which might be called "get" or "set" or something else). |
| 3576 key = factory()->NewLiteral(id, next_pos); | 3573 key = factory()->NewLiteral(id, next_pos); |
| 3577 break; | 3574 break; |
| 3578 } | 3575 } |
| 3579 case Token::STRING: { | 3576 case Token::STRING: { |
| 3580 Consume(Token::STRING); | 3577 Consume(Token::STRING); |
| 3581 Handle<String> string = GetSymbol(); | 3578 Handle<String> string = GetSymbol(); |
| 3582 if (fni_ != NULL) fni_->PushLiteralName(string); | 3579 if (fni_ != NULL) fni_->PushLiteralName(string); |
| 3583 uint32_t index; | 3580 uint32_t index; |
| 3584 if (!string.is_null() && string->AsArrayIndex(&index)) { | 3581 if (!string.is_null() && string->AsArrayIndex(&index)) { |
| 3585 key = factory()->NewNumberLiteral(index, next_pos); | 3582 key = factory()->NewNumberLiteral(index, next_pos); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3597 ALLOW_IMPLICIT_OCTAL | ALLOW_BINARY); | 3594 ALLOW_IMPLICIT_OCTAL | ALLOW_BINARY); |
| 3598 key = factory()->NewNumberLiteral(value, next_pos); | 3595 key = factory()->NewNumberLiteral(value, next_pos); |
| 3599 break; | 3596 break; |
| 3600 } | 3597 } |
| 3601 default: | 3598 default: |
| 3602 if (Token::IsKeyword(next)) { | 3599 if (Token::IsKeyword(next)) { |
| 3603 Consume(next); | 3600 Consume(next); |
| 3604 Handle<String> string = GetSymbol(); | 3601 Handle<String> string = GetSymbol(); |
| 3605 key = factory()->NewLiteral(string, next_pos); | 3602 key = factory()->NewLiteral(string, next_pos); |
| 3606 } else { | 3603 } else { |
| 3607 // Unexpected token. | |
| 3608 Token::Value next = Next(); | 3604 Token::Value next = Next(); |
| 3609 ReportUnexpectedToken(next); | 3605 ReportUnexpectedToken(next); |
| 3610 *ok = false; | 3606 *ok = false; |
| 3611 return NULL; | 3607 return NULL; |
| 3612 } | 3608 } |
| 3613 } | 3609 } |
| 3614 | 3610 |
| 3615 // Validate the property | 3611 // Validate the property |
| 3616 checker.CheckProperty(next, kValueProperty, CHECK_OK); | 3612 checker.CheckProperty(next, kValueProperty, CHECK_OK); |
| 3617 | 3613 |
| (...skipping 1735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5353 ASSERT(info()->isolate()->has_pending_exception()); | 5349 ASSERT(info()->isolate()->has_pending_exception()); |
| 5354 } else { | 5350 } else { |
| 5355 result = ParseProgram(); | 5351 result = ParseProgram(); |
| 5356 } | 5352 } |
| 5357 } | 5353 } |
| 5358 info()->SetFunction(result); | 5354 info()->SetFunction(result); |
| 5359 return (result != NULL); | 5355 return (result != NULL); |
| 5360 } | 5356 } |
| 5361 | 5357 |
| 5362 } } // namespace v8::internal | 5358 } } // namespace v8::internal |
| OLD | NEW |