diff options
Diffstat (limited to 'src')
| -rwxr-xr-x[-rw-r--r--] | src/class.c | 2 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/dump.c | 2 | ||||
| -rw-r--r-- | src/gc.c | 11 | ||||
| -rw-r--r-- | src/hash.c | 6 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/parse.y | 6 | ||||
| -rw-r--r-- | src/string.c | 73 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/vm.c | 9 |
7 files changed, 68 insertions, 41 deletions
diff --git a/src/class.c b/src/class.c index 40335e039..0a29c3f63 100644..100755 --- a/src/class.c +++ b/src/class.c @@ -837,7 +837,7 @@ mrb_mod_included_modules(mrb_state *mrb, mrb_value self) return result; } -mrb_value class_instance_method_list(mrb_state*, int, struct RClass*, int); +mrb_value class_instance_method_list(mrb_state*, mrb_bool, struct RClass*, int); /* 15.2.2.4.33 */ /* diff --git a/src/dump.c b/src/dump.c index 209b0d369..b4a6e9382 100644..100755 --- a/src/dump.c +++ b/src/dump.c @@ -12,6 +12,8 @@ #include "mruby/irep.h" #include "mruby/numeric.h" +int sprintf(char*, const char*, ...); + static size_t get_irep_record_size(mrb_state *mrb, mrb_irep *irep); @@ -450,7 +450,7 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) case MRB_TT_HASH: mrb_gc_mark_iv(mrb, (struct RObject*)obj); - mrb_gc_mark_ht(mrb, (struct RHash*)obj); + mrb_gc_mark_hash(mrb, (struct RHash*)obj); break; case MRB_TT_STRING: @@ -525,14 +525,11 @@ obj_free(mrb_state *mrb, struct RBasic *obj) case MRB_TT_HASH: mrb_gc_free_iv(mrb, (struct RObject*)obj); - mrb_gc_free_ht(mrb, (struct RHash*)obj); + mrb_gc_free_hash(mrb, (struct RHash*)obj); break; case MRB_TT_STRING: - if (obj->flags & MRB_STR_SHARED) - mrb_str_decref(mrb, ((struct RString*)obj)->aux.shared); - else if ((obj->flags & MRB_STR_STATIC) == 0) - mrb_free(mrb, ((struct RString*)obj)->ptr); + mrb_gc_free_str(mrb, (struct RString*)obj); break; case MRB_TT_RANGE: @@ -654,7 +651,7 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj) case MRB_TT_HASH: children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj); - children += mrb_gc_mark_ht_size(mrb, (struct RHash*)obj); + children += mrb_gc_mark_hash_size(mrb, (struct RHash*)obj); break; case MRB_TT_PROC: diff --git a/src/hash.c b/src/hash.c index dcb833f5b..da5f49b02 100644 --- a/src/hash.c +++ b/src/hash.c @@ -46,7 +46,7 @@ mrb_hash_ht_key(mrb_state *mrb, mrb_value key) #define KEY(key) mrb_hash_ht_key(mrb, key) void -mrb_gc_mark_ht(mrb_state *mrb, struct RHash *hash) +mrb_gc_mark_hash(mrb_state *mrb, struct RHash *hash) { khiter_t k; khash_t(ht) *h = hash->ht; @@ -64,14 +64,14 @@ mrb_gc_mark_ht(mrb_state *mrb, struct RHash *hash) } size_t -mrb_gc_mark_ht_size(mrb_state *mrb, struct RHash *hash) +mrb_gc_mark_hash_size(mrb_state *mrb, struct RHash *hash) { if (!hash->ht) return 0; return kh_size(hash->ht)*2; } void -mrb_gc_free_ht(mrb_state *mrb, struct RHash *hash) +mrb_gc_free_hash(mrb_state *mrb, struct RHash *hash) { if (hash->ht) kh_destroy(ht, hash->ht); } diff --git a/src/parse.y b/src/parse.y index 816b4cec9..5eaa61b2a 100644..100755 --- a/src/parse.y +++ b/src/parse.y @@ -763,7 +763,7 @@ new_nth_ref(parser_state *p, int n) static node* new_heredoc(parser_state *p) { - parser_heredoc_info *inf = parser_palloc(p, sizeof(parser_heredoc_info)); + parser_heredoc_info *inf = (parser_heredoc_info *)parser_palloc(p, sizeof(parser_heredoc_info)); return cons((node*)NODE_HEREDOC, (node*)inf); } @@ -3415,7 +3415,7 @@ scan_hex(const int *start, int len, int *retlen) char *tmp; /* assert(len <= 2) */ - while (len-- && *s && (tmp = strchr(hexdigit, *s))) { + while (len-- && *s && (tmp = (char*)strchr(hexdigit, *s))) { retval <<= 4; retval |= (tmp - hexdigit) & 15; s++; @@ -3773,7 +3773,7 @@ heredoc_identifier(parser_state *p) info->term_len = toklen(p); if (! quote) type |= STR_FUNC_EXPAND; - info->type = type; + info->type = (string_type)type; info->allow_indent = indent; info->line_head = TRUE; info->doc = NULL; diff --git a/src/string.c b/src/string.c index 34769222a..7e66b8369 100644 --- a/src/string.c +++ b/src/string.c @@ -23,6 +23,16 @@ const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz"; +typedef struct mrb_shared_string { + mrb_bool nofree; + int refcnt; + char *ptr; + mrb_int len; +} mrb_shared_string; + +#define MRB_STR_SHARED 1 +#define MRB_STR_NOFREE 2 + static mrb_value str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2); static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len); @@ -31,13 +41,14 @@ static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_ s->aux.capa = capacity;\ } while(0) -void -mrb_str_decref(mrb_state *mrb, mrb_shared_string *shared) +static void +str_decref(mrb_state *mrb, mrb_shared_string *shared) { - if (shared->refcnt < 0) return; shared->refcnt--; if (shared->refcnt == 0) { - mrb_free(mrb, shared->ptr); + if (!shared->nofree) { + mrb_free(mrb, shared->ptr); + } mrb_free(mrb, shared); } } @@ -45,18 +56,6 @@ mrb_str_decref(mrb_state *mrb, mrb_shared_string *shared) void mrb_str_modify(mrb_state *mrb, struct RString *s) { - if (s->flags & MRB_STR_STATIC) { - char *p = s->ptr; - - s->ptr = (char *)mrb_malloc(mrb, (size_t)s->len+1); - if (p) { - memcpy(s->ptr, p, s->len); - } - s->ptr[s->len] = '\0'; - s->flags &= ~MRB_STR_STATIC; - return; - } - if (s->flags & MRB_STR_SHARED) { mrb_shared_string *shared = s->aux.shared; @@ -78,11 +77,22 @@ mrb_str_modify(mrb_state *mrb, struct RString *s) ptr[len] = 0; s->ptr = ptr; s->aux.capa = len; - mrb_str_decref(mrb, shared); + str_decref(mrb, shared); } s->flags &= ~MRB_STR_SHARED; return; } + if (s->flags & MRB_STR_NOFREE) { + char *p = s->ptr; + + s->ptr = (char *)mrb_malloc(mrb, (size_t)s->len+1); + if (p) { + memcpy(s->ptr, p, s->len); + } + s->ptr[s->len] = '\0'; + s->aux.capa = s->len; + return; + } } mrb_value @@ -270,12 +280,21 @@ mrb_str_new_static(mrb_state *mrb, const char *p, size_t len) s = mrb_obj_alloc_string(mrb); s->len = len; - s->aux.capa = len; + s->aux.capa = 0; /* nofree */ s->ptr = (char *)p; - s->flags |= MRB_STR_STATIC; + s->flags = MRB_STR_NOFREE; return mrb_obj_value(s); } +void +mrb_gc_free_str(mrb_state *mrb, struct RString *str) +{ + if (str->flags & MRB_STR_SHARED) + str_decref(mrb, str->aux.shared); + else if ((str->flags & MRB_STR_NOFREE) == 0) + mrb_free(mrb, str->ptr); +} + char * mrb_str_to_cstr(mrb_state *mrb, mrb_value str0) { @@ -298,13 +317,14 @@ str_make_shared(mrb_state *mrb, struct RString *s) if (!(s->flags & MRB_STR_SHARED)) { mrb_shared_string *shared = (mrb_shared_string *)mrb_malloc(mrb, sizeof(mrb_shared_string)); - if (s->flags & MRB_STR_STATIC) { - shared->refcnt = -1; /* should never be freed */ + shared->refcnt = 1; + if (s->flags & MRB_STR_NOFREE) { + shared->nofree = TRUE; shared->ptr = s->ptr; - s->flags &= ~MRB_STR_STATIC; + s->flags &= ~MRB_STR_NOFREE; } else { - shared->refcnt = 1; + shared->nofree = FALSE; if (s->aux.capa > s->len) { s->ptr = shared->ptr = (char *)mrb_realloc(mrb, s->ptr, s->len+1); } @@ -334,13 +354,12 @@ mrb_str_literal(mrb_state *mrb, mrb_value str) s = mrb_obj_alloc_string(mrb); orig = mrb_str_ptr(str); if (!(orig->flags & MRB_STR_SHARED)) { - str_make_shared(mrb, mrb_str_ptr(str)); + str_make_shared(mrb, orig); } shared = orig->aux.shared; shared->refcnt++; s->ptr = shared->ptr; s->len = shared->len; - s->aux.capa = 0; s->aux.shared = shared; s->flags |= MRB_STR_SHARED; @@ -1369,7 +1388,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2) if (s2->flags & MRB_STR_SHARED) { L_SHARE: if (s1->flags & MRB_STR_SHARED){ - mrb_str_decref(mrb, s1->aux.shared); + str_decref(mrb, s1->aux.shared); } else { mrb_free(mrb, s1->ptr); @@ -1386,7 +1405,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2) } else { if (s1->flags & MRB_STR_SHARED) { - mrb_str_decref(mrb, s1->aux.shared); + str_decref(mrb, s1->aux.shared); s1->flags &= ~MRB_STR_SHARED; s1->ptr = (char *)mrb_malloc(mrb, s2->len+1); } diff --git a/src/vm.c b/src/vm.c index 8da774b4b..4b2198195 100644..100755 --- a/src/vm.c +++ b/src/vm.c @@ -22,6 +22,15 @@ #include "opcode.h" #include "value_array.h" +#ifndef ENABLE_STDIO +#if defined(__cplusplus) +extern "C" { +#endif +void abort(void); +#if defined(__cplusplus) +} /* extern "C" { */ +#endif +#endif #define SET_TRUE_VALUE(r) MRB_SET_VALUE(r, MRB_TT_TRUE, value.i, 1) #define SET_FALSE_VALUE(r) MRB_SET_VALUE(r, MRB_TT_FALSE, value.i, 1) |
