@Override public DynamicObject execute(VirtualFrame frame) { CompilerDirectives.transferToInterpreter(); final Object receiverObject = receiver.execute(frame); final InternalMethod methodObject = (InternalMethod) methodNode.execute(frame); final DynamicObject module = (DynamicObject) receiverObject; assert RubyGuards.isRubyModule(module); final Visibility visibility = getVisibility(frame, methodObject.getName()); final InternalMethod method = methodObject.withDeclaringModule(module).withVisibility(visibility); if (method.getVisibility() == Visibility.MODULE_FUNCTION) { Layouts.MODULE.getFields(module).addMethod(this, method.withVisibility(Visibility.PRIVATE)); Layouts.MODULE .getFields(singletonClassNode.executeSingletonClass(module)) .addMethod(this, method.withVisibility(Visibility.PUBLIC)); } else { Layouts.MODULE.getFields(module).addMethod(this, method); } return getSymbol(method.getName()); }
@Override public RubySymbol execute(VirtualFrame frame) { notDesignedForCompilation(); final Object receiverObject = receiver.execute(frame); final RubyMethod methodObject = (RubyMethod) method.execute(frame); RubyModule module; if (receiverObject instanceof RubyModule) { module = (RubyModule) receiverObject; } else { module = ((RubyBasicObject) receiverObject).getSingletonClass(this); } final RubyMethod methodWithDeclaringModule = methodObject.withDeclaringModule(module); if (moduleFunctionFlag(frame)) { module.addMethod(this, methodWithDeclaringModule.withVisibility(Visibility.PRIVATE)); module .getSingletonClass(this) .addMethod(this, methodWithDeclaringModule.withVisibility(Visibility.PUBLIC)); } else { module.addMethod(this, methodWithDeclaringModule); } return getContext().newSymbol(method.getName()); }