=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/primitive.c,v retrieving revision 1.14 retrieving revision 1.17 diff -u -p -r1.14 -r1.17 --- OpenXM/src/kan96xx/Kan/primitive.c 2004/09/12 08:55:36 1.14 +++ OpenXM/src/kan96xx/Kan/primitive.c 2004/09/16 02:22:03 1.17 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/primitive.c,v 1.13 2004/09/12 02:37:57 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/primitive.c,v 1.16 2004/09/12 10:58:28 takayama Exp $ */ /* primitive.c */ /* The functions in this module were in stackmachine.c */ @@ -40,6 +40,9 @@ static char *operatorType(type) return("Unknown operator"); } +#define evalEA(ob1) if (ob1.tag == SexecutableArray) {\ + executeExecutableArray(ob1,(char *)NULL,0); ob1 = Kpop();} + /****** primitive functions ***************************************** the values must be greater than 1. 0 is used for special purposes.*/ #define Sadd 1 @@ -540,31 +543,36 @@ int executePrimitive(ob) /* Postscript primitives :arithmetic */ case Sadd: - ob1 = Kpop(); + ob1 = Kpop(); ob2 = Kpop(); + evalEA(ob1); evalEA(ob2); rob = KooAdd(ob1,ob2); Kpush(rob); break; case Ssub: ob2 = Kpop(); ob1 = Kpop(); + evalEA(ob1); evalEA(ob2); rob = KooSub(ob1,ob2); Kpush(rob); break; case Smult: ob2 = Kpop(); ob1 = Kpop(); + evalEA(ob1); evalEA(ob2); rob = KooMult(ob1,ob2); Kpush(rob); break; case Sidiv: ob2 = Kpop(); ob1 = Kpop(); + evalEA(ob1); evalEA(ob2); rob = KooDiv(ob1,ob2); Kpush(rob); break; case Sdiv: ob2 = Kpop(); ob1 = Kpop(); + evalEA(ob1); evalEA(ob2); rob = KooDiv2(ob1,ob2); Kpush(rob); break; @@ -609,6 +617,8 @@ int executePrimitive(ob) /* Or; [[a_00 ....] [a_10 ....] ....] [1 0] any put. MultiIndex. */ ob1 = Kpop(); ob2 = Kpop(); ob3 = Kpop(); switch(ob2.tag) { + case SuniversalNumber: + ob2 = Kto_int32(ob2); /* do not break and go to Sinteger */ case Sinteger: switch(ob3.tag) { case Sarray: @@ -643,6 +653,7 @@ int executePrimitive(ob) if (ob5.tag != Sarray) errorStackmachine("Object pointed by the multi-index is not array (put)\n"); ob4 = getoa(ob2,i); + if (ob4.tag == SuniversalNumber) ob4 = Kto_int32(ob4); if (ob4.tag != Sinteger) errorStackmachine("Index has to be an integer. (put)\n"); k = ob4.lc.ival; @@ -745,7 +756,7 @@ int executePrimitive(ob) break; } while (1) { - status = executeExecutableArray(ob1,(char *)NULL); + status = executeExecutableArray(ob1,(char *)NULL,1); if ((status & STATUS_BREAK) || GotoP) break; /* here, do not return 1. Do not propagate exit signal outside of the loop. */ @@ -784,7 +795,7 @@ int executePrimitive(ob) */ for ( ; i<=lim; i += inc) { Kpush(KpoInteger(i)); - status = executeExecutableArray(ob1,(char *)NULL); + status = executeExecutableArray(ob1,(char *)NULL,1); if ((status & STATUS_BREAK) || GotoP) goto xyz; } }else{ @@ -793,7 +804,7 @@ int executePrimitive(ob) */ for ( ; i>=lim; i += inc) { Kpush(KpoInteger(i)); - status = executeExecutableArray(ob1,(char *)NULL); + status = executeExecutableArray(ob1,(char *)NULL,1); if ((status & STATUS_BREAK) || GotoP) goto xyz; } } @@ -825,8 +836,8 @@ int executePrimitive(ob) for (i=0; i 0) { signal(SIGALRM,ctrlC); alarm((unsigned int) n); - status = executeExecutableArray(ob1,(char *)NULL); + status = executeExecutableArray(ob1,(char *)NULL,0); cancelAlarm(); }else{ before_real = time(&before_real); times(&before); - status = executeExecutableArray(ob1,(char *)NULL); + status = executeExecutableArray(ob1,(char *)NULL,0); times(&after); after_real = time(&after_real); ob1 = newObjectArray(3);