Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 vm/class.c       |   35 +++++++++++++++++++++++++++++++++++
 vm/classloader.c |    5 +----
 2 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/vm/class.c b/vm/class.c
index 96405db..9efb7a7 100644
--- a/vm/class.c
+++ b/vm/class.c
@@ -33,6 +33,7 @@
 #include <cafebabe/constant_pool.h>
 #include <cafebabe/field_info.h>
 #include <cafebabe/method_info.h>
+#include <cafebabe/stream.h>
 
 #include <vm/class.h>
 #include <vm/classloader.h>
@@ -121,6 +122,38 @@ setup_vtable(struct vm_class *vmc)
        }
 }
 
+static char *
+cafebabe_class_get_source_file_name(const struct cafebabe_class *class)
+{
+       const struct cafebabe_constant_info_utf8 *file_name;
+       const struct cafebabe_attribute_info *attrib;
+       unsigned int source_file_attrib_index;
+       struct cafebabe_stream stream;
+       uint16_t sourcefile_index;
+
+       source_file_attrib_index = 0;
+
+       if (cafebabe_attribute_array_get(&class->attributes, "SourceFile",
+               class, &source_file_attrib_index))
+               return NULL;
+
+       attrib = class->attributes.array + source_file_attrib_index;
+
+       cafebabe_stream_open_buffer(&stream,
+               attrib->info, attrib->attribute_length);
+       cafebabe_stream_read_uint16(&stream, &sourcefile_index);
+       cafebabe_stream_close_buffer(&stream);
+
+       if (cafebabe_class_constant_get_utf8(class, sourcefile_index,
+                                            &file_name))
+       {
+               return NULL;
+       }
+
+       return strndup((char*)file_name->bytes, file_name->length);
+}
+
+
 extern struct vm_class *vm_java_lang_Class;
 
 int vm_class_link(struct vm_class *vmc, const struct cafebabe_class *class)
@@ -146,6 +179,8 @@ int vm_class_link(struct vm_class *vmc, const struct 
cafebabe_class *class)
 
        vmc->name = strndup((char *) name->bytes, name->length);
 
+       vmc->source_file_name = cafebabe_class_get_source_file_name(class);
+
        if (class->super_class) {
                const struct cafebabe_constant_info_class *constant_super;
                if (cafebabe_class_constant_get_class(class,
diff --git a/vm/classloader.c b/vm/classloader.c
index a615fa3..71af1bf 100644
--- a/vm/classloader.c
+++ b/vm/classloader.c
@@ -383,10 +383,7 @@ struct vm_class *load_class(const char *class_name)
        }
 
 out_filename:
-       if (result)
-               result->source_file_name = filename;
-       else
-               free(filename);
+       free(filename);
 
        return result;
 }
-- 
1.6.0.6


------------------------------------------------------------------------------
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to