36
36
#include <math.h>
37
37
#endif
38
38
39
+ static volatile VMSignal PikaVMSignal = {
40
+ .signal_ctrl = VM_SIGNAL_CTRL_NONE ,
41
+ .vm_cnt = 0 ,
42
+ };
43
+
44
+ VM_SIGNAL_CTRL VMSignal_getCtrl (void ) {
45
+ return PikaVMSignal .signal_ctrl ;
46
+ }
47
+
48
+ void pks_vm_exit (void ) {
49
+ PikaVMSignal .signal_ctrl = VM_SIGNAL_CTRL_EXIT ;
50
+ }
51
+
52
+ void pks_vmSignal_setCtrlElear (void ) {
53
+ PikaVMSignal .signal_ctrl = VM_SIGNAL_CTRL_NONE ;
54
+ }
55
+
39
56
/* head declare start */
40
57
static uint8_t VMState_getInputArgNum (VMState * vm );
41
58
static VMParameters * __pikaVM_runByteCodeFrameWithState (
@@ -1009,35 +1026,35 @@ static Arg* VM_instruction_handler_RUN(PikaObj* self,
1009
1026
goto exit ;
1010
1027
}
1011
1028
1012
- #if !PIKA_NANO_ENABLE
1029
+ #if !PIKA_NANO_ENABLE
1013
1030
/* support for super() */
1014
1031
if (strEqu (run_path , "super" )) {
1015
1032
run_path = _find_super_class_name (vm );
1016
1033
vm -> in_super = 1 ;
1017
1034
skip_init = 1 ;
1018
1035
}
1019
- #endif
1036
+ #endif
1020
1037
1021
1038
/* return tiny obj */
1022
1039
if (strEqu (run_path , "TinyObj" )) {
1023
1040
return_arg = arg_newMetaObj (New_TinyObj );
1024
1041
goto exit ;
1025
1042
}
1026
1043
1027
- #if !PIKA_NANO_ENABLE
1044
+ #if !PIKA_NANO_ENABLE
1028
1045
if (!skip_init && vm -> in_super ) {
1029
1046
vm -> in_super = PIKA_FALSE ;
1030
1047
obj_this = obj_getPtr (vm -> locals , _find_self_name (vm ));
1031
1048
}
1032
- #endif
1049
+ #endif
1033
1050
1034
1051
/* get method host obj from reg */
1035
1052
if (NULL == method_host && _checkLReg (run_path )) {
1036
1053
uint8_t reg_index = _getLRegIndex (run_path );
1037
1054
method_host = vm -> lreg [reg_index ];
1038
1055
}
1039
1056
1040
- #if !PIKA_NANO_ENABLE
1057
+ #if !PIKA_NANO_ENABLE
1041
1058
/* get method host obj from stack */
1042
1059
if (NULL == method_host && run_path [0 ] == '.' ) {
1043
1060
/* get method host obj from stack */
@@ -1063,7 +1080,7 @@ static Arg* VM_instruction_handler_RUN(PikaObj* self,
1063
1080
stack_pushArg (& (vm -> stack ), stack_tmp [i ]);
1064
1081
}
1065
1082
}
1066
- #endif
1083
+ #endif
1067
1084
1068
1085
/* get method host obj from self */
1069
1086
if (NULL == method_host ) {
@@ -1978,9 +1995,9 @@ static Arg* VM_instruction_handler_RIS(PikaObj* self,
1978
1995
VMState * vm ,
1979
1996
char * data ,
1980
1997
Arg * arg_ret_reg ) {
1981
- #if PIKA_NANO_ENABLE
1998
+ #if PIKA_NANO_ENABLE
1982
1999
return NULL ;
1983
- #endif
2000
+ #endif
1984
2001
Arg * err_arg = stack_popArg_alloc (& (vm -> stack ));
1985
2002
PIKA_RES err = (PIKA_RES )arg_getInt (err_arg );
1986
2003
VMState_setErrorCode (vm , err );
@@ -1992,9 +2009,9 @@ static Arg* VM_instruction_handler_ASS(PikaObj* self,
1992
2009
VMState * vm ,
1993
2010
char * data ,
1994
2011
Arg * arg_ret_reg ) {
1995
- #if PIKA_NANO_ENABLE
2012
+ #if PIKA_NANO_ENABLE
1996
2013
return NULL ;
1997
- #endif
2014
+ #endif
1998
2015
arg_newReg (reg1 , PIKA_ARG_BUFF_SIZE );
1999
2016
arg_newReg (reg2 , PIKA_ARG_BUFF_SIZE );
2000
2017
Arg * arg1 = NULL ;
@@ -2169,7 +2186,7 @@ static int pikaVM_runInstructUnit(PikaObj* self,
2169
2186
/* raise jmp */
2170
2187
if (vm -> run_state -> try_state == TRY_STATE_INNER ) {
2171
2188
vm -> jmp = VM_JMP_RAISE ;
2172
- }else {
2189
+ } else {
2173
2190
/* exit */
2174
2191
vm -> jmp = VM_JMP_EXIT ;
2175
2192
}
@@ -2195,8 +2212,8 @@ static int pikaVM_runInstructUnit(PikaObj* self,
2195
2212
pc_next = vm -> pc + VMState_getAddrOffsetOfContinue (vm );
2196
2213
goto exit ;
2197
2214
}
2198
- /* raise */
2199
- #if !PIKA_NANO_ENABLE
2215
+ /* raise */
2216
+ #if !PIKA_NANO_ENABLE
2200
2217
if (VM_JMP_RAISE == vm -> jmp ) {
2201
2218
int offset = VMState_getAddrOffsetOfRaise (vm );
2202
2219
if (0 == offset ) {
@@ -2208,7 +2225,7 @@ static int pikaVM_runInstructUnit(PikaObj* self,
2208
2225
pc_next = vm -> pc + offset ;
2209
2226
goto exit ;
2210
2227
}
2211
- #endif
2228
+ #endif
2212
2229
/* static jmp */
2213
2230
if (vm -> jmp != 0 ) {
2214
2231
pc_next = vm -> pc + VMState_getAddrOffsetFromJmp (vm );
@@ -2668,7 +2685,14 @@ static VMParameters* __pikaVM_runByteCodeFrameWithState(
2668
2685
};
2669
2686
stack_init (& (vm .stack ));
2670
2687
VMState_initReg (& vm );
2688
+ if (PikaVMSignal .vm_cnt == 0 ) {
2689
+ pks_vmSignal_setCtrlElear ();
2690
+ }
2691
+ PikaVMSignal .vm_cnt ++ ;
2671
2692
while (vm .pc < size ) {
2693
+ if (VMSignal_getCtrl () == VM_SIGNAL_CTRL_EXIT ) {
2694
+ vm .pc = VM_PC_EXIT ;
2695
+ }
2672
2696
if (vm .pc == VM_PC_EXIT ) {
2673
2697
break ;
2674
2698
}
@@ -2721,6 +2745,7 @@ static VMParameters* __pikaVM_runByteCodeFrameWithState(
2721
2745
}
2722
2746
VMState_solveUnusedStack (& vm );
2723
2747
stack_deinit (& (vm .stack ));
2748
+ PikaVMSignal .vm_cnt -- ;
2724
2749
return locals ;
2725
2750
}
2726
2751
0 commit comments