<html><head></head><body><div style="color:#000; background-color:#fff; font-family:Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:13px"><div id="yui_3_16_0_ym19_1_1491577030619_2588">Tomas,</div><div id="yui_3_16_0_ym19_1_1491577030619_2588"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">a couple of comments on your code:</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">1. It is normal that you see only a single reference to procedure Kernel.New in the Oberon 2013 system, namely in procedure System.Trap - which is the system's trap handler. This is because in Oberon 2013, the operator NEW is *implemented* using the trap mechanism (in order to avoid any reference to module Kernel in the compiler). So, when the programmer writes NEW (p), the compiler generates code that first assigns the address of p to register R0 (which will then appear as variable 'a' in procedure System.Trap), and the type tag (=the address of the type descriptor) to register R1 (which will then appears as variable 'b' in procedure System.Trap), following by an unconditional branch instruction via the R12 (the module table MT), using trap number 0. So, at runtime, this generates trap 0 which in turn lands you in procedure System.Trap which then simply calls Kernel.New(a, b).</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">2. In your code you allocate the bitmap (VAR b: Bitmap) as a *local* variable. Make it global. This is necessary because the garbage collector *expects* the type tag to be there. The Oberon garbage collector uses a mark-scan scheme. In the mark phase (Kernel.Mark) all dynamic objects reachable from all currently loaded modules (mod.ptr in the module table) are marked. In the scan phase (Kernel.Scan), all non-reachable objects are collected. In both cases, the garbage collector dereferences p to obtain its size (p.tag points to the type descriptor, which in turn has the size of the record in its first slot). </div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">3. Instead of just storing the *size* of the allocated object, you may in fact want to exactly replicate the *full* Oberon type descriptor, and make it globally available in your program. See chapter 8.2., page 109, of the book Project Oberon, for a detailed description of the fields of an Oberon type descriptor. But in essence, it consists of a) the size of the allocated object, b) 3 entries for the so-called extensions, and c) a list of pointer field offsets needed for the garbage collector (terminated by a sentinel value of -1).</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">You don't really need b) and c), so you could write something like:</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">  TYPE TypeTag = RECORD size: LONGINT;</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">     ext: ARRAY 3 OF LONGINT;</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">     ptr: LONGINT;</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">     <other fields that you may want to add></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">  END ;</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">Then create the "type tag" by writing:</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">  VAR tag: TypeTag;</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">and initialise it with:</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">  tag.size := <size of your object to be allocated>;</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">  tag.ext[0] := 0; tag.ext[1] := 0; tag.ext[2] := 0;</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">  tag.ptr := -1;</div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr">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<font face="ArialMT" size="2" id="yui_3_16_0_ym19_1_1491577030619_5223"> 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.</font></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><font face="ArialMT" size="2"><br></font></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><font face="ArialMT" size="2"><br></font></div><div id="yui_3_16_0_ym19_1_1491577030619_2588" dir="ltr"><font face="ArialMT" size="2" id="yui_3_16_0_ym19_1_1491577030619_5237">And</font>r<span style="font-family: ArialMT; font-size: small;" id="yui_3_16_0_ym19_1_1491577030619_5238">eas</span></div>
                
        
        
                <div title="Page 106" id="yui_3_16_0_ym19_1_1491577030619_4566">
                        <div id="yui_3_16_0_ym19_1_1491577030619_4567">
                                <div id="yui_3_16_0_ym19_1_1491577030619_4568">
                                        <div dir="ltr" id="yui_3_16_0_ym19_1_1491577030619_4569"><br></div>
                                </div>
                        </div>
                </div><div title="Page 106" id="yui_3_16_0_ym19_1_1491577030619_4475"><div id="yui_3_16_0_ym19_1_1491577030619_4476"><div id="yui_3_16_0_ym19_1_1491577030619_4477"><div title="Page 106" id="yui_3_16_0_ym19_1_1491577030619_4496"><div id="yui_3_16_0_ym19_1_1491577030619_4497"><div id="yui_3_16_0_ym19_1_1491577030619_4498"><div title="Page 106" id="yui_3_16_0_ym19_1_1491577030619_4517"><div id="yui_3_16_0_ym19_1_1491577030619_4518"><div id="yui_3_16_0_ym19_1_1491577030619_4519">
                
        
        
                <div title="Page 106" id="yui_3_16_0_ym19_1_1491577030619_4538">
                        <div id="yui_3_16_0_ym19_1_1491577030619_4539">
                                <div id="yui_3_16_0_ym19_1_1491577030619_4540">
                                        <div dir="ltr" id="yui_3_16_0_ym19_1_1491577030619_4541"><span style="font-size: 10.000000pt; font-family: 'ArialMT'" id="yui_3_16_0_ym19_1_1491577030619_4542"> <br id="yui_3_16_0_ym19_1_1491577030619_4543"></span></div>
                                </div>
                        </div>
                </div>
                                </div>
                        </div>
                </div>
                                </div>
                        </div>
                </div>
                                </div>
                        </div>
                </div></div></body></html>