X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Foberon.c;h=e88ff79159e28e93c010a73ebde045ee8a6c9132;hb=72048038b5be32cc940c8452541b8bb3e75958a9;hp=a2a567036598a90f005bcc1780531e18e6d54701;hpb=d31e6130ac411ef95be71674b2666a1a79a83602;p=dsw-obn.git diff --git a/src/oberon.c b/src/oberon.c index a2a5670..e88ff79 100644 --- a/src/oberon.c +++ b/src/oberon.c @@ -1720,7 +1720,45 @@ oberon_make_bin_op(oberon_context_t * ctx, int token, oberon_expr_t * a, oberon_ oberon_expr_t * expr; oberon_type_t * result; - if(ITMAKESBOOLEAN(token)) + if(token == IS) + { + oberon_type_t * v = a -> result; + if(v -> class == OBERON_TYPE_POINTER) + { + v = v -> base; + if(v -> class != OBERON_TYPE_RECORD) + { + oberon_error(ctx, "must be record"); + } + } + else if(v -> class != OBERON_TYPE_RECORD) + { + oberon_error(ctx, "must be record"); + } + + if(b -> is_item == false || b -> item.mode != MODE_TYPE) + { + oberon_error(ctx, "requires type"); + } + + oberon_type_t * t = b -> result; + if(t -> class == OBERON_TYPE_POINTER) + { + t = t -> base; + if(t -> class != OBERON_TYPE_RECORD) + { + oberon_error(ctx, "must be record"); + } + } + else if(t -> class != OBERON_TYPE_RECORD) + { + oberon_error(ctx, "must be record"); + } + + result = ctx -> bool_type; + expr = oberon_new_operator(OP_IS, result, a, b); + } + else if(ITMAKESBOOLEAN(token)) { if(ITUSEONLYINTEGER(token)) { @@ -3501,6 +3539,7 @@ oberon_make_abs_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_ oberon_expr_t * arg; arg = list_args; + oberon_check_src(ctx, arg); oberon_type_t * result_type; result_type = arg -> result; @@ -3523,8 +3562,10 @@ oberon_make_new_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_ oberon_error(ctx, "too few arguments"); } + oberon_expr_t * dst; dst = list_args; + oberon_check_dst(ctx, dst); oberon_type_t * type; type = dst -> result; @@ -3573,6 +3614,7 @@ oberon_make_new_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_ oberon_expr_t * arg = size_list; for(int i = 0; i < max_args - 1; i++) { + oberon_check_src(ctx, arg); if(arg -> result -> class != OBERON_TYPE_INTEGER) { oberon_error(ctx, "size must be integer");