diff options
Diffstat (limited to 'java/sablevm/files/patch-al')
-rw-r--r-- | java/sablevm/files/patch-al | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/java/sablevm/files/patch-al b/java/sablevm/files/patch-al new file mode 100644 index 000000000000..e462ba8e1898 --- /dev/null +++ b/java/sablevm/files/patch-al @@ -0,0 +1,140 @@ +#--- 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 */ + { |