mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-01 12:20:26 +02:00
programs have their own tc7 now
* libguile/tags.h (scm_tc7_program): * libguile/programs.h: Programs now have their own tc7 code. Fix up the macros appropriately. * libguile/programs.c: Remove smobby bits, leaving marking, printing, and application for other parts of Guile. * libguile/debug.c (scm_procedure_source): * libguile/eval.c (scm_trampoline_0, scm_trampoline_1) (scm_trampoline_2): Add cases for tc7_program. * libguile/eval.i.c (CEVAL, SCM_APPLY): * libguile/evalext.c (scm_self_evaluating_p): * libguile/gc-card.c (scm_i_sweep_card, scm_i_tag_name): * libguile/gc-mark.c (1): * libguile/print.c (iprin1): * libguile/procs.c (scm_procedure_p, scm_thunk_p) * libguile/vm-i-system.c (make-closure): Adapt to new procedure representation. * libguile/procprop.c (scm_i_procedure_arity): Do the right thing for programs. * test-suite/tests/procprop.test ("procedure-arity"): Arity test now succeeds. * libguile/goops.c (scm_class_of): Programs now belong to the class <procedure>, not a smob class. * libguile/vm.h (struct vm, struct vm_cont): * libguile/vm-engine.c (vm_engine): * libguile/frames.h (SCM_FRAME_BYTE_CAST, struct vm_frame): * libguile/frames.c (scm_c_make_vm_frame): Fix usages of scm_byte_t, changing them to scm_t_uint8.
This commit is contained in:
parent
cdde57b2f1
commit
2fb924f64f
19 changed files with 91 additions and 81 deletions
|
@ -363,6 +363,7 @@ SCM_DEFINE (scm_procedure_source, "procedure-source", 1, 0, 0,
|
||||||
if (!SCM_SMOB_DESCRIPTOR (proc).apply)
|
if (!SCM_SMOB_DESCRIPTOR (proc).apply)
|
||||||
break;
|
break;
|
||||||
case scm_tcs_subrs:
|
case scm_tcs_subrs:
|
||||||
|
case scm_tc7_program:
|
||||||
procprop:
|
procprop:
|
||||||
/* It would indeed be a nice thing if we supplied source even for
|
/* It would indeed be a nice thing if we supplied source even for
|
||||||
built in procedures! */
|
built in procedures! */
|
||||||
|
|
|
@ -3328,6 +3328,7 @@ scm_trampoline_0 (SCM proc)
|
||||||
case scm_tc7_rpsubr:
|
case scm_tc7_rpsubr:
|
||||||
case scm_tc7_gsubr:
|
case scm_tc7_gsubr:
|
||||||
case scm_tc7_pws:
|
case scm_tc7_pws:
|
||||||
|
case scm_tc7_program:
|
||||||
trampoline = scm_call_0;
|
trampoline = scm_call_0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -3454,6 +3455,7 @@ scm_trampoline_1 (SCM proc)
|
||||||
case scm_tc7_rpsubr:
|
case scm_tc7_rpsubr:
|
||||||
case scm_tc7_gsubr:
|
case scm_tc7_gsubr:
|
||||||
case scm_tc7_pws:
|
case scm_tc7_pws:
|
||||||
|
case scm_tc7_program:
|
||||||
trampoline = scm_call_1;
|
trampoline = scm_call_1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -3548,6 +3550,7 @@ scm_trampoline_2 (SCM proc)
|
||||||
break;
|
break;
|
||||||
case scm_tc7_gsubr:
|
case scm_tc7_gsubr:
|
||||||
case scm_tc7_pws:
|
case scm_tc7_pws:
|
||||||
|
case scm_tc7_program:
|
||||||
trampoline = scm_call_2;
|
trampoline = scm_call_2;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1132,6 +1132,8 @@ dispatch:
|
||||||
RETURN (SCM_BOOL_T);
|
RETURN (SCM_BOOL_T);
|
||||||
case scm_tc7_asubr:
|
case scm_tc7_asubr:
|
||||||
RETURN (SCM_SUBRF (proc) (SCM_UNDEFINED, SCM_UNDEFINED));
|
RETURN (SCM_SUBRF (proc) (SCM_UNDEFINED, SCM_UNDEFINED));
|
||||||
|
case scm_tc7_program:
|
||||||
|
RETURN (scm_c_vm_run (scm_the_vm (), proc, NULL, 0));
|
||||||
case scm_tc7_smob:
|
case scm_tc7_smob:
|
||||||
if (!SCM_SMOB_APPLICABLE_P (proc))
|
if (!SCM_SMOB_APPLICABLE_P (proc))
|
||||||
goto badfun;
|
goto badfun;
|
||||||
|
@ -1243,6 +1245,8 @@ dispatch:
|
||||||
RETURN (scm_i_chase_pairs (arg1, (scm_t_bits) SCM_SUBRF (proc)));
|
RETURN (scm_i_chase_pairs (arg1, (scm_t_bits) SCM_SUBRF (proc)));
|
||||||
case scm_tc7_rpsubr:
|
case scm_tc7_rpsubr:
|
||||||
RETURN (SCM_BOOL_T);
|
RETURN (SCM_BOOL_T);
|
||||||
|
case scm_tc7_program:
|
||||||
|
RETURN (scm_c_vm_run (scm_the_vm (), proc, &arg1, 1));
|
||||||
case scm_tc7_asubr:
|
case scm_tc7_asubr:
|
||||||
RETURN (SCM_SUBRF (proc) (arg1, SCM_UNDEFINED));
|
RETURN (SCM_SUBRF (proc) (arg1, SCM_UNDEFINED));
|
||||||
case scm_tc7_lsubr:
|
case scm_tc7_lsubr:
|
||||||
|
@ -1353,6 +1357,12 @@ dispatch:
|
||||||
case scm_tc7_rpsubr:
|
case scm_tc7_rpsubr:
|
||||||
case scm_tc7_asubr:
|
case scm_tc7_asubr:
|
||||||
RETURN (SCM_SUBRF (proc) (arg1, arg2));
|
RETURN (SCM_SUBRF (proc) (arg1, arg2));
|
||||||
|
case scm_tc7_program:
|
||||||
|
{ SCM args[2];
|
||||||
|
args[0] = arg1;
|
||||||
|
args[1] = arg2;
|
||||||
|
RETURN (scm_c_vm_run (scm_the_vm (), proc, args, 2));
|
||||||
|
}
|
||||||
case scm_tc7_smob:
|
case scm_tc7_smob:
|
||||||
if (!SCM_SMOB_APPLICABLE_P (proc))
|
if (!SCM_SMOB_APPLICABLE_P (proc))
|
||||||
goto badfun;
|
goto badfun;
|
||||||
|
@ -1492,6 +1502,8 @@ dispatch:
|
||||||
SCM_CDDR (debug.info->a.args)));
|
SCM_CDDR (debug.info->a.args)));
|
||||||
case scm_tc7_gsubr:
|
case scm_tc7_gsubr:
|
||||||
RETURN (scm_i_gsubr_apply_list (proc, debug.info->a.args));
|
RETURN (scm_i_gsubr_apply_list (proc, debug.info->a.args));
|
||||||
|
case scm_tc7_program:
|
||||||
|
RETURN (scm_vm_apply (scm_the_vm (), proc, debug.info->a.args));
|
||||||
case scm_tc7_pws:
|
case scm_tc7_pws:
|
||||||
proc = SCM_PROCEDURE (proc);
|
proc = SCM_PROCEDURE (proc);
|
||||||
debug.info->a.proc = proc;
|
debug.info->a.proc = proc;
|
||||||
|
@ -1563,6 +1575,11 @@ dispatch:
|
||||||
scm_cons2 (arg1, arg2,
|
scm_cons2 (arg1, arg2,
|
||||||
scm_ceval_args (x, env,
|
scm_ceval_args (x, env,
|
||||||
proc))));
|
proc))));
|
||||||
|
case scm_tc7_program:
|
||||||
|
RETURN (scm_vm_apply
|
||||||
|
(scm_the_vm (), proc,
|
||||||
|
scm_cons (arg1, scm_cons (arg2,
|
||||||
|
scm_ceval_args (x, env, proc)))));
|
||||||
case scm_tc7_pws:
|
case scm_tc7_pws:
|
||||||
proc = SCM_PROCEDURE (proc);
|
proc = SCM_PROCEDURE (proc);
|
||||||
if (!SCM_CLOSUREP (proc))
|
if (!SCM_CLOSUREP (proc))
|
||||||
|
@ -1798,6 +1815,11 @@ tail:
|
||||||
args = SCM_CDR (args);
|
args = SCM_CDR (args);
|
||||||
}
|
}
|
||||||
RETURN (arg1);
|
RETURN (arg1);
|
||||||
|
case scm_tc7_program:
|
||||||
|
if (SCM_UNBNDP (arg1))
|
||||||
|
RETURN (scm_c_vm_run (scm_the_vm (), proc, NULL, 0));
|
||||||
|
else
|
||||||
|
RETURN (scm_vm_apply (scm_the_vm (), proc, scm_cons (arg1, args)));
|
||||||
case scm_tc7_rpsubr:
|
case scm_tc7_rpsubr:
|
||||||
if (scm_is_null (args))
|
if (scm_is_null (args))
|
||||||
RETURN (SCM_BOOL_T);
|
RETURN (SCM_BOOL_T);
|
||||||
|
|
|
@ -82,6 +82,7 @@ SCM_DEFINE (scm_self_evaluating_p, "self-evaluating?", 1, 0, 0,
|
||||||
case scm_tc7_string:
|
case scm_tc7_string:
|
||||||
case scm_tc7_smob:
|
case scm_tc7_smob:
|
||||||
case scm_tc7_pws:
|
case scm_tc7_pws:
|
||||||
|
case scm_tc7_program:
|
||||||
case scm_tcs_subrs:
|
case scm_tcs_subrs:
|
||||||
case scm_tcs_struct:
|
case scm_tcs_struct:
|
||||||
return SCM_BOOL_T;
|
return SCM_BOOL_T;
|
||||||
|
|
|
@ -33,7 +33,7 @@ scm_t_bits scm_tc16_vm_frame;
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
scm_c_make_vm_frame (SCM stack_holder, SCM *fp, SCM *sp,
|
scm_c_make_vm_frame (SCM stack_holder, SCM *fp, SCM *sp,
|
||||||
scm_byte_t *ip, scm_t_ptrdiff offset)
|
scm_t_uint8 *ip, scm_t_ptrdiff offset)
|
||||||
{
|
{
|
||||||
struct scm_vm_frame *p = scm_gc_malloc (sizeof (struct scm_vm_frame),
|
struct scm_vm_frame *p = scm_gc_malloc (sizeof (struct scm_vm_frame),
|
||||||
"vmframe");
|
"vmframe");
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
+ SCM_PROGRAM_DATA (SCM_FRAME_PROGRAM (fp))->nlocs)
|
+ SCM_PROGRAM_DATA (SCM_FRAME_PROGRAM (fp))->nlocs)
|
||||||
#define SCM_FRAME_LOWER_ADDRESS(fp) (fp - 4)
|
#define SCM_FRAME_LOWER_ADDRESS(fp) (fp - 4)
|
||||||
|
|
||||||
#define SCM_FRAME_BYTE_CAST(x) ((scm_byte_t *) SCM_UNPACK (x))
|
#define SCM_FRAME_BYTE_CAST(x) ((scm_t_uint8 *) SCM_UNPACK (x))
|
||||||
#define SCM_FRAME_STACK_CAST(x) ((SCM *) SCM_UNPACK (x))
|
#define SCM_FRAME_STACK_CAST(x) ((SCM *) SCM_UNPACK (x))
|
||||||
|
|
||||||
#define SCM_FRAME_RETURN_ADDRESS(fp) \
|
#define SCM_FRAME_RETURN_ADDRESS(fp) \
|
||||||
|
@ -86,7 +86,7 @@ struct scm_vm_frame
|
||||||
SCM stack_holder;
|
SCM stack_holder;
|
||||||
SCM *fp;
|
SCM *fp;
|
||||||
SCM *sp;
|
SCM *sp;
|
||||||
scm_byte_t *ip;
|
scm_t_uint8 *ip;
|
||||||
scm_t_ptrdiff offset;
|
scm_t_ptrdiff offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -99,9 +99,8 @@ struct scm_vm_frame
|
||||||
#define SCM_VM_FRAME_OFFSET(f) SCM_VM_FRAME_DATA(f)->offset
|
#define SCM_VM_FRAME_OFFSET(f) SCM_VM_FRAME_DATA(f)->offset
|
||||||
#define SCM_VALIDATE_VM_FRAME(p,x) SCM_MAKE_VALIDATE (p, x, VM_FRAME_P)
|
#define SCM_VALIDATE_VM_FRAME(p,x) SCM_MAKE_VALIDATE (p, x, VM_FRAME_P)
|
||||||
|
|
||||||
/* FIXME rename scm_byte_t */
|
|
||||||
SCM_API SCM scm_c_make_vm_frame (SCM stack_holder, SCM *fp, SCM *sp,
|
SCM_API SCM scm_c_make_vm_frame (SCM stack_holder, SCM *fp, SCM *sp,
|
||||||
scm_byte_t *ip, scm_t_ptrdiff offset);
|
scm_t_uint8 *ip, scm_t_ptrdiff offset);
|
||||||
SCM_API SCM scm_vm_frame_p (SCM obj);
|
SCM_API SCM scm_vm_frame_p (SCM obj);
|
||||||
SCM_API SCM scm_vm_frame_program (SCM frame);
|
SCM_API SCM scm_vm_frame_program (SCM frame);
|
||||||
SCM_API SCM scm_vm_frame_arguments (SCM frame);
|
SCM_API SCM scm_vm_frame_arguments (SCM frame);
|
||||||
|
|
|
@ -162,6 +162,8 @@ scm_i_sweep_card (scm_t_cell *card, SCM *free_list, scm_t_heap_segment *seg)
|
||||||
break;
|
break;
|
||||||
case scm_tc7_variable:
|
case scm_tc7_variable:
|
||||||
break;
|
break;
|
||||||
|
case scm_tc7_program:
|
||||||
|
break;
|
||||||
case scm_tcs_subrs:
|
case scm_tcs_subrs:
|
||||||
/* the various "subrs" (primitives) are never freed */
|
/* the various "subrs" (primitives) are never freed */
|
||||||
continue;
|
continue;
|
||||||
|
@ -386,6 +388,8 @@ scm_i_tag_name (scm_t_bits tag)
|
||||||
return "closures";
|
return "closures";
|
||||||
case scm_tc7_pws:
|
case scm_tc7_pws:
|
||||||
return "pws";
|
return "pws";
|
||||||
|
case scm_tc7_program:
|
||||||
|
return "program";
|
||||||
case scm_tc7_wvect:
|
case scm_tc7_wvect:
|
||||||
return "weak vector";
|
return "weak vector";
|
||||||
case scm_tc7_vector:
|
case scm_tc7_vector:
|
||||||
|
|
|
@ -40,6 +40,7 @@ extern unsigned long * __libc_ia64_register_backing_store_base;
|
||||||
#include "libguile/smob.h"
|
#include "libguile/smob.h"
|
||||||
#include "libguile/unif.h"
|
#include "libguile/unif.h"
|
||||||
#include "libguile/async.h"
|
#include "libguile/async.h"
|
||||||
|
#include "libguile/programs.h"
|
||||||
#include "libguile/ports.h"
|
#include "libguile/ports.h"
|
||||||
#include "libguile/root.h"
|
#include "libguile/root.h"
|
||||||
#include "libguile/strings.h"
|
#include "libguile/strings.h"
|
||||||
|
@ -285,6 +286,13 @@ scm_gc_mark_dependencies (SCM p)
|
||||||
scm_gc_mark (SCM_CLOSCAR (ptr));
|
scm_gc_mark (SCM_CLOSCAR (ptr));
|
||||||
ptr = SCM_ENV (ptr);
|
ptr = SCM_ENV (ptr);
|
||||||
goto gc_mark_nimp;
|
goto gc_mark_nimp;
|
||||||
|
case scm_tc7_program:
|
||||||
|
if (SCM_PROGRAM_FREE_VARIABLES (ptr) != SCM_BOOL_F)
|
||||||
|
scm_gc_mark (SCM_PROGRAM_FREE_VARIABLES (ptr));
|
||||||
|
if (SCM_PROGRAM_OBJTABLE (ptr) != SCM_BOOL_F)
|
||||||
|
scm_gc_mark (SCM_PROGRAM_OBJTABLE (ptr));
|
||||||
|
ptr = SCM_PROGRAM_OBJCODE (ptr);
|
||||||
|
goto gc_mark_nimp;
|
||||||
case scm_tc7_vector:
|
case scm_tc7_vector:
|
||||||
i = SCM_SIMPLE_VECTOR_LENGTH (ptr);
|
i = SCM_SIMPLE_VECTOR_LENGTH (ptr);
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
|
|
|
@ -241,6 +241,7 @@ SCM_DEFINE (scm_class_of, "class-of", 1, 0, 0,
|
||||||
else
|
else
|
||||||
return scm_class_procedure;
|
return scm_class_procedure;
|
||||||
case scm_tc7_gsubr:
|
case scm_tc7_gsubr:
|
||||||
|
case scm_tc7_program:
|
||||||
return scm_class_procedure;
|
return scm_class_procedure;
|
||||||
case scm_tc7_pws:
|
case scm_tc7_pws:
|
||||||
return scm_class_procedure_with_setter;
|
return scm_class_procedure_with_setter;
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "libguile/procprop.h"
|
#include "libguile/procprop.h"
|
||||||
#include "libguile/read.h"
|
#include "libguile/read.h"
|
||||||
#include "libguile/weaks.h"
|
#include "libguile/weaks.h"
|
||||||
|
#include "libguile/programs.h"
|
||||||
#include "libguile/unif.h"
|
#include "libguile/unif.h"
|
||||||
#include "libguile/alist.h"
|
#include "libguile/alist.h"
|
||||||
#include "libguile/struct.h"
|
#include "libguile/struct.h"
|
||||||
|
@ -682,6 +683,9 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate)
|
||||||
case scm_tc7_variable:
|
case scm_tc7_variable:
|
||||||
scm_i_variable_print (exp, port, pstate);
|
scm_i_variable_print (exp, port, pstate);
|
||||||
break;
|
break;
|
||||||
|
case scm_tc7_program:
|
||||||
|
scm_i_program_print (exp, port, pstate);
|
||||||
|
break;
|
||||||
case scm_tc7_wvect:
|
case scm_tc7_wvect:
|
||||||
ENTER_NESTED_DATA (pstate, exp, circref);
|
ENTER_NESTED_DATA (pstate, exp, circref);
|
||||||
if (SCM_IS_WHVEC (exp))
|
if (SCM_IS_WHVEC (exp))
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "libguile/root.h"
|
#include "libguile/root.h"
|
||||||
#include "libguile/vectors.h"
|
#include "libguile/vectors.h"
|
||||||
#include "libguile/hashtab.h"
|
#include "libguile/hashtab.h"
|
||||||
|
#include "libguile/programs.h"
|
||||||
|
|
||||||
#include "libguile/validate.h"
|
#include "libguile/validate.h"
|
||||||
#include "libguile/procprop.h"
|
#include "libguile/procprop.h"
|
||||||
|
@ -72,6 +73,11 @@ scm_i_procedure_arity (SCM proc)
|
||||||
case scm_tc7_lsubr:
|
case scm_tc7_lsubr:
|
||||||
r = 1;
|
r = 1;
|
||||||
break;
|
break;
|
||||||
|
case scm_tc7_program:
|
||||||
|
a += SCM_PROGRAM_DATA (proc)->nargs;
|
||||||
|
r = SCM_PROGRAM_DATA (proc)->nrest;
|
||||||
|
a -= r;
|
||||||
|
break;
|
||||||
case scm_tc7_lsubr_2:
|
case scm_tc7_lsubr_2:
|
||||||
a += 2;
|
a += 2;
|
||||||
r = 1;
|
r = 1;
|
||||||
|
|
|
@ -112,6 +112,7 @@ SCM_DEFINE (scm_procedure_p, "procedure?", 1, 0, 0,
|
||||||
case scm_tcs_closures:
|
case scm_tcs_closures:
|
||||||
case scm_tcs_subrs:
|
case scm_tcs_subrs:
|
||||||
case scm_tc7_pws:
|
case scm_tc7_pws:
|
||||||
|
case scm_tc7_program:
|
||||||
return SCM_BOOL_T;
|
return SCM_BOOL_T;
|
||||||
case scm_tc7_smob:
|
case scm_tc7_smob:
|
||||||
return scm_from_bool (SCM_SMOB_DESCRIPTOR (obj).apply);
|
return scm_from_bool (SCM_SMOB_DESCRIPTOR (obj).apply);
|
||||||
|
@ -151,6 +152,10 @@ SCM_DEFINE (scm_thunk_p, "thunk?", 1, 0, 0,
|
||||||
return SCM_BOOL_T;
|
return SCM_BOOL_T;
|
||||||
case scm_tc7_gsubr:
|
case scm_tc7_gsubr:
|
||||||
return scm_from_bool (SCM_GSUBR_REQ (SCM_GSUBR_TYPE (obj)) == 0);
|
return scm_from_bool (SCM_GSUBR_REQ (SCM_GSUBR_TYPE (obj)) == 0);
|
||||||
|
case scm_tc7_program:
|
||||||
|
return scm_from_bool (SCM_PROGRAM_DATA (obj)->nargs == 0
|
||||||
|
|| (SCM_PROGRAM_DATA (obj)->nargs == 1
|
||||||
|
&& SCM_PROGRAM_DATA (obj)->nrest));
|
||||||
case scm_tc7_pws:
|
case scm_tc7_pws:
|
||||||
obj = SCM_PROCEDURE (obj);
|
obj = SCM_PROCEDURE (obj);
|
||||||
goto again;
|
goto again;
|
||||||
|
|
|
@ -31,8 +31,6 @@
|
||||||
#include "vm.h"
|
#include "vm.h"
|
||||||
|
|
||||||
|
|
||||||
scm_t_bits scm_tc16_program;
|
|
||||||
|
|
||||||
static SCM write_program = SCM_BOOL_F;
|
static SCM write_program = SCM_BOOL_F;
|
||||||
|
|
||||||
SCM_DEFINE (scm_make_program, "make-program", 1, 2, 0,
|
SCM_DEFINE (scm_make_program, "make-program", 1, 2, 0,
|
||||||
|
@ -50,49 +48,13 @@ SCM_DEFINE (scm_make_program, "make-program", 1, 2, 0,
|
||||||
else if (free_variables != SCM_BOOL_F)
|
else if (free_variables != SCM_BOOL_F)
|
||||||
SCM_VALIDATE_VECTOR (3, free_variables);
|
SCM_VALIDATE_VECTOR (3, free_variables);
|
||||||
|
|
||||||
SCM_RETURN_NEWSMOB3 (scm_tc16_program, objcode, objtable, free_variables);
|
return scm_double_cell (scm_tc7_program, (scm_t_bits)objcode,
|
||||||
|
(scm_t_bits)objtable, (scm_t_bits)free_variables);
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
||||||
static SCM
|
void
|
||||||
program_mark (SCM obj)
|
scm_i_program_print (SCM program, SCM port, scm_print_state *pstate)
|
||||||
{
|
|
||||||
if (scm_is_true (SCM_PROGRAM_OBJTABLE (obj)))
|
|
||||||
scm_gc_mark (SCM_PROGRAM_OBJTABLE (obj));
|
|
||||||
if (scm_is_true (SCM_PROGRAM_FREE_VARIABLES (obj)))
|
|
||||||
scm_gc_mark (SCM_PROGRAM_FREE_VARIABLES (obj));
|
|
||||||
return SCM_PROGRAM_OBJCODE (obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
static SCM
|
|
||||||
program_apply (SCM program, SCM args)
|
|
||||||
{
|
|
||||||
return scm_vm_apply (scm_the_vm (), program, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
static SCM
|
|
||||||
program_apply_0 (SCM program)
|
|
||||||
{
|
|
||||||
return scm_c_vm_run (scm_the_vm (), program, NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static SCM
|
|
||||||
program_apply_1 (SCM program, SCM a)
|
|
||||||
{
|
|
||||||
return scm_c_vm_run (scm_the_vm (), program, &a, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static SCM
|
|
||||||
program_apply_2 (SCM program, SCM a, SCM b)
|
|
||||||
{
|
|
||||||
SCM args[2];
|
|
||||||
args[0] = a;
|
|
||||||
args[1] = b;
|
|
||||||
return scm_c_vm_run (scm_the_vm (), program, args, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
program_print (SCM program, SCM port, scm_print_state *pstate)
|
|
||||||
{
|
{
|
||||||
static int print_error = 0;
|
static int print_error = 0;
|
||||||
|
|
||||||
|
@ -102,12 +64,17 @@ program_print (SCM program, SCM port, scm_print_state *pstate)
|
||||||
scm_from_locale_symbol ("write-program"));
|
scm_from_locale_symbol ("write-program"));
|
||||||
|
|
||||||
if (SCM_FALSEP (write_program) || print_error)
|
if (SCM_FALSEP (write_program) || print_error)
|
||||||
return scm_smob_print (program, port, pstate);
|
{
|
||||||
|
scm_puts ("#<program ", port);
|
||||||
print_error = 1;
|
scm_uintprint (SCM_CELL_WORD_1 (program), 16, port);
|
||||||
scm_call_2 (SCM_VARIABLE_REF (write_program), program, port);
|
scm_putc ('>', port);
|
||||||
print_error = 0;
|
}
|
||||||
return 1;
|
else
|
||||||
|
{
|
||||||
|
print_error = 1;
|
||||||
|
scm_call_2 (SCM_VARIABLE_REF (write_program), program, port);
|
||||||
|
print_error = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -319,13 +286,6 @@ SCM_DEFINE (scm_program_objcode, "program-objcode", 1, 0, 0,
|
||||||
void
|
void
|
||||||
scm_bootstrap_programs (void)
|
scm_bootstrap_programs (void)
|
||||||
{
|
{
|
||||||
scm_tc16_program = scm_make_smob_type ("program", 0);
|
|
||||||
scm_set_smob_mark (scm_tc16_program, program_mark);
|
|
||||||
scm_set_smob_apply (scm_tc16_program, program_apply, 0, 0, 1);
|
|
||||||
scm_smobs[SCM_TC2SMOBNUM (scm_tc16_program)].apply_0 = program_apply_0;
|
|
||||||
scm_smobs[SCM_TC2SMOBNUM (scm_tc16_program)].apply_1 = program_apply_1;
|
|
||||||
scm_smobs[SCM_TC2SMOBNUM (scm_tc16_program)].apply_2 = program_apply_2;
|
|
||||||
scm_set_smob_print (scm_tc16_program, program_print);
|
|
||||||
scm_c_register_extension ("libguile", "scm_init_programs",
|
scm_c_register_extension ("libguile", "scm_init_programs",
|
||||||
(scm_t_extension_init_func)scm_init_programs, NULL);
|
(scm_t_extension_init_func)scm_init_programs, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,19 +26,15 @@
|
||||||
* Programs
|
* Programs
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef unsigned char scm_byte_t;
|
#define SCM_F_PROGRAM_IS_BOOT (1<<16)
|
||||||
|
|
||||||
SCM_API scm_t_bits scm_tc16_program;
|
#define SCM_PROGRAM_P(x) (!SCM_IMP (x) && SCM_TYP7(x) == scm_tc7_program)
|
||||||
|
#define SCM_PROGRAM_OBJCODE(x) (SCM_CELL_OBJECT_1 (x))
|
||||||
#define SCM_F_PROGRAM_IS_BOOT (1<<0)
|
#define SCM_PROGRAM_OBJTABLE(x) (SCM_CELL_OBJECT_2 (x))
|
||||||
|
#define SCM_PROGRAM_FREE_VARIABLES(x) (SCM_CELL_OBJECT_3 (x))
|
||||||
#define SCM_PROGRAM_P(x) (SCM_SMOB_PREDICATE (scm_tc16_program, x))
|
|
||||||
#define SCM_PROGRAM_OBJCODE(x) (SCM_SMOB_OBJECT (x))
|
|
||||||
#define SCM_PROGRAM_OBJTABLE(x) (SCM_SMOB_OBJECT_2 (x))
|
|
||||||
#define SCM_PROGRAM_FREE_VARIABLES(x) (SCM_SMOB_OBJECT_3 (x))
|
|
||||||
#define SCM_PROGRAM_DATA(x) (SCM_OBJCODE_DATA (SCM_PROGRAM_OBJCODE (x)))
|
#define SCM_PROGRAM_DATA(x) (SCM_OBJCODE_DATA (SCM_PROGRAM_OBJCODE (x)))
|
||||||
#define SCM_VALIDATE_PROGRAM(p,x) SCM_MAKE_VALIDATE (p, x, PROGRAM_P)
|
#define SCM_VALIDATE_PROGRAM(p,x) SCM_MAKE_VALIDATE (p, x, PROGRAM_P)
|
||||||
#define SCM_PROGRAM_IS_BOOT(x) (SCM_SMOB_FLAGS (x) & SCM_F_PROGRAM_IS_BOOT)
|
#define SCM_PROGRAM_IS_BOOT(x) (SCM_CELL_WORD_0 (x) & SCM_F_PROGRAM_IS_BOOT)
|
||||||
|
|
||||||
SCM_API SCM scm_make_program (SCM objcode, SCM objtable, SCM free_variables);
|
SCM_API SCM scm_make_program (SCM objcode, SCM objtable, SCM free_variables);
|
||||||
|
|
||||||
|
@ -58,6 +54,8 @@ SCM_API SCM scm_program_objcode (SCM program);
|
||||||
|
|
||||||
SCM_API SCM scm_c_program_source (SCM program, size_t ip);
|
SCM_API SCM scm_c_program_source (SCM program, size_t ip);
|
||||||
|
|
||||||
|
SCM_INTERNAL void scm_i_program_print (SCM program, SCM port,
|
||||||
|
scm_print_state *pstate);
|
||||||
SCM_INTERNAL void scm_bootstrap_programs (void);
|
SCM_INTERNAL void scm_bootstrap_programs (void);
|
||||||
SCM_INTERNAL void scm_init_programs (void);
|
SCM_INTERNAL void scm_init_programs (void);
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#ifndef SCM_TAGS_H
|
#ifndef SCM_TAGS_H
|
||||||
#define SCM_TAGS_H
|
#define SCM_TAGS_H
|
||||||
|
|
||||||
/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2008
|
/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2008,2009
|
||||||
* Free Software Foundation, Inc.
|
* Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
|
@ -453,11 +453,11 @@ typedef unsigned long scm_t_bits;
|
||||||
#define scm_tc7_unused_6 55
|
#define scm_tc7_unused_6 55
|
||||||
#define scm_tc7_unused_7 71
|
#define scm_tc7_unused_7 71
|
||||||
#define scm_tc7_unused_8 77
|
#define scm_tc7_unused_8 77
|
||||||
#define scm_tc7_unused_9 79
|
|
||||||
|
|
||||||
#define scm_tc7_dsubr 61
|
#define scm_tc7_dsubr 61
|
||||||
#define scm_tc7_gsubr 63
|
#define scm_tc7_gsubr 63
|
||||||
#define scm_tc7_rpsubr 69
|
#define scm_tc7_rpsubr 69
|
||||||
|
#define scm_tc7_program 79
|
||||||
#define scm_tc7_subr_0 85
|
#define scm_tc7_subr_0 85
|
||||||
#define scm_tc7_subr_1 87
|
#define scm_tc7_subr_1 87
|
||||||
#define scm_tc7_cxr 93
|
#define scm_tc7_cxr 93
|
||||||
|
|
|
@ -41,7 +41,7 @@ static SCM
|
||||||
VM_NAME (struct scm_vm *vp, SCM program, SCM *argv, int nargs)
|
VM_NAME (struct scm_vm *vp, SCM program, SCM *argv, int nargs)
|
||||||
{
|
{
|
||||||
/* VM registers */
|
/* VM registers */
|
||||||
register scm_byte_t *ip IP_REG; /* instruction pointer */
|
register scm_t_uint8 *ip IP_REG; /* instruction pointer */
|
||||||
register SCM *sp SP_REG; /* stack pointer */
|
register SCM *sp SP_REG; /* stack pointer */
|
||||||
register SCM *fp FP_REG; /* frame pointer */
|
register SCM *fp FP_REG; /* frame pointer */
|
||||||
|
|
||||||
|
|
|
@ -1032,8 +1032,8 @@ VM_DEFINE_INSTRUCTION (59, make_closure, "make-closure", 0, 2, 1)
|
||||||
POP (vect);
|
POP (vect);
|
||||||
SYNC_BEFORE_GC ();
|
SYNC_BEFORE_GC ();
|
||||||
/* fixme underflow */
|
/* fixme underflow */
|
||||||
SCM_NEWSMOB3 (*sp, scm_tc16_program, SCM_PROGRAM_OBJCODE (*sp),
|
*sp = scm_double_cell (scm_tc7_program, (scm_t_bits)SCM_PROGRAM_OBJCODE (*sp),
|
||||||
SCM_PROGRAM_OBJTABLE (*sp), vect);
|
(scm_t_bits)SCM_PROGRAM_OBJTABLE (*sp), (scm_t_bits)vect);
|
||||||
NEXT;
|
NEXT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2001 Free Software Foundation, Inc.
|
/* Copyright (C) 2001, 2009 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public License
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
@ -41,7 +41,7 @@ typedef SCM (*scm_t_vm_engine) (struct scm_vm *vp, SCM program, SCM *argv, int n
|
||||||
#define SCM_VM_NUM_ENGINES 2
|
#define SCM_VM_NUM_ENGINES 2
|
||||||
|
|
||||||
struct scm_vm {
|
struct scm_vm {
|
||||||
scm_byte_t *ip; /* instruction pointer */
|
scm_t_uint8 *ip; /* instruction pointer */
|
||||||
SCM *sp; /* stack pointer */
|
SCM *sp; /* stack pointer */
|
||||||
SCM *fp; /* frame pointer */
|
SCM *fp; /* frame pointer */
|
||||||
size_t stack_size; /* stack size */
|
size_t stack_size; /* stack size */
|
||||||
|
@ -88,7 +88,7 @@ SCM_API SCM scm_vm_stats (SCM vm);
|
||||||
SCM_API SCM scm_vm_trace_frame (SCM vm);
|
SCM_API SCM scm_vm_trace_frame (SCM vm);
|
||||||
|
|
||||||
struct scm_vm_cont {
|
struct scm_vm_cont {
|
||||||
scm_byte_t *ip;
|
scm_t_uint8 *ip;
|
||||||
SCM *sp;
|
SCM *sp;
|
||||||
SCM *fp;
|
SCM *fp;
|
||||||
scm_t_ptrdiff stack_size;
|
scm_t_ptrdiff stack_size;
|
||||||
|
|
|
@ -43,9 +43,7 @@
|
||||||
'(1 0 #f)))
|
'(1 0 #f)))
|
||||||
|
|
||||||
(pass-if "apply"
|
(pass-if "apply"
|
||||||
(equal? (if ((@ (system vm program) program?) apply)
|
(equal? (procedure-property apply 'arity)
|
||||||
(throw 'unresolved)
|
|
||||||
(procedure-property apply 'arity))
|
|
||||||
'(1 0 #t)))
|
'(1 0 #t)))
|
||||||
|
|
||||||
(pass-if "cons*"
|
(pass-if "cons*"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue