Skip to content

Commit f82926b

Browse files
cirrasfourls
authored andcommitted
Use TVarArgList in vararg intrinsic signatures
1 parent 8915f06 commit f82926b

File tree

5 files changed

+43
-4
lines changed

5 files changed

+43
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1717
### Changed
1818

1919
- Issue locations no longer span the entire routine declaration in `RoutineName`.
20+
- Improve type modeling around the `VarArg*` intrinsic routines.
2021

2122
### Deprecated
2223

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: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,12 @@ void testDefaultIntrinsic() {
604604
verifyUsages(22, 10, reference(32, 2));
605605
}
606606

607+
@Test
608+
void testVarArgIntrinsics() {
609+
execute("intrinsics/VarArgIntrinsics.pas");
610+
verifyUsages(15, 2, reference(18, 21));
611+
}
612+
607613
@Test
608614
void testBinaryOperatorIntrinsics() {
609615
execute("operators/BinaryOperatorIntrinsics.pas");
@@ -1640,6 +1646,8 @@ private static Path createStandardLibrary(Path baseDir) {
16401646
+ " end;\n"
16411647
+ " TCustomAttribute = class(TObject)\n"
16421648
+ " end;\n"
1649+
+ " TVarArgList = record\n"
1650+
+ " end;\n"
16431651
+ "implementation\n"
16441652
+ "end.");
16451653

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)