(mono_runtime_delegate_invoke): impl.
[mono.git] / mono / metadata / icall.c
index 8a3d1352382d703ecf587b0cb65ed03159b53c4e..4fbb9c192522eb167538a6a3f2e2b8f61e8bae17 100644 (file)
@@ -565,10 +565,27 @@ ves_icall_System_Object_MemberwiseClone (MonoObject *this)
        return mono_object_clone (this);
 }
 
+#if HAVE_BOEHM_GC
+#define MONO_OBJECT_ALIGNMENT_SHIFT    3
+#else
+#define MONO_OBJECT_ALIGNMENT_SHIFT    2
+#endif
+
+/*
+ * Return hashcode based on object address. This function will need to be
+ * smarter in the presence of a moving garbage collector, which will cache
+ * the address hash before relocating the object.
+ *
+ * Wang's address-based hash function:
+ *   http://www.concentric.net/~Ttwang/tech/addrhash.htm
+ */
 static gint32
 ves_icall_System_Object_GetHashCode (MonoObject *this)
 {
-       return *((gint32 *)this - 1);
+       register guint32 key;
+       key = (GPOINTER_TO_UINT (this) >> MONO_OBJECT_ALIGNMENT_SHIFT) * 2654435761u;
+
+       return key & 0x7fffffff;
 }
 
 /*
@@ -934,7 +951,7 @@ ves_icall_get_type_info (MonoType *type, MonoTypeInfo *info)
 static MonoObject *
 ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoArray *params) 
 {
-       return mono_runtime_invoke_array (method->method, this, params);
+       return mono_runtime_invoke_array (method->method, this, params, NULL);
 }
 
 static MonoObject *
@@ -1029,7 +1046,7 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoA
        if (!strcmp (method->method->name, ".ctor"))
                g_assert_not_reached ();
 
-       result = mono_runtime_invoke_array (method->method, this, params);
+       result = mono_runtime_invoke_array (method->method, this, params, NULL);
 
        *outArgs = out_args;
 
@@ -2109,13 +2126,11 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void)
        return names;
 }
 
-int ves_icall_System_Environment_get_TickCount (void);
-
 /*
  * Returns the number of milliseconds elapsed since the system started.
  */
 static gint32
-ves_icall_System_Environment_get_TickCount ()
+ves_icall_System_Environment_get_TickCount (void)
 {
 #if defined (PLATFORM_WIN32)
        return GetTickCount();