Skip to content

Commit

Permalink
[gen] Port VisitPrefixExpr, DefineObjectLiteralTemporary.
Browse files Browse the repository at this point in the history
  • Loading branch information
pfusik committed Mar 9, 2023
1 parent 39b38d3 commit 0693f3b
Show file tree
Hide file tree
Showing 3 changed files with 162 additions and 90 deletions.
71 changes: 0 additions & 71 deletions GenBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<CiExpr> args, string prefix, string separator, string suffix, string i, string m, string s)
{
CiExpr expr = args[args.Count - 1];
Expand All @@ -208,31 +162,6 @@ protected bool WriteRegexOptions(List<CiExpr> 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);
}
}
}
}

}
92 changes: 82 additions & 10 deletions GenBaseBase.ci
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public abstract class GenBaseBase : CiExprVisitor
bool InChildBlock = false;
protected CiMethodBase? CurrentMethod = null;
protected HashSet<CiClass>() WrittenClasses;
protected List<CiExpr#>() CurrentTemporaries; // CiExpr or CiType
protected List<CiExpr>() CurrentTemporaries; // CiExpr or CiType

protected override CiContainerType GetCurrentContainer()
{
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
}
}
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
{
Expand All @@ -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;
Expand Down
89 changes: 80 additions & 9 deletions Transpiled.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
}
}
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
{
Expand All @@ -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;
Expand Down

0 comments on commit 0693f3b

Please sign in to comment.