summaryrefslogtreecommitdiffhomepage
path: root/src/load.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-12-25 08:49:18 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-12-25 08:49:18 +0900
commitbd76b2dea8202907febfb70002c164a0ddadbb39 (patch)
treefc396ba7462f6416d37ff2f268bd5453d672e559 /src/load.c
parentc6ceed22d9a262c489ce5e36fdfd5a9d7dcd4b25 (diff)
downloadmruby-bd76b2dea8202907febfb70002c164a0ddadbb39.tar.gz
mruby-bd76b2dea8202907febfb70002c164a0ddadbb39.zip
zero copy intern from static allocate irep
Diffstat (limited to 'src/load.c')
-rw-r--r--src/load.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/load.c b/src/load.c
index dd7da725c..30bd5d8be 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;
@@ -144,7 +144,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 +163,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 +180,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 +435,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 +566,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++) {