Merge pull request #601 from knocte/sock_improvements
[mono.git] / mono / metadata / icall.c
index 0719d4883841175cf8bc4a5ebe2bcd3c917a1d8e..0bfe73bd4b78bb1b1dfe2334115386d1ec63b23c 100644 (file)
@@ -73,6 +73,7 @@
 #include <mono/metadata/mono-debug.h>
 #include <mono/metadata/mono-ptr-array.h>
 #include <mono/metadata/verify-internals.h>
+#include <mono/metadata/runtime.h>
 #include <mono/io-layer/io-layer.h>
 #include <mono/utils/strtod.h>
 #include <mono/utils/monobitset.h>
@@ -82,6 +83,7 @@
 #include <mono/utils/mono-error-internals.h>
 #include <mono/utils/mono-mmap.h>
 #include <mono/utils/mono-io-portability.h>
+#include <mono/utils/mono-digest.h>
 
 #if defined (HOST_WIN32)
 #include <windows.h>
@@ -1168,10 +1170,12 @@ ves_icall_System_Object_GetType (MonoObject *obj)
 {
        MONO_ARCH_SAVE_REGS;
 
-       if (obj->vtable->klass != mono_defaults.transparent_proxy_class)
-               return mono_type_get_object (mono_object_domain (obj), &obj->vtable->klass->byval_arg);
-       else
+#ifndef DISABLE_REMOTING
+       if (obj->vtable->klass == mono_defaults.transparent_proxy_class)
                return mono_type_get_object (mono_object_domain (obj), &((MonoTransparentProxy*)obj)->remote_class->proxy_class->byval_arg);
+       else
+#endif
+               return mono_type_get_object (mono_object_domain (obj), &obj->vtable->klass->byval_arg);
 }
 
 ICALL_EXPORT void
@@ -2275,7 +2279,7 @@ ves_icall_type_iscomobject (MonoReflectionType *type)
        MonoClass *klass = mono_class_from_mono_type (type->type);
        mono_class_init_or_throw (klass);
 
-       return (klass && klass->is_com_object);
+       return mono_class_is_com_object (klass);
 }
 
 ICALL_EXPORT MonoReflectionModule*
@@ -2875,6 +2879,7 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoAr
        return mono_runtime_invoke_array (m, obj, params, NULL);
 }
 
+#ifndef DISABLE_REMOTING
 ICALL_EXPORT MonoObject *
 ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoArray *params, MonoArray **outArgs) 
 {
@@ -3002,6 +3007,7 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoA
 
        return result;
 }
+#endif
 
 static guint64
 read_enum_value (char *mem, int type)
@@ -4533,53 +4539,6 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
        return result;
 }
 
-typedef struct {
-       MonoArray *res;
-       int idx;
-} NameSpaceInfo;
-
-static void
-foreach_namespace (const char* key, gconstpointer val, NameSpaceInfo *info)
-{
-       MonoString *name = mono_string_new (mono_object_domain (info->res), key);
-
-       mono_array_setref (info->res, info->idx, name);
-       info->idx++;
-}
-
-ICALL_EXPORT MonoArray*
-ves_icall_System_Reflection_Assembly_GetNamespaces (MonoReflectionAssembly *assembly) 
-{
-       MonoImage *img = assembly->assembly->image;
-       MonoArray *res;
-       NameSpaceInfo info;
-       int len;
-
-       MONO_ARCH_SAVE_REGS;
-
-       mono_image_lock (img);
-       mono_image_init_name_cache (img);
-
-RETRY_LEN:
-       len = g_hash_table_size (img->name_cache);
-       mono_image_unlock (img);
-
-       /*we can't create objects holding the image lock */
-       res = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, len);
-
-       mono_image_lock (img);
-       /*len might have changed, create a new array*/
-       if (len != g_hash_table_size (img->name_cache))
-               goto RETRY_LEN;
-
-       info.res = res;
-       info.idx = 0;
-       g_hash_table_foreach (img->name_cache, (GHFunc)foreach_namespace, &info);
-       mono_image_unlock (img);
-
-       return res;
-}
-
 /* move this in some file in mono/util/ */
 static char *
 g_concat_dir_and_file (const char *dir, const char *file)
@@ -4894,6 +4853,7 @@ ves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)
        MONO_ARCH_SAVE_REGS;
 
        mono_stack_walk_no_il (get_executing, &dest);
+       g_assert (dest);
        return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);
 }
 
@@ -6273,6 +6233,7 @@ ves_icall_System_Buffer_BlockCopyInternal (MonoArray *src, gint32 src_offset, Mo
        return TRUE;
 }
 
+#ifndef DISABLE_REMOTING
 ICALL_EXPORT MonoObject *
 ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this, MonoString *class_name)
 {
@@ -6304,6 +6265,7 @@ ves_icall_Remoting_RealProxy_InternalGetProxyType (MonoTransparentProxy *tp)
 {
        return mono_type_get_object (mono_object_domain (tp), &tp->remote_class->proxy_class->byval_arg);
 }
+#endif
 
 /* System.Environment */
 
@@ -6569,9 +6531,12 @@ ves_icall_System_Environment_Exit (int result)
 {
        MONO_ARCH_SAVE_REGS;
 
-       mono_threads_set_shutting_down ();
-
-       mono_runtime_set_shutting_down ();
+/* FIXME: There are some cleanup hangs that should be worked out, but
+ * if the program is going to exit, everything will be cleaned up when
+ * NaCl exits anyway.
+ */
+#ifndef __native_client__
+       mono_runtime_shutdown ();
 
        /* This will kill the tp threads which cannot be suspended */
        mono_thread_pool_cleanup ();
@@ -6580,6 +6545,7 @@ ves_icall_System_Environment_Exit (int result)
        mono_thread_suspend_all_other_threads ();
 
        mono_runtime_quit ();
+#endif
 
        /* we may need to do some cleanup here... */
        exit (result);
@@ -6792,6 +6758,7 @@ ves_icall_MonoMethodMessage_InitMessage (MonoMethodMessage *this,
        mono_message_init (mono_object_domain (this), this, method, out_args);
 }
 
+#ifndef DISABLE_REMOTING
 ICALL_EXPORT MonoBoolean
 ves_icall_IsTransparentProxy (MonoObject *proxy)
 {
@@ -6869,9 +6836,9 @@ ves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation (Mo
        klass = mono_class_from_mono_type (type->type);
        vtable = mono_class_vtable_full (mono_domain_get (), klass, TRUE);
 
-       if (enable) vtable->remote = 1;
-       else vtable->remote = 0;
+       mono_vtable_set_is_remote (vtable, enable);
 }
+#endif
 
 ICALL_EXPORT MonoObject *
 ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClassInstance (MonoReflectionType *type)
@@ -7253,6 +7220,12 @@ mono_ArgIterator_IntGetNextArg (MonoArgIterator *iter)
        iter->args = (guint8*)(((gsize)iter->args + (align) - 1) & ~(align - 1));
 #endif
        res.value = iter->args;
+#if defined(__native_client__) && SIZEOF_REGISTER == 8
+       /* Values are stored as 8 byte register sized objects, but 'value'
+        * is dereferenced as a pointer in other routines.
+        */
+       res.value = (char*)res.value + 4;
+#endif
 #if G_BYTE_ORDER != G_LITTLE_ENDIAN
        if (arg_size <= sizeof (gpointer)) {
                int dummy;
@@ -8386,6 +8359,25 @@ mono_get_jit_icall_info (void)
        return jit_icall_hash_name;
 }
 
+/*
+ * mono_lookup_jit_icall_symbol:
+ *
+ *   Given the jit icall NAME, returns its C symbol if possible, or NULL.
+ */
+const char*
+mono_lookup_jit_icall_symbol (const char *name)
+{
+       MonoJitICallInfo *info;
+       const char *res = NULL;
+
+       mono_loader_lock ();
+       info = g_hash_table_lookup (jit_icall_hash_name, name);
+       if (info)
+               res = info->c_symbol;
+       mono_loader_unlock ();
+       return res;
+}
+
 void
 mono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper)
 {
@@ -8395,7 +8387,7 @@ mono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper)
 }
 
 MonoJitICallInfo *
-mono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save)
+mono_register_jit_icall_full (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save, const char *c_symbol)
 {
        MonoJitICallInfo *info;
        
@@ -8419,6 +8411,7 @@ mono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignatu
        info->name = name;
        info->func = func;
        info->sig = sig;
+       info->c_symbol = c_symbol;
 
        if (is_save) {
                info->wrapper = func;
@@ -8432,3 +8425,10 @@ mono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignatu
        mono_loader_unlock ();
        return info;
 }
+
+MonoJitICallInfo *
+mono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save)
+{
+       return mono_register_jit_icall_full (func, name, sig, is_save, NULL);
+}
+