Skip to content

Exception GetSerializer<UnityEngine.Quaternion> (object)' while running with --aot-only. #124

@bnaka

Description

@bnaka

Title exception in Unity iOS build.

ExecutionEngineException: Attempting to JIT compile method 'MsgPack.Serialization.SerializationContext:GetSerializer<UnityEngine.Quaternion> (object)' while running with --aot-only.

When Serialize does UnityEngine.Quaternion, on used Serializers.RegisterOverride.

But I found a method to avoid an exception.
Exclude comment out in method JIT_compile_Exception_Avoid_Method from next simple code.
Why is this code necessary?

Simple code

using UnityEngine;
using System.IO;
using System.Collections.Generic;

public class QuaternionSerializer: MsgPack.Serialization.MessagePackSerializer<Quaternion>
{
    public QuaternionSerializer(MsgPack.Serialization.SerializationContext c)
        : base(c)
    {
    }

    protected override void PackToCore(MsgPack.Packer packer, Quaternion objectTree)
    {
        packer.PackArrayHeader(4);
        packer.Pack(objectTree.x);
        packer.Pack(objectTree.y);
        packer.Pack(objectTree.z);
        packer.Pack(objectTree.w);
    }

    protected override Quaternion UnpackFromCore(MsgPack.Unpacker unpacker)
    {
        if (!unpacker.IsArrayHeader)
        {
            throw MsgPack.Serialization.SerializationExceptions.NewIsNotArrayHeader();
        }

        var count = MsgPack.Serialization.UnpackHelpers.GetItemsCount(unpacker);
        if( count != 4 )
        {
            throw MsgPack.Serialization.SerializationExceptions.NewIsNotArrayHeader();
        }

        if (!unpacker.IsArrayHeader)
        {
            throw MsgPack.Serialization.SerializationExceptions.NewIsNotArrayHeader();
        }

        System.Single x, y, z, w;

        if (!unpacker.ReadSingle(out x))
        {
            throw MsgPack.Serialization.SerializationExceptions.NewMissingItem(0);
        }
        if (!unpacker.ReadSingle(out y))
        {
            throw MsgPack.Serialization.SerializationExceptions.NewMissingItem(1);
        }
        if (!unpacker.ReadSingle(out z))
        {
            throw MsgPack.Serialization.SerializationExceptions.NewMissingItem(2);
        }
        if (!unpacker.ReadSingle(out w))
        {
            throw MsgPack.Serialization.SerializationExceptions.NewMissingItem(2);
        }
        return new Quaternion(x, y, z, w);

    }
}

public class TestMain : MonoBehaviour
{
    public class QTest
    {
        public Quaternion q;
    }

    void Start()
    {
        var context = MsgPack.Serialization.SerializationContext.Default;
        context.Serializers.RegisterOverride(new QuaternionSerializer(context));

        var stream = new MemoryStream(); 

        var q = new QTest();
        var serializer = context.GetSerializer<QTest>();
        serializer.Pack(stream, q);

        stream.Position = 0;
        serializer.Unpack(stream);
    }

    // Avoiding => ExecutionEngineException: Attempting to JIT compile method 'MsgPack.Serialization.SerializationContext:GetSerializer<UnityEngine.Quaternion> (object)' while running with --aot-only.'
    public void JIT_compile_Exception_Avoid_Method()
    {
        //var context = MsgPack.Serialization.SerializationContext.Default;
        //context.GetSerializer<Quaternion>();
    }
}

Environment.
Unity: 5.2.1p4
Xcode: 7.0.1
iOS: 9.0.2
msgpack-cli: 0.6.4 unity3d/MsgPack.dll

Unity iOS Player Settings.
Scripting Backend: Mono2x
Api Compatibility Level: .Net 2.0 Subset
Stripping Level: Disabled


iOSビルドでタイトルにあるExceptionが発生します。
Serializers.RegisterOverrideを使い、UnityEngine.Quaternionをシリアライズする際に起こります。
ただ、Exceptionを回避する方法を見つけました。
次のSimple code中のJIT_compile_Exception_Avoid_Method関数のコメントアウト部分を外すことです。
なぜこのコードが必要なのでしょうか?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions