mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge branch 'master' into android.rake-ndk-clang
This commit is contained in:
@@ -1645,7 +1645,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
||||
node *t = tree->cdr, *p;
|
||||
int rhs = cursp();
|
||||
|
||||
if ((intptr_t)t->car == NODE_ARRAY && nosplat(t->cdr)) {
|
||||
if ((intptr_t)t->car == NODE_ARRAY && t->cdr && nosplat(t->cdr)) {
|
||||
/* fixed rhs */
|
||||
t = t->cdr;
|
||||
while (t) {
|
||||
@@ -1655,11 +1655,21 @@ codegen(codegen_scope *s, node *tree, int val)
|
||||
}
|
||||
tree = tree->car;
|
||||
if (tree->car) { /* pre */
|
||||
int first = TRUE;
|
||||
t = tree->car;
|
||||
n = 0;
|
||||
while (t) {
|
||||
gen_assignment(s, t->car, rhs+n, NOVAL);
|
||||
n++;
|
||||
if (n < len) {
|
||||
gen_assignment(s, t->car, rhs+n, NOVAL);
|
||||
n++;
|
||||
}
|
||||
else {
|
||||
if (first) {
|
||||
genop(s, MKOP_A(OP_LOADNIL, rhs+n));
|
||||
first = FALSE;
|
||||
}
|
||||
gen_assignment(s, t->car, rhs+n, NOVAL);
|
||||
}
|
||||
t = t->cdr;
|
||||
}
|
||||
}
|
||||
|
||||
+6
-2
@@ -760,13 +760,15 @@ mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym)
|
||||
{
|
||||
struct RClass * cls = c;
|
||||
mrb_value v;
|
||||
int given = FALSE;
|
||||
|
||||
while (c) {
|
||||
if (c->iv && iv_get(mrb, c->iv, sym, &v)) {
|
||||
return v;
|
||||
given = TRUE;
|
||||
}
|
||||
c = c->super;
|
||||
}
|
||||
if (given) return v;
|
||||
if (cls && cls->tt == MRB_TT_SCLASS) {
|
||||
mrb_value klass;
|
||||
|
||||
@@ -774,12 +776,14 @@ mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym)
|
||||
mrb_intern_lit(mrb, "__attached__"));
|
||||
c = mrb_class_ptr(klass);
|
||||
if (c->tt == MRB_TT_CLASS || c->tt == MRB_TT_MODULE) {
|
||||
given = FALSE;
|
||||
while (c) {
|
||||
if (c->iv && iv_get(mrb, c->iv, sym, &v)) {
|
||||
return v;
|
||||
given = TRUE;
|
||||
}
|
||||
c = c->super;
|
||||
}
|
||||
if (given) return v;
|
||||
}
|
||||
}
|
||||
mrb_name_error(mrb, sym, "uninitialized class variable %S in %S",
|
||||
|
||||
@@ -1513,6 +1513,7 @@ RETRY_TRY_BLOCK:
|
||||
/* A B return R(A) (B=normal,in-block return/break) */
|
||||
if (mrb->exc) {
|
||||
mrb_callinfo *ci;
|
||||
mrb_value *stk;
|
||||
int eidx;
|
||||
|
||||
L_RAISE:
|
||||
@@ -1524,6 +1525,7 @@ RETRY_TRY_BLOCK:
|
||||
if (ci->ridx == 0) goto L_STOP;
|
||||
goto L_RESCUE;
|
||||
}
|
||||
stk = mrb->c->stack;
|
||||
while (ci[0].ridx == ci[-1].ridx) {
|
||||
cipop(mrb);
|
||||
ci = mrb->c->ci;
|
||||
@@ -1533,6 +1535,7 @@ RETRY_TRY_BLOCK:
|
||||
MRB_THROW(prev_jmp);
|
||||
}
|
||||
if (ci == mrb->c->cibase) {
|
||||
mrb->c->stack = stk;
|
||||
while (eidx > 0) {
|
||||
ecall(mrb, --eidx);
|
||||
}
|
||||
|
||||
+4
-1
@@ -338,10 +338,13 @@ assert('Exception 19') do
|
||||
begin
|
||||
1 * "b"
|
||||
ensure
|
||||
@e = self.z
|
||||
@e = self.zz
|
||||
end
|
||||
end
|
||||
|
||||
def zz
|
||||
true
|
||||
end
|
||||
def z
|
||||
true
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user