changeset 5838:610f9e377c70

Merge
author Gilles Duboscq <duboscq@ssw.jku.at>
date Mon, 16 Jul 2012 11:07:07 +0200
parents 5fcd8ae3e64a (current diff) 0095a9c235c6 (diff)
children a9ce56ad1860 421e767d8038
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java
diffstat 20 files changed, 123 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Mon Jul 16 11:07:07 2012 +0200
@@ -50,6 +50,11 @@
     static final int INITIAL_ID = -1;
     static final int ALIVE_ID_START = 0;
 
+    /**
+     * Denotes a node input. This should be applied to exactly the fields of a node that are of type {@link Node}.
+     * Nodes that update their inputs outside of their constructor should call {@link Node#updateUsages(Node, Node)}
+     * just prior to doing the update of the input.
+     */
     @Retention(RetentionPolicy.RUNTIME)
     @Target(ElementType.FIELD)
     public static @interface Input {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Mon Jul 16 11:07:07 2012 +0200
@@ -46,6 +46,7 @@
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.extended.*;
 import com.oracle.graal.nodes.java.*;
+import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
 import com.oracle.graal.snippets.*;
@@ -231,6 +232,42 @@
             ArrayLengthNode arrayLengthNode = (ArrayLengthNode) n;
             SafeReadNode safeReadArrayLength = safeReadArrayLength(arrayLengthNode.array(), StructuredGraph.INVALID_GRAPH_ID);
             graph.replaceFixedWithFixed(arrayLengthNode, safeReadArrayLength);
+        } else if (n instanceof Invoke) {
+            if (!GraalOptions.XIRLowerInvokes) {
+                Invoke invoke = (Invoke) n;
+                MethodCallTargetNode callTarget = invoke.callTarget();
+                NodeInputList<ValueNode> parameters = callTarget.arguments();
+                ValueNode receiver = parameters.size() <= 0 ? null : parameters.get(0);
+                if (!callTarget.isStatic() && receiver.kind() == Kind.Object && !receiver.objectStamp().nonNull()) {
+                    invoke.node().dependencies().add(tool.createNullCheckGuard(receiver, invoke.leafGraphId()));
+                }
+
+                if (callTarget.invokeKind() == InvokeKind.Virtual &&
+                    GraalOptions.InlineVTableStubs &&
+                    (GraalOptions.AlwaysInlineVTableStubs || invoke.isMegamorphic())) {
+
+                    // TODO (dnsimon) I'm not sure of other invariants of HotSpot's calling conventions that may
+                    // be required for register indirect calls.
+                    assert false : "HotSpot expects the methodOop of the callee to be in rbx - this is yet to be implemented for inline vtable dispatch";
+
+                    // TODO: successive inlined invokevirtuals to the same method cause register allocation to fail - fix this!
+                    HotSpotResolvedJavaMethod hsMethod = (HotSpotResolvedJavaMethod) callTarget.targetMethod();
+                    if (!hsMethod.holder().isInterface()) {
+                        int vtableEntryOffset = hsMethod.vtableEntryOffset();
+                        assert vtableEntryOffset != 0;
+                        SafeReadNode hub = safeReadHub(graph, receiver, StructuredGraph.INVALID_GRAPH_ID);
+                        Kind wordKind = graalRuntime.getTarget().wordKind;
+                        Stamp nonNullWordStamp = StampFactory.forWord(wordKind, true);
+                        ReadNode methodOop = graph.add(new ReadNode(hub, LocationNode.create(LocationNode.ANY_LOCATION, wordKind, vtableEntryOffset, graph), nonNullWordStamp));
+                        ReadNode compiledEntry = graph.add(new ReadNode(methodOop, LocationNode.create(LocationNode.ANY_LOCATION, wordKind, config.methodCompiledEntryOffset, graph), nonNullWordStamp));
+                        callTarget.setAddress(compiledEntry);
+
+                        graph.addBeforeFixed(invoke.node(), hub);
+                        graph.addAfterFixed(hub, methodOop);
+                        graph.addAfterFixed(methodOop, compiledEntry);
+                    }
+                }
+            }
         } else if (n instanceof LoadFieldNode) {
             LoadFieldNode field = (LoadFieldNode) n;
             int displacement = ((HotSpotResolvedJavaField) field.field()).offset();
@@ -366,15 +403,15 @@
             memoryRead.dependencies().add(tool.createNullCheckGuard(objectClassNode.object(), StructuredGraph.INVALID_GRAPH_ID));
             graph.replaceFixed(objectClassNode, memoryRead);
         } else if (n instanceof CheckCastNode) {
-            if (shouldLower(graph, GraalOptions.HIRLowerCheckcast)) {
+            if (matches(graph, GraalOptions.HIRLowerCheckcast)) {
                 checkcastSnippets.lower((CheckCastNode) n, tool);
             }
         } else if (n instanceof NewInstanceNode) {
-            if (shouldLower(graph, GraalOptions.HIRLowerNewInstance)) {
+            if (matches(graph, GraalOptions.HIRLowerNewInstance)) {
                 newObjectSnippets.lower((NewInstanceNode) n, tool);
             }
         } else if (n instanceof NewArrayNode) {
-            if (shouldLower(graph, GraalOptions.HIRLowerNewArray)) {
+            if (matches(graph, GraalOptions.HIRLowerNewArray)) {
                 newObjectSnippets.lower((NewArrayNode) n, tool);
             }
         } else if (n instanceof TLABAllocateNode) {
@@ -388,13 +425,13 @@
         }
     }
 
-    private static boolean shouldLower(StructuredGraph graph, String option) {
-        if (option != null) {
-            if (option.length() == 0) {
+    private static boolean matches(StructuredGraph graph, String filter) {
+        if (filter != null) {
+            if (filter.length() == 0) {
                 return true;
             }
             ResolvedJavaMethod method = graph.method();
-            return method != null && MetaUtil.format("%H.%n", method).contains(option);
+            return method != null && MetaUtil.format("%H.%n", method).contains(filter);
         }
         return false;
     }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotXirGenerator.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotXirGenerator.java	Mon Jul 16 11:07:07 2012 +0200
@@ -62,6 +62,7 @@
     public static final Integer MARK_INVOKESTATIC              = 0x2002;
     public static final Integer MARK_INVOKESPECIAL             = 0x2003;
     public static final Integer MARK_INVOKEVIRTUAL             = 0x2004;
+    public static final Integer MARK_INLINE_INVOKEVIRTUAL      = 0x2005;
 
     public static final Integer MARK_IMPLICIT_NULL             = 0x3000;
     public static final Integer MARK_POLL_NEAR                 = 0x3001;
@@ -167,7 +168,7 @@
             // load entry point from methodOop
             asm.mark(MARK_IMPLICIT_NULL);
             asm.pload(target.wordKind, temp, method, asm.i(config.methodCompiledEntryOffset), true);
-            asm.mark(MARK_INVOKEVIRTUAL);
+            asm.mark(MARK_INLINE_INVOKEVIRTUAL);
 
             return asm.finishTemplate(temp, "invokevirtual");
         }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VerifyOopStubCall.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VerifyOopStubCall.java	Mon Jul 16 11:07:07 2012 +0200
@@ -52,7 +52,7 @@
         RegisterValue objectFixed = OBJECT.asValue(Kind.Object);
         gen.emitMove(gen.operand(object), objectFixed);
         LIRFrameState info = gen.state();
-        gen.append(new AMD64VerifyOopStubCallOp(gen.operand(object), info));
+        gen.append(new AMD64VerifyOopStubCallOp(objectFixed, info));
     }
 
     @SuppressWarnings("unused")
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotAMD64Backend.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotAMD64Backend.java	Mon Jul 16 11:07:07 2012 +0200
@@ -145,9 +145,13 @@
                         // that loads the klassOop from the inline cache so that the C++ code can find it
                         // and replace the inline null value with Universe::non_oop_word()
                         assert invokeKind == Virtual || invokeKind == Interface;
-                        tasm.recordMark(invokeKind == Virtual ? MARK_INVOKEVIRTUAL : MARK_INVOKEINTERFACE);
-                        AMD64MacroAssembler masm = (AMD64MacroAssembler) tasm.asm;
-                        AMD64Move.move(tasm, masm, AMD64.rax.asValue(Kind.Object), Constant.NULL_OBJECT);
+                        if (callTarget.address() == null) {
+                            tasm.recordMark(invokeKind == Virtual ? MARK_INVOKEVIRTUAL : MARK_INVOKEINTERFACE);
+                            AMD64MacroAssembler masm = (AMD64MacroAssembler) tasm.asm;
+                            AMD64Move.move(tasm, masm, AMD64.rax.asValue(Kind.Object), Constant.NULL_OBJECT);
+                        } else {
+                            tasm.recordMark(MARK_INLINE_INVOKEVIRTUAL);
+                        }
                     }
                 }
                 public void atCall(TargetMethodAssembler tasm) {
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Call.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Call.java	Mon Jul 16 11:07:07 2012 +0200
@@ -80,7 +80,10 @@
 
         @Override
         public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) {
-            callAlignment(tasm, masm, callPositionListener);
+            if (callPositionListener != null) {
+                callPositionListener.beforeCall(tasm);
+                callPositionListener.atCall(tasm);
+            }
             indirectCall(tasm, masm, asRegister(targetAddress), targetMethod, state);
         }
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java	Mon Jul 16 11:07:07 2012 +0200
@@ -38,6 +38,7 @@
     }
 
     public void setAddress(ValueNode address) {
+        updateUsages(this.address, address);
         this.address = address;
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java	Mon Jul 16 11:07:07 2012 +0200
@@ -97,11 +97,7 @@
 
     @Override
     public void lower(LoweringTool tool) {
-        NodeInputList<ValueNode> parameters = callTarget.arguments();
-        ValueNode firstParam = parameters.size() <= 0 ? null : parameters.get(0);
-        if (!callTarget.isStatic() && firstParam.kind() == Kind.Object && !firstParam.objectStamp().nonNull()) {
-            dependencies().add(tool.createNullCheckGuard(firstParam, leafGraphId));
-        }
+        tool.getRuntime().lower(this, tool);
     }
 
     @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java	Mon Jul 16 11:07:07 2012 +0200
@@ -128,11 +128,7 @@
 
     @Override
     public void lower(LoweringTool tool) {
-        NodeInputList<ValueNode> parameters = callTarget.arguments();
-        ValueNode firstParam = parameters.size() <= 0 ? null : parameters.get(0);
-        if (!callTarget.isStatic() && firstParam.kind() == Kind.Object && !firstParam.objectStamp().nonNull()) {
-            dependencies().add(tool.createNullCheckGuard(firstParam, leafGraphId));
-        }
+        tool.getRuntime().lower(this, tool);
     }
 
     @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java	Mon Jul 16 11:07:07 2012 +0200
@@ -45,7 +45,7 @@
      */
     public IsNullNode(ValueNode object) {
         super(StampFactory.condition());
-        assert object.kind() == Kind.Object : object.kind();
+        assert object.kind() == Kind.Object : object;
         this.object = object;
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java	Mon Jul 16 11:07:07 2012 +0200
@@ -26,6 +26,11 @@
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.type.*;
 
+/**
+ * Accesses a value at an memory address specified by an {@linkplain #object object}
+ * and a {@linkplain #location() location}. The access does not include a null check
+ * on the object.
+ */
 public abstract class AccessNode extends FixedWithNextNode implements Access {
 
     @Input private ValueNode object;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java	Mon Jul 16 11:07:07 2012 +0200
@@ -40,12 +40,20 @@
     private Kind valueKind;
     private Object locationIdentity;
 
+    /**
+     * Denotes any location. A write to such a location kills all values in a memory map
+     * during an analysis of memory accesses in a graph.
+     */
     public static final Object ANY_LOCATION = new Object() {
         @Override
         public String toString() {
             return "ANY_LOCATION";
         }
     };
+
+    /**
+     * Denotes the location of a value that is guaranteed to be final.
+     */
     public static final Object FINAL_LOCATION = new Object() {
         @Override
         public String toString() {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java	Mon Jul 16 11:07:07 2012 +0200
@@ -28,7 +28,9 @@
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
 
-
+/**
+ * Reads an {@linkplain AccessNode accessed} value.
+ */
 public final class ReadNode extends AccessNode implements Node.IterableNodeType, LIRLowerable/*, Canonicalizable*/ {
 
     public ReadNode(ValueNode object, LocationNode location, Stamp stamp) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java	Mon Jul 16 11:07:07 2012 +0200
@@ -26,6 +26,10 @@
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
 
+/**
+ * An analog to {@link ReadNode} with the additional semantics of null-checking
+ * the receiver object before reading from it.
+ */
 public class SafeReadNode extends SafeAccessNode implements Lowerable {
 
     public SafeReadNode(ValueNode object, LocationNode location, Stamp stamp, long leafGraphId) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java	Mon Jul 16 11:07:07 2012 +0200
@@ -26,6 +26,10 @@
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
 
+/**
+ * An analog to {@link WriteNode} with the additional semantics of null-checking
+ * the receiver object before writing to it.
+ */
 public class SafeWriteNode extends SafeAccessNode implements StateSplit, Lowerable {
 
     @Input private ValueNode value;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java	Mon Jul 16 11:04:32 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java	Mon Jul 16 11:07:07 2012 +0200
@@ -27,6 +27,9 @@
 import com.oracle.graal.nodes.type.*;
 
 
+/**
+ * Writes a given {@linkplain #value() value} a {@linkplain AccessNode memory location}.
+ */
 public final class WriteNode extends AccessNode implements StateSplit, LIRLowerable {
     @Input private ValueNode value;
     @Input(notDataflow = true) private FrameState stateAfter;
--- a/mxtool/mx.py	Mon Jul 16 11:04:32 2012 +0200
+++ b/mxtool/mx.py	Mon Jul 16 11:07:07 2012 +0200
@@ -57,7 +57,8 @@
 
   env
       A set of environment variable definitions. These override any
-      existing environment variables.
+      existing environment variables. Common properties set here
+      include JAVA_HOME and IGNORED_PROJECTS.
 
 The includes and env files are typically not put under version control
 as they usually contain local file-system paths.
@@ -194,7 +195,11 @@
                 if includeLibs and not dep in deps:
                     deps.append(dep)
             else:
-                dep = project(name)
+                dep = _projects.get(name, None)
+                if dep is None:
+                    if name in _opts.ignored_projects:
+                        abort('project named ' + name + ' required by ' + self.name + ' is ignored')
+                    abort('dependency named ' + name + ' required by ' + self.name + ' is not found')
                 if not dep in deps:
                     dep.all_deps(deps, includeLibs)
         if not self in deps and includeSelf:
@@ -449,7 +454,8 @@
             existing = _projects.get(p.name)
             if existing is not None:
                 abort('cannot override project  ' + p.name + ' in ' + p.dir + " with project of the same name in  " + existing.dir)
-            _projects[p.name] = p
+            if not p.name in _opts.ignored_projects:
+                _projects[p.name] = p
         for l in self.libs:
             existing = _libs.get(l.name)
             if existing is not None:
@@ -566,6 +572,8 @@
     """
     p = _projects.get(name)
     if p is None and fatalIfMissing:
+        if name in _opts.ignored_projects:
+            abort('project named ' + name + ' is ignored')
         abort('project named ' + name + ' not found')
     return p
 
@@ -671,6 +679,7 @@
         self.add_argument('--Ja', action='append', dest='java_args_sfx', help='suffix Java VM arguments (e.g. --Ja @-dsa)', metavar='@<args>', default=[])
         self.add_argument('--user-home', help='users home directory', metavar='<path>', default=os.path.expanduser('~'))
         self.add_argument('--java-home', help='JDK installation directory (must be JDK 6 or later)', metavar='<path>')
+        self.add_argument('--ignore-project', action='append', dest='ignored_projects', help='name of project to ignore', metavar='<name>', default=[])
         if get_os() != 'windows':
             # Time outs are (currently) implemented with Unix specific functionality
             self.add_argument('--timeout', help='Timeout (in seconds) for command', type=int, default=0, metavar='<secs>')
@@ -703,6 +712,8 @@
         os.environ['JAVA_HOME'] = opts.java_home
         os.environ['HOME'] = opts.user_home
 
+        opts.ignored_projects = opts.ignored_projects + os.environ.get('IGNORED_PROJECTS', '').split(',')
+
         commandAndArgs = opts.__dict__.pop('commandAndArgs')
         return opts, commandAndArgs
 
@@ -2409,7 +2420,13 @@
     command_args = commandAndArgs[1:]
 
     if not commands.has_key(command):
-        abort('mx: unknown command \'{0}\'\n{1}use "mx help" for more options'.format(command, _format_commands()))
+        hits = [c for c in commands.iterkeys() if c.startswith(command)]
+        if len(hits) == 1:
+            command = hits[0]
+        elif len(hits) == 0:
+            abort('mx: unknown command \'{0}\'\n{1}use "mx help" for more options'.format(command, _format_commands()))
+        else:
+            abort('mx: command \'{0}\' is ambiguous\n    {1}'.format(command, ' '.join(hits)))
 
     c, _ = commands[command][:2]
     def term_handler(signum, frame):
--- a/src/share/vm/c1/c1_Runtime1.cpp	Mon Jul 16 11:04:32 2012 +0200
+++ b/src/share/vm/c1/c1_Runtime1.cpp	Mon Jul 16 11:07:07 2012 +0200
@@ -535,8 +535,9 @@
     if (TraceExceptions) {
       ttyLocker ttyl;
       ResourceMark rm;
-      tty->print_cr("Exception <%s> (0x%x) thrown in compiled method <%s> at PC " PTR_FORMAT " for thread 0x%x",
-                    exception->print_value_string(), (address)exception(), nm->method()->print_value_string(), pc, thread);
+      int offset = pc - nm->code_begin();
+      tty->print_cr("Exception <%s> (0x%x) thrown in compiled method <%s> at PC " PTR_FORMAT " [" PTR_FORMAT "+%d] for thread 0x%x",
+                    exception->print_value_string(), (address)exception(), nm->method()->print_value_string(), pc, nm->code_begin(), offset, thread);
     }
     // for AbortVMOnException flag
     NOT_PRODUCT(Exceptions::debug_check_abort(exception));
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Mon Jul 16 11:04:32 2012 +0200
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Mon Jul 16 11:07:07 2012 +0200
@@ -695,10 +695,10 @@
 
     TRACE_graal_3("method call");
     switch (_next_call_type) {
+      case MARK_INLINE_INVOKEVIRTUAL: {
+        break;
+      }
       case MARK_INVOKEVIRTUAL:
-        if (is_call_reg) {
-          break;
-        }
       case MARK_INVOKEINTERFACE: {
         assert(method == NULL || !method->is_static(), "cannot call static method with invokeinterface");
 
@@ -843,6 +843,7 @@
         // Add relocation record for the klassOop embedded in the inline cache
         _instructions->relocate(instruction, oop_Relocation::spec_for_immediate(), Assembler::imm_operand);
       }
+      case MARK_INLINE_INVOKEVIRTUAL:
       case MARK_INVOKE_INVALID:
       case MARK_INVOKESPECIAL:
       case MARK_INVOKESTATIC:
--- a/src/share/vm/graal/graalCodeInstaller.hpp	Mon Jul 16 11:04:32 2012 +0200
+++ b/src/share/vm/graal/graalCodeInstaller.hpp	Mon Jul 16 11:07:07 2012 +0200
@@ -43,6 +43,7 @@
     MARK_INVOKESTATIC               = 0x2002,
     MARK_INVOKESPECIAL              = 0x2003,
     MARK_INVOKEVIRTUAL              = 0x2004,
+    MARK_INLINE_INVOKEVIRTUAL       = 0x2005,
     MARK_IMPLICIT_NULL              = 0x3000,
     MARK_POLL_NEAR                  = 0x3001,
     MARK_POLL_RETURN_NEAR           = 0x3002,