Skip to content

Commit 9f2f681

Browse files
authored
Add support for alignment on records (#311)
1 parent 1d4640c commit 9f2f681

File tree

7 files changed

+81
-3
lines changed

7 files changed

+81
-3
lines changed

Source/DelphiAST.Consts.pas

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@ interface
153153
anReintroduce,
154154
anOverload,
155155
anAbstract,
156-
anInline
156+
anInline,
157+
anAlign
157158
);
158159

159160
const
@@ -307,7 +308,8 @@ interface
307308
'reintroduce',
308309
'overload',
309310
'abstract',
310-
'inline'
311+
'inline',
312+
'align'
311313
);
312314

313315
implementation

Source/DelphiAST.pas

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ TPasSyntaxTreeBuilder = class(TmwSimplePasParEx)
177177
procedure PropertyName; override;
178178
procedure PropertyParameterList; override;
179179
procedure RaiseStatement; override;
180+
procedure RecordAlignValue; override;
180181
procedure RecordConstraint; override;
181182
procedure RecordFieldConstant; override;
182183
procedure RecordType; override;
@@ -993,6 +994,12 @@ procedure TPasSyntaxTreeBuilder.RecordConstraint;
993994
end;
994995
end;
995996

997+
procedure TPasSyntaxTreeBuilder.RecordAlignValue;
998+
begin
999+
FStack.Peek.SetAttribute(anAlign, Lexer.Token);
1000+
inherited;
1001+
end;
1002+
9961003
procedure TPasSyntaxTreeBuilder.ConstSection;
9971004
var
9981005
ConstSect, Temp: TSyntaxNode;

Source/SimpleParser/SimpleParser.Lexer.Types.pas

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ interface
5454
ptAbstract,
5555
ptAdd,
5656
ptAddressOp,
57+
ptAlign,
5758
ptAmpersand,
5859
ptAnd,
5960
ptAnsiComment,

Source/SimpleParser/SimpleParser.Lexer.pas

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,8 @@ function TmwBasePasLex.Func43: TptTokenKind;
757757
begin
758758
Result := ptIdentifier;
759759
if KeyComp('Int64') then FExID := ptInt64
760-
else if KeyComp('local') then FExID := ptLocal;
760+
else if KeyComp('local') then FExID := ptLocal
761+
else if KeyComp('align') then Result := ptAlign;
761762
end;
762763

763764
function TmwBasePasLex.Func44: TptTokenKind;

Source/SimpleParser/SimpleParser.pas

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,8 @@ TmwSimplePasPar = class(TObject)
437437
procedure ReadAccessIdentifier; virtual;
438438
procedure RealIdentifier; virtual;
439439
procedure RealType; virtual;
440+
procedure RecordAlign; virtual;
441+
procedure RecordAlignValue; virtual;
440442
procedure RecordConstant; virtual;
441443
procedure RecordConstraint; virtual;
442444
procedure RecordFieldConstant; virtual;
@@ -3304,6 +3306,7 @@ procedure TmwSimplePasPar.RecordType;
33043306
Expected(ptEnd);
33053307

33063308
ClassTypeEnd;
3309+
RecordAlign;
33073310
end;
33083311

33093312
procedure TmwSimplePasPar.FileType;
@@ -4311,6 +4314,20 @@ procedure TmwSimplePasPar.SimpleType;
43114314
end;
43124315
end;
43134316

4317+
procedure TmwSimplePasPar.RecordAlign;
4318+
begin
4319+
if TokenID = ptAlign then
4320+
begin
4321+
Expected(ptAlign);
4322+
RecordAlignValue;
4323+
end;
4324+
end;
4325+
4326+
procedure TmwSimplePasPar.RecordAlignValue;
4327+
begin
4328+
Expected(ptIntegerConst);
4329+
end;
4330+
43144331
procedure TmwSimplePasPar.RecordFieldConstant;
43154332
begin
43164333
Expected(ptIdentifier);

Test/Snippets/alignedrecords.pas

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
unit managedrecords;
2+
3+
interface
4+
5+
type
6+
TMyRecord = record
7+
Value: Integer;
8+
class operator Initialize (out Dest: TMyRecord);
9+
class operator Finalize(var Dest: TMyRecord);
10+
end align 8;
11+
12+
implementation
13+
14+
class operator TMyRecord.Initialize (out Dest: TMyRecord);
15+
begin
16+
Dest.Value := 10;
17+
Log('created' + IntToHex (Integer(Pointer(@Dest))));
18+
end;
19+
20+
class operator TMyRecord.Finalize(var Dest: TMyRecord);
21+
begin
22+
Log('destroyed' + IntToHex (Integer(Pointer(@Dest))));
23+
end;
24+
25+
end.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
unit managedrecords;
2+
3+
interface
4+
5+
type
6+
TMyRecord = record
7+
Value: Integer;
8+
class operator Initialize (out Dest: TMyRecord);
9+
class operator Finalize(var Dest: TMyRecord);
10+
end;
11+
12+
implementation
13+
14+
class operator TMyRecord.Initialize (out Dest: TMyRecord);
15+
begin
16+
Dest.Value := 10;
17+
Log('created' + IntToHex (Integer(Pointer(@Dest))));
18+
end;
19+
20+
class operator TMyRecord.Finalize(var Dest: TMyRecord);
21+
begin
22+
Log('destroyed' + IntToHex (Integer(Pointer(@Dest))));
23+
end;
24+
25+
end.

0 commit comments

Comments
 (0)