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;
}
}
}