diff options
Diffstat (limited to 'libguile')
-rw-r--r-- | libguile/eq.c | 3 | ||||
-rw-r--r-- | libguile/evalext.c | 2 | ||||
-rw-r--r-- | libguile/fluids.c | 59 | ||||
-rw-r--r-- | libguile/fluids.h | 27 | ||||
-rw-r--r-- | libguile/gc.c | 4 | ||||
-rw-r--r-- | libguile/goops.c | 18 | ||||
-rw-r--r-- | libguile/goops.h | 1 | ||||
-rw-r--r-- | libguile/hashtab.c | 6 | ||||
-rw-r--r-- | libguile/hashtab.h | 1 | ||||
-rw-r--r-- | libguile/init.c | 1 | ||||
-rw-r--r-- | libguile/print.c | 3 | ||||
-rw-r--r-- | libguile/tags.h | 10 |
12 files changed, 54 insertions, 81 deletions
diff --git a/libguile/eq.c b/libguile/eq.c index 9aa86a509..eaf1accae 100644 --- a/libguile/eq.c +++ b/libguile/eq.c @@ -343,9 +343,6 @@ scm_equal_p (SCM x, SCM y) case scm_tc7_vector: case scm_tc7_wvect: return scm_i_vector_equal_p (x, y); - - case scm_tc7_hashtable: - return scm_i_hashtable_equal_p (x, y); } /* Check equality between structs of equal type (see cell-type test above). */ if (SCM_STRUCTP (x)) diff --git a/libguile/evalext.c b/libguile/evalext.c index 5a0c0e936..9af83838f 100644 --- a/libguile/evalext.c +++ b/libguile/evalext.c @@ -78,6 +78,8 @@ SCM_DEFINE (scm_self_evaluating_p, "self-evaluating?", 1, 0, 0, case scm_tc7_vector: case scm_tc7_wvect: case scm_tc7_hashtable: + case scm_tc7_fluid: + case scm_tc7_dynamic_state: case scm_tc7_number: case scm_tc7_string: case scm_tc7_smob: diff --git a/libguile/fluids.c b/libguile/fluids.c index 75dcccf75..bb9447fd5 100644 --- a/libguile/fluids.c +++ b/libguile/fluids.c @@ -26,7 +26,6 @@ #include "libguile/_scm.h" #include "libguile/print.h" -#include "libguile/smob.h" #include "libguile/dynwind.h" #include "libguile/fluids.h" #include "libguile/alist.h" @@ -66,22 +65,12 @@ static size_t allocated_fluids_len = 0; static size_t allocated_fluids_num = 0; static char *allocated_fluids = NULL; -static scm_t_bits tc16_fluid; +#define IS_FLUID(x) (!SCM_IMP (x) && SCM_TYP7 (x) == scm_tc7_fluid) +#define FLUID_NUM(x) ((size_t)SCM_CELL_WORD_1(x)) -#define IS_FLUID(x) SCM_SMOB_PREDICATE(tc16_fluid, (x)) -#define FLUID_NUM(x) ((size_t)SCM_SMOB_DATA(x)) -#define FLUID_NEXT(x) SCM_SMOB_OBJECT_2(x) -#define FLUID_NEXT_LOC(x) SCM_SMOB_OBJECT_2_LOC(x) -#define SET_FLUID_NEXT(x,y) SCM_SET_SMOB_OBJECT_2((x), (y)) - -static scm_t_bits tc16_dynamic_state; - -#define IS_DYNAMIC_STATE(x) SCM_SMOB_PREDICATE(tc16_dynamic_state, (x)) -#define DYNAMIC_STATE_FLUIDS(x) SCM_SMOB_OBJECT(x) -#define SET_DYNAMIC_STATE_FLUIDS(x, y) SCM_SET_SMOB_OBJECT((x), (y)) -#define DYNAMIC_STATE_NEXT(x) SCM_SMOB_OBJECT_2(x) -#define DYNAMIC_STATE_NEXT_LOC(x) SCM_SMOB_OBJECT_2_LOC(x) -#define SET_DYNAMIC_STATE_NEXT(x, y) SCM_SET_SMOB_OBJECT_2((x), (y)) +#define IS_DYNAMIC_STATE(x) (!SCM_IMP (x) && SCM_TYP7 (x) == scm_tc7_dynamic_state) +#define DYNAMIC_STATE_FLUIDS(x) SCM_PACK (SCM_CELL_WORD_1 (x)) +#define SET_DYNAMIC_STATE_FLUIDS(x, y) SCM_SET_CELL_WORD_1 ((x), (SCM_UNPACK (y))) @@ -115,13 +104,12 @@ grow_dynamic_state (SCM state) scm_i_pthread_mutex_unlock (&fluid_admin_mutex); } -static int -fluid_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) +void +scm_i_fluid_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) { scm_puts ("#<fluid ", port); scm_intprint ((int) FLUID_NUM (exp), 10, port); scm_putc ('>', port); - return 1; } static size_t @@ -190,12 +178,7 @@ SCM_DEFINE (scm_make_fluid, "make-fluid", 0, 0, 0, "with its own dynamic state, you can use fluids for thread local storage.") #define FUNC_NAME s_scm_make_fluid { - SCM fluid; - - SCM_NEWSMOB2 (fluid, tc16_fluid, - (scm_t_bits) next_fluid_num (), SCM_UNPACK (SCM_EOL)); - - return fluid; + return scm_cell (scm_tc7_fluid, (scm_t_bits) next_fluid_num ()); } #undef FUNC_NAME @@ -406,10 +389,7 @@ SCM scm_i_make_initial_dynamic_state () { SCM fluids = scm_c_make_vector (allocated_fluids_len, SCM_BOOL_F); - SCM state; - SCM_NEWSMOB2 (state, tc16_dynamic_state, - SCM_UNPACK (fluids), SCM_UNPACK (SCM_EOL)); - return state; + return scm_cell (scm_tc7_dynamic_state, SCM_UNPACK (fluids)); } SCM_DEFINE (scm_make_dynamic_state, "make-dynamic-state", 0, 1, 0, @@ -418,17 +398,14 @@ SCM_DEFINE (scm_make_dynamic_state, "make-dynamic-state", 0, 1, 0, "or of the current dynamic state when @var{parent} is omitted.") #define FUNC_NAME s_scm_make_dynamic_state { - SCM fluids, state; + SCM fluids; if (SCM_UNBNDP (parent)) parent = scm_current_dynamic_state (); - scm_assert_smob_type (tc16_dynamic_state, parent); + SCM_ASSERT (IS_DYNAMIC_STATE (parent), parent, SCM_ARG1, FUNC_NAME); fluids = scm_vector_copy (DYNAMIC_STATE_FLUIDS (parent)); - SCM_NEWSMOB2 (state, tc16_dynamic_state, - SCM_UNPACK (fluids), SCM_UNPACK (SCM_EOL)); - - return state; + return scm_cell (scm_tc7_dynamic_state, SCM_UNPACK (fluids)); } #undef FUNC_NAME @@ -465,7 +442,7 @@ SCM_DEFINE (scm_set_current_dynamic_state, "set-current-dynamic-state", 1,0,0, { scm_i_thread *t = SCM_I_CURRENT_THREAD; SCM old = t->dynamic_state; - scm_assert_smob_type (tc16_dynamic_state, state); + SCM_ASSERT (IS_DYNAMIC_STATE (state), state, SCM_ARG1, FUNC_NAME); t->dynamic_state = state; return old; } @@ -481,7 +458,7 @@ void scm_dynwind_current_dynamic_state (SCM state) { SCM loc = scm_cons (state, SCM_EOL); - scm_assert_smob_type (tc16_dynamic_state, state); + SCM_ASSERT (IS_DYNAMIC_STATE (state), state, SCM_ARG1, NULL); scm_dynwind_rewind_handler_with_scm (swap_dynamic_state, loc, SCM_F_WIND_EXPLICITLY); scm_dynwind_unwind_handler_with_scm (swap_dynamic_state, loc, @@ -514,14 +491,6 @@ SCM_DEFINE (scm_with_dynamic_state, "with-dynamic-state", 2, 0, 0, } #undef FUNC_NAME -void -scm_fluids_prehistory () -{ - tc16_fluid = scm_make_smob_type ("fluid", 0); - scm_set_smob_print (tc16_fluid, fluid_print); - - tc16_dynamic_state = scm_make_smob_type ("dynamic-state", 0); -} void scm_init_fluids () diff --git a/libguile/fluids.h b/libguile/fluids.h index 2bfcce52f..8f26c23ac 100644 --- a/libguile/fluids.h +++ b/libguile/fluids.h @@ -3,7 +3,7 @@ #ifndef SCM_FLUIDS_H #define SCM_FLUIDS_H -/* Copyright (C) 1996,2000,2001, 2006, 2008 Free Software Foundation, Inc. +/* Copyright (C) 1996,2000,2001, 2006, 2008, 2009 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -29,18 +29,17 @@ /* Fluids. - Fluids are objects of a certain type (a smob) that can hold one SCM - value per dynamic state. That is, modifications to this value are - only visible to code that executes with the same dynamic state as - the modifying code. When a new dynamic state is constructed, it - inherits the values from its parent. Because each thread executes - with its own dynamic state, you can use fluids for thread local - storage. - - Each fluid is identified by a small integer. This integer is used - to index a vector that holds the values of all fluids. A dynamic - state consists of this vector, wrapped in a smob so that the vector - can grow. + Fluids are objects of a certain type that can hold one SCM value per + dynamic state. That is, modifications to this value are only visible + to code that executes with the same dynamic state as the modifying + code. When a new dynamic state is constructed, it inherits the + values from its parent. Because each thread executes with its own + dynamic state, you can use fluids for thread local storage. + + Each fluid is identified by a small integer. This integer is used to + index a vector that holds the values of all fluids. A dynamic state + consists of this vector, wrapped in an object so that the vector can + grow. */ /* The fastest way to acces/modify the value of a fluid. These macros @@ -78,7 +77,7 @@ SCM_API SCM scm_with_dynamic_state (SCM state, SCM proc); SCM_INTERNAL SCM scm_i_make_initial_dynamic_state (void); -SCM_INTERNAL void scm_fluids_prehistory (void); +SCM_INTERNAL void scm_i_fluid_print (SCM exp, SCM port, scm_print_state *pstate); SCM_INTERNAL void scm_init_fluids (void); #endif /* SCM_FLUIDS_H */ diff --git a/libguile/gc.c b/libguile/gc.c index 4bedb0531..dedbd28e0 100644 --- a/libguile/gc.c +++ b/libguile/gc.c @@ -758,6 +758,10 @@ scm_i_tag_name (scm_t_bits tag) return "pws"; case scm_tc7_hashtable: return "hashtable"; + case scm_tc7_fluid: + return "fluid"; + case scm_tc7_dynamic_state: + return "dynamic state"; case scm_tc7_wvect: return "weak vector"; case scm_tc7_vector: diff --git a/libguile/goops.c b/libguile/goops.c index d02257bbc..18332168f 100644 --- a/libguile/goops.c +++ b/libguile/goops.c @@ -133,7 +133,7 @@ static scm_t_rstate *goops_rstate; SCM scm_class_boolean, scm_class_char, scm_class_pair; SCM scm_class_procedure, scm_class_string, scm_class_symbol; SCM scm_class_procedure_with_setter, scm_class_primitive_generic; -SCM scm_class_vector, scm_class_hashtable, scm_class_null; +SCM scm_class_vector, scm_class_null; SCM scm_class_integer, scm_class_real, scm_class_complex, scm_class_fraction; SCM scm_class_unknown; SCM scm_class_top, scm_class_object, scm_class_class; @@ -158,6 +158,10 @@ SCM scm_class_protected_hidden, scm_class_protected_opaque, scm_class_protected_ SCM scm_class_scm; SCM scm_class_int, scm_class_float, scm_class_double; +static SCM class_hashtable; +static SCM class_fluid; +static SCM class_dynamic_state; + /* Port classes. Allocate 3 times the maximum number of port types so that input ports, output ports, and in/out ports can be stored at different offsets. See `SCM_IN_PCLASS_INDEX' et al. */ @@ -211,7 +215,11 @@ SCM_DEFINE (scm_class_of, "class-of", 1, 0, 0, case scm_tc7_wvect: return scm_class_vector; case scm_tc7_hashtable: - return scm_class_hashtable; + return class_hashtable; + case scm_tc7_fluid: + return class_fluid; + case scm_tc7_dynamic_state: + return class_dynamic_state; case scm_tc7_string: return scm_class_string; case scm_tc7_number: @@ -2402,7 +2410,11 @@ create_standard_classes (void) scm_class_class, scm_class_top, SCM_EOL); make_stdcls (&scm_class_vector, "<vector>", scm_class_class, scm_class_top, SCM_EOL); - make_stdcls (&scm_class_hashtable, "<hashtable>", + make_stdcls (&class_hashtable, "<hashtable>", + scm_class_class, scm_class_top, SCM_EOL); + make_stdcls (&class_fluid, "<fluid>", + scm_class_class, scm_class_top, SCM_EOL); + make_stdcls (&class_dynamic_state, "<dynamic-state>", scm_class_class, scm_class_top, SCM_EOL); make_stdcls (&scm_class_number, "<number>", scm_class_class, scm_class_top, SCM_EOL); diff --git a/libguile/goops.h b/libguile/goops.h index 4c1b45bd5..48b94a158 100644 --- a/libguile/goops.h +++ b/libguile/goops.h @@ -180,7 +180,6 @@ SCM_API SCM scm_class_symbol; SCM_API SCM scm_class_procedure_with_setter; SCM_API SCM scm_class_primitive_generic; SCM_API SCM scm_class_vector; -SCM_API SCM scm_class_hashtable; SCM_API SCM scm_class_null; SCM_API SCM scm_class_real; SCM_API SCM scm_class_complex; diff --git a/libguile/hashtab.c b/libguile/hashtab.c index 608d53466..059be6f11 100644 --- a/libguile/hashtab.c +++ b/libguile/hashtab.c @@ -355,12 +355,6 @@ scm_i_hashtable_print (SCM exp, SCM port, scm_print_state *pstate) scm_puts (">", port); } -SCM -scm_i_hashtable_equal_p (SCM x, SCM y) -{ - return SCM_BOOL_F; -} - SCM scm_c_make_hash_table (unsigned long k) diff --git a/libguile/hashtab.h b/libguile/hashtab.h index 3fbcb90ef..75b60e9ad 100644 --- a/libguile/hashtab.h +++ b/libguile/hashtab.h @@ -157,7 +157,6 @@ SCM_API SCM scm_hash_for_each (SCM proc, SCM hash); SCM_API SCM scm_hash_for_each_handle (SCM proc, SCM hash); SCM_API SCM scm_hash_map_to_list (SCM proc, SCM hash); SCM_INTERNAL void scm_i_hashtable_print (SCM exp, SCM port, scm_print_state *pstate); -SCM_INTERNAL SCM scm_i_hashtable_equal_p (SCM x, SCM y); SCM_INTERNAL void scm_init_hashtab (void); #endif /* SCM_HASHTAB_H */ diff --git a/libguile/init.c b/libguile/init.c index bbe88e88a..3bd173a0d 100644 --- a/libguile/init.c +++ b/libguile/init.c @@ -438,7 +438,6 @@ scm_i_init_guile (SCM_STACKITEM *base) scm_threads_prehistory (base); scm_ports_prehistory (); scm_smob_prehistory (); - scm_fluids_prehistory (); scm_weaks_prehistory (); #ifdef GUILE_DEBUG_MALLOC scm_debug_malloc_prehistory (); diff --git a/libguile/print.c b/libguile/print.c index ea439a62f..56521398b 100644 --- a/libguile/print.c +++ b/libguile/print.c @@ -712,6 +712,9 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate) case scm_tc7_hashtable: scm_i_hashtable_print (exp, port, pstate); break; + case scm_tc7_fluid: + scm_i_fluid_print (exp, port, pstate); + break; case scm_tc7_wvect: ENTER_NESTED_DATA (pstate, exp, circref); if (SCM_IS_WHVEC (exp)) diff --git a/libguile/tags.h b/libguile/tags.h index c22d927c0..50207755d 100644 --- a/libguile/tags.h +++ b/libguile/tags.h @@ -411,15 +411,11 @@ typedef scm_t_uintptr scm_t_bits; #define scm_tc7_stringbuf 39 #define scm_tc7_bytevector 77 -/* Many of the following should be turned - * into structs or smobs. We need back some - * of these 7 bit tags! */ - #define scm_tc7_pws 31 - #define scm_tc7_hashtable 29 -#define scm_tc7_unused_2 37 -#define scm_tc7_unused_3 45 +#define scm_tc7_fluid 37 +#define scm_tc7_dynamic_state 45 + #define scm_tc7_unused_4 47 #define scm_tc7_unused_5 53 #define scm_tc7_unused_6 55 |