diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dump.c | 6 | ||||
| -rw-r--r-- | src/error.c | 31 | ||||
| -rw-r--r-- | src/gc.c | 6 | ||||
| -rw-r--r-- | src/numeric.c | 6 | ||||
| -rw-r--r-- | src/range.c | 80 | ||||
| -rw-r--r-- | src/variable.c | 2 |
6 files changed, 73 insertions, 58 deletions
diff --git a/src/dump.c b/src/dump.c index e89617823..09ac80fac 100644 --- a/src/dump.c +++ b/src/dump.c @@ -726,7 +726,7 @@ is_debug_info_defined(mrb_irep *irep) } int -dump_irep(mrb_state *mrb, mrb_irep *irep, int debug_info, uint8_t **bin, size_t *bin_size) +mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, int debug_info, uint8_t **bin, size_t *bin_size) { int result = MRB_DUMP_GENERAL_FAILURE; size_t section_irep_size; @@ -815,7 +815,7 @@ mrb_dump_irep_binary(mrb_state *mrb, mrb_irep *irep, int debug_info, FILE* fp) return MRB_DUMP_INVALID_ARGUMENT; } - result = dump_irep(mrb, irep, debug_info, &bin, &bin_size); + result = mrb_dump_irep(mrb, irep, debug_info, &bin, &bin_size); if (result == MRB_DUMP_OK) { fwrite(bin, bin_size, 1, fp); } @@ -851,7 +851,7 @@ mrb_dump_irep_cfunc(mrb_state *mrb, mrb_irep *irep, int debug_info, FILE *fp, co return MRB_DUMP_INVALID_ARGUMENT; } - result = dump_irep(mrb, irep, debug_info, &bin, &bin_size); + result = mrb_dump_irep(mrb, irep, debug_info, &bin, &bin_size); if (result == MRB_DUMP_OK) { fprintf(fp, "#include <stdint.h>\n"); /* for uint8_t under at least Darwin */ fprintf(fp, "const uint8_t %s[] = {", initname); diff --git a/src/error.c b/src/error.c index 8f13dcf77..6f7641cf1 100644 --- a/src/error.c +++ b/src/error.c @@ -115,7 +115,10 @@ exc_message(mrb_state *mrb, mrb_value exc) * call-seq: * exception.inspect -> string * - * Return this exception's class name an message + * Returns this exception's file name, line number, + * message and class name. + * If file name or line number is not set, + * returns message and class name. */ static mrb_value @@ -444,18 +447,18 @@ mrb_init_exception(mrb_state *mrb) { struct RClass *e; - mrb->eException_class = e = mrb_define_class(mrb, "Exception", mrb->object_class); /* 15.2.22 */ - mrb_define_class_method(mrb, e, "exception", mrb_instance_new, MRB_ARGS_ANY()); - mrb_define_method(mrb, e, "exception", exc_exception, MRB_ARGS_ANY()); - mrb_define_method(mrb, e, "initialize", exc_initialize, MRB_ARGS_ANY()); - mrb_define_method(mrb, e, "==", exc_equal, MRB_ARGS_REQ(1)); - mrb_define_method(mrb, e, "to_s", exc_to_s, MRB_ARGS_NONE()); - mrb_define_method(mrb, e, "message", exc_message, MRB_ARGS_NONE()); - mrb_define_method(mrb, e, "inspect", exc_inspect, MRB_ARGS_NONE()); - mrb_define_method(mrb, e, "backtrace", mrb_exc_backtrace, MRB_ARGS_NONE()); - - mrb->eStandardError_class = mrb_define_class(mrb, "StandardError", mrb->eException_class); /* 15.2.23 */ + mrb->eException_class = e = mrb_define_class(mrb, "Exception", mrb->object_class); /* 15.2.22 */ + mrb_define_class_method(mrb, e, "exception", mrb_instance_new, MRB_ARGS_ANY()); + mrb_define_method(mrb, e, "exception", exc_exception, MRB_ARGS_ANY()); + mrb_define_method(mrb, e, "initialize", exc_initialize, MRB_ARGS_ANY()); + mrb_define_method(mrb, e, "==", exc_equal, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, e, "to_s", exc_to_s, MRB_ARGS_NONE()); + mrb_define_method(mrb, e, "message", exc_message, MRB_ARGS_NONE()); + mrb_define_method(mrb, e, "inspect", exc_inspect, MRB_ARGS_NONE()); + mrb_define_method(mrb, e, "backtrace", mrb_exc_backtrace, MRB_ARGS_NONE()); + + mrb->eStandardError_class = mrb_define_class(mrb, "StandardError", mrb->eException_class); /* 15.2.23 */ mrb_define_class(mrb, "RuntimeError", mrb->eStandardError_class); /* 15.2.28 */ - e = mrb_define_class(mrb, "ScriptError", mrb->eException_class); /* 15.2.37 */ - mrb_define_class(mrb, "SyntaxError", e); /* 15.2.38 */ + e = mrb_define_class(mrb, "ScriptError", mrb->eException_class); /* 15.2.37 */ + mrb_define_class(mrb, "SyntaxError", e); /* 15.2.38 */ } @@ -121,9 +121,9 @@ static double gc_total_time = 0; static double gettimeofday_time(void) { - struct timeval tv; - gettimeofday(&tv, NULL); - return tv.tv_sec + tv.tv_usec * 1e-6; + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec + tv.tv_usec * 1e-6; } #define GC_INVOKE_TIME_REPORT(with) do {\ diff --git a/src/numeric.c b/src/numeric.c index 4c955a61e..56835edbf 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -309,7 +309,7 @@ flodivmod(mrb_state *mrb, mrb_float x, mrb_float y, mrb_float *divp, mrb_float * } else { mod = fmod(x, y); - if (isinf(x) && !isinf(y) && !isnan(y)) + if (isinf(x) && isfinite(y)) div = x; else div = (x - mod) / y; @@ -495,7 +495,7 @@ flo_finite_p(mrb_state *mrb, mrb_value num) { mrb_float value = mrb_float(num); - return mrb_bool_value(!(isinf(value) || isnan(value))); + return mrb_bool_value(isfinite(value)); } /* 15.2.9.3.10 */ @@ -626,7 +626,7 @@ flo_round(mrb_state *mrb, mrb_value num) } if (ndigits > 0) { - if (isinf(number) || isnan(number)) return num; + if (!isfinite(number)) return num; return mrb_float_value(mrb, number); } return mrb_fixnum_value((mrb_int)number); diff --git a/src/range.c b/src/range.c index b59b234ef..3e5af1894 100644 --- a/src/range.c +++ b/src/range.c @@ -8,6 +8,7 @@ #include "mruby/class.h" #include "mruby/range.h" #include "mruby/string.h" +#include "mruby/array.h" #define RANGE_CLASS (mrb_class_get(mrb, "Range")) @@ -233,53 +234,30 @@ mrb_range_include(mrb_state *mrb, mrb_value range) return mrb_bool_value(include_p); } -/* - * call-seq: - * rng.each {| i | block } => rng - * - * Iterates over the elements <i>rng</i>, passing each in turn to the - * block. You can only iterate if the start object of the range - * supports the +succ+ method (which means that you can't iterate over - * ranges of +Float+ objects). - * - * (10..15).each do |n| - * print n, ' ' - * end - * - * <em>produces:</em> - * - * 10 11 12 13 14 15 - */ - -mrb_value -mrb_range_each(mrb_state *mrb, mrb_value range) -{ - return range; -} - mrb_bool -mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len) +range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc) { mrb_int beg, end, b, e; struct RRange *r = mrb_range_ptr(range); - if (mrb_type(range) != MRB_TT_RANGE) { - mrb_raise(mrb, E_TYPE_ERROR, "expected Range."); - } + if (mrb_type(range) != MRB_TT_RANGE) return FALSE; - beg = b = mrb_fixnum(r->edges->beg); - end = e = mrb_fixnum(r->edges->end); + beg = b = mrb_int(mrb, r->edges->beg); + end = e = mrb_int(mrb, r->edges->end); if (beg < 0) { beg += len; if (beg < 0) return FALSE; } - if (beg > len) return FALSE; - if (end > len) end = len; + if (trunc) { + if (beg > len) return FALSE; + if (end > len) end = len; + } if (end < 0) end += len; - if (!r->excl && end < len) end++; /* include end point */ + if (!r->excl && (!trunc || end < len)) + end++; /* include end point */ len = end - beg; if (len < 0) len = 0; @@ -288,6 +266,12 @@ mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, return TRUE; } +mrb_bool +mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len) +{ + return range_beg_len(mrb, range, begp, lenp, len, TRUE); +} + /* 15.2.14.4.12(x) */ /* * call-seq: @@ -395,6 +379,35 @@ range_initialize_copy(mrb_state *mrb, mrb_value copy) return copy; } +mrb_value +mrb_get_values_at(mrb_state *mrb, mrb_value obj, mrb_int olen, mrb_int argc, const mrb_value *argv, mrb_value (*func)(mrb_state*, mrb_value, mrb_int)) +{ + mrb_int i, j, beg, len; + mrb_value result; + result = mrb_ary_new(mrb); + + for (i = 0; i < argc; ++i) { + if (mrb_fixnum_p(argv[i])) { + mrb_ary_push(mrb, result, func(mrb, obj, mrb_fixnum(argv[i]))); + } + else if (range_beg_len(mrb, argv[i], &beg, &len, olen, FALSE)) { + mrb_int const end = olen < beg + len ? olen : beg + len; + for (j = beg; j < end; ++j) { + mrb_ary_push(mrb, result, func(mrb, obj, j)); + } + + for (; j < beg + len; ++j) { + mrb_ary_push(mrb, result, mrb_nil_value()); + } + } + else { + mrb_raisef(mrb, E_TYPE_ERROR, "invalid values selector: %S", argv[i]); + } + } + + return result; +} + void mrb_init_range(mrb_state *mrb) { @@ -407,7 +420,6 @@ mrb_init_range(mrb_state *mrb) 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 */ mrb_define_method(mrb, r, "===", mrb_range_include, MRB_ARGS_REQ(1)); /* 15.2.14.4.2 */ - mrb_define_method(mrb, r, "each", mrb_range_each, MRB_ARGS_NONE()); /* 15.2.14.4.4 */ mrb_define_method(mrb, r, "exclude_end?", mrb_range_excl, MRB_ARGS_NONE()); /* 15.2.14.4.6 */ mrb_define_method(mrb, r, "first", mrb_range_beg, MRB_ARGS_NONE()); /* 15.2.14.4.7 */ mrb_define_method(mrb, r, "include?", mrb_range_include, MRB_ARGS_REQ(1)); /* 15.2.14.4.8 */ diff --git a/src/variable.c b/src/variable.c index 231697d47..f34735e75 100644 --- a/src/variable.c +++ b/src/variable.c @@ -118,7 +118,7 @@ iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val) } /* - * Get a value for a symbol from the instance the variable table. + * Get a value for a symbol from the instance variable table. * * Parameters * mrb |
