Package abstrasy.pcfx

Source Code of abstrasy.pcfx.PCFx_atomic

package abstrasy.pcfx;


import abstrasy.Heap;
import abstrasy.Node;
import abstrasy.ASymbol;

import abstrasy.interpreter.InterpreterException;
import abstrasy.interpreter.StdErrors;

/**
* 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_atomic extends PCFx {

    public PCFx_atomic() {
    }
   
    private final static boolean _not_cas_(Node donnee, Node attendu, Node nouveau) throws Exception {
        synchronized(donnee){
            if(Node.equalsNodes(donnee, attendu)){
                nouveau.derefTo(donnee);
                return false;
            }
            else{
                return true;
            }
        }
    }
   
    public Node eval(Node startAt) throws Exception {
        /*
         * forme (atomic v {...})
         */
        startAt.isGoodArgsCnt(3);
        /*
         * Récupération du symbole...
         */
        Node symbolen = startAt.elementAt(1);
        symbolen.requireNodeType(Node.TYPE_SYMBOL);
        ASymbol symbole=symbolen.getSymbol();
        /**
         * le symbole ne peut pas être composé...
         */
        if (symbole.getIdsCnt() > 1) throw new InterpreterException(StdErrors.Invalid_symbol);
       
        Node section = startAt.getSubNode(2, Node.TYPE_LAZY);
        Node a, a_before, a_after, res;
        do{
            a = startAt.getSubNode(1, Node.VTYPE_BY_VALUE); // récupération de la donnée (primitive simple)
            a_before = a.deref();                           // de cette manière deref() suffit...
            a_after = a_before.deref();
            Heap.push(); // première barrière...
            Heap.defv(symbole,a_after); // variable synonyme - et homonyme ici...
            Heap.push(); // isolation en cas de (define 'v ...)
            res=section.exec(true); // évaluation de la section
            Heap.pull(); // retirer l'isolation...
            Heap.pull(); // retirer la barrière... a_work contient le Node (principe des variable synonymes)
        }
        while(_not_cas_(a,a_before,a_after));
       
        return res;
    }

}
TOP

Related Classes of abstrasy.pcfx.PCFx_atomic

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.