Foreign procedures are RTL programs
authorAndy Wingo <wingo@pobox.com>
Fri, 18 Oct 2013 15:41:33 +0000 (17:41 +0200)
committerAndy Wingo <wingo@pobox.com>
Fri, 18 Oct 2013 15:41:33 +0000 (17:41 +0200)
commitb0ca878cae82ebb2028783aff6e27352b70810d8
tree8988b37ea611a6f748edf164f45b4968f1ac1e05
parentd724a36562357c86f2b4c21b46992abf9598b4d1
Foreign procedures are RTL programs

* libguile/foreign.c: Convert to using RTL stubs.  Because RTL code has
  different GC characteristics than objcode -- it's mostly assumed that
  RTL code will never go away -- we go ahead and pre-generate code for
  100 arguments.  This is actually less memory than the stack VM code,
  and doesn't require any relocations at load-time: bonus!  We'll cross
  the >=100 args bridge if we ever come to it.
  (get_foreign_stub_code) New function.
  (scm_i_foreign_arity): New helper, like scm_i_primitive_arity.
  (cif_to_procedure): Rework to make RTL programs.

* libguile/foreign.h: Declare scm_pointer_to_scm and
  scm_scm_to_pointer.  Declare new internal helpers.

* libguile/gsubr.c (create_subr): Refactor to set the flags when the
  object is allocated.

* libguile/instructions.h: Define SCM_PACK_RTL_12_12.

* libguile/programs.c (scm_i_rtl_program_minimum_arity): Dispatch to
  scm_i_foreign_arity if the procedure has the FOREIGN flag.
* libguile/programs.h (SCM_F_PROGRAM_IS_FOREIGN)
  (SCM_PROGRAM_IS_FOREIGN): New interfaces.

* test-suite/tests/foreign.test ("procedure->pointer"): Add a test for
  foreign arities.
libguile/foreign.c
libguile/foreign.h
libguile/gsubr.c
libguile/instructions.h
libguile/programs.c
libguile/programs.h
test-suite/tests/foreign.test