summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dump.c6
-rw-r--r--src/error.c31
-rw-r--r--src/gc.c6
-rw-r--r--src/numeric.c6
-rw-r--r--src/range.c80
-rw-r--r--src/variable.c2
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 */
}
diff --git a/src/gc.c b/src/gc.c
index 2660ffcc7..4478b71f3 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -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