Skip to content

Commit ab0c604

Browse files
committed
Reduce stack usage when parsing
Can be tested by doing `ldc2 -O2 ./run_tests.sh`
1 parent fd5efb4 commit ab0c604

5 files changed

Lines changed: 222 additions & 30 deletions

File tree

src/dparse/parser.d

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ class Parser
128128
*/
129129
ExpressionNode parseAddExpression()
130130
{
131+
pragma(inline, true);
131132
mixin(traceEnterAndExit!(__FUNCTION__));
132133
return parseLeftAssocBinaryExpression!(AddExpression, MulExpression,
133134
tok!"+", tok!"-", tok!"~")();
@@ -178,7 +179,8 @@ class Parser
178179
if (currentIs(tok!"("))
179180
{
180181
mixin(parseNodeQ!(`node.parameters`, `Parameters`));
181-
StackBuffer memberFunctionAttributes;
182+
alias memberFunctionAttributes = storageClasses;
183+
memberFunctionAttributes.clear();
182184
while (moreTokens() && currentIsMemberFunctionAttribute())
183185
if (!memberFunctionAttributes.put(parseMemberFunctionAttribute()))
184186
return null;
@@ -264,7 +266,8 @@ class Parser
264266
if (currentIs(tok!"("))
265267
{
266268
mixin (parseNodeQ!(`node.parameters`, `Parameters`));
267-
StackBuffer memberFunctionAttributes;
269+
alias memberFunctionAttributes = storageClasses;
270+
memberFunctionAttributes.clear();
268271
while (moreTokens() && currentIsMemberFunctionAttribute())
269272
if (!memberFunctionAttributes.put(parseMemberFunctionAttribute()))
270273
return null;
@@ -326,6 +329,7 @@ class Parser
326329
*/
327330
ExpressionNode parseAndAndExpression()
328331
{
332+
pragma(inline, true);
329333
mixin(traceEnterAndExit!(__FUNCTION__));
330334
return parseLeftAssocBinaryExpression!(AndAndExpression, OrExpression,
331335
tok!"&&")();
@@ -341,6 +345,7 @@ class Parser
341345
*/
342346
ExpressionNode parseAndExpression()
343347
{
348+
pragma(inline, true);
344349
mixin(traceEnterAndExit!(__FUNCTION__));
345350
return parseLeftAssocBinaryExpression!(AndExpression, CmpExpression,
346351
tok!"&")();
@@ -509,6 +514,7 @@ class Parser
509514
*/
510515
ExpressionNode parseAsmAddExp()
511516
{
517+
pragma(inline, true);
512518
mixin (traceEnterAndExit!(__FUNCTION__));
513519
return parseLeftAssocBinaryExpression!(AsmAddExp, AsmMulExp,
514520
tok!"+", tok!"-")();
@@ -524,6 +530,7 @@ class Parser
524530
*/
525531
ExpressionNode parseAsmAndExp()
526532
{
533+
pragma(inline, true);
527534
mixin (traceEnterAndExit!(__FUNCTION__));
528535
return parseLeftAssocBinaryExpression!(AsmAndExp, AsmEqualExp, tok!"&");
529536
}
@@ -587,6 +594,7 @@ class Parser
587594
*/
588595
ExpressionNode parseAsmEqualExp()
589596
{
597+
pragma(inline, true);
590598
mixin(traceEnterAndExit!(__FUNCTION__));
591599
return parseLeftAssocBinaryExpression!(AsmEqualExp, AsmRelExp, tok!"==", tok!"!=")();
592600
}
@@ -699,6 +707,7 @@ class Parser
699707
*/
700708
ExpressionNode parseAsmLogAndExp()
701709
{
710+
pragma(inline, true);
702711
mixin (traceEnterAndExit!(__FUNCTION__));
703712
return parseLeftAssocBinaryExpression!(AsmLogAndExp, AsmOrExp, tok!"&&");
704713
}
@@ -713,6 +722,7 @@ class Parser
713722
*/
714723
ExpressionNode parseAsmLogOrExp()
715724
{
725+
pragma(inline, true);
716726
mixin(traceEnterAndExit!(__FUNCTION__));
717727
return parseLeftAssocBinaryExpression!(AsmLogOrExp, AsmLogAndExp, tok!"||")();
718728
}
@@ -727,6 +737,7 @@ class Parser
727737
*/
728738
ExpressionNode parseAsmMulExp()
729739
{
740+
pragma(inline, true);
730741
mixin(traceEnterAndExit!(__FUNCTION__));
731742
return parseLeftAssocBinaryExpression!(AsmMulExp, AsmBrExp, tok!"*", tok!"/", tok!"%")();
732743
}
@@ -741,6 +752,7 @@ class Parser
741752
*/
742753
ExpressionNode parseAsmOrExp()
743754
{
755+
pragma(inline, true);
744756
mixin (traceEnterAndExit!(__FUNCTION__));
745757
return parseLeftAssocBinaryExpression!(AsmOrExp, AsmXorExp, tok!"|")();
746758
}
@@ -806,6 +818,7 @@ class Parser
806818
*/
807819
ExpressionNode parseAsmRelExp()
808820
{
821+
pragma(inline, true);
809822
mixin (traceEnterAndExit!(__FUNCTION__));
810823
return parseLeftAssocBinaryExpression!(AsmRelExp, AsmShiftExp, tok!"<",
811824
tok!"<=", tok!">", tok!">=")();
@@ -821,6 +834,7 @@ class Parser
821834
*/
822835
ExpressionNode parseAsmShiftExp()
823836
{
837+
pragma(inline, true);
824838
mixin (traceEnterAndExit!(__FUNCTION__));
825839
return parseLeftAssocBinaryExpression!(AsmShiftExp, AsmAddExp, tok!"<<",
826840
tok!">>", tok!">>>");
@@ -857,7 +871,8 @@ class Parser
857871
const instrStart = allocator.setCheckpoint();
858872
const instrStartIdx = index;
859873

860-
StackBuffer instructions;
874+
alias instructions = functionAttributes;
875+
instructions.clear();
861876

862877
while (moreTokens() && !currentIs(tok!"}"))
863878
{
@@ -1029,6 +1044,7 @@ class Parser
10291044
*/
10301045
ExpressionNode parseAsmXorExp()
10311046
{
1047+
pragma(inline, true);
10321048
mixin (traceEnterAndExit!(__FUNCTION__));
10331049
return parseLeftAssocBinaryExpression!(AsmXorExp, AsmAndExp, tok!"^")();
10341050
}
@@ -1340,7 +1356,9 @@ class Parser
13401356
if (!storageClasses.put(parseStorageClass()))
13411357
return null;
13421358
ownArray(node.storageClasses, storageClasses);
1343-
StackBuffer parts;
1359+
1360+
alias parts = storageClasses;
1361+
parts.clear();
13441362
do
13451363
{
13461364
if (!parts.put(parseAutoDeclarationPart()))
@@ -1478,6 +1496,7 @@ class Parser
14781496
*/
14791497
BaseClassList parseBaseClassList()
14801498
{
1499+
pragma(inline, true);
14811500
mixin(traceEnterAndExit!(__FUNCTION__));
14821501
return parseCommaSeparatedRule!(BaseClassList, BaseClass)();
14831502
}
@@ -1879,7 +1898,9 @@ class Parser
18791898
return node;
18801899
}
18811900

1882-
StackBuffer falseDeclarations;
1901+
trueDeclarations.clear();
1902+
alias falseDeclarations = trueDeclarations;
1903+
18831904
if (currentIs(tok!":") || currentIs(tok!"{"))
18841905
{
18851906
immutable bool brace = currentIs(tok!"{");
@@ -2223,7 +2244,8 @@ class Parser
22232244
return null;
22242245
}
22252246
advance();
2226-
StackBuffer declarations;
2247+
alias declarations = attributes;
2248+
declarations.clear();
22272249
while (moreTokens() && !currentIs(tok!"}"))
22282250
{
22292251
auto c = allocator.setCheckpoint();
@@ -3090,6 +3112,7 @@ class Parser
30903112
*/
30913113
Expression parseExpression()
30923114
{
3115+
pragma(inline, true);
30933116
mixin(traceEnterAndExit!(__FUNCTION__));
30943117
if (suppressedErrorCount > MAX_ERRORS)
30953118
return null;
@@ -3389,6 +3412,7 @@ class Parser
33893412
*/
33903413
ForeachTypeList parseForeachTypeList()
33913414
{
3415+
pragma(inline, true);
33923416
mixin(traceEnterAndExit!(__FUNCTION__));
33933417
return parseCommaSeparatedRule!(ForeachTypeList, ForeachType)();
33943418
}
@@ -3790,6 +3814,7 @@ class Parser
37903814
*/
37913815
GccAsmOperandList parseGccAsmOperandList()
37923816
{
3817+
pragma(inline, true);
37933818
mixin(traceEnterAndExit!(__FUNCTION__));
37943819
return parseCommaSeparatedRule!(GccAsmOperandList, GccAsmOperand)();
37953820
}
@@ -4992,6 +5017,7 @@ class Parser
49925017
*/
49935018
ExpressionNode parseMulExpression()
49945019
{
5020+
pragma(inline, true);
49955021
mixin(traceEnterAndExit!(__FUNCTION__));
49965022
return parseLeftAssocBinaryExpression!(MulExpression, PowExpression,
49975023
tok!"*", tok!"/", tok!"%")();
@@ -5006,6 +5032,7 @@ class Parser
50065032
*/
50075033
NamespaceList parseNamespaceList()
50085034
{
5035+
pragma(inline, true);
50095036
mixin(traceEnterAndExit!(__FUNCTION__));
50105037
return parseCommaSeparatedRule!(NamespaceList, TernaryExpression)(true);
50115038
}
@@ -5179,6 +5206,7 @@ class Parser
51795206
*/
51805207
ExpressionNode parseOrExpression()
51815208
{
5209+
pragma(inline, true);
51825210
mixin(traceEnterAndExit!(__FUNCTION__));
51835211
return parseLeftAssocBinaryExpression!(OrExpression, XorExpression,
51845212
tok!"|")();
@@ -5194,6 +5222,7 @@ class Parser
51945222
*/
51955223
ExpressionNode parseOrOrExpression()
51965224
{
5225+
pragma(inline, true);
51975226
mixin(traceEnterAndExit!(__FUNCTION__));
51985227
return parseLeftAssocBinaryExpression!(OrOrExpression, AndAndExpression,
51995228
tok!"||")();
@@ -5303,7 +5332,8 @@ class Parser
53035332
}
53045333
else if (currentIs(tok!"["))
53055334
{
5306-
StackBuffer typeSuffixes;
5335+
alias typeSuffixes = parameterAttributes;
5336+
typeSuffixes.clear();
53075337
while(moreTokens() && currentIs(tok!"["))
53085338
if (!typeSuffixes.put(parseTypeSuffix()))
53095339
return null;
@@ -5551,6 +5581,7 @@ class Parser
55515581
*/
55525582
ExpressionNode parsePowExpression()
55535583
{
5584+
pragma(inline, true);
55545585
mixin (traceEnterAndExit!(__FUNCTION__));
55555586
return parseLeftAssocBinaryExpression!(PowExpression, UnaryExpression,
55565587
tok!"^^")();
@@ -5867,6 +5898,7 @@ class Parser
58675898
*/
58685899
ExpressionNode parseRelExpression(ExpressionNode shift)
58695900
{
5901+
pragma(inline, true);
58705902
mixin (traceEnterAndExit!(__FUNCTION__));
58715903
return parseLeftAssocBinaryExpression!(RelExpression, ShiftExpression,
58725904
tok!"<", tok!"<=", tok!">", tok!">=", tok!"!<>=", tok!"!<>",
@@ -5968,6 +6000,7 @@ class Parser
59686000
*/
59696001
ExpressionNode parseShiftExpression()
59706002
{
6003+
pragma(inline, true);
59716004
mixin(traceEnterAndExit!(__FUNCTION__));
59726005
return parseLeftAssocBinaryExpression!(ShiftExpression, AddExpression,
59736006
tok!"<<", tok!">>", tok!">>>")();
@@ -6783,6 +6816,7 @@ class Parser
67836816
*/
67846817
TemplateArgumentList parseTemplateArgumentList()
67856818
{
6819+
pragma(inline, true);
67866820
mixin(traceEnterAndExit!(__FUNCTION__));
67876821
return parseCommaSeparatedRule!(TemplateArgumentList, TemplateArgument)(true);
67886822
}
@@ -6950,6 +6984,7 @@ class Parser
69506984
*/
69516985
TemplateParameterList parseTemplateParameterList()
69526986
{
6987+
pragma(inline, true);
69536988
mixin(traceEnterAndExit!(__FUNCTION__));
69546989
return parseCommaSeparatedRule!(TemplateParameterList, TemplateParameter)(true);
69556990
}
@@ -7171,6 +7206,8 @@ class Parser
71717206
*/
71727207
ExpressionNode parseTernaryExpression()
71737208
{
7209+
pragma(inline, true);
7210+
71747211
mixin(traceEnterAndExit!(__FUNCTION__));
71757212
auto startIndex = index;
71767213

@@ -7913,7 +7950,8 @@ class Parser
79137950
node.comment = comment;
79147951
comment = null;
79157952

7916-
StackBuffer declarators;
7953+
alias declarators = storageClasses;
7954+
declarators.clear();
79177955
Declarator last;
79187956
while (true)
79197957
{
@@ -8095,6 +8133,7 @@ class Parser
80958133
*/
80968134
ExpressionNode parseXorExpression()
80978135
{
8136+
pragma(inline, true);
80988137
mixin(traceEnterAndExit!(__FUNCTION__));
80998138
return parseLeftAssocBinaryExpression!(XorExpression, AndExpression,
81008139
tok!"^")();

src/dparse/stack_buffer.d

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ struct StackBuffer
1616
if (t is null)
1717
return false;
1818

19-
if (_length == 0)
19+
if (_length == 0 && arr is null)
2020
arr = stackSpace[];
2121

2222
static if (is(T == class))
@@ -84,6 +84,11 @@ struct StackBuffer
8484

8585
alias opDollar = length;
8686

87+
void clear()
88+
{
89+
_length = 0;
90+
}
91+
8792
private:
8893

8994
void[8 * 16] stackSpace;

0 commit comments

Comments
 (0)