|
|
1.1 ! root 1: #include "global.h" ! 2: lispval ! 3: Iarray(fun,args) ! 4: register lispval fun,args; ! 5: { ! 6: register lispval reg, temp; ! 7: register struct argent *lbot, *np; ! 8: snpand(2); ! 9: ! 10: lbot = np; ! 11: if(np + 3 > nplim) ! 12: namerr(); ! 13: np++->val = fun->accfun; ! 14: np++->val = args; ! 15: np++->val = fun; ! 16: return(vtemp = Lfuncal()); ! 17: ! 18: } ! 19: #define FINTF 1 ! 20: #define FDOUBF 2 ! 21: #define FORTSUB 0 ! 22: ! 23: lispval ! 24: Ifcall(a) ! 25: register lispval a; ! 26: { ! 27: int *alloca(); ! 28: register int *arglist; ! 29: register int index; ! 30: register struct argent *mynp; ! 31: register lispval ltemp; ! 32: register struct argent *lbot; ! 33: register struct argent *np; ! 34: int nargs = np - lbot; ! 35: ! 36: arglist = alloca((nargs + 1) * sizeof(int)); ! 37: mynp = lbot; ! 38: *arglist = nargs; ! 39: for(index = 1; index <= nargs; index++) { ! 40: switch(TYPE(mynp->val)) { ! 41: case INT: ! 42: arglist[index] = sp(); ! 43: stack(0); ! 44: *(int *) arglist[index] = mynp->val->i; ! 45: break; ! 46: case DOUB: ! 47: stack(0); ! 48: arglist[index] = sp(); ! 49: stack(0); ! 50: *(double *) arglist[index] = mynp->val->r; ! 51: break; ! 52: case ARRAY: ! 53: arglist[index] = (int) mynp->val->data; ! 54: } ! 55: mynp++; ! 56: } ! 57: switch(a->discipline->i) { ! 58: case FINTF: ! 59: ltemp = inewint(callg(a->entry,arglist)); ! 60: break; ! 61: ! 62: case FDOUBF: ! 63: ltemp = newdoub(); ! 64: ltemp->r = (* ((double (*)()) callg))(a->entry,arglist); ! 65: break; ! 66: ! 67: default: ! 68: case FORTSUB: ! 69: callg(a->entry,arglist); ! 70: ltemp = tatom; ! 71: } ! 72: } ! 73: callg(funct,arglist) ! 74: lispval (*funct)(); ! 75: int *arglist; ! 76: { ! 77: asm(" callg *8(ap),*4(ap)"); ! 78: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.