Merge pull request #5560 from kumpera/wasm-work-p3
authorRodrigo Kumpera <kumpera@users.noreply.github.com>
Thu, 28 Sep 2017 22:06:02 +0000 (18:06 -0400)
committerGitHub <noreply@github.com>
Thu, 28 Sep 2017 22:06:02 +0000 (18:06 -0400)
More WASM fixes, with this I can get half of the mini test suite to run without crashing.

1  2 
mono/metadata/object.c
mono/metadata/sgen-mono.c
mono/mini/mini-exceptions.c
mono/mini/mini-runtime.c
mono/mini/mini.h

diff --combined mono/metadata/object.c
index 9ace3f66652855063c4af180e32252fb48708dc2,7d373ae382b85fbfc9190bbd80388ecbc7dc6119..457c50e02cc115b4deeeaa547ff0453ef9df24c5
@@@ -4587,14 -4587,7 +4587,14 @@@ mono_unhandled_exception_checked (MonoO
        MonoObjectHandle current_appdomain_delegate = MONO_HANDLE_NEW (MonoObject, NULL);
  
        MonoClass *klass = mono_handle_class (exc);
 -      if (mono_class_has_parent (klass, mono_defaults.threadabortexception_class))
 +      /*
 +       * AppDomainUnloadedException don't behave like unhandled exceptions unless thrown from 
 +       * a thread started in unmanaged world.
 +       * https://msdn.microsoft.com/en-us/library/system.appdomainunloadedexception(v=vs.110).aspx#Anchor_6
 +       */
 +      if (klass == mono_defaults.threadabortexception_class ||
 +                      (klass == mono_class_get_appdomain_unloaded_exception_class () &&
 +                      mono_thread_info_current ()->runtime_thread))
                return;
  
        field = mono_class_get_field_from_name (mono_defaults.appdomain_class, "UnhandledException");
@@@ -7410,6 -7403,9 +7410,9 @@@ mono_wait_handle_get_handle (MonoWaitHa
  static MonoObject*
  mono_runtime_capture_context (MonoDomain *domain, MonoError *error)
  {
+ #ifdef HOST_WASM
+       return mono_runtime_invoke_checked (mono_get_context_capture_method (), NULL, NULL, error);
+ #else
        MONO_REQ_GC_UNSAFE_MODE;
  
        RuntimeInvokeFunction runtime_invoke;
        runtime_invoke = (RuntimeInvokeFunction)domain->capture_context_runtime_invoke;
  
        return runtime_invoke (NULL, NULL, NULL, domain->capture_context_method);
+ #endif
  }
  /**
   * mono_async_result_new:
index 33d1e52dd8d54de2bb03247eb072253093d70f88,df39ea5c5676d099098001fde4f2b65e9abf026d..4f8a285f4993c05e2bf1a4a90c99967917841032
@@@ -398,7 -398,6 +398,7 @@@ get_array_fill_vtable (void
                klass.rank = 1;
                klass.instance_size = MONO_SIZEOF_MONO_ARRAY;
                klass.sizes.element_size = 1;
 +              klass.size_inited = 1;
                klass.name = "array_filler_type";
  
                vtable->klass = &klass;
@@@ -2261,7 -2260,8 +2261,7 @@@ sgen_client_thread_detach_with_lock (Sg
  
        tid = mono_thread_info_get_tid (p);
  
 -      if (p->client_info.info.runtime_thread)
 -              mono_threads_add_joinable_thread ((gpointer)tid);
 +      mono_threads_add_joinable_runtime_thread (&p->client_info.info);
  
        if (mono_gc_get_gc_callbacks ()->thread_detach_func) {
                mono_gc_get_gc_callbacks ()->thread_detach_func (p->client_info.runtime_data);
@@@ -2361,6 -2361,10 +2361,10 @@@ sgen_client_scan_thread_data (void *sta
  {
        scan_area_arg_start = start_nursery;
        scan_area_arg_end = end_nursery;
+ #ifdef HOST_WASM
+       //Under WASM we don't scan thread stacks and we can't trust the values we find there either.
+       return;
+ #endif
  
        FOREACH_THREAD (info) {
                int skip_reason = 0;
index e3461a80aec1631eb756b7d15f18d5133125ede3,0a2691f663860f40e62a4d3442200b2c9a59b77e..707951af02e15c807e7eccced069307a22af527b
@@@ -1415,11 -1415,6 +1415,11 @@@ wrap_non_exception_throws (MonoMethod *
        int i;
        gboolean val = FALSE;
  
 +      if (m->wrapper_type == MONO_WRAPPER_DYNAMIC_METHOD) {
 +              MonoDynamicMethod *dm = (MonoDynamicMethod *)m;
 +              if (dm->assembly)
 +                      ass = dm->assembly;
 +      }
        g_assert (ass);
        if (ass->wrap_non_exception_throws_inited)
                return ass->wrap_non_exception_throws;
@@@ -3268,7 -3263,7 +3268,7 @@@ mono_llvm_load_exception (void
  
        if (mono_ex->trace_ips) {
                GList *trace_ips = NULL;
-               gpointer ip = RETURN_ADDRESS ();
+               gpointer ip = MONO_RETURN_ADDRESS ();
  
                size_t upper = mono_array_length (mono_ex->trace_ips);
  
diff --combined mono/mini/mini-runtime.c
index b433a360d97e7a1cd83f9a9d7989b97105d05fb7,a79c535ad3e883ae1f8bb6fe3aafdde5b4066451..2eeb5f34d6e3de1fb09db5496e922816efd868ad
@@@ -890,9 -890,7 +890,9 @@@ mono_thread_abort (MonoObject *obj
        g_free (jit_tls);*/
  
        if ((mono_runtime_unhandled_exception_policy_get () == MONO_UNHANDLED_POLICY_LEGACY) ||
 -                      (obj->vtable->klass == mono_defaults.threadabortexception_class)) {
 +                      (obj->vtable->klass == mono_defaults.threadabortexception_class) ||
 +                      ((obj->vtable->klass) == mono_class_get_appdomain_unloaded_exception_class () &&
 +                      mono_thread_info_current ()->runtime_thread)) {
                mono_thread_exit ();
        } else {
                mono_invoke_unhandled_exception_hook (obj);
@@@ -2431,11 -2429,8 +2431,11 @@@ create_runtime_invoke_info (MonoDomain 
                if (mono_class_is_contextbound (method->klass) || !info->compiled_method)
                        supported = FALSE;
  
 -              if (supported)
 +              if (supported) {
                        info->dyn_call_info = mono_arch_dyn_call_prepare (sig);
 +                      if (debug_options.dyn_runtime_invoke)
 +                              g_assert (info->dyn_call_info);
 +              }
        }
  #endif
  
@@@ -2737,8 -2732,8 +2737,8 @@@ mono_jit_runtime_invoke (MonoMethod *me
                MonoMethodSignature *sig = mono_method_signature (method);
                gpointer *args;
                static RuntimeInvokeDynamicFunction dyn_runtime_invoke;
 -              int i, pindex;
 -              guint8 buf [512];
 +              int i, pindex, buf_size;
 +              guint8 *buf;
                guint8 retval [256];
  
                if (!dyn_runtime_invoke) {
  
                //printf ("M: %s\n", mono_method_full_name (method, TRUE));
  
 -              mono_arch_start_dyn_call (info->dyn_call_info, (gpointer**)args, retval, buf, sizeof (buf));
 +              buf_size = mono_arch_dyn_call_get_buf_size (info->dyn_call_info);
 +              buf = g_alloca (buf_size);
 +              g_assert (buf);
 +
 +              mono_arch_start_dyn_call (info->dyn_call_info, (gpointer**)args, retval, buf);
  
                dyn_runtime_invoke (buf, exc, info->compiled_method);
                mono_arch_finish_dyn_call (info->dyn_call_info, buf);
@@@ -3311,12 -3302,13 +3311,13 @@@ mini_get_delegate_arg (MonoMethod *meth
  void
  mini_init_delegate (MonoDelegate *del)
  {
-       if (mono_llvm_only)
-               del->extra_arg = mini_get_delegate_arg (del->method, del->method_ptr);
  #ifdef ENABLE_INTERPRETER
        if (mono_use_interpreter)
                mono_interp_init_delegate (del);
+       else
  #endif
+       if (mono_llvm_only)
+               del->extra_arg = mini_get_delegate_arg (del->method, del->method_ptr);
  }
  
  char*
diff --combined mono/mini/mini.h
index 539125b2f387005ca812adf5d3d01d7c70e42f37,fe5071f8d8acbc05fc135ab5aba17d404ea1523e..f8d052627cd72c45b10e5563471039bbb43eb0b9
@@@ -552,7 -552,7 +552,7 @@@ extern MonoMethodDesc *mono_break_at_bb
  extern int mono_break_at_bb_bb_num;
  extern gboolean mono_verify_all;
  extern gboolean mono_do_x86_stack_align;
 -extern const char *mono_build_date;
 +extern MONO_API const char *mono_build_date;
  extern gboolean mono_do_signal_chaining;
  extern gboolean mono_do_crash_chaining;
  extern MONO_API gboolean mono_use_llvm;
@@@ -2783,8 -2783,7 +2783,8 @@@ void      mono_arch_emit_outarg_v
  void      mono_arch_emit_setret                 (MonoCompile *cfg, MonoMethod *method, MonoInst *val);
  MonoDynCallInfo *mono_arch_dyn_call_prepare     (MonoMethodSignature *sig);
  void      mono_arch_dyn_call_free               (MonoDynCallInfo *info);
 -void      mono_arch_start_dyn_call              (MonoDynCallInfo *info, gpointer **args, guint8 *ret, guint8 *buf, int buf_len);
 +int       mono_arch_dyn_call_get_buf_size       (MonoDynCallInfo *info);
 +void      mono_arch_start_dyn_call              (MonoDynCallInfo *info, gpointer **args, guint8 *ret, guint8 *buf);
  void      mono_arch_finish_dyn_call             (MonoDynCallInfo *info, guint8 *buf);
  MonoInst *mono_arch_emit_inst_for_method        (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args);
  void      mono_arch_decompose_opts              (MonoCompile *cfg, MonoInst *ins);
@@@ -3274,22 -3273,22 +3274,22 @@@ void mono_interruption_checkpoint_from_
  
  #if defined (HOST_WASM)
  
- #define RETURN_ADDRESS_N(N) NULL
- #define RETURN_ADDRESS() RETURN_ADDRESS_N(0)
+ #define MONO_RETURN_ADDRESS_N(N) NULL
+ #define MONO_RETURN_ADDRESS() MONO_RETURN_ADDRESS_N(0)
  
  
  #elif defined (__GNUC__)
  
- #define RETURN_ADDRESS_N(N) (__builtin_extract_return_addr (__builtin_return_address (N)))
- #define RETURN_ADDRESS() RETURN_ADDRESS_N(0)
+ #define MONO_RETURN_ADDRESS_N(N) (__builtin_extract_return_addr (__builtin_return_address (N)))
+ #define MONO_RETURN_ADDRESS() MONO_RETURN_ADDRESS_N(0)
  
  #elif defined(_MSC_VER)
  
  #include <intrin.h>
  #pragma intrinsic(_ReturnAddress)
  
- #define RETURN_ADDRESS() _ReturnAddress()
- #define RETURN_ADDRESS_N(N) NULL
+ #define MONO_RETURN_ADDRESS() _ReturnAddress()
+ #define MONO_RETURN_ADDRESS_N(N) NULL
  
  #else