org.jruby.RubyInstanceConfig Maven / Gradle / Ivy
/***** BEGIN LICENSE BLOCK *****
* Version: CPL 1.0/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Common Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.eclipse.org/legal/cpl-v10.html
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* Copyright (C) 2007-2011 Nick Sieger
* Copyright (C) 2009 Joseph LaFata
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the CPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the CPL, the GPL or the LGPL.
***** END LICENSE BLOCK *****/
package org.jruby;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.regex.Pattern;
import org.jruby.ast.executable.Script;
import org.jruby.compiler.ASTCompiler;
import org.jruby.compiler.ASTCompiler19;
import org.jruby.exceptions.MainExitException;
import org.jruby.embed.util.SystemPropertyCatcher;
import org.jruby.ext.posix.util.Platform;
import org.jruby.runtime.Constants;
import org.jruby.runtime.backtrace.TraceType;
import org.jruby.runtime.profile.IProfileData;
import org.jruby.runtime.profile.AbstractProfilePrinter;
import org.jruby.runtime.profile.FlatProfilePrinter;
import org.jruby.runtime.profile.GraphProfilePrinter;
import org.jruby.runtime.load.LoadService;
import org.jruby.runtime.load.LoadService19;
import org.jruby.util.ClassCache;
import org.jruby.util.JRubyFile;
import org.jruby.util.KCode;
import org.jruby.util.NormalizedFile;
import org.jruby.util.SafePropertyAccessor;
import org.objectweb.asm.Opcodes;
public class RubyInstanceConfig {
/**
* The max count of active methods eligible for JIT-compilation.
*/
public static final int JIT_MAX_METHODS_LIMIT = 4096;
/**
* The max size of JIT-compiled methods (full class size) allowed.
*/
public static final int JIT_MAX_SIZE_LIMIT = 30000;
/**
* The JIT threshold to the specified method invocation count.
*/
public static final int JIT_THRESHOLD = 50;
/** The version to use for generated classes. Set to current JVM version by default */
public static final int JAVA_VERSION;
/**
* Default size for chained compilation.
*/
public static final int CHAINED_COMPILE_LINE_COUNT_DEFAULT = 500;
/**
* The number of lines at which a method, class, or block body is split into
* chained methods (to dodge 64k method-size limit in JVM).
*/
public static final int CHAINED_COMPILE_LINE_COUNT
= SafePropertyAccessor.getInt("jruby.compile.chainsize", CHAINED_COMPILE_LINE_COUNT_DEFAULT);
/**
* Indicates whether the script must be extracted from script source
*/
private boolean xFlag;
public boolean hasShebangLine() {
return hasShebangLine;
}
public void setHasShebangLine(boolean hasShebangLine) {
this.hasShebangLine = hasShebangLine;
}
/**
* Indicates whether the script has a shebang line or not
*/
private boolean hasShebangLine;
public boolean isxFlag() {
return xFlag;
}
public enum CompileMode {
JIT, FORCE, OFF, OFFIR;
public boolean shouldPrecompileCLI() {
switch (this) {
case JIT: case FORCE:
if (DYNOPT_COMPILE_ENABLED) {
// don't precompile the CLI script in dynopt mode
return false;
}
return true;
}
return false;
}
public boolean shouldJIT() {
switch (this) {
case JIT: case FORCE:
return true;
}
return false;
}
public boolean shouldPrecompileAll() {
return this == FORCE;
}
}
private InputStream input = System.in;
private PrintStream output = System.out;
private PrintStream error = System.err;
private Profile profile = Profile.DEFAULT;
private boolean objectSpaceEnabled
= SafePropertyAccessor.getBoolean("jruby.objectspace.enabled", false);
private CompileMode compileMode = CompileMode.JIT;
private boolean runRubyInProcess = true;
private String currentDirectory;
/** Environment variables; defaults to System.getenv() in constructor */
private Map environment;
private String[] argv = {};
private final boolean jitLogging;
private final boolean jitDumping;
private final boolean jitLoggingVerbose;
private int jitLogEvery;
private int jitThreshold;
private int jitMax;
private int jitMaxSize;
private final boolean samplingEnabled;
private CompatVersion compatVersion;
private String internalEncoding = null;
private String externalEncoding = null;
public enum ProfilingMode {
OFF, API, FLAT, GRAPH
}
private ProfilingMode profilingMode = ProfilingMode.OFF;
private ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
private ClassLoader loader = contextLoader == null ? RubyInstanceConfig.class.getClassLoader() : contextLoader;
private ClassCache