summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mruby/proc.h2
-rw-r--r--include/mruby/string.h1
-rw-r--r--mrbgems/mruby-array-ext/mrblib/array.rb15
-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
-rw-r--r--test/t/syntax.rb16
-rw-r--r--travis_config.rb6
14 files changed, 119 insertions, 80 deletions
diff --git a/include/mruby/proc.h b/include/mruby/proc.h
index f05813b78..39f5eca22 100644
--- a/include/mruby/proc.h
+++ b/include/mruby/proc.h
@@ -17,7 +17,7 @@ struct REnv {
MRB_OBJECT_HEADER;
mrb_value *stack;
mrb_sym mid;
- int cioff;
+ ptrdiff_t cioff;
};
#define MRB_ENV_STACK_LEN(e) ((e)->flags)
diff --git a/include/mruby/string.h b/include/mruby/string.h
index 00122e7b3..dd73f5f1e 100644
--- a/include/mruby/string.h
+++ b/include/mruby/string.h
@@ -69,7 +69,6 @@ mrb_value mrb_str_buf_new(mrb_state *mrb, size_t capa);
char *mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr);
char *mrb_string_value_ptr(mrb_state *mrb, mrb_value ptr);
-int mrb_str_offset(mrb_state *mrb, mrb_value str, int pos);
mrb_value mrb_str_dup(mrb_state *mrb, mrb_value str);
mrb_value mrb_str_intern(mrb_state *mrb, mrb_value self);
mrb_value mrb_str_to_inum(mrb_state *mrb, mrb_value str, mrb_int base, mrb_bool badcheck);
diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb
index bddcd8ab8..3a4b1460b 100644
--- a/mrbgems/mruby-array-ext/mrblib/array.rb
+++ b/mrbgems/mruby-array-ext/mrblib/array.rb
@@ -675,16 +675,11 @@ class Array
def select!(&block)
return to_enum :select! unless block_given?
- idx = 0
- len = self.size
- while idx < self.size do
- if block.call(self[idx])
- idx += 1
- else
- self.delete_at(idx)
- end
+ result = []
+ self.each do |x|
+ result << x if block.call(x)
end
- return nil if self.size == len
- self
+ return nil if self.size == result.size
+ self.replace(result)
end
end
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;
diff --git a/test/t/syntax.rb b/test/t/syntax.rb
index 159b36574..0bb3fa389 100644
--- a/test/t/syntax.rb
+++ b/test/t/syntax.rb
@@ -293,3 +293,19 @@ end
assert('optional block argument in the rhs default expressions') do
assert_nil(Proc.new {|foo = foo| foo}.call)
end
+
+assert('multiline comments work correctly') do
+=begin
+this is a comment with nothing after begin and end
+=end
+=begin this is a comment
+this is a comment with extra after =begin
+=end
+=begin
+this is a comment that has =end with spaces after it
+=end
+=begin this is a comment
+this is a comment that has extra after =begin and =end with spaces after it
+=end
+ true
+end
diff --git a/travis_config.rb b/travis_config.rb
index 082a79643..fadafd8c1 100644
--- a/travis_config.rb
+++ b/travis_config.rb
@@ -6,7 +6,7 @@ MRuby::Build.new('debug') do |conf|
conf.gembox 'full-core'
conf.cc.flags += %w(-Werror=declaration-after-statement)
conf.compilers.each do |c|
- c.defines += %w(MRB_GC_FIXED_ARENA)
+ c.defines += %w(MRB_GC_STRESS MRB_GC_FIXED_ARENA)
end
end
@@ -17,7 +17,7 @@ MRuby::Build.new do |conf|
conf.gembox 'full-core'
conf.cc.flags += %w(-Werror=declaration-after-statement)
conf.compilers.each do |c|
- c.defines += %w(MRB_DEBUG MRB_GC_FIXED_ARENA)
+ c.defines += %w(MRB_GC_FIXED_ARENA)
end
conf.enable_bintest
end
@@ -28,7 +28,7 @@ MRuby::Build.new('cxx_abi') do |conf|
conf.gembox 'full-core'
conf.cc.flags += %w(-Werror=declaration-after-statement)
conf.compilers.each do |c|
- c.defines += %w(MRB_DEBUG MRB_GC_FIXED_ARENA)
+ c.defines += %w(MRB_GC_FIXED_ARENA)
end
conf.enable_bintest