Skip to content

Commit 3448be9

Browse files
RobertvanderHulstcpyrgas
andauthored
Dev (#1763)
* [VOXporter] Added missing properties (Caption, Description, Help Context) on fields for ported DBserver binaries. Fixes #1756. "Help Context" is also missing from the DBServer designer, needs to be added there, too. * [Compiler tests] Adjusted C591 for the X# runtime * [VODesigners] Added missing Help Context property for fields in the DBServer editor. Additional fix for #1756 * [VOXporter] Updated XIDE helper dlls for exporting binaries to XIDE format to newer version, old files must be removed from the installer. Completely removing the dependency proved to be too complicated. Additional fix for #1756 * Fixes for #1761 and #1760 * [Compiler tests] Added C943 for #1760 and #1761 * Fix issue when Clipper Calling convention function / method is called with a NULL parameter. The compiler now emits code that initializes the Xs$Args array to an empty USUAL[] when this happens. Fix for #1759 --------- Co-authored-by: cpyrgas <[email protected]>
1 parent 22aa515 commit 3448be9

File tree

4 files changed

+211
-82
lines changed

4 files changed

+211
-82
lines changed

src/Compiler/src/Compiler/XSharpCodeAnalysis/Parser/XSharpTreeTransformationCore.cs

Lines changed: 65 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -179,32 +179,30 @@ internal void AddVoPropertyAccessor(XP.IMethodContext accessor, int Type, Syntax
179179
_options.XSharpRuntime
180180
? GenerateQualifiedName(XSharpQualifiedTypeNames.Array)
181181
: GenerateQualifiedName(VulcanQualifiedTypeNames.Array);
182+
183+
protected ArrayRankSpecifierSyntax MakeEmptyRank()
184+
{
185+
var emptySizes = _pool.AllocateSeparated<ExpressionSyntax>();
186+
emptySizes.Add(_syntaxFactory.OmittedArraySizeExpression(SyntaxFactory.MakeToken(SyntaxKind.OmittedArraySizeExpressionToken)));
187+
var emptyRank = _syntaxFactory.ArrayRankSpecifier(
188+
SyntaxFactory.OpenBracketToken,
189+
emptySizes,
190+
SyntaxFactory.CloseBracketToken);
191+
_pool.Free(emptySizes);
192+
return emptyRank;
193+
}
182194
protected ArrayTypeSyntax ArrayOfUsual
183195
{
184196
get
185197
{
186-
var emptysizes = _pool.AllocateSeparated<ExpressionSyntax>();
187-
emptysizes.Add(_syntaxFactory.OmittedArraySizeExpression(SyntaxFactory.MakeToken(SyntaxKind.OmittedArraySizeExpressionToken)));
188-
var emptyrank = _syntaxFactory.ArrayRankSpecifier(
189-
SyntaxFactory.OpenBracketToken,
190-
emptysizes,
191-
SyntaxFactory.CloseBracketToken);
192-
_pool.Free(emptysizes);
193-
return _syntaxFactory.ArrayType(UsualType, emptyrank);
198+
return _syntaxFactory.ArrayType(UsualType, MakeEmptyRank());
194199
}
195200
}
196201
protected ArrayTypeSyntax ArrayOfString
197202
{
198203
get
199204
{
200-
var emptysizes = _pool.AllocateSeparated<ExpressionSyntax>();
201-
emptysizes.Add(_syntaxFactory.OmittedArraySizeExpression(SyntaxFactory.MakeToken(SyntaxKind.OmittedArraySizeExpressionToken)));
202-
var emptyrank = _syntaxFactory.ArrayRankSpecifier(
203-
SyntaxFactory.OpenBracketToken,
204-
emptysizes,
205-
SyntaxFactory.CloseBracketToken);
206-
_pool.Free(emptysizes);
207-
return _syntaxFactory.ArrayType(StringType, emptyrank);
205+
return _syntaxFactory.ArrayType(StringType, MakeEmptyRank());
208206
}
209207
}
210208

@@ -233,14 +231,7 @@ protected ArrayTypeSyntax ByteArrayType
233231
{
234232
get
235233
{
236-
var emptysizes = _pool.AllocateSeparated<ExpressionSyntax>();
237-
emptysizes.Add(_syntaxFactory.OmittedArraySizeExpression(SyntaxFactory.MakeToken(SyntaxKind.OmittedArraySizeExpressionToken)));
238-
var emptyrank = _syntaxFactory.ArrayRankSpecifier(
239-
SyntaxFactory.OpenBracketToken,
240-
emptysizes,
241-
SyntaxFactory.CloseBracketToken);
242-
_pool.Free(emptysizes);
243-
return _syntaxFactory.ArrayType(_syntaxFactory.PredefinedType(SyntaxFactory.MakeToken(SyntaxKind.ByteKeyword)), emptyrank);
234+
return _syntaxFactory.ArrayType(_syntaxFactory.PredefinedType(SyntaxFactory.MakeToken(SyntaxKind.ByteKeyword)), MakeEmptyRank());
244235
}
245236
}
246237

@@ -1399,6 +1390,22 @@ protected void GenerateAttributeList(SyntaxListBuilder<AttributeListSyntax> attr
13991390
_pool.Free(attributes);
14001391
}
14011392

1393+
1394+
protected InitializerExpressionSyntax CreateArrayInitializer(SeparatedSyntaxList<ExpressionSyntax> expressions)
1395+
{
1396+
var initializer = _syntaxFactory.InitializerExpression(SyntaxKind.ArrayInitializerExpression,
1397+
SyntaxFactory.OpenBraceToken,
1398+
expressions,
1399+
SyntaxFactory.CloseBraceToken);
1400+
return initializer;
1401+
1402+
}
1403+
1404+
protected InitializerExpressionSyntax CreateArrayInitializer(params ExpressionSyntax[] expressions)
1405+
{
1406+
return CreateArrayInitializer(MakeSeparatedList(expressions));
1407+
}
1408+
14021409
protected ExpressionSyntax CreateObject(TypeSyntax type, ArgumentListSyntax args, InitializerExpressionSyntax init = null)
14031410
{
14041411
ExpressionSyntax expr;
@@ -7410,7 +7417,7 @@ public override void ExitBlockStmt([NotNull] XP.BlockStmtContext context)
74107417
case XP.USING:
74117418
node = _syntaxFactory.UsingStatement(attributeLists: default,
74127419
awaitKeyword: context.a?.SyntaxKeyword(),
7413-
token.SyntaxKeyword(),
7420+
token.SyntaxKeyword(),
74147421
SyntaxFactory.OpenParenToken,
74157422
context.VarDecl?.Get<VariableDeclarationSyntax>(),
74167423
context.Expr?.Get<ExpressionSyntax>(),
@@ -9405,10 +9412,7 @@ public override void ExitLiteralValue([NotNull] XP.LiteralValueContext context)
94059412
var bin = _syntaxFactory.ArrayCreationExpression(
94069413
SyntaxFactory.MakeToken(SyntaxKind.NewKeyword),
94079414
ByteArrayType,
9408-
_syntaxFactory.InitializerExpression(SyntaxKind.ArrayInitializerExpression,
9409-
SyntaxFactory.OpenBraceToken,
9410-
MakeSeparatedList<ExpressionSyntax>(values.ToArray()),
9411-
SyntaxFactory.CloseBraceToken));
9415+
CreateArrayInitializer(values.ToArray()));
94129416
if (error)
94139417
{
94149418
var msg = "length of literal must be an even number of characters";
@@ -9618,10 +9622,7 @@ public override void ExitLiteralArray([NotNull] XP.LiteralArrayContext context)
96189622
exprs = default;
96199623
}
96209624
ExpressionSyntax expr;
9621-
var initializer = _syntaxFactory.InitializerExpression(SyntaxKind.ArrayInitializerExpression,
9622-
SyntaxFactory.OpenBraceToken,
9623-
exprs,
9624-
SyntaxFactory.CloseBraceToken);
9625+
var initializer = CreateArrayInitializer(exprs);
96259626
if (type != null)
96269627
{
96279628
expr = _syntaxFactory.ArrayCreationExpression(SyntaxFactory.MakeToken(SyntaxKind.NewKeyword),
@@ -10316,12 +10317,21 @@ public override void ExitObjectinitializer([NotNull] XP.ObjectinitializerContext
1031610317
}
1031710318
public override void ExitCollectioninitializer([NotNull] XP.CollectioninitializerContext context)
1031810319
{
10319-
var collinit = _syntaxFactory.InitializerExpression(
10320-
inArrayCtorCall(context) ? SyntaxKind.ArrayInitializerExpression : SyntaxKind.CollectionInitializerExpression,
10321-
SyntaxFactory.OpenBraceToken,
10322-
MakeSeparatedList<ExpressionSyntax>(context._Members),
10323-
SyntaxFactory.CloseBraceToken);
10324-
context.Put(collinit);
10320+
ExpressionSyntax expr;
10321+
var elements = MakeSeparatedList<ExpressionSyntax>(context._Members);
10322+
if (inArrayCtorCall(context))
10323+
{
10324+
expr = CreateArrayInitializer(elements);
10325+
}
10326+
else
10327+
{
10328+
expr = _syntaxFactory.InitializerExpression(
10329+
SyntaxKind.CollectionInitializerExpression,
10330+
SyntaxFactory.OpenBraceToken,
10331+
elements,
10332+
SyntaxFactory.CloseBraceToken);
10333+
}
10334+
context.Put(expr);
1032510335
}
1032610336
public override void ExitMemberinitializer([NotNull] XP.MemberinitializerContext context)
1032710337
{
@@ -10348,12 +10358,21 @@ public override void ExitInitializervalue([NotNull] XP.InitializervalueContext c
1034810358
}
1034910359
public override void ExitComplexInitExpr([NotNull] XP.ComplexInitExprContext context)
1035010360
{
10351-
var collinit = _syntaxFactory.InitializerExpression(
10352-
inArrayCtorCall(context) ? SyntaxKind.ArrayInitializerExpression : SyntaxKind.ComplexElementInitializerExpression,
10353-
SyntaxFactory.OpenBraceToken,
10354-
MakeSeparatedList<ExpressionSyntax>(context._Members),
10355-
SyntaxFactory.CloseBraceToken);
10356-
context.Put(collinit);
10361+
var members = MakeSeparatedList<ExpressionSyntax>(context._Members);
10362+
ExpressionSyntax expr;
10363+
if (inArrayCtorCall(context))
10364+
{
10365+
expr = CreateArrayInitializer(members);
10366+
}
10367+
else
10368+
{
10369+
expr = _syntaxFactory.InitializerExpression(
10370+
SyntaxKind.ComplexElementInitializerExpression,
10371+
SyntaxFactory.OpenBraceToken,
10372+
members,
10373+
SyntaxFactory.CloseBraceToken);
10374+
}
10375+
context.Put(expr);
1035710376
}
1035810377
public override void ExitInitializerMember([NotNull] XP.InitializerMemberContext context)
1035910378
{
@@ -10388,7 +10407,7 @@ public override void ExitDesignationTypeExpr([NotNull] XP.DesignationTypeExprCon
1038810407
}
1038910408
context.Put(_syntaxFactory.TupleExpression(SyntaxFactory.OpenParenToken, args, SyntaxFactory.CloseParenToken));
1039010409
_pool.Free(args);
10391-
}
10410+
}
1039210411
public override void ExitLocalDesignation([NotNull] XP.LocalDesignationContext context)
1039310412
{
1039410413
VariableDesignationSyntax designation = GetDesignation(context.Id);

src/Compiler/src/Compiler/XSharpCodeAnalysis/Parser/XSharpTreeTransformationRT.cs

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -649,19 +649,12 @@ protected void GenerateStartFunction(SyntaxList<SyntaxToken> modifiers, [NotNull
649649
if (atype.ElementType != stringtype)
650650
{
651651
// need to convert parameters to string[]
652-
var emptysizes = _pool.AllocateSeparated<ExpressionSyntax>();
653-
emptysizes.Add(_syntaxFactory.OmittedArraySizeExpression(SyntaxFactory.MakeToken(SyntaxKind.OmittedArraySizeExpressionToken)));
654-
var emptyrank = _syntaxFactory.ArrayRankSpecifier(
655-
SyntaxFactory.OpenBracketToken,
656-
emptysizes,
657-
SyntaxFactory.CloseBracketToken);
658-
atype = _syntaxFactory.ArrayType(stringtype, emptyrank);
652+
atype = _syntaxFactory.ArrayType(stringtype, MakeEmptyRank());
659653
parameter = parameter.Update(
660654
default,
661655
default,
662656
atype, parameter.Identifier, null);
663657
parList = _syntaxFactory.ParameterList(parList.OpenParenToken, MakeSeparatedList(parameter), parList.CloseParenToken);
664-
_pool.Free(emptysizes);
665658
}
666659
}
667660
else
@@ -3380,22 +3373,17 @@ public override void ExitXFunctionExpression([NotNull] XP.XFunctionExpressionCon
33803373
#region Entities and Clipper CC and PSZ support
33813374
public AttributeListSyntax MakeClipperCallingConventionAttribute(List<ExpressionSyntax> names)
33823375
{
3383-
return MakeAttributeList(
3384-
target: null,
3385-
attributes: MakeSeparatedList(_syntaxFactory.Attribute(
3386-
name: GenerateQualifiedName(_clipperCallingConvention),
3387-
argumentList: MakeAttributeArgumentList(
3376+
var argumentList = MakeAttributeArgumentList(
33883377
MakeSeparatedList(
33893378
_syntaxFactory.AttributeArgument(null, null,
33903379
_syntaxFactory.ArrayCreationExpression(
33913380
SyntaxFactory.MakeToken(SyntaxKind.NewKeyword),
33923381
ArrayOfString,
3393-
_syntaxFactory.InitializerExpression(SyntaxKind.ArrayInitializerExpression,
3394-
SyntaxFactory.OpenBraceToken,
3395-
MakeSeparatedList<ExpressionSyntax>(names.ToArray()),
3396-
SyntaxFactory.CloseBraceToken))))
3397-
))
3398-
));
3382+
CreateArrayInitializer(names.ToArray())))));
3383+
return MakeAttributeList(target: null,
3384+
attributes: MakeSeparatedList(_syntaxFactory.Attribute(
3385+
name: GenerateQualifiedName(_clipperCallingConvention),
3386+
argumentList: argumentList)));
33993387
}
34003388

34013389
protected ParameterListSyntax GetClipperParameters()
@@ -3617,17 +3605,24 @@ protected override void ImplementClipperAndPSZ(XP.IMemberWithBodyContext context
36173605
parameterTypes.Add(UsualType);
36183606
}
36193607
}
3620-
// create PCount variable
3608+
// Make sure Xs$Args is never NULL
3609+
// We use an IF statetement and not a conditional assignment
3610+
// because that saves an extra assignment.
36213611
var clipperArgs = GenerateSimpleName(XSharpSpecialNames.ClipperArgs);
3612+
var condition = _syntaxFactory.BinaryExpression(SyntaxKind.EqualsExpression, clipperArgs,
3613+
SyntaxFactory.MakeToken(SyntaxKind.EqualsEqualsToken), GenerateLiteralNull());
3614+
3615+
var args = MakeSeparatedList<ExpressionSyntax>();
3616+
var initializer = CreateArrayInitializer();
3617+
3618+
var expr = _syntaxFactory.ArrayCreationExpression(SyntaxFactory.MakeToken(SyntaxKind.NewKeyword), ArrayOfUsual, initializer);
3619+
var assignmentExpression = MakeSimpleAssignment(clipperArgs, expr);
3620+
3621+
var ifStatement = GenerateIfStatement(condition, GenerateExpressionStatement(assignmentExpression, (XSharpParserRuleContext)context, true));
3622+
stmts.Add(ifStatement);
3623+
// create PCount variable
36223624
var argLen = MakeSimpleMemberAccess(clipperArgs, GenerateSimpleName("Length"));
3623-
var notnull = _syntaxFactory.BinaryExpression(
3624-
SyntaxKind.NotEqualsExpression,
3625-
clipperArgs,
3626-
SyntaxFactory.MakeToken(SyntaxKind.ExclamationEqualsToken),
3627-
GenerateLiteralNull());
3628-
var len = MakeConditional(notnull, argLen, GenerateLiteral(0));
3629-
3630-
var decl = GenerateLocalDecl(XSharpSpecialNames.ClipperPCount, IntType, len);
3625+
var decl = GenerateLocalDecl(XSharpSpecialNames.ClipperPCount, IntType,argLen);
36313626
decl.XGenerated = true;
36323627
stmts.Add(decl);
36333628
// Now Change argument to X$Args PARAMS USUAL[]
@@ -4077,13 +4072,6 @@ protected ExpressionSyntax GenerateVOArrayInitializer([NotNull] XP.ArraysubConte
40774072
return initializer;
40784073
}
40794074

4080-
internal InitializerExpressionSyntax MakeArrayInitializer(SeparatedSyntaxList<ExpressionSyntax> exprs)
4081-
{
4082-
return _syntaxFactory.InitializerExpression(SyntaxKind.ArrayInitializerExpression,
4083-
SyntaxFactory.OpenBraceToken,
4084-
exprs,
4085-
SyntaxFactory.CloseBraceToken);
4086-
}
40874075

40884076
public override void ExitLiteralArray([NotNull] XP.LiteralArrayContext context)
40894077
{
@@ -4120,7 +4108,7 @@ public override void ExitLiteralArray([NotNull] XP.LiteralArrayContext context)
41204108
{
41214109
exprs = default(SeparatedSyntaxList<ExpressionSyntax>);
41224110
}
4123-
var initializer = MakeArrayInitializer(exprs);
4111+
var initializer = CreateArrayInitializer(exprs);
41244112
expr = _syntaxFactory.ArrayCreationExpression(SyntaxFactory.MakeToken(SyntaxKind.NewKeyword),
41254113
_syntaxFactory.ArrayType(type,
41264114
MakeList(_syntaxFactory.ArrayRankSpecifier(

src/CompilerTests/Applications/RuntimeTests/Prg/RuntimeTests.prg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ FUNCTION Start() AS INT
3333
"C877", "C878", "C879", "C880", "C881", "C882", "C884", "C885", "C886", "C887", ;
3434
"C893", "C895", "C897", "C898", "C899","C900", "C901", "C902", "C902b", "C903", "C904", ;
3535
"C905", "C908", "C913", "C914", "C915", "C921", "C926", "C932", "C936", "C937", "C938", "C939", ;
36+
"C941", "C943", ;
3637
;
3738
"R678", "R681", "R690", "R698", "R699", "R700" ,"R701", "R702", "R710",;
3839
"R711", "R712", "R725", "R729", "R730", "R732","R735", "R736","R741","R742","R743",;

0 commit comments

Comments
 (0)