Module: dood Synopsis: The Dylan object-oriented database Author: Jonathan Bachrach Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND /// PAIR define method read-object-using-class-at (dood :: , class == , address ::
) => (res :: ) let object = pair(#f, #()); dood-register-read-object(dood, object, address); let hd = read-object(dood); let tl = read-object(dood); head(object) := hd; tail(object) := tl; object end method; define method walk-slots (dood :: , info :: , object :: ) unless ($tag-pairs?) walk-slot(dood, info, object, ); end unless; walk-slot(dood, info, object, head(object)); let parent = if (walk-info-parents?(info)) // keep non-pair parent for better stats element(dood-back-pointers(dood), object, default: object) else object end if; walk-slot(dood, info, parent, tail(object)); end method; define method dood-compute-instance-size (dood :: , class == ) => (address ::
) if ($tag-pairs?) 2 else dood-compute-standard-instance-size(dood, class) end; end method; /// VECTOR define method read-object-using-class-at (dood :: , class == , address ::
) => (res :: ) let size :: = read-object(dood); let vec :: = make(, size: size); dood-register-read-object(dood, vec, address); for (i :: from 0 below size) vec[i] := read-object(dood); end for; vec end method; define inline function walk-flat-sequence-slots (dood :: , info :: , class :: , object :: ) let size = size(object); walk-slot(dood, info, object, class); walk-slot(dood, info, object, size); for (e in object) walk-slot(dood, info, object, e); end for; end function; define method walk-slots (dood :: , info :: , object :: ) walk-flat-sequence-slots(dood, info, , object); end method; /// STRETCHY-VECTOR define method read-object-using-class-at (dood :: , class == , address ::
) => (res :: ) let size :: = read-object(dood); let vec :: = make(, size: size); dood-register-read-object(dood, vec, address); for (i :: from 0 below size) vec[i] := read-object(dood); end for; vec end method; define method walk-slots (dood :: , info :: , object :: ) walk-flat-sequence-slots(dood, info, , object); end method; define method dood-repeated-size (dood :: , object :: ) => (res :: ) size(object) end method; define method dood-repeated-slot? (dood :: , class :: subclass()) #t end method; define method dood-compute-instance-size (dood :: , object :: subclass()) => (address ::
) 1 end method; /// DEQUE define method read-object-using-class-at (dood :: , class == , address ::
) => (res :: ) let size :: = read-object(dood); let object :: = make(); dood-register-read-object(dood, object, address); for (i :: from 0 below size) push-last(object, read-object(dood)); end for; object end method; define method walk-slots (dood :: , info :: , object :: ) walk-flat-sequence-slots(dood, info, , object); end method; define method dood-repeated-size (dood :: , object :: ) => (res :: ) size(object) end method; define method dood-repeated-slot? (dood :: , class :: subclass()) #t end method; define method dood-compute-instance-size (dood :: , object :: subclass()) => (address ::
) 1 end method; /// STRING define inline function walk-byte-string-slots (dood :: , info :: , class :: , object) walk-slot(dood, info, object, class); walk-slot(dood, info, object, size(object)); if (walk-info-commit?(info)) dood-write-string(dood, object); end if; end function; define inline function read-byte-string-object-using-class-at (dood :: , class :: , address ::
) => (res) let size :: = read-object(dood); let object = make(class, size: size); dood-register-read-object(dood, object, address); dood-read-string-into!(dood, size, object); object end function; define method read-object-using-class-at (dood :: , class == , address ::
) => (res :: ) read-byte-string-object-using-class-at(dood, , address) end method; define method walk-slots (dood :: , info :: , object :: ) walk-byte-string-slots(dood, info, , object); end method; //// BYTE-VECTOR define method read-object-using-class-at (dood :: , class == , address ::
) => (res :: ) read-byte-string-object-using-class-at(dood, , address) end method; define method walk-slots (dood :: , info :: , object :: ) walk-byte-string-slots(dood, info, , object); end method; define method dood-repeated-byte-slot? (dood :: , class == ) #t end method; //// SYMBOLS define method read-object-using-class-at (dood :: , class == , address ::
) => (res :: ) let size :: = read-object(dood); let string :: = make(, size: size); dood-read-string-into!(dood, size, string); let sym :: = as(, string); dood-register-read-object(dood, sym, address); sym end method; define method walk-slots (dood :: , info :: , object :: ) if (object == #()) // HACK: EMU next-method() else let string :: = as(, object); walk-byte-string-slots(dood, info, dood-symbol-class(object), string); end if end method; define method dood-repeated-size (dood :: , object :: ) => (res :: ) let string :: = as(, object); size(string) end method; define method dood-repeated-slot? (dood :: , class == ) #t end method; define method dood-repeated-byte-slot? (dood :: , class == ) #t end method; define method dood-compute-instance-size (dood :: , object == ) => (address ::
) 1 end method; // eof