Пример #1
0
        static void captureContinuation (Context cx, CallFrame frame, int stackTop)
        {
            Continuation c = new Continuation ();
            ScriptRuntime.setObjectProtoAndParent (c, ScriptRuntime.getTopCallScope (cx));

            // Make sure that all frames upstack frames are frozen
            CallFrame x = frame.parentFrame;
            while (x != null && !x.frozen) {
                x.frozen = true;
                // Allow to GC unused stack space
                for (int i = x.savedStackTop + 1; i != x.stack.Length; ++i) {
                    // Allow to GC unused stack space
                    x.stack [i] = null;
                }
                if (x.savedCallOp == Token.CALL) {
                    // the call will always overwrite the stack top with the result
                    x.stack [x.savedStackTop] = null;
                }
                else {
                    if (x.savedCallOp != Token.NEW)
                        Context.CodeBug ();
                    // the new operator uses stack top to store the constructed
                    // object so it shall not be cleared: see comments in
                    // setCallResult
                }
                x = x.parentFrame;
            }

            c.initImplementation (frame.parentFrame);
            frame.stack [stackTop] = c;
        }