For reference, here's the bytecode for tak in Erjang [JAD'ed bytecode
even further below].

In the actual generated code, it moves things around quite a bit in
local variables, but that is because of the way I translate BEAM to
JVM by keeping a "stack" in the local variables.  All function calls
then do aload_0, aload_1, ... aload_N before a function call with
N-1.  I'm assuming that the JVM will see through all these register
moves and optimize them away.

tak is very easy to translate for Erjang, because a simple local
analysis says that it doesn't suspend.  So because of that it
generates very straightforward code.  This is often the case for
"leafs" in the call graph.

Except for all the extra moving things around in variables, this is
what it does.  The only "issue" with this is that Erjang cannot
suspend the thread while running in this loop (i.e. Kilim is not
pushed on this code).  The check_exit() at the end of the loop is
there to make sure I can kill the process.  is_ge() and dec()
[decrement] are native method on EObject.

static EObject tak(EProc proc, EObject X, EObject Y, EObject Z)
{
  do {
     if (Y.is_ge(X)) { return Z; }
     EObject X1 = tak(proc, X.dec(), Y, Z);
     EObject Y1 = tak(proc, Y.dec(), Z, X);
     EObject Z1 = tak(proc, Z.dec(), X, Y);
     X = X1; Y = Y1; Z = Z1;
     proc.check_exit();
  } while (true);
}

Kresten



-----[actual generated code]----
Method name:"tak__3" public static Signature:
(erjang.EProc,erjang.EObject,erjang.EObject,erjang.EObject)erjang.EObject
Attribute "Code", length:170, max_stack:4, max_locals:9, code_length:
138
  0: goto 3
  3: aload_2
  4: aload_1
  5: invokevirtual <Method erjang.EObject.is_ge
(erjang.EObject)boolean>
  8: ifeq 15
 11: aload_3
 12: astore_1
 13: aload_1
 14: areturn
 15: getstatic <Field erjang.ERT.NIL erjang.ENil>
 18: dup
 19: nop
 20: astore 5
 22: dup
 23: nop
 24: astore 6
 26: dup
 27: nop
 28: astore 7
 30: nop
 31: astore 8
 33: aload_1
 34: invokevirtual <Method erjang.EObject.dec ()erjang.EObject>
 37: astore 4
 39: aload_1
 40: astore 5
 42: aload 4
 44: astore_1
 45: aload_3
 46: astore 7
 48: aload_2
 49: astore 6
 51: aload_0
 52: aload_1
 53: aload_2
 54: aload_3
 55: invokestatic <Method erjang.m.bench_tak.bench_tak.tak__3
(erjang.EProc,erjang.EObject,erjang.EObject,erjang.EObject)erjang.EObject>
 58: astore_1
 59: aload 6
 61: invokevirtual <Method erjang.EObject.dec ()erjang.EObject>
 64: astore_2
 65: aload_1
 66: astore 8
 68: aload 5
 70: astore_3
 71: aload_2
 72: astore_1
 73: aload 7
 75: astore_2
 76: aload_0
 77: aload_1
 78: aload_2
 79: aload_3
 80: invokestatic <Method erjang.m.bench_tak.bench_tak.tak__3
(erjang.EProc,erjang.EObject,erjang.EObject,erjang.EObject)erjang.EObject>
 83: astore_1
 84: aload 7
 86: invokevirtual <Method erjang.EObject.dec ()erjang.EObject>
 89: astore_2
 90: aload_1
 91: astore 4 93: aload 6
 95: astore_3
 96: aload_2
 97: astore_1
 98: aload 5
100: astore_2
101: aload 4
103: astore 5
105: getstatic <Field erjang.ERT.NIL erjang.ENil>
108: astore 7
110: getstatic <Field erjang.ERT.NIL erjang.ENil>
113: astore 6
115: aload_0
116: aload_1
117: aload_2
118: aload_3
119: invokestatic <Method erjang.m.bench_tak.bench_tak.tak__3
(erjang.EProc,erjang.EObject,erjang.EObject,erjang.EObject)erjang.EObject>
122: astore_1
123: aload 5
125: astore_2
126: aload_1
127: astore_3
128: aload 8
130: astore_1
131: aload_0
132: invokevirtual <Method erjang.EProc.check_exit ()void>
135: goto 3

Here's the JAD'ed version of the same code.

    public static EObject tak__3(EProc eproc, EObject eobject, EObject
eobject1, EObject eobject2)
    {
        do
        {
            if(eobject1.is_ge(eobject))
            {
                eobject = eobject2;
                return eobject;
            }
            EObject obj;
            EObject obj1;
            EObject obj2;
            EObject obj3 = obj2 = obj1 = obj = ERT.NIL;
            EObject eobject3 = eobject.dec();
            obj = eobject;
            eobject = eobject3;
            obj2 = eobject2;
            obj1 = eobject1;
            eobject = tak__3(eproc, eobject, eobject1, eobject2);
            eobject1 = obj1.dec();
            obj3 = eobject;
            eobject2 = obj;
            eobject = eobject1;
            eobject1 = obj2;
            eobject = tak__3(eproc, eobject, eobject1, eobject2);
            eobject1 = obj2.dec();
            eobject3 = eobject;
            eobject2 = obj1;
            eobject = eobject1;
            eobject1 = obj;
            obj = eobject3;
            obj2 = ERT.NIL;
            obj1 = ERT.NIL;
            eobject = tak__3(eproc, eobject, eobject1, eobject2);
            eobject1 = obj;
            eobject2 = eobject;
            eobject = obj3;
            eproc.check_exit();
        } while(true);
    }

-- 
You received this message because you are subscribed to the Google Groups "JVM 
Languages" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/jvm-languages?hl=en.

Reply via email to