<> <> <> <> <> 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: WORD] RETURNS [gf: GlobalFrameHandle] = TRUSTED { l: ControlLink _ LOOPHOLE[link]; DO SELECT TRUE FROM l = UnboundLink => l _ SIGNAL RuntimeError.UnboundProcedure[l]; 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 => l _ LOOPHOLE[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: WORD] RETURNS [gf: GlobalFrameHandle, ep: CARDINAL] = TRUSTED { l: ControlLink _ LOOPHOLE[link, ControlLink]; DO SELECT TRUE FROM l = UnboundLink => l _ SIGNAL RuntimeError.UnboundProcedure[l]; 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 => l _ LOOPHOLE[Read[world, Long[world, LOOPHOLE[l.link, ShortAddress]]]]; ENDCASE => ERROR; <> ENDLOOP; }; END.