Hi Tomek,

Tomek Grabiec wrote:
> @@ -36,3 +43,30 @@ unsigned char *throw_exception(struct compilation_unit *cu,
>  
>       return throw_exception_from(cu, frame, native_ptr, exception);
>  }
> +
> +void throw_exception_from_signal(void *ctx, struct object *exception)
> +{
> +     ucontext_t *_ctx = (ucontext_t*)ctx;

You don't need to explicitly cast from or to a void pointer.

Also, please rename _ctx to "uc" or something. Underscores in variable 
names hurt readability.

> +     struct jit_stack_frame *frame;
> +     struct compilation_unit *cu;
> +     unsigned long source_addr;
> +     void *eh;
> +
> +     source_addr = _ctx->uc_mcontext.gregs[REG_EIP];
> +     cu = get_cu_from_native_addr(source_addr);
> +     frame = (struct jit_stack_frame*)_ctx->uc_mcontext.gregs[REG_EBP];
> +
> +     eh = throw_exception_from(cu, frame, (unsigned char*)source_addr,
> +                               exception);
> +
> +     if (eh == NULL) {
> +             _ctx->uc_mcontext.gregs[REG_EIP] = 
> (int)bb_native_ptr(cu->exit_bb);
> +     } else {
> +             _ctx->uc_mcontext.gregs[REG_EIP] = (int)eh;

Please use unsigned long here, int is not 64-bit safe.

> +
> +             /* push exception object reference on stack */
> +             _ctx->uc_mcontext.gregs[REG_ESP] -= sizeof(exception);
> +             cpu_write_u32((unsigned char*)_ctx->uc_mcontext.gregs[REG_ESP],
> +                           (uint32_t)exception);
> +     }
> +}

> diff --git a/arch/x86/signal.c b/arch/x86/signal.c
> new file mode 100644
> index 0000000..5bad631
> --- /dev/null
> +++ b/arch/x86/signal.c
> @@ -0,0 +1,39 @@
> +/*
> + * Copyright (C) 2009 Tomasz Grabiec
> + *
> + * This file is released under the GPL version 2 with the following
> + * clarification and special exception:
> + *
> + *     Linking this library statically or dynamically with other modules is
> + *     making a combined work based on this library. Thus, the terms and
> + *     conditions of the GNU General Public License cover the whole
> + *     combination.
> + *
> + *     As a special exception, the copyright holders of this library give you
> + *     permission to link this library with independent modules to produce an
> + *     executable, regardless of the license terms of these independent
> + *     modules, and to copy and distribute the resulting executable under 
> terms
> + *     of your choice, provided that you also meet, for each linked 
> independent
> + *     module, the terms and conditions of the license of that module. An
> + *     independent module is a module which is not derived from or based on
> + *     this library. If you modify this library, you may extend this 
> exception
> + *     to your version of the library, but you are not obligated to do so. If
> + *     you do not wish to do so, delete this exception statement from your
> + *     version.
> + *
> + * Please refer to the file LICENSE for details.
> + */
> +
> +#include <signal.h>
> +#include <arch/signal.h>
> +#include <arch/stack-frame.h>
> +
> +#define __USE_GNU
> +#include <ucontext.h>
> +
> +bool signal_from_jit_method(void *ctx)
> +{
> +     ucontext_t *_ctx = (ucontext_t*)ctx;
> +
> +     return is_jit_method(_ctx->uc_mcontext.gregs[REG_EIP]);
> +}

I think you need to pull REG_IP definition to a header file. This code 
will be shared by the 64-bit implementation, after all.

