diff options
| author | dearblue <[email protected]> | 2021-12-17 23:03:27 +0900 |
|---|---|---|
| committer | dearblue <[email protected]> | 2021-12-17 23:03:27 +0900 |
| commit | 26338fe640720a39303885a98e6312210f051cde (patch) | |
| tree | 7a39c0bf206265426413ca7b722521c03d7b8928 | |
| parent | 9b65d0dc861f4a5d1605fa7fccb56f1758a2bd6f (diff) | |
| download | mruby-26338fe640720a39303885a98e6312210f051cde.tar.gz mruby-26338fe640720a39303885a98e6312210f051cde.zip | |
Print error before cleanup in `codegen_error()`
Previously, it always pointed to the highest scope as the location of the error.
- example code `code.rb`
```ruby
huge_num = "1" + "0" * 300; eval <<CODE, nil, "test.rb", 1
class Object
module A
#{huge_num}
end
end
CODE
```
- Before this patch
```console
% bin/mruby code.rb
test.rb:1: integer too big
trace (most recent call last):
[1] code.rb:1
code.rb:1:in eval: codegen error (ScriptError)
```
- After this patch
```console
% bin/mruby code.rb
test.rb:3: integer too big
trace (most recent call last):
[1] code.rb:1
code.rb:1:in eval: codegen error (ScriptError)
```
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 54eb611ca..722c0b480 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -111,6 +111,15 @@ static void codegen_error(codegen_scope *s, const char *message) { if (!s) return; +#ifndef MRB_NO_STDIO + if (s->filename_sym && s->lineno) { + const char *filename = mrb_sym_name_len(s->mrb, s->filename_sym, NULL); + fprintf(stderr, "%s:%d: %s\n", filename, s->lineno, message); + } + else { + fprintf(stderr, "%s\n", message); + } +#endif while (s->prev) { codegen_scope *tmp = s->prev; if (s->irep) { @@ -137,15 +146,6 @@ codegen_error(codegen_scope *s, const char *message) mrb_pool_close(s->mpool); s = tmp; } -#ifndef MRB_NO_STDIO - if (s->filename_sym && s->lineno) { - const char *filename = mrb_sym_name_len(s->mrb, s->filename_sym, NULL); - fprintf(stderr, "%s:%d: %s\n", filename, s->lineno, message); - } - else { - fprintf(stderr, "%s\n", message); - } -#endif MRB_THROW(s->mrb->jmp); } |
