summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: f4a67f6)
raw | patch | inline | side by side (parent: f4a67f6)
author | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Thu, 31 Aug 2017 15:46:39 +0000 (18:46 +0300) | ||
committer | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Thu, 31 Aug 2017 15:46:39 +0000 (18:46 +0300) |
notes | patch | blob | history | |
obn-run-tests.sh | patch | blob | history | |
src/backends/jvm/generator-jvm.c | patch | blob | history | |
src/oberon-internals.h | patch | blob | history | |
src/oberon.c | patch | blob | history | |
tests/Test25.obn | [new file with mode: 0644] | patch | blob |
tests/Test26.obn | [new file with mode: 0644] | patch | blob |
index bdd35e2be8039ea3715369b5d9969b9c962661d5..d2a263ff7f8885bd505ca0e6a86d125cda869834 100644 (file)
--- a/notes
+++ b/notes
- Jasmin создаёт ошибку в float константах, надо как-то порешать.
- Нужно делать проверку границ при касте индекса массива с типом HUGEINT
+- Секции CONST/TYPE/VAR сейчас нельзя повторять (что не по стандарту)
- Нужно передавать информацию о файле и строках в кодогенератор.
- Нет процедур привязанных к типм (10.2)
- Не полная реализация модуля Files
diff --git a/obn-run-tests.sh b/obn-run-tests.sh
index 813e6e59970c97932769cd4d01c9cdeb3c4b46d4..a5ea198e6c09ce5ef57e8f2778aa5da9de9e63af 100755 (executable)
--- a/obn-run-tests.sh
+++ b/obn-run-tests.sh
makefail Test23B
maketest Test24
+maketest Test25
+maketest Test26
index 79da2b9f68fac681b5624a512508c7228702eeb1..48db18000ba1a65e2c651d59f7f0f0afe0482f53 100644 (file)
jvm_generate_array_len(p, item -> integer);
jvm_generate_cast_prefix(p, 'i', jvm_get_postfix(item -> result));
break;
+ case MODE_AS:
+ push_item(p, item -> parent);
+ jvm_generate_cast_type(p, item -> parent -> result, item -> result);
+ break;
default:
gen_error("push_item: unk mode %i", item -> mode);
break;
diff --git a/src/oberon-internals.h b/src/oberon-internals.h
index d4f3cf211f02eb8411f06093b19043b1cfb8d1b1..d9f311911b94022a2ca7a7a7d6fdb08c869c33f2 100644 (file)
--- a/src/oberon-internals.h
+++ b/src/oberon-internals.h
MODE_TYPE,
MODE_SET,
MODE_LEN,
- MODE_SYSBYTE
+ MODE_SYSBYTE,
+ MODE_AS
};
enum oberon_operator_kind
diff --git a/src/oberon.c b/src/oberon.c
index 83f39cd2cebea39ac30fd54f1125ba11151bb045..1b7f5d9b19315aa614ef96e1665f21c11054da9b 100644 (file)
--- 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);
@@ -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");
diff --git a/tests/Test25.obn b/tests/Test25.obn
--- /dev/null
+++ b/tests/Test25.obn
@@ -0,0 +1,21 @@
+MODULE Test25;
+
+TYPE
+ X = POINTER TO XDesc;
+ XDesc = RECORD END;
+
+ Y = POINTER TO RECORD (XDesc) x : INTEGER END;
+
+VAR
+ x : X;
+ y : Y;
+ i : INTEGER;
+
+BEGIN
+ NEW(y);
+ x := y;
+ i := y.x;
+ i := x(Y).x;
+END Test25.
+
+Тест приведения типа с обращением к полю.
diff --git a/tests/Test26.obn b/tests/Test26.obn
--- /dev/null
+++ b/tests/Test26.obn
@@ -0,0 +1,11 @@
+MODULE Test26;
+
+VAR
+ x : SHORTINT;
+ y : LONGINT;
+
+BEGIN
+ y := x + SHORT(y);
+END Test26.
+
+Тест приведения типа.