[ruby-dev:31900] platform-independent per-process initialization

From: Nobuyoshi Nakada <nobu@...>
Date: 2007-09-29 00:34:57 UTC
List: ruby-dev #31900
なかだです。

現在main.cでプラットフォームごとに行っている初期化を、プロセス単
位の初期化として分離したいと思っています。Metrowerks用の部分がすっ
きりしませんが、これは旧Macintosh専用なのでこの際削ってしまった
ほうがいいかも。


* main.c (main): use platform-independent per-process initialization.

* ruby.c (ruby_sysinit): new function for per-process initialization.

* include/ruby/ruby.h (RUBY_GLOBAL_SETUP): toplevel setup declaration.

* include/ruby/win32.h, win32/mkexports.rb: alias NtInitialize
  ruby_sysinit.

* win32/win32.c (rb_w32_sysinit): renamed from NtInitialize.


Index: main.c
===================================================================
--- main.c	(revision 13560)
+++ main.c	(working copy)
@@ -14,16 +14,5 @@
 #include "ruby/ruby.h"
 
-#if defined(__MACOS__) && defined(__MWERKS__)
-#include <console.h>
-#endif
-
-/* to link startup code with ObjC support */
-#if (defined(__APPLE__) || defined(__NeXT__)) && defined(__MACH__)
-static voidplatform independent
-objcdummyfunction(void)
-{
-    objc_msgSend();
-}
-#endif
+RUBY_GLOBAL_SETUP
 
 int
@@ -34,11 +23,6 @@ main(int argc, char **argv, char **envp)
     ruby_set_debug_option(getenv("RUBY_DEBUG"));
 #endif
-#ifdef _WIN32
-    NtInitialize(&argc, &argv);
-#endif
-#if defined(__MACOS__) && defined(__MWERKS__)
-    argc = ccommand(&argv);
-#endif
 
+    ruby_sysinit(&argc, &argv);
     {
 	RUBY_INIT_STACK;
Index: ruby.c
===================================================================
--- ruby.c	(revision 13560)
+++ ruby.c	(working copy)
@@ -48,4 +48,8 @@
 #endif
 
+#if defined(__MACOS__) && defined(__MWERKS__)
+#include <console.h>
+#endif
+
 #include "ruby/util.h"
 
@@ -1308,6 +1312,10 @@ ruby_process_options(int argc, char **ar
     NODE *tree;
 
-    origarg.argc = argc;
-    origarg.argv = argv;
+#if defined(__MACOS__) && defined(__MWERKS__)
+    if (origarg.argv == 0) {
+	origarg.argc = argc;
+	origarg.argv = argv;
+    }
+#endif
 
     MEMZERO(&opt, opt, 1);
@@ -1317,7 +1325,4 @@ ruby_process_options(int argc, char **ar
     dln_argv0 = argv[0];
 #endif
-#if !defined(PSTAT_SETCMD) && !defined(HAVE_SETPROCTITLE)
-    origarg.len = get_arglen(origarg.argc, origarg.argv);
-#endif
     tree = process_options(argc, argv, &opt);
 
@@ -1328,2 +1333,35 @@ ruby_process_options(int argc, char **ar
     return tree;
 }
+
+void
+ruby_sysinit(int *argc, char ***argv)
+{
+#if defined(__APPLE__) && (defined(__MACH__) || defined(__DARWIN__))
+    int i, n = *argc, len = 0;
+    char **v1 = *argv, **v2, *p;
+
+    for (i = 0; i < n; ++i) {
+	len += strlen(v1[i]) + 1;
+    }
+    v2 = malloc((n + 1)* sizeof(char*) + len);
+    p = (char *)&v2[n + 1];
+    for (i = 0; i < n; ++i) {
+	int l = strlen(v1[i]);
+	memcpy(p, v1[i], l + 1);
+	v2[i] = p;
+	p += l + 1;
+    }
+    v2[n] = 0;
+    *argv = v2;
+#elif defined(__MACOS__) && defined(__MWERKS__)
+    *argc = ccommand(argv);
+#elif defined(_WIN32)
+    void rb_w32_sysinit(int *argc, char ***argv);
+    rb_w32_sysinit(argc, argv);
+#endif
+    origarg.argc = *argc;
+    origarg.argv = *argv;
+#if !defined(PSTAT_SETCMD) && !defined(HAVE_SETPROCTITLE)
+    origarg.len = get_arglen(origarg.argc, origarg.argv);
+#endif
+}
Index: include/ruby/ruby.h
===================================================================
--- include/ruby/ruby.h	(revision 13560)
+++ include/ruby/ruby.h	(working copy)
@@ -959,4 +959,13 @@ static char *dln_libs_to_be_linked[] = {
 #endif
 
+#if (defined(__APPLE__) || defined(__NeXT__)) && defined(__MACH__)
+/* to link startup code with ObjC support */
+#define RUBY_GLOBAL_SETUP static void objcdummyfunction(void) {objc_msgSend();}
+#else
+#define RUBY_GLOBAL_SETUP
+#endif
+
+void ruby_sysinit(int *, char ***);
+
 #define RUBY_VM 1 /* YARV */
 #define HAVE_NATIVETHREAD
Index: include/ruby/win32.h
===================================================================
--- include/ruby/win32.h	(revision 13560)
+++ include/ruby/win32.h	(working copy)
@@ -205,5 +205,5 @@ struct timezone {
 #define isascii __isascii
 #endif
-extern void   NtInitialize(int *, char ***);
+#define NtInitialize ruby_sysinit
 extern int    rb_w32_cmdvector(const char *, char ***);
 extern rb_pid_t  rb_w32_pipe_exec(const char *, const char *, int, int *);
Index: win32/mkexports.rb
===================================================================
--- win32/mkexports.rb	(revision 13560)
+++ win32/mkexports.rb	(working copy)
@@ -51,4 +51,5 @@ class Exports
       end
     end
+    syms["NtInitialize"] ||= "ruby_sysinit" if syms["ruby_sysinit"]
     @syms = syms
   end
Index: win32/win32.c
===================================================================
--- win32/win32.c	(revision 13560)
+++ win32/win32.c	(working copy)
@@ -420,5 +420,5 @@ exit_handler(void)
 //
 void
-NtInitialize(int *argc, char ***argv)
+rb_w32_sysinit(int *argc, char ***argv)
 {
 


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread

Prev Next