<> <> <> DIRECTORY PrincOps USING [ ControlLink, EPRange, GFT, GFTItem, GlobalFrameHandle, SD, sGFTLength, UnboundLink], RemotePrincOpsUtils USING [], RuntimeError USING [UnboundProcedure], WorldVM USING [ShortAddress, World, Read, Long]; RemoteFrameImpl: PROGRAM IMPORTS RuntimeError, WorldVM EXPORTS RemotePrincOpsUtils = BEGIN OPEN PrincOps, WorldVM; <> RemoteGlobalFrame: PUBLIC SAFE PROC [world: World, link: --ControlLink--UNSPECIFIED] RETURNS [gf: GlobalFrameHandle] = TRUSTED { DO OPEN l: LOOPHOLE[link, ControlLink]; SELECT TRUE FROM l = UnboundLink => link _ SIGNAL RuntimeError.UnboundProcedure[link]; l.proc => IF l.gfi IN [1..LOOPHOLE[Read[world, Long[world, LOOPHOLE[SD + sGFTLength, ShortAddress]]], NAT]) THEN { gftItem: GFTItem _ LOOPHOLE[Read[world, Long[world, LOOPHOLE[GFT + l.gfi, ShortAddress]]], GFTItem]; <> gftItem.epbias _ 0; RETURN[gftItem.framePtr] } ELSE RETURN[NIL]; l.indirect => link _ Read[world, Long[world, LOOPHOLE[l.link, ShortAddress]]]; link = 0 => RETURN[NIL]; ENDCASE => RETURN[LOOPHOLE[Read[world, Long[world, LOOPHOLE[l.frame, ShortAddress]]]]]; <> ENDLOOP; }; RemoteGlobalFrameAndEntryPoint: PUBLIC SAFE PROC [world: World, link: --ControlLink--UNSPECIFIED] RETURNS [gf: GlobalFrameHandle, ep: CARDINAL] = TRUSTED { DO OPEN l: LOOPHOLE[link, ControlLink]; SELECT TRUE FROM l = UnboundLink => link _ SIGNAL RuntimeError.UnboundProcedure[link]; l.proc => IF l.gfi IN [1..LOOPHOLE[Read[world, Long[world, LOOPHOLE[SD + sGFTLength, ShortAddress]]], NAT]) THEN { gftItem: GFTItem _ LOOPHOLE[Read[world, Long[world, LOOPHOLE[GFT + l.gfi, ShortAddress]]], GFTItem]; <> ep _ gftItem.epbias*EPRange+l.ep; gftItem.epbias _ 0; RETURN[gf: gftItem.framePtr, ep: ep] } ELSE ERROR; l.indirect => link _ Read[world, Long[world, LOOPHOLE[l.link, ShortAddress]]]; ENDCASE => ERROR; -- not meaningful for type-0 control links ENDLOOP; }; END.