summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backtrace.c30
-rw-r--r--src/dump.c9
-rw-r--r--src/etc.c2
-rw-r--r--src/gc.c14
-rw-r--r--src/parse.y11
-rw-r--r--src/proc.c2
-rw-r--r--src/string.c52
-rw-r--r--src/symbol.c4
-rw-r--r--src/vm.c35
9 files changed, 94 insertions, 65 deletions
diff --git a/src/backtrace.c b/src/backtrace.c
index e6a28d471..7768a3206 100644
--- a/src/backtrace.c
+++ b/src/backtrace.c
@@ -14,9 +14,10 @@
#include "mruby/debug.h"
#include "mruby/error.h"
+#ifdef ENABLE_STDIO
+
typedef void (*output_stream_func)(mrb_state*, void*, int, const char*, ...);
-#ifdef ENABLE_STDIO
static void
print_backtrace_i(mrb_state *mrb, void *stream, int level, const char *format, ...)
{
@@ -26,7 +27,7 @@ print_backtrace_i(mrb_state *mrb, void *stream, int level, const char *format, .
vfprintf((FILE*)stream, format, ap);
va_end(ap);
}
-#endif
+
#define MIN_BUFSIZE 127
@@ -142,14 +143,12 @@ exc_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func fun
function to retrieve backtrace information from the exception.
note that if you call method after the exception, call stack will be
overwritten. So invoke these functions just after detecting exceptions.
-*/
+*/
void
mrb_print_backtrace(mrb_state *mrb)
{
-#ifdef ENABLE_STDIO
exc_output_backtrace(mrb, mrb->exc, print_backtrace_i, (void*)stderr);
-#endif
}
mrb_value
@@ -177,3 +176,24 @@ mrb_get_backtrace(mrb_state *mrb)
return ary;
}
+
+#else
+
+void
+mrb_print_backtrace(mrb_state *mrb)
+{
+}
+
+mrb_value
+mrb_exc_backtrace(mrb_state *mrb, mrb_value self)
+{
+ return mrb_ary_new(mrb);
+}
+
+mrb_value
+mrb_get_backtrace(mrb_state *mrb)
+{
+ return mrb_ary_new(mrb);
+}
+
+#endif
diff --git a/src/dump.c b/src/dump.c
index beaed7e7d..a2bcab99b 100644
--- a/src/dump.c
+++ b/src/dump.c
@@ -13,6 +13,8 @@
#include "mruby/numeric.h"
#include "mruby/debug.h"
+#ifdef ENABLE_STDIO
+
static size_t get_irep_record_size_1(mrb_state *mrb, mrb_irep *irep);
#if UINT32_MAX > SIZE_MAX
@@ -252,7 +254,7 @@ get_irep_record_size(mrb_state *mrb, mrb_irep *irep)
{
size_t size = 0;
size_t irep_no;
-
+
size = get_irep_record_size_1(mrb, irep);
for (irep_no = 0; irep_no < irep->rlen; irep_no++) {
size += get_irep_record_size(mrb, irep->reps[irep_no]);
@@ -603,7 +605,7 @@ write_debug_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const*
{
size_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++) {
@@ -802,9 +804,6 @@ error_exit:
return result;
}
-
-#ifdef ENABLE_STDIO
-
int
mrb_dump_irep_binary(mrb_state *mrb, mrb_irep *irep, int debug_info, FILE* fp)
{
diff --git a/src/etc.c b/src/etc.c
index 830c48433..58b1c91c0 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -108,7 +108,7 @@ mrb_obj_id(mrb_value obj)
{
mrb_int tt = mrb_type(obj);
-#define MakeID2(p,t) (((intptr_t)(p))^(t))
+#define MakeID2(p,t) (mrb_int)(((intptr_t)(p))^(t))
#define MakeID(p) MakeID2(p,tt)
switch (tt) {
diff --git a/src/gc.c b/src/gc.c
index 98a79ac69..2660ffcc7 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -441,7 +441,16 @@ mark_context_stack(mrb_state *mrb, struct mrb_context *c)
if (c->ci) e += c->ci->nregs;
if (c->stbase + e > c->stend) e = c->stend - c->stbase;
for (i=0; i<e; i++) {
- mrb_gc_mark_value(mrb, c->stbase[i]);
+ mrb_value v = c->stbase[i];
+
+ if (!mrb_immediate_p(v)) {
+ if (mrb_basic_ptr(v)->tt == MRB_TT_FREE) {
+ c->stbase[i] = mrb_nil_value();
+ }
+ else {
+ mrb_gc_mark(mrb, mrb_basic_ptr(v));
+ }
+ }
}
}
@@ -531,7 +540,7 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj)
{
struct mrb_context *c = ((struct RFiber*)obj)->cxt;
- mark_context(mrb, c);
+ if (c) mark_context(mrb, c);
}
break;
@@ -745,6 +754,7 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj)
size_t i;
mrb_callinfo *ci;
+ if (!c) break;
/* mark stack */
i = c->stack - c->stbase;
if (c->ci) i += c->ci->nregs;
diff --git a/src/parse.y b/src/parse.y
index 0d281feeb..aab1aaa40 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -3429,7 +3429,7 @@ peek_n(parser_state *p, int c, int n)
list = push(list, (node*)(intptr_t)c0);
} while(n--);
if (p->pb) {
- p->pb = append(p->pb, (node*)list);
+ p->pb = append((node*)list, p->pb);
}
else {
p->pb = list;
@@ -4189,8 +4189,13 @@ parser_yylex(parser_state *p)
case '=':
if (p->column == 1) {
- if (peeks(p, "begin\n")) {
- skips(p, "\n=end\n");
+ if (peeks(p, "begin ") || peeks(p, "begin\n")) {
+ if (skips(p, "\n=end ")) {
+ goto retry;
+ }
+ if (skips(p, "\n=end\n")) {
+ goto retry;
+ }
goto retry;
}
}
diff --git a/src/proc.c b/src/proc.c
index fa4c28fc8..b29bd5977 100644
--- a/src/proc.c
+++ b/src/proc.c
@@ -43,7 +43,7 @@ closure_setup(mrb_state *mrb, struct RProc *p, int nlocals)
e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)mrb->c->ci->proc->env);
MRB_ENV_STACK_LEN(e)= (unsigned int)nlocals;
e->mid = mrb->c->ci->mid;
- e->cioff = mrb->c->ci - mrb->c->cibase;
+ e->cioff = mrb->c->ci - mrb->c->cibase;
e->stack = mrb->c->stack;
mrb->c->ci->env = e;
}
diff --git a/src/string.c b/src/string.c
index f9d0791bd..aa4f6bed5 100644
--- a/src/string.c
+++ b/src/string.c
@@ -5,6 +5,7 @@
*/
#include <ctype.h>
+#include <float.h>
#include <limits.h>
#include <stddef.h>
#include <stdlib.h>
@@ -69,22 +70,25 @@ mrb_str_strlen(mrb_state *mrb, struct RString *s)
return max;
}
-#define RESIZE_CAPA(s,capacity) do {\
- if (STR_EMBED_P(s)) {\
- if (RSTRING_EMBED_LEN_MAX < (capacity)) {\
- char *const __tmp__ = (char *)mrb_malloc(mrb, (capacity)+1);\
- const mrb_int __len__ = STR_EMBED_LEN(s);\
- memcpy(__tmp__, s->as.ary, __len__);\
- STR_UNSET_EMBED_FLAG(s);\
- s->as.heap.ptr = __tmp__;\
- s->as.heap.len = __len__;\
- s->as.heap.aux.capa = (capacity);\
- }\
- } else {\
- s->as.heap.ptr = (char *)mrb_realloc(mrb, STR_PTR(s), (capacity)+1);\
- s->as.heap.aux.capa = capacity;\
- }\
-} while(0)
+static inline void
+resize_capa(mrb_state *mrb, struct RString *s, mrb_int capacity)
+{
+ if (STR_EMBED_P(s)) {
+ if (RSTRING_EMBED_LEN_MAX < capacity) {
+ char *const tmp = (char *)mrb_malloc(mrb, capacity+1);
+ const mrb_int len = STR_EMBED_LEN(s);
+ memcpy(tmp, s->as.ary, len);
+ STR_UNSET_EMBED_FLAG(s);
+ s->as.heap.ptr = tmp;
+ s->as.heap.len = len;
+ s->as.heap.aux.capa = capacity;
+ }
+ }
+ else {
+ s->as.heap.ptr = (char *)mrb_realloc(mrb, STR_PTR(s), capacity+1);
+ s->as.heap.aux.capa = capacity;
+ }
+}
static void
str_decref(mrb_state *mrb, mrb_shared_string *shared)
@@ -152,7 +156,7 @@ mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len)
slen = STR_LEN(s);
if (len != slen) {
if (slen < len || slen - len > 256) {
- RESIZE_CAPA(s, len);
+ resize_capa(mrb, s, len);
}
STR_SET_LEN(s, len);
STR_PTR(s)[len] = '\0'; /* sentinel */
@@ -162,13 +166,6 @@ mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len)
#define mrb_obj_alloc_string(mrb) ((struct RString*)mrb_obj_alloc((mrb), MRB_TT_STRING, (mrb)->string_class))
-/* char offset to byte offset */
-int
-mrb_str_offset(mrb_state *mrb, mrb_value str, int pos)
-{
- return pos;
-}
-
static struct RString*
str_new(mrb_state *mrb, const char *p, size_t len)
{
@@ -266,7 +263,7 @@ str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, size_t len)
}
capa = (capa + 1) * 2;
}
- RESIZE_CAPA(s, capa);
+ resize_capa(mrb, s, capa);
}
if (off != -1) {
ptr = STR_PTR(s) + off;
@@ -427,7 +424,7 @@ mrb_str_concat(mrb_state *mrb, mrb_value self, mrb_value other)
len = STR_LEN(s1) + STR_LEN(s2);
if (RSTRING_CAPA(self) < len) {
- RESIZE_CAPA(s1, len);
+ resize_capa(mrb, s1, len);
}
memcpy(STR_PTR(s1)+STR_LEN(s1), STR_PTR(s2), STR_LEN(s2));
STR_SET_LEN(s1, len);
@@ -2156,9 +2153,6 @@ mrb_cstr_to_dbl(mrb_state *mrb, const char * p, mrb_bool badcheck)
{
char *end;
double d;
-#if !defined(DBL_DIG)
-# define DBL_DIG 16
-#endif
enum {max_width = 20};
#define OutOfRange() (((w = end - p) > max_width) ? \
diff --git a/src/symbol.c b/src/symbol.c
index 21bf1db7c..cf8f549c5 100644
--- a/src/symbol.c
+++ b/src/symbol.c
@@ -47,7 +47,7 @@ sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit)
mrb_raise(mrb, E_ARGUMENT_ERROR, "symbol length too long");
}
sname.lit = lit;
- sname.len = len;
+ sname.len = (uint16_t)len;
sname.name = name;
k = kh_get(n2s, mrb, h, sname);
if (k != kh_end(h))
@@ -103,7 +103,7 @@ mrb_check_intern(mrb_state *mrb, const char *name, size_t len)
if (len > UINT16_MAX) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "symbol length too long");
}
- sname.len = len;
+ sname.len = (uint16_t)len;
sname.name = name;
k = kh_get(n2s, mrb, h, sname);
diff --git a/src/vm.c b/src/vm.c
index b175ef42f..9756d0c17 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -160,14 +160,14 @@ stack_extend_alloc(mrb_state *mrb, int room)
}
static inline void
-stack_extend(mrb_state *mrb, int room, int init, int keep)
+stack_extend(mrb_state *mrb, int room, int keep)
{
if (mrb->c->stack + room >= mrb->c->stend) {
stack_extend_alloc(mrb, room);
}
- if (init > keep) {
+ if (room > keep) {
/* do not leave uninitialized malloc region */
- stack_clear(&(mrb->c->stack[keep]), init - keep);
+ stack_clear(&(mrb->c->stack[keep]), room - keep);
}
}
@@ -234,6 +234,7 @@ cipush(mrb_state *mrb)
ci->env = 0;
ci->pc = 0;
ci->err = 0;
+ ci->proc = 0;
return ci;
}
@@ -380,11 +381,11 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
mrb->c->stack = mrb->c->stack + n;
if (MRB_PROC_CFUNC_P(p)) {
ci->nregs = argc + 2;
- stack_extend(mrb, ci->nregs, 0, 0);
+ stack_extend(mrb, ci->nregs, 0);
}
else {
ci->nregs = p->body.irep->nregs + n;
- stack_extend(mrb, ci->nregs, p->body.irep->nlocals, argc+2);
+ stack_extend(mrb, ci->nregs, argc+2);
}
mrb->c->stack[0] = self;
if (undef) {
@@ -513,11 +514,11 @@ mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value
mrb->c->stack = mrb->c->stack + n;
if (MRB_PROC_CFUNC_P(p)) {
ci->nregs = argc + 2;
- stack_extend(mrb, ci->nregs, 0, 0);
+ stack_extend(mrb, ci->nregs, 0);
}
else {
ci->nregs = p->body.irep->nregs + 1;
- stack_extend(mrb, ci->nregs, p->body.irep->nlocals, argc+2);
+ stack_extend(mrb, ci->nregs, argc+2);
}
mrb->c->stack[0] = self;
@@ -682,7 +683,7 @@ RETRY_TRY_BLOCK:
if (!mrb->c->stack) {
stack_init(mrb);
}
- stack_extend(mrb, irep->nregs, irep->nlocals, stack_keep);
+ stack_extend(mrb, irep->nregs, stack_keep);
mrb->c->ci->proc = proc;
mrb->c->ci->nregs = irep->nregs + 1;
regs = mrb->c->stack;
@@ -1047,11 +1048,11 @@ RETRY_TRY_BLOCK:
ci->nregs = irep->nregs;
if (n == CALL_MAXARGS) {
ci->argc = -1;
- stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, irep->nlocals, 3);
+ stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
}
else {
ci->argc = n;
- stack_extend(mrb, irep->nregs, irep->nlocals, n+2);
+ stack_extend(mrb, irep->nregs, n+2);
}
regs = mrb->c->stack;
pc = irep->iseq;
@@ -1111,10 +1112,10 @@ RETRY_TRY_BLOCK:
syms = irep->syms;
ci->nregs = irep->nregs;
if (ci->argc < 0) {
- stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, irep->nlocals, 3);
+ stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
}
else {
- stack_extend(mrb, irep->nregs, irep->nlocals, ci->argc+2);
+ stack_extend(mrb, irep->nregs, ci->argc+2);
}
regs = mrb->c->stack;
regs[0] = m->env->stack[0];
@@ -1186,10 +1187,10 @@ RETRY_TRY_BLOCK:
syms = irep->syms;
ci->nregs = irep->nregs;
if (n == CALL_MAXARGS) {
- stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, irep->nlocals, 3);
+ stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
}
else {
- stack_extend(mrb, irep->nregs, irep->nlocals, ci->argc+2);
+ stack_extend(mrb, irep->nregs, ci->argc+2);
}
regs = mrb->c->stack;
pc = irep->iseq;
@@ -1532,10 +1533,10 @@ RETRY_TRY_BLOCK:
pool = irep->pool;
syms = irep->syms;
if (ci->argc < 0) {
- stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, irep->nlocals, 3);
+ stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
}
else {
- stack_extend(mrb, irep->nregs, irep->nlocals, ci->argc+2);
+ stack_extend(mrb, irep->nregs, ci->argc+2);
}
regs = mrb->c->stack;
pc = irep->iseq;
@@ -2172,7 +2173,7 @@ RETRY_TRY_BLOCK:
irep = p->body.irep;
pool = irep->pool;
syms = irep->syms;
- stack_extend(mrb, irep->nregs, irep->nlocals, 1);
+ stack_extend(mrb, irep->nregs, 1);
ci->nregs = irep->nregs;
regs = mrb->c->stack;
pc = irep->iseq;