Skip to content

Commit

Permalink
fix multi return and initial implementation of multi assign
Browse files Browse the repository at this point in the history
  • Loading branch information
NotFound committed Jun 21, 2012
1 parent 1fbb314 commit 53b8b9d
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 2 deletions.
1 change: 1 addition & 0 deletions Makefile
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ TESTS = t/base/00test.t \
t/base/02bitwiseops.t \ t/base/02bitwiseops.t \
t/base/02varcast.t \ t/base/02varcast.t \
t/base/03pmc.t t/base/03class.t \ t/base/03pmc.t t/base/03class.t \
t/base/05mreturn.t \
t/base/06localfunctions.t \ t/base/06localfunctions.t \
t/base/10closure.t \ t/base/10closure.t \
t/base/features.t t/base/features.t
Expand Down
29 changes: 29 additions & 0 deletions t/base/05mreturn.t
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,29 @@
#! winxed

// winxedxx base tests
// multi assign and multi return

using extern Test.More plan, is, ok;

function main()
{
plan(2);

int i, j;
:(i, j) = ret2();
is(i, 42, "first value of 2");
is(j, 24, "second value of 2");

}

function ret1()
{
return 7;
}

function ret2()
{
return 42, 24;
}

// End
22 changes: 20 additions & 2 deletions winxedxx.winxed
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ class IntArrayStatement;
class FloatArrayStatement; class FloatArrayStatement;
class StringArrayStatement; class StringArrayStatement;
class ConstStatement; class ConstStatement;
class MultiAssignStatement;
class ReturnStatement; class ReturnStatement;
class LabelStatement; class LabelStatement;
class BreakStatement; class BreakStatement;
Expand Down Expand Up @@ -1586,6 +1587,20 @@ function emitStatement(var out, :VarStatement st)
} }
} }


function emitStatement(var out, :MultiAssignStatement st)
{
out.print("{\n WxxObjectPtr __m_1 = ");
emit_expr(out, st.expr);
out.print(";\n");
var params = st.params.params;
int i = 0;
for (var param in params) {
var data = param.getvar();
out.print(" ", param.name, " = __m_1.get_pmc_keyed(", i++, ");\n");
}
out.print("}\n");
}

function emitStatement(var out, :LabelStatement labelst) function emitStatement(var out, :LabelStatement labelst)
{ {
out.print(labelst.name); out.print(labelst.name);
Expand Down Expand Up @@ -1785,12 +1800,15 @@ function emitStatement(var out, :ReturnStatement returnst)
emit_expr(out, expr); emit_expr(out, expr);
break; break;
default: default:
out.print(Type_PMCArray, "()"); out.print(Type_PMC, "(&((new ", Type_PMCArray, "())->");
for (int i = 0; i < nargs; ++i) { for (int i = 0; i < nargs; ++i) {
out.print(".push("); if (i)
out.print(".");
out.print("push(");
emit_expr(out, values.getfreearg(i)); emit_expr(out, values.getfreearg(i));
out.print(")"); out.print(")");
} }
out.print("))");
} }
} }


Expand Down

0 comments on commit 53b8b9d

Please sign in to comment.