/* Utility Methods */ /** apply_setup * Unpacks arguments to Procedure in Result from list * Pre: Result contains Procedure; register k1 a list; * register k2 the length of that list (fixnum) * Returns number of arguments * Called by inlined IL of apply */ public static int applySetup(int k1, int k2) { #if HAS_PERFORMANCE_COUNTERS if (applySetupCounter != null) { applySetupCounter.Increment(); } #endif int n = ((SFixnum)Reg.getRegister(k2)).value; if (n < Reg.NREGS - 1) { // Load registers 1 through n with elts of list in k1 Reg.spreadRegister(k1, n); // SObject p = Reg.getRegister(k1); // for (int i = 1; i <= n; ++i) { // SPair pp = (SPair) p; // Reg.setRegister(i, pp.getFirst()); // p = pp.getRest(); // } } else { // Load registers 1 to NREGS-2 with first NREGS-2 elts of // list in k1 and put remaining tail in register NREG-1 SPair p = (SPair)Reg.getRegister(k1); for (int i = 1; i <= Reg.NREGS - 2; ++i) { Reg.setRegister(i, p.getFirst()); p = (SPair)p.getRest(); } Reg.setRegister(Reg.NREGS - 1, p); } return(n); }