Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 00207c142f44d528805a7172698ae09cf21388a2..7869d71687cf5d4f2554fcc3323ee554a6a193f2 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -779,6 +779,20 @@ void HGraphBuilder::AddSimulate(BailoutId id, |
} |
+HBoundsCheck* HGraphBuilder::AddBoundsCheck(HValue* index, |
+ HValue* length, |
+ BoundsCheckKeyMode key_mode, |
+ Representation r) { |
+ HCheckSmiOrInt32* checked_index = |
+ new(graph()->zone()) HCheckSmiOrInt32(index); |
+ AddInstruction(checked_index); |
+ HBoundsCheck* result = new(graph()->zone()) HBoundsCheck( |
+ checked_index, length, key_mode, r); |
+ AddInstruction(result); |
+ return result; |
+} |
+ |
+ |
HBasicBlock* HGraphBuilder::CreateBasicBlock(HEnvironment* env) { |
HBasicBlock* b = graph()->CreateBasicBlock(); |
b->SetInitialEnvironment(env); |
@@ -918,8 +932,8 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
HInstruction* checked_key = NULL; |
if (IsExternalArrayElementsKind(elements_kind)) { |
length = AddInstruction(new(zone) HFixedArrayBaseLength(elements)); |
- checked_key = AddInstruction(new(zone) HBoundsCheck( |
- key, length, ALLOW_SMI_KEY, checked_index_representation)); |
+ checked_key = AddBoundsCheck( |
+ key, length, ALLOW_SMI_KEY, checked_index_representation); |
HLoadExternalArrayPointer* external_elements = |
new(zone) HLoadExternalArrayPointer(elements); |
AddInstruction(external_elements); |
@@ -936,8 +950,8 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
} else { |
length = AddInstruction(new(zone) HFixedArrayBaseLength(elements)); |
} |
- checked_key = AddInstruction(new(zone) HBoundsCheck( |
- key, length, ALLOW_SMI_KEY, checked_index_representation)); |
+ checked_key = AddBoundsCheck( |
+ key, length, ALLOW_SMI_KEY, checked_index_representation); |
return BuildFastElementAccess(elements, checked_key, val, mapcheck, |
elements_kind, is_store); |
} |
@@ -6833,7 +6847,7 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess( |
&& todo_external_array) { |
HInstruction* length = |
AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); |
- checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length)); |
+ checked_key = AddBoundsCheck(key, length); |
external_elements = new(zone()) HLoadExternalArrayPointer(elements); |
AddInstruction(external_elements); |
} |
@@ -6875,8 +6889,7 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess( |
HInstruction* length; |
length = AddInstruction(new(zone()) HJSArrayLength(object, typecheck, |
HType::Smi())); |
- checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length, |
- ALLOW_SMI_KEY)); |
+ checked_key = AddBoundsCheck(key, length, ALLOW_SMI_KEY); |
access = AddInstruction(BuildFastElementAccess( |
elements, checked_key, val, elements_kind_branch, |
elements_kind, is_store)); |
@@ -6892,8 +6905,7 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess( |
set_current_block(if_fastobject); |
length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); |
- checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length, |
- ALLOW_SMI_KEY)); |
+ checked_key = AddBoundsCheck(key, length, ALLOW_SMI_KEY); |
access = AddInstruction(BuildFastElementAccess( |
elements, checked_key, val, elements_kind_branch, |
elements_kind, is_store)); |
@@ -7042,8 +7054,7 @@ bool HOptimizedGraphBuilder::TryArgumentsAccess(Property* expr) { |
new(zone()) HArgumentsElements(false)); |
HInstruction* length = AddInstruction( |
new(zone()) HArgumentsLength(elements)); |
- HInstruction* checked_key = |
- AddInstruction(new(zone()) HBoundsCheck(key, length)); |
+ HInstruction* checked_key = AddBoundsCheck(key, length); |
result = new(zone()) HAccessArgumentsAt(elements, length, checked_key); |
} else { |
EnsureArgumentsArePushedForAccess(); |
@@ -7055,8 +7066,7 @@ bool HOptimizedGraphBuilder::TryArgumentsAccess(Property* expr) { |
HInstruction* length = AddInstruction(new(zone()) HConstant( |
Handle<Object>(Smi::FromInt(argument_count)), |
Representation::Integer32())); |
- HInstruction* checked_key = |
- AddInstruction(new(zone()) HBoundsCheck(key, length)); |
+ HInstruction* checked_key = AddBoundsCheck(key, length); |
result = new(zone()) HAccessArgumentsAt(elements, length, checked_key); |
} |
} |
@@ -8770,8 +8780,7 @@ HStringCharCodeAt* HOptimizedGraphBuilder::BuildStringCharCodeAt( |
AddInstruction(HCheckInstanceType::NewIsString(string, zone())); |
HStringLength* length = new(zone()) HStringLength(string); |
AddInstruction(length); |
- HInstruction* checked_index = |
- AddInstruction(new(zone()) HBoundsCheck(index, length)); |
+ HInstruction* checked_index = AddBoundsCheck(index, length); |
return new(zone()) HStringCharCodeAt(context, string, checked_index); |
} |
@@ -9599,8 +9608,7 @@ void HOptimizedGraphBuilder::GenerateArguments(CallRuntime* call) { |
HInstruction* elements = AddInstruction( |
new(zone()) HArgumentsElements(false)); |
HInstruction* length = AddInstruction(new(zone()) HArgumentsLength(elements)); |
- HInstruction* checked_index = |
- AddInstruction(new(zone()) HBoundsCheck(index, length)); |
+ HInstruction* checked_index = AddBoundsCheck(index, length); |
HAccessArgumentsAt* result = |
new(zone()) HAccessArgumentsAt(elements, length, checked_index); |
return ast_context()->ReturnInstruction(result, call->id()); |