Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: e9d732bd138b
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 6b9288441266
Choose a head ref
  • 2 commits
  • 9 files changed
  • 1 contributor

Commits on Jan 9, 2017

  1. 2
    Copy the full SHA
    4a0c616 View commit details
  2. Copy the full SHA
    6b92884 View commit details
21 changes: 21 additions & 0 deletions truffle/src/main/java/org/jruby/truffle/RubyLanguage.java
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@
import com.oracle.truffle.api.instrumentation.ProvidedTags;
import com.oracle.truffle.api.instrumentation.StandardTags;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.core.kernel.TraceManager;
@@ -118,6 +119,26 @@ protected String toString(RubyContext context, Object value) {
}
}

// @Override in Truffle 0.22
protected Object findMetaObject(RubyContext context, Object value) {
return context.getCoreLibrary().getMetaClass(value);
}

// @Override in Truffle 0.22
protected SourceSection findSourceLocation(RubyContext context, Object value) {
if (RubyGuards.isRubyModule(value)) {
return Layouts.CLASS.getFields((DynamicObject) value).getSourceSection();
} else if (RubyGuards.isRubyMethod(value)) {
return Layouts.METHOD.getMethod((DynamicObject) value).getSharedMethodInfo().getSourceSection();
} else if (RubyGuards.isRubyUnboundMethod(value)) {
return Layouts.UNBOUND_METHOD.getMethod((DynamicObject) value).getSharedMethodInfo().getSourceSection();
} else if (RubyGuards.isRubyProc(value)) {
return Layouts.PROC.getMethod((DynamicObject) value).getSharedMethodInfo().getSourceSection();
} else {
return null;
}
}

