summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
15 files changed, 204 insertions, 174 deletions
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;
}