From 49298af7b791a1afa5f0c2dd8e12914bae865b5c Mon Sep 17 00:00:00 2001 From: kyab Date: Thu, 6 Jun 2013 22:12:08 +0900 Subject: No need to specify empty bin list anymore(example) --- examples/targets/ArduinoDue.rb | 2 -- examples/targets/chipKitMax32.rb | 2 -- 2 files changed, 4 deletions(-) diff --git a/examples/targets/ArduinoDue.rb b/examples/targets/ArduinoDue.rb index efbe51e97..6e793d9b1 100644 --- a/examples/targets/ArduinoDue.rb +++ b/examples/targets/ArduinoDue.rb @@ -27,6 +27,4 @@ MRuby::CrossBuild.new("Arduino Due") do |conf| archiver.archive_options = 'rcs %{outfile} %{objs}' end - # No binaries necessary - conf.bins = [] end diff --git a/examples/targets/chipKitMax32.rb b/examples/targets/chipKitMax32.rb index 2fa97b05b..f7f734230 100644 --- a/examples/targets/chipKitMax32.rb +++ b/examples/targets/chipKitMax32.rb @@ -31,6 +31,4 @@ MRuby::CrossBuild.new("chipKitMax32") do |conf| archiver.archive_options = 'rcs %{outfile} %{objs}' end - # No binaries necessary - conf.bins = [] end -- cgit v1.2.3 From 5fbceaf4a1718f0a6c3f0d12912eebf068c2b303 Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Sat, 8 Jun 2013 10:38:09 -0400 Subject: new is removed from Integer so doesn't need to be removed again in Fixnum --- src/numeric.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/numeric.c b/src/numeric.c index 6b118dfb4..6cd82d8b6 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -1374,7 +1374,6 @@ mrb_init_numeric(mrb_state *mrb) mrb_define_method(mrb, integer, "to_int", int_to_i, MRB_ARGS_NONE()); fixnum = mrb->fixnum_class = mrb_define_class(mrb, "Fixnum", integer); - mrb_undef_class_method(mrb, fixnum, "new"); mrb_define_method(mrb, fixnum, "+", fix_plus, MRB_ARGS_REQ(1)); /* 15.2.8.3.1 */ mrb_define_method(mrb, fixnum, "-", fix_minus, MRB_ARGS_REQ(1)); /* 15.2.8.3.2 */ mrb_define_method(mrb, fixnum, "-@", fix_uminus, MRB_ARGS_REQ(1)); /* 15.2.7.4.2 */ -- cgit v1.2.3 From ab4ecac07b01c85342d477986d074279dad55021 Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Sat, 8 Jun 2013 10:42:18 -0400 Subject: bob doesn't have new so don't undef --- src/class.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class.c b/src/class.c index 4264129b6..7e3402b79 100644 --- a/src/class.c +++ b/src/class.c @@ -1873,7 +1873,6 @@ mrb_init_class(mrb_state *mrb) mrb_name_class(mrb, mod, mrb_intern(mrb, "Module")); mrb_name_class(mrb, cls, mrb_intern(mrb, "Class")); - mrb_undef_method(mrb, mod, "new"); MRB_SET_INSTANCE_TT(cls, MRB_TT_CLASS); mrb_define_method(mrb, bob, "initialize", mrb_bob_init, MRB_ARGS_NONE()); mrb_define_method(mrb, bob, "!", mrb_bob_not, MRB_ARGS_NONE()); -- cgit v1.2.3 From c75bfc93a3d8460a7355906ae080870aa152e32a Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Sat, 8 Jun 2013 10:43:34 -0400 Subject: Raise a NameError when symbol isn't found. --- src/class.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/class.c b/src/class.c index 7e3402b79..eaf25916c 100644 --- a/src/class.c +++ b/src/class.c @@ -1414,14 +1414,20 @@ mrb_mod_alias(mrb_state *mrb, mrb_value mod) return mrb_nil_value(); } - static void undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a) { - mrb_value m; + mrb_value m, val; - MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0); - mrb_define_method_vm(mrb, c, a, m); + if (!mrb_obj_respond_to(c, a)) { + val = mrb_iv_remove(mrb, mrb_obj_value(c), a); + if (mrb_undef_p(val)) { + mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c)); + } + } else { + MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0); + mrb_define_method_vm(mrb, c, a, m); + } } void -- cgit v1.2.3 From 01c0373facf0a93f21ffbc445dcf9203e155d337 Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Sat, 8 Jun 2013 11:10:41 -0400 Subject: Add undef var test --- test/t/class.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/t/class.rb b/test/t/class.rb index 72214a2fc..13845a49f 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -304,3 +304,10 @@ assert('Class Undef 2') do result1 == true and result2 == true end +assert('Var undef') do + assert_raise(NameError) do + a=1 + undef a + end +end + -- cgit v1.2.3 From c9caea64c81a2679ea7c832173aa3e30aa931f3e Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sun, 9 Jun 2013 11:21:51 +0800 Subject: Singleton raises TypeError on #new --- src/class.c | 3 +++ test/t/class.rb | 10 +++------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/class.c b/src/class.c index f446c56bc..f94f9a933 100644 --- a/src/class.c +++ b/src/class.c @@ -1047,6 +1047,9 @@ mrb_instance_new(mrb_state *mrb, mrb_value cv) mrb_value *argv; int argc; + if (c->tt == MRB_TT_SCLASS) + mrb_raise(mrb, E_TYPE_ERROR, "can't create instance of singleton class"); + if (ttype == 0) ttype = MRB_TT_OBJECT; o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c); obj = mrb_obj_value(o); diff --git a/test/t/class.rb b/test/t/class.rb index 13845a49f..c558c6437 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -30,13 +30,9 @@ assert('Class#initialize_copy', '15.2.3.3.2') do end assert('Class#new', '15.2.3.3.3') do - # at the moment no exception on singleton class - #e1 = nil - #begin - # class1 = e1.singleton_class.new - #rescue => e1 - # e2 = e1 - #end + assert_raise(TypeError, 'Singleton should raise TypeError') do + "a".singleton_class.new + end class TestClass def initialize args, &block -- cgit v1.2.3 From cf0fbcd0ee3772b97d93b4e20118b611a21564ab Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Sun, 9 Jun 2013 07:50:07 -0400 Subject: Remove incorrect removal of iv --- src/class.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/class.c b/src/class.c index eaf25916c..f446c56bc 100644 --- a/src/class.c +++ b/src/class.c @@ -1417,13 +1417,10 @@ mrb_mod_alias(mrb_state *mrb, mrb_value mod) static void undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a) { - mrb_value m, val; + mrb_value m; if (!mrb_obj_respond_to(c, a)) { - val = mrb_iv_remove(mrb, mrb_obj_value(c), a); - if (mrb_undef_p(val)) { - mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c)); - } + mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c)); } else { MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0); mrb_define_method_vm(mrb, c, a, m); -- cgit v1.2.3 From f8df722e923ab838dc3b38808c4d0fec225e6f6b Mon Sep 17 00:00:00 2001 From: h2so5 Date: Sun, 9 Jun 2013 22:59:23 +0900 Subject: Replace isupper with a macro in msvc --- src/parse.y | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/parse.y b/src/parse.y index 54e8eafce..bcab3a7bb 100644 --- a/src/parse.y +++ b/src/parse.y @@ -42,6 +42,10 @@ static void backref_error(parser_state *p, node *n); #define isascii(c) (((c) & ~0x7f) == 0) #endif +#ifdef _MSC_VER +#define isupper(c) ((c) >= 'A' && (c) <= 'Z') +#endif + #define identchar(c) (isalnum(c) || (c) == '_' || !isascii(c)) typedef unsigned int stack_type; -- cgit v1.2.3 From b5430460704f11dc177a8c7e7a7fcf46977def9b Mon Sep 17 00:00:00 2001 From: h2so5 Date: Mon, 10 Jun 2013 07:17:46 +0900 Subject: Use casting instead of a macro --- src/parse.y | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/parse.y b/src/parse.y index bcab3a7bb..f5dbdb6fd 100644 --- a/src/parse.y +++ b/src/parse.y @@ -42,10 +42,6 @@ static void backref_error(parser_state *p, node *n); #define isascii(c) (((c) & ~0x7f) == 0) #endif -#ifdef _MSC_VER -#define isupper(c) ((c) >= 'A' && (c) <= 'Z') -#endif - #define identchar(c) (isalnum(c) || (c) == '_' || !isascii(c)) typedef unsigned int stack_type; @@ -4929,7 +4925,7 @@ parser_yylex(parser_state *p) pushback(p, c); } } - if (result == 0 && isupper((int)tok(p)[0])) { + if (result == 0 && isupper((int)(unsigned char)tok(p)[0])) { result = tCONSTANT; } else { -- cgit v1.2.3 From 4e877bc92f4faac950d2b6269cd4f8a0d153a432 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 10 Jun 2013 14:40:32 +0900 Subject: restructure header files; move non config lines away from mrbconf.h --- include/mrbconf.h | 68 -------------------------------------------------- include/mruby.h | 4 ++- include/mruby/value.h | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 69 deletions(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index 0d65ae13a..57148d428 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -7,9 +7,6 @@ #ifndef MRUBYCONF_H #define MRUBYCONF_H -#include -#include - /* configuration options: */ /* add -DMRB_USE_FLOAT to use float instead of double for floating point numbers */ //#define MRB_USE_FLOAT @@ -67,49 +64,6 @@ /* end of configuration */ -#ifdef MRB_USE_FLOAT - typedef float mrb_float; -# define mrb_float_to_str(buf, i) sprintf(buf, "%.7e", i) -# define str_to_mrb_float(buf) strtof(buf, NULL) -#else - typedef double mrb_float; -# define mrb_float_to_str(buf, i) sprintf(buf, "%.16e", i) -# define str_to_mrb_float(buf) strtod(buf, NULL) -#endif - -#if defined(MRB_INT16) && defined(MRB_INT64) -# error "You can't define MRB_INT16 and MRB_INT64 at the same time." -#endif - -#if defined(MRB_INT64) -# ifdef MRB_NAN_BOXING -# error Cannot use NaN boxing when mrb_int is 64bit -# else - typedef int64_t mrb_int; -# define MRB_INT_MIN INT64_MIN -# define MRB_INT_MAX INT64_MAX -# define PRIdMRB_INT PRId64 -# define PRIiMRB_INT PRIi64 -# define PRIoMRB_INT PRIo64 -# define PRIxMRB_INT PRIx64 -# define PRIXMRB_INT PRIX64 -# endif -#elif defined(MRB_INT16) - typedef int16_t mrb_int; -# define MRB_INT_MIN INT16_MIN -# define MRB_INT_MAX INT16_MAX -#else - typedef int32_t mrb_int; -# define MRB_INT_MIN INT32_MIN -# define MRB_INT_MAX INT32_MAX -# define PRIdMRB_INT PRId32 -# define PRIiMRB_INT PRIi32 -# define PRIoMRB_INT PRIo32 -# define PRIxMRB_INT PRIx32 -# define PRIXMRB_INT PRIX32 -#endif -typedef short mrb_sym; - /* define ENABLE_XXXX from DISABLE_XXX */ #ifndef DISABLE_STDIO #define ENABLE_STDIO @@ -118,28 +72,6 @@ typedef short mrb_sym; #define DISABLE_DEBUG #endif -#ifdef _MSC_VER -# define _ALLOW_KEYWORD_MACROS -# include -# define inline __inline -# define snprintf _snprintf -# define isnan _isnan -# define isinf(n) (!_finite(n) && !_isnan(n)) -# define strtoll _strtoi64 -# define PRId32 "I32d" -# define PRIi32 "I32i" -# define PRIo32 "I32o" -# define PRIx32 "I32x" -# define PRIX32 "I32X" -# define PRId64 "I64d" -# define PRIi64 "I64i" -# define PRIo64 "I64o" -# define PRIx64 "I64x" -# define PRIX64 "I64X" -#else -# include -#endif - #ifdef ENABLE_STDIO # include #endif diff --git a/include/mruby.h b/include/mruby.h index ce2fa79ae..33a15de0e 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -32,8 +32,10 @@ extern "C" { #endif -#include "mrbconf.h" +#include +#include +#include "mrbconf.h" #include "mruby/value.h" typedef uint32_t mrb_code; diff --git a/include/mruby/value.h b/include/mruby/value.h index 86f51eae2..06241ec76 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -7,6 +7,71 @@ #ifndef MRUBY_VALUE_H #define MRUBY_VALUE_H +#ifdef MRB_USE_FLOAT + typedef float mrb_float; +# define mrb_float_to_str(buf, i) sprintf(buf, "%.7e", i) +# define str_to_mrb_float(buf) strtof(buf, NULL) +#else + typedef double mrb_float; +# define mrb_float_to_str(buf, i) sprintf(buf, "%.16e", i) +# define str_to_mrb_float(buf) strtod(buf, NULL) +#endif + +#if defined(MRB_INT16) && defined(MRB_INT64) +# error "You can't define MRB_INT16 and MRB_INT64 at the same time." +#endif + +#if defined(MRB_INT64) +# ifdef MRB_NAN_BOXING +# error Cannot use NaN boxing when mrb_int is 64bit +# else + typedef int64_t mrb_int; +# define MRB_INT_MIN INT64_MIN +# define MRB_INT_MAX INT64_MAX +# define PRIdMRB_INT PRId64 +# define PRIiMRB_INT PRIi64 +# define PRIoMRB_INT PRIo64 +# define PRIxMRB_INT PRIx64 +# define PRIXMRB_INT PRIX64 +# endif +#elif defined(MRB_INT16) + typedef int16_t mrb_int; +# define MRB_INT_MIN INT16_MIN +# define MRB_INT_MAX INT16_MAX +#else + typedef int32_t mrb_int; +# define MRB_INT_MIN INT32_MIN +# define MRB_INT_MAX INT32_MAX +# define PRIdMRB_INT PRId32 +# define PRIiMRB_INT PRIi32 +# define PRIoMRB_INT PRIo32 +# define PRIxMRB_INT PRIx32 +# define PRIXMRB_INT PRIX32 +#endif +typedef short mrb_sym; + +#ifdef _MSC_VER +# define _ALLOW_KEYWORD_MACROS +# include +# define inline __inline +# define snprintf _snprintf +# define isnan _isnan +# define isinf(n) (!_finite(n) && !_isnan(n)) +# define strtoll _strtoi64 +# define PRId32 "I32d" +# define PRIi32 "I32i" +# define PRIo32 "I32o" +# define PRIx32 "I32x" +# define PRIX32 "I32X" +# define PRId64 "I64d" +# define PRIi64 "I64i" +# define PRIo64 "I64o" +# define PRIx64 "I64x" +# define PRIX64 "I64X" +#else +# include +#endif + typedef uint8_t mrb_bool; struct mrb_state; @@ -16,6 +81,10 @@ struct mrb_state; # error ---->> MRB_NAN_BOXING and MRB_USE_FLOAT conflict <<---- #endif +#ifdef MRB_INT64 +# error ---->> MRB_NAN_BOXING and MRB_INT64 conflict <<---- +#endif + enum mrb_vtype { MRB_TT_FALSE = 1, /* 1 */ MRB_TT_FREE, /* 2 */ -- cgit v1.2.3 From ae288fe78dd610fe471200db0c73b00d9aca6dc0 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 11 Jun 2013 12:43:42 +0900 Subject: add assertion that check sizeof(void*) should be 4 bytes when MRB_NAN_BOXING is in use --- src/state.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/state.c b/src/state.c index 76b506d3e..34de1e45e 100644 --- a/src/state.c +++ b/src/state.c @@ -21,12 +21,22 @@ inspect_main(mrb_state *mrb, mrb_value mod) return mrb_str_new(mrb, "main", 4); } +#ifdef MRB_NAN_BOXING +#include +#endif + mrb_state* mrb_open_allocf(mrb_allocf f, void *ud) { static const mrb_state mrb_state_zero = { 0 }; static const struct mrb_context mrb_context_zero = { 0 }; - mrb_state *mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state), ud); + mrb_state *mrb; + +#ifdef MRB_NAN_BOXING + assert(sizeof(void*) == 4); +#endif + + mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state), ud); if (mrb == NULL) return NULL; *mrb = mrb_state_zero; -- cgit v1.2.3 From 97b9caf8924c0aec76d53c56666e3bf0d13f39fd Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Tue, 11 Jun 2013 16:09:12 +0900 Subject: Check parameters strictly. calloc in C99 is expected to return NULL when nelem * len == 0. --- src/gc.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/gc.c b/src/gc.c index 6419726eb..293fbf948 100644 --- a/src/gc.c +++ b/src/gc.c @@ -184,15 +184,19 @@ mrb_malloc(mrb_state *mrb, size_t len) void* mrb_calloc(mrb_state *mrb, size_t nelem, size_t len) { - void *p = NULL; - size_t size; + void *p; - if (nelem <= SIZE_MAX / len) { + if (nelem > 0 && len > 0 && + nelem <= SIZE_MAX / len) { + size_t size; size = nelem * len; p = mrb_realloc(mrb, 0, size); - if (p && size > 0) + if (p) { memset(p, 0, size); + } + } else { + p = NULL; } return p; -- cgit v1.2.3