001: /*
002: * $Id: IsNode.java,v 1.19 2002/09/16 08:05:05 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.codec.Code;
014: import anvil.codec.ConstantPool;
015: import anvil.script.compiler.ByteCompiler;
016: import anvil.script.Context;
017: import java.io.IOException;
018:
019: /**
020: * class IsNode
021: *
022: * @author: Jani Lehtimäki
023: */
024: public class IsNode extends UnaryParent {
025:
026: public static final int IS_DEFINED = -2;
027: public static final int IS_UNDEFINED = -3;
028:
029: private int _type;
030:
031: public IsNode(Node child, int type) {
032: super (child);
033: _type = type;
034: }
035:
036: public IsNode(Node child) {
037: super (child);
038: }
039:
040: public int typeOf() {
041: return Node.EXPR_IS;
042: }
043:
044: public Any eval() {
045: Any value = _child.eval();
046:
047: switch (_type) {
048: case IS_DEFINED:
049: return value.isDefined() ? Any.TRUE : Any.FALSE;
050:
051: case IS_UNDEFINED:
052: return value.isUndefined() ? Any.TRUE : Any.FALSE;
053:
054: case Any.IS_NULL:
055: return value.isNull() ? Any.TRUE : Any.FALSE;
056:
057: case Any.IS_BOOLEAN:
058: return value.isBoolean() ? Any.TRUE : Any.FALSE;
059:
060: case Any.IS_INT:
061: return value.isInt() ? Any.TRUE : Any.FALSE;
062:
063: case Any.IS_DOUBLE:
064: return value.isDouble() ? Any.TRUE : Any.FALSE;
065:
066: case Any.IS_STRING:
067: return value.isString() ? Any.TRUE : Any.FALSE;
068:
069: case Any.IS_BINARY:
070: return value.isBinary() ? Any.TRUE : Any.FALSE;
071:
072: case Any.IS_PATTERN:
073: return value.isPattern() ? Any.TRUE : Any.FALSE;
074:
075: case Any.IS_RANGE:
076: return value.isRange() ? Any.TRUE : Any.FALSE;
077:
078: case Any.IS_MAP:
079: return value.isMap() ? Any.TRUE : Any.FALSE;
080:
081: case Any.IS_TUPLE:
082: return value.isTuple() ? Any.TRUE : Any.FALSE;
083:
084: case Any.IS_LIST:
085: return value.isList() ? Any.TRUE : Any.FALSE;
086:
087: case Any.IS_ARRAY:
088: return value.isArray() ? Any.TRUE : Any.FALSE;
089:
090: case Any.IS_CLASS:
091: return value.isClass() ? Any.TRUE : Any.FALSE;
092:
093: case Any.IS_REF:
094: return value.isRef() ? Any.TRUE : Any.FALSE;
095:
096: }
097:
098: return Any.FALSE;
099: }
100:
101: public void compile(ByteCompiler context, int operation) {
102: _child.compile(context, GET);
103: Code code = context.getCode();
104: ConstantPool pool = code.getPool();
105: switch (_type) {
106: case IS_DEFINED:
107: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
108: "isDefined", "()Z"));
109: break;
110:
111: case IS_UNDEFINED:
112: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
113: "isUndefined", "()Z"));
114: break;
115:
116: case Any.IS_NULL:
117: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
118: "isNull", "()Z"));
119: break;
120:
121: case Any.IS_BOOLEAN:
122: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
123: "isBoolean", "()Z"));
124: break;
125:
126: case Any.IS_INT:
127: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
128: "isInt", "()Z"));
129: break;
130:
131: case Any.IS_DOUBLE:
132: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
133: "isDouble", "()Z"));
134: break;
135:
136: case Any.IS_STRING:
137: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
138: "isString", "()Z"));
139: break;
140:
141: case Any.IS_BINARY:
142: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
143: "isBinary", "()Z"));
144: break;
145:
146: case Any.IS_PATTERN:
147: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
148: "isPattern", "()Z"));
149: break;
150:
151: case Any.IS_RANGE:
152: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
153: "isRange", "()Z"));
154: break;
155:
156: case Any.IS_MAP:
157: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
158: "isMap", "()Z"));
159: break;
160:
161: case Any.IS_TUPLE:
162: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
163: "isTuple", "()Z"));
164: break;
165:
166: case Any.IS_LIST:
167: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
168: "isList", "()Z"));
169: break;
170:
171: case Any.IS_ARRAY:
172: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
173: "isArray", "()Z"));
174: break;
175:
176: case Any.IS_CLASS:
177: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
178: "isClass", "()Z"));
179: break;
180:
181: case Any.IS_REF:
182: code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
183: "isRef", "()Z"));
184: break;
185: }
186: if (operation != GET_BOOLEAN) {
187: context.boolean2any();
188: }
189: }
190:
191: }
|