From aa98c575f5f7ae2117f967a6c19f6ba60fe634e4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matz Matsumoto Date: Tue, 5 Mar 2013 00:34:23 +0900 Subject: proper irep pool duplication check for strings --- src/codegen.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/codegen.c b/src/codegen.c index 74b6e01f4..6f564586c 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -410,9 +410,27 @@ new_lit(codegen_scope *s, mrb_value val) { int i; - for (i=0; iirep->plen; i++) { - if (mrb_obj_equal(s->mrb, s->irep->pool[i], val)) return i; + + switch (mrb_type(val)) { + case MRB_TT_STRING: + for (i=0; iirep->plen; i++) { + mrb_value pv = s->irep->pool[i]; + mrb_int len; + + if (mrb_type(pv) != MRB_TT_STRING) continue; + if ((len = RSTRING_LEN(pv)) != RSTRING_LEN(val)) continue; + if (memcmp(RSTRING_PTR(pv), RSTRING_PTR(val), len) == 0) + return i; + } + break; + case MRB_TT_FLOAT: + default: + for (i=0; iirep->plen; i++) { + if (mrb_obj_equal(s->mrb, s->irep->pool[i], val)) return i; + } + break; } + if (s->irep->plen == s->pcapa) { s->pcapa *= 2; s->irep->pool = (mrb_value *)codegen_realloc(s, s->irep->pool, sizeof(mrb_value)*s->pcapa); -- cgit v1.2.3