I am trying to upgrade some method invoke based code to used thunks.

The comments for mono_method_get_unmanaged_thunk() say:

 * LIMITATIONS
 *
 * Value type arguments and return values are treated as they were objects:
 *
 * C#: public static Rectangle Intersect (Rectangle a, Rectangle b);
 * C:  typedef MonoObject* (*Intersect)(MonoObject*, MonoObject*, 
MonoException**);
 *
 * Arguments must be properly boxed upon trunk's invocation, while return
 * values must be unboxed.

However it seems that primitive value types are returned unboxed while non 
primitive value types are not.
Does the same apply for thunk parameters?
Are primitive value parameters based by value and non primitive value 
parameters as a boxed reference?

// Obj-C
// non primitive value type
    - (NSDate *)date
    {
                typedef MonoObject* (*Thunk)(MonoObject *, MonoObject**);
                static Thunk thunk;
                MonoObject *monoException = NULL;
                if (!thunk) {
                        MonoMethod *monoMethod = 
GetPropertyGetMethod(self.monoClass, "Date");
                        thunk = 
(Thunk)mono_method_get_unmanaged_thunk(monoMethod);
                }
                MonoObject *monoObject = thunk(self.monoObject, &monoException);
                if (monoException != NULL) 
@throw(NSExceptionFromMonoException(monoException, @{}));

                if ([self object:_date isEqualToMonoObject:monoObject]) return 
_date;                                   
                _date = [NSDate dateWithMonoDateTime:monoObject];

                return _date;
        }

// primitive value type
    - (int64_t)int64Number
    {
                typedef int64_t (*Thunk)(MonoObject *, MonoObject**);
                static Thunk thunk;
                MonoObject *monoException = NULL;
                if (!thunk) {
                        MonoMethod *monoMethod = 
GetPropertyGetMethod(self.monoClass, "Int64Number");
                        thunk = 
(Thunk)mono_method_get_unmanaged_thunk(monoMethod);
                }
                _int64Number = thunk(self.monoObject, &monoException);
                if (monoException != NULL) 
@throw(NSExceptionFromMonoException(monoException, @{}));
                return _int64Number;
        }
_______________________________________________
Mono-list maillist  -  Mono-list@lists.dot.net
http://lists.dot.net/mailman/listinfo/mono-list

Reply via email to