Skip to content

Commit 66b6c55

Browse files
committed
Fix various intrinsic signatures around dynamic and open arrays
1 parent 7a1d2df commit 66b6c55

File tree

6 files changed

+73
-51
lines changed

6 files changed

+73
-51
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Fixed
11+
12+
- Various intrinsic routines had incorrect signatures around dynamic and open arrays.
13+
1014
## [1.12.0] - 2024-12-02
1115

1216
### Added

delphi-frontend/src/main/java/au/com/integradev/delphi/type/factory/TypeFactoryImpl.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ public class TypeFactoryImpl implements TypeFactory {
8484
private final EnumMap<IntrinsicType, Type> intrinsicTypes;
8585
private final IntegerSubrangeType anonymousUInt15;
8686
private final IntegerSubrangeType anonymousUInt31;
87+
private final IntegerType openArraySizeType;
88+
private final IntegerType dynamicArraySizeType;
8789
private final PointerType nilPointer;
8890
private final FileType untypedFile;
8991
private final CollectionType emptySet;
@@ -110,6 +112,18 @@ public TypeFactoryImpl(Toolchain toolchain, CompilerVersion compilerVersion) {
110112
":AnonymousUInt31",
111113
BigInteger.ZERO,
112114
((IntegerType) getIntrinsic(IntrinsicType.INTEGER)).max());
115+
116+
if (toolchain.architecture == Architecture.X86) {
117+
this.openArraySizeType = (IntegerType) getIntrinsic(IntrinsicType.INTEGER);
118+
this.dynamicArraySizeType = (IntegerType) getIntrinsic(IntrinsicType.INTEGER);
119+
} else {
120+
IntrinsicType openArraySizeIntrinsic =
121+
compilerVersion.compareTo(VERSION_ATHENS) >= 0
122+
? IntrinsicType.NATIVEINT
123+
: IntrinsicType.INTEGER;
124+
this.openArraySizeType = (IntegerType) getIntrinsic(openArraySizeIntrinsic);
125+
this.dynamicArraySizeType = (IntegerType) getIntrinsic(IntrinsicType.NATIVEINT);
126+
}
113127
}
114128

