Package abstrasy.interpreter

Source Code of abstrasy.interpreter.ContextualCall

package abstrasy.interpreter;

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

public class ContextualCall {

  Node symbol;
    Node object;
    Node methode;

  public ContextualCall(Node object, ASymbol symbol,Node methode) {
    this.symbol = Node.createSymbol(symbol);
        this.object = object;
        this.methode=methode;
  }

  /**
   * Réalise l'appel de la méthode en assignant le contexte d'évaluation.
   * @param argvList (arguments de argv -> Node.VLIST)
   * @return
   * @throws Exception
   */
  public Node call(Node argvList) throws Exception {
        Node expr=Node.createExpr().append(methode);//.append(symbol); (optimisation l.bruninx, 2012-06-26)
        if(argvList!=null) expr.appendChildsOf(argvList);
        //Heap.push(); (optimisation l.bruninx, 2012-06-26)
        //Heap.setSELF(object);
    return expr.exec(false);
        //Heap.pull();
        //return result;
  }

    /**
   * Réalise l'appel de la méthode en assignant le contexte d'évaluation.
   * @param argvList (arguments de argv -> Node.VLIST)
     * @param index (numero index de l'élément à partir duquel on récupère les args)
     *              (Ceci évite de recopier inutilement les arguments dans une liste temporaire)
   * @return
   * @throws Exception
   */
  public Node call(Node argvList,int index) throws Exception {
        Node expr=Node.createExpr().append(methode);
        if(argvList!=null) expr.appendChildsOf(argvList,index);
    return expr.exec(false);
  }
    /**
   * Réalise l'appel de la méthode en assignant le contexte d'évaluation.
     *
     * On notera que call_unary() est une optimisation spéciale de call(). En effet, call_unary() correspond au cas où la méthode est unaire (un seul argument).
     * Il n'est donc possible d'éviter la création d'une liste d'arguments intermédiaire uniquement pour un seul argument.
     *
   * @param arg0 (argument unique de argv)
   * @return
   * @throws Exception
   */
  public Node call_unary(Node arg0) throws Exception {
        Node expr=Node.createExpr().append(methode);//.append(symbol); (optimisation l.bruninx, 2012-06-26)
        if(arg0!=null)expr.append(arg0);
    //Heap.push(); (optimisation l.bruninx, 2012-06-26)
        //Heap.setSELF(object);
    return expr.exec(false);
        //Heap.pull();
        //return result;
  }
   
  /**
   * Trouve la méthode dont le symbole est indiqué à partir du Heap.
   * La recherche se poursuit dans chaque super-instance.
   * @param vObject
   * @param symbole
   * @return
   */
  public static ContextualCall createContextualCall(Node vObject, String symbole) {
        //System.out.println("Context OBJ="+vObject);
        //System.out.println("Context SYM="+symbole);
        Node meth;
        try{
            ASymbol symb=new ASymbol(PCoder.unselfing(symbole));
            meth=Heap.getv(vObject, symb);
            /*
             * meth prend déjà une référence vers sont propre heap.
             */
            return new ContextualCall(vObject,symb,meth);
        }
        catch(Exception e){
            return null;
        }
      
  }

}
TOP

Related Classes of abstrasy.interpreter.ContextualCall

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.