Package abstrasy

Examples of abstrasy.StaticHeap


        /**
         * préparer la gestion de la pile de manière terminale...
         */
        Interpreter interpreter = Interpreter.mySelf();
        StaticHeap global = interpreter.getGLOBAL();

        global.push();
        // retenir le heap de control
        Heap controlh=global.current();
       
        /**
         * si la forme compte un symbole...
         */
        if (snode != null)
            Heap.defv(snode.getSymbol(), xnode);



        /**
         * la section a besoin d'un contexte.
         */
        global.push();
        // on retient la référence du contexte courant...
        Heap local=global.current();

        /**
         * A toutes fins utiles, on sauve l'état de la pile...
         */
        BaseContextSnapshot contextSnapshot = new BaseContextSnapshot(interpreter);
       
       
        /**
         * Début de la boucle...
         */

        boolean retry = true;
        Node res = null;
   
        boolean oldInLoop=interpreter.isInLoop();

        while (retry) {
           
            if (anode!=null)
                controlh.put(PCoder.ARGV, anode);
            else
                controlh.put(PCoder.ARGV, Node.createCList());
           
            try {
                _clear_closure_(local);
                interpreter.setInLoop(true);
                res = xnode.exec(true);
                retry = false;
            }
            catch (RestartException retrex) {
                contextSnapshot.restore();
                Node experform = retrex.getPerform();
               
                if (experform == null)
                    retry = true;
               
                else if (xnode.equalsIdentity(experform))
                    retry = true;
           
                else {
                    retry = false;
                    throw retrex;
                }
               
                anode = retrex.getArgs();
               
               
            }
            catch (SilentException silex) {
                contextSnapshot.restore();
                retry = false;
                throw silex;
            }
            catch (Exception excep) {
                contextSnapshot.restore();
                retry = false;
                throw excep; // fait suivre l'exception...
            }
        }

        interpreter.setInLoop(oldInLoop);
       
        // heap local
        global.pull();
        // headp controlh
        global.pull();
       
        return res;

    }