115129
private boolean isReal48Bit() {
@@ -556,6 +570,14 @@ public IntegerSubrangeType anonymousUInt31() {
556570
return anonymousUInt31;
557571
}
558572

573+
public IntegerType openArraySizeType() {
574+
return openArraySizeType;
575+
}
576+
577+
public IntegerType dynamicArraySizeType() {
578+
return dynamicArraySizeType;
579+
}
580+
559581
@Override
560582
public IntegerType integerFromLiteralValue(BigInteger value) {
561583
return intrinsicTypes.values().stream()
@@ -565,12 +587,4 @@ public IntegerType integerFromLiteralValue(BigInteger value) {
565587
.findFirst()
566588
.orElseThrow(IllegalStateException::new);
567589
}
568-
569-
public CompilerVersion getCompilerVersion() {
570-
return compilerVersion;
571-
}
572-
573-
public Toolchain getToolchain() {
574-
return toolchain;
575-
}
576590
}

delphi-frontend/src/main/java/au/com/integradev/delphi/type/intrinsic/IntrinsicArgumentMatcher.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,8 @@
2727
public final class IntrinsicArgumentMatcher extends TypeImpl {
2828
public static final Type LIKE_DYNAMIC_ARRAY =
2929
new IntrinsicArgumentMatcher(
30-
"<dynamic array, array constructor, string, or char>",
31-
type ->
32-
type.isDynamicArray()
33-
|| type.isArrayConstructor()
34-
|| type.isString()
35-
|| type.isChar());
30+
"<dynamic array, array constructor>",
31+
type -> type.isDynamicArray() || type.isArrayConstructor());
3632

3733
public static final Type ANY_STRING =
3834
new IntrinsicArgumentMatcher("<string or char>", type -> type.isString() || type.isChar());

delphi-frontend/src/main/java/au/com/integradev/delphi/type/intrinsic/IntrinsicReturnType.java

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
import static org.sonar.plugins.communitydelphi.api.type.IntrinsicType.UNICODESTRING;
2727
import static org.sonar.plugins.communitydelphi.api.type.IntrinsicType.WIDECHAR;
2828

29-
import au.com.integradev.delphi.compiler.Architecture;
30-
import au.com.integradev.delphi.compiler.CompilerVersion;
3129
import au.com.integradev.delphi.type.TypeImpl;
3230
import au.com.integradev.delphi.type.factory.ArrayOption;
3331
import au.com.integradev.delphi.type.factory.TypeFactoryImpl;
@@ -42,8 +40,6 @@
4240
import org.sonar.plugins.communitydelphi.api.type.TypeFactory;
4341

4442
public abstract class IntrinsicReturnType extends TypeImpl {
45-
private static final CompilerVersion VERSION_ATHENS = CompilerVersion.fromVersionNumber("36.0");
46-
4743
@Override
4844
public String getImage() {
4945
return "<" + getClass().getSimpleName() + ">";
@@ -97,25 +93,6 @@ public static Type argumentByIndex(int index) {
9793
return new ArgumentByIndexReturnType(index);
9894
}
9995

100-
private static Type getOpenArraySizeType(TypeFactory typeFactory) {
101-
if (((TypeFactoryImpl) typeFactory).getToolchain().architecture == Architecture.X86) {
102-
return typeFactory.getIntrinsic(IntrinsicType.INTEGER);
103-
} else {
104-
return typeFactory.getIntrinsic(
105-
((TypeFactoryImpl) typeFactory).getCompilerVersion().compareTo(VERSION_ATHENS) >= 0
106-
? IntrinsicType.NATIVEINT
107-
: IntrinsicType.INTEGER);
108-
}
109-
}
110-
111-
private static Type getDynamicArraySizeType(TypeFactory typeFactory) {
112-
if (((TypeFactoryImpl) typeFactory).getToolchain().architecture == Architecture.X86) {
113-
return typeFactory.getIntrinsic(IntrinsicType.INTEGER);
114-
} else {
115-
return typeFactory.getIntrinsic(IntrinsicType.NATIVEINT);
116-
}
117-
}
118-
11996
private static final class LengthReturnType extends IntrinsicReturnType {
12097
private final Type byteType;
12198
private final Type integerType;
@@ -126,8 +103,8 @@ private static final class LengthReturnType extends IntrinsicReturnType {
126103
private LengthReturnType(TypeFactory typeFactory) {
127104
this.byteType = typeFactory.getIntrinsic(IntrinsicType.BYTE);
128105
this.integerType = typeFactory.getIntrinsic(IntrinsicType.INTEGER);
129-
this.openArraySizeType = getOpenArraySizeType(typeFactory);
130-
this.dynamicArraySizeType = getDynamicArraySizeType(typeFactory);
106+
this.openArraySizeType = ((TypeFactoryImpl) typeFactory).openArraySizeType();
107+
this.dynamicArraySizeType = ((TypeFactoryImpl) typeFactory).dynamicArraySizeType();
131108
}
132109

133110
@Override
@@ -152,8 +129,8 @@ private static final class HighLowReturnType extends IntrinsicReturnType {
152129

153130
private HighLowReturnType(TypeFactory typeFactory) {
154131
this.integerType = typeFactory.getIntrinsic(IntrinsicType.INTEGER);
155-
this.openArraySizeType = getOpenArraySizeType(typeFactory);
156-
this.dynamicArraySizeType = getDynamicArraySizeType(typeFactory);
132+
this.openArraySizeType = ((TypeFactoryImpl) typeFactory).openArraySizeType();
133+
this.dynamicArraySizeType = ((TypeFactoryImpl) typeFactory).dynamicArraySizeType();
157134
}
158135

159136
@Override

delphi-frontend/src/main/java/au/com/integradev/delphi/type/intrinsic/IntrinsicsInjector.java

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import au.com.integradev.delphi.symbol.declaration.TypeNameDeclarationImpl;
5555
import au.com.integradev.delphi.symbol.declaration.VariableNameDeclarationImpl;
5656
import au.com.integradev.delphi.symbol.scope.DelphiScopeImpl;
57+
import au.com.integradev.delphi.type.factory.TypeFactoryImpl;
5758
import java.util.ArrayList;
5859
import java.util.Arrays;
5960
import java.util.List;
@@ -87,6 +88,14 @@ private Type type(IntrinsicType type) {
8788
return typeFactory.getIntrinsic(type);
8889
}
8990

91+
private Type openArraySizeType() {
92+
return ((TypeFactoryImpl) typeFactory).openArraySizeType();
93+
}
94+
95+
private Type dynamicArraySizeType() {
96+
return ((TypeFactoryImpl) typeFactory).dynamicArraySizeType();
97+
}
98+
9099
private void buildRoutines() {
91100
routine("Abs").param(type(REAL)).returns(type(REAL));
92101
routine("Abs").param(type(INTEGER)).returns(type(INTEGER));
@@ -162,6 +171,11 @@ private void buildRoutines() {
162171
.param(LIKE_DYNAMIC_ARRAY)
163172
.variadic(LIKE_DYNAMIC_ARRAY)
164173
.returns(IntrinsicReturnType.concat(typeFactory));
174+
routine("Concat")
175+
.param(ANY_STRING)
176+
.param(ANY_STRING)
177+
.variadic(ANY_STRING)
178+
.returns(IntrinsicReturnType.concat(typeFactory));
165179
routine("Continue");
166180
routine("Copy")
167181
.param(type(PANSICHAR))
@@ -174,17 +188,26 @@ private void buildRoutines() {
174188
.param(type(INTEGER))
175189
.returns(IntrinsicReturnType.copy(typeFactory));
176190
routine("Copy")
177-
.param(LIKE_DYNAMIC_ARRAY)
191+
.param(ANY_STRING)
178192
.param(type(INTEGER))
179193
.param(type(INTEGER))
194+
.returns(IntrinsicReturnType.copy(typeFactory));
195+
routine("Copy")
196+
.param(LIKE_DYNAMIC_ARRAY)
197+
.param(dynamicArraySizeType())
198+
.param(dynamicArraySizeType())
180199
.required(1)
181200
.returns(IntrinsicReturnType.copy(typeFactory));
182201
routine("Dec").varParam(ANY_ORDINAL).param(type(INTEGER)).required(1);
183202
routine("Dec").varParam(ANY_TYPED_POINTER).param(type(INTEGER)).required(1);
184203
routine("Default")
185204
.param(ANY_CLASS_REFERENCE)
186205
.returns(IntrinsicReturnType.classReferenceValue());
187-
routine("Delete").varParam(LIKE_DYNAMIC_ARRAY).param(type(INTEGER)).param(type(INTEGER));
206+
routine("Delete").varParam(ANY_STRING).param(type(INTEGER)).param(type(INTEGER));
207+
routine("Delete")
208+
.varParam(LIKE_DYNAMIC_ARRAY)
209+
.param(dynamicArraySizeType())
210+
.param(dynamicArraySizeType());
188211
routine("Dispose").varParam(ANY_POINTER);
189212
routine("Eof").varParam(ANY_FILE).required(0).returns(type(BOOLEAN));
190213
routine("Eoln").varParam(ANY_FILE).required(0).returns(type(BOOLEAN));
@@ -209,7 +232,11 @@ private void buildRoutines() {
209232
routine("Inc").varParam(ANY_TYPED_POINTER).param(type(INTEGER)).required(1);
210233
routine("Include").varParam(ANY_SET).param(ANY_ORDINAL);
211234
routine("Initialize").varParam(TypeFactory.untypedType()).param(type(NATIVEINT)).required(1);
212-
routine("Insert").param(LIKE_DYNAMIC_ARRAY).varParam(LIKE_DYNAMIC_ARRAY).param(type(INTEGER));
235+
routine("Insert").param(ANY_STRING).varParam(ANY_STRING).param(type(INTEGER));
236+
routine("Insert")
237+
.param(LIKE_DYNAMIC_ARRAY)
238+
.varParam(LIKE_DYNAMIC_ARRAY)
239+
.param(dynamicArraySizeType());
213240
routine("IsConstValue").param(TypeFactory.untypedType()).returns(type(BOOLEAN));
214241
routine("IsManagedType").param(ANY_CLASS_REFERENCE).returns(type(BOOLEAN));
215242
routine("Length").param(type(SHORTSTRING)).returns(IntrinsicReturnType.length(typeFactory));
@@ -251,7 +278,11 @@ private void buildRoutines() {
251278
routine("Seek").varParam(ANY_FILE).param(type(INTEGER));
252279
routine("SeekEof").varParam(ANY_TEXT_FILE).required(0).returns(type(BOOLEAN));
253280
routine("SeekEoln").varParam(ANY_TEXT_FILE).required(0).returns(type(BOOLEAN));
254-
routine("SetLength").varParam(LIKE_DYNAMIC_ARRAY).param(type(INTEGER)).variadic(type(INTEGER));
281+
routine("SetLength").varParam(ANY_STRING).param(type(INTEGER));
282+
routine("SetLength")
283+
.varParam(LIKE_DYNAMIC_ARRAY)
284+
.param(dynamicArraySizeType())
285+
.variadic(dynamicArraySizeType());
255286
routine("SetString").varParam(ANY_STRING).param(type(PANSICHAR)).param(type(INTEGER));
256287
routine("SetString").varParam(ANY_STRING).param(type(PWIDECHAR)).param(type(INTEGER));
257288
routine("SetTextBuf")
@@ -262,7 +293,7 @@ private void buildRoutines() {
262293
routine("SizeOf").param(TypeFactory.untypedType()).returns(type(INTEGER));
263294
routine("Slice")
264295
.varParam(ANY_ARRAY)
265-
.param(type(INTEGER))
296+
.param(openArraySizeType())
266297
.returns(IntrinsicReturnType.slice(typeFactory));
267298
routine("Sqr").param(type(EXTENDED)).returns(type(EXTENDED));
268299
routine("Sqr").param(type(INTEGER)).returns(type(INTEGER));

delphi-frontend/src/test/java/au/com/integradev/delphi/type/intrinsic/IntrinsicArgumentMatcherTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,14 @@ void testLikeDynamicArray() {
6363

6464
assertThat(matches(LIKE_DYNAMIC_ARRAY, dynamicArray)).isTrue();
6565
assertThat(matches(LIKE_DYNAMIC_ARRAY, arrayConstructor)).isTrue();
66-
assertThat(matches(LIKE_DYNAMIC_ARRAY, FACTORY.getIntrinsic(IntrinsicType.ANSICHAR))).isTrue();
67-
assertThat(matches(LIKE_DYNAMIC_ARRAY, FACTORY.getIntrinsic(IntrinsicType.WIDECHAR))).isTrue();
66+
assertThat(matches(LIKE_DYNAMIC_ARRAY, FACTORY.getIntrinsic(IntrinsicType.ANSICHAR))).isFalse();
67+
assertThat(matches(LIKE_DYNAMIC_ARRAY, FACTORY.getIntrinsic(IntrinsicType.WIDECHAR))).isFalse();
6868
assertThat(matches(LIKE_DYNAMIC_ARRAY, FACTORY.getIntrinsic(IntrinsicType.SHORTSTRING)))
69-
.isTrue();
69+
.isFalse();
7070
assertThat(matches(LIKE_DYNAMIC_ARRAY, FACTORY.getIntrinsic(IntrinsicType.ANSISTRING)))
71-
.isTrue();
71+
.isFalse();
7272
assertThat(matches(LIKE_DYNAMIC_ARRAY, FACTORY.getIntrinsic(IntrinsicType.UNICODESTRING)))
73-
.isTrue();
73+
.isFalse();
7474
assertThat(matches(LIKE_DYNAMIC_ARRAY, fixedArray)).isFalse();
7575
assertThat(matches(LIKE_DYNAMIC_ARRAY, FACTORY.emptySet())).isFalse();
7676
}

0 commit comments

Comments
 (0)