Jump to content

  • Log In with Google      Sign In   
  • Create Account

- - - - -

Help with Copy Constructor and Object handle as argument


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 Oscar1   Members   -  Reputation: 115

Like
0Likes
Like

Posted 13 May 2013 - 07:27 AM

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.


Edited by Oscar1, 13 May 2013 - 10:02 AM.


Sponsor:

#2 Andreas Jonsson   Moderators   -  Reputation: 3454

Like
0Likes
Like

Posted 13 May 2013 - 05:01 PM

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.


Edited by Andreas Jonsson, 13 May 2013 - 05:50 PM.

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

#3 Oscar1   Members   -  Reputation: 115

Like
0Likes
Like

Posted 15 May 2013 - 05:03 PM

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. 


Edited by Oscar1, 15 May 2013 - 05:44 PM.


#4 Andreas Jonsson   Moderators   -  Reputation: 3454

Like
0Likes
Like

Posted 17 May 2013 - 06:59 PM

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




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS