301.12
svn: r2556
This commit is contained in:
parent
a5210b4fdf
commit
8e376b31bd
|
@ -3581,7 +3581,7 @@ static void pre_het(void *d)
|
||||||
HiEventTramp *het = (HiEventTramp *)d;
|
HiEventTramp *het = (HiEventTramp *)d;
|
||||||
|
|
||||||
het->old_param = scheme_get_param(het->config, mred_het_param);
|
het->old_param = scheme_get_param(het->config, mred_het_param);
|
||||||
scheme_set_param(het->config, mred_het_param, scheme_make_pair((Scheme_Object *)het, scheme_null));
|
scheme_set_param(het->config, mred_het_param, scheme_make_raw_pair((Scheme_Object *)het, scheme_null));
|
||||||
}
|
}
|
||||||
|
|
||||||
static Scheme_Object *act_het(void *d)
|
static Scheme_Object *act_het(void *d)
|
||||||
|
@ -3739,7 +3739,7 @@ int mred_het_run_some(HiEventTrampProc do_f, void *do_data)
|
||||||
{
|
{
|
||||||
Scheme_Object *v;
|
Scheme_Object *v;
|
||||||
v = scheme_get_param(scheme_current_thread->init_config, mred_het_param);
|
v = scheme_get_param(scheme_current_thread->init_config, mred_het_param);
|
||||||
if (SCHEME_PAIRP(v))
|
if (SCHEME_RPAIRP(v))
|
||||||
het = (HiEventTramp *)SCHEME_CAR(v);
|
het = (HiEventTramp *)SCHEME_CAR(v);
|
||||||
else
|
else
|
||||||
het = NULL;
|
het = NULL;
|
||||||
|
|
|
@ -4424,6 +4424,97 @@ int GC_is_tagged(void *p)
|
||||||
return page && (page->type == MTYPE_TAGGED);
|
return page && (page->type == MTYPE_TAGGED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *next_tagged_start(void *p, int stop_at_p)
|
||||||
|
{
|
||||||
|
MPage *page;
|
||||||
|
void **p2, **top;
|
||||||
|
int prev_was_p = 0;
|
||||||
|
|
||||||
|
page = find_page(p);
|
||||||
|
if (page && (page->type == MTYPE_TAGGED)) {
|
||||||
|
p2 = (void **)page->block_start;
|
||||||
|
|
||||||
|
if (page->flags & MFLAG_CONTINUED)
|
||||||
|
return NULL;
|
||||||
|
if (page->flags & MFLAG_BIGBLOCK) {
|
||||||
|
if (p == (void *)p2) {
|
||||||
|
if (stop_at_p)
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
top = p2 + MPAGE_WORDS;
|
||||||
|
|
||||||
|
while (p2 < top) {
|
||||||
|
Type_Tag tag;
|
||||||
|
long size;
|
||||||
|
|
||||||
|
if (stop_at_p) {
|
||||||
|
if ((void *)p2 == p)
|
||||||
|
return p;
|
||||||
|
if ((unsigned long)p2 > (unsigned long)p)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
tag = *(Type_Tag *)p2;
|
||||||
|
|
||||||
|
if (tag == TAGGED_EOM)
|
||||||
|
break;
|
||||||
|
|
||||||
|
#if ALIGN_DOUBLES
|
||||||
|
if (tag == SKIP) {
|
||||||
|
p2++;
|
||||||
|
} else {
|
||||||
|
#endif
|
||||||
|
if (prev_was_p)
|
||||||
|
return (void *)p2;
|
||||||
|
|
||||||
|
{
|
||||||
|
Size_Proc size_proc;
|
||||||
|
|
||||||
|
size_proc = size_table[tag];
|
||||||
|
if (((long)size_proc) < 100)
|
||||||
|
size = (long)size_proc;
|
||||||
|
else
|
||||||
|
size = size_proc(p2);
|
||||||
|
}
|
||||||
|
|
||||||
|
prev_was_p = (p == p2);
|
||||||
|
|
||||||
|
p2 += size;
|
||||||
|
#if ALIGN_DOUBLES
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int GC_is_tagged_start(void *p)
|
||||||
|
{
|
||||||
|
if (next_tagged_start(p, 1))
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *GC_next_tagged_start(void *p)
|
||||||
|
{
|
||||||
|
void *p2;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
p2 = next_tagged_start(p, 0);
|
||||||
|
if (p2)
|
||||||
|
return p2;
|
||||||
|
|
||||||
|
p = (void *)(((long)p & MPAGE_START) + MPAGE_SIZE);
|
||||||
|
if (!p)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void *print_out_pointer(const char *prefix, void *p)
|
void *print_out_pointer(const char *prefix, void *p)
|
||||||
{
|
{
|
||||||
MPage *page;
|
MPage *page;
|
||||||
|
|
|
@ -98,6 +98,7 @@ scheme_tail_call_waiting
|
||||||
scheme_multiple_values
|
scheme_multiple_values
|
||||||
scheme_uchar_table
|
scheme_uchar_table
|
||||||
scheme_uchar_cases_table
|
scheme_uchar_cases_table
|
||||||
|
scheme_uchar_cats_table
|
||||||
scheme_uchar_ups
|
scheme_uchar_ups
|
||||||
scheme_uchar_downs
|
scheme_uchar_downs
|
||||||
scheme_uchar_titles
|
scheme_uchar_titles
|
||||||
|
@ -196,6 +197,7 @@ scheme_make_closed_prim_w_everything
|
||||||
scheme_prim_is_method
|
scheme_prim_is_method
|
||||||
scheme_make_pair
|
scheme_make_pair
|
||||||
scheme_make_immutable_pair
|
scheme_make_immutable_pair
|
||||||
|
scheme_make_raw_pair
|
||||||
scheme_make_byte_string
|
scheme_make_byte_string
|
||||||
scheme_make_sized_byte_string
|
scheme_make_sized_byte_string
|
||||||
scheme_make_sized_offset_byte_string
|
scheme_make_sized_offset_byte_string
|
||||||
|
|
|
@ -98,6 +98,7 @@ scheme_tail_call_waiting
|
||||||
scheme_multiple_values
|
scheme_multiple_values
|
||||||
scheme_uchar_table
|
scheme_uchar_table
|
||||||
scheme_uchar_cases_table
|
scheme_uchar_cases_table
|
||||||
|
scheme_uchar_cats_table
|
||||||
scheme_uchar_ups
|
scheme_uchar_ups
|
||||||
scheme_uchar_downs
|
scheme_uchar_downs
|
||||||
scheme_uchar_titles
|
scheme_uchar_titles
|
||||||
|
@ -203,6 +204,7 @@ scheme_make_closed_prim_w_everything
|
||||||
scheme_prim_is_method
|
scheme_prim_is_method
|
||||||
scheme_make_pair
|
scheme_make_pair
|
||||||
scheme_make_immutable_pair
|
scheme_make_immutable_pair
|
||||||
|
scheme_make_raw_pair
|
||||||
scheme_make_byte_string
|
scheme_make_byte_string
|
||||||
scheme_make_sized_byte_string
|
scheme_make_sized_byte_string
|
||||||
scheme_make_sized_offset_byte_string
|
scheme_make_sized_offset_byte_string
|
||||||
|
|
|
@ -100,6 +100,7 @@ EXPORTS
|
||||||
scheme_multiple_values
|
scheme_multiple_values
|
||||||
scheme_uchar_table
|
scheme_uchar_table
|
||||||
scheme_uchar_cases_table
|
scheme_uchar_cases_table
|
||||||
|
scheme_uchar_cats_table
|
||||||
scheme_uchar_ups
|
scheme_uchar_ups
|
||||||
scheme_uchar_downs
|
scheme_uchar_downs
|
||||||
scheme_uchar_titles
|
scheme_uchar_titles
|
||||||
|
@ -188,6 +189,7 @@ EXPORTS
|
||||||
scheme_prim_is_method
|
scheme_prim_is_method
|
||||||
scheme_make_pair
|
scheme_make_pair
|
||||||
scheme_make_immutable_pair
|
scheme_make_immutable_pair
|
||||||
|
scheme_make_raw_pair
|
||||||
scheme_make_byte_string
|
scheme_make_byte_string
|
||||||
scheme_make_sized_byte_string
|
scheme_make_sized_byte_string
|
||||||
scheme_make_sized_offset_byte_string
|
scheme_make_sized_offset_byte_string
|
||||||
|
|
|
@ -402,6 +402,8 @@ typedef void (*Scheme_Type_Printer)(Scheme_Object *v, int for_display, Scheme_Pr
|
||||||
#define SCHEME_IMMUTABLE_PAIRP(obj) (SCHEME_PAIRP(obj) && SCHEME_IMMUTABLEP(obj))
|
#define SCHEME_IMMUTABLE_PAIRP(obj) (SCHEME_PAIRP(obj) && SCHEME_IMMUTABLEP(obj))
|
||||||
#define SCHEME_LISTP(obj) (SCHEME_NULLP(obj) || SCHEME_PAIRP(obj))
|
#define SCHEME_LISTP(obj) (SCHEME_NULLP(obj) || SCHEME_PAIRP(obj))
|
||||||
|
|
||||||
|
#define SCHEME_RPAIRP(obj) SAME_TYPE(SCHEME_TYPE(obj), scheme_raw_pair_type)
|
||||||
|
|
||||||
#define SCHEME_BOXP(obj) SAME_TYPE(SCHEME_TYPE(obj), scheme_box_type)
|
#define SCHEME_BOXP(obj) SAME_TYPE(SCHEME_TYPE(obj), scheme_box_type)
|
||||||
#define SCHEME_MUTABLE_BOXP(obj) (SCHEME_BOXP(obj) && SCHEME_MUTABLEP(obj))
|
#define SCHEME_MUTABLE_BOXP(obj) (SCHEME_BOXP(obj) && SCHEME_MUTABLEP(obj))
|
||||||
#define SCHEME_IMMUTABLE_BOXP(obj) (SCHEME_BOXP(obj) && SCHEME_IMMUTABLEP(obj))
|
#define SCHEME_IMMUTABLE_BOXP(obj) (SCHEME_BOXP(obj) && SCHEME_IMMUTABLEP(obj))
|
||||||
|
@ -538,7 +540,7 @@ typedef void (*Scheme_Type_Printer)(Scheme_Object *v, int for_display, Scheme_Pr
|
||||||
#define scheme_ispunc(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x4)
|
#define scheme_ispunc(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x4)
|
||||||
#define scheme_iscontrol(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x8)
|
#define scheme_iscontrol(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x8)
|
||||||
#define scheme_isspace(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x10)
|
#define scheme_isspace(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x10)
|
||||||
#define scheme_isxdigit(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x20)
|
/* #define scheme_isSOMETHING(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x20) - not yet used */
|
||||||
#define scheme_isdigit(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x40)
|
#define scheme_isdigit(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x40)
|
||||||
#define scheme_isalpha(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x80)
|
#define scheme_isalpha(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x80)
|
||||||
#define scheme_istitle(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x100)
|
#define scheme_istitle(x) ((scheme_uchar_find(scheme_uchar_table, x)) & 0x100)
|
||||||
|
@ -558,6 +560,9 @@ typedef void (*Scheme_Type_Printer)(Scheme_Object *v, int for_display, Scheme_Pr
|
||||||
#define scheme_tofold(x) (x + scheme_uchar_folds[scheme_uchar_find(scheme_uchar_cases_table, x)])
|
#define scheme_tofold(x) (x + scheme_uchar_folds[scheme_uchar_find(scheme_uchar_cases_table, x)])
|
||||||
#define scheme_combining_class(x) (scheme_uchar_combining_classes[scheme_uchar_find(scheme_uchar_cases_table, x)])
|
#define scheme_combining_class(x) (scheme_uchar_combining_classes[scheme_uchar_find(scheme_uchar_cases_table, x)])
|
||||||
|
|
||||||
|
#define scheme_general_category(x) ((scheme_uchar_find(scheme_uchar_cats_table, x)) & 0x1F)
|
||||||
|
/* Note: 3 bits available in the cats table */
|
||||||
|
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
/* procedure values */
|
/* procedure values */
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
|
|
|
@ -58,9 +58,12 @@ static Scheme_Object *char_upcase (int argc, Scheme_Object *argv[]);
|
||||||
static Scheme_Object *char_downcase (int argc, Scheme_Object *argv[]);
|
static Scheme_Object *char_downcase (int argc, Scheme_Object *argv[]);
|
||||||
static Scheme_Object *char_titlecase (int argc, Scheme_Object *argv[]);
|
static Scheme_Object *char_titlecase (int argc, Scheme_Object *argv[]);
|
||||||
static Scheme_Object *char_foldcase (int argc, Scheme_Object *argv[]);
|
static Scheme_Object *char_foldcase (int argc, Scheme_Object *argv[]);
|
||||||
|
static Scheme_Object *char_general_category (int argc, Scheme_Object *argv[]);
|
||||||
static Scheme_Object *char_utf8_length (int argc, Scheme_Object *argv[]);
|
static Scheme_Object *char_utf8_length (int argc, Scheme_Object *argv[]);
|
||||||
static Scheme_Object *char_map_list (int argc, Scheme_Object *argv[]);
|
static Scheme_Object *char_map_list (int argc, Scheme_Object *argv[]);
|
||||||
|
|
||||||
|
static Scheme_Object *general_category_symbols[NUM_GENERAL_CATEGORIES];
|
||||||
|
|
||||||
void scheme_init_portable_case(void)
|
void scheme_init_portable_case(void)
|
||||||
{
|
{
|
||||||
init_uchar_table();
|
init_uchar_table();
|
||||||
|
@ -72,6 +75,7 @@ void scheme_init_char (Scheme_Env *env)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
REGISTER_SO(scheme_char_constants);
|
REGISTER_SO(scheme_char_constants);
|
||||||
|
REGISTER_SO(general_category_symbols);
|
||||||
|
|
||||||
scheme_char_constants =
|
scheme_char_constants =
|
||||||
(Scheme_Object **)scheme_malloc_eternal(256 * sizeof(Scheme_Object*));
|
(Scheme_Object **)scheme_malloc_eternal(256 * sizeof(Scheme_Object*));
|
||||||
|
@ -229,6 +233,11 @@ void scheme_init_char (Scheme_Env *env)
|
||||||
"char-foldcase",
|
"char-foldcase",
|
||||||
1, 1, 1),
|
1, 1, 1),
|
||||||
env);
|
env);
|
||||||
|
scheme_add_global_constant("char-general-category",
|
||||||
|
scheme_make_folding_prim(char_general_category,
|
||||||
|
"char-general-category",
|
||||||
|
1, 1, 1),
|
||||||
|
env);
|
||||||
|
|
||||||
scheme_add_global_constant("char-utf-8-length",
|
scheme_add_global_constant("char-utf-8-length",
|
||||||
scheme_make_folding_prim(char_utf8_length,
|
scheme_make_folding_prim(char_utf8_length,
|
||||||
|
@ -386,6 +395,25 @@ GEN_RECASE(char_downcase, "char-downcase", scheme_tolower)
|
||||||
GEN_RECASE(char_titlecase, "char-titlecase", scheme_totitle)
|
GEN_RECASE(char_titlecase, "char-titlecase", scheme_totitle)
|
||||||
GEN_RECASE(char_foldcase, "char-foldcase", scheme_tofold)
|
GEN_RECASE(char_foldcase, "char-foldcase", scheme_tofold)
|
||||||
|
|
||||||
|
static Scheme_Object *char_general_category (int argc, Scheme_Object *argv[])
|
||||||
|
{
|
||||||
|
mzchar c;
|
||||||
|
int cat;
|
||||||
|
|
||||||
|
if (!SCHEME_CHARP(argv[0]))
|
||||||
|
scheme_wrong_type("char-general-category", "character", 0, argc, argv);
|
||||||
|
|
||||||
|
c = SCHEME_CHAR_VAL(argv[0]);
|
||||||
|
cat = scheme_general_category(c);
|
||||||
|
if (!general_category_symbols[cat]) {
|
||||||
|
Scheme_Object *s;
|
||||||
|
s = scheme_make_symbol(general_category_names[cat]);
|
||||||
|
general_category_symbols[cat] = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
return general_category_symbols[cat];
|
||||||
|
}
|
||||||
|
|
||||||
static Scheme_Object *char_utf8_length (int argc, Scheme_Object *argv[])
|
static Scheme_Object *char_utf8_length (int argc, Scheme_Object *argv[])
|
||||||
{
|
{
|
||||||
mzchar wc;
|
mzchar wc;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -987,7 +987,8 @@ void scheme_shadow(Scheme_Env *env, Scheme_Object *n, int stxtoo)
|
||||||
n, n,
|
n, n,
|
||||||
env->module->self_modidx,
|
env->module->self_modidx,
|
||||||
n,
|
n,
|
||||||
env->mod_phase);
|
env->mod_phase,
|
||||||
|
0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1579,7 +1580,7 @@ Scheme_Object *scheme_hash_module_variable(Scheme_Env *env, Scheme_Object *modid
|
||||||
Scheme_Object *scheme_tl_id_sym(Scheme_Env *env, Scheme_Object *id, int is_def)
|
Scheme_Object *scheme_tl_id_sym(Scheme_Env *env, Scheme_Object *id, int is_def)
|
||||||
/* The `env' argument can actually be a hash table. */
|
/* The `env' argument can actually be a hash table. */
|
||||||
{
|
{
|
||||||
Scheme_Object *marks = NULL, *sym, *map, *l, *a, *amarks, *m, *best_match;
|
Scheme_Object *marks = NULL, *sym, *map, *l, *a, *amarks, *m, *best_match, *cm;
|
||||||
int best_match_skipped, ms;
|
int best_match_skipped, ms;
|
||||||
Scheme_Hash_Table *marked_names;
|
Scheme_Hash_Table *marked_names;
|
||||||
|
|
||||||
|
@ -1627,6 +1628,12 @@ Scheme_Object *scheme_tl_id_sym(Scheme_Env *env, Scheme_Object *id, int is_def)
|
||||||
|
|
||||||
best_match = NULL;
|
best_match = NULL;
|
||||||
best_match_skipped = scheme_list_length(marks);
|
best_match_skipped = scheme_list_length(marks);
|
||||||
|
if (best_match_skipped == 1) {
|
||||||
|
/* A mark list of length 1 is the common case.
|
||||||
|
Since the list is otherwise marshaled into .zo, etc.,
|
||||||
|
simplify by extracting just the mark: */
|
||||||
|
marks = SCHEME_CAR(marks);
|
||||||
|
}
|
||||||
|
|
||||||
/* Find a mapping that matches the longest tail of marks */
|
/* Find a mapping that matches the longest tail of marks */
|
||||||
for (l = map; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) {
|
for (l = map; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) {
|
||||||
|
@ -1638,12 +1645,28 @@ Scheme_Object *scheme_tl_id_sym(Scheme_Env *env, Scheme_Object *id, int is_def)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (!SCHEME_PAIRP(marks)) {
|
||||||
|
/* To be better than nothing, could only match exactly: */
|
||||||
|
if (SAME_OBJ(amarks, marks)) {
|
||||||
|
best_match = SCHEME_CDR(a);
|
||||||
|
best_match_skipped = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* amarks can match a tail of marks: */
|
||||||
for (m = marks, ms = 0;
|
for (m = marks, ms = 0;
|
||||||
SCHEME_PAIRP(m) && (ms < best_match_skipped);
|
SCHEME_PAIRP(m) && (ms < best_match_skipped);
|
||||||
m = SCHEME_CDR(m), ms++) {
|
m = SCHEME_CDR(m), ms++) {
|
||||||
|
|
||||||
if (scheme_equal(amarks, m)) {
|
cm = m;
|
||||||
if (ms < best_match_skipped) {
|
if (!SCHEME_PAIRP(amarks)) {
|
||||||
|
/* If we're down to the last element
|
||||||
|
of marks, then extract it to try to
|
||||||
|
match the symbol amarks. */
|
||||||
|
if (SCHEME_NULLP(SCHEME_CDR(m)))
|
||||||
|
cm = SCHEME_CAR(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scheme_equal(amarks, cm)) {
|
||||||
best_match = SCHEME_CDR(a);
|
best_match = SCHEME_CDR(a);
|
||||||
best_match_skipped = ms;
|
best_match_skipped = ms;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1214,7 +1214,12 @@ void scheme_arg_mismatch(const char *name, const char *msg, Scheme_Object *o)
|
||||||
char *s;
|
char *s;
|
||||||
int slen;
|
int slen;
|
||||||
|
|
||||||
|
if (o)
|
||||||
s = scheme_make_provided_string(o, 1, &slen);
|
s = scheme_make_provided_string(o, 1, &slen);
|
||||||
|
else {
|
||||||
|
s = "";
|
||||||
|
slen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
scheme_raise_exn(MZEXN_FAIL_CONTRACT,
|
scheme_raise_exn(MZEXN_FAIL_CONTRACT,
|
||||||
"%s: %s%t",
|
"%s: %s%t",
|
||||||
|
|
|
@ -201,6 +201,8 @@ static Scheme_Object *write_with_cont_mark(Scheme_Object *obj);
|
||||||
static Scheme_Object *read_with_cont_mark(Scheme_Object *obj);
|
static Scheme_Object *read_with_cont_mark(Scheme_Object *obj);
|
||||||
static Scheme_Object *write_syntax(Scheme_Object *obj);
|
static Scheme_Object *write_syntax(Scheme_Object *obj);
|
||||||
static Scheme_Object *read_syntax(Scheme_Object *obj);
|
static Scheme_Object *read_syntax(Scheme_Object *obj);
|
||||||
|
static Scheme_Object *write_quote_syntax(Scheme_Object *obj);
|
||||||
|
static Scheme_Object *read_quote_syntax(Scheme_Object *obj);
|
||||||
|
|
||||||
static Scheme_Object *define_values_symbol, *letrec_values_symbol, *lambda_symbol;
|
static Scheme_Object *define_values_symbol, *letrec_values_symbol, *lambda_symbol;
|
||||||
static Scheme_Object *unknown_symbol, *void_link_symbol, *quote_symbol;
|
static Scheme_Object *unknown_symbol, *void_link_symbol, *quote_symbol;
|
||||||
|
@ -329,6 +331,8 @@ scheme_init_eval (Scheme_Env *env)
|
||||||
scheme_install_type_reader(scheme_branch_type, read_branch);
|
scheme_install_type_reader(scheme_branch_type, read_branch);
|
||||||
scheme_install_type_writer(scheme_with_cont_mark_type, write_with_cont_mark);
|
scheme_install_type_writer(scheme_with_cont_mark_type, write_with_cont_mark);
|
||||||
scheme_install_type_reader(scheme_with_cont_mark_type, read_with_cont_mark);
|
scheme_install_type_reader(scheme_with_cont_mark_type, read_with_cont_mark);
|
||||||
|
scheme_install_type_writer(scheme_quote_syntax_type, write_quote_syntax);
|
||||||
|
scheme_install_type_reader(scheme_quote_syntax_type, read_quote_syntax);
|
||||||
scheme_install_type_writer(scheme_syntax_type, write_syntax);
|
scheme_install_type_writer(scheme_syntax_type, write_syntax);
|
||||||
scheme_install_type_reader(scheme_syntax_type, read_syntax);
|
scheme_install_type_reader(scheme_syntax_type, read_syntax);
|
||||||
|
|
||||||
|
@ -1447,18 +1451,20 @@ Scheme_Object *scheme_resolve_expr(Scheme_Object *expr, Resolve_Info *info)
|
||||||
return scheme_resolve_toplevel(info, expr);
|
return scheme_resolve_toplevel(info, expr);
|
||||||
case scheme_compiled_quote_syntax_type:
|
case scheme_compiled_quote_syntax_type:
|
||||||
{
|
{
|
||||||
Scheme_Object *obj;
|
Scheme_Quote_Syntax *qs;
|
||||||
int i, c, p;
|
int i, c, p;
|
||||||
|
|
||||||
i = SCHEME_LOCAL_POS(expr);
|
i = SCHEME_LOCAL_POS(expr);
|
||||||
c = scheme_resolve_toplevel_pos(info);
|
c = scheme_resolve_toplevel_pos(info);
|
||||||
p = scheme_resolve_quote_syntax_pos(info);
|
p = scheme_resolve_quote_syntax_pos(info);
|
||||||
|
|
||||||
obj = scheme_make_pair(scheme_make_integer(i),
|
qs = MALLOC_ONE_TAGGED(Scheme_Quote_Syntax);
|
||||||
scheme_make_pair(scheme_make_integer(c),
|
qs->so.type = scheme_quote_syntax_type;
|
||||||
scheme_make_integer(p)));
|
qs->depth = c;
|
||||||
|
qs->position = i;
|
||||||
|
qs->midpoint = p;
|
||||||
|
|
||||||
return scheme_make_syntax_resolved(QUOTE_SYNTAX_EXPD, obj);
|
return (Scheme_Object *)qs;
|
||||||
}
|
}
|
||||||
case scheme_variable_type:
|
case scheme_variable_type:
|
||||||
case scheme_module_variable_type:
|
case scheme_module_variable_type:
|
||||||
|
@ -5289,7 +5295,7 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands,
|
||||||
|
|
||||||
if (SCHEME_INTP(obj)) {
|
if (SCHEME_INTP(obj)) {
|
||||||
v = obj;
|
v = obj;
|
||||||
goto returnv;
|
goto returnv_never_multi;
|
||||||
}
|
}
|
||||||
|
|
||||||
type = _SCHEME_TYPE(obj);
|
type = _SCHEME_TYPE(obj);
|
||||||
|
@ -5309,17 +5315,17 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands,
|
||||||
prefix tmp
|
prefix tmp
|
||||||
|
|
||||||
global_lookup(v = , obj, v);
|
global_lookup(v = , obj, v);
|
||||||
goto returnv;
|
goto returnv_never_multi;
|
||||||
}
|
}
|
||||||
case scheme_local_type:
|
case scheme_local_type:
|
||||||
{
|
{
|
||||||
v = RUNSTACK[SCHEME_LOCAL_POS(obj)];
|
v = RUNSTACK[SCHEME_LOCAL_POS(obj)];
|
||||||
goto returnv;
|
goto returnv_never_multi;
|
||||||
}
|
}
|
||||||
case scheme_local_unbox_type:
|
case scheme_local_unbox_type:
|
||||||
{
|
{
|
||||||
v = SCHEME_ENVBOX_VAL(RUNSTACK[SCHEME_LOCAL_POS(obj)]);
|
v = SCHEME_ENVBOX_VAL(RUNSTACK[SCHEME_LOCAL_POS(obj)]);
|
||||||
goto returnv;
|
goto returnv_never_multi;
|
||||||
}
|
}
|
||||||
case scheme_syntax_type:
|
case scheme_syntax_type:
|
||||||
{
|
{
|
||||||
|
@ -5596,7 +5602,7 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands,
|
||||||
case scheme_unclosed_procedure_type:
|
case scheme_unclosed_procedure_type:
|
||||||
UPDATE_THREAD_RSPTR();
|
UPDATE_THREAD_RSPTR();
|
||||||
v = scheme_make_closure(p, obj, 1);
|
v = scheme_make_closure(p, obj, 1);
|
||||||
goto returnv;
|
goto returnv_never_multi;
|
||||||
|
|
||||||
case scheme_let_value_type:
|
case scheme_let_value_type:
|
||||||
{
|
{
|
||||||
|
@ -5801,9 +5807,31 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands,
|
||||||
goto eval_top;
|
goto eval_top;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case scheme_quote_syntax_type:
|
||||||
|
{
|
||||||
|
GC_CAN_IGNORE Scheme_Quote_Syntax *qs = (Scheme_Quote_Syntax *)obj;
|
||||||
|
Scheme_Object **globs;
|
||||||
|
int i, c, p;
|
||||||
|
|
||||||
|
i = qs->position;
|
||||||
|
c = qs->depth;
|
||||||
|
p = qs->midpoint;
|
||||||
|
|
||||||
|
globs = (Scheme_Object **)RUNSTACK[c];
|
||||||
|
v = globs[i+p+1];
|
||||||
|
if (!v) {
|
||||||
|
v = globs[p];
|
||||||
|
v = scheme_add_rename(((Scheme_Object **)SCHEME_CDR(v))[i],
|
||||||
|
SCHEME_CAR(v));
|
||||||
|
globs[i+p+1] = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
goto returnv_never_multi;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
v = obj;
|
v = obj;
|
||||||
goto returnv;
|
goto returnv_never_multi;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5834,6 +5862,8 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
returnv_never_multi:
|
||||||
|
|
||||||
MZ_RUNSTACK = old_runstack;
|
MZ_RUNSTACK = old_runstack;
|
||||||
MZ_CONT_MARK_STACK = old_cont_mark_stack;
|
MZ_CONT_MARK_STACK = old_cont_mark_stack;
|
||||||
MZ_CONT_MARK_POS -= 2;
|
MZ_CONT_MARK_POS -= 2;
|
||||||
|
@ -6725,10 +6755,9 @@ Scheme_Object **scheme_push_prefix(Scheme_Env *genv, Resolve_Prefix *rp,
|
||||||
v = scheme_stx_phase_shift_as_rename(now_phase - src_phase, src_modidx, now_modidx);
|
v = scheme_stx_phase_shift_as_rename(now_phase - src_phase, src_modidx, now_modidx);
|
||||||
if (v) {
|
if (v) {
|
||||||
/* Put lazy-shift info in a[i]: */
|
/* Put lazy-shift info in a[i]: */
|
||||||
v = scheme_make_pair(v, (Scheme_Object *)rp->stxes);
|
v = scheme_make_raw_pair(v, (Scheme_Object *)rp->stxes);
|
||||||
a[i] = v;
|
a[i] = v;
|
||||||
/* Rest of a left zeroed, to be filled in lazily by
|
/* Rest of a left zeroed, to be filled in lazily by quote-syntax evaluation */
|
||||||
QUOTE_SYNTAX_EXPD handler */
|
|
||||||
} else {
|
} else {
|
||||||
/* No shift, so fill in stxes immediately */
|
/* No shift, so fill in stxes immediately */
|
||||||
i++;
|
i++;
|
||||||
|
@ -6914,6 +6943,21 @@ void scheme_validate_expr(Mz_CPort *port, Scheme_Object *expr, char *stack,
|
||||||
goto top;
|
goto top;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case scheme_quote_syntax_type:
|
||||||
|
{
|
||||||
|
Scheme_Quote_Syntax *qs = (Scheme_Quote_Syntax *)expr;
|
||||||
|
int c = qs->depth;
|
||||||
|
int i = qs->position;
|
||||||
|
int p = qs->midpoint;
|
||||||
|
int d = c + delta;
|
||||||
|
|
||||||
|
if ((c < 0) || (p < 0) || (d >= depth)
|
||||||
|
|| (stack[d] != VALID_TOPLEVELS)
|
||||||
|
|| (p != num_toplevels)
|
||||||
|
|| (i >= num_stxes))
|
||||||
|
scheme_ill_formed_code(port);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case scheme_unclosed_procedure_type:
|
case scheme_unclosed_procedure_type:
|
||||||
{
|
{
|
||||||
Scheme_Closure_Data *data = (Scheme_Closure_Data *)expr;
|
Scheme_Closure_Data *data = (Scheme_Closure_Data *)expr;
|
||||||
|
@ -7075,19 +7119,6 @@ void scheme_validate_toplevel(Scheme_Object *expr, Mz_CPort *port,
|
||||||
scheme_validate_expr(port, expr, stack, depth, delta, delta, num_toplevels, num_stxes);
|
scheme_validate_expr(port, expr, stack, depth, delta, delta, num_toplevels, num_stxes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void scheme_validate_quote_syntax(int c, int p, int i, Mz_CPort *port,
|
|
||||||
char *stack, int depth, int delta,
|
|
||||||
int num_toplevels, int num_stxes)
|
|
||||||
{
|
|
||||||
int d = c + delta;
|
|
||||||
|
|
||||||
if ((c < 0) || (p < 0) || (d >= depth)
|
|
||||||
|| (stack[d] != VALID_TOPLEVELS)
|
|
||||||
|| (p != num_toplevels)
|
|
||||||
|| (i >= num_stxes))
|
|
||||||
scheme_ill_formed_code(port);
|
|
||||||
}
|
|
||||||
|
|
||||||
void scheme_validate_boxenv(int p, Mz_CPort *port, char *stack, int depth, int delta)
|
void scheme_validate_boxenv(int p, Mz_CPort *port, char *stack, int depth, int delta)
|
||||||
{
|
{
|
||||||
p += delta;
|
p += delta;
|
||||||
|
@ -7258,6 +7289,44 @@ static Scheme_Object *read_syntax(Scheme_Object *obj)
|
||||||
return scheme_make_syntax_resolved(SCHEME_INT_VAL(idx), first);
|
return scheme_make_syntax_resolved(SCHEME_INT_VAL(idx), first);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Scheme_Object *write_quote_syntax(Scheme_Object *obj)
|
||||||
|
{
|
||||||
|
Scheme_Quote_Syntax *qs = (Scheme_Quote_Syntax *)obj;
|
||||||
|
|
||||||
|
return cons(scheme_make_integer(qs->depth),
|
||||||
|
cons(scheme_make_integer(qs->position),
|
||||||
|
scheme_make_integer(qs->midpoint)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static Scheme_Object *read_quote_syntax(Scheme_Object *obj)
|
||||||
|
{
|
||||||
|
Scheme_Quote_Syntax *qs;
|
||||||
|
Scheme_Object *a;
|
||||||
|
int c, i, p;
|
||||||
|
|
||||||
|
if (!SCHEME_PAIRP(obj)) return NULL;
|
||||||
|
|
||||||
|
a = SCHEME_CAR(obj);
|
||||||
|
c = SCHEME_INT_VAL(a);
|
||||||
|
|
||||||
|
obj = SCHEME_CDR(obj);
|
||||||
|
if (!SCHEME_PAIRP(obj)) return NULL;
|
||||||
|
|
||||||
|
a = SCHEME_CAR(obj);
|
||||||
|
i = SCHEME_INT_VAL(a);
|
||||||
|
|
||||||
|
a = SCHEME_CDR(obj);
|
||||||
|
p = SCHEME_INT_VAL(a);
|
||||||
|
|
||||||
|
qs = MALLOC_ONE_TAGGED(Scheme_Quote_Syntax);
|
||||||
|
qs->so.type = scheme_quote_syntax_type;
|
||||||
|
qs->depth = c;
|
||||||
|
qs->position = i;
|
||||||
|
qs->midpoint = p;
|
||||||
|
|
||||||
|
return (Scheme_Object *)qs;
|
||||||
|
}
|
||||||
|
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
/* precise GC traversers */
|
/* precise GC traversers */
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
|
|
|
@ -3589,7 +3589,7 @@ internal_call_cc (int argc, Scheme_Object *argv[])
|
||||||
/* For copying cont marks back in, we need a list of sub_conts,
|
/* For copying cont marks back in, we need a list of sub_conts,
|
||||||
deepest to shallowest: */
|
deepest to shallowest: */
|
||||||
for (sub_cont = cont->buf.cont; sub_cont; sub_cont = sub_cont->buf.cont) {
|
for (sub_cont = cont->buf.cont; sub_cont; sub_cont = sub_cont->buf.cont) {
|
||||||
sub_conts = scheme_make_pair((Scheme_Object *)sub_cont, sub_conts);
|
sub_conts = scheme_make_raw_pair((Scheme_Object *)sub_cont, sub_conts);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For dynamic-winds after the "common" intersection
|
/* For dynamic-winds after the "common" intersection
|
||||||
|
|
|
@ -56,8 +56,6 @@ static void *shared_non_tail_code[3][MAX_SHARED_CALL_RANDS][2];
|
||||||
#define MAX_SHARED_ARITY_CHECK 25
|
#define MAX_SHARED_ARITY_CHECK 25
|
||||||
static void *shared_arity_check[MAX_SHARED_ARITY_CHECK][2][2];
|
static void *shared_arity_check[MAX_SHARED_ARITY_CHECK][2][2];
|
||||||
|
|
||||||
static void *jump_to_native_code;
|
|
||||||
static void *jump_to_native_arity_code;
|
|
||||||
static void *bad_result_arity_code;
|
static void *bad_result_arity_code;
|
||||||
static void *unbound_global_code;
|
static void *unbound_global_code;
|
||||||
static void *quote_syntax_code;
|
static void *quote_syntax_code;
|
||||||
|
@ -753,16 +751,15 @@ static void _jit_prolog_again(mz_jit_state *jitter, int n, int ret_addr_reg)
|
||||||
# define __END_SHORT_JUMPS__(cond) /* empty */
|
# define __END_SHORT_JUMPS__(cond) /* empty */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Note: Things like
|
/* In
|
||||||
|
jit_jmpi(code);
|
||||||
refm = jit_jmpi(jit_forward());
|
or
|
||||||
jit_patch_at(refm, jump_to_native_code);
|
jit_blti_i(code, v);
|
||||||
|
with short jumps enabled, the generated instructions can depend on
|
||||||
appear in the code because the generated instructions can depend on
|
the relative location between the instruction address and the
|
||||||
the actual value supplied to jit_jmpi, and it can depend on the
|
actual value. Do not enable short jumps if the relative offset can
|
||||||
relative location between the instruction address and the actual
|
change between the initial sizing pass and the final pass. Of course,
|
||||||
value. Using jit_patch ensures that the generated instructions
|
also don't enable short umps if the jump is potentially too long. */
|
||||||
always have the same size. */
|
|
||||||
|
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
/* bytecode properties */
|
/* bytecode properties */
|
||||||
|
@ -783,8 +780,7 @@ static int is_short(Scheme_Object *obj, int fuel)
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
t = SCHEME_PINT_VAL(obj);
|
t = SCHEME_PINT_VAL(obj);
|
||||||
if ((t == CASE_LAMBDA_EXPD)
|
if (t == CASE_LAMBDA_EXPD)
|
||||||
|| (t == QUOTE_SYNTAX_EXPD))
|
|
||||||
return fuel - 1;
|
return fuel - 1;
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -837,6 +833,7 @@ static int is_short(Scheme_Object *obj, int fuel)
|
||||||
return is_short(branch->fbranch, fuel);
|
return is_short(branch->fbranch, fuel);
|
||||||
}
|
}
|
||||||
case scheme_toplevel_type:
|
case scheme_toplevel_type:
|
||||||
|
case scheme_quote_syntax_type:
|
||||||
case scheme_local_type:
|
case scheme_local_type:
|
||||||
case scheme_local_unbox_type:
|
case scheme_local_unbox_type:
|
||||||
case scheme_unclosed_procedure_type:
|
case scheme_unclosed_procedure_type:
|
||||||
|
@ -922,8 +919,7 @@ static int is_simple(Scheme_Object *obj, int depth, int just_markless, mz_jit_st
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
t = SCHEME_PINT_VAL(obj);
|
t = SCHEME_PINT_VAL(obj);
|
||||||
return ((t == CASE_LAMBDA_EXPD)
|
return (t == CASE_LAMBDA_EXPD);
|
||||||
|| (t == QUOTE_SYNTAX_EXPD));
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -977,6 +973,7 @@ static int is_simple(Scheme_Object *obj, int depth, int just_markless, mz_jit_st
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case scheme_toplevel_type:
|
case scheme_toplevel_type:
|
||||||
|
case scheme_quote_syntax_type:
|
||||||
case scheme_local_type:
|
case scheme_local_type:
|
||||||
case scheme_local_unbox_type:
|
case scheme_local_unbox_type:
|
||||||
case scheme_unclosed_procedure_type:
|
case scheme_unclosed_procedure_type:
|
||||||
|
@ -1190,19 +1187,7 @@ static int generate_non_tail_call(mz_jit_state *jitter, int num_rands, int direc
|
||||||
jit_str_i(JIT_R1, JIT_R2);
|
jit_str_i(JIT_R1, JIT_R2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Fast inlined-native jump ok (proc will check argc); */
|
/* Fast inlined-native jump ok (proc will check argc, if necessary) */
|
||||||
#if 0
|
|
||||||
mz_prepare(3);
|
|
||||||
jit_pusharg_p(JIT_RUNSTACK);
|
|
||||||
jit_movi_i(JIT_R1, num_rands);
|
|
||||||
jit_pusharg_i(JIT_R1);
|
|
||||||
jit_pusharg_p(JIT_V1);
|
|
||||||
if (direct_native) {
|
|
||||||
(void)mz_finish(jump_to_native_code);
|
|
||||||
} else {
|
|
||||||
(void)mz_finish(jump_to_native_arity_code);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
{
|
{
|
||||||
jit_insn *refr;
|
jit_insn *refr;
|
||||||
refr = jit_movi_p(JIT_R0, jit_forward());
|
refr = jit_movi_p(JIT_R0, jit_forward());
|
||||||
|
@ -1223,7 +1208,6 @@ static int generate_non_tail_call(mz_jit_state *jitter, int num_rands, int direc
|
||||||
jit_jmpr(JIT_V1);
|
jit_jmpr(JIT_V1);
|
||||||
jit_patch_movi(refr, (_jit.x.pc));
|
jit_patch_movi(refr, (_jit.x.pc));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
CHECK_LIMIT();
|
CHECK_LIMIT();
|
||||||
jit_retval(JIT_R0);
|
jit_retval(JIT_R0);
|
||||||
if (!multi_ok) {
|
if (!multi_ok) {
|
||||||
|
@ -3078,26 +3062,6 @@ static int generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int m
|
||||||
END_JIT_DATA(9);
|
END_JIT_DATA(9);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case QUOTE_SYNTAX_EXPD:
|
|
||||||
{
|
|
||||||
int i, c, p;
|
|
||||||
START_JIT_DATA();
|
|
||||||
|
|
||||||
LOG_IT(("quote-syntax\n"));
|
|
||||||
|
|
||||||
obj = SCHEME_IPTR_VAL(obj);
|
|
||||||
i = SCHEME_INT_VAL(SCHEME_CAR(obj));
|
|
||||||
c = mz_remap(SCHEME_INT_VAL(SCHEME_CADR(obj)));
|
|
||||||
p = SCHEME_INT_VAL(SCHEME_CDDR(obj));
|
|
||||||
|
|
||||||
jit_movi_i(JIT_R0, WORDS_TO_BYTES(c));
|
|
||||||
jit_movi_i(JIT_R1, WORDS_TO_BYTES(i + p + 1));
|
|
||||||
jit_movi_i(JIT_R2, WORDS_TO_BYTES(p));
|
|
||||||
(void)jit_calli(quote_syntax_code);
|
|
||||||
|
|
||||||
END_JIT_DATA(10);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
JIT_UPDATE_THREAD_RSPTR_IF_NEEDED();
|
JIT_UPDATE_THREAD_RSPTR_IF_NEEDED();
|
||||||
|
@ -3516,6 +3480,27 @@ static int generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int m
|
||||||
|
|
||||||
return generate(wcm->body, jitter, is_tail, multi_ok);
|
return generate(wcm->body, jitter, is_tail, multi_ok);
|
||||||
}
|
}
|
||||||
|
case scheme_quote_syntax_type:
|
||||||
|
{
|
||||||
|
Scheme_Quote_Syntax *qs = (Scheme_Quote_Syntax *)obj;
|
||||||
|
int i, c, p;
|
||||||
|
START_JIT_DATA();
|
||||||
|
|
||||||
|
LOG_IT(("quote-syntax\n"));
|
||||||
|
|
||||||
|
i = qs->position;
|
||||||
|
c = mz_remap(qs->depth);
|
||||||
|
p = qs->midpoint;
|
||||||
|
|
||||||
|
jit_movi_i(JIT_R0, WORDS_TO_BYTES(c));
|
||||||
|
jit_movi_i(JIT_R1, WORDS_TO_BYTES(i + p + 1));
|
||||||
|
jit_movi_i(JIT_R2, WORDS_TO_BYTES(p));
|
||||||
|
(void)jit_calli(quote_syntax_code);
|
||||||
|
|
||||||
|
END_JIT_DATA(10);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
int retptr;
|
int retptr;
|
||||||
|
@ -3642,37 +3627,6 @@ static int do_generate_common(mz_jit_state *jitter, void *_data)
|
||||||
int in, i;
|
int in, i;
|
||||||
GC_CAN_IGNORE jit_insn *ref, *ref2;
|
GC_CAN_IGNORE jit_insn *ref, *ref2;
|
||||||
|
|
||||||
/* *** jump_to_native_[arity_]code *** */
|
|
||||||
/* Called as a function: */
|
|
||||||
for (i = 0; i < 2; i++) {
|
|
||||||
if (!i)
|
|
||||||
jump_to_native_code = jit_get_ip().ptr;
|
|
||||||
else
|
|
||||||
jump_to_native_arity_code = jit_get_ip().ptr;
|
|
||||||
jit_prolog(3);
|
|
||||||
in = jit_arg_p();
|
|
||||||
jit_getarg_p(JIT_R0, in); /* closure */
|
|
||||||
in = jit_arg_p();
|
|
||||||
jit_getarg_i(JIT_R1, in); /* argc */
|
|
||||||
in = jit_arg_p();
|
|
||||||
jit_getarg_i(JIT_R2, in); /* argv */
|
|
||||||
CHECK_LIMIT();
|
|
||||||
jit_movr_p(JIT_RUNSTACK, JIT_R2);
|
|
||||||
jit_movr_p(JIT_RUNSTACK_BASE, JIT_R1);
|
|
||||||
jit_lshi_ul(JIT_RUNSTACK_BASE, JIT_RUNSTACK_BASE, JIT_LOG_WORD_SIZE);
|
|
||||||
jit_addr_p(JIT_RUNSTACK_BASE, JIT_RUNSTACK_BASE, JIT_RUNSTACK);
|
|
||||||
mz_push_locals();
|
|
||||||
mz_set_local_p(JIT_RUNSTACK, JIT_LOCAL1);
|
|
||||||
jit_ldxi_p(JIT_V1, JIT_R0, &((Scheme_Native_Closure *)0x0)->code);
|
|
||||||
if (!i) {
|
|
||||||
jit_ldxi_p(JIT_V1, JIT_V1, &((Scheme_Native_Closure_Data *)0x0)->u.tail_code);
|
|
||||||
} else {
|
|
||||||
jit_ldxi_p(JIT_V1, JIT_V1, &((Scheme_Native_Closure_Data *)0x0)->arity_code);
|
|
||||||
}
|
|
||||||
jit_jmpr(JIT_V1);
|
|
||||||
CHECK_LIMIT();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* *** check_arity_code *** */
|
/* *** check_arity_code *** */
|
||||||
/* Called as a function: */
|
/* Called as a function: */
|
||||||
check_arity_code = (Native_Check_Arity_Proc)jit_get_ip().ptr;
|
check_arity_code = (Native_Check_Arity_Proc)jit_get_ip().ptr;
|
||||||
|
@ -4541,7 +4495,7 @@ Scheme_Native_Closure_Data *scheme_generate_lambda(Scheme_Closure_Data *data, in
|
||||||
{
|
{
|
||||||
Scheme_Native_Closure_Data *ndata;
|
Scheme_Native_Closure_Data *ndata;
|
||||||
|
|
||||||
if (!jump_to_native_code) {
|
if (!check_arity_code) {
|
||||||
/* Create shared code used for stack-overflow handling, etc.: */
|
/* Create shared code used for stack-overflow handling, etc.: */
|
||||||
generate_one(NULL, do_generate_common, NULL, 0, NULL, NULL);
|
generate_one(NULL, do_generate_common, NULL, 0, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -532,6 +532,15 @@ Scheme_Object *scheme_make_pair(Scheme_Object *car, Scheme_Object *cdr)
|
||||||
{
|
{
|
||||||
Scheme_Object *cons;
|
Scheme_Object *cons;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (!car || !cdr
|
||||||
|
|| (SCHEME_TYPE(car) < 0)
|
||||||
|
|| (SCHEME_TYPE(cdr) < 0)
|
||||||
|
|| (SCHEME_TYPE(car) >= (_scheme_last_type_ + 10)) /* +10 leaves room of external types */
|
||||||
|
|| (SCHEME_TYPE(cdr) >= (_scheme_last_type_ + 10)))
|
||||||
|
*(long *)0x0 = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
cons = scheme_alloc_object();
|
cons = scheme_alloc_object();
|
||||||
cons->type = scheme_pair_type;
|
cons->type = scheme_pair_type;
|
||||||
SCHEME_CAR(cons) = car;
|
SCHEME_CAR(cons) = car;
|
||||||
|
@ -539,6 +548,21 @@ Scheme_Object *scheme_make_pair(Scheme_Object *car, Scheme_Object *cdr)
|
||||||
return cons;
|
return cons;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Scheme_Object *scheme_make_raw_pair(Scheme_Object *car, Scheme_Object *cdr)
|
||||||
|
{
|
||||||
|
Scheme_Object *cons;
|
||||||
|
|
||||||
|
/* A raw pair is like a pair, but some of our low-level debugging
|
||||||
|
tools expect pairs to always contain tagged values. A raw pair
|
||||||
|
contains arbitrary pointers. */
|
||||||
|
|
||||||
|
cons = scheme_alloc_object();
|
||||||
|
cons->type = scheme_raw_pair_type;
|
||||||
|
SCHEME_CAR(cons) = car;
|
||||||
|
SCHEME_CDR(cons) = cdr;
|
||||||
|
return cons;
|
||||||
|
}
|
||||||
|
|
||||||
Scheme_Object *scheme_make_immutable_pair(Scheme_Object *car, Scheme_Object *cdr)
|
Scheme_Object *scheme_make_immutable_pair(Scheme_Object *car, Scheme_Object *cdr)
|
||||||
{
|
{
|
||||||
Scheme_Object *cons;
|
Scheme_Object *cons;
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
|
|
||||||
;; Run as
|
;; Run as
|
||||||
;; mzscheme -r mk-uchar.ss
|
;; mzscheme -r mk-uchar.ss
|
||||||
;; in the script's directory, and have a copy of UnicodeData.txt
|
;; in the script's directory, and have a copy of UnicodeData.txt, etc.
|
||||||
;; in the same directory. The file schuchar.inc will be
|
;; in the "Unicode" directory. The file schuchar.inc will be
|
||||||
;; overwritten.
|
;; overwritten.
|
||||||
|
|
||||||
(require (lib "list.ss"))
|
(require (lib "list.ss"))
|
||||||
|
@ -20,6 +20,7 @@
|
||||||
(define space-cats '("Zl" "Zs" "Zp"))
|
(define space-cats '("Zl" "Zs" "Zp"))
|
||||||
(define punc-cats '("Pc" "Pd" "Ps" "Pe" "Pi" "Pf" "Po"))
|
(define punc-cats '("Pc" "Pd" "Ps" "Pe" "Pi" "Pf" "Po"))
|
||||||
(define sym-cats '("Sm" "Sc" "Sk" "So"))
|
(define sym-cats '("Sm" "Sc" "Sk" "So"))
|
||||||
|
(define sympart-non-cats '("Ps" "Pe" "Pi" "Pf" "Zl" "Zs" "Zp"))
|
||||||
(define graphic-cats (append mark-cats
|
(define graphic-cats (append mark-cats
|
||||||
letter-cats
|
letter-cats
|
||||||
digit-cats
|
digit-cats
|
||||||
|
@ -52,6 +53,15 @@
|
||||||
(define (combine-case up down title fold combining)
|
(define (combine-case up down title fold combining)
|
||||||
(indirect cases (list up down title fold combining) 256))
|
(indirect cases (list up down title fold combining) 256))
|
||||||
|
|
||||||
|
(define general-categories (make-hash-table 'equal))
|
||||||
|
(hash-table-put! general-categories "Cn" 0)
|
||||||
|
(define (combine-cat cat)
|
||||||
|
(hash-table-get general-categories cat
|
||||||
|
(lambda ()
|
||||||
|
(let ([v (hash-table-count general-categories)])
|
||||||
|
(hash-table-put! general-categories cat v)
|
||||||
|
v))))
|
||||||
|
|
||||||
(define hexes (map char->integer (string->list "0123456789abcdefABCDEF")))
|
(define hexes (map char->integer (string->list "0123456789abcdefABCDEF")))
|
||||||
|
|
||||||
(define combining-class-ht (make-hash-table))
|
(define combining-class-ht (make-hash-table))
|
||||||
|
@ -69,22 +79,25 @@
|
||||||
|
|
||||||
(define top (make-vector hi-count #f))
|
(define top (make-vector hi-count #f))
|
||||||
(define top2 (make-vector hi-count #f))
|
(define top2 (make-vector hi-count #f))
|
||||||
|
(define top3 (make-vector hi-count #f))
|
||||||
|
|
||||||
(define range-bottom 0)
|
(define range-bottom 0)
|
||||||
(define range-top -1)
|
(define range-top -1)
|
||||||
(define range-v -1)
|
(define range-v -1)
|
||||||
(define range-v2 -1)
|
(define range-v2 -1)
|
||||||
|
(define range-v3 -1)
|
||||||
(define ranges null)
|
(define ranges null)
|
||||||
|
|
||||||
(define ccount 0)
|
(define ccount 0)
|
||||||
|
|
||||||
(define (map1 c v v2 cc)
|
(define (map1 c v v2 v3 cc)
|
||||||
(hash-table-put! combining-class-ht c cc)
|
(hash-table-put! combining-class-ht c cc)
|
||||||
(set! ccount (add1 ccount))
|
(set! ccount (add1 ccount))
|
||||||
(if (= c (add1 range-top))
|
(if (= c (add1 range-top))
|
||||||
(begin
|
(begin
|
||||||
(unless (and (= v range-v)
|
(unless (and (= v range-v)
|
||||||
(= v2 range-v2))
|
(= v2 range-v2)
|
||||||
|
(= v3 range-v3))
|
||||||
(set! range-v -1))
|
(set! range-v -1))
|
||||||
(set! range-top c))
|
(set! range-top c))
|
||||||
(begin
|
(begin
|
||||||
|
@ -104,25 +117,31 @@
|
||||||
(set! range-bottom c)
|
(set! range-bottom c)
|
||||||
(set! range-top c)
|
(set! range-top c)
|
||||||
(set! range-v v)
|
(set! range-v v)
|
||||||
(set! range-v2 v2)))
|
(set! range-v2 v2)
|
||||||
|
(set! range-v3 v3)))
|
||||||
(let ([top-index (arithmetic-shift c (- low-bits))])
|
(let ([top-index (arithmetic-shift c (- low-bits))])
|
||||||
(let ([vec (vector-ref top top-index)]
|
(let ([vec (vector-ref top top-index)]
|
||||||
[vec2 (vector-ref top2 top-index)])
|
[vec2 (vector-ref top2 top-index)]
|
||||||
|
[vec3 (vector-ref top3 top-index)])
|
||||||
(unless vec
|
(unless vec
|
||||||
(vector-set! top top-index (make-vector (add1 low))))
|
(vector-set! top top-index (make-vector (add1 low))))
|
||||||
(unless vec2
|
(unless vec2
|
||||||
(vector-set! top2 top-index (make-vector (add1 low))))
|
(vector-set! top2 top-index (make-vector (add1 low))))
|
||||||
|
(unless vec3
|
||||||
|
(vector-set! top3 top-index (make-vector (add1 low))))
|
||||||
(let ([vec (vector-ref top top-index)]
|
(let ([vec (vector-ref top top-index)]
|
||||||
[vec2 (vector-ref top2 top-index)])
|
[vec2 (vector-ref top2 top-index)]
|
||||||
|
[vec3 (vector-ref top3 top-index)])
|
||||||
(vector-set! vec (bitwise-and c low) v)
|
(vector-set! vec (bitwise-and c low) v)
|
||||||
(vector-set! vec2 (bitwise-and c low) v2)))))
|
(vector-set! vec2 (bitwise-and c low) v2)
|
||||||
|
(vector-set! vec3 (bitwise-and c low) v3)))))
|
||||||
|
|
||||||
(define (mapn c from v v2 cc)
|
(define (mapn c from v v2 v3 cc)
|
||||||
(if (= c from)
|
(if (= c from)
|
||||||
(map1 c v v2 cc)
|
(map1 c v v2 v3 cc)
|
||||||
(begin
|
(begin
|
||||||
(map1 from v v2 cc)
|
(map1 from v v2 v3 cc)
|
||||||
(mapn c (add1 from) v v2 cc))))
|
(mapn c (add1 from) v v2 v3 cc))))
|
||||||
|
|
||||||
(define (set-compose-initial! c)
|
(define (set-compose-initial! c)
|
||||||
(let ([top-index (arithmetic-shift c (- low-bits))])
|
(let ([top-index (arithmetic-shift c (- low-bits))])
|
||||||
|
@ -131,7 +150,7 @@
|
||||||
(vector-set! vec i (bitwise-ior #x8000 (vector-ref vec i))))))
|
(vector-set! vec i (bitwise-ior #x8000 (vector-ref vec i))))))
|
||||||
|
|
||||||
(define midletters
|
(define midletters
|
||||||
(call-with-input-file "WordBreakProperty.txt"
|
(call-with-input-file "Unicode/WordBreakProperty.txt"
|
||||||
(lambda (i)
|
(lambda (i)
|
||||||
(let loop ()
|
(let loop ()
|
||||||
(let ([re (regexp-match #rx"\n([0-9A-F]+) *; *MidLetter" i)])
|
(let ([re (regexp-match #rx"\n([0-9A-F]+) *; *MidLetter" i)])
|
||||||
|
@ -150,7 +169,7 @@
|
||||||
;; This code assumes that Final_Sigma is the only condition that we care about:
|
;; This code assumes that Final_Sigma is the only condition that we care about:
|
||||||
(define case-foldings (make-hash-table 'equal))
|
(define case-foldings (make-hash-table 'equal))
|
||||||
(define special-case-foldings (make-hash-table 'equal))
|
(define special-case-foldings (make-hash-table 'equal))
|
||||||
(call-with-input-file "CaseFolding.txt"
|
(call-with-input-file "Unicode/CaseFolding.txt"
|
||||||
(lambda (i)
|
(lambda (i)
|
||||||
(let loop ()
|
(let loop ()
|
||||||
(let ([l (read-line i)])
|
(let ([l (read-line i)])
|
||||||
|
@ -168,7 +187,7 @@
|
||||||
;; This code assumes that Final_Sigma is the only condition that we care about:
|
;; This code assumes that Final_Sigma is the only condition that we care about:
|
||||||
(define special-casings (make-hash-table 'equal))
|
(define special-casings (make-hash-table 'equal))
|
||||||
(define-struct special-casing (lower upper title folding final-sigma?))
|
(define-struct special-casing (lower upper title folding final-sigma?))
|
||||||
(call-with-input-file "SpecialCasing.txt"
|
(call-with-input-file "Unicode/SpecialCasing.txt"
|
||||||
(lambda (i)
|
(lambda (i)
|
||||||
(let loop ()
|
(let loop ()
|
||||||
(let ([l (read-line i)])
|
(let ([l (read-line i)])
|
||||||
|
@ -188,7 +207,7 @@
|
||||||
(define lower-case (make-hash-table 'equal))
|
(define lower-case (make-hash-table 'equal))
|
||||||
(define upper-case (make-hash-table 'equal))
|
(define upper-case (make-hash-table 'equal))
|
||||||
|
|
||||||
(with-input-from-file "DerivedCoreProperties.txt"
|
(with-input-from-file "Unicode/DerivedCoreProperties.txt"
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(let loop ()
|
(let loop ()
|
||||||
(let ([l (read-line)])
|
(let ([l (read-line)])
|
||||||
|
@ -213,7 +232,7 @@
|
||||||
(define compose-map (make-hash-table 'equal))
|
(define compose-map (make-hash-table 'equal))
|
||||||
(define do-not-compose-ht (make-hash-table 'equal))
|
(define do-not-compose-ht (make-hash-table 'equal))
|
||||||
|
|
||||||
(with-input-from-file "CompositionExclusions.txt"
|
(with-input-from-file "Unicode/CompositionExclusions.txt"
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(let loop ()
|
(let loop ()
|
||||||
(let ([l (read-line)])
|
(let ([l (read-line)])
|
||||||
|
@ -257,7 +276,7 @@
|
||||||
(hash-table-put! k-decomp-ht code seq)
|
(hash-table-put! k-decomp-ht code seq)
|
||||||
#t)))))
|
#t)))))
|
||||||
|
|
||||||
(call-with-input-file "UnicodeData.txt"
|
(call-with-input-file "Unicode/UnicodeData.txt"
|
||||||
(lambda (i)
|
(lambda (i)
|
||||||
(let loop ([prev-code 0])
|
(let loop ([prev-code 0])
|
||||||
(let ([l (read-line i)])
|
(let ([l (read-line i)])
|
||||||
|
@ -312,8 +331,8 @@
|
||||||
(member cat letter-cats)
|
(member cat letter-cats)
|
||||||
;; digit
|
;; digit
|
||||||
(member cat digit-cats)
|
(member cat digit-cats)
|
||||||
;; hex digit
|
;; SOMETHING - this bit not yet used
|
||||||
(member code hexes)
|
#f
|
||||||
;; whitespace
|
;; whitespace
|
||||||
(or (member cat space-cats)
|
(or (member cat space-cats)
|
||||||
(member code '(#x9 #xa #xb #xc #xd)))
|
(member code '(#x9 #xa #xb #xc #xd)))
|
||||||
|
@ -335,6 +354,8 @@
|
||||||
(let ([case-fold (hash-table-get case-foldings code (lambda () #f))])
|
(let ([case-fold (hash-table-get case-foldings code (lambda () #f))])
|
||||||
(if case-fold (- case-fold code) 0))
|
(if case-fold (- case-fold code) 0))
|
||||||
combining)
|
combining)
|
||||||
|
;; Category
|
||||||
|
(combine-cat cat)
|
||||||
;; Combining class - used again to filter initial composes
|
;; Combining class - used again to filter initial composes
|
||||||
combining)
|
combining)
|
||||||
(loop code))))))))
|
(loop code))))))))
|
||||||
|
@ -402,11 +423,11 @@
|
||||||
|
|
||||||
(define vectors (make-hash-table 'equal))
|
(define vectors (make-hash-table 'equal))
|
||||||
(define vectors2 (make-hash-table 'equal))
|
(define vectors2 (make-hash-table 'equal))
|
||||||
|
(define vectors3 (make-hash-table 'equal))
|
||||||
|
|
||||||
(define pos 0)
|
(define pos 0)
|
||||||
(define pos2 0)
|
(define pos2 0)
|
||||||
(define pos3 0)
|
(define pos3 0)
|
||||||
(define pos4 0)
|
|
||||||
|
|
||||||
(current-output-port (open-output-file "schuchar.inc" 'truncate/replace))
|
(current-output-port (open-output-file "schuchar.inc" 'truncate/replace))
|
||||||
|
|
||||||
|
@ -422,6 +443,7 @@
|
||||||
|
|
||||||
(hash-vectors! top vectors (lambda () pos) (lambda (v) (set! pos v)))
|
(hash-vectors! top vectors (lambda () pos) (lambda (v) (set! pos v)))
|
||||||
(hash-vectors! top2 vectors2 (lambda () pos2) (lambda (v) (set! pos2 v)))
|
(hash-vectors! top2 vectors2 (lambda () pos2) (lambda (v) (set! pos2 v)))
|
||||||
|
(hash-vectors! top3 vectors3 (lambda () pos3) (lambda (v) (set! pos3 v)))
|
||||||
|
|
||||||
;; copy folding special cases to the special-cases table, if not there already:
|
;; copy folding special cases to the special-cases table, if not there already:
|
||||||
(hash-table-for-each special-case-foldings
|
(hash-table-for-each special-case-foldings
|
||||||
|
@ -447,6 +469,8 @@
|
||||||
(* 2 (add1 (length (hash-table-map vectors cons)))))
|
(* 2 (add1 (length (hash-table-map vectors cons)))))
|
||||||
(* (add1 low)
|
(* (add1 low)
|
||||||
(* 1 (add1 (length (hash-table-map vectors2 cons)))))
|
(* 1 (add1 (length (hash-table-map vectors2 cons)))))
|
||||||
|
(* (add1 low)
|
||||||
|
(* 1 (add1 (length (hash-table-map vectors3 cons)))))
|
||||||
(* (hash-table-count decomp-ht)
|
(* (hash-table-count decomp-ht)
|
||||||
8)
|
8)
|
||||||
(* (hash-table-count compose-map)
|
(* (hash-table-count compose-map)
|
||||||
|
@ -466,6 +490,9 @@
|
||||||
(printf "\n/* Character case mapping as index into scheme_uchar_ups, etc.: */\n")
|
(printf "\n/* Character case mapping as index into scheme_uchar_ups, etc.: */\n")
|
||||||
(printf "unsigned char *scheme_uchar_cases_table[~a];~n" hi-count)
|
(printf "unsigned char *scheme_uchar_cases_table[~a];~n" hi-count)
|
||||||
|
|
||||||
|
(printf "\n/* Character general categories: */\n")
|
||||||
|
(printf "unsigned char *scheme_uchar_cats_table[~a];~n" hi-count)
|
||||||
|
|
||||||
(printf "\n/* The udata... arrays are used by init_uchar_table to fill the above mappings.*/\n\n")
|
(printf "\n/* The udata... arrays are used by init_uchar_table to fill the above mappings.*/\n\n")
|
||||||
|
|
||||||
(define print-row
|
(define print-row
|
||||||
|
@ -494,6 +521,7 @@
|
||||||
(print-table "short" "" vectors pos #t)
|
(print-table "short" "" vectors pos #t)
|
||||||
(printf "\n")
|
(printf "\n")
|
||||||
(print-table "char" "_cases" vectors2 pos2 #f)
|
(print-table "char" "_cases" vectors2 pos2 #f)
|
||||||
|
(print-table "char" "_cats" vectors3 pos3 #f)
|
||||||
|
|
||||||
(printf "~n/* Case mapping size: ~a */\n" (hash-table-count (car cases)))
|
(printf "~n/* Case mapping size: ~a */\n" (hash-table-count (car cases)))
|
||||||
(printf "/* Find an index into the ups, downs, etc. table for a character\n")
|
(printf "/* Find an index into the ups, downs, etc. table for a character\n")
|
||||||
|
@ -521,6 +549,19 @@
|
||||||
(print-shift (car cases) (unbox (cdr cases)) cadddr "int" "folds")
|
(print-shift (car cases) (unbox (cdr cases)) cadddr "int" "folds")
|
||||||
(print-shift (car cases) (unbox (cdr cases)) (lambda (x) (cadddr (cdr x))) "unsigned char" "combining_classes")
|
(print-shift (car cases) (unbox (cdr cases)) (lambda (x) (cadddr (cdr x))) "unsigned char" "combining_classes")
|
||||||
|
|
||||||
|
(let ([l (quicksort (hash-table-map general-categories cons)
|
||||||
|
(lambda (a b)
|
||||||
|
(< (cdr a) (cdr b))))])
|
||||||
|
(printf "\n#define NUM_GENERAL_CATEGORIES ~a\n" (length l))
|
||||||
|
(printf "static const char *general_category_names[] = {")
|
||||||
|
(for-each (lambda (c)
|
||||||
|
(printf (if (zero? (cdr c))
|
||||||
|
"\n ~s"
|
||||||
|
",\n ~s")
|
||||||
|
(string-downcase (car c))))
|
||||||
|
l)
|
||||||
|
(printf "\n};\n"))
|
||||||
|
|
||||||
(set! ranges (cons (list range-bottom range-top (range-v . > . -1))
|
(set! ranges (cons (list range-bottom range-top (range-v . > . -1))
|
||||||
ranges))
|
ranges))
|
||||||
|
|
||||||
|
@ -574,6 +615,7 @@
|
||||||
(loop (add1 i)))))))
|
(loop (add1 i)))))))
|
||||||
(print-init top vectors "")
|
(print-init top vectors "")
|
||||||
(print-init top2 vectors2 "_cases")
|
(print-init top2 vectors2 "_cases")
|
||||||
|
(print-init top3 vectors3 "_cats")
|
||||||
(printf "}~n")
|
(printf "}~n")
|
||||||
|
|
||||||
;; ----------------------------------------
|
;; ----------------------------------------
|
||||||
|
|
|
@ -443,7 +443,7 @@ void scheme_finish_kernel(Scheme_Env *env)
|
||||||
|
|
||||||
rn = scheme_make_module_rename(0, mzMOD_RENAME_NORMAL, NULL);
|
rn = scheme_make_module_rename(0, mzMOD_RENAME_NORMAL, NULL);
|
||||||
for (i = kernel->num_provides; i--; ) {
|
for (i = kernel->num_provides; i--; ) {
|
||||||
scheme_extend_module_rename(rn, kernel_symbol, exs[i], exs[i], kernel_symbol, exs[i], 0);
|
scheme_extend_module_rename(rn, kernel_symbol, exs[i], exs[i], kernel_symbol, exs[i], 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
scheme_sys_wraps(NULL);
|
scheme_sys_wraps(NULL);
|
||||||
|
@ -541,7 +541,7 @@ void scheme_require_from_original_env(Scheme_Env *env, int syntax_only)
|
||||||
c = kernel->num_provides;
|
c = kernel->num_provides;
|
||||||
i = (syntax_only ? kernel->num_var_provides : 0);
|
i = (syntax_only ? kernel->num_var_provides : 0);
|
||||||
for (; i < c; i++) {
|
for (; i < c; i++) {
|
||||||
scheme_extend_module_rename(rn, kernel_symbol, exs[i], exs[i], kernel_symbol, exs[i], 0);
|
scheme_extend_module_rename(rn, kernel_symbol, exs[i], exs[i], kernel_symbol, exs[i], 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1156,7 +1156,7 @@ static Scheme_Object *namespace_attach_module(int argc, Scheme_Object *argv[])
|
||||||
past_to_modchains = SCHEME_CDR(past_to_modchains);
|
past_to_modchains = SCHEME_CDR(past_to_modchains);
|
||||||
phase--;
|
phase--;
|
||||||
} else {
|
} else {
|
||||||
past_checkeds = cons((Scheme_Object *)prev_checked, past_checkeds);
|
past_checkeds = scheme_make_raw_pair((Scheme_Object *)prev_checked, past_checkeds);
|
||||||
prev_checked = checked;
|
prev_checked = checked;
|
||||||
|
|
||||||
todo = next_phase_todo;
|
todo = next_phase_todo;
|
||||||
|
@ -1205,7 +1205,7 @@ static Scheme_Object *namespace_attach_module(int argc, Scheme_Object *argv[])
|
||||||
}
|
}
|
||||||
while (phase > 0) {
|
while (phase > 0) {
|
||||||
prev_checked = (Scheme_Hash_Table *)SCHEME_CAR(past_checkeds);
|
prev_checked = (Scheme_Hash_Table *)SCHEME_CAR(past_checkeds);
|
||||||
future_checkeds = scheme_make_pair((Scheme_Object *)prev_checked, future_checkeds);
|
future_checkeds = scheme_make_raw_pair((Scheme_Object *)prev_checked, future_checkeds);
|
||||||
|
|
||||||
past_checkeds = SCHEME_CDR(past_checkeds);
|
past_checkeds = SCHEME_CDR(past_checkeds);
|
||||||
--phase;
|
--phase;
|
||||||
|
@ -1321,7 +1321,7 @@ static Scheme_Object *namespace_unprotect_module(int argc, Scheme_Object *argv[]
|
||||||
static int add_require_renames(Scheme_Object *rn, Scheme_Module *im, Scheme_Object *idx)
|
static int add_require_renames(Scheme_Object *rn, Scheme_Module *im, Scheme_Object *idx)
|
||||||
{
|
{
|
||||||
int i, saw_mb;
|
int i, saw_mb;
|
||||||
Scheme_Object **exs, **exss, **exsns, *midx;
|
Scheme_Object **exs, **exss, **exsns, *midx, *info;
|
||||||
|
|
||||||
saw_mb = 0;
|
saw_mb = 0;
|
||||||
|
|
||||||
|
@ -1333,7 +1333,7 @@ static int add_require_renames(Scheme_Object *rn, Scheme_Module *im, Scheme_Obje
|
||||||
midx = scheme_modidx_shift(exss[i], im->src_modidx, idx);
|
midx = scheme_modidx_shift(exss[i], im->src_modidx, idx);
|
||||||
else
|
else
|
||||||
midx = idx;
|
midx = idx;
|
||||||
scheme_extend_module_rename(rn, midx, exs[i], exsns[i], idx, exs[i], 0);
|
scheme_extend_module_rename(rn, midx, exs[i], exsns[i], idx, exs[i], 0, 1);
|
||||||
if (SAME_OBJ(exs[i], module_begin_symbol))
|
if (SAME_OBJ(exs[i], module_begin_symbol))
|
||||||
saw_mb = 1;
|
saw_mb = 1;
|
||||||
}
|
}
|
||||||
|
@ -1343,6 +1343,9 @@ static int add_require_renames(Scheme_Object *rn, Scheme_Module *im, Scheme_Obje
|
||||||
saw_mb = 1;
|
saw_mb = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
info = cons(idx, cons(scheme_null, scheme_false));
|
||||||
|
scheme_save_module_rename_unmarshal(rn, info);
|
||||||
|
|
||||||
return saw_mb;
|
return saw_mb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1403,13 +1406,13 @@ static Scheme_Object *module_to_namespace(int argc, Scheme_Object *argv[])
|
||||||
for (i = 0; i < m->num_provides; i++) {
|
for (i = 0; i < m->num_provides; i++) {
|
||||||
if (SCHEME_FALSEP(m->provide_srcs[i])) {
|
if (SCHEME_FALSEP(m->provide_srcs[i])) {
|
||||||
name = m->provides[i];
|
name = m->provides[i];
|
||||||
scheme_extend_module_rename(rn, m->self_modidx, name, name, m->self_modidx, name, 0);
|
scheme_extend_module_rename(rn, m->self_modidx, name, name, m->self_modidx, name, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Local, not provided: */
|
/* Local, not provided: */
|
||||||
for (i = 0; i < m->num_indirect_provides; i++) {
|
for (i = 0; i < m->num_indirect_provides; i++) {
|
||||||
name = m->indirect_provides[i];
|
name = m->indirect_provides[i];
|
||||||
scheme_extend_module_rename(rn, m->self_modidx, name, name, m->self_modidx, name, 0);
|
scheme_extend_module_rename(rn, m->self_modidx, name, name, m->self_modidx, name, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Required: */
|
/* Required: */
|
||||||
|
@ -3771,7 +3774,7 @@ static Scheme_Object *add_lifted_defn(Scheme_Object *data, Scheme_Object **_id,
|
||||||
scheme_add_global_symbol(name, scheme_undefined, env->genv);
|
scheme_add_global_symbol(name, scheme_undefined, env->genv);
|
||||||
|
|
||||||
/* Add a renaming: */
|
/* Add a renaming: */
|
||||||
scheme_extend_module_rename(rn, self_modidx, name, name, self_modidx, name, 0);
|
scheme_extend_module_rename(rn, self_modidx, name, name, self_modidx, name, 0, 0);
|
||||||
|
|
||||||
id = scheme_add_rename(*_id, rn);
|
id = scheme_add_rename(*_id, rn);
|
||||||
*_id = id;
|
*_id = id;
|
||||||
|
@ -4063,9 +4066,9 @@ static Scheme_Object *do_module_begin(Scheme_Object *form, Scheme_Comp_Env *env,
|
||||||
|
|
||||||
/* Add a renaming: */
|
/* Add a renaming: */
|
||||||
if (!SAME_OBJ(SCHEME_STX_VAL(orig_name), name))
|
if (!SAME_OBJ(SCHEME_STX_VAL(orig_name), name))
|
||||||
scheme_extend_module_rename(post_ex_rn, self_modidx, name, name, self_modidx, name, 0);
|
scheme_extend_module_rename(post_ex_rn, self_modidx, name, name, self_modidx, name, 0, 0);
|
||||||
else
|
else
|
||||||
scheme_extend_module_rename(rn, self_modidx, name, name, self_modidx, name, 0);
|
scheme_extend_module_rename(rn, self_modidx, name, name, self_modidx, name, 0, 0);
|
||||||
|
|
||||||
vars = SCHEME_STX_CDR(vars);
|
vars = SCHEME_STX_CDR(vars);
|
||||||
}
|
}
|
||||||
|
@ -4138,10 +4141,10 @@ static Scheme_Object *do_module_begin(Scheme_Object *form, Scheme_Comp_Env *env,
|
||||||
|
|
||||||
if (!SAME_OBJ(SCHEME_STX_VAL(orig_name), name))
|
if (!SAME_OBJ(SCHEME_STX_VAL(orig_name), name))
|
||||||
scheme_extend_module_rename(for_stx ? post_ex_et_rn : post_ex_rn, self_modidx, name, name, self_modidx, name,
|
scheme_extend_module_rename(for_stx ? post_ex_et_rn : post_ex_rn, self_modidx, name, name, self_modidx, name,
|
||||||
for_stx ? 1 : 0);
|
for_stx ? 1 : 0, 0);
|
||||||
else
|
else
|
||||||
scheme_extend_module_rename(for_stx ? et_rn : rn, self_modidx, name, name, self_modidx, name,
|
scheme_extend_module_rename(for_stx ? et_rn : rn, self_modidx, name, name, self_modidx, name,
|
||||||
for_stx ? 1 : 0);
|
for_stx ? 1 : 0, 0);
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
@ -5220,6 +5223,248 @@ static void qsort_provides(Scheme_Object **exs, Scheme_Object **exsns, Scheme_Ob
|
||||||
/* top-level require */
|
/* top-level require */
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
|
void add_single_require(Scheme_Module *m, /* from module */
|
||||||
|
Scheme_Object *idx, /* from module's idx; may be used to find m on unmarshal */
|
||||||
|
Scheme_Env *env, /* env for mark_src or copy_vars */
|
||||||
|
Scheme_Object *rn, /* add requires to this rename when no mark_src */
|
||||||
|
Scheme_Object *post_ex_rn, /* add requires to this rename when mark_src */
|
||||||
|
Scheme_Object *exns, /* NULL or [syntax] list of [syntax] symbols not to import */
|
||||||
|
Scheme_Hash_Table *onlys, /* NULL or hash table of names to import */
|
||||||
|
Scheme_Object *prefix, /* NULL or prefix symbol */
|
||||||
|
Scheme_Object *iname, /* NULL or symbol for a single import */
|
||||||
|
Scheme_Object *ename, /* NULL or symbol for a single import */
|
||||||
|
Scheme_Object *mark_src, /* default mark_src; if onlys, each is also mark_src */
|
||||||
|
int unpack_kern, int copy_vars, int for_unmarshal,
|
||||||
|
int *all_simple,
|
||||||
|
Check_Func ck, /* NULL or called for each addition */
|
||||||
|
void *data, Scheme_Object *form, Scheme_Object *cki /* ck args */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int j, var_count;
|
||||||
|
Scheme_Object **exs, **exsns, **exss;
|
||||||
|
Scheme_Object *orig_idx = idx;
|
||||||
|
int is_kern, has_context, save_marshal_info = 0, can_save_marshal = 1;
|
||||||
|
Scheme_Object *nominal_modidx, *one_exn, *prnt_iname, *name;
|
||||||
|
|
||||||
|
if (mark_src) {
|
||||||
|
/* Check whether there's context for this import (which
|
||||||
|
leads to generated local names). */
|
||||||
|
Scheme_Object *l;
|
||||||
|
l = scheme_stx_extract_marks(mark_src);
|
||||||
|
has_context = !SCHEME_NULLP(l);
|
||||||
|
if (has_context) {
|
||||||
|
if (all_simple)
|
||||||
|
*all_simple = 0;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
has_context = 0; /* computed later */
|
||||||
|
|
||||||
|
if (iname || ename || onlys || for_unmarshal || unpack_kern || has_context)
|
||||||
|
can_save_marshal = 0;
|
||||||
|
|
||||||
|
is_kern = (SAME_OBJ(idx, kernel_symbol)
|
||||||
|
&& !exns
|
||||||
|
&& !onlys
|
||||||
|
&& !prefix
|
||||||
|
&& !iname
|
||||||
|
&& !unpack_kern
|
||||||
|
&& !has_context);
|
||||||
|
|
||||||
|
one_exn = NULL;
|
||||||
|
|
||||||
|
nominal_modidx = idx;
|
||||||
|
|
||||||
|
while (1) { /* loop to handle kernel re-provides... */
|
||||||
|
int break_if_iname_null = !!iname;
|
||||||
|
|
||||||
|
exs = m->provides;
|
||||||
|
exsns = m->provide_src_names;
|
||||||
|
exss = m->provide_srcs;
|
||||||
|
var_count = m->num_var_provides;
|
||||||
|
|
||||||
|
for (j = m->num_provides; j--; ) {
|
||||||
|
Scheme_Object *modidx;
|
||||||
|
|
||||||
|
if (ename) {
|
||||||
|
if (!SAME_OBJ(SCHEME_STX_VAL(ename), exs[j]))
|
||||||
|
continue; /* we don't want this one. */
|
||||||
|
} else if (onlys) {
|
||||||
|
name = scheme_hash_get(onlys, exs[j]);
|
||||||
|
if (!name)
|
||||||
|
continue; /* we don't want this one. */
|
||||||
|
mark_src = name;
|
||||||
|
{
|
||||||
|
Scheme_Object *l;
|
||||||
|
l = scheme_stx_extract_marks(mark_src);
|
||||||
|
has_context = !SCHEME_NULLP(l);
|
||||||
|
}
|
||||||
|
/* Remove to indicate that it's been imported: */
|
||||||
|
scheme_hash_set(onlys, exs[j], NULL);
|
||||||
|
} else {
|
||||||
|
if (exns) {
|
||||||
|
Scheme_Object *l, *a;
|
||||||
|
for (l = exns; SCHEME_STX_PAIRP(l); l = SCHEME_STX_CDR(l)) {
|
||||||
|
a = SCHEME_STX_CAR(l);
|
||||||
|
if (SCHEME_STXP(a))
|
||||||
|
a = SCHEME_STX_VAL(a);
|
||||||
|
if (SAME_OBJ(a, exs[j]))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!SCHEME_STX_NULLP(l))
|
||||||
|
continue; /* we don't want this one. */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (one_exn) {
|
||||||
|
if (SAME_OBJ(one_exn, exs[j]))
|
||||||
|
continue; /* we don't want this one. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
modidx = ((exss && !SCHEME_FALSEP(exss[j]))
|
||||||
|
? scheme_modidx_shift(exss[j], m->src_modidx, idx)
|
||||||
|
: idx);
|
||||||
|
|
||||||
|
if (!iname)
|
||||||
|
iname = exs[j];
|
||||||
|
|
||||||
|
if (SCHEME_SYM_WEIRDP(iname)) {
|
||||||
|
/* This shouldn't happen. In case it does, don't import a
|
||||||
|
gensym or parallel symbol. The former is useless. The
|
||||||
|
latter is supposed to be module-specific, and it could
|
||||||
|
collide with local module-specific ids. */
|
||||||
|
iname = NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prefix)
|
||||||
|
iname = scheme_symbol_append(prefix, iname);
|
||||||
|
|
||||||
|
prnt_iname = iname;
|
||||||
|
if (has_context) {
|
||||||
|
/* The `require' expression has a set of marks in its
|
||||||
|
context, which means that we need to generate a name. */
|
||||||
|
iname = scheme_datum_to_syntax(iname, scheme_false, mark_src, 0, 0);
|
||||||
|
iname = scheme_tl_id_sym(env, iname, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ck)
|
||||||
|
ck(prnt_iname, iname, nominal_modidx, modidx, exsns[j], (j < var_count), data, cki, form);
|
||||||
|
|
||||||
|
if (!is_kern) {
|
||||||
|
if (copy_vars && (j < var_count) && !env->module && !env->phase) {
|
||||||
|
Scheme_Env *menv;
|
||||||
|
Scheme_Object *val;
|
||||||
|
modidx = scheme_module_resolve(modidx);
|
||||||
|
menv = scheme_module_access(modidx, env, 0);
|
||||||
|
val = scheme_lookup_in_table(menv->toplevel, (char *)exsns[j]);
|
||||||
|
scheme_add_global_symbol(iname, val, env);
|
||||||
|
} else if (!for_unmarshal || !has_context) {
|
||||||
|
if (!save_marshal_info && !has_context && can_save_marshal)
|
||||||
|
save_marshal_info = 1;
|
||||||
|
scheme_extend_module_rename((has_context ? post_ex_rn : rn),
|
||||||
|
modidx, iname, exsns[j], nominal_modidx, exs[j], 0,
|
||||||
|
for_unmarshal || (!has_context && can_save_marshal));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iname = NULL;
|
||||||
|
|
||||||
|
if (ename) {
|
||||||
|
ename = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ename) {
|
||||||
|
if (!m->reprovide_kernel) {
|
||||||
|
scheme_wrong_syntax(NULL, ename, form, "no such provided variable");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_kern)
|
||||||
|
scheme_extend_module_rename_with_kernel(rn, nominal_modidx);
|
||||||
|
|
||||||
|
if (break_if_iname_null && !iname)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (m->reprovide_kernel) {
|
||||||
|
idx = kernel_symbol;
|
||||||
|
one_exn = m->kernel_exclusion;
|
||||||
|
m = kernel;
|
||||||
|
is_kern = !prefix && !unpack_kern && !ename && !has_context;
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (save_marshal_info) {
|
||||||
|
Scheme_Object *info, *a;
|
||||||
|
|
||||||
|
if (exns) {
|
||||||
|
/* Convert to a list of symbols: */
|
||||||
|
info = scheme_null;
|
||||||
|
for (; SCHEME_STX_PAIRP(exns); exns = SCHEME_STX_CDR(exns)) {
|
||||||
|
a = SCHEME_STX_CAR(exns);
|
||||||
|
if (SCHEME_STXP(a))
|
||||||
|
a = SCHEME_STX_VAL(a);
|
||||||
|
info = cons(a, info);
|
||||||
|
}
|
||||||
|
exns = info;
|
||||||
|
} else
|
||||||
|
exns = scheme_null;
|
||||||
|
|
||||||
|
/* The format of this data is checked in stxobj for unmarshaling
|
||||||
|
a Module_Renames. Also the idx must be first, to support shifting. */
|
||||||
|
info = cons(orig_idx, cons(exns, prefix ? prefix : scheme_false));
|
||||||
|
|
||||||
|
scheme_save_module_rename_unmarshal(rn, info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void scheme_do_module_rename_unmarshal(Scheme_Object *rn, Scheme_Object *info,
|
||||||
|
Scheme_Object *modidx_shift_from, Scheme_Object *modidx_shift_to)
|
||||||
|
{
|
||||||
|
Scheme_Object *orig_idx, *exns, *prefix, *idx, *name;
|
||||||
|
Scheme_Module *m;
|
||||||
|
Scheme_Env *env;
|
||||||
|
|
||||||
|
idx = SCHEME_CAR(info);
|
||||||
|
orig_idx = idx;
|
||||||
|
info = SCHEME_CDR(info);
|
||||||
|
exns = SCHEME_CAR(info);
|
||||||
|
prefix = SCHEME_CDR(info);
|
||||||
|
|
||||||
|
if (SCHEME_FALSEP(prefix))
|
||||||
|
prefix = NULL;
|
||||||
|
if (SCHEME_NULLP(exns))
|
||||||
|
exns = NULL;
|
||||||
|
|
||||||
|
if (modidx_shift_from)
|
||||||
|
idx = scheme_modidx_shift(idx,
|
||||||
|
modidx_shift_from,
|
||||||
|
modidx_shift_to);
|
||||||
|
|
||||||
|
env = scheme_get_env(scheme_current_config());
|
||||||
|
name = scheme_module_resolve(idx);
|
||||||
|
m = (Scheme_Module *)scheme_hash_get(env->module_registry, name);
|
||||||
|
if (!m) {
|
||||||
|
scheme_signal_error("broken compiled/expanded code or wrong namespace;"
|
||||||
|
" cannot find instance to restore imported renamings"
|
||||||
|
" from module: %s",
|
||||||
|
scheme_symbol_name(name));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
add_single_require(m, orig_idx, env,
|
||||||
|
rn, NULL,
|
||||||
|
exns, NULL, prefix, NULL, NULL,
|
||||||
|
NULL,
|
||||||
|
0, 0, 1,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
Scheme_Object *parse_requires(Scheme_Object *form,
|
Scheme_Object *parse_requires(Scheme_Object *form,
|
||||||
Scheme_Object *base_modidx,
|
Scheme_Object *base_modidx,
|
||||||
Scheme_Env *env,
|
Scheme_Env *env,
|
||||||
|
@ -5231,10 +5476,8 @@ Scheme_Object *parse_requires(Scheme_Object *form,
|
||||||
{
|
{
|
||||||
Scheme_Object *ll = form;
|
Scheme_Object *ll = form;
|
||||||
Scheme_Module *m;
|
Scheme_Module *m;
|
||||||
int j, var_count, is_kern, has_context;
|
Scheme_Object *idxstx, *idx, *name, *i, *exns, *prefix, *iname, *ename, *aa;
|
||||||
Scheme_Object **exs, **exsns, **exss;
|
Scheme_Object *imods, *mark_src;
|
||||||
Scheme_Object *idxstx, *idx, *name, *i, *exns, *one_exn, *prefix, *iname, *ename, *aa;
|
|
||||||
Scheme_Object *imods, *nominal_modidx, *mark_src, *prnt_iname;
|
|
||||||
Scheme_Hash_Table *onlys;
|
Scheme_Hash_Table *onlys;
|
||||||
|
|
||||||
imods = scheme_null;
|
imods = scheme_null;
|
||||||
|
@ -5432,25 +5675,6 @@ Scheme_Object *parse_requires(Scheme_Object *form,
|
||||||
else if (expstart)
|
else if (expstart)
|
||||||
expstart_module(m, env, 0, idx, 0, 0, scheme_null);
|
expstart_module(m, env, 0, idx, 0, 0, scheme_null);
|
||||||
|
|
||||||
if (mark_src) {
|
|
||||||
/* Check whether there's context for this import (which
|
|
||||||
leads to generated local names). */
|
|
||||||
Scheme_Object *l;
|
|
||||||
l = scheme_stx_extract_marks(mark_src);
|
|
||||||
has_context = !SCHEME_NULLP(l);
|
|
||||||
if (has_context && all_simple)
|
|
||||||
*all_simple = 0;
|
|
||||||
} else
|
|
||||||
has_context = 0; /* computed later */
|
|
||||||
|
|
||||||
is_kern = (SAME_OBJ(idx, kernel_symbol)
|
|
||||||
&& !exns
|
|
||||||
&& !onlys
|
|
||||||
&& !prefix
|
|
||||||
&& !iname
|
|
||||||
&& !unpack_kern
|
|
||||||
&& !has_context);
|
|
||||||
|
|
||||||
/* Add name to require list, if it's not there: */
|
/* Add name to require list, if it's not there: */
|
||||||
{
|
{
|
||||||
Scheme_Object *l, *last = NULL, *p;
|
Scheme_Object *l, *last = NULL, *p;
|
||||||
|
@ -5468,126 +5692,12 @@ Scheme_Object *parse_requires(Scheme_Object *form,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
one_exn = NULL;
|
add_single_require(m, idx, env, rn, post_ex_rn,
|
||||||
|
exns, onlys, prefix, iname, ename,
|
||||||
nominal_modidx = idx;
|
mark_src,
|
||||||
|
unpack_kern, copy_vars && start, 0,
|
||||||
while (1) { /* loop to handle kernel re-provides... */
|
all_simple,
|
||||||
int break_if_iname_null = !!iname;
|
ck, data, form, i);
|
||||||
|
|
||||||
exs = m->provides;
|
|
||||||
exsns = m->provide_src_names;
|
|
||||||
exss = m->provide_srcs;
|
|
||||||
var_count = m->num_var_provides;
|
|
||||||
|
|
||||||
for (j = m->num_provides; j--; ) {
|
|
||||||
Scheme_Object *modidx;
|
|
||||||
|
|
||||||
if (ename) {
|
|
||||||
if (!SAME_OBJ(SCHEME_STX_VAL(ename), exs[j]))
|
|
||||||
continue; /* we don't want this one. */
|
|
||||||
} else if (onlys) {
|
|
||||||
name = scheme_hash_get(onlys, exs[j]);
|
|
||||||
if (!name)
|
|
||||||
continue; /* we don't want this one. */
|
|
||||||
mark_src = name;
|
|
||||||
{
|
|
||||||
Scheme_Object *l;
|
|
||||||
l = scheme_stx_extract_marks(mark_src);
|
|
||||||
has_context = !SCHEME_NULLP(l);
|
|
||||||
}
|
|
||||||
/* Remove to indicate that it's been imported: */
|
|
||||||
scheme_hash_set(onlys, exs[j], NULL);
|
|
||||||
} else {
|
|
||||||
if (exns) {
|
|
||||||
Scheme_Object *l;
|
|
||||||
for (l = exns; SCHEME_STX_PAIRP(l); l = SCHEME_STX_CDR(l)) {
|
|
||||||
if (SAME_OBJ(SCHEME_STX_VAL(SCHEME_STX_CAR(l)), exs[j]))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!SCHEME_STX_NULLP(l))
|
|
||||||
continue; /* we don't want this one. */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (one_exn) {
|
|
||||||
if (SAME_OBJ(one_exn, exs[j]))
|
|
||||||
continue; /* we don't want this one. */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
modidx = ((exss && !SCHEME_FALSEP(exss[j]))
|
|
||||||
? scheme_modidx_shift(exss[j], m->src_modidx, idx)
|
|
||||||
: idx);
|
|
||||||
|
|
||||||
if (!iname)
|
|
||||||
iname = exs[j];
|
|
||||||
|
|
||||||
if (SCHEME_SYM_WEIRDP(iname)) {
|
|
||||||
/* This shouldn't happen. In case it does, don't import a
|
|
||||||
gensym or parallel symbol. The former is useless. The
|
|
||||||
latter is supposed to be module-specific, and it could
|
|
||||||
collide with local module-specific ids. */
|
|
||||||
iname = NULL;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prefix)
|
|
||||||
iname = scheme_symbol_append(prefix, iname);
|
|
||||||
|
|
||||||
prnt_iname = iname;
|
|
||||||
if (has_context) {
|
|
||||||
/* The `require' expression has a set of marks in its
|
|
||||||
context, which means that we need to generate a name. */
|
|
||||||
iname = scheme_datum_to_syntax(iname, scheme_false, mark_src, 0, 0);
|
|
||||||
iname = scheme_tl_id_sym(env, iname, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ck)
|
|
||||||
ck(prnt_iname, iname, nominal_modidx, modidx, exsns[j], (j < var_count), data, i, form);
|
|
||||||
|
|
||||||
if (!is_kern) {
|
|
||||||
if (copy_vars && start && (j < var_count) && !env->module && !env->phase) {
|
|
||||||
Scheme_Env *menv;
|
|
||||||
Scheme_Object *val;
|
|
||||||
modidx = scheme_module_resolve(modidx);
|
|
||||||
menv = scheme_module_access(modidx, env, 0);
|
|
||||||
val = scheme_lookup_in_table(menv->toplevel, (char *)exsns[j]);
|
|
||||||
scheme_add_global_symbol(iname, val, env);
|
|
||||||
} else {
|
|
||||||
scheme_extend_module_rename((has_context ? post_ex_rn : rn),
|
|
||||||
modidx, iname, exsns[j], nominal_modidx, exs[j], 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iname = NULL;
|
|
||||||
|
|
||||||
if (ename) {
|
|
||||||
ename = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ename) {
|
|
||||||
if (!m->reprovide_kernel) {
|
|
||||||
scheme_wrong_syntax(NULL, ename, form, "no such provided variable");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_kern)
|
|
||||||
scheme_extend_module_rename_with_kernel(rn, nominal_modidx);
|
|
||||||
|
|
||||||
if (break_if_iname_null && !iname)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (m->reprovide_kernel) {
|
|
||||||
idx = kernel_symbol;
|
|
||||||
one_exn = m->kernel_exclusion;
|
|
||||||
m = kernel;
|
|
||||||
is_kern = !prefix && !unpack_kern && !ename && !has_context;
|
|
||||||
} else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (onlys && onlys->count) {
|
if (onlys && onlys->count) {
|
||||||
/* Something required in `only' wasn't provided by the module */
|
/* Something required in `only' wasn't provided by the module */
|
||||||
|
|
|
@ -131,6 +131,25 @@ static int toplevel_obj_FIXUP(void *p) {
|
||||||
#define toplevel_obj_IS_CONST_SIZE 1
|
#define toplevel_obj_IS_CONST_SIZE 1
|
||||||
|
|
||||||
|
|
||||||
|
static int quotesyntax_obj_SIZE(void *p) {
|
||||||
|
return
|
||||||
|
gcBYTES_TO_WORDS(sizeof(Scheme_Quote_Syntax));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int quotesyntax_obj_MARK(void *p) {
|
||||||
|
return
|
||||||
|
gcBYTES_TO_WORDS(sizeof(Scheme_Quote_Syntax));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int quotesyntax_obj_FIXUP(void *p) {
|
||||||
|
return
|
||||||
|
gcBYTES_TO_WORDS(sizeof(Scheme_Quote_Syntax));
|
||||||
|
}
|
||||||
|
|
||||||
|
#define quotesyntax_obj_IS_ATOMIC 1
|
||||||
|
#define quotesyntax_obj_IS_CONST_SIZE 1
|
||||||
|
|
||||||
|
|
||||||
static int cpointer_obj_SIZE(void *p) {
|
static int cpointer_obj_SIZE(void *p) {
|
||||||
return
|
return
|
||||||
gcBYTES_TO_WORDS(sizeof(Scheme_Simple_Object));
|
gcBYTES_TO_WORDS(sizeof(Scheme_Simple_Object));
|
||||||
|
@ -4109,6 +4128,7 @@ static int mark_readtable_MARK(void *p) {
|
||||||
Readtable *t = (Readtable *)p;
|
Readtable *t = (Readtable *)p;
|
||||||
gcMARK(t->mapping);
|
gcMARK(t->mapping);
|
||||||
gcMARK(t->fast_mapping);
|
gcMARK(t->fast_mapping);
|
||||||
|
gcMARK(t->symbol_parser);
|
||||||
return
|
return
|
||||||
gcBYTES_TO_WORDS(sizeof(Readtable));
|
gcBYTES_TO_WORDS(sizeof(Readtable));
|
||||||
}
|
}
|
||||||
|
@ -4117,6 +4137,7 @@ static int mark_readtable_FIXUP(void *p) {
|
||||||
Readtable *t = (Readtable *)p;
|
Readtable *t = (Readtable *)p;
|
||||||
gcFIXUP(t->mapping);
|
gcFIXUP(t->mapping);
|
||||||
gcFIXUP(t->fast_mapping);
|
gcFIXUP(t->fast_mapping);
|
||||||
|
gcFIXUP(t->symbol_parser);
|
||||||
return
|
return
|
||||||
gcBYTES_TO_WORDS(sizeof(Readtable));
|
gcBYTES_TO_WORDS(sizeof(Readtable));
|
||||||
}
|
}
|
||||||
|
@ -4260,6 +4281,8 @@ static int mark_rename_table_SIZE(void *p) {
|
||||||
static int mark_rename_table_MARK(void *p) {
|
static int mark_rename_table_MARK(void *p) {
|
||||||
Module_Renames *rn = (Module_Renames *)p;
|
Module_Renames *rn = (Module_Renames *)p;
|
||||||
gcMARK(rn->ht);
|
gcMARK(rn->ht);
|
||||||
|
gcMARK(rn->nomarshal_ht);
|
||||||
|
gcMARK(rn->unmarshal_info);
|
||||||
gcMARK(rn->plus_kernel_nominal_source);
|
gcMARK(rn->plus_kernel_nominal_source);
|
||||||
gcMARK(rn->marked_names);
|
gcMARK(rn->marked_names);
|
||||||
return
|
return
|
||||||
|
@ -4269,6 +4292,8 @@ static int mark_rename_table_MARK(void *p) {
|
||||||
static int mark_rename_table_FIXUP(void *p) {
|
static int mark_rename_table_FIXUP(void *p) {
|
||||||
Module_Renames *rn = (Module_Renames *)p;
|
Module_Renames *rn = (Module_Renames *)p;
|
||||||
gcFIXUP(rn->ht);
|
gcFIXUP(rn->ht);
|
||||||
|
gcFIXUP(rn->nomarshal_ht);
|
||||||
|
gcFIXUP(rn->unmarshal_info);
|
||||||
gcFIXUP(rn->plus_kernel_nominal_source);
|
gcFIXUP(rn->plus_kernel_nominal_source);
|
||||||
gcFIXUP(rn->marked_names);
|
gcFIXUP(rn->marked_names);
|
||||||
return
|
return
|
||||||
|
|
|
@ -48,6 +48,12 @@ toplevel_obj {
|
||||||
gcBYTES_TO_WORDS(sizeof(Scheme_Toplevel));
|
gcBYTES_TO_WORDS(sizeof(Scheme_Toplevel));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
quotesyntax_obj {
|
||||||
|
mark:
|
||||||
|
size:
|
||||||
|
gcBYTES_TO_WORDS(sizeof(Scheme_Quote_Syntax));
|
||||||
|
}
|
||||||
|
|
||||||
cpointer_obj {
|
cpointer_obj {
|
||||||
mark:
|
mark:
|
||||||
gcMARK(SCHEME_CPTR_VAL((Scheme_Object *)p));
|
gcMARK(SCHEME_CPTR_VAL((Scheme_Object *)p));
|
||||||
|
@ -1660,6 +1666,7 @@ mark_readtable {
|
||||||
Readtable *t = (Readtable *)p;
|
Readtable *t = (Readtable *)p;
|
||||||
gcMARK(t->mapping);
|
gcMARK(t->mapping);
|
||||||
gcMARK(t->fast_mapping);
|
gcMARK(t->fast_mapping);
|
||||||
|
gcMARK(t->symbol_parser);
|
||||||
size:
|
size:
|
||||||
gcBYTES_TO_WORDS(sizeof(Readtable));
|
gcBYTES_TO_WORDS(sizeof(Readtable));
|
||||||
}
|
}
|
||||||
|
@ -1726,6 +1733,8 @@ mark_rename_table {
|
||||||
mark:
|
mark:
|
||||||
Module_Renames *rn = (Module_Renames *)p;
|
Module_Renames *rn = (Module_Renames *)p;
|
||||||
gcMARK(rn->ht);
|
gcMARK(rn->ht);
|
||||||
|
gcMARK(rn->nomarshal_ht);
|
||||||
|
gcMARK(rn->unmarshal_info);
|
||||||
gcMARK(rn->plus_kernel_nominal_source);
|
gcMARK(rn->plus_kernel_nominal_source);
|
||||||
gcMARK(rn->marked_names);
|
gcMARK(rn->marked_names);
|
||||||
size:
|
size:
|
||||||
|
|
|
@ -1554,7 +1554,7 @@ long scheme_get_byte_string_unless(const char *who,
|
||||||
ip->unless_cache = scheme_false;
|
ip->unless_cache = scheme_false;
|
||||||
ip->unless = unless;
|
ip->unless = unless;
|
||||||
} else {
|
} else {
|
||||||
unless = scheme_make_pair(NULL, NULL);
|
unless = scheme_make_raw_pair(NULL, NULL);
|
||||||
ip->unless = unless;
|
ip->unless = unless;
|
||||||
}
|
}
|
||||||
if (unless_evt)
|
if (unless_evt)
|
||||||
|
@ -1904,7 +1904,7 @@ int scheme_peeked_read_via_get(Scheme_Input_Port *ip,
|
||||||
/* Some other thread is already trying to commit.
|
/* Some other thread is already trying to commit.
|
||||||
Ask it to sync on our target, too */
|
Ask it to sync on our target, too */
|
||||||
v = scheme_make_pair(scheme_make_integer(_size), target_evt);
|
v = scheme_make_pair(scheme_make_integer(_size), target_evt);
|
||||||
l = scheme_make_pair(v, ip->input_extras);
|
l = scheme_make_raw_pair(v, ip->input_extras);
|
||||||
ip->input_extras = l;
|
ip->input_extras = l;
|
||||||
|
|
||||||
scheme_post_sema_all(ip->input_giveup);
|
scheme_post_sema_all(ip->input_giveup);
|
||||||
|
@ -1941,12 +1941,12 @@ int scheme_peeked_read_via_get(Scheme_Input_Port *ip,
|
||||||
/* There are other threads trying to commit, and
|
/* There are other threads trying to commit, and
|
||||||
as main thread, we'll help them out. */
|
as main thread, we'll help them out. */
|
||||||
n = 3;
|
n = 3;
|
||||||
for (l = ip->input_extras; l ; l = SCHEME_CDR(l)) {
|
for (l = ip->input_extras; l; l = SCHEME_CDR(l)) {
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
aa = MALLOC_N(Scheme_Object *, n);
|
aa = MALLOC_N(Scheme_Object *, n);
|
||||||
n = 3;
|
n = 3;
|
||||||
for (l = ip->input_extras; l ; l = SCHEME_CDR(l)) {
|
for (l = ip->input_extras; l; l = SCHEME_CDR(l)) {
|
||||||
aa[n++] = SCHEME_CDR(SCHEME_CAR(l));
|
aa[n++] = SCHEME_CDR(SCHEME_CAR(l));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -2153,7 +2153,15 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht,
|
||||||
#ifdef SGC_STD_DEBUGGING
|
#ifdef SGC_STD_DEBUGGING
|
||||||
len = strlen(s) - 1;
|
len = strlen(s) - 1;
|
||||||
#endif
|
#endif
|
||||||
|
if (!s) {
|
||||||
|
char s[8];
|
||||||
|
print_utf8_string(pp, "<???:", 0, 5);
|
||||||
|
sprintf(s, "%d", SCHEME_TYPE(obj));
|
||||||
|
print_utf8_string(pp, s, 0, -1);
|
||||||
|
print_utf8_string(pp, ">", 0, 1);
|
||||||
|
} else {
|
||||||
print_utf8_string(pp, s, 0, len);
|
print_utf8_string(pp, s, 0, len);
|
||||||
|
}
|
||||||
#ifdef SGC_STD_DEBUGGING
|
#ifdef SGC_STD_DEBUGGING
|
||||||
PRINTADDRESS(pp, obj);
|
PRINTADDRESS(pp, obj);
|
||||||
print_utf8_string(pp, ">", 0, 1);
|
print_utf8_string(pp, ">", 0, 1);
|
||||||
|
|
|
@ -80,6 +80,8 @@ static Scheme_Object *print_honu(int, Scheme_Object *[]);
|
||||||
|
|
||||||
#define isdigit_ascii(n) ((n >= '0') && (n <= '9'))
|
#define isdigit_ascii(n) ((n >= '0') && (n <= '9'))
|
||||||
|
|
||||||
|
#define scheme_isxdigit(n) (isdigit_ascii(n) || ((n >= 'a') && (n <= 'f')) || ((n >= 'A') && (n <= 'F')))
|
||||||
|
|
||||||
#define RETURN_FOR_SPECIAL_COMMENT 0x1
|
#define RETURN_FOR_SPECIAL_COMMENT 0x1
|
||||||
#define RETURN_FOR_HASH_COMMENT 0x2
|
#define RETURN_FOR_HASH_COMMENT 0x2
|
||||||
#define RETURN_FOR_DELIM 0x4
|
#define RETURN_FOR_DELIM 0x4
|
||||||
|
@ -106,6 +108,7 @@ typedef struct Readtable {
|
||||||
Scheme_Object so;
|
Scheme_Object so;
|
||||||
Scheme_Hash_Table *mapping; /* pos int -> (cons int proc-or-char); neg int -> proc */
|
Scheme_Hash_Table *mapping; /* pos int -> (cons int proc-or-char); neg int -> proc */
|
||||||
char *fast_mapping;
|
char *fast_mapping;
|
||||||
|
Scheme_Object *symbol_parser; /* NULL or a Scheme function */
|
||||||
} Readtable;
|
} Readtable;
|
||||||
|
|
||||||
typedef struct ReadParams {
|
typedef struct ReadParams {
|
||||||
|
@ -170,7 +173,7 @@ static Scheme_Object *read_number(int init_ch,
|
||||||
Scheme_Object *indentation,
|
Scheme_Object *indentation,
|
||||||
ReadParams *params,
|
ReadParams *params,
|
||||||
Readtable *table);
|
Readtable *table);
|
||||||
static Scheme_Object *read_symbol(int init_ch,
|
static Scheme_Object *read_symbol(int init_ch, int skip_rt,
|
||||||
Scheme_Object *port, Scheme_Object *stxsrc,
|
Scheme_Object *port, Scheme_Object *stxsrc,
|
||||||
long line, long col, long pos,
|
long line, long col, long pos,
|
||||||
Scheme_Hash_Table **ht,
|
Scheme_Hash_Table **ht,
|
||||||
|
@ -219,6 +222,10 @@ static int skip_whitespace_comments(Scheme_Object *port, Scheme_Object *stxsrc,
|
||||||
Scheme_Object *indentation,
|
Scheme_Object *indentation,
|
||||||
ReadParams *params);
|
ReadParams *params);
|
||||||
|
|
||||||
|
static Scheme_Object *readtable_call(int w_char, int ch, Scheme_Object *proc, ReadParams *params,
|
||||||
|
Scheme_Object *port, Scheme_Object *src, long line, long col, long pos,
|
||||||
|
Scheme_Hash_Table **ht);
|
||||||
|
|
||||||
static Scheme_Object *copy_to_protect_placeholders(Scheme_Object *v, Scheme_Object *src, Scheme_Hash_Table **ht);
|
static Scheme_Object *copy_to_protect_placeholders(Scheme_Object *v, Scheme_Object *src, Scheme_Hash_Table **ht);
|
||||||
|
|
||||||
#define READTABLE_WHITESPACE 0x1
|
#define READTABLE_WHITESPACE 0x1
|
||||||
|
@ -725,7 +732,7 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
|
||||||
Scheme_Object *indentation, ReadParams *params,
|
Scheme_Object *indentation, ReadParams *params,
|
||||||
int comment_mode, int pre_char, Readtable *table)
|
int comment_mode, int pre_char, Readtable *table)
|
||||||
{
|
{
|
||||||
int ch, ch2, depth, dispatch_ch;
|
int ch, ch2, depth, dispatch_ch, special_value_need_copy = 0;
|
||||||
long line = 0, col = 0, pos = 0;
|
long line = 0, col = 0, pos = 0;
|
||||||
Scheme_Object *special_value;
|
Scheme_Object *special_value;
|
||||||
|
|
||||||
|
@ -818,28 +825,11 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
|
||||||
return scheme_eof;
|
return scheme_eof;
|
||||||
case SCHEME_SPECIAL:
|
case SCHEME_SPECIAL:
|
||||||
{
|
{
|
||||||
Scheme_Object *v;
|
if (!special_value) {
|
||||||
if (special_value)
|
special_value = scheme_get_special(port, stxsrc, line, col, pos, 0, ht);
|
||||||
v = special_value;
|
special_value_need_copy = 1;
|
||||||
else
|
|
||||||
v = scheme_get_special(port, stxsrc, line, col, pos, 0, ht);
|
|
||||||
if (scheme_special_comment_value(v)) {
|
|
||||||
/* a "comment" */
|
|
||||||
if (comment_mode & RETURN_FOR_SPECIAL_COMMENT)
|
|
||||||
return NULL;
|
|
||||||
else
|
|
||||||
goto start_over;
|
|
||||||
} else if (SCHEME_STXP(v)) {
|
|
||||||
if (!stxsrc)
|
|
||||||
v = scheme_syntax_to_datum(v, 0, NULL);
|
|
||||||
} else if (stxsrc) {
|
|
||||||
Scheme_Object *s;
|
|
||||||
s = scheme_make_stx_w_offset(scheme_false, line, col, pos, SPAN(port, pos), stxsrc, STX_SRCTAG);
|
|
||||||
v = scheme_datum_to_syntax(v, s, scheme_false, 1, 0);
|
|
||||||
}
|
}
|
||||||
if (!special_value)
|
break;
|
||||||
v = copy_to_protect_placeholders(v, stxsrc, ht);
|
|
||||||
return v;
|
|
||||||
}
|
}
|
||||||
case ']':
|
case ']':
|
||||||
if (!params->square_brackets_are_parens) {
|
if (!params->square_brackets_are_parens) {
|
||||||
|
@ -875,7 +865,8 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
|
||||||
} else
|
} else
|
||||||
return read_list(port, stxsrc, line, col, pos, '}', mz_shape_cons, 0, ht, indentation, params);
|
return read_list(port, stxsrc, line, col, pos, '}', mz_shape_cons, 0, ht, indentation, params);
|
||||||
case '|':
|
case '|':
|
||||||
return read_symbol(ch, port, stxsrc, line, col, pos, ht, indentation, params, table);
|
special_value = read_symbol(ch, 1, port, stxsrc, line, col, pos, ht, indentation, params, table);
|
||||||
|
break;
|
||||||
case '"':
|
case '"':
|
||||||
return read_string(0, 0, port, stxsrc, line, col, pos, ht, indentation, params, 1);
|
return read_string(0, 0, port, stxsrc, line, col, pos, ht, indentation, params, 1);
|
||||||
case '\'':
|
case '\'':
|
||||||
|
@ -887,7 +878,7 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
|
||||||
case '`':
|
case '`':
|
||||||
if (params->honu_mode) {
|
if (params->honu_mode) {
|
||||||
/* Raises illegal-char error: */
|
/* Raises illegal-char error: */
|
||||||
return read_symbol(ch, port, stxsrc, line, col, pos, ht, indentation, params, table);
|
return read_symbol(ch, 1, port, stxsrc, line, col, pos, ht, indentation, params, table);
|
||||||
} else if (!params->can_read_quasi) {
|
} else if (!params->can_read_quasi) {
|
||||||
scheme_read_err(port, stxsrc, line, col, pos, 1, 0, indentation, "read: illegal use of backquote");
|
scheme_read_err(port, stxsrc, line, col, pos, 1, 0, indentation, "read: illegal use of backquote");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -930,7 +921,8 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
|
||||||
case '+':
|
case '+':
|
||||||
case '-':
|
case '-':
|
||||||
if (params->honu_mode) {
|
if (params->honu_mode) {
|
||||||
return read_symbol(ch, port, stxsrc, line, col, pos, ht, indentation, params, table);
|
special_value = read_symbol(ch, 1, port, stxsrc, line, col, pos, ht, indentation, params, table);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case '.': /* ^^^ fallthrough ^^^ */
|
case '.': /* ^^^ fallthrough ^^^ */
|
||||||
ch2 = scheme_peekc_special_ok(port);
|
ch2 = scheme_peekc_special_ok(port);
|
||||||
|
@ -938,10 +930,12 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
|
||||||
|| (!params->honu_mode
|
|| (!params->honu_mode
|
||||||
&& ((ch2 == 'i') || (ch2 == 'I') /* Maybe inf */
|
&& ((ch2 == 'i') || (ch2 == 'I') /* Maybe inf */
|
||||||
|| (ch2 == 'n') || (ch2 == 'N') /* Maybe nan*/ ))) {
|
|| (ch2 == 'n') || (ch2 == 'N') /* Maybe nan*/ ))) {
|
||||||
return read_number(ch, port, stxsrc, line, col, pos, 0, 0, 10, 0, ht, indentation, params, table);
|
/* read_number tries to get a number, but produces a symbol if number parsing doesn't work: */
|
||||||
|
special_value = read_number(ch, port, stxsrc, line, col, pos, 0, 0, 10, 0, ht, indentation, params, table);
|
||||||
} else {
|
} else {
|
||||||
return read_symbol(ch, port, stxsrc, line, col, pos, ht, indentation, params, table);
|
special_value = read_symbol(ch, 0, port, stxsrc, line, col, pos, ht, indentation, params, table);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
case '#':
|
case '#':
|
||||||
ch = scheme_getc_special_ok(port);
|
ch = scheme_getc_special_ok(port);
|
||||||
|
|
||||||
|
@ -959,7 +953,9 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ( ch )
|
special_value = NULL;
|
||||||
|
|
||||||
|
switch (ch)
|
||||||
{
|
{
|
||||||
case EOF:
|
case EOF:
|
||||||
case SCHEME_SPECIAL:
|
case SCHEME_SPECIAL:
|
||||||
|
@ -993,7 +989,7 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
|
||||||
case '%':
|
case '%':
|
||||||
if (!params->honu_mode) {
|
if (!params->honu_mode) {
|
||||||
scheme_ungetc('%', port);
|
scheme_ungetc('%', port);
|
||||||
return read_symbol('#', port, stxsrc, line, col, pos, ht, indentation, params, table);
|
special_value = read_symbol('#', 1, port, stxsrc, line, col, pos, ht, indentation, params, table);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ':':
|
case ':':
|
||||||
|
@ -1598,11 +1594,13 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (!special_value) {
|
||||||
/* We get here only in honu mode */
|
/* We get here only in honu mode */
|
||||||
scheme_read_err(port, stxsrc, line, col, pos, 2, ch, indentation,
|
scheme_read_err(port, stxsrc, line, col, pos, 2, ch, indentation,
|
||||||
"read: bad syntax `#%c'",
|
"read: bad syntax `#%c'",
|
||||||
ch);
|
ch);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case '/':
|
case '/':
|
||||||
if (params->honu_mode) {
|
if (params->honu_mode) {
|
||||||
|
@ -1615,13 +1613,39 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
|
||||||
goto start_over_with_ch;
|
goto start_over_with_ch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return read_symbol(ch, port, stxsrc, line, col, pos, ht, indentation, params, table);
|
special_value = read_symbol(ch, 0, port, stxsrc, line, col, pos, ht, indentation, params, table);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (isdigit_ascii(ch))
|
if (isdigit_ascii(ch))
|
||||||
return read_number(ch, port, stxsrc, line, col, pos, 0, 0, 10, 0, ht, indentation, params, table);
|
special_value = read_number(ch, port, stxsrc, line, col, pos, 0, 0, 10, 0, ht, indentation, params, table);
|
||||||
else
|
else
|
||||||
return read_symbol(ch, port, stxsrc, line, col, pos, ht, indentation, params, table);
|
special_value = read_symbol(ch, 0, port, stxsrc, line, col, pos, ht, indentation, params, table);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We get here after reading a "symbol". Check for a comment. */
|
||||||
|
{
|
||||||
|
Scheme_Object *v = special_value;
|
||||||
|
|
||||||
|
if (scheme_special_comment_value(v)) {
|
||||||
|
/* a "comment" */
|
||||||
|
if (comment_mode & RETURN_FOR_SPECIAL_COMMENT)
|
||||||
|
return NULL;
|
||||||
|
else {
|
||||||
|
special_value_need_copy = 0;
|
||||||
|
goto start_over;
|
||||||
|
}
|
||||||
|
} else if (SCHEME_STXP(v)) {
|
||||||
|
if (!stxsrc)
|
||||||
|
v = scheme_syntax_to_datum(v, 0, NULL);
|
||||||
|
} else if (stxsrc) {
|
||||||
|
Scheme_Object *s;
|
||||||
|
s = scheme_make_stx_w_offset(scheme_false, line, col, pos, SPAN(port, pos), stxsrc, STX_SRCTAG);
|
||||||
|
v = scheme_datum_to_syntax(v, s, scheme_false, 1, 0);
|
||||||
|
}
|
||||||
|
if (special_value_need_copy)
|
||||||
|
v = copy_to_protect_placeholders(v, stxsrc, ht);
|
||||||
|
return v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1816,8 +1840,10 @@ _scheme_internal_read(Scheme_Object *port, Scheme_Object *stxsrc, int crc, int h
|
||||||
|
|
||||||
ht = NULL;
|
ht = NULL;
|
||||||
if (recur) {
|
if (recur) {
|
||||||
|
/* Check whether this is really a recursive call. If so,
|
||||||
|
we get a pointer to a hash table for cycles: */
|
||||||
v = scheme_extract_one_cc_mark(NULL, an_uninterned_symbol);
|
v = scheme_extract_one_cc_mark(NULL, an_uninterned_symbol);
|
||||||
if (v && SCHEME_PAIRP(v)) {
|
if (v && SCHEME_RPAIRP(v)) {
|
||||||
if (SCHEME_FALSEP(SCHEME_CDR(v)) == !stxsrc)
|
if (SCHEME_FALSEP(SCHEME_CDR(v)) == !stxsrc)
|
||||||
ht = (Scheme_Hash_Table **)SCHEME_CAR(v);
|
ht = (Scheme_Hash_Table **)SCHEME_CAR(v);
|
||||||
}
|
}
|
||||||
|
@ -2785,7 +2811,7 @@ typedef int (*Getc_Fun_r)(Scheme_Object *port);
|
||||||
|
|
||||||
/* nothing has been read, except maybe some flags */
|
/* nothing has been read, except maybe some flags */
|
||||||
static Scheme_Object *
|
static Scheme_Object *
|
||||||
read_number_or_symbol(int init_ch, Scheme_Object *port,
|
read_number_or_symbol(int init_ch, int skip_rt, Scheme_Object *port,
|
||||||
Scheme_Object *stxsrc, long line, long col, long pos,
|
Scheme_Object *stxsrc, long line, long col, long pos,
|
||||||
int is_float, int is_not_float,
|
int is_float, int is_not_float,
|
||||||
int radix, int radix_set,
|
int radix, int radix_set,
|
||||||
|
@ -2808,6 +2834,15 @@ read_number_or_symbol(int init_ch, Scheme_Object *port,
|
||||||
int single_escape, multiple_escape, norm_count = 0;
|
int single_escape, multiple_escape, norm_count = 0;
|
||||||
Getc_Fun_r getc_special_ok_fun;
|
Getc_Fun_r getc_special_ok_fun;
|
||||||
|
|
||||||
|
if (!skip_rt && table) {
|
||||||
|
/* If the readtable provide a "symbol" reader, then use it: */
|
||||||
|
if (table->symbol_parser) {
|
||||||
|
return readtable_call(1, init_ch, table->symbol_parser, params,
|
||||||
|
port, stxsrc, line, col, pos, ht);
|
||||||
|
/* Special-comment result is handled in main loop. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ungetc_ok = scheme_peekc_is_ungetc(port);
|
ungetc_ok = scheme_peekc_is_ungetc(port);
|
||||||
|
|
||||||
if (ungetc_ok) {
|
if (ungetc_ok) {
|
||||||
|
@ -3074,7 +3109,7 @@ read_number(int init_ch,
|
||||||
Scheme_Hash_Table **ht,
|
Scheme_Hash_Table **ht,
|
||||||
Scheme_Object *indentation, ReadParams *params, Readtable *table)
|
Scheme_Object *indentation, ReadParams *params, Readtable *table)
|
||||||
{
|
{
|
||||||
return read_number_or_symbol(init_ch,
|
return read_number_or_symbol(init_ch, init_ch < 0,
|
||||||
port, stxsrc, line, col, pos,
|
port, stxsrc, line, col, pos,
|
||||||
is_float, is_not_float,
|
is_float, is_not_float,
|
||||||
radix, radix_set, 0, 0,
|
radix, radix_set, 0, 0,
|
||||||
|
@ -3084,12 +3119,13 @@ read_number(int init_ch,
|
||||||
|
|
||||||
static Scheme_Object *
|
static Scheme_Object *
|
||||||
read_symbol(int init_ch,
|
read_symbol(int init_ch,
|
||||||
|
int skip_rt,
|
||||||
Scheme_Object *port,
|
Scheme_Object *port,
|
||||||
Scheme_Object *stxsrc, long line, long col, long pos,
|
Scheme_Object *stxsrc, long line, long col, long pos,
|
||||||
Scheme_Hash_Table **ht,
|
Scheme_Hash_Table **ht,
|
||||||
Scheme_Object *indentation, ReadParams *params, Readtable *table)
|
Scheme_Object *indentation, ReadParams *params, Readtable *table)
|
||||||
{
|
{
|
||||||
return read_number_or_symbol(init_ch,
|
return read_number_or_symbol(init_ch, skip_rt,
|
||||||
port, stxsrc, line, col, pos,
|
port, stxsrc, line, col, pos,
|
||||||
0, 0, 10, 0, 1, 0,
|
0, 0, 10, 0, 1, 0,
|
||||||
params->can_read_pipe_quote,
|
params->can_read_pipe_quote,
|
||||||
|
@ -3103,7 +3139,7 @@ read_keyword(int init_ch,
|
||||||
Scheme_Hash_Table **ht,
|
Scheme_Hash_Table **ht,
|
||||||
Scheme_Object *indentation, ReadParams *params, Readtable *table)
|
Scheme_Object *indentation, ReadParams *params, Readtable *table)
|
||||||
{
|
{
|
||||||
return read_number_or_symbol(init_ch,
|
return read_number_or_symbol(init_ch, 1,
|
||||||
port, stxsrc, line, col, pos,
|
port, stxsrc, line, col, pos,
|
||||||
0, 0, 10, 0, 1, 1,
|
0, 0, 10, 0, 1, 1,
|
||||||
params->can_read_pipe_quote,
|
params->can_read_pipe_quote,
|
||||||
|
@ -4715,7 +4751,7 @@ void scheme_set_in_read_mark(Scheme_Object *src, Scheme_Hash_Table **ht)
|
||||||
Scheme_Object *v;
|
Scheme_Object *v;
|
||||||
|
|
||||||
if (ht)
|
if (ht)
|
||||||
v = scheme_make_pair((Scheme_Object *)ht,
|
v = scheme_make_raw_pair((Scheme_Object *)ht,
|
||||||
(src ? scheme_true : scheme_false));
|
(src ? scheme_true : scheme_false));
|
||||||
else
|
else
|
||||||
v = scheme_false;
|
v = scheme_false;
|
||||||
|
@ -4832,14 +4868,20 @@ static Scheme_Object *make_readtable(int argc, Scheme_Object **argv)
|
||||||
fast = scheme_malloc_atomic(128);
|
fast = scheme_malloc_atomic(128);
|
||||||
memcpy(fast, (orig_t ? orig_t->fast_mapping : builtin_fast), 128);
|
memcpy(fast, (orig_t ? orig_t->fast_mapping : builtin_fast), 128);
|
||||||
t->fast_mapping = fast;
|
t->fast_mapping = fast;
|
||||||
|
t->symbol_parser = (orig_t ? orig_t->symbol_parser : NULL);
|
||||||
|
|
||||||
for (i = 1; i < argc; i += 3) {
|
for (i = 1; i < argc; i += 3) {
|
||||||
if (!SCHEME_CHARP(argv[i])) {
|
if (!SCHEME_FALSEP(argv[i]) && !SCHEME_CHARP(argv[i])) {
|
||||||
scheme_wrong_type("make-readtable", "character", i, argc, argv);
|
scheme_wrong_type("make-readtable", "character or #f", i, argc, argv);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i + 1 >= argc) {
|
if (i + 1 >= argc) {
|
||||||
|
if (SCHEME_FALSEP(argv[i]))
|
||||||
|
scheme_arg_mismatch("make-readtable",
|
||||||
|
"expected 'non-terminating-macro after #f",
|
||||||
|
NULL);
|
||||||
|
else
|
||||||
scheme_arg_mismatch("make-readtable",
|
scheme_arg_mismatch("make-readtable",
|
||||||
"expected 'terminating-macro, 'non-terminating-macro, 'dispatch-macro,"
|
"expected 'terminating-macro, 'non-terminating-macro, 'dispatch-macro,"
|
||||||
" or character argument after character argument: ",
|
" or character argument after character argument: ",
|
||||||
|
@ -4856,16 +4898,25 @@ static Scheme_Object *make_readtable(int argc, Scheme_Object **argv)
|
||||||
i+1, argc, argv);
|
i+1, argc, argv);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
if (SCHEME_FALSEP(argv[i])
|
||||||
|
&& !SAME_OBJ(sym, non_terminating_macro_symbol)) {
|
||||||
|
scheme_arg_mismatch("make-readtable",
|
||||||
|
"expected 'non-terminating-macro after #f, given: ",
|
||||||
|
sym);
|
||||||
|
}
|
||||||
|
|
||||||
if (i + 2 >= argc) {
|
if (i + 2 >= argc) {
|
||||||
scheme_arg_mismatch("make-readtable",
|
scheme_arg_mismatch("make-readtable",
|
||||||
(SCHEME_CHARP(sym)
|
(SCHEME_CHARP(sym)
|
||||||
? "expected readtable or #f argument after character argument: "
|
? "expected readtable or #f argument after character argument, given: "
|
||||||
: "expected procedure argument after symbol argument: "),
|
: "expected procedure argument after symbol argument, given: "),
|
||||||
argv[i+1]);
|
argv[i+1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SAME_OBJ(sym, dispatch_macro_symbol)) {
|
if (SCHEME_FALSEP(argv[i])) {
|
||||||
|
scheme_check_proc_arity("make-readtable", 6, i+2, argc, argv);
|
||||||
|
t->symbol_parser = argv[i + 2];
|
||||||
|
} else if (SAME_OBJ(sym, dispatch_macro_symbol)) {
|
||||||
ch = SCHEME_CHAR_VAL(argv[i]);
|
ch = SCHEME_CHAR_VAL(argv[i]);
|
||||||
scheme_check_proc_arity("make-readtable", 6, i+2, argc, argv);
|
scheme_check_proc_arity("make-readtable", 6, i+2, argc, argv);
|
||||||
scheme_hash_set(t->mapping, scheme_make_integer(-ch), argv[i+2]);
|
scheme_hash_set(t->mapping, scheme_make_integer(-ch), argv[i+2]);
|
||||||
|
|
|
@ -948,6 +948,8 @@ static void cons_onto_list(void *p)
|
||||||
# ifdef MZ_PRECISE_GC
|
# ifdef MZ_PRECISE_GC
|
||||||
START_XFORM_SKIP;
|
START_XFORM_SKIP;
|
||||||
extern int GC_is_tagged(void *p);
|
extern int GC_is_tagged(void *p);
|
||||||
|
extern int GC_is_tagged_start(void *p);
|
||||||
|
extern void *GC_next_tagged_start(void *p);
|
||||||
# ifdef DOS_FILE_SYSTEM
|
# ifdef DOS_FILE_SYSTEM
|
||||||
extern void gc_fprintf(int ignored, const char *c, ...);
|
extern void gc_fprintf(int ignored, const char *c, ...);
|
||||||
# define object_console_printf gc_fprintf
|
# define object_console_printf gc_fprintf
|
||||||
|
@ -986,10 +988,6 @@ void scheme_print_tagged_value(const char *prefix,
|
||||||
scheme_check_print_is_obj = check_home;
|
scheme_check_print_is_obj = check_home;
|
||||||
|
|
||||||
if (!xtagged) {
|
if (!xtagged) {
|
||||||
if (SCHEME_PAIRP(v)) {
|
|
||||||
/* Pairs are used for all sorts of non-Scheme values: */
|
|
||||||
type ="#<pair>";
|
|
||||||
} else
|
|
||||||
type = scheme_write_to_string_w_max((Scheme_Object *)v, &len, max_w);
|
type = scheme_write_to_string_w_max((Scheme_Object *)v, &len, max_w);
|
||||||
if (!scheme_strncmp(type, "#<thread", 8)
|
if (!scheme_strncmp(type, "#<thread", 8)
|
||||||
&& ((type[8] == '>') || (type[8] == ':'))) {
|
&& ((type[8] == '>') || (type[8] == ':'))) {
|
||||||
|
@ -1070,6 +1068,22 @@ void scheme_print_tagged_value(const char *prefix,
|
||||||
memcpy(t2 + len, buffer, len2 + 1);
|
memcpy(t2 + len, buffer, len2 + 1);
|
||||||
len += len2;
|
len += len2;
|
||||||
type = t2;
|
type = t2;
|
||||||
|
} else if (!scheme_strncmp(type, "#<syntax-code", 13)) {
|
||||||
|
char *t2, *t3;
|
||||||
|
long len2, len3;
|
||||||
|
|
||||||
|
t2 = scheme_write_to_string_w_max(SCHEME_IPTR_VAL(v), &len2, 32);
|
||||||
|
|
||||||
|
len3 = len + len2 + 2 + 2;
|
||||||
|
t3 = (char *)scheme_malloc_atomic(len3);
|
||||||
|
memcpy(t3, type, len);
|
||||||
|
t3[len] = (SCHEME_PINT_VAL(v) / 10) + '0';
|
||||||
|
t3[len + 1] = (SCHEME_PINT_VAL(v) % 10) + '0';
|
||||||
|
t3[len + 2] = '=';
|
||||||
|
memcpy(t3 + len + 3, t2, len2);
|
||||||
|
t3[len + len2 + 3] = 0;
|
||||||
|
type = t3;
|
||||||
|
len = len3;
|
||||||
} else if (!scheme_strncmp(type, "#<syntax", 8)) {
|
} else if (!scheme_strncmp(type, "#<syntax", 8)) {
|
||||||
char *t2, *t3;
|
char *t2, *t3;
|
||||||
long len2, len3;
|
long len2, len3;
|
||||||
|
@ -1124,12 +1138,11 @@ Scheme_Object *scheme_dump_gc_stats(int c, Scheme_Object *p[])
|
||||||
|
|
||||||
scheme_start_atomic();
|
scheme_start_atomic();
|
||||||
|
|
||||||
scheme_console_printf("Begin Dump\n");
|
|
||||||
|
|
||||||
if (scheme_external_dump_arg)
|
if (scheme_external_dump_arg)
|
||||||
scheme_external_dump_arg(c ? p[0] : NULL);
|
scheme_external_dump_arg(c ? p[0] : NULL);
|
||||||
|
|
||||||
#ifdef USE_TAGGED_ALLOCATION
|
#ifdef USE_TAGGED_ALLOCATION
|
||||||
|
scheme_console_printf("Begin Dump\n");
|
||||||
trace_path_type = -1;
|
trace_path_type = -1;
|
||||||
obj_type = -1;
|
obj_type = -1;
|
||||||
if (c && SCHEME_SYMBOLP(p[0])) {
|
if (c && SCHEME_SYMBOLP(p[0])) {
|
||||||
|
@ -1356,6 +1369,35 @@ Scheme_Object *scheme_dump_gc_stats(int c, Scheme_Object *p[])
|
||||||
|
|
||||||
if (!strcmp("fnl", s))
|
if (!strcmp("fnl", s))
|
||||||
GC_show_finals = 1;
|
GC_show_finals = 1;
|
||||||
|
|
||||||
|
if (!strcmp("peek", s) && (c == 3)) {
|
||||||
|
long n;
|
||||||
|
scheme_end_atomic();
|
||||||
|
if (scheme_get_int_val(p[1], &n)) {
|
||||||
|
if (GC_is_tagged_start((void *)n)) {
|
||||||
|
return (Scheme_Object *)n;
|
||||||
|
} else
|
||||||
|
return p[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp("next", s) && (c == 2)) {
|
||||||
|
void *pt;
|
||||||
|
scheme_end_atomic();
|
||||||
|
if (SCHEME_FALSEP(p[1]))
|
||||||
|
pt = GC_next_tagged_start(NULL);
|
||||||
|
else
|
||||||
|
pt = GC_next_tagged_start((void *)p[1]);
|
||||||
|
if (pt)
|
||||||
|
return (Scheme_Object *)pt;
|
||||||
|
else
|
||||||
|
return scheme_false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp("addr", s) && (c == 2)) {
|
||||||
|
scheme_end_atomic();
|
||||||
|
return scheme_make_integer_value((long)p[1]);
|
||||||
|
}
|
||||||
} else if (SCHEME_INTP(p[0])) {
|
} else if (SCHEME_INTP(p[0])) {
|
||||||
GC_trace_for_tag = SCHEME_INT_VAL(p[0]);
|
GC_trace_for_tag = SCHEME_INT_VAL(p[0]);
|
||||||
GC_show_trace = 1;
|
GC_show_trace = 1;
|
||||||
|
@ -1368,6 +1410,7 @@ Scheme_Object *scheme_dump_gc_stats(int c, Scheme_Object *p[])
|
||||||
GC_show_trace = 0;
|
GC_show_trace = 0;
|
||||||
} else
|
} else
|
||||||
GC_path_length_limit = 1000;
|
GC_path_length_limit = 1000;
|
||||||
|
scheme_console_printf("Begin Dump\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GC_dump();
|
GC_dump();
|
||||||
|
@ -1449,6 +1492,9 @@ Scheme_Object *scheme_dump_gc_stats(int c, Scheme_Object *p[])
|
||||||
scheme_console_printf(" (dump-memory-stats -num) - prints paths to objects of size num.\n");
|
scheme_console_printf(" (dump-memory-stats -num) - prints paths to objects of size num.\n");
|
||||||
scheme_console_printf(" (dump-memory-stats sym/num len) - limits path to size len.\n");
|
scheme_console_printf(" (dump-memory-stats sym/num len) - limits path to size len.\n");
|
||||||
scheme_console_printf(" (dump-memory-stats sym/num 'cons) - builds list instead of showing paths.\n");
|
scheme_console_printf(" (dump-memory-stats sym/num 'cons) - builds list instead of showing paths.\n");
|
||||||
|
scheme_console_printf(" (dump-memory-stats 'peek num v) - returns value if num is address of object, v otherwise.\n");
|
||||||
|
scheme_console_printf(" (dump-memory-stats 'next v) - next tagged object after v, #f if none; start with #f.\n");
|
||||||
|
scheme_console_printf(" (dump-memory-stats 'addr v) - returns the address of v.\n");
|
||||||
scheme_console_printf("End Help\n");
|
scheme_console_printf("End Help\n");
|
||||||
|
|
||||||
result = cons_accum_result;
|
result = cons_accum_result;
|
||||||
|
|
|
@ -227,6 +227,7 @@ MZ_EXTERN Scheme_Object *scheme_multiple_values;
|
||||||
|
|
||||||
MZ_EXTERN unsigned short *scheme_uchar_table[];
|
MZ_EXTERN unsigned short *scheme_uchar_table[];
|
||||||
MZ_EXTERN unsigned char *scheme_uchar_cases_table[];
|
MZ_EXTERN unsigned char *scheme_uchar_cases_table[];
|
||||||
|
MZ_EXTERN unsigned char *scheme_uchar_cats_table[];
|
||||||
MZ_EXTERN int scheme_uchar_ups[];
|
MZ_EXTERN int scheme_uchar_ups[];
|
||||||
MZ_EXTERN int scheme_uchar_downs[];
|
MZ_EXTERN int scheme_uchar_downs[];
|
||||||
MZ_EXTERN int scheme_uchar_titles[];
|
MZ_EXTERN int scheme_uchar_titles[];
|
||||||
|
@ -438,6 +439,8 @@ MZ_EXTERN void scheme_prim_is_method(Scheme_Object *o);
|
||||||
MZ_EXTERN Scheme_Object *scheme_make_pair(Scheme_Object *car, Scheme_Object *cdr);
|
MZ_EXTERN Scheme_Object *scheme_make_pair(Scheme_Object *car, Scheme_Object *cdr);
|
||||||
MZ_EXTERN Scheme_Object *scheme_make_immutable_pair(Scheme_Object *car, Scheme_Object *cdr);
|
MZ_EXTERN Scheme_Object *scheme_make_immutable_pair(Scheme_Object *car, Scheme_Object *cdr);
|
||||||
|
|
||||||
|
MZ_EXTERN Scheme_Object *scheme_make_raw_pair(Scheme_Object *, Scheme_Object *);
|
||||||
|
|
||||||
MZ_EXTERN Scheme_Object *scheme_make_byte_string(const char *chars);
|
MZ_EXTERN Scheme_Object *scheme_make_byte_string(const char *chars);
|
||||||
MZ_EXTERN Scheme_Object *scheme_make_sized_byte_string(char *chars, long len, int copy);
|
MZ_EXTERN Scheme_Object *scheme_make_sized_byte_string(char *chars, long len, int copy);
|
||||||
MZ_EXTERN Scheme_Object *scheme_make_sized_offset_byte_string(char *chars, long d, long len, int copy);
|
MZ_EXTERN Scheme_Object *scheme_make_sized_offset_byte_string(char *chars, long d, long len, int copy);
|
||||||
|
|
|
@ -182,6 +182,7 @@ Scheme_Object *scheme_tail_call_waiting;
|
||||||
Scheme_Object *scheme_multiple_values;
|
Scheme_Object *scheme_multiple_values;
|
||||||
unsigned short **scheme_uchar_table;
|
unsigned short **scheme_uchar_table;
|
||||||
unsigned char **scheme_uchar_cases_table;
|
unsigned char **scheme_uchar_cases_table;
|
||||||
|
unsigned char **scheme_uchar_cats_table;
|
||||||
int *scheme_uchar_ups;
|
int *scheme_uchar_ups;
|
||||||
int *scheme_uchar_downs;
|
int *scheme_uchar_downs;
|
||||||
int *scheme_uchar_titles;
|
int *scheme_uchar_titles;
|
||||||
|
@ -357,6 +358,7 @@ Scheme_Object *(*scheme_make_closed_prim_w_everything)(Scheme_Closed_Prim *fun,
|
||||||
void (*scheme_prim_is_method)(Scheme_Object *o);
|
void (*scheme_prim_is_method)(Scheme_Object *o);
|
||||||
Scheme_Object *(*scheme_make_pair)(Scheme_Object *car, Scheme_Object *cdr);
|
Scheme_Object *(*scheme_make_pair)(Scheme_Object *car, Scheme_Object *cdr);
|
||||||
Scheme_Object *(*scheme_make_immutable_pair)(Scheme_Object *car, Scheme_Object *cdr);
|
Scheme_Object *(*scheme_make_immutable_pair)(Scheme_Object *car, Scheme_Object *cdr);
|
||||||
|
Scheme_Object *(*scheme_make_raw_pair)(Scheme_Object *, Scheme_Object *);
|
||||||
Scheme_Object *(*scheme_make_byte_string)(const char *chars);
|
Scheme_Object *(*scheme_make_byte_string)(const char *chars);
|
||||||
Scheme_Object *(*scheme_make_sized_byte_string)(char *chars, long len, int copy);
|
Scheme_Object *(*scheme_make_sized_byte_string)(char *chars, long len, int copy);
|
||||||
Scheme_Object *(*scheme_make_sized_offset_byte_string)(char *chars, long d, long len, int copy);
|
Scheme_Object *(*scheme_make_sized_offset_byte_string)(char *chars, long d, long len, int copy);
|
||||||
|
|
|
@ -106,6 +106,7 @@
|
||||||
scheme_extension_table->scheme_multiple_values = scheme_multiple_values;
|
scheme_extension_table->scheme_multiple_values = scheme_multiple_values;
|
||||||
scheme_extension_table->scheme_uchar_table = scheme_uchar_table;
|
scheme_extension_table->scheme_uchar_table = scheme_uchar_table;
|
||||||
scheme_extension_table->scheme_uchar_cases_table = scheme_uchar_cases_table;
|
scheme_extension_table->scheme_uchar_cases_table = scheme_uchar_cases_table;
|
||||||
|
scheme_extension_table->scheme_uchar_cats_table = scheme_uchar_cats_table;
|
||||||
scheme_extension_table->scheme_uchar_ups = scheme_uchar_ups;
|
scheme_extension_table->scheme_uchar_ups = scheme_uchar_ups;
|
||||||
scheme_extension_table->scheme_uchar_downs = scheme_uchar_downs;
|
scheme_extension_table->scheme_uchar_downs = scheme_uchar_downs;
|
||||||
scheme_extension_table->scheme_uchar_titles = scheme_uchar_titles;
|
scheme_extension_table->scheme_uchar_titles = scheme_uchar_titles;
|
||||||
|
@ -224,6 +225,7 @@
|
||||||
scheme_extension_table->scheme_prim_is_method = scheme_prim_is_method;
|
scheme_extension_table->scheme_prim_is_method = scheme_prim_is_method;
|
||||||
scheme_extension_table->scheme_make_pair = scheme_make_pair;
|
scheme_extension_table->scheme_make_pair = scheme_make_pair;
|
||||||
scheme_extension_table->scheme_make_immutable_pair = scheme_make_immutable_pair;
|
scheme_extension_table->scheme_make_immutable_pair = scheme_make_immutable_pair;
|
||||||
|
scheme_extension_table->scheme_make_raw_pair = scheme_make_raw_pair;
|
||||||
scheme_extension_table->scheme_make_byte_string = scheme_make_byte_string;
|
scheme_extension_table->scheme_make_byte_string = scheme_make_byte_string;
|
||||||
scheme_extension_table->scheme_make_sized_byte_string = scheme_make_sized_byte_string;
|
scheme_extension_table->scheme_make_sized_byte_string = scheme_make_sized_byte_string;
|
||||||
scheme_extension_table->scheme_make_sized_offset_byte_string = scheme_make_sized_offset_byte_string;
|
scheme_extension_table->scheme_make_sized_offset_byte_string = scheme_make_sized_offset_byte_string;
|
||||||
|
|
|
@ -106,6 +106,7 @@
|
||||||
#define scheme_multiple_values (scheme_extension_table->scheme_multiple_values)
|
#define scheme_multiple_values (scheme_extension_table->scheme_multiple_values)
|
||||||
#define scheme_uchar_table (scheme_extension_table->scheme_uchar_table)
|
#define scheme_uchar_table (scheme_extension_table->scheme_uchar_table)
|
||||||
#define scheme_uchar_cases_table (scheme_extension_table->scheme_uchar_cases_table)
|
#define scheme_uchar_cases_table (scheme_extension_table->scheme_uchar_cases_table)
|
||||||
|
#define scheme_uchar_cats_table (scheme_extension_table->scheme_uchar_cats_table)
|
||||||
#define scheme_uchar_ups (scheme_extension_table->scheme_uchar_ups)
|
#define scheme_uchar_ups (scheme_extension_table->scheme_uchar_ups)
|
||||||
#define scheme_uchar_downs (scheme_extension_table->scheme_uchar_downs)
|
#define scheme_uchar_downs (scheme_extension_table->scheme_uchar_downs)
|
||||||
#define scheme_uchar_titles (scheme_extension_table->scheme_uchar_titles)
|
#define scheme_uchar_titles (scheme_extension_table->scheme_uchar_titles)
|
||||||
|
@ -224,6 +225,7 @@
|
||||||
#define scheme_prim_is_method (scheme_extension_table->scheme_prim_is_method)
|
#define scheme_prim_is_method (scheme_extension_table->scheme_prim_is_method)
|
||||||
#define scheme_make_pair (scheme_extension_table->scheme_make_pair)
|
#define scheme_make_pair (scheme_extension_table->scheme_make_pair)
|
||||||
#define scheme_make_immutable_pair (scheme_extension_table->scheme_make_immutable_pair)
|
#define scheme_make_immutable_pair (scheme_extension_table->scheme_make_immutable_pair)
|
||||||
|
#define scheme_make_raw_pair (scheme_extension_table->scheme_make_raw_pair)
|
||||||
#define scheme_make_byte_string (scheme_extension_table->scheme_make_byte_string)
|
#define scheme_make_byte_string (scheme_extension_table->scheme_make_byte_string)
|
||||||
#define scheme_make_sized_byte_string (scheme_extension_table->scheme_make_sized_byte_string)
|
#define scheme_make_sized_byte_string (scheme_extension_table->scheme_make_sized_byte_string)
|
||||||
#define scheme_make_sized_offset_byte_string (scheme_extension_table->scheme_make_sized_offset_byte_string)
|
#define scheme_make_sized_offset_byte_string (scheme_extension_table->scheme_make_sized_offset_byte_string)
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
#define USE_COMPILED_STARTUP 1
|
#define USE_COMPILED_STARTUP 1
|
||||||
|
|
||||||
#define EXPECTED_PRIM_COUNT 861
|
#define EXPECTED_PRIM_COUNT 862
|
||||||
|
|
||||||
#ifdef MZSCHEME_SOMETHING_OMITTED
|
#ifdef MZSCHEME_SOMETHING_OMITTED
|
||||||
# undef USE_COMPILED_STARTUP
|
# undef USE_COMPILED_STARTUP
|
||||||
|
|
|
@ -587,8 +587,11 @@ Scheme_Object *scheme_make_module_rename(long phase, int kind, Scheme_Hash_Table
|
||||||
void scheme_extend_module_rename(Scheme_Object *rn, Scheme_Object *modname,
|
void scheme_extend_module_rename(Scheme_Object *rn, Scheme_Object *modname,
|
||||||
Scheme_Object *locname, Scheme_Object *exname,
|
Scheme_Object *locname, Scheme_Object *exname,
|
||||||
Scheme_Object *nominal_src, Scheme_Object *nominal_ex,
|
Scheme_Object *nominal_src, Scheme_Object *nominal_ex,
|
||||||
int mod_phase);
|
int mod_phase, int drop_for_marshal);
|
||||||
void scheme_extend_module_rename_with_kernel(Scheme_Object *rn, Scheme_Object *nominal_src);
|
void scheme_extend_module_rename_with_kernel(Scheme_Object *rn, Scheme_Object *nominal_src);
|
||||||
|
void scheme_save_module_rename_unmarshal(Scheme_Object *rn, Scheme_Object *info);
|
||||||
|
void scheme_do_module_rename_unmarshal(Scheme_Object *rn, Scheme_Object *info,
|
||||||
|
Scheme_Object *modidx_shift_from, Scheme_Object *modidx_shift_to);
|
||||||
void scheme_remove_module_rename(Scheme_Object *mrn,
|
void scheme_remove_module_rename(Scheme_Object *mrn,
|
||||||
Scheme_Object *localname);
|
Scheme_Object *localname);
|
||||||
void scheme_append_module_rename(Scheme_Object *src, Scheme_Object *dest);
|
void scheme_append_module_rename(Scheme_Object *src, Scheme_Object *dest);
|
||||||
|
@ -754,6 +757,13 @@ typedef struct Scheme_Toplevel {
|
||||||
/* MUTATED and READY flags are used in different contexts */
|
/* MUTATED and READY flags are used in different contexts */
|
||||||
#define SCHEME_TOPLEVEL_FLAGS_MASK 0x3
|
#define SCHEME_TOPLEVEL_FLAGS_MASK 0x3
|
||||||
|
|
||||||
|
typedef struct Scheme_Quote_Syntax {
|
||||||
|
Scheme_Object so; /* scheme_quote_syntax_type */
|
||||||
|
mzshort depth;
|
||||||
|
mzshort position;
|
||||||
|
mzshort midpoint;
|
||||||
|
} Scheme_Quote_Syntax;
|
||||||
|
|
||||||
typedef struct Scheme_Let_Value {
|
typedef struct Scheme_Let_Value {
|
||||||
Scheme_Inclhash_Object iso; /* keyex used for autobox */
|
Scheme_Inclhash_Object iso; /* keyex used for autobox */
|
||||||
mzshort count;
|
mzshort count;
|
||||||
|
@ -1721,10 +1731,9 @@ int scheme_is_sub_env(Scheme_Comp_Env *stx_env, Scheme_Comp_Env *env);
|
||||||
#define BOXVAL_EXPD 6
|
#define BOXVAL_EXPD 6
|
||||||
#define MODULE_EXPD 7
|
#define MODULE_EXPD 7
|
||||||
#define REQUIRE_EXPD 8
|
#define REQUIRE_EXPD 8
|
||||||
#define QUOTE_SYNTAX_EXPD 9
|
#define DEFINE_FOR_SYNTAX_EXPD 9
|
||||||
#define DEFINE_FOR_SYNTAX_EXPD 10
|
#define REF_EXPD 10
|
||||||
#define REF_EXPD 11
|
#define _COUNT_EXPD_ 11
|
||||||
#define _COUNT_EXPD_ 12
|
|
||||||
|
|
||||||
#define scheme_register_syntax(i, fo, fr, fv, fe, fj, cl, pa) \
|
#define scheme_register_syntax(i, fo, fr, fv, fe, fj, cl, pa) \
|
||||||
(scheme_syntax_optimizers[i] = fo, \
|
(scheme_syntax_optimizers[i] = fo, \
|
||||||
|
@ -1963,9 +1972,6 @@ void scheme_validate_toplevel(Scheme_Object *expr, Mz_CPort *port,
|
||||||
int num_toplevels, int num_stxes);
|
int num_toplevels, int num_stxes);
|
||||||
void scheme_validate_boxenv(int pos, Mz_CPort *port,
|
void scheme_validate_boxenv(int pos, Mz_CPort *port,
|
||||||
char *stack, int depth, int delta);
|
char *stack, int depth, int delta);
|
||||||
void scheme_validate_quote_syntax(int c, int p, int z, Mz_CPort *port,
|
|
||||||
char *stack, int depth, int delta,
|
|
||||||
int num_toplevels, int num_stxes);
|
|
||||||
|
|
||||||
#define TRACK_ILL_FORMED_CATCH_LINES 0
|
#define TRACK_ILL_FORMED_CATCH_LINES 0
|
||||||
#if TRACK_ILL_FORMED_CATCH_LINES
|
#if TRACK_ILL_FORMED_CATCH_LINES
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -9,6 +9,6 @@
|
||||||
|
|
||||||
|
|
||||||
#define MZSCHEME_VERSION_MAJOR 301
|
#define MZSCHEME_VERSION_MAJOR 301
|
||||||
#define MZSCHEME_VERSION_MINOR 11
|
#define MZSCHEME_VERSION_MINOR 12
|
||||||
|
|
||||||
#define MZSCHEME_VERSION "301.11" _MZ_SPECIAL_TAG
|
#define MZSCHEME_VERSION "301.12" _MZ_SPECIAL_TAG
|
||||||
|
|
|
@ -104,7 +104,7 @@ static void preemptive_chunk(Scheme_Stx *stx);
|
||||||
|
|
||||||
typedef struct Module_Renames {
|
typedef struct Module_Renames {
|
||||||
Scheme_Object so; /* scheme_rename_table_type */
|
Scheme_Object so; /* scheme_rename_table_type */
|
||||||
char plus_kernel, kind;
|
char plus_kernel, kind, needs_unmarshal;
|
||||||
long phase;
|
long phase;
|
||||||
Scheme_Object *plus_kernel_nominal_source;
|
Scheme_Object *plus_kernel_nominal_source;
|
||||||
Scheme_Hash_Table *ht; /* localname -> modidx OR
|
Scheme_Hash_Table *ht; /* localname -> modidx OR
|
||||||
|
@ -112,9 +112,12 @@ typedef struct Module_Renames {
|
||||||
(cons-immutable modidx nominal_modidx) OR
|
(cons-immutable modidx nominal_modidx) OR
|
||||||
(list* modidx exportname nominal_modidx nominal_exportname) OR
|
(list* modidx exportname nominal_modidx nominal_exportname) OR
|
||||||
(list* modidx mod-phase exportname nominal_modidx nominal_exportname) */
|
(list* modidx mod-phase exportname nominal_modidx nominal_exportname) */
|
||||||
|
Scheme_Hash_Table *nomarshal_ht; /* like ht, but dropped on marshal */
|
||||||
Scheme_Hash_Table *marked_names; /* shared with module environment while compiling the module;
|
Scheme_Hash_Table *marked_names; /* shared with module environment while compiling the module;
|
||||||
this table maps a top-level-bound identifier with a non-empty mark
|
this table maps a top-level-bound identifier with a non-empty mark
|
||||||
set to a gensym created for the binding */
|
set to a gensym created for the binding */
|
||||||
|
Scheme_Object *unmarshal_info; /* stores some renamings as infomation needed to consult
|
||||||
|
imported modules and restore renames from their exports */
|
||||||
} Module_Renames;
|
} Module_Renames;
|
||||||
|
|
||||||
typedef struct Scheme_Cert {
|
typedef struct Scheme_Cert {
|
||||||
|
@ -141,8 +144,8 @@ typedef struct Scheme_Cert {
|
||||||
maybe inactive certs in nested parts
|
maybe inactive certs in nested parts
|
||||||
- cons(c1, c2): active certs c1 (maybe NULL), inactive certs c2 (maybe NULL);
|
- cons(c1, c2): active certs c1 (maybe NULL), inactive certs c2 (maybe NULL);
|
||||||
no inactive certs in nested parts */
|
no inactive certs in nested parts */
|
||||||
#define ACTIVE_CERTS(stx) ((Scheme_Cert *)((stx)->certs ? (SCHEME_PAIRP((stx)->certs) ? SCHEME_CAR((stx)->certs) : (stx)->certs) : NULL))
|
#define ACTIVE_CERTS(stx) ((Scheme_Cert *)((stx)->certs ? (SCHEME_RPAIRP((stx)->certs) ? SCHEME_CAR((stx)->certs) : (stx)->certs) : NULL))
|
||||||
#define INACTIVE_CERTS(stx) ((Scheme_Cert *)((stx)->certs ? (SCHEME_PAIRP((stx)->certs) ? SCHEME_CDR((stx)->certs) : NULL) : NULL))
|
#define INACTIVE_CERTS(stx) ((Scheme_Cert *)((stx)->certs ? (SCHEME_RPAIRP((stx)->certs) ? SCHEME_CDR((stx)->certs) : NULL) : NULL))
|
||||||
static Scheme_Object *stx_activate_certs(Scheme_Object *o, Scheme_Cert **cp, Scheme_Hash_Table **ht);
|
static Scheme_Object *stx_activate_certs(Scheme_Object *o, Scheme_Cert **cp, Scheme_Hash_Table **ht);
|
||||||
|
|
||||||
#define SCHEME_RENAME_LEN(vec) ((SCHEME_VEC_SIZE(vec) - 2) >> 1)
|
#define SCHEME_RENAME_LEN(vec) ((SCHEME_VEC_SIZE(vec) - 2) >> 1)
|
||||||
|
@ -210,6 +213,7 @@ static Module_Renames *krn;
|
||||||
to sub-syntax. */
|
to sub-syntax. */
|
||||||
|
|
||||||
#define IS_POSMARK(x) (SCHEME_INTP(x) ? (SCHEME_INT_VAL(x) >= 0) : SCHEME_BIGPOS(x))
|
#define IS_POSMARK(x) (SCHEME_INTP(x) ? (SCHEME_INT_VAL(x) >= 0) : SCHEME_BIGPOS(x))
|
||||||
|
#define SCHEME_MARKP(x) (SCHEME_INTP(x) || SCHEME_BIGNUMP(x))
|
||||||
|
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
/* wrap chunks */
|
/* wrap chunks */
|
||||||
|
@ -509,7 +513,7 @@ void scheme_init_stx(Scheme_Env *env)
|
||||||
REGISTER_SO(than_id_marks_ht);
|
REGISTER_SO(than_id_marks_ht);
|
||||||
|
|
||||||
REGISTER_SO(no_nested_inactive_certs);
|
REGISTER_SO(no_nested_inactive_certs);
|
||||||
no_nested_inactive_certs = scheme_make_pair(NULL, NULL);
|
no_nested_inactive_certs = scheme_make_raw_pair(NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
|
@ -1061,6 +1065,7 @@ Scheme_Object *scheme_make_module_rename(long phase, int kind, Scheme_Hash_Table
|
||||||
mr->phase = phase;
|
mr->phase = phase;
|
||||||
mr->kind = kind;
|
mr->kind = kind;
|
||||||
mr->marked_names = marked_names;
|
mr->marked_names = marked_names;
|
||||||
|
mr->unmarshal_info = scheme_null;
|
||||||
|
|
||||||
if (!krn) {
|
if (!krn) {
|
||||||
REGISTER_SO(krn);
|
REGISTER_SO(krn);
|
||||||
|
@ -1084,7 +1089,8 @@ void scheme_extend_module_rename(Scheme_Object *mrn,
|
||||||
Scheme_Object *exname, /* name in definition context */
|
Scheme_Object *exname, /* name in definition context */
|
||||||
Scheme_Object *nominal_mod, /* nominal source module */
|
Scheme_Object *nominal_mod, /* nominal source module */
|
||||||
Scheme_Object *nominal_ex, /* nominal import before local renaming */
|
Scheme_Object *nominal_ex, /* nominal import before local renaming */
|
||||||
int mod_phase) /* phase of source defn */
|
int mod_phase, /* phase of source defn */
|
||||||
|
int unmarshal_drop) /* 1 => can be reconstructed from unmarshal info */
|
||||||
{
|
{
|
||||||
Scheme_Object *elem;
|
Scheme_Object *elem;
|
||||||
|
|
||||||
|
@ -1115,23 +1121,53 @@ void scheme_extend_module_rename(Scheme_Object *mrn,
|
||||||
elem = CONS(modname, elem);
|
elem = CONS(modname, elem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (unmarshal_drop) {
|
||||||
|
if (!((Module_Renames *)mrn)->nomarshal_ht) {
|
||||||
|
Scheme_Hash_Table *ht;
|
||||||
|
ht = scheme_make_hash_table(SCHEME_hash_ptr);
|
||||||
|
((Module_Renames *)mrn)->nomarshal_ht = ht;
|
||||||
|
}
|
||||||
|
scheme_hash_set(((Module_Renames *)mrn)->nomarshal_ht, localname, elem);
|
||||||
|
} else
|
||||||
scheme_hash_set(((Module_Renames *)mrn)->ht, localname, elem);
|
scheme_hash_set(((Module_Renames *)mrn)->ht, localname, elem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void scheme_save_module_rename_unmarshal(Scheme_Object *rn, Scheme_Object *info)
|
||||||
|
{
|
||||||
|
Scheme_Object *l;
|
||||||
|
|
||||||
|
l = scheme_make_pair(info, ((Module_Renames *)rn)->unmarshal_info);
|
||||||
|
((Module_Renames *)rn)->unmarshal_info = l;
|
||||||
|
}
|
||||||
|
|
||||||
static void do_append_module_rename(Scheme_Object *src, Scheme_Object *dest,
|
static void do_append_module_rename(Scheme_Object *src, Scheme_Object *dest,
|
||||||
Scheme_Object *old_midx, Scheme_Object *new_midx)
|
Scheme_Object *old_midx, Scheme_Object *new_midx)
|
||||||
{
|
{
|
||||||
Scheme_Hash_Table *ht, *hts;
|
Scheme_Hash_Table *ht, *hts, *drop_ht;
|
||||||
Scheme_Object *v;
|
Scheme_Object *v;
|
||||||
int i;
|
int i, t;
|
||||||
|
|
||||||
if (((Module_Renames *)src)->plus_kernel) {
|
if (((Module_Renames *)src)->plus_kernel) {
|
||||||
((Module_Renames *)dest)->plus_kernel = 1;
|
((Module_Renames *)dest)->plus_kernel = 1;
|
||||||
((Module_Renames *)dest)->plus_kernel_nominal_source = ((Module_Renames *)src)->plus_kernel_nominal_source;
|
((Module_Renames *)dest)->plus_kernel_nominal_source = ((Module_Renames *)src)->plus_kernel_nominal_source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (t = 0; t < 2; t++) {
|
||||||
|
if (!t) {
|
||||||
ht = ((Module_Renames *)dest)->ht;
|
ht = ((Module_Renames *)dest)->ht;
|
||||||
hts = ((Module_Renames *)src)->ht;
|
hts = ((Module_Renames *)src)->ht;
|
||||||
|
drop_ht = ((Module_Renames *)dest)->nomarshal_ht;
|
||||||
|
} else {
|
||||||
|
hts = ((Module_Renames *)src)->nomarshal_ht;
|
||||||
|
if (!hts)
|
||||||
|
break;
|
||||||
|
ht = ((Module_Renames *)dest)->nomarshal_ht;
|
||||||
|
if (!ht) {
|
||||||
|
ht = scheme_make_hash_table(SCHEME_hash_ptr);
|
||||||
|
((Module_Renames *)dest)->nomarshal_ht = ht;
|
||||||
|
}
|
||||||
|
drop_ht = ((Module_Renames *)dest)->ht;
|
||||||
|
}
|
||||||
|
|
||||||
/* Mappings in src overwrite mappings in dest: */
|
/* Mappings in src overwrite mappings in dest: */
|
||||||
|
|
||||||
|
@ -1174,6 +1210,9 @@ static void do_append_module_rename(Scheme_Object *src, Scheme_Object *dest,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
scheme_hash_set(ht, hts->keys[i], v);
|
scheme_hash_set(ht, hts->keys[i], v);
|
||||||
|
if (drop_ht)
|
||||||
|
scheme_hash_set(drop_ht, hts->keys[i], NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1204,21 +1243,31 @@ void scheme_remove_module_rename(Scheme_Object *mrn,
|
||||||
Scheme_Object *localname)
|
Scheme_Object *localname)
|
||||||
{
|
{
|
||||||
scheme_hash_set(((Module_Renames *)mrn)->ht, localname, NULL);
|
scheme_hash_set(((Module_Renames *)mrn)->ht, localname, NULL);
|
||||||
|
if (((Module_Renames *)mrn)->nomarshal_ht)
|
||||||
|
scheme_hash_set(((Module_Renames *)mrn)->nomarshal_ht, localname, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void scheme_list_module_rename(Scheme_Object *src, Scheme_Hash_Table *ht)
|
void scheme_list_module_rename(Scheme_Object *src, Scheme_Hash_Table *ht)
|
||||||
{
|
{
|
||||||
/* Put every name mapped by src into ht: */
|
/* Put every name mapped by src into ht: */
|
||||||
Scheme_Hash_Table *hts;
|
Scheme_Hash_Table *hts;
|
||||||
int i;
|
int i, t;
|
||||||
|
|
||||||
|
for (t = 0; t < 2; t++) {
|
||||||
|
if (!t)
|
||||||
hts = ((Module_Renames *)src)->ht;
|
hts = ((Module_Renames *)src)->ht;
|
||||||
|
else {
|
||||||
|
hts = ((Module_Renames *)src)->nomarshal_ht;
|
||||||
|
if (!hts)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = hts->size; i--; ) {
|
for (i = hts->size; i--; ) {
|
||||||
if (hts->vals[i]) {
|
if (hts->vals[i]) {
|
||||||
scheme_hash_set(ht, hts->keys[i], scheme_false);
|
scheme_hash_set(ht, hts->keys[i], scheme_false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (((Module_Renames *)src)->plus_kernel) {
|
if (((Module_Renames *)src)->plus_kernel) {
|
||||||
scheme_list_module_rename((Scheme_Object *)krn, ht);
|
scheme_list_module_rename((Scheme_Object *)krn, ht);
|
||||||
|
@ -1243,9 +1292,23 @@ Scheme_Object *scheme_stx_to_rename(Scheme_Object *stx)
|
||||||
Scheme_Object *scheme_stx_shift_rename(Scheme_Object *mrn,
|
Scheme_Object *scheme_stx_shift_rename(Scheme_Object *mrn,
|
||||||
Scheme_Object *old_midx, Scheme_Object *new_midx)
|
Scheme_Object *old_midx, Scheme_Object *new_midx)
|
||||||
{
|
{
|
||||||
Scheme_Object *nmrn;
|
Scheme_Object *nmrn, *a, *l, *nl;
|
||||||
|
|
||||||
nmrn = scheme_make_module_rename(0, mzMOD_RENAME_NORMAL, NULL);
|
nmrn = scheme_make_module_rename(0, mzMOD_RENAME_NORMAL, NULL);
|
||||||
do_append_module_rename(mrn, nmrn, old_midx, new_midx);
|
do_append_module_rename(mrn, nmrn, old_midx, new_midx);
|
||||||
|
|
||||||
|
/* Shift each mark_info: */
|
||||||
|
l = ((Module_Renames *)mrn)->unmarshal_info;
|
||||||
|
nl = scheme_null;
|
||||||
|
while (!SCHEME_NULLP(l)) {
|
||||||
|
a = SCHEME_CAR(l);
|
||||||
|
nl = scheme_make_pair(scheme_make_pair(scheme_modidx_shift(SCHEME_CAR(a), old_midx, new_midx),
|
||||||
|
SCHEME_CDR(a)),
|
||||||
|
nl);
|
||||||
|
l = SCHEME_CDR(l);
|
||||||
|
}
|
||||||
|
((Module_Renames *)nmrn)->unmarshal_info = nl;
|
||||||
|
|
||||||
return nmrn;
|
return nmrn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1254,6 +1317,18 @@ Scheme_Hash_Table *scheme_module_rename_marked_names(Scheme_Object *rn)
|
||||||
return ((Module_Renames *)rn)->marked_names;
|
return ((Module_Renames *)rn)->marked_names;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void unmarshal_rename(Module_Renames *mrn,
|
||||||
|
Scheme_Object *modidx_shift_from, Scheme_Object *modidx_shift_to)
|
||||||
|
{
|
||||||
|
Scheme_Object *l;
|
||||||
|
|
||||||
|
mrn->needs_unmarshal = 0;
|
||||||
|
for (l = mrn->unmarshal_info; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) {
|
||||||
|
scheme_do_module_rename_unmarshal((Scheme_Object *)mrn, SCHEME_CAR(l),
|
||||||
|
modidx_shift_from, modidx_shift_to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/******************** wrap manipulations ********************/
|
/******************** wrap manipulations ********************/
|
||||||
|
|
||||||
Scheme_Object *scheme_add_rename(Scheme_Object *o, Scheme_Object *rename)
|
Scheme_Object *scheme_add_rename(Scheme_Object *o, Scheme_Object *rename)
|
||||||
|
@ -1436,7 +1511,7 @@ static void phase_shift_certs(Scheme_Object *o, Scheme_Object *owner_wraps, int
|
||||||
}
|
}
|
||||||
|
|
||||||
if (icerts) {
|
if (icerts) {
|
||||||
nc = scheme_make_pair((Scheme_Object *)acerts, (Scheme_Object *)icerts);
|
nc = scheme_make_raw_pair((Scheme_Object *)acerts, (Scheme_Object *)icerts);
|
||||||
} else
|
} else
|
||||||
nc = (Scheme_Object *)acerts;
|
nc = (Scheme_Object *)acerts;
|
||||||
|
|
||||||
|
@ -1788,7 +1863,7 @@ static void make_mapped(Scheme_Cert *cert)
|
||||||
|
|
||||||
ht = scheme_make_hash_table_equal();
|
ht = scheme_make_hash_table_equal();
|
||||||
|
|
||||||
pr = scheme_make_pair((Scheme_Object *)ht, (Scheme_Object *)stop);
|
pr = scheme_make_raw_pair((Scheme_Object *)ht, (Scheme_Object *)stop);
|
||||||
cert->mapped = pr;
|
cert->mapped = pr;
|
||||||
|
|
||||||
for (; cert != stop; cert = cert->next) {
|
for (; cert != stop; cert = cert->next) {
|
||||||
|
@ -1855,7 +1930,7 @@ static Scheme_Object *add_certs(Scheme_Object *o, Scheme_Cert *certs, Scheme_Obj
|
||||||
if (active)
|
if (active)
|
||||||
res->certs = (Scheme_Object *)certs;
|
res->certs = (Scheme_Object *)certs;
|
||||||
else {
|
else {
|
||||||
pr = scheme_make_pair(NULL, (Scheme_Object *)certs);
|
pr = scheme_make_raw_pair(NULL, (Scheme_Object *)certs);
|
||||||
res->certs = pr;
|
res->certs = pr;
|
||||||
}
|
}
|
||||||
return (Scheme_Object *)res;
|
return (Scheme_Object *)res;
|
||||||
|
@ -1878,10 +1953,10 @@ static Scheme_Object *add_certs(Scheme_Object *o, Scheme_Cert *certs, Scheme_Obj
|
||||||
res->wraps = stx->wraps;
|
res->wraps = stx->wraps;
|
||||||
res->u.lazy_prefix = stx->u.lazy_prefix;
|
res->u.lazy_prefix = stx->u.lazy_prefix;
|
||||||
if (!active) {
|
if (!active) {
|
||||||
pr = scheme_make_pair((Scheme_Object *)ACTIVE_CERTS(stx), (Scheme_Object *)orig_certs);
|
pr = scheme_make_raw_pair((Scheme_Object *)ACTIVE_CERTS(stx), (Scheme_Object *)orig_certs);
|
||||||
res->certs = pr;
|
res->certs = pr;
|
||||||
} else if (stx->certs && SCHEME_PAIRP(stx->certs)) {
|
} else if (stx->certs && SCHEME_RPAIRP(stx->certs)) {
|
||||||
pr = scheme_make_pair((Scheme_Object *)orig_certs, SCHEME_CDR(stx->certs));
|
pr = scheme_make_raw_pair((Scheme_Object *)orig_certs, SCHEME_CDR(stx->certs));
|
||||||
res->certs = pr;
|
res->certs = pr;
|
||||||
} else
|
} else
|
||||||
res->certs = (Scheme_Object *)orig_certs;
|
res->certs = (Scheme_Object *)orig_certs;
|
||||||
|
@ -1893,7 +1968,7 @@ static Scheme_Object *add_certs(Scheme_Object *o, Scheme_Cert *certs, Scheme_Obj
|
||||||
now_certs = cl;
|
now_certs = cl;
|
||||||
if (!active) {
|
if (!active) {
|
||||||
SCHEME_CDR(stx->certs) = (Scheme_Object *)cl;
|
SCHEME_CDR(stx->certs) = (Scheme_Object *)cl;
|
||||||
} else if (stx->certs && SCHEME_PAIRP(stx->certs))
|
} else if (stx->certs && SCHEME_RPAIRP(stx->certs))
|
||||||
SCHEME_CAR(stx->certs) = (Scheme_Object *)cl;
|
SCHEME_CAR(stx->certs) = (Scheme_Object *)cl;
|
||||||
else
|
else
|
||||||
stx->certs = (Scheme_Object *)cl;
|
stx->certs = (Scheme_Object *)cl;
|
||||||
|
@ -1977,15 +2052,15 @@ Scheme_Object *scheme_stx_cert(Scheme_Object *o, Scheme_Object *mark, Scheme_Env
|
||||||
menv->module->insp, key, cert);
|
menv->module->insp, key, cert);
|
||||||
|
|
||||||
if (active) {
|
if (active) {
|
||||||
if (stx->certs && SCHEME_PAIRP(stx->certs)) {
|
if (stx->certs && SCHEME_RPAIRP(stx->certs)) {
|
||||||
Scheme_Object *pr;
|
Scheme_Object *pr;
|
||||||
pr = scheme_make_pair((Scheme_Object *)cert, SCHEME_CDR(stx->certs));
|
pr = scheme_make_raw_pair((Scheme_Object *)cert, SCHEME_CDR(stx->certs));
|
||||||
res->certs = pr;
|
res->certs = pr;
|
||||||
} else
|
} else
|
||||||
res->certs = (Scheme_Object *)cert;
|
res->certs = (Scheme_Object *)cert;
|
||||||
} else {
|
} else {
|
||||||
Scheme_Object *pr;
|
Scheme_Object *pr;
|
||||||
pr = scheme_make_pair((Scheme_Object *)ACTIVE_CERTS(stx), (Scheme_Object *)cert);
|
pr = scheme_make_raw_pair((Scheme_Object *)ACTIVE_CERTS(stx), (Scheme_Object *)cert);
|
||||||
res->certs = pr;
|
res->certs = pr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2250,7 +2325,7 @@ static Scheme_Object *stx_activate_certs(Scheme_Object *o, Scheme_Cert **cp, Sch
|
||||||
stx->props);
|
stx->props);
|
||||||
res->wraps = stx->wraps;
|
res->wraps = stx->wraps;
|
||||||
res->u.lazy_prefix = stx->u.lazy_prefix;
|
res->u.lazy_prefix = stx->u.lazy_prefix;
|
||||||
np = scheme_make_pair(SCHEME_CAR(stx->certs), NULL);
|
np = scheme_make_raw_pair(SCHEME_CAR(stx->certs), NULL);
|
||||||
res->certs = np;
|
res->certs = np;
|
||||||
|
|
||||||
cc = *cp;
|
cc = *cp;
|
||||||
|
@ -2261,7 +2336,7 @@ static Scheme_Object *stx_activate_certs(Scheme_Object *o, Scheme_Cert **cp, Sch
|
||||||
*cp = cc;
|
*cp = cc;
|
||||||
|
|
||||||
return (Scheme_Object *)res;
|
return (Scheme_Object *)res;
|
||||||
} else if (stx->certs && SCHEME_PAIRP(stx->certs)) {
|
} else if (stx->certs && SCHEME_RPAIRP(stx->certs)) {
|
||||||
/* Explicit pair but NULL for inactive certs means no
|
/* Explicit pair but NULL for inactive certs means no
|
||||||
inactive certs anywhere in this object. */
|
inactive certs anywhere in this object. */
|
||||||
return (Scheme_Object *)stx;
|
return (Scheme_Object *)stx;
|
||||||
|
@ -2312,7 +2387,7 @@ static Scheme_Object *stx_activate_certs(Scheme_Object *o, Scheme_Cert **cp, Sch
|
||||||
that there are no nested certs here */
|
that there are no nested certs here */
|
||||||
if (stx->certs) {
|
if (stx->certs) {
|
||||||
Scheme_Object *np;
|
Scheme_Object *np;
|
||||||
np = scheme_make_pair(stx->certs, NULL);
|
np = scheme_make_raw_pair(stx->certs, NULL);
|
||||||
res->certs = np;
|
res->certs = np;
|
||||||
} else
|
} else
|
||||||
res->certs = no_nested_inactive_certs;
|
res->certs = no_nested_inactive_certs;
|
||||||
|
@ -2327,7 +2402,7 @@ static Scheme_Object *stx_activate_certs(Scheme_Object *o, Scheme_Cert **cp, Sch
|
||||||
/* Record the absence of certificates in sub-parts: */
|
/* Record the absence of certificates in sub-parts: */
|
||||||
if (stx->certs) {
|
if (stx->certs) {
|
||||||
Scheme_Object *np;
|
Scheme_Object *np;
|
||||||
np = scheme_make_pair(stx->certs, NULL);
|
np = scheme_make_raw_pair(stx->certs, NULL);
|
||||||
stx->certs = np;
|
stx->certs = np;
|
||||||
} else
|
} else
|
||||||
stx->certs = no_nested_inactive_certs;
|
stx->certs = no_nested_inactive_certs;
|
||||||
|
@ -2609,12 +2684,17 @@ static Scheme_Object *resolve_env(Scheme_Object *a, long phase,
|
||||||
if (phase == mrn->phase) {
|
if (phase == mrn->phase) {
|
||||||
Scheme_Object *rename, *nominal = NULL, *glob_id;
|
Scheme_Object *rename, *nominal = NULL, *glob_id;
|
||||||
|
|
||||||
|
if (mrn->needs_unmarshal)
|
||||||
|
unmarshal_rename(mrn, modidx_shift_from, modidx_shift_to);
|
||||||
|
|
||||||
if (mrn->marked_names)
|
if (mrn->marked_names)
|
||||||
glob_id = scheme_tl_id_sym((Scheme_Env *)mrn->marked_names, a, 0);
|
glob_id = scheme_tl_id_sym((Scheme_Env *)mrn->marked_names, a, 0);
|
||||||
else
|
else
|
||||||
glob_id = SCHEME_STX_VAL(a);
|
glob_id = SCHEME_STX_VAL(a);
|
||||||
|
|
||||||
rename = scheme_hash_get(mrn->ht, glob_id);
|
rename = scheme_hash_get(mrn->ht, glob_id);
|
||||||
|
if (!rename && mrn->nomarshal_ht)
|
||||||
|
rename = scheme_hash_get(mrn->nomarshal_ht, glob_id);
|
||||||
if (!rename && mrn->plus_kernel) {
|
if (!rename && mrn->plus_kernel) {
|
||||||
rename = scheme_hash_get(krn->ht, glob_id);
|
rename = scheme_hash_get(krn->ht, glob_id);
|
||||||
nominal = mrn->plus_kernel_nominal_source;
|
nominal = mrn->plus_kernel_nominal_source;
|
||||||
|
@ -2841,6 +2921,7 @@ static Scheme_Object *get_module_src_name(Scheme_Object *a, long phase)
|
||||||
WRAP_POS wraps;
|
WRAP_POS wraps;
|
||||||
Scheme_Object *result;
|
Scheme_Object *result;
|
||||||
int is_in_module = 0, skip_other_mods = 0;
|
int is_in_module = 0, skip_other_mods = 0;
|
||||||
|
long orig_phase = phase;
|
||||||
|
|
||||||
if (((Scheme_Stx *)a)->u.modinfo_cache)
|
if (((Scheme_Stx *)a)->u.modinfo_cache)
|
||||||
return ((Scheme_Stx *)a)->u.modinfo_cache;
|
return ((Scheme_Stx *)a)->u.modinfo_cache;
|
||||||
|
@ -2868,12 +2949,20 @@ static Scheme_Object *get_module_src_name(Scheme_Object *a, long phase)
|
||||||
/* Module rename: */
|
/* Module rename: */
|
||||||
Scheme_Object *rename, *glob_id;
|
Scheme_Object *rename, *glob_id;
|
||||||
|
|
||||||
|
if (mrn->needs_unmarshal) {
|
||||||
|
/* Use resolve_env to trigger unmarshal, so that we
|
||||||
|
don't have to implement top/from shifts here: */
|
||||||
|
resolve_env(a, orig_phase, 1, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
if (mrn->marked_names)
|
if (mrn->marked_names)
|
||||||
glob_id = scheme_tl_id_sym((Scheme_Env *)mrn->marked_names, a, 0);
|
glob_id = scheme_tl_id_sym((Scheme_Env *)mrn->marked_names, a, 0);
|
||||||
else
|
else
|
||||||
glob_id = SCHEME_STX_VAL(a);
|
glob_id = SCHEME_STX_VAL(a);
|
||||||
|
|
||||||
rename = scheme_hash_get(mrn->ht, glob_id);
|
rename = scheme_hash_get(mrn->ht, glob_id);
|
||||||
|
if (!rename && mrn->nomarshal_ht)
|
||||||
|
rename = scheme_hash_get(mrn->nomarshal_ht, glob_id);
|
||||||
if (!rename && mrn->plus_kernel)
|
if (!rename && mrn->plus_kernel)
|
||||||
rename = scheme_hash_get(krn->ht, glob_id);
|
rename = scheme_hash_get(krn->ht, glob_id);
|
||||||
|
|
||||||
|
@ -3715,10 +3804,7 @@ static Scheme_Object *wraps_to_datum(Scheme_Object *w_in,
|
||||||
int i, j, count = 0;
|
int i, j, count = 0;
|
||||||
Scheme_Object *l, *idi;
|
Scheme_Object *l, *idi;
|
||||||
|
|
||||||
for (i = mrn->ht->size; i--; ) {
|
count = mrn->ht->mcount;
|
||||||
if (mrn->ht->vals[i])
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
l = scheme_make_vector(count * 2, NULL);
|
l = scheme_make_vector(count * 2, NULL);
|
||||||
|
|
||||||
|
@ -3761,6 +3847,9 @@ static Scheme_Object *wraps_to_datum(Scheme_Object *w_in,
|
||||||
} else
|
} else
|
||||||
l = CONS(l, scheme_null);
|
l = CONS(l, scheme_null);
|
||||||
|
|
||||||
|
if (SCHEME_PAIRP(mrn->unmarshal_info))
|
||||||
|
l = CONS(mrn->unmarshal_info, l);
|
||||||
|
|
||||||
l = CONS((mrn->kind == mzMOD_RENAME_MARKED) ? scheme_true : scheme_false, l);
|
l = CONS((mrn->kind == mzMOD_RENAME_MARKED) ? scheme_true : scheme_false, l);
|
||||||
l = CONS(scheme_make_integer(mrn->phase), l);
|
l = CONS(scheme_make_integer(mrn->phase), l);
|
||||||
if (mrn->plus_kernel) {
|
if (mrn->plus_kernel) {
|
||||||
|
@ -4204,8 +4293,8 @@ static Scheme_Object *datum_to_wraps(Scheme_Object *w,
|
||||||
scheme_hash_set(rns, local_key, a);
|
scheme_hash_set(rns, local_key, a);
|
||||||
} else if (SCHEME_PAIRP(a)) {
|
} else if (SCHEME_PAIRP(a)) {
|
||||||
/* A rename table:
|
/* A rename table:
|
||||||
- ([#t] <index-num> <bool> <phase-num> #(<table-elem> ...)
|
- ([#t] <index-num> <phase-num> <bool> [unmarshal] #(<table-elem> ...)
|
||||||
. ((<sym> (<marked-list> . <target-gensym>) ...) ...)) ; <- marked_names
|
. ((<sym> (<marked-list-or-mark> . <target-gensym>) ...) ...)) ; <- marked_names
|
||||||
where a <table-elem> is actually two values, one of:
|
where a <table-elem> is actually two values, one of:
|
||||||
- <exname> <modname>
|
- <exname> <modname>
|
||||||
- <exname> (<modname> . <defname>)
|
- <exname> (<modname> . <defname>)
|
||||||
|
@ -4248,6 +4337,46 @@ static Scheme_Object *datum_to_wraps(Scheme_Object *w,
|
||||||
mns = SCHEME_CDR(a);
|
mns = SCHEME_CDR(a);
|
||||||
a = SCHEME_CAR(a);
|
a = SCHEME_CAR(a);
|
||||||
|
|
||||||
|
if (!SCHEME_VECTORP(a)) {
|
||||||
|
/* Unmarshall info: */
|
||||||
|
Scheme_Object *ml = a, *mli;
|
||||||
|
while (SCHEME_PAIRP(ml)) {
|
||||||
|
mli = SCHEME_CAR(ml);
|
||||||
|
if (!SCHEME_PAIRP(mli)) return NULL;
|
||||||
|
|
||||||
|
/* A module path index: */
|
||||||
|
p = SCHEME_CAR(mli);
|
||||||
|
if (!(SCHEME_SYMBOLP(p)
|
||||||
|
|| SAME_TYPE(SCHEME_TYPE(p), scheme_module_index_type)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
mli = SCHEME_CDR(mli);
|
||||||
|
if (!SCHEME_PAIRP(mli)) return NULL;
|
||||||
|
/* A list of symbols: */
|
||||||
|
p = SCHEME_CAR(mli);
|
||||||
|
while (SCHEME_PAIRP(p)) {
|
||||||
|
if (!SCHEME_SYMBOLP(SCHEME_CAR(p))) return NULL;
|
||||||
|
p = SCHEME_CDR(p);
|
||||||
|
}
|
||||||
|
if (!SCHEME_NULLP(p)) return NULL;
|
||||||
|
|
||||||
|
/* #f or a symbol: */
|
||||||
|
p = SCHEME_CDR(mli);
|
||||||
|
if (!SCHEME_SYMBOLP(p) && !SCHEME_FALSEP(p)) return NULL;
|
||||||
|
|
||||||
|
ml = SCHEME_CDR(ml);
|
||||||
|
}
|
||||||
|
if (!SCHEME_NULLP(ml)) return NULL;
|
||||||
|
|
||||||
|
mrn->unmarshal_info = a;
|
||||||
|
if (SCHEME_PAIRP(a))
|
||||||
|
mrn->needs_unmarshal = 1;
|
||||||
|
|
||||||
|
if (!SCHEME_PAIRP(mns)) return NULL;
|
||||||
|
a = SCHEME_CAR(mns);
|
||||||
|
mns = SCHEME_CDR(mns);
|
||||||
|
}
|
||||||
|
|
||||||
if (!SCHEME_VECTORP(a)) return_NULL;
|
if (!SCHEME_VECTORP(a)) return_NULL;
|
||||||
count = SCHEME_VEC_SIZE(a);
|
count = SCHEME_VEC_SIZE(a);
|
||||||
if (count & 0x1) return_NULL;
|
if (count & 0x1) return_NULL;
|
||||||
|
@ -4312,7 +4441,11 @@ static Scheme_Object *datum_to_wraps(Scheme_Object *w,
|
||||||
|
|
||||||
kfirst = scheme_null;
|
kfirst = scheme_null;
|
||||||
klast = NULL;
|
klast = NULL;
|
||||||
for (a = SCHEME_CAR(a); SCHEME_PAIRP(a); a = SCHEME_CDR(a)) {
|
a = SCHEME_CAR(a);
|
||||||
|
if (SCHEME_MARKP(a)) {
|
||||||
|
kfirst = unmarshal_mark(a, rns);
|
||||||
|
} else {
|
||||||
|
for (; SCHEME_PAIRP(a); a = SCHEME_CDR(a)) {
|
||||||
kp = CONS(unmarshal_mark(SCHEME_CAR(a), rns), scheme_null);
|
kp = CONS(unmarshal_mark(SCHEME_CAR(a), rns), scheme_null);
|
||||||
if (!klast)
|
if (!klast)
|
||||||
kfirst = kp;
|
kfirst = kp;
|
||||||
|
@ -4321,6 +4454,7 @@ static Scheme_Object *datum_to_wraps(Scheme_Object *w,
|
||||||
klast = kp;
|
klast = kp;
|
||||||
}
|
}
|
||||||
if (!SCHEME_NULLP(a)) return_NULL;
|
if (!SCHEME_NULLP(a)) return_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ll = CONS(CONS(kfirst, kkey), ll);
|
ll = CONS(CONS(kfirst, kkey), ll);
|
||||||
}
|
}
|
||||||
|
@ -4618,7 +4752,7 @@ static Scheme_Object *datum_to_syntax_inner(Scheme_Object *o,
|
||||||
Scheme_Object *icerts;
|
Scheme_Object *icerts;
|
||||||
certs = cert_marks_to_certs(SCHEME_CAR(cert_marks), stx_wraps, &bad);
|
certs = cert_marks_to_certs(SCHEME_CAR(cert_marks), stx_wraps, &bad);
|
||||||
icerts = cert_marks_to_certs(SCHEME_CDR(cert_marks), stx_wraps, &bad);
|
icerts = cert_marks_to_certs(SCHEME_CDR(cert_marks), stx_wraps, &bad);
|
||||||
certs = scheme_make_pair(certs, icerts);
|
certs = scheme_make_raw_pair(certs, icerts);
|
||||||
} else {
|
} else {
|
||||||
/* Just active certs */
|
/* Just active certs */
|
||||||
certs = cert_marks_to_certs(cert_marks, stx_wraps, &bad);
|
certs = cert_marks_to_certs(cert_marks, stx_wraps, &bad);
|
||||||
|
@ -4821,9 +4955,9 @@ static void simplify_syntax_inner(Scheme_Object *o,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!i) {
|
if (!i) {
|
||||||
if (SCHEME_PAIRP(stx->certs)) {
|
if (SCHEME_RPAIRP(stx->certs)) {
|
||||||
Scheme_Object *pr;
|
Scheme_Object *pr;
|
||||||
pr = scheme_make_pair((Scheme_Object *)result, SCHEME_CDR(stx->certs));
|
pr = scheme_make_raw_pair((Scheme_Object *)result, SCHEME_CDR(stx->certs));
|
||||||
stx->certs = pr;
|
stx->certs = pr;
|
||||||
} else
|
} else
|
||||||
stx->certs = (Scheme_Object *)result;
|
stx->certs = (Scheme_Object *)result;
|
||||||
|
@ -4832,7 +4966,7 @@ static void simplify_syntax_inner(Scheme_Object *o,
|
||||||
stx->certs = SCHEME_CAR(stx->certs);
|
stx->certs = SCHEME_CAR(stx->certs);
|
||||||
else {
|
else {
|
||||||
Scheme_Object *pr;
|
Scheme_Object *pr;
|
||||||
pr = scheme_make_pair(SCHEME_CAR(stx->certs), (Scheme_Object *)result);
|
pr = scheme_make_raw_pair(SCHEME_CAR(stx->certs), (Scheme_Object *)result);
|
||||||
stx->certs = pr;
|
stx->certs = pr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5464,14 +5598,14 @@ static Scheme_Object *syntax_recertify(int argc, Scheme_Object **argv)
|
||||||
res->wraps = stx->wraps;
|
res->wraps = stx->wraps;
|
||||||
res->u.lazy_prefix = stx->u.lazy_prefix;
|
res->u.lazy_prefix = stx->u.lazy_prefix;
|
||||||
|
|
||||||
if (!i && (!stx->certs || !SCHEME_PAIRP(stx->certs) || !SCHEME_CDR(stx->certs)))
|
if (!i && (!stx->certs || !SCHEME_RPAIRP(stx->certs) || !SCHEME_CDR(stx->certs)))
|
||||||
res->certs = (Scheme_Object *)new_certs;
|
res->certs = (Scheme_Object *)new_certs;
|
||||||
else {
|
else {
|
||||||
Scheme_Object *pr;
|
Scheme_Object *pr;
|
||||||
if (!i)
|
if (!i)
|
||||||
pr = scheme_make_pair((Scheme_Object *)new_certs, SCHEME_CDR(stx->certs));
|
pr = scheme_make_raw_pair((Scheme_Object *)new_certs, SCHEME_CDR(stx->certs));
|
||||||
else
|
else
|
||||||
pr = scheme_make_pair((Scheme_Object *)ACTIVE_CERTS(stx), (Scheme_Object *)new_certs);
|
pr = scheme_make_raw_pair((Scheme_Object *)ACTIVE_CERTS(stx), (Scheme_Object *)new_certs);
|
||||||
res->certs = pr;
|
res->certs = pr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,202 +17,204 @@ enum {
|
||||||
scheme_letrec_type, /* 12 */
|
scheme_letrec_type, /* 12 */
|
||||||
scheme_let_one_type, /* 13 */
|
scheme_let_one_type, /* 13 */
|
||||||
scheme_with_cont_mark_type, /* 14 */
|
scheme_with_cont_mark_type, /* 14 */
|
||||||
|
scheme_quote_syntax_type, /* 15 */
|
||||||
|
|
||||||
_scheme_values_types_, /* All following types are values */
|
_scheme_values_types_, /* All following types are values */
|
||||||
|
|
||||||
/* intermediate compiled: */
|
/* intermediate compiled: */
|
||||||
scheme_compiled_unclosed_procedure_type,/* 16 */
|
scheme_compiled_unclosed_procedure_type,/* 17 */
|
||||||
scheme_compiled_let_value_type, /* 17 */
|
scheme_compiled_let_value_type, /* 18 */
|
||||||
scheme_compiled_let_void_type, /* 18 */
|
scheme_compiled_let_void_type, /* 19 */
|
||||||
scheme_compiled_syntax_type, /* 19 */
|
scheme_compiled_syntax_type, /* 20 */
|
||||||
scheme_compiled_toplevel_type, /* 20 */
|
scheme_compiled_toplevel_type, /* 21 */
|
||||||
scheme_compiled_quote_syntax_type, /* 21 */
|
scheme_compiled_quote_syntax_type, /* 22 */
|
||||||
|
|
||||||
scheme_quote_compilation_type, /* used while writing, only */
|
scheme_quote_compilation_type, /* used while writing, only */
|
||||||
|
|
||||||
/* Registered in prefix table: */
|
/* Registered in prefix table: */
|
||||||
scheme_variable_type, /* 23 */
|
scheme_variable_type, /* 24 */
|
||||||
scheme_module_variable_type, /* link replaces with scheme_variable_type */
|
scheme_module_variable_type, /* link replaces with scheme_variable_type */
|
||||||
|
|
||||||
_scheme_compiled_values_types_, /* 25 */
|
_scheme_compiled_values_types_, /* 26 */
|
||||||
|
|
||||||
/* procedure types */
|
/* procedure types */
|
||||||
scheme_prim_type, /* 26 */
|
scheme_prim_type, /* 27 */
|
||||||
scheme_closed_prim_type, /* 27 */
|
scheme_closed_prim_type, /* 28 */
|
||||||
scheme_closure_type, /* 28 */
|
scheme_closure_type, /* 29 */
|
||||||
scheme_case_closure_type, /* 29 */
|
scheme_case_closure_type, /* 30 */
|
||||||
scheme_cont_type, /* 30 */
|
scheme_cont_type, /* 31 */
|
||||||
scheme_escaping_cont_type, /* 31 */
|
scheme_escaping_cont_type, /* 32 */
|
||||||
scheme_proc_struct_type, /* 32 */
|
scheme_proc_struct_type, /* 33 */
|
||||||
scheme_native_closure_type, /* 33 */
|
scheme_native_closure_type, /* 34 */
|
||||||
|
|
||||||
/* structure types (overlaps with procs) */
|
/* structure types (overlaps with procs) */
|
||||||
scheme_structure_type, /* 34 */
|
scheme_structure_type, /* 35 */
|
||||||
|
|
||||||
/* basic types */
|
/* basic types */
|
||||||
scheme_char_type, /* 35 */
|
scheme_char_type, /* 36 */
|
||||||
scheme_integer_type, /* 36 */
|
scheme_integer_type, /* 37 */
|
||||||
scheme_bignum_type, /* 37 */
|
scheme_bignum_type, /* 38 */
|
||||||
scheme_rational_type, /* 38 */
|
scheme_rational_type, /* 39 */
|
||||||
scheme_float_type, /* 39 */
|
scheme_float_type, /* 40 */
|
||||||
scheme_double_type, /* 40 */
|
scheme_double_type, /* 41 */
|
||||||
scheme_complex_izi_type, /* 41 */
|
scheme_complex_izi_type, /* 42 */
|
||||||
scheme_complex_type, /* 42 */
|
scheme_complex_type, /* 43 */
|
||||||
scheme_char_string_type, /* 43 */
|
scheme_char_string_type, /* 44 */
|
||||||
scheme_byte_string_type, /* 44 */
|
scheme_byte_string_type, /* 45 */
|
||||||
scheme_path_type, /* 45 */
|
scheme_path_type, /* 46 */
|
||||||
scheme_symbol_type, /* 46 */
|
scheme_symbol_type, /* 47 */
|
||||||
scheme_keyword_type, /* 47 */
|
scheme_keyword_type, /* 48 */
|
||||||
scheme_null_type, /* 48 */
|
scheme_null_type, /* 49 */
|
||||||
scheme_pair_type, /* 49 */
|
scheme_pair_type, /* 50 */
|
||||||
scheme_vector_type, /* 50 */
|
scheme_vector_type, /* 51 */
|
||||||
scheme_inspector_type, /* 51 */
|
scheme_inspector_type, /* 52 */
|
||||||
scheme_input_port_type, /* 52 */
|
scheme_input_port_type, /* 53 */
|
||||||
scheme_output_port_type, /* 53 */
|
scheme_output_port_type, /* 54 */
|
||||||
scheme_eof_type, /* 54 */
|
scheme_eof_type, /* 55 */
|
||||||
scheme_true_type, /* 55 */
|
scheme_true_type, /* 56 */
|
||||||
scheme_false_type, /* 56 */
|
scheme_false_type, /* 57 */
|
||||||
scheme_void_type, /* 57 */
|
scheme_void_type, /* 58 */
|
||||||
scheme_syntax_compiler_type, /* 58 */
|
scheme_syntax_compiler_type, /* 59 */
|
||||||
scheme_macro_type, /* 59 */
|
scheme_macro_type, /* 60 */
|
||||||
scheme_box_type, /* 60 */
|
scheme_box_type, /* 61 */
|
||||||
scheme_thread_type, /* 61 */
|
scheme_thread_type, /* 62 */
|
||||||
scheme_stx_offset_type, /* 62 */
|
scheme_stx_offset_type, /* 63 */
|
||||||
scheme_cont_mark_set_type, /* 63 */
|
scheme_cont_mark_set_type, /* 64 */
|
||||||
scheme_sema_type, /* 64 */
|
scheme_sema_type, /* 65 */
|
||||||
scheme_hash_table_type, /* 65 */
|
scheme_hash_table_type, /* 66 */
|
||||||
scheme_cpointer_type, /* 66 */
|
scheme_cpointer_type, /* 67 */
|
||||||
scheme_weak_box_type, /* 67 */
|
scheme_weak_box_type, /* 68 */
|
||||||
scheme_ephemeron_type, /* 68 */
|
scheme_ephemeron_type, /* 69 */
|
||||||
scheme_struct_type_type, /* 69 */
|
scheme_struct_type_type, /* 70 */
|
||||||
scheme_module_index_type, /* 70 */
|
scheme_module_index_type, /* 71 */
|
||||||
scheme_set_macro_type, /* 71 */
|
scheme_set_macro_type, /* 72 */
|
||||||
scheme_listener_type, /* 72 */
|
scheme_listener_type, /* 73 */
|
||||||
scheme_namespace_type, /* 73 */
|
scheme_namespace_type, /* 74 */
|
||||||
scheme_config_type, /* 74 */
|
scheme_config_type, /* 75 */
|
||||||
scheme_stx_type, /* 75 */
|
scheme_stx_type, /* 76 */
|
||||||
scheme_will_executor_type, /* 76 */
|
scheme_will_executor_type, /* 77 */
|
||||||
scheme_custodian_type, /* 77 */
|
scheme_custodian_type, /* 78 */
|
||||||
scheme_random_state_type, /* 78 */
|
scheme_random_state_type, /* 79 */
|
||||||
scheme_regexp_type, /* 79 */
|
scheme_regexp_type, /* 80 */
|
||||||
scheme_bucket_type, /* 80 */
|
scheme_bucket_type, /* 81 */
|
||||||
scheme_bucket_table_type, /* 81 */
|
scheme_bucket_table_type, /* 82 */
|
||||||
scheme_subprocess_type, /* 82 */
|
scheme_subprocess_type, /* 83 */
|
||||||
scheme_compilation_top_type, /* 83 */
|
scheme_compilation_top_type, /* 84 */
|
||||||
scheme_wrap_chunk_type, /* 84 */
|
scheme_wrap_chunk_type, /* 85 */
|
||||||
scheme_eval_waiting_type, /* 85 */
|
scheme_eval_waiting_type, /* 86 */
|
||||||
scheme_tail_call_waiting_type, /* 86 */
|
scheme_tail_call_waiting_type, /* 87 */
|
||||||
scheme_undefined_type, /* 87 */
|
scheme_undefined_type, /* 88 */
|
||||||
scheme_struct_property_type, /* 88 */
|
scheme_struct_property_type, /* 89 */
|
||||||
scheme_multiple_values_type, /* 89 */
|
scheme_multiple_values_type, /* 90 */
|
||||||
scheme_placeholder_type, /* 90 */
|
scheme_placeholder_type, /* 91 */
|
||||||
scheme_case_lambda_sequence_type, /* 91 */
|
scheme_case_lambda_sequence_type, /* 92 */
|
||||||
scheme_begin0_sequence_type, /* 92 */
|
scheme_begin0_sequence_type, /* 93 */
|
||||||
scheme_rename_table_type, /* 93 */
|
scheme_rename_table_type, /* 94 */
|
||||||
scheme_module_type, /* 94 */
|
scheme_module_type, /* 95 */
|
||||||
scheme_svector_type, /* 95 */
|
scheme_svector_type, /* 96 */
|
||||||
scheme_lazy_macro_type, /* 96 */
|
scheme_lazy_macro_type, /* 97 */
|
||||||
scheme_resolve_prefix_type, /* 97 */
|
scheme_resolve_prefix_type, /* 98 */
|
||||||
scheme_security_guard_type, /* 98 */
|
scheme_security_guard_type, /* 99 */
|
||||||
scheme_indent_type, /* 99 */
|
scheme_indent_type, /* 100 */
|
||||||
scheme_udp_type, /* 100 */
|
scheme_udp_type, /* 101 */
|
||||||
scheme_udp_evt_type, /* 101 */
|
scheme_udp_evt_type, /* 102 */
|
||||||
scheme_tcp_accept_evt_type, /* 102 */
|
scheme_tcp_accept_evt_type, /* 103 */
|
||||||
scheme_id_macro_type, /* 103 */
|
scheme_id_macro_type, /* 104 */
|
||||||
scheme_evt_set_type, /* 104 */
|
scheme_evt_set_type, /* 105 */
|
||||||
scheme_wrap_evt_type, /* 105 */
|
scheme_wrap_evt_type, /* 106 */
|
||||||
scheme_handle_evt_type, /* 106 */
|
scheme_handle_evt_type, /* 107 */
|
||||||
scheme_nack_guard_evt_type, /* 107 */
|
scheme_nack_guard_evt_type, /* 108 */
|
||||||
scheme_semaphore_repost_type, /* 108 */
|
scheme_semaphore_repost_type, /* 109 */
|
||||||
scheme_channel_type, /* 109 */
|
scheme_channel_type, /* 110 */
|
||||||
scheme_channel_put_type, /* 110 */
|
scheme_channel_put_type, /* 111 */
|
||||||
scheme_thread_resume_type, /* 111 */
|
scheme_thread_resume_type, /* 112 */
|
||||||
scheme_thread_suspend_type, /* 112 */
|
scheme_thread_suspend_type, /* 113 */
|
||||||
scheme_thread_dead_type, /* 113 */
|
scheme_thread_dead_type, /* 114 */
|
||||||
scheme_poll_evt_type, /* 114 */
|
scheme_poll_evt_type, /* 115 */
|
||||||
scheme_nack_evt_type, /* 115 */
|
scheme_nack_evt_type, /* 116 */
|
||||||
scheme_module_registry_type, /* 116 */
|
scheme_module_registry_type, /* 117 */
|
||||||
scheme_thread_set_type, /* 117 */
|
scheme_thread_set_type, /* 118 */
|
||||||
scheme_string_converter_type, /* 118 */
|
scheme_string_converter_type, /* 119 */
|
||||||
scheme_alarm_type, /* 119 */
|
scheme_alarm_type, /* 120 */
|
||||||
scheme_thread_cell_type, /* 120 */
|
scheme_thread_cell_type, /* 121 */
|
||||||
scheme_channel_syncer_type, /* 121 */
|
scheme_channel_syncer_type, /* 122 */
|
||||||
scheme_special_comment_type, /* 122 */
|
scheme_special_comment_type, /* 123 */
|
||||||
scheme_write_evt_type, /* 123 */
|
scheme_write_evt_type, /* 124 */
|
||||||
scheme_always_evt_type, /* 124 */
|
scheme_always_evt_type, /* 125 */
|
||||||
scheme_never_evt_type, /* 125 */
|
scheme_never_evt_type, /* 126 */
|
||||||
scheme_progress_evt_type, /* 126 */
|
scheme_progress_evt_type, /* 127 */
|
||||||
scheme_certifications_type, /* 127 */
|
scheme_certifications_type, /* 128 */
|
||||||
scheme_already_comp_type, /* 128 */
|
scheme_already_comp_type, /* 129 */
|
||||||
scheme_readtable_type, /* 129 */
|
scheme_readtable_type, /* 130 */
|
||||||
scheme_intdef_context_type, /* 130 */
|
scheme_intdef_context_type, /* 131 */
|
||||||
scheme_lexical_rib_type, /* 131 */
|
scheme_lexical_rib_type, /* 132 */
|
||||||
scheme_thread_cell_values_type, /* 132 */
|
scheme_thread_cell_values_type, /* 133 */
|
||||||
scheme_global_ref_type, /* 133 */
|
scheme_global_ref_type, /* 134 */
|
||||||
scheme_cont_mark_chain_type, /* 134 */
|
scheme_cont_mark_chain_type, /* 135 */
|
||||||
|
scheme_raw_pair_type, /* 136 */
|
||||||
|
|
||||||
#ifdef MZTAG_REQUIRED
|
#ifdef MZTAG_REQUIRED
|
||||||
_scheme_last_normal_type_, /* 135 */
|
_scheme_last_normal_type_, /* 137 */
|
||||||
|
|
||||||
scheme_rt_comp_env, /* 136 */
|
scheme_rt_comp_env, /* 138 */
|
||||||
scheme_rt_constant_binding, /* 137 */
|
scheme_rt_constant_binding, /* 139 */
|
||||||
scheme_rt_resolve_info, /* 138 */
|
scheme_rt_resolve_info, /* 140 */
|
||||||
scheme_rt_optimize_info, /* 139 */
|
scheme_rt_optimize_info, /* 141 */
|
||||||
scheme_rt_compile_info, /* 140 */
|
scheme_rt_compile_info, /* 142 */
|
||||||
scheme_rt_cont_mark, /* 141 */
|
scheme_rt_cont_mark, /* 143 */
|
||||||
scheme_rt_saved_stack, /* 142 */
|
scheme_rt_saved_stack, /* 144 */
|
||||||
scheme_rt_reply_item, /* 143 */
|
scheme_rt_reply_item, /* 145 */
|
||||||
scheme_rt_closure_info, /* 144 */
|
scheme_rt_closure_info, /* 146 */
|
||||||
scheme_rt_overflow, /* 145 */
|
scheme_rt_overflow, /* 147 */
|
||||||
scheme_rt_dyn_wind_cell, /* 146 */
|
scheme_rt_dyn_wind_cell, /* 148 */
|
||||||
scheme_rt_dyn_wind_info, /* 147 */
|
scheme_rt_dyn_wind_info, /* 149 */
|
||||||
scheme_rt_dyn_wind, /* 148 */
|
scheme_rt_dyn_wind, /* 150 */
|
||||||
scheme_rt_dup_check, /* 149 */
|
scheme_rt_dup_check, /* 151 */
|
||||||
scheme_rt_thread_memory, /* 150 */
|
scheme_rt_thread_memory, /* 152 */
|
||||||
scheme_rt_input_file, /* 151 */
|
scheme_rt_input_file, /* 153 */
|
||||||
scheme_rt_input_fd, /* 152 */
|
scheme_rt_input_fd, /* 154 */
|
||||||
scheme_rt_oskit_console_input, /* 153 */
|
scheme_rt_oskit_console_input, /* 155 */
|
||||||
scheme_rt_tested_input_file, /* 154 */
|
scheme_rt_tested_input_file, /* 156 */
|
||||||
scheme_rt_tested_output_file, /* 155 */
|
scheme_rt_tested_output_file, /* 157 */
|
||||||
scheme_rt_indexed_string, /* 156 */
|
scheme_rt_indexed_string, /* 158 */
|
||||||
scheme_rt_output_file, /* 157 */
|
scheme_rt_output_file, /* 159 */
|
||||||
scheme_rt_load_handler_data, /* 158 */
|
scheme_rt_load_handler_data, /* 160 */
|
||||||
scheme_rt_pipe, /* 159 */
|
scheme_rt_pipe, /* 161 */
|
||||||
scheme_rt_beos_process, /* 160 */
|
scheme_rt_beos_process, /* 162 */
|
||||||
scheme_rt_system_child, /* 161 */
|
scheme_rt_system_child, /* 163 */
|
||||||
scheme_rt_tcp, /* 162 */
|
scheme_rt_tcp, /* 164 */
|
||||||
scheme_rt_write_data, /* 163 */
|
scheme_rt_write_data, /* 165 */
|
||||||
scheme_rt_tcp_select_info, /* 164 */
|
scheme_rt_tcp_select_info, /* 166 */
|
||||||
scheme_rt_namespace_option, /* 165 */
|
scheme_rt_namespace_option, /* 167 */
|
||||||
scheme_rt_param_data, /* 166 */
|
scheme_rt_param_data, /* 168 */
|
||||||
scheme_rt_will, /* 167 */
|
scheme_rt_will, /* 169 */
|
||||||
scheme_rt_will_registration, /* 168 */
|
scheme_rt_will_registration, /* 170 */
|
||||||
scheme_rt_struct_proc_info, /* 169 */
|
scheme_rt_struct_proc_info, /* 171 */
|
||||||
scheme_rt_linker_name, /* 170 */
|
scheme_rt_linker_name, /* 172 */
|
||||||
scheme_rt_param_map, /* 171 */
|
scheme_rt_param_map, /* 173 */
|
||||||
scheme_rt_finalization, /* 172 */
|
scheme_rt_finalization, /* 174 */
|
||||||
scheme_rt_finalizations, /* 173 */
|
scheme_rt_finalizations, /* 175 */
|
||||||
scheme_rt_cpp_object, /* 174 */
|
scheme_rt_cpp_object, /* 176 */
|
||||||
scheme_rt_cpp_array_object, /* 175 */
|
scheme_rt_cpp_array_object, /* 177 */
|
||||||
scheme_rt_stack_object, /* 176 */
|
scheme_rt_stack_object, /* 178 */
|
||||||
scheme_rt_preallocated_object, /* 177 */
|
scheme_rt_preallocated_object, /* 179 */
|
||||||
scheme_thread_hop_type, /* 178 */
|
scheme_thread_hop_type, /* 180 */
|
||||||
scheme_rt_srcloc, /* 179 */
|
scheme_rt_srcloc, /* 181 */
|
||||||
scheme_rt_evt, /* 180 */
|
scheme_rt_evt, /* 182 */
|
||||||
scheme_rt_syncing, /* 181 */
|
scheme_rt_syncing, /* 183 */
|
||||||
scheme_rt_comp_prefix, /* 182 */
|
scheme_rt_comp_prefix, /* 184 */
|
||||||
scheme_rt_user_input, /* 183 */
|
scheme_rt_user_input, /* 185 */
|
||||||
scheme_rt_user_output, /* 184 */
|
scheme_rt_user_output, /* 186 */
|
||||||
scheme_rt_compact_port, /* 185 */
|
scheme_rt_compact_port, /* 187 */
|
||||||
scheme_rt_read_special_dw, /* 186 */
|
scheme_rt_read_special_dw, /* 188 */
|
||||||
scheme_rt_regwork, /* 187 */
|
scheme_rt_regwork, /* 189 */
|
||||||
scheme_rt_buf_holder, /* 188 */
|
scheme_rt_buf_holder, /* 190 */
|
||||||
scheme_rt_parameterization, /* 189 */
|
scheme_rt_parameterization, /* 191 */
|
||||||
scheme_rt_print_params, /* 190 */
|
scheme_rt_print_params, /* 192 */
|
||||||
scheme_rt_read_params, /* 191 */
|
scheme_rt_read_params, /* 193 */
|
||||||
scheme_rt_native_code, /* 192 */
|
scheme_rt_native_code, /* 194 */
|
||||||
scheme_rt_native_code_plus_case, /* 193 */
|
scheme_rt_native_code_plus_case, /* 195 */
|
||||||
scheme_rt_jitter_data, /* 194 */
|
scheme_rt_jitter_data, /* 196 */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_scheme_last_type_
|
_scheme_last_type_
|
||||||
|
|
|
@ -101,7 +101,6 @@ static Scheme_Object *define_syntaxes_execute(Scheme_Object *expr);
|
||||||
static Scheme_Object *define_for_syntaxes_execute(Scheme_Object *expr);
|
static Scheme_Object *define_for_syntaxes_execute(Scheme_Object *expr);
|
||||||
static Scheme_Object *case_lambda_execute(Scheme_Object *expr);
|
static Scheme_Object *case_lambda_execute(Scheme_Object *expr);
|
||||||
static Scheme_Object *begin0_execute(Scheme_Object *data);
|
static Scheme_Object *begin0_execute(Scheme_Object *data);
|
||||||
static Scheme_Object *quote_syntax_execute(Scheme_Object *data);
|
|
||||||
|
|
||||||
static Scheme_Object *bangboxenv_execute(Scheme_Object *data);
|
static Scheme_Object *bangboxenv_execute(Scheme_Object *data);
|
||||||
static Scheme_Object *bangboxvalue_execute(Scheme_Object *data);
|
static Scheme_Object *bangboxvalue_execute(Scheme_Object *data);
|
||||||
|
@ -139,8 +138,6 @@ static void case_lambda_validate(Scheme_Object *data, Mz_CPort *port, char *stac
|
||||||
int num_toplevels, int num_stxes);
|
int num_toplevels, int num_stxes);
|
||||||
static void begin0_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta,
|
static void begin0_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta,
|
||||||
int num_toplevels, int num_stxes);
|
int num_toplevels, int num_stxes);
|
||||||
static void quote_syntax_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta,
|
|
||||||
int num_toplevels, int num_stxes);
|
|
||||||
static void bangboxenv_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta,
|
static void bangboxenv_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta,
|
||||||
int num_toplevels, int num_stxes);
|
int num_toplevels, int num_stxes);
|
||||||
static void bangboxvalue_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta,
|
static void bangboxvalue_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta,
|
||||||
|
@ -153,7 +150,6 @@ static Scheme_Object *define_syntaxes_jit(Scheme_Object *expr);
|
||||||
static Scheme_Object *define_for_syntaxes_jit(Scheme_Object *expr);
|
static Scheme_Object *define_for_syntaxes_jit(Scheme_Object *expr);
|
||||||
static Scheme_Object *case_lambda_jit(Scheme_Object *expr);
|
static Scheme_Object *case_lambda_jit(Scheme_Object *expr);
|
||||||
static Scheme_Object *begin0_jit(Scheme_Object *data);
|
static Scheme_Object *begin0_jit(Scheme_Object *data);
|
||||||
static Scheme_Object *quote_syntax_jit(Scheme_Object *data);
|
|
||||||
static Scheme_Object *bangboxvalue_jit(Scheme_Object *data);
|
static Scheme_Object *bangboxvalue_jit(Scheme_Object *data);
|
||||||
|
|
||||||
static Scheme_Object *named_let_syntax (Scheme_Object *form, Scheme_Comp_Env *env,
|
static Scheme_Object *named_let_syntax (Scheme_Object *form, Scheme_Comp_Env *env,
|
||||||
|
@ -274,10 +270,6 @@ scheme_init_syntax (Scheme_Env *env)
|
||||||
begin0_resolve, begin0_validate,
|
begin0_resolve, begin0_validate,
|
||||||
begin0_execute, begin0_jit,
|
begin0_execute, begin0_jit,
|
||||||
begin0_clone, -1);
|
begin0_clone, -1);
|
||||||
scheme_register_syntax(QUOTE_SYNTAX_EXPD,
|
|
||||||
NULL, NULL, quote_syntax_validate,
|
|
||||||
quote_syntax_execute, quote_syntax_jit,
|
|
||||||
NULL, 2);
|
|
||||||
|
|
||||||
scheme_register_syntax(BOXENV_EXPD,
|
scheme_register_syntax(BOXENV_EXPD,
|
||||||
NULL, NULL, bangboxenv_validate,
|
NULL, NULL, bangboxenv_validate,
|
||||||
|
@ -3793,44 +3785,6 @@ unquote_expand(Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Expand_Info *er
|
||||||
/* quote-syntax */
|
/* quote-syntax */
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
static Scheme_Object *
|
|
||||||
quote_syntax_execute(Scheme_Object *obj)
|
|
||||||
{
|
|
||||||
Scheme_Object **globs, *stx;
|
|
||||||
int i, c, p;
|
|
||||||
|
|
||||||
i = SCHEME_INT_VAL(SCHEME_CAR(obj));
|
|
||||||
c = SCHEME_INT_VAL(SCHEME_CADR(obj));
|
|
||||||
p = SCHEME_INT_VAL(SCHEME_CDDR(obj));
|
|
||||||
|
|
||||||
globs = (Scheme_Object **)MZ_RUNSTACK[c];
|
|
||||||
stx = globs[i+p+1];
|
|
||||||
if (!stx) {
|
|
||||||
stx = globs[p];
|
|
||||||
stx = scheme_add_rename(((Scheme_Object **)SCHEME_CDR(stx))[i],
|
|
||||||
SCHEME_CAR(stx));
|
|
||||||
globs[i+p+1] = stx;
|
|
||||||
}
|
|
||||||
return stx;
|
|
||||||
}
|
|
||||||
|
|
||||||
Scheme_Object *quote_syntax_jit(Scheme_Object *data)
|
|
||||||
{
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void quote_syntax_validate(Scheme_Object *obj, Mz_CPort *port, char *stack,
|
|
||||||
int depth, int letlimit, int delta, int num_toplevels, int num_stxes)
|
|
||||||
{
|
|
||||||
int i, c, p;
|
|
||||||
|
|
||||||
i = SCHEME_INT_VAL(SCHEME_CAR(obj));
|
|
||||||
c = SCHEME_INT_VAL(SCHEME_CADR(obj));
|
|
||||||
p = SCHEME_INT_VAL(SCHEME_CDDR(obj));
|
|
||||||
|
|
||||||
scheme_validate_quote_syntax(c, p, i, port, stack, depth, delta, num_toplevels, num_stxes);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Scheme_Object *
|
static Scheme_Object *
|
||||||
quote_syntax_syntax(Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Compile_Info *rec, int drec)
|
quote_syntax_syntax(Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Compile_Info *rec, int drec)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1601,7 +1601,7 @@ static void run_closers(Scheme_Object *o, Scheme_Close_Custodian_Client *f, void
|
||||||
{
|
{
|
||||||
Scheme_Object *l;
|
Scheme_Object *l;
|
||||||
|
|
||||||
for (l = closers; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) {
|
for (l = closers; SCHEME_RPAIRP(l); l = SCHEME_CDR(l)) {
|
||||||
Scheme_Exit_Closer_Func cf;
|
Scheme_Exit_Closer_Func cf;
|
||||||
cf = (Scheme_Exit_Closer_Func)SCHEME_CAR(l);
|
cf = (Scheme_Exit_Closer_Func)SCHEME_CAR(l);
|
||||||
cf(o, f, data);
|
cf(o, f, data);
|
||||||
|
@ -1639,7 +1639,7 @@ void scheme_add_atexit_closer(Scheme_Exit_Closer_Func f)
|
||||||
closers = scheme_null;
|
closers = scheme_null;
|
||||||
}
|
}
|
||||||
|
|
||||||
closers = scheme_make_pair((Scheme_Object *)f, closers);
|
closers = scheme_make_raw_pair((Scheme_Object *)f, closers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void scheme_schedule_custodian_close(Scheme_Custodian *c)
|
void scheme_schedule_custodian_close(Scheme_Custodian *c)
|
||||||
|
@ -2149,7 +2149,7 @@ void scheme_swap_thread(Scheme_Thread *new_thread)
|
||||||
{
|
{
|
||||||
Scheme_Object *l, *o;
|
Scheme_Object *l, *o;
|
||||||
Scheme_Closure_Func f;
|
Scheme_Closure_Func f;
|
||||||
for (l = thread_swap_callbacks; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) {
|
for (l = thread_swap_callbacks; SCHEME_RPAIRP(l); l = SCHEME_CDR(l)) {
|
||||||
o = SCHEME_CAR(l);
|
o = SCHEME_CAR(l);
|
||||||
f = SCHEME_CLOS_FUNC(o);
|
f = SCHEME_CLOS_FUNC(o);
|
||||||
o = SCHEME_CLOS_DATA(o);
|
o = SCHEME_CLOS_DATA(o);
|
||||||
|
@ -2408,7 +2408,7 @@ static void start_child(Scheme_Thread * volatile child,
|
||||||
{
|
{
|
||||||
Scheme_Object *l, *o;
|
Scheme_Object *l, *o;
|
||||||
Scheme_Closure_Func f;
|
Scheme_Closure_Func f;
|
||||||
for (l = thread_swap_callbacks; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) {
|
for (l = thread_swap_callbacks; SCHEME_RPAIRP(l); l = SCHEME_CDR(l)) {
|
||||||
o = SCHEME_CAR(l);
|
o = SCHEME_CAR(l);
|
||||||
f = SCHEME_CLOS_FUNC(o);
|
f = SCHEME_CLOS_FUNC(o);
|
||||||
o = SCHEME_CLOS_DATA(o);
|
o = SCHEME_CLOS_DATA(o);
|
||||||
|
@ -2628,7 +2628,7 @@ void scheme_add_swap_callback(Scheme_Closure_Func f, Scheme_Object *data)
|
||||||
{
|
{
|
||||||
Scheme_Object *p;
|
Scheme_Object *p;
|
||||||
|
|
||||||
p = scheme_make_pair((Scheme_Object *)f, data);
|
p = scheme_make_raw_pair((Scheme_Object *)f, data);
|
||||||
thread_swap_callbacks = scheme_make_pair(p, thread_swap_callbacks);
|
thread_swap_callbacks = scheme_make_pair(p, thread_swap_callbacks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4416,7 +4416,7 @@ static void promote_thread(Scheme_Thread *p, Scheme_Custodian *to_c)
|
||||||
/* Otherwise, this is custodian is unrelated to the existing ones.
|
/* Otherwise, this is custodian is unrelated to the existing ones.
|
||||||
Add it as an extra custodian. */
|
Add it as an extra custodian. */
|
||||||
mref = scheme_add_managed(to_c, (Scheme_Object *)p->mr_hop, NULL, NULL, 0);
|
mref = scheme_add_managed(to_c, (Scheme_Object *)p->mr_hop, NULL, NULL, 0);
|
||||||
l = scheme_make_pair((Scheme_Object *)mref, p->extra_mrefs);
|
l = scheme_make_raw_pair((Scheme_Object *)mref, p->extra_mrefs);
|
||||||
p->extra_mrefs = l;
|
p->extra_mrefs = l;
|
||||||
|
|
||||||
transitive_promote(p, to_c);
|
transitive_promote(p, to_c);
|
||||||
|
|
|
@ -93,6 +93,7 @@ scheme_init_type (Scheme_Env *env)
|
||||||
set_name(scheme_case_lambda_sequence_type, "<case-lambda-code>");
|
set_name(scheme_case_lambda_sequence_type, "<case-lambda-code>");
|
||||||
set_name(scheme_begin0_sequence_type, "<begin0-code>");
|
set_name(scheme_begin0_sequence_type, "<begin0-code>");
|
||||||
set_name(scheme_with_cont_mark_type, "<with-continuation-mark-code>");
|
set_name(scheme_with_cont_mark_type, "<with-continuation-mark-code>");
|
||||||
|
set_name(scheme_quote_syntax_type, "<quote-syntax-code>");
|
||||||
|
|
||||||
set_name(scheme_let_value_type, "<let-value-code>");
|
set_name(scheme_let_value_type, "<let-value-code>");
|
||||||
set_name(scheme_let_void_type, "<let-void-code>");
|
set_name(scheme_let_void_type, "<let-void-code>");
|
||||||
|
@ -114,6 +115,7 @@ scheme_init_type (Scheme_Env *env)
|
||||||
set_name(scheme_tail_call_waiting_type, "<tail-call-waiting>");
|
set_name(scheme_tail_call_waiting_type, "<tail-call-waiting>");
|
||||||
set_name(scheme_null_type, "<empty-list>");
|
set_name(scheme_null_type, "<empty-list>");
|
||||||
set_name(scheme_pair_type, "<pair>");
|
set_name(scheme_pair_type, "<pair>");
|
||||||
|
set_name(scheme_raw_pair_type, "<raw-pair>");
|
||||||
set_name(scheme_box_type, "<box>");
|
set_name(scheme_box_type, "<box>");
|
||||||
set_name(scheme_integer_type, "<fixnum-integer>");
|
set_name(scheme_integer_type, "<fixnum-integer>");
|
||||||
set_name(scheme_double_type, "<inexact-number>");
|
set_name(scheme_double_type, "<inexact-number>");
|
||||||
|
@ -424,6 +426,7 @@ void scheme_register_traversers(void)
|
||||||
GC_REG_TRAV(scheme_letrec_type, letrec);
|
GC_REG_TRAV(scheme_letrec_type, letrec);
|
||||||
GC_REG_TRAV(scheme_let_one_type, let_one);
|
GC_REG_TRAV(scheme_let_one_type, let_one);
|
||||||
GC_REG_TRAV(scheme_with_cont_mark_type, with_cont_mark);
|
GC_REG_TRAV(scheme_with_cont_mark_type, with_cont_mark);
|
||||||
|
GC_REG_TRAV(scheme_quote_syntax_type, quotesyntax_obj);
|
||||||
GC_REG_TRAV(scheme_module_variable_type, module_var);
|
GC_REG_TRAV(scheme_module_variable_type, module_var);
|
||||||
|
|
||||||
GC_REG_TRAV(_scheme_values_types_, bad_trav);
|
GC_REG_TRAV(_scheme_values_types_, bad_trav);
|
||||||
|
@ -466,6 +469,7 @@ void scheme_register_traversers(void)
|
||||||
GC_REG_TRAV(scheme_keyword_type, symbol_obj);
|
GC_REG_TRAV(scheme_keyword_type, symbol_obj);
|
||||||
GC_REG_TRAV(scheme_null_type, char_obj); /* small */
|
GC_REG_TRAV(scheme_null_type, char_obj); /* small */
|
||||||
GC_REG_TRAV(scheme_pair_type, cons_cell);
|
GC_REG_TRAV(scheme_pair_type, cons_cell);
|
||||||
|
GC_REG_TRAV(scheme_raw_pair_type, cons_cell);
|
||||||
GC_REG_TRAV(scheme_vector_type, vector_obj);
|
GC_REG_TRAV(scheme_vector_type, vector_obj);
|
||||||
GC_REG_TRAV(scheme_cpointer_type, cpointer_obj);
|
GC_REG_TRAV(scheme_cpointer_type, cpointer_obj);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user