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: 6bc438e72a4e
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 06f447e77e7f
Choose a head ref
  • 2 commits
  • 3 files changed
  • 1 contributor

Commits on Aug 24, 2016

  1. 2
    Copy the full SHA
    b26c886 View commit details
  2. Copy the full SHA
    06f447e View commit details
10 changes: 9 additions & 1 deletion truffle/src/main/java/org/jruby/truffle/core/CoreLibrary.java
Original file line number Diff line number Diff line change
@@ -788,7 +788,15 @@ public void addCoreMethods(PrimitiveManager primitiveManager) {
});
}

ForkJoinPool.commonPool().invokeAll(tasks);
for (Future<Void> future : ForkJoinPool.commonPool().invokeAll(tasks)) {
try {
future.get();
} catch (InterruptedException e) {
throw new JavaException(e);
} catch (ExecutionException e) {
throw new JavaException(e.getCause());
}
}

coreMethodNodeManager.allMethodInstalled();

19 changes: 12 additions & 7 deletions truffle/src/main/java/org/jruby/truffle/core/klass/ClassNodes.java
Original file line number Diff line number Diff line change
@@ -213,19 +213,23 @@ public static DynamicObject getSingletonClass(RubyContext context, DynamicObject
}

public static DynamicObject getSingletonClassOrNull(RubyContext context, DynamicObject rubyClass) {
if (Layouts.CLASS.getIsSingleton(Layouts.BASIC_OBJECT.getMetaClass(rubyClass))) {
return ensureItHasSingletonClassCreated(context, Layouts.BASIC_OBJECT.getMetaClass(rubyClass));
DynamicObject metaClass = Layouts.BASIC_OBJECT.getMetaClass(rubyClass);
if (Layouts.CLASS.getIsSingleton(metaClass)) {
return ensureItHasSingletonClassCreated(context, metaClass);
} else {
return null;
}
}

private static DynamicObject getLazyCreatedSingletonClass(RubyContext context, DynamicObject rubyClass) {
if (Layouts.CLASS.getIsSingleton(Layouts.BASIC_OBJECT.getMetaClass(rubyClass))) {
return Layouts.BASIC_OBJECT.getMetaClass(rubyClass);
}
synchronized (rubyClass) {
DynamicObject metaClass = Layouts.BASIC_OBJECT.getMetaClass(rubyClass);
if (Layouts.CLASS.getIsSingleton(metaClass)) {
return metaClass;
}

return createSingletonClass(context, rubyClass);
return createSingletonClass(context, rubyClass);
}
}

@TruffleBoundary
@@ -238,7 +242,8 @@ private static DynamicObject createSingletonClass(RubyContext context, DynamicOb
}

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

return Layouts.BASIC_OBJECT.getMetaClass(rubyClass);
}
Original file line number Diff line number Diff line change
@@ -139,25 +139,27 @@ protected DynamicObject getSingletonClassOrNull(DynamicObject object) {

@TruffleBoundary
protected DynamicObject getSingletonClassForInstance(DynamicObject object) {
if (Layouts.CLASS.getIsSingleton(Layouts.BASIC_OBJECT.getMetaClass(object))) {
return Layouts.BASIC_OBJECT.getMetaClass(object);
}

final DynamicObject logicalClass = Layouts.BASIC_OBJECT.getLogicalClass(object);
synchronized (object) {
DynamicObject metaClass = Layouts.BASIC_OBJECT.getMetaClass(object);
if (Layouts.CLASS.getIsSingleton(metaClass)) {
return metaClass;
}

final String name = StringUtils.format("#<Class:#<%s:0x%x>>", Layouts.MODULE.getFields(logicalClass).getName(),
ObjectIDOperations.verySlowGetObjectID(getContext(), object));
final DynamicObject logicalClass = Layouts.BASIC_OBJECT.getLogicalClass(object);

final DynamicObject singletonClass = ClassNodes.createSingletonClassOfObject(
getContext(), logicalClass, object, name);
final String name = StringUtils.format("#<Class:#<%s:0x%x>>", Layouts.MODULE.getFields(logicalClass).getName(),
ObjectIDOperations.verySlowGetObjectID(getContext(), object));

if (isFrozen(object)) {
freeze(singletonClass);
}
final DynamicObject singletonClass = ClassNodes.createSingletonClassOfObject(
getContext(), logicalClass, object, name);

Layouts.BASIC_OBJECT.setMetaClass(object, singletonClass);
if (isFrozen(object)) {
freeze(singletonClass);
}

return singletonClass;
Layouts.BASIC_OBJECT.setMetaClass(object, singletonClass);
return singletonClass;
}
}

public void freeze(final DynamicObject singletonClass) {