001: /*
002: * $Id: ExpressionList.java,v 1.13 2002/09/16 08:05:04 jkl Exp $
003: *
004: * Copyright (c) 2002 Njet Communications Ltd. All Rights Reserved.
005: *
006: * Use is subject to license terms, as defined in
007: * Anvil Sofware License, Version 1.1. See LICENSE
008: * file, or http://njet.org/license-1.1.txt
009: */
010: package anvil.script.expression;
011:
012: import anvil.core.Any;
013: import anvil.core.AnyTuple;
014: import anvil.codec.Code;
015: import anvil.codec.ConstantPool;
016: import anvil.script.compiler.ByteCompiler;
017: import anvil.script.Context;
018: import java.io.IOException;
019:
020: /**
021: * class ExpressionList
022: *
023: * @author: Jani Lehtimäki
024: */
025: public class ExpressionList extends MultiParent {
026:
027: public ExpressionList(int childs) {
028: super (childs);
029: }
030:
031: public ExpressionList(Node child) {
032: super (1);
033: setChild(0, child);
034: }
035:
036: public ExpressionList(Node left, Node right) {
037: super (2);
038: setChild(0, left);
039: setChild(1, right);
040: }
041:
042: public ExpressionList(Node left, Node middle, Node right) {
043: super (3);
044: setChild(0, left);
045: setChild(1, middle);
046: setChild(2, right);
047: }
048:
049: public ExpressionList(Node[] childs) {
050: super (childs.length);
051: for (int i = childs.length - 1; i >= 0; i--) {
052: setChild(i, childs[i]);
053: }
054: }
055:
056: public ExpressionList(Expression[] childs, Node rightmost) {
057: super (childs.length + 1);
058: int n = childs.length;
059: for (int i = n - 1; i >= 0; i--) {
060: setChild(i, childs[i].getChild());
061: }
062: setChild(n, rightmost);
063: }
064:
065: public int typeOf() {
066: return EXPR_LIST;
067: }
068:
069: public Any eval() {
070: if (childs() > 0) {
071: return new AnyTuple(evalChilds(0));
072: } else {
073: return Any.EMPTY_TUPLE;
074: }
075: }
076:
077: public void compile(ByteCompiler context, int operation) {
078: Code code = context.getCode();
079: ConstantPool pool = code.getPool();
080: int clazz = pool.addClass("anvil/core/AnyTuple");
081: int n = childs();
082: if (n > 0) {
083: code.anew(clazz);
084: code.dup();
085: code.iconst(n);
086: code.anewarray(context.TYPE_ANY);
087: for (int i = 0; i < n; i++) {
088: code.dup();
089: code.iconst(i);
090: getChild(i).compile(context, GET);
091: code.aastore();
092: }
093: code.invokespecial(pool.addMethodRef(clazz, "<init>",
094: "([Lanvil/core/Any;)V"));
095: } else {
096: code.getstatic(pool.addFieldRef(context.TYPE_ANY,
097: "EMPTY_TUPLE", "Lanvil/core/AnyTuple;"));
098: }
099: if (operation == context.GET_BOOLEAN) {
100: context.any2boolean();
101: }
102: }
103:
104: }
|