/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
//package javax.xml.parsers;
import com.sun.org.apache.bcel.internal.classfile.ClassParser;
import com.sun.org.apache.bcel.internal.classfile.ConstantClass;
import com.sun.org.apache.bcel.internal.classfile.ConstantPool;
import com.sun.org.apache.bcel.internal.classfile.ConstantUtf8;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
import com.sun.org.apache.bcel.internal.classfile.Method;
import com.sun.org.apache.bcel.internal.generic.ClassGen;
import com.sun.org.apache.bcel.internal.generic.MethodGen;
import com.sun.org.apache.bcel.internal.generic.InstructionFactory;
import com.sun.org.apache.bcel.internal.generic.InstructionList;
import java.util.ArrayList;
import java.io.FileOutputStream;
//import junit.framework.TestCase;
//import junit.textui.TestRunner;
/**
* 8062608
*
* @author David Buck
* Note: You must compile this class with the -g option to test for jdk8062608
*/
public class ReproNew //extends TestCase
{
// public ReproNew(String name) {
// super(name);
// }
public static void main(String[] args) throws Exception {
// TestRunner.run(ReproNew.class);
(new ReproNew()).test();
}
public void test() throws Exception {
JavaClass jc = new ClassParser("ReproNew.class").parse();
//rename class
ConstantPool cp = jc.getConstantPool();
int cpIndex = ((ConstantClass)cp.getConstant(jc.getClassNameIndex())).getNameIndex();
cp.setConstant(cpIndex, new ConstantUtf8("ReproNewPrime"));
ClassGen gen = new ClassGen(jc);
Method[] methods = jc.getMethods();
int index;
for (index = 0; index < methods.length; index++) {
if (methods[index].getName().equals("doSomething")) {
break;
}
}
Method m = methods[index];
MethodGen mg = new MethodGen(m, gen.getClassName(), gen.getConstantPool());
InstructionFactory f = new InstructionFactory(gen);
InstructionList il = mg.getInstructionList();
InstructionList newInst = new InstructionList();
newInst.append(f.createPrintln("Hello Sekai!"));
il.insert(newInst);
gen.replaceMethod(m, mg.getMethod());
gen.getJavaClass().dump(new FileOutputStream("ReproNewPrime.class"));
try {
Class.forName("ReproNewPrime");
} catch (ClassFormatError cfe) {
cfe.printStackTrace();
//fail("modified version of class does not pass verification");
}
}
public double doSomething(double d, ArrayList list) {
return d*d;
}
}