*** empty log message ***

This commit is contained in:
hyung-hwan 2006-03-26 14:03:08 +00:00
parent 8fbc31d210
commit 67d7ca36ff

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c,v 1.17 2006-03-25 17:04:36 bacon Exp $ * $Id: run.c,v 1.18 2006-03-26 14:03:08 bacon Exp $
*/ */
#include <xp/awk/awk.h> #include <xp/awk/awk.h>
@ -12,7 +12,11 @@
#define STACK_INCREMENT 512 #define STACK_INCREMENT 512
static int __activate_block (xp_awk_t* awk, xp_awk_nde_blk_t* nde); #define STACK_AT(awk,n) ((awk)->run.stack[(awk)->run.stack_base+n])
#define STACK_NARGS(awk) ((xp_size_t)STACK_AT(awk,3))
#define STACK_ARG(awk,n) STACK_AT(awk,3+1+(n))
#define STACK_LOCAL(awk,n) STACK_AT(awk,3+STACK_NARGS(awk)+1+(n))
static int __run_block (xp_awk_t* awk, xp_awk_nde_blk_t* nde); static int __run_block (xp_awk_t* awk, xp_awk_nde_blk_t* nde);
static int __run_statement (xp_awk_t* awk, xp_awk_nde_t* nde); static int __run_statement (xp_awk_t* awk, xp_awk_nde_t* nde);
static int __run_if_statement (xp_awk_t* awk, xp_awk_nde_if_t* nde); static int __run_if_statement (xp_awk_t* awk, xp_awk_nde_if_t* nde);
@ -28,7 +32,8 @@ static xp_awk_val_t* __eval_assignment (xp_awk_t* awk, xp_awk_nde_ass_t* nde);
static xp_awk_val_t* __eval_binary (xp_awk_t* awk, xp_awk_nde_exp_t* nde); static xp_awk_val_t* __eval_binary (xp_awk_t* awk, xp_awk_nde_exp_t* nde);
static xp_awk_val_t* __eval_funccall (xp_awk_t* awk, xp_awk_nde_call_t* nde); static xp_awk_val_t* __eval_funccall (xp_awk_t* awk, xp_awk_nde_call_t* nde);
static int __push (xp_awk_t* awk, void* val); static int __raw_push (xp_awk_t* awk, void* val);
static int __raw_pop (xp_awk_t* awk);
int __printval (xp_awk_pair_t* pair) int __printval (xp_awk_pair_t* pair)
{ {
@ -59,29 +64,47 @@ xp_awk_map_walk (&awk->run.named, __printval);
return 0; return 0;
} }
static int __activate_block (xp_awk_t* awk, xp_awk_nde_blk_t* nde)
{
/*
if (nde->nlocals == 0 && awk->run.top_frame != XP_NULL) {
}
*/
return -1;
}
static int __run_block (xp_awk_t* awk, xp_awk_nde_blk_t* nde) static int __run_block (xp_awk_t* awk, xp_awk_nde_blk_t* nde)
{ {
xp_awk_nde_t* p; xp_awk_nde_t* p;
xp_size_t nlocals;
xp_assert (nde->type == XP_AWK_NDE_BLK); xp_assert (nde->type == XP_AWK_NDE_BLK);
p = nde->body; p = nde->body;
nlocals = nde->nlocals;
//xp_printf (XP_TEXT("securing space for local variables nlocals = %d\n"), nlocals);
/* secure space for local variables */
while (nlocals > 0)
{
--nlocals;
if (__raw_push(awk,xp_awk_val_nil) == -1)
{
// TODO: proper error handling...
return -1;
}
/* refupval is not required for xp_awk_val_nil */
}
//xp_printf (XP_TEXT("executing block statements\n"));
while (p != XP_NULL) while (p != XP_NULL)
{ {
if (__run_statement(awk,p) == -1) return -1; if (__run_statement(awk,p) == -1) return -1;
p = p->next; p = p->next;
} }
//xp_printf (XP_TEXT("popping off local variables\n"));
/* pop off local variables */
nlocals = nde->nlocals;
while (nlocals > 0)
{
--nlocals;
xp_awk_refdownval (STACK_LOCAL(awk,nlocals));
__raw_pop (awk);
}
return 0; return 0;
} }
@ -310,11 +333,11 @@ static int __run_return_statement (xp_awk_t* awk, xp_awk_nde_return_t* nde)
if (nde->val != XP_NULL) if (nde->val != XP_NULL)
{ {
xp_printf (XP_TEXT("returning....\n")); //xp_printf (XP_TEXT("returning....\n"));
val = __eval_expression(awk, nde->val); val = __eval_expression(awk, nde->val);
if (val == XP_NULL) return -1; if (val == XP_NULL) return -1;
awk->run.stack[awk->run.stack_base+2] = val; awk->run.stack[awk->run.stack_base+2] = val;
xp_printf (XP_TEXT("set return value....\n")); //xp_printf (XP_TEXT("set return value....\n"));
} }
// TODO: make the function exit.... // TODO: make the function exit....
return 0; return 0;
@ -362,8 +385,7 @@ static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde)
case XP_AWK_NDE_ARG: case XP_AWK_NDE_ARG:
{ {
xp_awk_nde_var_t* tgt = (xp_awk_nde_var_t*)nde; xp_awk_nde_var_t* tgt = (xp_awk_nde_var_t*)nde;
val = STACK_ARG(awk,tgt->id.idxa);
val = awk->run.stack[awk->run.stack_base+4+tgt->id.idxa];
} }
break; break;
@ -375,25 +397,31 @@ static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde)
xp_awk_pair_t* pair; xp_awk_pair_t* pair;
pair = xp_awk_map_get(&awk->run.named,tgt->id.name); pair = xp_awk_map_get(&awk->run.named,tgt->id.name);
/*
if (pair == XP_NULL) val = xp_awk_val_nil;
else val = xp_awk_cloneval (pair->val);
*/
val = (pair == XP_NULL)? xp_awk_val_nil: pair->val; val = (pair == XP_NULL)? xp_awk_val_nil: pair->val;
} }
break; break;
case XP_AWK_NDE_NAMEDIDX: case XP_AWK_NDE_NAMEDIDX:
break;
case XP_AWK_NDE_GLOBAL: case XP_AWK_NDE_GLOBAL:
break;
case XP_AWK_NDE_GLOBALIDX: case XP_AWK_NDE_GLOBALIDX:
break;
case XP_AWK_NDE_LOCAL: case XP_AWK_NDE_LOCAL:
{
xp_awk_nde_var_t* tgt = (xp_awk_nde_var_t*)nde;
val = STACK_LOCAL(awk,tgt->id.idxa);
}
break;
case XP_AWK_NDE_LOCALIDX: case XP_AWK_NDE_LOCALIDX:
break;
case XP_AWK_NDE_POS: case XP_AWK_NDE_POS:
break;
case XP_AWK_NDE_CALL: case XP_AWK_NDE_CALL:
val = __eval_funccall(awk, (xp_awk_nde_call_t*)nde); val = __eval_funccall(awk, (xp_awk_nde_call_t*)nde);
@ -455,10 +483,12 @@ static xp_awk_val_t* __eval_assignment (xp_awk_t* awk, xp_awk_nde_ass_t* nde)
} }
else if (tgt->type == XP_AWK_NDE_LOCAL) else if (tgt->type == XP_AWK_NDE_LOCAL)
{ {
STACK_LOCAL(awk,tgt->id.idxa) = val;
xp_awk_refupval (val);
} }
else if (tgt->type == XP_AWK_NDE_ARG) else if (tgt->type == XP_AWK_NDE_ARG)
{ {
awk->run.stack[awk->run.stack_base+4+tgt->id.idxa] = val; STACK_ARG(awk,tgt->id.idxa) = val;
xp_awk_refupval (val); xp_awk_refupval (val);
} }
else if (tgt->type == XP_AWK_NDE_NAMEDIDX) else if (tgt->type == XP_AWK_NDE_NAMEDIDX)
@ -572,23 +602,23 @@ static xp_awk_val_t* __eval_funccall (xp_awk_t* awk, xp_awk_nde_call_t* nde)
saved_stack_top = awk->run.stack_top; saved_stack_top = awk->run.stack_top;
xp_printf (XP_TEXT("setting up function stack frame stack_top = %ld stack_base = %ld\n"), awk->run.stack_top, awk->run.stack_base); //xp_printf (XP_TEXT("setting up function stack frame stack_top = %ld stack_base = %ld\n"), awk->run.stack_top, awk->run.stack_base);
if (__push(awk,(void*)awk->run.stack_base) == -1) return XP_NULL; if (__raw_push(awk,(void*)awk->run.stack_base) == -1) return XP_NULL;
if (__push(awk,(void*)saved_stack_top) == -1) if (__raw_push(awk,(void*)saved_stack_top) == -1)
{ {
/* TODO: run.stack recovery */ /* TODO: run.stack recovery */
return XP_NULL; return XP_NULL;
} }
/* secure space for return value. */ /* secure space for return value. */
if (__push(awk,xp_awk_val_nil) == -1) if (__raw_push(awk,xp_awk_val_nil) == -1)
{ {
/* TODO: run.stack recovery */ /* TODO: run.stack recovery */
return XP_NULL; return XP_NULL;
} }
/* secure space for nargs */ /* secure space for nargs */
if (__push(awk,xp_awk_val_nil) == -1) if (__raw_push(awk,xp_awk_val_nil) == -1)
{ {
/* TODO: run.stack recovery */ /* TODO: run.stack recovery */
return XP_NULL; return XP_NULL;
@ -605,7 +635,7 @@ xp_printf (XP_TEXT("setting up function stack frame stack_top = %ld stack_base =
return XP_NULL; return XP_NULL;
} }
if (__push(awk,v) == -1) if (__raw_push(awk,v) == -1)
{ {
/* TODO: run.stack recovery */ /* TODO: run.stack recovery */
return XP_NULL; return XP_NULL;
@ -624,30 +654,30 @@ xp_printf (XP_TEXT("setting up function stack frame stack_top = %ld stack_base =
// TODO: do i need to check if the number of arguments matches the actual arguments...???? this might be the compiler job... // TODO: do i need to check if the number of arguments matches the actual arguments...???? this might be the compiler job...
xp_printf (XP_TEXT("running function body\n")); //xp_printf (XP_TEXT("running function body\n"));
xp_assert (func->body->type == XP_AWK_NDE_BLK); xp_assert (func->body->type == XP_AWK_NDE_BLK);
if (__run_block(awk,(xp_awk_nde_blk_t*)func->body) == -1) return XP_NULL; if (__run_block(awk,(xp_awk_nde_blk_t*)func->body) == -1) return XP_NULL;
xp_printf (XP_TEXT("block run complete\n")); //xp_printf (XP_TEXT("block run complete\n"));
/* refdown args in the run.stack */ /* refdown args in the run.stack */
nargs = (xp_size_t)awk->run.stack[awk->run.stack_base+3]; nargs = STACK_NARGS(awk);
xp_printf (XP_TEXT("block run complete nargs = %d\n"), nargs); //xp_printf (XP_TEXT("block run complete nargs = %d\n"), nargs);
for (i = 0; i < nargs; i++) for (i = 0; i < nargs; i++)
{ {
xp_awk_refdownval (awk->run.stack[awk->run.stack_base+4+i]); xp_awk_refdownval (STACK_ARG(awk,i));
} }
xp_printf (XP_TEXT("got return value\n")); //xp_printf (XP_TEXT("got return value\n"));
v = awk->run.stack[awk->run.stack_base+2]; v = awk->run.stack[awk->run.stack_base+2];
awk->run.stack_top = (xp_size_t)awk->run.stack[awk->run.stack_base+1]; awk->run.stack_top = (xp_size_t)awk->run.stack[awk->run.stack_base+1];
awk->run.stack_base = (xp_size_t)awk->run.stack[awk->run.stack_base+0]; awk->run.stack_base = (xp_size_t)awk->run.stack[awk->run.stack_base+0];
xp_printf (XP_TEXT("returning from function stack_top=%ld, stack_base=%ld\n"), awk->run.stack_top, awk->run.stack_base); //xp_printf (XP_TEXT("returning from function stack_top=%ld, stack_base=%ld\n"), awk->run.stack_top, awk->run.stack_base);
return v; return v;
} }
static int __push (xp_awk_t* awk, void* val) static int __raw_push (xp_awk_t* awk, void* val)
{ {
if (awk->run.stack_top >= awk->run.stack_limit) if (awk->run.stack_top >= awk->run.stack_limit)
{ {
@ -665,3 +695,10 @@ static int __push (xp_awk_t* awk, void* val)
awk->run.stack[awk->run.stack_top++] = val; awk->run.stack[awk->run.stack_top++] = val;
return 0; return 0;
} }
static int __raw_pop (xp_awk_t* awk)
{
xp_assert (awk->run.stack_top > awk->run.stack_base);
awk->run.stack_top--;
}