Add a default constructor to JValue.

Change-Id: I7abe801b26f5003c480215c1f1ca64dfc07667ed
diff --git a/src/java_lang_reflect_Field.cc b/src/java_lang_reflect_Field.cc
index 9343117..7cc4166 100644
--- a/src/java_lang_reflect_Field.cc
+++ b/src/java_lang_reflect_Field.cc
@@ -95,7 +95,7 @@
   }
 
   // Get the field's value, boxing if necessary.
-  JValue value = { 0 };
+  JValue value;
   if (!GetFieldValue(o, f, value, true)) {
     return NULL;
   }
@@ -112,7 +112,7 @@
   }
 
   // Read the value.
-  JValue field_value = { 0 };
+  JValue field_value;
   if (!GetFieldValue(o, f, field_value, false)) {
     return JValue();
   }
@@ -256,49 +256,49 @@
 }
 
 static void Field_setBoolean(JNIEnv* env, jobject javaField, jobject javaObj, jboolean value) {
-  JValue v = { 0 };
+  JValue v;
   v.z = value;
   SetPrimitiveField(env, javaField, javaObj, 'Z', v);
 }
 
 static void Field_setByte(JNIEnv* env, jobject javaField, jobject javaObj, jbyte value) {
-  JValue v = { 0 };
+  JValue v;
   v.b = value;
   SetPrimitiveField(env, javaField, javaObj, 'B', v);
 }
 
 static void Field_setChar(JNIEnv* env, jobject javaField, jobject javaObj, jchar value) {
-  JValue v = { 0 };
+  JValue v;
   v.c = value;
   SetPrimitiveField(env, javaField, javaObj, 'C', v);
 }
 
 static void Field_setDouble(JNIEnv* env, jobject javaField, jobject javaObj, jdouble value) {
-  JValue v = { 0 };
+  JValue v;
   v.d = value;
   SetPrimitiveField(env, javaField, javaObj, 'D', v);
 }
 
 static void Field_setFloat(JNIEnv* env, jobject javaField, jobject javaObj, jfloat value) {
-  JValue v = { 0 };
+  JValue v;
   v.f = value;
   SetPrimitiveField(env, javaField, javaObj, 'F', v);
 }
 
 static void Field_setInt(JNIEnv* env, jobject javaField, jobject javaObj, jint value) {
-  JValue v = { 0 };
+  JValue v;
   v.i = value;
   SetPrimitiveField(env, javaField, javaObj, 'I', v);
 }
 
 static void Field_setLong(JNIEnv* env, jobject javaField, jobject javaObj, jlong value) {
-  JValue v = { 0 };
+  JValue v;
   v.j = value;
   SetPrimitiveField(env, javaField, javaObj, 'J', v);
 }
 
 static void Field_setShort(JNIEnv* env, jobject javaField, jobject javaObj, jshort value) {
-  JValue v = { 0 };
+  JValue v;
   v.s = value;
   SetPrimitiveField(env, javaField, javaObj, 'S', v);
 }
diff --git a/src/jni_internal.cc b/src/jni_internal.cc
index 26f069c..86135ab 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -293,7 +293,7 @@
 static JValue InvokeWithArgArray(JNIEnv* public_env, Object* receiver, Method* method, JValue* args) {
   CheckMethodArguments(method, args);
   JNIEnvExt* env = reinterpret_cast<JNIEnvExt*>(public_env);
-  JValue result = { 0 };
+  JValue result;
   method->Invoke(env->self, receiver, args, &result);
   return result;
 }
@@ -1063,20 +1063,20 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return AddLocalReference<jobject>(env, result.l);
   }
 
   static jobject CallObjectMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    JValue result = InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args);
+    JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args));
     return AddLocalReference<jobject>(env, result.l);
   }
 
   static jobject CallObjectMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    JValue result = InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args);
+    JValue result(InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args));
     return AddLocalReference<jobject>(env, result.l);
   }
 
@@ -1084,7 +1084,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.z;
   }
@@ -1103,7 +1103,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.b;
   }
@@ -1122,7 +1122,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.c;
   }
@@ -1141,7 +1141,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.d;
   }
@@ -1160,7 +1160,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.f;
   }
@@ -1179,7 +1179,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.i;
   }
@@ -1198,7 +1198,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.j;
   }
@@ -1217,7 +1217,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.s;
   }
@@ -1236,7 +1236,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
   }
 
@@ -1254,7 +1254,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     jobject local_result = AddLocalReference<jobject>(env, result.l);
     va_end(ap);
     return local_result;
@@ -1263,14 +1263,14 @@
   static jobject CallNonvirtualObjectMethodV(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    JValue result = InvokeWithVarArgs(env, obj, mid, args);
+    JValue result(InvokeWithVarArgs(env, obj, mid, args));
     return AddLocalReference<jobject>(env, result.l);
   }
 
   static jobject CallNonvirtualObjectMethodA(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    JValue result = InvokeWithJValues(env, obj, mid, args);
+    JValue result(InvokeWithJValues(env, obj, mid, args));
     return AddLocalReference<jobject>(env, result.l);
   }
 
@@ -1279,7 +1279,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.z;
   }
@@ -1300,7 +1300,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.b;
   }
@@ -1321,7 +1321,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.c;
   }
