Commit 3ff9925c by Anthony Green Committed by Anthony Green

expr.c (build_class_init): Mark the decl to be ignored by check_init.

2000-02-25  Anthony Green  <green@cygnus.com>

	* expr.c (build_class_init): Mark the decl to be ignored by
	check_init.
	* java-tree.h (DECL_BIT_INDEX): Move definition from check-init.c
	* check-init.c: Move DECL_BIT_INDEX to java-tree.h
	* class.c (init_test_hash_newfunc): New function.
	(decl_hash): New function.
	(decl_compare): New function.
	* decl.c (emit_init_test_initialization): New function.
	(complete_start_java_method): Traverse the init test hashtable,
	calling emit_init_test_initialization.
	(always_initialize_class_p): Define.
	* expr.c (build_class_init): Use initialization tests when
	emitting class initialization code.
	(always_initialize_class_p): Declare.
	* jcf-parse.c (parse_class_file): Set always_initialize_class_p to
	1.
	* java-tree.h: Include hash.h.
	(DECL_FUNCTION_INIT_TEST_TABLE): Define.
	(struct lang_decl): Add init_test_table field.
	(init_test_hash_entry): Define.

From-SVN: r32166
parent 985dae7c
2000-02-25 Anthony Green <green@cygnus.com>
* expr.c (build_class_init): Mark the decl to be ignored by
check_init.
* java-tree.h (DECL_BIT_INDEX): Move definition from check-init.c
* check-init.c: Move DECL_BIT_INDEX to java-tree.h
* class.c (init_test_hash_newfunc): New function.
(decl_hash): New function.
(decl_compare): New function.
* decl.c (emit_init_test_initialization): New function.
(complete_start_java_method): Traverse the init test hashtable,
calling emit_init_test_initialization.
(always_initialize_class_p): Define.
* expr.c (build_class_init): Use initialization tests when
emitting class initialization code.
(always_initialize_class_p): Declare.
* jcf-parse.c (parse_class_file): Set always_initialize_class_p to
1.
* java-tree.h: Include hash.h.
(DECL_FUNCTION_INIT_TEST_TABLE): Define.
(struct lang_decl): Add init_test_table field.
(init_test_hash_entry): Define.
Fri Feb 25 18:41:31 2000 Alexandre Petit-Bianco <apbianco@cygnus.com> Fri Feb 25 18:41:31 2000 Alexandre Petit-Bianco <apbianco@cygnus.com>
* gjavah.c (main): Avoid using `argi' to report unimplemented * gjavah.c (main): Avoid using `argi' to report unimplemented
......
...@@ -39,11 +39,6 @@ typedef unsigned int word; ...@@ -39,11 +39,6 @@ typedef unsigned int word;
/* Pointer to a bitstring. */ /* Pointer to a bitstring. */
typedef word *words; typedef word *words;
/* For a local VAR_DECL, holds the index into a words bitstring that
specifies if this decl is definitively assigned.
A DECL_BIT_INDEX of -1 means we no longer care. */
#define DECL_BIT_INDEX(DECL) DECL_FIELD_SIZE(DECL)
/* Number of locals variables currently active. */ /* Number of locals variables currently active. */
int num_current_locals = 0; int num_current_locals = 0;
......
...@@ -548,6 +548,40 @@ build_java_method_type (fntype, this_class, access_flags) ...@@ -548,6 +548,40 @@ build_java_method_type (fntype, this_class, access_flags)
return build_method_type (CLASS_TO_HANDLE_TYPE (this_class), fntype); return build_method_type (CLASS_TO_HANDLE_TYPE (this_class), fntype);
} }
static struct hash_entry *
init_test_hash_newfunc (entry, table, string)
struct hash_entry *entry;
struct hash_table *table;
hash_table_key string ATTRIBUTE_UNUSED;
{
struct init_test_hash_entry *ret = (struct init_test_hash_entry *) entry;
if (ret == NULL)
{
ret = ((struct init_test_hash_entry *)
hash_allocate (table, sizeof (struct init_test_hash_entry)));
if (ret == NULL)
return NULL;
}
ret->init_test_decl = 0;
return (struct hash_entry *) ret;
}
static unsigned long
decl_hash (k)
hash_table_key k;
{
return (long) k;
}
static boolean
decl_compare (k1, k2)
hash_table_key k1;
hash_table_key k2;
{
return ((char*) k1 == (char*) k2);
}
tree tree
add_method_1 (handle_class, access_flags, name, function_type) add_method_1 (handle_class, access_flags, name, function_type)
tree handle_class; tree handle_class;
...@@ -568,6 +602,11 @@ add_method_1 (handle_class, access_flags, name, function_type) ...@@ -568,6 +602,11 @@ add_method_1 (handle_class, access_flags, name, function_type)
= (struct lang_decl *) permalloc (sizeof (struct lang_decl)); = (struct lang_decl *) permalloc (sizeof (struct lang_decl));
bzero ((PTR) DECL_LANG_SPECIFIC (fndecl), sizeof (struct lang_decl)); bzero ((PTR) DECL_LANG_SPECIFIC (fndecl), sizeof (struct lang_decl));
/* Initialize the static initializer test table. */
hash_table_init (&DECL_FUNCTION_INIT_TEST_TABLE (fndecl),
init_test_hash_newfunc, decl_hash,
decl_compare);
TREE_CHAIN (fndecl) = TYPE_METHODS (handle_class); TREE_CHAIN (fndecl) = TYPE_METHODS (handle_class);
TYPE_METHODS (handle_class) = fndecl; TYPE_METHODS (handle_class) = fndecl;
pop_obstacks (); pop_obstacks ();
......
...@@ -48,6 +48,10 @@ static tree lookup_name_current_level PARAMS ((tree)); ...@@ -48,6 +48,10 @@ static tree lookup_name_current_level PARAMS ((tree));
static tree push_promoted_type PARAMS ((const char *, tree)); static tree push_promoted_type PARAMS ((const char *, tree));
static struct binding_level *make_binding_level PARAMS ((void)); static struct binding_level *make_binding_level PARAMS ((void));
/* Set to non-zero value in order to emit class initilization code
before static field references. */
extern int always_initialize_class_p;
#ifndef INT_TYPE_SIZE #ifndef INT_TYPE_SIZE
#define INT_TYPE_SIZE BITS_PER_WORD #define INT_TYPE_SIZE BITS_PER_WORD
#endif #endif
...@@ -1623,6 +1627,24 @@ build_result_decl (fndecl) ...@@ -1623,6 +1627,24 @@ build_result_decl (fndecl)
return (DECL_RESULT (fndecl) = build_decl (RESULT_DECL, NULL_TREE, restype)); return (DECL_RESULT (fndecl) = build_decl (RESULT_DECL, NULL_TREE, restype));
} }
/* Called for every element in DECL_FUNCTION_INIT_TEST_TABLE in order
to emit initialization code for each test flag. */
static boolean
emit_init_test_initialization (entry, key)
struct hash_entry *entry;
hash_table_key key;
{
struct init_test_hash_entry *ite = (struct init_test_hash_entry *) entry;
expand_decl (ite->init_test_decl);
expand_expr_stmt (build (MODIFY_EXPR, boolean_type_node,
ite->init_test_decl, boolean_false_node));
return true;
}
void void
complete_start_java_method (fndecl) complete_start_java_method (fndecl)
tree fndecl; tree fndecl;
...@@ -1634,6 +1656,11 @@ complete_start_java_method (fndecl) ...@@ -1634,6 +1656,11 @@ complete_start_java_method (fndecl)
/* Set up parameters and prepare for return, for the function. */ /* Set up parameters and prepare for return, for the function. */
expand_function_start (fndecl, 0); expand_function_start (fndecl, 0);
/* Emit initialization code for test flags. */
if (! always_initialize_class_p)
hash_traverse (&DECL_FUNCTION_INIT_TEST_TABLE (fndecl),
emit_init_test_initialization, 0);
} }
/* Allocate further tree nodes temporarily during compilation /* Allocate further tree nodes temporarily during compilation
......
...@@ -83,6 +83,10 @@ static tree case_identity PARAMS ((tree, tree)); ...@@ -83,6 +83,10 @@ static tree case_identity PARAMS ((tree, tree));
static tree operand_type[59]; static tree operand_type[59];
extern struct obstack permanent_obstack; extern struct obstack permanent_obstack;
/* Set to non-zero value in order to emit class initilization code
before static field references. */
int always_initialize_class_p;
void void
init_expr_processing() init_expr_processing()
{ {
...@@ -1490,14 +1494,48 @@ tree ...@@ -1490,14 +1494,48 @@ tree
build_class_init (clas, expr) build_class_init (clas, expr)
tree clas, expr; tree clas, expr;
{ {
tree init; tree init, call;
struct init_test_hash_entry *ite;
if (inherits_from_p (current_class, clas)) if (inherits_from_p (current_class, clas))
return expr; return expr;
if (always_initialize_class_p)
{
init = build (CALL_EXPR, void_type_node, init = build (CALL_EXPR, void_type_node,
build_address_of (soft_initclass_node), build_address_of (soft_initclass_node),
build_tree_list (NULL_TREE, build_class_ref (clas)), build_tree_list (NULL_TREE, build_class_ref (clas)),
NULL_TREE); NULL_TREE);
TREE_SIDE_EFFECTS (init) = 1; TREE_SIDE_EFFECTS (init) = 1;
}
else
{
ite = (struct init_test_hash_entry *)
hash_lookup (&DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl),
(const hash_table_key) clas,
TRUE, NULL);
if (ite->init_test_decl == 0)
ite->init_test_decl = build_decl (VAR_DECL, NULL_TREE,
boolean_type_node);
/* Tell the check-init code to ignore this decl. */
DECL_BIT_INDEX(ite->init_test_decl) = -1;
init = build (CALL_EXPR, void_type_node,
build_address_of (soft_initclass_node),
build_tree_list (NULL_TREE, build_class_ref (clas)),
NULL_TREE);
TREE_SIDE_EFFECTS (init) = 1;
call = build (COMPOUND_EXPR, TREE_TYPE (expr), init,
build (MODIFY_EXPR, boolean_type_node,
ite->init_test_decl, boolean_true_node));
TREE_SIDE_EFFECTS (call) = 1;
init = build (COND_EXPR, void_type_node,
build (EQ_EXPR, boolean_type_node,
ite->init_test_decl, boolean_false_node),
call, integer_zero_node);
TREE_SIDE_EFFECTS (init) = 1;
}
if (expr != NULL_TREE) if (expr != NULL_TREE)
{ {
expr = build (COMPOUND_EXPR, TREE_TYPE (expr), init, expr); expr = build (COMPOUND_EXPR, TREE_TYPE (expr), init, expr);
......
...@@ -25,6 +25,8 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ ...@@ -25,6 +25,8 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
/* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */ /* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */
#include "hash.h"
/* Java language-specific tree codes. */ /* Java language-specific tree codes. */
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) SYM, #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) SYM,
enum java_tree_code { enum java_tree_code {
...@@ -368,6 +370,12 @@ struct lang_identifier ...@@ -368,6 +370,12 @@ struct lang_identifier
/* How specific the function is (for method selection - Java source /* How specific the function is (for method selection - Java source
code front-end */ code front-end */
#define DECL_SPECIFIC_COUNT(DECL) DECL_ARG_SLOT_COUNT(DECL) #define DECL_SPECIFIC_COUNT(DECL) DECL_ARG_SLOT_COUNT(DECL)
/* For each function decl, init_test_table contains a hash table whose
entries are keyed on class names, and whose values are local
boolean decls. The variables are intended to be TRUE when the
class has been initialized in this function, and FALSE otherwise. */
#define DECL_FUNCTION_INIT_TEST_TABLE(DECL) \
(DECL_LANG_SPECIFIC(DECL)->init_test_table)
/* In a LABEL_DECL, a TREE_VEC that saves the type_map at that point. */ /* In a LABEL_DECL, a TREE_VEC that saves the type_map at that point. */
#define LABEL_TYPE_STATE(NODE) (DECL_INITIAL (NODE)) #define LABEL_TYPE_STATE(NODE) (DECL_INITIAL (NODE))
...@@ -429,6 +437,11 @@ struct lang_identifier ...@@ -429,6 +437,11 @@ struct lang_identifier
#define DECL_LOCAL_SLOT_CHAIN(NODE) \ #define DECL_LOCAL_SLOT_CHAIN(NODE) \
(((struct lang_decl_var*)DECL_LANG_SPECIFIC(NODE))->slot_chain) (((struct lang_decl_var*)DECL_LANG_SPECIFIC(NODE))->slot_chain)
/* For a local VAR_DECL, holds the index into a words bitstring that
specifies if this decl is definitively assigned.
A DECL_BIT_INDEX of -1 means we no longer care. */
#define DECL_BIT_INDEX(DECL) DECL_FIELD_SIZE(DECL)
/* DECL_LANG_SPECIFIC for FUNCTION_DECLs. */ /* DECL_LANG_SPECIFIC for FUNCTION_DECLs. */
struct lang_decl struct lang_decl
{ {
...@@ -443,8 +456,18 @@ struct lang_decl ...@@ -443,8 +456,18 @@ struct lang_decl
tree function_decl_body; /* Hold all function's statements */ tree function_decl_body; /* Hold all function's statements */
tree called_constructor; /* When decl is a constructor, the tree called_constructor; /* When decl is a constructor, the
list of other constructor it calls. */ list of other constructor it calls. */
struct hash_table init_test_table;
/* Class initialization test variables. */
};
/* init_test_table hash table entry structure. */
struct init_test_hash_entry
{
struct hash_entry root;
tree init_test_decl;
}; };
/* DECL_LANG_SPECIFIC for VAR_DECL and PARM_DECL. */ /* DECL_LANG_SPECIFIC for VAR_DECL and PARM_DECL. */
struct lang_decl_var struct lang_decl_var
{ {
......
...@@ -57,6 +57,10 @@ extern struct obstack *saveable_obstack; ...@@ -57,6 +57,10 @@ extern struct obstack *saveable_obstack;
extern struct obstack temporary_obstack; extern struct obstack temporary_obstack;
extern struct obstack permanent_obstack; extern struct obstack permanent_obstack;
/* Set to non-zero value in order to emit class initilization code
before static field references. */
extern int always_initialize_class_p;
/* The class we are currently processing. */ /* The class we are currently processing. */
tree current_class = NULL_TREE; tree current_class = NULL_TREE;
...@@ -646,6 +650,10 @@ parse_class_file () ...@@ -646,6 +650,10 @@ parse_class_file ()
debug_start_source_file (input_filename); debug_start_source_file (input_filename);
init_outgoing_cpool (); init_outgoing_cpool ();
/* Currently we always have to emit calls to _Jv_InitClass when
compiling from class files. */
always_initialize_class_p = 1;
for ( method = TYPE_METHODS (CLASS_TO_HANDLE_TYPE (current_class)); for ( method = TYPE_METHODS (CLASS_TO_HANDLE_TYPE (current_class));
method != NULL_TREE; method = TREE_CHAIN (method)) method != NULL_TREE; method = TREE_CHAIN (method))
{ {
......
/* A Bison parser, made from ./parse.y /* 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. */ #define YYBISON 1 /* Identify Bison output. */
...@@ -11,113 +12,113 @@ ...@@ -11,113 +12,113 @@
#define yychar java_char #define yychar java_char
#define yydebug java_debug #define yydebug java_debug
#define yynerrs java_nerrs #define yynerrs java_nerrs
#define PLUS_TK 257 #define PLUS_TK 258
#define MINUS_TK 258 #define MINUS_TK 259
#define MULT_TK 259 #define MULT_TK 260
#define DIV_TK 260 #define DIV_TK 261
#define REM_TK 261 #define REM_TK 262
#define LS_TK 262 #define LS_TK 263
#define SRS_TK 263 #define SRS_TK 264
#define ZRS_TK 264 #define ZRS_TK 265
#define AND_TK 265 #define AND_TK 266
#define XOR_TK 266 #define XOR_TK 267
#define OR_TK 267 #define OR_TK 268
#define BOOL_AND_TK 268 #define BOOL_AND_TK 269
#define BOOL_OR_TK 269 #define BOOL_OR_TK 270
#define EQ_TK 270 #define EQ_TK 271
#define NEQ_TK 271 #define NEQ_TK 272
#define GT_TK 272 #define GT_TK 273
#define GTE_TK 273 #define GTE_TK 274
#define LT_TK 274 #define LT_TK 275
#define LTE_TK 275 #define LTE_TK 276
#define PLUS_ASSIGN_TK 276 #define PLUS_ASSIGN_TK 277
#define MINUS_ASSIGN_TK 277 #define MINUS_ASSIGN_TK 278
#define MULT_ASSIGN_TK 278 #define MULT_ASSIGN_TK 279
#define DIV_ASSIGN_TK 279 #define DIV_ASSIGN_TK 280
#define REM_ASSIGN_TK 280 #define REM_ASSIGN_TK 281
#define LS_ASSIGN_TK 281 #define LS_ASSIGN_TK 282
#define SRS_ASSIGN_TK 282 #define SRS_ASSIGN_TK 283
#define ZRS_ASSIGN_TK 283 #define ZRS_ASSIGN_TK 284
#define AND_ASSIGN_TK 284 #define AND_ASSIGN_TK 285
#define XOR_ASSIGN_TK 285 #define XOR_ASSIGN_TK 286
#define OR_ASSIGN_TK 286 #define OR_ASSIGN_TK 287
#define PUBLIC_TK 287 #define PUBLIC_TK 288
#define PRIVATE_TK 288 #define PRIVATE_TK 289
#define PROTECTED_TK 289 #define PROTECTED_TK 290
#define STATIC_TK 290 #define STATIC_TK 291
#define FINAL_TK 291 #define FINAL_TK 292
#define SYNCHRONIZED_TK 292 #define SYNCHRONIZED_TK 293
#define VOLATILE_TK 293 #define VOLATILE_TK 294
#define TRANSIENT_TK 294 #define TRANSIENT_TK 295
#define NATIVE_TK 295 #define NATIVE_TK 296
#define PAD_TK 296 #define PAD_TK 297
#define ABSTRACT_TK 297 #define ABSTRACT_TK 298
#define MODIFIER_TK 298 #define MODIFIER_TK 299
#define DECR_TK 299 #define DECR_TK 300
#define INCR_TK 300 #define INCR_TK 301
#define DEFAULT_TK 301 #define DEFAULT_TK 302
#define IF_TK 302 #define IF_TK 303
#define THROW_TK 303 #define THROW_TK 304
#define BOOLEAN_TK 304 #define BOOLEAN_TK 305
#define DO_TK 305 #define DO_TK 306
#define IMPLEMENTS_TK 306 #define IMPLEMENTS_TK 307
#define THROWS_TK 307 #define THROWS_TK 308
#define BREAK_TK 308 #define BREAK_TK 309
#define IMPORT_TK 309 #define IMPORT_TK 310
#define ELSE_TK 310 #define ELSE_TK 311
#define INSTANCEOF_TK 311 #define INSTANCEOF_TK 312
#define RETURN_TK 312 #define RETURN_TK 313
#define VOID_TK 313 #define VOID_TK 314
#define CATCH_TK 314 #define CATCH_TK 315
#define INTERFACE_TK 315 #define INTERFACE_TK 316
#define CASE_TK 316 #define CASE_TK 317
#define EXTENDS_TK 317 #define EXTENDS_TK 318
#define FINALLY_TK 318 #define FINALLY_TK 319
#define SUPER_TK 319 #define SUPER_TK 320
#define WHILE_TK 320 #define WHILE_TK 321
#define CLASS_TK 321 #define CLASS_TK 322
#define SWITCH_TK 322 #define SWITCH_TK 323
#define CONST_TK 323 #define CONST_TK 324
#define TRY_TK 324 #define TRY_TK 325
#define FOR_TK 325 #define FOR_TK 326
#define NEW_TK 326 #define NEW_TK 327
#define CONTINUE_TK 327 #define CONTINUE_TK 328
#define GOTO_TK 328 #define GOTO_TK 329
#define PACKAGE_TK 329 #define PACKAGE_TK 330
#define THIS_TK 330 #define THIS_TK 331
#define BYTE_TK 331 #define BYTE_TK 332
#define SHORT_TK 332 #define SHORT_TK 333
#define INT_TK 333 #define INT_TK 334
#define LONG_TK 334 #define LONG_TK 335
#define CHAR_TK 335 #define CHAR_TK 336
#define INTEGRAL_TK 336 #define INTEGRAL_TK 337
#define FLOAT_TK 337 #define FLOAT_TK 338
#define DOUBLE_TK 338 #define DOUBLE_TK 339
#define FP_TK 339 #define FP_TK 340
#define ID_TK 340 #define ID_TK 341
#define REL_QM_TK 341 #define REL_QM_TK 342
#define REL_CL_TK 342 #define REL_CL_TK 343
#define NOT_TK 343 #define NOT_TK 344
#define NEG_TK 344 #define NEG_TK 345
#define ASSIGN_ANY_TK 345 #define ASSIGN_ANY_TK 346
#define ASSIGN_TK 346 #define ASSIGN_TK 347
#define OP_TK 347 #define OP_TK 348
#define CP_TK 348 #define CP_TK 349
#define OCB_TK 349 #define OCB_TK 350
#define CCB_TK 350 #define CCB_TK 351
#define OSB_TK 351 #define OSB_TK 352
#define CSB_TK 352 #define CSB_TK 353
#define SC_TK 353 #define SC_TK 354
#define C_TK 354 #define C_TK 355
#define DOT_TK 355 #define DOT_TK 356
#define STRING_LIT_TK 356 #define STRING_LIT_TK 357
#define CHAR_LIT_TK 357 #define CHAR_LIT_TK 358
#define INT_LIT_TK 358 #define INT_LIT_TK 359
#define FP_LIT_TK 359 #define FP_LIT_TK 360
#define TRUE_TK 360 #define TRUE_TK 361
#define FALSE_TK 361 #define FALSE_TK 362
#define BOOL_LIT_TK 362 #define BOOL_LIT_TK 363
#define NULL_TK 363 #define NULL_TK 364
#line 48 "./parse.y" #line 48 "./parse.y"
...@@ -448,7 +449,7 @@ typedef union { ...@@ -448,7 +449,7 @@ typedef union {
#define YYFLAG -32768 #define YYFLAG -32768
#define YYNTBASE 110 #define YYNTBASE 110
#define YYTRANSLATE(x) ((unsigned)(x) <= 363 ? yytranslate[x] : 267) #define YYTRANSLATE(x) ((unsigned)(x) <= 364 ? yytranslate[x] : 267)
static const char yytranslate[] = { 0, 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,
...@@ -476,18 +477,18 @@ static const char yytranslate[] = { 0, ...@@ -476,18 +477,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, 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, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5,
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
107, 108, 109 106, 107, 108, 109
}; };
#if YYDEBUG != 0 #if YYDEBUG != 0
...@@ -2291,8 +2292,7 @@ static const short yycheck[] = { 3, ...@@ -2291,8 +2292,7 @@ static const short yycheck[] = { 3,
#define YYPURE 1 #define YYPURE 1
/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
#line 3 "/usr/lib/bison.simple" #line 3 "/usr/cygnus/gnupro-98r1/share/bison.simple"
/* This file comes from bison-1.28. */
/* Skeleton output parser for bison, /* Skeleton output parser for bison,
Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
...@@ -2309,66 +2309,46 @@ static const short yycheck[] = { 3, ...@@ -2309,66 +2309,46 @@ static const short yycheck[] = { 3,
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
Boston, MA 02111-1307, USA. */
/* As a special exception, when this file is copied by Bison into a /* As a special exception, when this file is copied by Bison into a
Bison output file, you may use that output file without restriction. Bison output file, you may use that output file without restriction.
This special exception was added by the Free Software Foundation This special exception was added by the Free Software Foundation
in version 1.24 of Bison. */ in version 1.24 of Bison. */
/* This is the parser code that is written into each bison parser #ifndef alloca
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__ #ifdef __GNUC__
#define YYSTACK_USE_ALLOCA
#define alloca __builtin_alloca #define alloca __builtin_alloca
#else /* not GNU C. */ #else /* not GNU C. */
#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
#define YYSTACK_USE_ALLOCA
#include <alloca.h> #include <alloca.h>
#else /* not sparc */ #else /* not sparc */
/* We think this test detects Watcom and Microsoft C. */ #if defined (MSDOS) && !defined (__TURBOC__)
/* 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> #include <malloc.h>
#endif
#else /* not MSDOS, or __TURBOC__ */ #else /* not MSDOS, or __TURBOC__ */
#if defined(_AIX) #if defined(_AIX)
/* I don't know what this was needed for, but it pollutes the namespace. #include <malloc.h>
So I turned it off. rms, 2 May 1997. */
/* #include <malloc.h> */
#pragma alloca #pragma alloca
#define YYSTACK_USE_ALLOCA #else /* not MSDOS, __TURBOC__, or _AIX */
#else /* not MSDOS, or __TURBOC__, or _AIX */ #ifdef __hpux
#if 0 #ifdef __cplusplus
#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, extern "C" {
and on HPUX 10. Eventually we can turn this on. */ void *alloca (unsigned int);
#define YYSTACK_USE_ALLOCA };
#define alloca __builtin_alloca #else /* not __cplusplus */
void *alloca ();
#endif /* not __cplusplus */
#endif /* __hpux */ #endif /* __hpux */
#endif
#endif /* not _AIX */ #endif /* not _AIX */
#endif /* not MSDOS, or __TURBOC__ */ #endif /* not MSDOS, or __TURBOC__ */
#endif /* not sparc */ #endif /* not sparc. */
#endif /* not GNU C */ #endif /* not GNU C. */
#endif /* alloca not defined */ #endif /* alloca not defined. */
#endif /* YYSTACK_USE_ALLOCA not defined */
#ifdef YYSTACK_USE_ALLOCA /* This is the parser code that is written into each bison parser
#define YYSTACK_ALLOC alloca when the %semantic_parser declaration is not specified in the grammar.
#else It was written by Richard Stallman by simplifying the hairy parser
#define YYSTACK_ALLOC malloc used when %semantic_parser is specified. */
#endif
/* Note: there must be only one dollar sign in this file. /* Note: there must be only one dollar sign in this file.
It is replaced by the list of actions, each action It is replaced by the list of actions, each action
...@@ -2378,8 +2358,8 @@ static const short yycheck[] = { 3, ...@@ -2378,8 +2358,8 @@ static const short yycheck[] = { 3,
#define yyclearin (yychar = YYEMPTY) #define yyclearin (yychar = YYEMPTY)
#define YYEMPTY -2 #define YYEMPTY -2
#define YYEOF 0 #define YYEOF 0
#define YYACCEPT goto yyacceptlab #define YYACCEPT return(0)
#define YYABORT goto yyabortlab #define YYABORT return(1)
#define YYERROR goto yyerrlab1 #define YYERROR goto yyerrlab1
/* Like YYERROR except do call yyerror. /* Like YYERROR except do call yyerror.
This remains here temporarily to ease the This remains here temporarily to ease the
...@@ -2461,10 +2441,10 @@ int yydebug; /* nonzero means print parse trace */ ...@@ -2461,10 +2441,10 @@ int yydebug; /* nonzero means print parse trace */
#define YYMAXDEPTH 10000 #define YYMAXDEPTH 10000
#endif #endif
/* Define __yy_memcpy. Note that the size argument /* Prevent warning if -Wstrict-prototypes. */
should be passed with type unsigned int, because that is what the non-GCC #ifdef __GNUC__
definitions require. With GCC, __builtin_memcpy takes an arg int yyparse (void);
of type size_t, but it can handle unsigned int. */ #endif
#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) #define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
...@@ -2477,7 +2457,7 @@ static void ...@@ -2477,7 +2457,7 @@ static void
__yy_memcpy (to, from, count) __yy_memcpy (to, from, count)
char *to; char *to;
char *from; char *from;
unsigned int count; int count;
{ {
register char *f = from; register char *f = from;
register char *t = to; register char *t = to;
...@@ -2492,10 +2472,10 @@ __yy_memcpy (to, from, count) ...@@ -2492,10 +2472,10 @@ __yy_memcpy (to, from, count)
/* This is the most reliable way to avoid incompatibilities /* This is the most reliable way to avoid incompatibilities
in available built-in functions on various systems. */ in available built-in functions on various systems. */
static void 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 *f = from;
register char *t = to;
register int i = count; register int i = count;
while (i-- > 0) while (i-- > 0)
...@@ -2505,7 +2485,7 @@ __yy_memcpy (char *to, char *from, unsigned int count) ...@@ -2505,7 +2485,7 @@ __yy_memcpy (char *to, char *from, unsigned int count)
#endif #endif
#endif #endif
#line 217 "/usr/lib/bison.simple" #line 196 "/usr/cygnus/gnupro-98r1/share/bison.simple"
/* The user can define YYPARSE_PARAM as the name of an argument to be passed /* The user can define YYPARSE_PARAM as the name of an argument to be passed
into yyparse. The argument should have type void *. into yyparse. The argument should have type void *.
...@@ -2526,15 +2506,6 @@ __yy_memcpy (char *to, char *from, unsigned int count) ...@@ -2526,15 +2506,6 @@ __yy_memcpy (char *to, char *from, unsigned int count)
#define YYPARSE_PARAM_DECL #define YYPARSE_PARAM_DECL
#endif /* not YYPARSE_PARAM */ #endif /* not YYPARSE_PARAM */
/* Prevent warning if -Wstrict-prototypes. */
#ifdef __GNUC__
#ifdef YYPARSE_PARAM
int yyparse (void *);
#else
int yyparse (void);
#endif
#endif
int int
yyparse(YYPARSE_PARAM_ARG) yyparse(YYPARSE_PARAM_ARG)
YYPARSE_PARAM_DECL YYPARSE_PARAM_DECL
...@@ -2563,7 +2534,6 @@ yyparse(YYPARSE_PARAM_ARG) ...@@ -2563,7 +2534,6 @@ yyparse(YYPARSE_PARAM_ARG)
#endif #endif
int yystacksize = YYINITDEPTH; int yystacksize = YYINITDEPTH;
int yyfree_stacks = 0;
#ifdef YYPURE #ifdef YYPURE
int yychar; int yychar;
...@@ -2648,32 +2618,18 @@ yynewstate: ...@@ -2648,32 +2618,18 @@ yynewstate:
if (yystacksize >= YYMAXDEPTH) if (yystacksize >= YYMAXDEPTH)
{ {
yyerror("parser stack overflow"); yyerror("parser stack overflow");
if (yyfree_stacks)
{
free (yyss);
free (yyvs);
#ifdef YYLSP_NEEDED
free (yyls);
#endif
}
return 2; return 2;
} }
yystacksize *= 2; yystacksize *= 2;
if (yystacksize > YYMAXDEPTH) if (yystacksize > YYMAXDEPTH)
yystacksize = YYMAXDEPTH; yystacksize = YYMAXDEPTH;
#ifndef YYSTACK_USE_ALLOCA yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
yyfree_stacks = 1; __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
#endif yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
__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));
#ifdef YYLSP_NEEDED #ifdef YYLSP_NEEDED
yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
__yy_memcpy ((char *)yyls, (char *)yyls1, __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
size * (unsigned int) sizeof (*yylsp));
#endif #endif
#endif /* no yyoverflow */ #endif /* no yyoverflow */
...@@ -4841,7 +4797,7 @@ case 496: ...@@ -4841,7 +4797,7 @@ case 496:
break;} break;}
} }
/* the action file gets copied in in place of this dollarsign */ /* the action file gets copied in in place of this dollarsign */
#line 543 "/usr/lib/bison.simple" #line 498 "/usr/cygnus/gnupro-98r1/share/bison.simple"
yyvsp -= yylen; yyvsp -= yylen;
yyssp -= yylen; yyssp -= yylen;
...@@ -5036,30 +4992,6 @@ yyerrhandle: ...@@ -5036,30 +4992,6 @@ yyerrhandle:
yystate = yyn; yystate = yyn;
goto yynewstate; 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 2375 "./parse.y" #line 2375 "./parse.y"
...@@ -9222,7 +9154,7 @@ resolve_expression_name (id, orig) ...@@ -9222,7 +9154,7 @@ resolve_expression_name (id, orig)
qualify_ambiguous_name (id); qualify_ambiguous_name (id);
/* 15.10.1 Field Access Using a Primary and/or Expression Name */ /* 15.10.1 Field Access Using a Primary and/or Expression Name */
/* 15.10.2: Accessing Superclass Members using super */ /* 15.10.2: Accessing Superclass Members using super */
return resolve_field_access (id, NULL, NULL); return resolve_field_access (id, orig, NULL);
} }
/* We've got an error here */ /* We've got an error here */
...@@ -9295,21 +9227,7 @@ resolve_field_access (qual_wfl, field_decl, field_type) ...@@ -9295,21 +9227,7 @@ resolve_field_access (qual_wfl, field_decl, field_type)
return error_mark_node; return error_mark_node;
if (is_static && !static_final_found if (is_static && !static_final_found
&& !flag_emit_class_files && !flag_emit_xref) && !flag_emit_class_files && !flag_emit_xref)
{
field_ref = build_class_init (type_found, field_ref); field_ref = build_class_init (type_found, field_ref);
/* If the static field was identified by an expression that
needs to be generated, make the field access a compound
expression whose first part is the evaluation of the
field selector part. */
if (where_found && TREE_CODE (where_found) != TYPE_DECL
&& TREE_CODE (where_found) != RECORD_TYPE)
{
tree type = QUAL_DECL_TYPE (field_ref);
if (TREE_CODE (type) == RECORD_TYPE)
type = build_pointer_type (type);
field_ref = build (COMPOUND_EXPR, type, where_found, field_ref);
}
}
} }
else else
field_ref = decl; field_ref = decl;
......
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