flatten (begin ... (begin ...)) in last pass of compiler
Flattening just makes bytecode slightly smaller.
This commit is contained in:
parent
787437223c
commit
829e894af2
|
@ -314,7 +314,45 @@ static Scheme_Object *sfs_application3(Scheme_Object *o, SFS_Info *info)
|
|||
return o;
|
||||
}
|
||||
|
||||
static Scheme_Object *sfs_sequence(Scheme_Object *o, SFS_Info *info)
|
||||
static Scheme_Object *flatten_sequence(Scheme_Object *o)
|
||||
{
|
||||
/* At this point, we sometimes have (begin ... (begin ... (begin ...))).
|
||||
Flatten those out. */
|
||||
Scheme_Sequence *s = (Scheme_Sequence *)o, *s2;
|
||||
int i, extra = 0;
|
||||
|
||||
o = s->array[s->count - 1];
|
||||
|
||||
while (SAME_TYPE(SCHEME_TYPE(o), scheme_sequence_type)) {
|
||||
s2 = (Scheme_Sequence *)o;
|
||||
extra += s2->count - 1;
|
||||
o = s2->array[s2->count - 1];
|
||||
}
|
||||
|
||||
if (extra) {
|
||||
s2 = scheme_malloc_sequence(s->count + extra);
|
||||
s2->so.type = scheme_sequence_type;
|
||||
s2->count = s->count + extra;
|
||||
|
||||
extra = 0;
|
||||
o = (Scheme_Object *)s;
|
||||
while (SAME_TYPE(SCHEME_TYPE(o), scheme_sequence_type)) {
|
||||
s = (Scheme_Sequence *)o;
|
||||
for (i = 0; i < s->count - 1; i++) {
|
||||
s2->array[extra++] = s->array[i];
|
||||
}
|
||||
o = s->array[i];
|
||||
}
|
||||
s2->array[extra++] = o;
|
||||
|
||||
if (extra != s2->count) scheme_signal_error("internal error: flatten failed");
|
||||
|
||||
return (Scheme_Object *)s2;
|
||||
} else
|
||||
return (Scheme_Object *)s;
|
||||
}
|
||||
|
||||
static Scheme_Object *sfs_sequence(Scheme_Object *o, SFS_Info *info, int can_flatten)
|
||||
{
|
||||
Scheme_Object *orig, *naya;
|
||||
Scheme_Sequence *seq;
|
||||
|
@ -327,10 +365,13 @@ static Scheme_Object *sfs_sequence(Scheme_Object *o, SFS_Info *info)
|
|||
|
||||
for (i = 0; i < n; i++) {
|
||||
orig = seq->array[i];
|
||||
naya = scheme_sfs_expr(orig, info, -1);
|
||||
naya = scheme_sfs_expr(orig, info, -2);
|
||||
seq->array[i] = naya;
|
||||
}
|
||||
|
||||
if (can_flatten && info->pass)
|
||||
o = flatten_sequence(o);
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
|
@ -1128,6 +1169,7 @@ top_level_require_sfs(Scheme_Object *data, SFS_Info *rslv)
|
|||
/*========================================================================*/
|
||||
|
||||
Scheme_Object *scheme_sfs_expr(Scheme_Object *expr, SFS_Info *info, int closure_self_pos)
|
||||
/* closure_self_pos == -2 => immediately in sequence */
|
||||
{
|
||||
Scheme_Type type = SCHEME_TYPE(expr);
|
||||
int seqn, stackpos, tp;
|
||||
|
@ -1175,8 +1217,10 @@ Scheme_Object *scheme_sfs_expr(Scheme_Object *expr, SFS_Info *info, int closure_
|
|||
expr = sfs_application3(expr, info);
|
||||
break;
|
||||
case scheme_sequence_type:
|
||||
expr = sfs_sequence(expr, info, closure_self_pos != -2);
|
||||
break;
|
||||
case scheme_splice_sequence_type:
|
||||
expr = sfs_sequence(expr, info);
|
||||
expr = sfs_sequence(expr, info, 0);
|
||||
break;
|
||||
case scheme_branch_type:
|
||||
expr = sfs_branch(expr, info);
|
||||
|
|
Loading…
Reference in New Issue
Block a user