Help with Copy Constructor and Object handle as argument

Started by
2 comments, last by WitchLord 10 years, 11 months ago

I am trying to do a copy constructor on asOBJ_REF class. Seems the asBEHAVE_CONSTRUCT does not apply to asOBJ_REF classes.

Any ideas?

I settled so far for

RegisterObjectMethod("image", "void Copy(const image &in)", asMETHOD(CByteImage,Copy), asCALL_THISCALL); assert( r >= 0 );

However my image class asBEHAVE_FACTORY is all object handles, but I seems not to be able to make the Copy accept the object handles as argument.

so I can go

img2.Copy(img);

and it is fine

the

img2.Copy(@img);

would throw compile error.

I tried

RegisterObjectMethod("image", "void Copy(const image @&in)", asMETHOD(CByteImage,Copy), asCALL_THISCALL); assert( r >= 0 );

and while it is accepted, the runtime runs into what seems an endless loop (well it does returns after 7 sec which is probably some protection in the angelscript), so I don't think this is how I am supposed to do it.

Any help & ideas?

BTW, speeds are pretty awesome. I use it for image processing (the looping through the pixels is the main toll) and the scripted version vs native code is about 10-12x slower. So if native version would be 35ms,, the scripted version would be for example 450 ms. I think that is pretty amazing.

Advertisement

For asOBJ_REF you'll use the asBEHAVE_FACTORY instead of asBEHAVE_CONSTRUCT. The copy constructor should thus be registered as a asBEHAVE_FACTORY function that takes as input the reference to the object that should be copied, e.g.

engine->RegisterObjectBehaviour("image", asBEHAVE_FACTORY, "image @f(const image &in)", asFUNCTION(ImageCopyFactory), asCALL_CDECL);

Did you mean that the engine appeared to enter an infinite loop when you tried to compile a script with img.Copy(@img) and you had registered the function as Copy(const image @&in)? While there is no reason to register the method with this signature (it matches Copy(const image **) in C++), it definitely shouldn't cause a problem. I'll need to look into that, as it would appear to be a bug. That it returned after 7 seconds is probably that the library ran out of memory, as there is no built-in timeout in the library.

If you like the speed of AngelScript, you'll need to try it with the JIT compiler from BlindMind once you've gotten everything up an running. You're likely to see a very good boost in performance with that.

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

Andreas, the compile worked ok with my Copy(const image @&in), the runtime went into an loop when executing it. I didn't debug it as I knew I was probably doing something I shouldn't.

I tried the copyconstructor and it works, but as any other reference input it doesn't accept @ tag which maybe makes the syntax confusing or maybe not... there is something about the object handle syntax I am not 100% comfortable.

When you prefix an expression with the @ symbol, it means that you want to operate on the address of the object, rather than the object itself. That's why the compiler doesn't accept an expression like this:

image a;
image b(@a);  // You wanted to make a copy of the object, but you're telling the compiler copy the address instead

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

This topic is closed to new replies.

Advertisement