summaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-08-20 23:38:49 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-08-20 23:38:49 +0900
commite73a0913430fbffcf5ec741055dfdc6146fa743c (patch)
tree672bd9cb5d67c17023e39bdab72f625760cba24b /src/codegen.c
parentc7fda2232b690f5e68a5d1f72e9dc8cd21682703 (diff)
parent05ede52239fce58b6a8be4b72d51db10ae1c2632 (diff)
downloadmruby-e73a0913430fbffcf5ec741055dfdc6146fa743c.tar.gz
mruby-e73a0913430fbffcf5ec741055dfdc6146fa743c.zip
Merge branch 'cubicdaiya-issues/scope_new_error_handlings'
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 7ff911758..48ab63de0 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -85,6 +85,7 @@ static void gen_assignment(codegen_scope *s, node *node, int sp, int val);
static void gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val);
static void codegen(codegen_scope *s, node *tree, int val);
+static void raise_error(codegen_scope *s, const char *msg);
static void
codegen_error(codegen_scope *s, const char *message)
@@ -552,6 +553,10 @@ for_body(codegen_scope *s, node *tree)
codegen(s, tree->cdr->car, VAL);
/* generate loop-block */
s = scope_new(s->mrb, s, NULL);
+ if (s == NULL) {
+ raise_error(prev, "unexpected scope");
+ }
+
push(); /* push for a block parameter */
lp = loop_push(s, LOOP_FOR);
@@ -589,6 +594,10 @@ lambda_body(codegen_scope *s, node *tree, int blk)
mrb_code c;
codegen_scope *parent = s;
s = scope_new(s->mrb, s, tree->car);
+ if (s == NULL) {
+ raise_error(parent, "unexpected scope");
+ }
+
s->mscope = !blk;
if (blk) {
@@ -674,6 +683,9 @@ static int
scope_body(codegen_scope *s, node *tree, int val)
{
codegen_scope *scope = scope_new(s->mrb, s, tree->car);
+ if (scope == NULL) {
+ raise_error(s, "unexpected scope");
+ }
codegen(scope, tree->cdr, VAL);
if (!s->iseq) {
@@ -2470,7 +2482,7 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
mrb_pool *pool = mrb_pool_open(mrb);
codegen_scope *p = (codegen_scope *)mrb_pool_alloc(pool, sizeof(codegen_scope));
- if (!p) return 0;
+ if (!p) return NULL;
*p = codegen_scope_zero;
p->mrb = mrb;
p->mpool = pool;