/*
* $Id: IsNode.java,v 1.19 2002/09/16 08:05:05 jkl Exp $
*
* Copyright (c) 2002 Njet Communications Ltd. All Rights Reserved.
*
* Use is subject to license terms, as defined in
* Anvil Sofware License, Version 1.1. See LICENSE
* file, or http://njet.org/license-1.1.txt
*/
package anvil.script.expression;
import anvil.core.Any;
import anvil.codec.Code;
import anvil.codec.ConstantPool;
import anvil.script.compiler.ByteCompiler;
import anvil.script.Context;
import java.io.IOException;
/**
* class IsNode
*
* @author: Jani Lehtim�ki
*/
public class IsNode extends UnaryParent
{
public static final int IS_DEFINED = -2;
public static final int IS_UNDEFINED = -3;
private int _type;
public IsNode(Node child, int type)
{
super(child);
_type = type;
}
public IsNode(Node child)
{
super(child);
}
public int typeOf()
{
return Node.EXPR_IS;
}
public Any eval()
{
Any value = _child.eval();
switch(_type) {
case IS_DEFINED:
return value.isDefined() ? Any.TRUE : Any.FALSE;
case IS_UNDEFINED:
return value.isUndefined() ? Any.TRUE : Any.FALSE;
case Any.IS_NULL:
return value.isNull() ? Any.TRUE : Any.FALSE;
case Any.IS_BOOLEAN:
return value.isBoolean() ? Any.TRUE : Any.FALSE;
case Any.IS_INT:
return value.isInt() ? Any.TRUE : Any.FALSE;
case Any.IS_DOUBLE:
return value.isDouble() ? Any.TRUE : Any.FALSE;
case Any.IS_STRING:
return value.isString() ? Any.TRUE : Any.FALSE;
case Any.IS_BINARY:
return value.isBinary() ? Any.TRUE : Any.FALSE;
case Any.IS_PATTERN:
return value.isPattern() ? Any.TRUE : Any.FALSE;
case Any.IS_RANGE:
return value.isRange() ? Any.TRUE : Any.FALSE;
case Any.IS_MAP:
return value.isMap() ? Any.TRUE : Any.FALSE;
case Any.IS_TUPLE:
return value.isTuple() ? Any.TRUE : Any.FALSE;
case Any.IS_LIST:
return value.isList() ? Any.TRUE : Any.FALSE;
case Any.IS_ARRAY:
return value.isArray() ? Any.TRUE : Any.FALSE;
case Any.IS_CLASS:
return value.isClass() ? Any.TRUE : Any.FALSE;
case Any.IS_REF:
return value.isRef() ? Any.TRUE : Any.FALSE;
}
return Any.FALSE;
}
public void compile(ByteCompiler context, int operation)
{
_child.compile(context, GET);
Code code = context.getCode();
ConstantPool pool = code.getPool();
switch(_type) {
case IS_DEFINED:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isDefined", "()Z"));
break;
case IS_UNDEFINED:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isUndefined", "()Z"));
break;
case Any.IS_NULL:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isNull", "()Z"));
break;
case Any.IS_BOOLEAN:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isBoolean", "()Z"));
break;
case Any.IS_INT:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isInt", "()Z"));
break;
case Any.IS_DOUBLE:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isDouble", "()Z"));
break;
case Any.IS_STRING:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isString", "()Z"));
break;
case Any.IS_BINARY:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isBinary", "()Z"));
break;
case Any.IS_PATTERN:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isPattern", "()Z"));
break;
case Any.IS_RANGE:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isRange", "()Z"));
break;
case Any.IS_MAP:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isMap", "()Z"));
break;
case Any.IS_TUPLE:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isTuple", "()Z"));
break;
case Any.IS_LIST:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isList", "()Z"));
break;
case Any.IS_ARRAY:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isArray", "()Z"));
break;
case Any.IS_CLASS:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isClass", "()Z"));
break;
case Any.IS_REF:
code.invokevirtual(pool.addMethodRef(context.TYPE_ANY,
"isRef", "()Z"));
break;
}
if (operation != GET_BOOLEAN) {
context.boolean2any();
}
}
}