git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@1023 379699f6-c40d-0410-875b-85095c16579estable
parent
9461a813d9
commit
f6f5d1707e
@ -0,0 +1,25 @@ |
|||||||
|
/* CodeTransformer Copyright (C) 1999 Jochen Hoenicke. |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation; either version 2, or (at your option) |
||||||
|
* any later version. |
||||||
|
* |
||||||
|
* This program 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 for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program; see the file COPYING. If not, write to |
||||||
|
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
||||||
|
* |
||||||
|
* $Id$ |
||||||
|
*/ |
||||||
|
|
||||||
|
package jode.obfuscator; |
||||||
|
import jode.bytecode.BytecodeInfo; |
||||||
|
|
||||||
|
public interface CodeTransformer { |
||||||
|
public void transformCode(BytecodeInfo bytecode); |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
/* LocalizeFieldTransformer Copyright (C) 1999 Jochen Hoenicke. |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation; either version 2, or (at your option) |
||||||
|
* any later version. |
||||||
|
* |
||||||
|
* This program 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 for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program; see the file COPYING. If not, write to |
||||||
|
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
||||||
|
* |
||||||
|
* $Id$ |
||||||
|
*/ |
||||||
|
|
||||||
|
package jode.obfuscator; |
||||||
|
|
||||||
|
/** |
||||||
|
* This class replaces accesses to local fields and . |
||||||
|
* |
||||||
|
*/ |
||||||
|
public class LocalizeFieldTransformer implements CodeTransformer { |
||||||
|
|
||||||
|
public static void transformCode(BytecodeInfo bytecode) { |
||||||
|
for (Instruction instr = bytecode.getFirstInstr(); |
||||||
|
instr != null; instr = instr.nextByAddr) { |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,489 @@ |
|||||||
|
// This class is taken from the Classpath project.
|
||||||
|
// Please note the different copyright holder!
|
||||||
|
// The changes I did is this comment, the package line, some
|
||||||
|
// imports from java.util and some minor jdk12 -> jdk11 fixes.
|
||||||
|
// -- Jochen Hoenicke <jochen@gnu.org>
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ArrayList.java -- JDK1.2's answer to Vector; this is an array-backed
|
||||||
|
// implementation of the List interface
|
||||||
|
//
|
||||||
|
// This is a JDK 1.2 compliant version of ArrayList.java
|
||||||
|
//
|
||||||
|
// Copyright (c) 1998 by Jon A. Zeppieri (jon@eease.com),
|
||||||
|
// Free Software Foundation, Inc.
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Library General Public License as published
|
||||||
|
// by the Free Software Foundation, version 2. (see COPYING.LIB)
|
||||||
|
//
|
||||||
|
// This program 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 Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public License
|
||||||
|
// along with this program; if not, write to the Free Software Foundation
|
||||||
|
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
package jode.util; |
||||||
|
|
||||||
|
import java.lang.reflect.Array; |
||||||
|
import java.io.Serializable; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.ObjectInputStream; |
||||||
|
import java.io.ObjectOutputStream; |
||||||
|
|
||||||
|
/** |
||||||
|
* An array-backed implementation of the List interface. ArrayList |
||||||
|
* performs well on simple tasks: random access into a list, appending |
||||||
|
* to or removing from the end of a list, checking the size, &c. |
||||||
|
* |
||||||
|
* @author Jon A. Zeppieri |
||||||
|
* @version $Id$ |
||||||
|
* @see java.util.AbstractList |
||||||
|
* @see java.util.List |
||||||
|
*/ |
||||||
|
public class ArrayList extends AbstractList |
||||||
|
implements List, Cloneable, Serializable |
||||||
|
{ |
||||||
|
/** the default capacity for new ArrayLists */ |
||||||
|
private static final int DEFAULT_CAPACITY = 16; |
||||||
|
|
||||||
|
/** the number of elements in this list */ |
||||||
|
int size; |
||||||
|
|
||||||
|
/** where the data is stored */ |
||||||
|
transient Object[] _arData; |
||||||
|
|
||||||
|
/** |
||||||
|
* Construct a new ArrayList with the supplied initial capacity. |
||||||
|
* |
||||||
|
* @param iCapacity |
||||||
|
*/ |
||||||
|
public ArrayList(int iCapacity) |
||||||
|
{ |
||||||
|
_arData = new Object[iCapacity]; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Construct a new ArrayList with the default capcity |
||||||
|
*/ |
||||||
|
public ArrayList() |
||||||
|
{ |
||||||
|
this(DEFAULT_CAPACITY); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Construct a new ArrayList, and initialize it with the elements |
||||||
|
* in the supplied Collection; Sun specs say that the initial |
||||||
|
* capacity is 110% of the Collection's size. |
||||||
|
* |
||||||
|
* @param oCollection the collection whose elements will |
||||||
|
* initialize this list |
||||||
|
*/ |
||||||
|
public ArrayList(Collection oCollection) |
||||||
|
{ |
||||||
|
this((int) (oCollection.size() * 1.1)); |
||||||
|
addAll(oCollection); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Guarantees that this list will have at least enough capacity to |
||||||
|
* hold iMinCapacity elements. |
||||||
|
* |
||||||
|
* @param iMinCapacity the minimum guaranteed capacity |
||||||
|
*/ |
||||||
|
public void ensureCapacity(int iMinCapacity) |
||||||
|
{ |
||||||
|
Object[] arNewData; |
||||||
|
int iCapacity = _arData.length; |
||||||
|
|
||||||
|
if (iMinCapacity > iCapacity) |
||||||
|
{ |
||||||
|
arNewData = new Object[Math.max((iCapacity * 2), iMinCapacity)]; |
||||||
|
System.arraycopy(_arData, 0, arNewData, 0, iCapacity); |
||||||
|
_arData = arNewData; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Appends the supplied element to the end of this list. |
||||||
|
* |
||||||
|
* @param oElement the element to be appended to this list |
||||||
|
*/ |
||||||
|
public boolean add(Object oElement) |
||||||
|
{ |
||||||
|
ensureCapacity(size + 1); |
||||||
|
_arData[size++] = oElement; |
||||||
|
modCount++; |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Retrieves the element at the user-supplied index. |
||||||
|
* |
||||||
|
* @param iIndex the index of the element we are fetching |
||||||
|
* @throws IndexOutOfBoundsException (iIndex < 0) || (iIndex >= size()) |
||||||
|
*/ |
||||||
|
public Object get(int iIndex) |
||||||
|
{ |
||||||
|
if (iIndex >= size) |
||||||
|
throw new IndexOutOfBoundsException("ArrayList size=" + |
||||||
|
String.valueOf(size) + "; " + |
||||||
|
"index=" + String.valueOf(iIndex)); |
||||||
|
return _arData[iIndex]; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the number of elements in this list |
||||||
|
*/ |
||||||
|
public int size() |
||||||
|
{ |
||||||
|
return size; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Removes the element at the user-supplied index |
||||||
|
* |
||||||
|
* @param iIndex the index of the element to be removed |
||||||
|
* @return the removed Object |
||||||
|
* @throws IndexOutOfBoundsException (iIndex < 0) || (iIndex >= size()) |
||||||
|
*/ |
||||||
|
public Object remove(int iIndex) |
||||||
|
{ |
||||||
|
Object oResult; |
||||||
|
|
||||||
|
if (iIndex >= size) |
||||||
|
throw new IndexOutOfBoundsException("ArrayList size=" + |
||||||
|
String.valueOf(size) + "; " + |
||||||
|
"index=" + String.valueOf(iIndex)); |
||||||
|
|
||||||
|
oResult = _arData[iIndex]; |
||||||
|
|
||||||
|
if (iIndex != --size) |
||||||
|
System.arraycopy(_arData, (iIndex + 1), _arData, iIndex, |
||||||
|
(size - iIndex)); |
||||||
|
|
||||||
|
modCount++; |
||||||
|
_arData[size] = null; |
||||||
|
|
||||||
|
return oResult; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Removes all elements in the half-open interval [iFromIndex, iToIndex). |
||||||
|
* |
||||||
|
* @param iFromIndex the first index which will be removed |
||||||
|
* @param iToIndex one greater than the last index which will be |
||||||
|
* removed |
||||||
|
*/ |
||||||
|
public void removeRange(int iFromIndex, int iToIndex) |
||||||
|
{ |
||||||
|
int iReduction; |
||||||
|
int i; |
||||||
|
|
||||||
|
if ((iFromIndex >= size) || (iToIndex >= size)) |
||||||
|
{ |
||||||
|
throw new IndexOutOfBoundsException("ArrayList size=" + |
||||||
|
String.valueOf(size) + "; " + |
||||||
|
"indices=" + |
||||||
|
String.valueOf(iFromIndex) + "," + |
||||||
|
String.valueOf(iToIndex)); |
||||||
|
} |
||||||
|
else if (iFromIndex > iToIndex) |
||||||
|
{ |
||||||
|
throw new IllegalArgumentException("fromIndex(" + |
||||||
|
String.valueOf(iFromIndex) + |
||||||
|
") > toIndex(" + |
||||||
|
String.valueOf(iToIndex) + ")"); |
||||||
|
} |
||||||
|
else if (iFromIndex != iToIndex) |
||||||
|
{ |
||||||
|
iReduction = iToIndex - iFromIndex; |
||||||
|
System.arraycopy(_arData, (iFromIndex + iReduction), _arData, |
||||||
|
iFromIndex, (size - iFromIndex - iReduction)); |
||||||
|
modCount++; |
||||||
|
|
||||||
|
for (i = (iFromIndex + iReduction); i < size; i++) |
||||||
|
_arData[i] = null; |
||||||
|
|
||||||
|
size -= iReduction; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Adds the supplied element at the specified index, shifting all |
||||||
|
* elements currently at that index or higher one to the right. |
||||||
|
* |
||||||
|
* @param iIndex the index at which the element is being added |
||||||
|
* @param oElement the element being added |
||||||
|
*/ |
||||||
|
public void add(int iIndex, Object oElement) |
||||||
|
{ |
||||||
|
if (iIndex > size) |
||||||
|
throw new IndexOutOfBoundsException("ArrayList size=" + |
||||||
|
String.valueOf(size) + "; " + |
||||||
|
"index=" + String.valueOf(iIndex)); |
||||||
|
|
||||||
|
ensureCapacity(size + 1); |
||||||
|
System.arraycopy(_arData, iIndex, _arData, |
||||||
|
(iIndex + 1), (size - iIndex)); |
||||||
|
_arData[iIndex] = oElement; |
||||||
|
size++; |
||||||
|
modCount++; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Add each element in the supplied Collection to this List. |
||||||
|
* |
||||||
|
* @param oCollection a Collection containing elements to be |
||||||
|
* added to this List |
||||||
|
*/ |
||||||
|
public boolean addAll(Collection oCollection) |
||||||
|
{ |
||||||
|
Iterator itElements; |
||||||
|
int iLen = oCollection.size(); |
||||||
|
|
||||||
|
if (iLen > 0) |
||||||
|
{ |
||||||
|
ensureCapacity(size + iLen); |
||||||
|
modCount++; |
||||||
|
|
||||||
|
itElements = oCollection.iterator(); |
||||||
|
|
||||||
|
while (itElements.hasNext()) |
||||||
|
_arData[size++] = itElements.next(); |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Add all elements in the supplied collection, inserting them beginning |
||||||
|
* at the specified index. |
||||||
|
* |
||||||
|
* @param iIndex the index at which the elements will be inserted |
||||||
|
* @param oCollection the Collection containing the elements to be |
||||||
|
* inserted |
||||||
|
*/ |
||||||
|
public boolean addAll(int iIndex, Collection oCollection) |
||||||
|
{ |
||||||
|
Iterator itElements; |
||||||
|
int iLen; |
||||||
|
|
||||||
|
if (iIndex > size) |
||||||
|
throw new IndexOutOfBoundsException("ArrayList size=" + |
||||||
|
String.valueOf(size) + "; " + |
||||||
|
"index=" + String.valueOf(iIndex)); |
||||||
|
|
||||||
|
iLen = oCollection.size(); |
||||||
|
|
||||||
|
if (iLen > 0) |
||||||
|
{ |
||||||
|
ensureCapacity(size + iLen); |
||||||
|
|
||||||
|
System.arraycopy(_arData, iIndex, _arData, |
||||||
|
(iIndex + iLen), (size - iIndex)); |
||||||
|
modCount++; |
||||||
|
size += iLen; |
||||||
|
|
||||||
|
itElements = oCollection.iterator(); |
||||||
|
while (itElements.hasNext()) |
||||||
|
_arData[iIndex++] = itElements.next(); |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a shallow copy of this ArrayList |
||||||
|
*/ |
||||||
|
public Object clone() |
||||||
|
{ |
||||||
|
ArrayList oClone; |
||||||
|
|
||||||
|
try |
||||||
|
{ |
||||||
|
oClone = (ArrayList) super.clone(); |
||||||
|
oClone._arData = _arData; |
||||||
|
oClone.size = size; |
||||||
|
} |
||||||
|
catch(CloneNotSupportedException e) |
||||||
|
{ |
||||||
|
oClone = null; |
||||||
|
} |
||||||
|
return oClone; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns true iff oElement is in this ArrayList. |
||||||
|
* |
||||||
|
* @param oElement the element whose inclusion in the List is being |
||||||
|
* tested |
||||||
|
*/ |
||||||
|
public boolean contains(Object oElement) |
||||||
|
{ |
||||||
|
return (indexOf(oElement) != -1); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the lowest index at which oElement appears in this List, or |
||||||
|
* -1 if it does not appear. |
||||||
|
* |
||||||
|
* @param oElement the element whose inclusion in the List is being |
||||||
|
* tested |
||||||
|
*/ |
||||||
|
public int indexOf(Object oElement) |
||||||
|
{ |
||||||
|
int i; |
||||||
|
|
||||||
|
for (i = 0; i < size; i++) |
||||||
|
{ |
||||||
|
if (doesEqual(oElement, _arData[i])) |
||||||
|
return i; |
||||||
|
} |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the highest index at which oElement appears in this List, or |
||||||
|
* -1 if it does not appear. |
||||||
|
* |
||||||
|
* @param oElement the element whose inclusion in the List is being |
||||||
|
* tested |
||||||
|
*/ |
||||||
|
public int lastIndexOf(Object oElement) |
||||||
|
{ |
||||||
|
int i; |
||||||
|
|
||||||
|
for (i = size - 1; i >= 0; i--) |
||||||
|
{ |
||||||
|
if (doesEqual(oElement, _arData[i])) |
||||||
|
return i; |
||||||
|
} |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Removes all elements from this List |
||||||
|
*/ |
||||||
|
public void clear() |
||||||
|
{ |
||||||
|
int i; |
||||||
|
|
||||||
|
if (size > 0) |
||||||
|
{ |
||||||
|
modCount++; |
||||||
|
size = 0; |
||||||
|
|
||||||
|
for (i = 0; i < size; i++) |
||||||
|
_arData[i] = null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the element at the specified index. |
||||||
|
* |
||||||
|
* @param iIndex the index at which the element is being set |
||||||
|
* @param oElement the element to be set |
||||||
|
* @return the element previously at the specified index, or null if |
||||||
|
* none was there |
||||||
|
*/ |
||||||
|
public Object set(int iIndex, Object oElement) |
||||||
|
{ |
||||||
|
Object oResult; |
||||||
|
|
||||||
|
if (iIndex >= size) |
||||||
|
throw new IndexOutOfBoundsException("ArrayList size=" + |
||||||
|
String.valueOf(size) + "; " + |
||||||
|
"index=" + String.valueOf(iIndex)); |
||||||
|
oResult = _arData[iIndex]; |
||||||
|
modCount++; |
||||||
|
_arData[iIndex] = oElement; |
||||||
|
|
||||||
|
return oResult; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns an Object Array containing all of the elements in this ArrayList |
||||||
|
*/ |
||||||
|
public Object[] toArray() |
||||||
|
{ |
||||||
|
Object[] arObjects = new Object[size]; |
||||||
|
System.arraycopy(_arData, 0, arObjects, 0, size); |
||||||
|
return arObjects; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns an Array whse component type is the runtime component type of |
||||||
|
* the passes-in Array. The returned Array is populated with all of the |
||||||
|
* elements in this ArrayList. If the passed-in Array is not large enough |
||||||
|
* to store all of the elements in this List, a new Array will be created |
||||||
|
* and returned; if the passed-in Array is <i>larger</i> than the size |
||||||
|
* of this List, then size() + 1 index will be set to null. |
||||||
|
* |
||||||
|
* @param arObjects the passed-in Array |
||||||
|
*/ |
||||||
|
public Object[] toArray(Object[] arObjects) |
||||||
|
{ |
||||||
|
Object[] arReturn = (arObjects.length >= size) |
||||||
|
? arObjects |
||||||
|
: (Object[]) |
||||||
|
Array.newInstance(arObjects.getClass().getComponentType(), size); |
||||||
|
|
||||||
|
System.arraycopy(_arData, 0, arReturn, 0, size); |
||||||
|
|
||||||
|
if (arReturn.length > size) |
||||||
|
arReturn[size] = null; |
||||||
|
|
||||||
|
return arReturn; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Trims the capacity of tjis List to be equal to its size; |
||||||
|
* a memory saver. |
||||||
|
*/ |
||||||
|
public void trimToSize() |
||||||
|
{ |
||||||
|
Object[] arNewData = new Object[size]; |
||||||
|
System.arraycopy(_arData, 0, arNewData, 0, size); |
||||||
|
modCount++; |
||||||
|
_arData = arNewData; |
||||||
|
} |
||||||
|
|
||||||
|
private void writeObject(ObjectOutputStream oOut) |
||||||
|
throws IOException |
||||||
|
{ |
||||||
|
int i; |
||||||
|
|
||||||
|
oOut.defaultWriteObject(); |
||||||
|
|
||||||
|
oOut.writeInt(_arData.length); |
||||||
|
for (i = 0; i < _arData.length; i++) |
||||||
|
oOut.writeObject(_arData[i]); |
||||||
|
} |
||||||
|
|
||||||
|
private void readObject(ObjectInputStream oIn) |
||||||
|
throws IOException, ClassNotFoundException |
||||||
|
{ |
||||||
|
int i; |
||||||
|
int iCapacity; |
||||||
|
oIn.defaultReadObject(); |
||||||
|
|
||||||
|
iCapacity = oIn.readInt(); |
||||||
|
_arData = new Object[iCapacity]; |
||||||
|
|
||||||
|
for (i = 0; i < iCapacity; i++) |
||||||
|
_arData[i] = oIn.readObject(); |
||||||
|
} |
||||||
|
|
||||||
|
private static final boolean doesEqual(Object oOne, Object oTwo) |
||||||
|
{ |
||||||
|
return ((oOne == null) ? (oTwo == null) : oOne.equals(oTwo)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
Loading…
Reference in new issue