Andy Wingo [Tue, 13 Jan 2015 23:01:51 +0000 (00:01 +0100)]
More GOOPS comments
* module/oop/goops.scm: More expository comments.
Andy Wingo [Tue, 13 Jan 2015 22:16:40 +0000 (23:16 +0100)]
Commenting in goops.scm
* module/oop/goops.scm: More narrative cleanup.
Andy Wingo [Tue, 13 Jan 2015 22:04:57 +0000 (23:04 +0100)]
Narrative reordering in goops.scm
* module/oop/goops.scm: Reorder for narrative.
Andy Wingo [Tue, 13 Jan 2015 20:59:03 +0000 (21:59 +0100)]
scm_make cleanup
* libguile/goops.c (scm_make): Remove SCM_DEFINE around scm_make; the
real definition is in Scheme.
Andy Wingo [Tue, 13 Jan 2015 20:07:42 +0000 (21:07 +0100)]
Add compute-cpl tests
* test-suite/tests/goops.test: Add tests for compute-cpl based on
comments from goops.scm.
* module/oop/goops.scm (compute-std-cpl): Remove comment, and add
docstring.
(compute-cpl): Improve comment.
Andy Wingo [Mon, 12 Jan 2015 20:43:48 +0000 (21:43 +0100)]
Fold (oop goops util) into (oop goops)
* module/oop/goops/util.scm: Removed. Instead we fold these definitions
into goops.scm.
* module/oop/goops/save.scm: Remove useless import of util.scm.
* module/oop/goops.scm: Fold in util.scm. Since we always use
add-interesting-primitive!, import (language tree-il primitives) in
the header. Clean up some early comments, and use of eval-when.
* module/Makefile.am: Adapt.
Andy Wingo [Mon, 12 Jan 2015 20:40:29 +0000 (21:40 +0100)]
GOOPS utils module cleanups
* module/oop/goops.scm (make-class): Inline find-duplicate to its use
site.
* module/oop/goops/util.scm (improper->proper): Remove unused function.
(any, every): Don't re-export these from SRFI-1; users can get them
from SRFI-1 directly.
Andy Wingo [Mon, 12 Jan 2015 20:18:57 +0000 (21:18 +0100)]
append-map rather than mapappend
* module/oop/goops/util.scm: Remove mapappend alias; SRFI-1 append-map
should be used instead.
Andy Wingo [Mon, 12 Jan 2015 20:16:25 +0000 (21:16 +0100)]
GOOPS cleanup to use SRFI-1 better
* module/oop/goops.scm (class-subclasses, class-methods): Reimplement
using stock SRFI-1 procedures.
Andy Wingo [Sun, 11 Jan 2015 21:23:51 +0000 (22:23 +0100)]
Cosmetic goops refactors.
* module/oop/goops.scm: Update comments.
* libguile/goops.c: Cosmetic reorderings, re-commentings, and
de-commentings.
Andy Wingo [Sun, 11 Jan 2015 21:01:47 +0000 (22:01 +0100)]
Incorporate %inherit-magic! into %init-layout!
* libguile/goops.c (scm_make_standard_class, scm_sys_init_layout_x):
Move definitions up. Incorporate scm_sys_inherit_magic_x into
scm_sys_init_layout_x.
* libguile/goops.h: Remove scm_sys_init_layout_x declaration.
Andy Wingo [Sun, 11 Jan 2015 20:31:51 +0000 (21:31 +0100)]
goops.c no longer knows about <class> slot allocation
* libguile/goops.c (scm_class_of): Access "redefined" slot by name in
the case where we need to change the class of an instance.
(scm_sys_goops_early_init): Move up capture of class-precedence-list
so SCM_SUBCLASSP can use it.
* libguile/goops.h (SCM_CLASS_CLASS_LAYOUT, scm_si_redefined)
(scm_si_direct_supers, scm_si_direct_slots, scm_si_direct_subclasses)
(scm_si_direct_methods, scm_si_cpl scm_si_slots)
(scm_si_getters_n_setters, SCM_N_CLASS_SLOTS, SCM_OBJ_CLASS_REDEF):
Remove. Now C code has no special knowledge about the layout of
GOOPS classes.
(SCM_SUBCLASSP): Use scm_class_precedence_list to get CPL.
(SCM_INST, SCM_ACCESSORS_OF): Remove unused macros that were
undocumented and nonsensical.
Andy Wingo [Sun, 11 Jan 2015 19:49:16 +0000 (20:49 +0100)]
Reimplement inherit-applicable! in Scheme
* libguile/goops.c: Move captured keywords and symbols up to the top.
(scm_i_inherit_applicable): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture inherit-applicable!.
* module/oop/goops.scm (inherit-applicable!): Scheme implementation.
Andy Wingo [Sun, 11 Jan 2015 18:11:41 +0000 (19:11 +0100)]
Reimplement %allocate-instance in Scheme
* libguile/goops.c (scm_sys_clear_fields_x): New function.
(scm_sys_allocate_instance): Remove. It was available to C but not to
Scheme and it's really internal.
* libguile/goops.h: Remove scm_sys_allocate_instance.
* module/oop/goops.scm (%allocate-instance): Implement in Scheme, using
allocate-struct and %clear-fields!.
(make, shallow-clone, deep-clone, allocate-instance): Adapt to
%allocate-instance not taking an initargs argument.
Andy Wingo [Sun, 11 Jan 2015 15:36:45 +0000 (16:36 +0100)]
Re-use the vtable "size" field for GOOPS nfields
* module/oop/goops.scm (fold-<class>-slots): The first "reserved" slot
is actually for instance sizes, used by the "simple struct"
mechanism. Reuse this field for GOOPS's "nfields".
(make-standard-class, <class>, initialize): Adapt order of field
initializations.
* libguile/goops.h (SCM_CLASS_CLASS_LAYOUT, SCM_N_CLASS_SLOTS)
* libguile/goops.c (scm_sys_allocate_instance): Adapt.
Andy Wingo [Sun, 11 Jan 2015 15:27:16 +0000 (16:27 +0100)]
Move <class> initialization to Scheme
* libguile/goops.c (scm_sys_make_root_class): Just make the
vtable-vtable, and leave initialization to Scheme.
* libguile/struct.c (scm_i_make_vtable_vtable): Change to take a full
list of fields, not just the extra fields.
(scm_init_struct): Adapt to scm_i_make_vtable_vtable change.
* module/oop/goops.scm (<class>): Compute layout for <class>, and
initialize <class> from here.
Andy Wingo [Sat, 10 Jan 2015 23:21:58 +0000 (00:21 +0100)]
Deprecate scm_get_keyword
* libguile/deprecated.c (scm_get_keyword): Deprecate.
* libguile/deprecated.h:
* libguile/goops.c:
* libguile/goops.h:
Andy Wingo [Sat, 10 Jan 2015 23:17:22 +0000 (00:17 +0100)]
Rewrite %initialize-object in Scheme
* libguile/goops.h:
* libguile/goops.c (scm_sys_initialize_object): Remove C interface.
This function was only really useful as part of a GOOPS initialize
method but was not exported from the goops module.
* module/oop/goops.scm (get-keyword, %initialize-object): Implement in
Scheme.
Andy Wingo [Sat, 10 Jan 2015 22:26:41 +0000 (23:26 +0100)]
Minor goops.c tidying
* libguile/goops.c: Reorder static variables. Remove unused
sym_procedure.
Andy Wingo [Sat, 10 Jan 2015 22:20:47 +0000 (23:20 +0100)]
Remove scm_c_extend_primitive_generic
* libguile/goops.h (scm_c_extend_primitive_generic): Remove public
interface. This was introduced in 2003 with the "extended" generics
but never documented, unused as far as I can tell, and is better
accessed from Scheme.
* libguile/goops.c: Remove support for scm_c_extend_primitive_generic.
Simplify capture of change-class.
Andy Wingo [Sat, 10 Jan 2015 22:02:02 +0000 (23:02 +0100)]
No more concept of "pure generics"
* libguile/goops.h (SCM_PUREGENERICP, SCM_VALIDATE_PUREGENERIC)
(SCM_VTABLE_FLAG_GOOPS_PURE_GENERIC, SCM_CLASSF_PURE_GENERIC):
Remove.
* libguile/goops.c (scm_set_primitive_generic_x): Use SCM_GENERICP, not
SCM_PUREGENERICP.
(scm_sys_bless_pure_generic_vtable_x): Remove; this flag isn't
checked.
* module/oop/goops.scm: Don't call %bless-pure-generic-vtable!; there's
no need.
Andy Wingo [Fri, 9 Jan 2015 23:55:44 +0000 (00:55 +0100)]
Remove TEST_CHANGE_CLASS
* libguile/goops.c (TEST_CHANGE_CLASS): Remove unused macro and comment.
Andy Wingo [Fri, 9 Jan 2015 23:52:26 +0000 (00:52 +0100)]
Remove pure-generic?
* libguile/goops.h:
* libguile/goops.c (scm_pure_generic_p): Remove function only compiled
in debug mode.
Andy Wingo [Fri, 9 Jan 2015 23:51:26 +0000 (00:51 +0100)]
Goops slot-unbound / slot-missing cleanups
* libguile/goops.c: Remove useless slot-unbound / slot-missing
captures.
Andy Wingo [Fri, 9 Jan 2015 23:50:33 +0000 (00:50 +0100)]
Move slot-ref et al to Scheme
* libguile/goops.c:
* module/oop/goops.scm (slot-ref-using-class, slot-set-using-class!):
(slot-bound-using-class?, slot-exists-using-class?, slot-set!):
(slot-bound?, slot-exists?): Move implementation to Scheme.
Andy Wingo [Fri, 9 Jan 2015 21:05:01 +0000 (22:05 +0100)]
Port method and generic accessors to Scheme
* libguile/goops.c:
* module/oop/goops.scm (generic-function-methods)
(method-generic-function, method-specializers, method-procedure): Port
to Scheme.
Andy Wingo [Fri, 9 Jan 2015 20:01:03 +0000 (21:01 +0100)]
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
Andy Wingo [Fri, 9 Jan 2015 19:07:06 +0000 (20:07 +0100)]
goops: use computed class slot offsets; untabify and fix whitepace
* module/oop/goops.scm: Untabify and remove trailing whitespace. Change
slot-ref on classes to struct-ref of fixed offsets.
Andy Wingo [Fri, 9 Jan 2015 18:10:51 +0000 (19:10 +0100)]
Statically compute offsets for slots of <class> in Scheme
* module/oop/goops.scm (macro-fold-left): New helper.
(define-class-index): Define class-index-FOO for each slot FOO.
(fold-<class>-slots): Make the slots list have the marks of the
"visit" macro.
Andy Wingo [Wed, 7 Jan 2015 23:42:27 +0000 (18:42 -0500)]
Refactor to <class> slot computation
* module/oop/goops.scm (macro-fold-right, fold-<class>-slots, <class>):
Use a macro folder to define (and redefine) class slots. We'll use
this to compute static indices as well.
Andy Wingo [Wed, 7 Jan 2015 21:31:56 +0000 (16:31 -0500)]
Remove GOOPS random state
* libguile/goops.c: Remove GOOPS random state, now that there are no
more hashsets.
Andy Wingo [Wed, 7 Jan 2015 21:03:09 +0000 (16:03 -0500)]
More goops.c cleanups, and fix a security issue
* libguile/goops.c: Remove unused #includes.
(make_class_name): New helper, replaces unsafe use of sprintf.
(scm_make_extended_class): Rewrite to call scm_make_standard_class
directly.
(scm_make_port_classes): Rewrite to use scm_make_standard_class, and
no need to patch the CPL any more.
Andy Wingo [Tue, 6 Jan 2015 20:02:52 +0000 (15:02 -0500)]
Remove unused union scm_t_debug_info
* libguile/debug.h (union scm_t_debug_info): Remove unused type
declaration.
Andy Wingo [Tue, 6 Jan 2015 20:00:28 +0000 (15:00 -0500)]
More unused code removal in GOOPS
* libguile/goops.c: Remove unused sym_memoize_method_x.
Andy Wingo [Tue, 6 Jan 2015 19:59:02 +0000 (14:59 -0500)]
Remove private var_no_applicable_method capture
* libguile/goops.c (var_no_applicable_method): Remove unused capture.
(sym_no_applicable_method): Remove unused symbol.
Andy Wingo [Tue, 6 Jan 2015 19:54:44 +0000 (14:54 -0500)]
Remove scm_assert_bound
* libguile/goops.c (scm_assert_bound): Remove unexported unused helper.
* module/oop/goops.scm (make-generic-bound-check-getter): Change
assert-bound use to use `unbound?'.
Andy Wingo [Tue, 6 Jan 2015 19:51:44 +0000 (14:51 -0500)]
Remove scm_at_assert_bound_ref
* libguile/goops.c (scm_at_assert_bound_ref): Remove unused, unexported
function.
Andy Wingo [Tue, 6 Jan 2015 19:24:27 +0000 (14:24 -0500)]
Remove hashset slots from GOOPS classes
* libguile/goops.h (SCM_CLASS_CLASS_LAYOUT, SCM_INSTANCE_HASH)
(SCM_SET_HASHSET):
* libguile/goops.c (prep_hashsets, scm_sys_make_root_class,
scm_sys_init_layout_x):
* module/oop/goops.scm (build-<class>-slots): Remove hashsets from
classes. We haven't implemented hashed dispatch since Guile 1.8, and
it's not clear that the particular formulation of dispatch is a good
idea.
Andy Wingo [Tue, 6 Jan 2015 19:16:03 +0000 (14:16 -0500)]
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(scm_class_primitive_generic, scm_class_vector, scm_class_null)
(scm_class_real, scm_class_complex, scm_class_integer)
(scm_class_fraction, scm_class_unknown, scm_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
Andy Wingo [Tue, 6 Jan 2015 18:41:56 +0000 (13:41 -0500)]
Generics with setters have <applicable-struct-with-setter> layout
* libguile/goops.c (scm_sys_set_object_setter_x): Remove. Instead, we
use slot-set! of 'setter.
(scm_i_define_class_for_vtable): Move lower in the file, and fold in
scm_make_extended_class_from_symbol and make_class_from_symbol.
Properly handle applicable structs with setters.
(scm_class_applicable_struct_with_setter_class): New private capture.
(scm_sys_bless_applicable_struct_vtables_x): Rename to take two
arguments, and bless the second argument as an applicable struct with
setter vtable.
(scm_sys_goops_early_init): Capture setter classes.
* libguile/deprecated.c (SPEC_OF, CPL_OF): Access slots by name, not by
index.
(applicablep, more_specificp): Adapt to use CPL_OF.
(scm_find_method): Access "methods" slot by name.
* libguile/procs.c (scm_setter): Remove special case for generics; if
it's a setter, it will be a normal applicable struct.
* module/oop/goops.scm (<applicable-struct-with-setter-class>)
(<applicable-struct-with-setter>): New classes.
(<generic-with-setter>): Now an instance of the setter metaclass and a
child of the setter class, so that the "setter" slot ends up in the
right place.
(<accessor>, <extended-generic-with-setter>, <extended-accessor>): Be
instances of the setter metaclass.
(<method>, <accessor-method>): Move definitions farther down.
(make): Use slot-set! when initializing setters here.
(initialize): Likewise for <applicable-struct-with-setter>. Remove
specialization for <generic-with-setter>.
Andy Wingo [Tue, 6 Jan 2015 17:06:59 +0000 (12:06 -0500)]
Remove unused CPP defines naming <method> slots
* libguile/goops.h (scm_si_generic_function, scm_si_specializers)
(scm_si_procedure, scm_si_formals, scm_si_body)
(scm_si_make_procedure): Remove unused CPP defines.
Andy Wingo [Tue, 6 Jan 2015 17:03:25 +0000 (12:03 -0500)]
Remove unused `default-slot-definition-class' <class> slot
* libguile/goops.h (SCM_CLASS_CLASS_LAYOUT, scm_si_slotdef_class)
* module/oop/goops.scm (build-<class>-slots): Remove unused
`default-slot-definition-class' <class> slot.
Andy Wingo [Tue, 6 Jan 2015 16:56:23 +0000 (11:56 -0500)]
Remove useless scm_s_slot_set_x export
* libguile/goops.c:
* libguile/goops.h (scm_s_slot_set_x): Remove unused and useless
export.
Andy Wingo [Tue, 6 Jan 2015 16:50:37 +0000 (11:50 -0500)]
Remove unreachable code in scm_setter
* libguile/procs.c (scm_setter): Remove unreachable code.
Andy Wingo [Tue, 6 Jan 2015 16:50:16 +0000 (11:50 -0500)]
Deprecate scm_no_applicable_method C export
* libguile/deprecated.c (scm_init_deprecated_goops)
(scm_no_applicable_method):
* libguile/goops.h:
* libguile/goops.c (scm_no_applicable_method)
(scm_sys_goops_early_init): Deprecate scm_no_applicable_method C
export.
Andy Wingo [Tue, 6 Jan 2015 16:30:24 +0000 (11:30 -0500)]
Remove unused scm_t_method and SCM_METHOD
* libguile/goops.h (scm_t_method, SCM_METHOD): Remove unused struct
type, typedef, and macro.
Andy Wingo [Sun, 4 Jan 2015 20:52:12 +0000 (15:52 -0500)]
Fold GOOPS compile and dispatch modules into main GOOPS module
* libguile/goops.c (scm_sys_invalidate_method_cache_x): Remove C
interface to this internal method. Instead, internal callers are all
from Scheme, so we move the implementation to Scheme.
(scm_make): Dispatch to `make' in Scheme. This is an incompatible but
great change, as it fulfills the common user perception that scm_make
is the same as GOOPS's `make'.
(scm_sys_goops_early_init): Capture `make'.
(scm_no_applicable_method): Define in Scheme and capture in C.
* module/Makefile.am: Remove oop/goops/compile.scm and
oop/goops/dispatch.scm.
* module/oop/goops/compile.scm:
* module/oop/goops/dispatch.scm: Fold into goops.scm.
* module/oop/goops.scm: Fold in the generic compile and dispatch
modules. This eliminates a circularity that caused some eval-when
shenanigans, so remove the eval-whens as well. Reimplement the boot
version of `make' in Scheme, and make the <generic> `initialize'
method handle invalidation instead of the generic %allocate-instance.
(no-applicable-method): Define here. Import the utils module in the
normal define-module block.
Andy Wingo [Sun, 4 Jan 2015 20:37:03 +0000 (15:37 -0500)]
Remove unused *goops-module* definition.
* module/oop/goops.scm (*goops-module*): Remove.
Andy Wingo [Sun, 4 Jan 2015 20:35:25 +0000 (15:35 -0500)]
define-generic, define-extended-generic are hygienic syntax
* module/oop/goops.scm (define-generic, define-extended-generic):
(define-extended-generics): Reimplement using syntax-case.
Andy Wingo [Sun, 4 Jan 2015 20:18:39 +0000 (15:18 -0500)]
`class' is a hygienic macro
* module/oop/goops.scm (class): Rewrite as a hygienic macro.
Andy Wingo [Sun, 4 Jan 2015 18:43:14 +0000 (13:43 -0500)]
Deprecate scm_basic_make_class
* libguile/deprecated.h:
* libguile/deprecated.c (scm_basic_make_class): Deprecate.
* libguile/goops.c:
* libguile/goops.h (scm_make_standard_class): New internal helper. It's
a better spelling, as it matches make-standard-class, and is internal
so as not to cause confusion between boot GOOPS helpers and "real"
GOOPS interfaces.
Andy Wingo [Sun, 4 Jan 2015 18:41:09 +0000 (13:41 -0500)]
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
Andy Wingo [Sun, 4 Jan 2015 18:20:55 +0000 (13:20 -0500)]
Remove declarations without definitions
* libguile/goops.h: Remove declarations for scm_oldfmt, scm_c_oldfmt0,
and scm_c_oldfmt. These symbols were not defined.
Andy Wingo [Sun, 4 Jan 2015 18:19:50 +0000 (13:19 -0500)]
Remove unused %fast-slot-ref / %fast-slot-set! from GOOPS
* libguile/goops.h:
* libguile/goops.c (scm_sys_fast_slot_ref, scm_sys_fast_slot_set_x):
Remove these unused, unsafe functions. They were publically available
only to C.
* module/oop/goops/active-slot.scm (compute-get-n-set): Update to use
struct-ref / struct-set! instead of %fast-slot-ref / %fast-slot-set!
from (oop goops internal).
Andy Wingo [Wed, 24 Dec 2014 16:29:45 +0000 (11:29 -0500)]
Preparation for more GOOPS refactorings
* libguile/goops.c (scm_sys_goops_early_init)
(scm_init_goops_builtins): Factor out some initialization to a
separate helper. This will be the base for moving more things from C
to Scheme in the future.
* module/oop/goops.scm: Call %goops-early-init.
Andy Wingo [Wed, 24 Dec 2014 16:07:47 +0000 (11:07 -0500)]
%init-goops-builtins is an extension, not a global
* libguile/goops.h:
* libguile/goops.c (scm_init_goops, scm_init_goops_builtins): Move
%init-goops-builtins to be an extension instead of a globally
accessible function.
* module/oop/goops.scm: Adapt.
Andy Wingo [Wed, 24 Dec 2014 14:37:14 +0000 (09:37 -0500)]
compute-cpl implementation only in Scheme
* libguile/goops.c (build_class_class_slots, create_basic_classes):
Instead of creating <class> with uninitialized `direct-slots',
`slots', and `getters-n-setters' fields and initializing them later,
create <class> with a "boot" version of unspecialized slots and later
replace the fields with specialized slot classes. This allows
slot-ref to work during early boot, which is necessary to move
compute-cpl to Scheme.
(create_standard_classes): Finish initializing <class> here.
(map, filter_cpl, compute_cpl): Remove the boot-time compute-cpl in C
and its helpers.
(scm_basic_basic_make_class): Call compute-cpl in Scheme.
(fix_cpl): Remove; since we use the correct compute-cpl from the
beginning, there's no need to correct for the deficiencies of the C
implementation any more.
(build_slots_list): Adapt to build_class_class_slots change.
* module/oop/goops.scm (compute-std-cpl, compute-cpl): Move these up to
the top, so they can be called by the boot process.
(compute-clos-cpl, top-sort, std-tie-breaker, build-transitive-closure)
(build-constraints): Remove unused private code.
Andy Wingo [Thu, 18 Dec 2014 21:10:10 +0000 (22:10 +0100)]
More useless goops.c code removal
* libguile/goops.c: Remove needless scm_sym_define_public definition.
Andy Wingo [Thu, 18 Dec 2014 21:08:15 +0000 (22:08 +0100)]
Remove unused macros in goops.c
* libguile/goops.c (NXT_MTHD_METHODS, NXT_MTHD_ARGS): Remove unused
macros.
Andy Wingo [Thu, 18 Dec 2014 20:57:24 +0000 (21:57 +0100)]
Rewrite %method-more-specific? to be in Scheme
* libguile/goops.h:
* libguile/goops.c (more_specificp, scm_sys_method_more_specific_p):
* module/oop/goops.scm (%method-more-specific?): Rewrite in Scheme. We
remove the scm_sys_method_more_specific_p interface as it is a private
interface and it's not extensible.
Andy Wingo [Thu, 18 Dec 2014 20:31:18 +0000 (21:31 +0100)]
Deprecate C interfaces scm_compute_applicable_methods, scm_find_method
* libguile/deprecated.h:
* libguile/deprecated.c (scm_compute_applicable_methods): Deprecate.
This was the boot version of compute-applicable-methods, not the full
version; the right thing to do is to call scheme.
(scm_find_method): Deprecate. Again, the right thing is to do this on
the Scheme level.
* libguile/goops.c:
* libguile/goops.h: Deprecated code moved to deprecated.[ch].
Andy Wingo [Thu, 18 Dec 2014 11:51:11 +0000 (12:51 +0100)]
%compute-applicable-methods in Scheme
* libguile/goops.c: Move %compute-applicable-methods to Scheme.
(scm_sys_goops_loaded): No need to initialize
var_compute_applicable_methods.
* libguile/goops.h (scm_sys_compute_applicable_methods): Remove. This
was internal so it shouldn't cause a problem.
* module/oop/goops.scm (%sort-applicable-methods):
(%compute-applicable-methods): New definitions.
Andy Wingo [Fri, 23 Jan 2015 15:15:45 +0000 (16:15 +0100)]
Mark two coverage tests as XFAIL
* test-suite/tests/coverage.test ("several times", "one proc hit, one
proc unused"): Mark as XFAIL until we can fix either the expander or
the compiler to have proper source info.
Andy Wingo [Fri, 23 Jan 2015 15:07:00 +0000 (16:07 +0100)]
Fix the assembler for unexpected source properties
* module/system/vm/assembler.scm (link-debug): Fix for source properties
that don't have line and column, as are currently being produced by
the new lalr.
Andy Wingo [Thu, 22 Jan 2015 13:54:17 +0000 (14:54 +0100)]
Merge commit '
5b7632331e7551ac202bbaba37c572b96a791c6e'
Conflicts:
module/oop/goops.scm
Andy Wingo [Thu, 22 Jan 2015 13:53:06 +0000 (14:53 +0100)]
Merge commit '
ed72201a795ac1c8d6c0288b6bb710f2bd0ebd9c'
Conflicts:
test-suite/tests/r6rs-ports.test
Andy Wingo [Thu, 22 Jan 2015 13:49:36 +0000 (14:49 +0100)]
Merge commit '
01a301d1b606b84d986b735049e7155d2f4cd6aa'
Conflicts:
libguile/hash.c
Andy Wingo [Thu, 22 Jan 2015 13:48:40 +0000 (14:48 +0100)]
Merge commit '
894d0b894daae001495c748b3352cd79918d3789'
Conflicts:
libguile/hash.c
Andy Wingo [Thu, 22 Jan 2015 13:38:00 +0000 (14:38 +0100)]
Andy Wingo [Thu, 22 Jan 2015 13:37:52 +0000 (14:37 +0100)]
Andy Wingo [Thu, 22 Jan 2015 13:37:18 +0000 (14:37 +0100)]
Merge commit '
cdcba5b2f6270de808e51b3b933374170611b91d'
Conflicts:
module/statprof.scm
Ludovic Courtès [Thu, 22 Jan 2015 12:50:49 +0000 (13:50 +0100)]
Really disable stack underflow checks when VM_CHECK_UNDERFLOW == 0.
* libguile/vm-engine.h: Use '#if VM_CHECK_UNDERFLOW' instead of
'#ifdef'.
Andy Wingo [Thu, 22 Jan 2015 12:34:48 +0000 (13:34 +0100)]
Merge commit '
5d971db802eaa8038db17e1aa5b4c69452739744'
Conflicts:
libguile/ports.c
Andy Wingo [Thu, 22 Jan 2015 12:33:07 +0000 (13:33 +0100)]
Andy Wingo [Thu, 22 Jan 2015 12:32:59 +0000 (13:32 +0100)]
Merge commit '
7c433cbbce83bc9f2f9967afba00bbb68e312657'
Conflicts:
meta/Makefile.am
Andy Wingo [Thu, 22 Jan 2015 12:30:25 +0000 (13:30 +0100)]
Merge commit '
5fac1a7ada362d78f13143acbc0ceca7f2f101de'
Conflicts:
configure.ac
doc/ref/libguile-parallel.texi
Andy Wingo [Thu, 22 Jan 2015 12:24:30 +0000 (13:24 +0100)]
Andy Wingo [Thu, 22 Jan 2015 12:16:49 +0000 (13:16 +0100)]
Merge commit '
81d2c84674f03f9028f26474ab19d3d3f353881a'
Some fixups in bytevectors.c.
Andy Wingo [Thu, 22 Jan 2015 12:04:34 +0000 (13:04 +0100)]
Andy Wingo [Thu, 22 Jan 2015 12:04:11 +0000 (13:04 +0100)]
Andy Wingo [Mon, 19 Jan 2015 15:57:42 +0000 (16:57 +0100)]
Keywords have a tc7
* libguile/tags.h (scm_tc7_keyword): Allocate a tc7, so that the VM can
have cheap keyword? tests.
* libguile/keywords.c:
* libguile/keywords.h: Adapt.
* libguile/goops.c (scm_class_of, scm_sys_goops_early_init): Capture
<keyword>.
* libguile/print.c (iprin1): Inline keyword printer.
* libguile/evalext.c (scm_self_evaluating_p): Add keywords here.
* libguile/deprecated.h:
* libguile/deprecated.c (scm_tc16_keyword): Deprecate.
* module/language/cps/compile-bytecode.scm (compile-fun): Add keyword?
case, and bitvector? case while we're at it.
* module/language/cps/effects-analysis.scm (define-primitive-effects):
Add bytevector?, keyword?, and bitvector? cases.
* module/language/cps/primitives.scm (*branching-primcall-arities*): Add
keyword?.
* module/language/cps/types.scm (bitvector?, keyword?, bytevector?): Add
branch inferrers.
* module/language/tree-il/primitives.scm (*interesting-primitive-names*):
(*effect-free-primitives*):
(*effect+exception-free-primitives*): Add bytevector?, keyword?, and
bitvector?.
* module/oop/goops.scm (<keyword>): New class.
* module/system/base/types.scm (%tc7-keyword, cell->object): Add cases.
* module/system/vm/assembler.scm (br-if-keyword): New definition.
* module/system/vm/disassembler.scm (code-annotation): Add br-if-tc7
case for keywords.
* test-suite/tests/types.test ("clonable objects"): Update now that
keywords are cloneable.
Andy Wingo [Mon, 19 Jan 2015 09:37:34 +0000 (10:37 +0100)]
Add allocate-struct, struct-ref, struct-set! instructions
* libguile/vm-engine.c (allocate-struct, struct-ref, struct-set!): New
instructions, to complement their "immediate" variants.
* module/language/cps/compile-bytecode.scm (compile-fun):
* module/system/vm/assembler.scm (system): Wire up the new instructions.
Andy Wingo [Thu, 22 Jan 2015 11:50:18 +0000 (12:50 +0100)]
Merge commit '
5af307de43e4b65eec7f235b48a8908f2a00f134'
Conflicts:
test-suite/tests/reader.test
Andy Wingo [Thu, 22 Jan 2015 11:46:11 +0000 (12:46 +0100)]
Andy Wingo [Thu, 22 Jan 2015 11:40:43 +0000 (12:40 +0100)]
Fix #:init-value on class-allocated slots
Allocating an instance of a class with a #:class or #:each-subclass slot
allocation should not re-initialize the class-allocated slot. In Guile
1.8, this worked by effectively doing a slot-bound? within
%initialize-object. In Guile 2.0 we instead initialize the slot when it
is allocated -- in compute-get-n-set.
* module/oop/goops.scm (compute-getters-n-setters): Don't set an
init-thunk for class-allocated slots.
(compute-get-n-set): Initialize class-allocated slots here, if an
init-thunk or init-value are present.
* test-suite/tests/goops.test ("#:each-subclass"): Add test.
Ludovic Courtès [Sun, 18 Jan 2015 20:52:48 +0000 (21:52 +0100)]
Fix buffer overrun with unbuffered custom binary input ports.
Fixes <http://bugs.gnu.org/19621>.
Before that, in 'cbip_fill_input', BUFFERED would be set to 0 when
reading from 'scm_getc' et al, because 'shortbuf' was being used. Thus,
we could eventually execute this line:
/* Copy the data back to the internal buffer. */
memcpy ((char *) c_port->read_pos, SCM_BYTEVECTOR_CONTENTS (bv),
c_octets);
But 'read_pos' would quickly point to the fields beyond 'shortbuf',
thereby leading to a corruption of the 'scm_t_port' itself.
* libguile/r6rs-ports.c (cbip_setvbuf): When READ_SIZE is 0, keep using
BV as the 'read_buf'.
(cbip_fill_input): Adjust assertion to accept 'read_buf_size = 1'.
* test-suite/tests/r6rs-ports.test ("7.2.7 Input Ports")["custom binary
input port unbuffered & 'get-string-all'", "custom binary input port
unbuffered UTF-8 & 'get-string-all'"]: New tests.
Ludovic Courtès [Tue, 13 Jan 2015 08:30:08 +0000 (09:30 +0100)]
Improve output of command-line errors.
* module/ice-9/command-line.scm (shell-usage): Add 'newline' call when
FMT is true.
(compile-shell-switches)[error]: Prepend "error: " and append "~%" to
FMT.
Use a lower-case message.
Ludovic Courtès [Sun, 11 Jan 2015 21:40:07 +0000 (22:40 +0100)]
Optimize 'string-hash'.
This yields a 50% improvement on the "narrow string" benchmark of
'hash.bm', 41% on "wide string", and 76% on "long string".
* libguile/hash.c (scm_i_string_hash): Rewrite to avoid
'scm_i_string_ref' calls.
Ludovic Courtès [Sun, 11 Jan 2015 21:37:00 +0000 (22:37 +0100)]
Add 'string-hash' benchmarks.
* benchmark-suite/benchmarks/hash.bm: New file.
* benchmark-suite/Makefile.am (SCM_BENCHMARKS): Add it.
Ludovic Courtès [Sun, 11 Jan 2015 21:11:17 +0000 (22:11 +0100)]
Deprecate 'scm_string_hash'.
This function has been unused internally for some time and is undocumented.
* libguile/hash.c (scm_string_hash): Wrap if #if SCM_ENABLE_DEPRECATED
== 1.
* libguile/hash.h (scm_string_hash): Likewise, and replace SCM_API with
SCM_DEPRECATED.
Ludovic Courtès [Sun, 11 Jan 2015 20:57:54 +0000 (21:57 +0100)]
Optimize 'write' for strings.
This shows a 19% improvement on the "string without escapes"
micro-benchmark of 'write.bm', and 12% on "string with escapes".
* libguile/print.c (iprin1) <scm_tc7_string>: Replace 'scm_i_string_ref'
loop with a call to 'write_string'.
(display_character): Adjust description of return value in comment.
(write_string): New function.
Ludovic Courtès [Sun, 11 Jan 2015 19:58:34 +0000 (20:58 +0100)]
Avoid converting the 'mode' argument of 'open-file'.
* libguile/fports.c (scm_open_file_with_encoding): const-qualify 'md'
and 'ptr'. Add call to 'scm_i_try_narrow_string'. Use
'scm_i_string_chars' instead of 'scm_to_locale_string' plus '
scm_dynwind_free'.
* test-suite/tests/ports.test ("invalid wide mode string",
"valid wide mode string"): New tests.
Ludovic Courtès [Sun, 11 Jan 2015 19:44:36 +0000 (20:44 +0100)]
statprof: 'statprof' and 'with-statprof' return the code's return values.
* module/statprof.scm (statprof): Return the return values of THUNK.
(with-statprof): Adjust docstring accordingly.
* test-suite/tests/statprof.test ("return values"): New test.
* doc/ref/statprof.texi (Statprof): Adjust accordingly.
Ludovic Courtès [Fri, 9 Jan 2015 14:47:15 +0000 (15:47 +0100)]
Improve deprecation message of 'scm_add_to_port_table'.
Reported by Thien-Thi Nguyen <ttn@gnu.org>.
* libguile/ports.c (scm_add_to_port_table): Mention
'scm_new_port_table_entry'.
Mark H Weaver [Sun, 14 Dec 2014 15:24:00 +0000 (10:24 -0500)]
Assembler: Cope with non-string port filenames.
Fixes <http://bugs.gnu.org/19354>.
Reported by Linas Vepstas <linasvepstas@gmail.com>.
* module/system/vm/assembler.scm (write-sources): Intern the filename
only if it's a string. (For sockets, the filename is a symbol).
Andy Wingo [Wed, 10 Dec 2014 13:34:44 +0000 (14:34 +0100)]
Convert primitive-eval to "compile" its expressions to linked closures
* libguile/memoize.c (memoize): Fix meta on subsequent case-lambda
clauses.
* module/ice-9/eval.scm (primitive-eval): Rewrite to compile expressions
to thunks, to avoid runtime dispatch cost.
Andy Wingo [Wed, 10 Dec 2014 15:25:19 +0000 (16:25 +0100)]
Fix syntax.test
* test-suite/tests/syntax.test (exception:variable-ref): Change expected
error.
Andy Wingo [Sun, 7 Dec 2014 18:03:19 +0000 (19:03 +0100)]
Minor evaluator tweaks
* libguile/eval.c (eval): Remove unused variable.
* libguile/memoize.c (unmemoize): Fix unmemoization.
* module/ice-9/eval.scm: Attempt to speed up common box-ref cases.
Andy Wingo [Sun, 7 Dec 2014 14:52:34 +0000 (15:52 +0100)]
Simplify variable resolution in the evaluator
* libguile/expand.c (convert_assignment): Handle creation of the default
lambda-case body here.
* libguile/eval.c (eval):
* module/ice-9/eval.scm (primitive-eval):
* libguile/memoize.h:
* libguile/memoize.c (MAKMEMO_BOX_REF, MAKMEMO_BOX_SET):
(MAKMEMO_TOP_BOX, MAKMEMO_MOD_BOX): Refactor all global var resolution
to go through "resolve". Add "box-ref" and "box-set!". Rename
memoize-variable-access! to %resolve-variable, and don't be
destructive.
Andy Wingo [Sun, 7 Dec 2014 08:34:22 +0000 (09:34 +0100)]
Closure conversion in evaluator
* libguile/memoize.c (MAKMEMO_CAPTURE_ENV, push_nested_link)
(push_flat_link, env_link_is_flat, env_link_vars)
(env_link_add_flat_var, lookup, capture_flat_env, memoize): Capture
flat environments around closures.