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>
* gjavah.c (main): Avoid using `argi' to report unimplemented
......
......@@ -39,11 +39,6 @@ typedef unsigned int word;
/* Pointer to a bitstring. */
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. */
int num_current_locals = 0;
......
......@@ -389,7 +389,7 @@ set_super_info (access_flags, this_class, super_class, interfaces_count)
CLASS_HAS_SUPER (this_class) = 1;
}
pop_obstacks ();
if (access_flags & ACC_PUBLIC) CLASS_PUBLIC (class_decl) = 1;
if (access_flags & ACC_FINAL) CLASS_FINAL (class_decl) = 1;
if (access_flags & ACC_SUPER) CLASS_SUPER (class_decl) = 1;
......@@ -548,6 +548,40 @@ build_java_method_type (fntype, this_class, access_flags)
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
add_method_1 (handle_class, access_flags, name, function_type)
tree handle_class;
......@@ -568,6 +602,11 @@ add_method_1 (handle_class, access_flags, name, function_type)
= (struct lang_decl *) permalloc (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);
TYPE_METHODS (handle_class) = fndecl;
pop_obstacks ();
......
......@@ -48,6 +48,10 @@ static tree lookup_name_current_level PARAMS ((tree));
static tree push_promoted_type PARAMS ((const char *, tree));
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
#define INT_TYPE_SIZE BITS_PER_WORD
#endif
......@@ -1623,6 +1627,24 @@ build_result_decl (fndecl)
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
complete_start_java_method (fndecl)
tree fndecl;
......@@ -1634,6 +1656,11 @@ complete_start_java_method (fndecl)
/* Set up parameters and prepare for return, for the function. */
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
......
......@@ -83,6 +83,10 @@ static tree case_identity PARAMS ((tree, tree));
static tree operand_type[59];
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
init_expr_processing()
{
......@@ -1490,14 +1494,48 @@ tree
build_class_init (clas, expr)
tree clas, expr;
{
tree init;
tree init, call;
struct init_test_hash_entry *ite;
if (inherits_from_p (current_class, clas))
return expr;
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;
if (always_initialize_class_p)
{
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;
}
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)
{
expr = build (COMPOUND_EXPR, TREE_TYPE (expr), init, expr);
......
......@@ -25,6 +25,8 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
/* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */
#include "hash.h"
/* Java language-specific tree codes. */
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) SYM,
enum java_tree_code {
......@@ -368,6 +370,12 @@ struct lang_identifier
/* How specific the function is (for method selection - Java source
code front-end */
#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. */
#define LABEL_TYPE_STATE(NODE) (DECL_INITIAL (NODE))
......@@ -429,6 +437,11 @@ struct lang_identifier
#define DECL_LOCAL_SLOT_CHAIN(NODE) \
(((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. */
struct lang_decl
{
......@@ -443,8 +456,18 @@ struct lang_decl
tree function_decl_body; /* Hold all function's statements */
tree called_constructor; /* When decl is a constructor, the
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. */
struct lang_decl_var
{
......
......@@ -57,6 +57,10 @@ extern struct obstack *saveable_obstack;
extern struct obstack temporary_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. */
tree current_class = NULL_TREE;
......@@ -646,6 +650,10 @@ parse_class_file ()
debug_start_source_file (input_filename);
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));
method != NULL_TREE; method = TREE_CHAIN (method))
{
......
/* 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"
......@@ -448,7 +449,7 @@ typedef union {
#define YYFLAG -32768
#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,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
......@@ -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, 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
......@@ -2291,8 +2292,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/cygnus/gnupro-98r1/share/bison.simple"
/* Skeleton output parser for bison,
Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
......@@ -2309,66 +2309,46 @@ 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., 675 Mass Ave, Cambridge, MA 02139, 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. */
/* 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 */
#ifndef alloca
#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
#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
#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. */
#if defined (MSDOS) && !defined (__TURBOC__)
#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> */
#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
#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
#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 */
#endif /* not sparc. */
#endif /* not GNU C. */
#endif /* alloca not defined. */
#ifdef YYSTACK_USE_ALLOCA
#define YYSTACK_ALLOC alloca
#else
#define YYSTACK_ALLOC malloc
#endif
/* 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. */
/* Note: there must be only one dollar sign in this file.
It is replaced by the list of actions, each action
......@@ -2378,8 +2358,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
......@@ -2460,12 +2440,12 @@ 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__
int yyparse (void);
#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++ */
......@@ -2477,7 +2457,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;
......@@ -2492,10 +2472,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)
......@@ -2505,7 +2485,7 @@ __yy_memcpy (char *to, char *from, unsigned int count)
#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
into yyparse. The argument should have type void *.
......@@ -2526,15 +2506,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
......@@ -2563,7 +2534,6 @@ yyparse(YYPARSE_PARAM_ARG)
#endif
int yystacksize = YYINITDEPTH;
int yyfree_stacks = 0;
#ifdef YYPURE
int yychar;
......@@ -2648,32 +2618,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 */
......@@ -4841,7 +4797,7 @@ case 496:
break;}
}
/* 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;
yyssp -= yylen;
......@@ -5036,30 +4992,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 2375 "./parse.y"
......@@ -9222,7 +9154,7 @@ resolve_expression_name (id, orig)
qualify_ambiguous_name (id);
/* 15.10.1 Field Access Using a Primary and/or Expression Name */
/* 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 */
......@@ -9295,21 +9227,7 @@ resolve_field_access (qual_wfl, field_decl, field_type)
return error_mark_node;
if (is_static && !static_final_found
&& !flag_emit_class_files && !flag_emit_xref)
{
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);
}
}
field_ref = build_class_init (type_found, field_ref);
}
else
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