Skip to content

Commit 61d032f

Browse files
authored
Merge pull request #3868 from masatake/revise--optvm-app-data
Revise: the way of accessing the optVm's appData
2 parents e9afc80 + c04c385 commit 61d032f

File tree

4 files changed

+80
-41
lines changed

4 files changed

+80
-41
lines changed

dsl/optscript.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -647,12 +647,13 @@ opt_vm_new (MIO *in, MIO *out, MIO *err)
647647
}
648648

649649
void
650-
opt_vm_clear (OptVM *vm)
650+
opt_vm_clear (OptVM *vm, bool clear_app_data)
651651
{
652652
ptrArrayClear (vm->estack);
653653
ptrArrayClear (vm->ostack);
654654
vm_dstack_clear (vm);
655-
vm->app_data = NULL;
655+
if (clear_app_data)
656+
vm->app_data = NULL;
656657
dict_op_clear (vm->error);
657658
}
658659

dsl/optscript.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ void opt_vm_print_prompt (OptVM *vm);
4141
int opt_vm_help (OptVM *vm, MIO *out,
4242
struct OptHelpExtender *extop, void *data);
4343

44-
void opt_vm_clear (OptVM *vm);
44+
void opt_vm_clear (OptVM *vm, bool clear_app_data);
4545
void opt_vm_dstack_push (OptVM *vm, EsObject *dict);
4646
void opt_vm_dstack_pop (OptVM *vm);
4747

extra-cmds/optscript-repl.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ main(int argc, char **argv)
211211
r = optscript_run (vm, file? NULL: "OPT", &renew);
212212
if (renew)
213213
{
214-
opt_vm_clear (vm);
214+
opt_vm_clear (vm, true);
215215
opt_vm_dstack_push (vm, dict);
216216
renew = false;
217217
goto renew;

main/lregex.c

Lines changed: 75 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -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);
272275
static char* make_match_string (scriptWindow *window, int group);
273276
static 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+
275306
static 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

21462177
extern 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
26012632
extern 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

32203254
static 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

32263261
static 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

32323268
extern 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

35623597
static 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

36773711
static 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

36893723
static 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

36963730
static 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

37503784
static 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

38173851
static 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

38493884
static 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

38843920
static 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

39073943
static 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

39984034
static 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

40444080
static 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

41044140
static 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

Comments
 (0)