Merge "Wire up work_around_app_jni_bugs." into dalvik-dev
diff --git a/src/check_jni.cc b/src/check_jni.cc
index 4b17ad8..94f4cbd 100644
--- a/src/check_jni.cc
+++ b/src/check_jni.cc
@@ -691,7 +691,7 @@
     if (env_ != threadEnv) {
       LOG(ERROR) << "JNI ERROR: thread " << *self << " using JNIEnv* from thread " << *env_->self;
       // If we're keeping broken code limping along, we need to suppress the abort...
-      if (!env_->work_around_app_jni_bugs) {
+      if (!vm_->work_around_app_jni_bugs) {
         JniAbort();
         return;
       }
diff --git a/src/dalvik_system_VMRuntime.cc b/src/dalvik_system_VMRuntime.cc
index de5252d..3a1eac0 100644
--- a/src/dalvik_system_VMRuntime.cc
+++ b/src/dalvik_system_VMRuntime.cc
@@ -112,13 +112,12 @@
 
 void VMRuntime_setTargetSdkVersion(JNIEnv* env, jobject, jint targetSdkVersion) {
   // This is the target SDK version of the app we're about to run.
-  // Note that this value may be CUR_DEVELOPMENT (10000).
-  // Note that this value may be 0, meaning "current".
+  // Note that targetSdkVersion may be CUR_DEVELOPMENT (10000).
+  // Note that targetSdkVersion may be 0, meaning "current".
   if (targetSdkVersion > 0 && targetSdkVersion <= 13 /* honeycomb-mr2 */) {
     // TODO: running with CheckJNI should override this and force you to obey the strictest rules.
     LOG(INFO) << "Turning on JNI app bug workarounds for target SDK version " << targetSdkVersion << "...";
-    UNIMPLEMENTED(WARNING) << "can we get this as a command-line argument?";
-    //gDvmJni.work_around_app_jni_bugs = true;
+    Runtime::Current()->GetJavaVM()->work_around_app_jni_bugs = true;
   }
 }
 
diff --git a/src/jni_internal.cc b/src/jni_internal.cc
index 95acf99..8362895 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -94,7 +94,7 @@
   }
 #endif
 
-  if (env->work_around_app_jni_bugs) {
+  if (env->vm->work_around_app_jni_bugs) {
     // Hand out direct pointers to support broken old apps.
     return reinterpret_cast<T>(obj);
   }
@@ -2347,7 +2347,7 @@
         return JNILocalRefType;
       }
 
-      if (!ts.Env()->work_around_app_jni_bugs) {
+      if (!ts.Vm()->work_around_app_jni_bugs) {
         return JNIInvalidRefType;
       }
 
@@ -2608,7 +2608,6 @@
       local_ref_cookie(IRT_FIRST_SEGMENT),
       locals(kLocalsInitial, kLocalsMax, kLocal),
       check_jni(false),
-      work_around_app_jni_bugs(vm->work_around_app_jni_bugs),
       critical(false),
       monitors("monitors", kMonitorsInitial, kMonitorsMax) {
   functions = unchecked_functions = &gNativeInterface;
@@ -2750,7 +2749,7 @@
       check_jni(false),
       force_copy(false), // TODO: add a way to enable this
       trace(options->jni_trace_),
-      work_around_app_jni_bugs(false), // TODO: add a way to enable this
+      work_around_app_jni_bugs(false),
       pins_lock("JNI pin table lock"),
       pin_table("pin table", kPinTableInitial, kPinTableMax),
       globals_lock("JNI global reference table lock"),
diff --git a/src/jni_internal.h b/src/jni_internal.h
index dacc310..e02d01d 100644
--- a/src/jni_internal.h
+++ b/src/jni_internal.h
@@ -158,7 +158,6 @@
 
   // Frequently-accessed fields cached from JavaVM.
   bool check_jni;
-  bool work_around_app_jni_bugs;
 
   // How many nested "critical" JNI calls are we in?
   int critical;
diff --git a/src/scoped_jni_thread_state.h b/src/scoped_jni_thread_state.h
index 0da03d6..b312c5a 100644
--- a/src/scoped_jni_thread_state.h
+++ b/src/scoped_jni_thread_state.h
@@ -38,7 +38,7 @@
   static Thread* ThreadForEnv(JNIEnv* env) {
     JNIEnvExt* full_env(reinterpret_cast<JNIEnvExt*>(env));
     Thread* env_self = full_env->self;
-    Thread* self = full_env->work_around_app_jni_bugs ? Thread::Current() : env_self;
+    Thread* self = full_env->vm->work_around_app_jni_bugs ? Thread::Current() : env_self;
     if (self != env_self) {
       LOG(ERROR) << "JNI ERROR: JNIEnv for " << *env_self
                  << " used on " << *self;
diff --git a/src/thread.cc b/src/thread.cc
index 6bee2c8..a0179d8 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -957,7 +957,7 @@
     // Check if this is a local reference in the SIRT
     if (SirtContains(obj)) {
       result = *reinterpret_cast<Object**>(obj);  // Read from SIRT
-    } else if (jni_env_->work_around_app_jni_bugs) {
+    } else if (Runtime::Current()->GetJavaVM()->work_around_app_jni_bugs) {
       // Assume an invalid local reference is actually a direct pointer.
       result = reinterpret_cast<Object*>(obj);
     } else {