summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-01-24 12:36:04 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-01-24 12:36:04 +0000
commit6375c68f8851e1e0fee8a95afba91c4555097127 (patch)
tree355d79b4627abb6b9431dae0405a5cace8e1b78a
parent7e68efbc9599550eadf5aa9a50bdc9a36796db49 (diff)
parse.y: function parser_mixed_error & parser_mixed_escape
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66919 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--parse.y43
1 files changed, 25 insertions, 18 deletions
diff --git a/parse.y b/parse.y
index 6c7ca60b46..cbebc6ed8f 100644
--- a/parse.y
+++ b/parse.y
@@ -5684,6 +5684,26 @@ parser_update_heredoc_indent(struct parser_params *p, int c)
return FALSE;
}
+static void
+parser_mixed_error(struct parser_params *p, rb_encoding *enc1, rb_encoding *enc2)
+{
+ static const char mixed_msg[] = "%s mixed within %s source";
+ const char *n1 = rb_enc_name(enc1), *n2 = rb_enc_name(enc2);
+ const size_t len = sizeof(mixed_msg) - 4 + strlen(n1) + strlen(n2);
+ char *errbuf = ALLOCA_N(char, len);
+ snprintf(errbuf, len, mixed_msg, n1, n2);
+ yyerror0(errbuf);
+}
+
+static void
+parser_mixed_escape(struct parser_params *p, const char *beg, rb_encoding *enc1, rb_encoding *enc2)
+{
+ const char *pos = p->lex.pcur;
+ p->lex.pcur = beg;
+ parser_mixed_error(p, enc1, enc2);
+ p->lex.pcur = pos;
+}
+
static int
tokadd_string(struct parser_params *p,
int func, int term, int paren, long *nest,
@@ -5691,25 +5711,12 @@ tokadd_string(struct parser_params *p,
{
int c;
rb_encoding *enc = 0;
- char *errbuf = 0;
- static const char mixed_msg[] = "%s mixed within %s source";
+ bool erred = false;
-#define mixed_error(enc1, enc2) if (!errbuf) { \
- size_t len = sizeof(mixed_msg) - 4; \
- len += strlen(rb_enc_name(enc1)); \
- len += strlen(rb_enc_name(enc2)); \
- errbuf = ALLOCA_N(char, len); \
- snprintf(errbuf, len, mixed_msg, \
- rb_enc_name(enc1), \
- rb_enc_name(enc2)); \
- yyerror0(errbuf); \
- }
-#define mixed_escape(beg, enc1, enc2) do { \
- const char *pos = p->lex.pcur; \
- p->lex.pcur = (beg); \
- mixed_error((enc1), (enc2)); \
- p->lex.pcur = pos; \
- } while (0)
+#define mixed_error(enc1, enc2) \
+ (void)(erred || (parser_mixed_error(p, enc1, enc2), erred = true))
+#define mixed_escape(beg, enc1, enc2) \
+ (void)(erred || (parser_mixed_escape(p, beg, enc1, enc2), erred = true))
while ((c = nextc(p)) != -1) {
if (p->heredoc_indent > 0) {