/******************************************************************************* * Copyright (c) 2002,2006 IBM Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package com.ibm.wala.shrikeBT.shrikeCT; import java.util.Random; import com.ibm.wala.shrikeBT.Compiler; import com.ibm.wala.shrikeBT.MethodData; import com.ibm.wala.shrikeCT.ClassWriter; import com.ibm.wala.shrikeCT.ConstantPoolParser.ReferenceToken; /** * This class lets you compile ShrikeBT intermediate code into real Java bytecodes using ShrikeCT. */ final public class CTCompiler extends Compiler { final private ClassWriter cw; final private Random random = new Random(); /** * Compile 'md' into the class given by 'cw'. */ private CTCompiler(ClassWriter cw, MethodData md) { super(md); this.cw = cw; } @Override protected int allocateConstantPoolInteger(int v) { return cw.addCPInt(v); } @Override protected int allocateConstantPoolFloat(float v) { return cw.addCPFloat(v); } @Override protected int allocateConstantPoolLong(long v) { return cw.addCPLong(v); } @Override protected int allocateConstantPoolDouble(double v) { return cw.addCPDouble(v); } @Override protected int allocateConstantPoolString(String v) { return cw.addCPString(v); } @Override protected int allocateConstantPoolClassType(String c) { return cw.addCPClass(convertTypeToClass(c)); } @Override protected int allocateConstantPoolMethodType(String c) { return cw.addCPMethodType(c); } @Override protected int allocateConstantPoolMethodHandle(ReferenceToken c) { return cw.addCPMethodHandle(c); } /** * Convert a JVM type to the internal JVM class name (e.g., Ljava/lang/Object; to java/lang/Object) * * @throws IllegalArgumentException if s is null */ public static String convertTypeToClass(String s) { if (s == null) { throw new IllegalArgumentException("s is null"); } if (s.length() > 0 && s.charAt(0) == 'L') { return s.substring(1, s.length() - 1); } else { return s; } } public static CTCompiler make(ClassWriter cw, MethodData md) { if (md == null) { throw new IllegalArgumentException("md is null"); } return new CTCompiler(cw, md); } @Override protected int allocateConstantPoolField(String c, String name, String type) { return cw.addCPFieldRef(convertTypeToClass(c), name, type); } @Override protected int allocateConstantPoolMethod(String c, String name, String sig) { return cw.addCPMethodRef(convertTypeToClass(c), name, sig); } @Override protected int allocateConstantPoolInterfaceMethod(String c, String name, String sig) { return cw.addCPInterfaceMethodRef(convertTypeToClass(c), name, sig); } @Override protected String createHelperMethod(boolean isStatic, String sig) { long r = Math.abs(random.nextLong()); String name = "_helper_" + r; return name; } }