class.c (add_method_1): Set both DECL_EXTERNAL and METHOD_NATIVE on native function.

* class.c (add_method_1): Set both DECL_EXTERNAL and METHOD_NATIVE
	on native function.
	* jcf-parse.c (parse_class_file): Call build_jni_stub for native
	JNI methods.
	* expr.c (build_jni_stub): New function.
	* lang-specs.h: -fjni and -femit-class-file are incompatible.
	* parse.c: Rebuilt.
	* parse.y (java_complete_expand_methods): Expand a native method
	and call build_jni_stub if -fjni given.
	* lang-options.h: Document -fjni.
	* lang.c (flag_jni): New global.
	(lang_f_options): Added `jni' entry.
	* java-tree.h (soft_lookupjnimethod_node,
	soft_getjnienvnewframe_node, soft_jnipopsystemframe_node):
	Declare.
	(flag_jni): Declare.
	(build_jni_stub): Declare.
	(struct lang_decl): Added `native' flag.
	(METHOD_NATIVE): Redefined to use `native' field of lang specific
	structure.
	* decl.c (soft_lookupjnimethod_node, soft_getjnienvnewframe_node,
	soft_jnipopsystemframe_node): New globals.
	(init_decl_processing): Set them.  _Jv_InitClass only takes one
	argument.

	* java-tree.def: Put into `C' mode.

From-SVN: r33615
This commit is contained in:
Tom Tromey 2000-05-02 20:32:31 +00:00 committed by Tom Tromey
parent 09fa07054c
commit 7145d9fe6b
12 changed files with 456 additions and 253 deletions

View File

@ -1,3 +1,32 @@
2000-04-19 Tom Tromey <tromey@cygnus.com>
* class.c (add_method_1): Set both DECL_EXTERNAL and METHOD_NATIVE
on native function.
* jcf-parse.c (parse_class_file): Call build_jni_stub for native
JNI methods.
* expr.c (build_jni_stub): New function.
* lang-specs.h: -fjni and -femit-class-file are incompatible.
* parse.c: Rebuilt.
* parse.y (java_complete_expand_methods): Expand a native method
and call build_jni_stub if -fjni given.
* lang-options.h: Document -fjni.
* lang.c (flag_jni): New global.
(lang_f_options): Added `jni' entry.
* java-tree.h (soft_lookupjnimethod_node,
soft_getjnienvnewframe_node, soft_jnipopsystemframe_node):
Declare.
(flag_jni): Declare.
(build_jni_stub): Declare.
(struct lang_decl): Added `native' flag.
(METHOD_NATIVE): Redefined to use `native' field of lang specific
structure.
* decl.c (soft_lookupjnimethod_node, soft_getjnienvnewframe_node,
soft_jnipopsystemframe_node): New globals.
(init_decl_processing): Set them. _Jv_InitClass only takes one
argument.
* java-tree.def: Put into `C' mode.
2000-04-27 Tom Tromey <tromey@cygnus.com>
Fix for PR gcj/2:

View File

@ -644,7 +644,11 @@ add_method_1 (handle_class, access_flags, name, function_type)
if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
if (access_flags & ACC_PRIVATE)
METHOD_PRIVATE (fndecl) = DECL_INLINE (fndecl) = 1;
if (access_flags & ACC_NATIVE) METHOD_NATIVE (fndecl) = 1;
if (access_flags & ACC_NATIVE)
{
METHOD_NATIVE (fndecl) = 1;
DECL_EXTERNAL (fndecl) = 1;
}
if (access_flags & ACC_STATIC)
METHOD_STATIC (fndecl) = DECL_INLINE (fndecl) = 1;
if (access_flags & ACC_FINAL)

View File

