@@ -238,9 +238,12 @@ struct lregexControlBlock {
238238 ptrArray * hook_code [SCRIPT_HOOK_MAX ];
239239
240240 langType owner ;
241+ };
241242
243+ typedef struct {
244+ struct lregexControlBlock * lcb ;
242245 scriptWindow * window ;
243- };
246+ } appData ;
244247
245248/*
246249* DATA DEFINITIONS
@@ -272,6 +275,34 @@ static void scriptTeardown (OptVM *vm, struct lregexControlBlock *lcb);
272275static char * make_match_string (scriptWindow * window , int group );
273276static matchLoc * make_mloc (scriptWindow * window , int group , bool start );
274277
278+ static struct lregexControlBlock * get_current_lcb (OptVM * vm )
279+ {
280+ appData * d = opt_vm_get_app_data (vm );
281+ return d -> lcb ;
282+ }
283+
284+ static scriptWindow * get_current_window (OptVM * vm )
285+ {
286+ appData * d = opt_vm_get_app_data (vm );
287+ return d -> window ;
288+ }
289+
290+ static struct lregexControlBlock * set_current_lcb (OptVM * vm , struct lregexControlBlock * new_lcb )
291+ {
292+ appData * d = opt_vm_get_app_data (vm );
293+ struct lregexControlBlock * old_lcb = d -> lcb ;
294+ d -> lcb = new_lcb ;
295+ return old_lcb ;
296+ }
297+
298+ static scriptWindow * set_current_window (OptVM * vm , scriptWindow * new_windown )
299+ {
300+ appData * d = opt_vm_get_app_data (vm );
301+ scriptWindow * old_window = d -> window ;
302+ d -> window = new_windown ;
303+ return old_window ;
304+ }
305+
275306static void deleteTable (void * ptrn )
276307{
277308 struct regexTable * t = ptrn ;
@@ -2139,15 +2170,15 @@ extern void notifyRegexInputStart (struct lregexControlBlock *lcb)
21392170 if (es_null (lcb -> local_dict ))
21402171 lcb -> local_dict = opt_dict_new (23 );
21412172 opt_vm_dstack_push (optvm , lcb -> local_dict );
2142- opt_vm_set_app_data (optvm , lcb );
2173+ set_current_lcb (optvm , lcb );
21432174 scriptEvalHook (optvm , lcb , SCRIPT_HOOK_PRELUDE );
21442175}
21452176
21462177extern void notifyRegexInputEnd (struct lregexControlBlock * lcb )
21472178{
21482179 scriptEvalHook (optvm , lcb , SCRIPT_HOOK_SEQUEL );
2149- opt_vm_set_app_data (optvm , NULL );
2150- opt_vm_clear (optvm );
2180+ set_current_lcb (optvm , NULL );
2181+ opt_vm_clear (optvm , false );
21512182 opt_dict_clear (lcb -> local_dict );
21522183 unsigned long endline = getInputLineNumber ();
21532184 fillEndLineFieldOfUpperScopes (lcb , endline );
@@ -2601,6 +2632,9 @@ extern void printMultitableRegexFlags (bool withListHeader, bool machinable, con
26012632extern void freeRegexResources (void )
26022633{
26032634 es_object_unref (lregex_dict );
2635+ void * d = opt_vm_set_app_data (optvm , NULL );
2636+ if (d )
2637+ eFree (d );
26042638 opt_vm_delete (optvm );
26052639}
26062640
@@ -3219,14 +3253,16 @@ static void scriptEvalHook (OptVM *vm, struct lregexControlBlock *lcb, enum scri
32193253
32203254static void scriptSetup (OptVM * vm , struct lregexControlBlock * lcb , int corkIndex , scriptWindow * window )
32213255{
3222- lcb -> window = window ;
3256+ set_current_lcb (vm , lcb );
3257+ set_current_window (vm , window );
32233258 optscriptSetup (vm , lcb -> local_dict , corkIndex );
32243259}
32253260
32263261static void scriptTeardown (OptVM * vm , struct lregexControlBlock * lcb )
32273262{
32283263 optscriptTeardown (vm , lcb -> local_dict );
3229- lcb -> window = NULL ;
3264+ set_current_lcb (vm , NULL );
3265+ set_current_window (vm , NULL );
32303266}
32313267
32323268extern void addOptscriptToHook (struct lregexControlBlock * lcb , enum scriptHook hook , const char * code )
@@ -3283,8 +3319,8 @@ static EsObject* lrop_make_foreignreftag (OptVM *vm, EsObject *name)
32833319 }
32843320 else
32853321 {
3286- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3287- if (lcb -> window -> patbuf -> regptype != REG_PARSER_SINGLE_LINE )
3322+ scriptWindow * window = get_current_window (vm );
3323+ if (window -> patbuf -> regptype != REG_PARSER_SINGLE_LINE )
32883324 return OPT_ERR_TYPECHECK ;
32893325 if (opt_vm_ostack_count (vm ) < 4 )
32903326 return OPT_ERR_UNDERFLOW ;
@@ -3478,8 +3514,7 @@ static EsObject* lrop_get_match_loc (OptVM *vm, EsObject *name)
34783514 if (g < 1 )
34793515 return OPT_ERR_RANGECHECK ;
34803516
3481- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3482- scriptWindow * window = lcb -> window ;
3517+ scriptWindow * window = get_current_window (vm );
34833518
34843519 matchLoc * mloc = make_mloc (window , g , start );
34853520 if (mloc == NULL )
@@ -3561,8 +3596,7 @@ static EsObject* lrop_get_tag_loc (OptVM *vm, EsObject *name)
35613596
35623597static EsObject * lrop_get_match_string_common (OptVM * vm , int i , int npop )
35633598{
3564- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3565- scriptWindow * window = lcb -> window ;
3599+ scriptWindow * window = get_current_window (vm );
35663600 const char * cstr = make_match_string (window , i );
35673601 if (!cstr )
35683602 {
@@ -3666,7 +3700,7 @@ static EsObject* lrop_set_scope (OptVM *vm, EsObject *name)
36663700 if (n >= countEntryInCorkQueue ())
36673701 return OPT_ERR_RANGECHECK ;
36683702
3669- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3703+ struct lregexControlBlock * lcb = get_current_lcb (vm );
36703704 lcb -> currentScope = n0 ;
36713705
36723706 opt_vm_ostack_pop (vm );
@@ -3676,7 +3710,7 @@ static EsObject* lrop_set_scope (OptVM *vm, EsObject *name)
36763710
36773711static EsObject * lrop_pop_scope (OptVM * vm , EsObject * name )
36783712{
3679- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3713+ struct lregexControlBlock * lcb = get_current_lcb (vm );
36803714 if (lcb -> currentScope != CORK_NIL )
36813715 {
36823716 tagEntryInfo * e = getEntryInCorkQueue (lcb -> currentScope );
@@ -3688,14 +3722,14 @@ static EsObject* lrop_pop_scope (OptVM *vm, EsObject *name)
36883722
36893723static EsObject * lrop_clear_scope (OptVM * vm , EsObject * name )
36903724{
3691- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3725+ struct lregexControlBlock * lcb = get_current_lcb (vm );
36923726 lcb -> currentScope = CORK_NIL ;
36933727 return es_false ;
36943728}
36953729
36963730static EsObject * lrop_ref0_scope (OptVM * vm , EsObject * name )
36973731{
3698- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3732+ struct lregexControlBlock * lcb = get_current_lcb (vm );
36993733
37003734 if (lcb -> currentScope == 0 )
37013735 {
@@ -3722,7 +3756,7 @@ static EsObject* lrop_refN_scope (OptVM *vm, EsObject *name)
37223756
37233757 int n = es_integer_get (nobj );
37243758
3725- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3759+ struct lregexControlBlock * lcb = get_current_lcb (vm );
37263760 int scope = lcb -> currentScope ;
37273761
37283762 while (n -- )
@@ -3749,7 +3783,7 @@ static EsObject* lrop_refN_scope (OptVM *vm, EsObject *name)
37493783
37503784static EsObject * lrop_get_scope_depth (OptVM * vm , EsObject * name )
37513785{
3752- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3786+ struct lregexControlBlock * lcb = get_current_lcb (vm );
37533787 int scope = lcb -> currentScope ;
37543788
37553789 while (scope != CORK_NIL )
@@ -3816,8 +3850,8 @@ static struct regexTable *getRegexTableForOptscriptName (struct lregexControlBlo
38163850
38173851static EsObject * lrop_tenter_common (OptVM * vm , EsObject * name , enum tableAction action )
38183852{
3819- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3820- if (lcb -> window -> patbuf -> regptype != REG_PARSER_MULTI_TABLE )
3853+ scriptWindow * window = get_current_window (vm );
3854+ if (window -> patbuf -> regptype != REG_PARSER_MULTI_TABLE )
38213855 {
38223856 error (WARNING , "Use table related operators only with mtable regular expression" );
38233857 return OPTSCRIPT_ERR_NOTMTABLEPTRN ;
@@ -3827,11 +3861,12 @@ static EsObject* lrop_tenter_common (OptVM *vm, EsObject *name, enum tableAction
38273861 if (es_object_get_type (table ) != OPT_TYPE_NAME )
38283862 return OPT_ERR_TYPECHECK ;
38293863
3864+ struct lregexControlBlock * lcb = get_current_lcb (vm );
38303865 struct regexTable * t = getRegexTableForOptscriptName (lcb , table );
38313866 if (t == NULL )
38323867 return OPTSCRIPT_ERR_UNKNOWNTABLE ;
38333868
3834- lcb -> window -> taction = (struct mTableActionSpec ){
3869+ window -> taction = (struct mTableActionSpec ){
38353870 .action = action ,
38363871 .table = t ,
38373872 .continuation_table = NULL ,
@@ -3848,8 +3883,8 @@ static EsObject* lrop_tenter (OptVM *vm, EsObject *name)
38483883
38493884static EsObject * lrop_tenter_with_continuation (OptVM * vm , EsObject * name )
38503885{
3851- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3852- if (lcb -> window -> patbuf -> regptype != REG_PARSER_MULTI_TABLE )
3886+ scriptWindow * window = get_current_window (vm );
3887+ if (window -> patbuf -> regptype != REG_PARSER_MULTI_TABLE )
38533888 {
38543889 error (WARNING , "Use table related operators only with mtable regular expression" );
38553890 return OPTSCRIPT_ERR_NOTMTABLEPTRN ;
@@ -3863,14 +3898,15 @@ static EsObject* lrop_tenter_with_continuation (OptVM *vm, EsObject *name)
38633898 if (es_object_get_type (cont ) != OPT_TYPE_NAME )
38643899 return OPT_ERR_TYPECHECK ;
38653900
3901+ struct lregexControlBlock * lcb = get_current_lcb (vm );
38663902 struct regexTable * t = getRegexTableForOptscriptName (lcb , table );
38673903 if (t == NULL )
38683904 return OPTSCRIPT_ERR_UNKNOWNTABLE ;
38693905 struct regexTable * c = getRegexTableForOptscriptName (lcb , cont );
38703906 if (c == NULL )
38713907 return OPTSCRIPT_ERR_UNKNOWNTABLE ;
38723908
3873- lcb -> window -> taction = (struct mTableActionSpec ){
3909+ window -> taction = (struct mTableActionSpec ){
38743910 .action = TACTION_ENTER ,
38753911 .table = t ,
38763912 .continuation_table = c ,
@@ -3883,14 +3919,14 @@ static EsObject* lrop_tenter_with_continuation (OptVM *vm, EsObject *name)
38833919
38843920static EsObject * lrop_tleave (OptVM * vm , EsObject * name )
38853921{
3886- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3887- if (lcb -> window -> patbuf -> regptype != REG_PARSER_MULTI_TABLE )
3922+ scriptWindow * window = get_current_window (vm );
3923+ if (window -> patbuf -> regptype != REG_PARSER_MULTI_TABLE )
38883924 {
38893925 error (WARNING , "Use table related operators only with mtable regular expression" );
38903926 return OPTSCRIPT_ERR_NOTMTABLEPTRN ;
38913927 }
38923928
3893- lcb -> window -> taction .action = TACTION_LEAVE ;
3929+ window -> taction .action = TACTION_LEAVE ;
38943930 return es_false ;
38953931}
38963932
@@ -3906,14 +3942,14 @@ static EsObject* lrop_treset (OptVM *vm, EsObject *name)
39063942
39073943static EsObject * lrop_tquit (OptVM * vm , EsObject * name )
39083944{
3909- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3910- if (lcb -> window -> patbuf -> regptype != REG_PARSER_MULTI_TABLE )
3945+ scriptWindow * window = get_current_window (vm );
3946+ if (window -> patbuf -> regptype != REG_PARSER_MULTI_TABLE )
39113947 {
39123948 error (WARNING , "Use table related operators only with mtable regular expression" );
39133949 return OPTSCRIPT_ERR_NOTMTABLEPTRN ;
39143950 }
39153951
3916- lcb -> window -> taction .action = TACTION_QUIT ;
3952+ window -> taction .action = TACTION_QUIT ;
39173953 return es_false ;
39183954}
39193955
@@ -3997,8 +4033,8 @@ static EsObject *lrop_markextra (OptVM *vm, EsObject *name)
39974033
39984034static EsObject * lrop_advanceto (OptVM * vm , EsObject * name )
39994035{
4000- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
4001- if (lcb -> window -> patbuf -> regptype == REG_PARSER_SINGLE_LINE )
4036+ scriptWindow * window = get_current_window (vm );
4037+ if (window -> patbuf -> regptype == REG_PARSER_SINGLE_LINE )
40024038 {
40034039 error (WARNING , "don't use `%s' operator in --regex-<LANG> option" ,
40044040 es_symbol_get (name ));
@@ -4010,8 +4046,8 @@ static EsObject *lrop_advanceto (OptVM *vm, EsObject *name)
40104046 return OPT_ERR_TYPECHECK ;
40114047
40124048 matchLoc * loc = es_pointer_get (mlocobj );
4013- lcb -> window -> advanceto = true;
4014- lcb -> window -> advanceto_delta = loc -> delta ;
4049+ window -> advanceto = true;
4050+ window -> advanceto_delta = loc -> delta ;
40154051
40164052 return es_true ;
40174053}
@@ -4043,8 +4079,8 @@ static EsObject *lrop_markplaceholder (OptVM *vm, EsObject *name)
40434079
40444080static EsObject * lrop_makepromise (OptVM * vm , EsObject * name )
40454081{
4046- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
4047- if (lcb -> window -> patbuf -> regptype == REG_PARSER_SINGLE_LINE )
4082+ scriptWindow * window = get_current_window (vm );
4083+ if (window -> patbuf -> regptype == REG_PARSER_SINGLE_LINE )
40484084 {
40494085 error (WARNING , "don't use `%s' operator in --regex-<LANG> option" ,
40504086 es_symbol_get (name ));
@@ -4103,7 +4139,7 @@ static EsObject *lrop_makepromise (OptVM *vm, EsObject *name)
41034139
41044140static EsObject * lrop_param (OptVM * vm , EsObject * name )
41054141{
4106- struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
4142+ struct lregexControlBlock * lcb = get_current_lcb (vm );
41074143 EsObject * key = opt_vm_ostack_top (vm );
41084144 if (es_object_get_type (key ) != OPT_TYPE_NAME )
41094145 return OPT_ERR_TYPECHECK ;
@@ -4315,6 +4351,8 @@ extern void initRegexOptscript (void)
43154351 return ;
43164352
43174353 optvm = optscriptInit ();
4354+ appData * d = xCalloc (1 , appData );
4355+ opt_vm_set_app_data (optvm , d );
43184356 lregex_dict = opt_dict_new (17 );
43194357
43204358 OPTSCRIPT_ERR_UNKNOWNTABLE = es_error_intern ("unknowntable" );
0 commit comments