Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 1fc6f08914ef3e8caeec90c5a181444ffa6b4209..d77147bad2e4eabd4c6d29f10198465c5d64cf8a 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -1745,22 +1745,35 @@ void HGraphBuilder::BuildCompareNil( |
int position, |
HIfContinuation* continuation) { |
IfBuilder if_nil(this, position); |
- bool needs_or = false; |
+ bool some_case_handled = false; |
+ bool some_case_missing = false; |
+ |
if (type->Maybe(Type::Null())) { |
- if (needs_or) if_nil.Or(); |
+ if (some_case_handled) if_nil.Or(); |
if_nil.If<HCompareObjectEqAndBranch>(value, graph()->GetConstantNull()); |
- needs_or = true; |
+ some_case_handled = true; |
+ } else { |
+ some_case_missing = true; |
} |
+ |
if (type->Maybe(Type::Undefined())) { |
- if (needs_or) if_nil.Or(); |
+ if (some_case_handled) if_nil.Or(); |
if_nil.If<HCompareObjectEqAndBranch>(value, |
graph()->GetConstantUndefined()); |
- needs_or = true; |
+ some_case_handled = true; |
+ } else { |
+ some_case_missing = true; |
} |
+ |
if (type->Maybe(Type::Undetectable())) { |
- if (needs_or) if_nil.Or(); |
+ if (some_case_handled) if_nil.Or(); |
if_nil.If<HIsUndetectableAndBranch>(value); |
+ some_case_handled = true; |
} else { |
+ some_case_missing = true; |
+ } |
+ |
+ if (some_case_missing) { |
if_nil.Then(); |
if_nil.Else(); |
if (type->NumClasses() == 1) { |
@@ -8209,21 +8222,23 @@ void HOptimizedGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr, |
ASSERT(expr->op() == Token::EQ || expr->op() == Token::EQ_STRICT); |
CHECK_ALIVE(VisitForValue(sub_expr)); |
HValue* value = Pop(); |
- HIfContinuation continuation; |
if (expr->op() == Token::EQ_STRICT) { |
- IfBuilder if_nil(this); |
- if_nil.If<HCompareObjectEqAndBranch>( |
- value, (nil == kNullValue) ? graph()->GetConstantNull() |
- : graph()->GetConstantUndefined()); |
- if_nil.Then(); |
- if_nil.Else(); |
- if_nil.CaptureContinuation(&continuation); |
+ HConstant* nil_constant = nil == kNullValue |
+ ? graph()->GetConstantNull() |
+ : graph()->GetConstantUndefined(); |
+ HCompareObjectEqAndBranch* instr = |
+ New<HCompareObjectEqAndBranch>(value, nil_constant); |
+ instr->set_position(expr->position()); |
+ return ast_context()->ReturnControl(instr, expr->id()); |
+ } else { |
+ ASSERT_EQ(Token::EQ, expr->op()); |
+ Handle<Type> type = expr->combined_type()->Is(Type::None()) |
+ ? handle(Type::Any(), isolate_) |
+ : expr->combined_type(); |
+ HIfContinuation continuation; |
+ BuildCompareNil(value, type, expr->position(), &continuation); |
return ast_context()->ReturnContinuation(&continuation, expr->id()); |
} |
- Handle<Type> type = expr->combined_type()->Is(Type::None()) |
- ? handle(Type::Any(), isolate_) : expr->combined_type(); |
- BuildCompareNil(value, type, expr->position(), &continuation); |
- return ast_context()->ReturnContinuation(&continuation, expr->id()); |
} |