mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-31 05:00:35 +00:00
proper scoping for QC ala C.
This commit is contained in:
parent
4ae92c8d42
commit
6553c81a41
5 changed files with 41 additions and 12 deletions
|
@ -17,5 +17,6 @@ o switch/case, for any type
|
||||||
o break/continue keywords for switch() and for(;;)
|
o break/continue keywords for switch() and for(;;)
|
||||||
o quaternion type. Tricky: requires 4 word args/return
|
o quaternion type. Tricky: requires 4 word args/return
|
||||||
o CSE optimisations
|
o CSE optimisations
|
||||||
o full scoping
|
X full scoping
|
||||||
o short circuit logic for && and || (optional?)
|
o short circuit logic for && and || (optional?)
|
||||||
|
o warn for local shaddowing parameter
|
||||||
|
|
|
@ -285,12 +285,14 @@ typedef struct statref_s {
|
||||||
typedef struct def_s {
|
typedef struct def_s {
|
||||||
type_t *type;
|
type_t *type;
|
||||||
const char *name;
|
const char *name;
|
||||||
int num_locals;
|
int locals;
|
||||||
|
int *alloc;
|
||||||
gofs_t ofs;
|
gofs_t ofs;
|
||||||
int initialized; // for uninit var detection
|
int initialized; // for uninit var detection
|
||||||
int constant; // 1 when a declaration included "= immediate"
|
int constant; // 1 when a declaration included "= immediate"
|
||||||
statref_t *refs; // for relocations
|
statref_t *refs; // for relocations
|
||||||
|
|
||||||
|
int removed; // already removed from the symbol table
|
||||||
int used; // unused local detection
|
int used; // unused local detection
|
||||||
string_t file; // source file
|
string_t file; // source file
|
||||||
int line; // source line
|
int line; // source line
|
||||||
|
|
|
@ -218,8 +218,8 @@ PR_GetTempDef (type_t *type, def_t *scope)
|
||||||
def->type = type;
|
def->type = type;
|
||||||
} else {
|
} else {
|
||||||
def = PR_NewDef (type, 0, scope);
|
def = PR_NewDef (type, 0, scope);
|
||||||
def->ofs = scope->num_locals;
|
def->ofs = *scope->alloc;
|
||||||
scope->num_locals += type_size[size];
|
*scope->alloc += type_size[size];
|
||||||
}
|
}
|
||||||
def->users = 0;
|
def->users = 0;
|
||||||
def->next = temp_scope.next;
|
def->next = temp_scope.next;
|
||||||
|
@ -279,7 +279,10 @@ PR_FlushScope (def_t *scope, int force_used)
|
||||||
e.file = def->file;
|
e.file = def->file;
|
||||||
warning (&e, "unused variable `%s'", def->name);
|
warning (&e, "unused variable `%s'", def->name);
|
||||||
}
|
}
|
||||||
|
if (!def->removed) {
|
||||||
Hash_Del (defs_by_name, def->name);
|
Hash_Del (defs_by_name, def->name);
|
||||||
|
def->removed = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,6 +179,8 @@ maybe_func
|
||||||
$<scope>$.type = current_type;
|
$<scope>$.type = current_type;
|
||||||
$<scope>$.pscope = param_scope.scope_next;
|
$<scope>$.pscope = param_scope.scope_next;
|
||||||
param_scope.scope_next = 0;
|
param_scope.scope_next = 0;
|
||||||
|
param_scope.alloc = ¶m_scope.locals;
|
||||||
|
*param_scope.alloc = 0;
|
||||||
pr_scope = ¶m_scope;
|
pr_scope = ¶m_scope;
|
||||||
}
|
}
|
||||||
param_list
|
param_list
|
||||||
|
@ -220,7 +222,7 @@ def_item
|
||||||
def_name
|
def_name
|
||||||
: NAME
|
: NAME
|
||||||
{
|
{
|
||||||
$$ = PR_GetDef (current_type, $1, pr_scope, pr_scope ? &pr_scope->num_locals : &numpr_globals);
|
$$ = PR_GetDef (current_type, $1, pr_scope, pr_scope ? pr_scope->alloc : &numpr_globals);
|
||||||
current_def = $$;
|
current_def = $$;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
@ -353,9 +355,28 @@ end_function
|
||||||
;
|
;
|
||||||
|
|
||||||
statement_block
|
statement_block
|
||||||
: '{' statements '}'
|
: '{'
|
||||||
{
|
{
|
||||||
$$ = $2;
|
def_t *scope = PR_NewDef (&type_void, ".scope", pr_scope);
|
||||||
|
scope->alloc = pr_scope->alloc;
|
||||||
|
scope->used = 1;
|
||||||
|
pr_scope->scope_next = scope->scope_next;
|
||||||
|
scope->scope_next = 0;
|
||||||
|
pr_scope = scope;
|
||||||
|
}
|
||||||
|
statements '}'
|
||||||
|
{
|
||||||
|
def_t *scope = pr_scope;
|
||||||
|
|
||||||
|
PR_FlushScope (pr_scope, 1);
|
||||||
|
|
||||||
|
while (scope->scope_next)
|
||||||
|
scope = scope->scope_next;
|
||||||
|
|
||||||
|
scope->scope_next = pr_scope->scope->scope_next;
|
||||||
|
pr_scope->scope->scope_next = pr_scope;
|
||||||
|
pr_scope = pr_scope->scope;
|
||||||
|
$$ = $3;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -656,8 +677,10 @@ build_scope (function_t *f, def_t *func)
|
||||||
def_t *def;
|
def_t *def;
|
||||||
type_t *ftype = func->type;
|
type_t *ftype = func->type;
|
||||||
|
|
||||||
|
func->alloc = &func->locals;
|
||||||
|
|
||||||
for (i = 0; i < ftype->num_parms; i++) {
|
for (i = 0; i < ftype->num_parms; i++) {
|
||||||
def = PR_GetDef (ftype->parm_types[i], pr_parm_names[i], func, &func->num_locals);
|
def = PR_GetDef (ftype->parm_types[i], pr_parm_names[i], func, func->alloc);
|
||||||
f->parm_ofs[i] = def->ofs;
|
f->parm_ofs[i] = def->ofs;
|
||||||
if (i > 0 && f->parm_ofs[i] < f->parm_ofs[i - 1])
|
if (i > 0 && f->parm_ofs[i] < f->parm_ofs[i - 1])
|
||||||
Error ("bad parm order");
|
Error ("bad parm order");
|
||||||
|
@ -705,7 +728,7 @@ finish_function (function_t *f)
|
||||||
df->s_name = ReuseString (f->def->name);
|
df->s_name = ReuseString (f->def->name);
|
||||||
df->s_file = s_file;
|
df->s_file = s_file;
|
||||||
df->numparms = f->def->type->num_parms;
|
df->numparms = f->def->type->num_parms;
|
||||||
df->locals = f->def->num_locals;
|
df->locals = f->def->locals;
|
||||||
df->parm_start = 0;
|
df->parm_start = 0;
|
||||||
for (i = 0; i < df->numparms; i++)
|
for (i = 0; i < df->numparms; i++)
|
||||||
df->parm_size[i] = type_size[f->def->type->parm_types[i]->type];
|
df->parm_size[i] = type_size[f->def->type->parm_types[i]->type];
|
||||||
|
|
|
@ -738,8 +738,8 @@ PR_FinishCompilation (void)
|
||||||
for (f = pr_functions; f; f = f->next) {
|
for (f = pr_functions; f; f = f->next) {
|
||||||
if (f->builtin)
|
if (f->builtin)
|
||||||
continue;
|
continue;
|
||||||
if (f->def->num_locals > num_localdefs) {
|
if (f->def->locals > num_localdefs) {
|
||||||
num_localdefs = f->def->num_locals;
|
num_localdefs = f->def->locals;
|
||||||
big_function = f->def->name;
|
big_function = f->def->name;
|
||||||
}
|
}
|
||||||
f->dfunc->parm_start = numpr_globals;
|
f->dfunc->parm_start = numpr_globals;
|
||||||
|
|
Loading…
Reference in a new issue