Chromium Code Reviews| Index: src/hydrogen.cc |
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
| index 54e7ee82b93e747a1089cf6d4220a41696a38cc0..da112b4558d5e5f8d915060c7c3ab64eee5a100e 100644 |
| --- a/src/hydrogen.cc |
| +++ b/src/hydrogen.cc |
| @@ -7614,6 +7614,53 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall( |
| return true; |
| } |
| break; |
| + case kArrayPop: { |
| + if (!expr->IsMonomorphic() || expr->check_type() != RECEIVER_MAP_CHECK) { |
| + return false; |
| + } |
| + if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false; |
| + ElementsKind elements_kind = receiver_map->elements_kind(); |
| + if (!IsFastElementsKind(elements_kind)) return false; |
| + AddCheckConstantFunction(expr->holder(), receiver, receiver_map); |
| + |
| + Drop(expr->arguments()->length()); |
| + HValue* result; |
| + HValue* checked_object; |
| + HValue* reduced_length; |
| + HValue* receiver = Pop(); |
| + { NoObservableSideEffectsScope scope(this); |
| + checked_object = AddCheckMap(receiver, receiver_map); |
| + HValue* elements = AddLoadElements(checked_object); |
| + // Ensure that we aren't popping from a copy-on-write array. |
| + if (IsFastSmiOrObjectElementsKind(elements_kind)) { |
| + Add<HCheckMaps>( |
| + elements, isolate()->factory()->fixed_array_map(), top_info()); |
| + } |
| + HValue* length = Add<HLoadNamedField>( |
| + checked_object, HObjectAccess::ForArrayLength(elements_kind)); |
| + reduced_length = AddUncasted<HSub>(length, graph()->GetConstant1()); |
| + HValue* bounds_check = Add<HBoundsCheck>( |
| + graph()->GetConstant0(), length); |
| + result = AddElementAccess(elements, reduced_length, NULL, |
| + bounds_check, elements_kind, false); |
|
mvstanton
2014/01/20 12:45:39
Can we make the boolean parameter to AddElementAcc
Toon Verwaest
2014/01/20 13:28:09
Will do so.
On 2014/01/20 12:45:39, mvstanton wro
|
| + Factory* factory = isolate()->factory(); |
| + double nan_double = FixedDoubleArray::hole_nan_as_double(); |
| + HValue* hole = IsFastSmiOrObjectElementsKind(elements_kind) |
| + ? Add<HConstant>(factory->the_hole_value()) |
| + : Add<HConstant>(nan_double); |
| + if (IsFastSmiOrObjectElementsKind(elements_kind)) { |
| + elements_kind = FAST_HOLEY_ELEMENTS; |
|
mvstanton
2014/01/20 12:45:39
This line confuses me a bit. A) Why wouldn't the e
Toon Verwaest
2014/01/20 13:28:09
This is the standard way of storing holes into arr
|
| + } |
| + AddElementAccess( |
| + elements, reduced_length, hole, bounds_check, elements_kind, true); |
| + } |
| + Add<HStoreNamedField>( |
| + checked_object, HObjectAccess::ForArrayLength(elements_kind), |
| + reduced_length); |
| + Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); |
| + ast_context()->ReturnValue(result); |
| + return true; |
| + } |
| default: |
| // Not yet supported for inlining. |
| break; |