diff options
Diffstat (limited to 'version.c')
| -rw-r--r-- | version.c | 320 |
1 files changed, 233 insertions, 87 deletions
@@ -9,152 +9,298 @@ **********************************************************************/ -#include "verconf.h" +#include "internal/cmdlineopt.h" +#include "internal/parse.h" +#include "internal/gc.h" +#include "ruby/internal/globals.h" #include "ruby/ruby.h" #include "version.h" +#include "vm_core.h" +#include "yjit.h" #include <stdio.h> -#define PRINT(type) puts(ruby_##type) -#define MKSTR(type) rb_obj_freeze(rb_usascii_str_new(ruby_##type, sizeof(ruby_##type)-1)) - -#ifndef RUBY_ARCH -#define RUBY_ARCH RUBY_PLATFORM -#endif -#ifndef RUBY_SITEARCH -#define RUBY_SITEARCH RUBY_ARCH -#endif -#ifdef RUBY_PLATFORM_CPU -#define RUBY_THINARCH RUBY_PLATFORM_CPU"-"RUBY_PLATFORM_OS -#endif -#ifndef RUBY_LIB_PREFIX -#ifndef RUBY_EXEC_PREFIX -#error RUBY_EXEC_PREFIX must be defined -#endif -#define RUBY_LIB_PREFIX RUBY_EXEC_PREFIX"/lib/ruby" +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 #endif -#ifndef RUBY_SITE_LIB -#define RUBY_SITE_LIB RUBY_LIB_PREFIX"/site_ruby" -#endif -#ifndef RUBY_VENDOR_LIB -#define RUBY_VENDOR_LIB RUBY_LIB_PREFIX"/vendor_ruby" -#endif - -typedef char ruby_lib_version_string[(int)sizeof(RUBY_LIB_VERSION) - 2]; -#define RUBY_LIB RUBY_LIB_PREFIX "/"RUBY_LIB_VERSION -#define RUBY_SITE_LIB2 RUBY_SITE_LIB "/"RUBY_LIB_VERSION -#define RUBY_VENDOR_LIB2 RUBY_VENDOR_LIB "/"RUBY_LIB_VERSION -#ifndef RUBY_ARCH_LIB_FOR -#define RUBY_ARCH_LIB_FOR(arch) RUBY_LIB "/"arch +#ifdef RUBY_REVISION +# if RUBY_PATCHLEVEL == -1 +# define RUBY_API_VERSION_NAME "master" +# ifndef RUBY_BRANCH_NAME +# define RUBY_BRANCH_NAME RUBY_API_VERSION_NAME +# endif +# define RUBY_REVISION_STR " "RUBY_BRANCH_NAME" "RUBY_REVISION +# else +# define RUBY_REVISION_STR " revision "RUBY_REVISION +# endif +#else +# define RUBY_REVISION "HEAD" +# define RUBY_REVISION_STR "" #endif -#ifndef RUBY_SITE_ARCH_LIB_FOR -#define RUBY_SITE_ARCH_LIB_FOR(arch) RUBY_SITE_LIB2 "/"arch +#ifndef RUBY_API_VERSION_NAME +# define RUBY_API_VERSION_NAME RUBY_API_VERSION_STR #endif -#ifndef RUBY_VENDOR_ARCH_LIB_FOR -#define RUBY_VENDOR_ARCH_LIB_FOR(arch) RUBY_VENDOR_LIB2 "/"arch +#if !defined RUBY_RELEASE_DATETIME || RUBY_PATCHLEVEL != -1 +# undef RUBY_RELEASE_DATETIME +# define RUBY_RELEASE_DATETIME RUBY_RELEASE_DATE #endif +#define PRINT(type) puts(ruby_##type) +#define MKSTR(type) rb_obj_freeze(rb_usascii_str_new_static(ruby_##type, sizeof(ruby_##type)-1)) +#define MKINT(name) INT2FIX(ruby_##name) + +#define RUBY_API_VERSION_STR \ + STRINGIZE(RUBY_API_VERSION_MAJOR) "." \ + STRINGIZE(RUBY_API_VERSION_MINOR) const int ruby_api_version[] = { RUBY_API_VERSION_MAJOR, RUBY_API_VERSION_MINOR, RUBY_API_VERSION_TEENY, }; +#define RUBY_VERSION \ + STRINGIZE(RUBY_VERSION_MAJOR) "." \ + STRINGIZE(RUBY_VERSION_MINOR) "." \ + STRINGIZE(RUBY_VERSION_TEENY) "" +#ifndef RUBY_FULL_REVISION +# define RUBY_FULL_REVISION RUBY_REVISION +#endif +#ifdef YJIT_SUPPORT +#define YJIT_DESCRIPTION " +YJIT " STRINGIZE(YJIT_SUPPORT) +#else +#define YJIT_DESCRIPTION " +YJIT" +#endif +#ifdef ZJIT_SUPPORT +#define ZJIT_DESCRIPTION " +ZJIT " STRINGIZE(ZJIT_SUPPORT) +#else +#define ZJIT_DESCRIPTION " +ZJIT" +#endif +#if USE_MODULAR_GC +#define GC_DESCRIPTION " +GC" +#else +#define GC_DESCRIPTION "" +#endif const char ruby_version[] = RUBY_VERSION; +const char ruby_revision[] = RUBY_FULL_REVISION; const char ruby_release_date[] = RUBY_RELEASE_DATE; const char ruby_platform[] = RUBY_PLATFORM; const int ruby_patchlevel = RUBY_PATCHLEVEL; -const char ruby_description[] = RUBY_DESCRIPTION; -const char ruby_copyright[] = RUBY_COPYRIGHT; +const char ruby_api_version_name[] = RUBY_API_VERSION_NAME; +const char ruby_description[] = + "ruby " RUBY_VERSION RUBY_PATCHLEVEL_STR " " + "(" RUBY_RELEASE_DATETIME RUBY_REVISION_STR ") " + "[" RUBY_PLATFORM "]"; +static const int ruby_description_opt_point = + (int)(sizeof(ruby_description) - sizeof(" [" RUBY_PLATFORM "]")); + +const char ruby_copyright[] = "ruby - Copyright (C) " + RUBY_BIRTH_YEAR_STR "-" RUBY_RELEASE_YEAR_STR " " + RUBY_AUTHOR; const char ruby_engine[] = "ruby"; -VALUE ruby_engine_name = Qnil; -#if !defined(LOAD_RELATIVE) || !LOAD_RELATIVE -const char ruby_exec_prefix[] = RUBY_EXEC_PREFIX; -#endif -const char ruby_initial_load_paths[] = -#ifndef NO_INITIAL_LOAD_PATH -#ifdef RUBY_SEARCH_PATH - RUBY_SEARCH_PATH "\0" -#endif -#ifndef NO_RUBY_SITE_LIB - RUBY_SITE_LIB2 "\0" -#ifdef RUBY_THINARCH - RUBY_SITE_ARCH_LIB_FOR(RUBY_THINARCH) "\0" -#endif - RUBY_SITE_ARCH_LIB_FOR(RUBY_SITEARCH) "\0" - RUBY_SITE_LIB "\0" -#endif +// Might change after initialization +const char *rb_dynamic_description = ruby_description; -#ifndef NO_RUBY_VENDOR_LIB - RUBY_VENDOR_LIB2 "\0" -#ifdef RUBY_THINARCH - RUBY_VENDOR_ARCH_LIB_FOR(RUBY_THINARCH) "\0" -#endif - RUBY_VENDOR_ARCH_LIB_FOR(RUBY_SITEARCH) "\0" - RUBY_VENDOR_LIB "\0" -#endif +static inline void +define_ruby_const(VALUE mod, const char *name, VALUE value, bool toplevel) +{ + if (toplevel) { + rb_define_global_const(name, value); + name += rb_strlen_lit("RUBY_"); + } + rb_define_const(mod, name, value); +} - RUBY_LIB "\0" -#ifdef RUBY_THINARCH - RUBY_ARCH_LIB_FOR(RUBY_THINARCH) "\0" -#endif - RUBY_ARCH_LIB_FOR(RUBY_ARCH) "\0" -#endif - ""; +/* RDoc needs rb_define_const */ +#define rb_define_const(mod, name, value) \ + define_ruby_const(mod, (mod == mRuby ? "RUBY_" name : name), value, (mod == mRuby)) + +void +Init_Ruby_module(void) +{ + rb_define_module("Ruby"); +} /*! Defines platform-depended Ruby-level constants */ void Init_version(void) { /* + * The Ruby[rdoc-ref:Ruby] module that contains portable information among + * implementations. + * + * The constants defined here are aliased in the toplevel with + * +RUBY_+ prefix. + */ + VALUE mRuby = rb_define_module("Ruby"); + + enum {ruby_patchlevel = RUBY_PATCHLEVEL}; + VALUE version = MKSTR(version); + VALUE ruby_engine_name = MKSTR(engine); + // MKSTR macro is a marker for fake.rb + + /* * The running version of ruby */ - rb_define_global_const("RUBY_VERSION", MKSTR(version)); + rb_define_const(mRuby, "VERSION", /* MKSTR(version) */ version); /* * The date this ruby was released */ - rb_define_global_const("RUBY_RELEASE_DATE", MKSTR(release_date)); + rb_define_const(mRuby, "RELEASE_DATE", MKSTR(release_date)); /* * The platform for this ruby */ - rb_define_global_const("RUBY_PLATFORM", MKSTR(platform)); + rb_define_const(mRuby, "PLATFORM", MKSTR(platform)); /* * The patchlevel for this ruby. If this is a development build of ruby * the patchlevel will be -1 */ - rb_define_global_const("RUBY_PATCHLEVEL", INT2FIX(RUBY_PATCHLEVEL)); - /* - * The SVN revision for this ruby. - */ - rb_define_global_const("RUBY_REVISION", INT2FIX(RUBY_REVISION)); + rb_define_const(mRuby, "PATCHLEVEL", MKINT(patchlevel)); /* - * The full ruby version string, like <tt>ruby -v</tt> prints' + * The GIT commit hash for this ruby. */ - rb_define_global_const("RUBY_DESCRIPTION", MKSTR(description)); + rb_define_const(mRuby, "REVISION", MKSTR(revision)); /* * The copyright string for ruby */ - rb_define_global_const("RUBY_COPYRIGHT", MKSTR(copyright)); + rb_define_const(mRuby, "COPYRIGHT", MKSTR(copyright)); /* * The engine or interpreter this ruby uses. */ - rb_define_global_const("RUBY_ENGINE", ruby_engine_name = MKSTR(engine)); + rb_define_const(mRuby, "ENGINE", /* MKSTR(engine) */ ruby_engine_name); + ruby_set_script_name(ruby_engine_name); + /* + * The version of the engine or interpreter this ruby uses. + */ + rb_define_const(mRuby, "ENGINE_VERSION", /* MKSTR(version) */ version); + + rb_provide("ruby2_keywords.rb"); +} + +#if USE_YJIT +#define YJIT_OPTS_ON opt->yjit +#else +#define YJIT_OPTS_ON 0 +#endif + +#if USE_ZJIT +#define ZJIT_OPTS_ON opt->zjit +#else +#define ZJIT_OPTS_ON 0 +#endif + +int ruby_mn_threads_enabled; + +#ifndef RB_DEFAULT_PARSER +#define RB_DEFAULT_PARSER RB_DEFAULT_PARSER_PRISM +#endif +static ruby_default_parser_enum default_parser = RB_DEFAULT_PARSER; + +ruby_default_parser_enum +rb_ruby_default_parser(void) +{ + return default_parser; +} + +void +rb_ruby_default_parser_set(ruby_default_parser_enum parser) +{ + default_parser = parser; +} + +static void +define_ruby_description(const char *const jit_opt) +{ +#define JIT_DESCRIPTION YJIT_DESCRIPTION ZJIT_DESCRIPTION + + static char desc[ + sizeof(ruby_description) + + rb_strlen_lit(JIT_DESCRIPTION) + + rb_strlen_lit(" +MN") + + rb_strlen_lit(" +PRISM") +#if USE_MODULAR_GC + + rb_strlen_lit(GC_DESCRIPTION) + // Assume the active GC name can not be longer than 20 chars + // so that we don't have to use strlen and remove the static + // qualifier from desc. + + RB_GC_MAX_NAME_LEN + 3 +#endif + + ]; + + int n = ruby_description_opt_point; + memcpy(desc, ruby_description, n); +# define append(s) (n += (int)strlcpy(desc + n, s, sizeof(desc) - n)) + if (*jit_opt) append(jit_opt); + RUBY_ASSERT(n <= ruby_description_opt_point + (int)rb_strlen_lit(JIT_DESCRIPTION)); + if (ruby_mn_threads_enabled) append(" +MN"); + if (rb_ruby_prism_p()) append(" +PRISM"); +#if USE_MODULAR_GC + append(GC_DESCRIPTION); + if (rb_gc_modular_gc_loaded_p()) { + append("["); + append(rb_gc_active_gc_name()); + append("]"); + } +#endif + append(ruby_description + ruby_description_opt_point); +# undef append + + VALUE mRuby = rb_path2class("Ruby"); + VALUE description = rb_obj_freeze(rb_usascii_str_new_static(desc, n)); + rb_dynamic_description = desc; + + /* + * The full ruby version string, like <tt>ruby -v</tt> prints + */ + rb_define_const(mRuby, "DESCRIPTION", /* MKSTR(description) */ description); +#undef JIT_DESCRIPTION +} + +void +Init_ruby_description(ruby_cmdline_options_t *opt) +{ + const char *const jit_opt = + YJIT_OPTS_ON ? YJIT_DESCRIPTION : + ZJIT_OPTS_ON ? ZJIT_DESCRIPTION : + ""; + define_ruby_description(jit_opt); +} + +void +ruby_set_yjit_description(void) +{ + VALUE mRuby = rb_path2class("Ruby"); + rb_const_remove(rb_cObject, rb_intern("RUBY_DESCRIPTION")); + rb_const_remove(mRuby, rb_intern("DESCRIPTION")); + define_ruby_description(YJIT_DESCRIPTION); +} + +void +ruby_set_zjit_description(void) +{ + VALUE mRuby = rb_path2class("Ruby"); + rb_const_remove(rb_cObject, rb_intern("RUBY_DESCRIPTION")); + rb_const_remove(mRuby, rb_intern("DESCRIPTION")); + define_ruby_description(ZJIT_DESCRIPTION); } -/*! Prints the version information of the CRuby interpreter to stdout. */ void ruby_show_version(void) { - PRINT(description); + puts(rb_dynamic_description); + +#ifdef RUBY_LAST_COMMIT_TITLE + fputs("last_commit=" RUBY_LAST_COMMIT_TITLE, stdout); +#endif +#ifdef HAVE_MALLOC_CONF + if (malloc_conf) printf("malloc_conf=%s\n", malloc_conf); +#endif fflush(stdout); } -/*! Prints the copyright notice of the CRuby interpreter to stdout and \em exits - * this process successfully. - */ void ruby_show_copyright(void) { PRINT(copyright); - exit(0); + fflush(stdout); } |
