[Oberon] Fw: FPGA - Bitmaps.Mod

Jörg Straube joerg.straube at iaeth.ch
Wed Apr 12 08:05:50 CEST 2017

Hi Tomas

I refined the module "Bitmaps" a little bit. This code allocates variably
sized bitmaps and makes sure the garbage collector collects them if no
longer referenced. As Andreas pointed out: it is the responsibility of the
module using "Bitmaps" to make the bitmaps globally reachable. If not, the
allocated memory gets freed up more or less immediately...

I compiled the code with the emulator on a Mac

MODULE Bitmaps; (* jr/11apr17 *)

IMPORT SYSTEM, Kernel := KernelOSX;

TypeTag = RECORD size, ext1, ext2, ext3, offset: INTEGER END; (* see
Project Oberon, figure 8.8 *)
Address = POINTER TO RECORD END; (* this pointer will be redefined by
TypeTag *)
width, height: INTEGER;
tag: TypeTag; (* type descriptor of the pointer "base" *)
base: Address

PROCEDURE New*(w, h: INTEGER): Bitmap;
VAR b: Bitmap;
b.width := w; b.height := h;

(* the following code defines a type tag corresponding to ARRAY size OF

b.tag.size := (w+7) DIV 8 * h; (* size of the bitmap in BYTEs *)
b.tag.offset := -1;   (* type has no pointers, important for GC *)
(* allocate memory and define its type *)
Kernel.New(SYSTEM.VAL(INTEGER, b.base), SYSTEM.ADR(b.tag));

IF b.base = NIL THEN b := NIL END
END New;

END Bitmaps.

System.Free Bitmaps ~
ORP.Compile Bitmaps.Mod ~

2017-04-07 17:41 GMT+02:00 Andreas Pirklbauer <andreas_pirklbauer at yahoo.com>

> To be precise:
> If you don't make dynamically allocated objects reachable via at least one
> global pointer variable, they simply won't be marked during the mark phase
> of the garbage collector, which means that they *will* be collected during
> the subsequent scan phase. That's the whole point of garbage collection...
> ------------------------------
> *From:* Andreas Pirklbauer <andreas_pirklbauer at yahoo.com>
> *To:* ETH Oberon and Related Systems <oberon at lists.inf.ethz.ch>
> *Cc:* Andreas Pirklbauer <andreas_pirklbauer at yahoo.com>
> *Sent:* Friday, April 7, 2017 5:35 PM
> *Subject:* [Oberon] Fw: FPGA - Bitmaps.Mod
> ...
> 4. If you want your objects to be automatically collected by the Oberon
> garbage collector, you must make it globally reachable via a global
> pointer. Then they will appear in mod.ptr in the module block which are
> used as roots for the garbage collector. (Oberon uses all named pointer
> variables in existence as roots for the mark phase of the garbage
> collector. See Oberon.GC for the details. It simply calls
> Kernel.Mark(mod.ptr) for each loaded module mod.
> --
> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
> https://lists.inf.ethz.ch/mailman/listinfo/oberon
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.inf.ethz.ch/pipermail/oberon/attachments/20170412/9cd8673f/attachment.html>

More information about the Oberon mailing list