pull-in block-arg branch for loop fixes
This commit is contained in:
commit
25156d7180
6 changed files with 42 additions and 40 deletions
|
@ -44,16 +44,9 @@ grub_cmd_hello (grub_extcmd_context_t ctxt,
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (script)
|
if (script)
|
||||||
grub_script_free (script);
|
grub_script_put (script);
|
||||||
|
|
||||||
script = grub_malloc (sizeof (*script));
|
script = grub_script_get (ctxt->script_params[0]);
|
||||||
if (! script)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
script->cmd = ctxt->script_params[0]->cmd;
|
|
||||||
script->mem = ctxt->script_params[0]->mem;
|
|
||||||
ctxt->script_params[0]->cmd = 0;
|
|
||||||
ctxt->script_params[0]->mem = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -71,7 +64,8 @@ GRUB_MOD_INIT(hello)
|
||||||
GRUB_MOD_FINI(hello)
|
GRUB_MOD_FINI(hello)
|
||||||
{
|
{
|
||||||
if (script)
|
if (script)
|
||||||
grub_script_free (script);
|
grub_script_put (script);
|
||||||
|
|
||||||
|
script = 0;
|
||||||
grub_unregister_extcmd (cmd);
|
grub_unregister_extcmd (cmd);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@ struct grub_script_cmd
|
||||||
|
|
||||||
struct grub_script
|
struct grub_script
|
||||||
{
|
{
|
||||||
|
unsigned refcnt;
|
||||||
struct grub_script_mem *mem;
|
struct grub_script_mem *mem;
|
||||||
struct grub_script_cmd *cmd;
|
struct grub_script_cmd *cmd;
|
||||||
};
|
};
|
||||||
|
@ -61,7 +62,7 @@ struct grub_script_arg
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
/* Parsed block argument. */
|
/* Parsed block argument. */
|
||||||
struct grub_script block;
|
struct grub_script *block;
|
||||||
|
|
||||||
/* Next argument part. */
|
/* Next argument part. */
|
||||||
struct grub_script_arg *next;
|
struct grub_script_arg *next;
|
||||||
|
@ -212,6 +213,8 @@ struct grub_parser_param
|
||||||
struct grub_lexer_param *lexerstate;
|
struct grub_lexer_param *lexerstate;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void grub_script_mem_free (struct grub_script_mem *mem);
|
||||||
|
|
||||||
void grub_script_argv_free (struct grub_script_argv *argv);
|
void grub_script_argv_free (struct grub_script_argv *argv);
|
||||||
int grub_script_argv_next (struct grub_script_argv *argv);
|
int grub_script_argv_next (struct grub_script_argv *argv);
|
||||||
int grub_script_argv_append (struct grub_script_argv *argv, const char *s);
|
int grub_script_argv_append (struct grub_script_argv *argv, const char *s);
|
||||||
|
@ -332,4 +335,20 @@ grub_err_t grub_script_function_call (grub_script_function_t func,
|
||||||
char **
|
char **
|
||||||
grub_script_execute_arglist_to_argv (struct grub_script_arglist *arglist, int *count);
|
grub_script_execute_arglist_to_argv (struct grub_script_arglist *arglist, int *count);
|
||||||
|
|
||||||
|
static inline struct grub_script *
|
||||||
|
grub_script_get (struct grub_script *script)
|
||||||
|
{
|
||||||
|
script->refcnt++;
|
||||||
|
return script;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
grub_script_put (struct grub_script *script)
|
||||||
|
{
|
||||||
|
if (script->refcnt == 0)
|
||||||
|
grub_script_free (script);
|
||||||
|
else
|
||||||
|
script->refcnt--;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* ! GRUB_NORMAL_PARSER_HEADER */
|
#endif /* ! GRUB_NORMAL_PARSER_HEADER */
|
||||||
|
|
|
@ -55,7 +55,8 @@ grub_script_argv_free (struct grub_script_argv *argv)
|
||||||
if (argv->scripts)
|
if (argv->scripts)
|
||||||
{
|
{
|
||||||
for (i = 0; i < argv->argc; i++)
|
for (i = 0; i < argv->argc; i++)
|
||||||
grub_script_free (argv->scripts[i]);
|
if (argv->scripts[i])
|
||||||
|
grub_script_put (argv->scripts[i]);
|
||||||
|
|
||||||
grub_free (argv->scripts);
|
grub_free (argv->scripts);
|
||||||
}
|
}
|
||||||
|
@ -127,17 +128,10 @@ int
|
||||||
grub_script_argv_script_append (struct grub_script_argv *argv,
|
grub_script_argv_script_append (struct grub_script_argv *argv,
|
||||||
struct grub_script *script)
|
struct grub_script *script)
|
||||||
{
|
{
|
||||||
struct grub_script *s;
|
|
||||||
|
|
||||||
s = grub_malloc (sizeof (*s));
|
|
||||||
if (! s)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (argv->scripts[argv->argc - 1])
|
if (argv->scripts[argv->argc - 1])
|
||||||
grub_script_free (argv->scripts[argv->argc - 1]);
|
grub_script_put (argv->scripts[argv->argc - 1]);
|
||||||
|
|
||||||
*s = *script;
|
argv->scripts[argv->argc - 1] = grub_script_get (script);
|
||||||
argv->scripts[argv->argc - 1] = s;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -198,7 +198,7 @@ grub_script_arglist_to_argv (struct grub_script_arglist *arglist,
|
||||||
|
|
||||||
case GRUB_SCRIPT_ARG_TYPE_BLOCK:
|
case GRUB_SCRIPT_ARG_TYPE_BLOCK:
|
||||||
if (grub_script_argv_append (&result, arg->str) ||
|
if (grub_script_argv_append (&result, arg->str) ||
|
||||||
grub_script_argv_script_append (&result, &arg->block))
|
grub_script_argv_script_append (&result, arg->block))
|
||||||
goto fail;
|
goto fail;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -161,11 +161,9 @@ block: "{"
|
||||||
if ((p = grub_script_lexer_record_stop (state, $<offset>2)))
|
if ((p = grub_script_lexer_record_stop (state, $<offset>2)))
|
||||||
*grub_strrchr (p, '}') = '\0';
|
*grub_strrchr (p, '}') = '\0';
|
||||||
|
|
||||||
if ((arg = grub_script_arg_add (state, 0, GRUB_SCRIPT_ARG_TYPE_BLOCK, p)))
|
arg = grub_script_arg_add (state, 0, GRUB_SCRIPT_ARG_TYPE_BLOCK, p);
|
||||||
{
|
if (! arg || ! (arg->block = grub_script_create ($3, memory)))
|
||||||
arg->block.cmd = $3;
|
grub_script_mem_free (memory);
|
||||||
arg->block.mem = memory;
|
|
||||||
}
|
|
||||||
|
|
||||||
$$ = grub_script_add_arglist (state, 0, arg);
|
$$ = grub_script_add_arglist (state, 0, arg);
|
||||||
grub_script_lexer_deref (state->lexerstate);
|
grub_script_lexer_deref (state->lexerstate);
|
||||||
|
@ -253,7 +251,9 @@ function: "function" "name"
|
||||||
state->func_mem = grub_script_mem_record_stop (state,
|
state->func_mem = grub_script_mem_record_stop (state,
|
||||||
state->func_mem);
|
state->func_mem);
|
||||||
script = grub_script_create ($6, state->func_mem);
|
script = grub_script_create ($6, state->func_mem);
|
||||||
if (script)
|
if (! script)
|
||||||
|
grub_script_mem_free (state->func_mem);
|
||||||
|
else
|
||||||
grub_script_function_create ($2, script);
|
grub_script_function_create ($2, script);
|
||||||
|
|
||||||
grub_script_lexer_deref (state->lexerstate);
|
grub_script_lexer_deref (state->lexerstate);
|
||||||
|
|
|
@ -54,7 +54,7 @@ grub_script_malloc (struct grub_parser_param *state, grub_size_t size)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free all memory described by MEM. */
|
/* Free all memory described by MEM. */
|
||||||
static void
|
void
|
||||||
grub_script_mem_free (struct grub_script_mem *mem)
|
grub_script_mem_free (struct grub_script_mem *mem)
|
||||||
{
|
{
|
||||||
struct grub_script_mem *memfree;
|
struct grub_script_mem *memfree;
|
||||||
|
@ -122,8 +122,7 @@ grub_script_arg_add (struct grub_parser_param *state,
|
||||||
return arg;
|
return arg;
|
||||||
|
|
||||||
argpart->type = type;
|
argpart->type = type;
|
||||||
argpart->block.mem = 0;
|
argpart->block = 0;
|
||||||
argpart->block.cmd = 0;
|
|
||||||
|
|
||||||
len = grub_strlen (str) + 1;
|
len = grub_strlen (str) + 1;
|
||||||
argpart->str = grub_script_malloc (state, len);
|
argpart->str = grub_script_malloc (state, len);
|
||||||
|
@ -318,15 +317,11 @@ grub_script_create (struct grub_script_cmd *cmd, struct grub_script_mem *mem)
|
||||||
|
|
||||||
parsed = grub_malloc (sizeof (*parsed));
|
parsed = grub_malloc (sizeof (*parsed));
|
||||||
if (! parsed)
|
if (! parsed)
|
||||||
{
|
|
||||||
grub_script_mem_free (mem);
|
|
||||||
grub_free (cmd);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
parsed->mem = mem;
|
parsed->mem = mem;
|
||||||
parsed->cmd = cmd;
|
parsed->cmd = cmd;
|
||||||
|
parsed->refcnt = 0;
|
||||||
|
|
||||||
return parsed;
|
return parsed;
|
||||||
}
|
}
|
||||||
|
@ -341,7 +336,7 @@ grub_script_parse (char *script, grub_reader_getline_t getline)
|
||||||
struct grub_lexer_param *lexstate;
|
struct grub_lexer_param *lexstate;
|
||||||
struct grub_parser_param *parsestate;
|
struct grub_parser_param *parsestate;
|
||||||
|
|
||||||
parsed = grub_malloc (sizeof (*parsed));
|
parsed = grub_script_create (0, 0);
|
||||||
if (!parsed)
|
if (!parsed)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue