summaryrefslogtreecommitdiff
path: root/module/oop
AgeCommit message (Collapse)AuthorFilesLines
2024-11-27Bugfix: Recursively use method*, not method, in method*Mikael Djurfeldt1-5/+4
* module/oop/goops.scm (method*): Do not use method.
2024-11-26Add comment about (oop goops keyword-formals)Mikael Djurfeldt1-1/+8
2024-11-26New module (oop goops keyword-formals)Mikael Djurfeldt1-0/+31
This module replaces the method and define-method bindings with their method* and define-method* counterparts, for use by users who prefer not to use both kinds of syntactic forms. * module/oop/goops/keyword-formals.scm: New module. * am/bootstrap.am: Added * doc/ref/goops.texi: Document this change.
2024-11-25Correctly pass on keyword arguments actually present in args listMikael Djurfeldt1-23/+58
* module/oop/goops.scm (compute-keyword-formal-ids): Renamed from ->keyword-formal-ids; modified to do work both on the list of formals and the list of formal ids in the next-method call. (compute-make-procedure): Use compute-keyword-formal-ids.
2024-11-25Distinguish between lambda and lambda* in generated proceduresMikael Djurfeldt1-34/+47
* module/oop/goops (compute-procedure, compute-make-procedure): Emit lambda or lambda* as appropriate. This doesn't matter now since all will boil down to lambda-case, but to be future-proof... Also add some clarifying comments.
2024-11-25Remove method slot keyword-formals? introduced in 765f1d49Mikael Djurfeldt1-10/+2
* module/oop/goops.scm (method-keyword-formals?): Remov method slot keyword-formals? as well as exported procedure method-keyword-formals? introduced in 765f1d49 by partially reverting that commit.
2024-11-25GOOPS: Introduce new forms method* and define-method*Mikael Djurfeldt1-12/+107
* module/oop/goops.scm: Export method* and define-method*. (define-method): Extract definitions of helper procedures and place them in an eval-when at top level. (define-method*): Renamed from last commits define-method and modified to invoke method*. (define-method): New syntax. (parse-keyword-formals): Renamed from parse-formals and modified to give keyword methods a specialzers list with tail <top>. (parse-formals): Re-introduce the code of previous parse-args. (%compute-applicable-methods): Revert change of previous commit. Giving keyword methods a specializer tail <top> naturally makes original %compute-applicable-methods work also with keyword methods (which kind of shows that we have made the correct choices). (method*): Renamed from last commit's "method". (method): New syntax.
2024-11-25GOOPS: Add support for keyword arguments in methodsMikael Djurfeldt1-46/+131
* module/oop/goops.scm (keyword-formals?): New slot in <method>. (method-keyword-formals?): New exported <method> getter. (%compute-applicable-methods): Treat method as applicable if having matched all specializers, still have further arguments and have keyword-formals. (%compute-applicable-methods): Remove unused local variable n. (define-syntax method): Rename parse-args to parse-formals. (parse-formals): Return formals, specializers and keyword-formals. (compute-procedure): Make a lambda* with possibly keyword formals. (->formal-ids): Renamed from ->proper and now returns formal-ids. (->keyword-formal-ids): New procedure. Filter out formal ids from a keyword formal specification. (compute-make-procedure): Adapted for keyword formals. Needs ->formal-ids and ->keyword-formal-ids to compute the real-next-method call. (compute-procedures): Pass on keyword-formals. (syntax method): Adapted for keyword formals.
2024-05-06Fix error messages containing format stringsMichael Käppler1-1/+1
The builtin primitive procedure `error` takes an optional message and a list of arguments to include into the error message. These args are formatted with `~S` and appended to the error message, so that an example call of `(error "Wrong argument: " 42)` results in the output "Wrong argument: 42" If format strings occur in the message itself, however, they are escaped. Thus a call like `(error "Wrong argument: ~a" 42)` is rendered as "Wrong argument: ~a 42" Some callers did not take this behavior into account, leading to confusing error messages. Changing the behavior of `error` to be both backwards-compatible and accept also format strings inside messages is not straightforward, because it would have to handle escaped `~` characters as well. Therefore, fix `error` call sites using format strings to use `format` before calling out to `error`. The following files are affected: * module/ice-9/format.scm (format) * module/ice-9/r6rs-libraries.scm (resolve-r6rs-interface) * module/oop/goops.scm (make) * module/srfi/srfi-37.scm (Comment at the beginning of file) * module/system/base/compile.scm (call-once) * module/system/repl/command.scm (break, tracepoint) * module/system/repl/common.scm (repl-default-options) * module/system/vm/traps.scm (arg-check, trap-at-source-location) There are a couple of further call sites that were left unchanged, either because they are using their own `error` procedure: * module/ice-9/read.scm * module/ice-9/command-line.scm or are not referenced from other modules: * module/system/base/lalr.upstream.scm: * module/sxml/upstream/assert.scm: * module/sxml/sxml-match.ss: Signed-off-by: Ludovic Courtès <ludo@gnu.org>
2021-03-19goops: Preserve all slot options in redefinable classes.David Thompson1-7/+9
* module/goops.scm (compute-slots): Fix <redefinable-class> slot transformation. * test-suite/tests/goops.test ("slot options on redefinable classes"): Add a test.
2021-02-03Replace libltdl with raw dlopen, dlsymAndy Wingo1-2/+7
* NEWS: Update. * am/bootstrap.am (SOURCES): * module/Makefile.am (SOURCES): Add system/foreign-library.scm. * configure.ac: Replace ltdl check with -ldl check. * libguile/dynl.c: Rewrite to just expose core dlopen / dlsym / etc to a helper Scheme module. (scm_dynamic_link, scm_dynamic_pointer, scm_dynamic_function) (scm_dynamic_object_p, scm_dynamic_call): Rewrite in terms of (system foreign-library). * libguile/extensions.c (load_extension): Avoid scm_dynamic_call. * module/system/foreign-library.scm: New file. * module/oop/goops.scm (<dynamic-object>): Hackily export <foreign-library> instead of a class here. * doc/ref/api-foreign.texi (Foreign Function Interface): Rewrite to only document the new interfaces. Eventually we will deprecate dynamic-link and friends. * doc/ref/guile.texi (API Reference): Move Foreign Objects after Foreign Function Interface. Seems there should be some closer relationship but this will do for now. * doc/ref/tour.texi (Putting Extensions into Modules): * doc/ref/libguile-parallel.texi (Parallel Installations): Update for rename of Modules and Extensions to Foreign Extensions. * libguile/deprecated.h: * libguile/deprecated.c (scm_dynamic_unlink): Deprecate. * libguile/guile.c: Remove ltdl include. * test-suite/tests/foreign.test: Update tests to use new API, and update error expectations.
2020-09-10Move copy-tree to (ice-9 copy-tree); deprecate main bindingAndy Wingo1-6/+7
* doc/ref/api-data.texi (List Constructors): * doc/ref/api-utility.texi (Copying): Update docs to mention module. * libguile.h: Remove trees.h inclusion. * libguile/Makefile.am (libguile_@GUILE_EFFECTIVE_VERSION@_la_SOURCES): (DOT_X_FILES, DOT_DOC_FILES, modinclude_HEADERS): Remove trees.c, trees.h, and related files. * libguile/init.c (scm_i_init_guile): Remove trees.h and the scm_init_trees call. * libguile/trees.c: * libguile/trees.h: Remove. * module/Makefile.am (SOURCES): Add ice-9/copy-tree.scm. * module/ice-9/copy-tree.scm: New file. * module/ice-9/deprecated.scm (copy-tree*): Export as copy-tree, proxying to (ice-9 copy-tree). * module/system/repl/common.scm: * module/web/client.scm: * test-suite/tests/elisp.test: * test-suite/tests/srfi-1.test: * module/oop/goops/save.scm: Use (ice-9 copy-tree). * test-suite/Makefile.am (SCM_TESTS): Add copy-tree.test. * test-suite/tests/copy-tree.test: New file; test pulled from eval.test. * libguile/deprecated.h: * libguile/deprecated.c (scm_copy_tree): Deprecate.
2018-08-07goops: Fix 'instance?' to work on objects that aren't structs.Mark H Weaver1-2/+4
Fixes <https://bugs.gnu.org/31606> Reported by Tommi Höynälänmaa <tommi.hoynalanmaa@gmail.com> * module/oop/goops.scm (instance?): Check that OBJ is a struct before applying 'struct-vtable' to it.
2017-09-26Add new vtable reserved unboxed fieldAndy Wingo1-2/+3
* libguile/struct.h (SCM_VTABLE_BASE_LAYOUT) (scm_vtable_index_reserved_6): Add a reserved field. * module/oop/goops.scm (fold-class-slots, unboxed-slot?): Reserve a new unboxed field.
2017-09-25Fix GOOPS class redefinition type error.Andy Wingo1-1/+1
* module/oop/goops.scm (allocate-instance): Fix error introduced in recent merge.
2017-09-25Merge 'stable-2.2'Andy Wingo1-32/+61
Resolve conflicts by removing capability of struct-ref / struct-set! to access unboxed slots.
2017-09-25Add struct-ref/unboxed, struct-set!/unboxedAndy Wingo1-29/+59
* NEWS: Add news entry. * doc/ref/api-data.texi (Vtables, Structure Basics): Update documentation. * libguile/struct.c (scm_i_struct_equalp): Avoid using struct-ref on unboxed fields. (scm_struct_ref, scm_struct_set_x_unboxed): Issue deprecation warning when accessing unboxed fields. (scm_struct_ref_unboxed, scm_struct_set_x_unboxed): New functions. * libguile/struct.h (scm_struct_ref_unboxed, scm_struct_set_x_unboxed): New functions. * module/oop/goops.scm (class-add-flags!, class-clear-flags!): (class-has-flags?, <class>, %allocate-instance, <slot>): (compute-get-n-set, unboxed-get, unboxed-set, unboxed-slot?): (allocate-slots, %prep-layout!, make-standard-class, initialize): Adapt to access unboxed nfields and flags fields via the new accessors.
2017-09-23Replace "pr" struct fields with "pw" fieldsAndy Wingo1-2/+1
* libguile/struct.h (SCM_VTABLE_BASE_LAYOUT): Layout is a "pr" field. * module/ice-9/boot-9.scm (record-type-vtable): Record vtable fields are writable. (<parameter>): "pw" fields. * module/oop/goops.scm (<class>, %compute-layout): <read-only> fields are "pw" underneath. * module/rnrs/records/procedural.scm (record-type-vtable) (record-constructor-vtable, make-record-type-descriptor): Use "pw" fields in vtables. * module/srfi/srfi-35.scm (%condition-type-vtable) (struct-layout-for-condition): "pw" fields in vtables. * test-suite/tests/goops.test: * test-suite/tests/structs.test: Use "pw" fields only. * benchmark-suite/benchmarks/structs.bm: Update for make-struct/no-tail, to use pw fields, and also to remove useless tests that the compiler would optimize away. * doc/ref/api-data.texi (Vtables): Add a note about the now-vestigial permissions character and update documentation. (Structure Basics, Meta-Vtables): Update examples. * libguile/hash.c (scm_i_struct_hash): Remove code that would handle opaque/self fields. * libguile/print.h (SCM_PRINT_STATE_LAYOUT): Use "pw" fields. * libguile/struct.c (scm_struct_init): Simplify check for hidden fields. * libguile/values.c (scm_init_values): Field is "pw".
2017-09-23Fix bootstrap slot permissions for <class>Andy Wingo1-3/+13
* module/oop/goops.scm: Fix bootstrap slot computation to preserve slot permissions.
2017-09-23Merge 'stable-2.2'Andy Wingo1-6/+27
2017-09-23GOOPS slot access protected via slot accessors, not struct permsAndy Wingo1-6/+27
* module/oop/goops.scm (opaque-slot?, read-only-slot?): New helpers. (allocate-slots): Protect opaque and read-only slots by wrapping the slot accessors instead of relying on struct permissions. (%compute-layout): Remove opaque-slot case.
2017-09-22Remove <int-slot>, <float-slot>, <double-slot>Andy Wingo1-4/+1
* module/oop/goops.scm (<int-slot>, <float-slot>, <double-slot>): Remove slot classes that never did anything.
2017-09-22Remove support for tail arrays and self slotsAndy Wingo1-0/+14
* libguile/struct.c (scm_make_struct): Remove support for tail arrays and self slots. (set_vtable_layout_flags): Always initialize the nfields member. (scm_is_valid_vtable_layout): Remove support for tail arrays and self slots. (scm_i_struct_inherit_vtable_magic): No need to issue deprecation warning for self slots, as they are no longer supported. (scm_struct_init): Remove support for tail arrays and self slots. (scm_c_make_structv): Throw an exception if n_tail is not 0. (scm_allocate_struct): Adapt to scm_struct_init change. (scm_i_make_vtable_vtable): Initialize slots manually, to avoid relying on an already-initialized nfields member. (scm_struct_ref, scm_struct_set_x): Simplify. * module/oop/goops.scm: As we now rely on nfields being valid, when recalculating slots during boot we need to avoid resetting nfields of <class>, even temporarily, as that would prevent any further access to <class>!
2017-09-14Remove "redefined" class slotAndy Wingo1-12/+0
* module/oop/goops.scm (fold-class-slots): Remove "redefined" field from class objects. Redefinable classes are now handled in a layer on top of GOOPS core.
2017-09-14remove self field of vtablesAndy Wingo1-8/+2
* libguile/struct.h (SCM_VTABLE_BASE_LAYOUT, scm_vtable_index_self): Remove "self" field. Renumber the other fields. * module/oop/goops.scm (<self-slot>): Remove. (fold-class-slots): Adapt for "self" slot removal. Adapt all users. (class-redefinition): Now that there is no "self" slot to update, use %modify-instance instead of %modify-class. * libguile/goops.c (class_self): Remove. (scm_sys_modify_class): Remove. * libguile/goops.h (scm_sys_modify_class): Remove. * module/rnrs/records/procedural.scm: Import vtable-offset-user. Renumber rtd indexes using vtable-offset-user. * module/srfi/srfi-35.scm (%condition-type-vtable): Remove mention of vtable fields. * module/system/base/types.scm (address->inferior-struct): Adapt for different vtable field layout.
2017-09-14Implement class redefinition on top of fixed structsAndy Wingo1-202/+352
* libguile/struct.h: Steal another flag for GOOPS. * libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT) (SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags. (SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete definitions. (SCM_IS_A_P): Use the scm_class_of function. * libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename from var_migrate_instance. (scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use scm_class_of instead of the SCM_CLASS_OF macro. (get_indirect_slots): New helper. (scm_class_of): This patch moves us in a direction where we won't be able to separately address a struct's data and its identity. Therefore to check whether a class needs migration, we check an embedded pointer from a slot instead of the vtable data. (scm_sys_struct_data): Remove this temporary function. (scm_sys_modify_instance): Update to swap slot values instead of the data pointers themselves. (scm_sys_modify_class): Use scm_sys_modify_instance. (scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance instead of migrate-instance. (scm_init_goops_builtins): Don't export the "valid" flag any more; export instead the "indirect" and "needs-migration" flags. * libguile/foreign-object.c (scm_assert_foreign_object_type): Add a FIXME. * libguile/vm-engine.c (class-of): Take away fast path for the time being. * module/oop/goops.scm (class-has-indirect-instances?) (indirect-slots-need-migration?): New helpers. (<class>, <slot>, %class-slot-definition, initialize): Remove use of vtable-flag-goops-valid. (define-class): Always push redefined values through `class-redefinition'. (<redefinable-class>): New public definition. Use it as a metaclass for redefinable classes. Provide a compute-slots function that declares the indirect slots mechanism. Add the "indirect" flag to instances of <redefinable-class>. Create indirect-slots objects for instances of those classes as part of their allocate-instance. (change-object-class, class-of-obsolete-indirect-instance): Update for new representation change. * test-suite/tests/goops.test ("object update"): Add #:metaclass <redefinable-class> to all redefinable classes. For the "hell" test, make the new classes with class-direct-slots, not class-slots; this was an error in the test.
2017-09-14Change name of "static" flag indicating static slot allocationAndy Wingo1-4/+4
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_STATIC_SLOT_ALLOCATION): Rename from SCM_VTABLE_FLAG_GOOPS_STATIC. * libguile/goops.c (scm_init_goops_builtins): Adapt. * module/oop/goops.scm (class-has-statically-allocated-slots?): (initialize): Adapt.
2017-09-14GOOPS instance migration implemented in SchemeAndy Wingo1-1/+28
* libguile/goops.c (scm_class_of): Call out directly to the GOOPS-local `migrate-instance' if an instance needs to migrate. (scm_sys_struct_data): New internal temporary function used by the Scheme `migrate-instance'. Exorcise the evil one from the old C implementation. * libguile/goops.h (scm_change_object_class): Remove function used only internally in GOOPS. * module/oop/goops.scm (migrate-instance): Implement the hell/purgatory/etc logic in Scheme instead of C.
2017-05-22Remove all deprecated codeAndy Wingo1-37/+0
* module/ice-9/debug.scm: * module/ice-9/mapping.scm: * module/ice-9/syncase.scm: Delete these deprecated files. * module/Makefile.am: Remove deleted files. * libguile/deprecated.c: * libguile/deprecated.h: * libguile/backtrace.c: * libguile/goops.c: * libguile/numbers.c: * libguile/socket.c: * libguile/srfi-13.c: * module/ice-9/deprecated.scm: * module/ice-9/format.scm: * module/oop/goops.scm: * module/statprof.scm: * module/texinfo/reflection.scm: * module/web/client.scm: * module/web/uri.scm: Remove deprecated code.
2017-03-28Add disjoint syntax object typeAndy Wingo1-1/+2
* libguile/Makefile.am (libguile_@GUILE_EFFECTIVE_VERSION@_la_SOURCES): (DOT_X_FILES, DOT_DOC_FILES, noinst_HEADERS): Add syntax.c and syntax.h. * libguile/evalext.c (scm_self_evaluating_p): * libguile/goops.c (class_syntax, scm_class_of, scm_goops_early_init): * libguile/init.c (scm_init_guile): * libguile/print.c (iprin1): * libguile/tags.h (scm_tc7_syntax): * module/oop/goops.scm (<syntax>): * module/system/base/types.scm (%tc7-syntax, cell->object): * module/system/vm/disassembler.scm (code-annotation): Wire up the new data type. * libguile/syntax.c: * libguile/syntax.h: New files. * module/ice-9/boot-9.scm: Move new definitions to (system syntax internal). * module/system/syntax.scm (print-syntax): New helper. * module/system/vm/assembler.scm (statically-allocatable?) (intern-constant, link-data): Arrange to be able to write syntax objects into images. * module/language/cps/types.scm (&syntax): New type. Remove &hash-table; it was never detected, an internal binding, and we need the bit to avoid going into bignum territory.
2017-03-01Fix class slot allocation since GOOPS rewriteAndy Wingo1-1/+1
* module/oop/goops.scm (%compute-layout): Fix class slot layout. Before, a #:class that was an argument to #:allocation was getting interpreted as a keyword with a value. * test-suite/tests/goops.test ("#:class slot allocation"): Add test.
2017-02-22Fix multi-arity dispatch in GOOPSAndy Wingo1-1/+1
* module/oop/goops.scm (multiple-arity-dispatcher): Fix dispatch for max-arity+1 when a generic is already in multiple-arity dispatch. Fixes #24454. * test-suite/tests/goops.test ("dispatch"): Add test.
2016-10-17Deprecate user asyncsAndy Wingo1-3/+3
* libguile/async.c: * libguile/async.h: * libguile/deprecated.c: * libguile/deprecated.h (scm_async, scm_async_mark, scm_run_asyncs): Deprecate these functions, which comprise the "users asyncs" facility. * module/oop/goops.scm: Adapt to <async> deprecation. * doc/ref/api-scheduling.texi: * doc/ref/libguile-concepts.texi: * doc/ref/libguile-foreign-objects.texi: * doc/ref/posix.texi: Remove documentation on user asyncs, and replace references to "system asyncs" to be just "asyncs".
2016-10-17Deprecate arbitersAndy Wingo1-2/+4
* libguile/arbiters.c: * libguile/arbiters.h: * test-suite/tests/arbiters.test: Delete files. * libguile/deprecated.c: * libguile/deprecated.h: Move arbiters code here. * doc/ref/api-scheduling.texi: Remove section on arbiters. * libguile.h: * libguile/Makefile.am: * libguile/init.c: * module/oop/goops.scm: * test-suite/Makefile.am: Remove mention of arbiters. * NEWS: Update.
2016-09-06Add atomic boxesAndy Wingo1-1/+2
* doc/ref/api-scheduling.texi (Atomics): New manual section. * libguile.h: Include atomic.h. * libguile/Makefile.am (libguile_@GUILE_EFFECTIVE_VERSION@_la_SOURCES): (DOT_X_FILES, DOT_DOC_FILES, modinclude_HEADERS): Add atomic. * libguile/atomic.c: * libguile/atomic.h: New files. * libguile/atomics-internal.h (scm_atomic_set_scm, scm_atomic_ref_scm) (scm_atomic_swap_scm, scm_atomic_compare_and_swap_scm): New facilities. * libguile/goops.c (class_atomic_box, scm_sys_goops_early_init): Add support for <atomic-box>. Remove duplicate <keyword> fetch. * libguile/init.c (scm_i_init_guile): Call scm_register_atomic_box. * libguile/print.c (iprin1): Add atomic box case. * libguile/tags.h (scm_tc7_atomic_box): New tag. * libguile/validate.h (SCM_VALIDATE_ATOMIC_BOX): New macro. * module/Makefile.am (SOURCES): Add ice-9/atomic.scm. * module/ice-9/atomic.scm: New file. * module/oop/goops.scm (<atomic-box>): New var.
2015-02-06Add #:static-slot-allocation?Andy Wingo1-13/+32
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_STATIC): Reserve the fourth GOOPS flag to indicate that a class has static slot allocation. * libguile/goops.c (scm_init_goops_builtins): Define vtable-flag-goops-static for goops.scm. * module/oop/goops.scm (class-has-statically-allocated-slots?): New helper. (build-slots-list): Instead of the ad-hoc checks for <class> or <slot>, use the new helper. (initialize): Accept #:static-slot-allocation? keyword. * module/system/foreign-object.scm (make-foreign-object-type): Declare foreign object classes as having static slot allocation. * test-suite/tests/goops.test ("static slot allocation"): Add tests.
2015-01-26Merge remote-tracking branch 'origin/stable-2.0'Andy Wingo1-16/+24
Conflicts: libguile/goops.c libguile/vm-engine.h module/oop/goops.scm module/oop/goops/compile.scm module/oop/goops/dispatch.scm test-suite/tests/goops.test
2015-01-26Accessor methods only apply to subclasses with their slotAndy Wingo1-33/+21
* libguile/goops.c (is_accessor_method, scm_compute_applicable_methods): Fix regression from 51f66c912078a25ab0380c8fc070abb73d178d98 (2009). Accessor methods are added on each subclass on which the slot is present; therefore if a subclass doesn't have a method, then the methods doesn't apply. Truly fixes #17355, unlike 583a23bf104c84d9617222856e188f3f3af4934d. * module/oop/goops.scm (compute-cmethod, compute-getter-method) (compute-setter-method): Revert earlier changes. * test-suite/tests/goops.test ("accessor slots"): Update for new expectations, in agreement with Guile 1.8.
2015-01-24Fix accessor struct field inliningAndy Wingo3-69/+74
* module/oop/goops/compile.scm: Inline into goops.scm, leaving a compatible interface stub behind. * module/oop/goops/dispatch.scm: Don't import (oop goops compile), to break circularities. * module/oop/goops.scm: Move (oop goops util) include up to the top, and import (ice-9 match). (compute-cmethod): Move here from compile.scm. Add a special case for accessor methods, so as to fix bug #17355. (compute-getter-method, compute-setter-method): #:procedure slot is now generic. * test-suite/tests/goops.test ("accessor slots"): New test.
2015-01-24Fix accessor struct inlining in GOOPSAndy Wingo1-25/+70
Fixes bug #17355. * module/oop/goops.scm (memoize-effective-method!): Adapt to compute-effective-method change. (compute-effective-method, %compute-effective-method): Renamed from compute-cmethod; now a generic protocol. (compute-specialized-effective-method) (%compute-specialized-effective-method): New sub-protocol. (memoize-generic-function-application!): Adapt to call the hard-wired compute-applicable-methods based on the concrete arguments types -- the semantics is that %compute-applicable-methods is the implementation for <generic> functions. Perhaps we should do the same for sort-applicable-methods and method-more-specific?. (compute-getter-method, compute-setter-method): The standard #:procedure is now a generic slot-ref. It wasn't valid to inline field access here, because subtypes could have different field layouts. (compute-applicable-methods): Refactor generic definition to use lexical scoping. (compute-specialized-effective-method): New method for <accessor-method>, which does field access inlining based on the concrete types being applied. * test-suite/tests/goops.test ("accessor slots"): New test.
2015-01-23Simplify and optimize slot accessAndy Wingo1-85/+68
* module/oop/goops.scm (fold-slot-slots): Add `slot-ref/raw' slot, which is what the slot-ref slot was. Now the slot-ref slot checks that the slot is bound, if needed. (slot-definition-slot-ref/raw): Define. (make-slot): Adapt. Also, effective slot definition slots have no initargs. (define-standard-accessor-method, bound-check-get, standard-get) (standard-set): Move definitions up. (allocate-slots): Adapt. If the slot has an init thunk, we don't need to check that it's bound. (slot-ref, slot-set!, slot-bound?): Simplify. (class-slot-ref): Use the raw getter so that we can call `slot-unbound' with just the class. (compute-getter-method, compute-setter-method): Simplify to just use the slot-ref / slot-set! functions from the slot. (%initialize-object): Simplify.
2015-01-23Export <slot> from GOOPSAndy Wingo1-0/+1
* module/oop/goops.scm (<slot>): Export. This is the way to tell if you have new GOOPS or not: whether <slot> is defined.
2015-01-23Simplify GOOPS effective method cache formatAndy Wingo1-35/+32
* module/oop/goops.scm (single-arity-cache-dispatch) (compute-generic-function-dispatch-procedure) (memoize-effective-method!): Simplify format of effective method cache.
2015-01-23Fast generic function dispatch without calling `compile' at runtimeAndy Wingo1-213/+224
* module/oop/goops.scm: Rewrite generic function dispatch to use chained closures instead of compiling specific dispatch procedures. The big speed win before was not allocating rest arguments, which we gain by simply pre-generating dispatchers for arities of up to 20 arguments. Also now a tail call without reshuffling arguments -- which is what dispatch now is -- is just a (mov 0 new-procedure) and (tail-call), which is pretty cheap. (%invalidate-method-cache!): Use the new recompute-generic-function-dispatch-procedure!. (arity-case, multiple-arity-dispatcher, single-arity-dispatcher) (single-arity-cache-dispatch) (compute-generic-function-dispatch-procedure) (recompute-generic-function-dispatch-procedure!): New internal interfaces. (memoize-effective-method!): Update for new interfaces. (memoize-generic-function-application!): Rename from `memoize-method!'.
2015-01-23GOOPS cosmeticsAndy Wingo1-5/+10
* module/oop/goops.scm: More commenting. Move around <keyword> in the export section.
2015-01-23Update (oop goops save) for <slot> objectsAndy Wingo2-34/+26
* module/oop/goops/describe.scm (describe): Remove commented code. * module/oop/goops/save.scm (get-set-for-each, access-for-each): Update these hoary routines for the new <slot> universe.
2015-01-23Minor GOOPS cleanupsAndy Wingo1-8/+8
* module/oop/goops.scm: Minor commenting fixes.
2015-01-23Optimize %initialize-objectAndy Wingo1-5/+24
* module/oop/goops.scm (%initialize-object): Optimize by inlining the slot initialization, and by avoiding multiple checks for initargs validity.
2015-01-23Inline internal slot accessorsAndy Wingo1-53/+55
* module/oop/goops.scm (define-slot-accessor): Also define internal accessors without the type check for when we know that the object is a slot. Adapt struct-ref users to use these variants.
2015-01-23Inline helpers into slot-ref, slot-set!, etcAndy Wingo1-56/+75
* module/oop/goops.scm (%class-slot-definition): New helper. (class-slot-definition): Use the new helper. (get-slot-value-using-name, set-slot-value-using-name!) (test-slot-existence): Remove helpers. (slot-ref, slot-set!, slot-bound?, slot-exists?): Inline helpers for speed.