summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/codegen.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-06-29 08:34:56 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-10-12 16:21:22 +0900
commit3d8a38bea4de5ca3a65ec9bce9359b9c62326f9f (patch)
tree3f8ebdcc96896f7cdde31064026ffa588c77776d /mrbgems/mruby-compiler/core/codegen.c
parent639946a006c29f648551512af8aa0bb0cd969412 (diff)
downloadmruby-3d8a38bea4de5ca3a65ec9bce9359b9c62326f9f.tar.gz
mruby-3d8a38bea4de5ca3a65ec9bce9359b9c62326f9f.zip
You don't need to keep index in local variables info in `irep`.
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c22
1 files changed, 9 insertions, 13 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 9da80536b..191895668 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -677,10 +677,12 @@ search_upvar(codegen_scope *s, mrb_sym id, int *idx)
while (u && !MRB_PROC_CFUNC_P(u)) {
const struct mrb_irep *ir = u->body.irep;
uint_fast16_t n = ir->nlocals;
- const struct mrb_lvinfo *v = ir->lv;
- for (; n > 1; n --, v ++) {
- if (v->name == id) {
- *idx = v->r;
+ int i;
+
+ const mrb_sym *v = ir->lv;
+ for (i=1; n > 1; n--, v++, i++) {
+ if (*v == id) {
+ *idx = i;
return lv - 1;
}
}
@@ -3035,19 +3037,13 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *nlv)
s->sp += node_len(nlv)+1; /* add self */
s->nlocals = s->sp;
if (nlv) {
- struct mrb_lvinfo *lv;
+ mrb_sym *lv;
node *n = nlv;
size_t i = 0;
- s->irep->lv = lv = (struct mrb_lvinfo*)mrb_malloc(mrb, sizeof(struct mrb_lvinfo)*(s->nlocals-1));
+ s->irep->lv = lv = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*(s->nlocals-1));
for (i=0, n=nlv; n; i++,n=n->cdr) {
- lv[i].name = lv_name(n);
- if (lv_name(n)) {
- lv[i].r = lv_idx(s, lv_name(n));
- }
- else {
- lv[i].r = 0;
- }
+ lv[i] = lv_name(n);
}
mrb_assert(i + 1 == s->nlocals);
}