@@ -320,9 +320,7 @@ function DiffEqBase.ODEFunction{iip, specialize}(sys::AbstractODESystem,
320320        expression_module =  eval_module, checkbounds =  checkbounds,
321321        kwargs... )
322322    f_oop, f_iip =  eval_or_rgf .(f_gen; eval_expression, eval_module)
323- 
324-     f (u, p, t) =  f_oop (u, p, t)
325-     f (du, u, p, t) =  f_iip (du, u, p, t)
323+     f =  GeneratedFunctionWrapper {(2, 3, is_split(sys))} (f_oop, f_iip)
326324
327325    if  specialize ===  SciMLBase. FunctionWrapperSpecialize &&  iip
328326        if  u0 ===  nothing  ||  p ===  nothing  ||  t ===  nothing 
@@ -338,10 +336,7 @@ function DiffEqBase.ODEFunction{iip, specialize}(sys::AbstractODESystem,
338336            expression_module =  eval_module,
339337            checkbounds =  checkbounds, kwargs... )
340338        tgrad_oop, tgrad_iip =  eval_or_rgf .(tgrad_gen; eval_expression, eval_module)
341- 
342-         ___tgrad (u, p, t) =  tgrad_oop (u, p, t)
343-         ___tgrad (J, u, p, t) =  tgrad_iip (J, u, p, t)
344-         _tgrad =  ___tgrad
339+         _tgrad =  GeneratedFunctionWrapper {(2, 3, is_split(sys))} (tgrad_oop, tgrad_iip)
345340    else 
346341        _tgrad =  nothing 
347342    end 
@@ -354,8 +349,7 @@ function DiffEqBase.ODEFunction{iip, specialize}(sys::AbstractODESystem,
354349            checkbounds =  checkbounds, kwargs... )
355350        jac_oop, jac_iip =  eval_or_rgf .(jac_gen; eval_expression, eval_module)
356351
357-         _jac (u, p, t) =  jac_oop (u, p, t)
358-         _jac (J, u, p, t) =  jac_iip (J, u, p, t)
352+         _jac =  GeneratedFunctionWrapper {(2, 3, is_split(sys))} (jac_oop, jac_iip)
359353    else 
360354        _jac =  nothing 
361355    end 
@@ -435,8 +429,7 @@ function DiffEqBase.DAEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys)
435429        expression_module =  eval_module, checkbounds =  checkbounds,
436430        kwargs... )
437431    f_oop, f_iip =  eval_or_rgf .(f_gen; eval_expression, eval_module)
438-     f (du, u, p, t) =  f_oop (du, u, p, t)
439-     f (out, du, u, p, t) =  f_iip (out, du, u, p, t)
432+     f =  GeneratedFunctionWrapper {(3, 4, is_split(sys))} (f_oop, f_iip)
440433
441434    if  jac
442435        jac_gen =  generate_dae_jacobian (sys, dvs, ps;
@@ -446,8 +439,7 @@ function DiffEqBase.DAEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys)
446439            checkbounds =  checkbounds, kwargs... )
447440        jac_oop, jac_iip =  eval_or_rgf .(jac_gen; eval_expression, eval_module)
448441
449-         _jac (du, u, p, ˍ₋gamma, t) =  jac_oop (du, u, p, ˍ₋gamma, t)
450-         _jac (J, du, u, p, ˍ₋gamma, t) =  jac_iip (J, du, u, p, ˍ₋gamma, t)
442+         _jac =  GeneratedFunctionWrapper {(3, 5, is_split(sys))} (jac_oop, jac_iip)
451443    else 
452444        _jac =  nothing 
453445    end 
@@ -496,8 +488,7 @@ function DiffEqBase.DDEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys)
496488        expression_module =  eval_module, checkbounds =  checkbounds,
497489        kwargs... )
498490    f_oop, f_iip =  eval_or_rgf .(f_gen; eval_expression, eval_module)
499-     f (u, h, p, t) =  f_oop (u, h, p, t)
500-     f (du, u, h, p, t) =  f_iip (du, u, h, p, t)
491+     f =  GeneratedFunctionWrapper {(3, 4, is_split(sys))} (f_oop, f_iip)
501492
502493    DDEFunction {iip} (f; sys =  sys, initialization_data)
503494end 
@@ -521,14 +512,12 @@ function DiffEqBase.SDDEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys
521512        expression_module =  eval_module, checkbounds =  checkbounds,
522513        kwargs... )
523514    f_oop, f_iip =  eval_or_rgf .(f_gen; eval_expression, eval_module)
524-     f (u, h, p, t) =  f_oop (u, h, p, t)
525-     f (du, u, h, p, t) =  f_iip (du, u, h, p, t)
515+     f =  GeneratedFunctionWrapper {(3, 4, is_split(sys))} (f_oop, f_iip)
526516
527517    g_gen =  generate_diffusion_function (sys, dvs, ps; expression =  Val{true },
528518        isdde =  true , kwargs... )
529519    g_oop, g_iip =  eval_or_rgf .(g_gen; eval_expression, eval_module)
530-     g (u, h, p, t) =  g_oop (u, h, p, t)
531-     g (du, u, h, p, t) =  g_iip (du, u, h, p, t)
520+     g =  GeneratedFunctionWrapper {(3, 4, is_split(sys))} (g_oop, g_iip)
532521
533522    SDDEFunction {iip} (f, g; sys =  sys, initialization_data)
534523end 
@@ -549,13 +538,6 @@ variable and parameter vectors, respectively.
549538""" 
550539struct  ODEFunctionExpr{iip, specialize} end 
551540
552- struct  ODEFunctionClosure{O, I} <:  Function 
553-     f_oop:: O 
554-     f_iip:: I 
555- end 
556- (f:: ODEFunctionClosure )(u, p, t) =  f. f_oop (u, p, t)
557- (f:: ODEFunctionClosure )(du, u, p, t) =  f. f_iip (du, u, p, t)
558- 
559541function  ODEFunctionExpr {iip, specialize} (sys:: AbstractODESystem , dvs =  unknowns (sys),
560542        ps =  parameters (sys), u0 =  nothing ;
561543        version =  nothing , tgrad =  false ,
@@ -572,13 +554,14 @@ function ODEFunctionExpr{iip, specialize}(sys::AbstractODESystem, dvs = unknowns
572554    f_oop, f_iip =  generate_function (sys, dvs, ps; expression =  Val{true }, kwargs... )
573555
574556    fsym =  gensym (:f )
575-     _f =  :($ fsym =  $ ODEFunctionClosure ($ f_oop, $ f_iip))
557+     _f =  :($ fsym =  $ (GeneratedFunctionWrapper{( 2 ,  3 ,  is_split (sys))}) ($ f_oop, $ f_iip))
576558    tgradsym =  gensym (:tgrad )
577559    if  tgrad
578560        tgrad_oop, tgrad_iip =  generate_tgrad (sys, dvs, ps;
579561            simplify =  simplify,
580562            expression =  Val{true }, kwargs... )
581-         _tgrad =  :($ tgradsym =  $ ODEFunctionClosure ($ tgrad_oop, $ tgrad_iip))
563+         _tgrad =  :($ tgradsym =  $ (GeneratedFunctionWrapper{(2 , 3 , is_split (sys))})(
564+             $ tgrad_oop, $ tgrad_iip))
582565    else 
583566        _tgrad =  :($ tgradsym =  nothing )
584567    end 
@@ -588,7 +571,8 @@ function ODEFunctionExpr{iip, specialize}(sys::AbstractODESystem, dvs = unknowns
588571        jac_oop, jac_iip =  generate_jacobian (sys, dvs, ps;
589572            sparse =  sparse, simplify =  simplify,
590573            expression =  Val{true }, kwargs... )
591-         _jac =  :($ jacsym =  $ ODEFunctionClosure ($ jac_oop, $ jac_iip))
574+         _jac =  :($ jacsym =  $ (GeneratedFunctionWrapper{(2 , 3 , is_split (sys))})(
575+             $ jac_oop, $ jac_iip))
592576    else 
593577        _jac =  :($ jacsym =  nothing )
594578    end 
@@ -647,13 +631,6 @@ variable and parameter vectors, respectively.
647631""" 
648632struct  DAEFunctionExpr{iip} end 
649633
650- struct  DAEFunctionClosure{O, I} <:  Function 
651-     f_oop:: O 
652-     f_iip:: I 
653- end 
654- (f:: DAEFunctionClosure )(du, u, p, t) =  f. f_oop (du, u, p, t)
655- (f:: DAEFunctionClosure )(out, du, u, p, t) =  f. f_iip (out, du, u, p, t)
656- 
657634function  DAEFunctionExpr {iip} (sys:: AbstractODESystem , dvs =  unknowns (sys),
658635        ps =  parameters (sys), u0 =  nothing ;
659636        version =  nothing , tgrad =  false ,
@@ -667,7 +644,7 @@ function DAEFunctionExpr{iip}(sys::AbstractODESystem, dvs = unknowns(sys),
667644    f_oop, f_iip =  generate_function (sys, dvs, ps; expression =  Val{true },
668645        implicit_dae =  true , kwargs... )
669646    fsym =  gensym (:f )
670-     _f =  :($ fsym =  $ DAEFunctionClosure ($ f_oop, $ f_iip))
647+     _f =  :($ fsym =  $ (GeneratedFunctionWrapper{( 3 ,  4 ,  is_split (sys))}) ($ f_oop, $ f_iip))
671648    ex =  quote 
672649        $ _f
673650        ODEFunction {$iip} ($ fsym)
@@ -708,6 +685,7 @@ function SymbolicTstops(
708685        expression =  Val{true },
709686        p_start =  1 , p_end =  length (rps), add_observed =  false , force_SA =  true )
710687    tstops =  eval_or_rgf (tstops; eval_expression, eval_module)
688+     tstops =  GeneratedFunctionWrapper {(1, 3, is_split(sys))} (tstops, nothing )
711689    return  SymbolicTstops (tstops)
712690end 
713691
0 commit comments