[前][次][番号順一覧][スレッド一覧]

ruby-changes:51062

From: nobu <ko1@a...>
Date: Fri, 27 Apr 2018 11:02:34 +0900 (JST)
Subject: [ruby-changes:51062] nobu:r63269 (trunk): mjit.c: prefix and archdir in init

nobu	2018-04-27 11:02:29 +0900 (Fri, 27 Apr 2018)

  New Revision: 63269

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=63269

  Log:
    mjit.c: prefix and archdir in init
    
    * ruby.c (ruby_init_loadpath_safe): store prefix and archlibdir
      paths.
    
    * mjit.c (compile_c_to_so, init_header_filename): use just one
      library path on Windows.

  Modified files:
    trunk/mjit.c
    trunk/ruby.c
Index: ruby.c
===================================================================
--- ruby.c	(revision 63268)
+++ ruby.c	(revision 63269)
@@ -497,10 +497,27 @@ dladdr_path(const void* addr) https://github.com/ruby/ruby/blob/trunk/ruby.c#L497
 
 #define INITIAL_LOAD_PATH_MARK rb_intern_const("@gem_prelude_index")
 
+VALUE ruby_archlibdir_path, ruby_prefix_path;
+
 void
 ruby_init_loadpath_safe(int safe_level)
 {
-    VALUE load_path;
+    static const char libdir[] = "/"
+#ifdef LIBDIR_BASENAME
+	LIBDIR_BASENAME
+#else
+	"lib"
+#endif
+#ifdef ENABLE_MULTIARCH
+	"/"RUBY_ARCH
+#endif
+	;
+    const ptrdiff_t libdir_len = (ptrdiff_t)sizeof(libdir)
+#ifdef ENABLE_MULTIARCH
+	- rb_strlen_lit("/"RUBY_ARCH)
+#endif
+	- 1;
+    VALUE load_path, archlibdir = 0;
     ID id_initial_load_path_mark;
     const char *paths = ruby_initial_load_paths;
 #if defined LOAD_RELATIVE
@@ -561,23 +578,22 @@ ruby_init_loadpath_safe(int safe_level) https://github.com/ruby/ruby/blob/trunk/ruby.c#L578
     p = strrchr(libpath, '/');
     if (p) {
 	static const char bindir[] = "/bin";
-#ifdef LIBDIR_BASENAME
-	static const char libdir[] = "/"LIBDIR_BASENAME;
-#else
-	static const char libdir[] = "/lib";
-#endif
 	const ptrdiff_t bindir_len = (ptrdiff_t)sizeof(bindir) - 1;
-	const ptrdiff_t libdir_len = (ptrdiff_t)sizeof(libdir) - 1;
 
-#ifdef ENABLE_MULTIARCH
 	const char *p2 = NULL;
 
+#ifdef ENABLE_MULTIARCH
       multiarch:
 #endif
 	if (p - libpath >= bindir_len && !STRNCASECMP(p - bindir_len, bindir, bindir_len)) {
 	    p -= bindir_len;
+	    archlibdir = rb_str_subseq(sopath, 0, p - libpath);
+	    rb_str_cat_cstr(archlibdir, libdir);
+	    OBJ_FREEZE_RAW(archlibdir);
 	}
 	else if (p - libpath >= libdir_len && !strncmp(p - libdir_len, libdir, libdir_len)) {
+	    archlibdir = rb_str_subseq(sopath, 0, (p2 ? p2 : p) - libpath);
+	    OBJ_FREEZE_RAW(archlibdir);
 	    p -= libdir_len;
 	}
 #ifdef ENABLE_MULTIARCH
@@ -603,6 +619,13 @@ ruby_init_loadpath_safe(int safe_level) https://github.com/ruby/ruby/blob/trunk/ruby.c#L619
 #define RUBY_RELATIVE(path, len) rubylib_path_new((path), (len))
 #define PREFIX_PATH() RUBY_RELATIVE(ruby_exec_prefix, exec_prefix_len)
 #endif
+    rb_gc_register_address(&ruby_prefix_path);
+    ruby_prefix_path = PREFIX_PATH();
+    OBJ_FREEZE_RAW(ruby_prefix_path);
+    if (!archlibdir) archlibdir = ruby_prefix_path;
+    rb_gc_register_address(&ruby_archlibdir_path);
+    ruby_archlibdir_path = archlibdir;
+
     load_path = GET_VM()->load_path;
 
     if (safe_level == 0) {
@@ -618,7 +641,7 @@ ruby_init_loadpath_safe(int safe_level) https://github.com/ruby/ruby/blob/trunk/ruby.c#L641
 	paths += len + 1;
     }
 
-    rb_const_set(rb_cObject, rb_intern_const("TMP_RUBY_PREFIX"), rb_obj_freeze(PREFIX_PATH()));
+    rb_const_set(rb_cObject, rb_intern_const("TMP_RUBY_PREFIX"), ruby_prefix_path);
 }
 
 
Index: mjit.c
===================================================================
--- mjit.c	(revision 63268)
+++ mjit.c	(revision 63269)
@@ -208,10 +208,8 @@ static VALUE valid_class_serials; https://github.com/ruby/ruby/blob/trunk/mjit.c#L208
 VALUE rb_mMJIT;
 
 #ifdef _WIN32
-/* Linker option to enable libruby in the build directory. */
-static char *libruby_build;
-/* Linker option to enable libruby in the directory after install. */
-static char *libruby_installed;
+/* Linker option to enable libruby. */
+static char *libruby_pathflag;
 #endif
 
 /* Return time in milliseconds as a double.  */
@@ -582,6 +580,15 @@ static const char *const CC_DLDFLAGS_ARG https://github.com/ruby/ruby/blob/trunk/mjit.c#L580
     NULL
 };
 
