version 1.63, 2008/09/01 06:20:33 |
version 1.66, 2010/04/23 04:44:52 |
|
|
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* |
* |
* $OpenXM: OpenXM_contrib2/asir2000/parse/eval.c,v 1.62 2007/12/20 03:31:01 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/parse/eval.c,v 1.65 2009/03/04 09:15:36 ohara Exp $ |
*/ |
*/ |
#include <ctype.h> |
#include <ctype.h> |
#include "ca.h" |
#include "ca.h" |
Line 943 pointer evalf(FUNC f,FNODE a,FNODE opt) |
|
Line 943 pointer evalf(FUNC f,FNODE a,FNODE opt) |
|
} |
} |
if ( !stack_base ) { |
if ( !stack_base ) { |
#if defined(GC7) |
#if defined(GC7) |
struct GC_stack_base sb; |
stack_base = (void *)GC_get_main_stack_base(); |
GC_get_stack_base(&sb); |
|
stack_base = (void *)sb.mem_base; |
|
#else |
#else |
stack_base = (void *)GC_get_stack_base(); |
stack_base = (void *)GC_get_stack_base(); |
#endif |
#endif |
Line 989 pointer evalf(FUNC f,FNODE a,FNODE opt) |
|
Line 987 pointer evalf(FUNC f,FNODE a,FNODE opt) |
|
for ( tn = f->f.usrf->args, sn = BDY(args); |
for ( tn = f->f.usrf->args, sn = BDY(args); |
sn; tn = NEXT(tn), sn = NEXT(sn) ) |
sn; tn = NEXT(tn), sn = NEXT(sn) ) |
ASSPV((int)FA0((FNODE)BDY(tn)),BDY(sn)); |
ASSPV((int)FA0((FNODE)BDY(tn)),BDY(sn)); |
|
f_return = f_break = f_continue = 0; |
if ( f->f.usrf->module ) { |
if ( f->f.usrf->module ) { |
prev_mpvs = MPVS; |
prev_mpvs = MPVS; |
MPVS = f->f.usrf->module->pvs; |
MPVS = f->f.usrf->module->pvs; |
Line 1197 pointer bevalf(FUNC f,NODE a) |
|
Line 1196 pointer bevalf(FUNC f,NODE a) |
|
for ( tn = f->f.usrf->args, sn = a; |
for ( tn = f->f.usrf->args, sn = a; |
sn; tn = NEXT(tn), sn = NEXT(sn) ) |
sn; tn = NEXT(tn), sn = NEXT(sn) ) |
ASSPV((int)FA0((FNODE)BDY(tn)),BDY(sn)); |
ASSPV((int)FA0((FNODE)BDY(tn)),BDY(sn)); |
|
f_return = f_break = f_continue = 0; |
|
if ( f->f.usrf->module ) { |
|
prev_mpvs = MPVS; |
|
MPVS = f->f.usrf->module->pvs; |
|
val = evalstat((SNODE)BDY(f->f.usrf)); |
|
MPVS = prev_mpvs; |
|
} else |
|
val = evalstat((SNODE)BDY(f->f.usrf)); |
|
f_return = f_break = f_continue = 0; poppvs(); |
|
break; |
|
case A_PURE: |
|
val = evalpf(f->f.puref,a,0); |
|
break; |
|
default: |
|
sprintf(errbuf,"bevalf : %s undefined",NAME(f)); |
|
error(errbuf); |
|
break; |
|
} |
|
return val; |
|
} |
|
|
|
pointer bevalf_with_opts(FUNC f,NODE a,NODE opts) |
|
{ |
|
pointer val; |
|
int i,n; |
|
NODE tn,sn; |
|
VS pvs,prev_mpvs; |
|
char errbuf[BUFSIZ]; |
|
|
|
if ( f->id == A_UNDEF ) { |
|
sprintf(errbuf,"bevalf : %s undefined",NAME(f)); |
|
error(errbuf); |
|
} |
|
if ( getsecuremode() && !PVSS && !f->secure ) { |
|
sprintf(errbuf,"bevalf : %s not permitted",NAME(f)); |
|
error(errbuf); |
|
} |
|
if ( f->id != A_PARI ) { |
|
for ( i = 0, tn = a; tn; i++, tn = NEXT(tn) ); |
|
if ( ((n = f->argc)>= 0 && i != n) || (n < 0 && i > -n) ) { |
|
sprintf(errbuf,"bevalf : argument mismatch in %s()",NAME(f)); |
|
error(errbuf); |
|
} |
|
} |
|
switch ( f->id ) { |
|
case A_BIN: |
|
current_option = opts; |
|
if ( !n ) { |
|
cur_binf = f; |
|
(*f->f.binf)(&val); |
|
} else { |
|
cur_binf = f; |
|
(*f->f.binf)(a,&val); |
|
} |
|
cur_binf = 0; |
|
break; |
|
case A_PARI: |
|
cur_binf = f; |
|
val = evalparif(f,a); |
|
cur_binf = 0; |
|
break; |
|
case A_USR: |
|
pvs = f->f.usrf->pvs; |
|
if ( PVSS ) |
|
((VS)BDY(PVSS))->at = evalstatline; |
|
MKNODE(tn,pvs,PVSS); PVSS = tn; |
|
CPVS = (VS)ALLOCA(sizeof(struct oVS)); BDY(PVSS) = (pointer)CPVS; |
|
CPVS->usrf = f; CPVS->n = CPVS->asize = pvs->n; |
|
CPVS->opt = opts; |
|
if ( CPVS->n ) { |
|
CPVS->va = (struct oPV *)ALLOCA(CPVS->n*sizeof(struct oPV)); |
|
bcopy((char *)pvs->va,(char *)CPVS->va, |
|
(int)(pvs->n*sizeof(struct oPV))); |
|
} |
|
if ( nextbp ) |
|
nextbplevel++; |
|
for ( tn = f->f.usrf->args, sn = a; |
|
sn; tn = NEXT(tn), sn = NEXT(sn) ) |
|
ASSPV((int)FA0((FNODE)BDY(tn)),BDY(sn)); |
|
f_return = f_break = f_continue = 0; |
if ( f->f.usrf->module ) { |
if ( f->f.usrf->module ) { |
prev_mpvs = MPVS; |
prev_mpvs = MPVS; |
MPVS = f->f.usrf->module->pvs; |
MPVS = f->f.usrf->module->pvs; |