summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/class.c2
-rw-r--r--src/crc.c2
-rw-r--r--src/gc.c20
-rw-r--r--src/hash.c24
-rw-r--r--src/load.c16
-rw-r--r--src/parse.y12
6 files changed, 42 insertions, 34 deletions
diff --git a/src/class.c b/src/class.c
index f94f9a933..6eb70dce6 100644
--- a/src/class.c
+++ b/src/class.c
@@ -487,7 +487,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
if (i < argc) {
ss = to_str(mrb, *sp++);
s = mrb_str_ptr(ss);
- if (strlen(s->ptr) != s->len) {
+ if (strlen(s->ptr) < s->len) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "String contains NUL");
}
*ps = s->ptr;
diff --git a/src/crc.c b/src/crc.c
index 463c7abe6..3bda7bc26 100644
--- a/src/crc.c
+++ b/src/crc.c
@@ -6,7 +6,7 @@
#include <limits.h>
#include <stdint.h>
-#include <sys/types.h>
+#include <stddef.h>
// Calculate CRC (CRC-16-CCITT)
//
diff --git a/src/gc.c b/src/gc.c
index 3e33c052c..6fc400e32 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -148,18 +148,28 @@ gettimeofday_time(void)
#define GC_STEP_SIZE 1024
+
void*
-mrb_realloc(mrb_state *mrb, void *p, size_t len)
+mrb_realloc_simple(mrb_state *mrb, void *p, size_t len)
{
void *p2;
p2 = (mrb->allocf)(mrb, p, len, mrb->ud);
-
if (!p2 && len > 0 && mrb->heaps) {
mrb_garbage_collect(mrb);
p2 = (mrb->allocf)(mrb, p, len, mrb->ud);
}
+ return p2;
+}
+
+
+void*
+mrb_realloc(mrb_state *mrb, void *p, size_t len)
+{
+ void *p2;
+
+ p2 = mrb_realloc_simple(mrb, p, len);
if (!p2 && len) {
if (mrb->out_of_memory) {
/* mrb_panic(mrb); */
@@ -183,6 +193,12 @@ mrb_malloc(mrb_state *mrb, size_t len)
}
void*
+mrb_malloc_simple(mrb_state *mrb, size_t len)
+{
+ return mrb_realloc_simple(mrb, 0, len);
+}
+
+void*
mrb_calloc(mrb_state *mrb, size_t nelem, size_t len)
{
void *p;
diff --git a/src/hash.c b/src/hash.c
index 5d78a6ea7..3684b3b40 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -145,7 +145,9 @@ mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val) /* mr
k = kh_get(ht, h, key);
if (k == kh_end(h)) {
/* expand */
+ int ai = mrb_gc_arena_save(mrb);
k = kh_put(ht, h, KEY(key));
+ mrb_gc_arena_restore(mrb, ai);
}
kh_value(h, k) = val;
@@ -169,7 +171,9 @@ mrb_hash_dup(mrb_state *mrb, mrb_value hash)
for (k = kh_begin(h); k != kh_end(h); k++) {
if (kh_exist(h,k)) {
+ int ai = mrb_gc_arena_save(mrb);
ret_k = kh_put(ht, ret_h, KEY(kh_key(h,k)));
+ mrb_gc_arena_restore(mrb, ai);
kh_val(ret_h, ret_k) = kh_val(h,k);
}
}
@@ -772,16 +776,9 @@ mrb_value
mrb_hash_empty_p(mrb_state *mrb, mrb_value self)
{
khash_t(ht) *h = RHASH_TBL(self);
- mrb_bool empty_p;
- if (h) {
- empty_p = (kh_size(h) == 0);
- }
- else {
- empty_p = 1;
- }
-
- return mrb_bool_value(empty_p);
+ if (h) return mrb_bool_value(kh_size(h) == 0);
+ return mrb_true_value();
}
static mrb_value
@@ -921,17 +918,12 @@ mrb_hash_has_keyWithKey(mrb_state *mrb, mrb_value hash, mrb_value key)
{
khash_t(ht) *h = RHASH_TBL(hash);
khiter_t k;
- mrb_bool result;
if (h) {
k = kh_get(ht, h, key);
- result = (k != kh_end(h));
- }
- else {
- result = 0;
+ return mrb_bool_value(k != kh_end(h));
}
-
- return mrb_bool_value(result);
+ return mrb_false_value();
}
/* 15.2.13.4.13 */
diff --git a/src/load.c b/src/load.c
index e832de628..092ddbde8 100644
--- a/src/load.c
+++ b/src/load.c
@@ -187,7 +187,6 @@ read_rite_section_irep(mrb_state *mrb, const uint8_t *bin)
{
int result;
size_t sirep;
- size_t i;
uint32_t len;
uint16_t nirep;
uint16_t n;
@@ -200,14 +199,14 @@ read_rite_section_irep(mrb_state *mrb, const uint8_t *bin)
nirep = bin_to_uint16(header->nirep);
//Read Binary Data Section
- for (n = 0, i = sirep; n < nirep; n++, i++) {
+ for (n = 0; n < nirep; n++) {
result = read_rite_irep_record(mrb, bin, &len);
if (result != MRB_DUMP_OK)
goto error_exit;
bin += len;
}
- result = sirep + bin_to_uint16(header->sirep);
+ result = nirep;
error_exit:
if (result < MRB_DUMP_OK) {
irep_free(sirep, mrb);
@@ -368,7 +367,7 @@ mrb_read_irep(mrb_state *mrb, const uint8_t *bin)
bin += bin_to_uint32(section_header->section_size);
} while (memcmp(section_header->section_identify, RITE_BINARY_EOF, sizeof(section_header->section_identify)) != 0);
- return total_nirep;
+ return sirep;
}
static void
@@ -464,7 +463,6 @@ read_rite_section_irep_file(mrb_state *mrb, FILE *fp)
{
int32_t result;
size_t sirep;
- size_t i;
uint16_t nirep;
uint16_t n;
uint32_t len, buf_size;
@@ -488,7 +486,7 @@ read_rite_section_irep_file(mrb_state *mrb, FILE *fp)
}
//Read Binary Data Section
- for (n = 0, i = sirep; n < nirep; n++, i++) {
+ for (n = 0; n < nirep; n++) {
void *ptr;
if (fread(buf, record_header_size, 1, fp) == 0) {
@@ -516,7 +514,7 @@ read_rite_section_irep_file(mrb_state *mrb, FILE *fp)
goto error_exit;
}
- result = sirep + bin_to_uint16(header.sirep);
+ result = nirep;
error_exit:
if (buf) {
mrb_free(mrb, buf);
@@ -567,7 +565,7 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp)
fpos = ftell(fp);
/* You don't need use SIZE_ERROR as block_size is enough small. */
for (i = 0; i < block_fallback_count; i++,block_size >>= 1){
- buf = mrb_malloc(mrb, block_size);
+ buf = mrb_malloc_simple(mrb, block_size);
if (buf) break;
}
if (!buf) {
@@ -614,7 +612,7 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp)
fseek(fp, fpos + section_size, SEEK_SET);
} while (memcmp(section_header.section_identify, RITE_BINARY_EOF, sizeof(section_header.section_identify)) != 0);
- return total_nirep;
+ return sirep;
}
mrb_value
diff --git a/src/parse.y b/src/parse.y
index 1d5366d17..fda66e92c 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -3620,12 +3620,14 @@ parse_string(parser_state *p)
tokadd(p, '\n');
}
else {
- pushback(p, c);
-
- if(type & STR_FUNC_REGEXP)
+ if (type & STR_FUNC_REGEXP) {
tokadd(p, '\\');
-
- tokadd(p, read_escape(p));
+ if (c != -1)
+ tokadd(p, c);
+ } else {
+ pushback(p, c);
+ tokadd(p, read_escape(p));
+ }
if (hinf)
hinf->line_head = FALSE;
}