提交 acb6dfb7 编写于 作者: M mullan

Merge

/* /*
* Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1994, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -987,7 +987,8 @@ public final class String ...@@ -987,7 +987,8 @@ public final class String
/** /**
* Compares this string to the specified {@code StringBuffer}. The result * Compares this string to the specified {@code StringBuffer}. The result
* is {@code true} if and only if this {@code String} represents the same * is {@code true} if and only if this {@code String} represents the same
* sequence of characters as the specified {@code StringBuffer}. * sequence of characters as the specified {@code StringBuffer}. This method
* synchronizes on the {@code StringBuffer}.
* *
* @param sb * @param sb
* The {@code StringBuffer} to compare this {@code String} against * The {@code StringBuffer} to compare this {@code String} against
...@@ -999,15 +1000,29 @@ public final class String ...@@ -999,15 +1000,29 @@ public final class String
* @since 1.4 * @since 1.4
*/ */
public boolean contentEquals(StringBuffer sb) { public boolean contentEquals(StringBuffer sb) {
synchronized (sb) {
return contentEquals((CharSequence) sb); return contentEquals((CharSequence) sb);
} }
private boolean nonSyncContentEquals(AbstractStringBuilder sb) {
char v1[] = value;
char v2[] = sb.getValue();
int i = 0;
int n = value.length;
while (n-- != 0) {
if (v1[i] != v2[i]) {
return false;
}
i++;
}
return true;
} }
/** /**
* Compares this string to the specified {@code CharSequence}. The result * Compares this string to the specified {@code CharSequence}. The
* is {@code true} if and only if this {@code String} represents the same * result is {@code true} if and only if this {@code String} represents the
* sequence of char values as the specified sequence. * same sequence of char values as the specified sequence. Note that if the
* {@code CharSequence} is a {@code StringBuffer} then the method
* synchronizes on it.
* *
* @param cs * @param cs
* The sequence to compare this {@code String} against * The sequence to compare this {@code String} against
...@@ -1023,16 +1038,13 @@ public final class String ...@@ -1023,16 +1038,13 @@ public final class String
return false; return false;
// Argument is a StringBuffer, StringBuilder // Argument is a StringBuffer, StringBuilder
if (cs instanceof AbstractStringBuilder) { if (cs instanceof AbstractStringBuilder) {
char v1[] = value; if (cs instanceof StringBuffer) {
char v2[] = ((AbstractStringBuilder) cs).getValue(); synchronized(cs) {
int i = 0; return nonSyncContentEquals((AbstractStringBuilder)cs);
int n = value.length; }
while (n-- != 0) { } else {
if (v1[i] != v2[i]) return nonSyncContentEquals((AbstractStringBuilder)cs);
return false;
i++;
} }
return true;
} }
// Argument is a String // Argument is a String
if (cs.equals(this)) if (cs.equals(this))
......
...@@ -135,12 +135,12 @@ setPathEnvironment(char *envstring) ...@@ -135,12 +135,12 @@ setPathEnvironment(char *envstring)
#define P_tmpdir "/var/tmp" #define P_tmpdir "/var/tmp"
#endif #endif
static int ParseLocale(int cat, char ** std_language, char ** std_script, static int ParseLocale(JNIEnv* env, int cat, char ** std_language, char ** std_script,
char ** std_country, char ** std_variant, char ** std_encoding) { char ** std_country, char ** std_variant, char ** std_encoding) {
char temp[64]; char *temp = NULL;
char *language = NULL, *country = NULL, *variant = NULL, char *language = NULL, *country = NULL, *variant = NULL,
*encoding = NULL; *encoding = NULL;
char *p, encoding_variant[64]; char *p, *encoding_variant;
char *lc; char *lc;
/* Query the locale set for the category */ /* Query the locale set for the category */
...@@ -156,6 +156,12 @@ static int ParseLocale(int cat, char ** std_language, char ** std_script, ...@@ -156,6 +156,12 @@ static int ParseLocale(int cat, char ** std_language, char ** std_script,
return 0; return 0;
} }
temp = malloc(strlen(lc) + 1);
if (temp == NULL) {
JNU_ThrowOutOfMemoryError(env, NULL);
return 0;
}
if (cat == LC_CTYPE) { if (cat == LC_CTYPE) {
/* /*
* Workaround for Solaris bug 4201684: Xlib doesn't like @euro * Workaround for Solaris bug 4201684: Xlib doesn't like @euro
...@@ -178,6 +184,13 @@ static int ParseLocale(int cat, char ** std_language, char ** std_script, ...@@ -178,6 +184,13 @@ static int ParseLocale(int cat, char ** std_language, char ** std_script,
if (lc == NULL || !strcmp(lc, "C") || !strcmp(lc, "POSIX")) { if (lc == NULL || !strcmp(lc, "C") || !strcmp(lc, "POSIX")) {
lc = "en_US"; lc = "en_US";
} }
temp = malloc(strlen(lc) + 1);
if (temp == NULL) {
JNU_ThrowOutOfMemoryError(env, NULL);
return 0;
}
#endif #endif
/* /*
...@@ -203,6 +216,13 @@ static int ParseLocale(int cat, char ** std_language, char ** std_script, ...@@ -203,6 +216,13 @@ static int ParseLocale(int cat, char ** std_language, char ** std_script,
* to a default country if that's possible. It's also used to map * to a default country if that's possible. It's also used to map
* the Solaris locale aliases to their proper Java locale IDs. * the Solaris locale aliases to their proper Java locale IDs.
*/ */
encoding_variant = malloc(strlen(temp)+1);
if (encoding_variant == NULL) {
JNU_ThrowOutOfMemoryError(env, NULL);
return 0;
}
if ((p = strchr(temp, '.')) != NULL) { if ((p = strchr(temp, '.')) != NULL) {
strcpy(encoding_variant, p); /* Copy the leading '.' */ strcpy(encoding_variant, p); /* Copy the leading '.' */
*p = '\0'; *p = '\0';
...@@ -214,7 +234,17 @@ static int ParseLocale(int cat, char ** std_language, char ** std_script, ...@@ -214,7 +234,17 @@ static int ParseLocale(int cat, char ** std_language, char ** std_script,
} }
if (mapLookup(locale_aliases, temp, &p)) { if (mapLookup(locale_aliases, temp, &p)) {
temp = realloc(temp, strlen(p)+1);
if (temp == NULL) {
JNU_ThrowOutOfMemoryError(env, NULL);
return 0;
}
strcpy(temp, p); strcpy(temp, p);
encoding_variant = realloc(encoding_variant, strlen(temp)+1);
if (encoding_variant == NULL) {
JNU_ThrowOutOfMemoryError(env, NULL);
return 0;
}
// check the "encoding_variant" again, if any. // check the "encoding_variant" again, if any.
if ((p = strchr(temp, '.')) != NULL) { if ((p = strchr(temp, '.')) != NULL) {
strcpy(encoding_variant, p); /* Copy the leading '.' */ strcpy(encoding_variant, p); /* Copy the leading '.' */
...@@ -326,6 +356,9 @@ static int ParseLocale(int cat, char ** std_language, char ** std_script, ...@@ -326,6 +356,9 @@ static int ParseLocale(int cat, char ** std_language, char ** std_script,
#endif #endif
} }
free(temp);
free(encoding_variant);
return 1; return 1;
} }
...@@ -480,13 +513,13 @@ GetJavaProperties(JNIEnv *env) ...@@ -480,13 +513,13 @@ GetJavaProperties(JNIEnv *env)
* and store these in the user.language, user.country, user.variant and * and store these in the user.language, user.country, user.variant and
* file.encoding system properties. */ * file.encoding system properties. */
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
if (ParseLocale(LC_CTYPE, if (ParseLocale(env, LC_CTYPE,
&(sprops.format_language), &(sprops.format_language),
&(sprops.format_script), &(sprops.format_script),
&(sprops.format_country), &(sprops.format_country),
&(sprops.format_variant), &(sprops.format_variant),
&(sprops.encoding))) { &(sprops.encoding))) {
ParseLocale(LC_MESSAGES, ParseLocale(env, LC_MESSAGES,
&(sprops.language), &(sprops.language),
&(sprops.script), &(sprops.script),
&(sprops.country), &(sprops.country),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册