From 64ef091a64d61dc0cef4508b70e64f91e4db865d Mon Sep 17 00:00:00 2001 From: yugui Date: Wed, 11 Jul 2012 03:25:16 +0000 Subject: Reverts a half of r36079. As we discussed on ruby-dev@ and IRC, we do not need to disclose intermediate representation of program. The program embedding CRuby should use rb_eval_string family. * include/ruby/ruby.h (ruby_opaque_t): removed. (ruby_compile_main_from_file, ruby_compile_main_from_string, ruby_eval_main): removed. * eval.c (ruby_eval_main_internal): became ruby_exec_internal() again. (ruby_eval_main): removed. * ruby.c (PREPARE_PARSE_MAIN) reverted. (parse_and_compile_main, ruby_compile_main_from_file, ruby_compile_main_from_string): removed git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36362 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 16 +++++++ eval.c | 71 +++++++++++------------------- include/ruby/ruby.h | 18 ++------ ruby.c | 123 ++++++---------------------------------------------- 4 files changed, 58 insertions(+), 170 deletions(-) diff --git a/ChangeLog b/ChangeLog index a72f5c8190..e74fa69989 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +Mon Jul 9 14:05:42 2012 Yuki Yugui Sonoda + + Reverts a half of r36079. As we discussed on ruby-dev@ and IRC, + we do not need to disclose intermediate representation of program. + The program embedding CRuby should use rb_eval_string family. + * include/ruby/ruby.h (ruby_opaque_t): removed. + (ruby_compile_main_from_file, ruby_compile_main_from_string, + ruby_eval_main): removed. + + * eval.c (ruby_eval_main_internal): became ruby_exec_internal() again. + (ruby_eval_main): removed. + + * ruby.c (PREPARE_PARSE_MAIN) reverted. + (parse_and_compile_main, ruby_compile_main_from_file, + ruby_compile_main_from_string): removed + Wed Jul 11 10:16:38 2012 Nobuyoshi Nakada * include/ruby.h (HAVE_RUBY_THREAD_H): to show ruby/thread.h to be diff --git a/eval.c b/eval.c index 2c82d4f2b8..411e50727f 100644 --- a/eval.c +++ b/eval.c @@ -84,7 +84,7 @@ ruby_init(void) * @return an opaque pointer to the compiled source or an internal special value. * @sa ruby_executable_node(). */ -ruby_opaque_t +void * ruby_options(int argc, char **argv) { int state; @@ -230,6 +230,26 @@ ruby_cleanup(volatile int ex) return ex; } +static int +ruby_exec_internal(void *n) +{ + volatile int state; + VALUE iseq = (VALUE)n; + rb_thread_t *th = GET_THREAD(); + + if (!n) return 0; + + PUSH_TAG(); + if ((state = EXEC_TAG()) == 0) { + SAVE_ROOT_JMPBUF(th, { + th->base_block = 0; + rb_iseq_eval_main(iseq); + }); + } + POP_TAG(); + return state; +} + /*! Calls ruby_cleanup() and exits the process */ void ruby_stop(int ex) @@ -250,7 +270,7 @@ ruby_stop(int ex) * @retval 0 if the given value is such a special value. */ int -ruby_executable_node(ruby_opaque_t n, int *status) +ruby_executable_node(void *n, int *status) { VALUE v = (VALUE)n; int s; @@ -266,36 +286,12 @@ ruby_executable_node(ruby_opaque_t n, int *status) return FALSE; } -static int -ruby_eval_main_internal(VALUE iseqval, VALUE* result) -{ - volatile int state; - volatile VALUE retval; - rb_thread_t *th = GET_THREAD(); - - if (!iseqval) { - *result = Qnil; - return 0; - } - - PUSH_TAG(); - if ((state = EXEC_TAG()) == 0) { - SAVE_ROOT_JMPBUF(th, { - th->base_block = 0; - retval = rb_iseq_eval_main(iseqval); - }); - } - POP_TAG(); - *result = state ? th->errinfo : retval; - return state; -} - /*! Runs the given compiled source and exits this process. * @retval 0 if successfully run thhe source * @retval non-zero if an error occurred. */ int -ruby_run_node(ruby_opaque_t n) +ruby_run_node(void *n) { int status; if (!ruby_executable_node(n, &status)) { @@ -307,27 +303,10 @@ ruby_run_node(ruby_opaque_t n) /*! Runs the given compiled source */ int -ruby_exec_node(ruby_opaque_t n) +ruby_exec_node(void *n) { - VALUE dummy; ruby_init_stack((void *)&n); - return ruby_eval_main_internal((VALUE)n, &dummy); -} - - -/*! - * Evaluates the given iseq in the main (toplevel) context. - * - * @param iseqval a VALUE that wraps an iseq. - * @param result Stores the evaluated value if succeeded, - * or an exception if failed. - * @retval 0 if succeeded - * @retval non-zero if failed. - */ -int -ruby_eval_main(ruby_opaque_t n, VALUE *result) -{ - return !!ruby_eval_main_internal((VALUE)n, result); + return ruby_exec_internal(n); } /* diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index e74f65dcc4..e9474d10fa 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -1478,13 +1478,6 @@ int ruby_vsnprintf(char *str, size_t n, char const *fmt, va_list ap); * @{ */ -/*! Opaque pointer to an inner data structure. - * - * You do not have to know what the actual data type this pointer points. - * It often changes for internal improvements. - */ -typedef void *ruby_opaque_t; - /** @defgroup ruby1 ruby(1) implementation * A part of the implementation of ruby(1) command. * Other programs that embed Ruby interpreter do not always need to use these @@ -1494,9 +1487,9 @@ typedef void *ruby_opaque_t; void ruby_sysinit(int *argc, char ***argv); void ruby_init(void); -ruby_opaque_t ruby_options(int argc, char** argv); -int ruby_executable_node(ruby_opaque_t n, int *status); -int ruby_run_node(ruby_opaque_t n); +void* ruby_options(int argc, char** argv); +int ruby_executable_node(void *n, int *status); +int ruby_run_node(void *n); /* version.c */ void ruby_show_version(void); @@ -1528,10 +1521,7 @@ void ruby_set_stack_size(size_t); int ruby_stack_check(void); size_t ruby_stack_length(VALUE**); -ruby_opaque_t ruby_compile_main_from_file(VALUE fname, const char* path, VALUE* error); -ruby_opaque_t ruby_compile_main_from_string(VALUE fname, VALUE string, VALUE* error); -int ruby_exec_node(ruby_opaque_t n); -int ruby_eval_main(ruby_opaque_t n, VALUE *result); +int ruby_exec_node(void *n); void ruby_script(const char* name); void ruby_set_script_name(VALUE name); diff --git a/ruby.c b/ruby.c index 5aa93504b0..ab4b6747aa 100644 --- a/ruby.c +++ b/ruby.c @@ -505,14 +505,6 @@ toplevel_context(void) return env; } -#define PREPARE_PARSE_MAIN(th, env, expr) do { \ - (th)->parse_in_eval--; \ - (th)->base_block = &(env)->block; \ - expr; \ - (th)->parse_in_eval++; \ - (th)->base_block = 0; \ -} while (0) - static void process_sflag(int *sflag) { @@ -1381,6 +1373,14 @@ process_options(int argc, char **argv, struct cmdline_options *opt) env = toplevel_context(); +#define PREPARE_PARSE_MAIN(expr) do { \ + th->parse_in_eval--; \ + th->base_block = &env->block; \ + expr; \ + th->parse_in_eval++; \ + th->base_block = 0; \ +} while (0) + if (opt->e_script) { VALUE progname = rb_progname; rb_encoding *eenc; @@ -1395,7 +1395,7 @@ process_options(int argc, char **argv, struct cmdline_options *opt) require_libraries(&opt->req_list); ruby_set_script_name(progname); - PREPARE_PARSE_MAIN(th, env, { + PREPARE_PARSE_MAIN({ tree = rb_parser_compile_string(parser, opt->script, opt->e_script, 1); }); } @@ -1404,7 +1404,7 @@ process_options(int argc, char **argv, struct cmdline_options *opt) forbid_setid("program input from stdin"); } - PREPARE_PARSE_MAIN(th, env, { + PREPARE_PARSE_MAIN({ tree = load_file(parser, opt->script_name, 1, opt); }); } @@ -1444,12 +1444,12 @@ process_options(int argc, char **argv, struct cmdline_options *opt) } if (opt->do_print) { - PREPARE_PARSE_MAIN(th, env, { + PREPARE_PARSE_MAIN({ tree = rb_parser_append_print(parser, tree); }); } if (opt->do_loop) { - PREPARE_PARSE_MAIN(th, env, { + PREPARE_PARSE_MAIN({ tree = rb_parser_while_loop(parser, tree, opt->do_line, opt->do_split); }); rb_define_global_function("sub", rb_f_sub, -1); @@ -1464,7 +1464,7 @@ process_options(int argc, char **argv, struct cmdline_options *opt) return Qtrue; } - PREPARE_PARSE_MAIN(th, env, { + PREPARE_PARSE_MAIN({ VALUE path = Qnil; if (!opt->e_script && strcmp(opt->script, "-")) path = rb_realpath_internal(Qnil, opt->script_name, 1); @@ -1687,103 +1687,6 @@ rb_load_file(const char *fname) return load_file(rb_parser_new(), fname_v, 0, cmdline_options_init(&opt)); } -struct ruby_compile_main_arg { - int is_string; - union { - VALUE path; - VALUE string; - } source; -}; - -static ruby_opaque_t -parse_and_compile_main(VALUE fname, const struct ruby_compile_main_arg* arg, VALUE* error) -{ - rb_env_t *const env = toplevel_context(); - rb_thread_t *const th = GET_THREAD(); - NODE* tree; - VALUE iseq; - VALUE path; - int state; - - PUSH_TAG(); - if ((state = EXEC_TAG()) == 0) { - PREPARE_PARSE_MAIN(th, env, { - VALUE parser = rb_parser_new(); - th->mild_compile_error++; - if (arg->is_string) { - FilePathValue(fname); - path = fname; - tree = rb_parser_compile_string(parser, RSTRING_PTR(fname), arg->source.string, 1); - } - else { - struct cmdline_options opt; - path = arg->source.path; - tree = load_file(parser, path, 0, cmdline_options_init(&opt)); - } - th->mild_compile_error--; - }); - if (!tree) rb_exc_raise(th->errinfo); - - ruby_set_script_name(fname); - - PREPARE_PARSE_MAIN(th, env, { - iseq = rb_iseq_new_main(tree, fname, path); - }); - } - POP_TAG(); - if (state) { - *error = th->errinfo; - return NULL; - } else { - *error = Qnil; - return (ruby_opaque_t)iseq; - } -} - -/** - * Compiles a main Ruby script file into the internal a data structure. - * - * This function: - * @li loads the file specified by path. - * @li parses the source and compiles it - * - * @param fname $0 is set to this value. - * If nil, - * uses the given path instead. - * @param path path to the source - * @param error where to store the exception if an error occured. - * @return The compiled source code. Or NULL if an error occured. - */ -ruby_opaque_t -ruby_compile_main_from_file(VALUE fname, const char* path, VALUE* error) -{ - struct ruby_compile_main_arg arg; - arg.is_string = FALSE; - arg.source.path = rb_str_new_cstr(path); - - if (NIL_P(fname)) fname = arg.source.path; - return parse_and_compile_main(fname, &arg, error); -} - -/** - * Compiles a main Ruby script in a string into the internal a data structure. - * - * This function parses the given source and compiles it - * - * @param fname $0 is set to this value. - * @param source Ruby source string - * @param error where to store the exception if an error occured. - * @return The compiled source code. Or NULL if an error occured. - */ -ruby_opaque_t -ruby_compile_main_from_string(VALUE fname, VALUE source, VALUE* error) -{ - struct ruby_compile_main_arg arg; - arg.is_string = TRUE; - arg.source.string = source; - return parse_and_compile_main(fname, &arg, error); -} - static void set_arg0(VALUE val, ID id) { -- cgit v1.2.3