separate cv table creation
This commit is contained in:
parent
5a56f57782
commit
cb2f9fece3
|
@ -1019,7 +1019,7 @@ pic_resolve(pic_state *pic, pic_value obj)
|
||||||
typedef struct codegen_context {
|
typedef struct codegen_context {
|
||||||
bool varg;
|
bool varg;
|
||||||
/* rest args variable is counted as a local */
|
/* rest args variable is counted as a local */
|
||||||
xvect args, locals;
|
xvect args, locals, captures;
|
||||||
/* closed variable table */
|
/* closed variable table */
|
||||||
unsigned *cv_tbl, cv_num;
|
unsigned *cv_tbl, cv_num;
|
||||||
/* actual bit code sequence */
|
/* actual bit code sequence */
|
||||||
|
@ -1087,12 +1087,45 @@ destroy_codegen_state(codegen_state *state)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
push_codegen_context(codegen_state *state, pic_value args, pic_value locals, bool varg, pic_value closes)
|
create_cv_table(pic_state *pic, codegen_context *cxt)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
xhash *vars;
|
||||||
|
pic_sym *var;
|
||||||
|
size_t offset;
|
||||||
|
|
||||||
|
vars = xh_new_int();
|
||||||
|
|
||||||
|
/* number local variables */
|
||||||
|
offset = 1;
|
||||||
|
for (i = 0; i < cxt->args.size; ++i) {
|
||||||
|
var = xv_get(&cxt->args, i);
|
||||||
|
xh_put_int(vars, *var, i + offset);
|
||||||
|
}
|
||||||
|
offset += i;
|
||||||
|
for (i = 0; i < cxt->locals.size; ++i) {
|
||||||
|
var = xv_get(&cxt->locals, i);
|
||||||
|
xh_put_int(vars, *var, i + offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* closed variables */
|
||||||
|
cxt->cv_tbl = NULL;
|
||||||
|
cxt->cv_num = 0;
|
||||||
|
for (i = 0; i < cxt->captures.size; ++i) {
|
||||||
|
var = xv_get(&cxt->captures, i);
|
||||||
|
i = cxt->cv_num++;
|
||||||
|
cxt->cv_tbl = pic_realloc(pic, cxt->cv_tbl, sizeof(unsigned) * cxt->cv_num);
|
||||||
|
cxt->cv_tbl[i] = xh_get_int(vars, *var)->val;
|
||||||
|
}
|
||||||
|
|
||||||
|
xh_destroy(vars);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
push_codegen_context(codegen_state *state, pic_value args, pic_value locals, bool varg, pic_value captures)
|
||||||
{
|
{
|
||||||
pic_state *pic = state->pic;
|
pic_state *pic = state->pic;
|
||||||
codegen_context *cxt;
|
codegen_context *cxt;
|
||||||
size_t i, c;
|
|
||||||
xhash *vars;
|
|
||||||
pic_value var;
|
pic_value var;
|
||||||
|
|
||||||
cxt = (codegen_context *)pic_alloc(pic, sizeof(codegen_context));
|
cxt = (codegen_context *)pic_alloc(pic, sizeof(codegen_context));
|
||||||
|
@ -1101,6 +1134,7 @@ push_codegen_context(codegen_state *state, pic_value args, pic_value locals, boo
|
||||||
|
|
||||||
xv_init(&cxt->args, sizeof(pic_sym));
|
xv_init(&cxt->args, sizeof(pic_sym));
|
||||||
xv_init(&cxt->locals, sizeof(pic_sym));
|
xv_init(&cxt->locals, sizeof(pic_sym));
|
||||||
|
xv_init(&cxt->captures, sizeof(pic_sym));
|
||||||
|
|
||||||
pic_for_each (var, args) {
|
pic_for_each (var, args) {
|
||||||
xv_push(&cxt->args, &pic_sym(var));
|
xv_push(&cxt->args, &pic_sym(var));
|
||||||
|
@ -1108,26 +1142,11 @@ push_codegen_context(codegen_state *state, pic_value args, pic_value locals, boo
|
||||||
pic_for_each (var, locals) {
|
pic_for_each (var, locals) {
|
||||||
xv_push(&cxt->locals, &pic_sym(var));
|
xv_push(&cxt->locals, &pic_sym(var));
|
||||||
}
|
}
|
||||||
|
pic_for_each (var, captures) {
|
||||||
/* number local variables */
|
xv_push(&cxt->captures, &pic_sym(var));
|
||||||
vars = xh_new_int();
|
|
||||||
for (i = 0; i < cxt->args.size; ++i) {
|
|
||||||
xh_put_int(vars, pic_sym(pic_list_ref(pic, args, i)), i + 1);
|
|
||||||
}
|
|
||||||
for (i = 0; i < cxt->locals.size; ++i) {
|
|
||||||
xh_put_int(vars, pic_sym(pic_list_ref(pic, locals, i)), i + 1 + cxt->args.size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* closed variables */
|
create_cv_table(pic, cxt);
|
||||||
cxt->cv_tbl = NULL;
|
|
||||||
cxt->cv_num = 0;
|
|
||||||
for (i = 0, c = pic_length(pic, closes); i < c; ++i) {
|
|
||||||
i = cxt->cv_num++;
|
|
||||||
cxt->cv_tbl = pic_realloc(pic, cxt->cv_tbl, sizeof(unsigned) * cxt->cv_num);
|
|
||||||
cxt->cv_tbl[i] = xh_get_int(vars, pic_sym(pic_list_ref(pic, closes, i)))->val;
|
|
||||||
}
|
|
||||||
|
|
||||||
xh_destroy(vars);
|
|
||||||
|
|
||||||
cxt->code = pic_calloc(pic, PIC_ISEQ_SIZE, sizeof(pic_code));
|
cxt->code = pic_calloc(pic, PIC_ISEQ_SIZE, sizeof(pic_code));
|
||||||
cxt->clen = 0;
|
cxt->clen = 0;
|
||||||
|
@ -1168,6 +1187,7 @@ pop_codegen_context(codegen_state *state)
|
||||||
/* finalize */
|
/* finalize */
|
||||||
xv_destroy(&cxt->args);
|
xv_destroy(&cxt->args);
|
||||||
xv_destroy(&cxt->locals);
|
xv_destroy(&cxt->locals);
|
||||||
|
xv_destroy(&cxt->captures);
|
||||||
|
|
||||||
/* destroy context */
|
/* destroy context */
|
||||||
cxt = cxt->up;
|
cxt = cxt->up;
|
||||||
|
|
Loading…
Reference in New Issue