Skip to content

Commit

Permalink
Showing 2 changed files with 11 additions and 3 deletions.
12 changes: 9 additions & 3 deletions core/src/main/java/org/jruby/RubyFixnum.java
Original file line number Diff line number Diff line change
@@ -56,6 +56,7 @@
import org.jruby.util.ByteList;
import org.jruby.util.ConvertBytes;
import org.jruby.util.Numeric;
import org.jruby.util.cli.Options;

/**
* Implementation of the Fixnum class.
@@ -89,7 +90,8 @@ public static RubyClass createFixnumClass(Ruby runtime) {
public static final long MIN = -1 * MAX - 1;
public static final long MAX_MARSHAL_FIXNUM = (1L << 30) - 1; // 0x3fff_ffff
public static final long MIN_MARSHAL_FIXNUM = - (1L << 30); // -0x4000_0000
public static final int CACHE_OFFSET = 256;
public static final boolean USE_CACHE = Options.USE_FIXNUM_CACHE.load();
public static final int CACHE_OFFSET = Options.FIXNUM_CACHE_RANGE.load();

private static IRubyObject fixCoerce(IRubyObject x) {
do {
@@ -198,8 +200,8 @@ public BigInteger getBigIntegerValue() {
}

public static RubyFixnum newFixnum(Ruby runtime, long value) {
if (isInCacheRange(value)) {
return runtime.fixnumCache[(int) value + CACHE_OFFSET];
if (USE_CACHE && isInCacheRange(value)) {
return cachedFixnum(runtime, value);
}
return new RubyFixnum(runtime, value);
}
@@ -208,6 +210,10 @@ private static boolean isInCacheRange(long value) {
return value <= CACHE_OFFSET - 1 && value >= -CACHE_OFFSET;
}

private static RubyFixnum cachedFixnum(Ruby runtime, long value) {
return runtime.fixnumCache[(int) value + CACHE_OFFSET];
}

public RubyFixnum newFixnum(long newValue) {
return newFixnum(getRuntime(), newValue);
}
2 changes: 2 additions & 0 deletions core/src/main/java/org/jruby/util/cli/Options.java
Original file line number Diff line number Diff line change
@@ -167,6 +167,8 @@ public class Options {
public static final Option<Boolean> VOLATILE_VARIABLES = bool(MISCELLANEOUS, "volatile.variables", true, "Always ensure volatile semantics for instance variables.");
public static final Option<Boolean> RECORD_LEXICAL_HIERARCHY = bool(MISCELLANEOUS, "record.lexical.hierarchy", false, "Maintain children static scopes to support scope dumping.");
public static final Option<String> PREFERRED_PRNG = string(MISCELLANEOUS, "preferred.prng", "NativePRNGNonBlocking", "Maintain children static scopes to support scope dumping.");
public static final Option<Boolean> USE_FIXNUM_CACHE = bool(MISCELLANEOUS, "fixnum.cache", true, "Use a cache of low-valued Fixnum objects.");
public static final Option<Integer> FIXNUM_CACHE_RANGE = integer(MISCELLANEOUS, "fixnum.cache.size", 256, "Values to retrieve from Fixnum cache, in the range -X..(X-1).");

public static final Option<Boolean> DEBUG_LOADSERVICE = bool(DEBUG, "debug.loadService", false, "Log require/load file searches.");
public static final Option<Boolean> DEBUG_LOADSERVICE_TIMING = bool(DEBUG, "debug.loadService.timing", false, "Log require/load parse+evaluate times.");

0 comments on commit 0273985

Please sign in to comment.