aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTom Tromey <tromey@cygnus.com>2000-05-19 16:04:10 +0000
committerTom Tromey <tromey@gcc.gnu.org>2000-05-19 16:04:10 +0000
commit67db0ce7480b53fbf7d9b632cae0b7c15b3bfdc8 (patch)
tree0416c1ff3b56daf1ff3a14bd481b259133e60841 /gcc
parent43490bec9d0db6490c1232fb83c69633da67e5ab (diff)
downloadgcc-67db0ce7480b53fbf7d9b632cae0b7c15b3bfdc8.zip
gcc-67db0ce7480b53fbf7d9b632cae0b7c15b3bfdc8.tar.gz
gcc-67db0ce7480b53fbf7d9b632cae0b7c15b3bfdc8.tar.bz2
java-tree.h: Added init state enum.
* java-tree.h: Added init state enum. * decl.c (emit_init_test_initialization): Initialize class initialization check variable by looking at class' state. From-SVN: r34022
Diffstat (limited to 'gcc')
-rw-r--r--gcc/java/ChangeLog6
-rw-r--r--gcc/java/decl.c18
-rw-r--r--gcc/java/java-tree.h21
-rw-r--r--gcc/java/parse.y15
4 files changed, 43 insertions, 17 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 26e0320..26261b6 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,5 +1,11 @@
2000-05-19 Tom Tromey <tromey@cygnus.com>
+ * java-tree.h: Added init state enum.
+ * decl.c (emit_init_test_initialization): Initialize class
+ initialization check variable by looking at class' state.
+
+2000-05-19 Tom Tromey <tromey@cygnus.com>
+
* java-tree.h (build_instanceof): Declare.
(build_get_class): Declare.
* parse.y (patch_binop): Use build_instanceof.
diff --git a/gcc/java/decl.c b/gcc/java/decl.c
index a79bb91..c5008a0 100644
--- a/gcc/java/decl.c
+++ b/gcc/java/decl.c
@@ -1681,17 +1681,29 @@ build_result_decl (fndecl)
/* 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 ATTRIBUTE_UNUSED;
{
struct init_test_hash_entry *ite = (struct init_test_hash_entry *) entry;
+ tree klass = build_class_ref ((tree) entry->key);
expand_decl (ite->init_test_decl);
- expand_expr_stmt (build (MODIFY_EXPR, boolean_type_node,
- ite->init_test_decl, boolean_false_node));
+ /* We initialize the class init check variable by looking at the
+ `state' field of the class to see if it is already initialized.
+ This makes things a bit faster if the class is already
+ initialized, which should be the common case. */
+ expand_expr_stmt
+ (build (MODIFY_EXPR, boolean_type_node,
+ ite->init_test_decl,
+ build (GE_EXPR, boolean_type_node,
+ build (COMPONENT_REF, byte_type_node,
+ build1 (INDIRECT_REF, class_type_node, klass),
+ lookup_field (&class_type_node,
+ get_identifier ("state"))),
+ build_int_2 (JV_STATE_DONE, 0))));
return true;
}
diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h
index a27b6b0..2b77434 100644
--- a/gcc/java/java-tree.h
+++ b/gcc/java/java-tree.h
@@ -1165,4 +1165,25 @@ extern int java_error_count; \
return; \
}
+/* These are the possible values for the `state' field of the class
+ structure. This must be kept in sync with libgcj. */
+enum
+{
+ JV_STATE_NOTHING = 0, /* Set by compiler. */
+
+ JV_STATE_PRELOADING = 1, /* Can do _Jv_FindClass. */
+ JV_STATE_LOADING = 3, /* Has super installed. */
+ JV_STATE_LOADED = 5, /* Is complete. */
+
+ JV_STATE_COMPILED = 6, /* This was a compiled class. */
+
+ JV_STATE_PREPARED = 7, /* Layout & static init done. */
+ JV_STATE_LINKED = 9, /* Strings interned. */
+
+ JV_STATE_IN_PROGRESS = 10, /* <Clinit> running. */
+ JV_STATE_DONE = 12,
+
+ JV_STATE_ERROR = 14 /* must be last. */
+};
+
#undef DEBUG_JAVA_BINDING_LEVELS
diff --git a/gcc/java/parse.y b/gcc/java/parse.y
index 08e1a0e..2ac6409 100644
--- a/gcc/java/parse.y
+++ b/gcc/java/parse.y
@@ -12346,18 +12346,7 @@ patch_binop (node, wfl_op1, wfl_op2)
}
/* Otherwise we have to invoke instance of to figure it out */
else
- {
- tree call =
- build (CALL_EXPR, boolean_type_node,
- build_address_of (soft_instanceof_node),
- tree_cons
- (NULL_TREE, op1,
- build_tree_list (NULL_TREE,
- build_class_ref (op2_type))),
- NULL_TREE);
- TREE_SIDE_EFFECTS (call) = TREE_SIDE_EFFECTS (op1);
- return call;
- }
+ return build_instanceof (op1, op2_type);
}
/* There is no way the expression operand can be an instance of
the type operand. This is a compile time error. */
@@ -14604,8 +14593,6 @@ fold_constant_for_init (node, context)
if (code == INTEGER_CST || code == REAL_CST)
return convert (TREE_TYPE (context), node);
- if (TREE_TYPE (node) != NULL_TREE && code != VAR_DECL && code != FIELD_DECL)
- return NULL_TREE;
switch (code)
{