Skip to content

Commit

Permalink
Showing 1 changed file with 11 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@
*/
package org.jruby.truffle.language.methods;

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.NodeChildren;
@@ -39,7 +40,6 @@ public AddMethodNode(RubyContext context, SourceSection sourceSection, boolean i
super(context, sourceSection);
this.ignoreNameVisibility = ignoreNameVisibility;
this.isLiteralDef = isLiteralDef;
this.singletonClassNode = SingletonClassNodeGen.create(context, sourceSection, null);
}

public abstract DynamicObject executeAddMethod(DynamicObject module, InternalMethod method, Visibility visibility);
@@ -59,7 +59,7 @@ public DynamicObject addMethod(DynamicObject module, InternalMethod method, Visi

if (visibility == Visibility.MODULE_FUNCTION) {
addMethodToModule(module, method.withVisibility(Visibility.PRIVATE));
final DynamicObject singletonClass = singletonClassNode.executeSingletonClass(module);
final DynamicObject singletonClass = getSingletonClass(module);
addMethodToModule(singletonClass, method.withDeclaringModule(singletonClass).withVisibility(Visibility.PUBLIC));
} else {
addMethodToModule(module, method);
@@ -72,4 +72,13 @@ public void addMethodToModule(final DynamicObject module, InternalMethod method)
Layouts.MODULE.getFields(module).addMethod(getContext(), this, method);
}

protected DynamicObject getSingletonClass(DynamicObject object) {
if (singletonClassNode == null) {
CompilerDirectives.transferToInterpreter();
singletonClassNode = insert(SingletonClassNodeGen.create(getContext(), getSourceSection(), null));
}

return singletonClassNode.executeSingletonClass(object);
}

}

0 comments on commit c042cf7

Please sign in to comment.