summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--examples/targets/build_config_android_armeabi_v7a_neon_hard.rb28
-rw-r--r--include/mruby/numeric.h10
-rw-r--r--mrbgems/mruby-bin-mruby/bintest/mruby.rb4
-rw-r--r--mrbgems/mruby-compiler/core/parse.y74
-rw-r--r--mrbgems/mruby-eval/src/eval.c7
-rw-r--r--tasks/toolchains/android.rake78
6 files changed, 142 insertions, 59 deletions
diff --git a/examples/targets/build_config_android_armeabi_v7a_neon_hard.rb b/examples/targets/build_config_android_armeabi_v7a_neon_hard.rb
new file mode 100644
index 000000000..3788bba7f
--- /dev/null
+++ b/examples/targets/build_config_android_armeabi_v7a_neon_hard.rb
@@ -0,0 +1,28 @@
+MRuby::Build.new do |conf|
+
+ # Gets set by the VS command prompts.
+ if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR']
+ toolchain :visualcpp
+ else
+ toolchain :gcc
+ end
+
+ enable_debug
+
+ # include the default GEMs
+ conf.gembox 'default'
+end
+
+# Requires Android NDK r13 or later.
+MRuby::CrossBuild.new('android-armeabi-v7a-neon-hard') do |conf|
+ params = {
+ :arch => 'armeabi-v7a',
+ :mfpu => 'neon',
+ :mfloat_abi => 'hard',
+ :platform => 'android-24',
+ :toolchain => :clang,
+ }
+ toolchain :android, params
+
+ conf.gembox 'default'
+end
diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h
index e4086487e..36489b1ce 100644
--- a/include/mruby/numeric.h
+++ b/include/mruby/numeric.h
@@ -42,6 +42,16 @@ 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)
+#undef MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS
+#endif
+#endif
+
#ifdef MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS
#ifndef MRB_WORD_BOXING
diff --git a/mrbgems/mruby-bin-mruby/bintest/mruby.rb b/mrbgems/mruby-bin-mruby/bintest/mruby.rb
index 72ac6586d..b6b090185 100644
--- a/mrbgems/mruby-bin-mruby/bintest/mruby.rb
+++ b/mrbgems/mruby-bin-mruby/bintest/mruby.rb
@@ -2,9 +2,9 @@ require 'tempfile'
assert('regression for #1564') do
o = `#{cmd('mruby')} -e #{shellquote('<<')} 2>&1`
- assert_equal o, "-e:1:2: syntax error, unexpected tLSHFT\n"
+ assert_include o, "-e:1:2: syntax error"
o = `#{cmd('mruby')} -e #{shellquote('<<-')} 2>&1`
- assert_equal o, "-e:1:3: syntax error, unexpected tLSHFT\n"
+ assert_include o, "-e:1:3: syntax error"
end
assert('regression for #1572') do
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y
index f8e4eb72f..5be8bdc7f 100644
--- a/mrbgems/mruby-compiler/core/parse.y
+++ b/mrbgems/mruby-compiler/core/parse.y
@@ -3327,7 +3327,7 @@ none : /* none */
}
;
%%
-#define yylval (*((YYSTYPE*)(p->ylval)))
+#define pylval (*((YYSTYPE*)(p->ylval)))
static void
yyerror(parser_state *p, const char *s)
@@ -3962,7 +3962,7 @@ parse_string(parser_state *p)
yyerror(p, buf);
return 0;
}
- yylval.nd = new_str(p, tok(p), toklen(p));
+ pylval.nd = new_str(p, tok(p), toklen(p));
return tHD_STRING_MID;
}
if (c < 0) {
@@ -4035,7 +4035,7 @@ parse_string(parser_state *p)
tokfix(p);
p->lstate = EXPR_BEG;
p->cmd_start = TRUE;
- yylval.nd = new_str(p, tok(p), toklen(p));
+ pylval.nd = new_str(p, tok(p), toklen(p));
if (hinf) {
hinf->line_head = FALSE;
return tHD_STRING_PART;
@@ -4065,7 +4065,7 @@ parse_string(parser_state *p)
else {
pushback(p, c);
tokfix(p);
- yylval.nd = new_str(p, tok(p), toklen(p));
+ pylval.nd = new_str(p, tok(p), toklen(p));
return tSTRING_MID;
}
}
@@ -4077,7 +4077,7 @@ parse_string(parser_state *p)
end_strterm(p);
if (type & STR_FUNC_XQUOTE) {
- yylval.nd = new_xstr(p, tok(p), toklen(p));
+ pylval.nd = new_xstr(p, tok(p), toklen(p));
return tXSTRING;
}
@@ -4127,11 +4127,11 @@ parse_string(parser_state *p)
} else {
encp = NULL;
}
- yylval.nd = new_regx(p, s, dup, encp);
+ pylval.nd = new_regx(p, s, dup, encp);
return tREGEXP;
}
- yylval.nd = new_str(p, tok(p), toklen(p));
+ pylval.nd = new_str(p, tok(p), toklen(p));
if (IS_LABEL_POSSIBLE()) {
if (IS_LABEL_SUFFIX(0)) {
p->lstate = EXPR_BEG;
@@ -4209,7 +4209,7 @@ heredoc_identifier(parser_state *p)
p->heredocs_from_nextline = push(p->heredocs_from_nextline, newnode);
p->lstate = EXPR_END;
- yylval.nd = newnode;
+ pylval.nd = newnode;
return tHEREDOC_BEG;
}
@@ -4313,7 +4313,7 @@ parser_yylex(parser_state *p)
case '*':
if ((c = nextc(p)) == '*') {
if ((c = nextc(p)) == '=') {
- yylval.id = intern("**",2);
+ pylval.id = intern("**",2);
p->lstate = EXPR_BEG;
return tOP_ASGN;
}
@@ -4322,7 +4322,7 @@ parser_yylex(parser_state *p)
}
else {
if (c == '=') {
- yylval.id = intern_c('*');
+ pylval.id = intern_c('*');
p->lstate = EXPR_BEG;
return tOP_ASGN;
}
@@ -4438,7 +4438,7 @@ parser_yylex(parser_state *p)
}
if (c == '<') {
if ((c = nextc(p)) == '=') {
- yylval.id = intern("<<",2);
+ pylval.id = intern("<<",2);
p->lstate = EXPR_BEG;
return tOP_ASGN;
}
@@ -4460,7 +4460,7 @@ parser_yylex(parser_state *p)
}
if (c == '>') {
if ((c = nextc(p)) == '=') {
- yylval.id = intern(">>",2);
+ pylval.id = intern(">>",2);
p->lstate = EXPR_BEG;
return tOP_ASGN;
}
@@ -4557,7 +4557,7 @@ parser_yylex(parser_state *p)
tokadd(p, c);
}
tokfix(p);
- yylval.nd = new_str(p, tok(p), toklen(p));
+ pylval.nd = new_str(p, tok(p), toklen(p));
p->lstate = EXPR_END;
return tCHAR;
@@ -4565,7 +4565,7 @@ parser_yylex(parser_state *p)
if ((c = nextc(p)) == '&') {
p->lstate = EXPR_BEG;
if ((c = nextc(p)) == '=') {
- yylval.id = intern("&&",2);
+ pylval.id = intern("&&",2);
p->lstate = EXPR_BEG;
return tOP_ASGN;
}
@@ -4577,7 +4577,7 @@ parser_yylex(parser_state *p)
return tANDDOT;
}
else if (c == '=') {
- yylval.id = intern_c('&');
+ pylval.id = intern_c('&');
p->lstate = EXPR_BEG;
return tOP_ASGN;
}
@@ -4604,7 +4604,7 @@ parser_yylex(parser_state *p)
if ((c = nextc(p)) == '|') {
p->lstate = EXPR_BEG;
if ((c = nextc(p)) == '=') {
- yylval.id = intern("||",2);
+ pylval.id = intern("||",2);
p->lstate = EXPR_BEG;
return tOP_ASGN;
}
@@ -4612,7 +4612,7 @@ parser_yylex(parser_state *p)
return tOROP;
}
if (c == '=') {
- yylval.id = intern_c('|');
+ pylval.id = intern_c('|');
p->lstate = EXPR_BEG;
return tOP_ASGN;
}
@@ -4636,7 +4636,7 @@ parser_yylex(parser_state *p)
return '+';
}
if (c == '=') {
- yylval.id = intern_c('+');
+ pylval.id = intern_c('+');
p->lstate = EXPR_BEG;
return tOP_ASGN;
}
@@ -4664,7 +4664,7 @@ parser_yylex(parser_state *p)
return '-';
}
if (c == '=') {
- yylval.id = intern_c('-');
+ pylval.id = intern_c('-');
p->lstate = EXPR_BEG;
return tOP_ASGN;
}
@@ -4738,7 +4738,7 @@ parser_yylex(parser_state *p)
no_digits();
}
else if (nondigit) goto trailing_uc;
- yylval.nd = new_int(p, tok(p), 16);
+ pylval.nd = new_int(p, tok(p), 16);
return tINTEGER;
}
if (c == 'b' || c == 'B') {
@@ -4762,7 +4762,7 @@ parser_yylex(parser_state *p)
no_digits();
}
else if (nondigit) goto trailing_uc;
- yylval.nd = new_int(p, tok(p), 2);
+ pylval.nd = new_int(p, tok(p), 2);
return tINTEGER;
}
if (c == 'd' || c == 'D') {
@@ -4786,7 +4786,7 @@ parser_yylex(parser_state *p)
no_digits();
}
else if (nondigit) goto trailing_uc;
- yylval.nd = new_int(p, tok(p), 10);
+ pylval.nd = new_int(p, tok(p), 10);
return tINTEGER;
}
if (c == '_') {
@@ -4819,7 +4819,7 @@ parser_yylex(parser_state *p)
pushback(p, c);
tokfix(p);
if (nondigit) goto trailing_uc;
- yylval.nd = new_int(p, tok(p), 8);
+ pylval.nd = new_int(p, tok(p), 8);
return tINTEGER;
}
if (nondigit) {
@@ -4836,7 +4836,7 @@ parser_yylex(parser_state *p)
}
else {
pushback(p, c);
- yylval.nd = new_int(p, "0", 10);
+ pylval.nd = new_int(p, "0", 10);
return tINTEGER;
}
}
@@ -4920,10 +4920,10 @@ parser_yylex(parser_state *p)
yywarning_s(p, "float %s out of range", tok(p));
errno = 0;
}
- yylval.nd = new_float(p, tok(p));
+ pylval.nd = new_float(p, tok(p));
return tFLOAT;
}
- yylval.nd = new_int(p, tok(p), 10);
+ pylval.nd = new_int(p, tok(p), 10);
return tINTEGER;
}
@@ -4965,7 +4965,7 @@ parser_yylex(parser_state *p)
return tREGEXP_BEG;
}
if ((c = nextc(p)) == '=') {
- yylval.id = intern_c('/');
+ pylval.id = intern_c('/');
p->lstate = EXPR_BEG;
return tOP_ASGN;
}
@@ -4984,7 +4984,7 @@ parser_yylex(parser_state *p)
case '^':
if ((c = nextc(p)) == '=') {
- yylval.id = intern_c('^');
+ pylval.id = intern_c('^');
p->lstate = EXPR_BEG;
return tOP_ASGN;
}
@@ -5158,7 +5158,7 @@ parser_yylex(parser_state *p)
}
}
if ((c = nextc(p)) == '=') {
- yylval.id = intern_c('%');
+ pylval.id = intern_c('%');
p->lstate = EXPR_BEG;
return tOP_ASGN;
}
@@ -5212,7 +5212,7 @@ parser_yylex(parser_state *p)
tokadd(p, '$');
tokadd(p, c);
tokfix(p);
- yylval.id = intern_cstr(tok(p));
+ pylval.id = intern_cstr(tok(p));
return tGVAR;
case '-':
@@ -5222,7 +5222,7 @@ parser_yylex(parser_state *p)
pushback(p, c);
gvar:
tokfix(p);
- yylval.id = intern_cstr(tok(p));
+ pylval.id = intern_cstr(tok(p));
return tGVAR;
case '&': /* $&: last match */
@@ -5234,7 +5234,7 @@ parser_yylex(parser_state *p)
tokadd(p, c);
goto gvar;
}
- yylval.nd = new_back_ref(p, c);
+ pylval.nd = new_back_ref(p, c);
return tBACK_REF;
case '1': case '2': case '3':
@@ -5253,7 +5253,7 @@ parser_yylex(parser_state *p)
yyerror_i(p, "capture group index must be <= %d", INT_MAX);
return 0;
}
- yylval.nd = new_nth_ref(p, (int)n);
+ pylval.nd = new_nth_ref(p, (int)n);
}
return tNTH_REF;
@@ -5381,7 +5381,7 @@ parser_yylex(parser_state *p)
p->lstate = EXPR_BEG;
nextc(p);
tokfix(p);
- yylval.id = intern_cstr(tok(p));
+ pylval.id = intern_cstr(tok(p));
return tLABEL;
}
}
@@ -5392,10 +5392,10 @@ parser_yylex(parser_state *p)
kw = mrb_reserved_word(tok(p), toklen(p));
if (kw) {
enum mrb_lex_state_enum state = p->lstate;
- yylval.num = p->lineno;
+ pylval.num = p->lineno;
p->lstate = kw->state;
if (state == EXPR_FNAME) {
- yylval.id = intern_cstr(kw->name);
+ pylval.id = intern_cstr(kw->name);
return kw->id[0];
}
if (p->lstate == EXPR_BEG) {
@@ -5442,7 +5442,7 @@ parser_yylex(parser_state *p)
{
mrb_sym ident = intern_cstr(tok(p));
- yylval.id = ident;
+ pylval.id = ident;
#if 0
if (last_state != EXPR_DOT && islower(tok(p)[0]) && lvar_defined(ident)) {
p->lstate = EXPR_END;
diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c
index 81bc80280..907e3f666 100644
--- a/mrbgems/mruby-eval/src/eval.c
+++ b/mrbgems/mruby-eval/src/eval.c
@@ -131,6 +131,10 @@ patch_irep(mrb_state *mrb, mrb_irep *irep, int bnest)
}
}
break;
+
+ case OP_STOP:
+ irep->iseq[i] = MKOP_AB(OP_RETURN, irep->nlocals, OP_R_NORMAL);
+ break;
}
}
}
@@ -194,7 +198,8 @@ create_proc_from_string(mrb_state *mrb, char *s, int len, mrb_value binding, con
e->cioff = c->ci - c->cibase - 1;
e->stack = c->ci->stackent;
MRB_SET_ENV_STACK_LEN(e, c->ci[-1].proc->body.irep->nlocals);
- c->ci->env = e;
+ c->ci->target_class = proc->target_class;
+ c->ci->env = 0;
proc->env = e;
patch_irep(mrb, proc->body.irep, 0);
diff --git a/tasks/toolchains/android.rake b/tasks/toolchains/android.rake
index 7759a3f9c..e69dbf5a6 100644
--- a/tasks/toolchains/android.rake
+++ b/tasks/toolchains/android.rake
@@ -186,6 +186,22 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter
@platform
end
+ def armeabi_v7a_mfpu
+ @armeabi_v7a_mfpu ||= (params[:mfpu] || 'vfpv3-d16').to_s
+ end
+
+ def armeabi_v7a_mfloat_abi
+ @armeabi_v7a_mfloat_abi ||= (params[:mfloat_abi] || 'softfp').to_s
+ end
+
+ def no_warn_mismatch
+ if %W(soft softfp).include? armeabi_v7a_mfloat_abi
+ ''
+ else
+ ',--no-warn-mismatch'
+ end
+ end
+
def cc
case toolchain
when :gcc then bin_gcc('gcc')
@@ -200,36 +216,56 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter
end
end
- def cflags
+ def ctarget
flags = []
- flags += %W(-MMD -MP)
- flags += %W(-D__android__ -DANDROID --sysroot="#{sysroot}")
case toolchain
when :gcc
case arch
- when /armeabi-v7a/ then flags += %W(-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -fpic)
- when /armeabi/ then flags += %W(-march=armv5te -mtune=xscale -msoft-float -fpic)
- when /arm64-v8a/ then flags += %W(-march=armv8-a -fpic)
+ when /armeabi-v7a/ then flags += %W(-march=armv7-a)
+ when /armeabi/ then flags += %W(-march=armv5te)
+ when /arm64-v8a/ then flags += %W(-march=armv8-a)
when /x86_64/ then flags += %W(-march=x86-64)
when /x86/ then flags += %W(-march=i686)
- when /mips64/ then flags += %W(-march=mips64r6 -fmessage-length=0 -fpic)
- when /mips/ then flags += %W(-march=mips32 -fmessage-length=0 -fpic)
+ when /mips64/ then flags += %W(-march=mips64r6)
+ when /mips/ then flags += %W(-march=mips32)
end
when :clang
- flags += %W(-gcc-toolchain "#{gcc_toolchain_path.to_s}")
case arch
- when /armeabi-v7a/ then flags += %W(-target armv7-none-linux-androideabi -fpic)
- when /armeabi/ then flags += %W(-target armv5te-none-linux-androideabi -fpic)
- when /arm64-v8a/ then flags += %W(-target aarch64-none-linux-android -fpic)
- when /x86_64/ then flags += %W(-target x86_64-none-linux-android -fPIC)
- when /x86/ then flags += %W(-target i686-none-linux-android -fPIC)
- when /mips64/ then flags += %W(-target mips64el-none-linux-android -fmessage-length=0 -fpic)
- when /mips/ then flags += %W(-target mipsel-none-linux-android -fmessage-length=0 -fpic)
+ when /armeabi-v7a/ then flags += %W(-target armv7-none-linux-androideabi)
+ when /armeabi/ then flags += %W(-target armv5te-none-linux-androideabi)
+ when /arm64-v8a/ then flags += %W(-target aarch64-none-linux-android)
+ when /x86_64/ then flags += %W(-target x86_64-none-linux-android)
+ when /x86/ then flags += %W(-target i686-none-linux-android)
+ when /mips64/ then flags += %W(-target mips64el-none-linux-android)
+ when /mips/ then flags += %W(-target mipsel-none-linux-android)
end
- flags += %W(-Wno-invalid-command-line-argument -Wno-unused-command-line-argument)
end
- flags += %W(-ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes)
+
+ case arch
+ when /armeabi-v7a/ then flags += %W(-mfpu=#{armeabi_v7a_mfpu} -mfloat-abi=#{armeabi_v7a_mfloat_abi})
+ when /armeabi/ then flags += %W(-mtune=xscale -msoft-float)
+ when /arm64-v8a/ then flags += %W()
+ when /x86_64/ then flags += %W()
+ when /x86/ then flags += %W()
+ when /mips64/ then flags += %W(-fmessage-length=0)
+ when /mips/ then flags += %W(-fmessage-length=0)
+ end
+
+ flags
+ end
+
+ def cflags
+ flags = []
+
+ flags += %W(-MMD -MP -D__android__ -DANDROID --sysroot="#{sysroot}")
+ flags += ctarget
+ case toolchain
+ when :gcc
+ when :clang
+ flags += %W(-gcc-toolchain "#{gcc_toolchain_path.to_s}" -Wno-invalid-command-line-argument -Wno-unused-command-line-argument)
+ end
+ flags += %W(-fpic -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes)
flags
end
@@ -246,10 +282,14 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter
flags = []
case toolchain
+ when :gcc
+ case arch
+ when /armeabi-v7a/ then flags += %W(-Wl#{no_warn_mismatch})
+ end
when :clang
flags += %W(-gcc-toolchain "#{gcc_toolchain_path.to_s}")
case arch
- when /armeabi-v7a/ then flags += %W(-target armv7-none-linux-androideabi -Wl,--fix-cortex-a8)
+ when /armeabi-v7a/ then flags += %W(-target armv7-none-linux-androideabi -Wl,--fix-cortex-a8#{no_warn_mismatch})
when /armeabi/ then flags += %W(-target armv5te-none-linux-androideabi)
when /arm64-v8a/ then flags += %W(-target aarch64-none-linux-android)
when /x86_64/ then flags += %W(-target x86_64-none-linux-android)