Ejemplo n.º 1
0
        /* 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);
        }