Skip to content

Commit

Permalink
Showing 37 changed files with 401 additions and 621 deletions.
13 changes: 10 additions & 3 deletions core/src/main/java/org/jruby/truffle/nodes/WriteConstantNode.java
Original file line number Diff line number Diff line change
@@ -24,12 +24,14 @@
public class WriteConstantNode extends RubyNode {

private final String name;
private final LexicalScope lexicalScope;
@Child protected RubyNode module;
@Child protected RubyNode rhs;

public WriteConstantNode(RubyContext context, SourceSection sourceSection, String name, RubyNode module, RubyNode rhs) {
public WriteConstantNode(RubyContext context, SourceSection sourceSection, String name, LexicalScope lexicalScope, RubyNode module, RubyNode rhs) {
super(context, sourceSection);
this.name = name;
this.lexicalScope = lexicalScope;
this.module = module;
this.rhs = rhs;
}
@@ -41,8 +43,13 @@ public Object execute(VirtualFrame frame) {
// Evaluate RHS first.
final Object rhsValue = rhs.execute(frame);

assert rhsValue != null;
assert !(rhsValue instanceof String);
if (rhsValue instanceof RubyModule) {
final RubyModule setModule = (RubyModule) rhsValue;
if (setModule.getName() == null) {
setModule.setLexicalScope(lexicalScope);
setModule.setName(name);
}
}

final Object receiverObject = module.execute(frame);

36 changes: 19 additions & 17 deletions core/src/main/java/org/jruby/truffle/nodes/core/ArrayNodes.java
Original file line number Diff line number Diff line change
@@ -21,6 +21,7 @@
import com.oracle.truffle.api.nodes.UnexpectedResultException;
import com.oracle.truffle.api.source.SourceSection;
import com.oracle.truffle.api.utilities.BranchProfile;
import org.jruby.RubyFixnum;
import org.jruby.runtime.Visibility;
import org.jruby.truffle.nodes.CoreSourceSection;
import org.jruby.truffle.nodes.RubyNode;
@@ -1769,6 +1770,24 @@ public RubyArray flatten(RubyArray array) {

}

@CoreMethod(names = "hash")
public abstract static class HashNode extends CoreMethodNode {

public HashNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public HashNode(HashNode prev) {
super(prev);
}

@Specialization
public long hashNumber(RubyArray array) {
return array.hashCode();
}

}

@CoreMethod(names = "include?", required = 1)
public abstract static class IncludeNode extends ArrayCoreMethodNode {

@@ -3657,21 +3676,4 @@ public RubyArray zipObjectObject(RubyArray array, RubyArray other) {

}

@CoreMethod(names = "hash")
public abstract static class HashNode extends CoreMethodNode {

public HashNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public HashNode(HashNode prev) {
super(prev);
}

@Specialization
public long hashNumber(RubyArray array) {
return array.hashCode();
}

}
}
Original file line number Diff line number Diff line change
@@ -65,7 +65,7 @@ public RubyArray backtrace(RubyException exception) {

}

@CoreMethod(names = {"message", "to_s"})
@CoreMethod(names = "message")
public abstract static class MessageNode extends CoreMethodNode {

public MessageNode(RubyContext context, SourceSection sourceSection) {
@@ -83,4 +83,22 @@ public RubyString message(RubyException exception) {

}

@CoreMethod(names = "to_s")
public abstract static class ToSNode extends CoreMethodNode {

public ToSNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ToSNode(ToSNode prev) {
super(prev);
}

@Specialization
public RubyString toS(RubyException exception) {
return getContext().makeString(exception.getLogicalClass().getName());
}

}

}
32 changes: 28 additions & 4 deletions core/src/main/java/org/jruby/truffle/nodes/core/HashNodes.java
Original file line number Diff line number Diff line change
@@ -139,7 +139,7 @@ public RubyHash construct(Object[] args) {
if (store.length <= HashOperations.SMALL_HASH_SIZE) {
smallPackedArray.enter();

final int size = store.length;
final int size = array.getSize();
final Object[] newStore = new Object[HashOperations.SMALL_HASH_SIZE * 2];

for (int n = 0; n < HashOperations.SMALL_HASH_SIZE; n++) {
@@ -168,15 +168,39 @@ public RubyHash construct(Object[] args) {
return new RubyHash(getContext().getCoreLibrary().getHashClass(), null, null, newStore, size, null);
} else {
largePackedArray.enter();
throw new UnsupportedOperationException();

final List<KeyValue> keyValues = new ArrayList<>();

final int size = array.getSize();

for (int n = 0; n < size; n++) {
final Object pair = store[n];

if (!(pair instanceof RubyArray)) {
CompilerDirectives.transferToInterpreter();
throw new UnsupportedOperationException();
}

final RubyArray pairArray = (RubyArray) pair;

if (!(pairArray.getStore() instanceof Object[])) {
CompilerDirectives.transferToInterpreter();
throw new UnsupportedOperationException();
}

final Object[] pairStore = (Object[]) pairArray.getStore();
keyValues.add(new KeyValue(pairStore[0], pairStore[1]));
}

return HashOperations.verySlowFromEntries(getContext(), keyValues);
}
} else {
otherArray.enter();
throw new UnsupportedOperationException();
throw new UnsupportedOperationException("other array");
}
} else {
singleOther.enter();
throw new UnsupportedOperationException();
throw new UnsupportedOperationException("single other");
}
} else {
keyValues.enter();
38 changes: 17 additions & 21 deletions core/src/main/java/org/jruby/truffle/nodes/core/KernelNodes.java
Original file line number Diff line number Diff line change
@@ -1034,7 +1034,7 @@ public RubyArray instanceVariables(RubyBasicObject self) {
final RubyArray array = new RubyArray(getContext().getCoreLibrary().getArrayClass());

for (String name : instanceVariableNames) {
array.slowPush(RubyString.fromJavaString(getContext().getCoreLibrary().getStringClass(), name));
array.slowPush(getContext().getSymbolTable().getSymbol(name));
}

return array;
@@ -1095,7 +1095,12 @@ public Object integer(RubyString value) {

@Specialization
public Object integer(VirtualFrame frame, Object value) {
return toInt.call(frame, value, "to_int", null);
if (toInt.doesRespondTo(frame, "to_int", value)) {
return toInt.call(frame, value, "to_int", null);
} else {
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().typeErrorCantConvertInto(value, getContext().getCoreLibrary().getIntegerClass(), this));
}
}

}
@@ -1545,6 +1550,11 @@ public Object raise(VirtualFrame frame, RubyClass exceptionClass, RubyString mes
throw new RaiseException(exception);
}

@Specialization
public Object raise(RubyException exception, UndefinedPlaceholder undefined1, Object undefined2) {
throw new RaiseException(exception);
}

}

@CoreMethod(names = "rand", isModuleFunction = true, optional = 1)
@@ -2059,6 +2069,11 @@ public RubyString toS(VirtualFrame frame, Object self) {
notDesignedForCompilation();

String className = classNode.executeGetClass(frame, self).getName();

if (className == null) {
className = "Class";
}

Object id = idNode.executeObjectID(frame, self);
String hexID = toHexStringNode.executeToHexString(id);

@@ -2067,23 +2082,4 @@ public RubyString toS(VirtualFrame frame, Object self) {

}

// Rubinius API
@CoreMethod(names = "undefined", isModuleFunction = true)
public abstract static class UndefinedNode extends CoreMethodNode {

public UndefinedNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public UndefinedNode(UndefinedNode prev) {
super(prev);
}

@Specialization
public UndefinedPlaceholder undefined() {
return UndefinedPlaceholder.INSTANCE;
}

}

}
94 changes: 71 additions & 23 deletions core/src/main/java/org/jruby/truffle/nodes/core/ModuleNodes.java
Original file line number Diff line number Diff line change
@@ -34,6 +34,7 @@
import org.jruby.truffle.runtime.core.RubyArray;
import org.jruby.truffle.runtime.methods.*;
import org.jruby.truffle.translator.TranslatorDriver;
import org.jruby.util.IdUtil;

import java.util.ArrayList;
import java.util.List;
@@ -677,18 +678,33 @@ public ConstSetNode(ConstSetNode prev) {
@Specialization
public RubyModule setConstant(RubyModule module, RubyString name, Object object) {
notDesignedForCompilation();

module.setConstant(this, name.toString(), object);
setConstant(module, name.toString(), object);
return module;
}

@Specialization
public RubyModule setConstant(RubyModule module, RubySymbol name, Object object) {
notDesignedForCompilation();

module.setConstant(this, name.toString(), object);
setConstant(module, name.toString(), object);
return module;
}

public void setConstant(RubyModule module, String name, Object object) {
if (!IdUtil.isConstant(name)) {
throw new RaiseException(getContext().getCoreLibrary().nameError(String.format("wrong constant name %s", name), this));
}

if (object instanceof RubyModule) {
final RubyModule setModule = (RubyModule) object;
if (setModule.getName() == null) {
setModule.setLexicalScope(new LexicalScope(null, module));
setModule.setName(name);
}
}

module.setConstant(this, name, object);
}

}

@CoreMethod(names = "define_method", needsBlock = true, required = 1, optional = 1)
@@ -837,6 +853,39 @@ public RubyNilClass include(VirtualFrame frame, RubyModule module, Object[] args
}
}

@CoreMethod(names = "include?", required = 1)
public abstract static class IncludePNode extends CoreMethodNode {

@Child protected DispatchHeadNode appendFeaturesNode;

public IncludePNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
appendFeaturesNode = new DispatchHeadNode(context);
}

public IncludePNode(IncludePNode prev) {
super(prev);
appendFeaturesNode = prev.appendFeaturesNode;
}

@Specialization
public boolean include(RubyModule module, RubyModule included) {
notDesignedForCompilation();

ModuleChain ancestor = module.getParentModule();

while (ancestor != null) {
if (ancestor.getActualModule() == included) {
return true;
}

ancestor = ancestor.getParentModule();
}

return false;
}
}

@CoreMethod(names = "method_defined?", required = 1, optional = 1)
public abstract static class MethodDefinedNode extends CoreMethodNode {

@@ -939,10 +988,26 @@ public NameNode(NameNode prev) {
}

@Specialization
public RubyString name(RubyModule module) {
public Object name(RubyModule module) {
notDesignedForCompilation();

return getContext().makeString(module.getName());
if (module.getName() == null) {
return getContext().getCoreLibrary().getNilObject();
}

final StringBuilder builder = new StringBuilder();

builder.append(module.getName());

LexicalScope lexicalScope = module.getLexicalScope();

while (lexicalScope != null && lexicalScope.getLiveModule() != getContext().getCoreLibrary().getObjectClass()) {
builder.insert(0, "::");
builder.insert(0, lexicalScope.getLiveModule().getName());
lexicalScope = lexicalScope.getParent();
}

return getContext().makeString(builder.toString());
}
}

@@ -1344,23 +1409,6 @@ public RubyModule removeMethod(RubyModule module, RubySymbol name) {

}

@CoreMethod(names = {"to_s", "inspect"})
public abstract static class ToSNode extends CoreMethodNode {

public ToSNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ToSNode(ToSNode prev) {
super(prev);
}

@Specialization
public RubyString toS(RubyModule module) {
return getContext().makeString(module.getName());
}
}

@CoreMethod(names = "undef_method", required = 1)
public abstract static class UndefMethodNode extends CoreMethodNode {

Original file line number Diff line number Diff line change
@@ -206,7 +206,7 @@ public void initialize() {
localJumpErrorClass = new RubyException.RubyExceptionClass(context, objectClass, standardErrorClass, "LocalJumpError");
matchDataClass = new RubyClass(context, objectClass, objectClass, "MatchData");
mathModule = new RubyModule(context, objectClass, "Math");
nameErrorClass = new RubyClass(context, objectClass, standardErrorClass, "NameError");
nameErrorClass = new RubyException.RubyExceptionClass(context, objectClass, standardErrorClass, "NameError");
nilClass = new RubyClass(context, objectClass, objectClass, "NilClass");
noMethodErrorClass = new RubyException.RubyExceptionClass(context, objectClass, nameErrorClass, "NoMethodError");
objectSpaceModule = new RubyModule(context, objectClass, "ObjectSpace");
Original file line number Diff line number Diff line change
@@ -39,7 +39,7 @@ public RubyClassClass(RubyContext context) {

@Override
public RubyBasicObject newInstance(RubyNode currentNode) {
return new RubyClass(getContext(), null, null, "(unnamed class)", false);
return new RubyClass(getContext(), null, null, null, false);
}

}
21 changes: 14 additions & 7 deletions core/src/main/java/org/jruby/truffle/runtime/core/RubyModule.java
Original file line number Diff line number Diff line change
@@ -89,8 +89,8 @@ public static void debugModuleChain(RubyModule module) {
private final RubyContext context;

@CompilationFinal protected ModuleChain parentModule;

@CompilationFinal private String name;
private LexicalScope lexicalScope;
private String name;

private final Map<String, RubyMethod> methods = new HashMap<>();
private final Map<String, RubyConstant> constants = new HashMap<>();
@@ -329,11 +329,6 @@ public String toString() {
return super.toString() + "(" + name + ")";
}

@Override
public int hashCode() {
return name.hashCode();
}

public void newVersion() {
RubyNode.notDesignedForCompilation();

@@ -531,4 +526,16 @@ public Iterator<RubyModule> iterator() {
};
}

public void setName(String name) {
this.name = name;
}

public void setLexicalScope(LexicalScope lexicalScope) {
this.lexicalScope = lexicalScope;
}

public LexicalScope getLexicalScope() {
return lexicalScope;
}

}
Original file line number Diff line number Diff line change
@@ -648,7 +648,7 @@ public RubyNode visitConstDeclNode(org.jruby.ast.ConstDeclNode node) {
throw new UnsupportedOperationException();
}

return new WriteConstantNode(context, sourceSection, node.getName(), moduleNode, node.getValueNode().accept(this));
return new WriteConstantNode(context, sourceSection, node.getName(), environment.getLexicalScope(), moduleNode, node.getValueNode().accept(this));
}

@Override
8 changes: 8 additions & 0 deletions core/src/main/ruby/jruby/truffle/core.rb
Original file line number Diff line number Diff line change
@@ -21,7 +21,15 @@
require_relative 'core/rubinius/api/kernel/common/tuple'
require_relative 'core/rubinius/api/kernel/common/type'

require_relative 'core/rubinius/api/shims/lookuptable'
require_relative 'core/rubinius/api/shims/thread'
require_relative 'core/rubinius/api/shims/type'
require_relative 'core/rubinius/api/shims/enumerator'
require_relative 'core/rubinius/api/shims/undefined'

require_relative 'core/rubinius/kernel/common/undefined'
require_relative 'core/rubinius/kernel/common/kernel'
require_relative 'core/rubinius/kernel/common/array'
require_relative 'core/rubinius/kernel/common/struct'

require_relative 'core/shims'
15 changes: 9 additions & 6 deletions core/src/main/ruby/jruby/truffle/core/rubinius/README.md
Original file line number Diff line number Diff line change
@@ -9,18 +9,21 @@ written in Ruby, in some cases modified. We have taken files from commit
8d01207061518355da9b53274fe8766ecf85fdfe. This code was written by Evan Phoenix,
Charles Nutter, et al.

`api/shims` is our own code.

Some of the code from `rubinius-core-api` is also found at
`core/src/main/java/org/jruby/truffle/runtime/rubinius`, and again may be
modified.

https://github.com/rubinius/rubinius-core-api

We try not to modify files, so that they can easily be merged from upstream in
the future, but we have found it easier to modify inline in a few cases, rather
than somehow patch things from within JRuby+Truffle.
We try not to modify files from Rubinius, so that they can easily be merged from
upstream in the future. In some cases there are shims that patch up Rubinius
code after it has been loaded, such as `api/shims`. We have also tried to keep
files from `rubinius-core-api` and Rubinius itself separate and to be consistent
about what we're using from where and why. In the end it's a bit of a mix from
the two projects, and a mix of modification and shimming that works for us.

We have also tried to keep files from `rubinius-core-api` and Rubinius itself
separate and to be consistent about what we're using, but in the end it's a bit
of a mix from the two that works for us.
The only file the VM loads is `core.rb` - everything else is loaded from there.

We have directly attached copyright and license information to each file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. This
# code is released under a tri EPL/GPL/LGPL license. You can use it,
# redistribute it and/or modify it under the terms of the:
#
# Eclipse Public License version 1.0
# GNU General Public License version 2
# GNU Lesser General Public License version 2.1

class Enumerator

def initialize(array)
@array = array
end

def to_a
@array
end

end

module Kernel

def to_enum(method_name)
array = []

send(method_name) do |*values|
array << values
end

Enumerator.new(array)
end

end
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. This
# code is released under a tri EPL/GPL/LGPL license. You can use it,
# redistribute it and/or modify it under the terms of the:
#
# Eclipse Public License version 1.0
# GNU General Public License version 2
# GNU Lesser General Public License version 2.1

# TODO(CS): isn't this vulnerable to naming conflicts?

LookupTable = Hash
19 changes: 19 additions & 0 deletions core/src/main/ruby/jruby/truffle/core/rubinius/api/shims/thread.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. This
# code is released under a tri EPL/GPL/LGPL license. You can use it,
# redistribute it and/or modify it under the terms of the:
#
# Eclipse Public License version 1.0
# GNU General Public License version 2
# GNU Lesser General Public License version 2.1

class Thread

# Rubinius seems to set @recursive_objects to {} in C++ - here we shim the
# attribute reader to initialize it. __detect_outermost_recursion__ seems
# to make things work - not sure why at this stage.

def recursive_objects
@recursive_objects ||= {:__detect_outermost_recursion__ => nil}
end

end
25 changes: 25 additions & 0 deletions core/src/main/ruby/jruby/truffle/core/rubinius/api/shims/type.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. This
# code is released under a tri EPL/GPL/LGPL license. You can use it,
# redistribute it and/or modify it under the terms of the:
#
# Eclipse Public License version 1.0
# GNU General Public License version 2
# GNU Lesser General Public License version 2.1

module Rubinius
module Type

# I think Rubinius defines this in C++

def coerce_to_collection_index(index)
if object_kind_of? index, Fixnum
index
else
raise TypeError, "no implicit conversion of #{index.class.name} into Integer"
end
end

module_function :coerce_to_collection_index

end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. This
# code is released under a tri EPL/GPL/LGPL license. You can use it,
# redistribute it and/or modify it under the terms of the:
#
# Eclipse Public License version 1.0
# GNU General Public License version 2
# GNU Lesser General Public License version 2.1

module Rubinius

UNDEFINED = Object.new

end

module Kernel

# TODO(CS): this seems very vulnerable to name conflicts

def undefined
Rubinius::UNDEFINED
end

end
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Copyright (c) 2007-2014, Evan Phoenix and contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
# * Neither the name of Rubinius nor the names of its contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

class Array

def values_at(*args)
out = []

args.each do |elem|
# Cannot use #[] because of subtly different errors
if elem.kind_of? Range
finish = Rubinius::Type.coerce_to_collection_index elem.last
start = Rubinius::Type.coerce_to_collection_index elem.first

start += @total if start < 0
next if start < 0

finish += @total if finish < 0
finish -= 1 if elem.exclude_end?

next if finish < start

start.upto(finish) { |i| out << at(i) }

else
i = Rubinius::Type.coerce_to_collection_index elem
out << at(i)
end
end

out
end

end
498 changes: 0 additions & 498 deletions core/src/main/ruby/jruby/truffle/core/rubinius/kernel/common/time.rb

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Copyright (c) 2007-2014, Evan Phoenix and contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
# * Neither the name of Rubinius nor the names of its contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

class << undefined
def to_s
"undefined"
end

alias_method :inspect, :to_s
end
2 changes: 2 additions & 0 deletions spec/truffle/tags/core/kernel/eval_tags.txt
Original file line number Diff line number Diff line change
@@ -9,3 +9,5 @@ fails:Kernel#eval does not alter the value of __FILE__ in the binding
fails:Kernel#eval uses the receiver as self inside the eval
fails:Kernel#eval returns from the scope calling #eval when evaluating 'return'
fails:Kernel#eval unwinds through a Proc-style closure and returns from a lambda-style closure in the closure chain
fails:Kernel#eval does not share locals across eval scopes
fails:Kernel#eval raises a LocalJumpError if there is no lambda-style closure in the chain
2 changes: 0 additions & 2 deletions spec/truffle/tags/core/struct/each_pair_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/truffle/tags/core/struct/each_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/truffle/tags/core/struct/element_reference_tags.txt

This file was deleted.

1 change: 0 additions & 1 deletion spec/truffle/tags/core/struct/element_set_tags.txt

This file was deleted.

4 changes: 0 additions & 4 deletions spec/truffle/tags/core/struct/eql_tags.txt

This file was deleted.

4 changes: 0 additions & 4 deletions spec/truffle/tags/core/struct/equal_value_tags.txt

This file was deleted.

3 changes: 0 additions & 3 deletions spec/truffle/tags/core/struct/hash_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/truffle/tags/core/struct/initialize_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/truffle/tags/core/struct/inspect_tags.txt

This file was deleted.

1 change: 0 additions & 1 deletion spec/truffle/tags/core/struct/instance_variables_tags.txt

This file was deleted.

6 changes: 0 additions & 6 deletions spec/truffle/tags/core/struct/new_tags.txt

This file was deleted.

1 change: 0 additions & 1 deletion spec/truffle/tags/core/struct/select_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/truffle/tags/core/struct/struct_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/truffle/tags/core/struct/to_h_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/truffle/tags/core/struct/to_s_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/truffle/tags/core/struct/values_at_tags.txt

This file was deleted.

0 comments on commit 3a11773

Please sign in to comment.