Skip to content

Commit

Permalink
Add missing MVMROOTs in context iteration.
Browse files Browse the repository at this point in the history
One of these cases was an existing bug. The other was needed for the
frame changes.
  • Loading branch information
jnthn committed Apr 20, 2016
1 parent 6d15151 commit b625398
Showing 1 changed file with 60 additions and 56 deletions.
116 changes: 60 additions & 56 deletions src/6model/reprs/MVMIter.c
Expand Up @@ -232,64 +232,68 @@ MVMObject * MVM_iter(MVMThreadContext *tc, MVMObject *target) {
MVMStaticFrame *sf = frame->static_info;
MVMLexicalRegistry **lexreg = sf->body.lexical_names_list;
MVMuint32 i;
for (i = 0; i < sf->body.num_lexicals; i++) {
MVMuint32 idx = lexreg[i]->value;
MVMuint16 type = sf->body.lexical_types[idx];
switch (type) {
case MVM_reg_obj: {
MVMObject *obj = frame->env[idx].o;
if (!obj)
obj = MVM_frame_vivify_lexical(tc, frame, idx);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, obj);
break;
MVMROOT(tc, frame, {
MVMROOT(tc, sf, {
for (i = 0; i < sf->body.num_lexicals; i++) {
MVMuint32 idx = lexreg[i]->value;
MVMuint16 type = sf->body.lexical_types[idx];
switch (type) {
case MVM_reg_obj: {
MVMObject *obj = frame->env[idx].o;
if (!obj)
obj = MVM_frame_vivify_lexical(tc, frame, idx);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, obj);
break;
}
case MVM_reg_str: {
MVMObject *bs = MVM_repr_box_str(tc, hll->str_box_type,
frame->env[idx].s);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bs);
break;
}
case MVM_reg_int8: {
MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type,
frame->env[idx].i8);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi);
break;
}
case MVM_reg_int16: {
MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type,
frame->env[idx].i16);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi);
break;
}
case MVM_reg_int32: {
MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type,
frame->env[idx].i32);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi);
break;
}
case MVM_reg_int64: {
MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type,
frame->env[idx].i64);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi);
break;
}
case MVM_reg_num32: {
MVMObject *bn = MVM_repr_box_num(tc, hll->num_box_type,
frame->env[idx].n32);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bn);
break;
}
case MVM_reg_num64: {
MVMObject *bn = MVM_repr_box_num(tc, hll->num_box_type,
frame->env[idx].n64);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bn);
break;
}
default:
MVM_exception_throw_adhoc(tc,
"Unknown lexical type encountered while building context iterator");
}
case MVM_reg_str: {
MVMObject *bs = MVM_repr_box_str(tc, hll->str_box_type,
frame->env[idx].s);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bs);
break;
}
case MVM_reg_int8: {
MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type,
frame->env[idx].i8);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi);
break;
}
case MVM_reg_int16: {
MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type,
frame->env[idx].i16);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi);
break;
}
case MVM_reg_int32: {
MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type,
frame->env[idx].i32);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi);
break;
}
case MVM_reg_int64: {
MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type,
frame->env[idx].i64);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi);
break;
}
case MVM_reg_num32: {
MVMObject *bn = MVM_repr_box_num(tc, hll->num_box_type,
frame->env[idx].n32);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bn);
break;
}
case MVM_reg_num64: {
MVMObject *bn = MVM_repr_box_num(tc, hll->num_box_type,
frame->env[idx].n64);
MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bn);
break;
}
default:
MVM_exception_throw_adhoc(tc,
"Unknown lexical type encountered while building context iterator");
}
}
});
});
});

/* Call ourselves recursively to get the iterator for this
Expand Down

0 comments on commit b625398

Please sign in to comment.