DIRECTORY Basics, CardTab, UXProcs; UXProcsImpl: CEDAR PROGRAM IMPORTS Basics, CardTab EXPORTS UXProcs ~ BEGIN OPEN UXProcs; ProcDescritorPtr: TYPE = POINTER TO ProcDescritorBody; ProcDescritorBody: TYPE = RECORD [proc: CProc, data: WORD ¬ 0]; FromCedarProc: PUBLIC PROC [proc: PROC ANY RETURNS ANY] RETURNS [CProc] = TRUSTED { ptr: ProcDescritorPtr = LOOPHOLE[proc]; IF ptr=NIL THEN RETURN [0]; IF ptr.data#0 THEN ERROR; --proc is not a global procedure RETURN [ptr.proc]; }; descriptorTable: CardTab.Ref ¬ CardTab.Create[]; ToCedarProc: PUBLIC PROC [cp: CProc] RETURNS [UnsafeCedarProc¬LOOPHOLE[NIL]] = TRUSTED { IF cp#0 THEN { x: REF ANY ¬ CardTab.Fetch[descriptorTable, LOOPHOLE[cp]].val; IF x#NIL THEN RETURN [LOOPHOLE[x]]; IF Basics.BITAND[cp, 3]#0 THEN ERROR; --this can't be a procedure variable on sun [] ¬ CardTab.Insert[descriptorTable, LOOPHOLE[cp], NEW[ProcDescritorBody¬[cp]]]; RETURN [LOOPHOLE[CardTab.Fetch[descriptorTable, LOOPHOLE[cp]].val]] }; }; END. & UXProcsImpl.mesa Copyright Σ 1988, 1991 by Xerox Corporation. All rights reserved. Created by Christian Jacobi, May 23, 1988 2:54:08 pm PDT Christian Jacobi, May 23, 1988 2:54:11 pm PDT Willie-s, August 5, 1991 4:09 pm PDT finite: because there are only a finite number of C procedures Κ•NewlineDelimiter –(cedarcode) style™šœ™Icodešœ Οeœ7™BK™8K™-K™$—K˜šΟk ˜ Kšœ˜Kšœ˜Kšœ˜K˜—šΠbl œžœž˜Kšžœ˜Kšžœ˜—šœž œ˜K˜—Kšœžœžœžœ˜6Kšœžœžœžœ˜?K˜šΟn œž œžœžœžœžœžœ žœ˜SKšœžœ˜'Kšžœžœžœžœ˜Kšžœ žœžœΟc ˜:Kšžœ ˜K˜—K˜šœ0˜0Kšœ>™>—K˜š   œž œ žœžœžœžœ˜Xšžœžœ˜Kšœžœžœ"žœ ˜>Kš žœžœžœžœžœ˜$Kš žœžœ žœžœ‘+˜QKšœ%žœžœ˜PKšžœžœ žœ ˜CKšœ˜—K˜—K˜Kšžœ˜K˜—…—Τ