View Full Code Here


       
        startAt.isGoodArgsLength(false, 5); // plus petite forme (switch{a} case v {...})
       
        int ssize = startAt.size();
       
        StaticHeap global = Interpreter.mySelf().getGLOBAL();
       
        int i = 1;
       
        /*
         * premier élément doit être évalué. C'est la valeur à tester...
         */
        Node refnode = startAt.getSubNode(i++, Node.TYPE_LAZY);
        Node rnode = refnode;
        global.push();
        rnode = refnode.exec(true);
        global.pull();
       
        /*
         * La donnée doit être d'un type équipolent.
         */
        rnode.requireNodeType(Node.VTYPE_EQUALISABLE);

        /*
         * c'est parti...
         */
        while (i < ssize) {
            // case ou else ... ?
            Node op=startAt.getSubNode(i++, Node.TYPE_PCODE);
            if(op.isPCode(PCoder.PC_CASE)){
                // case vn {...}
                Node compnode = startAt.getSubNode(i++, Node.VTYPE_EQUALISABLE);
                if (Node.equalsNodes(rnode, compnode)) {
                    // si a == vn ...
                    Node xnode = startAt.getSubNode(i++, Node.VTYPE_VALUABLE);
                    Node res = xnode;
                    if (xnode.isLazy()) {
                        global.push();
                        res = xnode.exec(true);
                        global.pull();
                    }
                    return res;
                }
                else{
                    // si a!= vn, on saute l'expression...
                    i++;
                }
            }
            else if(op.isPCode(PCoder.PC_ELSE)){
                Node xnode = startAt.getSubNode(i++, Node.VTYPE_VALUABLE);
                // tester si la fin de l'expression est bien atteinte...
                if(i<ssize)
                    throw new InterpreterException(StdErrors.Syntax_error);
                Node res = xnode;
                if (xnode.isLazy()) {
                    global.push();
                    res = xnode.exec(true);
                    global.pull();
                }
                return res;
            }
            else
                throw new InterpreterException(StdErrors.Syntax_error);
View Full Code Here

        Node enode = startAt.getSubNode(3, Node.TYPE_LAZY);
        startAt.isGoodArgsCnt(4);
        Node xnode = null;
        Node rnode = null;
        Interpreter interpreter = Interpreter.mySelf();
        StaticHeap global = interpreter.getGLOBAL();
        boolean oldCanLoop = interpreter.isCanLoop();
        boolean oldInLoop = interpreter.isInLoop();
        interpreter.setCanLoop(true);
        interpreter.setInLoop(true);

        try {


            if (tcode.isPCode(PCoder.PC_DO)) {
                //

                // closure pour le corps
                abstrasy.Heap myClosure = new Heap();
                global.push(myClosure);
               
                /*
                 * Correction du 10 mai 2011:
                 * =========================
                 *    Les boucles du type do{...} s'arrête dès qu'un résultat est retourné. Cela ne signifie
                 *    bien entendu pas que la condition qui permet l'itération n'est pas vérifiée. Toutefois,
                 *    comme les boucle du type do{...} ne peuvent retourner qu'un seul résultat, il est inutile
                 *    de relancer l'itération suivante ddès qu'un résultat est fourni. Ainsi, pour permettre
                 *    de continuer la boucle, il est possible de placer le résultat dans une variable et non de
                 *    la retourner directement comme résultat.
                 *   
                 */
                while (xnode==null && interpreter.isCanIterate() && !xPC_ConditionX(myClosure, cnode)) {
                    _clear_closure_(myClosure);
                    xnode = enode.exec(true);
                }
                global.pull();

            }
            else if (tcode.isPCode(PCoder.PC_LIST)) {
                /**
                 * boucle génératrice de listes.
                 *
                 * respecte la protection des listes finale.
                 *
                 * -> résultat jamais final.
                 *
                 */
                xnode = Node.createCList();
                //

                // closure pour le corps
                abstrasy.Heap myClosure = new Heap();

                global.push(myClosure);
                while (interpreter.isCanIterate() && !xPC_ConditionX(myClosure, cnode)) {
                     _clear_closure_(myClosure);
                    rnode = enode.exec(true);
                    if (rnode != null) xnode.addElement(rnode.secure());
                }
                global.pull();

            }
            else {
                // erreur de syntaxe.
                throw new InterpreterException(StdErrors.Syntax_error);
View Full Code Here

       
        Node res = null;

        Interpreter myself = Interpreter.mySelf();

        StaticHeap global = myself.getGLOBAL();

        Exception reportExcep = null;

        /*
         * Si les nodes sont déjà verrrouillés par moi-même, on ignore le verrouillage...
         */
        for(int i=0;i<vnodes.length;i++){
            vnodes[i].acquirelock(Interpreter.SHARED_INTERPRETER);
            if(!vnodes[i].isLockedBy(Interpreter.SHARED_INTERPRETER)){ throw new InterpreterException(StdErrors.Critical_section_locking_fail); }
        }

        /*
         * Nouveau contexte...
         */
        global.push();
       
        // Entrée dans la section verrouillée réussie...
        myself.actor_LOCKSECTION();
       
        try {
            res = xnode.exec(true);
        }
        catch (Exception e) {
            reportExcep = e;
        }

        //Sortie de la section verrouillée...
        myself.actor_UNLOCKSECTION();
       
        /*
         * restaurer le contexte
         */
        global.pull();


        /*
         * Si les nodes étaient déjà verrouillés par moi-même avant, je ne déverrouille
         * pas ici...
View Full Code Here

        Node xnode = startAt.getSubNode(1, Node.TYPE_LAZY);


        Node res = null;
        Interpreter myself = Interpreter.mySelf();
        StaticHeap global = myself.getGLOBAL();
        InterpreterSemaphore sema = Interpreter.getSemaphore();

        Exception reportExcep = null;


        /*
         * l'acteur est-il déjà verrouillé ?
         */
        boolean dejaLock = myself.actor_ISMUTEX();

        /*
         * Adapter en fonction du verrouillage...
         */
        if (dejaLock) {
            // sema déjà verrouillé
            myself.actor_LOCKMUTEX();
        }
        else {
            sema.lockMutex();
            // inclu actor_LOCK();
        }


        /*
         * Nouveau contexte...
         */
        global.push();
       
        try {
            res = xnode.exec(true);
        }
        catch (Exception e) {
            reportExcep = e;
        }

        /*
         * restaurer le contexte
         */
        global.pull();
       
       
        /*
         * adapter en fonction du verrouillage...
         */
 
View Full Code Here

       
        Node res = null;

        Interpreter myself = Interpreter.mySelf();

        StaticHeap global = myself.getGLOBAL();
        InterpreterSemaphore sema = Interpreter.getSemaphore();

        Exception reportExcep = null;

        /*
         * Si les nodes sont déjà verrrouillés par moi-même, on ignore le verrouillage...
         */
        for(int i=0;i<vnodes.length;i++){
            vnodes[i].lockLock();
        }
       

       /*
        * Nouveau contexte...
        */
        global.push();
       
        // Entrée dans la section verrouillée réussie...
        myself.actor_LOCKSECTION();
       
        try {
            res = xnode.exec(true);
        }
        catch (Exception e) {
            reportExcep = e;
        }

        //Sortie de la section verroui
        myself.actor_UNLOCKSECTION();
       
        /*
         * restaurer le contexte
         */
        global.pull();


        /*
         * Si les nodes étaient déjà verrouillés par moi-même avant, je ne déverrouille
         * pas ici...
View Full Code Here

       
        Node res = null;

        Interpreter myself = Interpreter.mySelf();

        StaticHeap global = myself.getGLOBAL();

        Exception reportExcep = null;

        /*
         * Si les nodes sont déjà verrrouillés par moi-même, on ignore le verrouillage...
         */
        for(int i=0;i<vnodes.length;i++){
            vnodes[i].acquirelock(myself);
            if(!vnodes[i].isLockedBy(myself)){ throw new InterpreterException(StdErrors.Critical_section_locking_fail); }
        }

        /*
         * Nouveau contexte...
         */
        global.push();

        // Entrée dans la section verrouillée réussie...
        myself.actor_LOCKSECTION();

        try {
            res = xnode.exec(true);
        }
        catch (Exception e) {
            reportExcep = e;
        }

        //Sortie de la section verrouillée...
        myself.actor_UNLOCKSECTION();
       
        /*
         * restaurer le contexte
         */
        global.pull();


        /*
         * Si les nodes étaient déjà verrouillés par moi-même avant, je ne déverrouille
         * pas ici...
View Full Code Here

    public Node eval(Node startAt) throws Exception {
        //System.out.println("FOREVER: "+startAt.toString());
        startAt.isGoodArgsCnt(2);
        Node enode = startAt.getSubNode(1, Node.TYPE_LAZY);
        Interpreter interpreter = Interpreter.mySelf();
        StaticHeap global = interpreter.getGLOBAL();
        boolean oldCanLoop = interpreter.isCanLoop();
        boolean oldInLoop = interpreter.isInLoop();
        interpreter.setCanLoop(true);
        interpreter.setInLoop(true);
        Node xnode = null;

        try {

            /*
             * Correction du 10 mai 2011:
             * =========================
             *    Les boucles du type do{...} s'arrête dès qu'un résultat est retourné. Cela ne signifie
             *    bien entendu pas que la condition qui permet l'itération n'est pas vérifiée. Toutefois,
             *    comme les boucle du type do{...} ne peuvent retourner qu'un seul résultat, il est inutile
             *    de relancer l'itération suivante ddès qu'un résultat est fourni. Ainsi, pour permettre
             *    de continuer la boucle, il est possible de placer le résultat dans une variable et non de
             *    la retourner directement comme résultat.
             *   
             */
            global.push();
            Heap local = global.current();
           
            while (interpreter.isCanIterate() && xnode==null) {
                xnode = enode.exec(true);
                _clear_closure_(local);
            }
            global.pull();

        }
        catch (Exception ex) {
            interpreter.consumeBreakCode_onLoop();
            interpreter.setCanLoop(oldCanLoop);
View Full Code Here

            }
            boolean untilLoop = modenode.isPCode(PCoder.PC_UNTIL);
            Node enode = startAt.getSubNode(1, Node.TYPE_LAZY);

            Interpreter interpreter = Interpreter.mySelf();
            StaticHeap global = interpreter.getGLOBAL();
            boolean oldCanLoop = interpreter.isCanLoop();
            boolean oldInLoop = interpreter.isInLoop();
            interpreter.setCanLoop(true);
            interpreter.setInLoop(true);
            //
            int href = global.size();
            int slock = global.getOffset();
           
            Heap local=new Heap();
            global.push(local);
            //
           
            /*
             * Correction du 10 mai 2011:
             * =========================
             *    Les boucles du type do{...} s'arrête dès qu'un résultat est retourné. Cela ne signifie
             *    bien entendu pas que la condition qui permet l'itération n'est pas vérifiée. Toutefois,
             *    comme les boucle du type do{...} ne peuvent retourner qu'un seul résultat, il est inutile
             *    de relancer l'itération suivante ddès qu'un résultat est fourni. Ainsi, pour permettre
             *    de continuer la boucle, il est possible de placer le résultat dans une variable et non de
             *    la retourner directement comme résultat.
             *   
             */
            boolean loop = true;
            while (loop) {
                _clear_closure_(local);
                xnode = enode.exec(true);
                loop = xnode==null && interpreter.isCanIterate() && (untilLoop ? !xPC_Condition(local, cnode): xPC_Condition(local, cnode));
            }
            //
            global.pull();

            if (global.size() != href) {
                global.setOffset(slock);
                global.setSize(href); // restaurer le heap à la bonne taille
            }
            //
            interpreter.consumeBreakCode_onLoop();
            interpreter.setCanLoop(oldCanLoop);
            interpreter.setInLoop(oldInLoop);
            return xnode;

        }
        else {
            // forme (do {...} forever)
            modenode = startAt.getSubNode(2, Node.TYPE_PCODE);
            if (!modenode.isPCode(PCoder.PC_FOREVER)) {
                throw new InterpreterException(StdErrors.Syntax_error);
            }
        }
        Node enode = startAt.getSubNode(1, Node.TYPE_LAZY);
        Interpreter interpreter = Interpreter.mySelf();
        StaticHeap global = interpreter.getGLOBAL();
        boolean oldCanLoop = interpreter.isCanLoop();
        boolean oldInLoop = interpreter.isInLoop();
        interpreter.setCanLoop(true);
        interpreter.setInLoop(true);

        //
        int href = global.size();
        int slock = global.getOffset();
        //int tlock = global.getTailStack().getLock();


        // FERMETURE NECESSAIRE...
        //System.out.println("FOREVER: push...");
        global.push();
        Heap local=global.current();
       
        /*
         * Correction du 10 mai 2011:
         * =========================
         *    Les boucles du type do{...} s'arrête dès qu'un résultat est retourné. Cela ne signifie
         *    bien entendu pas que la condition qui permet l'itération n'est pas vérifiée. Toutefois,
         *    comme les boucle du type do{...} ne peuvent retourner qu'un seul résultat, il est inutile
         *    de relancer l'itération suivante ddès qu'un résultat est fourni. Ainsi, pour permettre
         *    de continuer la boucle, il est possible de placer le résultat dans une variable et non de
         *    la retourner directement comme résultat.
         *   
         */
        while (xnode==null && interpreter.isCanIterate()) {
            _clear_closure_(local);
            xnode = enode.exec(true);
        }
        global.pull();


        //global.getTailStack().setLock(tlock); // restore la tail recursive Stack...
        if (global.size() != href) {
            global.setOffset(slock);
            global.setSize(href); // restaurer le heap à la bonne taille
        }
        //
        interpreter.consumeBreakCode_onLoop();
        interpreter.setCanLoop(oldCanLoop);
        interpreter.setInLoop(oldInLoop);
View Full Code Here

            }
            boolean untilLoop = modenode.isPCode(PCoder.PC_UNTIL);
            Node enode = startAt.getSubNode(1, Node.TYPE_LAZY);

            Interpreter interpreter = Interpreter.mySelf();
            StaticHeap global = interpreter.getGLOBAL();
            boolean oldCanLoop = interpreter.isCanLoop();
            boolean oldInLoop = interpreter.isInLoop();
            interpreter.setCanLoop(true);
            interpreter.setInLoop(true);


            //
            int href = global.size();
            int slock = global.getOffset();
            try {

                //
                boolean loop = true;
                while (loop && interpreter.isCanIterate()) {

                    global.push();
                    rnode = enode.exec(true);
                    global.pull();

                    if (rnode != null)
                        xnode.addElement(rnode.secure());
                   
                    loop = (untilLoop ? !xPC_Condition(global, cnode): xPC_Condition(global, cnode));
                }
                //
            }
            catch (Exception ex) {
                interpreter.consumeBreakCode_onLoop();
                interpreter.setCanLoop(oldCanLoop);
                interpreter.setInLoop(oldInLoop);
                throw ex;
            }

            if (global.size() != href) {
                global.setOffset(slock);
                global.setSize(href); // restaurer le heap à la bonne taille
            }
            //
            interpreter.consumeBreakCode_onLoop();
            interpreter.setCanLoop(oldCanLoop);
            interpreter.setInLoop(oldInLoop);
View Full Code Here

TOP

Related Classes of abstrasy.StaticHeap

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.