01: /*
02: * $Id: ConditionalNode.java,v 1.6 2002/09/16 08:05:04 jkl Exp $
03: *
04: * Copyright (c) 2002 Njet Communications Ltd. All Rights Reserved.
05: *
06: * Use is subject to license terms, as defined in
07: * Anvil Sofware License, Version 1.1. See LICENSE
08: * file, or http://njet.org/license-1.1.txt
09: */
10: package anvil.script.expression;
11:
12: import anvil.core.Any;
13: import anvil.codec.Code;
14: import anvil.codec.Source;
15: import anvil.script.compiler.ByteCompiler;
16: import anvil.script.Context;
17: import java.io.IOException;
18:
19: /**
20: * class ConditionalNode
21: *
22: * @author: Jani Lehtimäki
23: */
24: public class ConditionalNode extends MultiParent {
25:
26: public ConditionalNode(Node left, Node middle, Node right) {
27: super (3);
28: setChild(0, left);
29: setChild(1, middle);
30: setChild(2, right);
31: }
32:
33: public int typeOf() {
34: return Node.EXPR_CONDITIONAL;
35: }
36:
37: public Any eval() {
38: Any result = getChild(0).eval();
39: if (result.toBoolean()) {
40: return getChild(1).eval();
41: } else {
42: return getChild(2).eval();
43: }
44: }
45:
46: public void compile(ByteCompiler context, int operation) {
47: getChild(0).compile(context, GET_BOOLEAN);
48: Code code = context.getCode();
49: Source isfalse = code.if_eq();
50: getChild(1).compile(context, operation);
51: Source out = code.go_to();
52: code.popop();
53: isfalse.bind();
54: getChild(2).compile(context, operation);
55: out.bind();
56: }
57:
58: }
|