Commit 083c43e2 authored by Ondřej Zajíček's avatar Ondřej Zajíček

fixes some 64-bit related bugs.

Filter code used 'aux' integer field of 'symbol' struct to store ptr
to next symbol and both 'aux2' and 'def' fields for value.
Changed to just 'def' for value and 'aux2' for ptr to next symbol.
Also another minor bugfix.
parent 165a6227
......@@ -76,7 +76,7 @@ struct symbol {
struct sym_scope *scope;
int class;
int aux;
void *aux2;
void *aux2;
void *def;
char name[1];
};
......
......@@ -79,15 +79,11 @@ type:
one_decl:
type SYM {
$2 = cf_define_symbol($2, SYM_VARIABLE | $1, NULL);
struct f_val * val = cfg_alloc(sizeof(struct f_val));
val->type = $1;
$2 = cf_define_symbol($2, SYM_VARIABLE | $1, val);
DBG( "New variable %s type %x\n", $2->name, $1 );
$2->aux = 0;
{
struct f_val * val;
val = cfg_alloc(sizeof(struct f_val));
val->type = $1;
$2->aux2 = val;
}
$2->aux2 = NULL;
$$=$2;
}
;
......@@ -96,7 +92,7 @@ one_decl:
decls: /* EMPTY */ { $$ = NULL; }
| one_decl ';' decls {
$$ = $1;
$$->aux = (int) $3;
$$->aux2 = $3;
}
;
......@@ -104,7 +100,7 @@ decls: /* EMPTY */ { $$ = NULL; }
declsn: one_decl { $$ = $1; }
| declsn ';' one_decl {
$$ = $1;
$$->aux = (int) $3;
$$->aux2 = $3;
}
;
......@@ -167,8 +163,7 @@ function_def:
cf_push_scope($2);
} function_params function_body {
$2->def = $5;
$2->aux = (int) $4;
$2->aux2 = $5;
$2->aux2 = $4;
DBG("Hmm, we've got one function here - %s\n", $2->name);
cf_pop_scope();
}
......@@ -313,14 +308,14 @@ function_call:
$$ = f_new_inst();
$$->code = P('c','a');
$$->a1.p = inst;
$$->a2.p = $1->aux2;
sym = (void *) $1->aux;
$$->a2.p = $1->def;
sym = $1->aux2;
while (sym || inst) {
if (!sym || !inst)
cf_error("Wrong number of arguments for function %s.", $1->name);
DBG( "You should pass parameter called %s\n", sym->name);
inst->a1.p = sym;
sym = (void *) sym->aux;
sym = sym->aux2;
inst = inst->next;
}
}
......@@ -377,7 +372,7 @@ term:
case SYM_VARIABLE | T_PATH:
case SYM_VARIABLE | T_CLIST:
$$->code = 'C';
$$->a1.p = $1->aux2;
$$->a1.p = $1->def;
break;
default:
cf_error("%s: variable expected.", $1->name );
......@@ -420,14 +415,14 @@ term:
$$ = f_new_inst();
$$->code = P('c','a');
$$->a1.p = inst;
$$->a2.p = $1->aux2;
sym = (void *) $1->aux;
$$->a2.p = $1->def;
sym = $1->aux2;
while (sym || inst) {
if (!sym || !inst)
cf_error("Wrong number of arguments for function %s.", $1->name);
DBG( "You should pass parameter called %s\n", sym->name);
inst->a1.p = sym;
sym = (void *) sym->aux;
sym = sym->aux2;
inst = inst->next;
}
}
......
......@@ -437,16 +437,23 @@ interpret(struct f_inst *what)
case T_PATH_MASK:
if (sym->class != (SYM_VARIABLE | v2.type))
runtime( "Assigning to variable of incompatible type" );
* (struct f_val *) sym->aux2 = v2;
* (struct f_val *) sym->def = v2;
break;
default:
bug( "Set to invalid type" );
}
break;
case 'c': /* integer (or simple type) constant */
/* some constants have value in a2, some in *a1.p, strange. */
case 'c': /* integer (or simple type) constant, or string, or set */
res.type = what->aux;
res.val.i = what->a2.i;
if (res.type == T_SET)
res.val.t = what->a2.p;
else if (res.type == T_STRING)
res.val.s = what->a2.p;
else
res.val.i = what->a2.i;
break;
case 'C':
res = * ((struct f_val *) what->a1.p);
......
......@@ -165,8 +165,8 @@ rdump(void *res)
char x[16];
resource *r = res;
bsprintf(x, "%%%ds%%08x ", indent);
debug(x, "", (int) r);
bsprintf(x, "%%%ds%%p ", indent);
debug(x, "", r);
if (r)
{
debug("%s ", r->class->name);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment