Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update mruby to the latest #1338

Merged
merged 2 commits into from
Jun 25, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
52 changes: 35 additions & 17 deletions deps/mruby/include/mruby.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ typedef struct {
mrb_value *stackent;
int nregs;
int ridx;
int eidx;
int epos;
struct REnv *env;
mrb_code *pc; /* return address */
mrb_code *err; /* error position */
Expand Down Expand Up @@ -143,7 +143,7 @@ struct mrb_context {
mrb_code **rescue; /* exception handler stack */
int rsize;
struct RProc **ensure; /* ensure handler stack */
int esize;
int esize, eidx;

enum mrb_fiber_state status;
mrb_bool vmexec;
Expand All @@ -152,14 +152,6 @@ struct mrb_context {

struct mrb_jmpbuf;

typedef struct {
const char *filename;
int lineno;
struct RClass *klass;
char sep;
mrb_sym method_id;
} mrb_backtrace_entry;

typedef void (*mrb_atexit_func)(struct mrb_state*);

#define MRB_STATE_NO_REGEXP 1
Expand All @@ -174,15 +166,9 @@ typedef struct mrb_state {

struct mrb_context *c;
struct mrb_context *root_c;
struct iv_tbl *globals; /* global variable table */

struct RObject *exc; /* exception */
struct {
struct RObject *exc;
int n;
int n_allocated;
mrb_backtrace_entry *entries;
} backtrace;
struct iv_tbl *globals; /* global variable table */

struct RObject *top_self;
struct RClass *object_class; /* Object class */
Expand Down Expand Up @@ -1121,6 +1107,11 @@ MRB_API mrb_value mrb_yield(mrb_state *mrb, mrb_value b, mrb_value arg);
MRB_API mrb_value mrb_yield_argv(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv);
MRB_API mrb_value mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv, mrb_value self, struct RClass *c);

/* continue execution to the proc */
/* this function should always be called as the last function of a method */
/* e.g. return mrb_yield_cont(mrb, proc, self, argc, argv); */
mrb_value mrb_yield_cont(mrb_state *mrb, mrb_value b, mrb_value self, mrb_int argc, const mrb_value *argv);

/* mrb_gc_protect() leaves the object in the arena */
MRB_API void mrb_gc_protect(mrb_state *mrb, mrb_value obj);
/* mrb_gc_register() keeps the object from GC. */
Expand Down Expand Up @@ -1187,6 +1178,33 @@ MRB_API void mrb_show_copyright(mrb_state *mrb);

MRB_API mrb_value mrb_format(mrb_state *mrb, const char *format, ...);

#if 0
/* memcpy and memset does not work with gdb reverse-next on my box */
/* use naive memcpy and memset instead */
#undef memcpy
#undef memset
static inline void*
mrbmemcpy(void *dst, const void *src, size_t n)
{
char *d = (char*)dst;
const char *s = (const char*)src;
while (n--)
*d++ = *s++;
return d;
}
#define memcpy(a,b,c) mrbmemcpy(a,b,c)

static inline void*
mrbmemset(void *s, int c, size_t n)
{
char *t = (char*)s;
while (n--)
*t++ = c;
return s;
}
#define memset(a,b,c) mrbmemset(a,b,c)
#endif

MRB_END_DECL

#endif /* MRUBY_H */
2 changes: 1 addition & 1 deletion deps/mruby/include/mruby/boxing_word.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float);
#define mrb_ptr(o) (o).value.p
#define mrb_cptr(o) (o).value.vp->p
#define mrb_float(o) (o).value.fp->f
#define mrb_fixnum(o) (o).value.i
#define mrb_fixnum(o) ((mrb_int)(o).value.i)
#define mrb_symbol(o) (o).value.sym

static inline enum mrb_vtype
Expand Down
2 changes: 1 addition & 1 deletion deps/mruby/include/mruby/class.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ mrb_class(mrb_state *mrb, mrb_value v)
}
}

