diff options
author | Andy Wingo <wingo@pobox.com> | 2009-10-31 12:04:53 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2009-11-15 20:28:11 +0100 |
commit | 521ac49bdea053227c973a92e37fcc0879fa20d0 (patch) | |
tree | b29383cc2291ed2a2d485a2644d96e3f73164d98 | |
parent | 48c7c44e70e6ba80fe16bfb179320cffb6a03996 (diff) | |
download | guile-521ac49bdea053227c973a92e37fcc0879fa20d0.tar.gz |
SCM_GENERIC_METHOD_CACHE macro splits from SCM_ENTITY_PROCEDURE
* libguile/goops.h (SCM_GENERIC_METHOD_CACHE)
(SCM_SET_GENERIC_METHOD_CACHE): Two new macros; the same as
SCM_[SET_]ENTITY_PROCEDURE, but more reflecting the reality of the
generic hack.
* libguile/eval.i.c:
* libguile/goops.c:
* libguile/objects.c:
* libguile/vm-i-system.c: Use the new macros when it is appropriate to
do so.
-rw-r--r-- | libguile/eval.i.c | 8 | ||||
-rw-r--r-- | libguile/goops.c | 4 | ||||
-rw-r--r-- | libguile/goops.h | 2 | ||||
-rw-r--r-- | libguile/objects.c | 5 | ||||
-rw-r--r-- | libguile/vm-i-system.c | 6 |
5 files changed, 13 insertions, 12 deletions
diff --git a/libguile/eval.i.c b/libguile/eval.i.c index 2eba83e86..15107c51d 100644 --- a/libguile/eval.i.c +++ b/libguile/eval.i.c @@ -1027,7 +1027,7 @@ dispatch: case scm_tcs_struct: if (SCM_OBJ_CLASS_FLAGS (proc) & SCM_CLASSF_PURE_GENERIC) { - x = SCM_ENTITY_PROCEDURE (proc); + x = SCM_GENERIC_METHOD_CACHE (proc); arg1 = SCM_EOL; goto type_dispatch; } @@ -1154,7 +1154,7 @@ dispatch: case scm_tcs_struct: if (SCM_OBJ_CLASS_FLAGS (proc) & SCM_CLASSF_PURE_GENERIC) { - x = SCM_ENTITY_PROCEDURE (proc); + x = SCM_GENERIC_METHOD_CACHE (proc); #ifdef DEVAL arg1 = debug.info->a.args; #else @@ -1233,7 +1233,7 @@ dispatch: case scm_tcs_struct: if (SCM_OBJ_CLASS_FLAGS (proc) & SCM_CLASSF_PURE_GENERIC) { - x = SCM_ENTITY_PROCEDURE (proc); + x = SCM_GENERIC_METHOD_CACHE (proc); #ifdef DEVAL arg1 = debug.info->a.args; #else @@ -1464,7 +1464,7 @@ dispatch: #else arg1 = scm_cons2 (arg1, arg2, scm_ceval_args (x, env, proc)); #endif - x = SCM_ENTITY_PROCEDURE (proc); + x = SCM_GENERIC_METHOD_CACHE (proc); goto type_dispatch; } else if (SCM_I_ENTITYP (proc)) diff --git a/libguile/goops.c b/libguile/goops.c index 0e9d04494..3f9ad90d1 100644 --- a/libguile/goops.c +++ b/libguile/goops.c @@ -1797,7 +1797,7 @@ static void clear_method_cache (SCM gf) { SCM cache = scm_make_method_cache (gf); - SCM_SET_ENTITY_PROCEDURE (gf, cache); + SCM_SET_GENERIC_METHOD_CACHE (gf, cache); SCM_SET_SLOT (gf, scm_si_used_by, SCM_BOOL_F); } @@ -1821,7 +1821,7 @@ SCM_DEFINE (scm_sys_invalidate_method_cache_x, "%invalidate-method-cache!", 1, 0 { SCM n = SCM_SLOT (gf, scm_si_n_specialized); /* The sign of n is a flag indicating rest args. */ - SCM_SET_MCACHE_N_SPECIALIZED (SCM_ENTITY_PROCEDURE (gf), n); + SCM_SET_MCACHE_N_SPECIALIZED (SCM_GENERIC_METHOD_CACHE (gf), n); } return SCM_UNSPECIFIED; } diff --git a/libguile/goops.h b/libguile/goops.h index 1e3ed535f..5d626c413 100644 --- a/libguile/goops.h +++ b/libguile/goops.h @@ -133,6 +133,8 @@ typedef struct scm_t_method { (SCM_INSTANCEP (x) && SCM_SUBCLASSP (SCM_CLASS_OF (x), scm_class_method)) #define SCM_VALIDATE_METHOD(pos, x) SCM_MAKE_VALIDATE_MSG (pos, x, METHODP, "method") +#define SCM_GENERIC_METHOD_CACHE(G) (SCM_PACK (SCM_STRUCT_DATA (G) [scm_struct_i_procedure])) +#define SCM_SET_GENERIC_METHOD_CACHE(G,C) (SCM_STRUCT_DATA (G) [scm_struct_i_procedure] = SCM_UNPACK (C)) #define SCM_MCACHE_N_SPECIALIZED(C) SCM_CADDR (C) #define SCM_SET_MCACHE_N_SPECIALIZED(C, X) SCM_SETCAR (SCM_CDDR (C), X) diff --git a/libguile/objects.c b/libguile/objects.c index 6ce7d7c16..81b941cf4 100644 --- a/libguile/objects.c +++ b/libguile/objects.c @@ -163,7 +163,7 @@ scm_mcache_compute_cmethod (SCM cache, SCM args) SCM scm_apply_generic (SCM gf, SCM args) { - SCM cmethod = scm_mcache_compute_cmethod (SCM_ENTITY_PROCEDURE (gf), args); + SCM cmethod = scm_mcache_compute_cmethod (SCM_GENERIC_METHOD_CACHE (gf), args); if (SCM_PROGRAM_P (cmethod)) return scm_vm_apply (scm_the_vm (), cmethod, args); else if (scm_is_pair (cmethod)) @@ -247,8 +247,7 @@ SCM_DEFINE (scm_set_object_procedure_x, "set-object-procedure!", 2, 0, 0, obj, SCM_ARG1, FUNC_NAME); - SCM_ASSERT (scm_valid_object_procedure_p (proc), proc, SCM_ARG2, FUNC_NAME); -SCM_SET_ENTITY_PROCEDURE (obj, proc); + SCM_SET_ENTITY_PROCEDURE (obj, proc); return SCM_UNSPECIFIED; } #undef FUNC_NAME diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c index d60c20c3b..8383a12af 100644 --- a/libguile/vm-i-system.c +++ b/libguile/vm-i-system.c @@ -757,7 +757,7 @@ VM_DEFINE_INSTRUCTION (53, call, "call", 1, -1, 1) SYNC_REGISTER (); while (n--) args = scm_cons (*walk--, args); - *walk = scm_mcache_compute_cmethod (SCM_ENTITY_PROCEDURE (x), args); + *walk = scm_mcache_compute_cmethod (SCM_GENERIC_METHOD_CACHE (x), args); goto vm_call; } /* @@ -841,7 +841,7 @@ VM_DEFINE_INSTRUCTION (54, goto_args, "goto/args", 1, -1, 1) SYNC_REGISTER (); while (n--) args = scm_cons (*walk--, args); - *walk = scm_mcache_compute_cmethod (SCM_ENTITY_PROCEDURE (x), args); + *walk = scm_mcache_compute_cmethod (SCM_GENERIC_METHOD_CACHE (x), args); goto vm_goto_args; } @@ -933,7 +933,7 @@ VM_DEFINE_INSTRUCTION (57, mv_call, "mv-call", 4, -1, 1) SYNC_REGISTER (); while (n--) args = scm_cons (*walk--, args); - *walk = scm_mcache_compute_cmethod (SCM_ENTITY_PROCEDURE (x), args); + *walk = scm_mcache_compute_cmethod (SCM_GENERIC_METHOD_CACHE (x), args); goto vm_mv_call; } /* |