@TruffleBoundary
 protected InternalMethod doLookup(InternalMethod currentMethod, DynamicObject selfMetaClass) {
   assert RubyGuards.isRubyClass(selfMetaClass);
   InternalMethod superMethod = ModuleOperations.lookupSuperMethod(currentMethod, selfMetaClass);
   // TODO (eregon, 12 June 2015): Is this correct?
   if (superMethod != null && superMethod.isUndefined()) {
     superMethod = null;
   }
   return superMethod;
 }
 @Override
 public String toString() {
   return String.format(
       "CachedBoxedDispatchNode(:%s, %s@%x, %s)",
       getCachedNameAsSymbol().toString(),
       expectedReceiver,
       expectedReceiver.hashCode(),
       method == null ? "null" : method.toString());
 }
  @Override
  public Object execute(VirtualFrame frame) {
    final DynamicObject module = (DynamicObject) definingModule.execute(frame);
    final InternalMethod definition =
        prepareLexicalScope(module, definitionMethod.executeMethod(frame));

    return callModuleDefinitionNode.call(
        frame,
        definition.getCallTarget(),
        RubyArguments.pack(
            null,
            null,
            definition,
            DeclarationContext.MODULE,
            null,
            module,
            null,
            new Object[] {}));
  }
  public CachedSingletonDispatchNode(
      RubyContext context,
      Object cachedName,
      DispatchNode next,
      DynamicObject expectedReceiver,
      DynamicObject expectedClass,
      InternalMethod method,
      DispatchAction dispatchAction) {
    super(context, cachedName, next, dispatchAction);

    this.expectedReceiver = expectedReceiver;
    this.unmodifiedAssumption = Layouts.MODULE.getFields(expectedClass).getUnmodifiedAssumption();
    this.next = next;
    this.method = method;
    this.callNode = Truffle.getRuntime().createDirectCallNode(method.getCallTarget());
    applySplittingInliningStrategy(callNode, method);
  }
 @TruffleBoundary
 private InternalMethod prepareLexicalScope(DynamicObject module, InternalMethod definition) {
   lexicalScope.unsafeSetLiveModule(module);
   Layouts.MODULE.getFields(lexicalScope.getParent().getLiveModule()).addLexicalDependent(module);
   return definition.withDeclaringModule(module);
 }