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 char literal.
9    */
10  class JLiteralChar extends JExpression {
11      // String representation of the literal.
12      private String text;
13  
14      /**
15       * Constructs an AST node for a char 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 JLiteralChar(int line, String text) {
21          super(line);
22          this.text = text;
23      }
24  
25      /**
26       * Returns the literal as an int.
27       *
28       * @return the literal as an int.
29       */
30      public int toInt() {
31          return (int) JAST.unescape(text).charAt(1);
32      }
33  
34      /**
35       * {@inheritDoc}
36       */
37      public JExpression analyze(Context context) {
38          type = Type.CHAR;
39          return this;
40      }
41  
42      /**
43       * {@inheritDoc}
44       */
45      public void codegen(CLEmitter output) {
46          int i = toInt();
47          switch (i) {
48              case 0:
49                  output.addNoArgInstruction(ICONST_0);
50                  break;
51              case 1:
52                  output.addNoArgInstruction(ICONST_1);
53                  break;
54              case 2:
55                  output.addNoArgInstruction(ICONST_2);
56                  break;
57              case 3:
58                  output.addNoArgInstruction(ICONST_3);
59                  break;
60              case 4:
61                  output.addNoArgInstruction(ICONST_4);
62                  break;
63              case 5:
64                  output.addNoArgInstruction(ICONST_5);
65                  break;
66              default:
67                  if (i >= 6 && i <= 127) {
68                      output.addOneArgInstruction(BIPUSH, i);
69                  } else if (i >= 128 && i <= 32767) {
70                      output.addOneArgInstruction(SIPUSH, i);
71                  } else {
72                      output.addLDCInstruction(i);
73                  }
74          }
75      }
76  
77      /**
78       * {@inheritDoc}
79       */
80      public void toJSON(JSONElement json) {
81          JSONElement e = new JSONElement();
82          json.addChild("JLiteralChar:" + line, e);
83          e.addAttribute("type", type == null ? "" : type.toString());
84          e.addAttribute("value", text.substring(1, text.length() - 1));
85      }
86  }
87