Merge remote-tracking branch 'local-2.0/stable-2.0'
[bpt/guile.git] / libguile / procprop.c
index ac2fa12..56bd389 100644 (file)
@@ -31,7 +31,7 @@
 #include "libguile/smob.h"
 #include "libguile/root.h"
 #include "libguile/vectors.h"
-#include "libguile/hashtab.h"
+#include "libguile/weak-table.h"
 #include "libguile/programs.h"
 
 #include "libguile/validate.h"
@@ -42,34 +42,62 @@ SCM_GLOBAL_SYMBOL (scm_sym_system_procedure, "system-procedure");
 SCM_GLOBAL_SYMBOL (scm_sym_name, "name");
 
 static SCM overrides;
-static scm_i_pthread_mutex_t overrides_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER;
+
+static SCM arity_overrides;
 
 int
 scm_i_procedure_arity (SCM proc, int *req, int *opt, int *rest)
 {
+  SCM o;
+
+  o = scm_weak_table_refq (arity_overrides, proc, SCM_BOOL_F);
+
+  if (scm_is_true (o))
+    {
+      *req = scm_to_int (scm_car (o));
+      *opt = scm_to_int (scm_cadr (o));
+      *rest = scm_is_true (scm_caddr (o));
+      return 1;
+    }
+
   while (!SCM_PROGRAM_P (proc))
     {
-      if (SCM_IMP (proc))
-        return 0;
-      switch (SCM_TYP7 (proc))
+      if (SCM_STRUCTP (proc))
         {
-        case scm_tc7_smob:
-          if (!SCM_SMOB_APPLICABLE_P (proc))
-            return 0;
-          proc = scm_i_smob_apply_trampoline (proc);
-          break;
-        case scm_tcs_struct:
           if (!SCM_STRUCT_APPLICABLE_P (proc))
             return 0;
           proc = SCM_STRUCT_PROCEDURE (proc);
-          break;
-        default:
-          return 0;
         }
+      else if (SCM_HAS_TYP7 (proc, scm_tc7_smob))
+        {
+          if (!SCM_SMOB_APPLICABLE_P (proc))
+            return 0;
+          proc = scm_i_smob_apply_trampoline (proc);
+        }
+      else
+        return 0;
     }
+
   return scm_i_program_arity (proc, req, opt, rest);
 }
 
+SCM_DEFINE (scm_set_procedure_minimum_arity_x, "set-procedure-minimum-arity!",
+            4, 0, 0, (SCM proc, SCM req, SCM opt, SCM rest),
+            "")
+#define FUNC_NAME s_scm_set_procedure_minimum_arity_x
+{
+  int t SCM_UNUSED;
+
+  SCM_VALIDATE_PROC (1, proc);
+  SCM_VALIDATE_INT_COPY (2, req, t);
+  SCM_VALIDATE_INT_COPY (3, opt, t);
+  SCM_VALIDATE_BOOL (4, rest);
+
+  scm_weak_table_putq_x (arity_overrides, proc, scm_list_3 (req, opt, rest));
+  return SCM_UNDEFINED;
+}
+#undef FUNC_NAME
+
 SCM_DEFINE (scm_procedure_minimum_arity, "procedure-minimum-arity", 1, 0, 0, 
            (SCM proc),
            "Return the \"minimum arity\" of a procedure.\n\n"
@@ -97,16 +125,14 @@ SCM_DEFINE (scm_procedure_minimum_arity, "procedure-minimum-arity", 1, 0, 0,
 
 SCM_DEFINE (scm_procedure_properties, "procedure-properties", 1, 0, 0, 
            (SCM proc),
-           "Return @var{obj}'s property list.")
+           "Return @var{proc}'s property list.")
 #define FUNC_NAME s_scm_procedure_properties
 {
   SCM ret;
   
   SCM_VALIDATE_PROC (1, proc);
 
-  scm_i_pthread_mutex_lock (&overrides_lock);
-  ret = scm_hashq_ref (overrides, proc, SCM_BOOL_F);
-  scm_i_pthread_mutex_unlock (&overrides_lock);
+  ret = scm_weak_table_refq (overrides, proc, SCM_BOOL_F);
 
   if (scm_is_false (ret))
     {
@@ -127,9 +153,7 @@ SCM_DEFINE (scm_set_procedure_properties_x, "set-procedure-properties!", 2, 0, 0
 {
   SCM_VALIDATE_PROC (1, proc);
 
-  scm_i_pthread_mutex_lock (&overrides_lock);
-  scm_hashq_set_x (overrides, proc, alist);
-  scm_i_pthread_mutex_unlock (&overrides_lock);
+  scm_weak_table_putq_x (overrides, proc, alist);
 
   return SCM_UNSPECIFIED;
 }
@@ -156,8 +180,8 @@ SCM_DEFINE (scm_set_procedure_property_x, "set-procedure-property!", 3, 0, 0,
 
   SCM_VALIDATE_PROC (1, proc);
 
-  scm_i_pthread_mutex_lock (&overrides_lock);
-  props = scm_hashq_ref (overrides, proc, SCM_BOOL_F);
+  scm_i_pthread_mutex_lock (&scm_i_misc_mutex);
+  props = scm_weak_table_refq (overrides, proc, SCM_BOOL_F);
   if (scm_is_false (props))
     {
       if (SCM_PROGRAM_P (proc))
@@ -165,8 +189,8 @@ SCM_DEFINE (scm_set_procedure_property_x, "set-procedure-property!", 3, 0, 0,
       else
         props = SCM_EOL;
     }
-  scm_hashq_set_x (overrides, proc, scm_assq_set_x (props, key, val));
-  scm_i_pthread_mutex_unlock (&overrides_lock);
+  scm_weak_table_putq_x (overrides, proc, scm_assq_set_x (props, key, val));
+  scm_i_pthread_mutex_unlock (&scm_i_misc_mutex);
 
   return SCM_UNSPECIFIED;
 }
@@ -178,7 +202,8 @@ SCM_DEFINE (scm_set_procedure_property_x, "set-procedure-property!", 3, 0, 0,
 void
 scm_init_procprop ()
 {
-  overrides = scm_make_weak_key_hash_table (SCM_UNDEFINED);
+  overrides = scm_c_make_weak_table (0, SCM_WEAK_TABLE_KIND_KEY);
+  arity_overrides = scm_c_make_weak_table (0, SCM_WEAK_TABLE_KIND_KEY);
 #include "libguile/procprop.x"
 }