summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-x[-rw-r--r--]src/class.c2
-rwxr-xr-x[-rw-r--r--]src/dump.c2
-rw-r--r--src/gc.c11
-rw-r--r--src/hash.c6
-rwxr-xr-x[-rw-r--r--]src/parse.y6
-rw-r--r--src/string.c73
-rwxr-xr-x[-rw-r--r--]src/vm.c9
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);
diff --git a/src/gc.c b/src/gc.c
index fa6c6e424..19354b301 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -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)