diff options
| author | bothner <bothner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-11-12 16:15:18 +0000 |
|---|---|---|
| committer | bothner <bothner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-11-12 16:15:18 +0000 |
| commit | 414a3558d3680ef9066c3589e0619283be8f442b (patch) | |
| tree | 0e0c77067b0cde2a4cd2a77e57acccb37045957c /gcc/java/expr.c | |
| parent | efd71bdff08100fbd344e29f2decc0c1dfb07b29 (diff) | |
| download | ppe42-gcc-414a3558d3680ef9066c3589e0619283be8f442b.tar.gz ppe42-gcc-414a3558d3680ef9066c3589e0619283be8f442b.zip | |
�
Extensive changes. See ChangeLog.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@23621 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/java/expr.c')
| -rw-r--r-- | gcc/java/expr.c | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/gcc/java/expr.c b/gcc/java/expr.c index 37c512256d7..0df6106bcaa 100644 --- a/gcc/java/expr.c +++ b/gcc/java/expr.c @@ -1337,9 +1337,7 @@ build_known_method_ref (method, method_type, self_type, method_signature, arg_li tree method, method_type, self_type, method_signature, arg_list; { tree func; - if (flag_emit_class_files) - return method; - else if (is_compiled_class (self_type)) + if (is_compiled_class (self_type)) { make_decl_rtl (method, NULL, 1); func = build1 (ADDR_EXPR, method_ptr_type_node, method); @@ -1696,6 +1694,18 @@ load_type_state (label) type_map [i] = TREE_VEC_ELT (vec, i); } +/* Do the expansion of a Java switch. With Gcc, switches are front-end + dependant things, but they rely on gcc routines. This function is + placed here because it uses things defined locally in parse.y. */ + +static tree +case_identity (t, v) + tree t __attribute__ ((__unused__)); + tree v; +{ + return v; +} + struct rtx_def * java_lang_expand_expr (exp, target, tmode, modifier) register tree exp; @@ -1716,6 +1726,7 @@ java_lang_expand_expr (exp, target, tmode, modifier) if (BLOCK_EXPR_BODY (exp)) { tree local; + tree body = BLOCK_EXPR_BODY (exp); struct rtx_def *to_return; pushlevel (2); /* 2 and above */ expand_start_bindings (0); @@ -1727,16 +1738,41 @@ java_lang_expand_expr (exp, target, tmode, modifier) expand_decl (pushdecl (local)); local = next; } - to_return = - expand_expr (BLOCK_EXPR_BODY (exp), target, tmode, modifier); + /* Avoid deep recursion for long block. */ + while (TREE_CODE (body) == COMPOUND_EXPR) + { + expand_expr (TREE_OPERAND (body, 0), const0_rtx, VOIDmode, 0); + body = TREE_OPERAND (body, 1); + } + to_return = expand_expr (body, target, tmode, modifier); poplevel (1, 1, 0); expand_end_bindings (getdecls (), 1, 0); return to_return; } break; + case CASE_EXPR: + { + tree duplicate; + if (pushcase (TREE_OPERAND (exp, 0), case_identity, + build_decl (LABEL_DECL, NULL_TREE, NULL_TREE), &duplicate) == 2) + { + EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (exp); + parse_error_context + (wfl_operator, "Duplicate case label: `%s'", + print_int_node (TREE_OPERAND (exp, 0))); + } + return const0_rtx; + } + + case DEFAULT_EXPR: + pushcase (NULL_TREE, 0, build_decl (LABEL_DECL, NULL_TREE, NULL_TREE), NULL); + return const0_rtx; + case SWITCH_EXPR: - java_expand_switch (exp); + expand_start_case (0, TREE_OPERAND (exp, 0), int_type_node, "switch"); + expand_expr_stmt (TREE_OPERAND (exp, 1)); + expand_end_case (TREE_OPERAND (exp, 0)); return const0_rtx; case TRY_EXPR: |

