package som.interpreter.nodes.dispatch;

import som.instrumentation.DispatchNodeWrapper;

import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.instrumentation.Instrumentable;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.source.SourceSection;


@Instrumentable(factory = DispatchNodeWrapper.class)
public abstract class AbstractDispatchNode
    extends Node implements DispatchChain {
  public static final int INLINE_CACHE_SIZE = 6;

  private final SourceSection sourceSection;

  protected AbstractDispatchNode(final SourceSection source) {
    super();
    assert source != null;
    this.sourceSection = source;
  }

  /**
   * For wrapped nodes only.
   */
  protected AbstractDispatchNode(final AbstractDispatchNode wrappedNode) {
    super();
    this.sourceSection = null;
  }

  @Override
  public final SourceSection getSourceSection() {
    return sourceSection;
  }

  public abstract Object executeDispatch(
      final VirtualFrame frame, final Object[] arguments);
}

@@ -83,16 +83,83 @@
 apper;%0A%0A
+import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;%0A
 import c
@@ -357,16 +357,44 @@
 ction;%0A%0A
+import dym.Tagging.Tagged;%0A%0A
 %0A@Instru
@@ -523,16 +523,24 @@
 tchChain
+, Tagged
  %7B%0A  pub
@@ -590,21 +590,33 @@
 %0A%0A  
+@CompilationFinal 
 private
- final
  Sou
@@ -969,22 +969,16 @@
  public 
-final 
 SourceSe
@@ -1035,16 +1035,135 @@
 n;%0A  %7D%0A%0A
+  @Override%0A  public void updateTags(final SourceSection sourceSection) %7B%0A    this.sourceSection = sourceSection;%0A  %7D%0A%0A
   public

Make AbstractDispatchNode implement Tagged