Jump to content
  • Advertisement
Sign in to follow this  
dkrusu

Segfault

This topic is 2028 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm getting a segfault when registering a object with a method that returns a handle to it's self. The following code reproduces the crash:

 

#include <angelscript.h>
#include <stdio.h>

class IManaged {
    public:
        virtual void addRef() = 0;
        virtual void Release() = 0;
};

class Test : public IManaged {
    public:
        void addRef() {

        }

        void Release() {

        }

        Test &Foo() {
            return *this;
        }
};

Test *pTest;

int main() {
    asIScriptEngine *pEngine = asCreateScriptEngine(ANGELSCRIPT_VERSION);
    asIScriptModule *Mod     = pEngine->GetModule(0, asGM_ALWAYS_CREATE);

    pTest = new Test();

    pEngine->RegisterObjectType("Test", 0, asOBJ_REF);
    pEngine->RegisterObjectBehaviour("Test", asBEHAVE_ADDREF, "void f()", asMETHOD(Test, addRef), asCALL_THISCALL);
    pEngine->RegisterObjectBehaviour("Test", asBEHAVE_RELEASE, "void f()", asMETHOD(Test, Release), asCALL_THISCALL);
    pEngine->RegisterObjectMethod("Test", "Test &Foo()", asMETHOD(Test, Foo), asCALL_THISCALL);
    pEngine->RegisterGlobalProperty("Test @pTest", pTest);

    const char *Script = "void main() { pTest.Foo(); }";

    Mod->AddScriptSection("script", Script);
    Mod->Build();

    asIScriptContext *Ctx = pEngine->CreateContext();
    asIScriptFunction *Func = Mod->GetFunctionByDecl("void main()");

    Ctx->Prepare(Func);
    Ctx->Execute();

    return 0;
}

 

here is the backtrace:

 

#0  0x0000000000412682 in asCScriptEngine::CallObjectMethod (this=0x737010,
    obj=0x4c5e30 <vtable for Test+16>, i=0x7400f0, s=0x740150)
    at ../../source/as_scriptengine.cpp:3382
#1  0x0000000000412574 in asCScriptEngine::CallObjectMethod (this=0x737010,
    obj=0x4c5e30 <vtable for Test+16>, func=31)
    at ../../source/as_scriptengine.cpp:3354
#2  0x0000000000490b73 in asCContext::ExecuteNext (this=0x740ae0)
    at ../../source/as_context.cpp:3739
#3  0x00000000004896af in asCContext::Execute (this=0x740ae0)
    at ../../source/as_context.cpp:1155
#4  0x00000000004026c7 in main () at test.cpp:48

 

 

This happends on both 32 and 64-bit builds with GCC 4.7.2 (Linux)

 

Thanks,

Dave

 

Share this post


Link to post
Share on other sites
Advertisement
I haven't time to investigate this, but I believe the problem is with how you register the global property.

As you tell AngelScript that the property is a handle you should pass a pointer to the pointer.

Either change the declaration to be by value, i.e without @, or pass the address of the global variable.

It doesn't crash when not inheriting from the interface because then the addref and release are not virtual and the method doesn't actually use the object.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!