@@ -1342,7 +1342,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.s;
   }
@@ -1363,7 +1363,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.i;
   }
@@ -1384,7 +1384,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.j;
   }
@@ -1405,7 +1405,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.f;
   }
@@ -1426,7 +1426,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, obj, mid, ap);
+    JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
     return result.d;
   }
@@ -1646,7 +1646,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, NULL, mid, ap);
+    JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     jobject local_result = AddLocalReference<jobject>(env, result.l);
     va_end(ap);
     return local_result;
@@ -1654,13 +1654,13 @@
 
   static jobject CallStaticObjectMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    JValue result = InvokeWithVarArgs(env, NULL, mid, args);
+    JValue result(InvokeWithVarArgs(env, NULL, mid, args));
     return AddLocalReference<jobject>(env, result.l);
   }
 
   static jobject CallStaticObjectMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    JValue result = InvokeWithJValues(env, NULL, mid, args);
+    JValue result(InvokeWithJValues(env, NULL, mid, args));
     return AddLocalReference<jobject>(env, result.l);
   }
 
@@ -1668,7 +1668,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, NULL, mid, ap);
+    JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
     return result.z;
   }
@@ -1687,7 +1687,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, NULL, mid, ap);
+    JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
     return result.b;
   }
@@ -1706,7 +1706,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, NULL, mid, ap);
+    JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
     return result.c;
   }
@@ -1725,7 +1725,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, NULL, mid, ap);
+    JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
     return result.s;
   }
@@ -1744,7 +1744,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, NULL, mid, ap);
+    JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
     return result.i;
   }
@@ -1763,7 +1763,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, NULL, mid, ap);
+    JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
     return result.j;
   }
@@ -1782,7 +1782,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, NULL, mid, ap);
+    JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
     return result.f;
   }
@@ -1801,7 +1801,7 @@
     ScopedJniThreadState ts(env);
     va_list ap;
     va_start(ap, mid);
-    JValue result = InvokeWithVarArgs(env, NULL, mid, ap);
+    JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
     return result.d;
   }
diff --git a/src/object.cc b/src/object.cc
index cd6b51f..f863a39 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -248,36 +248,43 @@
   Set64(object, j);
 }
 
+union Bits {
+  jdouble d;
+  jfloat f;
+  jint i;
+  jlong j;
+};
+
 float Field::GetFloat(const Object* object) const {
   DCHECK_EQ(Primitive::kPrimFloat, FieldHelper(this).GetTypeAsPrimitiveType())
        << PrettyField(this);
-  JValue float_bits;
-  float_bits.i = Get32(object);
-  return float_bits.f;
+  Bits bits;
+  bits.i = Get32(object);
+  return bits.f;
 }
 
 void Field::SetFloat(Object* object, float f) const {
   DCHECK_EQ(Primitive::kPrimFloat, FieldHelper(this).GetTypeAsPrimitiveType())
        << PrettyField(this);
-  JValue float_bits;
-  float_bits.f = f;
-  Set32(object, float_bits.i);
+  Bits bits;
+  bits.f = f;
+  Set32(object, bits.i);
 }
 
 double Field::GetDouble(const Object* object) const {
   DCHECK_EQ(Primitive::kPrimDouble, FieldHelper(this).GetTypeAsPrimitiveType())
        << PrettyField(this);
-  JValue double_bits;
-  double_bits.j = Get64(object);
-  return double_bits.d;
+  Bits bits;
+  bits.j = Get64(object);
+  return bits.d;
 }
 
 void Field::SetDouble(Object* object, double d) const {
   DCHECK_EQ(Primitive::kPrimDouble, FieldHelper(this).GetTypeAsPrimitiveType())
        << PrettyField(this);
-  JValue double_bits;
-  double_bits.d = d;
-  Set64(object, double_bits.j);
+  Bits bits;
+  bits.d = d;
+  Set64(object, bits.j);
 }
 
 Object* Field::GetObject(const Object* object) const {
diff --git a/src/object.h b/src/object.h
index 3ece535..7413bf9 100644
--- a/src/object.h
+++ b/src/object.h
@@ -60,6 +60,9 @@
 typedef PrimitiveArray<int16_t> ShortArray;
 
 union JValue {
+  // We default initialize JValue instances to all-zeros.
+  JValue() : j(0) {}
+
   uint8_t z;
   int8_t b;
   uint16_t c;
diff --git a/src/reflection.cc b/src/reflection.cc
index f7c275c..aba930c 100644
--- a/src/reflection.cc
+++ b/src/reflection.cc
@@ -101,7 +101,7 @@
   }
 
   // Invoke the method.
-  JValue value = InvokeWithJValues(env, javaReceiver, mid, args.get());
+  JValue value(InvokeWithJValues(env, javaReceiver, mid, args.get()));
 
   // Wrap any exception with "Ljava/lang/reflect/InvocationTargetException;" and return early.
   if (self->IsExceptionPending()) {
@@ -301,7 +301,7 @@
     return false;
   }
 
-  JValue boxed_value = { 0 };
+  JValue boxed_value;
   std::string src_descriptor(ClassHelper(o->GetClass()).GetDescriptor());
   Class* src_class = NULL;
   ClassLinker* class_linker = Runtime::Current()->GetClassLinker();