int asCGarbageCollector::GetObjectInGC(asUINT idx, asUINT *seqNbr, void **obj, asITypeInfo **type) { if( seqNbr ) *seqNbr = 0; if( obj ) *obj = 0; if( type ) *type = 0; ENTERCRITICALSECTION(gcCritical); asSObjTypePair *o = 0; asUINT newObjs = asUINT(gcNewObjects.GetLength()); if( idx < newObjs ) o = &gcNewObjects[idx]; else if( idx < gcOldObjects.GetLength() + newObjs ) o = &gcOldObjects[idx-newObjs]; else { LEAVECRITICALSECTION(gcCritical); return asINVALID_ARG; } if( seqNbr ) *seqNbr = o->seqNbr; if( obj ) *obj = o->obj; if( type ) *type = o->type; LEAVECRITICALSECTION(gcCritical); return asSUCCESS; }
asUINT asCScriptObject::GetPropertyCount() const { return asUINT(objType->properties.GetLength()); }
// interface asUINT asCScriptFunction::GetVarCount() const { if( scriptData ) return asUINT(scriptData->variables.GetLength()); return 0; }
bool Test() { bool fail = false; asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); engine->RegisterGlobalFunction("void Assert(bool)", asFUNCTION(Assert), asCALL_CDECL); COutStream out; float f = 0; double d = 0; asUINT ui = 0; int i = 0; char i8 = 0; short i16 = 0; unsigned char ui8 = 0; unsigned short ui16 = 0; asBYTE b8 = 0; asWORD b16 = 0; asDWORD b = 0; engine->RegisterGlobalProperty("float f", &f); engine->RegisterGlobalProperty("double d", &d); engine->RegisterGlobalProperty("uint ui", &ui); engine->RegisterGlobalProperty("uint8 ui8", &ui8); engine->RegisterGlobalProperty("uint16 ui16", &ui16); engine->RegisterGlobalProperty("int i", &i); engine->RegisterGlobalProperty("int8 i8", &i8); engine->RegisterGlobalProperty("int16 i16", &i16); engine->RegisterGlobalProperty("bits b", &b); engine->RegisterGlobalProperty("bits8 b8", &b8); engine->RegisterGlobalProperty("bits16 b16", &b16); engine->RegisterGlobalFunction("void TestDouble(double)", asFUNCTION(TestDouble), asCALL_CDECL); engine->RegisterGlobalFunction("void TestFloat(float)", asFUNCTION(TestFloat), asCALL_CDECL); engine->RegisterGlobalFunction("void TestInt(int)", asFUNCTION(TestInt), asCALL_CDECL); engine->RegisterGlobalFunction("void TestI16(int16)", asFUNCTION(TestI16), asCALL_CDECL); engine->RegisterGlobalFunction("void TestI8(int8)", asFUNCTION(TestI8), asCALL_CDECL); engine->RegisterGlobalFunction("void TestUInt(uint)", asFUNCTION(TestUInt), asCALL_CDECL); engine->RegisterGlobalFunction("void TestUI16(uint16)", asFUNCTION(TestUI16), asCALL_CDECL); engine->RegisterGlobalFunction("void TestUI8(uint8)", asFUNCTION(TestUI8), asCALL_CDECL); engine->RegisterGlobalFunction("void TestDoubleByRef(double &in)", asFUNCTION(TestDoubleByRef), asCALL_CDECL); engine->RegisterGlobalFunction("void TestFloatByRef(float &in)", asFUNCTION(TestFloatByRef), asCALL_CDECL); engine->RegisterGlobalFunction("void TestIntByRef(int &in)", asFUNCTION(TestIntByRef), asCALL_CDECL); engine->RegisterGlobalFunction("void TestI16ByRef(int16 &in)", asFUNCTION(TestI16ByRef), asCALL_CDECL); engine->RegisterGlobalFunction("void TestI8ByRef(int8 &in)", asFUNCTION(TestI8ByRef), asCALL_CDECL); engine->RegisterGlobalFunction("void TestUIntByRef(uint &in)", asFUNCTION(TestUIntByRef), asCALL_CDECL); engine->RegisterGlobalFunction("void TestUI16ByRef(uint16 &in)", asFUNCTION(TestUI16ByRef), asCALL_CDECL); engine->RegisterGlobalFunction("void TestUI8ByRef(uint8 &in)", asFUNCTION(TestUI8ByRef), asCALL_CDECL); engine->SetCommonMessageStream(&out); d = 12.3; engine->ExecuteString(0, "d = double(d);"); if( d != 12.3 ) fail = true; f = 12.3f; engine->ExecuteString(0, "d = double(f);"); if( d != 12.3f ) fail = true; ui = 123; engine->ExecuteString(0, "d = double(ui);"); if( d != 123.0 ) fail = true; ui8 = 123; engine->ExecuteString(0, "d = double(ui8);"); if( d != 123.0 ) fail = true; ui16 = 123; engine->ExecuteString(0, "d = double(ui16);"); if( d != 123.0 ) fail = true; i = -123; engine->ExecuteString(0, "d = double(i);"); if( d != -123.0 ) fail = true; i8 = -123; engine->ExecuteString(0, "d = double(i8);"); if( d != -123.0 ) fail = true; i16 = -123; engine->ExecuteString(0, "d = double(i16);"); if( d != -123.0 ) fail = true; d = 12.3; engine->ExecuteString(0, "d = d;"); if( d != 12.3 ) fail = true; f = 12.3f; engine->ExecuteString(0, "d = f;"); if( d != 12.3f ) fail = true; ui = 123; engine->ExecuteString(0, "d = ui;"); if( d != 123.0 ) fail = true; ui8 = 123; engine->ExecuteString(0, "d = ui8;"); if( d != 123.0 ) fail = true; ui16 = 123; engine->ExecuteString(0, "d = ui16;"); if( d != 123.0 ) fail = true; i = -123; engine->ExecuteString(0, "d = i;"); if( d != -123.0 ) fail = true; i8 = -123; engine->ExecuteString(0, "d = i8;"); if( d != -123.0 ) fail = true; i16 = -123; engine->ExecuteString(0, "d = i16;"); if( d != -123.0 ) fail = true; d = 12.3; engine->ExecuteString(0, "f = float(d);"); if( f != 12.3f ) fail = true; f = 12.3f; engine->ExecuteString(0, "f = float(f);"); if( f != 12.3f ) fail = true; ui = 123; engine->ExecuteString(0, "f = float(ui);"); if( f != 123.0f ) fail = true; ui8 = 123; engine->ExecuteString(0, "f = float(ui8);"); if( f != 123.0f ) fail = true; ui16 = 123; engine->ExecuteString(0, "f = float(ui16);"); if( f != 123.0f ) fail = true; i = -123; engine->ExecuteString(0, "f = float(i);"); if( f != -123.0f ) fail = true; i8 = -123; engine->ExecuteString(0, "f = float(i8);"); if( f != -123.0f ) fail = true; i16 = -123; engine->ExecuteString(0, "f = float(i16);"); if( f != -123.0f ) fail = true; d = 12.3; engine->ExecuteString(0, "f = d;"); if( f != 12.3f ) fail = true; f = 12.3f; engine->ExecuteString(0, "f = f;"); if( f != 12.3f ) fail = true; ui = 123; engine->ExecuteString(0, "f = ui;"); if( f != 123.0f ) fail = true; ui8 = 123; engine->ExecuteString(0, "f = ui8;"); if( f != 123.0f ) fail = true; ui16 = 123; engine->ExecuteString(0, "f = ui16;"); if( f != 123.0f ) fail = true; i = -123; engine->ExecuteString(0, "f = i;"); if( f != -123.0f ) fail = true; i8 = -123; engine->ExecuteString(0, "f = i8;"); if( f != -123.0f ) fail = true; i16 = -123; engine->ExecuteString(0, "f = i16;"); if( f != -123.0f ) fail = true; d = 12.3; engine->ExecuteString(0, "i = int(d);"); if( i != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i = int(f);"); if( i != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i = int(ui);"); if( i != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i = int(ui8);"); if( i != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i = int(ui16);"); if( i != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i = int(i);"); if( i != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i = int(i8);"); if( i != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i = int(i16);"); if( i != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "i = d;"); if( i != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i = f;"); if( i != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i = ui;"); if( i != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i = ui8;"); if( i != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i = ui16;"); if( i != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i = i;"); if( i != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i = i8;"); if( i != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i = i16;"); if( i != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "i8 = int8(d);"); if( i8 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i8 = int8(f);"); if( i8 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i8 = int8(ui);"); if( i8 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i8 = int8(ui8);"); if( i8 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i8 = int8(ui16);"); if( i8 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i8 = int8(i);"); if( i8 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i8 = int8(i8);"); if( i8 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i8 = int8(i16);"); if( i8 != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "i8 = d;"); if( i8 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i8 = f;"); if( i8 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i8 = ui;"); if( i8 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i8 = ui8;"); if( i8 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i8 = ui16;"); if( i8 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i8 = i;"); if( i8 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i8 = i8;"); if( i8 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i8 = i16;"); if( i8 != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "i16 = int16(d);"); if( i16 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i16 = int16(f);"); if( i16 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i16 = int16(ui);"); if( i16 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i16 = int16(ui8);"); if( i16 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i16 = int16(ui16);"); if( i16 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i16 = int16(i);"); if( i16 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i16 = int16(i8);"); if( i16 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i16 = int16(i16);"); if( i16 != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "i16 = d;"); if( i16 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i16 = f;"); if( i16 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i16 = ui;"); if( i16 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i16 = ui8;"); if( i16 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i16 = ui16;"); if( i16 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i16 = i;"); if( i16 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i16 = i8;"); if( i16 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i16 = i16;"); if( i16 != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "ui = uint(d);"); if( ui != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui = uint(f);"); if( ui != asUINT(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui = uint(ui);"); if( ui != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui = uint(ui8);"); if( ui != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui = uint(ui16);"); if( ui != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui = uint(i);"); if( ui != asUINT(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui = uint(i8);"); if( ui != asUINT(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui = uint(i16);"); if( ui != asUINT(-123) ) fail = true; d = 12.3; engine->ExecuteString(0, "ui = d;"); if( ui != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui = f;"); if( ui != asUINT(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui = ui;"); if( ui != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui = ui8;"); if( ui != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui = ui16;"); if( ui != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui = i;"); if( ui != asUINT(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui = i8;"); if( ui != asUINT(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui = i16;"); if( ui != asUINT(-123) ) fail = true; d = 12.3; engine->ExecuteString(0, "ui8 = uint8(d);"); if( ui8 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui8 = uint8(f);"); if( ui8 != asBYTE(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui8 = uint8(ui);"); if( ui8 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui8 = uint8(ui8);"); if( ui8 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui8 = uint8(ui16);"); if( ui8 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui8 = uint8(i);"); if( ui8 != asBYTE(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui8 = uint8(i8);"); if( ui8 != asBYTE(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui8 = uint8(i16);"); if( ui8 != asBYTE(-123) ) fail = true; d = 12.3; engine->ExecuteString(0, "ui8 = d;"); if( ui8 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui8 = f;"); if( ui8 != asBYTE(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui8 = ui;"); if( ui8 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui8 = ui8;"); if( ui8 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui8 = ui16;"); if( ui8 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui8 = i;"); if( ui8 != asBYTE(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui8 = i8;"); if( ui8 != asBYTE(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui8 = i16;"); if( ui8 != asBYTE(-123) ) fail = true; d = 12.3; engine->ExecuteString(0, "ui16 = uint16(d);"); if( ui16 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui16 = uint16(f);"); if( ui16 != asWORD(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui16 = uint16(ui);"); if( ui16 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui16 = uint16(ui8);"); if( ui16 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui16 = uint16(ui16);"); if( ui16 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui16 = uint16(i);"); if( ui16 != asWORD(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui16 = uint16(i8);"); if( ui16 != asWORD(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui16 = uint16(i16);"); if( ui16 != asWORD(-123) ) fail = true; d = 12.3; engine->ExecuteString(0, "ui16 = d;"); if( ui16 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui16 = f;"); if( ui16 != asWORD(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui16 = ui;"); if( ui16 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui16 = ui8;"); if( ui16 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui16 = ui16;"); if( ui16 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui16 = i;"); if( ui16 != asWORD(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui16 = i8;"); if( ui16 != asWORD(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui16 = i16;"); if( ui16 != asWORD(-123) ) fail = true; engine->ExecuteString(0, "TestDouble(d); TestFloat(d); TestInt(d); TestI16(d); TestI8(d); TestUInt(d); TestUI16(d); TestUI8(d);"); engine->ExecuteString(0, "TestDouble(f); TestFloat(f); TestInt(f); TestI16(f); TestI8(f); TestUInt(f); TestUI16(f); TestUI8(f);"); engine->ExecuteString(0, "TestDouble(ui); TestFloat(ui); TestInt(ui); TestI16(ui); TestI8(ui); TestUInt(ui); TestUI16(ui); TestUI8(ui);"); engine->ExecuteString(0, "TestDouble(ui8); TestFloat(ui8); TestInt(ui8); TestI16(ui8); TestI8(ui8); TestUInt(ui8); TestUI16(ui8); TestUI8(ui8);"); engine->ExecuteString(0, "TestDouble(ui16); TestFloat(ui16); TestInt(ui16); TestI16(ui16); TestI8(ui16); TestUInt(ui16); TestUI16(ui16); TestUI8(ui16);"); engine->ExecuteString(0, "TestDouble(i); TestFloat(i); TestInt(i); TestI16(i); TestI8(i); TestUInt(i); TestUI16(i); TestUI8(i);"); engine->ExecuteString(0, "TestDouble(i8); TestFloat(i8); TestInt(i8); TestI16(i8); TestI8(i8); TestUInt(i8); TestUI16(i8); TestUI8(i8);"); engine->ExecuteString(0, "TestDouble(i16); TestFloat(i16); TestInt(i16); TestI16(i16); TestI8(i16); TestUInt(i16); TestUI16(i16); TestUI8(i16);"); d = 0; i8 = -22; engine->ExecuteString(0, "d = d + i8"); if( d != -22 ) fail = true; engine->ExecuteString(0, "int[] a(1); a[0] == 1"); engine->ExecuteString(0, "b + i"); engine->ExecuteString(0, "int a = 0, b = 0; (a+b)&1;"); f = 0; engine->ExecuteString(0, "f = float(0x3f800000)"); if( f != 1 ) fail = true; CBufferedOutStream bout; engine->SetCommonMessageStream(&bout); engine->ExecuteString(0, "i == ui"); if( bout.buffer != "ExecuteString (1, 3) : Warning : Signed/Unsigned mismatch\n" ) fail = true; bout.buffer = ""; int r; // Allow the conversion of a type to another even for reference parameters (C++ doesn't allow this) r = engine->ExecuteString(0, "TestDoubleByRef(d); TestFloatByRef(d); TestIntByRef(d); TestI16ByRef(d); TestI8ByRef(d); TestUIntByRef(d); TestUI16ByRef(d); TestUI8ByRef(d);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(f); TestFloatByRef(f); TestIntByRef(f); TestI16ByRef(f); TestI8ByRef(f); TestUIntByRef(f); TestUI16ByRef(f); TestUI8ByRef(f);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(ui); TestFloatByRef(ui); TestIntByRef(ui); TestI16ByRef(ui); TestI8ByRef(ui); TestUIntByRef(ui); TestUI16ByRef(ui); TestUI8ByRef(ui);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(ui8); TestFloatByRef(ui8); TestIntByRef(ui8); TestI16ByRef(ui8); TestI8ByRef(ui8); TestUIntByRef(ui8); TestUI16ByRef(ui8); TestUI8ByRef(ui8);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(ui16); TestFloatByRef(ui16); TestIntByRef(ui16); TestI16ByRef(ui16); TestI8ByRef(ui16); TestUIntByRef(ui16); TestUI16ByRef(ui16); TestUI8ByRef(ui16);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(i); TestFloatByRef(i); TestIntByRef(i); TestI16ByRef(i); TestI8ByRef(i); TestUIntByRef(i); TestUI16ByRef(i); TestUI8ByRef(i);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(i8); TestFloatByRef(i8); TestIntByRef(i8); TestI16ByRef(i8); TestI8ByRef(i8); TestUIntByRef(i8); TestUI16ByRef(i8); TestUI8ByRef(i8);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(i16); TestFloatByRef(i16); TestIntByRef(i16); TestI16ByRef(i16); TestI8ByRef(i16); TestUIntByRef(i16); TestUI16ByRef(i16); TestUI8ByRef(i16);"); if( r < 0 ) fail = true; engine->SetCommonMessageStream(&out); engine->AddScriptSection(0, "script", script, strlen(script)); engine->Build(0); // This test is to make sure that the float is in fact converted to a double engine->ExecuteString(0, "TestScript();"); // Make sure uint and int can be converted to bits when using the ~ operator engine->ExecuteString(0, "bits x = 0x34; x = ~x;"); engine->ExecuteString(0, "uint x = 0x34; x = ~x;"); engine->ExecuteString(0, "int x = 0x34; x = ~x;"); engine->Release(); if( fail ) printf("%s: failed\n", TESTNAME); // Success return fail; }
asUINT asCObjectType::GetInterfaceCount() const { return asUINT(interfaces.GetLength()); }
asUINT asCObjectType::GetSubTypeCount() const { return asUINT(templateSubTypes.GetLength()); }
void asCConfigGroup::RemoveConfiguration(asCScriptEngine *engine, bool notUsed) { asASSERT( refCount == 0 ); asUINT n; // Remove global variables for( n = 0; n < globalProps.GetLength(); n++ ) { int index = engine->registeredGlobalProps.GetIndex(globalProps[n]); if( index >= 0 ) { globalProps[n]->Release(); // TODO: global: Should compact the registeredGlobalProps array engine->registeredGlobalProps.Erase(index); } } globalProps.SetLength(0); // Remove global functions for( n = 0; n < scriptFunctions.GetLength(); n++ ) { int index = engine->registeredGlobalFuncs.GetIndex(scriptFunctions[n]); if( index >= 0 ) engine->registeredGlobalFuncs.Erase(index); scriptFunctions[n]->ReleaseInternal(); if( engine->stringFactory == scriptFunctions[n] ) engine->stringFactory = 0; } scriptFunctions.SetLength(0); // Remove behaviours and members of object types for( n = 0; n < objTypes.GetLength(); n++ ) { asCObjectType *obj = objTypes[n]; obj->ReleaseAllFunctions(); } // Remove function definitions for( n = 0; n < funcDefs.GetLength(); n++ ) { engine->registeredFuncDefs.RemoveValue(funcDefs[n]); funcDefs[n]->ReleaseInternal(); engine->RemoveFuncdef(funcDefs[n]); funcDefs[n]->ReleaseInternal(); } funcDefs.SetLength(0); // Remove object types (skip this if it is possible other groups are still using the types) if( !notUsed ) { for( n = asUINT(objTypes.GetLength()); n-- > 0; ) { asCObjectType *t = objTypes[n]; asSMapNode<asSNameSpaceNamePair, asCObjectType*> *cursor; if( engine->allRegisteredTypes.MoveTo(&cursor, asSNameSpaceNamePair(t->nameSpace, t->name)) && cursor->value == t ) { engine->allRegisteredTypes.Erase(cursor); if( engine->defaultArrayObjectType == t ) engine->defaultArrayObjectType = 0; if( t->flags & asOBJ_TYPEDEF ) engine->registeredTypeDefs.RemoveValue(t); else if( t->flags & asOBJ_ENUM ) engine->registeredEnums.RemoveValue(t); else if( t->flags & asOBJ_TEMPLATE ) engine->registeredTemplateTypes.RemoveValue(t); else engine->registeredObjTypes.RemoveValue(t); t->DestroyInternal(); t->ReleaseInternal(); } else { int idx = engine->templateInstanceTypes.IndexOf(t); if( idx >= 0 ) { engine->templateInstanceTypes.RemoveIndexUnordered(idx); t->DestroyInternal(); t->ReleaseInternal(); } } } objTypes.SetLength(0); } // Release other config groups for( n = 0; n < referencedConfigGroups.GetLength(); n++ ) referencedConfigGroups[n]->refCount--; referencedConfigGroups.SetLength(0); }
bool Test() { bool fail = false; asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); engine->RegisterGlobalFunction("void Assert(bool)", asFUNCTION(Assert), asCALL_GENERIC); COutStream out; CBufferedOutStream bout; float f = 0; double d = 0; asUINT ui = 0; asINT64 i64 = 0; int i = 0; signed char i8 = 0; asQWORD ui64 = 0; short i16 = 0; unsigned char ui8 = 0; unsigned short ui16 = 0; engine->RegisterGlobalProperty("float f", &f); engine->RegisterGlobalProperty("double d", &d); engine->RegisterGlobalProperty("uint ui", &ui); engine->RegisterGlobalProperty("uint8 ui8", &ui8); engine->RegisterGlobalProperty("uint16 ui16", &ui16); engine->RegisterGlobalProperty("uint64 ui64", &ui64); engine->RegisterGlobalProperty("int i", &i); engine->RegisterGlobalProperty("int8 i8", &i8); engine->RegisterGlobalProperty("int16 i16", &i16); engine->RegisterGlobalProperty("int64 i64", &i64); engine->RegisterGlobalFunction("void TestDouble(double)", asFUNCTION(TestDouble), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestFloat(float)", asFUNCTION(TestFloat), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestI64(int16)", asFUNCTION(TestI64), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestInt(int)", asFUNCTION(TestInt), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestI16(int16)", asFUNCTION(TestI16), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestI8(int8)", asFUNCTION(TestI8), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUI64(uint)", asFUNCTION(TestUI64), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUInt(uint)", asFUNCTION(TestUInt), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUI16(uint16)", asFUNCTION(TestUI16), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUI8(uint8)", asFUNCTION(TestUI8), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestDoubleByRef(double &in)", asFUNCTION(TestDoubleByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestFloatByRef(float &in)", asFUNCTION(TestFloatByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestI64ByRef(int &in)", asFUNCTION(TestI64ByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestIntByRef(int &in)", asFUNCTION(TestIntByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestI16ByRef(int16 &in)", asFUNCTION(TestI16ByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestI8ByRef(int8 &in)", asFUNCTION(TestI8ByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUI64ByRef(uint &in)", asFUNCTION(TestUI64ByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUIntByRef(uint &in)", asFUNCTION(TestUIntByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUI16ByRef(uint16 &in)", asFUNCTION(TestUI16ByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUI8ByRef(uint8 &in)", asFUNCTION(TestUI8ByRef), asCALL_GENERIC); engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "d = double(d);"); if( d != 12.3 ) fail = true; f = 12.3f; engine->ExecuteString(0, "d = double(f);"); if( d != 12.3f ) fail = true; ui = 123; engine->ExecuteString(0, "d = double(ui);"); if( d != 123.0 ) fail = true; ui8 = 123; engine->ExecuteString(0, "d = double(ui8);"); if( d != 123.0 ) fail = true; ui16 = 123; engine->ExecuteString(0, "d = double(ui16);"); if( d != 123.0 ) fail = true; ui64 = 123; engine->ExecuteString(0, "d = double(ui64);"); if( d != 123.0 ) fail = true; i = -123; engine->ExecuteString(0, "d = double(i);"); if( d != -123.0 ) fail = true; i8 = -123; engine->ExecuteString(0, "d = double(i8);"); if( d != -123.0 ) fail = true; i16 = -123; engine->ExecuteString(0, "d = double(i16);"); if( d != -123.0 ) fail = true; i64 = -123; engine->ExecuteString(0, "d = double(i64);"); if( d != -123.0 ) fail = true; ui64 = asQWORD(I64(-1000000000000000000)); double d2 = 18446744073709551615.0 + double(asINT64(ui64)); engine->ExecuteString(0, "d = double(ui64);"); if( d != d2 ) fail = true; d = 12.3; engine->ExecuteString(0, "d = d;"); if( d != 12.3 ) fail = true; f = 12.3f; engine->ExecuteString(0, "d = f;"); if( d != 12.3f ) fail = true; ui = 123; engine->ExecuteString(0, "d = ui;"); if( d != 123.0 ) fail = true; ui8 = 123; engine->ExecuteString(0, "d = ui8;"); if( d != 123.0 ) fail = true; ui16 = 123; engine->ExecuteString(0, "d = ui16;"); if( d != 123.0 ) fail = true; ui64 = 123; engine->ExecuteString(0, "d = ui64;"); if( d != 123.0 ) fail = true; i = -123; engine->ExecuteString(0, "d = i;"); if( d != -123.0 ) fail = true; i8 = -123; engine->ExecuteString(0, "d = i8;"); if( d != -123.0 ) fail = true; i16 = -123; engine->ExecuteString(0, "d = i16;"); if( d != -123.0 ) fail = true; i64 = -123; engine->ExecuteString(0, "d = i64;"); if( d != -123.0 ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "d = 12.3; "); if( !CompareDouble(d,12.3) ) fail = true; engine->ExecuteString(0, "d = 12.3f;"); if( !CompareDouble(d,12.3f) ) fail = true; engine->ExecuteString(0, "d = 123; "); if( !CompareDouble(d,123.0) ) fail = true; engine->ExecuteString(0, "d = -123; "); if( !CompareDouble(d,-123.0) ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "f = float(d);"); if( f != 12.3f ) fail = true; f = 12.3f; engine->ExecuteString(0, "f = float(f);"); if( f != 12.3f ) fail = true; ui = 123; engine->ExecuteString(0, "f = float(ui);"); if( f != 123.0f ) fail = true; ui8 = 123; engine->ExecuteString(0, "f = float(ui8);"); if( f != 123.0f ) fail = true; ui16 = 123; engine->ExecuteString(0, "f = float(ui16);"); if( f != 123.0f ) fail = true; ui64 = 123; engine->ExecuteString(0, "f = float(ui64);"); if( f != 123.0f ) fail = true; i = -123; engine->ExecuteString(0, "f = float(i);"); if( f != -123.0f ) fail = true; i8 = -123; engine->ExecuteString(0, "f = float(i8);"); if( f != -123.0f ) fail = true; i16 = -123; engine->ExecuteString(0, "f = float(i16);"); if( f != -123.0f ) fail = true; i64 = -123; engine->ExecuteString(0, "f = float(i64);"); if( f != -123.0f ) fail = true; d = 12.3; engine->ExecuteString(0, "f = d;"); if( f != 12.3f ) fail = true; f = 12.3f; engine->ExecuteString(0, "f = f;"); if( f != 12.3f ) fail = true; ui = 123; engine->ExecuteString(0, "f = ui;"); if( f != 123.0f ) fail = true; ui8 = 123; engine->ExecuteString(0, "f = ui8;"); if( f != 123.0f ) fail = true; ui16 = 123; engine->ExecuteString(0, "f = ui16;"); if( f != 123.0f ) fail = true; ui64 = 123; engine->ExecuteString(0, "f = ui64;"); if( f != 123.0f ) fail = true; i = -123; engine->ExecuteString(0, "f = i;"); if( f != -123.0f ) fail = true; i8 = -123; engine->ExecuteString(0, "f = i8;"); if( f != -123.0f ) fail = true; i16 = -123; engine->ExecuteString(0, "f = i16;"); if( f != -123.0f ) fail = true; i64 = -123; engine->ExecuteString(0, "f = i64;"); if( f != -123.0f ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "f = 12.3; "); if( f != 12.3f ) fail = true; engine->ExecuteString(0, "f = 12.3f;"); if( f != 12.3f ) fail = true; engine->ExecuteString(0, "f = 123; "); if( f != 123.0f ) fail = true; engine->ExecuteString(0, "f = -123; "); if( f != -123.0f ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "i64 = int64(d);"); if( i64 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i64 = int64(f);"); if( i64 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i64 = int64(ui);"); if( i64 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i64 = int64(ui8);"); if( i64 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i64 = int64(ui16);"); if( i64 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i64 = int64(ui64);"); if( i64 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i64 = int64(i);"); if( i64 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i64 = int64(i8);"); if( i64 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i64 = int64(i16);"); if( i64 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i64 = int64(i64);"); if( i64 != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "i64 = d;"); if( i64 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i64 = f;"); if( i64 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i64 = ui;"); if( i64 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i64 = ui8;"); if( i64 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i64 = ui16;"); if( i64 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i64 = ui64;"); if( i64 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i64 = i;"); if( i64 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i64 = i8;"); if( i64 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i64 = i16;"); if( i64 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i64 = i64;"); if( i64 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "i64 = 12.3; "); if( i64 != 12 ) fail = true; engine->ExecuteString(0, "i64 = -12.3f;"); if( i64 != - 12 ) fail = true; engine->ExecuteString(0, "i64 = 123; "); if( i64 != 123 ) fail = true; engine->ExecuteString(0, "i64 = -123; "); if( i64 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "i = int(d);"); if( i != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i = int(f);"); if( i != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i = int(ui);"); if( i != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i = int(ui8);"); if( i != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i = int(ui16);"); if( i != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i = int(ui64);"); if( i != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i = int(i);"); if( i != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i = int(i8);"); if( i != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i = int(i16);"); if( i != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i = int(i64);"); if( i != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "i = d;"); if( i != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i = f;"); if( i != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i = ui;"); if( i != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i = ui8;"); if( i != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i = ui16;"); if( i != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i = ui64;"); if( i != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i = i;"); if( i != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i = i8;"); if( i != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i = i16;"); if( i != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i = i64;"); if( i != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "i = 12.3; "); if( i != 12 ) fail = true; engine->ExecuteString(0, "i = -12.3f;"); if( i != - 12 ) fail = true; engine->ExecuteString(0, "i = 123; "); if( i != 123 ) fail = true; engine->ExecuteString(0, "i = -123; "); if( i != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "i8 = int8(d);"); if( i8 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i8 = int8(f);"); if( i8 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i8 = int8(ui);"); if( i8 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i8 = int8(ui8);"); if( i8 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i8 = int8(ui16);"); if( i8 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i8 = int8(ui64);"); if( i8 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i8 = int8(i);"); if( i8 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i8 = int8(i8);"); if( i8 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i8 = int8(i16);"); if( i8 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i8 = int8(i64);"); if( i8 != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "i8 = d;"); if( i8 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i8 = f;"); if( i8 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i8 = ui;"); if( i8 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i8 = ui8;"); if( i8 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i8 = ui16;"); if( i8 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i8 = ui64;"); if( i8 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i8 = i;"); if( i8 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i8 = i8;"); if( i8 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i8 = i16;"); if( i8 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i8 = i64;"); if( i8 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "i8 = 12.3; "); if( i8 != 12 ) fail = true; engine->ExecuteString(0, "i8 = -12.3f;"); if( i8 != - 12 ) fail = true; engine->ExecuteString(0, "i8 = 123; "); if( i8 != 123 ) fail = true; engine->ExecuteString(0, "i8 = -123; "); if( i8 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "i16 = int16(d);"); if( i16 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i16 = int16(f);"); if( i16 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i16 = int16(ui);"); if( i16 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i16 = int16(ui8);"); if( i16 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i16 = int16(ui16);"); if( i16 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i16 = int16(ui64);"); if( i16 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i16 = int16(i);"); if( i16 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i16 = int16(i8);"); if( i16 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i16 = int16(i16);"); if( i16 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i16 = int16(i64);"); if( i16 != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "i16 = d;"); if( i16 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i16 = f;"); if( i16 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i16 = ui;"); if( i16 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i16 = ui8;"); if( i16 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i16 = ui16;"); if( i16 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i16 = ui64;"); if( i16 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i16 = i;"); if( i16 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i16 = i8;"); if( i16 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i16 = i16;"); if( i16 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i16 = i64;"); if( i16 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "i16 = 12.3; "); if( i16 != 12 ) fail = true; engine->ExecuteString(0, "i16 = -12.3f;"); if( i16 != - 12 ) fail = true; engine->ExecuteString(0, "i16 = 123; "); if( i16 != 123 ) fail = true; engine->ExecuteString(0, "i16 = -123; "); if( i16 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "ui64 = uint64(d);"); if( ui64 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui64 = uint64(f);"); if( ui64 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "ui64 = uint64(ui);"); if( ui64 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui64 = uint64(ui8);"); if( ui64 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui64 = uint64(ui16);"); if( ui64 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui64 = uint64(ui64);"); if( ui64 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui64 = uint64(i);"); if( ui64 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "ui64 = uint64(i8);"); if( ui64 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "ui64 = uint64(i16);"); if( ui64 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "ui64 = uint64(i64);"); if( ui64 != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "ui64 = d;"); if( ui64 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui64 = f;"); if( ui64 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "ui64 = ui;"); if( ui64 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui64 = ui8;"); if( ui64 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui64 = ui16;"); if( ui64 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui64 = ui64;"); if( ui64 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui64 = i;"); if( ui64 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "ui64 = i8;"); if( ui64 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "ui64 = i16;"); if( ui64 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "ui64 = i64;"); if( ui64 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "ui64 = 12.3; "); if( ui64 != 12 ) fail = true; engine->ExecuteString(0, "ui64 = -12.3f;"); if( ui64 != - 12 ) fail = true; engine->ExecuteString(0, "ui64 = 123; "); if( ui64 != 123 ) fail = true; engine->ExecuteString(0, "ui64 = -123; "); if( ui64 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "ui = uint(d);"); if( ui != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui = uint(f);"); if( ui != asUINT(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui = uint(ui);"); if( ui != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui = uint(ui8);"); if( ui != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui = uint(ui16);"); if( ui != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui = uint(ui64);"); if( ui != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui = uint(i);"); if( ui != asUINT(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui = uint(i8);"); if( ui != asUINT(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui = uint(i16);"); if( ui != asUINT(-123) ) fail = true; i64 = -123; engine->ExecuteString(0, "ui = uint(i64);"); if( ui != asUINT(-123) ) fail = true; d = 12.3; engine->ExecuteString(0, "ui = d;"); if( ui != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui = f;"); if( ui != asUINT(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui = ui;"); if( ui != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui = ui8;"); if( ui != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui = ui16;"); if( ui != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui = ui64;"); if( ui != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui = i;"); if( ui != asUINT(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui = i8;"); if( ui != asUINT(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui = i16;"); if( ui != asUINT(-123) ) fail = true; i64 = -123; engine->ExecuteString(0, "ui = i64;"); if( ui != asUINT(-123) ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "ui = 12.3; "); if( ui != 12 ) fail = true; engine->ExecuteString(0, "ui = -12.3f;"); if( ui != asUINT(-12) ) fail = true; engine->ExecuteString(0, "ui = 123; "); if( ui != 123 ) fail = true; engine->ExecuteString(0, "ui = -123; "); if( ui != asUINT(-123) ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "ui8 = uint8(d);"); if( ui8 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui8 = uint8(f);"); if( ui8 != asBYTE(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui8 = uint8(ui);"); if( ui8 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui8 = uint8(ui8);"); if( ui8 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui8 = uint8(ui16);"); if( ui8 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui8 = uint8(ui64);"); if( ui8 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui8 = uint8(i);"); if( ui8 != asBYTE(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui8 = uint8(i8);"); if( ui8 != asBYTE(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui8 = uint8(i16);"); if( ui8 != asBYTE(-123) ) fail = true; i64 = -123; engine->ExecuteString(0, "ui8 = uint8(i64);"); if( ui8 != asBYTE(-123) ) fail = true; d = 12.3; engine->ExecuteString(0, "ui8 = d;"); if( ui8 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui8 = f;"); if( ui8 != asBYTE(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui8 = ui;"); if( ui8 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui8 = ui8;"); if( ui8 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui8 = ui16;"); if( ui8 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui8 = ui64;"); if( ui8 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui8 = i;"); if( ui8 != asBYTE(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui8 = i8;"); if( ui8 != asBYTE(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui8 = i16;"); if( ui8 != asBYTE(-123) ) fail = true; i64 = -123; engine->ExecuteString(0, "ui8 = i64;"); if( ui8 != asBYTE(-123) ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "ui8 = 12.3; "); if( ui8 != 12 ) fail = true; engine->ExecuteString(0, "ui8 = -12.3f;"); if( ui8 != asBYTE(-12) ) fail = true; // asBYTE(-12.3f) doesn't seem to produce the same result on MSVC and GNUC engine->ExecuteString(0, "ui8 = 123; "); if( ui8 != 123 ) fail = true; engine->ExecuteString(0, "ui8 = -123; "); if( ui8 != asBYTE(-123) ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "ui16 = uint16(d);"); if( ui16 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui16 = uint16(f);"); if( ui16 != asWORD(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui16 = uint16(ui);"); if( ui16 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui16 = uint16(ui8);"); if( ui16 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui16 = uint16(ui16);"); if( ui16 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui16 = uint16(ui64);"); if( ui16 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui16 = uint16(i);"); if( ui16 != asWORD(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui16 = uint16(i8);"); if( ui16 != asWORD(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui16 = uint16(i16);"); if( ui16 != asWORD(-123) ) fail = true; i64 = -123; engine->ExecuteString(0, "ui16 = uint16(i64);"); if( ui16 != asWORD(-123) ) fail = true; d = 12.3; engine->ExecuteString(0, "ui16 = d;"); if( ui16 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui16 = f;"); if( ui16 != asWORD(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui16 = ui;"); if( ui16 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui16 = ui8;"); if( ui16 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui16 = ui16;"); if( ui16 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui16 = ui64;"); if( ui16 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui16 = i;"); if( ui16 != asWORD(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui16 = i8;"); if( ui16 != asWORD(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui16 = i16;"); if( ui16 != asWORD(-123) ) fail = true; i64 = -123; engine->ExecuteString(0, "ui16 = i64;"); if( ui16 != asWORD(-123) ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "ui16 = 12.3; "); if( ui16 != 12 ) fail = true; engine->ExecuteString(0, "ui16 = -12.3f;"); if( ui16 != asWORD(-12) ) fail = true; // asWORD(-12.3f) doesn't seem to produce the same result on MSVC and GNUC engine->ExecuteString(0, "ui16 = 123; "); if( ui16 != 123 ) fail = true; engine->ExecuteString(0, "ui16 = -123; "); if( ui16 != asWORD(-123) ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); engine->ExecuteString(0, "TestDouble(d); TestFloat(d); TestInt(d); TestI16(d); TestI8(d); TestUInt(d); TestUI16(d); TestUI8(d);"); engine->ExecuteString(0, "TestDouble(f); TestFloat(f); TestInt(f); TestI16(f); TestI8(f); TestUInt(f); TestUI16(f); TestUI8(f);"); engine->ExecuteString(0, "TestDouble(ui); TestFloat(ui); TestInt(ui); TestI16(ui); TestI8(ui); TestUInt(ui); TestUI16(ui); TestUI8(ui);"); engine->ExecuteString(0, "TestDouble(ui8); TestFloat(ui8); TestInt(ui8); TestI16(ui8); TestI8(ui8); TestUInt(ui8); TestUI16(ui8); TestUI8(ui8);"); engine->ExecuteString(0, "TestDouble(ui16); TestFloat(ui16); TestInt(ui16); TestI16(ui16); TestI8(ui16); TestUInt(ui16); TestUI16(ui16); TestUI8(ui16);"); engine->ExecuteString(0, "TestDouble(ui64); TestFloat(ui64); TestInt(ui64); TestI16(ui64); TestI8(ui64); TestUInt(ui64); TestUI16(ui64); TestUI8(ui64);"); engine->ExecuteString(0, "TestDouble(i); TestFloat(i); TestInt(i); TestI16(i); TestI8(i); TestUInt(i); TestUI16(i); TestUI8(i);"); engine->ExecuteString(0, "TestDouble(i8); TestFloat(i8); TestInt(i8); TestI16(i8); TestI8(i8); TestUInt(i8); TestUI16(i8); TestUI8(i8);"); engine->ExecuteString(0, "TestDouble(i16); TestFloat(i16); TestInt(i16); TestI16(i16); TestI8(i16); TestUInt(i16); TestUI16(i16); TestUI8(i16);"); engine->ExecuteString(0, "TestDouble(i64); TestFloat(i64); TestInt(i64); TestI16(i64); TestI8(i64); TestUInt(i64); TestUI16(i64); TestUI8(i64);"); d = 0; i8 = -22; engine->ExecuteString(0, "d = d + i8"); if( d != -22 ) fail = true; engine->ExecuteString(0, "int[] a(1); a[0] = 0; a[0] == 1"); engine->ExecuteString(0, "ui + i"); engine->ExecuteString(0, "int a = 0, ui = 0; (a+ui)&1;"); // There is no bitwise conversion between uint to float anymore // f = 0; engine->ExecuteString(0, "f = float(0x3f800000)"); if( f != 1 ) fail = true; bout.buffer = ""; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "i == ui"); if( bout.buffer != "ExecuteString (1, 3) : Warning : Signed/Unsigned mismatch\n" ) fail = true; bout.buffer = ""; int r; // TODO: PPC: We cannot allow this with PPC // Allow the conversion of a type to another even for reference parameters (C++ doesn't allow this) r = engine->ExecuteString(0, "TestDoubleByRef(d); TestFloatByRef(d); TestIntByRef(d); TestI16ByRef(d); TestI8ByRef(d); TestUIntByRef(d); TestUI16ByRef(d); TestUI8ByRef(d);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(f); TestFloatByRef(f); TestIntByRef(f); TestI16ByRef(f); TestI8ByRef(f); TestUIntByRef(f); TestUI16ByRef(f); TestUI8ByRef(f);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(ui); TestFloatByRef(ui); TestIntByRef(ui); TestI16ByRef(ui); TestI8ByRef(ui); TestUIntByRef(ui); TestUI16ByRef(ui); TestUI8ByRef(ui);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(ui8); TestFloatByRef(ui8); TestIntByRef(ui8); TestI16ByRef(ui8); TestI8ByRef(ui8); TestUIntByRef(ui8); TestUI16ByRef(ui8); TestUI8ByRef(ui8);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(ui16); TestFloatByRef(ui16); TestIntByRef(ui16); TestI16ByRef(ui16); TestI8ByRef(ui16); TestUIntByRef(ui16); TestUI16ByRef(ui16); TestUI8ByRef(ui16);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(ui64); TestFloatByRef(ui64); TestIntByRef(ui64); TestI16ByRef(ui64); TestI8ByRef(ui64); TestUIntByRef(ui64); TestUI16ByRef(ui64); TestUI8ByRef(ui64);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(i); TestFloatByRef(i); TestIntByRef(i); TestI16ByRef(i); TestI8ByRef(i); TestUIntByRef(i); TestUI16ByRef(i); TestUI8ByRef(i);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(i8); TestFloatByRef(i8); TestIntByRef(i8); TestI16ByRef(i8); TestI8ByRef(i8); TestUIntByRef(i8); TestUI16ByRef(i8); TestUI8ByRef(i8);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(i16); TestFloatByRef(i16); TestIntByRef(i16); TestI16ByRef(i16); TestI8ByRef(i16); TestUIntByRef(i16); TestUI16ByRef(i16); TestUI8ByRef(i16);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(i64); TestFloatByRef(i64); TestIntByRef(i64); TestI16ByRef(i64); TestI8ByRef(i64); TestUIntByRef(i64); TestUI16ByRef(i64); TestUI8ByRef(i64);"); if( r < 0 ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); asIScriptModule *mod = engine->GetModule(0, asGM_ALWAYS_CREATE); mod->AddScriptSection("script", script, strlen(script)); mod->Build(); // This test is to make sure that the float is in fact converted to a double engine->ExecuteString(0, "TestScript();"); // Make sure uint and int can be converted to bits when using the ~ operator engine->ExecuteString(0, "uint x = 0x34; x = ~x;"); engine->ExecuteString(0, "int x = 0x34; x = ~x;"); engine->Release(); if( fail ) printf("%s: failed\n", TESTNAME); // Success return fail; }
bool Test() { bool fail = false; // Create the script engine asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); // Register Function RegisterScriptString(engine); engine->RegisterGlobalFunction("void Print(string &in)", asFUNCTION(PrintString_Generic), asCALL_GENERIC); // Compile asIScriptModule *mod = engine->GetModule(0, asGM_ALWAYS_CREATE); mod->AddScriptSection("script", "class Obj{};" "class Hoge" "{" " Hoge(){ Print('ctor\\n'); }" " ~Hoge(){ Print('dtor\\n'); }" " Obj@ obj;" "};" "void main()" "{" " Hoge hoge;" "};" , 0); mod->Build(); // Context Create asIScriptContext *ctx = engine->CreateContext(); // Loop for( asUINT n = 0; n < 3; n++ ) { // Execute //printf("----- execute\n"); ctx->Prepare(mod->GetFunctionIdByDecl("void main()")); ctx->Execute(); // GC const int GC_STEP_COUNT_PER_FRAME = 100; for ( int i = 0; i < GC_STEP_COUNT_PER_FRAME; ++i ) { engine->GarbageCollect(asGC_ONE_STEP); } // Check status { asUINT currentSize = asUINT(); asUINT totalDestroyed = asUINT(); asUINT totalDetected = asUINT(); engine->GetGCStatistics(¤tSize , &totalDestroyed , &totalDetected ); if( currentSize != 8 || totalDestroyed != n+1 || totalDetected != 0 ) TEST_FAILED; //printf("(%lu,%lu,%lu)\n" , currentSize , totalDestroyed , totalDetected ); } } // Release ctx->Release(); engine->Release(); // Test { COutStream out; int r; engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); engine->SetMessageCallback(asMETHOD(COutStream, Callback), &out, asCALL_THISCALL); RegisterScriptArray(engine, true); mod = engine->GetModule(0, asGM_ALWAYS_CREATE); mod->AddScriptSection(0, "interface ITest\n" "{\n" "}\n" "class Test : ITest\n" "{\n" " ITest@[] arr;\n" " void Set(ITest@ e)\n" " {\n" " arr.resize(1);\n" " @arr[0]=e;\n" " }\n" "}\n" "void main()\n" "{\n" " Test@ t=Test();\n" " t.Set(t);\n" "}\n"); r = mod->Build(); if( r < 0 ) TEST_FAILED; asUINT currentSize; engine->GetGCStatistics(¤tSize); r = ExecuteString(engine, "main()", mod); if( r != asEXECUTION_FINISHED ) TEST_FAILED; engine->GetGCStatistics(¤tSize); engine->Release(); } // Test attempted access of global variable after it has been destroyed { COutStream out; int r; engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); engine->SetMessageCallback(asMETHOD(COutStream, Callback), &out, asCALL_THISCALL); RegisterScriptArray(engine, true); RegisterStdString(engine); engine->RegisterGlobalFunction("void Log(const string &in)", asFUNCTION(PrintString_Generic), asCALL_GENERIC); mod = engine->GetModule(0, asGM_ALWAYS_CREATE); mod->AddScriptSection(0, "class Big \n" "{ \n" " Big() \n" " { \n" " Log('Big instance created\\n'); \n" " } \n" " ~Big() \n" " { \n" " Log('Big instance being destroyed\\n'); \n" " } \n" " void exec() \n" " { \n" " Log('executed\\n'); \n" " } \n" "} \n" "Big big; \n" // Global object "class SomeClass \n" "{ \n" " SomeClass@ handle; \n" // Make sure SomeClass is garbage collected " SomeClass() {} \n" " ~SomeClass() \n" " { \n" " Log('Before attempting access to global var\\n'); \n" " big.exec(); \n" // As the module has already been destroyed, the global variable won't exist anymore, thus raising a null pointer exception here " Log('SomeClass instance being destroyed\\n'); \n" // This won't be called " } \n" "} \n" "void test_main() \n" "{ \n" " SomeClass @something = @SomeClass(); \n" // Instanciate the object. It will only be destroyed by the GC "} \n"); r = mod->Build(); if( r < 0 ) TEST_FAILED; r = ExecuteString(engine, "test_main()", mod); if( r != asEXECUTION_FINISHED ) TEST_FAILED; // The global variables in the module will be destroyed first. The objects in the GC that // tries to access them should throw exception, but should not cause the application to crash called = 0; engine->Release(); if( called != 2 ) TEST_FAILED; } /* { // This test forces a memory leak due to not registering the GC behaviours for the CFoo class COutStream out; int r; engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); engine->SetMessageCallback(asMETHOD(COutStream, Callback), &out, asCALL_THISCALL); engine->RegisterInterface("IMyInterface"); engine->RegisterObjectType("CFoo", sizeof(CFoo), asOBJ_REF); engine->RegisterObjectBehaviour("CFoo", asBEHAVE_ADDREF, "void f()", asMETHOD(CFoo, AddRef), asCALL_THISCALL); engine->RegisterObjectBehaviour("CFoo", asBEHAVE_RELEASE, "void f()", asMETHOD(CFoo, Release), asCALL_THISCALL); engine->RegisterObjectBehaviour("CFoo", asBEHAVE_FACTORY, "CFoo@ f()", asFUNCTION(&CFoo::CreateObject), asCALL_CDECL); engine->RegisterObjectMethod("CFoo", "void SetObject(IMyInterface@)", asMETHOD(CFoo, SetScriptObject), asCALL_THISCALL); const char *script = "CBar test; \n" "class CBase : IMyInterface \n" "{ \n" " IMyInterface@ m_dummy; \n" // Comment only this and everything is ok "} \n" "class CBar : CBase \n" "{ \n" " CBar() \n" " { \n" " m_foo.SetObject(this); \n" // Comment only this and everything is ok " } \n" " CFoo m_foo; \n" "}; "; asIScriptModule *mod = engine->GetModule("test", asGM_ALWAYS_CREATE); mod->AddScriptSection("test", script); r = mod->Build(); engine->Release(); } */ return fail; }
bool Test() { bool fail = false; // Create the script engine asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); // Register Function RegisterScriptString(engine); engine->RegisterGlobalFunction("void Print(string &in)", asFUNCTION(PrintString_Generic), asCALL_GENERIC); // Compile asIScriptModule *mod = engine->GetModule(0, asGM_ALWAYS_CREATE); mod->AddScriptSection("script", "class Obj{};" "class Hoge" "{" " Hoge(){ Print('ctor\\n'); }" " ~Hoge(){ Print('dtor\\n'); }" " Obj@ obj;" "};" "void main()" "{" " Hoge hoge;" "};" , 0); mod->Build(); // Context Create asIScriptContext *ctx = engine->CreateContext(); // Loop for( asUINT n = 0; n < 3; n++ ) { // Execute //printf("----- execute\n"); ctx->Prepare(mod->GetFunctionIdByDecl("void main()")); ctx->Execute(); // GC const int GC_STEP_COUNT_PER_FRAME = 100; for ( int i = 0; i < GC_STEP_COUNT_PER_FRAME; ++i ) { engine->GarbageCollect(asGC_ONE_STEP); } // Check status { asUINT currentSize = asUINT(); asUINT totalDestroyed = asUINT(); asUINT totalDetected = asUINT(); engine->GetGCStatistics(¤tSize , &totalDestroyed , &totalDetected ); if( currentSize != 8 || totalDestroyed != n+1 || totalDetected != 0 ) fail = true; //printf("(%lu,%lu,%lu)\n" , currentSize , totalDestroyed , totalDetected ); } } // Release ctx->Release(); engine->Release(); return fail; }