DEADSOFTWARE

Добавлен модуль SYSTEM и тип SYSTEM.TYPE
[dsw-obn.git] / src / oberon-type-compat.c
index 60b37c40e76895feb562ccfda9930c8462cd8440..a99a04d37c70652f3add5a483b0ca5b0bf1edbfd 100644 (file)
@@ -39,6 +39,18 @@ oberon_is_integer_type(oberon_type_t * t)
        return t -> class == OBERON_TYPE_INTEGER;
 }
 
+bool
+oberon_is_system_byte_type(oberon_type_t * t)
+{
+       return t -> class == OBERON_TYPE_SYSTEM_BYTE;
+}
+
+bool
+oberon_is_byte_type(oberon_type_t * t)
+{
+       return oberon_is_integer_type(t) && t -> size == 1;
+}
+
 bool
 oberon_is_number_type(oberon_type_t * t)
 {
@@ -100,6 +112,12 @@ oberon_is_array_of_char_type(oberon_type_t * t)
        return oberon_is_array_type(t) && oberon_is_char_type(t -> base);
 }
 
+bool
+oberon_is_array_of_system_byte_type(oberon_type_t * t)
+{
+       return oberon_is_array_type(t) && oberon_is_system_byte_type(t -> base);
+}
+
 bool
 oberon_is_nil_type(oberon_type_t * t)
 {
@@ -272,6 +290,8 @@ oberon_is_assignment_compatible_expressions(oberon_expr_t * e, oberon_type_t * T
        /*      совпадают с параметрами Tv. */
        /* Доп: Tv - символ, е - строковая константа из одного символа */
 
+       /* SYSTEM: переменным типа BYTE можно присваивать значения переменных типа CHAR или SHORTINT. */
+
        oberon_type_t * Te = e -> result;
 
 /*
@@ -296,7 +316,8 @@ oberon_is_assignment_compatible_expressions(oberon_expr_t * e, oberon_type_t * T
                || ((oberon_is_pointer_type(Tv) || oberon_is_procedure_type(Tv)) && oberon_is_nil_type(Te))
                || (oberon_is_array_of_char_type(Tv) && !oberon_is_open_array(Tv) && oberon_is_const_string(e) && (strlen(e -> item.string) < Tv -> size))
                || (oberon_is_procedure_type(Tv) && e -> is_item && e -> item.var -> class == OBERON_CLASS_PROC && oberon_is_some_procedure_signatures(Tv, e -> result))
-               || (oberon_is_char_type(Tv) && oberon_is_const_string(e) && strlen(e -> item.string) == 1);
+               || (oberon_is_char_type(Tv) && oberon_is_const_string(e) && strlen(e -> item.string) == 1)
+               || (oberon_is_system_byte_type(Tv) && (oberon_is_char_type(Te) || oberon_is_byte_type(Te)));
 }
 
 static bool
@@ -429,8 +450,12 @@ oberon_is_compatible_var_param(oberon_type_t * Tf, oberon_type_t * Ta)
        /* Для параметров-переменных Ta и Tf должны быть одинаковыми типами */
        /* или Tf должен быть типом запись, а Ta - расширением Tf. */
 
+       /* SYSTEM: Если формальный параметр-переменная имеет тип ARRAY OF BYTE, */
+       /* то соответствующий фактический параметр может иметь любой тип. */
+
        return oberon_is_some_types(Tf, Ta)
-               || (oberon_is_record_type(Tf) && oberon_extension_of(Ta, Tf));
+               || (oberon_is_record_type(Tf) && oberon_extension_of(Ta, Tf))
+               || (oberon_is_array_of_system_byte_type(Tf));
 }
 
 void