Index: src/code-stubs-hydrogen.cc |
diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc |
index 852f7b569727b08939d1c952146699d6ff4999f7..235950de9cd9d29899b5b8e607a5a71e6ec1b332 100644 |
--- a/src/code-stubs-hydrogen.cc |
+++ b/src/code-stubs-hydrogen.cc |
@@ -41,13 +41,13 @@ static LChunk* OptimizeGraph(HGraph* graph) { |
DisallowHandleDereference no_deref; |
ASSERT(graph != NULL); |
- BailoutReason bailout_reason = kNoReason; |
+ SmartArrayPointer<char> bailout_reason; |
if (!graph->Optimize(&bailout_reason)) { |
- FATAL(GetBailoutReason(bailout_reason)); |
+ FATAL(bailout_reason.is_empty() ? "unknown" : *bailout_reason); |
} |
LChunk* chunk = LChunk::NewChunk(graph); |
if (chunk == NULL) { |
- FATAL(GetBailoutReason(graph->info()->bailout_reason())); |
+ FATAL(graph->info()->bailout_reason()); |
} |
return chunk; |
} |
@@ -802,6 +802,44 @@ Handle<Code> CompareNilICStub::GenerateCode() { |
template <> |
+HValue* CodeStubGraphBuilder<UnaryOpStub>::BuildCodeInitializedStub() { |
+ UnaryOpStub* stub = casted_stub(); |
+ Handle<Type> type = stub->GetType(graph()->isolate()); |
+ HValue* input = GetParameter(0); |
+ |
+ // Prevent unwanted HChange being inserted to ensure that the stub |
+ // deopts on newly encountered types. |
+ if (!type->Maybe(Type::Double())) { |
+ input = Add<HForceRepresentation>(input, Representation::Smi()); |
+ } |
+ |
+ if (!type->Is(Type::Number())) { |
+ // If we expect to see other things than Numbers, we will create a generic |
+ // stub, which handles all numbers and calls into the runtime for the rest. |
+ IfBuilder if_number(this); |
+ if_number.If<HIsNumberAndBranch>(input); |
+ if_number.Then(); |
+ HInstruction* res = BuildUnaryMathOp(input, type, stub->operation()); |
+ if_number.Return(AddInstruction(res)); |
+ if_number.Else(); |
+ HValue* function = AddLoadJSBuiltin(stub->ToJSBuiltin()); |
+ Add<HPushArgument>(GetParameter(0)); |
+ HValue* result = Add<HInvokeFunction>(function, 1); |
+ if_number.Return(result); |
+ if_number.End(); |
+ return graph()->GetConstantUndefined(); |
+ } |
+ |
+ return AddInstruction(BuildUnaryMathOp(input, type, stub->operation())); |
+} |
+ |
+ |
+Handle<Code> UnaryOpStub::GenerateCode() { |
+ return DoGenerateCode(this); |
+} |
+ |
+ |
+template <> |
HValue* CodeStubGraphBuilder<ToBooleanStub>::BuildCodeInitializedStub() { |
ToBooleanStub* stub = casted_stub(); |