|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /*
- * Javassist, a Java-bytecode translator toolkit.
- * Copyright (C) 1999- 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,
- * or the Apache License Version 2.0.
- *
- * 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.CannotCompileException;
- import javassist.CtClass;
- import javassist.bytecode.CodeAttribute;
- import javassist.bytecode.CodeIterator;
- import javassist.bytecode.ConstPool;
-
- 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;
- }
-
- @Override
- public void initialize(ConstPool cp, CodeAttribute attr) {
- nested = 0;
- newClassIndex = newMethodNTIndex = newMethodIndex = 0;
- }
-
- /**
- * Modifies a sequence of
- * NEW classname
- * DUP
- * ...
- * INVOKESPECIAL classname:method
- */
- @Override
- 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 (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;
- }
- }
|