|
This is a very simple Activation Frame.
|
cls.foo("a", 42); // Caller push 42 push "a" load [cls] push "foo" push 3 // flags = 2 arguments + this invoke pop // return value // Callee // Activation Frame // "foo" and flags (2) will be consumed by invoke clvr 0 store 0 // this = cls clvr 1 store 1 // "a" clvr 2 store 2 // 42 |
class AClass { String foo(int i) { return acdk.lang.Integer.toString(i) } } } s = acls.foo(42); push 42 load [acls] push "foo" push 2 // 2 arguments invoke store [s] |
// code sample see above ActivateFrame[0] = this ActivateFrame[1] = int i |
AClass acls = new AClass(42); int i = acls._ivar; clvr [x] load [acls] push "_ivar" push 0 // flags peekr store [i] |
Top of Stack before call ---------------------------- int Invocation flags str ClassName arg n Last Argument arg n-1 arg 0 First Argument Top of Stack after call ---------------------------- obj new created Object |
class AClass { AClass() {} } // static AClass.AClass load 0 // load this push "_init_AClass" push 0 // args+flags invoke ret // __init_AClass load 0 ret <rs> class AClass { int _var; AClass(int v) : _var(v) { } } class BClass extends AClass { public BClass(int var) : AClass(var) { } } The new already created an Object is in ActivationFrame at index 0 // __init_Bclass(int var) load 1 // argument push "__init_AClass" load 0 // this push 1 invoke pop // remove this from stack leaved by __init_AClass push 0 // push this ret // __init_AClass load 1 push "_var" load 0 // this push 0 // flags poke push 0 ret |