1 28 29 package org.jibx.binding.classes; 30 31 import java.security.InvalidParameterException ; 32 33 import org.apache.bcel.Constants; 34 import org.apache.bcel.generic.*; 35 36 43 44 public class InstructionBuilder extends InstructionFactory 45 { 46 52 53 public InstructionBuilder(ClassGen cg, ConstantPoolGen cp) { 54 super(cg, cp); 55 } 56 57 62 63 public ConstantPoolGen getConstantPoolGen() { 64 return cp; 65 } 66 67 74 75 public CompoundInstruction createLoadConstant(int value) { 76 return new PUSH(cp, value); 77 } 78 79 86 87 public CompoundInstruction createLoadConstant(String value) { 88 return new PUSH(cp, value); 89 } 90 91 98 99 public CompoundInstruction createLoadConstant(Object value) { 100 if (value instanceof Boolean ) { 101 return new PUSH(cp, (Boolean )value); 102 } else if (value instanceof Character ) { 103 return new PUSH(cp, (Character )value); 104 } else if (value instanceof Number ) { 105 return new PUSH(cp, (Number )value); 106 } else if (value instanceof String ) { 107 return new PUSH(cp, (String )value); 108 } else { 109 throw new InvalidParameterException 110 ("Internal code generation error!"); 111 } 112 } 113 114 121 122 public FieldInstruction createGetField(ClassItem item) { 123 String cname = item.getClassFile().getName(); 124 String fname = item.getName(); 125 return new GETFIELD(cp.addFieldref(cname, fname, item.getSignature())); 126 } 127 128 135 136 public FieldInstruction createPutField(ClassItem item) { 137 String cname = item.getClassFile().getName(); 138 String fname = item.getName(); 139 return new PUTFIELD(cp.addFieldref(cname, fname, item.getSignature())); 140 } 141 142 149 150 public FieldInstruction createGetStatic(ClassItem item) { 151 String cname = item.getClassFile().getName(); 152 String fname = item.getName(); 153 return new GETSTATIC(cp.addFieldref(cname, fname, item.getSignature())); 154 } 155 156 163 164 public FieldInstruction createPutStatic(ClassItem item) { 165 String cname = item.getClassFile().getName(); 166 String fname = item.getName(); 167 return new PUTSTATIC(cp.addFieldref(cname, fname, item.getSignature())); 168 } 169 170 177 178 public InvokeInstruction createCallStatic(ClassItem item) { 179 String cname = item.getClassFile().getName(); 180 String mname = item.getName(); 181 int index = cp.addMethodref(cname, mname, item.getSignature()); 182 return new INVOKESTATIC(index); 183 } 184 185 192 193 public InvokeInstruction createCallVirtual(ClassItem item) { 194 String cname = item.getClassFile().getName(); 195 String mname = item.getName(); 196 int index = cp.addMethodref(cname, mname, item.getSignature()); 197 return new INVOKEVIRTUAL(index); 198 } 199 200 207 208 public InvokeInstruction createCallInterface(ClassItem item) { 209 String cname = item.getClassFile().getName(); 210 String mname = item.getName(); 211 String signature = item.getSignature(); 212 return createInvoke(cname, mname, Type.getReturnType(signature), 213 Type.getArgumentTypes(signature), Constants.INVOKEINTERFACE); 214 } 215 216 223 224 public InvokeInstruction createCallStatic(String method, String signature) { 225 int split = method.lastIndexOf('.'); 226 String cname = method.substring(0, split); 227 String mname = method.substring(split+1); 228 int index = cp.addMethodref(cname, mname, signature); 229 return new INVOKESTATIC(index); 230 } 231 232 239 240 public InvokeInstruction createCallVirtual(String method, 241 String signature) { 242 int split = method.lastIndexOf('.'); 243 String cname = method.substring(0, split); 244 String mname = method.substring(split+1); 245 int index = cp.addMethodref(cname, mname, signature); 246 return new INVOKEVIRTUAL(index); 247 } 248 249 256 257 public InvokeInstruction createCallInterface(String method, 258 String signature) { 259 int split = method.lastIndexOf('.'); 260 String cname = method.substring(0, split); 261 String mname = method.substring(split+1); 262 return createInvoke(cname, mname, Type.getReturnType(signature), 263 Type.getArgumentTypes(signature), Constants.INVOKEINTERFACE); 264 } 265 266 273 274 public InvokeInstruction createCallInit(String name, String signature) { 275 int index = cp.addMethodref(name, "<init>", signature); 276 return new INVOKESPECIAL(index); 277 } 278 279 285 286 public CPInstruction createInstanceOf(ObjectType type) { 287 int index = cp.addClass(type); 288 return new INSTANCEOF(index); 289 } 290 } 291 | Popular Tags |