Skip to content

Commit 034ff2f

Browse files
committed
Merge remote-tracking branch 'origin/codegen-bene' into val-fix
2 parents f698189 + 21a74fa commit 034ff2f

File tree

2 files changed

+6
-9
lines changed

2 files changed

+6
-9
lines changed

docs/Project-Doc.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,12 @@ Zur Bytecode-generierung wird der Typed Abstract Syntax Tree(TAST) in Java Bytec
5252
umgewandelt. Dafür wird eine Intermediate Representation (IR) genutzt, die eine Class-ähnliche Struktur(mit Konstantenpool, LocalVarpool, Methoden mit Code als Instruktionen, etc.)
5353
besitzt. Diese IR wird dann komplett manuell in Java Bytecode übersetzt. Dies hat dem Code-gen Team sehr viel
5454
Zeit gekostet, da z.B. die Stack-Size, der Konstantenpool, LocalVarpool und die Jumps manuell berechnet werden mussten.
55+
5556
Zudem hatten wir zeitweise eigene Relative Instructions implementiert, da wir dachten, dass die JVM keine relativen Jumps
5657
unterstützt, hatten dann allerdings mit Try-and-Error herausgefunden, dass javap sich die absoluten Addressen ausrechnet
57-
und für die JVM normale jumps als relative Jumps behandelt.
58+
und für die JVM normale jumps als relative Jumps behandelt. Auch die relativen Jumps waren aber sehr fehleranfällig und
59+
hatten häufig off-by-one Errors.
60+
5861
Zudem musste eine StackMapTable implementiert werden, da die JVM sonst unsere Klassen nicht lädt.
5962
Das Troubleshooten von Testfehlern war auch sehr aufwending da oft javap gar nicht erst den Fehler im Klassencode ausgab
6063
und wir mit einem Hex-Editor die Klassen von Hand analysieren mussten, da es auch kein anderes Tool gab, um solche Fehler

lib/src/codegen/stack.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -462,15 +462,9 @@ impl StackMapFrame {
462462
v.push(255);
463463
v.extend_from_slice(&offset_delta.to_be_bytes());
464464
v.extend_from_slice(&number_of_locals.to_be_bytes());
465-
v.append(&mut local_types.iter().map(|t| t.as_bytes()).flatten().collect());
465+
v.append(&mut local_types.iter().flat_map(|t| t.as_bytes()).collect());
466466
v.extend_from_slice(&number_of_operands.to_be_bytes());
467-
v.append(
468-
&mut operand_types
469-
.iter()
470-
.map(|t| t.as_bytes())
471-
.flatten()
472-
.collect(),
473-
);
467+
v.append(&mut operand_types.iter().flat_map(|t| t.as_bytes()).collect());
474468
v
475469
}
476470
}

0 commit comments

Comments
 (0)