On 26 Jul 2013, at 13:48, Robert Jordan <[email protected]> wrote:

> On 26.07.2013 14:09, [email protected] wrote:
>>     // validate the Mono representatiom
>>     int64_t ticks = DB_UNBOX_INT64(DBMonoObjectGetProperty(monoDateTime, 
>> "Ticks"));
>>     MonoString *monoString = mono_object_to_string(monoDateTime, NULL);
> 
> mono_object_to_string () is buggy with respect to value types:
> 
Thanks Robert

Patching mono_object_to_string gives the right string rep.

otest[15354:303] NSDate date = 2013-07-26 13:01:05 +0000 Mono DateTime = 
26/07/2013 13:01:05 ticks = 635104404656226816

Will try and figure out what is going on with the tick count.
The tick count looks okay on the C side as far as I can see.

Perhaps the invocation code is at fault here:

MonoObject *DBMonoObjectInvoke(MonoObject *monoObject, const char *methodName, 
int numArgs, va_list va_args) {
        MonoObject *monoException = NULL;
        MonoObject *retval = NULL;
        MonoClass *klass = mono_object_get_class(monoObject);
        MonoMethod *meth = GetMonoObjectMethod(monoObject, methodName);

        if(meth != NULL) {
                void *invokeObj = mono_class_is_valuetype(klass) ? 
mono_object_unbox(monoObject) : monoObject;
                void *monoArgs[numArgs];
                DBPopulateMethodArgsFromVarArgs(monoArgs, va_args, numArgs);
                
                retval = mono_runtime_invoke(meth, invokeObj, monoArgs, 
&monoException);
        }
        
        if(monoException != NULL) 
@throw(NSExceptionFromMonoException(monoException));
        
        return(retval); 
}


// mono_object_to_string is buggy
// https://github.com/mono/mono/pull/708/files
MonoString *
mono_object_to_string_ex (MonoObject *obj, MonoObject **exc)
{
        static MonoMethod *to_string = NULL;
        MonoMethod *method;
    void *target = obj;
    
        //g_assert (obj);
    
        if (!to_string)
                to_string = mono_class_get_method_from_name_flags 
(mono_get_object_class (), "ToString", 0, 0x0040 | 0x0006);
    
        method = mono_object_get_virtual_method (obj, to_string);
    
    // Unbox value type if needed
    if (mono_class_is_valuetype (mono_method_get_class (method))) {
        target = mono_object_unbox (obj);
    }
    
    return (MonoString *) mono_runtime_invoke (method, target, NULL, exc);
}


Jonathan

_______________________________________________
Mono-list maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to