// TODO: figure out where to put user flags
/* TODO: figure out where to put user flags */
#define MRB_FLAG_IS_FROZEN (1 << 18)
#define MRB_FLAG_IS_PREPENDED (1 << 19)
#define MRB_FLAG_IS_ORIGIN (1 << 20)
Expand Down
1 change: 0 additions & 1 deletion deps/mruby/include/mruby/compile.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,6 @@ MRB_API struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*,mrbc_context*);
MRB_API struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*,mrbc_context*);
MRB_API struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int,mrbc_context*);
MRB_API struct RProc* mrb_generate_code(mrb_state*, struct mrb_parser_state*);
MRB_API mrb_value mrb_load_exec(mrb_state *mrb, struct mrb_parser_state *p, mrbc_context *c);

/* program load functions */
#ifndef MRB_DISABLE_STDIO
Expand Down
2 changes: 1 addition & 1 deletion deps/mruby/include/mruby/dump.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ MRB_API mrb_irep *mrb_read_irep(mrb_state*, const uint8_t*);
/* Rite Binary File header */
#define RITE_BINARY_IDENT "RITE"
#define RITE_BINARY_IDENT_LIL "ETIR"
#define RITE_BINARY_FORMAT_VER "0003"
#define RITE_BINARY_FORMAT_VER "0004"
#define RITE_COMPILER_NAME "MATZ"
#define RITE_COMPILER_VERSION "0000"

Expand Down
7 changes: 7 additions & 0 deletions deps/mruby/include/mruby/error.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,13 @@ MRB_API mrb_noreturn void mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_va
/* declaration for fail method */
MRB_API mrb_value mrb_f_raise(mrb_state*, mrb_value);

struct RBreak {
MRB_OBJECT_HEADER;
struct iv_tbl *iv;
struct RProc *proc;
mrb_value val;
};

/**
* Protect
*
Expand Down
5 changes: 4 additions & 1 deletion deps/mruby/include/mruby/gc.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ MRB_BEGIN_DECL

struct mrb_state;

typedef void (mrb_each_object_callback)(struct mrb_state *mrb, struct RBasic *obj, void *data);
#define MRB_EACH_OBJ_OK 0
#define MRB_EACH_OBJ_BREAK 1
typedef int (mrb_each_object_callback)(struct mrb_state *mrb, struct RBasic *obj, void *data);
void mrb_objspace_each_objects(struct mrb_state *mrb, mrb_each_object_callback *callback, void *data);
MRB_API void mrb_free_context(struct mrb_state *mrb, struct mrb_context *c);

Expand Down Expand Up @@ -62,6 +64,7 @@ typedef struct mrb_gc {
size_t threshold;
int interval_ratio;
int step_ratio;
mrb_bool iterating :1;
mrb_bool disabled :1;
mrb_bool full :1;
mrb_bool generational :1;
Expand Down
2 changes: 1 addition & 1 deletion deps/mruby/include/mruby/hash.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ struct RHash {
#define mrb_hash_ptr(v) ((struct RHash*)(mrb_ptr(v)))
#define mrb_hash_value(p) mrb_obj_value((void*)(p))

MRB_API mrb_value mrb_hash_new_capa(mrb_state*, int);
MRB_API mrb_value mrb_hash_new_capa(mrb_state*, mrb_int);

/*
* Initializes a new hash.
Expand Down
8 changes: 8 additions & 0 deletions deps/mruby/include/mruby/numeric.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ MRB_BEGIN_DECL
#define NEGFIXABLE(f) ((f) >= MRB_INT_MIN)
#define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f))

#ifdef MRB_INT64
#define FIXABLE_FLOAT(f) FIXABLE((mrb_int)(f))
#else
#define FIXABLE_FLOAT(f) FIXABLE(f)
#endif

MRB_API mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val);
MRB_API mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base);
/* ArgumentError if format string doesn't match /%(\.[0-9]+)?[aAeEfFgG]/ */
Expand All @@ -42,9 +48,11 @@ mrb_value mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y);
# define MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS
#endif