> diff --git a/arch/x86/use-def.c b/arch/x86/use-def.c
> index 8463128..ef47f59 100644
> --- a/arch/x86/use-def.c
> +++ b/arch/x86/use-def.c
> @@ -6,6 +6,7 @@
>   */
>  
>  #include <jit/compilation-unit.h>
> +#include <arch/instruction.h>
>  
>  enum {
>       DEF_DST         = 1,
> diff --git a/include/jit/compilation-unit.h b/include/jit/compilation-unit.h
> index 88d87b1..4b1891c 100644
> --- a/include/jit/compilation-unit.h
> +++ b/include/jit/compilation-unit.h
> @@ -7,12 +7,13 @@
>  #include <vm/stack.h>
>  
>  #include <arch/stack-frame.h>
> -#include <arch/instruction.h>
>  
>  #include <stdbool.h>
>  #include <pthread.h>
>  
>  struct buffer;
> +struct insn;
> +enum machine_reg;
>  
>  struct compilation_unit {
>       struct methodblock *method;

What are these changes doing here?

> diff --git a/include/jit/exception.h b/include/jit/exception.h
> index 10e88fd..96483c1 100644
> --- a/include/jit/exception.h
> +++ b/include/jit/exception.h
> @@ -1,11 +1,12 @@
>  #ifndef _JIT_EXCEPTION_H
>  #define _JIT_EXCEPTION_H
>  
> -#include <jit/compilation-unit.h>
>  #include <vm/vm.h>
>  #include <arch/stack-frame.h>
> +#include <stdbool.h>
>  
>  struct jit_stack_frame;
> +struct compilation_unit;
>  
>  struct exception_table_entry *exception_find_entry(struct methodblock *,
>                                                  unsigned long);
> diff --git a/include/vm/class.h b/include/vm/class.h
> index 4ca0274..063498c 100644
> --- a/include/vm/class.h
> +++ b/include/vm/class.h
> @@ -3,6 +3,7 @@
>  
>  #include <vm/vm.h>
>  
> +struct object *create_null_pointer_exception();

Missing "void" argument specifier.

>  unsigned long is_object_instance_of(struct object *obj, struct object *type);
>  void check_null(struct object *obj);
>  void check_array(struct object *obj, unsigned int index);
> diff --git a/jit/fixup-site.c b/jit/fixup-site.c
> index 9a63f28..51b3edb 100644
> --- a/jit/fixup-site.c
> +++ b/jit/fixup-site.c
> @@ -25,6 +25,7 @@
>   */
>  
>  #include <jit/compiler.h>
> +#include <arch/instruction.h>
>  #include <memory.h>
>  #include <malloc.h>
>  

What are these changes for?

> diff --git a/jit/liveness.c b/jit/liveness.c
> index 74b656a..820d79d 100644
> --- a/jit/liveness.c
> +++ b/jit/liveness.c
> @@ -9,6 +9,7 @@
>  #include <jit/compilation-unit.h>
>  #include <jit/vars.h>
>  #include <vm/bitset.h>
> +#include <arch/instruction.h>
>  
>  #include <errno.h>
>  #include <stdlib.h>
> diff --git a/jit/spill-reload.c b/jit/spill-reload.c
> index f8d3230..ff74c33 100644
> --- a/jit/spill-reload.c
> +++ b/jit/spill-reload.c
> @@ -26,6 +26,7 @@
>  
>  #include <jit/compilation-unit.h>
>  #include <jit/stack-slot.h>
> +#include <arch/instruction.h>
>  #include <errno.h>
>  
>  static struct insn *last_insn(struct live_interval *interval)
> @@ -27,6 +27,20 @@
>  #include <vm/vm.h>
>  #include <stdlib.h>
>  
> +struct object *create_null_pointer_exception()

You need 'void' here.

> +{
> +     Class *exception = findSystemClass("java/lang/NullPointerException");
> +     struct object *exp = allocObject(exception);
> +     MethodBlock *init = lookupMethod(exception, "<init>",
> +                                      "()V");

Please separate variable definitions and initialization.

> +     if(exp && init)
> +             executeMethod(exp, init);
> +     else
> +             abort(); /* TODO */
> +
> +     return exp;
> +}
> +
>  unsigned long is_object_instance_of(struct object *obj, struct object *type)
>  {
>       if (!obj)


------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, & 
iPhoneDevCamp asthey present alongside digital heavyweights like Barbarian
Group, R/GA, & Big Spaceship. http://www.creativitycat.com 
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to