Be compatible with dalvikvm on calls to env->NewString(NULL, 0);
The previous behavior was causing libcore.java.util.OldScannerTest to
fail with NullPointerExceptions.
Change-Id: I8c9b4e496e6d17a0ad8be10888daa52ac8d178b7
diff --git a/src/jni_internal.cc b/src/jni_internal.cc
index 9936f25..82c120c 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -1837,9 +1837,6 @@
static jstring NewString(JNIEnv* env, const jchar* chars, jsize char_count) {
ScopedJniThreadState ts(env);
- if (chars == NULL && char_count == 0) {
- return NULL;
- }
String* result = String::AllocFromUtf16(char_count, chars);
return AddLocalReference<jstring>(env, result);
}
diff --git a/src/jni_internal_test.cc b/src/jni_internal_test.cc
index 18d8e0a..f03dbb3 100644
--- a/src/jni_internal_test.cc
+++ b/src/jni_internal_test.cc
@@ -7,6 +7,7 @@
#include <cmath>
#include "common_test.h"
+#include "gtest/gtest-death-test.h"
#include "ScopedLocalRef.h"
namespace art {
@@ -484,8 +485,6 @@
}
TEST_F(JniInternalTest, NewString) {
- EXPECT_TRUE(env_->NewString(NULL, 0) == NULL);
-
jchar chars[] = { 'h', 'i' };
jstring s;
s = env_->NewString(chars, 0);
@@ -500,6 +499,16 @@
// TODO: check some non-ASCII strings.
}
+TEST_F(JniInternalTest, NewStringNullCharsZeroLength) {
+ jstring s = env_->NewString(NULL, 0);
+ EXPECT_TRUE(s != NULL);
+ EXPECT_EQ(0, env_->GetStringLength(s));
+}
+
+TEST_F(JniInternalTest, NewStringNullCharsNonzeroLength) {
+ ASSERT_DEATH(env_->NewString(NULL, 1), "");
+}
+
TEST_F(JniInternalTest, GetStringLength_GetStringUTFLength) {
// Already tested in the NewString/NewStringUTF tests.
}
diff --git a/src/object.cc b/src/object.cc
index 27cbb41..49ba5a3 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -1377,6 +1377,7 @@
String* String::AllocFromUtf16(int32_t utf16_length,
const uint16_t* utf16_data_in,
int32_t hash_code) {
+ CHECK(utf16_data_in != NULL || utf16_length == 0);
String* string = Alloc(GetJavaLangString(), utf16_length);
if (string == NULL) {
return NULL;