summaryrefslogtreecommitdiffhomepage
path: root/src/parse.y
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-05-14 23:39:56 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-05-14 23:39:56 +0900
commit95fb1fd809780e71848c339f8e3e035d1ae015d6 (patch)
tree48d1f572b8c1cb25472bdb8c6b1a0c1d4ecc835f /src/parse.y
parent7cc66cf819beb5398d6fd40711373f9cfe79b77a (diff)
downloadmruby-95fb1fd809780e71848c339f8e3e035d1ae015d6.tar.gz
mruby-95fb1fd809780e71848c339f8e3e035d1ae015d6.zip
mrbc to take multiple files, preserving debug information if -g given; close #1243
Diffstat (limited to 'src/parse.y')
-rw-r--r--src/parse.y28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/parse.y b/src/parse.y
index fc2d09f23..54e8eafce 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -3232,14 +3232,14 @@ nextc(parser_state *p)
else {
#ifdef ENABLE_STDIO
if (p->f) {
- if (feof(p->f)) return -1;
+ if (feof(p->f)) goto end_retry;
c = fgetc(p->f);
- if (c == EOF) return -1;
+ if (c == EOF) goto end_retry;
}
else
#endif
if (!p->s || p->s >= p->send) {
- return -1;
+ goto end_retry;
}
else {
c = (unsigned char)*p->s++;
@@ -3247,6 +3247,18 @@ nextc(parser_state *p)
}
p->column++;
return c;
+
+ end_retry:
+ if (!p->cxt) return -1;
+ else {
+ mrbc_context *cxt = p->cxt;
+
+ if (cxt->partial_hook(p) < 0) return -1;
+ p->cxt = NULL;
+ c = nextc(p);
+ p->cxt = cxt;
+ return c;
+ }
}
static void
@@ -5023,6 +5035,9 @@ parser_init_cxt(parser_state *p, mrbc_context *cxt)
}
}
p->capture_errors = cxt->capture_errors;
+ if (cxt->partial_hook) {
+ p->cxt = cxt;
+ }
}
static void
@@ -5147,6 +5162,13 @@ mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s)
return c->filename;
}
+void
+mrbc_partial_hook(mrb_state *mrb, mrbc_context *c, int (*func)(struct mrb_parser_state*), void *data)
+{
+ c->partial_hook = func;
+ c->partial_data = data;
+}
+
#ifdef ENABLE_STDIO
parser_state*
mrb_parse_file(mrb_state *mrb, FILE *f, mrbc_context *c)