optimize array create · Drake53/CSharp.lua@4371f6c · GitHub
Skip to content

Commit 4371f6c

Browse files
committed
optimize array create
1 parent 6ebcd07 commit 4371f6c

6 files changed

Lines changed: 69 additions & 36 deletions

File tree

‎CSharp.lua/CoreSystem.Lua/CoreSystem/Array.lua‎

Lines changed: 27 additions & 3 deletions

‎CSharp.lua/CoreSystem.Lua/CoreSystem/Threading/Task.lua‎

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -273,13 +273,20 @@ local function checkTasks(...)
273273
elseif System.isEnumerableLike(args) then
274274
tasks = System.Array.toArray(args)
275275
end
276+
if tasks ~= nil then
277+
for i = 1, #tasks do
278+
if tasks[i] == System.null then
279+
throw(ArgumentNullException())
280+
end
281+
end
282+
end
276283
end
277-
if not tasks then
278-
tasks = System.Array(Task)(...)
279-
end
280-
for i = 1, #tasks do
281-
if tasks[i] == System.null then
282-
throw(ArgumentNullException())
284+
if tasks == nil then
285+
tasks = { ... }
286+
for i = 1, n do
287+
if tasks[i] == nil then
288+
throw(ArgumentNullException())
289+
end
283290
end
284291
end
285292
return tasks

‎CSharp.lua/LuaAst/LuaInvocationExpressionSyntax.cs‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,6 @@ public LuaInvocationExpressionSyntax(LuaExpressionSyntax expression) {
4848
Expression = expression ?? throw new ArgumentNullException(nameof(expression));
4949
}
5050

51-
public LuaInvocationExpressionSyntax(LuaExpressionSyntax expression, LuaExpressionSyntax argument, bool isCallSingleTable) : this(expression) {
52-
AddArgument(argument);
53-
ArgumentList.IsCallSingleTable = isCallSingleTable;
54-
}
55-
5651
public LuaInvocationExpressionSyntax(LuaExpressionSyntax expression, LuaExpressionSyntax argument1, LuaExpressionSyntax argument2) : this(expression) {
5752
AddArgument(argument1);
5853
AddArgument(argument2);

‎CSharp.lua/LuaSyntaxNodeTransform.Helper.cs‎

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ internal bool ContainsMaxSymbol(ISymbol symbol, out bool isNeedImport) {
7979
}
8080
}
8181

82-
private const int kMaxArrayInitializerCount = 225;
8382
private static readonly Regex codeTemplateRegex_ = new(@"(,?\s*)\{(\*?[\w|`]+)\}", RegexOptions.Compiled);
8483
private static readonly Regex unicodeRegex_ = new(@"\\u([0-9a-fA-F]{4})", RegexOptions.Compiled);
8584
private readonly Dictionary<ISymbol, LuaIdentifierNameSyntax> localReservedNames_ = new();
@@ -457,22 +456,29 @@ private bool IsInternalMember(ISymbol symbol) {
457456
return false;
458457
}
459458

460-
private LuaExpressionSyntax BuildArray(ITypeSymbol elementType, params LuaExpressionSyntax[] elements) {
461-
var baseType = GetTypeName(elementType);
459+
private LuaExpressionSyntax BuildArray(IArrayTypeSymbol symbol, params LuaExpressionSyntax[] elements) {
460+
var baseType = GetTypeName(symbol.ElementType);
462461
var arrayType = new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.Array, baseType);
463-
return BuildArray(arrayType, elements);
462+
return BuildArray(symbol, arrayType, elements);
464463
}
465464

