Merge "Add/improve change markers for AtomicReferenceFieldUpdater."
diff --git a/ojluni/src/main/java/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java b/ojluni/src/main/java/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java
index 89ef627..2eef7e0 100644
--- a/ojluni/src/main/java/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java
+++ b/ojluni/src/main/java/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java
@@ -35,7 +35,7 @@
package java.util.concurrent.atomic;
-import dalvik.system.VMStack; // Android-added
+import dalvik.system.VMStack;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.security.AccessController;
@@ -107,7 +107,9 @@
Class<W> vclass,
String fieldName) {
return new AtomicReferenceFieldUpdaterImpl<U,W>
- (tclass, vclass, fieldName, VMStack.getStackClass1()); // Android-changed
+ // Android-changed: Use VMStack.getStackClass1.
+ // (tclass, vclass, fieldName, Reflection.getCallerClass());
+ (tclass, vclass, fieldName, VMStack.getStackClass1());
}
/**
@@ -317,23 +319,34 @@
final Class<?> fieldClass;
final int modifiers;
try {
- field = tclass.getDeclaredField(fieldName); // Android-changed
+ // Android-changed: Skip privilege escalation which is a noop on Android.
+ /*
+ field = AccessController.doPrivileged(
+ new PrivilegedExceptionAction<Field>() {
+ public Field run() throws NoSuchFieldException {
+ return tclass.getDeclaredField(fieldName);
+ }
+ });
+ */
+ field = tclass.getDeclaredField(fieldName);
modifiers = field.getModifiers();
sun.reflect.misc.ReflectUtil.ensureMemberAccess(
caller, tclass, null, modifiers);
- // BEGIN Android-removed
- // ClassLoader cl = tclass.getClassLoader();
- // ClassLoader ccl = caller.getClassLoader();
- // if ((ccl != null) && (ccl != cl) &&
- // ((cl == null) || !isAncestor(cl, ccl))) {
- // sun.reflect.misc.ReflectUtil.checkPackageAccess(tclass);
- // }
- // END Android-removed
+ // Android-removed: Skip checkPackageAccess which is a noop on Android.
+ /*
+ ClassLoader cl = tclass.getClassLoader();
+ ClassLoader ccl = caller.getClassLoader();
+ if ((ccl != null) && (ccl != cl) &&
+ ((cl == null) || !isAncestor(cl, ccl))) {
+ sun.reflect.misc.ReflectUtil.checkPackageAccess(tclass);
+ }
+ */
fieldClass = field.getType();
- // BEGIN Android-removed
- // } catch (PrivilegedActionException pae) {
- // throw new RuntimeException(pae.getException());
- // END Android-removed
+ // Android-removed: Skip privilege escalation which is a noop on Android.
+ /*
+ } catch (PrivilegedActionException pae) {
+ throw new RuntimeException(pae.getException());
+ */
} catch (Exception ex) {
throw new RuntimeException(ex);
}
@@ -352,23 +365,24 @@
this.offset = U.objectFieldOffset(field);
}
- // BEGIN Android-removed
- // /**
- // * Returns true if the second classloader can be found in the first
- // * classloader's delegation chain.
- // * Equivalent to the inaccessible: first.isAncestor(second).
- // */
- // private static boolean isAncestor(ClassLoader first, ClassLoader second) {
- // ClassLoader acl = first;
- // do {
- // acl = acl.getParent();
- // if (second == acl) {
- // return true;
- // }
- // } while (acl != null);
- // return false;
- // }
- // END Android-removed
+ // Android-removed: isAncestor's only usage was removed above.
+ /*
+ /**
+ * Returns true if the second classloader can be found in the first
+ * classloader's delegation chain.
+ * Equivalent to the inaccessible: first.isAncestor(second).
+ *
+ private static boolean isAncestor(ClassLoader first, ClassLoader second) {
+ ClassLoader acl = first;
+ do {
+ acl = acl.getParent();
+ if (second == acl) {
+ return true;
+ }
+ } while (acl != null);
+ return false;
+ }
+ */
/**
* Checks that target argument is instance of cclass. On