On Sun, 2009-09-06 at 10:23 +0200, Vegard Nossum wrote:
> 2009/9/5 Pekka Enberg <[email protected]>:
> > Vegard Nossum wrote:
> >>
> >> 2009/9/5 Pekka Enberg <[email protected]>:
> >>>
> >>> Good point. I wonder why we have methods without code attribute in
> >>> classfiles.
> >>>
> >>
> >> Native and abstract methods don't have code. It's all here:
> >>
> >>
> >> http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#1546
> >>
> >> I think I tried once to skip the prepare-for-jit call, but something
> >> crashed. But I think it's a good idea to try to fix it.
> >
> > Actually, we *do* need to prepare for jit because trampolines work on struct
> > compilation_unit. So we probably need to initialize the cafebabe struct
> > anyway.
> >
>
> int vm_method_init(struct vm_method *vmm,
> struct vm_class *vmc, unsigned int method_index)
> {
> ...
> if (vm_method_is_native(vmm) || vm_method_is_abstract(vmm)) {
> /* Hm, we're now modifying a cafebabe structure. */
> vmm->code_attribute.max_stack = 0;
> vmm->code_attribute.max_locals = vmm->args_count;
>
> vmm->line_number_table_attribute.line_number_table_length = 0;
> vmm->line_number_table_attribute.line_number_table = NULL;
> return 0;
> }
>
> This is where we are initializing the code_attribute if it doesn't really
> exist.
>
> I think it's probably the fault of vm_method_init_from_interface()
> which doesn't initialize code_attribute and should do the above
> unconditionally (initialize to zero) because interface methods are
> always abstract.
OK, so why is that better than using calloc()? Here's an alternative
patch that fixes the problem as well.
Pekka
>From 2f0fef1b8cc3c9b9b14a2470195d088c41e60e73 Mon Sep 17 00:00:00 2001
From: Pekka Enberg <[email protected]>
Date: Sun, 6 Sep 2009 11:27:24 +0300
Subject: [PATCH] vm: Initialize interface methods properly
Signed-off-by: Pekka Enberg <[email protected]>
---
vm/method.c | 20 ++++++++++++++------
1 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/vm/method.c b/vm/method.c
index e6512c2..bfb8948 100644
--- a/vm/method.c
+++ b/vm/method.c
@@ -18,6 +18,16 @@
#include "jit/args.h"
#include "jit/cu-mapping.h"
+static void init_abstract_method(struct vm_method *vmm)
+{
+ /* Hm, we're now modifying a cafebabe structure. */
+ vmm->code_attribute.max_stack = 0;
+ vmm->code_attribute.max_locals = vmm->args_count;
+
+ vmm->line_number_table_attribute.line_number_table_length = 0;
+ vmm->line_number_table_attribute.line_number_table = NULL;
+}
+
int vm_method_init(struct vm_method *vmm,
struct vm_class *vmc, unsigned int method_index)
{
@@ -88,12 +98,7 @@ int vm_method_init(struct vm_method *vmm,
* with loading attributes which native and abstract methods don't have.
*/
if (vm_method_is_native(vmm) || vm_method_is_abstract(vmm)) {
- /* Hm, we're now modifying a cafebabe structure. */
- vmm->code_attribute.max_stack = 0;
- vmm->code_attribute.max_locals = vmm->args_count;
-
- vmm->line_number_table_attribute.line_number_table_length = 0;
- vmm->line_number_table_attribute.line_number_table = NULL;
+ init_abstract_method(vmm);
return 0;
}
@@ -158,6 +163,9 @@ int vm_method_init_from_interface(struct vm_method *vmm,
struct vm_class *vmc,
vmm->args_count = interface_method->args_count;
vmm->is_vm_native = false;
+
+ init_abstract_method(vmm);
+
return 0;
}
--
1.5.6.3
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Jatovm-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel