Package abstrasy.pcfx

Source Code of abstrasy.pcfx.PCFx_pending

package abstrasy.pcfx;


import abstrasy.Interpreter;
import abstrasy.Node;
import abstrasy.StaticHeap;

import java.util.LinkedList;

/**
* Abstrasy Interpreter
*
* Copyright : Copyright (c) 2006-2012, Luc Bruninx.
*
* Concédée sous licence EUPL, version 1.1 uniquement (la «Licence»).
*
* Vous ne pouvez utiliser la présente oeuvre que conformément à la Licence.
* Vous pouvez obtenir une copie de la Licence à l’adresse suivante:
*
*   http://www.osor.eu/eupl
*
* Sauf obligation légale ou contractuelle écrite, le logiciel distribué sous
* la Licence est distribué "en l’état", SANS GARANTIES OU CONDITIONS QUELLES
* QU’ELLES SOIENT, expresses ou implicites.
*
* Consultez la Licence pour les autorisations et les restrictions
* linguistiques spécifiques relevant de la Licence.
*
*
* @author Luc Bruninx
* @version 1.0
*/

public class PCFx_pending extends PCFx {

    public PCFx_pending() {
    }
   
    /**
     * eval
     *
     * @param startAt Node
     * @return Node
     * @throws Exception
     * @todo Implémenter cette méthode abstrasy.PCFx
     */
    public Node eval(Node startAt) throws Exception {
        /*
         * (pending {...}) : Déclare une section avec mise en attente de messages.
         *
         *   A l'intérieur de cette section, les messages peuvent être mis en attente à l'aide de
         *   (postpone <msg>).
         *  
         *   A la sortie de cette section, que cette sortie soit le résultat de l'évaluation habituelle
         *   ou suite à une exception, les messages en attente sont replacé sur la file des messages à
         *   récupérer par (receive).
         *
         */
        startAt.isGoodArgsCnt(2);

        /*
         * on extrait la section lazy
         */
        Node xnode = startAt.getSubNode(1, Node.TYPE_LAZY);

        /*
         * autres variables...
         */
        Node res = null;

        Interpreter myself = Interpreter.mySelf();

        StaticHeap global = myself.getGLOBAL();

        /*
         * Permet de repporter les exceptions
         */
        Exception reportExcep = null;

        /*
         * ouverture de la file d'attente
         */
       
        LinkedList<Node> old_queue = myself.pendingMsg_OPEN();
       
        /*
         * Nouveau contexte...
         */
        global.push();
       
        try {
            res = xnode.exec(true);
        }
        catch (Exception e) {
            reportExcep = e;
        }

        /*
         * restaurer le contexte
         */
        global.pull();
       
        /*
         * fermeture de la file d'attente dans tous les cas...
         */
        myself.pendingMsg_CLOSE(old_queue);

        /*
         * reporter l'exception s'il y en a une...
         */
        if (reportExcep != null) {
            throw reportExcep;
        }

        return res;
    }

}
TOP

Related Classes of abstrasy.pcfx.PCFx_pending

TOP
Copyright © 2018 www.massapi.com. 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.