Index: test/cctest/compiler/call-tester.h |
diff --git a/test/cctest/compiler/call-tester.h b/test/cctest/compiler/call-tester.h |
index 6d8c76145267a3cfc6fbd94b503b575611de71e2..353ed3dc4d36060e039ff8920b851eec8f43300c 100644 |
--- a/test/cctest/compiler/call-tester.h |
+++ b/test/cctest/compiler/call-tester.h |
@@ -148,6 +148,7 @@ struct ParameterTraits<uint32_t> { |
#endif // !V8_TARGET_ARCH_64_BIT |
+template <typename R> |
class CallHelper { |
public: |
explicit CallHelper(Isolate* isolate, MachineSignature* machine_sig) |
@@ -156,34 +157,50 @@ class CallHelper { |
} |
virtual ~CallHelper() {} |
- static MachineSignature* MakeMachineSignature( |
- Zone* zone, MachineType return_type, MachineType p0 = kMachNone, |
- MachineType p1 = kMachNone, MachineType p2 = kMachNone, |
- MachineType p3 = kMachNone, MachineType p4 = kMachNone) { |
- // Count the number of parameters. |
- size_t param_count = 5; |
- MachineType types[] = {p0, p1, p2, p3, p4}; |
- while (param_count > 0 && types[param_count - 1] == kMachNone) |
- param_count--; |
- size_t return_count = return_type == kMachNone ? 0 : 1; |
- |
- // Build the machine signature. |
- MachineSignature::Builder builder(zone, return_count, param_count); |
- if (return_count > 0) builder.AddReturn(return_type); |
- for (size_t i = 0; i < param_count; i++) { |
- builder.AddParam(types[i]); |
- } |
- return builder.Build(); |
+ R Call() { |
+ typedef R V8_CDECL FType(); |
+ VerifyParameters0(); |
+ return DoCall(FUNCTION_CAST<FType*>(Generate())); |
+ } |
+ |
+ template <typename P1> |
+ R Call(P1 p1) { |
+ typedef R V8_CDECL FType(P1); |
+ VerifyParameters1<P1>(); |
+ return DoCall(FUNCTION_CAST<FType*>(Generate()), p1); |
+ } |
+ |
+ template <typename P1, typename P2> |
+ R Call(P1 p1, P2 p2) { |
+ typedef R V8_CDECL FType(P1, P2); |
+ VerifyParameters2<P1, P2>(); |
+ return DoCall(FUNCTION_CAST<FType*>(Generate()), p1, p2); |
+ } |
+ |
+ template <typename P1, typename P2, typename P3> |
+ R Call(P1 p1, P2 p2, P3 p3) { |
+ typedef R V8_CDECL FType(P1, P2, P3); |
+ VerifyParameters3<P1, P2, P3>(); |
+ return DoCall(FUNCTION_CAST<FType*>(Generate()), p1, p2, p3); |
+ } |
+ |
+ template <typename P1, typename P2, typename P3, typename P4> |
+ R Call(P1 p1, P2 p2, P3 p3, P4 p4) { |
+ typedef R V8_CDECL FType(P1, P2, P3, P4); |
+ VerifyParameters4<P1, P2, P3, P4>(); |
+ return DoCall(FUNCTION_CAST<FType*>(Generate()), p1, p2, p3, p4); |
} |
protected: |
MachineSignature* machine_sig_; |
+ |
void VerifyParameters(size_t parameter_count, MachineType* parameter_types) { |
CHECK(machine_sig_->parameter_count() == parameter_count); |
for (size_t i = 0; i < parameter_count; i++) { |
CHECK_EQ(machine_sig_->GetParam(i), parameter_types[i]); |
} |
} |
+ |
virtual byte* Generate() = 0; |
private: |
@@ -193,33 +210,32 @@ class CallHelper { |
return static_cast<uintptr_t>(simulator->CallInt64(f, args)); |
} |
- template <typename R, typename F> |
+ template <typename F> |
R DoCall(F* f) { |
Simulator::CallArgument args[] = {Simulator::CallArgument::End()}; |
return ReturnValueTraits<R>::Cast(CallSimulator(FUNCTION_ADDR(f), args)); |
} |
- template <typename R, typename F, typename P1> |
+ template <typename F, typename P1> |
R DoCall(F* f, P1 p1) { |
Simulator::CallArgument args[] = {Simulator::CallArgument(p1), |
Simulator::CallArgument::End()}; |
return ReturnValueTraits<R>::Cast(CallSimulator(FUNCTION_ADDR(f), args)); |
} |
- template <typename R, typename F, typename P1, typename P2> |
+ template <typename F, typename P1, typename P2> |
R DoCall(F* f, P1 p1, P2 p2) { |
Simulator::CallArgument args[] = {Simulator::CallArgument(p1), |
Simulator::CallArgument(p2), |
Simulator::CallArgument::End()}; |
return ReturnValueTraits<R>::Cast(CallSimulator(FUNCTION_ADDR(f), args)); |
} |
- template <typename R, typename F, typename P1, typename P2, typename P3> |
+ template <typename F, typename P1, typename P2, typename P3> |
R DoCall(F* f, P1 p1, P2 p2, P3 p3) { |
Simulator::CallArgument args[] = { |
Simulator::CallArgument(p1), Simulator::CallArgument(p2), |
Simulator::CallArgument(p3), Simulator::CallArgument::End()}; |
return ReturnValueTraits<R>::Cast(CallSimulator(FUNCTION_ADDR(f), args)); |
} |
- template <typename R, typename F, typename P1, typename P2, typename P3, |
- typename P4> |
+ template <typename F, typename P1, typename P2, typename P3, typename P4> |
R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) { |
Simulator::CallArgument args[] = { |
Simulator::CallArgument(p1), Simulator::CallArgument(p2), |
@@ -235,29 +251,28 @@ class CallHelper { |
} |
- template <typename R, typename F> |
+ template <typename F> |
R DoCall(F* f) { |
return ReturnValueTraits<R>::Cast(CallSimulator(FUNCTION_ADDR(f))); |
} |
- template <typename R, typename F, typename P1> |
+ template <typename F, typename P1> |
R DoCall(F* f, P1 p1) { |
return ReturnValueTraits<R>::Cast( |
CallSimulator(FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1))); |
} |
- template <typename R, typename F, typename P1, typename P2> |
+ template <typename F, typename P1, typename P2> |
R DoCall(F* f, P1 p1, P2 p2) { |
return ReturnValueTraits<R>::Cast( |
CallSimulator(FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), |
ParameterTraits<P2>::Cast(p2))); |
} |
- template <typename R, typename F, typename P1, typename P2, typename P3> |
+ template <typename F, typename P1, typename P2, typename P3> |
R DoCall(F* f, P1 p1, P2 p2, P3 p3) { |
return ReturnValueTraits<R>::Cast(CallSimulator( |
FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), |
ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3))); |
} |
- template <typename R, typename F, typename P1, typename P2, typename P3, |
- typename P4> |
+ template <typename F, typename P1, typename P2, typename P3, typename P4> |
R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) { |
return ReturnValueTraits<R>::Cast(CallSimulator( |
FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), |
@@ -271,29 +286,28 @@ class CallHelper { |
Simulator* simulator = Simulator::current(isolate_); |
return static_cast<uintptr_t>(simulator->Call(f, 4, p1, p2, p3, p4)); |
} |
- template <typename R, typename F> |
+ template <typename F> |
R DoCall(F* f) { |
return ReturnValueTraits<R>::Cast(CallSimulator(FUNCTION_ADDR(f))); |
} |
- template <typename R, typename F, typename P1> |
+ template <typename F, typename P1> |
R DoCall(F* f, P1 p1) { |
return ReturnValueTraits<R>::Cast( |
CallSimulator(FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1))); |
} |
- template <typename R, typename F, typename P1, typename P2> |
+ template <typename F, typename P1, typename P2> |
R DoCall(F* f, P1 p1, P2 p2) { |
return ReturnValueTraits<R>::Cast( |
CallSimulator(FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), |
ParameterTraits<P2>::Cast(p2))); |
} |
- template <typename R, typename F, typename P1, typename P2, typename P3> |
+ template <typename F, typename P1, typename P2, typename P3> |
R DoCall(F* f, P1 p1, P2 p2, P3 p3) { |
return ReturnValueTraits<R>::Cast(CallSimulator( |
FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), |
ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3))); |
} |
- template <typename R, typename F, typename P1, typename P2, typename P3, |
- typename P4> |
+ template <typename F, typename P1, typename P2, typename P3, typename P4> |
R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) { |
return ReturnValueTraits<R>::Cast(CallSimulator( |
FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), |
@@ -301,24 +315,23 @@ class CallHelper { |
ParameterTraits<P4>::Cast(p4))); |
} |
#else |
- template <typename R, typename F> |
+ template <typename F> |
R DoCall(F* f) { |
return f(); |
} |
- template <typename R, typename F, typename P1> |
+ template <typename F, typename P1> |
R DoCall(F* f, P1 p1) { |
return f(p1); |
} |
- template <typename R, typename F, typename P1, typename P2> |
+ template <typename F, typename P1, typename P2> |
R DoCall(F* f, P1 p1, P2 p2) { |
return f(p1, p2); |
} |
- template <typename R, typename F, typename P1, typename P2, typename P3> |
+ template <typename F, typename P1, typename P2, typename P3> |
R DoCall(F* f, P1 p1, P2 p2, P3 p3) { |
return f(p1, p2, p3); |
} |
- template <typename R, typename F, typename P1, typename P2, typename P3, |
- typename P4> |
+ template <typename F, typename P1, typename P2, typename P3, typename P4> |
R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) { |
return f(p1, p2, p3, p4); |
} |
@@ -372,78 +385,9 @@ class CallHelper { |
} |
#endif |
- // TODO(dcarney): replace Call() in CallHelper2 with these. |
- template <typename R> |
- R Call0() { |
- typedef R V8_CDECL FType(); |
- VerifyParameters0(); |
- return DoCall<R>(FUNCTION_CAST<FType*>(Generate())); |
- } |
- |
- template <typename R, typename P1> |
- R Call1(P1 p1) { |
- typedef R V8_CDECL FType(P1); |
- VerifyParameters1<P1>(); |
- return DoCall<R>(FUNCTION_CAST<FType*>(Generate()), p1); |
- } |
- |
- template <typename R, typename P1, typename P2> |
- R Call2(P1 p1, P2 p2) { |
- typedef R V8_CDECL FType(P1, P2); |
- VerifyParameters2<P1, P2>(); |
- return DoCall<R>(FUNCTION_CAST<FType*>(Generate()), p1, p2); |
- } |
- |
- template <typename R, typename P1, typename P2, typename P3> |
- R Call3(P1 p1, P2 p2, P3 p3) { |
- typedef R V8_CDECL FType(P1, P2, P3); |
- VerifyParameters3<P1, P2, P3>(); |
- return DoCall<R>(FUNCTION_CAST<FType*>(Generate()), p1, p2, p3); |
- } |
- |
- template <typename R, typename P1, typename P2, typename P3, typename P4> |
- R Call4(P1 p1, P2 p2, P3 p3, P4 p4) { |
- typedef R V8_CDECL FType(P1, P2, P3, P4); |
- VerifyParameters4<P1, P2, P3, P4>(); |
- return DoCall<R>(FUNCTION_CAST<FType*>(Generate()), p1, p2, p3, p4); |
- } |
- |
- template <typename R, typename C> |
- friend class CallHelper2; |
Isolate* isolate_; |
}; |
- |
-// TODO(dcarney): replace CallHelper with CallHelper2 and rename. |
-template <typename R, typename C> |
-class CallHelper2 { |
- public: |
- R Call() { return helper()->template Call0<R>(); } |
- |
- template <typename P1> |
- R Call(P1 p1) { |
- return helper()->template Call1<R>(p1); |
- } |
- |
- template <typename P1, typename P2> |
- R Call(P1 p1, P2 p2) { |
- return helper()->template Call2<R>(p1, p2); |
- } |
- |
- template <typename P1, typename P2, typename P3> |
- R Call(P1 p1, P2 p2, P3 p3) { |
- return helper()->template Call3<R>(p1, p2, p3); |
- } |
- |
- template <typename P1, typename P2, typename P3, typename P4> |
- R Call(P1 p1, P2 p2, P3 p3, P4 p4) { |
- return helper()->template Call4<R>(p1, p2, p3, p4); |
- } |
- |
- private: |
- CallHelper* helper() { return static_cast<C*>(this); } |
-}; |
- |
} // namespace compiler |
} // namespace internal |
} // namespace v8 |