Skip to content

Commit 5086680

Browse files
committed
feat(DaedalusVm): add OverrideFunction APIs
1 parent 6c8d9a6 commit 5086680

File tree

6 files changed

+307
-0
lines changed

6 files changed

+307
-0
lines changed

ZenKit/DaedalusVm.cs

Lines changed: 302 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,297 @@ public void RegisterExternal<TP0, TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9>(s
641641
cb(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
642642
});
643643
}
644+
645+
public void OverrideFunction<TR>(string name, ExternalFunc<TR> cb)
646+
{
647+
OverrideFunctionUnsafe(name, vm => vm.Push(cb()));
648+
}
649+
650+
public void OverrideFunction<TR, TP0>(string name, ExternalFunc<TR, TP0> cb)
651+
{
652+
OverrideFunctionUnsafe(name, vm =>
653+
{
654+
var p0 = vm.Pop<TP0>();
655+
vm.Push(cb(p0));
656+
});
657+
}
658+
659+
public void OverrideFunction<TR, TP0, TP1>(string name, ExternalFunc<TR, TP0, TP1> cb)
660+
{
661+
OverrideFunctionUnsafe(name, vm =>
662+
{
663+
var p1 = vm.Pop<TP1>();
664+
var p0 = vm.Pop<TP0>();
665+
vm.Push(cb(p0, p1));
666+
});
667+
}
668+
669+
public void OverrideFunction<TR, TP0, TP1, TP2>(string name, ExternalFunc<TR, TP0, TP1, TP2> cb)
670+
{
671+
OverrideFunctionUnsafe(name, vm =>
672+
{
673+
var p2 = vm.Pop<TP2>();
674+
var p1 = vm.Pop<TP1>();
675+
var p0 = vm.Pop<TP0>();
676+
vm.Push(cb(p0, p1, p2));
677+
});
678+
}
679+
680+
public void OverrideFunction<TR, TP0, TP1, TP2, TP3>(string name, ExternalFunc<TR, TP0, TP1, TP2, TP3> cb)
681+
{
682+
OverrideFunctionUnsafe(name, vm =>
683+
{
684+
var p3 = vm.Pop<TP3>();
685+
var p2 = vm.Pop<TP2>();
686+
var p1 = vm.Pop<TP1>();
687+
var p0 = vm.Pop<TP0>();
688+
vm.Push(cb(p0, p1, p2, p3));
689+
});
690+
}
691+
692+
public void OverrideFunction<TR, TP0, TP1, TP2, TP3, TP4>(string name,
693+
ExternalFunc<TR, TP0, TP1, TP2, TP3, TP4> cb)
694+
{
695+
OverrideFunctionUnsafe(name, vm =>
696+
{
697+
var p4 = vm.Pop<TP4>();
698+
var p3 = vm.Pop<TP3>();
699+
var p2 = vm.Pop<TP2>();
700+
var p1 = vm.Pop<TP1>();
701+
var p0 = vm.Pop<TP0>();
702+
vm.Push(cb(p0, p1, p2, p3, p4));
703+
});
704+
}
705+
706+
public void OverrideFunction<TR, TP0, TP1, TP2, TP3, TP4, TP5>(string name,
707+
ExternalFunc<TR, TP0, TP1, TP2, TP3, TP4, TP5> cb)
708+
{
709+
OverrideFunctionUnsafe(name, vm =>
710+
{
711+
var p5 = vm.Pop<TP5>();
712+
var p4 = vm.Pop<TP4>();
713+
var p3 = vm.Pop<TP3>();
714+
var p2 = vm.Pop<TP2>();
715+
var p1 = vm.Pop<TP1>();
716+
var p0 = vm.Pop<TP0>();
717+
vm.Push(cb(p0, p1, p2, p3, p4, p5));
718+
});
719+
}
720+
721+
public void OverrideFunction<TR, TP0, TP1, TP2, TP3, TP4, TP5, TP6>(string name,
722+
ExternalFunc<TR, TP0, TP1, TP2, TP3, TP4, TP5, TP6> cb)
723+
{
724+
OverrideFunctionUnsafe(name, vm =>
725+
{
726+
var p6 = vm.Pop<TP6>();
727+
var p5 = vm.Pop<TP5>();
728+
var p4 = vm.Pop<TP4>();
729+
var p3 = vm.Pop<TP3>();
730+
var p2 = vm.Pop<TP2>();
731+
var p1 = vm.Pop<TP1>();
732+
var p0 = vm.Pop<TP0>();
733+
vm.Push(cb(p0, p1, p2, p3, p4, p5, p6));
734+
});
735+
}
736+
737+
public void OverrideFunction<TR, TP0, TP1, TP2, TP3, TP4, TP5, TP6, TP7>(string name,
738+
ExternalFunc<TR, TP0, TP1, TP2, TP3, TP4, TP5, TP6, TP7> cb)
739+
{
740+
OverrideFunctionUnsafe(name, vm =>
741+
{
742+
var p7 = vm.Pop<TP7>();
743+
var p6 = vm.Pop<TP6>();
744+
var p5 = vm.Pop<TP5>();
745+
var p4 = vm.Pop<TP4>();
746+
var p3 = vm.Pop<TP3>();
747+
var p2 = vm.Pop<TP2>();
748+
var p1 = vm.Pop<TP1>();
749+
var p0 = vm.Pop<TP0>();
750+
vm.Push(cb(p0, p1, p2, p3, p4, p5, p6, p7));
751+
});
752+
}
753+
754+
public void OverrideFunction<TR, TP0, TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8>(string name,
755+
ExternalFunc<TR, TP0, TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8> cb)
756+
{
757+
OverrideFunctionUnsafe(name, vm =>
758+
{
759+
var p8 = vm.Pop<TP8>();
760+
var p7 = vm.Pop<TP7>();
761+
var p6 = vm.Pop<TP6>();
762+
var p5 = vm.Pop<TP5>();
763+
var p4 = vm.Pop<TP4>();
764+
var p3 = vm.Pop<TP3>();
765+
var p2 = vm.Pop<TP2>();
766+
var p1 = vm.Pop<TP1>();
767+
var p0 = vm.Pop<TP0>();
768+
vm.Push(cb(p0, p1, p2, p3, p4, p5, p6, p7, p8));
769+
});
770+
}
771+
772+
public void OverrideFunction<TR, TP0, TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9>(string name,
773+
ExternalFunc<TR, TP0, TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9> cb)
774+
{
775+
OverrideFunctionUnsafe(name, vm =>
776+
{
777+
var p9 = vm.Pop<TP9>();
778+
var p8 = vm.Pop<TP8>();
779+
var p7 = vm.Pop<TP7>();
780+
var p6 = vm.Pop<TP6>();
781+
var p5 = vm.Pop<TP5>();
782+
var p4 = vm.Pop<TP4>();
783+
var p3 = vm.Pop<TP3>();
784+
var p2 = vm.Pop<TP2>();
785+
var p1 = vm.Pop<TP1>();
786+
var p0 = vm.Pop<TP0>();
787+
vm.Push(cb(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));
788+
});
789+
}
790+
791+
public void OverrideFunction(string name, ExternalFuncV cb)
792+
{
793+
OverrideFunctionUnsafe(name, _ => cb());
794+
}
795+
796+
public void OverrideFunction<TP0>(string name, ExternalFuncV<TP0> cb)
797+
{
798+
OverrideFunctionUnsafe(name, vm =>
799+
{
800+
var p0 = vm.Pop<TP0>();
801+
cb(p0);
802+
});
803+
}
804+
805+
public void OverrideFunction<TP0, TP1>(string name, ExternalFuncV<TP0, TP1> cb)
806+
{
807+
OverrideFunctionUnsafe(name, vm =>
808+
{
809+
var p1 = vm.Pop<TP1>();
810+
var p0 = vm.Pop<TP0>();
811+
cb(p0, p1);
812+
});
813+
}
814+
815+
public void OverrideFunction<TP0, TP1, TP2>(string name, ExternalFuncV<TP0, TP1, TP2> cb)
816+
{
817+
OverrideFunctionUnsafe(name, vm =>
818+
{
819+
var p2 = vm.Pop<TP2>();
820+
var p1 = vm.Pop<TP1>();
821+
var p0 = vm.Pop<TP0>();
822+
cb(p0, p1, p2);
823+
});
824+
}
825+
826+
public void OverrideFunction<TP0, TP1, TP2, TP3>(string name, ExternalFuncV<TP0, TP1, TP2, TP3> cb)
827+
{
828+
OverrideFunctionUnsafe(name, vm =>
829+
{
830+
var p3 = vm.Pop<TP3>();
831+
var p2 = vm.Pop<TP2>();
832+
var p1 = vm.Pop<TP1>();
833+
var p0 = vm.Pop<TP0>();
834+
cb(p0, p1, p2, p3);
835+
});
836+
}
837+
838+
public void OverrideFunction<TP0, TP1, TP2, TP3, TP4>(string name, ExternalFuncV<TP0, TP1, TP2, TP3, TP4> cb)
839+
{
840+
OverrideFunctionUnsafe(name, vm =>
841+
{
842+
var p4 = vm.Pop<TP4>();
843+
var p3 = vm.Pop<TP3>();
844+
var p2 = vm.Pop<TP2>();
845+
var p1 = vm.Pop<TP1>();
846+
var p0 = vm.Pop<TP0>();
847+
cb(p0, p1, p2, p3, p4);
848+
});
849+
}
850+
851+
public void OverrideFunction<TP0, TP1, TP2, TP3, TP4, TP5>(string name,
852+
ExternalFuncV<TP0, TP1, TP2, TP3, TP4, TP5> cb)
853+
{
854+
OverrideFunctionUnsafe(name, vm =>
855+
{
856+
var p5 = vm.Pop<TP5>();
857+
var p4 = vm.Pop<TP4>();
858+
var p3 = vm.Pop<TP3>();
859+
var p2 = vm.Pop<TP2>();
860+
var p1 = vm.Pop<TP1>();
861+
var p0 = vm.Pop<TP0>();
862+
cb(p0, p1, p2, p3, p4, p5);
863+
});
864+
}
865+
866+
public void OverrideFunction<TP0, TP1, TP2, TP3, TP4, TP5, TP6>(string name,
867+
ExternalFuncV<TP0, TP1, TP2, TP3, TP4, TP5, TP6> cb)
868+
{
869+
OverrideFunctionUnsafe(name, vm =>
870+
{
871+
var p6 = vm.Pop<TP6>();
872+
var p5 = vm.Pop<TP5>();
873+
var p4 = vm.Pop<TP4>();
874+
var p3 = vm.Pop<TP3>();
875+
var p2 = vm.Pop<TP2>();
876+
var p1 = vm.Pop<TP1>();
877+
var p0 = vm.Pop<TP0>();
878+
cb(p0, p1, p2, p3, p4, p5, p6);
879+
});
880+
}
881+
882+
public void OverrideFunction<TP0, TP1, TP2, TP3, TP4, TP5, TP6, TP7>(string name,
883+
ExternalFuncV<TP0, TP1, TP2, TP3, TP4, TP5, TP6, TP7> cb)
884+
{
885+
OverrideFunctionUnsafe(name, vm =>
886+
{
887+
var p7 = vm.Pop<TP7>();
888+
var p6 = vm.Pop<TP6>();
889+
var p5 = vm.Pop<TP5>();
890+
var p4 = vm.Pop<TP4>();
891+
var p3 = vm.Pop<TP3>();
892+
var p2 = vm.Pop<TP2>();
893+
var p1 = vm.Pop<TP1>();
894+
var p0 = vm.Pop<TP0>();
895+
cb(p0, p1, p2, p3, p4, p5, p6, p7);
896+
});
897+
}
898+
899+
public void OverrideFunction<TP0, TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8>(string name,
900+
ExternalFuncV<TP0, TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8> cb)
901+
{
902+
OverrideFunctionUnsafe(name, vm =>
903+
{
904+
var p8 = vm.Pop<TP8>();
905+
var p7 = vm.Pop<TP7>();
906+
var p6 = vm.Pop<TP6>();
907+
var p5 = vm.Pop<TP5>();
908+
var p4 = vm.Pop<TP4>();
909+
var p3 = vm.Pop<TP3>();
910+
var p2 = vm.Pop<TP2>();
911+
var p1 = vm.Pop<TP1>();
912+
var p0 = vm.Pop<TP0>();
913+
cb(p0, p1, p2, p3, p4, p5, p6, p7, p8);
914+
});
915+
}
916+
917+
public void OverrideFunction<TP0, TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9>(string name,
918+
ExternalFuncV<TP0, TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9> cb)
919+
{
920+
OverrideFunctionUnsafe(name, vm =>
921+
{
922+
var p9 = vm.Pop<TP9>();
923+
var p8 = vm.Pop<TP8>();
924+
var p7 = vm.Pop<TP7>();
925+
var p6 = vm.Pop<TP6>();
926+
var p5 = vm.Pop<TP5>();
927+
var p4 = vm.Pop<TP4>();
928+
var p3 = vm.Pop<TP3>();
929+
var p2 = vm.Pop<TP2>();
930+
var p1 = vm.Pop<TP1>();
931+
var p0 = vm.Pop<TP0>();
932+
cb(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
933+
});
934+
}
644935

645936
private void Push<T>(T value)
646937
{
@@ -704,6 +995,17 @@ private void RegisterExternalUnsafe(DaedalusSymbol sym, ExternalFunc cb)
704995
Native.ZkDaedalusVm_registerExternal(Handle, sym.Handle, _nativeExternalCallback,
705996
GCHandle.ToIntPtr(gcHandle));
706997
}
998+
999+
private void OverrideFunctionUnsafe(string name, ExternalFunc cb)
1000+
{
1001+
var sym = GetSymbolByName(name);
1002+
if (sym == null) throw new Exception("Symbol not found");
1003+
1004+
var gcHandle = GCHandle.Alloc(cb);
1005+
_externalCallbacks.Add(gcHandle);
1006+
Native.ZkDaedalusVm_overrideFunction(Handle, name, _nativeExternalCallback,
1007+
GCHandle.ToIntPtr(gcHandle));
1008+
}
7071009

7081010
[MonoPInvokeCallback]
7091011
private static void _nativeExternalCallbackHandler(IntPtr ctx, UIntPtr vm)

ZenKit/Native.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4300,6 +4300,11 @@ public static extern void ZkDaedalusScript_enumerateInstanceSymbols(UIntPtr slf,
43004300
public static extern void ZkDaedalusVm_registerExternal(UIntPtr slf, UIntPtr sym,
43014301
ZkDaedalusVmExternalCallback cb,
43024302
IntPtr ctx);
4303+
4304+
[DllImport(DllName)]
4305+
public static extern void ZkDaedalusVm_overrideFunction(UIntPtr slf, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(GothicStringMarshaller))] string sym,
4306+
ZkDaedalusVmExternalCallback cb,
4307+
IntPtr ctx);
43034308

43044309
[DllImport(DllName)]
43054310
public static extern void ZkDaedalusVm_registerExternalDefault(UIntPtr slf,
-79.4 KB
Binary file not shown.
-88.2 KB
Binary file not shown.
59.9 KB
Binary file not shown.
-70.9 KB
Binary file not shown.

0 commit comments

Comments
 (0)