@ -381,6 +381,9 @@ tree soft_checkarraystore_node;
tree soft_monitorenter_node;
tree soft_monitorexit_node;
tree soft_lookupinterfacemethod_node;
tree soft_lookupjnimethod_node;
tree soft_getjnienvnewframe_node;
tree soft_jnipopsystemframe_node;
tree soft_fmod_node;
tree soft_exceptioninfo_call_node;
tree soft_idiv_node;
@ -753,12 +756,13 @@ init_decl_processing ()
build_function_type (ptr_type_node, t),
0, NOT_BUILT_IN, NULL_PTR);
DECL_IS_MALLOC (alloc_object_node) = 1;
t = tree_cons (NULL_TREE, ptr_type_node, endlink);
soft_initclass_node = builtin_function ("_Jv_InitClass",
build_function_type (void_type_node,
t),
0, NOT_BUILT_IN,
NULL_PTR);
t = tree_cons (NULL_TREE, ptr_type_node, endlink);
throw_node[0] = builtin_function ("_Jv_Throw",
build_function_type (ptr_type_node, t),
0, NOT_BUILT_IN, NULL_PTR);
@ -848,6 +852,24 @@ init_decl_processing ()
= builtin_function ("_Jv_LookupInterfaceMethodIdx",
build_function_type (ptr_type_node, t),
0, NOT_BUILT_IN, NULL_PTR);
t = tree_cons (NULL_TREE, object_ptr_type_node,
tree_cons (NULL_TREE, ptr_type_node,
tree_cons (NULL_TREE, ptr_type_node, endlink)));
soft_lookupjnimethod_node
= builtin_function ("_Jv_LookupJNIMethod",
build_function_type (ptr_type_node, t),
0, NOT_BUILT_IN, NULL_PTR);
t = tree_cons (NULL_TREE, ptr_type_node, endlink);
soft_getjnienvnewframe_node
= builtin_function ("_Jv_GetJNIEnvNewFrame",
build_function_type (ptr_type_node, t),
0, NOT_BUILT_IN, NULL_PTR);
soft_jnipopsystemframe_node
= builtin_function ("_Jv_JNI_PopSystemFrame",
build_function_type (ptr_type_node, t),
0, NOT_BUILT_IN, NULL_PTR);
t = tree_cons (NULL_TREE, double_type_node,
tree_cons (NULL_TREE, double_type_node, endlink));
soft_fmod_node
@ -1726,7 +1748,7 @@ complete_start_java_method (fndecl)
if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files)
{
/* Warp function body with a monitorenter plus monitorexit cleanup. */
/* Wrap function body with a monitorenter plus monitorexit cleanup. */
tree enter, exit, lock;
if (METHOD_STATIC (fndecl))
lock = build_class_ref (DECL_CONTEXT (fndecl));

View File

@ -1844,6 +1844,165 @@ expand_invoke (opcode, method_ref_index, nargs)
}
}
/* Create a stub which will be put into the vtable but which will call
a JNI function. */
tree
build_jni_stub (method)
tree method;
{
tree jnifunc, call, args, body, lookup_arg, method_sig, arg_types;
tree jni_func_type, tem;
tree env_var, res_var = NULL_TREE, block;
tree method_args, res_type;
tree klass = DECL_CONTEXT (method);
int from_class = ! CLASS_FROM_SOURCE_P (klass);
klass = build_class_ref (klass);
if (! METHOD_NATIVE (method) || ! flag_jni)
abort ();
DECL_ARTIFICIAL (method) = 1;
DECL_EXTERNAL (method) = 0;
env_var = build_decl (VAR_DECL, get_identifier ("env"), ptr_type_node);
if (TREE_TYPE (TREE_TYPE (method)) != void_type_node)
{
res_var = build_decl (VAR_DECL, get_identifier ("res"),
TREE_TYPE (TREE_TYPE (method)));
TREE_CHAIN (env_var) = res_var;
}
/* One strange way that the front ends are different is that they
store arguments differently. */
if (from_class)
method_args = DECL_ARGUMENTS (method);
else
method_args = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (method));
block = build_block (env_var, NULL_TREE, NULL_TREE,
method_args, NULL_TREE);
TREE_SIDE_EFFECTS (block) = 1;
/* When compiling from source we don't set the type of the block,
because that will prevent patch_return from ever being run. */
if (from_class)
TREE_TYPE (block) = TREE_TYPE (TREE_TYPE (method));
/* Compute the local `env' by calling _Jv_GetJNIEnvNewFrame. */
body = build (MODIFY_EXPR, ptr_type_node, env_var,
build (CALL_EXPR, ptr_type_node,
build_address_of (soft_getjnienvnewframe_node),
build_tree_list (NULL_TREE, klass),
NULL_TREE));
CAN_COMPLETE_NORMALLY (body) = 1;
/* All the arguments to this method become arguments to the
underlying JNI function. If we had to wrap object arguments in a
special way, we would do that here. */
args = NULL_TREE;
for (tem = method_args; tem != NULL_TREE; tem = TREE_CHAIN (tem))
args = tree_cons (NULL_TREE, tem, args);
args = nreverse (args);
arg_types = TYPE_ARG_TYPES (TREE_TYPE (method));
/* For a static method the second argument is the class. For a
non-static method the second argument is `this'; that is already
available in the argument list. */
if (METHOD_STATIC (method))
{
args = tree_cons (NULL_TREE, klass, args);
arg_types = tree_cons (NULL_TREE, object_ptr_type_node, arg_types);
}
/* The JNIEnv structure is the first argument to the JNI function. */
args = tree_cons (NULL_TREE, env_var, args);
arg_types = tree_cons (NULL_TREE, ptr_type_node, arg_types);
/* We call _Jv_LookupJNIMethod to find the actual underlying
function pointer. _Jv_LookupJNIMethod will throw the appropriate
exception if this function is not found at runtime. */
method_sig = build_java_signature (TREE_TYPE (method));
lookup_arg =
build_tree_list (NULL_TREE,
build_utf8_ref (unmangle_classname
(IDENTIFIER_POINTER (method_sig),
IDENTIFIER_LENGTH (method_sig))));
tem = DECL_NAME (method);
lookup_arg
= tree_cons (NULL_TREE, klass,
tree_cons (NULL_TREE, build_utf8_ref (tem), lookup_arg));
jni_func_type
= build_pointer_type (build_function_type (TREE_TYPE (TREE_TYPE (method)),
arg_types));
jnifunc = build (CALL_EXPR, ptr_type_node,
build_address_of (soft_lookupjnimethod_node),
lookup_arg, NULL_TREE);
/* Now we make the actual JNI call via the resulting function
pointer. */
call = build (CALL_EXPR, TREE_TYPE (TREE_TYPE (method)),
build1 (NOP_EXPR, jni_func_type, jnifunc),
args, NULL_TREE);
/* If the JNI call returned a result, capture it here. If we had to
unwrap JNI object results, we would do that here. */
if (res_var != NULL_TREE)
call = build (MODIFY_EXPR, TREE_TYPE (TREE_TYPE (method)),
res_var, call);
TREE_SIDE_EFFECTS (call) = 1;
CAN_COMPLETE_NORMALLY (call) = 1;
body = build (COMPOUND_EXPR, void_type_node, body, call);
TREE_SIDE_EFFECTS (body) = 1;
/* Now free the environment we allocated. */
call = build (CALL_EXPR, ptr_type_node,
build_address_of (soft_jnipopsystemframe_node),
build_tree_list (NULL_TREE, env_var),
NULL_TREE);
TREE_SIDE_EFFECTS (call) = 1;
CAN_COMPLETE_NORMALLY (call) = 1;
body = build (COMPOUND_EXPR, void_type_node, body, call);
TREE_SIDE_EFFECTS (body) = 1;
/* Finally, do the return. When compiling from source we rely on
patch_return to patch the return value -- because DECL_RESULT is
not set at the time this function is called. */
if (from_class)
{
res_type = void_type_node;
if (res_var != NULL_TREE)
{
tree drt;
if (! DECL_RESULT (method))
abort ();
/* Make sure we copy the result variable to the actual
result. We use the type of the DECL_RESULT because it
might be different from the return type of the function:
it might be promoted. */
drt = TREE_TYPE (DECL_RESULT (method));
if (drt != TREE_TYPE (res_var))
res_var = build1 (CONVERT_EXPR, drt, res_var);
res_var = build (MODIFY_EXPR, drt, DECL_RESULT (method), res_var);
TREE_SIDE_EFFECTS (res_var) = 1;
}
}
else
{
/* This is necessary to get patch_return to run. */
res_type = NULL_TREE;
}
body = build (COMPOUND_EXPR, void_type_node, body,
build1 (RETURN_EXPR, res_type, res_var));
TREE_SIDE_EFFECTS (body) = 1;
BLOCK_EXPR_BODY (block) = body;
return block;
}
/* Expand an operation to extract from or store into a field.
IS_STATIC is 1 iff the field is static.

View File

@ -63,7 +63,7 @@ DEFTREECODE (CATCH_EXPR, "catch", '1', 1)
DEFTREECODE (SYNCHRONIZED_EXPR, "synchronized", 'e', 2)
/* Throw statement.
Operand 0 is the throw expresion. */
Operand 0 is the throw expression. */
DEFTREECODE (THROW_EXPR, "throw", '1', 1)
/* Conditional operator.
@ -93,3 +93,8 @@ DEFTREECODE (CLASS_LITERAL, "class_literal", '1', 1)
is used for context detection, so that special rules can be
enforced. */
DEFTREECODE (INSTANCE_INITIALIZERS_EXPR, "instance_initializers_expr", '1', 1)
/*
Local variables:
mode:c
End:
*/

