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: d8a6401ebaf9
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: f76083cf5dfd
Choose a head ref
  • 5 commits
  • 71 files changed
  • 1 contributor

Commits on Aug 18, 2015

  1. Copy the full SHA
    45090c8 View commit details
  2. Copy the full SHA
    7fc5f09 View commit details
  3. Copy the full SHA
    2b3a286 View commit details
  4. Copy the full SHA
    747d65b View commit details
  5. Copy the full SHA
    f76083c View commit details
Showing with 651 additions and 609 deletions.
  1. +1 −1 truffle/src/main/java/org/jruby/truffle/nodes/RubyGuards.java
  2. +1 −2 truffle/src/main/java/org/jruby/truffle/nodes/coerce/NameToJavaStringNode.java
  3. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/coerce/NameToSymbolOrStringNode.java
  4. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/coerce/ToAryNode.java
  5. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/coerce/ToFNode.java
  6. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/coerce/ToIntNode.java
  7. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/coerce/ToStrNode.java
  8. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/constants/ReadConstantWithLexicalScopeNode.java
  9. +4 −4 truffle/src/main/java/org/jruby/truffle/nodes/constants/ReadLiteralConstantNode.java
  10. +0 −149 truffle/src/main/java/org/jruby/truffle/nodes/core/BasicObjectNodes.java
  11. +6 −6 truffle/src/main/java/org/jruby/truffle/nodes/core/ClassNodes.java
  12. +1 −1 truffle/src/main/java/org/jruby/truffle/nodes/core/CoreMethodNodeManager.java
  13. +1 −1 truffle/src/main/java/org/jruby/truffle/nodes/core/EncodingConverterNodes.java
  14. +3 −3 truffle/src/main/java/org/jruby/truffle/nodes/core/ExceptionNodes.java
  15. +7 −7 truffle/src/main/java/org/jruby/truffle/nodes/core/FiberNodes.java
  16. +5 −5 .../jruby/truffle/{om/dsl/processor/layout/model/NullableState.java → nodes/core/InterruptMode.java}
  17. +23 −16 truffle/src/main/java/org/jruby/truffle/nodes/core/KernelNodes.java
  18. +3 −2 truffle/src/main/java/org/jruby/truffle/nodes/core/MatchDataNodes.java
  19. +1 −1 truffle/src/main/java/org/jruby/truffle/nodes/core/ModuleNodes.java
  20. +25 −10 truffle/src/main/java/org/jruby/truffle/nodes/core/ObjectSpaceNodes.java
  21. +19 −19 truffle/src/main/java/org/jruby/truffle/nodes/core/RegexpNodes.java
  22. +15 −15 truffle/src/main/java/org/jruby/truffle/nodes/core/StringNodes.java
  23. +1 −1 truffle/src/main/java/org/jruby/truffle/nodes/core/SymbolNodes.java
  24. +50 −89 truffle/src/main/java/org/jruby/truffle/nodes/core/ThreadNodes.java
  25. +10 −10 truffle/src/main/java/org/jruby/truffle/nodes/core/array/ArrayNodes.java
  26. +9 −10 truffle/src/main/java/org/jruby/truffle/nodes/core/array/ArrayReadSliceNormalizedNode.java
  27. +12 −12 truffle/src/main/java/org/jruby/truffle/nodes/core/hash/HashNodes.java
  28. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/exceptions/RescueClassesNode.java
  29. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/exceptions/RescueSplatNode.java
  30. +1 −2 truffle/src/main/java/org/jruby/truffle/nodes/exceptions/TryNode.java
  31. +4 −4 truffle/src/main/java/org/jruby/truffle/nodes/globals/ReadMatchReferenceNode.java
  32. +1 −2 truffle/src/main/java/org/jruby/truffle/nodes/methods/ExceptionTranslatingNode.java
  33. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/objects/ClassNode.java
  34. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/objects/FreezeNode.java
  35. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/objects/IsFrozenNode.java
  36. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/objects/IsTaintedNode.java
  37. +3 −3 truffle/src/main/java/org/jruby/truffle/nodes/objects/SingletonClassNode.java
  38. +1 −2 truffle/src/main/java/org/jruby/truffle/nodes/objects/TaintNode.java
  39. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/objectstorage/ReadMissingObjectFieldNode.java
  40. +1 −2 truffle/src/main/java/org/jruby/truffle/nodes/objectstorage/UninitializedWriteObjectFieldNode.java
  41. +1 −2 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/ObjectPrimitiveNodes.java
  42. +3 −4 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/PointerPrimitiveNodes.java
  43. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/RegexpPrimitiveNodes.java
  44. +6 −6 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/StringPrimitiveNodes.java
  45. +5 −5 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/ThreadPrimitiveNodes.java
  46. +12 −1 truffle/src/main/java/org/jruby/truffle/om/dsl/api/Layout.java
  47. +23 −0 truffle/src/main/java/org/jruby/truffle/om/dsl/api/Volatile.java
  48. +39 −16 truffle/src/main/java/org/jruby/truffle/om/dsl/processor/layout/LayoutGenerator.java
  49. +9 −14 truffle/src/main/java/org/jruby/truffle/om/dsl/processor/layout/LayoutParser.java
  50. +5 −0 truffle/src/main/java/org/jruby/truffle/om/dsl/processor/layout/model/NameUtils.java
  51. +7 −6 truffle/src/main/java/org/jruby/truffle/om/dsl/processor/layout/model/PropertyBuilder.java
  52. +10 −1 truffle/src/main/java/org/jruby/truffle/om/dsl/processor/layout/model/PropertyModel.java
  53. +5 −6 truffle/src/main/java/org/jruby/truffle/runtime/RubyContext.java
  54. +2 −3 truffle/src/main/java/org/jruby/truffle/runtime/RubyObjectType.java
  55. +1 −2 truffle/src/main/java/org/jruby/truffle/runtime/backtrace/DebugBacktraceFormatter.java
  56. +1 −2 truffle/src/main/java/org/jruby/truffle/runtime/backtrace/ImplementationDebugBacktraceFormatter.java
  57. +2 −3 truffle/src/main/java/org/jruby/truffle/runtime/backtrace/MRIBacktraceFormatter.java
  58. +17 −19 truffle/src/main/java/org/jruby/truffle/runtime/core/CoreLibrary.java
  59. +6 −29 truffle/src/main/java/org/jruby/truffle/runtime/core/ModuleFields.java
  60. +3 −4 truffle/src/main/java/org/jruby/truffle/runtime/hash/BucketsStrategy.java
  61. +9 −0 truffle/src/main/java/org/jruby/truffle/runtime/layouts/Layouts.java
  62. +37 −0 truffle/src/main/java/org/jruby/truffle/runtime/layouts/ThreadLayout.java
  63. +154 −0 truffle/src/main/java/org/jruby/truffle/runtime/object/ObjectGraph.java
  64. +18 −0 truffle/src/main/java/org/jruby/truffle/runtime/object/ObjectGraphVisitor.java
  65. +16 −0 truffle/src/main/java/org/jruby/truffle/runtime/object/ObjectIDOperations.java
  66. +15 −0 truffle/src/main/java/org/jruby/truffle/runtime/object/StopVisitingObjectsException.java
  67. +2 −2 truffle/src/main/java/org/jruby/truffle/runtime/subsystems/FiberManager.java
  68. +1 −70 truffle/src/main/java/org/jruby/truffle/runtime/subsystems/ObjectSpaceManager.java
  69. +3 −2 truffle/src/main/java/org/jruby/truffle/runtime/subsystems/SafepointManager.java
  70. +1 −2 truffle/src/main/java/org/jruby/truffle/runtime/subsystems/SimpleShell.java
  71. +2 −3 truffle/src/main/java/org/jruby/truffle/runtime/subsystems/ThreadManager.java
