Jump to content

  • Log In with Google      Sign In   
  • Create Account

zerochen

Member Since 19 Jul 2012
Offline Last Active May 19 2014 02:39 PM

Topics I've Started

constructor + templates => constructor isnt called

26 November 2012 - 09:56 PM

hi,

i have a problem with the constructor and templates.
if i register my vector class with constructorDefault<T> it doesnt work because the constructorDefault function is never been called.
only then i use the constructorDefaultf function it works.
is there something i missed?

C++:
template<typename T>
void constructorDefault(void *memory) // this isnt called
{
	 new (memory) core::vector3d<T>();
}

void constructorDefaultf(void *memory) // works fine
{
	 new (memory) core::vector3d<float>();
}

template<typename T>
void deconstructor(void *memory)
{
	 ((core::vector3d<T>*)memory)->~vector3d<T>();
}

// called like that -> registerVector3dT<float>(engine, "vector3df", "float");
template<typename T>
void registerVector3dT(asIScriptEngine *engine, const char *typeName, const char *asType)
{
	 int r;
	 std::stringstream ss;

	// Bind Vector2d<T> class.
	r = engine->RegisterObjectType(typeName, sizeof(core::vector3d<T>), asOBJ_VALUE | asOBJ_APP_CLASS_CDA); assert(r >= 0);

	 //this doesnt work
	 r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_CONSTRUCT, "void f()", asFUNCTIONPR(constructorDefault<T>, (void*), void), asCALL_CDECL_OBJLAST); assert(r >= 0);

	 // this works
	 //r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_CONSTRUCT, "void f()", asFUNCTIONPR(constructorDefaultf, (void*), void), asCALL_CDECL_OBJLAST); assert(r >= 0);

	r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_DESTRUCT, "void f()", asFUNCTIONPR(deconstructor<T>, (void*), void), asCALL_CDECL_OBJLAST); assert(r >= 0);
  
	 // Assignment vector3d<T>& operator=(const vector3d<T>& other)
	ss.str("");
	ss << typeName << "& opAssign(const " << typeName << " &in)";
	r = engine->RegisterObjectMethod(typeName, ss.str().c_str(), asMETHODPR(core::vector3d<T>, operator=, (const core::vector3d<T>&), core::vector3d<T>&), asCALL_THISCALL); assert(r >= 0);

	// Bind core::vector3d<T> class properties.
	ss.str("");
	ss << asType << " X";
	r = engine->RegisterObjectProperty(typeName, ss.str().c_str(), offsetof(core::vector3d<T>, X)); assert(r >= 0);
	ss.str("");
	ss << asType << " Y";
	r = engine->RegisterObjectProperty(typeName, ss.str().c_str(), offsetof(core::vector3d<T>, Y)); assert(r >= 0);
	ss.str("");
	ss << asType << " Z";
	r = engine->RegisterObjectProperty(typeName, ss.str().c_str(), offsetof(core::vector3d<T>, Z)); assert(r >= 0);
}

Angelscript:
class d
{
	 void dummy()
	 {
	 	 vector3df ss();
	 	 vector3df sss();
	 	 sss = ss;
	 }
}

in that line it crashed:
void asCScriptEngine::CallObjectMethod(void *obj, asSSystemFunctionInterface *i, asCScriptFunction *s)
line 3394: (((asCSimpleDummy*)obj)->*f)();

callstack:
game.exe![thunk]:asCScriptObject::`vcall'{4,{flat}}' }'() C++
game.exe!asCScriptEngine::CallObjectMethod(void * obj, asSSystemFunctionInterface * i, asCScriptFunction * s) Zeile 3413 C++
game.exe!asCScriptEngine::CallObjectMethod(void * obj, int func) Zeile 3367 C++
game.exe!asCContext::ExecuteNext() Zeile 2503 C++
game.exe!asCContext::Execute() Zeile 1155 C++

i guess it crashs there because the constructor isnt called.
any help would be appreciated
thx

After unreachable code wrong error msg

22 November 2012 - 05:55 PM

Hi,

this code leads to a wrong error msg.

void dum()
{}

int dummy()
{
  return 0;
  dum();
  //return 1;
}
output:
player.as (35, 2) : INFO : Compiling int CPlayer::dummy()
player.as (38, 3) : WARN : Unreachable code
player.as (36, 2) : ERR : Not all paths return a value

If you uncomment the last line it works. it works also with an int a; instead of a func call

ref count fails

11 October 2012 - 05:08 PM

hi,

i have following base structure
Script:
class A
{
};

class B
{
	  void init()
	  {
			 create("A");
	  };
};

pseudo c++:
asIScriptObject* create(string s)
{
	   int id = getClassId(s);
	   return reinterpret_cast<asIScriptObject*>(engine->CreateScriptObject(id));
}

so now to my problem.

i create class B and than i call the function init() from B that creates a new object from A
something like this:

pseudo call stack:
objB = create("B")
objB.callMethod("init")
that calls
objA = create("A")

after that the ref count of objB is 1 (as expected)
the ref count of objA is 2 (have to be 1)

have i an error in my logic?

i tracked this down to:
as_scriptobject.cpp line 122
that line doesnt dec the ref counter of objA but it does it for objB.

is that because to call a script function there has to be an active context?

is this a bug or have i call the release func myself?

thx for help
zerochen

switch return bug

19 July 2012 - 08:23 AM

hi, i think i found a bug with a switch and return statements
asscript:
[source lang="cpp"] bool onEvent() { switch(1) { case 1: return true; default: return false; } }[/source]

error:
objects/Controller.as (54, 2) : INFO : Compiling bool Controller::onEvent()
objects/Controller.as (55, 2) : ERR : Not all paths return a value

but that isnt true. maybe return statements are not supported in switch cases. if so this is a feature request:)

thx

PARTNERS