/*
// Clang 3.8 and 3.9 have problem compiling mruby in 32-bit mode, when MRB_INT64 is set
// because of missing __mulodi4 and similar functions in its runtime. We need to use custom
// implementation for them.
*/
#ifdef MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS
#if defined(__clang__) && (__clang_major__ == 3) && (__clang_minor__ >= 8) && \
defined(MRB_32BIT) && defined(MRB_INT64)
Expand Down
7 changes: 6 additions & 1 deletion deps/mruby/include/mruby/proc.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,11 @@ MRB_BEGIN_DECL
struct REnv {
MRB_OBJECT_HEADER;
mrb_value *stack;
mrb_sym mid;
ptrdiff_t cioff;
union {
mrb_sym mid;
struct mrb_context *c;
} cxt;
};

#define MRB_SET_ENV_STACK_LEN(e,len) (e)->flags = (unsigned int)(len)
Expand Down Expand Up @@ -52,6 +55,8 @@ struct RProc {
#define MRB_PROC_CFUNC_P(p) (((p)->flags & MRB_PROC_CFUNC) != 0)
#define MRB_PROC_STRICT 256
#define MRB_PROC_STRICT_P(p) (((p)->flags & MRB_PROC_STRICT) != 0)
#define MRB_PROC_ORPHAN 512
#define MRB_PROC_ORPHAN_P(p) (((p)->flags & MRB_PROC_ORPHAN) != 0)

#define mrb_proc_ptr(v) ((struct RProc*)(mrb_ptr(v)))

Expand Down
12 changes: 11 additions & 1 deletion deps/mruby/include/mruby/value.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,8 @@ enum mrb_vtype {
MRB_TT_DATA, /* 21 */
MRB_TT_FIBER, /* 22 */
MRB_TT_ISTRUCT, /* 23 */
MRB_TT_MAXDEFINE /* 24 */
MRB_TT_BREAK, /* 24 */
MRB_TT_MAXDEFINE /* 25 */
};

#include <mruby/object.h>
Expand Down Expand Up @@ -266,6 +267,14 @@ mrb_undef_value(void)
}

#ifdef MRB_USE_ETEXT_EDATA
#if (defined(__APPLE__) && defined(__MACH__))
#include <mach-o/getsect.h>
static inline mrb_bool
mrb_ro_data_p(const char *p)
{
return (const char*)get_etext() < p && p < (const char*)get_edata();
}
#else
extern char _etext[];
#ifdef MRB_NO_INIT_ARRAY_START
extern char _edata[];
Expand All @@ -284,6 +293,7 @@ mrb_ro_data_p(const char *p)
return _etext < p && p < (char*)&__init_array_start;
}
#endif
#endif
#else
# define mrb_ro_data_p(p) FALSE
#endif
Expand Down
2 changes: 1 addition & 1 deletion deps/mruby/include/mruby/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ MRB_BEGIN_DECL
/*
* Minor release version number.
*/
#define MRUBY_RELEASE_MINOR 2
#define MRUBY_RELEASE_MINOR 3

