|
2 | 2 |
|
3 | 3 | import de.dercompiler.ast.ASTNode; |
4 | 4 | import de.dercompiler.ast.visitor.ASTExpressionVisitor; |
| 5 | +import de.dercompiler.io.OutputMessageHandler; |
| 6 | +import de.dercompiler.io.message.MessageOrigin; |
5 | 7 | import de.dercompiler.lexer.SourcePosition; |
6 | 8 | import de.dercompiler.transformation.TransformationHelper; |
7 | 9 | import de.dercompiler.transformation.TransformationState; |
| 10 | +import firm.ArrayType; |
8 | 11 | import firm.Mode; |
9 | 12 | import firm.nodes.Node; |
10 | 13 |
|
@@ -40,12 +43,16 @@ public void accept(ASTExpressionVisitor astExpressionVisitor) { |
40 | 43 | @Override |
41 | 44 | public Node createNode(TransformationState state) { |
42 | 45 | Node base_ptr = getEncapsulated().createNode(state); |
43 | | - //TODO getTypeSize |
44 | | - Node type_size = state.construction.newConst(0, Mode.getIu()); |
| 46 | + if (!(encapsulated.getType() instanceof ArrayType aa)) { |
| 47 | + new OutputMessageHandler(MessageOrigin.TRANSFORM).internalError("we make a ArrayAccess on: " + encapsulated + " this should have been found by semantic!"); |
| 48 | + return null; |
| 49 | + } |
| 50 | + int type_size_const = aa.getElementType().getSize(); |
| 51 | + Node type_size = state.construction.newConst(type_size_const, Mode.getIu()); |
45 | 52 | Node elements = index.createNode(state); |
46 | | - Node index = TransformationHelper.calculateOffset(state, type_size, elements); |
47 | | - Node elem_ptr = TransformationHelper.addOffsetToPointer(state, base_ptr, index); |
48 | | - Mode mode = null; //TODO: how to get mode? |
| 53 | + Node offset = TransformationHelper.calculateOffset(state, type_size, elements); |
| 54 | + Node elem_ptr = TransformationHelper.addOffsetToPointer(state, base_ptr, offset); |
| 55 | + Mode mode = aa.getElementType().getMode(); |
49 | 56 | return TransformationHelper.genLoad(state, elem_ptr, mode); |
50 | 57 | } |
51 | 58 | } |
0 commit comments