guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

eval closures as applicable smobs


From: Keisuke Nishida
Subject: eval closures as applicable smobs
Date: 10 Sep 2000 10:13:21 -0400
User-agent: T-gnus/6.14.4 (based on Gnus v5.8.6) (revision 02) SEMI/1.13.7 (Awazu) Chao/1.14.0 (Momoyama) Emacs/20.7 (i686-pc-linux-gnu) MULE/4.0 (HANANOEN)

Hello,

This is a patch to define eval closures as applicable smobs.
May I commit it?  Performance is almost same or slightly improved:

Before:
bash$ time guile -e 'quit'
0.81user 0.31system 0:01.21elapsed 91%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (269major+526minor)pagefaults 0swaps
bash$ time guile -e 'quit'
0.81user 0.02system 0:00.82elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (269major+526minor)pagefaults 0swaps
bash$ time guile -e 'quit'
0.79user 0.02system 0:00.81elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (269major+526minor)pagefaults 0swaps

After:
bash$ time guile -e 'quit'
0.78user 0.02system 0:00.82elapsed 96%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (269major+526minor)pagefaults 0swaps
bash$ time guile -e 'quit'
0.80user 0.03system 0:00.82elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (269major+526minor)pagefaults 0swaps
bash$ time guile -e 'quit'
0.81user 0.01system 0:00.82elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (269major+526minor)pagefaults 0swaps

-- Kei

Index: modules.c
===================================================================
RCS file: /cvs/guile/guile-core/libguile/modules.c,v
retrieving revision 1.14
diff -c -r1.14 modules.c
*** modules.c   2000/09/02 23:21:57     1.14
--- modules.c   2000/09/10 13:49:27
***************
*** 47,52 ****
--- 47,53 ----
  #include "libguile/_scm.h"
  
  #include "libguile/eval.h"
+ #include "libguile/smob.h"
  #include "libguile/procprop.h"
  #include "libguile/vectors.h"
  #include "libguile/hashtab.h"
***************
*** 240,251 ****
    }
  }
  
! static SCM f_eval_closure;
  
! static SCM
! eval_closure (SCM cclo, SCM sym, SCM definep)
  {
!   SCM module = SCM_VELTS (cclo) [1];
    if (SCM_NFALSEP (definep))
      return scm_apply (SCM_CDR (module_make_local_var_x),
                      SCM_LIST2 (module, sym),
--- 241,252 ----
    }
  }
  
! SCM scm_eval_closure_tag;
  
! SCM
! scm_eval_closure_lookup (SCM eclo, SCM sym, SCM definep)
  {
!   SCM module = SCM_PACK (SCM_SMOB_DATA (eclo));
    if (SCM_NFALSEP (definep))
      return scm_apply (SCM_CDR (module_make_local_var_x),
                      SCM_LIST2 (module, sym),
***************
*** 259,267 ****
            "")
  #define FUNC_NAME s_scm_standard_eval_closure
  {
!   SCM cclo = scm_makcclo (f_eval_closure, 2);
!   SCM_VELTS (cclo) [1] = module;
!   return cclo;
  }
  #undef FUNC_NAME
  
--- 260,266 ----
            "")
  #define FUNC_NAME s_scm_standard_eval_closure
  {
!   SCM_RETURN_NEWSMOB (scm_eval_closure_tag, SCM_UNPACK (module));
  }
  #undef FUNC_NAME
  
***************
*** 271,280 ****
  #include "libguile/modules.x"
    module_make_local_var_x = scm_sysintern ("module-make-local-var!",
                                           SCM_UNDEFINED);
!   f_eval_closure = scm_make_subr_opt ("eval-closure",
!                                     scm_tc7_subr_3,
!                                     eval_closure,
!                                     0);
  }
  
  void
--- 270,278 ----
  #include "libguile/modules.x"
    module_make_local_var_x = scm_sysintern ("module-make-local-var!",
                                           SCM_UNDEFINED);
!   scm_eval_closure_tag = scm_make_smob_type ("eval-closure", 0);
!   scm_set_smob_mark (scm_eval_closure_tag, scm_markcdr);
!   scm_set_smob_apply (scm_eval_closure_tag, scm_eval_closure_lookup, 2, 0, 0);
  }
  
  void
Index: modules.h
===================================================================
RCS file: /cvs/guile/guile-core/libguile/modules.h,v
retrieving revision 1.8
diff -c -r1.8 modules.h
*** modules.h   2000/08/11 08:44:16     1.8
--- modules.h   2000/09/10 13:49:27
***************
*** 73,82 ****
--- 73,85 ----
  #define SCM_MODULE_EVAL_CLOSURE(module) \
    SCM_PACK (SCM_STRUCT_DATA (module)[scm_module_index_eval_closure])
  
+ #define SCM_EVAL_CLOSURE_P(OBJ)       SCM_SMOB_PREDICATE 
(scm_eval_closure_tag, OBJ)
+ 
  
  
  extern SCM scm_module_system_booted_p;
  extern SCM scm_module_tag;
+ extern SCM scm_eval_closure_tag;
  
  extern SCM scm_the_root_module (void);
  extern SCM scm_selected_module (void);
***************
*** 90,95 ****
--- 93,99 ----
  extern SCM scm_env_top_level (SCM env);
  extern SCM scm_top_level_env (SCM thunk);
  extern SCM scm_system_module_env_p (SCM env);
+ extern SCM scm_eval_closure_lookup (SCM eclo, SCM sym, SCM definep);
  extern SCM scm_standard_eval_closure (SCM module);
  extern void scm_init_modules (void);
  extern void scm_post_boot_init_modules (void);
Index: symbols.c
===================================================================
RCS file: /cvs/guile/guile-core/libguile/symbols.c,v
retrieving revision 1.49
diff -c -r1.49 symbols.c
*** symbols.c   2000/09/06 14:45:59     1.49
--- symbols.c   2000/09/10 13:49:27
***************
*** 48,53 ****
--- 48,54 ----
  #include "libguile/_scm.h"
  #include "libguile/chars.h"
  #include "libguile/eval.h"
+ #include "libguile/smob.h"
  #include "libguile/variable.h"
  #include "libguile/alist.h"
  #include "libguile/fluids.h"
***************
*** 112,121 ****
      {
        SCM var;
  
!       if (SCM_TYP7 (thunk) == scm_tc7_cclo
!         && SCM_TYP7 (SCM_CCLO_SUBR (thunk)) == scm_tc7_subr_3)
        /* Bypass evaluator in the standard case. */
!       var = SCM_SUBRF (SCM_CCLO_SUBR (thunk)) (thunk, sym, definep);
        else
        var = scm_apply (thunk, sym, scm_cons (definep, scm_listofnull));
  
--- 113,121 ----
      {
        SCM var;
  
!       if (SCM_EVAL_CLOSURE_P (thunk))
        /* Bypass evaluator in the standard case. */
!       var = scm_eval_closure_lookup (thunk, sym, definep);
        else
        var = scm_apply (thunk, sym, scm_cons (definep, scm_listofnull));
  


reply via email to

[Prev in Thread] Current Thread [Next in Thread]