/*
* Tiny release version number.
Expand Down
2 changes: 1 addition & 1 deletion deps/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,7 @@ main(int argc, char **argv)
char_index = 0;
while ((last_char = getchar()) != '\n') {
if (last_char == EOF) break;
if (char_index > sizeof(last_code_line)-2) {
if (char_index >= sizeof(last_code_line)-2) {
fputs("input string too long\n", stderr);
continue;
}
Expand Down
2 changes: 1 addition & 1 deletion deps/mruby/mrbgems/mruby-bin-mruby-config/mrbgem.rake
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ MRuby.each_target do
FileUtils.copy "#{File.dirname(__FILE__)}/#{mruby_config}", t.name
config = Hash[open("#{build_dir}/lib/libmruby.flags.mak").read.split("\n").map {|x| a = x.split(/\s*=\s*/, 2); [a[0], a[1].gsub('\\"', '"') ]}]
IO.write(t.name, File.open(t.name) {|f|
f.read.gsub (/echo (MRUBY_CFLAGS|MRUBY_LIBS|MRUBY_LDFLAGS_BEFORE_LIBS|MRUBY_LDFLAGS)/) {|x| config[$1].empty? ? '' : "echo #{config[$1]}"}
f.read.gsub (/echo (MRUBY_CFLAGS|MRUBY_LIBS|MRUBY_LDFLAGS_BEFORE_LIBS|MRUBY_LDFLAGS|MRUBY_LIBMRUBY_PATH)/) {|x| config[$1].empty? ? '' : "echo #{config[$1]}"}
})
FileUtils.chmod(0755, t.name)
end
Expand Down
4 changes: 3 additions & 1 deletion deps/mruby/mrbgems/mruby-bin-mruby-config/mruby-config
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ while [ $# -gt 0 ]; do
--ldflags) echo MRUBY_LDFLAGS;;
--ldflags-before-libs) echo MRUBY_LDFLAGS_BEFORE_LIBS;;
--libs) echo MRUBY_LIBS;;
--libmruby-path) echo MRUBY_LIBMRUBY_PATH;;
--help) echo "Usage: mruby-config [switches]"
echo " switches:"
echo " --cflags print flags passed to compiler"
echo " --ldflags print flags passed to linker"
echo " --ldflags-before-libs print flags passwd to linker before linked libraries"
echo " --ldflags-before-libs print flags passed to linker before linked libraries"
echo " --libs print linked libraries"
echo " --libmruby-path print libmruby path"
exit 0;;
esac
shift
Expand Down
8 changes: 7 additions & 1 deletion deps/mruby/mrbgems/mruby-bin-mruby-config/mruby-config.bat
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ if "%0" equ "--cflags" goto cflags
if "%0" equ "--ldflags" goto ldflags
if "%0" equ "--ldflags-before-libs" goto ldflagsbeforelibs
if "%0" equ "--libs" goto libs
if "%0" equ "--libmruby-path" goto libmrubypath
if "%0" equ "--help" goto showhelp
echo Invalid Option
goto :eof
Expand All @@ -27,10 +28,15 @@ goto top
echo MRUBY_LDFLAGS_BEFORE_LIBS
goto top

:libmrubypath
echo MRUBY_LIBMRUBY_PATH
goto top

:showhelp
echo Usage: mruby-config [switches]
echo switches:
echo --cflags print flags passed to compiler
echo --ldflags print flags passed to linker
echo --ldflags-before-libs print flags passwd to linker before linked libraries
echo --ldflags-before-libs print flags passed to linker before linked libraries
echo --libs print linked libraries
echo --libmruby-path print libmruby path
5 changes: 4 additions & 1 deletion deps/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,10 @@ main(int argc, char **argv)
mrb_gc_arena_restore(mrb, ai);
mrbc_context_free(mrb, c);
if (mrb->exc) {
if (!mrb_undef_p(v)) {
if (mrb_undef_p(v)) {
mrb_p(mrb, mrb_obj_value(mrb->exc));
}
else {
mrb_print_error(mrb);
}
n = -1;
Expand Down
9 changes: 9 additions & 0 deletions deps/mruby/mrbgems/mruby-compiler/bintest/mrbc.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,12 @@
assert_equal "#{cmd('mrbc')}:#{a.path}:Syntax OK", result.chomp
assert_equal 0, $?.exitstatus
end

assert('embedded document with invalid terminator') do
a, out = Tempfile.new('a.rb'), Tempfile.new('out.mrb')
a.write("=begin\n=endx\n")
a.flush
result = `#{cmd('mrbc')} -c -o #{out.path} #{a.path} 2>&1`
assert_equal "#{a.path}:3:0: embedded document meets end of file", result.chomp
assert_equal 1, $?.exitstatus
end