mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-25 13:11:00 +00:00
[qfcc] Move semantic processing into build_code_function
In the end, I could have done the null context check for pascal, but I think the xvalue support will come in handy for implementing inline functions.
This commit is contained in:
parent
7379b1226d
commit
306306fc5a
5 changed files with 20 additions and 22 deletions
|
@ -215,8 +215,8 @@ const expr_t *find_function (const expr_t *fexpr, const expr_t *params);
|
||||||
function_t *begin_function (symbol_t *sym, const char *nicename,
|
function_t *begin_function (symbol_t *sym, const char *nicename,
|
||||||
symtab_t *parent, int far,
|
symtab_t *parent, int far,
|
||||||
enum storage_class_e storage);
|
enum storage_class_e storage);
|
||||||
function_t *build_code_function (symbol_t *fsym,
|
function_t *build_code_function (symbol_t *fsym, const expr_t *state_expr,
|
||||||
const expr_t *state_expr, expr_t *statements);
|
expr_t *statements, rua_ctx_t *ctx);
|
||||||
function_t *build_builtin_function (symbol_t *sym, const char *ext_name,
|
function_t *build_builtin_function (symbol_t *sym, const char *ext_name,
|
||||||
const expr_t *bi_val, int far,
|
const expr_t *bi_val, int far,
|
||||||
enum storage_class_e storage);
|
enum storage_class_e storage);
|
||||||
|
|
|
@ -1179,8 +1179,11 @@ build_function (symbol_t *fsym)
|
||||||
|
|
||||||
function_t *
|
function_t *
|
||||||
build_code_function (symbol_t *fsym, const expr_t *state_expr,
|
build_code_function (symbol_t *fsym, const expr_t *state_expr,
|
||||||
expr_t *statements)
|
expr_t *statements, rua_ctx_t *ctx)
|
||||||
{
|
{
|
||||||
|
if (ctx) {
|
||||||
|
statements = (expr_t *) expr_process (statements, ctx);
|
||||||
|
}
|
||||||
if (fsym->sy_type != sy_func) // probably in error recovery
|
if (fsym->sy_type != sy_func) // probably in error recovery
|
||||||
return 0;
|
return 0;
|
||||||
build_function (fsym);
|
build_function (fsym);
|
||||||
|
@ -1315,5 +1318,5 @@ emit_ctor (void)
|
||||||
auto ctor_sym = new_symbol_type (".ctor", &type_func);
|
auto ctor_sym = new_symbol_type (".ctor", &type_func);
|
||||||
ctor_sym = function_symbol ((specifier_t) { .sym = ctor_sym });
|
ctor_sym = function_symbol ((specifier_t) { .sym = ctor_sym });
|
||||||
current_func = begin_function (ctor_sym, 0, current_symtab, 1, sc_static);
|
current_func = begin_function (ctor_sym, 0, current_symtab, 1, sc_static);
|
||||||
build_code_function (ctor_sym, 0, pr.ctor_exprs);
|
build_code_function (ctor_sym, 0, pr.ctor_exprs, nullptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -344,8 +344,7 @@ function_definition
|
||||||
{
|
{
|
||||||
auto spec = $1;
|
auto spec = $1;
|
||||||
auto sym = spec.sym;
|
auto sym = spec.sym;
|
||||||
expr_t *statments = (expr_t *) expr_process ($3, ctx);
|
build_code_function (sym, nullptr, (expr_t *) $3, ctx);
|
||||||
build_code_function (sym, nullptr, statments);
|
|
||||||
current_symtab = $<symtab>2;
|
current_symtab = $<symtab>2;
|
||||||
current_storage = sc_global;//FIXME
|
current_storage = sc_global;//FIXME
|
||||||
current_func = nullptr;
|
current_func = nullptr;
|
||||||
|
|
|
@ -873,8 +873,7 @@ qc_code_func
|
||||||
}
|
}
|
||||||
compound_statement_ns
|
compound_statement_ns
|
||||||
{
|
{
|
||||||
auto statements = (expr_t *) expr_process ($6, ctx);
|
build_code_function ($1, $3, $6, ctx);
|
||||||
build_code_function ($1, $3, statements);
|
|
||||||
current_symtab = $<funcstate>5.symtab;
|
current_symtab = $<funcstate>5.symtab;
|
||||||
current_func = $<funcstate>5.function;
|
current_func = $<funcstate>5.function;
|
||||||
restore_storage ($4);
|
restore_storage ($4);
|
||||||
|
@ -1191,8 +1190,7 @@ function_body
|
||||||
}
|
}
|
||||||
compound_statement_ns
|
compound_statement_ns
|
||||||
{
|
{
|
||||||
auto statements = (expr_t *) expr_process ($5, ctx);
|
build_code_function ($<symbol>2, $1, $5, ctx);
|
||||||
build_code_function ($<symbol>2, $1, statements);
|
|
||||||
current_symtab = $<funcstate>4.symtab;
|
current_symtab = $<funcstate>4.symtab;
|
||||||
current_func = $<funcstate>4.function;
|
current_func = $<funcstate>4.function;
|
||||||
restore_storage ($3);
|
restore_storage ($3);
|
||||||
|
@ -2634,8 +2632,7 @@ methoddef
|
||||||
}
|
}
|
||||||
compound_statement_ns
|
compound_statement_ns
|
||||||
{
|
{
|
||||||
auto statements = (expr_t *) expr_process ($7, ctx);
|
build_code_function ($<symbol>4, $3, $7, ctx);
|
||||||
build_code_function ($<symbol>4, $3, statements);
|
|
||||||
current_symtab = $<funcstate>6.symtab;
|
current_symtab = $<funcstate>6.symtab;
|
||||||
current_func = $<funcstate>6.function;
|
current_func = $<funcstate>6.function;
|
||||||
restore_storage ($5);
|
restore_storage ($5);
|
||||||
|
|
|
@ -148,7 +148,7 @@ int yylex (void);
|
||||||
%{
|
%{
|
||||||
|
|
||||||
static void
|
static void
|
||||||
build_dotmain (symbol_t *program)
|
build_dotmain (symbol_t *program, rua_ctx_t *ctx)
|
||||||
{
|
{
|
||||||
symbol_t *dotmain = new_symbol (".main");
|
symbol_t *dotmain = new_symbol (".main");
|
||||||
expr_t *code;
|
expr_t *code;
|
||||||
|
@ -163,11 +163,12 @@ build_dotmain (symbol_t *program)
|
||||||
|
|
||||||
current_func = begin_function (dotmain, 0, current_symtab, 0,
|
current_func = begin_function (dotmain, 0, current_symtab, 0,
|
||||||
current_storage);
|
current_storage);
|
||||||
current_symtab = current_func->locals;
|
|
||||||
code = new_block_expr (0);
|
code = new_block_expr (0);
|
||||||
append_expr (code, function_expr (new_symbol_expr (program), 0));
|
code->block.scope = current_func->locals;
|
||||||
append_expr (code, return_expr (current_func, exitcode));
|
auto call = new_call_expr (new_symbol_expr (program), nullptr, nullptr);
|
||||||
build_code_function (dotmain, 0, code);
|
append_expr (code, call);
|
||||||
|
append_expr (code, new_return_expr (exitcode));
|
||||||
|
build_code_function (dotmain, 0, code, ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const expr_t *
|
static const expr_t *
|
||||||
|
@ -283,11 +284,10 @@ program
|
||||||
current_func = begin_function ($1, 0, current_symtab, 0,
|
current_func = begin_function ($1, 0, current_symtab, 0,
|
||||||
current_storage);
|
current_storage);
|
||||||
current_symtab = current_func->locals;
|
current_symtab = current_func->locals;
|
||||||
auto statements = (expr_t *) expr_process ($4, ctx);
|
build_code_function ($1, 0, $4, ctx);
|
||||||
build_code_function ($1, 0, statements);
|
|
||||||
current_symtab = st;
|
current_symtab = st;
|
||||||
|
|
||||||
build_dotmain ($1);
|
build_dotmain ($1, ctx);
|
||||||
current_symtab = st;
|
current_symtab = st;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
@ -393,8 +393,7 @@ subprogram_declaration
|
||||||
}
|
}
|
||||||
auto ret_expr = new_return_expr (function_return (current_func));
|
auto ret_expr = new_return_expr (function_return (current_func));
|
||||||
append_expr (statements, ret_expr);
|
append_expr (statements, ret_expr);
|
||||||
statements = (expr_t *) expr_process (statements, ctx);
|
build_code_function (fsym, 0, statements, ctx);
|
||||||
build_code_function (fsym, 0, statements);
|
|
||||||
current_symtab = current_func->parameters->parent;
|
current_symtab = current_func->parameters->parent;
|
||||||
current_storage = $<spec>3.storage;
|
current_storage = $<spec>3.storage;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue