Module: emulator-environment-backend Synopsis: Emulator Environment Backend Author: Andy Armstrong 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 /// Class handling define method environment-object-home-name (database :: , object :: ) => (name :: false-or()) let name = dylan-class-name(application-object-proxy(object)); name & ensure-server-object-of-class(database, name, ) end method environment-object-home-name; define method do-direct-subclasses (function, database :: , class :: , #key client) => () do-server-environment-objects (function, database, lisp-class-direct-subclasses(application-object-proxy(class)), ) end method do-direct-subclasses; define method do-direct-superclasses (function, database :: , class :: , #key client) => () let lisp-class = application-object-proxy(class); select (lisp-class) => #[]; otherwise => do-server-environment-objects (function, database, lisp-class-direct-superclasses(lisp-class), ); end end method do-direct-superclasses; define method do-direct-methods (function, database :: , class :: , #key client) => () do-server-environment-objects (function, database, lisp-class-direct-methods(application-object-proxy(class)), ) end method do-direct-methods; define method do-direct-slots (function, database :: , class :: , #key client) => () do-server-environment-objects (function, database, lisp-class-direct-slots(application-object-proxy(class)), ) end method do-direct-slots; define method do-all-superclasses (function, database :: , class :: , #key client) => () //---*** Should this be in the front-end? error("do-all-superclasses not implemented yet!") end method do-all-superclasses; define method do-all-slots (function, database :: , class :: , #key client) => () do-server-environment-objects (function, database, lisp-class-slots(application-object-proxy(class)), ) end method do-all-slots; define method do-init-keywords (function, database :: , class :: , #key client) => () do-server-environment-objects (function, database, dylan-class-initargs(application-object-proxy(class)), ) end method do-init-keywords; /// Slots define method environment-object-home-name (database :: , object :: ) => (name :: false-or()) let name = dylan-slot-contents(compiler-object-proxy(object)); ensure-server-object-of-class(database, name, ); end method environment-object-home-name; define method slot-getter (database :: , slot :: ) => (getter :: false-or()) let gf-proxy = slot-definition-getter(compiler-object-proxy(slot)); let gf = ensure-server-object(database, gf-proxy); let methods = generic-function-object-methods(database, gf); if (size(methods) = 1) methods[0] end end method slot-getter; define method slot-setter (database :: , slot :: ) => (getter :: false-or()) //---*** Fill this in! #f end method slot-setter; define method slot-class (database :: , slot :: ) => (class :: ) let getter = slot-getter(database, slot); let specializers = getter & method-specializers(database, getter); let class = specializers & (size(specializers) = 1) & specializers[0]; class | error("Unable to find class for slot %=", slot) end method slot-class; define method slot-type (database :: , slot :: ) => (type :: ) let type = slot-definition-type(compiler-object-proxy(slot)); case dylan-class?(type) => ensure-server-object-of-class(database, type, ); type => unless (instance?(type, ) & empty?(type)) ensure-server-object-of-class(database, type, ) end; otherwise => ensure-server-object-of-class(database, , ); end; end method slot-type; define method slot-type (database :: , slot :: ) => (type :: ) let type = slot-definition-type(compiler-object-proxy(slot)); case dylan-class?(type) => ensure-server-object-of-class(database, type, ); type => unless (instance?(type, ) & empty?(type)) ensure-server-object-of-class(database, type, ) end; otherwise => ensure-server-object-of-class(database, , ); end; end method slot-type; define method slot-init-keyword (database :: , slot :: ) => (keyword :: false-or()) let initargs = slot-definition-initargs(compiler-object-proxy(slot)); unless (empty?(initargs)) ensure-server-object-of-class(database, initargs[0], ) end end method slot-init-keyword; define method slot-init-value (database :: , slot :: ) => (init-value) //---*** What should we do here? #f end method slot-init-value; define method slot-init-function (database :: , slot :: ) => (init-value) //---*** What should we do here? #f end method slot-init-function; define method slot-allocation (database :: , slot :: ) => (keywords :: ) #() end method slot-allocation;