Jump to content

  • Log In with Google      Sign In   
  • Create Account

- - - - -

-= operator for int32 member of an object


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
4 replies to this topic

#1 abrken   Members   -  Reputation: 130

Like
0Likes
Like

Posted 11 October 2004 - 01:52 AM

Hello, This problem can be reproduced for 1.9.2 release. First the code to reproduce :
//
// Tests calling of a stdcall function from a script with four parameters
// of different types
//
// Test author: Andreas Jönsson
//

#include "utils.h"

#define TESTNAME "TestStdcall4Args"

static bool testVal = false;
static bool called = false;

static int	t1 = 0;
static float	t2 = 0;
static double	t3 = 0;
static char	t4 = 0;

static void __stdcall cfunction(int f1, float f2, double f3, int f4) {
	called = true;

	t1 = f1;
	t2 = f2;
	t3 = f3;
	t4 = f4;
	
	testVal = (f1 == 10) && (f2 == 1.92f) && (f3 == 3.88) && (f4 == 97);
}

class CMyOut : public 	COutStream
{
public :
	virtual void Write(const char *text) {printf("%s\n", text);};
};

class CRect {
public :
	long left, top, bottom, right;
	CRect() : left(0), top(0), bottom(0), right(0) {};
	virtual ~CRect()  {};
};

void CRect_constructor(CRect &o)
{
	new (&o) CRect();
}

void CRect_destructor(CRect &o)
{
	o.~CRect();
}

static void __stdcall MyTrace(long f1) {
	printf("%ld\n", f1);
}

bool TestStdcall4Args()
{
	bool ret = false;
	CMyOut outStr;

	asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);
	engine->RegisterGlobalFunction("void cfunction(int, float, double, int)", asFUNCTION(cfunction), asCALL_STDCALL);
	engine->RegisterGlobalFunction("void Trace(int32)", asFUNCTION(MyTrace), asCALL_STDCALL);
	engine->RegisterObjectType("CRect", sizeof(CRect), asOBJ_CLASS);
	engine->RegisterObjectBehaviour("CRect", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(CRect_constructor), asCALL_CDECL_OBJLAST);
	engine->RegisterObjectBehaviour("CRect", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(CRect_destructor), asCALL_CDECL_OBJLAST);
	engine->RegisterObjectProperty("CRect", "int32 left", offsetof(CRect, left));
	engine->RegisterObjectProperty("CRect", "int32 top", offsetof(CRect, top));
	engine->RegisterObjectProperty("CRect", "int32 right", offsetof(CRect, right));
	engine->RegisterObjectProperty("CRect", "int32 bottom", offsetof(CRect, bottom));

	engine->ExecuteString(0, "CRect rcTest; rcTest.left = 30; rcTest.left -= 10; Trace(rcTest.left); int i1; i1 = 100; i1 -= 90; cfunction(i1, 1.92f, 3.88, 97)", &outStr, 0);
	
	if (!called) {
		printf("\n%s: cfunction not called from script\n\n", TESTNAME);
		ret = true;
	} else if (!testVal) {
		printf("\n%s: testVal is not of expected value. Got (%d, %f, %f, %c), expected (%d, %f, %f, %c)\n\n", TESTNAME, t1, t2, t3, t4, 10, 1.92f, 3.88, 97);
		ret = true;
	}

	engine->Release();
	engine = NULL;

	return ret;
}



What is being happening is that rcTest.left is not equal to 20 but -20 ! from what I have experienced it seems that the operation made is : x -= v ----> x= (x*-1) + v workaround is made throught : x = x - v; This bug is not reproduced if you change CRect.left to a single int32 value. Strange ?! Regards, AbrKen.

Sponsor:

#2 Andreas Jonsson   Moderators   -  Reputation: 3445

Like
0Likes
Like

Posted 11 October 2004 - 01:29 PM

This is a bug that I've already fixed in the latest WIP.

What's happening is that the bytecode is optimized as if substraction was associative, i.e (a - b) = (b - a), which of course it isn't.

You can fix this by removing BC_SUBi and BC_SUBf from asCByteCode::MatchPattern() and asCByteCode::OptimizePattern(). Also remove them from asCByteCode::Optimize(), where used in IsCombination(curr, BC_SWAP4, BC_SUBi), and IsCombination(curr, BC_SWAP4, BC_SUBf).


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 abrken   Members   -  Reputation: 130

Like
0Likes
Like

Posted 11 October 2004 - 08:57 PM

Quote:
Original post by WitchLord
This is a bug that I've already fixed in the latest WIP.


Do you mean that going to 1.10.0 WIP2 this problem has been fixed, or should I have to wait your next WIP ?

#4 Rain Dog   Members   -  Reputation: 136

Like
0Likes
Like

Posted 11 October 2004 - 09:18 PM

Look at the posts for the WIP's he lists in what WIP the bug was fixed.

#5 abrken   Members   -  Reputation: 130

Like
0Likes
Like

Posted 11 October 2004 - 09:50 PM

oops, I have missed the line where it speaks about that. Thank's, now I know that the bug has been fixed since 1.10.0 WIP1.




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