| Index: src/builtins/builtins-string.cc
|
| diff --git a/src/builtins/builtins-string.cc b/src/builtins/builtins-string.cc
|
| index 72de75357ff1b15c9acc545a13f8ebdeb263b703..83738415fc4bb88f7b0058cb7a4a1305678cc941 100644
|
| --- a/src/builtins/builtins-string.cc
|
| +++ b/src/builtins/builtins-string.cc
|
| @@ -294,7 +294,6 @@ BUILTIN(StringFromCodePoint) {
|
| void Builtins::Generate_StringPrototypeCharAt(CodeStubAssembler* assembler) {
|
| typedef CodeStubAssembler::Label Label;
|
| typedef compiler::Node Node;
|
| - typedef CodeStubAssembler::Variable Variable;
|
|
|
| Node* receiver = assembler->Parameter(0);
|
| Node* position = assembler->Parameter(1);
|
| @@ -306,72 +305,24 @@ void Builtins::Generate_StringPrototypeCharAt(CodeStubAssembler* assembler) {
|
|
|
| // Convert the {position} to a Smi and check that it's in bounds of the
|
| // {receiver}.
|
| - // TODO(bmeurer): Find an abstraction for this!
|
| {
|
| - // Check if the {position} is already a Smi.
|
| - Variable var_position(assembler, MachineRepresentation::kTagged);
|
| - var_position.Bind(position);
|
| - Label if_positionissmi(assembler),
|
| - if_positionisnotsmi(assembler, Label::kDeferred);
|
| - assembler->Branch(assembler->WordIsSmi(position), &if_positionissmi,
|
| - &if_positionisnotsmi);
|
| - assembler->Bind(&if_positionisnotsmi);
|
| - {
|
| - // Convert the {position} to an Integer via the ToIntegerStub.
|
| - Node* index = assembler->ToInteger(context, position);
|
| -
|
| - // Check if the resulting {index} is now a Smi.
|
| - Label if_indexissmi(assembler, Label::kDeferred),
|
| - if_indexisnotsmi(assembler, Label::kDeferred);
|
| - assembler->Branch(assembler->WordIsSmi(index), &if_indexissmi,
|
| - &if_indexisnotsmi);
|
| -
|
| - assembler->Bind(&if_indexissmi);
|
| - {
|
| - var_position.Bind(index);
|
| - assembler->Goto(&if_positionissmi);
|
| - }
|
| -
|
| - assembler->Bind(&if_indexisnotsmi);
|
| - {
|
| - // The ToIntegerStub canonicalizes everything in Smi range to Smi
|
| - // representation, so any HeapNumber returned is not in Smi range.
|
| - // The only exception here is -0.0, which we treat as 0.
|
| - Node* index_value = assembler->LoadHeapNumberValue(index);
|
| - Label if_indexiszero(assembler, Label::kDeferred),
|
| - if_indexisnotzero(assembler, Label::kDeferred);
|
| - assembler->Branch(assembler->Float64Equal(
|
| - index_value, assembler->Float64Constant(0.0)),
|
| - &if_indexiszero, &if_indexisnotzero);
|
| -
|
| - assembler->Bind(&if_indexiszero);
|
| - {
|
| - var_position.Bind(assembler->SmiConstant(Smi::FromInt(0)));
|
| - assembler->Goto(&if_positionissmi);
|
| - }
|
| -
|
| - assembler->Bind(&if_indexisnotzero);
|
| - {
|
| - // The {index} is some other integral Number, that is definitely
|
| - // neither -0.0 nor in Smi range.
|
| - assembler->Return(assembler->EmptyStringConstant());
|
| - }
|
| - }
|
| - }
|
| - assembler->Bind(&if_positionissmi);
|
| - position = var_position.value();
|
| + Label return_emptystring(assembler, Label::kDeferred);
|
| + position = assembler->ToInteger(context, position,
|
| + CodeStubAssembler::kTruncateMinusZero);
|
| + assembler->GotoUnless(assembler->WordIsSmi(position), &return_emptystring);
|
|
|
| // Determine the actual length of the {receiver} String.
|
| Node* receiver_length =
|
| assembler->LoadObjectField(receiver, String::kLengthOffset);
|
|
|
| // Return "" if the Smi {position} is outside the bounds of the {receiver}.
|
| - Label if_positioninbounds(assembler),
|
| - if_positionnotinbounds(assembler, Label::kDeferred);
|
| + Label if_positioninbounds(assembler);
|
| assembler->Branch(assembler->SmiAboveOrEqual(position, receiver_length),
|
| - &if_positionnotinbounds, &if_positioninbounds);
|
| - assembler->Bind(&if_positionnotinbounds);
|
| + &return_emptystring, &if_positioninbounds);
|
| +
|
| + assembler->Bind(&return_emptystring);
|
| assembler->Return(assembler->EmptyStringConstant());
|
| +
|
| assembler->Bind(&if_positioninbounds);
|
| }
|
|
|
| @@ -388,7 +339,6 @@ void Builtins::Generate_StringPrototypeCharCodeAt(
|
| CodeStubAssembler* assembler) {
|
| typedef CodeStubAssembler::Label Label;
|
| typedef compiler::Node Node;
|
| - typedef CodeStubAssembler::Variable Variable;
|
|
|
| Node* receiver = assembler->Parameter(0);
|
| Node* position = assembler->Parameter(1);
|
| @@ -400,72 +350,24 @@ void Builtins::Generate_StringPrototypeCharCodeAt(
|
|
|
| // Convert the {position} to a Smi and check that it's in bounds of the
|
| // {receiver}.
|
| - // TODO(bmeurer): Find an abstraction for this!
|
| {
|
| - // Check if the {position} is already a Smi.
|
| - Variable var_position(assembler, MachineRepresentation::kTagged);
|
| - var_position.Bind(position);
|
| - Label if_positionissmi(assembler),
|
| - if_positionisnotsmi(assembler, Label::kDeferred);
|
| - assembler->Branch(assembler->WordIsSmi(position), &if_positionissmi,
|
| - &if_positionisnotsmi);
|
| - assembler->Bind(&if_positionisnotsmi);
|
| - {
|
| - // Convert the {position} to an Integer via the ToIntegerStub.
|
| - Node* index = assembler->ToInteger(context, position);
|
| -
|
| - // Check if the resulting {index} is now a Smi.
|
| - Label if_indexissmi(assembler, Label::kDeferred),
|
| - if_indexisnotsmi(assembler, Label::kDeferred);
|
| - assembler->Branch(assembler->WordIsSmi(index), &if_indexissmi,
|
| - &if_indexisnotsmi);
|
| -
|
| - assembler->Bind(&if_indexissmi);
|
| - {
|
| - var_position.Bind(index);
|
| - assembler->Goto(&if_positionissmi);
|
| - }
|
| -
|
| - assembler->Bind(&if_indexisnotsmi);
|
| - {
|
| - // The ToIntegerStub canonicalizes everything in Smi range to Smi
|
| - // representation, so any HeapNumber returned is not in Smi range.
|
| - // The only exception here is -0.0, which we treat as 0.
|
| - Node* index_value = assembler->LoadHeapNumberValue(index);
|
| - Label if_indexiszero(assembler, Label::kDeferred),
|
| - if_indexisnotzero(assembler, Label::kDeferred);
|
| - assembler->Branch(assembler->Float64Equal(
|
| - index_value, assembler->Float64Constant(0.0)),
|
| - &if_indexiszero, &if_indexisnotzero);
|
| -
|
| - assembler->Bind(&if_indexiszero);
|
| - {
|
| - var_position.Bind(assembler->SmiConstant(Smi::FromInt(0)));
|
| - assembler->Goto(&if_positionissmi);
|
| - }
|
| -
|
| - assembler->Bind(&if_indexisnotzero);
|
| - {
|
| - // The {index} is some other integral Number, that is definitely
|
| - // neither -0.0 nor in Smi range.
|
| - assembler->Return(assembler->NaNConstant());
|
| - }
|
| - }
|
| - }
|
| - assembler->Bind(&if_positionissmi);
|
| - position = var_position.value();
|
| + Label return_nan(assembler, Label::kDeferred);
|
| + position = assembler->ToInteger(context, position,
|
| + CodeStubAssembler::kTruncateMinusZero);
|
| + assembler->GotoUnless(assembler->WordIsSmi(position), &return_nan);
|
|
|
| // Determine the actual length of the {receiver} String.
|
| Node* receiver_length =
|
| assembler->LoadObjectField(receiver, String::kLengthOffset);
|
|
|
| // Return NaN if the Smi {position} is outside the bounds of the {receiver}.
|
| - Label if_positioninbounds(assembler),
|
| - if_positionnotinbounds(assembler, Label::kDeferred);
|
| + Label if_positioninbounds(assembler);
|
| assembler->Branch(assembler->SmiAboveOrEqual(position, receiver_length),
|
| - &if_positionnotinbounds, &if_positioninbounds);
|
| - assembler->Bind(&if_positionnotinbounds);
|
| + &return_nan, &if_positioninbounds);
|
| +
|
| + assembler->Bind(&return_nan);
|
| assembler->Return(assembler->NaNConstant());
|
| +
|
| assembler->Bind(&if_positioninbounds);
|
| }
|
|
|
|
|