#define GC_finalize_on_demand __imp_GC_finalize_on_demand
#endif
+#ifdef HAVE_VALGRIND_MEMCHECK_H
+#include <valgrind/memcheck.h>
+#endif
+
static int finalize_slot = -1;
static gboolean gc_disabled = FALSE;
mono_trace (G_LOG_LEVEL_WARNING, MONO_TRACE_GC, msg, (unsigned long)arg);
}
+static gboolean
+mono_running_on_valgrind (void)
+{
+#ifdef HAVE_VALGRIND_MEMCHECK_H
+ if (RUNNING_ON_VALGRIND)
+ return TRUE;
+ else
+ return FALSE;
+#else
+ return FALSE;
+#endif
+}
+
+
void mono_gc_init (void)
{
InitializeCriticalSection (&handle_section);
return;
}
+ /* valgrind does not play nicely with the GC,
+ * so, turn it off when we are under vg.
+ */
+ /*if (mono_running_on_valgrind ()) {
+ g_warning ("You are running under valgrind. Currently, valgrind does "
+ "not support the GC. This program will run with the GC "
+ "turned off. Your program may take up a fair amount of "
+ "memory. Also, finalizers will not be run.");
+
+ gc_disabled = TRUE;
+ return;
+ }*/
+
finalizer_event = CreateEvent (NULL, FALSE, FALSE, NULL);
pending_done_event = CreateEvent (NULL, TRUE, FALSE, NULL);
shutdown_event = CreateEvent (NULL, TRUE, FALSE, NULL);
mono_register_jit_icall (func, name, sig, save);
}
+static MonoMethodSignature*
+signature_no_pinvoke (MonoMethodSignature* sig)
+{
+ if (sig->pinvoke) {
+ sig = mono_metadata_signature_dup (sig);
+ sig->pinvoke = FALSE;
+ }
+
+ return sig;
+}
+
void
mono_marshal_init (void)
{
void
mono_mb_emit_managed_call (MonoMethodBuilder *mb, MonoMethod *method, MonoMethodSignature *opt_sig)
{
- mono_mb_emit_byte (mb, CEE_PREFIX1);
- mono_mb_emit_byte (mb, CEE_LDFTN);
+ mono_mb_emit_byte (mb, CEE_CALL);
mono_mb_emit_i4 (mb, mono_mb_add_data (mb, method));
- mono_mb_emit_calli (mb, opt_sig ? opt_sig : method->signature);
}
void
g_assert (method && method->klass->parent == mono_defaults.multicastdelegate_class &&
!strcmp (method->name, "BeginInvoke"));
- sig = method->signature;
+ sig = signature_no_pinvoke (method->signature);
cache = method->klass->image->delegate_begin_invoke_cache;
if ((res = mono_marshal_find_in_cache (cache, sig)))
g_assert (method != NULL);
- sig = method->signature;
+ sig = signature_no_pinvoke (method->signature);
msg = mono_method_call_message_new (method, params, NULL, NULL, NULL);
g_assert (method && method->klass->parent == mono_defaults.multicastdelegate_class &&
!strcmp (method->name, "EndInvoke"));
- sig = method->signature;
+ sig = signature_no_pinvoke (method->signature);
cache = method->klass->image->delegate_end_invoke_cache;
if ((res = mono_marshal_find_in_cache (cache, sig)))
if (method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE)
return method;
- sig = method->signature;
+ sig = signature_no_pinvoke (method->signature);
/* we cant remote methods without this pointer */
if (!sig->hasthis)
if (method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK)
return method;
- sig = method->signature;
-
+ sig = signature_no_pinvoke (method->signature);
+
/* we cant remote methods without this pointer */
g_assert (sig->hasthis);
g_assert (method && method->klass->parent == mono_defaults.multicastdelegate_class &&
!strcmp (method->name, "Invoke"));
- sig = method->signature;
+ sig = signature_no_pinvoke (method->signature);
cache = method->klass->image->delegate_invoke_cache;
if ((res = mono_marshal_find_in_cache (cache, sig)))
case MONO_TYPE_CLASS: {
klass = t->data.klass;
- tmp_locals [i] = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
+ tmp_locals [i] = mono_mb_add_local (mb, &klass->byval_arg);
if (klass->delegate) {
g_assert (!t->byref);
mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass));
mono_mb_emit_stloc (mb, tmp_locals [i]);
mono_mb_emit_ldloc (mb, tmp_locals [i]);
+ mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
+ mono_mb_emit_byte (mb, CEE_MONO_OBJADDR);
mono_mb_emit_icon (mb, sizeof (MonoObject));
mono_mb_emit_byte (mb, CEE_ADD);
mono_mb_emit_byte (mb, CEE_STLOC_1);
/* Set src */
mono_mb_emit_byte (mb, CEE_LDLOC_0);
+ mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
+ mono_mb_emit_byte (mb, CEE_MONO_OBJADDR);
mono_mb_emit_icon (mb, sizeof (MonoObject));
mono_mb_emit_byte (mb, CEE_ADD);
mono_mb_emit_byte (mb, CEE_STLOC_0);
/* Set src */
mono_mb_emit_ldloc (mb, tmp_locals [i]);
+ mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
+ mono_mb_emit_byte (mb, CEE_MONO_OBJADDR);
mono_mb_emit_icon (mb, sizeof (MonoObject));
mono_mb_emit_byte (mb, CEE_ADD);
mono_mb_emit_byte (mb, CEE_STLOC_0);
/* set the src_ptr */
mono_mb_emit_byte (mb, CEE_LDLOC_0);
+ mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
+ mono_mb_emit_byte (mb, CEE_MONO_OBJADDR);
mono_mb_emit_icon (mb, sizeof (MonoObject));
mono_mb_emit_byte (mb, CEE_ADD);
mono_mb_emit_byte (mb, CEE_STLOC_0);
if ((res = mono_marshal_find_in_cache (cache, method)))
return res;
- sig = method->signature;
+ sig = signature_no_pinvoke (method->signature);
mb = mono_mb_new (method->klass, method->name, MONO_WRAPPER_SYNCHRONIZED);
mono_mb_emit_ldarg (mb, 0);
for (i = 0; i < sig->param_count; i++)
mono_mb_emit_ldarg (mb, i + (sig->hasthis == TRUE));
- mono_mb_emit_managed_call (mb, method, method->signature);
+
+ /* this is needed to avoid recursion */
+ mono_mb_emit_byte (mb, CEE_PREFIX1);
+ mono_mb_emit_byte (mb, CEE_LDFTN);
+ mono_mb_emit_i4 (mb, mono_mb_add_data (mb, method));
+ mono_mb_emit_calli (mb, method->signature);
+
if (!MONO_TYPE_IS_VOID (sig->ret))
mono_mb_emit_stloc (mb, ret_local);