466-
private LuaExpressionSyntax BuildArray(LuaExpressionSyntax arrayType, IList<LuaExpressionSyntax> elements) {
467-
if (elements.Count > kMaxArrayInitializerCount) {
468-
return arrayType.MemberAccess(LuaIdentifierNameSyntax.New, true).Invocation(elements.Count, new LuaTableExpression(elements) { IsSingleLine = true });
465+
private LuaExpressionSyntax BuildArray(IArrayTypeSymbol symbol, LuaExpressionSyntax arrayType, IList<LuaExpressionSyntax> elements) {
466+
var invocation = new LuaInvocationExpressionSyntax(arrayType);
467+
var table = new LuaTableExpression(elements) { IsSingleLine = true };
468+
bool isElementNotNull = (symbol.ElementType.IsValueType && !symbol.ElementType.IsNullableType())
469+
|| elements.All(i => i is LuaLiteralExpressionSyntax && i != LuaIdentifierLiteralExpressionSyntax.Nil);
470+
if (isElementNotNull) {
471+
invocation.AddArgument(table);
472+
invocation.ArgumentList.IsCallSingleTable = true;
473+
} else {
474+
invocation.AddArgument(elements.Count);
475+
invocation.AddArgument(table);
469476
}
470-
471-
return new LuaInvocationExpressionSyntax(arrayType, elements);
477+
return invocation;
472478
}
473479

474480
private LuaExpressionSyntax BuildArray(LuaExpressionSyntax arrayType, LuaExpressionSyntax size) {
475-
return arrayType.MemberAccess(LuaIdentifierNameSyntax.New, true).Invocation(size);
481+
return arrayType.Invocation(size);
476482
}
477483

478484
private LuaExpressionSyntax BuildMultiArray(LuaExpressionSyntax arrayType, LuaExpressionSyntax rank, List<LuaExpressionSyntax> elements = null) {
@@ -549,16 +555,14 @@ private LuaLiteralExpressionSyntax GetConstLiteralExpression(ILocalSymbol constL
549555
private LuaLiteralExpressionSyntax GetConstExpression(ExpressionSyntax node) {
550556
var constValue = semanticModel_.GetConstantValue(node);
551557
if (constValue.HasValue) {
552-
switch (constValue.Value)
553-
{
558+
switch (constValue.Value) {
554559
case double d:
555560
switch (d) {
556561
case double.NegativeInfinity:
557562
case double.PositiveInfinity:
558563
case double.NaN:
559564
return null;
560565
}
561-
562566
break;
563567
case float f:
564568
switch (f) {
@@ -567,8 +571,9 @@ private LuaLiteralExpressionSyntax GetConstExpression(ExpressionSyntax node) {
567571
case float.NaN:
568572
return null;
569573
}
570-
571574
break;
575+
case null:
576+
return LuaIdentifierLiteralExpressionSyntax.Nil;
572577
}
573578

574579
var literalExpression = GetLiteralExpression(constValue.Value);

‎CSharp.lua/LuaSyntaxNodeTransform.Object.cs‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -240,11 +240,11 @@ private void FillMultiArrayInitializer(InitializerExpressionSyntax initializer,
240240
}
241241
}
242242

243-
private LuaExpressionSyntax BuildArrayCreationExpression(LuaArrayTypeAdapterExpressionSyntax arrayType, InitializerExpressionSyntax initializer) {
243+
private LuaExpressionSyntax BuildArrayCreationExpression(IArrayTypeSymbol symbol, LuaArrayTypeAdapterExpressionSyntax arrayType, InitializerExpressionSyntax initializer) {
244244
if (initializer?.Expressions.Count > 0) {
245245
if (arrayType.IsSimpleArray) {
246246
var initializerExpressions = initializer.Expressions.Select(i => i.AcceptExpression(this)).ToList();
247-
return BuildArray(arrayType, initializerExpressions);
247+
return BuildArray(symbol, arrayType, initializerExpressions);
248248
}
249249

250250
var rank = new LuaTableExpression { IsSingleLine = true };
@@ -257,7 +257,7 @@ private LuaExpressionSyntax BuildArrayCreationExpression(LuaArrayTypeAdapterExpr
257257
if (arrayType.IsSimpleArray) {
258258
var size = arrayType.RankSpecifier.Sizes.FirstOrDefault() ?? LuaNumberLiteralExpressionSyntax.Zero;
259259
if (size is LuaNumberLiteralExpressionSyntax { Number: 0 }) {
260-
return BuildArray(arrayType, Array.Empty<LuaExpressionSyntax>());
260+
return BuildArray(symbol, arrayType, Array.Empty<LuaExpressionSyntax>());
261261
}
262262
return BuildArray(arrayType, size);
263263
}
@@ -272,13 +272,14 @@ private LuaExpressionSyntax BuildArrayCreationExpression(LuaArrayTypeAdapterExpr
272272

273273
public override LuaSyntaxNode VisitArrayCreationExpression(ArrayCreationExpressionSyntax node) {
274274
var arrayType = node.Type.Accept<LuaArrayTypeAdapterExpressionSyntax>(this);
275-
return BuildArrayCreationExpression(arrayType, node.Initializer);
275+
var symbol = (IArrayTypeSymbol)semanticModel_.GetTypeInfo(node.Type).Type;
276+
return BuildArrayCreationExpression(symbol, arrayType, node.Initializer);
276277
}
277278

278279
private LuaExpressionSyntax BuildArrayTypeFromInitializer(IArrayTypeSymbol arrayType, InitializerExpressionSyntax initializer) {
279280
var typeExpress = GetTypeName(arrayType);
280281
var arrayExpression = new LuaArrayTypeAdapterExpressionSyntax(typeExpress, new LuaArrayRankSpecifierSyntax(arrayType.Rank));
281-
return BuildArrayCreationExpression(arrayExpression, initializer);
282+
return BuildArrayCreationExpression(arrayType, arrayExpression, initializer);
282283
}
283284

284285
public override LuaSyntaxNode VisitImplicitArrayCreationExpression(ImplicitArrayCreationExpressionSyntax node) {
@@ -1227,7 +1228,8 @@ public override LuaSyntaxNode VisitSizeOfExpression(SizeOfExpressionSyntax node)
12271228

12281229
public override LuaSyntaxNode VisitStackAllocArrayCreationExpression(StackAllocArrayCreationExpressionSyntax node) {
12291230
var arrayType = node.Type.Accept<LuaArrayTypeAdapterExpressionSyntax>(this);
1230-
var array = BuildArrayCreationExpression(arrayType, node.Initializer);
1231+
var symbol = (IArrayTypeSymbol)semanticModel_.GetTypeInfo(node.Type).Type;
1232+
var array = BuildArrayCreationExpression(symbol, arrayType, node.Initializer);
12311233
return new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.StackAlloc, array);
12321234
}
12331235

‎CSharp.lua/LuaSyntaxNodeTransform.cs‎

Lines changed: 2 additions & 2 deletions

0 commit comments

Comments
 (0)