@@ -2686,37 +2686,6 @@ void ReadEvalError(void)
26862686}
26872687
26882688
2689- /****************************************************************************
2690- **
2691- ** Reader state -- the next group of functions are used to "push" the
2692- ** current interpreter state allowing GAP code to be interpreted in the
2693- ** middle of other code. This is used, for instance, in the command-line
2694- ** editor.
2695- */
2696- struct SavedReaderState {
2697- UInt userHasQuit ;
2698- syJmp_buf readJmpError ;
2699- UInt nrError ;
2700- };
2701-
2702- static void SaveReaderState (struct SavedReaderState * s ) {
2703- s -> userHasQuit = STATE (UserHasQuit );
2704- s -> nrError = STATE (NrError );
2705- memcpy (s -> readJmpError , STATE (ReadJmpError ), sizeof (syJmp_buf ));
2706- }
2707-
2708- static void ClearReaderState (void ) {
2709- STATE (UserHasQuit ) = 0 ;
2710- STATE (NrError ) = 0 ;
2711- }
2712-
2713- static void RestoreReaderState (const struct SavedReaderState * s ) {
2714- memcpy (STATE (ReadJmpError ), s -> readJmpError , sizeof (syJmp_buf ));
2715- STATE (UserHasQuit ) = s -> userHasQuit ;
2716- STATE (NrError ) = s -> nrError ;
2717- }
2718-
2719-
27202689/****************************************************************************
27212690**
27222691*F Call0ArgsInNewReader(Obj f) . . . . . . . . . . . . call a GAP function
@@ -2725,30 +2694,32 @@ static void RestoreReaderState(const struct SavedReaderState *s) {
27252694*/
27262695Obj Call0ArgsInNewReader (Obj f )
27272696{
2728- struct SavedReaderState s ;
2729- Obj result ;
2697+ syJmp_buf readJmpError ;
2698+ volatile Obj result = 0 ;
27302699
2731- // remember the old reader context
2732- SaveReaderState (& s );
2700+ // remember the old state
2701+ UInt userHasQuit = STATE (UserHasQuit );
2702+ UInt nrError = STATE (NrError );
2703+ Bag oldLvars = STATE (CurrLVars );
2704+ memcpy (readJmpError , STATE (ReadJmpError ), sizeof (syJmp_buf ));
27332705
2734- // initialize everything and begin a fresh execution context
2735- ClearReaderState ();
2736- ExecBegin (STATE (BottomLVars ));
2706+ // initialize everything
2707+ STATE (UserHasQuit ) = 0 ;
2708+ STATE (NrError ) = 0 ;
2709+ SWITCH_TO_OLD_LVARS (STATE (BottomLVars ));
27372710
27382711 TRY_IF_NO_ERROR
27392712 {
27402713 result = CALL_0ARGS (f );
2741- ExecEnd (0 );
2742- }
2743- CATCH_ERROR
2744- {
2745- result = 0 ;
2746- ExecEnd (1 );
2747- ClearError ();
27482714 }
27492715
2750- // switch back to the old reader context
2751- RestoreReaderState (& s );
2716+ // switch back to the old state
2717+ SWITCH_TO_OLD_LVARS (oldLvars );
2718+ ClearError ();
2719+ memcpy (STATE (ReadJmpError ), readJmpError , sizeof (syJmp_buf ));
2720+ STATE (UserHasQuit ) = userHasQuit ;
2721+ STATE (NrError ) = nrError ;
2722+
27522723 return result ;
27532724}
27542725
@@ -2761,30 +2732,32 @@ Obj Call0ArgsInNewReader(Obj f)
27612732*/
27622733Obj Call1ArgsInNewReader (Obj f , Obj a )
27632734{
2764- struct SavedReaderState s ;
2765- Obj result ;
2735+ syJmp_buf readJmpError ;
2736+ volatile Obj result = 0 ;
27662737
2767- // remember the old reader context
2768- SaveReaderState (& s );
2738+ // remember the old state
2739+ UInt userHasQuit = STATE (UserHasQuit );
2740+ UInt nrError = STATE (NrError );
2741+ Bag oldLvars = STATE (CurrLVars );
2742+ memcpy (readJmpError , STATE (ReadJmpError ), sizeof (syJmp_buf ));
27692743
2770- // initialize everything and begin a fresh execution context
2771- ClearReaderState ();
2772- ExecBegin (STATE (BottomLVars ));
2744+ // initialize everything
2745+ STATE (UserHasQuit ) = 0 ;
2746+ STATE (NrError ) = 0 ;
2747+ SWITCH_TO_OLD_LVARS (STATE (BottomLVars ));
27732748
27742749 TRY_IF_NO_ERROR
27752750 {
27762751 result = CALL_1ARGS (f , a );
2777- ExecEnd (0 );
2778- }
2779- CATCH_ERROR
2780- {
2781- result = 0 ;
2782- ExecEnd (1 );
2783- ClearError ();
27842752 }
27852753
2786- // switch back to the old reader context
2787- RestoreReaderState (& s );
2754+ // switch back to the old state
2755+ SWITCH_TO_OLD_LVARS (oldLvars );
2756+ ClearError ();
2757+ memcpy (STATE (ReadJmpError ), readJmpError , sizeof (syJmp_buf ));
2758+ STATE (UserHasQuit ) = userHasQuit ;
2759+ STATE (NrError ) = nrError ;
2760+
27882761 return result ;
27892762}
27902763
0 commit comments