Skip to content

Commit 971d2d0

Browse files
committed
Use TVarArgList in vararg intrinsic signatures
1 parent 5c5f859 commit 971d2d0

File tree

5 files changed

+48
-4
lines changed

5 files changed

+48
-4
lines changed

CHANGELOG.md

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

1212
- Support for `AtomicCmpExchange128` intrinsic.
1313

14+
### Changed
15+
16+
- Improve `VarArg*` intrinsic signatures and make them stricter.
17+
1418
### Fixed
1519

1620
- The `IsManagedType` intrinsic would only accept type references - it now accepts values.

delphi-checks-testkit/src/main/java/au/com/integradev/delphi/checks/verifier/CheckVerifierImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,9 @@ private Path createStandardLibrary() {
790790
+ " TCustomAttribute = class(TObject)\n"
791791
+ " end;\n"
792792
+ "\n"
793+
+ " TVarArgList = record\n"
794+
+ " end;\n"
795+
+ "\n"
793796
+ "implementation\n"
794797
+ "\n"
795798
+ "end.");

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -352,13 +352,13 @@ private void buildRoutines() {
352352
.param(ANY_STRING)
353353
.varParam(TypeFactory.untypedType())
354354
.varParam(ANY_32_BIT_INTEGER);
355-
routine("VarArgStart").varParam(TypeFactory.untypedType());
355+
routine("VarArgStart").varParam(systemType("TVarArgList"));
356356
routine("VarArgGetValue")
357-
.varParam(TypeFactory.untypedType())
357+
.varParam(systemType("TVarArgList"))
358358
.param(ANY_CLASS_REFERENCE)
359359
.returns(IntrinsicReturnType.classReferenceValue(1));
360-
routine("VarArgCopy").varParam(TypeFactory.untypedType()).varParam(TypeFactory.untypedType());
361-
routine("VarArgEnd").varParam(TypeFactory.untypedType());
360+
routine("VarArgCopy").varParam(systemType("TVarArgList")).varParam(systemType("TVarArgList"));
361+
routine("VarArgEnd").varParam(systemType("TVarArgList"));
362362
routine("VarArrayRedim").varParam(ANY_VARIANT).param(type(INTEGER));
363363
routine("VarCast").varParam(ANY_VARIANT).param(ANY_VARIANT).param(type(INTEGER));
364364
routine("VarClear").varParam(ANY_VARIANT);

delphi-frontend/src/test/java/au/com/integradev/delphi/executor/DelphiSymbolTableExecutorTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,14 @@ void testDefaultIntrinsic() {
597597
verifyUsages(22, 10, reference(32, 2));
598598
}
599599

600+
@Test
601+
void testVarArgIntrinsics() {
602+
execute("intrinsics/VarArgIntrinsics.pas");
603+
verifyUsages(7, 10, reference(21, 4));
604+
verifyUsages(14, 2, reference(17, 14), reference(18, 13), reference(21, 24), reference(24, 12));
605+
verifyUsages(15, 2, reference(18, 21));
606+
}
607+
600608
@Test
601609
void testBinaryOperatorIntrinsics() {
602610
execute("operators/BinaryOperatorIntrinsics.pas");
@@ -1632,6 +1640,8 @@ private static Path createStandardLibrary(Path baseDir) {
16321640
+ " end;\n"
16331641
+ " TCustomAttribute = class(TObject)\n"
16341642
+ " end;\n"
1643+
+ " TVarArgList = record\n"
1644+
+ " end;\n"
16351645
+ "implementation\n"
16361646
+ "end.");
16371647

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
unit VarArgIntrinsics;
2+
3+
interface
4+
5+
implementation
6+
7+
procedure Proc(Arg: Integer);
8+
begin
9+
// do nothing
10+
end;
11+
12+
procedure Test; cdecl; varargs;
13+
var
14+
VAList: TVarArgList;
15+
Copy: TVarArgList;
16+
begin
17+
VarArgStart(VAList);
18+
VarArgCopy(VAList, Copy);
19+
20+
for var I := 0 to 3 do begin
21+
Proc(VarArgGetValue(VAList, Integer));
22+
end;
23+
24+
VarArgEnd(VAList);
25+
end;
26+
27+
end.

0 commit comments

Comments
 (0)