/* SCCS - @(#)MethodCallNode.java 1.7 - 09/17/99 - 12:19:08 */
/*
* Copyright (c) 1997 USC Brain Project. email nsl@java.usc.edu.
*/
//
// MethodCallNode
////////////////////////////////////////////////////////////
/**
* MethodCallNode - base_expr.method_sym(args)
*/
package npp.src.util;
import pp.src.jbf.*;
public class MethodCallNode extends ExprNode{
public MethodCallNode(YYtoken sym, ExprsNode exprs) {
super(sym);
lvalue = false;
base_expr = null;
method_sym = sym;
args = exprs;
makeinst = false;
expandedname=null;
type = null;
}
public MethodCallNode(ExprNode base, YYtoken sym, ExprsNode exprs) {
super(base);
lvalue = false;
base_expr = base;
method_sym = sym;
args = exprs;
makeinst = false;
expandedname=null;
type=null;
}
/**
* Code generation.
* Do some transformation to diff method.
* @param npp Nsl Preprocessor
* @return error value
*/
public int genCode(NslPreProcessor npp) {
if( base_expr != null) {
base_expr.genCode(npp);
if(base_expr.processed) processed = true;
code = base_expr.code+"."+method_sym.text+"(";
type = new TypeNode(base_expr);
type.type = TypeNode.UNKNOWN;
}
else {
if (expandedname!=null) code = (expandedname+"(");
else code = (method_sym.text+"(");
type = null;
}
if ( args != null) {
java.util.Enumeration E = args.list.elements();
ExprNode expr;
if(E.hasMoreElements()) {
expr = (ExprNode)E.nextElement();
expr.genCode(npp);
code += expr.code;
if(expr.processed) processed = true;
if (base_expr == null) type = new TypeNode(expr);
}
while(E.hasMoreElements()) {
expr = (ExprNode)E.nextElement();
expr.genCode(npp);
code += (","+expr.code);
if(expr.processed) processed = true;
}
}
code += ")";
if (base_expr != null) {
if(base_expr.type != null && base_expr.type.nslNumeric) {
// NslNumeric types
if (method_sym.text.equals("getSize") ||
method_sym.text.equals("getSize1") ||
method_sym.text.equals("getSize2") ) {
type = new TypeNode(base_expr.type);
type.nslNumeric = false;
type.numeric = true;
type.dim = type.nslDim = 0;
type.type = TypeNode.INT; // getSize returns integer
lvalue = false;
}
else if (method_sym.text.equals("get")) {
type = new TypeNode(base_expr.type);
type.nslNumeric = false;
type.numeric = true;
if ( args != null) {
type.dim -= args.list.size(); // dim changed after doing get
}
}
}
else
// very complex base type, do nothing
return NO_OP;
} // if (base_expr != null)
else if (base_expr == null && args != null && expandedname != null) { // expandedname if not null, its a nslfunc
java.util.Enumeration E = args.list.elements();
ExprNode expr;
if (args.list.size() != 2)
expr = (ExprNode)E.nextElement();
else {
ExprNode expr1 = (ExprNode)E.nextElement();
ExprNode expr2 = (ExprNode)E.nextElement();
expr = expr1.type.dim>expr2.type.dim ? expr1: expr2;
}
type = new TypeNode(expr.type);
type.nslNumeric = false;
type.numeric = true;
if (method_sym.text.equals("nslSum") ||
method_sym.text.equals("nslDotProd") ||
method_sym.text.equals("nslMaxValue") ||
method_sym.text.equals("nslMinValue") ) {
type.dim = type.nslDim = 0;
lvalue = false;
}
else if (method_sym.text.equals("nslTrans")) {
/*if (expr.code.equals("1") && type.dim == 2) {
type.dim = type.nslDim = 1; // Transpose of of n*1 is 1d
code += ", 1";
}
else type.dim = type.nslDim = 2;
*/
type.dim = type.nslDim = 2;
}
else if (method_sym.text.equals("nslGetColumn"))
type.dim -= type.nslDim -= 1;
else if (method_sym.text.equals("nslGetRow")) {
if (type.dim > 0) type.dim = type.nslDim = 1;
}
}
else if (base_expr == null && args == null && expandedname != null && method_sym.text.equals("nslRandom")) {
type = new TypeNode(method_sym);
type.nslNumeric = false;
type.numeric = true;
type.dim = type.nslDim = 0;
lvalue = false;
type.type = TypeNode.DOUBLE;
}
// code += ")";
return NO_OP;
}
void addInstanceName(String name) {
if (args.list.firstElement() instanceof NewNode) {
((NewNode)(args.list.firstElement())).addInstanceName(name);
}
}
public static int NO_OP = 0;
public static int SUCCESS = 1;
public static int NULL_ARGUMENT_ERROR = 2;
public static int INVALID_ARGUMENT_ERROR = 3;
public boolean makeinst;
public ExprNode base_expr;
public YYtoken method_sym;
public ExprsNode args;
public String expandedname=null;
}