#--- work/sablevm-1.0.6/src/libsablevm/instructions.m4.c.orig	Tue Sep 10 10:35:39 2002
#+++ work/sablevm-1.0.6/src/libsablevm/instructions.m4.c	Mon Dec 16 17:28:28 2002
#@@ -4838,10 +4838,28 @@
# 	  }
# 
# 	  addr[0].jint = methodref_info->method->java_args_count;
#-	  addr[1].offset =
#-	    sizeof (_svmt_vtable) +
#-	    (methodref_info->method->method_id *
#-	     sizeof (_svmt_method_info *));
#+
#+	  /*
#+	   * _svmf_resolve_CONSTANT_Methodref() may return an interface
#+	   * method in certain situations (e.g., invoking an interface
#+	   * method that's implemented in a subclass of an abstract class
#+	   * not implementing the method but implementing the interface).
#+	   */
#+	  if (_svmf_is_set_flag
#+	      (methodref_info->method->class_info->access_flags,
#+	       SVM_ACC_INTERFACE))
#+	    {
#+	      addr[1].offset =
#+		-((1 + methodref_info->method->method_id) *
#+		  sizeof (_svmt_method_info *));
#+	    }
#+	  else
#+	    {
#+	      addr[1].offset =
#+		sizeof (_svmt_vtable) +
#+		(methodref_info->method->method_id *
#+		 sizeof (_svmt_method_info *));
#+	    }
# 
# 	  /* execute bytecode */
# 	  {
--- work/sablevm-1.0.6/src/libsablevm/instructions_preparation_direct_threaded.c.orig	Wed Oct 16 14:54:30 2002
+++ work/sablevm-1.0.6/src/libsablevm/instructions_preparation_direct_threaded.c	Mon Dec 16 17:28:29 2002
@@ -17905,10 +17905,28 @@
 	  }
 
 	  addr[0].jint = methodref_info->method->java_args_count;
-	  addr[1].offset =
-	    sizeof (_svmt_vtable) +
-	    (methodref_info->method->method_id *
-	     sizeof (_svmt_method_info *));
+
+	  /*
+	   * _svmf_resolve_CONSTANT_Methodref() may return an interface
+	   * method in certain situations (e.g., invoking an interface
+	   * method that's implemented in a subclass of an abstract class
+	   * not implementing the method but implementing the interface).
+	   */
+	  if (_svmf_is_set_flag
+	      (methodref_info->method->class_info->access_flags,
+	       SVM_ACC_INTERFACE))
+	    {
+	      addr[1].offset =
+		-((1 + methodref_info->method->method_id) *
+		  sizeof (_svmt_method_info *));
+	    }
+	  else
+	    {
+	      addr[1].offset =
+		sizeof (_svmt_vtable) +
+		(methodref_info->method->method_id *
+		 sizeof (_svmt_method_info *));
+	    }
 
 	  /* execute bytecode */
 	  {
--- work/sablevm-1.0.6/src/libsablevm/instructions_preparation_inlined_threaded.c.orig	Wed Oct 16 14:54:31 2002
+++ work/sablevm-1.0.6/src/libsablevm/instructions_preparation_inlined_threaded.c	Mon Dec 16 17:28:29 2002
@@ -21512,10 +21512,28 @@
 	  }
 
 	  addr[0].jint = methodref_info->method->java_args_count;
-	  addr[1].offset =
-	    sizeof (_svmt_vtable) +
-	    (methodref_info->method->method_id *
-	     sizeof (_svmt_method_info *));
+
+	  /*
+	   * _svmf_resolve_CONSTANT_Methodref() may return an interface
+	   * method in certain situations (e.g., invoking an interface
+	   * method that's implemented in a subclass of an abstract class
+	   * not implementing the method but implementing the interface).
+	   */
+	  if (_svmf_is_set_flag
+	      (methodref_info->method->class_info->access_flags,
+	       SVM_ACC_INTERFACE))
+	    {
+	      addr[1].offset =
+		-((1 + methodref_info->method->method_id) *
+		  sizeof (_svmt_method_info *));
+	    }
+	  else
+	    {
+	      addr[1].offset =
+		sizeof (_svmt_vtable) +
+		(methodref_info->method->method_id *
+		 sizeof (_svmt_method_info *));
+	    }
 
 	  /* execute bytecode */
 	  {
--- work/sablevm-1.0.6/src/libsablevm/instructions_switch.c.orig	Wed Oct 16 14:54:31 2002
+++ work/sablevm-1.0.6/src/libsablevm/instructions_switch.c	Mon Dec 16 17:28:29 2002
@@ -15936,10 +15936,28 @@
 	  }
 
 	  addr[0].jint = methodref_info->method->java_args_count;
-	  addr[1].offset =
-	    sizeof (_svmt_vtable) +
-	    (methodref_info->method->method_id *
-	     sizeof (_svmt_method_info *));
+
+	  /*
+	   * _svmf_resolve_CONSTANT_Methodref() may return an interface
+	   * method in certain situations (e.g., invoking an interface
+	   * method that's implemented in a subclass of an abstract class
+	   * not implementing the method but implementing the interface).
+	   */
+	  if (_svmf_is_set_flag
+	      (methodref_info->method->class_info->access_flags,
+	       SVM_ACC_INTERFACE))
+	    {
+	      addr[1].offset =
+		-((1 + methodref_info->method->method_id) *
+		  sizeof (_svmt_method_info *));
+	    }
+	  else
+	    {
+	      addr[1].offset =
+		sizeof (_svmt_vtable) +
+		(methodref_info->method->method_id *
+		 sizeof (_svmt_method_info *));
+	    }
 
 	  /* execute bytecode */
 	  {