Failed to pass or return value type from application in native calling convention

Started by
2 comments, last by Ash Taheri 6 years, 10 months ago

Hi

Sorry for my bad English

When I try to pass a value type to a function in Ubuntu 14.04 amd64 I get the following error:

Don't support returning type 'Vector2' by value from application in native calling convention on this platform

But my code works prefectly in Windows systems. How can I get rid of this error?

Thanks

My register code:


void RegisterMathVector2Script()
{
    #if defined(_SCRIPT_ACTIVE_)
        int result;
        result = Engine::ScriptEngine->SetDefaultNamespace(""); assert(result >= 0);

        if (strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY") == 0)
        {
            #if AS_CAN_USE_CPP11
                result = Engine::ScriptEngine->RegisterObjectType("Vector2", sizeof(Vector2), asOBJ_VALUE | asOBJ_POD |
                    asGetTypeTraits<Vector2>()); assert(result >= 0);
            #else
                result = Engine::ScriptEngine->RegisterObjectType("Vector2", sizeof(Vector2), asOBJ_VALUE | asOBJ_POD |
                    asOBJ_APP_CLASS | asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_ASSIGNMENT); assert(result >= 0);
            #endif

            result = Engine::ScriptEngine->RegisterObjectBehaviour("Vector2", asBEHAVE_CONSTRUCT, "void f(float x, float y)",
                asFUNCTION(Vector2Construct), asCALL_CDECL_OBJLAST); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void Set(float x, float y)", asMETHOD(Vector2, Set),
                asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "float GetLength()", asMETHOD(Vector2, GetLength),
                asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "float GetAngle()", asMETHOD(Vector2, GetAngle),
                asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void SetLengthAngle(float len, float ang)",
                asMETHOD(Vector2, SetLengthAngle), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void Invert()", asMETHOD(Vector2, Invert),
                asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void Normalize()", asMETHOD(Vector2, Normalize),
                asCALL_THISCALL); assert(result >= 0);

            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 &opAssign(const Vector2 &in) const",
                asMETHODPR(Vector2, operator =, (const Vector2&), void), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 &opAddAssign(const Vector2 &in) const",
                asMETHODPR(Vector2, operator +=, (const Vector2&), void), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 &opSubAssign(const Vector2 &in) const",
                asMETHODPR(Vector2, operator -=, (const Vector2&), void), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 &opMulAssign(const float &in) const",
                asMETHODPR(Vector2, operator *=, (const float&), void), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 &opDivAssign(const float &in) const",
                asMETHODPR(Vector2, operator /=, (const float&), void), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 &opMulAssign(const Vector2 &in) const",
                asMETHODPR(Vector2, operator *=, (const Vector2&), void), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 &opDivAssign(const Vector2 &in) const",
                asMETHODPR(Vector2, operator /=, (const Vector2&), void), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "bool opEquals(const Vector2 &in) const",
                asMETHODPR(Vector2, operator ==, (const Vector2&), bool), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 opAdd(const Vector2 &in) const",
                asMETHODPR(Vector2, operator +, (const Vector2&), Vector2), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 opSub(const Vector2 &in) const",
                asMETHODPR(Vector2, operator -, (const Vector2&), Vector2), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 opMul(const Vector2 &in) const",
                asMETHODPR(Vector2, operator *, (const Vector2&), Vector2), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 opDiv(const Vector2 &in) const",
                asMETHODPR(Vector2, operator /, (const Vector2&), Vector2), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 opMul(const float &in) const",
                asMETHODPR(Vector2, operator *, (const float&), Vector2), asCALL_THISCALL); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 opDiv(const float &in) const",
                asMETHODPR(Vector2, operator /, (const float&), Vector2), asCALL_THISCALL); assert(result >= 0);
        }
        else
        {
            result = Engine::ScriptEngine->RegisterObjectType("Vector2", sizeof(Vector2), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS |
                asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_ASSIGNMENT); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectBehaviour("Vector2", asBEHAVE_CONSTRUCT, "void f(float x, float y)",
                asFUNCTION(Vector2ConstructGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void Set(float x, float y)",
                asFUNCTION(Vector2MethodSetGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "float GetLength()",
                asFUNCTION(Vector2MethodGetLengthGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "float GetAngle()",
                asFUNCTION(Vector2MethodGetAngleGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void SetLengthAngle(float len, float ang)",
                asFUNCTION(Vector2MethodSetLengthAngleGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void Invert()",
                asFUNCTION(Vector2MethodInvertGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void Normalize()",
                asFUNCTION(Vector2MethodNormalizeGeneric), asCALL_GENERIC); assert(result >= 0);

            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void &opAssign(const Vector2 &in) const",
                asFUNCTION(Vector2OpAssignGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void &opAddAssign(const Vector2 &in) const",
                asFUNCTION(Vector2OpAddAssignGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void &opSubAssign(const Vector2 &in) const",
                asFUNCTION(Vector2OpSubAssignGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void &opMulAssign(const float &in) const",
                asFUNCTION(Vector2OpMulAssignfGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void &opDivAssign(const float &in) const",
                asFUNCTION(Vector2OpDivAssignfGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void &opMulAssign(const Vector2 &in) const",
                asFUNCTION(Vector2OpMulAssignGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "void &opDivAssign(const Vector2 &in) const",
                asFUNCTION(Vector2OpDivAssignGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "bool opEquals(const Vector2 &in) const",
                asFUNCTION(Vector2OpEqualsGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 opAdd(const Vector2 &in) const",
                asFUNCTION(Vector2OpAddGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 opSub(const Vector2 &in) const",
                asFUNCTION(Vector2OpSubGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 opMul(const Vector2 &in) const",
                asFUNCTION(Vector2OpMulGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 opDiv(const Vector2 &in) const",
                asFUNCTION(Vector2OpDivGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 opMul(const float &in) const",
                asFUNCTION(Vector2OpMulfGeneric), asCALL_GENERIC); assert(result >= 0);
            result = Engine::ScriptEngine->RegisterObjectMethod("Vector2", "Vector2 opDiv(const float &in) const",
                asFUNCTION(Vector2OpDivfGeneric), asCALL_GENERIC); assert(result >= 0);
        }

        result = Engine::ScriptEngine->RegisterObjectProperty("Vector2", "float X", asOFFSET(Vector2, X)); assert(result >= 0);
        result = Engine::ScriptEngine->RegisterObjectProperty("Vector2", "float Y", asOFFSET(Vector2, Y)); assert(result >= 0);
    #endif
}
Advertisement

On Linux 64bit AngelScript needs to know a bit more about the type in order to be able to pass POD types to registered native functions.

I assume the Vector2 class is actually a structure with 2 floats and nothing else. In that case you should add the flag asOBJ_APP_CLASS_ALLFLOATS to the RegisterObjectType, 

Regards,
Andreas

 

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

The problem solved by adding the flag asOBJ_APP_CLASS_ALLFLOATS to the RegisterObjectType.

Thank you Andreas.

This topic is closed to new replies.

Advertisement