Commit 5e74a4eb by Tom Tromey Committed by Tom Tromey

re PR java/16843 (gcjh generated headers don't define final constants)

	PR java/16843:
	* gjavah.c (HANDLE_END_FIELD): Call print_field_info when
	generating a JNI header.
	(print_field_info): Handle JNI headers.
	(jni_print_float): Likewise.
	(jni_print_double): Likewise.

From-SVN: r90277
parent 15fb0dbe
2004-11-08 Tom Tromey <tromey@redhat.com>
PR java/16843:
* gjavah.c (HANDLE_END_FIELD): Call print_field_info when
generating a JNI header.
(print_field_info): Handle JNI headers.
(jni_print_float): Likewise.
(jni_print_double): Likewise.
2004-11-08 Andrew Pinski <pinskia@physics.uc.edu> 2004-11-08 Andrew Pinski <pinskia@physics.uc.edu>
* decl.c (end_java_method): Remove duplicated code. * decl.c (end_java_method): Remove duplicated code.
......
...@@ -187,7 +187,7 @@ static int method_pass; ...@@ -187,7 +187,7 @@ static int method_pass;
#define HANDLE_END_FIELD() \ #define HANDLE_END_FIELD() \
if (field_pass) \ if (field_pass) \
{ \ { \
if (out && ! stubs && ! flag_jni) \ if (out && ! stubs) \
print_field_info (out, jcf, current_field_name, \ print_field_info (out, jcf, current_field_name, \
current_field_signature, \ current_field_signature, \
current_field_flags); \ current_field_flags); \
...@@ -278,7 +278,7 @@ jni_print_float (FILE *stream, jfloat f) ...@@ -278,7 +278,7 @@ jni_print_float (FILE *stream, jfloat f)
work in data initializers. FIXME. */ work in data initializers. FIXME. */
if (JFLOAT_FINITE (f)) if (JFLOAT_FINITE (f))
{ {
fputs (" = ", stream); fputs (flag_jni ? " " : " = ", out);
if (f.negative) if (f.negative)
putc ('-', stream); putc ('-', stream);
if (f.exponent) if (f.exponent)
...@@ -292,7 +292,8 @@ jni_print_float (FILE *stream, jfloat f) ...@@ -292,7 +292,8 @@ jni_print_float (FILE *stream, jfloat f)
((unsigned int)f.mantissa) << 1, ((unsigned int)f.mantissa) << 1,
f.exponent + 1 - JFLOAT_EXP_BIAS); f.exponent + 1 - JFLOAT_EXP_BIAS);
} }
fputs (";\n", stream); if (! flag_jni)
fputs (";\n", stream);
} }
/* Print a double-precision float, suitable for parsing by g++. */ /* Print a double-precision float, suitable for parsing by g++. */
...@@ -303,7 +304,7 @@ jni_print_double (FILE *stream, jdouble f) ...@@ -303,7 +304,7 @@ jni_print_double (FILE *stream, jdouble f)
work in data initializers. FIXME. */ work in data initializers. FIXME. */
if (JDOUBLE_FINITE (f)) if (JDOUBLE_FINITE (f))
{ {
fputs (" = ", stream); fputs (flag_jni ? " " : " = ", out);
if (f.negative) if (f.negative)
putc ('-', stream); putc ('-', stream);
if (f.exponent) if (f.exponent)
...@@ -317,7 +318,7 @@ jni_print_double (FILE *stream, jdouble f) ...@@ -317,7 +318,7 @@ jni_print_double (FILE *stream, jdouble f)
f.mantissa0, f.mantissa1, f.mantissa0, f.mantissa1,
f.exponent + 1 - JDOUBLE_EXP_BIAS); f.exponent + 1 - JDOUBLE_EXP_BIAS);
} }
fputs (";\n", stream); fputs (flag_jni ? "\n" : ";\n", stream);
} }
/* Print a character, appropriately mangled for JNI. */ /* Print a character, appropriately mangled for JNI. */
...@@ -725,7 +726,8 @@ print_field_info (FILE *stream, JCF* jcf, int name_index, int sig_index, ...@@ -725,7 +726,8 @@ print_field_info (FILE *stream, JCF* jcf, int name_index, int sig_index,
{ {
char *override = NULL; char *override = NULL;
generate_access (stream, flags); if (! flag_jni)
generate_access (stream, flags);
if (JPOOL_TAG (jcf, name_index) != CONSTANT_Utf8) if (JPOOL_TAG (jcf, name_index) != CONSTANT_Utf8)
{ {
fprintf (stream, "<not a UTF8 constant>"); fprintf (stream, "<not a UTF8 constant>");
...@@ -733,10 +735,38 @@ print_field_info (FILE *stream, JCF* jcf, int name_index, int sig_index, ...@@ -733,10 +735,38 @@ print_field_info (FILE *stream, JCF* jcf, int name_index, int sig_index,
return; return;
} }
fputs (" ", out); if (flag_jni)
{
/* For JNI we only want to print real constants. */
int val;
if (! (flags & ACC_STATIC)
|| ! (flags & ACC_FINAL)
|| current_field_value <= 0)
return;
val = JPOOL_TAG (jcf, current_field_value);
if (val != CONSTANT_Integer && val != CONSTANT_Long
&& val != CONSTANT_Float && val != CONSTANT_Double)
return;
}
else
{
/* Initial indentation. */
fputs (" ", stream);
}
if ((flags & ACC_STATIC)) if ((flags & ACC_STATIC))
{ {
fputs ("static ", out); if (flag_jni)
{
print_cxx_classname (stream, "#undef ", jcf, jcf->this_class, 1);
fputs ("_", stream);
print_field_name (stream, jcf, name_index, 0);
fputs ("\n", stream);
print_cxx_classname (stream, "#define ", jcf, jcf->this_class, 1);
fputs ("_", stream);
}
else
fputs ("static ", stream);
if ((flags & ACC_FINAL) && current_field_value > 0) if ((flags & ACC_FINAL) && current_field_value > 0)
{ {
...@@ -749,9 +779,10 @@ print_field_info (FILE *stream, JCF* jcf, int name_index, int sig_index, ...@@ -749,9 +779,10 @@ print_field_info (FILE *stream, JCF* jcf, int name_index, int sig_index,
{ {
jint num; jint num;
int most_negative = 0; int most_negative = 0;
fputs ("const jint ", out); if (! flag_jni)
print_field_name (out, jcf, name_index, 0); fputs ("const jint ", stream);
fputs (" = ", out); print_field_name (stream, jcf, name_index, 0);
fputs (flag_jni ? " " : " = ", stream);
num = JPOOL_INT (jcf, current_field_value); num = JPOOL_INT (jcf, current_field_value);
/* We single out the most negative number to print /* We single out the most negative number to print
specially. This avoids later warnings from g++. */ specially. This avoids later warnings from g++. */
...@@ -761,16 +792,19 @@ print_field_info (FILE *stream, JCF* jcf, int name_index, int sig_index, ...@@ -761,16 +792,19 @@ print_field_info (FILE *stream, JCF* jcf, int name_index, int sig_index,
++num; ++num;
} }
format_int (buffer, (jlong) num, 10); format_int (buffer, (jlong) num, 10);
fprintf (out, "%sL%s;\n", buffer, most_negative ? " - 1" : ""); fprintf (stream, "%sL%s%s\n", buffer,
most_negative ? " - 1" : "",
flag_jni ? "" : ";");
} }
break; break;
case CONSTANT_Long: case CONSTANT_Long:
{ {
jlong num; jlong num;
int most_negative = 0; int most_negative = 0;
fputs ("const jlong ", out); if (! flag_jni)
print_field_name (out, jcf, name_index, 0); fputs ("const jlong ", stream);
fputs (" = ", out); print_field_name (stream, jcf, name_index, 0);
fputs (flag_jni ? " " : " = ", stream);
num = JPOOL_LONG (jcf, current_field_value); num = JPOOL_LONG (jcf, current_field_value);
/* We single out the most negative number to print /* We single out the most negative number to print
specially.. This avoids later warnings from g++. */ specially.. This avoids later warnings from g++. */
...@@ -780,23 +814,27 @@ print_field_info (FILE *stream, JCF* jcf, int name_index, int sig_index, ...@@ -780,23 +814,27 @@ print_field_info (FILE *stream, JCF* jcf, int name_index, int sig_index,
++num; ++num;
} }
format_int (buffer, num, 10); format_int (buffer, num, 10);
fprintf (out, "%sLL%s;\n", buffer, most_negative ? " - 1" :""); fprintf (stream, "%sLL%s%s\n", buffer,
most_negative ? " - 1" :"",
flag_jni ? "" : ";");
} }
break; break;
case CONSTANT_Float: case CONSTANT_Float:
{ {
jfloat fnum = JPOOL_FLOAT (jcf, current_field_value); jfloat fnum = JPOOL_FLOAT (jcf, current_field_value);
fputs ("const jfloat ", out); if (! flag_jni)
print_field_name (out, jcf, name_index, 0); fputs ("const jfloat ", stream);
jni_print_float (out, fnum); print_field_name (stream, jcf, name_index, 0);
jni_print_float (stream, fnum);
} }
break; break;
case CONSTANT_Double: case CONSTANT_Double:
{ {
jdouble dnum = JPOOL_DOUBLE (jcf, current_field_value); jdouble dnum = JPOOL_DOUBLE (jcf, current_field_value);
fputs ("const jdouble ", out); if (! flag_jni)
print_field_name (out, jcf, name_index, 0); fputs ("const jdouble ", stream);
jni_print_double (out, dnum); print_field_name (stream, jcf, name_index, 0);
jni_print_double (stream, dnum);
} }
break; break;
default: default:
...@@ -811,9 +849,10 @@ print_field_info (FILE *stream, JCF* jcf, int name_index, int sig_index, ...@@ -811,9 +849,10 @@ print_field_info (FILE *stream, JCF* jcf, int name_index, int sig_index,
} }
} }
/* assert (! flag_jni); */
override = get_field_name (jcf, name_index, flags); override = get_field_name (jcf, name_index, flags);
print_c_decl (out, jcf, name_index, sig_index, 0, override, flags); print_c_decl (stream, jcf, name_index, sig_index, 0, override, flags);
fputs (";\n", out); fputs (";\n", stream);
if (override) if (override)
free (override); free (override);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment