1212#include < cmath>
1313#include < tuple>
1414
15+ namespace luabridge {
16+
17+ template <>
18+ struct StackConversion <lbsbench::Vec3Target>
19+ {
20+ static constexpr bool enabled = true ;
21+ };
22+
23+ template <>
24+ struct StackConverter <lbsbench::Vec3Target, lbsbench::Vec3Source>
25+ {
26+ static lbsbench::Vec3Target convert (const lbsbench::Vec3Source& s)
27+ {
28+ return {s.x , s.y , s.z };
29+ }
30+ };
31+
32+ template <>
33+ struct StackConverter <lbsbench::Vec3Target, lbsbench::ColorSource>
34+ {
35+ static lbsbench::Vec3Target convert (const lbsbench::ColorSource& s)
36+ {
37+ return {s.r , s.g , s.b };
38+ }
39+ };
40+
41+ } // namespace luabridge
42+
1543namespace {
1644
1745using namespace lbsbench ;
@@ -396,7 +424,7 @@ void multi_return_measure(benchmark::State& state)
396424 benchmark::DoNotOptimize (x);
397425}
398426
399- void base_derived_measure (benchmark::State& state)
427+ void derived_base_measure (benchmark::State& state)
400428{
401429 lua_State* L = makeLua ();
402430
@@ -657,6 +685,88 @@ void implicit_inheritance_measure(benchmark::State& state)
657685 }
658686}
659687
688+ void registerConverter (lua_State* L)
689+ {
690+ luabridge::getGlobalNamespace (L)
691+ .beginClass <Vec3Source>(" Vec3Source" )
692+ .addConstructor <void (float , float , float )>()
693+ .addConverter <Vec3Target>()
694+ .endClass ()
695+ .beginClass <ColorSource>(" ColorSource" )
696+ .addConstructor <void (float , float , float )>()
697+ .addConverter <Vec3Target>()
698+ .endClass ()
699+ .beginClass <Vec3Target>(" Vec3Target" )
700+ .addConstructor <void (float , float , float )>()
701+ .endClass ()
702+ .addFunction (" sumVec3" , &sumVec3)
703+ .addFunction (" sumVec3Ref" , &sumVec3Ref);
704+ }
705+
706+ void converter_exact_type_measure (benchmark::State& state)
707+ {
708+ lua_State* L = makeLua ();
709+ registerConverter (L);
710+ luaDoStringOrThrow (L, " obj = Vec3Target(1, 2, 3)" , " converter_exact_type setup" );
711+ luaDoStringOrThrow (L, " function invoke_exact() return sumVec3(obj) end" , " converter_exact_type closure setup" );
712+
713+ for (auto _ : state)
714+ {
715+ (void ) _;
716+ lua_getglobal (L, " invoke_exact" );
717+ luaCheckOrThrow (L, lua_pcall (L, 0 , 1 , 0 ), " invoke_exact" );
718+ lua_pop (L, 1 );
719+ }
720+ }
721+
722+ void converter_phase3_value_measure (benchmark::State& state)
723+ {
724+ lua_State* L = makeLua ();
725+ registerConverter (L);
726+ luaDoStringOrThrow (L, " obj = Vec3Source(1, 2, 3)" , " converter_phase3_value setup" );
727+ luaDoStringOrThrow (L, " function invoke_conv_value() return sumVec3(obj) end" , " converter_phase3_value closure setup" );
728+
729+ for (auto _ : state)
730+ {
731+ (void ) _;
732+ lua_getglobal (L, " invoke_conv_value" );
733+ luaCheckOrThrow (L, lua_pcall (L, 0 , 1 , 0 ), " invoke_conv_value" );
734+ lua_pop (L, 1 );
735+ }
736+ }
737+
738+ void converter_phase3_ref_measure (benchmark::State& state)
739+ {
740+ lua_State* L = makeLua ();
741+ registerConverter (L);
742+ luaDoStringOrThrow (L, " obj = Vec3Source(1, 2, 3)" , " converter_phase3_ref setup" );
743+ luaDoStringOrThrow (L, " function invoke_conv_ref() return sumVec3Ref(obj) end" , " converter_phase3_ref closure setup" );
744+
745+ for (auto _ : state)
746+ {
747+ (void ) _;
748+ lua_getglobal (L, " invoke_conv_ref" );
749+ luaCheckOrThrow (L, lua_pcall (L, 0 , 1 , 0 ), " invoke_conv_ref" );
750+ lua_pop (L, 1 );
751+ }
752+ }
753+
754+ void converter_multi_registered_measure (benchmark::State& state)
755+ {
756+ lua_State* L = makeLua ();
757+ registerConverter (L);
758+ luaDoStringOrThrow (L, " obj = ColorSource(0.5, 1, 0)" , " converter_multi_registered setup" );
759+ luaDoStringOrThrow (L, " function invoke_conv_multi() return sumVec3(obj) end" , " converter_multi_registered closure setup" );
760+
761+ for (auto _ : state)
762+ {
763+ (void ) _;
764+ lua_getglobal (L, " invoke_conv_multi" );
765+ luaCheckOrThrow (L, lua_pcall (L, 0 , 1 , 0 ), " invoke_conv_multi" );
766+ lua_pop (L, 1 );
767+ }
768+ }
769+
660770} // namespace
661771
662772BENCHMARK (table_global_string_get_measure)->Name (" table_global_string_get_measure" );
@@ -675,7 +785,7 @@ BENCHMARK(userdata_variable_access_last_measure)->Name("userdata_variable_access
675785BENCHMARK (multi_return_lua_measure)->Name (" multi_return_lua_measure" );
676786BENCHMARK (multi_return_measure)->Name (" multi_return_measure" );
677787BENCHMARK (stateful_function_object_measure)->Name (" stateful_function_object_measure" );
678- BENCHMARK (base_derived_measure )->Name (" base_derived_measure " );
788+ BENCHMARK (derived_base_measure )->Name (" derived_base_measure " );
679789BENCHMARK (return_userdata_measure)->Name (" return_userdata_measure" );
680790BENCHMARK (optional_success_measure)->Name (" optional_success_measure" );
681791BENCHMARK (optional_half_failure_measure)->Name (" optional_half_failure_measure" );
@@ -689,3 +799,7 @@ BENCHMARK(shared_ptr_return_measure)->Name("shared_ptr_return_measure");
689799BENCHMARK (shared_ptr_pass_measure)->Name (" shared_ptr_pass_measure" );
690800BENCHMARK (static_member_function_call_measure)->Name (" static_member_function_call_measure" );
691801BENCHMARK (derived_method_call_measure)->Name (" derived_method_call_measure" );
802+ BENCHMARK (converter_exact_type_measure)->Name (" converter_exact_type_measure" );
803+ BENCHMARK (converter_phase3_value_measure)->Name (" converter_phase3_value_measure" );
804+ BENCHMARK (converter_phase3_ref_measure)->Name (" converter_phase3_ref_measure" );
805+ BENCHMARK (converter_multi_registered_measure)->Name (" converter_multi_registered_measure" );
0 commit comments