Re. [Oberon] Library

eas-lab at absamail.co.za eas-lab at absamail.co.za
Mon Sep 1 09:13:16 CEST 2003


Dan Parnete wrote:

> I'm writing a simple database engine based on Library. Practically I'm 
> collecting objects in lib and store libs in a database file. For now I 
> have a running version with volatile indexes, witch is a nice experience 
> with less the 5000 libs stored, but above that, building indexes on the 
> fly is no more funny. Expecialy do to an anoing problem with 
> Objects.LoadLibrary procedure.
> 
> I should like to do that:
> 
> PROCEDURE ReadLib*( f: Files.File, pos: LONGINT ): Objects.Library;
>     VAR i, len: LONGINT;
>              L: Objects.Library;
> BEGIN
>     NEW( L );  Objects.OpenLibrary( L );  Objects.LoadLibrary( L, f, 
> pos+1, len );
>     RETURN L
> END ReadLib;
> 
> But the result is:
> 
> TRAP 7  Index out of range in thread Oberon.Loop
> 
> Files.ReadString  PC = 7278
>     R =  00411878H Files.Rider
>     ch =  00000020X
>     i = 64
>     x = "                                                                
> " ...
> Objects.LoadLibrary  PC = 6475
>     @for = 8223
>     @for = 13
>     L =  014E0200H Objects.LibDesc
>     N = 8224
>     R =  00411878H Files.Rider
>     dict =  00000000H (Objects.ListDictDesc)
>     dorg = 595
>     entry =  00000000H (Objects.EntryDesc)
>     f =  01C1CA20H Files.File
>     gorg = 512
>     i = 14
>     ind =  014AAF40H Objects.ArrayIndexDesc
>     key = 8224
>     len = 597
>     n = 0
>     pos = 200017
>     version = 1380272450
> DpsDb.ReadLib  PC = 11734     <----- compare with source code
>     L =  014E0200H Objects.LibDesc
>     ch =  00000000X     <---- this does not correspond with code above
>     f =  01C1CA20H Files.File
>     fl =  00000000H (Files.File)
>     i = 0
>     len = 597
>     rl =  00411878H Files.Rider
>     size = 597

!! This trap info does not come from the code above !!

> And is nothing wrong with the data because doing that:
> 
> PROCEDURE ReadLib*( size: LONGINT; f: Files.File; r: Files.Rider ): 
> Objects.Library;
>     VAR i, len: LONGINT;
>             ch: CHAR;
>             fl: Files.File;  rl: Files.Rider;
>             L: Objects.Library;
> BEGIN
>     fl := Files.New( "TempLib" );  Files.Set( rl, fl, 0 );
>     FOR i:=0 TO size-1 DO Files.Read( r, ch );  Files.Write( rl, ch ) END;
>     Files.Register( fl );  fl := Files.Old( "TempLib" );
>     NEW( L );  Objects.OpenLibrary( L );  Objects.LoadLibrary( L, fl, 1, 
> len );
>     RETURN L
> END ReadLib;

The trap info could be from this code.

My 2001 ver. of  Files.ReadString looks different.

But I'm guessing that LEN(x) = 64   [0...63] and you had an overflow ?

Just look at the source code of the last 3 [before it trapped] procs.
       Files.ReadString < Objects.LoadLibrary < DpsDb.ReadLib 
and compare the reported values of the varialbles to what you 
expect.  This usually allows you to debug it.

Perhaps put some trace info in proc DpsDb.ReadLib , to help see
how the arg 'ripples-through' to trap in Files.ReadString  ?

-- Chris Glur.




More information about the Oberon mailing list