1   // Copyright 2012- Bill Campbell, Swami Iyer and Bahar Akbal-Delibas
2   
3   package jminusminus;
4   
5   import static jminusminus.CLConstants.*;
6   
7   /**
8    * The AST node for a boolean literal.
9    */
10  class JLiteralBoolean extends JExpression {
11      // String representation of the literal.
12      private String text;
13  
14      /**
15       * Constructs an AST node for a boolean literal given its line number and string representation.
16       *
17       * @param line line in which the literal occurs in the source file.
18       * @param text string representation of the literal.
19       */
20      public JLiteralBoolean(int line, String text) {
21          super(line);
22          this.text = text;
23      }
24  
25      /**
26       * Returns the literal as a boolean.
27       *
28       * @return the literal as a boolean.
29       */
30      public boolean toBoolean() {
31          return text.equals("true");
32      }
33  
34      /**
35       * {@inheritDoc}
36       */
37      public JExpression analyze(Context context) {
38          type = Type.BOOLEAN;
39          return this;
40      }
41  
42      /**
43       * {@inheritDoc}
44       */
45      public void codegen(CLEmitter output) {
46          output.addNoArgInstruction(toBoolean() ? ICONST_1 : ICONST_0);
47      }
48  
49      /**
50       * {@inheritDoc}
51       */
52      public void codegen(CLEmitter output, String targetLabel, boolean onTrue) {
53          boolean b = toBoolean();
54          if (b && onTrue || !b && !onTrue) {
55              output.addBranchInstruction(GOTO, targetLabel);
56          }
57      }
58  
59      /**
60       * {@inheritDoc}
61       */
62      public void toJSON(JSONElement json) {
63          JSONElement e = new JSONElement();
64          json.addChild("JLiteralBoolean:" + line, e);
65          e.addAttribute("type", type == null ? "" : type.toString());
66          e.addAttribute("value", text);
67      }
68  }
69