% Invoke methods

meth Invoke =^ ( ·

var count : Int ·

var index : Int ·

var Found : Boolean ·

var b : Bytecode ·

var MtdName : String ·

var MtdDescriptor : String ·

var entry : CpList ·

var e : Object ·

var objref : Object ·

var Mtd : MethodInfo ·

var objcl : ClassInfo ·

var frame : FrameInfo ·

var CurrentFrame : FrameInfo ·

TopFrame.GetFrame(CurrentFrame);

% getting the entry number of the Constant Pool

currentFrame.GetNextBytecode(b);

b.GetCode(index);

% searching the constant pool – Finding the Methodref entry

currentFrame.FindCPList(index, entry);

entry.GetInfo(e);

if [] e isExactly CpentryMethodref ®

(CpentryMethodref)e.Getcl(CPcl)

(CpentryMethodref)e.GetName(MtdName);

(CpentryMethodref)e.GetDescriptor(MtdDescriptor);

[] not(e isExactly CpentryMethodref) ® miracle

fi

% retrieving the actual class of objectref

currentFrame.Pop(Objref);

currentFrame.push(Obfref);

if [] Objref isExactly ObjectInfo ®

(ObjectInfo)Objref.Getcl(Objcl)

[] not(Objref isExactly ObjectInfo) ® miracle

fi

% Locating a method

found:= False;

Objcl.MtdLookup(Mtdname, MtdDescriptor, Mtd, Found);

% creating a new frame

frame:= new FrameInfo;

Mtd.GetfstBytecode(b);

frame.SetPC(b);

frame.SetcurrentClass(cl);

frame.SetcurrentMethod(Mtd);

% the nargs arguments are popped from the current

% operand stack. A new stack frame is created for the method

% being invoked, and the arguments are made the values of its

% first nargs local variables.

entry.Getnargs(count);

Rec Loop ·

If [] Count > 0 ®

Count: = count –1;

currentFrame.Pop(D);

Frame.AppendLocal(D);

Loop;

[] Count = 0 ® skip;

Fi

end

% pushing the new stack Frame

TopFrame.SetFrame(CurrentFrame);

TopFrame.Push(TopFrame,Frame);

end end end end end end end end end end end end end

)

end