summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--include/ruby/ruby.h9
-rw-r--r--include/ruby/win32.h2
-rw-r--r--main.c20
-rw-r--r--ruby.c42
-rwxr-xr-xwin32/mkexports.rb1
-rw-r--r--win32/win32.c2
7 files changed, 65 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index c287c97207..c66417b3bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+Sat Sep 29 17:45:22 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * main.c (main): use platform-independent per-process initialization.
+ [ruby-dev:31900]
+
+ * 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.
+
Sat Sep 29 17:31:04 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
* array.c (rb_ary_combination): new method to give all combination
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 8947549f55..b6039fb366 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -958,6 +958,15 @@ rb_special_const_p(VALUE obj)
static char *dln_libs_to_be_linked[] = { EXTLIB, 0 };
#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
int is_ruby_native_thread(void);
diff --git a/include/ruby/win32.h b/include/ruby/win32.h
index 9f5ccf8889..02021f19d9 100644
--- a/include/ruby/win32.h
+++ b/include/ruby/win32.h
@@ -204,7 +204,7 @@ struct timezone {
#undef isascii
#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 *);
extern int flock(int fd, int oper);
diff --git a/main.c b/main.c
index b5c5bb3351..e9d1bada5f 100644
--- a/main.c
+++ b/main.c
@@ -13,18 +13,7 @@
#undef RUBY_EXPORT
#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 void
-objcdummyfunction(void)
-{
- objc_msgSend();
-}
-#endif
+RUBY_GLOBAL_SETUP
int
main(int argc, char **argv, char **envp)
@@ -33,13 +22,8 @@ main(int argc, char **argv, char **envp)
extern void ruby_set_debug_option(const char *);
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;
ruby_init();
diff --git a/ruby.c b/ruby.c
index 8b6f85b92e..126e79eb3f 100644
--- a/ruby.c
+++ b/ruby.c
@@ -47,6 +47,10 @@
# define MAXPATHLEN 1024
#endif
+#if defined(__MACOS__) && defined(__MWERKS__)
+#include <console.h>
+#endif
+
#include "ruby/util.h"
/* for gdb */
@@ -1307,8 +1311,6 @@ ruby_process_options(int argc, char **argv)
struct cmdline_options opt;
NODE *tree;
- origarg.argc = argc;
- origarg.argv = argv;
MEMZERO(&opt, opt, 1);
ruby_script(argv[0]); /* for the time being */
@@ -1316,9 +1318,6 @@ ruby_process_options(int argc, char **argv)
#if defined(USE_DLN_A_OUT)
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);
rb_define_readonly_boolean("$-p", opt.do_print);
@@ -1327,3 +1326,36 @@ ruby_process_options(int argc, char **argv)
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
+}
diff --git a/win32/mkexports.rb b/win32/mkexports.rb
index 90c4d7f914..53a4a89c2d 100755
--- a/win32/mkexports.rb
+++ b/win32/mkexports.rb
@@ -50,6 +50,7 @@ class Exports
end
end
end
+ syms["NtInitialize"] ||= "ruby_sysinit" if syms["ruby_sysinit"]
@syms = syms
end
diff --git a/win32/win32.c b/win32/win32.c
index a52e9ce54d..ce13650cfd 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -419,7 +419,7 @@ exit_handler(void)
// Initialization stuff
//
void
-NtInitialize(int *argc, char ***argv)
+rb_w32_sysinit(int *argc, char ***argv)
{
WORD version;