Skip to content

Commit

Permalink
[Truffle] Add helper to check if a class is initialized.
Browse files Browse the repository at this point in the history
  • Loading branch information
eregon committed Sep 6, 2016
1 parent cbdcd2b commit f2b8595
Showing 1 changed file with 8 additions and 4 deletions.
Expand Up @@ -331,12 +331,12 @@ private DynamicObject initializeGeneralWithoutBlock(VirtualFrame frame, DynamicO
assert RubyGuards.isRubyClass(rubyClass);
assert RubyGuards.isRubyClass(superclass);

if (Layouts.CLASS.getSuperclass(rubyClass) != null || rubyClass == coreLibrary().getBasicObjectClass()) {
if (isInitialized(rubyClass)) {
throw new RaiseException(getContext().getCoreExceptions().typeErrorAlreadyInitializedClass(this));
}
if (superClassProvided) {
checkInheritable(superclass);
if (superclass != coreLibrary().getBasicObjectClass() && Layouts.CLASS.getSuperclass(superclass) == null) {
if (!isInitialized(superclass)) {
throw new RaiseException(getContext().getCoreExceptions().typeErrorInheritUninitializedClass(this));
}
}
Expand All @@ -350,12 +350,12 @@ private DynamicObject initializeGeneralWithoutBlock(VirtualFrame frame, DynamicO
private DynamicObject initializeGeneralWithBlock(VirtualFrame frame, DynamicObject rubyClass, DynamicObject superclass, DynamicObject block, boolean superClassProvided) {
assert RubyGuards.isRubyClass(superclass);

if (Layouts.CLASS.getSuperclass(rubyClass) != null || rubyClass == coreLibrary().getBasicObjectClass()) {
if (isInitialized(rubyClass)) {
throw new RaiseException(getContext().getCoreExceptions().typeErrorAlreadyInitializedClass(this));
}
if (superClassProvided) {
checkInheritable(superclass);
if (superclass != coreLibrary().getBasicObjectClass() && Layouts.CLASS.getSuperclass(superclass) == null) {
if (!isInitialized(superclass)) {
throw new RaiseException(getContext().getCoreExceptions().typeErrorInheritUninitializedClass(this));
}
}
Expand All @@ -367,6 +367,10 @@ private DynamicObject initializeGeneralWithBlock(VirtualFrame frame, DynamicObje
return rubyClass;
}

private boolean isInitialized(DynamicObject rubyClass) {
return Layouts.CLASS.getSuperclass(rubyClass) != null || rubyClass == coreLibrary().getBasicObjectClass();
}

// rb_check_inheritable
private void checkInheritable(DynamicObject superClass) {
if (!RubyGuards.isRubyClass(superClass)) {
Expand Down

0 comments on commit f2b8595

Please sign in to comment.