+static const char *const CC_LIBS[] = {
+    MJIT_LIBS
+#if defined __GNUC__ && !defined __clang__ && !defined _WIN32
+    "-lmsvcrt",
+    "-lgcc",
+#endif
+    NULL
+};
+
 #define CC_CODEFLAG_ARGS (mjit_opts.debug ? CC_DEBUG_ARGS : CC_OPTIMIZE_ARGS)
 /* Status of the precompiled header creation.  The status is
    shared by the workers and the pch thread.  */
@@ -652,45 +659,37 @@ compile_c_to_so(const char *c_file, cons https://github.com/ruby/ruby/blob/trunk/mjit.c#L659
 #ifndef _MSC_VER
         "-o",
 #endif
-        NULL, NULL, NULL};
-    const char *libs[] = {
+        NULL, NULL,
 #ifdef _WIN32
 # ifdef _MSC_VER
-        MJIT_LIBS
         "-link",
-        libruby_installed,
-        libruby_build,
-# else
-        /* Look for ruby.dll.a in build and install directories. */
-        libruby_installed,
-        libruby_build,
-        MJIT_LIBS
-        "-lmsvcrt",
-        "-lgcc",
 # endif
+        libruby_pathflag,
 #endif
-        NULL};
+        NULL,
+    };
     char **args;
 #ifdef _MSC_VER
     char *p;
     int solen;
 #endif
 
-    files[numberof(files)-2] = c_file;
 #ifdef _MSC_VER
     solen = strlen(so_file);
     files[0] = p = xmalloc(rb_strlen_lit("-Fe") + solen + 1);
     p = append_lit(p, "-Fe");
     p = append_str2(p, so_file, solen);
     *p = '\0';
+    files[1] = c_file;
 #else
 # ifdef __clang__
     files[1] = pch_file;
 # endif
-    files[numberof(files)-3] = so_file;
+    files[numberof(files)-3] = c_file;
+    files[numberof(files)-4] = so_file;
 #endif
     args = form_args(5, CC_LDSHARED_ARGS, CC_CODEFLAG_ARGS,
-                     files, libs, CC_DLDFLAGS_ARGS);
+                     files, CC_LIBS, CC_DLDFLAGS_ARGS);
     if (args == NULL)
         return FALSE;
 
@@ -1162,6 +1161,8 @@ mjit_get_iseq_func(struct rb_iseq_consta https://github.com/ruby/ruby/blob/trunk/mjit.c#L1161
    ones to prevent changing C compiler for security reasons.  */
 #define CC_PATH CC_COMMON_ARGS[0]
 
+extern VALUE ruby_archlibdir_path, ruby_prefix_path;
+
 static void
 init_header_filename(void)
 {
@@ -1176,13 +1177,6 @@ init_header_filename(void) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1177
     const size_t header_name_len = sizeof(header_name) - 1;
     char *p;
 #ifdef _WIN32
-    static const char libdirname[] = "/"
-# ifdef LIBDIR_BASENAME
-	LIBDIR_BASENAME
-# else
-	"lib"
-# endif
-	;
     static const char libpathflag[] =
 # ifdef _MSC_VER
         "-LIBPATH:"
@@ -1193,7 +1187,7 @@ init_header_filename(void) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1187
     const size_t libpathflag_len = sizeof(libpathflag) - 1;
 #endif
 
-    basedir_val = rb_const_get(rb_cObject, rb_intern_const("TMP_RUBY_PREFIX"));
+    basedir_val = ruby_prefix_path;
     basedir = StringValuePtr(basedir_val);
     baselen = RSTRING_LEN(basedir_val);
     verlen = strlen(ruby_version);
@@ -1212,15 +1206,13 @@ init_header_filename(void) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1206
     (void)close(fd);
 
 #ifdef _WIN32
-    p = libruby_build = xmalloc(libpathflag_len + baselen + 1);
+    basedir_val = ruby_archlibdir_path;
+    basedir = StringValuePtr(basedir_val);
+    baselen = RSTRING_LEN(basedir_val);
+    libruby_pathflag = p = xmalloc(libpathflag_len + baselen + 1);
     p = append_str(p, libpathflag);
     p = append_str2(p, basedir, baselen);
     *p = '\0';
-
-    libruby_installed = xmalloc(libpathflag_len + baselen + sizeof(libdirname));
-    p = append_str2(libruby_installed, libruby_build, p - libruby_build);
-    p = append_str(p, libdirname);
-    *p = '\0';
 #endif
 }
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]