asIScriptEngine *qasCreateEngine( bool *asMaxPortability ) { asIScriptEngine *engine; // register the global memory allocation and deallocation functions asSetGlobalMemoryFunctions( qasAlloc, qasFree ); // always new // ask for angelscript initialization and script engine creation engine = asCreateScriptEngine( ANGELSCRIPT_VERSION ); if( !engine ) return NULL; if( strstr( asGetLibraryOptions(), "AS_MAX_PORTABILITY" ) ) { QAS_Printf( "* angelscript library with AS_MAX_PORTABILITY detected\n" ); engine->Release(); return NULL; } *asMaxPortability = false; // The script compiler will write any compiler messages to the callback. engine->SetMessageCallback( asFUNCTION( qasMessageCallback ), 0, asCALL_CDECL ); engine->SetEngineProperty( asEP_ALWAYS_IMPL_DEFAULT_CONSTRUCT, 1 ); PreRegisterMathAddon( engine ); PreRegisterScriptArray( engine, true ); PreRegisterStringAddon( engine ); PreRegisterScriptDictionary( engine ); PreRegisterTimeAddon( engine ); PreRegisterScriptAny( engine ); PreRegisterVec3Addon( engine ); PreRegisterCvarAddon( engine ); PreRegisterStringUtilsAddon( engine ); RegisterMathAddon( engine ); RegisterScriptArray( engine, true ); RegisterStringAddon( engine ); RegisterScriptDictionary( engine ); RegisterTimeAddon( engine ); RegisterScriptAny( engine ); RegisterVec3Addon( engine ); RegisterCvarAddon( engine ); RegisterStringUtilsAddon( engine ); return engine; }
bool Test() { bool fail = false; int r; COutStream out; CBufferedOutStream bout; asIScriptEngine *engine = 0; engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); engine->SetMessageCallback(asMETHOD(COutStream, Callback), &out, asCALL_THISCALL); RegisterScriptString(engine); RegisterScriptDictionary(engine); r = engine->RegisterGlobalFunction("void assert(bool)", asFUNCTION(Assert), asCALL_GENERIC); assert( r >= 0 ); asIScriptModule *mod = engine->GetModule(0, asGM_ALWAYS_CREATE); mod->AddScriptSection("script", script, strlen(script)); r = mod->Build(); if( r < 0 ) fail = true; asIScriptContext *ctx = 0; r = engine->ExecuteString(0, "Test()", &ctx); if( r != asEXECUTION_FINISHED ) { if( r == asEXECUTION_EXCEPTION ) PrintException(ctx); fail = true; } ctx->Release(); asUINT gcCurrentSize, gcTotalDestroyed, gcTotalDetected; engine->GetGCStatistics(&gcCurrentSize, &gcTotalDestroyed, &gcTotalDetected); engine->GarbageCollect(); engine->GetGCStatistics(&gcCurrentSize, &gcTotalDestroyed, &gcTotalDetected); if( gcCurrentSize != 0 || gcTotalDestroyed != 1 || gcTotalDetected != 1 ) fail = true; // Test circular references including a script class and the dictionary mod->AddScriptSection("script", script2, strlen(script2)); r = mod->Build(); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "f()"); if( r != asEXECUTION_FINISHED ) fail = true; engine->GetGCStatistics(&gcCurrentSize, &gcTotalDestroyed, &gcTotalDetected); engine->GarbageCollect(); engine->GetGCStatistics(&gcCurrentSize, &gcTotalDestroyed, &gcTotalDetected); if( gcCurrentSize != 0 || gcTotalDestroyed != 3 || gcTotalDetected != 3 ) fail = true; // Test invalid ref cast together with the variable argument bout.buffer = ""; engine->SetMessageCallback(asMETHOD(CBufferedOutStream, Callback), &bout, asCALL_THISCALL); r = engine->ExecuteString(0, "dictionary d; d.set('hello', cast<int>(4));"); if( r >= 0 ) fail = true; if( bout.buffer != "ExecuteString (1, 35) : Error : Illegal target type for reference cast\n" ) { fail = true; printf(bout.buffer.c_str()); } engine->Release(); //------------------------- // Test the generic interface as well engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); engine->SetMessageCallback(asMETHOD(COutStream, Callback), &out, asCALL_THISCALL); RegisterScriptString(engine); RegisterScriptDictionary_Generic(engine); r = engine->RegisterGlobalFunction("void assert(bool)", asFUNCTION(Assert), asCALL_GENERIC); assert( r >= 0 ); mod = engine->GetModule(0, asGM_ALWAYS_CREATE); mod->AddScriptSection("script", script, strlen(script)); r = mod->Build(); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "Test()", &ctx); if( r != asEXECUTION_FINISHED ) { if( r == asEXECUTION_EXCEPTION ) PrintException(ctx); fail = true; } ctx->Release(); engine->Release(); return fail; }