summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/codegen.c8
-rw-r--r--src/dump.c33
-rw-r--r--src/error.c8
-rw-r--r--src/error.h2
-rw-r--r--src/load.c8
-rw-r--r--src/vm.c25
-rw-r--r--tasks/toolchains/gcc.rake2
-rw-r--r--tools/mrbc/mrbc.c1
8 files changed, 50 insertions, 37 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 3162c44dd..f3e6e2f0c 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -113,19 +113,19 @@ codegen_palloc(codegen_scope *s, size_t len)
return p;
}
-void*
+static void*
codegen_malloc(codegen_scope *s, size_t len)
{
- void *p = mrb_malloc(s->mrb, len);
+ void *p = mrb_malloc_simple(s->mrb, len);
if (!p) codegen_error(s, "mrb_malloc");
return p;
}
-void*
+static void*
codegen_realloc(codegen_scope *s, void *p, size_t len)
{
- p = mrb_realloc(s->mrb, p, len);
+ p = mrb_realloc_simple(s->mrb, p, len);
if (!p && len > 0) codegen_error(s, "mrb_realloc");
return p;
diff --git a/src/dump.c b/src/dump.c
index 95c7d51e0..b10119b47 100644
--- a/src/dump.c
+++ b/src/dump.c
@@ -384,7 +384,7 @@ write_lineno_record(mrb_state *mrb, mrb_irep *irep, uint8_t* bin)
bin += rlen;
size += rlen;
for (i=0; i<irep->rlen; i++) {
- rlen = write_lineno_record_1(mrb, irep, bin);
+ rlen = write_lineno_record(mrb, irep, bin);
bin += rlen;
size += rlen;
}
@@ -405,7 +405,6 @@ write_section_lineno(mrb_state *mrb, mrb_irep *irep, uint8_t *bin)
section_size += sizeof(struct rite_section_lineno_header);
rlen = write_lineno_record(mrb, irep, cur);
- cur += rlen;
section_size += rlen;
write_section_lineno_header(mrb, section_size, bin);
@@ -483,7 +482,7 @@ get_filename_table_size(mrb_state *mrb, mrb_irep *irep, mrb_sym **fp, size_t *lp
if (find_filename_index(filenames, *lp, file->filename_sym) == -1) {
// register filename
*lp += 1;
- *fp = filenames = (mrb_sym *)mrb_realloc(mrb, filenames, sizeof(mrb_sym*) * (*lp));
+ *fp = filenames = (mrb_sym *)mrb_realloc(mrb, filenames, sizeof(mrb_sym) * (*lp));
filenames[*lp - 1] = file->filename_sym;
// filename
@@ -498,7 +497,7 @@ get_filename_table_size(mrb_state *mrb, mrb_irep *irep, mrb_sym **fp, size_t *lp
}
static int
-write_debug_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const* filenames, size_t filenames_len)
+write_debug_record_1(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const* filenames, size_t filenames_len)
{
uint8_t *cur;
uint32_t f_idx;
@@ -552,6 +551,22 @@ write_debug_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const*
}
static int
+write_debug_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const* filenames, size_t filenames_len)
+{
+ uint32_t size, len;
+ size_t irep_no;
+
+ size = len = write_debug_record_1(mrb, irep, bin, filenames, filenames_len);
+ bin += len;
+ for (irep_no = 0; irep_no < irep->rlen; irep_no++) {
+ len = write_debug_record(mrb, irep->reps[irep_no], bin, filenames, filenames_len);
+ bin += len;
+ size += len;
+ }
+ return size;
+}
+
+static int
write_filename_table(mrb_state *mrb, mrb_irep *irep, uint8_t **cp, mrb_sym **fp, size_t *lp)
{
uint8_t *cur = *cp;
@@ -602,7 +617,7 @@ write_section_debug(mrb_state *mrb, mrb_irep *irep, uint8_t *cur)
section_size += sizeof(struct rite_section_debug_header);
// filename table
- filenames = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym *) * 1);
+ filenames = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym) * 1);
filenames_len_out = cur;
cur += sizeof(uint16_t);
section_size += sizeof(uint16_t);
@@ -614,13 +629,7 @@ write_section_debug(mrb_state *mrb, mrb_irep *irep, uint8_t *cur)
// debug records
dlen = write_debug_record(mrb, irep, cur, filenames, filenames_len);
- cur += dlen;
section_size += dlen;
- for (i=0; i<irep->rlen; i++) {
- dlen = write_debug_record(mrb, irep->reps[i], cur, filenames, filenames_len);
- cur += dlen;
- section_size += dlen;
- }
memcpy(header->section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(header->section_identify));
uint32_to_bin(section_size, header->section_size);
@@ -686,7 +695,7 @@ dump_irep(mrb_state *mrb, mrb_irep *irep, int debug_info, uint8_t **bin, size_t
section_lineno_size += sizeof(struct rite_section_debug_header);
// filename table
- filenames = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym *) + 1);
+ filenames = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) + 1);
// filename table size
section_lineno_size += sizeof(uint16_t);
diff --git a/src/error.c b/src/error.c
index 10ba6170f..c12d2ed71 100644
--- a/src/error.c
+++ b/src/error.c
@@ -25,7 +25,7 @@ mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, long len)
}
mrb_value
-mrb_exc_new3(mrb_state *mrb, struct RClass* c, mrb_value str)
+mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value str)
{
str = mrb_str_to_str(mrb, str);
return mrb_funcall(mrb, mrb_obj_value(c), "new", 1, str);
@@ -231,7 +231,7 @@ mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg)
{
mrb_value mesg;
mesg = mrb_str_new_cstr(mrb, msg);
- mrb_exc_raise(mrb, mrb_exc_new3(mrb, c, mesg));
+ mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mesg));
}
mrb_value
@@ -297,7 +297,7 @@ mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...)
va_start(args, fmt);
mesg = mrb_vformat(mrb, fmt, args);
va_end(args);
- mrb_exc_raise(mrb, mrb_exc_new3(mrb, c, mesg));
+ mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mesg));
}
void
@@ -376,7 +376,7 @@ make_exception(mrb_state *mrb, int argc, mrb_value *argv, int isstr)
if (isstr) {
mesg = mrb_check_string_type(mrb, argv[0]);
if (!mrb_nil_p(mesg)) {
- mesg = mrb_exc_new3(mrb, E_RUNTIME_ERROR, mesg);
+ mesg = mrb_exc_new_str(mrb, E_RUNTIME_ERROR, mesg);
break;
}
}
diff --git a/src/error.h b/src/error.h
index 5aa4ca374..4d120e989 100644
--- a/src/error.h
+++ b/src/error.h
@@ -9,7 +9,7 @@
void mrb_sys_fail(mrb_state *mrb, const char *mesg);
int sysexit_status(mrb_state *mrb, mrb_value err);
-mrb_value mrb_exc_new3(mrb_state *mrb, struct RClass* c, mrb_value str);
+mrb_value mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value str);
mrb_value make_exception(mrb_state *mrb, int argc, mrb_value *argv, int isstr);
mrb_value mrb_make_exception(mrb_state *mrb, int argc, mrb_value *argv);
mrb_value mrb_format(mrb_state *mrb, const char *format, ...);
diff --git a/src/load.c b/src/load.c
index 989325f0b..fd0dc2801 100644
--- a/src/load.c
+++ b/src/load.c
@@ -489,8 +489,8 @@ mrb_load_irep(mrb_state *mrb, const uint8_t *bin)
static int
read_lineno_record_file(mrb_state *mrb, FILE *fp, mrb_irep *irep)
{
- const size_t record_header_size = 4;
- uint8_t header[record_header_size];
+ uint8_t header[4];
+ const size_t record_header_size = sizeof(header);
int result;
size_t i, buf_size;
uint32_t len;
@@ -539,8 +539,8 @@ read_section_lineno_file(mrb_state *mrb, FILE *fp, mrb_irep *irep)
static mrb_irep*
read_irep_record_file(mrb_state *mrb, FILE *fp)
{
- const size_t record_header_size = 1 + 4;
- uint8_t header[record_header_size];
+ uint8_t header[1 + 4];
+ const size_t record_header_size = sizeof(header);
size_t buf_size, i;
uint32_t len;
mrb_irep *irep = NULL;
diff --git a/src/vm.c b/src/vm.c
index 56e1de739..66541e4b1 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -490,7 +490,7 @@ localjump_error(mrb_state *mrb, localjump_error_kind kind)
msg = mrb_str_buf_new(mrb, sizeof(lead) + 7);
mrb_str_buf_cat(mrb, msg, lead, sizeof(lead) - 1);
mrb_str_buf_cat(mrb, msg, kind_str[kind], kind_str_len[kind]);
- exc = mrb_exc_new3(mrb, E_LOCALJUMP_ERROR, msg);
+ exc = mrb_exc_new_str(mrb, E_LOCALJUMP_ERROR, msg);
mrb->exc = mrb_obj_ptr(exc);
}
@@ -509,11 +509,12 @@ argnum_error(mrb_state *mrb, int num)
str = mrb_format(mrb, "wrong number of arguments (%S for %S)",
mrb_fixnum_value(mrb->c->ci->argc), mrb_fixnum_value(num));
}
- exc = mrb_exc_new3(mrb, E_ARGUMENT_ERROR, str);
+ exc = mrb_exc_new_str(mrb, E_ARGUMENT_ERROR, str);
mrb->exc = mrb_obj_ptr(exc);
}
-#define ERR_PC_HOOK(mrb, pc) mrb->c->ci->err = pc;
+#define ERR_PC_SET(mrb, pc) mrb->c->ci->err = pc;
+#define ERR_PC_CLR(mrb) mrb->c->ci->err = 0;
#ifdef ENABLE_DEBUG
#define CODE_FETCH_HOOK(mrb, irep, pc, regs) if ((mrb)->code_fetch_hook) (mrb)->code_fetch_hook((mrb), (irep), (pc), (regs));
#else
@@ -690,8 +691,9 @@ mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int
CASE(OP_GETCV) {
/* A B R(A) := ivget(Sym(B)) */
- ERR_PC_HOOK(mrb, pc);
+ ERR_PC_SET(mrb, pc);
regs[GETARG_A(i)] = mrb_vm_cv_get(mrb, syms[GETARG_Bx(i)]);
+ ERR_PC_CLR(mrb);
NEXT;
}
@@ -705,8 +707,9 @@ mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int
/* A B R(A) := constget(Sym(B)) */
mrb_value val;
- ERR_PC_HOOK(mrb, pc);
+ ERR_PC_SET(mrb, pc);
val = mrb_vm_const_get(mrb, syms[GETARG_Bx(i)]);
+ ERR_PC_CLR(mrb);
regs = mrb->c->stack;
regs[GETARG_A(i)] = val;
NEXT;
@@ -723,8 +726,9 @@ mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int
mrb_value val;
int a = GETARG_A(i);
- ERR_PC_HOOK(mrb, pc);
+ ERR_PC_SET(mrb, pc);
val = mrb_const_get(mrb, regs[a], syms[GETARG_Bx(i)]);
+ ERR_PC_CLR(mrb);
regs = mrb->c->stack;
regs[a] = val;
NEXT;
@@ -1281,7 +1285,7 @@ mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int
mrb->jmp = prev_jmp;
mrb_longjmp(mrb);
}
- while (eidx > ci->eidx) {
+ while (eidx > ci[-1].eidx) {
ecall(mrb, --eidx);
}
if (ci == mrb->c->cibase) {
@@ -1329,7 +1333,7 @@ mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int
goto L_RAISE;
}
if (mrb->c->prev->ci == mrb->c->prev->cibase) {
- mrb_value exc = mrb_exc_new3(mrb, E_RUNTIME_ERROR, mrb_str_new(mrb, "double resume", 13));
+ mrb_value exc = mrb_exc_new_str(mrb, E_RUNTIME_ERROR, mrb_str_new(mrb, "double resume", 13));
mrb->exc = mrb_obj_ptr(exc);
goto L_RAISE;
}
@@ -2122,6 +2126,7 @@ mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int
ecall(mrb, n);
}
}
+ mrb->c->ci->err = 0;
mrb->jmp = prev_jmp;
if (mrb->exc) {
return mrb_obj_value(mrb->exc);
@@ -2135,10 +2140,10 @@ mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int
mrb_value exc;
if (GETARG_A(i) == 0) {
- exc = mrb_exc_new3(mrb, E_RUNTIME_ERROR, msg);
+ exc = mrb_exc_new_str(mrb, E_RUNTIME_ERROR, msg);
}
else {
- exc = mrb_exc_new3(mrb, E_LOCALJUMP_ERROR, msg);
+ exc = mrb_exc_new_str(mrb, E_LOCALJUMP_ERROR, msg);
}
mrb->exc = mrb_obj_ptr(exc);
goto L_RAISE;
diff --git a/tasks/toolchains/gcc.rake b/tasks/toolchains/gcc.rake
index 66fa75dcb..9b0b39d5c 100644
--- a/tasks/toolchains/gcc.rake
+++ b/tasks/toolchains/gcc.rake
@@ -1,7 +1,7 @@
MRuby::Toolchain.new(:gcc) do |conf|
[conf.cc, conf.cxx, conf.objc, conf.asm].each do |cc|
cc.command = ENV['CC'] || 'gcc'
- cc.flags = [ENV['CFLAGS'] || %w(-g -O3 -Wall -Werror-implicit-function-declaration)]
+ cc.flags = [ENV['CFLAGS'] || %w(-g -std=gnu99 -O3 -Wall -Werror-implicit-function-declaration)]
cc.include_paths = ["#{MRUBY_ROOT}/include"]
cc.defines = %w(DISABLE_GEMS)
cc.option_include_path = '-I%s'
diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c
index 46d0d95ca..e2179d708 100644
--- a/tools/mrbc/mrbc.c
+++ b/tools/mrbc/mrbc.c
@@ -11,7 +11,6 @@
void mrb_show_version(mrb_state *);
void mrb_show_copyright(mrb_state *);
-void parser_dump(mrb_state*, struct mrb_ast_node*, int);
struct mrbc_args {
int argc;