| 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
|
|
|