-- FuglemanImpl.mesa -- Last changed by Doug Wyatt, September 6, 1980 11:38 AM DIRECTORY Fugleman, Memory USING [Zone]; FuglemanImpl: PROGRAM IMPORTS Memory EXPORTS Fugleman SHARES Fugleman = { OPEN Fugleman; zone: UNCOUNTED ZONE = Memory.Zone[]; Data: PUBLIC TYPE = RECORD [ foo: INTEGER, count: CARDINAL, flag: BOOLEAN ]; DataRef: TYPE = LONG POINTER TO Data; procs: LONG POINTER TO READONLY Procs = zone.NEW[Procs = [ Mumble: CMumble, Copy: CCopy, Free: CFree ]]; -- Procedure for creating a Fugleman object New: PUBLIC PROC[foo: INTEGER] RETURNS[Handle] = { d: DataRef = zone.NEW[Data _ [ foo: foo, count: 0, flag: TRUE ]]; RETURN[zone.NEW[Object _ [procs: procs, data: d]]]; }; -- Operations on a Fugleman CMumble: PROC[self: Handle] = { d: DataRef=self.data; -- refer to instance data as d.foo, d.count, etc. }; CCopy: PROC[self: Handle] RETURNS[Handle] = { d: DataRef=self.data; dd: DataRef = zone.NEW[Data _ d^]; -- *** copy any referents of d RETURN[zone.NEW[Object _ [procs: self.procs, data: dd]]]; }; CFree: PROC[selfPtr: LONG POINTER TO Handle] = { self: Handle_selfPtr^; d: DataRef_self.data; selfPtr^_NIL; -- *** free any referents of d zone.FREE[@d]; zone.FREE[@self]; }; }.(670)