Skip to content

Commit 59b462b

Browse files
authored
Optimize IronPython.Compiler.Ast.Arg (#1169)
1 parent a4a414c commit 59b462b

File tree

3 files changed

+26
-26
lines changed

3 files changed

+26
-26
lines changed

Src/IronPython/Compiler/Ast/Arg.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,33 @@
88

99
namespace IronPython.Compiler.Ast {
1010
public class Arg : Node {
11+
private static readonly Argument _listTypeArgument = new(ArgumentType.List);
12+
private static readonly Argument _dictTypeArgument = new(ArgumentType.Dictionary);
13+
1114
public Arg(Expression expression) : this(null, expression) { }
1215

1316
public Arg(string? name, Expression expression) {
1417
Name = name;
1518
Expression = expression;
19+
20+
ArgumentInfo = name switch {
21+
null => Argument.Simple,
22+
"*" => _listTypeArgument,
23+
"**" => _dictTypeArgument,
24+
_ => new Argument(name)
25+
};
1626
}
1727

1828
public string? Name { get; }
1929

2030
public Expression Expression { get; }
2131

32+
internal Argument ArgumentInfo { get; }
33+
2234
public override string ToString() {
2335
return base.ToString() + ":" + Name;
2436
}
2537

26-
internal Argument GetArgumentInfo() {
27-
if (Name == null) {
28-
return Argument.Simple;
29-
} else if (Name == "*") {
30-
return new Argument(ArgumentType.List);
31-
} else if (Name == "**") {
32-
return new Argument(ArgumentType.Dictionary);
33-
} else {
34-
return new Argument(Name);
35-
}
36-
}
37-
3838
public override void Walk(PythonWalker walker) {
3939
if (walker.Walk(this)) {
4040
Expression?.Walk(walker);

Src/IronPython/Compiler/Ast/CallExpression.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ public override MSAst.Expression Reduce() {
7777
if (firstListPos > 0) {
7878
foreach (var arg in args) {
7979
if (i == firstListPos) break;
80-
Debug.Assert(arg.GetArgumentInfo().Kind == ArgumentType.Simple);
81-
kinds[i] = arg.GetArgumentInfo();
80+
Debug.Assert(arg.ArgumentInfo.Kind == ArgumentType.Simple);
81+
kinds[i] = arg.ArgumentInfo;
8282
values[i + 2] = arg.Expression;
8383
i++;
8484
}
@@ -87,16 +87,16 @@ public override MSAst.Expression Reduce() {
8787
// unpack list arguments
8888
if (numList > 0) {
8989
var arg = args[firstListPos];
90-
Debug.Assert(arg.GetArgumentInfo().Kind == ArgumentType.List);
91-
kinds[i] = arg.GetArgumentInfo();
90+
Debug.Assert(arg.ArgumentInfo.Kind == ArgumentType.List);
91+
kinds[i] = arg.ArgumentInfo;
9292
values[i + 2] = UnpackListHelper(args, firstListPos);
9393
i++;
9494
}
9595

9696
// add named arguments
9797
if (Kwargs.Count != numDict) {
9898
foreach (var arg in Kwargs) {
99-
var info = arg.GetArgumentInfo();
99+
var info = arg.ArgumentInfo;
100100
if (info.Kind == ArgumentType.Named) {
101101
kinds[i] = info;
102102
values[i + 2] = arg.Expression;
@@ -108,8 +108,8 @@ public override MSAst.Expression Reduce() {
108108
// unpack dict arguments
109109
if (numDict > 0) {
110110
var arg = Kwargs[firstDictPos];
111-
Debug.Assert(arg.GetArgumentInfo().Kind == ArgumentType.Dictionary);
112-
kinds[i] = arg.GetArgumentInfo();
111+
Debug.Assert(arg.ArgumentInfo.Kind == ArgumentType.Dictionary);
112+
kinds[i] = arg.ArgumentInfo;
113113
values[i + 2] = UnpackDictHelper(Parent.LocalContext, Kwargs, numDict, firstDictPos);
114114
}
115115

@@ -126,7 +126,7 @@ static void ScanArgs(IReadOnlyList<Arg> args, ArgumentType scanForType, out int
126126

127127
for (var i = args.Count - 1; i >= 0; i--) {
128128
var arg = args[i];
129-
var info = arg.GetArgumentInfo();
129+
var info = arg.ArgumentInfo;
130130
if (info.Kind == scanForType) {
131131
firstArgPos = i;
132132
numArgs++;
@@ -136,7 +136,7 @@ static void ScanArgs(IReadOnlyList<Arg> args, ArgumentType scanForType, out int
136136

137137
static MSAst.Expression UnpackListHelper(IReadOnlyList<Arg> args, int firstListPos) {
138138
Debug.Assert(args.Count > 0);
139-
Debug.Assert(args[firstListPos].GetArgumentInfo().Kind == ArgumentType.List);
139+
Debug.Assert(args[firstListPos].ArgumentInfo.Kind == ArgumentType.List);
140140

141141
if (args.Count - firstListPos == 1) return args[firstListPos].Expression;
142142

@@ -145,7 +145,7 @@ static MSAst.Expression UnpackListHelper(IReadOnlyList<Arg> args, int firstListP
145145
expressions.Add(Expression.Assign(varExpr, Expression.Call(AstMethods.MakeEmptyList)));
146146
for (int i = firstListPos; i < args.Count; i++) {
147147
var arg = args[i];
148-
if (arg.GetArgumentInfo().Kind == ArgumentType.List) {
148+
if (arg.ArgumentInfo.Kind == ArgumentType.List) {
149149
expressions.Add(Expression.Call(AstMethods.ListExtend, varExpr, AstUtils.Convert(arg.Expression, typeof(object))));
150150
} else {
151151
expressions.Add(Expression.Call(AstMethods.ListAppend, varExpr, AstUtils.Convert(arg.Expression, typeof(object))));
@@ -158,7 +158,7 @@ static MSAst.Expression UnpackListHelper(IReadOnlyList<Arg> args, int firstListP
158158
static MSAst.Expression UnpackDictHelper(MSAst.Expression context, IReadOnlyList<Arg> kwargs, int numDict, int firstDictPos) {
159159
Debug.Assert(kwargs.Count > 0);
160160
Debug.Assert(0 < numDict && numDict <= kwargs.Count);
161-
Debug.Assert(kwargs[firstDictPos].GetArgumentInfo().Kind == ArgumentType.Dictionary);
161+
Debug.Assert(kwargs[firstDictPos].ArgumentInfo.Kind == ArgumentType.Dictionary);
162162

163163
if (numDict == 1) return kwargs[firstDictPos].Expression;
164164

@@ -167,7 +167,7 @@ static MSAst.Expression UnpackDictHelper(MSAst.Expression context, IReadOnlyList
167167
expressions.Add(Expression.Assign(varExpr, Expression.Call(AstMethods.MakeEmptyDict)));
168168
for (int i = firstDictPos; i < kwargs.Count; i++) {
169169
var arg = kwargs[i];
170-
if (arg.GetArgumentInfo().Kind == ArgumentType.Dictionary) {
170+
if (arg.ArgumentInfo.Kind == ArgumentType.Dictionary) {
171171
expressions.Add(Expression.Call(AstMethods.DictMerge, context, varExpr, arg.Expression));
172172
}
173173
}
@@ -190,7 +190,7 @@ void IInstructionProvider.AddInstructions(LightCompiler compiler) {
190190
}
191191

192192
for (int i = 0; i < args.Count; i++) {
193-
if (!args[i].GetArgumentInfo().IsSimple) {
193+
if (!args[i].ArgumentInfo.IsSimple) {
194194
compiler.Compile(Reduce());
195195
return;
196196
}

Src/IronPython/Compiler/Parser.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,7 @@ private ClassDefinition ParseClassDef() {
10131013
var keywords = new List<Arg>();
10141014
if (MaybeEat(TokenKind.LeftParenthesis)) {
10151015
foreach (var arg in FinishArgumentList(null)) {
1016-
var info = arg.GetArgumentInfo();
1016+
var info = arg.ArgumentInfo;
10171017
if (info.Kind == Microsoft.Scripting.Actions.ArgumentType.Simple) {
10181018
bases.Add(arg.Expression);
10191019
} else if (info.Kind == Microsoft.Scripting.Actions.ArgumentType.Named) {

0 commit comments

Comments
 (0)