diff options
| -rw-r--r-- | include/mruby.h | 4 | ||||
| -rw-r--r-- | src/codegen.c | 17 | ||||
| -rw-r--r-- | src/load.c | 30 | ||||
| -rw-r--r-- | src/symbol.c | 2 |
4 files changed, 33 insertions, 20 deletions
diff --git a/include/mruby.h b/include/mruby.h index bc71c84d7..e92550213 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -230,8 +230,8 @@ mrb_value mrb_funcall_argv(mrb_state*, mrb_value, mrb_sym, int, mrb_value*); mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, mrb_sym, int, mrb_value*, mrb_value); mrb_sym mrb_intern_cstr(mrb_state*,const char*); mrb_sym mrb_intern(mrb_state*,const char*,size_t); -mrb_sym mrb_intern_literal(mrb_state*,const char*,size_t); -#define mrb_intern_lit(mrb, lit) mrb_intern_literal(mrb, (lit), sizeof(lit) - 1) +mrb_sym mrb_intern_static(mrb_state*,const char*,size_t); +#define mrb_intern_lit(mrb, lit) mrb_intern_static(mrb, (lit), sizeof(lit) - 1) mrb_sym mrb_intern_str(mrb_state*,mrb_value); mrb_value mrb_check_intern_cstr(mrb_state*,const char*); mrb_value mrb_check_intern(mrb_state*,const char*,size_t); diff --git a/src/codegen.c b/src/codegen.c index 074d431c1..fc83244f2 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -657,14 +657,17 @@ lambda_body(codegen_scope *s, node *tree, int blk) } static int -scope_body(codegen_scope *s, node *tree) +scope_body(codegen_scope *s, node *tree, int val) { codegen_scope *scope = scope_new(s->mrb, s, tree->car); - codegen(scope, tree->cdr, VAL); + codegen(scope, tree->cdr, val); if (!s->iseq) { genop(scope, MKOP_A(OP_STOP, 0)); } + else if (!val) { + genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); + } else { if (scope->nregs == 0) { genop(scope, MKOP_A(OP_LOADNIL, 0)); @@ -1235,7 +1238,7 @@ codegen(codegen_scope *s, node *tree, int val) genop(s, MKOP_Bx(OP_EPUSH, 0)); s->ensure_level++; codegen(s, tree->car, val); - idx = scope_body(s, tree->cdr); + idx = scope_body(s, tree->cdr, NOVAL); s->iseq[epush] = MKOP_Bx(OP_EPUSH, idx); s->ensure_level--; genop_peep(s, MKOP_A(OP_EPOP, 1), NOVAL); @@ -1423,7 +1426,7 @@ codegen(codegen_scope *s, node *tree, int val) break; case NODE_SCOPE: - scope_body(s, tree); + scope_body(s, tree, NOVAL); break; case NODE_FCALL: @@ -2283,7 +2286,7 @@ codegen(codegen_scope *s, node *tree, int val) pop(); pop(); idx = new_msym(s, sym(tree->car->cdr)); genop(s, MKOP_AB(OP_CLASS, cursp(), idx)); - idx = scope_body(s, tree->cdr->cdr->car); + idx = scope_body(s, tree->cdr->cdr->car, val); genop(s, MKOP_ABx(OP_EXEC, cursp(), idx)); if (val) { push(); @@ -2309,7 +2312,7 @@ codegen(codegen_scope *s, node *tree, int val) pop(); idx = new_msym(s, sym(tree->car->cdr)); genop(s, MKOP_AB(OP_MODULE, cursp(), idx)); - idx = scope_body(s, tree->cdr->car); + idx = scope_body(s, tree->cdr->car, val); genop(s, MKOP_ABx(OP_EXEC, cursp(), idx)); if (val) { push(); @@ -2324,7 +2327,7 @@ codegen(codegen_scope *s, node *tree, int val) codegen(s, tree->car, VAL); pop(); genop(s, MKOP_AB(OP_SCLASS, cursp(), cursp())); - idx = scope_body(s, tree->cdr->car); + idx = scope_body(s, tree->cdr->car, val); genop(s, MKOP_ABx(OP_EXEC, cursp(), idx)); if (val) { push(); diff --git a/src/load.c b/src/load.c index dd7da725c..247fce687 100644 --- a/src/load.c +++ b/src/load.c @@ -38,7 +38,7 @@ offset_crc_body(void) } static mrb_irep* -read_irep_record_1(mrb_state *mrb, const uint8_t *bin, uint32_t *len) +read_irep_record_1(mrb_state *mrb, const uint8_t *bin, uint32_t *len, mrb_bool alloc) { size_t i; const uint8_t *src = bin; @@ -98,7 +98,12 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, uint32_t *len) tt = *src++; //pool TT pool_data_len = bin_to_uint16(src); //pool data length src += sizeof(uint16_t); - s = mrb_str_new(mrb, (char *)src, pool_data_len); + if (alloc) { + s = mrb_str_new(mrb, (char *)src, pool_data_len); + } + else { + s = mrb_str_new_static(mrb, (char *)src, pool_data_len); + } src += pool_data_len; switch (tt) { //pool data case IREP_TT_FIXNUM: @@ -144,7 +149,12 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, uint32_t *len) continue; } - irep->syms[i] = mrb_intern(mrb, (char *)src, snl); + if (alloc) { + irep->syms[i] = mrb_intern(mrb, (char *)src, snl); + } + else { + irep->syms[i] = mrb_intern_static(mrb, (char *)src, snl); + } src += snl + 1; mrb_gc_arena_restore(mrb, ai); @@ -158,16 +168,16 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, uint32_t *len) } static mrb_irep* -read_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len) +read_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len, mrb_bool alloc) { - mrb_irep *irep = read_irep_record_1(mrb, bin, len); + mrb_irep *irep = read_irep_record_1(mrb, bin, len, alloc); size_t i; bin += *len; for (i=0; i<irep->rlen; i++) { uint32_t rlen; - irep->reps[i] = read_irep_record(mrb, bin, &rlen); + irep->reps[i] = read_irep_record(mrb, bin, &rlen, alloc); bin += rlen; *len += rlen; } @@ -175,12 +185,12 @@ read_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len) } static mrb_irep* -read_section_irep(mrb_state *mrb, const uint8_t *bin) +read_section_irep(mrb_state *mrb, const uint8_t *bin, mrb_bool alloc) { uint32_t len; bin += sizeof(struct rite_section_irep_header); - return read_irep_record(mrb, bin, &len); + return read_irep_record(mrb, bin, &len, alloc); } static int @@ -430,7 +440,7 @@ mrb_read_irep(mrb_state *mrb, const uint8_t *bin) do { section_header = (const struct rite_section_header *)bin; if (memcmp(section_header->section_identify, RITE_SECTION_IREP_IDENTIFIER, sizeof(section_header->section_identify)) == 0) { - irep = read_section_irep(mrb, bin); + irep = read_section_irep(mrb, bin, FALSE); if (!irep) return NULL; } else if (memcmp(section_header->section_identify, RITE_SECTION_LINENO_IDENTIFIER, sizeof(section_header->section_identify)) == 0) { @@ -561,7 +571,7 @@ read_irep_record_file(mrb_state *mrb, FILE *fp) if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) { return NULL; } - irep = read_irep_record_1(mrb, buf, &len); + irep = read_irep_record_1(mrb, buf, &len, TRUE); mrb_free(mrb, ptr); if (!irep) return NULL; for (i=0; i<irep->rlen; i++) { diff --git a/src/symbol.c b/src/symbol.c index 5ced22461..4e78ade66 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -77,7 +77,7 @@ mrb_intern(mrb_state *mrb, const char *name, size_t len) } mrb_sym -mrb_intern_literal(mrb_state *mrb, const char *name, size_t len) +mrb_intern_static(mrb_state *mrb, const char *name, size_t len) { return sym_intern(mrb, name, len, 1); } |
