• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2  *
3  * This program and the accompanying materials are made available under
4  * the terms of the Common Public License v1.0 which accompanies this distribution,
5  * and is available at http://www.eclipse.org/legal/cpl-v10.html
6  *
7  * $Id: CodeGen.java,v 1.1.1.1 2004/05/09 16:57:49 vlad_r Exp $
8  */
9 package com.vladium.jcd.compiler;
10 
11 import com.vladium.jcd.cls.ClassDef;
12 import com.vladium.jcd.cls.constant.CONSTANT_Integer_info;
13 import com.vladium.jcd.opcodes.IOpcodes;
14 import com.vladium.util.ByteArrayOStream;
15 
16 // ----------------------------------------------------------------------------
17 /**
18  * @author Vlad Roubtsov, (C) 2003
19  */
20 public
21 abstract class CodeGen implements IOpcodes
22 {
23     // public: ................................................................
24 
25 
load_local_object_var(final ByteArrayOStream out, final int index)26     public static void load_local_object_var (final ByteArrayOStream out, final int index)
27     {
28         if (index <= 3)
29         {
30             out.write (_aload_0 + index); // aload_n
31         }
32         else if (index <= 0xFF)
33         {
34             out.write2 (_aload,
35                         index);  // indexbyte
36         }
37         else
38         {
39             out.write4 (_wide,
40                         _aload,
41                         index >>> 8,    // indexbyte1
42                         index);         // indexbyte2
43         }
44     }
45 
store_local_object_var(final ByteArrayOStream out, final int index)46     public static void store_local_object_var (final ByteArrayOStream out, final int index)
47     {
48         if (index <= 3)
49         {
50             out.write (_astore_0 + index); // astore_n
51         }
52         else if (index <= 0xFF)
53         {
54             out.write2 (_astore,
55                         index);  // indexbyte
56         }
57         else
58         {
59             out.write4 (_wide,
60                         _astore,
61                         index >>> 8,    // indexbyte1
62                         index);         // indexbyte2
63         }
64 
65         // [stack -1]
66     }
67 
push_int_value(final ByteArrayOStream out, final ClassDef cls, final int value)68     public static void push_int_value (final ByteArrayOStream out, final ClassDef cls, final int value)
69     {
70         if ((-1 <= value) && (value <= 5))
71         {
72             out.write (_iconst_0 + value);
73         }
74         else if ((-128 <= value) && (value <= 127))
75         {
76             out.write2 (_bipush,
77                         value); // byte1
78         }
79         else if ((-32768 <= value) && (value <= 32767))
80         {
81             out.write3 (_sipush,
82                         value >>> 8,    // byte1
83                         value);         // byte2
84         }
85         else // we have to create an Integer constant in the constant pool:
86         {
87             // TODO: check if it's already there
88             final int index = cls.getConstants ().add (new CONSTANT_Integer_info (value));
89 
90             if (index <= 0xFF)
91             {
92                 out.write2 (_ldc,
93                             index);  // index
94             }
95             else // must use ldc_w
96             {
97                 out.write3 (_ldc_w,
98                             index >>> 8,  // indexbyte1
99                             index);       // indexbyte2
100             }
101         }
102 
103         // [stack +1]
104     }
105 
push_constant_index(final ByteArrayOStream out, final int index)106     public static void push_constant_index (final ByteArrayOStream out, final int index)
107     {
108         if (index <= 0xFF)
109         {
110             out.write2 (_ldc,
111                        index);  // indexbyte
112         }
113         else
114         {
115             out.write3 (_ldc_w,
116                         index >>> 8,     // indexbyte1
117                         index);          // indexbyte2
118         }
119 
120         // [stack +1]
121     }
122 
123     // protected: .............................................................
124 
125     // package: ...............................................................
126 
127     // private: ...............................................................
128 
129 
CodeGen()130     private CodeGen () {} // prevent subclassing
131 
132 } // end of class
133 // ----------------------------------------------------------------------------
134