@@ -112,8 +112,7 @@ FieldValueInternal::FieldValueInternal(const uint8_t* value, size_t size)
112112}
113113
114114FieldValueInternal::FieldValueInternal (DocumentReference value)
115- : Wrapper(firebase::Move(*value.internal_)),
116- cached_type_(Type::kReference ) {}
115+ : Wrapper(value.internal_), cached_type_{Type::kReference } {}
117116
118117FieldValueInternal::FieldValueInternal (GeoPoint value)
119118 : cached_type_(Type::kGeoPoint ) {
@@ -133,7 +132,8 @@ FieldValueInternal::FieldValueInternal(std::vector<FieldValue> value)
133132 jmethodID add_method = util::array_list::GetMethodId (util::array_list::kAdd );
134133 for (const FieldValue& element : value) {
135134 // ArrayList.Add() always returns true, which we have no use for.
136- env->CallBooleanMethod (obj_, add_method, element.internal_ ->obj_ );
135+ // TODO(b/150016438): don't conflate invalid `FieldValue`s and null.
136+ env->CallBooleanMethod (obj_, add_method, TryGetJobject (element));
137137 }
138138 CheckAndClearJniExceptions (env);
139139}
@@ -148,7 +148,8 @@ FieldValueInternal::FieldValueInternal(MapFieldValue value)
148148 jobject key = env->NewStringUTF (kv.first .c_str ());
149149 // Map::Put() returns previously associated value or null, which we have no
150150 // use for.
151- env->CallObjectMethod (obj_, put_method, key, kv.second .internal_ ->obj_ );
151+ // TODO(b/150016438): don't conflate invalid `FieldValue`s and null.
152+ env->CallObjectMethod (obj_, put_method, key, TryGetJobject (kv.second ));
152153 env->DeleteLocalRef (key);
153154 }
154155 CheckAndClearJniExceptions (env);
@@ -345,6 +346,10 @@ DocumentReference FieldValueInternal::reference_value() const {
345346 FIREBASE_ASSERT (cached_type_ == Type::kReference );
346347 }
347348
349+ if (!obj_) {
350+ // Reference may be invalid.
351+ return DocumentReference{};
352+ }
348353 return DocumentReference{new DocumentReferenceInternal (firestore_, obj_)};
349354}
350355
@@ -585,5 +590,9 @@ bool operator==(const FieldValueInternal& lhs, const FieldValueInternal& rhs) {
585590 return lhs.EqualsJavaObject (rhs);
586591}
587592
593+ jobject FieldValueInternal::TryGetJobject (const FieldValue& value) {
594+ return value.internal_ ? value.internal_ ->obj_ : nullptr ;
595+ }
596+
588597} // namespace firestore
589598} // namespace firebase
0 commit comments