-- JaMControlImpl.mesa -- Original version by John Warnock, Feb., 1979. -- Last changed by Paxton, 14-Jan-82 14:12:03 DIRECTORY JaMBasic USING [Object, Root, Tag], JaMInternal USING [Frame, FrameRecord], JaMOps USING [ACopy, AFind, AGet, APut, Array, Assert, Begin, Def, Dict, Error, ForEachInstalled, FreeCache, FreeLocals, FreeStack, Install, InstallReason, MakeName, MakeString, NewCache, NewLocals, NewStack, Pop, PopCommand, Push, Text, TryToLoad, undefname], JaMStorage USING [Prune, Zone], JaMVM USING [Check, Flush, GetRoot, PutRoot, Start]; JaMControlImpl: MONITOR LOCKS lock USING lock: POINTER TO MONITORLOCK IMPORTS JaMOps, JaMStorage, JaMVM EXPORTS JaMOps = { OPEN VM:JaMVM, JaMOps, JaMInternal, JaMBasic; -- Types and Constants initCommandSize: CARDINAL = 512; initNameSize: CARDINAL = 512; CommandEntry: TYPE = RECORD[SELECT plicit: * FROM ex => [proc: PROC[Frame]], im => [proc: PROC[]], ENDCASE]; CommandTable: TYPE = RECORD [len: CARDINAL, array: SEQUENCE max: CARDINAL OF CommandEntry]; -- Globals zone: UNCOUNTED ZONE = JaMStorage.Zone[]; root: PUBLIC LONG POINTER TO Root _ NIL; defaultFrame: PUBLIC Frame _ NIL; -- the default frame framelock: MONITORLOCK; framelist: PUBLIC Frame _ NIL; -- head of list of all frames commandlock: MONITORLOCK; commands: LONG POINTER TO CommandTable _ NIL; unregistered: name Object; -- Procedures DoCommand: PUBLIC PROC[frame: Frame, ob: command Object] = { entry: CommandEntry _ GetCommand[@commandlock,ob.index]; WITH e:entry SELECT FROM ex => e.proc[frame]; im => IF frame=defaultFrame THEN e.proc[] ELSE Unregistered[frame]; ENDCASE; }; RegisterExplicit: PUBLIC PROC[frame: Frame, text: Text, proc: PROC[Frame]] = { RegisterEntry[frame,MakeName[text],[ex[proc]]] }; RegisterImplicit: PUBLIC PROC[frame: Frame, text: Text, proc: PROC[]] = { RegisterEntry[frame,MakeName[text],[im[proc]]] }; RegisterEntry: PROC[frame: Frame, name: name Object, entry: CommandEntry] = { known: BOOLEAN; ob: Object; index: CARDINAL; [known,ob] _ TryToLoad[frame,name]; -- look up the name IF known THEN WITH ob:ob SELECT FROM command => index _ ob.index; -- use old command index ENDCASE => known _ FALSE; -- not defined as a command IF NOT known THEN { index _ NewCommand[@commandlock]; -- acquire a new index Def[frame,name,[X,command[index]]] }; -- define in current dictionary context PutCommand[@commandlock,index,name,entry]; -- enter in command table and commandArray }; NewCommand: ENTRY PROC[lock: POINTER TO MONITORLOCK] RETURNS[CARDINAL] = { ENABLE UNWIND => NULL; index: CARDINAL _ root.commandCount; -- new command index array: array Object _ root.commandArray; Assert[index=commands.len AND array.length=commands.max]; -- check consistency IF NOT index NULL; Assert[index NULL; [known,index] _ AFind[root.commandArray,name]; }; CommandName: ENTRY PROC[lock: POINTER TO MONITORLOCK, command: command Object] RETURNS[Object] = { ENABLE UNWIND => NULL; array: array Object _ root.commandArray; count: CARDINAL _ root.commandCount; i: CARDINAL _ command.index; IF i { root _ zone.NEW[Root]; }; free => { zone.FREE[@root]; }; register => { unregistered _ MakeName[".unregistered"L]; RegisterObject[frame, ".sysdict"L, root.sysDict]; -- the system dictionary RegisterObject[frame, ".true"L, [L,boolean[TRUE]]]; RegisterObject[frame, ".false"L, [L,boolean[FALSE]]]; RegisterExplicit[frame, ".commandname"L, JCommandName]; RegisterExplicit[frame, ".reregister"L, JReRegister]; -- Register a default error handler for .undefname -- Better be sure that undefname has already been registered. RegisterEntry[frame, undefname, [ex[JUndef]]]; }; ENDCASE; }; Install[InstallControl]; }. Paxton 20-Oct-81 10:25:38 made NewFrame and FreeFrame public Wyatt 22-Oct-81 10:34:08 add vmname parameter to StartJaM Wyatt 24-Oct-81 15:18:54 add maxPages parameter to StartJaM