summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--README.md11
-rw-r--r--Rakefile2
-rw-r--r--include/mruby.h3
-rw-r--r--include/mruby/gc.h13
-rw-r--r--include/mruby/version.h27
-rw-r--r--mrbgems/mruby-bin-mirb/tools/mirb/mirb.c4
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c6
-rw-r--r--mrbgems/mruby-objectspace/src/mruby_objectspace.c46
-rw-r--r--mrbgems/mruby-proc-ext/src/proc.c2
-rw-r--r--mrbgems/mruby-time/src/time.c2
-rw-r--r--mrblib/array.rb2
-rw-r--r--mrblib/hash.rb1
-rw-r--r--mrblib/range.rb1
-rw-r--r--mrblib/string.rb2
-rw-r--r--src/array.c22
-rw-r--r--src/class.c225
-rw-r--r--src/codegen.c21
-rw-r--r--src/gc.c32
-rw-r--r--src/hash.c7
-rw-r--r--src/init.c2
-rw-r--r--src/kernel.c18
-rw-r--r--src/numeric.c15
-rw-r--r--src/object.c6
-rw-r--r--src/print.c9
-rw-r--r--src/range.c2
-rw-r--r--src/state.c2
-rw-r--r--src/string.c2
-rw-r--r--src/version.c13
-rw-r--r--src/vm.c2
-rw-r--r--test/driver.c4
-rw-r--r--test/t/float.rb7
-rw-r--r--test/t/localjumperror.rb8
32 files changed, 292 insertions, 227 deletions
diff --git a/README.md b/README.md
index 7df6786b2..0f247699f 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,11 @@ the Ministry of Economy, Trade and Industry of Japan.
## How to get mruby
-The mruby distribution files can be found in the following site:
+The stable version 1.0.0 of mruby can be downloaded via the following URL:
+
+ https://github.com/mruby/mruby/archive/1.0.0.zip
+
+The latest mruby development version of can be downloaded via the following URL:
https://github.com/mruby/mruby/zipball/master
@@ -31,11 +35,6 @@ following command:
$ git clone https://github.com/mruby/mruby.git
-There are some other branches under development. Try the following
-command and see the list of branches:
-
- $ git branch -r
-
## mruby home-page
diff --git a/Rakefile b/Rakefile
index c230a5f2f..67aa64d4e 100644
--- a/Rakefile
+++ b/Rakefile
@@ -61,7 +61,7 @@ MRuby.each_target do |target|
gem_flags_after_libraries = gems.map { |g| g.linker.flags_after_libraries }
gem_libraries = gems.map { |g| g.linker.libraries }
gem_library_paths = gems.map { |g| g.linker.library_paths }
- linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries
+ linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries, gem_flags_after_libraries
end
if target == MRuby.targets['host']
diff --git a/include/mruby.h b/include/mruby.h
index 461443518..61bb80ea3 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -186,6 +186,8 @@ struct RClass * mrb_module_new(mrb_state *mrb);
mrb_bool mrb_class_defined(mrb_state *mrb, const char *name);
struct RClass * mrb_class_get(mrb_state *mrb, const char *name);
struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
+struct RClass * mrb_module_get(mrb_state *mrb, const char *name);
+struct RClass * mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj);
mrb_value mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method);
@@ -252,6 +254,7 @@ void mrb_free(mrb_state*, void*);
mrb_value mrb_str_new(mrb_state *mrb, const char *p, size_t len);
mrb_value mrb_str_new_cstr(mrb_state*, const char*);
mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len);
+#define mrb_str_new_lit(mrb, lit) mrb_str_new_static(mrb, (lit), sizeof(lit) - 1)
mrb_state* mrb_open(void);
mrb_state* mrb_open_allocf(mrb_allocf, void *ud);
diff --git a/include/mruby/gc.h b/include/mruby/gc.h
index 7afa24b48..02714be8e 100644
--- a/include/mruby/gc.h
+++ b/include/mruby/gc.h
@@ -7,11 +7,16 @@
#ifndef MRUBY_GC_H
#define MRUBY_GC_H
-#include "mruby.h"
-#include "mruby/value.h"
+#if defined(__cplusplus)
+extern "C" {
+#endif
-typedef void (each_object_callback)(mrb_state *mrb, struct RBasic* obj, void *data);
-void mrb_objspace_each_objects(mrb_state *mrb, each_object_callback* callback, void *data);
+typedef void (mrb_each_object_callback)(mrb_state *mrb, struct RBasic *obj, void *data);
+void mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data);
void mrb_free_context(mrb_state *mrb, struct mrb_context *c);
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
#endif /* MRUBY_GC_H */
diff --git a/include/mruby/version.h b/include/mruby/version.h
new file mode 100644
index 000000000..9105229b9
--- /dev/null
+++ b/include/mruby/version.h
@@ -0,0 +1,27 @@
+#define MRUBY_RUBY_VERSION "1.9"
+#define MRUBY_VERSION "v1.0.0"
+
+#define MRUBY_RELEASE_MAJOR 1
+#define MRUBY_RELEASE_MINOR 0
+#define MRUBY_RELEASE_TEENY 1
+#define MRUBY_RELEASE_NO 10001
+#define MRUBY_RELEASE_DATE "2014-01-10"
+#define MRUBY_RELEASE_YEAR 2014
+#define MRUBY_RELEASE_MONTH 1
+#define MRUBY_RELEASE_DAY 10
+
+#define MRUBY_BIRTH_YEAR 2010
+
+#define MRUBY_AUTHOR "mruby developers"
+
+#define STRINGIZE0(expr) #expr
+#define STRINGIZE(expr) STRINGIZE0(expr)
+
+#define MRUBY_DESCRIPTION \
+ "mruby "MRUBY_VERSION \
+ " ("MRUBY_RELEASE_DATE") "
+#define MRUBY_COPYRIGHT \
+ "mruby - Copyright (c) " \
+ STRINGIZE(MRUBY_BIRTH_YEAR)"-" \
+ STRINGIZE(MRUBY_RELEASE_YEAR)" " \
+ MRUBY_AUTHOR
diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
index db319fd99..183003307 100644
--- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
+++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
@@ -215,9 +215,7 @@ cleanup(mrb_state *mrb, struct _args *args)
static void
print_hint(void)
{
- printf("mirb - Embeddable Interactive Ruby Shell\n");
- printf("\nThis is a very early version, please test and report errors.\n");
- printf("Thanks :)\n\n");
+ printf("mirb - Embeddable Interactive Ruby Shell\n\n");
}
/* Print the command line prompt of the REPL */
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index 757eb235d..9e6be1471 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -218,9 +218,15 @@ static mrb_value
fiber_yield(mrb_state *mrb, mrb_value self)
{
struct mrb_context *c = mrb->c;
+ mrb_callinfo *ci;
mrb_value *a;
int len;
+ for (ci = c->ci; ci >= c->cibase; ci--) {
+ if (ci->acc < 0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "can't cross C function boundary");
+ }
+ }
if (!c->prev) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "can't yield from root fiber");
}
diff --git a/mrbgems/mruby-objectspace/src/mruby_objectspace.c b/mrbgems/mruby-objectspace/src/mruby_objectspace.c
index ac6189ded..538959f2a 100644
--- a/mrbgems/mruby-objectspace/src/mruby_objectspace.c
+++ b/mrbgems/mruby-objectspace/src/mruby_objectspace.c
@@ -1,23 +1,23 @@
#include <mruby.h>
#include <mruby/gc.h>
#include <mruby/hash.h>
-#include <mruby/value.h>
struct os_count_struct {
- size_t total;
- size_t freed;
- size_t counts[MRB_TT_MAXDEFINE+1];
+ mrb_int total;
+ mrb_int freed;
+ mrb_int counts[MRB_TT_MAXDEFINE+1];
};
-void
-os_count_object_type(mrb_state *mrb, struct RBasic* obj, void *data)
+static void
+os_count_object_type(mrb_state *mrb, struct RBasic *obj, void *data)
{
- struct os_count_struct* obj_count;
- obj_count = (struct os_count_struct*)(data);
+ struct os_count_struct *obj_count;
+ obj_count = (struct os_count_struct*)data;
if (is_dead(mrb, obj)) {
obj_count->freed++;
- } else {
+ }
+ else {
obj_count->counts[obj->tt]++;
obj_count->total++;
}
@@ -43,11 +43,11 @@ os_count_object_type(mrb_state *mrb, struct RBasic* obj, void *data)
*
*/
-mrb_value
+static mrb_value
os_count_objects(mrb_state *mrb, mrb_value self)
{
- struct os_count_struct obj_count;
- size_t i;
+ struct os_count_struct obj_count = { 0 };
+ enum mrb_vtype i;
mrb_value hash;
if (mrb_get_args(mrb, "|H", &hash) == 0) {
@@ -58,21 +58,15 @@ os_count_objects(mrb_state *mrb, mrb_value self)
mrb_hash_clear(mrb, hash);
}
- for (i = 0; i <= MRB_TT_MAXDEFINE; i++) {
- obj_count.counts[i] = 0;
- }
- obj_count.total = 0;
- obj_count.freed = 0;
-
mrb_objspace_each_objects(mrb, os_count_object_type, &obj_count);
- mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_cstr(mrb, "TOTAL")), mrb_fixnum_value(obj_count.total));
- mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_cstr(mrb, "FREE")), mrb_fixnum_value(obj_count.freed));
+ mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_lit(mrb, "TOTAL")), mrb_fixnum_value(obj_count.total));
+ mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_lit(mrb, "FREE")), mrb_fixnum_value(obj_count.freed));
- for (i = 0; i < MRB_TT_MAXDEFINE; i++) {
+ for (i = MRB_TT_FALSE; i < MRB_TT_MAXDEFINE; i++) {
mrb_value type;
switch (i) {
-#define COUNT_TYPE(t) case (t): type = mrb_symbol_value(mrb_intern_cstr(mrb, #t)); break;
+#define COUNT_TYPE(t) case (t): type = mrb_symbol_value(mrb_intern_lit(mrb, #t)); break;
COUNT_TYPE(MRB_TT_FALSE);
COUNT_TYPE(MRB_TT_FREE);
COUNT_TYPE(MRB_TT_TRUE);
@@ -107,11 +101,13 @@ os_count_objects(mrb_state *mrb, mrb_value self)
}
void
-mrb_mruby_objectspace_gem_init(mrb_state* mrb) {
+mrb_mruby_objectspace_gem_init(mrb_state *mrb)
+{
struct RClass *os = mrb_define_module(mrb, "ObjectSpace");
- mrb_define_class_method(mrb, os, "count_objects", os_count_objects, MRB_ARGS_ANY());
+ mrb_define_class_method(mrb, os, "count_objects", os_count_objects, MRB_ARGS_OPT(1));
}
void
-mrb_mruby_objectspace_gem_final(mrb_state* mrb) {
+mrb_mruby_objectspace_gem_final(mrb_state *mrb)
+{
}
diff --git a/mrbgems/mruby-proc-ext/src/proc.c b/mrbgems/mruby-proc-ext/src/proc.c
index 87d96a865..f27356bb7 100644
--- a/mrbgems/mruby-proc-ext/src/proc.c
+++ b/mrbgems/mruby-proc-ext/src/proc.c
@@ -34,7 +34,7 @@ static mrb_value
mrb_proc_inspect(mrb_state *mrb, mrb_value self)
{
struct RProc *p = mrb_proc_ptr(self);
- mrb_value str = mrb_str_new_cstr(mrb, "#<Proc:");
+ mrb_value str = mrb_str_new_lit(mrb, "#<Proc:");
mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, mrb_cptr(self)));
if (!MRB_PROC_CFUNC_P(p)) {
diff --git a/mrbgems/mruby-time/src/time.c b/mrbgems/mruby-time/src/time.c
index 2ec352925..8bea2cb5b 100644
--- a/mrbgems/mruby-time/src/time.c
+++ b/mrbgems/mruby-time/src/time.c
@@ -662,7 +662,7 @@ mrb_mruby_time_gem_init(mrb_state* mrb)
/* ISO 15.2.19.2 */
tc = mrb_define_class(mrb, "Time", mrb->object_class);
MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA);
- mrb_include_module(mrb, tc, mrb_class_get(mrb, "Comparable"));
+ mrb_include_module(mrb, tc, mrb_module_get(mrb, "Comparable"));
mrb_define_class_method(mrb, tc, "at", mrb_time_at, MRB_ARGS_ANY()); /* 15.2.19.6.1 */
mrb_define_class_method(mrb, tc, "gm", mrb_time_gm, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.2 */
mrb_define_class_method(mrb, tc, "local", mrb_time_local, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.3 */
diff --git a/mrblib/array.rb b/mrblib/array.rb
index 82df90950..1203ea70e 100644
--- a/mrblib/array.rb
+++ b/mrblib/array.rb
@@ -95,8 +95,6 @@ end
##
# Array is enumerable and comparable
-module Enumerable; end
-module Comparable; end
class Array
# ISO 15.2.12.3
include Enumerable
diff --git a/mrblib/hash.rb b/mrblib/hash.rb
index f7cdbdc6d..fae44e6f0 100644
--- a/mrblib/hash.rb
+++ b/mrblib/hash.rb
@@ -187,7 +187,6 @@ end
# Hash is enumerable
#
# ISO 15.2.13.3
-module Enumerable; end
class Hash
include Enumerable
end
diff --git a/mrblib/range.rb b/mrblib/range.rb
index 7ea795078..d1f97ac87 100644
--- a/mrblib/range.rb
+++ b/mrblib/range.rb
@@ -43,7 +43,6 @@ end
# Range is enumerable
#
# ISO 15.2.14.3
-module Enumerable; end
class Range
include Enumerable
end
diff --git a/mrblib/string.rb b/mrblib/string.rb
index 19370ff82..322cd0788 100644
--- a/mrblib/string.rb
+++ b/mrblib/string.rb
@@ -3,7 +3,7 @@
#
# ISO 15.2.10
class String
-
+ include Comparable
##
# Calls the given block for each line
# and pass the respective line.
diff --git a/src/array.c b/src/array.c
index 8245ddd1c..9fe11bee0 100644
--- a/src/array.c
+++ b/src/array.c
@@ -995,7 +995,7 @@ inspect_ary(mrb_state *mrb, mrb_value ary, mrb_value list)
/* check recursive */
for(i=0; i<RARRAY_LEN(list); i++) {
if (mrb_obj_equal(mrb, ary, RARRAY_PTR(list)[i])) {
- return mrb_str_new(mrb, "[...]", 5);
+ return mrb_str_new_lit(mrb, "[...]");
}
}
@@ -1038,7 +1038,7 @@ inspect_ary(mrb_state *mrb, mrb_value ary, mrb_value list)
static mrb_value
mrb_ary_inspect(mrb_state *mrb, mrb_value ary)
{
- if (RARRAY_LEN(ary) == 0) return mrb_str_new(mrb, "[]", 2);
+ if (RARRAY_LEN(ary) == 0) return mrb_str_new_lit(mrb, "[]");
return inspect_ary(mrb, ary, mrb_ary_new(mrb));
}
@@ -1192,22 +1192,6 @@ mrb_ary_eql(mrb_state *mrb, mrb_value ary1)
return mrb_true_value();
}
-static mrb_value
-mrb_ary_ceqq(mrb_state *mrb, mrb_value ary)
-{
- mrb_value v;
- mrb_int i, len;
- mrb_sym eqq = mrb_intern_lit(mrb, "===");
-
- mrb_get_args(mrb, "o", &v);
- len = RARRAY_LEN(ary);
- for (i=0; i<len; i++) {
- mrb_value c = mrb_funcall_argv(mrb, ary_elt(ary, i), eqq, 1, &v);
- if (mrb_test(c)) return mrb_true_value();
- }
- return mrb_false_value();
-}
-
void
mrb_init_array(mrb_state *mrb)
{
@@ -1215,7 +1199,6 @@ mrb_init_array(mrb_state *mrb)
a = mrb->array_class = mrb_define_class(mrb, "Array", mrb->object_class);
MRB_SET_INSTANCE_TT(a, MRB_TT_ARRAY);
- mrb_include_module(mrb, a, mrb_class_get(mrb, "Enumerable"));
mrb_define_class_method(mrb, a, "[]", mrb_ary_s_create, MRB_ARGS_ANY()); /* 15.2.12.4.1 */
@@ -1250,5 +1233,4 @@ mrb_init_array(mrb_state *mrb)
mrb_define_method(mrb, a, "==", mrb_ary_equal, MRB_ARGS_REQ(1)); /* 15.2.12.5.33 (x) */
mrb_define_method(mrb, a, "eql?", mrb_ary_eql, MRB_ARGS_REQ(1)); /* 15.2.12.5.34 (x) */
mrb_define_method(mrb, a, "<=>", mrb_ary_cmp, MRB_ARGS_REQ(1)); /* 15.2.12.5.36 (x) */
- mrb_define_method(mrb, a, "__case_eqq", mrb_ary_ceqq, MRB_ARGS_REQ(1)); /* internal */
}
diff --git a/src/class.c b/src/class.c
index 612098548..58eaaab0e 100644
--- a/src/class.c
+++ b/src/class.c
@@ -49,13 +49,24 @@ mrb_gc_free_mt(mrb_state *mrb, struct RClass *c)
kh_destroy(mt, mrb, c->mt);
}
-void
-mrb_name_class(mrb_state *mrb, struct RClass *c, mrb_sym name)
+static void
+name_class(mrb_state *mrb, struct RClass *c, mrb_sym name)
{
mrb_obj_iv_set(mrb, (struct RObject*)c,
mrb_intern_lit(mrb, "__classid__"), mrb_symbol_value(name));
}
+static void
+setup_class(mrb_state *mrb, struct RClass *outer, struct RClass *c, mrb_sym id)
+{
+ name_class(mrb, c, id);
+ mrb_obj_iv_set(mrb, (struct RObject*)outer, id, mrb_obj_value(c));
+ if (outer != mrb->object_class) {
+ mrb_obj_iv_set(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"),
+ mrb_obj_value(outer));
+ }
+}
+
#define make_metaclass(mrb, c) prepare_singleton_class((mrb), (struct RBasic*)(c))
static void
@@ -92,31 +103,22 @@ prepare_singleton_class(mrb_state *mrb, struct RBasic *o)
mrb_obj_iv_set(mrb, (struct RObject*)sc, mrb_intern_lit(mrb, "__attached__"), mrb_obj_value(o));
}
-struct RClass*
-mrb_define_module_id(mrb_state *mrb, mrb_sym name)
+static struct RClass *
+class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id)
{
- struct RClass *m = mrb_module_new(mrb);
-
- mrb_obj_iv_set(mrb, (struct RObject*)mrb->object_class,
- name, mrb_obj_value(m));
- mrb_name_class(mrb, m, name);
+ mrb_value c = mrb_const_get(mrb, mrb_obj_value(klass), id);
- return m;
+ mrb_check_type(mrb, c, MRB_TT_CLASS);
+ return mrb_class_ptr(c);
}
-struct RClass*
-mrb_define_module(mrb_state *mrb, const char *name)
+static struct RClass *
+module_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id)
{
- return mrb_define_module_id(mrb, mrb_intern_cstr(mrb, name));
-}
+ mrb_value c = mrb_const_get(mrb, mrb_obj_value(klass), id);
-static void
-setup_class(mrb_state *mrb, mrb_value outer, struct RClass *c, mrb_sym id)
-{
- mrb_name_class(mrb, c, id);
- mrb_const_set(mrb, outer, id, mrb_obj_value(c));
- mrb_obj_iv_set(mrb, (struct RObject*)c,
- mrb_intern_lit(mrb, "__outer__"), outer);
+ mrb_check_type(mrb, c, MRB_TT_MODULE);
+ return mrb_class_ptr(c);
}
struct RClass*
@@ -129,36 +131,79 @@ mrb_class_outer_module(mrb_state *mrb, struct RClass *c)
return mrb_class_ptr(outer);
}
+static struct RClass*
+define_module(mrb_state *mrb, mrb_sym name, struct RClass *outer)
+{
+ struct RClass *m;
+
+ if (mrb_const_defined_at(mrb, outer, name)) {
+ return module_from_sym(mrb, outer, name);
+ }
+ m = mrb_module_new(mrb);
+ setup_class(mrb, outer, m, name);
+
+ return m;
+}
+
+struct RClass*
+mrb_define_module_id(mrb_state *mrb, mrb_sym name)
+{
+ return define_module(mrb, name, mrb->object_class);
+}
+
+struct RClass*
+mrb_define_module(mrb_state *mrb, const char *name)
+{
+ return define_module(mrb, mrb_intern_cstr(mrb, name), mrb->object_class);
+}
+
struct RClass*
mrb_vm_define_module(mrb_state *mrb, mrb_value outer, mrb_sym id)
{
- struct RClass *c;
- mrb_value v;
+ return define_module(mrb, id, mrb_class_ptr(outer));
+}
- if (mrb_const_defined(mrb, outer, id)) {
- v = mrb_const_get(mrb, outer, id);
- c = mrb_class_ptr(v);
- }
- else {
- c = mrb_module_new(mrb);
- setup_class(mrb, outer, c, id);
- }
+struct RClass *
+mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name)
+{
+ mrb_sym id = mrb_intern_cstr(mrb, name);
+ struct RClass * c = define_module(mrb, id, outer);
+
+ setup_class(mrb, outer, c, id);
return c;
}
-struct RClass*
-mrb_define_class_id(mrb_state *mrb, mrb_sym name, struct RClass *super)
+static struct RClass*
+define_class(mrb_state *mrb, mrb_sym name, struct RClass *super, struct RClass *outer)
{
- struct RClass *c = mrb_class_new(mrb, super);
+ struct RClass * c;
- mrb_obj_iv_set(mrb, (struct RObject*)mrb->object_class,
- name, mrb_obj_value(c));
- mrb_name_class(mrb, c, name);
+ if (mrb_const_defined_at(mrb, outer, name)) {
+ c = class_from_sym(mrb, outer, name);
+ if (super && mrb_class_real(c->super) != super) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for Class %S (%S not %S)",
+ mrb_sym2str(mrb, name),
+ mrb_obj_value(c->super), mrb_obj_value(super));
+ }
+ return c;
+ }
+
+ c = mrb_class_new(mrb, super);
+ setup_class(mrb, outer, c, name);
return c;
}
struct RClass*
+mrb_define_class_id(mrb_state *mrb, mrb_sym name, struct RClass *super)
+{
+ if (!super) {
+ mrb_warn(mrb, "no super class for `%S', Object assumed", mrb_sym2str(mrb, name));
+ }
+ return define_class(mrb, name, super, mrb->object_class);
+}
+
+struct RClass*
mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super)
{
return mrb_define_class_id(mrb, mrb_intern_cstr(mrb, name), super);
@@ -167,24 +212,8 @@ mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super)
struct RClass*
mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id)
{
- struct RClass *c, *s;
-
- if (mrb_const_defined(mrb, outer, id)) {
- mrb_value v = mrb_const_get(mrb, outer, id);
-
- mrb_check_type(mrb, v, MRB_TT_CLASS);
- c = mrb_class_ptr(v);
- if (!mrb_nil_p(super)) {
- if (mrb_type(super) != MRB_TT_CLASS) {
- mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)", super);
- }
-
- if (!c->super || mrb_class_ptr(super) != mrb_class_real(c->super)) {
- mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for class %S", mrb_sym2str(mrb, id));
- }
- }
- return c;
- }
+ struct RClass *s;
+ struct RClass *c;
if (!mrb_nil_p(super)) {
if (mrb_type(super) != MRB_TT_CLASS) {
@@ -193,12 +222,18 @@ mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id
s = mrb_class_ptr(super);
}
else {
- s = mrb->object_class;
+ s = 0;
}
-
- c = mrb_class_new(mrb, s);
- setup_class(mrb, outer, c, id);
- mrb_funcall(mrb, mrb_obj_value(s), "inherited", 1, mrb_obj_value(c));
+ switch (mrb_type(outer)) {
+ case MRB_TT_CLASS:
+ case MRB_TT_MODULE:
+ break;
+ default:
+ mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class/module", outer);
+ break;
+ }
+ c = define_class(mrb, id, s, mrb_class_ptr(outer));
+ mrb_funcall(mrb, mrb_obj_value(mrb_class_real(c->super)), "inherited", 1, mrb_obj_value(c));
return c;
}
@@ -213,15 +248,10 @@ mrb_class_defined(mrb_state *mrb, const char *name)
return mrb_const_defined(mrb, mrb_obj_value(mrb->object_class), mrb_symbol(sym));
}
-static struct RClass *
-class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id)
+struct RClass *
+mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
{
- mrb_value c = mrb_const_get(mrb, mrb_obj_value(klass), id);
-
- if (mrb_type(c) != MRB_TT_MODULE && mrb_type(c) != MRB_TT_CLASS) {
- mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class/module", mrb_sym2str(mrb, id));
- }
- return mrb_class_ptr(c);
+ return class_from_sym(mrb, outer, mrb_intern_cstr(mrb, name));
}
struct RClass *
@@ -231,9 +261,15 @@ mrb_class_get(mrb_state *mrb, const char *name)
}
struct RClass *
-mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
+mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
{
- return class_from_sym(mrb, outer, mrb_intern_cstr(mrb, name));
+ return module_from_sym(mrb, outer, mrb_intern_cstr(mrb, name));
+}
+
+struct RClass *
+mrb_module_get(mrb_state *mrb, const char *name)
+{
+ return mrb_module_get_under(mrb, mrb->object_class, name);
}
/*!
@@ -255,38 +291,17 @@ mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
struct RClass *
mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super)
{
- struct RClass * c;
mrb_sym id = mrb_intern_cstr(mrb, name);
-
- if (mrb_const_defined_at(mrb, outer, id)) {
- c = class_from_sym(mrb, outer, id);
- if (mrb_class_real(c->super) != super) {
- mrb_name_error(mrb, id, "%S is already defined", name);
- }
- return c;
- }
- if (!super) {
- mrb_warn(mrb, "no super class for `%S::%S', Object assumed", outer, name);
- }
- c = mrb_class_new(mrb, super);
- setup_class(mrb, mrb_obj_value(outer), c, id);
-
- return c;
-}
-
-struct RClass *
-mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name)
-{
struct RClass * c;
- mrb_sym id = mrb_intern_cstr(mrb, name);
- if (mrb_const_defined_at(mrb, outer, id)) {
- c = class_from_sym(mrb, outer, id);
- return c;
+#if 0
+ if (!super) {
+ mrb_warn(mrb, "no super class for `%S::%S', Object assumed",
+ mrb_obj_value(outer), mrb_sym2str(mrb, id));
}
- c = mrb_module_new(mrb);
- setup_class(mrb, mrb_obj_value(outer), c, id);
-
+#endif
+ c = define_class(mrb, id, super, outer);
+ setup_class(mrb, outer, c, id);
return c;
}
@@ -1226,7 +1241,7 @@ mrb_class_path(mrb_state *mrb, struct RClass *c)
}
else if (outer && outer != mrb->object_class) {
mrb_value base = mrb_class_path(mrb, outer);
- path = mrb_str_plus(mrb, base, mrb_str_new(mrb, "::", 2));
+ path = mrb_str_plus(mrb, base, mrb_str_new_lit(mrb, "::"));
name = mrb_sym2name_len(mrb, sym, &len);
mrb_str_concat(mrb, path, mrb_str_new(mrb, name, len));
}
@@ -1253,7 +1268,7 @@ mrb_class_name(mrb_state *mrb, struct RClass* c)
{
mrb_value path = mrb_class_path(mrb, c);
if (mrb_nil_p(path)) {
- path = mrb_str_new(mrb, "#<Class:", 8);
+ path = mrb_str_new_lit(mrb, "#<Class:");
mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, c));
mrb_str_cat(mrb, path, ">", 1);
}
@@ -1378,7 +1393,7 @@ mrb_mod_to_s(mrb_state *mrb, mrb_value klass)
if (mrb_type(klass) == MRB_TT_SCLASS) {
mrb_value v = mrb_iv_get(mrb, klass, mrb_intern_lit(mrb, "__attached__"));
- str = mrb_str_new(mrb, "#<Class:", 8);
+ str = mrb_str_new_lit(mrb, "#<Class:");
switch (mrb_type(v)) {
case MRB_TT_CLASS:
@@ -1912,10 +1927,10 @@ mrb_init_class(mrb_state *mrb)
mrb_define_const(mrb, obj, "Class", mrb_obj_value(cls));
/* name each classes */
- mrb_name_class(mrb, bob, mrb_intern_lit(mrb, "BasicObject"));
- mrb_name_class(mrb, obj, mrb_intern_lit(mrb, "Object"));
- mrb_name_class(mrb, mod, mrb_intern_lit(mrb, "Module"));
- mrb_name_class(mrb, cls, mrb_intern_lit(mrb, "Class"));
+ name_class(mrb, bob, mrb_intern_lit(mrb, "BasicObject"));
+ name_class(mrb, obj, mrb_intern_lit(mrb, "Object"));
+ name_class(mrb, mod, mrb_intern_lit(mrb, "Module"));
+ name_class(mrb, cls, mrb_intern_lit(mrb, "Class"));
MRB_SET_INSTANCE_TT(cls, MRB_TT_CLASS);
mrb_define_method(mrb, bob, "initialize", mrb_bob_init, MRB_ARGS_NONE());
diff --git a/src/codegen.c b/src/codegen.c
index d89fd57a5..11273bf7e 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -1515,14 +1515,7 @@ codegen(codegen_scope *s, node *tree, int val)
break;
case NODE_SPLAT:
- {
- int idx = new_msym(s, mrb_intern_lit(s->mrb, "to_a"));
-
- codegen(s, tree, VAL);
- pop();
- genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 0));
- push();
- }
+ codegen(s, tree, VAL);
break;
case NODE_ASGN:
@@ -2741,7 +2734,7 @@ codedump(mrb_state *mrb, mrb_irep *irep)
break;
case OP_LAMBDA:
- printf("OP_LAMBDA\tR%d\tI(%+d)\t%d\n", GETARG_A(c), GETARG_b(c), GETARG_c(c));
+ printf("OP_LAMBDA\tR%d\tI(%+d)\t%d\n", GETARG_A(c), GETARG_b(c)+1, GETARG_c(c));
break;
case OP_RANGE:
printf("OP_RANGE\tR%d\tR%d\t%d\n", GETARG_A(c), GETARG_B(c), GETARG_C(c));
@@ -2852,7 +2845,7 @@ codedump(mrb_state *mrb, mrb_irep *irep)
mrb_sym2name(mrb, irep->syms[GETARG_B(c)]));
break;
case OP_EXEC:
- printf("OP_EXEC\tR%d\tI(%+d)\n", GETARG_A(c), GETARG_Bx(c));
+ printf("OP_EXEC\tR%d\tI(%+d)\n", GETARG_A(c), GETARG_Bx(c)+1);
break;
case OP_SCLASS:
printf("OP_SCLASS\tR%d\tR%d\n", GETARG_A(c), GETARG_B(c));
@@ -2861,10 +2854,14 @@ codedump(mrb_state *mrb, mrb_irep *irep)
printf("OP_TCLASS\tR%d\n", GETARG_A(c));
break;
case OP_ERR:
- printf("OP_ERR\tL(%d)\n", GETARG_Bx(c));
+ {
+ mrb_value v = irep->pool[GETARG_Bx(c)];
+ mrb_value s = mrb_str_dump(mrb, mrb_str_new(mrb, RSTRING_PTR(v), RSTRING_LEN(v)));
+ printf("OP_ERR\t%s\n", RSTRING_PTR(s));
+ }
break;
case OP_EPUSH:
- printf("OP_EPUSH\t:I(%+d)\n", GETARG_Bx(c));
+ printf("OP_EPUSH\t:I(%+d)\n", GETARG_Bx(c)+1);
break;
case OP_ONERR:
printf("OP_ONERR\t%03d\n", i+GETARG_sBx(c));
diff --git a/src/gc.c b/src/gc.c
index 7e7e0d3ee..028133ea2 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -1281,21 +1281,21 @@ gc_generational_mode_set(mrb_state *mrb, mrb_value self)
}
void
-mrb_objspace_each_objects(mrb_state *mrb, each_object_callback* callback, void *data)
+mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data)
{
- struct heap_page* page = mrb->heaps;
+ struct heap_page* page = mrb->heaps;
- while (page != NULL) {
- RVALUE *p, *pend;
+ while (page != NULL) {
+ RVALUE *p, *pend;
- p = page->objects;
- pend = p + MRB_HEAP_PAGE_SIZE;
- for (;p < pend; p++) {
- (*callback)(mrb, &p->as.basic, data);
- }
-
- page = page->next;
+ p = page->objects;
+ pend = p + MRB_HEAP_PAGE_SIZE;
+ for (;p < pend; p++) {
+ (*callback)(mrb, &p->as.basic, data);
}
+
+ page = page->next;
+ }
}
#ifdef GC_TEST
@@ -1338,7 +1338,7 @@ test_mrb_field_write_barrier(void)
puts("test_mrb_field_write_barrier");
mrb->is_generational_gc_mode = FALSE;
obj = mrb_basic_ptr(mrb_ary_new(mrb));
- value = mrb_basic_ptr(mrb_str_new_cstr(mrb, "value"));
+ value = mrb_basic_ptr(mrb_str_new_lit(mrb, "value"));
paint_black(obj);
paint_partial_white(mrb,value);
@@ -1380,7 +1380,7 @@ test_mrb_field_write_barrier(void)
{
puts("test_mrb_field_write_barrier_value");
obj = mrb_basic_ptr(mrb_ary_new(mrb));
- mrb_value value = mrb_str_new_cstr(mrb, "value");
+ mrb_value value = mrb_str_new_lit(mrb, "value");
paint_black(obj);
paint_partial_white(mrb, mrb_basic_ptr(value));
@@ -1429,12 +1429,12 @@ test_add_gray_list(void)
puts("test_add_gray_list");
change_gen_gc_mode(mrb, FALSE);
mrb_assert(mrb->gray_list == NULL);
- obj1 = mrb_basic_ptr(mrb_str_new_cstr(mrb, "test"));
+ obj1 = mrb_basic_ptr(mrb_str_new_lit(mrb, "test"));
add_gray_list(mrb, obj1);
mrb_assert(mrb->gray_list == obj1);
mrb_assert(is_gray(obj1));
- obj2 = mrb_basic_ptr(mrb_str_new_cstr(mrb, "test"));
+ obj2 = mrb_basic_ptr(mrb_str_new_lit(mrb, "test"));
add_gray_list(mrb, obj2);
mrb_assert(mrb->gray_list == obj2);
mrb_assert(mrb->gray_list->gcnext == obj1);
@@ -1462,7 +1462,7 @@ test_gc_gray_mark(void)
puts(" in MRB_TT_ARRAY");
obj_v = mrb_ary_new(mrb);
- value_v = mrb_str_new_cstr(mrb, "test");
+ value_v = mrb_str_new_lit(mrb, "test");
paint_gray(mrb_basic_ptr(obj_v));
paint_partial_white(mrb, mrb_basic_ptr(value_v));
mrb_ary_push(mrb, obj_v, value_v);
diff --git a/src/hash.c b/src/hash.c
index 990ba1557..2b98e5fd1 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -788,9 +788,9 @@ inspect_hash(mrb_state *mrb, mrb_value hash, int recur)
khash_t(ht) *h = RHASH_TBL(hash);
khiter_t k;
- if (recur) return mrb_str_new(mrb, "{...}", 5);
+ if (recur) return mrb_str_new_lit(mrb, "{...}");
- str = mrb_str_new(mrb, "{", 1);
+ str = mrb_str_new_lit(mrb, "{");
if (h && kh_size(h) > 0) {
for (k = kh_begin(h); k != kh_end(h); k++) {
int ai;
@@ -833,7 +833,7 @@ mrb_hash_inspect(mrb_state *mrb, mrb_value hash)
khash_t(ht) *h = RHASH_TBL(hash);
if (!h || kh_size(h) == 0)
- return mrb_str_new(mrb, "{}", 2);
+ return mrb_str_new_lit(mrb, "{}");
return inspect_hash(mrb, hash, 0);
}
@@ -1227,7 +1227,6 @@ mrb_init_hash(mrb_state *mrb)
h = mrb->hash_class = mrb_define_class(mrb, "Hash", mrb->object_class);
MRB_SET_INSTANCE_TT(h, MRB_TT_HASH);
- mrb_include_module(mrb, h, mrb_class_get(mrb, "Enumerable"));
mrb_define_method(mrb, h, "==", mrb_hash_equal, MRB_ARGS_REQ(1)); /* 15.2.13.4.1 */
mrb_define_method(mrb, h, "[]", mrb_hash_aget, MRB_ARGS_REQ(1)); /* 15.2.13.4.2 */
mrb_define_method(mrb, h, "[]=", mrb_hash_aset, MRB_ARGS_REQ(2)); /* 15.2.13.4.3 */
diff --git a/src/init.c b/src/init.c
index e97c72d68..c08c4b046 100644
--- a/src/init.c
+++ b/src/init.c
@@ -22,6 +22,7 @@ void mrb_init_numeric(mrb_state*);
void mrb_init_range(mrb_state*);
void mrb_init_gc(mrb_state*);
void mrb_init_math(mrb_state*);
+void mrb_init_version(mrb_state*);
void mrb_init_mrblib(mrb_state*);
void mrb_init_mrbgems(mrb_state*);
void mrb_final_mrbgems(mrb_state*);
@@ -47,6 +48,7 @@ mrb_init_core(mrb_state *mrb)
mrb_init_numeric(mrb); DONE;
mrb_init_range(mrb); DONE;
mrb_init_gc(mrb); DONE;
+ mrb_init_version(mrb); DONE;
mrb_init_mrblib(mrb); DONE;
#ifndef DISABLE_GEMS
mrb_init_mrbgems(mrb); DONE;
diff --git a/src/kernel.c b/src/kernel.c
index d1e192464..b17977052 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -1108,6 +1108,23 @@ mrb_obj_singleton_methods_m(mrb_state *mrb, mrb_value self)
return mrb_obj_singleton_methods(mrb, recur, self);
}
+static mrb_value
+mrb_obj_ceqq(mrb_state *mrb, mrb_value self)
+{
+ mrb_value v;
+ mrb_int i, len;
+ mrb_sym eqq = mrb_intern_lit(mrb, "===");
+ mrb_value ary = mrb_ary_splat(mrb, self);
+
+ mrb_get_args(mrb, "o", &v);
+ len = RARRAY_LEN(ary);
+ for (i=0; i<len; i++) {
+ mrb_value c = mrb_funcall_argv(mrb, mrb_ary_entry(ary, i), eqq, 1, &v);
+ if (mrb_test(c)) return mrb_true_value();
+ }
+ return mrb_false_value();
+}
+
void
mrb_init_kernel(mrb_state *mrb)
{
@@ -1159,6 +1176,7 @@ mrb_init_kernel(mrb_state *mrb)
mrb_define_method(mrb, krn, "send", mrb_f_send, MRB_ARGS_ANY()); /* 15.3.1.3.44 */
mrb_define_method(mrb, krn, "singleton_methods", mrb_obj_singleton_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.45 */
mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, MRB_ARGS_NONE()); /* 15.3.1.3.46 */
+ mrb_define_method(mrb, krn, "__case_eqq", mrb_obj_ceqq, MRB_ARGS_REQ(1)); /* internal */
mrb_include_module(mrb, mrb->object_class, mrb->kernel_module);
mrb_alias_method(mrb, mrb->module_class, mrb_intern_lit(mrb, "dup"), mrb_intern_lit(mrb, "clone"));
diff --git a/src/numeric.c b/src/numeric.c
index 78d8e2e9d..462faf686 100644
--- a/src/numeric.c
+++ b/src/numeric.c
@@ -118,14 +118,14 @@ mrb_flo_to_str(mrb_state *mrb, mrb_value flo, int max_digit)
n = mrb_float(flo);
if (isnan(n)) {
- result = mrb_str_new(mrb, "NaN", 3);
+ result = mrb_str_new_lit(mrb, "NaN");
}
else if (isinf(n)) {
if (n < 0) {
- result = mrb_str_new(mrb, "-inf", 4);
+ result = mrb_str_new_lit(mrb, "-inf");
}
else {
- result = mrb_str_new(mrb, "inf", 3);
+ result = mrb_str_new_lit(mrb, "inf");
}
}
else {
@@ -612,6 +612,12 @@ flo_truncate(mrb_state *mrb, mrb_value num)
return mrb_fixnum_value((mrb_int)f);
}
+static mrb_value
+flo_nan_p(mrb_state *mrb, mrb_value num)
+{
+ return mrb_bool_value(isnan(mrb_float(num)));
+}
+
/*
* Document-class: Integer
*
@@ -657,7 +663,7 @@ mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y)
if (a != 0 && c/a != b) {
return mrb_float_value(mrb, (mrb_float)a*(mrb_float)b);
}
- return mrb_fixnum_value(c);;
+ return mrb_fixnum_value(c);
}
return mrb_float_value(mrb, (mrb_float)a * mrb_to_flo(mrb, y));
}
@@ -1331,4 +1337,5 @@ mrb_init_numeric(mrb_state *mrb)
mrb_define_method(mrb, fl, "to_s", flo_to_s, MRB_ARGS_NONE()); /* 15.2.9.3.16(x) */
mrb_define_method(mrb, fl, "inspect", flo_to_s, MRB_ARGS_NONE());
+ mrb_define_method(mrb, fl, "nan?", flo_nan_p, MRB_ARGS_NONE());
}
diff --git a/src/object.c b/src/object.c
index 61b4a57a5..c11a30055 100644
--- a/src/object.c
+++ b/src/object.c
@@ -86,7 +86,7 @@ nil_to_s(mrb_state *mrb, mrb_value obj)
static mrb_value
nil_inspect(mrb_state *mrb, mrb_value obj)
{
- return mrb_str_new(mrb, "nil", 3);
+ return mrb_str_new_lit(mrb, "nil");
}
/***********************************************************************
@@ -147,7 +147,7 @@ true_xor(mrb_state *mrb, mrb_value obj)
static mrb_value
true_to_s(mrb_state *mrb, mrb_value obj)
{
- return mrb_str_new(mrb, "true", 4);
+ return mrb_str_new_lit(mrb, "true");
}
/* 15.2.5.3.4 */
@@ -254,7 +254,7 @@ false_or(mrb_state *mrb, mrb_value obj)
static mrb_value
false_to_s(mrb_state *mrb, mrb_value obj)
{
- return mrb_str_new(mrb, "false", 5);
+ return mrb_str_new_lit(mrb, "false");
}
void
diff --git a/src/print.c b/src/print.c
index 4675d0e41..9d59aa4ff 100644
--- a/src/print.c
+++ b/src/print.c
@@ -6,6 +6,7 @@
#include "mruby.h"
#include "mruby/string.h"
+#include "mruby/variable.h"
static void
printstr(mrb_state *mrb, mrb_value obj)
@@ -53,19 +54,19 @@ mrb_print_error(mrb_state *mrb)
void
mrb_show_version(mrb_state *mrb)
{
- static const char version_msg[] = "mruby - Embeddable Ruby Copyright (c) 2010-2014 mruby developers\n";
mrb_value msg;
- msg = mrb_str_new(mrb, version_msg, sizeof(version_msg) - 1);
+ msg = mrb_const_get(mrb, mrb_obj_value(mrb->object_class), mrb_intern_lit(mrb, "MRUBY_DESCRIPTION"));
printstr(mrb, msg);
+ printstr(mrb, mrb_str_new_lit(mrb, "\n"));
}
void
mrb_show_copyright(mrb_state *mrb)
{
- static const char copyright_msg[] = "mruby - Copyright (c) 2010-2014 mruby developers\n";
mrb_value msg;
- msg = mrb_str_new(mrb, copyright_msg, sizeof(copyright_msg) - 1);
+ msg = mrb_const_get(mrb, mrb_obj_value(mrb->object_class), mrb_intern_lit(mrb, "MRUBY_COPYRIGHT"));
printstr(mrb, msg);
+ printstr(mrb, mrb_str_new_lit(mrb, "\n"));
}
diff --git a/src/range.c b/src/range.c
index dd08f672c..171387a8d 100644
--- a/src/range.c
+++ b/src/range.c
@@ -403,8 +403,6 @@ mrb_init_range(mrb_state *mrb)
r = mrb_define_class(mrb, "Range", mrb->object_class);
MRB_SET_INSTANCE_TT(r, MRB_TT_RANGE);
- mrb_include_module(mrb, r, mrb_class_get(mrb, "Enumerable"));
-
mrb_define_method(mrb, r, "begin", mrb_range_beg, MRB_ARGS_NONE()); /* 15.2.14.4.3 */
mrb_define_method(mrb, r, "end", mrb_range_end, MRB_ARGS_NONE()); /* 15.2.14.4.5 */
mrb_define_method(mrb, r, "==", mrb_range_eq, MRB_ARGS_REQ(1)); /* 15.2.14.4.1 */
diff --git a/src/state.c b/src/state.c
index a8853fe72..620ed7d77 100644
--- a/src/state.c
+++ b/src/state.c
@@ -19,7 +19,7 @@ void mrb_final_core(mrb_state*);
static mrb_value
inspect_main(mrb_state *mrb, mrb_value mod)
{
- return mrb_str_new(mrb, "main", 4);
+ return mrb_str_new_lit(mrb, "main");
}
mrb_state*
diff --git a/src/string.c b/src/string.c
index 515e3fa47..c880fbe48 100644
--- a/src/string.c
+++ b/src/string.c
@@ -2485,8 +2485,6 @@ mrb_init_string(mrb_state *mrb)
s = mrb->string_class = mrb_define_class(mrb, "String", mrb->object_class);
MRB_SET_INSTANCE_TT(s, MRB_TT_STRING);
- mrb_include_module(mrb, s, mrb_class_get(mrb, "Comparable"));
-
mrb_define_method(mrb, s, "bytesize", mrb_str_bytesize, MRB_ARGS_NONE());
diff --git a/src/version.c b/src/version.c
new file mode 100644
index 000000000..4d57ed93e
--- /dev/null
+++ b/src/version.c
@@ -0,0 +1,13 @@
+#include "mruby.h"
+#include "mruby/variable.h"
+#include "mruby/version.h"
+
+void
+mrb_init_version(mrb_state* mrb)
+{
+ mrb_define_global_const(mrb, "RUBY_VERSION", mrb_str_new_lit(mrb, MRUBY_RUBY_VERSION));
+ mrb_define_global_const(mrb, "MRUBY_VERSION", mrb_str_new_lit(mrb, MRUBY_VERSION));
+ mrb_define_global_const(mrb, "MRUBY_RELEASE_DATE", mrb_str_new_lit(mrb, MRUBY_RELEASE_DATE));
+ mrb_define_global_const(mrb, "MRUBY_DESCRIPTION", mrb_str_new_lit(mrb, MRUBY_DESCRIPTION));
+ mrb_define_global_const(mrb, "MRUBY_COPYRIGHT", mrb_str_new_lit(mrb, MRUBY_COPYRIGHT));
+}
diff --git a/src/vm.c b/src/vm.c
index c044d5af1..aa849bf7a 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1350,7 +1350,7 @@ mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int
ci = mrb->c->ci;
break;
case OP_R_BREAK:
- if (proc->env->cioff < 0) {
+ if (!proc->env || proc->env->cioff < 0) {
localjump_error(mrb, LOCALJUMP_ERROR_BREAK);
goto L_RAISE;
}
diff --git a/test/driver.c b/test/driver.c
index e28045c5d..0116f4584 100644
--- a/test/driver.c
+++ b/test/driver.c
@@ -24,9 +24,7 @@ mrb_init_mrbtest(mrb_state *);
static void
print_hint(void)
{
- printf("mrbtest - Embeddable Ruby Test\n");
- printf("\nThis is a very early version, please test and report errors.\n");
- printf("Thanks :)\n\n");
+ printf("mrbtest - Embeddable Ruby Test\n\n");
}
static int
diff --git a/test/t/float.rb b/test/t/float.rb
index f70bf2d66..0c67f510a 100644
--- a/test/t/float.rb
+++ b/test/t/float.rb
@@ -143,3 +143,10 @@ assert('Float#truncate', '15.2.9.3.15') do
assert_equal( 3, 3.123456789.truncate)
assert_equal(-3, -3.1.truncate)
end
+
+assert('Float#nan?') do
+ assert_true (0.0/0.0).nan?
+ assert_false 0.0.nan?
+ assert_false (1.0/0.0).nan?
+ assert_false (-1.0/0.0).nan?
+end
diff --git a/test/t/localjumperror.rb b/test/t/localjumperror.rb
index a7d18b3b1..1780cb518 100644
--- a/test/t/localjumperror.rb
+++ b/test/t/localjumperror.rb
@@ -3,10 +3,10 @@
assert('LocalJumpError', '15.2.25') do
assert_equal Class, LocalJumpError.class
- assert_raise LocalJumpError do
- # this will cause an exception due to the wrong location
- retry
- end
+# assert_raise LocalJumpError do
+# # this will cause an exception due to the wrong location
+# retry
+# end
end
# TODO 15.2.25.2.1 LocalJumpError#exit_value