Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 8570b33ce08a509bc08b5b03250327f116080d87..bc4045a96baa87c47134394f7b500648a706b77f 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -12390,6 +12390,54 @@ void HOptimizedGraphBuilder::GenerateDebugIsActive(CallRuntime* call) { |
} |
+void HOptimizedGraphBuilder::GenerateGetPrototype(CallRuntime* call) { |
+ DCHECK(call->arguments()->length() == 1); |
+ CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
+ HValue* object = Pop(); |
+ |
+ NoObservableSideEffectsScope no_effects(this); |
+ |
+ HValue* map = Add<HLoadNamedField>(object, static_cast<HValue*>(NULL), |
+ HObjectAccess::ForMap()); |
+ HValue* bit_field = Add<HLoadNamedField>(map, static_cast<HValue*>(NULL), |
+ HObjectAccess::ForMapBitField()); |
+ HValue* is_access_check_needed_mask = |
+ Add<HConstant>(1 << Map::kIsAccessCheckNeeded); |
+ HValue* is_access_check_needed_test = AddUncasted<HBitwise>( |
+ Token::BIT_AND, bit_field, is_access_check_needed_mask); |
+ |
+ HValue* proto = Add<HLoadNamedField>(map, static_cast<HValue*>(NULL), |
+ HObjectAccess::ForPrototype()); |
+ HValue* proto_map = Add<HLoadNamedField>(proto, static_cast<HValue*>(NULL), |
+ HObjectAccess::ForMap()); |
+ HValue* proto_bit_field = Add<HLoadNamedField>( |
+ proto_map, static_cast<HValue*>(NULL), HObjectAccess::ForMapBitField()); |
+ HValue* is_hidden_prototype_mask = |
+ Add<HConstant>(1 << Map::kIsHiddenPrototype); |
+ HValue* is_hidden_prototype_test = AddUncasted<HBitwise>( |
+ Token::BIT_AND, proto_bit_field, is_hidden_prototype_mask); |
+ |
+ { |
+ IfBuilder needs_runtime(this); |
+ needs_runtime.If<HCompareNumericAndBranch>( |
+ is_access_check_needed_test, graph()->GetConstant0(), Token::NE); |
+ needs_runtime.OrIf<HCompareNumericAndBranch>( |
+ is_hidden_prototype_test, graph()->GetConstant0(), Token::NE); |
+ |
+ needs_runtime.Then(); |
+ { |
+ Add<HPushArguments>(object); |
+ HValue* result = Add<HCallRuntime>( |
+ call->name(), Runtime::FunctionForId(Runtime::kGetPrototype), 1); |
+ ast_context()->ReturnValue(result); |
arv (Not doing code reviews)
2014/12/05 15:30:05
Other places usually do a push/pop in this case bu
Dmitry Lomov (no reviews)
2014/12/05 15:39:20
Nit: could you keep the push/pop code pattern? Thi
|
+ } |
+ |
+ needs_runtime.Else(); |
+ ast_context()->ReturnValue(proto); |
+ } |
+} |
+ |
+ |
#undef CHECK_BAILOUT |
#undef CHECK_ALIVE |