DEADSOFTWARE

Добавлен оператор IS
[dsw-obn.git] / src / oberon.c
index a2a567036598a90f005bcc1780531e18e6d54701..e88ff79159e28e93c010a73ebde045ee8a6c9132 100644 (file)
@@ -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");