From aba9cfb2a85dd42f22f6784a418f9b7c82b82d69 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Wed, 28 Dec 2016 10:56:09 -0500 Subject: [PATCH] Implement UGET. Allows simple closures, for example: function f(x) return function() return x end end y = f(1) print(y()) -- prints 1 --- src/vm_s390x.dasc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/vm_s390x.dasc b/src/vm_s390x.dasc index c862e427..7754c45f 100644 --- a/src/vm_s390x.dasc +++ b/src/vm_s390x.dasc @@ -1970,8 +1970,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | stg r0, 0(r0) break; case BC_UGET: - | stg r0, 0(r0) - | stg r0, 0(r0) + | ins_AD // RA = dst, RD = upvalue # + | sllg RA, RA, 3(r0) + | sllg RD, RD, 3(r0) + | lg LFUNC:RB, -16(BASE) + | cleartp LFUNC:RB + | lg UPVAL:RB, (offsetof(GCfuncL, uvptr))(RD, LFUNC:RB) + | lg RB, UPVAL:RB->v + | lg RD, 0(RB) + | stg RD, 0(RA, BASE) + | ins_next break; case BC_USETV: | stg r0, 0(r0)