Original file line number Diff line number Diff line change
@@ -205,7 +205,7 @@ public static boolean isRubyFiber(DynamicObject object) {
}

public static boolean isRubyThread(DynamicObject object) {
return ThreadLayoutImpl.INSTANCE.isThread(object);
return Layouts.THREAD.isThread(object);
}

public static boolean isRubyMatchData(Object object) {
Original file line number Diff line number Diff line change
@@ -18,7 +18,6 @@
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.core.BasicObjectNodes;
import org.jruby.truffle.nodes.dispatch.CallDispatchHeadNode;
import org.jruby.truffle.nodes.dispatch.DispatchHeadNodeFactory;
import org.jruby.truffle.runtime.RubyContext;
@@ -58,7 +57,7 @@ public String coerceObject(VirtualFrame frame, Object object) {
try {
coerced = toStr.call(frame, object, "to_str", null);
} catch (RaiseException e) {
if (BasicObjectNodes.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNoMethodErrorClass()) {
if (Layouts.BASIC_OBJECT.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNoMethodErrorClass()) {
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().typeErrorNoImplicitConversion(object, "String", this));
} else {
Original file line number Diff line number Diff line change
@@ -18,11 +18,11 @@
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.core.BasicObjectNodes;
import org.jruby.truffle.nodes.dispatch.CallDispatchHeadNode;
import org.jruby.truffle.nodes.dispatch.DispatchHeadNodeFactory;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.layouts.Layouts;

/**
* Take a Symbol or some object accepting #to_str
@@ -57,7 +57,7 @@ public DynamicObject coerceObject(VirtualFrame frame, Object object) {
try {
coerced = toStr.call(frame, object, "to_str", null);
} catch (RaiseException e) {
if (BasicObjectNodes.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNoMethodErrorClass()) {
if (Layouts.BASIC_OBJECT.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNoMethodErrorClass()) {
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().typeErrorNoImplicitConversion(object, "String", this));
} else {
Original file line number Diff line number Diff line change
@@ -17,11 +17,11 @@
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.core.BasicObjectNodes;
import org.jruby.truffle.nodes.dispatch.CallDispatchHeadNode;
import org.jruby.truffle.nodes.dispatch.DispatchHeadNodeFactory;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.layouts.Layouts;


@NodeChild(value = "child", type = RubyNode.class)
@@ -50,7 +50,7 @@ public DynamicObject coerceObject(VirtualFrame frame, Object object) {
try {
coerced = toAryNode.call(frame, object, "to_ary", null);
} catch (RaiseException e) {
if (BasicObjectNodes.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNoMethodErrorClass()) {
if (Layouts.BASIC_OBJECT.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNoMethodErrorClass()) {
CompilerDirectives.transferToInterpreter();

throw new RaiseException(
Original file line number Diff line number Diff line change
@@ -17,11 +17,11 @@
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.core.BasicObjectNodes;
import org.jruby.truffle.nodes.dispatch.CallDispatchHeadNode;
import org.jruby.truffle.nodes.dispatch.DispatchHeadNodeFactory;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.layouts.Layouts;

@NodeChild(value = "child", type = RubyNode.class)
public abstract class ToFNode extends RubyNode {
@@ -81,7 +81,7 @@ private double coerceObject(VirtualFrame frame, Object object) {
try {
coerced = toFNode.call(frame, object, "to_f", null);
} catch (RaiseException e) {
if (BasicObjectNodes.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNoMethodErrorClass()) {
if (Layouts.BASIC_OBJECT.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNoMethodErrorClass()) {
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().typeErrorNoImplicitConversion(object, "Float", this));
} else {
Original file line number Diff line number Diff line change
@@ -19,13 +19,13 @@
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.core.BasicObjectNodes;
import org.jruby.truffle.nodes.core.FloatNodes;
import org.jruby.truffle.nodes.core.FloatNodesFactory;
import org.jruby.truffle.nodes.dispatch.CallDispatchHeadNode;
import org.jruby.truffle.nodes.dispatch.DispatchHeadNodeFactory;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.layouts.Layouts;

@NodeChild(value = "child", type = RubyNode.class)
public abstract class ToIntNode extends RubyNode {
@@ -101,7 +101,7 @@ private Object coerceObject(VirtualFrame frame, Object object) {
try {
coerced = toIntNode.call(frame, object, "to_int", null);
} catch (RaiseException e) {
if (BasicObjectNodes.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNoMethodErrorClass()) {
if (Layouts.BASIC_OBJECT.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNoMethodErrorClass()) {
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().typeErrorNoImplicitConversion(object, "Integer", this));
} else {
Original file line number Diff line number Diff line change
@@ -18,11 +18,11 @@
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.core.BasicObjectNodes;
import org.jruby.truffle.nodes.dispatch.CallDispatchHeadNode;
import org.jruby.truffle.nodes.dispatch.DispatchHeadNodeFactory;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.layouts.Layouts;

@NodeChild(value = "child", type = RubyNode.class)
public abstract class ToStrNode extends RubyNode {
@@ -48,7 +48,7 @@ public DynamicObject coerceObject(VirtualFrame frame, Object object) {
try {
coerced = toStrNode.call(frame, object, "to_str", null);
} catch (RaiseException e) {
if (BasicObjectNodes.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNoMethodErrorClass()) {
if (Layouts.BASIC_OBJECT.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNoMethodErrorClass()) {
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().typeErrorNoImplicitConversion(object, "String", this));
} else {
Original file line number Diff line number Diff line change
@@ -13,11 +13,11 @@
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.core.BasicObjectNodes;
import org.jruby.truffle.runtime.LexicalScope;
import org.jruby.truffle.runtime.RubyConstant;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.layouts.Layouts;

public class ReadConstantWithLexicalScopeNode extends RubyNode implements RestartableReadConstantNode {

@@ -53,7 +53,7 @@ public Object isDefined(VirtualFrame frame) {
try {
constant = lookupConstantNode.executeLookupConstant(frame);
} catch (RaiseException e) {
if (BasicObjectNodes.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNameErrorClass()) {
if (Layouts.BASIC_OBJECT.getLogicalClass(((DynamicObject) e.getRubyException())) == getContext().getCoreLibrary().getNameErrorClass()) {
// private constant
return nil();
}
Original file line number Diff line number Diff line change
@@ -13,11 +13,11 @@
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.core.BasicObjectNodes;
import org.jruby.truffle.nodes.literal.LiteralNode;
import org.jruby.truffle.runtime.RubyConstant;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.layouts.Layouts;

public class ReadLiteralConstantNode extends RubyNode {

@@ -48,7 +48,7 @@ public Object isDefined(VirtualFrame frame) {
*
* We should maybe try to see if receiver.isDefined() but we also need its value if it is,
* and we do not want to execute receiver twice. */
if (BasicObjectNodes.getLogicalClass(((DynamicObject) e.getRubyException())) == context.getCoreLibrary().getNameErrorClass()) {
if (Layouts.BASIC_OBJECT.getLogicalClass(((DynamicObject) e.getRubyException())) == context.getCoreLibrary().getNameErrorClass()) {
return nil();
}
throw e;
@@ -58,10 +58,10 @@ public Object isDefined(VirtualFrame frame) {
try {
constant = readConstantNode.lookupConstantNode.executeLookupConstant(frame, module, name);
} catch (RaiseException e) {
if (BasicObjectNodes.getLogicalClass(((DynamicObject) e.getRubyException())) == context.getCoreLibrary().getTypeErrorClass()) {
if (Layouts.BASIC_OBJECT.getLogicalClass(((DynamicObject) e.getRubyException())) == context.getCoreLibrary().getTypeErrorClass()) {
// module is not a class/module
return nil();
} else if (BasicObjectNodes.getLogicalClass(((DynamicObject) e.getRubyException())) == context.getCoreLibrary().getNameErrorClass()) {
} else if (Layouts.BASIC_OBJECT.getLogicalClass(((DynamicObject) e.getRubyException())) == context.getCoreLibrary().getNameErrorClass()) {
// private constant
return nil();
}
Original file line number Diff line number Diff line change
@@ -21,8 +21,6 @@
import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.cast.BooleanCastNodeGen;
import org.jruby.truffle.nodes.core.array.ArrayNodes;
import org.jruby.truffle.nodes.core.hash.HashNodes;
import org.jruby.truffle.nodes.dispatch.*;
import org.jruby.truffle.nodes.methods.UnsupportedOperationBehavior;
import org.jruby.truffle.nodes.objects.AllocateObjectNode;
@@ -32,7 +30,6 @@
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.truffle.runtime.subsystems.ObjectSpaceManager;

import java.util.LinkedHashMap;
import java.util.List;
@@ -41,152 +38,6 @@
@CoreClass(name = "BasicObject")
public abstract class BasicObjectNodes {

public static final HiddenKey OBJECT_ID_IDENTIFIER = new HiddenKey("object_id");
public static final HiddenKey TAINTED_IDENTIFIER = new HiddenKey("tainted?");
public static final HiddenKey FROZEN_IDENTIFIER = new HiddenKey("frozen?");

@CompilerDirectives.TruffleBoundary
public static void setInstanceVariable(DynamicObject receiver, Object name, Object value) {
Shape shape = receiver.getShape();
Property property = shape.getProperty(name);
if (property != null) {
property.setGeneric(receiver, value, null);
} else {
receiver.define(name, value, 0);
}
}

@CompilerDirectives.TruffleBoundary
public static void setInstanceVariables(DynamicObject receiver, Map<Object, Object> instanceVariables) {
for (Map.Entry<Object, Object> entry : instanceVariables.entrySet()) {
setInstanceVariable(receiver, entry.getKey(), entry.getValue());
}
}

@CompilerDirectives.TruffleBoundary
public static Object getInstanceVariable2(DynamicObject receiver, Object name) {
Shape shape = receiver.getShape();
Property property = shape.getProperty(name);
if (property != null) {
return property.get(receiver, false);
} else {
return getContext(receiver).getCoreLibrary().getNilObject();
}
}

@CompilerDirectives.TruffleBoundary
public static Map<Object, Object> getInstanceVariables(DynamicObject receiver) {
Shape shape = receiver.getShape();
Map<Object, Object> vars = new LinkedHashMap<>();
List<Property> properties = shape.getPropertyList();
for (Property property : properties) {
vars.put((String) property.getKey(), property.get(receiver, false));
}
return vars;
}

@CompilerDirectives.TruffleBoundary
public static Object[] getFieldNames(DynamicObject receiver) {
List<Object> keys = receiver.getShape().getKeyList();
return keys.toArray(new Object[keys.size()]);
}

@CompilerDirectives.TruffleBoundary
public static boolean isFieldDefined(DynamicObject receiver, String name) {
return receiver.getShape().hasProperty(name);
}

@CompilerDirectives.TruffleBoundary
public static long verySlowGetObjectID(DynamicObject object) {
// TODO(CS): we should specialise on reading this in the #object_id method and anywhere else it's used
Property property = object.getShape().getProperty(OBJECT_ID_IDENTIFIER);

if (property != null) {
return (long) property.get(object, false);
}

final long objectID = getContext(object).getNextObjectID();
object.define(OBJECT_ID_IDENTIFIER, objectID, 0);
return objectID;
}

public static Object getInstanceVariable(DynamicObject object, String name) {
final Object value = getInstanceVariable2(object, name);

if (value == null) {
return getContext(object).getCoreLibrary().getNilObject();
} else {
return value;
}
}

public static void visitObjectGraph(DynamicObject object, ObjectSpaceManager.ObjectGraphVisitor visitor) {
if (visitor.visit(object)) {
visitObjectGraph(Layouts.BASIC_OBJECT.getMetaClass(object), visitor);

for (Object instanceVariable : getInstanceVariables(object).values()) {
if (instanceVariable instanceof DynamicObject) {
visitObjectGraph(((DynamicObject) instanceVariable), visitor);
}
}

visitObjectGraphChildren(object, visitor);
}
}

public static void visitObjectGraphChildren(DynamicObject rubyBasicObject, ObjectSpaceManager.ObjectGraphVisitor visitor) {
if (RubyGuards.isRubyArray(rubyBasicObject)) {
for (Object object : ArrayNodes.slowToArray(rubyBasicObject)) {
if (object instanceof DynamicObject) {
visitObjectGraph(((DynamicObject) object), visitor);
}
}
} else if (RubyGuards.isRubyHash(rubyBasicObject)) {
for (Map.Entry<Object, Object> keyValue : HashNodes.iterableKeyValues(rubyBasicObject)) {
if (keyValue.getKey() instanceof DynamicObject) {
visitObjectGraph(((DynamicObject) keyValue.getKey()), visitor);
}

if (keyValue.getValue() instanceof DynamicObject) {
visitObjectGraph(((DynamicObject) keyValue.getValue()), visitor);
}
}
} else if (RubyGuards.isRubyBinding(rubyBasicObject)) {
getContext(rubyBasicObject).getObjectSpaceManager().visitFrame(Layouts.BINDING.getFrame(rubyBasicObject), visitor);
} else if (RubyGuards.isRubyProc(rubyBasicObject)) {
getContext(rubyBasicObject).getObjectSpaceManager().visitFrame(Layouts.PROC.getDeclarationFrame(rubyBasicObject), visitor);
} else if (RubyGuards.isRubyMatchData(rubyBasicObject)) {
for (Object object : Layouts.MATCH_DATA.getFields(rubyBasicObject).values) {
if (object instanceof DynamicObject) {
visitObjectGraph(((DynamicObject) object), visitor);
}
}
} else if (RubyGuards.isObjectRange(rubyBasicObject)) {
if (Layouts.OBJECT_RANGE.getBegin(rubyBasicObject) instanceof DynamicObject) {
visitObjectGraph(((DynamicObject) Layouts.OBJECT_RANGE.getBegin(rubyBasicObject)), visitor);
}

if (Layouts.OBJECT_RANGE.getEnd(rubyBasicObject) instanceof DynamicObject) {
visitObjectGraph(((DynamicObject) Layouts.OBJECT_RANGE.getEnd(rubyBasicObject)), visitor);
}
} else if (RubyGuards.isRubyModule(rubyBasicObject)) {
Layouts.MODULE.getFields(rubyBasicObject).visitObjectGraphChildren(visitor);
}
}

@CompilerDirectives.TruffleBoundary
public static RubyContext getContext(DynamicObject rubyBasicObject) {
if (RubyGuards.isRubyModule(rubyBasicObject)) {
return Layouts.MODULE.getFields(rubyBasicObject).getContext();
} else {
return getContext(getLogicalClass(rubyBasicObject));
}
}

public static DynamicObject getLogicalClass(DynamicObject rubyBasicObject) {
return Layouts.BASIC_OBJECT.getLogicalClass(rubyBasicObject);
}

@CoreMethod(names = "!")
public abstract static class NotNode extends UnaryCoreMethodNode {

Loading