gauss:stackfull brian$ cat config.diff
diff --git a/vm/config_parser.cpp b/vm/config_parser.cpp
index de17700..5e12dee 100644
--- a/vm/config_parser.cpp
+++ b/vm/config_parser.cpp
@@ -27,6 +27,18 @@ namespace rubinius {
return str;
}
+ void ConfigParser::process_argv(int argc, char** argv) {
+ for(int i=1; i < argc; i++) {
+ char* arg = argv[i];
+ if(strncmp(arg, "-X", 2) == 0) {
+ import_line(arg + 2);
+ continue;
+ }
+
+ if(arg[0] != '-' || strcmp(arg, "--") == 0) return;
+ }
+ }
+
ConfigParser::Entry* ConfigParser::parse_line(const char* line) {
char* var = strdup(line);
char* equals = strstr(var, "=");
diff --git a/vm/config_parser.hpp b/vm/config_parser.hpp
index 0968f52..813482e 100644
--- a/vm/config_parser.hpp
+++ b/vm/config_parser.hpp
@@ -23,6 +23,7 @@ namespace rubinius {
virtual ~ConfigParser();
+ void process_argv(int argc, char** argv);
Entry* parse_line(const char* line);
void import_line(const char* line);
void import_stream(std::istream&);
diff --git a/vm/drivers/cli.cpp b/vm/drivers/cli.cpp
index 8ac9250..29353f2 100644
--- a/vm/drivers/cli.cpp
+++ b/vm/drivers/cli.cpp
@@ -60,8 +60,7 @@ static void load_runtime_kernel(Environment& env, std::string root) {
* function does not deal with that subject.
*/
int main(int argc, char** argv) {
- Environment env;
- env.load_config_argv(argc, argv);
+ Environment env(argc, argv);
env.state->init_stack_size();
env.state->set_stack_start(&env);
diff --git a/vm/drivers/compile.cpp b/vm/drivers/compile.cpp
index d6ad250..c53d6ee 100644
--- a/vm/drivers/compile.cpp
+++ b/vm/drivers/compile.cpp
@@ -59,7 +59,7 @@ int main(int argc, char** argv) {
string input(argv[1]);
string output(argv[2]);
- Environment env;
+ Environment env(argc, argv);
ifstream stream(input.c_str());
diff --git a/vm/environment.cpp b/vm/environment.cpp
index 43aeffd..7d08293 100644
--- a/vm/environment.cpp
+++ b/vm/environment.cpp
@@ -27,9 +27,14 @@
namespace rubinius {
- Environment::Environment() {
+ Environment::Environment(int argc, char** argv) {
+ ConfigParser* config = new ConfigParser();
+ config->process_argv(argc, argv);
+
shared = manager.create_shared_state();
- state = shared->new_vm();
+ shared->user_config = config;
+
+ state = shared->new_vm();
state->initialize(VM::default_bytes);
TaskProbe* probe = TaskProbe::create(state);
@@ -59,18 +64,6 @@ namespace rubinius {
shared->set_signal_thread(st);
}
- void Environment::load_config_argv(int argc, char** argv) {
- for(int i=1; i < argc; i++) {
- char* arg = argv[i];
- if(strncmp(arg, "-X", 2) == 0) {
- state->user_config->import_line(arg + 2);
- continue;
- }
-
- if(arg[0] != '-' || strcmp(arg, "--") == 0) return;
- }
- }
-
void Environment::load_argv(int argc, char** argv) {
bool process_xflags = true;
state->set_const("ARG0", String::create(state, argv[0]));
diff --git a/vm/environment.hpp b/vm/environment.hpp
index 9ee5dd8..d448ef6 100644
--- a/vm/environment.hpp
+++ b/vm/environment.hpp
@@ -15,7 +15,7 @@ namespace rubinius {
SharedState* shared;
VM* state;
- Environment();
+ Environment(int argc, char** argv);
~Environment();
void load_config_argv(int argc, char** argv);
diff --git a/vm/vm.cpp b/vm/vm.cpp
index 47b7384..fa8982e 100644
--- a/vm/vm.cpp
+++ b/vm/vm.cpp
@@ -68,13 +68,13 @@ namespace rubinius {
: id_(id)
, saved_call_frame_(0)
, shared(shared)
+ , user_config(shared.user_config)
, globals(shared.globals)
, om(shared.om)
, global_cache(shared.global_cache)
, config(shared.config)
, interrupts(shared.interrupts)
, symbols(shared.symbols)
- , user_config(shared.user_config)
, check_local_interrupts(false)
, thread_state_(this)
, thread(this, (Thread*)Qnil)
@@ -91,9 +91,6 @@ namespace rubinius {
VM::register_state(this);
- user_config = new ConfigParser();
- shared.user_config = user_config;
-
om = new ObjectMemory(this, bytes);
shared.om = om;
diff --git a/vm/vm.hpp b/vm/vm.hpp
index a686da7..5860ff9 100644
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -164,6 +164,7 @@ namespace rubinius {
thread::Mutex local_lock_;
Waiter* waiter_;
+ ConfigParser *user_config;
Globals& globals;
ObjectMemory* om;
event::Loop* events;
@@ -173,7 +174,6 @@ namespace rubinius {
Configuration& config;
Interrupts& interrupts;
SymbolTable& symbols;
- ConfigParser *user_config;
bool check_local_interrupts;