[llvmonly] Add an instrinsics for MethodBase.GetCurrentMethod () so it works on platf...
authorZoltan Varga <vargaz@gmail.com>
Sun, 17 Jan 2016 23:25:17 +0000 (18:25 -0500)
committerZoltan Varga <vargaz@gmail.com>
Sun, 17 Jan 2016 23:25:17 +0000 (18:25 -0500)
mono/mini/aot-tests.cs
mono/mini/jit-icalls.c
mono/mini/jit-icalls.h
mono/mini/method-to-ir.c
mono/mini/mini-runtime.c

index a79e708282b296df8284d14cb19bbd5672601c3b..f30bf1f83afc2d2572051a3d8d09ded5d7c5d5c4 100644 (file)
@@ -443,4 +443,14 @@ class Tests
                var s1 = new FpStruct () { a = 1, b = 1, c = 10 };
                return pass_hfa_on_stack (s1, s1, s1);
        }
+
+       public static int test_0_get_current_method () {
+               var m = MethodBase.GetCurrentMethod ();
+#if __MOBILE__
+               var m2 = typeof (AotTests).GetMethod ("test_0_get_current_method");
+#else
+               var m2 = typeof (Tests).GetMethod ("test_0_get_current_method");
+#endif
+               return m == m2 ? 0 : 1;
+       }
 }
index 643a07e821d0049198a15a5661e203880a030a65..c38500d92b054e925d6a98c499afbd52062250c8 100644 (file)
@@ -1679,6 +1679,12 @@ mono_get_assembly_object (MonoImage *image)
        return (MonoObject*)mono_assembly_get_object (mono_domain_get (), image->assembly);
 }
 
+MonoObject*
+mono_get_method_object (MonoMethod *method)
+{
+       return (MonoObject*)mono_method_get_object (mono_domain_get (), method, method->klass);
+}
+
 double
 mono_ckfinite (double d)
 {
index 0a27fea0c78ee5ff39db918bdc30209b95858c13..33b8a7a1a0a92f048ebeb7316536fc717591a8f2 100644 (file)
@@ -211,6 +211,8 @@ void mono_init_delegate_virtual (MonoDelegate *del, MonoObject *target, MonoMeth
 
 MonoObject* mono_get_assembly_object (MonoImage *image);
 
+MonoObject* mono_get_method_object (MonoMethod *method);
+
 double mono_ckfinite (double d);
 
 void mono_llvmonly_set_calling_assembly (MonoImage *image);
index 6070f1cd26011b39622c78252212c0632ab1de28..9de3558340f24ded890ee47d30fd2a4b3fd22782 100644 (file)
@@ -6731,6 +6731,17 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                        ins = mono_emit_jit_icall (cfg, mono_llvmonly_get_calling_assembly, NULL);
                        return ins;
                }
+       } else if (cmethod->klass->image == mono_defaults.corlib &&
+                          (strcmp (cmethod->klass->name_space, "System.Reflection") == 0) &&
+                          (strcmp (cmethod->klass->name, "MethodBase") == 0)) {
+               if (cfg->llvm_only && !cfg->gshared && !strcmp (cmethod->name, "GetCurrentMethod")) {
+                       /* No stack walks are currently available, so implement this as an intrinsic */
+                       MonoInst *method_ins;
+
+                       EMIT_NEW_AOTCONST (cfg, method_ins, MONO_PATCH_INFO_METHODCONST, cfg->method);
+                       ins = mono_emit_jit_icall (cfg, mono_get_method_object, &method_ins);
+                       return ins;
+               }
        } else if (cmethod->klass == mono_defaults.math_class) {
                /* 
                 * There is general branchless code for Min/Max, but it does not work for 
index 6d6a42c4b4f3ddbd9fac88e374c14aee0f28d4ce..e2023b5427f60c35dceae801fe0e21eb94e5feeb 100644 (file)
@@ -3878,6 +3878,7 @@ register_icalls (void)
        register_icall (mono_init_delegate, "mono_init_delegate", "void object object ptr", TRUE);
        register_icall (mono_init_delegate_virtual, "mono_init_delegate_virtual", "void object object ptr", TRUE);
        register_icall (mono_get_assembly_object, "mono_get_assembly_object", "object ptr", TRUE);
+       register_icall (mono_get_method_object, "mono_get_method_object", "object ptr", TRUE);
 
 #ifdef TARGET_IOS
        register_icall (pthread_getspecific, "pthread_getspecific", "ptr ptr", TRUE);