@@ -879,37 +879,53 @@ void release_args(Parameter* args, size_t nargs) {
879
879
// return (!is_direct && wrap->fFaceptr.fGeneric) || (is_direct && wrap->fFaceptr.fDirect);
880
880
// }
881
881
882
- static inline
883
- bool WrapperCall (Cppyy::TCppMethod_t method, size_t nargs, void * args_, void * self, void * result)
884
- {
885
- Parameter* args = (Parameter*)args_;
886
- bool is_direct = nargs & DIRECT_CALL;
887
- nargs = CALL_NARGS (nargs);
888
-
889
- // if (!is_ready(wrap, is_direct))
890
- // return false; // happens with compilation error
891
-
892
- if (Cpp::JitCall JC = Cpp::MakeFunctionCallable (method)) {
893
- bool runRelease = false ;
894
- // const auto& fgen = /* is_direct ? faceptr.fDirect : */ faceptr;
895
- if (nargs <= SMALL_ARGS_N) {
896
- void * smallbuf[SMALL_ARGS_N];
897
- if (nargs) runRelease = copy_args (args, nargs, smallbuf);
898
- // CLING_CATCH_UNCAUGHT_
899
- JC.Invoke (result, {smallbuf, nargs}, self);
900
- // _CLING_CATCH_UNCAUGHT
901
- } else {
902
- std::vector<void *> buf (nargs);
903
- runRelease = copy_args (args, nargs, buf.data ());
904
- // CLING_CATCH_UNCAUGHT_
905
- JC.Invoke (result, {buf.data (), nargs}, self);
906
- // _CLING_CATCH_UNCAUGHT
907
- }
908
- if (runRelease) release_args (args, nargs);
909
- return true ;
910
- }
882
+ static inline bool WrapperCall (Cppyy::TCppMethod_t method, size_t nargs,
883
+ void * args_, void * self, void * result) {
884
+ Parameter* args = (Parameter*)args_;
885
+ bool is_direct = nargs & DIRECT_CALL;
886
+ nargs = CALL_NARGS (nargs);
887
+
888
+ // if (!is_ready(wrap, is_direct))
889
+ // return false; // happens with compilation error
890
+
891
+ Cpp::JitCall JC = Cpp::MakeFunctionCallable (method);
911
892
893
+ if (!JC)
912
894
return false ;
895
+
896
+ bool runRelease = false ;
897
+ // const auto& fgen = /* is_direct ? faceptr.fDirect : */ faceptr;
898
+
899
+ auto invokeHelper = [&](auto invoker) {
900
+ if (nargs <= SMALL_ARGS_N) {
901
+ void * smallbuf[SMALL_ARGS_N];
902
+ if (nargs)
903
+ runRelease = copy_args (args, nargs, smallbuf);
904
+ // CLING_CATCH_UNCAUGHT_
905
+ invoker (smallbuf, nargs);
906
+ // _CLING_CATCH_UNCAUGHT
907
+ } else {
908
+ std::vector<void *> buf (nargs);
909
+ runRelease = copy_args (args, nargs, buf.data ());
910
+ // CLING_CATCH_UNCAUGHT_
911
+ invoker (buf.data (), nargs);
912
+ // _CLING_CATCH_UNCAUGHT
913
+ }
914
+ };
915
+
916
+ if (JC.getKind () == Cpp::JitCall::kGenericCall ) {
917
+ invokeHelper ([&](void ** buf, size_t count) {
918
+ JC.Invoke (result, {buf, count}, self);
919
+ });
920
+ } else if (JC.getKind () == Cpp::JitCall::kConstructorCall ) {
921
+ invokeHelper ([&](void ** buf, size_t count) {
922
+ JC.InvokeConstructor (result, 1UL , {buf, count}, self);
923
+ });
924
+ }
925
+
926
+ if (runRelease)
927
+ release_args (args, nargs);
928
+ return true ;
913
929
}
914
930
915
931
template <typename T>
0 commit comments