summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gc.c30
-rw-r--r--src/numeric.c4
-rw-r--r--src/string.c8
3 files changed, 22 insertions, 20 deletions
diff --git a/src/gc.c b/src/gc.c
index 3e52b3433..c75a0f9aa 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -453,7 +453,7 @@ mrb_gc_unregister(mrb_state *mrb, mrb_value obj)
mrb_sym root = mrb_intern_lit(mrb, GC_ROOT_NAME);
mrb_value table = mrb_gv_get(mrb, root);
struct RArray *a;
- mrb_int i, len;
+ mrb_int i;
if (mrb_nil_p(table)) return;
if (mrb_type(table) != MRB_TT_ARRAY) {
@@ -462,14 +462,13 @@ mrb_gc_unregister(mrb_state *mrb, mrb_value obj)
}
a = mrb_ary_ptr(table);
mrb_ary_modify(mrb, a);
- len = a->len-1;
- for (i=0; i<len; i++) {
+ for (i = 0; i < a->len; i++) {
if (mrb_obj_eq(mrb, a->ptr[i], obj)) {
- memmove(&a->ptr[i], &a->ptr[i+1], len-i);
+ a->len--;
+ memmove(&a->ptr[i], &a->ptr[i + 1], (a->len - i) * sizeof(a->ptr[i]));
break;
}
}
- a->len--;
}
MRB_API struct RBasic*
@@ -742,10 +741,12 @@ obj_free(mrb_state *mrb, struct RBasic *obj)
{
struct REnv *e = (struct REnv*)obj;
- if (!MRB_ENV_STACK_SHARED_P(e)) {
- mrb_free(mrb, e->stack);
- e->stack = NULL;
+ if (MRB_ENV_STACK_SHARED_P(e)) {
+ /* cannot be freed */
+ return;
}
+ mrb_free(mrb, e->stack);
+ e->stack = NULL;
}
break;
@@ -1019,15 +1020,20 @@ incremental_sweep_phase(mrb_state *mrb, mrb_gc *gc, size_t limit)
if (is_dead(gc, &p->as.basic)) {
if (p->as.basic.tt != MRB_TT_FREE) {
obj_free(mrb, &p->as.basic);
- p->as.free.next = page->freelist;
- page->freelist = (struct RBasic*)p;
- freed++;
+ if (p->as.basic.tt == MRB_TT_FREE) {
+ p->as.free.next = page->freelist;
+ page->freelist = (struct RBasic*)p;
+ freed++;
+ }
+ else {
+ dead_slot = FALSE;
+ }
}
}
else {
if (!is_generational(gc))
paint_partial_white(gc, &p->as.basic); /* next gc target */
- dead_slot = 0;
+ dead_slot = FALSE;
}
p++;
}
diff --git a/src/numeric.c b/src/numeric.c
index 25a411de8..a9a2a641b 100644
--- a/src/numeric.c
+++ b/src/numeric.c
@@ -357,7 +357,11 @@ flo_shift(mrb_state *mrb, mrb_value x, mrb_int width)
while (width++) {
val /= 2;
}
+#if defined(_ISOC99_SOURCE)
val = trunc(val);
+#else
+ val = val > 0 ? floor(val) : ceil(val);
+#endif
if (val == 0 && mrb_float(x) < 0) {
return mrb_fixnum_value(-1);
}
diff --git a/src/string.c b/src/string.c
index a9351619b..a4f8085ec 100644
--- a/src/string.c
+++ b/src/string.c
@@ -2770,14 +2770,6 @@ mrb_init_string(mrb_state *mrb)
#include <ctype.h>
#include <errno.h>
-#ifndef __STDC__
-# ifdef __GNUC__
-# define const __const__
-# else
-# define const
-# endif
-#endif
-
static const int maxExponent = 511; /* Largest possible base 10 exponent. Any
* exponent larger than this will already
* produce underflow or overflow, so there's