X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Foberon.c;h=1b7f5d9b19315aa614ef96e1665f21c11054da9b;hb=afdfb61e64fb9c7d05a7612812739aa0d9a560fc;hp=437e7694205489c681c5da3757bdc7e58a42ad39;hpb=35e75d29be18a7355aaaea9e146f3fda1d91857f;p=dsw-obn.git diff --git a/src/oberon.c b/src/oberon.c index 437e769..1b7f5d9 100644 --- a/src/oberon.c +++ b/src/oberon.c @@ -1088,6 +1088,12 @@ oberon_cast_expr(oberon_context_t * ctx, oberon_expr_t * expr, oberon_type_t * p cast = oberon_new_item(MODE_CHAR, ctx -> char_type, true); cast -> item.integer = expr -> item.string[0]; } + else if(oberon_is_record_type(pref) || oberon_is_pointer_to_record(pref)) + { + assert(expr -> is_item); + cast = oberon_new_item(MODE_AS, pref, expr -> read_only); + cast -> item.parent = (oberon_item_t *) expr; + } else if(!oberon_is_some_types(expr -> result, pref)) { cast = oberon_new_operator(OP_CAST, pref, expr, NULL); @@ -1995,7 +2001,7 @@ oberon_make_bin_op(oberon_context_t * ctx, int token, oberon_expr_t * a, oberon_ expr = oberon_new_operator(OP_DIV, result, a, b); break; case MOD: - expr = oberon_new_operator(OP_DIV, result, a, b); + expr = oberon_new_operator(OP_MOD, result, a, b); break; default: printf("token %i line %i\n", token, ctx -> loc.line); @@ -3495,7 +3501,7 @@ oberon_statement(oberon_context_t * ctx) oberon_error(ctx, "condition must be boolean"); } - oberon_generate_branch(ctx, cond, true, begin); + oberon_generate_branch(ctx, cond, false, begin); } else if(ctx -> token == FOR) { @@ -3940,7 +3946,6 @@ oberon_make_inc_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_ { step = list_args -> next; oberon_check_src(ctx, step); - oberon_check_const(ctx, step); if(!oberon_is_integer_type(step -> result)) { oberon_error(ctx, "expect integer"); @@ -4055,7 +4060,6 @@ oberon_make_dec_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_ { step = list_args -> next; oberon_check_src(ctx, step); - oberon_check_const(ctx, step); if(!oberon_is_integer_type(step -> result)) { oberon_error(ctx, "expect integer"); @@ -4535,7 +4539,7 @@ oberon_make_ord_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_ } else { - expr = oberon_cast_expr(ctx, arg, ctx -> int_type); + expr = oberon_cast_expr(ctx, arg, ctx -> shortint_type); } return expr; }