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 4816 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4827 | 4827 |
4828 ast_context()->ReturnValue(expr->is_postfix() ? before : after); | 4828 ast_context()->ReturnValue(expr->is_postfix() ? before : after); |
4829 } | 4829 } |
4830 | 4830 |
4831 } else { | 4831 } else { |
4832 return Bailout("invalid lhs in count operation"); | 4832 return Bailout("invalid lhs in count operation"); |
4833 } | 4833 } |
4834 } | 4834 } |
4835 | 4835 |
4836 | 4836 |
| 4837 HCompareSymbolEq* HGraphBuilder::BuildSymbolCompare(HValue* left, |
| 4838 HValue* right, |
| 4839 Token::Value op) { |
| 4840 ASSERT(op == Token::EQ || op == Token::EQ_STRICT); |
| 4841 AddInstruction(new(zone()) HCheckNonSmi(left)); |
| 4842 AddInstruction(HCheckInstanceType::NewIsSymbol(left)); |
| 4843 AddInstruction(new(zone()) HCheckNonSmi(right)); |
| 4844 AddInstruction(HCheckInstanceType::NewIsSymbol(right)); |
| 4845 return new(zone()) HCompareSymbolEq(left, right, op); |
| 4846 } |
| 4847 |
| 4848 |
4837 HStringCharCodeAt* HGraphBuilder::BuildStringCharCodeAt(HValue* string, | 4849 HStringCharCodeAt* HGraphBuilder::BuildStringCharCodeAt(HValue* string, |
4838 HValue* index) { | 4850 HValue* index) { |
4839 AddInstruction(new(zone()) HCheckNonSmi(string)); | 4851 AddInstruction(new(zone()) HCheckNonSmi(string)); |
4840 AddInstruction(HCheckInstanceType::NewIsString(string)); | 4852 AddInstruction(HCheckInstanceType::NewIsString(string)); |
4841 HStringLength* length = new(zone()) HStringLength(string); | 4853 HStringLength* length = new(zone()) HStringLength(string); |
4842 AddInstruction(length); | 4854 AddInstruction(length); |
4843 AddInstruction(new(zone()) HBoundsCheck(index, length)); | 4855 AddInstruction(new(zone()) HBoundsCheck(index, length)); |
4844 return new(zone()) HStringCharCodeAt(string, index); | 4856 return new(zone()) HStringCharCodeAt(string, index); |
4845 } | 4857 } |
4846 | 4858 |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5146 AddInstruction(HCheckInstanceType::NewIsJSObjectOrJSFunction(left)); | 5158 AddInstruction(HCheckInstanceType::NewIsJSObjectOrJSFunction(left)); |
5147 AddInstruction(new(zone()) HCheckNonSmi(right)); | 5159 AddInstruction(new(zone()) HCheckNonSmi(right)); |
5148 AddInstruction(HCheckInstanceType::NewIsJSObjectOrJSFunction(right)); | 5160 AddInstruction(HCheckInstanceType::NewIsJSObjectOrJSFunction(right)); |
5149 instr = new(zone()) HCompareJSObjectEq(left, right); | 5161 instr = new(zone()) HCompareJSObjectEq(left, right); |
5150 break; | 5162 break; |
5151 } | 5163 } |
5152 default: | 5164 default: |
5153 return Bailout("Unsupported non-primitive compare"); | 5165 return Bailout("Unsupported non-primitive compare"); |
5154 break; | 5166 break; |
5155 } | 5167 } |
| 5168 } else if (type_info.IsString() && oracle()->IsSymbolCompare(expr) && |
| 5169 (op == Token::EQ || op == Token::EQ_STRICT)) { |
| 5170 instr = BuildSymbolCompare(left, right, op); |
5156 } else { | 5171 } else { |
5157 HCompare* compare = new(zone()) HCompare(left, right, op); | 5172 HCompare* compare = new(zone()) HCompare(left, right, op); |
5158 Representation r = ToRepresentation(type_info); | 5173 Representation r = ToRepresentation(type_info); |
5159 compare->SetInputRepresentation(r); | 5174 compare->SetInputRepresentation(r); |
5160 instr = compare; | 5175 instr = compare; |
5161 } | 5176 } |
5162 instr->set_position(expr->position()); | 5177 instr->set_position(expr->position()); |
5163 ast_context()->ReturnInstruction(instr, expr->id()); | 5178 ast_context()->ReturnInstruction(instr, expr->id()); |
5164 } | 5179 } |
5165 | 5180 |
(...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6101 } | 6116 } |
6102 } | 6117 } |
6103 | 6118 |
6104 #ifdef DEBUG | 6119 #ifdef DEBUG |
6105 if (graph_ != NULL) graph_->Verify(); | 6120 if (graph_ != NULL) graph_->Verify(); |
6106 if (allocator_ != NULL) allocator_->Verify(); | 6121 if (allocator_ != NULL) allocator_->Verify(); |
6107 #endif | 6122 #endif |
6108 } | 6123 } |
6109 | 6124 |
6110 } } // namespace v8::internal | 6125 } } // namespace v8::internal |
OLD | NEW |