X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Foberon-type-compat.c;h=4291f6c5f402d97b9e5c859056dd107099b31895;hb=0570527a2279ee6bd14b4c08e653b6d68369475a;hp=60b37c40e76895feb562ccfda9930c8462cd8440;hpb=75d0fd92a5342358f37ed9369ccce9355273e51a;p=dsw-obn.git diff --git a/src/oberon-type-compat.c b/src/oberon-type-compat.c index 60b37c4..4291f6c 100644 --- a/src/oberon-type-compat.c +++ b/src/oberon-type-compat.c @@ -39,6 +39,24 @@ 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_system_ptr_type(oberon_type_t * t) +{ + return t -> class == OBERON_TYPE_SYSTEM_PTR; +} + +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 +118,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,22 +296,10 @@ oberon_is_assignment_compatible_expressions(oberon_expr_t * e, oberon_type_t * T /* совпадают с параметрами Tv. */ /* Доп: Tv - символ, е - строковая константа из одного символа */ - oberon_type_t * Te = e -> result; + /* SYSTEM: переменным типа BYTE можно присваивать значения переменных типа CHAR или SHORTINT. */ + /* SYSTEM: Переменным типа PTR могут быть присвоены значения переменных-указателей любого типа. */ -/* - printf("<<< oberon_is_assignment_compatible_expressions ===\n"); - printf(": Te -> class == %i\n", Te -> class); - printf(": Tv -> class == %i\n", Tv -> class); - printf(":: oberon_is_some_types(Te, Tv) == %i\n", oberon_is_some_types(Te, Tv)); - printf("::: oberon_is_number_type(Te) == %i\n", oberon_is_number_type(Te)); - printf("::: oberon_is_number_type(Tv) == %i\n", oberon_is_number_type(Tv)); - printf("::: oberon_incluses_type(Tv, Te) == %i\n", oberon_incluses_type(Tv, Te)); - printf(":::: oberon_is_record_type(Te) == %i\n", oberon_is_record_type(Te)); - printf(":::: oberon_is_record_type(Tv) == %i\n", oberon_is_record_type(Tv)); -// printf(":::: oberon_extension_of(Te, Tv) == %i\n", oberon_extension_of(Te, Tv)); - printf(":::: oberon_extension_of(Tv, Te) == %i\n", oberon_extension_of(Tv, Te)); - printf("=== oberon_is_assignment_compatible_expressions >>>\n"); -*/ + oberon_type_t * Te = e -> result; return oberon_is_some_types(Te, Tv) || (oberon_is_number_type(Te) && oberon_is_number_type(Tv) && oberon_incluses_type(Tv, Te)) @@ -296,7 +308,9 @@ 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))) + || (oberon_is_system_ptr_type(Tv) && oberon_is_pointer_type(Te)); } static bool @@ -429,8 +443,15 @@ oberon_is_compatible_var_param(oberon_type_t * Tf, oberon_type_t * Ta) /* Для параметров-переменных Ta и Tf должны быть одинаковыми типами */ /* или Tf должен быть типом запись, а Ta - расширением Tf. */ + /* SYSTEM: Если формальный параметр-переменная имеет тип ARRAY OF BYTE, */ + /* то соответствующий фактический параметр может иметь любой тип. */ + /* SYSTEM: Если формальный параметр-переменная имеет тип PTR, */ + /* фактический параметр может быть указателем любого типа. */ + 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)) + || (oberon_is_system_ptr_type(Tf)); } void