Index: src/x64/full-codegen-x64.cc |
diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc |
index d5fa5e5a7ca250543ce1645959151350f0b102cf..c32e8a0bbd150d4f68170d5e48fdcb47feed563f 100644 |
--- a/src/x64/full-codegen-x64.cc |
+++ b/src/x64/full-codegen-x64.cc |
@@ -3407,30 +3407,6 @@ void FullCodeGenerator::EmitDateField(CallRuntime* expr) { |
} |
-void FullCodeGenerator::EmitSeqStringSetCharCheck(Register string, |
- Register index, |
- Register value, |
- uint32_t encoding_mask) { |
- __ Check(masm()->CheckSmi(index), kNonSmiIndex); |
- __ Check(masm()->CheckSmi(value), kNonSmiValue); |
- |
- __ SmiCompare(index, FieldOperand(string, String::kLengthOffset)); |
- __ Check(less, kIndexIsTooLarge); |
- |
- __ SmiCompare(index, Smi::FromInt(0)); |
- __ Check(greater_equal, kIndexIsNegative); |
- |
- __ push(value); |
- __ movq(value, FieldOperand(string, HeapObject::kMapOffset)); |
- __ movzxbq(value, FieldOperand(value, Map::kInstanceTypeOffset)); |
- |
- __ andb(value, Immediate(kStringRepresentationMask | kStringEncodingMask)); |
- __ cmpq(value, Immediate(encoding_mask)); |
- __ Check(equal, kUnexpectedStringType); |
- __ pop(value); |
-} |
- |
- |
void FullCodeGenerator::EmitOneByteSeqStringSetChar(CallRuntime* expr) { |
ZoneList<Expression*>* args = expr->arguments(); |
ASSERT_EQ(3, args->length()); |
@@ -3446,12 +3422,18 @@ void FullCodeGenerator::EmitOneByteSeqStringSetChar(CallRuntime* expr) { |
VisitForAccumulatorValue(args->at(0)); // string |
if (FLAG_debug_code) { |
- static const uint32_t one_byte_seq_type = kSeqStringTag | kOneByteStringTag; |
- EmitSeqStringSetCharCheck(string, index, value, one_byte_seq_type); |
+ __ ThrowIf(NegateCondition(__ CheckSmi(value)), kNonSmiValue); |
+ __ ThrowIf(NegateCondition(__ CheckSmi(index)), kNonSmiValue); |
} |
__ SmiToInteger32(value, value); |
__ SmiToInteger32(index, index); |
+ |
+ if (FLAG_debug_code) { |
+ static const uint32_t one_byte_seq_type = kSeqStringTag | kOneByteStringTag; |
+ __ EmitSeqStringSetCharCheck(string, index, value, one_byte_seq_type); |
+ } |
+ |
__ movb(FieldOperand(string, index, times_1, SeqOneByteString::kHeaderSize), |
value); |
context()->Plug(string); |
@@ -3473,12 +3455,18 @@ void FullCodeGenerator::EmitTwoByteSeqStringSetChar(CallRuntime* expr) { |
VisitForAccumulatorValue(args->at(0)); // string |
if (FLAG_debug_code) { |
- static const uint32_t two_byte_seq_type = kSeqStringTag | kTwoByteStringTag; |
- EmitSeqStringSetCharCheck(string, index, value, two_byte_seq_type); |
+ __ ThrowIf(NegateCondition(__ CheckSmi(value)), kNonSmiValue); |
+ __ ThrowIf(NegateCondition(__ CheckSmi(index)), kNonSmiValue); |
} |
__ SmiToInteger32(value, value); |
__ SmiToInteger32(index, index); |
+ |
+ if (FLAG_debug_code) { |
+ static const uint32_t two_byte_seq_type = kSeqStringTag | kTwoByteStringTag; |
+ __ EmitSeqStringSetCharCheck(string, index, value, two_byte_seq_type); |
+ } |
+ |
__ movw(FieldOperand(string, index, times_2, SeqTwoByteString::kHeaderSize), |
value); |
context()->Plug(rax); |