aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/javassist/convert/TransformNewClass.java
diff options
context:
space:
mode:
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>2008-09-08 10:56:50 +0000
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>2008-09-08 10:56:50 +0000
commit7f87aaa503eae6730f2b077b428d65f9bc3efc14 (patch)
treea5a9f9b1a1517992cc894501936634b38093283b /src/main/javassist/convert/TransformNewClass.java
parent4bd7105829441948f5f142da387205026b8571a7 (diff)
downloadjavassist-7f87aaa503eae6730f2b077b428d65f9bc3efc14.tar.gz
javassist-7f87aaa503eae6730f2b077b428d65f9bc3efc14.zip
implemented CodeConverter.replaceNew(CtClass,CtClass)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@454 30ef5769-5b8d-40dd-aea6-55b5d6557bb3
Diffstat (limited to 'src/main/javassist/convert/TransformNewClass.java')
-rw-r--r--src/main/javassist/convert/TransformNewClass.java82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/main/javassist/convert/TransformNewClass.java b/src/main/javassist/convert/TransformNewClass.java
new file mode 100644
index 00000000..f34ef83b
--- /dev/null
+++ b/src/main/javassist/convert/TransformNewClass.java
@@ -0,0 +1,82 @@
+/*
+ * Javassist, a Java-bytecode translator toolkit.
+ * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. Alternatively, the contents of this file may be used under
+ * the terms of the GNU Lesser General Public License Version 2.1 or later.
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ */
+
+package javassist.convert;
+
+import javassist.bytecode.*;
+import javassist.CtClass;
+import javassist.CannotCompileException;
+
+final public class TransformNewClass extends Transformer {
+ private int nested;
+ private String classname, newClassName;
+ private int newClassIndex, newMethodNTIndex, newMethodIndex;
+
+ public TransformNewClass(Transformer next,
+ String classname, String newClassName) {
+ super(next);
+ this.classname = classname;
+ this.newClassName = newClassName;
+ }
+
+ public void initialize(ConstPool cp, CodeAttribute attr) {
+ nested = 0;
+ newClassIndex = newMethodNTIndex = newMethodIndex = 0;
+ }
+
+ /**
+ * Modifies a sequence of
+ * NEW classname
+ * DUP
+ * ...
+ * INVOKESPECIAL classname:method
+ */
+ public int transform(CtClass clazz, int pos, CodeIterator iterator,
+ ConstPool cp) throws CannotCompileException
+ {
+ int index;
+ int c = iterator.byteAt(pos);
+ if (c == NEW) {
+ index = iterator.u16bitAt(pos + 1);
+ if (cp.getClassInfo(index).equals(classname)) {
+ if (iterator.byteAt(pos + 3) != DUP)
+ throw new CannotCompileException(
+ "NEW followed by no DUP was found");
+
+ if (newClassIndex == 0)
+ newClassIndex = cp.addClassInfo(newClassName);
+
+ iterator.write16bit(newClassIndex, pos + 1);
+ ++nested;
+ }
+ }
+ else if (c == INVOKESPECIAL) {
+ index = iterator.u16bitAt(pos + 1);
+ int typedesc = cp.isConstructor(classname, index);
+ if (typedesc != 0 && nested > 0) {
+ int nt = cp.getMethodrefNameAndType(index);
+ if (newMethodNTIndex != nt) {
+ newMethodNTIndex = nt;
+ newMethodIndex = cp.addMethodrefInfo(newClassIndex, nt);
+ }
+
+ iterator.write16bit(newMethodIndex, pos + 1);
+ --nested;
+ }
+ }
+
+ return pos;
+ }
+}