jni_util.c revision 2884
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#include <stdlib.h>
#include <string.h>
#include "jvm.h"
#include "jni.h"
#include "jni_util.h"
/* Due to a bug in the win32 C runtime library strings
* such as "z:" need to be appended with a "." so we
* must allocate at least 4 bytes to allow room for
* this expansion. See 4235353 for details.
*/
/**
* Throw a Java exception by name. Similar to SignalError.
*/
{
if (cls != 0) /* Otherwise an exception has already been thrown */
}
/* JNU_Throw common exceptions */
{
}
{
}
{
}
{
}
{
}
{
}
{
}
{
}
{
}
{
}
{
}
{
}
{
}
{
}
{
}
{
}
/* Throw an exception by name, using the string returned by
* JVM_LastErrorString for the detail string. If the last-error
* string is NULL, use the given default detail string.
*/
const char *defaultDetail)
{
char buf[256];
if (n > 0) {
if (s != NULL) {
if (x != NULL) {
}
}
}
}
}
/* Throw an IOException, using the last-error string for the detail
* string. If the last-error string is NULL, use the given default
* detail string.
*/
{
}
const char *class_name,
const char *name,
const char *signature,
...)
{
const char *p = signature;
/* find out the return type */
while (*p && *p != ')')
p++;
p++;
result.i = 0;
goto done2;
if (clazz == 0)
goto done2;
if (mid == 0)
goto done1;
switch (*p) {
case 'V':
break;
case '[':
case 'L':
break;
case 'Z':
break;
case 'B':
break;
case 'C':
break;
case 'S':
break;
case 'I':
break;
case 'J':
break;
case 'F':
break;
case 'D':
break;
default:
}
if (hasException) {
}
return result;
}
const char *name,
const char *signature,
...)
{
args);
return result;
}
const char *name,
const char *signature,
{
const char *p = signature;
/* find out the return type */
while (*p && *p != ')')
p++;
p++;
result.i = 0;
goto done2;
if (mid == 0)
goto done1;
switch (*p) {
case 'V':
break;
case '[':
case 'L':
break;
case 'Z':
break;
case 'B':
break;
case 'C':
break;
case 'S':
break;
case 'I':
break;
case 'J':
break;
case 'F':
break;
case 'D':
break;
default:
}
if (hasException) {
}
return result;
}
const char *constructor_sig, ...)
{
goto done;
if (cls == 0) {
goto done;
}
"<init>", constructor_sig);
if (cls_initMID == NULL) {
goto done;
}
done:
return obj;
}
/* Optimized for char set ISO_8559_1 */
static jstring
{
int i;
if (len > 512) {
if (str1 == 0) {
return 0;
}
} else
for (i=0;i<len;i++)
return result;
}
static const char*
{
int i;
char *result;
if (str == 0) {
return 0;
}
if (result == 0) {
return 0;
}
for (i=0; i<len; i++) {
if (unicode <= 0x00ff)
else
result[i] = '?';
}
return result;
}
/* Optimized for char set ISO646-US (us-ascii) */
static jstring
{
int i;
if (len > 512) {
if (str1 == 0) {
return 0;
}
} else
for (i=0; i<len; i++) {
unsigned char c = (unsigned char)str[i];
if (c <= 0x7f)
str1[i] = c;
else
str1[i] = '?';
}
return result;
}
static const char*
{
int i;
char *result;
if (str == 0) {
return 0;
}
if (result == 0) {
return 0;
}
for (i=0; i<len; i++) {
if (unicode <= 0x007f )
else
result[i] = '?';
}
return result;
}
/* enumeration of c1 row from Cp1252 */
static int cp1252c1chars[32] = {
0x20AC,0xFFFD,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021,
0x02C6,0x2030,0x0160,0x2039,0x0152,0xFFFD,0x017D,0xFFFD,
0xFFFD,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
0x02Dc,0x2122,0x0161,0x203A,0x0153,0xFFFD,0x017E,0x0178
};
/* Optimized for char set Cp1252 */
static jstring
{
int i;
if (len > 512) {
if (str1 == 0) {
return 0;
}
} else
for (i=0; i<len; i++) {
unsigned char c = (unsigned char)str[i];
if ((c >= 0x80) && (c <= 0x9f))
else
str1[i] = c;
}
return result;
}
static const char*
{
int i;
char *result;
if (str == 0) {
return 0;
}
if (result == 0) {
return 0;
}
for (i=0; i<len; i++) {
if (c < 256)
result[i] = (char)c;
else switch(c) {
default: result[i] = '?'; break;
}
}
return result;
}
static int fastEncoding = NO_ENCODING_YET;
/* Cached method IDs */
int getFastEncoding() {
return fastEncoding;
}
/* Initialize the fast encoding. If the "sun.jnu.encoding" property
* has not yet been set, we leave fastEncoding == NO_ENCODING_YET.
*/
void
{
return;
if (propname) {
(env,
&exc,
"getProperty",
propname).l;
if (!exc) {
if (enc) {
if (encname) {
/*
* On Solaris with nl_langinfo() called in GetJavaProperties():
*
* locale undefined -> NULL -> hardcoded default
* "C" locale -> "" -> hardcoded default (on 2.6)
* "C" locale -> "ISO646-US" (on Sol 7/8)
* "en_US" locale -> "ISO8859-1"
* "en_GB" locale -> "ISO8859-1" (on Sol 7/8)
* "en_UK" locale -> "ISO8859-1" (on 2.6)
*/
/* This is a temporary fix until we move */
/* to wide character versions of all Windows */
/* calls. */
else {
}
}
}
} else {
}
} else {
}
/* Initialize method-id cache */
}
if (isJNUEncodingSupported == JNI_TRUE) {
return JNI_TRUE;
}
"isSupported",
jnuEncoding).z;
return isJNUEncodingSupported;
}
{
}
{
jbyteArray hab = 0;
int len;
if (fastEncoding == NO_ENCODING_YET)
if (fastEncoding == FAST_646_US)
if (fastEncoding == FAST_CP1252)
return NULL;
if (hab != 0) {
if (jnuEncodingSupported(env)) {
} else {
/*If the encoding specified in sun.jnu.encoding is not endorsed
by "Charset.isSupported" we have to fall back to use String(byte[])
explicitly here without specifying the encoding name, in which the
StringCoding class will pickup the iso-8859-1 as the fallback
converter for us.
*/
"<init>", "([B)V");
}
return result;
}
}
return NULL;
}
JNIEXPORT const char *
{
}
{
jbyteArray hab = 0;
if (isCopy)
if (fastEncoding == NO_ENCODING_YET)
if (fastEncoding == FAST_646_US)
if (fastEncoding == FAST_CP1252)
return 0;
if (jnuEncodingSupported(env)) {
} else {
"getBytes", "()[B");
}
if (result == 0) {
return 0;
}
}
}
return result;
}
{
}
/*
* Export the platform dependent path canonicalization so that
* VM can find it when loading system classes.
*
*/
JNIEXPORT int
{
/* canonicalize an already natived path */
}
{
if (cls == 0) {
jclass c;
return 0;
}
return cls;
}
{
if (cls == 0) {
jclass c;
return 0;
}
return cls;
}
{
if (cls == 0) {
jclass c;
return 0;
}
return cls;
}
{
if (cls == 0) {
jclass c;
return 0;
}
return cls;
}
{
int i;
return -1;
for (i=0; i<count; i++) {
}
return 0;
}
{
void *env;
return env;
}
{
return JNI_ERR;
return result;
}
return JNI_ERR;
}
{
}
}
/************************************************************************
* Thread calls
*/
static jmethodID Object_waitMID;
static jmethodID Object_notifyMID;
static jmethodID Object_notifyAllMID;
{
return;
}
if (Object_waitMID == NULL) {
return;
}
if (Object_waitMID == NULL) {
return;
}
}
}
{
return;
}
if (Object_notifyMID == NULL) {
return;
}
if (Object_notifyMID == NULL) {
return;
}
}
}
{
return;
}
if (Object_notifyAllMID == NULL) {
return;
}
if (Object_notifyAllMID == NULL) {
return;
}
}
}
/************************************************************************
* Debugging utilities
*/
{
} else {
if (stringPtr == 0)
return;
}
}
{
return;
} else {
}
}
{
} else {
NULL,
"toString",
}
}
const char *name,
const char *signature)
{
result.i = 0;
goto done2;
if (fid == 0)
goto done1;
switch (*signature) {
case '[':
case 'L':
break;
case 'Z':
break;
case 'B':
break;
case 'C':
break;
case 'S':
break;
case 'I':
break;
case 'J':
break;
case 'F':
break;
case 'D':
break;
default:
}
if (hasException) {
}
return result;
}
const char *name,
const char *signature,
...)
{
goto done2;
if (fid == 0)
goto done1;
switch (*signature) {
case '[':
case 'L':
break;
case 'Z':
break;
case 'B':
break;
case 'C':
break;
case 'S':
break;
case 'I':
break;
case 'J':
break;
case 'F':
break;
case 'D':
break;
default:
}
if (hasException) {
}
}
const char *classname,
const char *name,
const char *signature)
{
result.i = 0;
goto done2;
if (cls == 0)
goto done2;
if (fid == 0)
goto done1;
switch (*signature) {
case '[':
case 'L':
break;
case 'Z':
break;
case 'B':
break;
case 'C':
break;
case 'S':
break;
case 'I':
break;
case 'J':
break;
case 'F':
break;
case 'D':
break;
default:
}
if (hasException) {
}
return result;
}
const char *classname,
const char *name,
const char *signature,
...)
{
goto done2;
if (cls == 0)
goto done2;
if (fid == 0)
goto done1;
switch (*signature) {
case '[':
case 'L':
break;
case 'Z':
break;
case 'B':
break;
case 'C':
break;
case 'S':
break;
case 'I':
break;
case 'J':
break;
case 'F':
break;
case 'D':
break;
default:
}
if (hasException) {
}
}