Summary: When using AOT mode on Mono one can't use instance methods for callbacks, the compiler needs the MonoPInvokeCallback attribute on a static method to know how to get back to the managed world. This worked fine without the change in JIT mode. I not sure if we should use a __MONO__ flag for this stuff as this could be needed for other usage that not only on iOS. ~~The adicional change is that one should as good practice call Dispose on the YogaNode when using callbacks to make sure we remove the handler from our dictionary, i was trying to write a test for this.. but i saw TestMeasureFuncWithDestructor was already there, but it doesn't seem correct to me, can you check splhack.~~ Closes https://github.com/facebook/yoga/pull/386 Reviewed By: emilsjolander Differential Revision: D4546030 Pulled By: splhack fbshipit-source-id: 121d44a2ecd14d754b9614493db6ac15fca02da2
50 lines
1.2 KiB
C#
50 lines
1.2 KiB
C#
/**
|
|
* Copyright (c) 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
using System;
|
|
|
|
namespace Facebook.Yoga
|
|
{
|
|
internal static class YogaLogger
|
|
{
|
|
public delegate void Func(YogaLogLevel level, string message);
|
|
|
|
private static bool _initialized;
|
|
|
|
public static Func Logger = null;
|
|
|
|
public static void Initialize()
|
|
{
|
|
if (!_initialized)
|
|
{
|
|
|
|
Native.YGInteropSetLogger(LoggerInternal);
|
|
_initialized = true;
|
|
}
|
|
}
|
|
|
|
#if __IOS__
|
|
[ObjCRuntime.MonoPInvokeCallback(typeof(Func))]
|
|
#endif
|
|
public static void LoggerInternal(YogaLogLevel level, string message)
|
|
{
|
|
if (Logger != null)
|
|
{
|
|
Logger(level, message);
|
|
}
|
|
|
|
if (level == YogaLogLevel.Error)
|
|
{
|
|
throw new InvalidOperationException(message);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|