Skip to content

Commit

Permalink
Merge branch 'master' into bytelist_love
Browse files Browse the repository at this point in the history
  • Loading branch information
enebo committed Apr 20, 2018
2 parents 90113f4 + 4e1f02c commit 00cecc9
Show file tree
Hide file tree
Showing 40 changed files with 266 additions and 297 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Expand Up @@ -124,5 +124,5 @@ services:
addons:
apt:
packages:
- oracle-java9-installer
# - oracle-java9-installer
- haveged
2 changes: 1 addition & 1 deletion core/src/main/java/org/jruby/RubyBasicObject.java
Expand Up @@ -1247,7 +1247,7 @@ private RubyString inspectObj(final Ruby runtime, RubyString part) {

@JRubyMethod(name = "!")
public IRubyObject op_not(ThreadContext context) {
return context.runtime.newBoolean(!this.isTrue());
return isTrue() ? context.fals : context.tru;
}

/**
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/org/jruby/RubyDir.java
Expand Up @@ -199,7 +199,7 @@ private static String globOptions(ThreadContext context, IRubyObject[] args, int
} else {
String[] keys = flags != null ? new String[] {"base", "flags"} : new String[] {"base"};
IRubyObject[] rets = ArgsUtil.extractKeywordArgs(context, (RubyHash) tmp, keys);
String base = rets[0].isNil() ? "" : RubyFile.get_path(context, rets[0]).asJavaString();
String base = rets[0] == UNDEF ? "" : RubyFile.get_path(context, rets[0]).asJavaString();

// Deep down in glob things are unhappy if base is not absolute.
if (!base.isEmpty()) {
Expand All @@ -212,7 +212,7 @@ private static String globOptions(ThreadContext context, IRubyObject[] args, int
base = new JRubyFile(runtime.getCurrentDirectory(), base).getAbsolutePath();
}
}
if (flags != null) flags[0] = rets[1].isNil() ? 0 : RubyNumeric.num2int(rets[1]);
if (flags != null) flags[0] = rets[1] == UNDEF ? 0 : RubyNumeric.num2int(rets[1]);
return base;
}
}
Expand Down
48 changes: 32 additions & 16 deletions core/src/main/java/org/jruby/RubyKernel.java
Expand Up @@ -48,6 +48,7 @@
import org.jruby.anno.JRubyModule;
import org.jruby.ast.util.ArgsUtil;
import org.jruby.common.IRubyWarnings.ID;
import org.jruby.common.RubyWarnings;
import org.jruby.exceptions.MainExitException;
import org.jruby.exceptions.RaiseException;
import org.jruby.internal.runtime.methods.DynamicMethod;
Expand Down Expand Up @@ -1207,48 +1208,63 @@ private static RaiseException uncaughtThrow(Ruby runtime, IRubyObject tag, IRuby
}

@JRubyMethod(module = true, visibility = PRIVATE)
public static IRubyObject warn(ThreadContext context, IRubyObject recv, IRubyObject message) {
public static IRubyObject warn(ThreadContext context, IRubyObject recv, IRubyObject _message) {
final Ruby runtime = context.runtime;

if (runtime.warningsEnabled()) RubyIO.puts1(context, runtime.getGlobalVariables().get("$stderr"), message);
if (_message instanceof RubyArray) {
RubyArray messageArray = _message.convertToArray();
for (int i = 0; i < messageArray.size(); i++) warn(context, recv, messageArray.eltOk(i));
return context.nil;
}

return context.nil;
RubyString message = _message.convertToString();
if (!message.endsWithAsciiChar('\n')) {
message = (RubyString) message.op_plus19(context, runtime.newString("\n"));
}

return sites(context).warn.call(context, recv, runtime.getWarning(), message);
}

public static final String[] WARN_VALID_KEYS = {"uplevel"};

@JRubyMethod(module = true, rest = true, visibility = PRIVATE)
public static IRubyObject warn(ThreadContext context, IRubyObject recv, IRubyObject[] args) {
Ruby runtime = context.runtime;

boolean kwargs = false;
int uplevel = -1;
if (args.length > 1) {
IRubyObject tmp = TypeConverter.checkHashType(context.runtime, args[args.length - 1]);
if (!tmp.isNil()) {
kwargs = true;
IRubyObject[] rets = ArgsUtil.extractKeywordArgs(context, (RubyHash) tmp, "uplevel");
uplevel = RubyNumeric.num2int(rets[0]);
IRubyObject[] rets = ArgsUtil.extractKeywordArgs(context, (RubyHash) tmp, WARN_VALID_KEYS);
uplevel = rets[0] == UNDEF ? 0 : RubyNumeric.num2int(rets[0]);
}
}

RubyString message = context.runtime.newString();
// FIXME: This is not particularly efficient.
int numberOfMessages = kwargs ? args.length - 1 : args.length;
IRubyObject newline = runtime.newString("\n");

if (uplevel >= 0) {
if (kwargs) {
RubyStackTraceElement[] elements = context.runtime.getInstanceConfig().getTraceType().getBacktrace(context).getBacktrace(context.runtime);

// User can ask for level higher than stack
if (elements.length <= uplevel + 1) uplevel = 0;
if (elements.length <= uplevel + 1) uplevel = -1;

int index = uplevel + 1;
message.catString(elements[index].getFileName() + ":" + (elements[index].getLineNumber()) + " warning: ");
}

for (int i = 0; i < numberOfMessages; i++) {
message.append(args[i]);
if (i + 1 < numberOfMessages) message.cat('\n');
RubyString baseMessage = context.runtime.newString();
baseMessage.catString(elements[index].getFileName() + ":" + (elements[index].getLineNumber()) + " warning: ");

for (int i = 0; i < numberOfMessages; i++) {
warn(context, recv, baseMessage.op_plus19(context, args[i]));
}
} else {
for (int i = 0; i < numberOfMessages; i++) {
warn(context, recv, args[i].convertToString());
}
}

if (message.size() > 0) warn(context, recv, message);

return context.nil;
}

Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/org/jruby/RubyMatchData.java
Expand Up @@ -377,7 +377,7 @@ public IRubyObject[] getNamedBackrefValues(Ruby runtime) {

@JRubyMethod
@Override
public IRubyObject inspect() {
public RubyString inspect() {
if (str == null) return anyToString();

Ruby runtime = getRuntime();
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/org/jruby/RubyModule.java
Expand Up @@ -2297,7 +2297,7 @@ public RubyFixnum hash() {
*/
@JRubyMethod(name = "to_s", alias = "inspect")
@Override
public IRubyObject to_s() {
public RubyString to_s() {
if(isSingleton()){
IRubyObject attached = ((MetaClass) this).getAttached();
RubyString buffer = getRuntime().newString("#<Class:");
Expand Down
10 changes: 7 additions & 3 deletions core/src/main/java/org/jruby/RubyNumeric.java
Expand Up @@ -644,13 +644,17 @@ public RubyNumeric asNumeric() {
* ================
*/

@JRubyMethod(name = "!")
public IRubyObject op_not(ThreadContext context) {
return context.fals;
}

/** num_sadded
*
*/
@JRubyMethod(name = "singleton_method_added")
public static IRubyObject sadded(IRubyObject self, IRubyObject name) {
Ruby runtime = self.getRuntime();
throw runtime.newTypeError(str(runtime,
public static IRubyObject singleton_method_added(ThreadContext context, IRubyObject self, IRubyObject name) {
throw context.runtime.newTypeError(str(runtime,
"can't define singleton method \"", ids(runtime, name), "\" for ", types(runtime, self.getType())));
}

Expand Down
4 changes: 1 addition & 3 deletions core/src/main/java/org/jruby/RubyProc.java
Expand Up @@ -81,10 +81,8 @@ protected RubyProc(Ruby runtime, RubyClass rubyClass, Block.Type type, String fi


public RubyProc(Ruby runtime, RubyClass rubyClass, Block block, String file, int line) {
this(runtime, rubyClass, block.type);
this(runtime, rubyClass, block.type, file, line);
this.block = block;
this.file = file;
this.line = line;
}

public static RubyClass createProcClass(Ruby runtime) {
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/org/jruby/RubyRational.java
Expand Up @@ -1272,9 +1272,9 @@ public RubyString inspect(ThreadContext context) {
private RubyString inspectImpl(Ruby runtime) {
RubyString str = RubyString.newString(runtime, new ByteList(12), USASCIIEncoding.INSTANCE);
str.cat((byte)'(');
str.append(num.inspect());
str.append((RubyString) num.inspect());
str.cat((byte)'/');
str.append(den.inspect());
str.append((RubyString) den.inspect());
str.cat((byte)')');
return str;
}
Expand Down
15 changes: 14 additions & 1 deletion core/src/main/java/org/jruby/RubyString.java
Expand Up @@ -2343,7 +2343,7 @@ private void raiseIndexOutOfString(int index) {
*/
@Override
@JRubyMethod(name = "inspect")
public IRubyObject inspect() {
public RubyString inspect() {
return inspect(getRuntime());
}

Expand Down Expand Up @@ -2584,6 +2584,12 @@ public RubyString append(IRubyObject other) {
return cat(otherStr.value);
}

public RubyString append(RubyString otherStr) {
modifyCheck();
infectBy(otherStr);
return cat(otherStr.value);
}

public RubyString append19(IRubyObject other) {
modifyCheck();

Expand Down Expand Up @@ -4424,6 +4430,13 @@ private boolean end_with_pCommon(IRubyObject tmp) {
return false;
}

public boolean endsWithAsciiChar(char c) {
ByteList value = this.value;
int size;

return value.getEncoding().isAsciiCompatible() && (size = value.realSize()) > 0 && value.get(size - 1) == c;
}

private static final ByteList SPACE_BYTELIST = RubyInteger.singleCharByteList((byte) ' ');

private IRubyObject justify(Ruby runtime, IRubyObject arg0, int jflag) {
Expand Down
37 changes: 26 additions & 11 deletions core/src/main/java/org/jruby/RubyStruct.java
Expand Up @@ -33,6 +33,8 @@

package org.jruby;

import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.jruby.anno.JRubyClass;
Expand Down Expand Up @@ -355,21 +357,34 @@ public IRubyObject initialize(ThreadContext context, IRubyObject[] args) {

IRubyObject keywordInit = RubyStruct.getInternalVariable(classOf(), "__keyword_init__");

Ruby runtime = context.runtime;
IRubyObject nil = context.nil;

if (keywordInit.isTrue()) {
if (args.length != 1 || !(args[0] instanceof RubyHash)) throw context.runtime.newArgumentError("wrong number of arguments (given " + args.length + ", expected 0)");
RubyHash kwArgs = args[0].convertToHash();
IRubyObject maybeKwargs = ArgsUtil.getOptionsArg(runtime, args);

if (maybeKwargs.isNil())
throw runtime.newArgumentError("wrong number of arguments (given " + args.length + ", expected 0)");

RubyHash kwArgs = (RubyHash) maybeKwargs;
RubyArray __members__ = __member__();
String[] members = Stream.of(__members__.toJavaArray())
.map(o -> RubySymbol.objectToSymbolString(o))
.collect(Collectors.toList())
.toArray(new String[__members__.size()]);
args = ArgsUtil.extractKeywordArgs(context, kwArgs, members);
Set<Map.Entry<IRubyObject, IRubyObject>> entries = kwArgs.directEntrySet();

entries.stream().forEach(
entry -> {
IRubyObject key = entry.getKey();
if (!(key instanceof RubySymbol))
key = runtime.newSymbol(key.convertToString().getByteList());
IRubyObject index = __members__.index(context, key);
if (index.isNil()) throw runtime.newArgumentError("unknown keywords: " + key);
values[index.convertToInteger().getIntValue()] = entry.getValue();
});
} else {
System.arraycopy(args, 0, values, 0, args.length);
Helpers.fillNil(values, args.length, values.length, runtime);
}

System.arraycopy(args, 0, values, 0, args.length);
Helpers.fillNil(values, args.length, values.length, context.runtime);

return context.nil;
return nil;
}

@JRubyMethod(visibility = PRIVATE)
Expand Down
14 changes: 1 addition & 13 deletions core/src/main/java/org/jruby/RubyThread.java
Expand Up @@ -650,20 +650,8 @@ private static void initThreadName(final Ruby runtime, final Thread thread, fina
thread.setName(newName);
}

// TODO likely makes sense to have a counter or the Ruby class directly (could be included with JMX)
private static final WeakHashMap<Ruby, AtomicLong> threadCount = new WeakHashMap<Ruby, AtomicLong>(4);

private static long incAndGetThreadCount(final Ruby runtime) {
AtomicLong counter = threadCount.get(runtime);
if ( counter == null ) {
synchronized (runtime) {
counter = threadCount.get(runtime);
if ( counter == null ) {
threadCount.put(runtime, counter = new AtomicLong(0));
}
}
}
return counter.incrementAndGet();
return runtime.getThreadService().incrementAndGetThreadCount();
}

private static RubyThread startThread(final IRubyObject recv, final IRubyObject[] args, boolean callInit, Block block) {
Expand Down
3 changes: 3 additions & 0 deletions core/src/main/java/org/jruby/common/RubyWarnings.java
Expand Up @@ -207,6 +207,9 @@ public void warning(ID id, String fileName, int lineNumber, String message) {
@JRubyMethod
public static IRubyObject warn(ThreadContext context, IRubyObject recv, IRubyObject arg) {
Ruby runtime = context.runtime;

if (!runtime.warningsEnabled()) return context.nil;

TypeConverter.checkType(context, arg, runtime.getString());
RubyString str = (RubyString) arg;
if (!str.getEncoding().isAsciiCompatible()) {
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/org/jruby/exceptions/FrozenError.java
Expand Up @@ -32,7 +32,7 @@
*
* @see RubyFrozenError
*/
public class FrozenError extends StandardError {
public class FrozenError extends RuntimeError {
public FrozenError(String message, RubyFrozenError exception) {
super(message, exception);
}
Expand Down
8 changes: 7 additions & 1 deletion core/src/main/java/org/jruby/ext/date/DateUtils.java
@@ -1,6 +1,7 @@
package org.jruby.ext.date;

import org.jruby.*;
import org.jruby.runtime.JavaSites;
import org.jruby.runtime.ThreadContext;
import org.jruby.runtime.builtin.IRubyObject;

Expand Down Expand Up @@ -230,7 +231,8 @@ static int offset_to_sec(ThreadContext context, IRubyObject of) {
//if (d != n) rb_warning("fraction of offset is ignored");
return (int) n;
case STRING:
vs = date_zone_to_diff(context, (RubyString) of);
RubyClass date = getDate(context.runtime);
vs = sites(context).zone_to_diff.call(context, date, date, of);

if (!(vs instanceof RubyFixnum)) return INVALID_OFFSET;
n = ((RubyFixnum) vs).getLongValue();
Expand Down Expand Up @@ -439,6 +441,10 @@ else if (iy > REFORM_END_YEAR)
return style;
}

private static JavaSites.DateSites sites(ThreadContext context) {
return context.sites.Date;
}

private static final int JC_PERIOD0 = 1461; /* 365.25 * 4 */
private static final int GC_PERIOD0 = 146097; /* 365.2425 * 400 */
private static final int CM_PERIOD0 = 71149239; /* (lcm 7 1461 146097) */
Expand Down
11 changes: 2 additions & 9 deletions core/src/main/java/org/jruby/ext/date/RubyDate.java
Expand Up @@ -234,7 +234,7 @@ private void initialize(final ThreadContext context, IRubyObject arg, IRubyObjec

static final int DAY_IN_SECONDS = 86_400; // 24 * 60 * 60
static final int DAY_MS = 86_400_000; // 24 * 60 * 60 * 1000
private static RubyFixnum DAY_MS_CACHE;
private RubyFixnum DAY_MS_CACHE;

private long initMillis(final ThreadContext context, IRubyObject ajd) {
final Ruby runtime = context.runtime;
Expand Down Expand Up @@ -272,7 +272,7 @@ private long initMillis(final ThreadContext context, IRubyObject ajd) {
return ((RubyFixnum) millis).getLongValue();
}

private static RubyFixnum DAY_MS(final ThreadContext context) {
private RubyFixnum DAY_MS(final ThreadContext context) {
RubyFixnum v = DAY_MS_CACHE;
if (v == null) v = DAY_MS_CACHE = context.runtime.newFixnum(DAY_MS);
return v;
Expand Down Expand Up @@ -1394,13 +1394,6 @@ static RubyRational newRationalConvert(ThreadContext context, IRubyObject num, l
return (RubyRational) RubyRational.newRationalConvert(context, num, context.runtime.newFixnum(den));
}

private static final CachingCallSite zone_to_diff = new FunctionalCachingCallSite("zone_to_diff");

static IRubyObject date_zone_to_diff(final ThreadContext context, RubyString str) {
final RubyClass klass = getDate(context.runtime);
return zone_to_diff.call(context, klass, klass, str);
}

// def jd_to_ajd(jd, fr, of=0) jd + fr - of - Rational(1, 2) end
private static double jd_to_ajd(long jd) { return jd - 0.5; }

Expand Down

0 comments on commit 00cecc9

Please sign in to comment.