summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-05-06 00:52:22 +0900
committerYukihiro Matsumoto <[email protected]>2012-05-06 00:52:22 +0900
commitb0e94d8c146fe411a44b9e744362fb91ad9bee88 (patch)
treeba925d457ee1afa9b2760d3febcb195fb3faf715 /src/vm.c
parent55da4cdc86d7c766c78a3f4c980a63eb7d991aa1 (diff)
downloadmruby-b0e94d8c146fe411a44b9e744362fb91ad9bee88.tar.gz
mruby-b0e94d8c146fe411a44b9e744362fb91ad9bee88.zip
Time class available; based on code from @beoran; sorry for jumbo patch
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/src/vm.c b/src/vm.c
index f2f59cfbb..9c79a7afe 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -261,7 +261,7 @@ mrb_yield(mrb_state *mrb, mrb_value b, mrb_value v)
return mrb_yield_with_self(mrb, b, 1, &v, mrb->stack[0]);
}
-void
+static void
localjump_error(mrb_state *mrb, const char *kind)
{
char buf[256];
@@ -272,6 +272,25 @@ localjump_error(mrb_state *mrb, const char *kind)
mrb->exc = mrb_object(exc);
}
+static void
+argnum_error(mrb_state *mrb, int num)
+{
+ char buf[256];
+ mrb_value exc;
+
+ if (mrb->ci->mid) {
+ snprintf(buf, 256, "'%s': wrong number of arguments (%d for %d)",
+ mrb_sym2name(mrb, mrb->ci->mid),
+ mrb->ci->argc, num);
+ }
+ else {
+ snprintf(buf, 256, "wrong number of arguments (%d for %d)",
+ mrb->ci->argc, num);
+ }
+ exc = mrb_exc_new(mrb, E_ARGUMENT_ERROR, buf, strlen(buf));
+ mrb->exc = mrb_object(exc);
+}
+
#define SET_TRUE_VALUE(r) {\
(r).tt = MRB_TT_TRUE;\
(r).value.i = 1;\
@@ -717,7 +736,9 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
ci->target_class = m->target_class;
ci->proc = m;
if (m->env) {
- ci->mid = m->env->mid;
+ if (m->env->mid) {
+ ci->mid = m->env->mid;
+ }
if (!m->env->stack) {
m->env->stack = mrb->stack;
}
@@ -895,10 +916,8 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
if (mrb->ci->proc && MRB_PROC_STRICT_P(mrb->ci->proc)) {
if (argc >= 0) {
if (argc < m1 + m2 || (r == 0 && argc > len)) {
- fprintf(stderr, "'%s': wrong number of arguments (%d for %d)\n",
- mrb_sym2name(mrb, mrb->ci->mid),
- mrb->ci->argc, m1+m2);
- exit(1);
+ argnum_error(mrb, m1+m2);
+ goto L_RAISE;
}
}
}