public Node unprotectedCreateFindContextNode() {
return super.createFindContextNode();
}
24 changes: 16 additions & 8 deletions truffle/src/main/java/org/jruby/truffle/core/CoreLibrary.java
Original file line number Diff line number Diff line change
@@ -368,16 +368,16 @@ public CoreLibrary(RubyContext context) {

// Create the cyclic classes and modules

classClass = ClassNodes.createClassClass(context);
classClass = ClassNodes.createClassClass(context, null);

basicObjectClass = ClassNodes.createBootClass(context, classClass, null, "BasicObject");
basicObjectClass = ClassNodes.createBootClass(context, null, classClass, null, "BasicObject");
Layouts.CLASS.setInstanceFactoryUnsafe(basicObjectClass, Layouts.BASIC_OBJECT.createBasicObjectShape(basicObjectClass, basicObjectClass));

objectClass = ClassNodes.createBootClass(context, classClass, basicObjectClass, "Object");
objectClass = ClassNodes.createBootClass(context, null, classClass, basicObjectClass, "Object");
objectFactory = Layouts.BASIC_OBJECT.createBasicObjectShape(objectClass, objectClass);
Layouts.CLASS.setInstanceFactoryUnsafe(objectClass, objectFactory);

moduleClass = ClassNodes.createBootClass(context, classClass, objectClass, "Module");
moduleClass = ClassNodes.createBootClass(context, null, classClass, objectClass, "Module");
Layouts.CLASS.setInstanceFactoryUnsafe(moduleClass, Layouts.MODULE.createModuleShape(moduleClass, moduleClass));

// Close the cycles
@@ -987,22 +987,30 @@ private DynamicObject defineClass(String name) {

private DynamicObject defineClass(DynamicObject superclass, String name) {
assert RubyGuards.isRubyClass(superclass);
return ClassNodes.createInitializedRubyClass(context, objectClass, superclass, name);
return ClassNodes.createInitializedRubyClass(context, null, objectClass, superclass, name);
}

private DynamicObject defineClass(DynamicObject lexicalParent, DynamicObject superclass, String name) {
assert RubyGuards.isRubyModule(lexicalParent);
assert RubyGuards.isRubyClass(superclass);
return ClassNodes.createInitializedRubyClass(context, lexicalParent, superclass, name);
return ClassNodes.createInitializedRubyClass(context, null, lexicalParent, superclass, name);
}

private DynamicObject defineModule(String name) {
return defineModule(objectClass, name);
return defineModule(null, objectClass, name);
}

private DynamicObject defineModule(DynamicObject lexicalParent, String name) {
return defineModule(null, lexicalParent, name);
}

private DynamicObject defineModule(SourceSection sourceSection, String name) {
return defineModule(sourceSection, objectClass, name);
}

private DynamicObject defineModule(SourceSection sourceSection, DynamicObject lexicalParent, String name) {
assert RubyGuards.isRubyModule(lexicalParent);
return ModuleNodes.createModule(context, moduleClass, lexicalParent, name, node);
return ModuleNodes.createModule(context, sourceSection, moduleClass, lexicalParent, name, node);
}

public void loadRubyCore() {
24 changes: 13 additions & 11 deletions truffle/src/main/java/org/jruby/truffle/core/klass/ClassNodes.java
Original file line number Diff line number Diff line change
@@ -18,6 +18,7 @@
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.object.DynamicObjectFactory;
import com.oracle.truffle.api.profiles.BranchProfile;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.Layouts;
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.builtins.CoreClass;
@@ -42,8 +43,8 @@ public abstract class ClassNodes {
* Special constructor for class Class
*/
@TruffleBoundary
public static DynamicObject createClassClass(RubyContext context) {
final ModuleFields model = new ModuleFields(context, null, "Class");
public static DynamicObject createClassClass(RubyContext context, SourceSection sourceSection) {
final ModuleFields model = new ModuleFields(context, sourceSection,null, "Class");
model.setFullName(model.givenBaseName);

final DynamicObjectFactory tempFactory = Layouts.CLASS.createClassShape(null, null);
@@ -76,10 +77,10 @@ public static DynamicObject createClassClass(RubyContext context) {
* normally be used from outside this class.
*/
@TruffleBoundary
public static DynamicObject createBootClass(RubyContext context, DynamicObject classClass, DynamicObject superclass, String name) {
public static DynamicObject createBootClass(RubyContext context, SourceSection sourceSection, DynamicObject classClass, DynamicObject superclass, String name) {
assert RubyGuards.isRubyClass(classClass);
assert superclass == null || RubyGuards.isRubyClass(superclass);
final ModuleFields model = new ModuleFields(context, null, name);
final ModuleFields model = new ModuleFields(context, sourceSection, null, name);

final DynamicObject rubyClass = Layouts.CLASS.createClass(Layouts.CLASS.getInstanceFactory(classClass), model, false, null, null, null);
assert RubyGuards.isRubyClass(rubyClass) : classClass.getShape().getObjectType().getClass();
@@ -109,24 +110,25 @@ public static DynamicObject createBootClass(RubyContext context, DynamicObject c
}

@TruffleBoundary
public static DynamicObject createSingletonClassOfObject(RubyContext context, DynamicObject superclass, DynamicObject attached, String name) {
public static DynamicObject createSingletonClassOfObject(RubyContext context, SourceSection sourceSection, DynamicObject superclass, DynamicObject attached, String name) {
// We also need to create the singleton class of a singleton class for proper lookup and consistency.
// See rb_singleton_class() documentation in MRI.
// Allocator is null here, we cannot create instances of singleton classes.
assert RubyGuards.isRubyClass(superclass);
assert attached != null;
return ensureItHasSingletonClassCreated(context, createRubyClass(context, Layouts.BASIC_OBJECT.getLogicalClass(superclass), null, superclass, name, true, attached, true));
return ensureItHasSingletonClassCreated(context, createRubyClass(context, sourceSection, Layouts.BASIC_OBJECT.getLogicalClass(superclass), null, superclass, name, true, attached, true));
}

@TruffleBoundary
public static DynamicObject createInitializedRubyClass(RubyContext context, DynamicObject lexicalParent, DynamicObject superclass, String name) {
final DynamicObject rubyClass = createRubyClass(context, Layouts.BASIC_OBJECT.getLogicalClass(superclass), lexicalParent, superclass, name, false, null, true);
public static DynamicObject createInitializedRubyClass(RubyContext context, SourceSection sourceSection, DynamicObject lexicalParent, DynamicObject superclass, String name) {
final DynamicObject rubyClass = createRubyClass(context, sourceSection, Layouts.BASIC_OBJECT.getLogicalClass(superclass), lexicalParent, superclass, name, false, null, true);
ensureItHasSingletonClassCreated(context, rubyClass);
return rubyClass;
}

@TruffleBoundary
public static DynamicObject createRubyClass(RubyContext context,
SourceSection sourceSection,
DynamicObject classClass,
DynamicObject lexicalParent,
DynamicObject superclass,
@@ -136,7 +138,7 @@ public static DynamicObject createRubyClass(RubyContext context,
boolean initialized) {
assert superclass == null || RubyGuards.isRubyClass(superclass);

final ModuleFields model = new ModuleFields(context, lexicalParent, name);
final ModuleFields model = new ModuleFields(context, sourceSection, lexicalParent, name);

final DynamicObject rubyClass = Layouts.CLASS.createClass(
Layouts.CLASS.getInstanceFactory(classClass),
@@ -238,7 +240,7 @@ private static DynamicObject createSingletonClass(RubyContext context, DynamicOb
}

String name = StringUtils.format("#<Class:%s>", Layouts.MODULE.getFields(rubyClass).getName());
DynamicObject metaClass = ClassNodes.createRubyClass(context, Layouts.BASIC_OBJECT.getLogicalClass(rubyClass), null, singletonSuperclass, name, true, rubyClass, true);
DynamicObject metaClass = ClassNodes.createRubyClass(context, Layouts.MODULE.getFields(rubyClass).getSourceSection(), Layouts.BASIC_OBJECT.getLogicalClass(rubyClass), null, singletonSuperclass, name, true, rubyClass, true);
SharedObjects.propagate(rubyClass, metaClass);
Layouts.BASIC_OBJECT.setMetaClass(rubyClass, metaClass);

@@ -429,7 +431,7 @@ public abstract static class AllocateConstructorNode extends CoreMethodArrayArgu
@Specialization
public DynamicObject allocate(DynamicObject classClass) {
assert classClass == coreLibrary().getClassClass() : "Subclasses of class Class are forbidden in Ruby";
return createRubyClass(getContext(), coreLibrary().getClassClass(), null, coreLibrary().getObjectClass(), null, false, null, false);
return createRubyClass(getContext(), getEncapsulatingSourceSection(), coreLibrary().getClassClass(), null, coreLibrary().getObjectClass(), null, false, null, false);
}

}
Original file line number Diff line number Diff line change
@@ -15,6 +15,7 @@
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.source.SourceSection;
import com.oracle.truffle.api.utilities.CyclicAssumption;
import org.jruby.truffle.Layouts;
import org.jruby.truffle.Log;
@@ -66,6 +67,8 @@ public static void debugModuleChain(DynamicObject module) {
// The context is stored here - objects can obtain it via their class (which is a module)
private final RubyContext context;

private final SourceSection sourceSection;

public final ModuleChain start;
@CompilationFinal public ModuleChain parentModule;

@@ -91,9 +94,10 @@ public static void debugModuleChain(DynamicObject module) {
*/
private final Set<DynamicObject> lexicalDependents = Collections.newSetFromMap(new WeakHashMap<DynamicObject, Boolean>());

public ModuleFields(RubyContext context, DynamicObject lexicalParent, String givenBaseName) {
public ModuleFields(RubyContext context, SourceSection sourceSection, DynamicObject lexicalParent, String givenBaseName) {
assert lexicalParent == null || RubyGuards.isRubyModule(lexicalParent);
this.context = context;
this.sourceSection = sourceSection;
this.lexicalParent = lexicalParent;
this.givenBaseName = givenBaseName;
this.unmodifiedAssumption = new CyclicAssumption(String.valueOf(givenBaseName) + " is unmodified");
@@ -727,4 +731,7 @@ public Set<DynamicObject> getAdjacentObjects() {
return adjacent;
}

public SourceSection getSourceSection() {
return sourceSection;
}
}
Original file line number Diff line number Diff line change
@@ -108,8 +108,8 @@
public abstract class ModuleNodes {

@TruffleBoundary
public static DynamicObject createModule(RubyContext context, DynamicObject selfClass, DynamicObject lexicalParent, String name, Node currentNode) {
final ModuleFields model = new ModuleFields(context, lexicalParent, name);
public static DynamicObject createModule(RubyContext context, SourceSection sourceSection, DynamicObject selfClass, DynamicObject lexicalParent, String name, Node currentNode) {
final ModuleFields model = new ModuleFields(context, sourceSection, lexicalParent, name);
final DynamicObject module = Layouts.MODULE.createModule(Layouts.CLASS.getInstanceFactory(selfClass), model);
model.rubyModuleObject = module;

@@ -1814,7 +1814,7 @@ public abstract static class AllocateNode extends CoreMethodArrayArgumentsNode {

@Specialization
public DynamicObject allocate(DynamicObject rubyClass) {
return createModule(getContext(), rubyClass, null, null, this);
return createModule(getContext(), getEncapsulatingSourceSection(), rubyClass, null, null, this);
}

}
Original file line number Diff line number Diff line change
@@ -9,10 +9,12 @@
*/
package org.jruby.truffle.language;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.instrumentation.Instrumentable;
import com.oracle.truffle.api.nodes.UnexpectedResultException;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.source.SourceSection;

@Instrumentable(factory = RubyNodeWrapper.class)
public abstract class RubyNode extends RubyBaseNode {
@@ -101,4 +103,11 @@ public Object[] executeObjectArray(VirtualFrame frame) throws UnexpectedResultEx
}
}

// Boundaries

@CompilerDirectives.TruffleBoundary
public SourceSection getEncapsulatingSourceSection() {
return super.getEncapsulatingSourceSection();
}

}
Original file line number Diff line number Diff line change
@@ -14,6 +14,7 @@
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.profiles.BranchProfile;
import com.oracle.truffle.api.profiles.ConditionProfile;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.Layouts;
import org.jruby.truffle.core.klass.ClassNodes;
import org.jruby.truffle.language.RubyConstant;
@@ -66,7 +67,7 @@ public Object execute(VirtualFrame frame) {
} else {
superClass = suppliedSuperClass;
}
definedClass = ClassNodes.createInitializedRubyClass(getContext(), lexicalParentModule, superClass, name);
definedClass = ClassNodes.createInitializedRubyClass(getContext(), getEncapsulatingSourceSection(), lexicalParentModule, superClass, name);
callInherited(frame, superClass, definedClass);
} else {
if (!RubyGuards.isRubyClass(constant.getValue())) {
Original file line number Diff line number Diff line change
@@ -10,12 +10,14 @@
package org.jruby.truffle.language.objects;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.profiles.BranchProfile;
import com.oracle.truffle.api.profiles.ConditionProfile;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.core.module.ModuleNodes;
import org.jruby.truffle.language.RubyConstant;
import org.jruby.truffle.language.RubyGuards;
@@ -43,7 +45,7 @@ public Object defineModule(VirtualFrame frame, DynamicObject lexicalParentModule
final DynamicObject definingModule;

if (needToDefineProfile.profile(constant == null)) {
definingModule = ModuleNodes.createModule(getContext(), coreLibrary().getModuleClass(),
definingModule = ModuleNodes.createModule(getContext(), getEncapsulatingSourceSection(), coreLibrary().getModuleClass(),
lexicalParentModule, name, this);
} else {
final Object constantValue = constant.getValue();
Original file line number Diff line number Diff line change
@@ -146,7 +146,7 @@ protected DynamicObject getSingletonClassForInstance(DynamicObject object) {
ObjectIDOperations.verySlowGetObjectID(getContext(), object));

final DynamicObject singletonClass = ClassNodes.createSingletonClassOfObject(
getContext(), logicalClass, object, name);
getContext(), getEncapsulatingSourceSection(), logicalClass, object, name);

if (isFrozen(object)) {
freeze(singletonClass);