String[] argv = runtime.getInstanceConfig().getArgv();
for (int i = 0; i < argv.length; i++) {
argvArray.append(RubyString.newStringShared(runtime, argv[i].getBytes()));
}
runtime.defineGlobalConstant("ARGV", argvArray);
runtime.getGlobalVariables().defineReadonly("$*", new ValueAccessor(argvArray));
IAccessor d = new ValueAccessor(runtime.newString(
runtime.getInstanceConfig().displayedFileName()));
runtime.getGlobalVariables().define("$PROGRAM_NAME", d);
runtime.getGlobalVariables().define("$0", d);
// Version information:
IRubyObject version = null;
IRubyObject patchlevel = null;
IRubyObject release = runtime.newString(Constants.COMPILE_DATE).freeze(context);
IRubyObject platform = runtime.newString(Constants.PLATFORM).freeze(context);
IRubyObject engine = runtime.newString(Constants.ENGINE).freeze(context);
switch (runtime.getInstanceConfig().getCompatVersion()) {
case RUBY1_8:
version = runtime.newString(Constants.RUBY_VERSION).freeze(context);
patchlevel = runtime.newFixnum(Constants.RUBY_PATCHLEVEL);
break;
case RUBY1_9:
version = runtime.newString(Constants.RUBY1_9_VERSION).freeze(context);
patchlevel = runtime.newFixnum(Constants.RUBY1_9_PATCHLEVEL);
break;
}
runtime.defineGlobalConstant("RUBY_VERSION", version);
runtime.defineGlobalConstant("RUBY_PATCHLEVEL", patchlevel);
runtime.defineGlobalConstant("RUBY_RELEASE_DATE", release);
runtime.defineGlobalConstant("RUBY_PLATFORM", platform);
runtime.defineGlobalConstant("RUBY_ENGINE", engine);
IRubyObject description = runtime.newString(runtime.getInstanceConfig().getVersionString()).freeze(context);
runtime.defineGlobalConstant("RUBY_DESCRIPTION", description);
IRubyObject copyright = runtime.newString(runtime.getInstanceConfig().getCopyrightString()).freeze(context);
runtime.defineGlobalConstant("RUBY_COPYRIGHT", copyright);
runtime.defineGlobalConstant("VERSION", version);
runtime.defineGlobalConstant("RELEASE_DATE", release);
runtime.defineGlobalConstant("PLATFORM", platform);
IRubyObject jrubyVersion = runtime.newString(Constants.VERSION).freeze(context);
IRubyObject jrubyRevision = runtime.newString(Constants.REVISION).freeze(context);
runtime.defineGlobalConstant("JRUBY_VERSION", jrubyVersion);
runtime.defineGlobalConstant("JRUBY_REVISION", jrubyRevision);
if (runtime.is1_9()) {
// needs to be a fixnum, but our revision is a sha1 hash from git
runtime.defineGlobalConstant("RUBY_REVISION", runtime.newFixnum(Constants.RUBY1_9_REVISION));
}
GlobalVariable kcodeGV = new KCodeGlobalVariable(runtime, "$KCODE", runtime.newString("NONE"));
runtime.defineVariable(kcodeGV);
runtime.defineVariable(new GlobalVariable.Copy(runtime, "$-K", kcodeGV));
IRubyObject defaultRS = runtime.newString(runtime.getInstanceConfig().getRecordSeparator()).freeze(context);
GlobalVariable rs = new StringGlobalVariable(runtime, "$/", defaultRS);
runtime.defineVariable(rs);
runtime.setRecordSeparatorVar(rs);
runtime.getGlobalVariables().setDefaultSeparator(defaultRS);
runtime.defineVariable(new StringGlobalVariable(runtime, "$\\", runtime.getNil()));
runtime.defineVariable(new StringGlobalVariable(runtime, "$,", runtime.getNil()));
runtime.defineVariable(new LineNumberGlobalVariable(runtime, "$."));
runtime.defineVariable(new LastlineGlobalVariable(runtime, "$_"));
runtime.defineVariable(new LastExitStatusVariable(runtime, "$?"));
runtime.defineVariable(new ErrorInfoGlobalVariable(runtime, "$!", runtime.getNil()));
runtime.defineVariable(new NonEffectiveGlobalVariable(runtime, "$=", runtime.getFalse()));
if(runtime.getInstanceConfig().getInputFieldSeparator() == null) {
runtime.defineVariable(new GlobalVariable(runtime, "$;", runtime.getNil()));
} else {
runtime.defineVariable(new GlobalVariable(runtime, "$;", RubyRegexp.newRegexp(runtime, runtime.getInstanceConfig().getInputFieldSeparator(), new RegexpOptions())));
}
Boolean verbose = runtime.getInstanceConfig().getVerbose();
IRubyObject verboseValue = null;
if (verbose == null) {
verboseValue = runtime.getNil();
} else if(verbose == Boolean.TRUE) {
verboseValue = runtime.getTrue();
} else {
verboseValue = runtime.getFalse();
}
runtime.defineVariable(new VerboseGlobalVariable(runtime, "$VERBOSE", verboseValue));
IRubyObject debug = runtime.newBoolean(runtime.getInstanceConfig().isDebug());
runtime.defineVariable(new DebugGlobalVariable(runtime, "$DEBUG", debug));
runtime.defineVariable(new DebugGlobalVariable(runtime, "$-d", debug));
runtime.defineVariable(new SafeGlobalVariable(runtime, "$SAFE"));
runtime.defineVariable(new BacktraceGlobalVariable(runtime, "$@"));
IRubyObject stdin = new RubyIO(runtime, STDIO.IN);
IRubyObject stdout = new RubyIO(runtime, STDIO.OUT);
IRubyObject stderr = new RubyIO(runtime, STDIO.ERR);
runtime.defineVariable(new InputGlobalVariable(runtime, "$stdin", stdin));
runtime.defineVariable(new OutputGlobalVariable(runtime, "$stdout", stdout));
runtime.getGlobalVariables().alias("$>", "$stdout");
runtime.getGlobalVariables().alias("$defout", "$stdout");
runtime.defineVariable(new OutputGlobalVariable(runtime, "$stderr", stderr));
runtime.getGlobalVariables().alias("$deferr", "$stderr");
runtime.defineGlobalConstant("STDIN", stdin);
runtime.defineGlobalConstant("STDOUT", stdout);
runtime.defineGlobalConstant("STDERR", stderr);
runtime.defineVariable(new LoadedFeatures(runtime, "$\""));
runtime.defineVariable(new LoadedFeatures(runtime, "$LOADED_FEATURES"));
runtime.defineVariable(new LoadPath(runtime, "$:"));
runtime.defineVariable(new LoadPath(runtime, "$-I"));
runtime.defineVariable(new LoadPath(runtime, "$LOAD_PATH"));
runtime.defineVariable(new MatchMatchGlobalVariable(runtime, "$&"));
runtime.defineVariable(new PreMatchGlobalVariable(runtime, "$`"));
runtime.defineVariable(new PostMatchGlobalVariable(runtime, "$'"));
runtime.defineVariable(new LastMatchGlobalVariable(runtime, "$+"));
runtime.defineVariable(new BackRefGlobalVariable(runtime, "$~"));
// On platforms without a c-library accessable through JNA, getpid will return hashCode
// as $$ used to. Using $$ to kill processes could take down many runtimes, but by basing
// $$ on getpid() where available, we have the same semantics as MRI.
runtime.getGlobalVariables().defineReadonly("$$", new PidAccessor(runtime));
// after defn of $stderr as the call may produce warnings
defineGlobalEnvConstants(runtime);
// Fixme: Do we need the check or does Main.java not call this...they should consolidate
if (runtime.getGlobalVariables().get("$*").isNil()) {
runtime.getGlobalVariables().defineReadonly("$*", new ValueAccessor(runtime.newArray()));
}
runtime.getGlobalVariables().defineReadonly("$-p",
new ValueAccessor(runtime.newBoolean(runtime.getInstanceConfig().isAssumePrinting())));
runtime.getGlobalVariables().defineReadonly("$-a",
new ValueAccessor(runtime.newBoolean(runtime.getInstanceConfig().isSplit())));
runtime.getGlobalVariables().defineReadonly("$-l",
new ValueAccessor(runtime.newBoolean(runtime.getInstanceConfig().isProcessLineEnds())));
// ARGF, $< object
RubyArgsFile.initArgsFile(runtime);
}