Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 2a0011f38e4d9b068f169394e14212d2a6c6cf87..d1959bb0ab5f489f50a1d8c58bc87eac346d5d2c 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -683,6 +683,11 @@ HConstant* HGraph::GetConstantMinus1() { |
} |
+HConstant* HGraph::GetConstantBool(bool value) { |
+ return value ? GetConstantTrue() : GetConstantFalse(); |
+} |
+ |
+ |
#define DEFINE_GET_CONSTANT(Name, name, type, htype, boolean_value) \ |
HConstant* HGraph::GetConstant##Name() { \ |
if (!constant_##name##_.is_set()) { \ |
@@ -1667,10 +1672,9 @@ HValue* HGraphBuilder::BuildElementIndexHash(HValue* index) { |
} |
-HValue* HGraphBuilder::BuildUncheckedDictionaryElementLoad(HValue* receiver, |
- HValue* elements, |
- HValue* key, |
- HValue* hash) { |
+HValue* HGraphBuilder::BuildUncheckedDictionaryElementLoad( |
+ HValue* receiver, HValue* elements, HValue* key, HValue* hash, |
+ LanguageMode language_mode) { |
HValue* capacity = |
Add<HLoadKeyed>(elements, Add<HConstant>(NameDictionary::kCapacityIndex), |
nullptr, FAST_ELEMENTS); |
@@ -1712,10 +1716,10 @@ HValue* HGraphBuilder::BuildUncheckedDictionaryElementLoad(HValue* receiver, |
{ |
// element == undefined means "not found". Call the runtime. |
// TODO(jkummerow): walk the prototype chain instead. |
- Add<HPushArguments>(receiver, key); |
+ Add<HPushArguments>(receiver, key, Add<HConstant>(language_mode)); |
Push(Add<HCallRuntime>(isolate()->factory()->empty_string(), |
Runtime::FunctionForId(Runtime::kKeyedGetProperty), |
- 2)); |
+ 3)); |
} |
if_undefined.Else(); |
{ |
@@ -1772,10 +1776,10 @@ HValue* HGraphBuilder::BuildUncheckedDictionaryElementLoad(HValue* receiver, |
result_index->ClearFlag(HValue::kCanOverflow); |
Push(Add<HLoadKeyed>(elements, result_index, nullptr, FAST_ELEMENTS)); |
details_compare.Else(); |
- Add<HPushArguments>(receiver, key); |
+ Add<HPushArguments>(receiver, key, Add<HConstant>(language_mode)); |
Push(Add<HCallRuntime>(isolate()->factory()->empty_string(), |
Runtime::FunctionForId(Runtime::kKeyedGetProperty), |
- 2)); |
+ 3)); |
details_compare.End(); |
found_key_match.Else(); |
@@ -6223,7 +6227,7 @@ bool HOptimizedGraphBuilder::PropertyAccessInfo::CanAccessMonomorphic() { |
if (IsFound()) return IsLoad() || !IsReadOnly(); |
if (IsIntegerIndexedExotic()) return false; |
if (!LookupInPrototypes()) return false; |
- if (IsLoad()) return true; |
+ if (IsLoad()) return !is_strong(builder_->function_language_mode()); |
if (IsAccessorConstant()) return true; |
LookupTransition(*map_, *name_, NONE); |
@@ -7041,14 +7045,14 @@ HInstruction* HOptimizedGraphBuilder::BuildNamedGeneric( |
// use a generic Keyed Load if we are using the type vector, because |
// it has to share information with full code. |
HConstant* key = Add<HConstant>(name); |
- HLoadKeyedGeneric* result = |
- New<HLoadKeyedGeneric>(object, key, PREMONOMORPHIC); |
+ HLoadKeyedGeneric* result = New<HLoadKeyedGeneric>( |
+ object, key, function_language_mode(), PREMONOMORPHIC); |
result->SetVectorAndSlot(vector, slot); |
return result; |
} |
- HLoadNamedGeneric* result = |
- New<HLoadNamedGeneric>(object, name, PREMONOMORPHIC); |
+ HLoadNamedGeneric* result = New<HLoadNamedGeneric>( |
+ object, name, function_language_mode(), PREMONOMORPHIC); |
result->SetVectorAndSlot(vector, slot); |
return result; |
} else { |
@@ -7067,8 +7071,8 @@ HInstruction* HOptimizedGraphBuilder::BuildKeyedGeneric( |
HValue* value) { |
if (access_type == LOAD) { |
InlineCacheState initial_state = expr->AsProperty()->GetInlineCacheState(); |
- HLoadKeyedGeneric* result = |
- New<HLoadKeyedGeneric>(object, key, initial_state); |
+ HLoadKeyedGeneric* result = New<HLoadKeyedGeneric>( |
+ object, key, function_language_mode(), initial_state); |
// HLoadKeyedGeneric with vector ics benefits from being encoded as |
// MEGAMORPHIC because the vector/slot combo becomes unnecessary. |
if (initial_state != MEGAMORPHIC) { |