From 0693f3b4b4609358726991e63010921b53c938a7 Mon Sep 17 00:00:00 2001 From: Piotr Fusik Date: Thu, 9 Mar 2023 15:42:18 +0100 Subject: [PATCH] [gen] Port VisitPrefixExpr, DefineObjectLiteralTemporary. #48 --- GenBase.cs | 71 -------------------------------------- GenBaseBase.ci | 92 ++++++++++++++++++++++++++++++++++++++++++++------ Transpiled.cs | 89 +++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 162 insertions(+), 90 deletions(-) diff --git a/GenBase.cs b/GenBase.cs index 3fdea31c..a7418753 100644 --- a/GenBase.cs +++ b/GenBase.cs @@ -138,52 +138,6 @@ protected TypeCode GetTypeCode(CiType type, bool promote) } } - public override void VisitPrefixExpr(CiPrefixExpr expr, CiPriority parent) - { - switch (expr.Op) { - case CiToken.Increment: - Write("++"); - break; - case CiToken.Decrement: - Write("--"); - break; - case CiToken.Minus: - WriteChar('-'); - // FIXME: - --foo[bar] - if (expr.Inner is CiPrefixExpr inner && (inner.Op == CiToken.Minus || inner.Op == CiToken.Decrement)) - WriteChar(' '); - break; - case CiToken.Tilde: - WriteChar('~'); - break; - case CiToken.ExclamationMark: - WriteChar('!'); - break; - case CiToken.New: - CiDynamicPtrType dynamic = (CiDynamicPtrType) expr.Type; - if (dynamic.Class.Id == CiId.ArrayPtrClass) - WriteNewArray(dynamic.GetElementType(), expr.Inner, parent); - else if (expr.Inner is CiAggregateInitializer init) { - int tempId = this.CurrentTemporaries.IndexOf(expr); - if (tempId >= 0) { - Write("citemp"); - VisitLiteralLong(tempId); - } - else - WriteNewWithFields(dynamic, init); - } - else - WriteNew(dynamic, parent); - return; - case CiToken.Resource: - WriteResource(((CiLiteralString) expr.Inner).Value, ((CiArrayStorageType) expr.Type).Length); - return; - default: - throw new ArgumentException(expr.Op.ToString()); - } - expr.Inner.Accept(this, CiPriority.Primary); - } - protected bool WriteRegexOptions(List args, string prefix, string separator, string suffix, string i, string m, string s) { CiExpr expr = args[args.Count - 1]; @@ -208,31 +162,6 @@ protected bool WriteRegexOptions(List args, string prefix, string separa Write(suffix); return true; } - - protected override void DefineObjectLiteralTemporary(CiUnaryExpr expr) // TODO: virtual - { - if (expr.Inner is CiAggregateInitializer init) { - EnsureChildBlock(); - int id = this.CurrentTemporaries.IndexOf(expr.Type); - if (id < 0) { - id = this.CurrentTemporaries.Count; - StartTemporaryVar(expr.Type); - this.CurrentTemporaries.Add(expr); - } - else - this.CurrentTemporaries[id] = expr; - Write("citemp"); - VisitLiteralLong(id); - Write(" = "); - WriteNew((CiDynamicPtrType) expr.Type, CiPriority.Argument); - EndStatement(); - foreach (CiBinaryExpr field in init.Items) { - Write("citemp"); - VisitLiteralLong(id); - WriteAggregateInitField(expr, field); - } - } - } } } diff --git a/GenBaseBase.ci b/GenBaseBase.ci index 7a2d1ee3..eb585b3b 100644 --- a/GenBaseBase.ci +++ b/GenBaseBase.ci @@ -29,7 +29,7 @@ public abstract class GenBaseBase : CiExprVisitor bool InChildBlock = false; protected CiMethodBase? CurrentMethod = null; protected HashSet() WrittenClasses; - protected List() CurrentTemporaries; // CiExpr or CiType + protected List() CurrentTemporaries; // CiExpr or CiType protected override CiContainerType GetCurrentContainer() { @@ -656,9 +656,9 @@ public abstract class GenBaseBase : CiExprVisitor protected void WriteObjectLiteral!(CiAggregateInitializer init, string separator) { string prefix = " { "; - foreach (CiExpr expr in init.Items) { + foreach (CiExpr item in init.Items) { Write(prefix); - assert expr is CiBinaryExpr assign; + assert item is CiBinaryExpr assign; assert assign.Left is CiSymbolReference field; WriteName(field.Symbol); Write(separator); @@ -676,8 +676,9 @@ public abstract class GenBaseBase : CiExprVisitor return expr is CiAggregateInitializer init ? init : null; } - protected void WriteAggregateInitField!(CiExpr obj, CiBinaryExpr assign) // TODO: private + void WriteAggregateInitField!(CiExpr obj, CiExpr item) { + assert item is CiBinaryExpr assign; assert assign.Left is CiSymbolReference field; WriteMemberOp(obj, field); WriteName(field.Symbol); @@ -690,10 +691,9 @@ public abstract class GenBaseBase : CiExprVisitor { CiAggregateInitializer? init = GetAggregateInitializer(def); if (init != null) { - foreach (CiExpr expr in init.Items) { + foreach (CiExpr item in init.Items) { WriteLocalName(def, CiPriority.Primary); - assert expr is CiBinaryExpr assign; - WriteAggregateInitField(def, assign); + WriteAggregateInitField(def, item); } } } @@ -735,6 +735,54 @@ public abstract class GenBaseBase : CiExprVisitor protected abstract void WriteResource!(string name, int length); + public override void VisitPrefixExpr!(CiPrefixExpr expr, CiPriority parent) + { + switch (expr.Op) { + case CiToken.Increment: + Write("++"); + break; + case CiToken.Decrement: + Write("--"); + break; + case CiToken.Minus: + WriteChar('-'); + // FIXME: - --foo[bar] + if (expr.Inner is CiPrefixExpr inner && (inner.Op == CiToken.Minus || inner.Op == CiToken.Decrement)) + WriteChar(' '); + break; + case CiToken.Tilde: + WriteChar('~'); + break; + case CiToken.ExclamationMark: + WriteChar('!'); + break; + case CiToken.New: + assert expr.Type is CiDynamicPtrType dynamic; + if (dynamic.Class.Id == CiId.ArrayPtrClass) + WriteNewArray(dynamic.GetElementType(), expr.Inner, parent); + else if (expr.Inner is CiAggregateInitializer init) { + int tempId = this.CurrentTemporaries.IndexOf(expr); + if (tempId >= 0) { + Write("citemp"); + VisitLiteralLong(tempId); + } + else + WriteNewWithFields(dynamic, init); + } + else + WriteNew(dynamic, parent); + return; + case CiToken.Resource: + assert expr.Inner is CiLiteralString name; + assert expr.Type is CiArrayStorageType array; + WriteResource(name.Value, array.Length); + return; + default: + assert false; + } + expr.Inner.Accept(this, CiPriority.Primary); + } + public override void VisitPostfixExpr!(CiPostfixExpr expr, CiPriority parent) { expr.Inner.Accept(this, CiPriority.Primary); @@ -1107,7 +1155,31 @@ public abstract class GenBaseBase : CiExprVisitor protected abstract void StartTemporaryVar!(CiType type); - protected abstract void DefineObjectLiteralTemporary!(CiUnaryExpr expr); + protected virtual void DefineObjectLiteralTemporary!(CiUnaryExpr expr) + { + if (expr.Inner is CiAggregateInitializer init) { + EnsureChildBlock(); + int id = this.CurrentTemporaries.IndexOf(expr.Type); + if (id < 0) { + id = this.CurrentTemporaries.Count; + StartTemporaryVar(expr.Type); + this.CurrentTemporaries.Add(expr); + } + else + this.CurrentTemporaries[id] = expr; + Write("citemp"); + VisitLiteralLong(id); + Write(" = "); + assert expr.Type is CiDynamicPtrType dynamic; + WriteNew(dynamic, CiPriority.Argument); + EndStatement(); + foreach (CiExpr item in init.Items) { + Write("citemp"); + VisitLiteralLong(id); + WriteAggregateInitField(expr, item); + } + } + } protected void WriteTemporaries!(CiExpr expr) { @@ -1121,8 +1193,8 @@ public abstract class GenBaseBase : CiExprVisitor } break; case CiAggregateInitializer init: - foreach (CiExpr assignExpr in init.Items) { - assert assignExpr is CiBinaryExpr assign; + foreach (CiExpr item in init.Items) { + assert item is CiBinaryExpr assign; WriteTemporaries(assign.Right); } break; diff --git a/Transpiled.cs b/Transpiled.cs index 744fe09c..859b97ae 100644 --- a/Transpiled.cs +++ b/Transpiled.cs @@ -6795,9 +6795,9 @@ public override void VisitVar(CiVar expr) protected void WriteObjectLiteral(CiAggregateInitializer init, string separator) { string prefix = " { "; - foreach (CiExpr expr in init.Items) { + foreach (CiExpr item in init.Items) { Write(prefix); - CiBinaryExpr assign = (CiBinaryExpr) expr; + CiBinaryExpr assign = (CiBinaryExpr) item; CiSymbolReference field = (CiSymbolReference) assign.Left; WriteName(field.Symbol); Write(separator); @@ -6815,8 +6815,9 @@ protected static CiAggregateInitializer GetAggregateInitializer(CiNamedValue def return expr is CiAggregateInitializer init ? init : null; } - protected void WriteAggregateInitField(CiExpr obj, CiBinaryExpr assign) + void WriteAggregateInitField(CiExpr obj, CiExpr item) { + CiBinaryExpr assign = (CiBinaryExpr) item; CiSymbolReference field = (CiSymbolReference) assign.Left; WriteMemberOp(obj, field); WriteName(field.Symbol); @@ -6829,10 +6830,9 @@ protected virtual void WriteInitCode(CiNamedValue def) { CiAggregateInitializer init = GetAggregateInitializer(def); if (init != null) { - foreach (CiExpr expr in init.Items) { + foreach (CiExpr item in init.Items) { WriteLocalName(def, CiPriority.Primary); - CiBinaryExpr assign = (CiBinaryExpr) expr; - WriteAggregateInitField(def, assign); + WriteAggregateInitField(def, item); } } } @@ -6874,6 +6874,53 @@ protected void OpenLoop(string intString, int nesting, int count) protected abstract void WriteResource(string name, int length); + public override void VisitPrefixExpr(CiPrefixExpr expr, CiPriority parent) + { + switch (expr.Op) { + case CiToken.Increment: + Write("++"); + break; + case CiToken.Decrement: + Write("--"); + break; + case CiToken.Minus: + WriteChar('-'); + if (expr.Inner is CiPrefixExpr inner && (inner.Op == CiToken.Minus || inner.Op == CiToken.Decrement)) + WriteChar(' '); + break; + case CiToken.Tilde: + WriteChar('~'); + break; + case CiToken.ExclamationMark: + WriteChar('!'); + break; + case CiToken.New: + CiDynamicPtrType dynamic = (CiDynamicPtrType) expr.Type; + if (dynamic.Class.Id == CiId.ArrayPtrClass) + WriteNewArray(dynamic.GetElementType(), expr.Inner, parent); + else if (expr.Inner is CiAggregateInitializer init) { + int tempId = this.CurrentTemporaries.IndexOf(expr); + if (tempId >= 0) { + Write("citemp"); + VisitLiteralLong(tempId); + } + else + WriteNewWithFields(dynamic, init); + } + else + WriteNew(dynamic, parent); + return; + case CiToken.Resource: + CiLiteralString name = (CiLiteralString) expr.Inner; + CiArrayStorageType array = (CiArrayStorageType) expr.Type; + WriteResource(name.Value, array.Length); + return; + default: + throw new NotImplementedException(); + } + expr.Inner.Accept(this, CiPriority.Primary); + } + public override void VisitPostfixExpr(CiPostfixExpr expr, CiPriority parent) { expr.Inner.Accept(this, CiPriority.Primary); @@ -7242,7 +7289,31 @@ protected void EnsureChildBlock() protected abstract void StartTemporaryVar(CiType type); - protected abstract void DefineObjectLiteralTemporary(CiUnaryExpr expr); + protected virtual void DefineObjectLiteralTemporary(CiUnaryExpr expr) + { + if (expr.Inner is CiAggregateInitializer init) { + EnsureChildBlock(); + int id = this.CurrentTemporaries.IndexOf(expr.Type); + if (id < 0) { + id = this.CurrentTemporaries.Count; + StartTemporaryVar(expr.Type); + this.CurrentTemporaries.Add(expr); + } + else + this.CurrentTemporaries[id] = expr; + Write("citemp"); + VisitLiteralLong(id); + Write(" = "); + CiDynamicPtrType dynamic = (CiDynamicPtrType) expr.Type; + WriteNew(dynamic, CiPriority.Argument); + EndStatement(); + foreach (CiExpr item in init.Items) { + Write("citemp"); + VisitLiteralLong(id); + WriteAggregateInitField(expr, item); + } + } + } protected void WriteTemporaries(CiExpr expr) { @@ -7256,8 +7327,8 @@ protected void WriteTemporaries(CiExpr expr) } break; case CiAggregateInitializer init: - foreach (CiExpr assignExpr in init.Items) { - CiBinaryExpr assign = (CiBinaryExpr) assignExpr; + foreach (CiExpr item in init.Items) { + CiBinaryExpr assign = (CiBinaryExpr) item; WriteTemporaries(assign.Right); } break;