| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 9a45f246658cc795cdfe00bac49afc1c1d79bc44..aab64d64d4559762b17ea2334ff071a921e09875 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -1188,7 +1188,7 @@ void HGraphBuilder::BuildTransitionElementsKind(HValue* object,
|
| }
|
|
|
| if (!IsSimpleMapChangeTransition(from_kind, to_kind)) {
|
| - HInstruction* elements = AddLoadElements(object);
|
| + HInstruction* elements = AddLoadElements(object, NULL);
|
|
|
| HInstruction* empty_fixed_array = Add<HConstant>(
|
| isolate()->factory()->empty_fixed_array());
|
| @@ -1697,7 +1697,7 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HValue* boilerplate,
|
| if (length > 0) {
|
| // Get hold of the elements array of the boilerplate and setup the
|
| // elements pointer in the resulting object.
|
| - HValue* boilerplate_elements = AddLoadElements(boilerplate);
|
| + HValue* boilerplate_elements = AddLoadElements(boilerplate, NULL);
|
| HValue* object_elements = Add<HInnerAllocatedObject>(object, elems_offset);
|
| Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(),
|
| object_elements);
|
| @@ -1862,7 +1862,7 @@ HValue* HGraphBuilder::JSArrayBuilder::EmitMapCode() {
|
| // map, because we can just load the map in that case.
|
| HObjectAccess access = HObjectAccess::ForPrototypeOrInitialMap();
|
| return builder()->AddInstruction(
|
| - builder()->BuildLoadNamedField(constructor_function_, access));
|
| + builder()->BuildLoadNamedField(constructor_function_, access, NULL));
|
| }
|
|
|
| HInstruction* native_context = builder()->BuildGetNativeContext();
|
| @@ -1883,7 +1883,7 @@ HValue* HGraphBuilder::JSArrayBuilder::EmitInternalMapCode() {
|
| // Find the map near the constructor function
|
| HObjectAccess access = HObjectAccess::ForPrototypeOrInitialMap();
|
| return builder()->AddInstruction(
|
| - builder()->BuildLoadNamedField(constructor_function_, access));
|
| + builder()->BuildLoadNamedField(constructor_function_, access, NULL));
|
| }
|
|
|
|
|
| @@ -4375,6 +4375,7 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
|
| int data_size = 0;
|
| int pointer_size = 0;
|
| int max_properties = kMaxFastLiteralProperties;
|
| + HCheckMaps* type_check = NULL;
|
| if (IsFastLiteral(original_boilerplate_object,
|
| kMaxFastLiteralDepth,
|
| &max_properties,
|
| @@ -4412,7 +4413,7 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
|
| // De-opt if elements kind changed from boilerplate_elements_kind.
|
| Handle<Map> map = Handle<Map>(original_boilerplate_object->map(),
|
| isolate());
|
| - Add<HCheckMaps>(literal, map, top_info());
|
| + type_check = Add<HCheckMaps>(literal, map, top_info());
|
| }
|
|
|
| // The array is expected in the bailout environment during computation
|
| @@ -4433,7 +4434,7 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
|
| HValue* value = Pop();
|
| if (!Smi::IsValid(i)) return Bailout("Non-smi key in array literal");
|
|
|
| - elements = AddLoadElements(literal);
|
| + elements = AddLoadElements(literal, type_check);
|
|
|
| HValue* key = Add<HConstant>(i);
|
|
|
| @@ -4487,9 +4488,10 @@ static bool ComputeLoadStoreField(Handle<Map> type,
|
| }
|
|
|
|
|
| -void HOptimizedGraphBuilder::AddCheckMap(HValue* object, Handle<Map> map) {
|
| +HCheckMaps* HOptimizedGraphBuilder::AddCheckMap(HValue* object,
|
| + Handle<Map> map) {
|
| BuildCheckHeapObject(object);
|
| - Add<HCheckMaps>(object, map, top_info());
|
| + return Add<HCheckMaps>(object, map, top_info());
|
| }
|
|
|
|
|
| @@ -4654,8 +4656,8 @@ HInstruction* HOptimizedGraphBuilder::TryLoadPolymorphicAsMonomorphic(
|
| if (count == types->length()) {
|
| // Everything matched; can use monomorphic load.
|
| BuildCheckHeapObject(object);
|
| - Add<HCheckMaps>(object, types);
|
| - return BuildLoadNamedField(object, access);
|
| + HCheckMaps* type_check = Add<HCheckMaps>(object, types);
|
| + return BuildLoadNamedField(object, access, type_check);
|
| }
|
|
|
| if (count != 0) return NULL;
|
| @@ -4676,7 +4678,7 @@ HInstruction* HOptimizedGraphBuilder::TryLoadPolymorphicAsMonomorphic(
|
| if (!lookup.IsField()) return NULL;
|
|
|
| BuildCheckHeapObject(object);
|
| - Add<HCheckMaps>(object, types);
|
| + HCheckMaps* type_check = Add<HCheckMaps>(object, types);
|
|
|
| Handle<JSObject> holder(lookup.holder());
|
| Handle<Map> holder_map(holder->map());
|
| @@ -4684,7 +4686,7 @@ HInstruction* HOptimizedGraphBuilder::TryLoadPolymorphicAsMonomorphic(
|
| Handle<JSObject>::cast(prototype), holder, top_info());
|
| HValue* holder_value = Add<HConstant>(holder);
|
| return BuildLoadNamedField(holder_value,
|
| - HObjectAccess::ForField(holder_map, &lookup, name));
|
| + HObjectAccess::ForField(holder_map, &lookup, name), type_check);
|
| }
|
|
|
|
|
| @@ -5388,18 +5390,18 @@ HInstruction* HOptimizedGraphBuilder::BuildLoadNamedMonomorphic(
|
| // Handle access to various length properties
|
| if (name->Equals(isolate()->heap()->length_string())) {
|
| if (map->instance_type() == JS_ARRAY_TYPE) {
|
| - AddCheckMap(object, map);
|
| + HCheckMaps* type_check = AddCheckMap(object, map);
|
| return New<HLoadNamedField>(object,
|
| - HObjectAccess::ForArrayLength(map->elements_kind()));
|
| + HObjectAccess::ForArrayLength(map->elements_kind()), type_check);
|
| }
|
| }
|
|
|
| LookupResult lookup(isolate());
|
| map->LookupDescriptor(NULL, *name, &lookup);
|
| if (lookup.IsField()) {
|
| - AddCheckMap(object, map);
|
| + HCheckMaps* type_check = AddCheckMap(object, map);
|
| return BuildLoadNamedField(object,
|
| - HObjectAccess::ForField(map, &lookup, name));
|
| + HObjectAccess::ForField(map, &lookup, name), type_check);
|
| }
|
|
|
| // Handle a load of a constant known function.
|
| @@ -5415,11 +5417,11 @@ HInstruction* HOptimizedGraphBuilder::BuildLoadNamedMonomorphic(
|
| Handle<JSObject> prototype(JSObject::cast(map->prototype()));
|
| Handle<JSObject> holder(lookup.holder());
|
| Handle<Map> holder_map(holder->map());
|
| - AddCheckMap(object, map);
|
| + HCheckMaps* type_check = AddCheckMap(object, map);
|
| Add<HCheckPrototypeMaps>(prototype, holder, top_info());
|
| HValue* holder_value = Add<HConstant>(holder);
|
| return BuildLoadNamedField(holder_value,
|
| - HObjectAccess::ForField(holder_map, &lookup, name));
|
| + HObjectAccess::ForField(holder_map, &lookup, name), type_check);
|
| }
|
|
|
| // Handle a load of a constant function somewhere in the prototype chain.
|
|
|