@@ -436,6 +436,10 @@ void pika_vmSignal_setCtrlClear(void) {
436436
437437/* head declare start */
438438static uint32_t PikaVMFrame_getInputArgNum (PikaVMFrame * vm );
439+ static Arg * VM_instruction_handler_RUN (PikaObj * self ,
440+ PikaVMFrame * vm ,
441+ char * data ,
442+ Arg * arg_ret_reg );
439443static VMParameters * __pikaVM_runByteCodeFrameWithState (
440444 PikaObj * self ,
441445 VMParameters * locals ,
@@ -468,52 +472,54 @@ static void PikaVMFrame_setErrorCode(PikaVMFrame* vm, int8_t error_code) {
468472#if PIKA_SYNTAX_EXCEPTION_ENABLE
469473Arg * _type (Arg * arg );
470474
475+ static const Hash exception_hashes [] = {
476+ 1142003074 , 1346345301 , 984971860 , 1581723060 , 675810883 ,
477+ 2000609318 , 603406554 , 1802197452 , 366528582 , 351017945 ,
478+ 1985385347 , 650622313 , 489249939 , 1035868745 , 799477063 ,
479+ 823649752 , 247530422 , 838371290 , 1538545476 , 1777242020 ,
480+ 2134842892 , 1950608113 , 742300048 , 1836878090 , 746628451 ,
481+ 1016945095 , 282021160 , 196451025 , 1431286868 , 173529092 ,
482+ 1299431183 , 1326281044 , 1956727606 ,
483+ };
484+
485+ static const uint8_t exception_types [] = {
486+ PIKA_EXCEPTION_MODULE_NOT_FOUND ,
487+ PIKA_EXCEPTION_UNBOUND_LOCAL ,
488+ PIKA_EXCEPTION_ZERO_DIVISION ,
489+ PIKA_EXCEPTION_NOT_IMPLEMENTED ,
490+ PIKA_EXCEPTION_KEYBOARD_INTERRUPT ,
491+ PIKA_EXCEPTION_GENERATOR_EXIT ,
492+ PIKA_EXCEPTION_STOP_ITERATION ,
493+ PIKA_EXCEPTION_INDENTATION ,
494+ PIKA_EXCEPTION_TAB ,
495+ PIKA_EXCEPTION_ARITHMETIC ,
496+ PIKA_EXCEPTION_OVERFLOW ,
497+ PIKA_EXCEPTION_RECURSION ,
498+ PIKA_EXCEPTION_RUNTIME ,
499+ PIKA_EXCEPTION_LOOKUP ,
500+ PIKA_EXCEPTION_INDEX ,
501+ PIKA_EXCEPTION_KEY ,
502+ PIKA_EXCEPTION_UNICODE ,
503+ PIKA_EXCEPTION_UNICODE ,
504+ PIKA_EXCEPTION_UNICODE ,
505+ PIKA_EXCEPTION_UNICODE ,
506+ PIKA_EXCEPTION_VALUE ,
507+ PIKA_EXCEPTION_TYPE ,
508+ PIKA_EXCEPTION_NAME ,
509+ PIKA_EXCEPTION_IMPORT ,
510+ PIKA_EXCEPTION_ATTRIBUTE ,
511+ PIKA_EXCEPTION_ASSERTION ,
512+ PIKA_EXCEPTION_MEMORY ,
513+ PIKA_EXCEPTION_OS ,
514+ PIKA_EXCEPTION_SYSTEM ,
515+ PIKA_EXCEPTION_SYSTEM_EXIT ,
516+ PIKA_EXCEPTION_BASE ,
517+ PIKA_EXCEPTION_EXCEPTION ,
518+ PIKA_EXCEPTION_SYNTAX ,
519+ };
520+
471521PIKA_EXCEPTION_OPTIMIZE_SIZE static PikaExceptionType _exceptionTypeFromName (
472522 char * name ) {
473- static const Hash exception_hashes [] = {
474- 1142003074 , 1346345301 , 984971860 , 1581723060 , 675810883 ,
475- 2000609318 , 603406554 , 1802197452 , 366528582 , 351017945 ,
476- 1985385347 , 650622313 , 489249939 , 1035868745 , 799477063 ,
477- 823649752 , 247530422 , 838371290 , 1538545476 , 1777242020 ,
478- 2134842892 , 1950608113 , 742300048 , 1836878090 , 746628451 ,
479- 1016945095 , 282021160 , 196451025 , 1431286868 , 173529092 ,
480- 1299431183 , 1326281044 , 1956727606 ,
481- };
482- static const uint8_t exception_types [] = {
483- PIKA_EXCEPTION_MODULE_NOT_FOUND ,
484- PIKA_EXCEPTION_UNBOUND_LOCAL ,
485- PIKA_EXCEPTION_ZERO_DIVISION ,
486- PIKA_EXCEPTION_NOT_IMPLEMENTED ,
487- PIKA_EXCEPTION_KEYBOARD_INTERRUPT ,
488- PIKA_EXCEPTION_GENERATOR_EXIT ,
489- PIKA_EXCEPTION_STOP_ITERATION ,
490- PIKA_EXCEPTION_INDENTATION ,
491- PIKA_EXCEPTION_TAB ,
492- PIKA_EXCEPTION_ARITHMETIC ,
493- PIKA_EXCEPTION_OVERFLOW ,
494- PIKA_EXCEPTION_RECURSION ,
495- PIKA_EXCEPTION_RUNTIME ,
496- PIKA_EXCEPTION_LOOKUP ,
497- PIKA_EXCEPTION_INDEX ,
498- PIKA_EXCEPTION_KEY ,
499- PIKA_EXCEPTION_UNICODE ,
500- PIKA_EXCEPTION_UNICODE ,
501- PIKA_EXCEPTION_UNICODE ,
502- PIKA_EXCEPTION_UNICODE ,
503- PIKA_EXCEPTION_VALUE ,
504- PIKA_EXCEPTION_TYPE ,
505- PIKA_EXCEPTION_NAME ,
506- PIKA_EXCEPTION_IMPORT ,
507- PIKA_EXCEPTION_ATTRIBUTE ,
508- PIKA_EXCEPTION_ASSERTION ,
509- PIKA_EXCEPTION_MEMORY ,
510- PIKA_EXCEPTION_OS ,
511- PIKA_EXCEPTION_SYSTEM ,
512- PIKA_EXCEPTION_SYSTEM_EXIT ,
513- PIKA_EXCEPTION_BASE ,
514- PIKA_EXCEPTION_EXCEPTION ,
515- PIKA_EXCEPTION_SYNTAX ,
516- };
517523 if (NULL == name ) {
518524 return PIKA_EXCEPTION_NONE ;
519525 }
@@ -547,7 +553,7 @@ void PikaVMFrame_setSysOut(PikaVMFrame* vm, char* fmt, ...) {
547553 if (vm -> error .code == PIKA_RES_OK ) {
548554 vm -> error .code = PIKA_RES_ERR_RUNTIME_ERROR ;
549555 }
550- if (vm -> vm_thread -> try_state == TRY_STATE_INNER ) {
556+ if (vm -> vm_thread -> try_state != TRY_STATE_NONE ) {
551557 return ;
552558 }
553559 va_list args ;
@@ -1064,7 +1070,7 @@ static Arg* VM_instruction_handler_TRY(PikaObj* self,
10641070 char * data ,
10651071 Arg * arg_ret_reg ) {
10661072 pika_assert (NULL != vm -> vm_thread );
1067- vm -> vm_thread -> try_state = TRY_STATE_INNER ;
1073+ vm -> vm_thread -> try_state ++ ;
10681074 return NULL ;
10691075}
10701076
@@ -1112,6 +1118,28 @@ PIKA_EXCEPTION_OPTIMIZE_SIZE static pika_bool _exceptionTypeIsMatch(
11121118 }
11131119 return pika_false ;
11141120}
1121+
1122+ static char * _exceptionTypeNameInScope (PikaObj * scope ,
1123+ PikaExceptionType type ) {
1124+ Hash exception_hash = 0 ;
1125+ for (size_t i = 0 ; i < sizeof (exception_types ); i ++ ) {
1126+ if (exception_types [i ] == type ) {
1127+ exception_hash = exception_hashes [i ];
1128+ break ;
1129+ }
1130+ }
1131+ NativeProperty * prop = obj_getProp (scope );
1132+ while (NULL != prop ) {
1133+ for (int i = 0 ; i < (int )prop -> methodGroupCount ; i ++ ) {
1134+ Arg * method = (Arg * )(prop -> methodGroup + i );
1135+ if (method -> name_hash == exception_hash ) {
1136+ return methodArg_getProp (method )-> name ;
1137+ }
1138+ }
1139+ prop = (NativeProperty * )prop -> super ;
1140+ }
1141+ return NULL ;
1142+ }
11151143#endif
11161144
11171145PIKA_EXCEPTION_OPTIMIZE_SIZE static Arg * VM_instruction_handler_EXP (
@@ -1146,6 +1174,22 @@ PIKA_EXCEPTION_OPTIMIZE_SIZE static Arg* VM_instruction_handler_EXP(
11461174 }
11471175 }
11481176 if (is_match ) {
1177+ if (PIKA_INS (OUT ) ==
1178+ PikaVMFrame_getInstructWithOffset (
1179+ vm , 2 * (int )instructUnit_getSize ())) {
1180+ PikaObj * builtins = obj_getBuiltins ();
1181+ char * exception_name = _exceptionTypeNameInScope (
1182+ builtins , error -> exception_type );
1183+ obj_deinit (builtins );
1184+ if (NULL == exception_name ) {
1185+ exception_name = data ;
1186+ }
1187+ Arg * exception_arg = VM_instruction_handler_RUN (
1188+ self , vm , exception_name , arg_ret_reg );
1189+ if (NULL != exception_arg ) {
1190+ stack_pushArg (& vm -> stack , exception_arg );
1191+ }
1192+ }
11491193 pikaVMThread_clearExceptionStack (vm -> vm_thread );
11501194 }
11511195 return arg_setBool (arg_ret_reg , "" , is_match );
@@ -1156,7 +1200,9 @@ static Arg* VM_instruction_handler_NTR(PikaObj* self,
11561200 PikaVMFrame * vm ,
11571201 char * data ,
11581202 Arg * arg_ret_reg ) {
1159- vm -> vm_thread -> try_state = TRY_STATE_NONE ;
1203+ if (vm -> vm_thread -> try_state != TRY_STATE_NONE ) {
1204+ vm -> vm_thread -> try_state -- ;
1205+ }
11601206 pikaVMThread_convertExceptionStack (vm -> vm_thread );
11611207 return NULL ;
11621208}
@@ -4315,7 +4361,7 @@ static int pikaVM_runInstructUnit(PikaObj* self,
43154361 if (pikaVMFrame_checkErrorStack (vm ) != PIKA_RES_OK ||
43164362 VMSignal_getCtrl () == VM_SIGNAL_CTRL_EXIT ) {
43174363 /* raise jmp */
4318- if (vm -> vm_thread -> try_state == TRY_STATE_INNER ) {
4364+ if (vm -> vm_thread -> try_state != TRY_STATE_NONE ) {
43194365 vm -> jmp = VM_JMP_RAISE ;
43204366 } else {
43214367 /* exit */
0 commit comments