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 /// IO SUPPORT define constant = ; define function dood-word-shift-right (x, amount) ash(x, -amount) end function; define constant dood-word-shift-left = ash; define constant dood-word-logior = logior; define constant dood-word-logand = logand; /// SLOT-DESCRIPTORS define constant dood-instance-slot-descriptors = slot-descriptors; /// BOOLEAN define method dood-compute-deep-slot-descriptors (class == ) #() end method; define method dood-compute-lazy-slot-descriptors (class == ) #() end method; define method dood-compute-weak-slot-descriptors (class == ) #() end method; /// LIST define method dood-compute-deep-slot-descriptors (class :: subclass()) vector(0, 1) end method; /// OBJECT-TABLE // TODO: Is this needed anymore? The emulator now defines this. define method remove-all-keys! (table :: ) do (curry(remove-key!, table), key-sequence(table)); table; end method; /// REPEATED DEFAULTS define method dood-repeated-slot? (dood :: , class :: ) #f end method; define method dood-repeated-byte-slot? (dood :: , class :: ) #f end method; define method dood-repeated-slot? (dood :: , class :: subclass()) #t end method; define method dood-repeated-byte-slot? (dood :: , class == ) #t end method; /// EMULATOR DOESN'T ALWAYS RETURN THE EXACT SAME EMPTY VECTOR OBJECT define method dood-standard-object (dood :: , object) => (object) object end method; // We wouldn't have to do this if the runtime did... define method dood-standard-object (dood :: , object :: ) => (object) if (empty?(object)) $dood-empty-vector else object end end method; // EMULATOR: in emulator, "" is a , so need this // to shadow above. define method dood-standard-object (dood :: , object :: ) => (object) object end method; define class () end; define method read-object-using-class-at (dood :: , class == , address ::
) let size = read-object(dood); let string = make(, size: size); dood-read-string-into!(dood, size, string); as-keyword(string) end method; define function dood-symbol-class (object :: ) if (keyword?(object)) // HACK: EMULATOR else end end function; define function dood-integer-disk-pointer+object (dood :: , object :: ) => (pointer :: , disk-object) dood-format("MAKING INTEGER %=\n", object); values(tag-as-integer(object), object) end function; define method dood-disk-object (dood :: , object :: ) => (proxy :: ) dood-as-proxy(dood, object, dood-make-program-binding-proxy) end method; define inline function small-integer? (object :: ) => (res :: ) #t end function; define inline function dood-character-disk-pointer+object (dood :: , object :: ) => (pointer :: , disk-object) dood-format("WRITING BYTE-CHARACTER %=\n", object); // HACK: EMULATOR ONLY FIX with-unbound-caught values(tag-as-byte-character(as(, object)), object) unbound // format-out("UNBOUND SLOT\n"); values(tag-as-address(#f, $dood-false-id), #f) end end function; define constant $max-tagged-integer = (2 ^ ($tagged-word-size - 1)) - 1; define constant $negative-tagged-integer-correction = 2 ^ $tagged-word-size; define inline function address-as-integer (x :: ) => (res :: ) if (x > $max-tagged-integer) x - $negative-tagged-integer-correction else x end if end function; define method dood-compute-instance-size (dood :: , object :: subclass()) => (address ::
) 2 end method; // eof