DEADSOFTWARE

JVM: Добавлены логические OR и AND
[dsw-obn.git] / src / backends / jvm / generator-jvm.c
index b0c54ff1d967aab8a5126d43f1313a344be408f4..eb0f3dc16b014bc803edf7307ce29049917efb51 100644 (file)
@@ -920,6 +920,44 @@ jvm_generate_operator(oberon_context_t * ctx, FILE *fp, char prefix, int op)
        }       
 }
 
+static void
+jvm_generate_logical_or(oberon_context_t * ctx, FILE * fp, oberon_expr_t * p, oberon_expr_t * q)
+{
+       int label_calc_q = jvm_new_label_id(ctx);
+       int label_done = jvm_new_label_id(ctx);
+       char * label_name_calc_q = jvm_get_label_name(label_calc_q);
+       char * label_name_done = jvm_get_label_name(label_done);
+
+       /* p OR q -- если p, то TRUE, иначе q */
+
+       push_expr(ctx, fp, p);
+       fprintf(fp, "ifne %s\n", label_name_calc_q);
+       fprintf(fp, "iconst_1\n");
+       fprintf(fp, "goto %s\n", label_name_done);
+       jvm_generate_label(fp, label_calc_q);
+       push_expr(ctx, fp, q);
+       jvm_generate_label(fp, label_done);
+}
+
+static void
+jvm_generate_logical_and(oberon_context_t * ctx, FILE * fp, oberon_expr_t * p, oberon_expr_t * q)
+{
+       int label_false = jvm_new_label_id(ctx);
+       int label_done = jvm_new_label_id(ctx);
+       char * label_name_false = jvm_get_label_name(label_false);
+       char * label_name_done = jvm_get_label_name(label_done);
+
+       /* p AND q -- если p, то q, иначе FALSE */
+
+       push_expr(ctx, fp, p);
+       fprintf(fp, "ifne %s\n", label_name_false);
+       push_expr(ctx, fp, q);
+       fprintf(fp, "goto %s\n", label_name_done);
+       jvm_generate_label(fp, label_false);
+       fprintf(fp, "iconst_0\n");
+       jvm_generate_label(fp, label_done);
+}
+
 static void
 push_operator(oberon_context_t * ctx, FILE * fp, oberon_oper_t * oper)
 {
@@ -955,6 +993,12 @@ push_operator(oberon_context_t * ctx, FILE * fp, oberon_oper_t * oper)
                        jvm_generate_operator(ctx, fp, prefix, op);
                        break;
 
+               case OP_LOGIC_OR:
+                       jvm_generate_logical_or(ctx, fp, oper -> left, oper -> right);
+                       break;
+               case OP_LOGIC_AND:
+                       jvm_generate_logical_and(ctx, fp, oper -> left, oper -> right);
+                       break;
                default:
                        oberon_error(ctx, "push_oper: unk op %i", op);
                        break;