summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDeepanshu Gupta <deepanshu@google.com>2014-07-10 13:20:42 -0700
committerDeepanshu Gupta <deepanshu@google.com>2015-01-09 17:03:54 -0800
commit51fb7754fc9a232a225b31b37219f4b0dcba6711 (patch)
treee5b44721534466cb27e3a735c30dda3acc9277f2
parent8db769dd56822a59f1997a9cb53ed02d3d1cb8dd (diff)
downloadframeworks_base-51fb7754fc9a232a225b31b37219f4b0dcba6711.zip
frameworks_base-51fb7754fc9a232a225b31b37219f4b0dcba6711.tar.gz
frameworks_base-51fb7754fc9a232a225b31b37219f4b0dcba6711.tar.bz2
LayoutLib: Fix System.arraycopy()
Framework has specialized versions of java.lang.System.arraycopy() for all primitive data types. These versions are not present on the Desktop VM. This change replaces calls to any of the specialized versions with the more general alternative - the one using Objects. Note that this was already being done for char. Change-Id: If1584125fea8ecc080fb39a5ee6cdb4d922d0c98 (cherry picked from commit e1960cc0b541cda93db94de5bef42dff922b9ec3)
-rw-r--r--tools/layoutlib/create/README.txt4
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java4
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/ReplaceMethodCallsAdapter.java23
3 files changed, 23 insertions, 8 deletions
diff --git a/tools/layoutlib/create/README.txt b/tools/layoutlib/create/README.txt
index 32625ae..2e83f35 100644
--- a/tools/layoutlib/create/README.txt
+++ b/tools/layoutlib/create/README.txt
@@ -131,8 +131,8 @@ valid StackMapTable. As a side benefit of this, we can continue to support Java
Mac has horrible font rendering support.
ReplaceMethodCallsAdapter replaces calls to certain methods. Currently, it only rewrites calls to
-java.lang.System.arraycopy([CI[CII)V, which is not part of the Desktop VM to call the more general
-method java.lang.System.arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V.
+specialized versions of java.lang.System.arraycopy(), which are not part of the Desktop VM to call
+the more general method java.lang.System.arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V.
The ClassAdapters are chained together to achieve the desired output. (Look at section 2.2.7
Transformation chains in the asm user guide, link in the References.) The order of execution of
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java
index 0ad3653..e414bbc 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java
@@ -726,9 +726,9 @@ public class AsmAnalyzer {
considerDesc(desc);
- // Check if method is java.lang.System.arrayCopy([CI[CII)V
+ // Check if method is a specialized version of java.lang.System.arrayCopy()
if (owner.equals("java/lang/System") && name.equals("arraycopy")
- && desc.equals("([CI[CII)V")) {
+ && !desc.equals("(Ljava/lang/Object;ILjava/lang/Object;II)V")) {
mReplaceMethodCallClasses.add(mOwnerClass);
}
}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ReplaceMethodCallsAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ReplaceMethodCallsAdapter.java
index e57eba1..ae17417 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ReplaceMethodCallsAdapter.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ReplaceMethodCallsAdapter.java
@@ -20,10 +20,23 @@ import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
/**
* Replaces calls to certain methods that do not exist in the Desktop VM.
*/
public class ReplaceMethodCallsAdapter extends ClassVisitor {
+
+ /**
+ * Descriptors for specialized versions {@link System#arraycopy} that are not present on the
+ * Desktop VM.
+ */
+ private static Set<String> ARRAYCOPY_DESCRIPTORS = new HashSet<String>(Arrays.asList(
+ "([CI[CII)V", "([BI[BII)V", "([SI[SII)V", "([II[III)V",
+ "([JI[JII)V", "([FI[FII)V", "([DI[DII)V", "([ZI[ZII)V"));
+
public ReplaceMethodCallsAdapter(ClassVisitor cv) {
super(Opcodes.ASM4, cv);
}
@@ -42,10 +55,12 @@ public class ReplaceMethodCallsAdapter extends ClassVisitor {
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
- // Check if method is java.lang.System.arrayCopy([CI[CII)V
- if (owner.equals("java/lang/System") && name.equals("arraycopy")
- && desc.equals("([CI[CII)V")) {
- desc = "(Ljava/lang/Object;ILjava/lang/Object;II)V";
+ // Check if method is a specialized version of java.lang.System.arrayCopy
+ if (owner.equals("java/lang/System") && name.equals("arraycopy")) {
+
+ if (ARRAYCOPY_DESCRIPTORS.contains(desc)) {
+ desc = "(Ljava/lang/Object;ILjava/lang/Object;II)V";
+ }
}
super.visitMethodInsn(opcode, owner, name, desc);
}