View File

@ -135,6 +135,11 @@ extern int flag_assume_compiled;
extern int flag_emit_class_files;
/* When non zero, assume all native functions are implemented with
JNI, not CNI. */
extern int flag_jni;
/* When non zero, we emit xref strings. Values of the flag for xref
backends are defined in xref.h. */
@ -296,6 +301,9 @@ extern tree soft_checkarraystore_node;
extern tree soft_monitorenter_node;
extern tree soft_monitorexit_node;
extern tree soft_lookupinterfacemethod_node;
extern tree soft_lookupjnimethod_node;
extern tree soft_getjnienvnewframe_node;
extern tree soft_jnipopsystemframe_node;
extern tree soft_fmod_node;
extern tree soft_exceptioninfo_call_node;
extern tree soft_idiv_node;
@ -514,6 +522,9 @@ struct lang_decl
tree inner_access; /* The identifier of the access method
used for invocation from inner classes */
int nap; /* Number of artificial parameters */
int native : 1; /* Nonzero if this is a native
method. */
};
/* init_test_table hash table entry structure. */
@ -649,6 +660,7 @@ extern tree build_known_method_ref PARAMS ((tree, tree, tree, tree, tree));
extern tree build_class_init PARAMS ((tree, tree));
extern tree build_invokevirtual PARAMS ((tree, tree));
extern tree build_invokeinterface PARAMS ((tree, tree));
extern tree build_jni_stub PARAMS ((tree));
extern tree invoke_build_dtable PARAMS ((int, tree));
extern tree build_field_ref PARAMS ((tree, tree, tree));
extern void pushdecl_force_head PARAMS ((tree));
@ -773,7 +785,7 @@ struct rtx_def * java_lang_expand_expr PARAMS ((tree, rtx, enum machine_mode,
#define METHOD_STATIC(DECL) DECL_LANG_FLAG_2 (DECL)
#define METHOD_FINAL(DECL) DECL_LANG_FLAG_3 (DECL)
#define METHOD_SYNCHRONIZED(DECL) DECL_LANG_FLAG_4 (DECL)
#define METHOD_NATIVE(DECL) DECL_EXTERNAL(DECL)
#define METHOD_NATIVE(DECL) (DECL_LANG_SPECIFIC(DECL)->native)
#define METHOD_ABSTRACT(DECL) DECL_LANG_FLAG_5 (DECL)
#define METHOD_TRANSIENT(DECL) DECL_LANG_FLAG_6 (DECL)

View File

@ -684,9 +684,22 @@ parse_class_file ()
{
JCF *jcf = current_jcf;
if (METHOD_NATIVE (method) || METHOD_ABSTRACT (method))
if (METHOD_ABSTRACT (method))
continue;
if (METHOD_NATIVE (method))
{
if (! flag_jni)
continue;
DECL_MAX_LOCALS (method)
= list_length (TYPE_ARG_TYPES (TREE_TYPE (method)));
start_java_method (method);
give_name_to_locals (jcf);
expand_expr_stmt (build_jni_stub (method));
end_java_method ();
continue;
}
if (DECL_CODE_OFFSET (method) == 0)
{
error ("missing Code attribute");

View File

@ -35,6 +35,7 @@ DEFINE_LANG_NAME ("Java")
{ "-femit-class-files", "Dump class files to <name>.class" },
{ "-fuse-boehm-gc", "Generate code for Boehm GC" },
{ "-fhash-synchronization", "Don't put synchronization structure in each object" },
{ "-fjni", "Assume native functions are implemented using JNI" },
#if ! USE_CPPLIB
{ "-MD", "Print dependencies to FILE.d" },
{ "-MMD", "Print dependencies to FILE.d" },

View File

@ -1,5 +1,5 @@
/* Definitions for specs for the GNU compiler for the Java(TM) language.
Copyright (C) 1996, 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1996, 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -36,6 +36,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
%{f*} %{+e*} %{aux-info*} %{Qn:-fno-ident}\
%{I*}\
%{MD} %{MMD} %{M} %{MM}\
%{fjni:%{femit-class-file:%e-fjni and -femit-class-file are incompatible}}\
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
%{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
%{!S:as %a %Y\

View File

@ -117,6 +117,10 @@ int flag_use_boehm_gc = 0;
object to its synchronization structure. */
int flag_hash_synchronization;
/* When non zero, assume all native functions are implemented with
JNI, not CNI. */
int flag_jni = 0;
/* From gcc/flags.h, and indicates if exceptions are turned on or not. */
extern int flag_new_exceptions;
@ -135,7 +139,8 @@ lang_f_options[] =
{"emit-class-files", &flag_emit_class_files, 1},
{"use-divide-subroutine", &flag_use_divide_subroutine, 1},
{"use-boehm-gc", &flag_use_boehm_gc, 1},
{"hash-synchronization", &flag_hash_synchronization, 1}
{"hash-synchronization", &flag_hash_synchronization, 1},
{"jni", &flag_jni, 1}
};
JCF *current_jcf;

View File

@ -1,6 +1,7 @@
/* A Bison parser, made from ./parse.y
by GNU Bison version 1.28 */
by GNU Bison version 1.25
*/
#define YYBISON 1 /* Identify Bison output. */
@ -11,113 +12,113 @@
#define yychar java_char
#define yydebug java_debug
#define yynerrs java_nerrs
#define PLUS_TK 257
#define MINUS_TK 258
#define MULT_TK 259
#define DIV_TK 260
#define REM_TK 261
#define LS_TK 262
#define SRS_TK 263
#define ZRS_TK 264
#define AND_TK 265
#define XOR_TK 266
#define OR_TK 267
#define BOOL_AND_TK 268
#define BOOL_OR_TK 269
#define EQ_TK 270
#define NEQ_TK 271
#define GT_TK 272
#define GTE_TK 273
#define LT_TK 274
#define LTE_TK 275
#define PLUS_ASSIGN_TK 276
#define MINUS_ASSIGN_TK 277
#define MULT_ASSIGN_TK 278
#define DIV_ASSIGN_TK 279
#define REM_ASSIGN_TK 280
#define LS_ASSIGN_TK 281
#define SRS_ASSIGN_TK 282
#define ZRS_ASSIGN_TK 283
#define AND_ASSIGN_TK 284
#define XOR_ASSIGN_TK 285
#define OR_ASSIGN_TK 286
#define PUBLIC_TK 287
#define PRIVATE_TK 288
#define PROTECTED_TK 289
#define STATIC_TK 290
#define FINAL_TK 291
#define SYNCHRONIZED_TK 292
#define VOLATILE_TK 293
#define TRANSIENT_TK 294
#define NATIVE_TK 295
#define PAD_TK 296
#define ABSTRACT_TK 297
#define MODIFIER_TK 298
#define DECR_TK 299
#define INCR_TK 300
#define DEFAULT_TK 301
#define IF_TK 302
#define THROW_TK 303
#define BOOLEAN_TK 304
#define DO_TK 305
#define IMPLEMENTS_TK 306
#define THROWS_TK 307
#define BREAK_TK 308
#define IMPORT_TK 309
#define ELSE_TK 310
#define INSTANCEOF_TK 311
#define RETURN_TK 312
#define VOID_TK 313
#define CATCH_TK 314
#define INTERFACE_TK 315
#define CASE_TK 316
#define EXTENDS_TK 317
#define FINALLY_TK 318
#define SUPER_TK 319
#define WHILE_TK 320
#define CLASS_TK 321
#define SWITCH_TK 322
#define CONST_TK 323
#define TRY_TK 324
#define FOR_TK 325
#define NEW_TK 326
#define CONTINUE_TK 327
#define GOTO_TK 328
#define PACKAGE_TK 329
#define THIS_TK 330
#define BYTE_TK 331
#define SHORT_TK 332
#define INT_TK 333
#define LONG_TK 334
#define CHAR_TK 335
#define INTEGRAL_TK 336
#define FLOAT_TK 337
#define DOUBLE_TK 338
#define FP_TK 339
#define ID_TK 340
#define REL_QM_TK 341
#define REL_CL_TK 342
#define NOT_TK 343
#define NEG_TK 344
#define ASSIGN_ANY_TK 345
#define ASSIGN_TK 346
#define OP_TK 347
#define CP_TK 348
#define OCB_TK 349
#define CCB_TK 350
#define OSB_TK 351
#define CSB_TK 352
#define SC_TK 353
#define C_TK 354
#define DOT_TK 355
#define STRING_LIT_TK 356
#define CHAR_LIT_TK 357
#define INT_LIT_TK 358
#define FP_LIT_TK 359
#define TRUE_TK 360
#define FALSE_TK 361
#define BOOL_LIT_TK 362
#define NULL_TK 363
#define PLUS_TK 258
#define MINUS_TK 259
#define MULT_TK 260
#define DIV_TK 261
#define REM_TK 262
#define LS_TK 263
#define SRS_TK 264
#define ZRS_TK 265
#define AND_TK 266
#define XOR_TK 267
#define OR_TK 268
#define BOOL_AND_TK 269
#define BOOL_OR_TK 270
#define EQ_TK 271
#define NEQ_TK 272
#define GT_TK 273
#define GTE_TK 274
#define LT_TK 275
#define LTE_TK 276
#define PLUS_ASSIGN_TK 277
#define MINUS_ASSIGN_TK 278
#define MULT_ASSIGN_TK 279
#define DIV_ASSIGN_TK 280
#define REM_ASSIGN_TK 281
#define LS_ASSIGN_TK 282
#define SRS_ASSIGN_TK 283
#define ZRS_ASSIGN_TK 284
#define AND_ASSIGN_TK 285
#define XOR_ASSIGN_TK 286
#define OR_ASSIGN_TK 287
#define PUBLIC_TK 288
#define PRIVATE_TK 289
#define PROTECTED_TK 290
#define STATIC_TK 291
#define FINAL_TK 292
#define SYNCHRONIZED_TK 293
#define VOLATILE_TK 294
#define TRANSIENT_TK 295
#define NATIVE_TK 296
#define PAD_TK 297
#define ABSTRACT_TK 298
#define MODIFIER_TK 299
#define DECR_TK 300
#define INCR_TK 301
#define DEFAULT_TK 302
#define IF_TK 303
#define THROW_TK 304
#define BOOLEAN_TK 305
#define DO_TK 306
#define IMPLEMENTS_TK 307
#define THROWS_TK 308
#define BREAK_TK 309
#define IMPORT_TK 310
#define ELSE_TK 311
#define INSTANCEOF_TK 312
#define RETURN_TK 313
#define VOID_TK 314
#define CATCH_TK 315
#define INTERFACE_TK 316
#define CASE_TK 317
#define EXTENDS_TK 318
#define FINALLY_TK 319
#define SUPER_TK 320
#define WHILE_TK 321
#define CLASS_TK 322
#define SWITCH_TK 323
#define CONST_TK 324
#define TRY_TK 325
#define FOR_TK 326
#define NEW_TK 327
#define CONTINUE_TK 328
#define GOTO_TK 329
#define PACKAGE_TK 330
#define THIS_TK 331
#define BYTE_TK 332
#define SHORT_TK 333
#define INT_TK 334
#define LONG_TK 335
#define CHAR_TK 336
#define INTEGRAL_TK 337
#define FLOAT_TK 338
#define DOUBLE_TK 339
#define FP_TK 340
#define ID_TK 341
#define REL_QM_TK 342
#define REL_CL_TK 343
#define NOT_TK 344
#define NEG_TK 345
#define ASSIGN_ANY_TK 346
#define ASSIGN_TK 347
#define OP_TK 348
#define CP_TK 349
#define OCB_TK 350
#define CCB_TK 351
#define OSB_TK 352
#define CSB_TK 353
#define SC_TK 354
#define C_TK 355
#define DOT_TK 356
#define STRING_LIT_TK 357
#define CHAR_LIT_TK 358
#define INT_LIT_TK 359
#define FP_LIT_TK 360
#define TRUE_TK 361
#define FALSE_TK 362
#define BOOL_LIT_TK 363
#define NULL_TK 364
#line 48 "./parse.y"
@ -516,7 +517,7 @@ typedef union {
#define YYFLAG -32768
#define YYNTBASE 110
#define YYTRANSLATE(x) ((unsigned)(x) <= 363 ? yytranslate[x] : 272)
#define YYTRANSLATE(x) ((unsigned)(x) <= 364 ? yytranslate[x] : 272)
static const char yytranslate[] = { 0,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@ -544,18 +545,18 @@ static const char yytranslate[] = { 0,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 1, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
107, 108, 109
2, 2, 2, 2, 2, 1, 2, 3, 4, 5,
6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
106, 107, 108, 109
};
#if YYDEBUG != 0
@ -2386,8 +2387,7 @@ static const short yycheck[] = { 3,
#define YYPURE 1
/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
#line 3 "/usr/lib/bison.simple"
/* This file comes from bison-1.28. */
#line 3 "/usr/share/misc/bison.simple"
/* Skeleton output parser for bison,
Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
@ -2404,67 +2404,47 @@ static const short yycheck[] = { 3,
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* As a special exception, when this file is copied by Bison into a
Bison output file, you may use that output file without restriction.
This special exception was added by the Free Software Foundation
in version 1.24 of Bison. */
#ifndef alloca
#ifdef __GNUC__
#define alloca __builtin_alloca
#else /* not GNU C. */
#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
#include <alloca.h>
#else /* not sparc */
#if defined (MSDOS) && !defined (__TURBOC__)
#include <malloc.h>
#else /* not MSDOS, or __TURBOC__ */
#if defined(_AIX)
#include <malloc.h>
#pragma alloca
#else /* not MSDOS, __TURBOC__, or _AIX */
#ifdef __hpux
#ifdef __cplusplus
extern "C" {
void *alloca (unsigned int);
};
#else /* not __cplusplus */
void *alloca ();
#endif /* not __cplusplus */
#endif /* __hpux */
#endif /* not _AIX */
#endif /* not MSDOS, or __TURBOC__ */
#endif /* not sparc. */
#endif /* not GNU C. */
#endif /* alloca not defined. */
/* This is the parser code that is written into each bison parser
when the %semantic_parser declaration is not specified in the grammar.
It was written by Richard Stallman by simplifying the hairy parser
used when %semantic_parser is specified. */
#ifndef YYSTACK_USE_ALLOCA
#ifdef alloca
#define YYSTACK_USE_ALLOCA
#else /* alloca not defined */
#ifdef __GNUC__
#define YYSTACK_USE_ALLOCA
#define alloca __builtin_alloca
#else /* not GNU C. */
#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
#define YYSTACK_USE_ALLOCA
#include <alloca.h>
#else /* not sparc */
/* We think this test detects Watcom and Microsoft C. */
/* This used to test MSDOS, but that is a bad idea
since that symbol is in the user namespace. */
#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
#if 0 /* No need for malloc.h, which pollutes the namespace;
instead, just don't use alloca. */
#include <malloc.h>
#endif
#else /* not MSDOS, or __TURBOC__ */
#if defined(_AIX)
/* I don't know what this was needed for, but it pollutes the namespace.
So I turned it off. rms, 2 May 1997. */
/* #include <malloc.h> */
#pragma alloca
#define YYSTACK_USE_ALLOCA
#else /* not MSDOS, or __TURBOC__, or _AIX */
#if 0
#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
and on HPUX 10. Eventually we can turn this on. */
#define YYSTACK_USE_ALLOCA
#define alloca __builtin_alloca
#endif /* __hpux */
#endif
#endif /* not _AIX */
#endif /* not MSDOS, or __TURBOC__ */
#endif /* not sparc */
#endif /* not GNU C */
#endif /* alloca not defined */
#endif /* YYSTACK_USE_ALLOCA not defined */
#ifdef YYSTACK_USE_ALLOCA
#define YYSTACK_ALLOC alloca
#else
#define YYSTACK_ALLOC malloc
#endif
/* Note: there must be only one dollar sign in this file.
It is replaced by the list of actions, each action
as one case of the switch. */
@ -2473,8 +2453,8 @@ static const short yycheck[] = { 3,
#define yyclearin (yychar = YYEMPTY)
#define YYEMPTY -2
#define YYEOF 0
#define YYACCEPT goto yyacceptlab
#define YYABORT goto yyabortlab
#define YYACCEPT return(0)
#define YYABORT return(1)
#define YYERROR goto yyerrlab1
/* Like YYERROR except do call yyerror.
This remains here temporarily to ease the
@ -2555,12 +2535,14 @@ int yydebug; /* nonzero means print parse trace */
#ifndef YYMAXDEPTH
#define YYMAXDEPTH 10000
#endif
/* Define __yy_memcpy. Note that the size argument
should be passed with type unsigned int, because that is what the non-GCC
definitions require. With GCC, __builtin_memcpy takes an arg
of type size_t, but it can handle unsigned int. */
/* Prevent warning if -Wstrict-prototypes. */
#ifdef __GNUC__
#ifndef YYPARSE_PARAM
int yyparse (void);
#endif
#endif
#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
#else /* not GNU C or C++ */
@ -2572,7 +2554,7 @@ static void
__yy_memcpy (to, from, count)
char *to;
char *from;
unsigned int count;
int count;
{
register char *f = from;
register char *t = to;
@ -2587,10 +2569,10 @@ __yy_memcpy (to, from, count)
/* This is the most reliable way to avoid incompatibilities
in available built-in functions on various systems. */
static void
__yy_memcpy (char *to, char *from, unsigned int count)
__yy_memcpy (char *to, char *from, int count)
{
register char *t = to;
register char *f = from;
register char *t = to;
register int i = count;
while (i-- > 0)
@ -2600,7 +2582,7 @@ __yy_memcpy (char *to, char *from, unsigned int count)
#endif
#endif
#line 217 "/usr/lib/bison.simple"
#line 196 "/usr/share/misc/bison.simple"
/* The user can define YYPARSE_PARAM as the name of an argument to be passed
into yyparse. The argument should have type void *.
@ -2621,15 +2603,6 @@ __yy_memcpy (char *to, char *from, unsigned int count)
#define YYPARSE_PARAM_DECL
#endif /* not YYPARSE_PARAM */
/* Prevent warning if -Wstrict-prototypes. */
#ifdef __GNUC__
#ifdef YYPARSE_PARAM
int yyparse (void *);
#else
int yyparse (void);
#endif
#endif
int
yyparse(YYPARSE_PARAM_ARG)
YYPARSE_PARAM_DECL
@ -2658,7 +2631,6 @@ yyparse(YYPARSE_PARAM_ARG)
#endif
int yystacksize = YYINITDEPTH;
int yyfree_stacks = 0;
#ifdef YYPURE
int yychar;
@ -2743,32 +2715,18 @@ yynewstate:
if (yystacksize >= YYMAXDEPTH)
{
yyerror("parser stack overflow");
if (yyfree_stacks)
{
free (yyss);
free (yyvs);
#ifdef YYLSP_NEEDED
free (yyls);
#endif
}
return 2;
}
yystacksize *= 2;
if (yystacksize > YYMAXDEPTH)
yystacksize = YYMAXDEPTH;
#ifndef YYSTACK_USE_ALLOCA
yyfree_stacks = 1;
#endif
yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
__yy_memcpy ((char *)yyss, (char *)yyss1,
size * (unsigned int) sizeof (*yyssp));
yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
__yy_memcpy ((char *)yyvs, (char *)yyvs1,
size * (unsigned int) sizeof (*yyvsp));
yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
__yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
__yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
#ifdef YYLSP_NEEDED
yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
__yy_memcpy ((char *)yyls, (char *)yyls1,
size * (unsigned int) sizeof (*yylsp));
yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
__yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
#endif
#endif /* no yyoverflow */
@ -5020,7 +4978,7 @@ case 503:
break;}
}
/* the action file gets copied in in place of this dollarsign */
#line 543 "/usr/lib/bison.simple"
#line 498 "/usr/share/misc/bison.simple"
yyvsp -= yylen;
yyssp -= yylen;
@ -5215,30 +5173,6 @@ yyerrhandle:
yystate = yyn;
goto yynewstate;
yyacceptlab:
/* YYACCEPT comes here. */
if (yyfree_stacks)
{
free (yyss);
free (yyvs);
#ifdef YYLSP_NEEDED
free (yyls);
#endif
}
return 0;
yyabortlab:
/* YYABORT comes here. */
if (yyfree_stacks)
{
free (yyss);
free (yyvs);
#ifdef YYLSP_NEEDED
free (yyls);
#endif
}
return 1;
}
#line 2546 "./parse.y"
@ -9995,10 +9929,19 @@ java_complete_expand_methods (class_decl)
/* First, do the ordinary methods. */
for (decl = first_decl; decl; decl = TREE_CHAIN (decl))
{
/* Skip abstract or native methods */
if (METHOD_ABSTRACT (decl) || METHOD_NATIVE (decl)
/* Skip abstract or native methods -- but do handle native
methods when generating JNI stubs. */
if (METHOD_ABSTRACT (decl)
|| (! flag_jni && METHOD_NATIVE (decl))
|| DECL_CONSTRUCTOR_P (decl) || DECL_CLINIT_P (decl))
continue;
if (METHOD_NATIVE (decl))
{
tree body = build_jni_stub (decl);
BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)) = body;
}
java_complete_expand_method (decl);
}
@ -10128,7 +10071,7 @@ java_complete_expand_method (mdecl)
{
block_body = java_complete_tree (block_body);
if (!flag_emit_xref)
if (! flag_emit_xref && ! METHOD_NATIVE (mdecl))
check_for_initialization (block_body);
ctxp->explicit_constructor_p = 0;
}

View File

@ -7297,10 +7297,19 @@ java_complete_expand_methods (class_decl)
/* First, do the ordinary methods. */
for (decl = first_decl; decl; decl = TREE_CHAIN (decl))
{
/* Skip abstract or native methods */
if (METHOD_ABSTRACT (decl) || METHOD_NATIVE (decl)
/* Skip abstract or native methods -- but do handle native
methods when generating JNI stubs. */
if (METHOD_ABSTRACT (decl)
|| (! flag_jni && METHOD_NATIVE (decl))
|| DECL_CONSTRUCTOR_P (decl) || DECL_CLINIT_P (decl))
continue;
if (METHOD_NATIVE (decl))
{
tree body = build_jni_stub (decl);
BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)) = body;
}
java_complete_expand_method (decl);
}
@ -7430,7 +7439,7 @@ java_complete_expand_method (mdecl)
{
block_body = java_complete_tree (block_body);
if (!flag_emit_xref)
if (! flag_emit_xref && ! METHOD_NATIVE (mdecl))
check_for_initialization (block_body);
ctxp->explicit_constructor_p = 0;
}