-
-
Notifications
You must be signed in to change notification settings - Fork 1
history_2026_06_07
Blacky Cat edited this page Jun 7, 2026
·
1 revision
Datum: 2026-06-07
Vorher:
array[0..9] of IntegerNeu:
array[0..9, 0..9] of IntegerGrammar:
arrayType
: ARRAY LBRACK arrayRange (COMMA arrayRange)* RBRACK OF typeName
;
arrayRange
: expr DOTDOT expr
;Vorher:
LBRACK expr RBRACKNeu:
LBRACK expr (COMMA expr)* RBRACKUnterstützt nun:
m[0,0]
m[i,j]
m[x,y,z]Vorher:
{
"min": 0,
"max": 9
}Neu:
{
"dimensions": [
{"min":0,"max":9},
{"min":0,"max":9}
]
}Neue Funktion:
emit_multi_array_index_offset()Berechnet:
linear_index =
((i - min1) * dim2 + (j - min2))
Beispiel:
array[0..9,0..9]m[2,3]
ergibt:
2 * 10 + 3 = 23
Neue Funktion:
emit_array_bounds_check_dimension()Prüft jede Dimension einzeln:
i >= min
i <= max
j >= min
j <= max
Überarbeitet:
emit_load_array_element()
emit_store_array_element()Verwenden nun:
emit_multi_array_index_offset()Fehler:
m[0,0] := 10;ergab:
0
1
10
23
Ursache:
EBX wurde gleichzeitig
als Integer-Speicher
und als Array-Index verwendet.
Lösung:
Temporäre Sicherung über:
JitContext.print_int_tmpm[0,0] := 10;
m[0,1] := 20;
m[1,0] := 30;
m[2,3] := 99;Ausgabe:
10
20
30
99
Neu unterstützt:
p := @a[0];sowie:
p := @m[2,3];emit_address_of_array_element()Berechnet:
array_base
+ linear_index * element_size
a[0] := 10;
p := @a[0];
p^ := 123;
WriteLn(a[0]);
WriteLn(p^);Ausgabe:
123
123
Neu:
jit_new_memory()
jit_dispose_memory()Basierend auf:
malloc()
free()Neu:
New(p);
Dispose(p);emit_builtin_new()
emit_builtin_dispose()Neu allokierter Speicher:
memset(ptr, 0, size)New(p);
p^ := 123;
WriteLn(p^);
Dispose(p);Ausgabe:
123
Neu unterstützt:
type
PNode = ^TNode;
TNode = record
Value : Integer;
Next : PNode;
end;Überarbeitet:
resolve_type()unterstützt nun:
^TNode
^PNode
^TRecord
auch bei späteren Deklarationen.
Neu:
type_size("^Anything") = 8für x64.
Neu unterstützt:
n1^.Next := n2;Fehler:
Pointer-Wert wurde überschrieben,
bevor das Zielfeld geladen wurde.
Ursache:
emit_load_var()
zerstörte RAX.
Lösung:
push rax
...
pop r11
mov [field], r11Neu:
n^.Next := 0;wird interpretiert als:
n^.Next := nil;Vorher:
p^.ValueNeu:
p^.Next^.ValueUnterstützt nun beliebige Ketten:
n1^.Next^.Next^.Next^.ValueNew(n1);
New(n2);
n1^.Value := 10;
n2^.Value := 20;
n1^.Next := n2;
n2^.Next := 0;
WriteLn(n1^.Value);
WriteLn(n1^.Next^.Value);
Dispose(n2);
Dispose(n1);Ausgabe:
10
20
Unterstützt:
Integer
Double
String
Enum
Record
Array
Pointer
Type Alias
Unterstützt:
1D Arrays
Mehrdimensionale Arrays
Record Arrays
Initialisierte Arrays
Bounds Check
Unterstützt:
Pointer auf Variablen
Pointer auf Records
Pointer auf Array-Elemente
Pointer-Dereferenzierung
Mehrfache Pointer-Ketten
New()
Dispose()
Unterstützt:
Normale Records
Verschachtelte Records
Pointer auf Records
Rekursive Records
Verkettete Listen
type
TIntArray = array[0..9] of Integer;
TMatrix = array[0..9] of TIntArray;SetLength(a, 100);Derzeit:
p := 0;später:
p := nil;Push()
Pop()
Insert()
Delete()
Find()type
TPerson = class
end;Reihenfolge:
1. Array von Arrays
2. NIL-Konstante
3. Dynamische Arrays / SetLength
4. Listen-Algorithmen
5. Klassen (class)
6. Methoden
7. Konstruktoren
Copyright (c) 2024, 2025, 2026 by Jens Kallup - paule32