6
6
#include <mruby/compile.h>
7
7
#include <mruby/dump.h>
8
8
#include <mruby/variable.h>
9
+ #include <mruby/throw.h>
9
10
10
11
#ifdef MRB_DISABLE_STDIO
11
12
static void
@@ -176,6 +177,8 @@ main(int argc, char **argv)
176
177
mrbc_context * c ;
177
178
mrb_value v ;
178
179
mrb_sym zero_sym ;
180
+ struct mrb_jmpbuf c_jmp ;
181
+ int ai ;
179
182
180
183
if (mrb == NULL ) {
181
184
fputs ("Invalid mrb_state, exiting mruby\n" , stderr );
@@ -189,59 +192,67 @@ main(int argc, char **argv)
189
192
return n ;
190
193
}
191
194
192
- ARGV = mrb_ary_new_capa (mrb , args .argc );
193
- for (i = 0 ; i < args .argc ; i ++ ) {
194
- char * utf8 = mrb_utf8_from_locale (args .argv [i ], -1 );
195
- if (utf8 ) {
196
- mrb_ary_push (mrb , ARGV , mrb_str_new_cstr (mrb , utf8 ));
197
- mrb_utf8_free (utf8 );
195
+ ai = mrb_gc_arena_save (mrb );
196
+ MRB_TRY (& c_jmp ) {
197
+ mrb -> jmp = & c_jmp ;
198
+ ARGV = mrb_ary_new_capa (mrb , args .argc );
199
+ for (i = 0 ; i < args .argc ; i ++ ) {
200
+ char * utf8 = mrb_utf8_from_locale (args .argv [i ], -1 );
201
+ if (utf8 ) {
202
+ mrb_ary_push (mrb , ARGV , mrb_str_new_cstr (mrb , utf8 ));
203
+ mrb_utf8_free (utf8 );
204
+ }
198
205
}
199
- }
200
- mrb_define_global_const (mrb , "ARGV" , ARGV );
201
-
202
- c = mrbc_context_new (mrb );
203
- if (args .verbose )
204
- c -> dump_result = TRUE;
205
- if (args .check_syntax )
206
- c -> no_exec = TRUE;
207
-
208
- /* Set $0 */
209
- zero_sym = mrb_intern_lit (mrb , "$0" );
210
- if (args .rfp ) {
211
- const char * cmdline ;
212
- cmdline = args .cmdline ? args .cmdline : "-" ;
213
- mrbc_filename (mrb , c , cmdline );
214
- mrb_gv_set (mrb , zero_sym , mrb_str_new_cstr (mrb , cmdline ));
215
- }
216
- else {
217
- mrbc_filename (mrb , c , "-e" );
218
- mrb_gv_set (mrb , zero_sym , mrb_str_new_lit (mrb , "-e" ));
219
- }
206
+ mrb_define_global_const (mrb , "ARGV" , ARGV );
220
207
221
- /* Load program */
222
- if (args .mrbfile ) {
223
- v = mrb_load_irep_file_cxt (mrb , args .rfp , c );
224
- }
225
- else if (args .rfp ) {
226
- v = mrb_load_file_cxt (mrb , args .rfp , c );
227
- }
228
- else {
229
- char * utf8 = mrb_utf8_from_locale (args .cmdline , -1 );
230
- if (!utf8 ) abort ();
231
- v = mrb_load_string_cxt (mrb , utf8 , c );
232
- mrb_utf8_free (utf8 );
233
- }
208
+ c = mrbc_context_new (mrb );
209
+ if (args .verbose )
210
+ c -> dump_result = TRUE;
211
+ if (args .check_syntax )
212
+ c -> no_exec = TRUE;
213
+
214
+ /* Set $0 */
215
+ zero_sym = mrb_intern_lit (mrb , "$0" );
216
+ if (args .rfp ) {
217
+ const char * cmdline ;
218
+ cmdline = args .cmdline ? args .cmdline : "-" ;
219
+ mrbc_filename (mrb , c , cmdline );
220
+ mrb_gv_set (mrb , zero_sym , mrb_str_new_cstr (mrb , cmdline ));
221
+ }
222
+ else {
223
+ mrbc_filename (mrb , c , "-e" );
224
+ mrb_gv_set (mrb , zero_sym , mrb_str_new_lit (mrb , "-e" ));
225
+ }
226
+
227
+ /* Load program */
228
+ if (args .mrbfile ) {
229
+ v = mrb_load_irep_file_cxt (mrb , args .rfp , c );
230
+ }
231
+ else if (args .rfp ) {
232
+ v = mrb_load_file_cxt (mrb , args .rfp , c );
233
+ }
234
+ else {
235
+ char * utf8 = mrb_utf8_from_locale (args .cmdline , -1 );
236
+ if (!utf8 ) abort ();
237
+ v = mrb_load_string_cxt (mrb , utf8 , c );
238
+ mrb_utf8_free (utf8 );
239
+ }
234
240
235
- mrbc_context_free (mrb , c );
236
- if (mrb -> exc ) {
237
- if (!mrb_undef_p (v )) {
238
- mrb_print_error (mrb );
241
+ mrb_gc_arena_restore (mrb , ai );
242
+ mrbc_context_free (mrb , c );
243
+ if (mrb -> exc ) {
244
+ if (!mrb_undef_p (v )) {
245
+ mrb_print_error (mrb );
246
+ }
247
+ n = -1 ;
248
+ }
249
+ else if (args .check_syntax ) {
250
+ printf ("Syntax OK\n" );
239
251
}
240
- n = -1 ;
241
252
}
242
- else if (args .check_syntax ) {
243
- printf ("Syntax OK\n" );
253
+ MRB_CATCH (& c_jmp ) { /* error */
244
254
}
255
+ MRB_END_EXC (& c_jmp );
245
256
cleanup (mrb , & args );
246
257
247
258
return n == 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
0 commit comments