Beispiel #1
0
static SQRESULT sq_mysql_constructor(HSQUIRRELVM v)
{
    SQ_FUNC_VARS(v);
    SQ_GET_STRING(v, 2, host);
    SQ_GET_STRING(v, 3, username);
    SQ_GET_STRING(v, 4, password);
    SQ_GET_STRING(v, 5, sourcename);
    SQ_OPT_INTEGER(v, 6, port, 3306);
    SQ_OPT_STRING(v, 7, sockname, NULL);
    SQ_OPT_INTEGER(v, 8, optflags, 0);
    MYSQL *self=0;

    if(load_libmysqlclient(dynamicLibName))
    {
        self = dlmysql_init(NULL);
		if (!self) return sq_throwerror(v, _SC("error connecting: Out of memory."));
		if (!dlmysql_real_connect(self, host, username, password, sourcename, port, sockname, optflags))
		{
			SQRESULT res = sq_throwerror(v, _SC("error connecting to database. MySQL: %s"), dlmysql_error(self));
			dlmysql_close (self); /* Close conn if connect failed */
			return res;
		}
    }
    else return sq_throwerror(v, _SC("Failed to load libmysqlclient !"));

    sq_setinstanceup(v, 1, self);
    sq_setreleasehook(v,1, sq_mysql_releasehook);

    //save a weakref to allow statement return it's db
    sq_pushuserpointer(v, self);
    sq_weakref(v, 1);
    sq_setonregistrytable(v);

    return 1;
}
int SquirrelScriptContext::SquirrelClassConstructorCallback(HSQUIRRELVM vm)
{
	MultiScriptAssert( sq_gettype(vm, -1) == OT_USERPOINTER );

	// Get class info
	void* userPtr = NULL;
	sq_getuserpointer(vm, -1, &userPtr);
	sq_pop(vm, 1);

	SquirrelClassInfo* classInfo = (SquirrelClassInfo*) userPtr;

	// Construct object
	SquirrelScriptObject* scriptObject = new SquirrelScriptObject();
	scriptObject->m_classInfo = classInfo;

	SquirrelScriptStack stack(classInfo->m_context, false);
	classInfo->m_desc->m_constructor(&stack, scriptObject);
	MultiScriptAssert( scriptObject->m_objectPtr );
	MultiScriptAssert( stack.m_numPushed == 0 );

	// There is already an instance on the stack (pushed automatically when constructor was invoked from script)
	// Attach our object to created instance
	sq_setinstanceup(vm, -1, scriptObject);

	// Set garbage collection callback for this instance
	sq_setreleasehook(vm, -1, SquirrelClassGCCallback);

	return 0;
}
Beispiel #3
0
static SQRESULT sq_mysql_exec_query(HSQUIRRELVM v){
	SQ_FUNC_VARS_NO_TOP(v);
	GET_mysql_INSTANCE();
    SQ_GET_STRING(v, 2, szSQL);

	if (dlmysql_real_query(self, szSQL, szSQL_size))
		/* error executing query */
		return sq_throwerror(v, _SC("error executing query. MySQL: %s"), dlmysql_error(self));

    MYSQL_RES *qres = dlmysql_store_result(self);

	sq_pushroottable(v);
	sq_pushstring(v, MySQL_Result_TAG, -1);
	if(sq_get(v, -2) == SQ_OK){
		if(sq_createinstance(v, -1) == SQ_OK){
			sq_setinstanceup(v, -1, qres);
			sq_setreleasehook(v, -1, sq_mysql_result_releasehook);
			sq_pushstring(v, _curr_row_key, -1);
			sq_pushinteger(v, -1);
			sq_set(v, -3);
			return 1;
		}
	}
    return SQ_ERROR;
}
Beispiel #4
0
/*
 * create a instance
 */
SQInteger createSQObject(HSQUIRRELVM v, 
				const char* package_name, const char* name,
				SQUserPointer ptr, SQRELEASEHOOK releaseHook) {
	sq_pushroottable(v);
	
	sq_pushstring(v, package_name, -1);
	if (!SQ_SUCCEEDED(sq_get(v, -2))) {
		sq_pop(v, 1);
		return 0;
	}
	if (name != NULL) {
		sq_pushstring(v, name, -1);
		if (!SQ_SUCCEEDED(sq_get(v, -2))) {
			sq_pop(v, 2);
			return 0;
		}
	}
	
	sq_createinstance(v, -1);
	sq_setinstanceup(v, -1, ptr);
	if (releaseHook != NULL) {
		sq_setreleasehook(v, -1, releaseHook);
	}
	sq_remove(v, -2);
	sq_remove(v, -2);

	return 1;
}
Beispiel #5
0
static SQInteger _file_constructor(HSQUIRRELVM v)
{
	const SQChar *filename,*mode;
	bool owns = true;
	SQFile *f;
	SQFILE newf;
	if(sq_gettype(v,2) == OT_STRING && sq_gettype(v,3) == OT_STRING) {
		sq_getstring(v, 2, &filename);
		sq_getstring(v, 3, &mode);
		newf = sqstd_fopen(filename, mode);
		if(!newf) return sq_throwerror(v, _SC("cannot open file"));
	} else if(sq_gettype(v,2) == OT_USERPOINTER) {
		owns = !(sq_gettype(v,3) == OT_NULL);
		sq_getuserpointer(v,2,&newf);
	} else {
		return sq_throwerror(v,_SC("wrong parameter"));
	}
	f = new SQFile(newf,owns);
	if(SQ_FAILED(sq_setinstanceup(v,1,f))) {
		delete f;
		return sq_throwerror(v, _SC("cannot create blob with negative size"));
	}
	sq_setreleasehook(v,1,_file_releasehook);
	return 0;
}
Beispiel #6
0
//
// Transport.Position class
//
SQInteger TransportPositionPush(HSQUIRRELVM vm, TimePosition *obj)
{
    sq_pushobject(vm, TransportPositionObject);
    sq_createinstance(vm, -1);
    sq_remove(vm, -2);
    sq_setinstanceup(vm, -1, new TimePosition(*obj));
    sq_setreleasehook(vm, -1, &TransportPositionRelease);
}
Beispiel #7
0
static SQRESULT sq_BitVector_constructor(HSQUIRRELVM v){
	SQ_FUNC_VARS_NO_TOP(v);
	SQ_GET_INTEGER(v, 2, int_size);
//	Bitvec *sqlite3BitvecCreate(u32)
    Bitvec *bv = sqlite3BitvecCreate((u32)int_size);
    SQInteger rc = sq_setinstanceup(v, 1, bv);
    sq_setreleasehook(v,1, BitVector_release_hook);
	return rc;
}
Beispiel #8
0
static SQInteger _regexp_constructor( HSQUIRRELVM v ) {
	const SQChar *error, *pattern;
	sq_getstring( v, 2, &pattern );
	SQRex *rex = sqstd_rex_compile( pattern, &error );
	if ( !rex ) return sq_throwerror( v, error );
	sq_setinstanceup( v, 1, rex );
	sq_setreleasehook( v, 1, _rexobj_releasehook );
	return 0;
}
Beispiel #9
0
SQInteger cross(HSQUIRRELVM v){
	T * lhs,* rhs;
	sq_getinstanceup(v,2,(SQUserPointer*)&lhs, 0);
	sq_getinstanceup(v,3,(SQUserPointer*)&rhs, 0);
	T * instance = new T( glm::cross(*lhs,*rhs) );
	sq_setinstanceup(v, 3, instance);
	sq_setreleasehook(v,3, delete_instance<T>);
	return 1;
}
Beispiel #10
0
SQInteger TransportTimeSignatureClone(HSQUIRRELVM vm)
{
    // get instance ptr of original
    SQUserPointer userPtr;
    sq_getinstanceup(vm, 2, &userPtr, 0);
    // set instance ptr to a copy
    sq_setinstanceup(vm, 1, new TimeSignature(*(TimeSignature*)userPtr));
    sq_setreleasehook(vm, 1, &TransportTimeSignatureRelease);
    return 0;
}
Beispiel #11
0
SQInteger constructor<glm::vec2>(HSQUIRRELVM v){
	SQChar const * key; sq_getstring(v,2,(SQChar const**)&key);
	SQFloat x,y;
	SQInteger error = 0;
	error = with_assert_sq_getfloat(v,2,x);if(error) return error;
	error = with_assert_sq_getfloat(v,3,y);if(error) return error;
	glm::vec2 * instance = new glm::vec2(x,y);
	sq_setinstanceup(v, 1, instance);
	sq_setreleasehook(v,1, delete_instance<glm::vec2>);
	return 0;
}
Beispiel #12
0
void CSquirrelVM::SetClassInstance(const char* szClassName, void * pInstance)
{
	sq_setinstanceup(m_pVM, 1, (SQUserPointer *) pInstance);
	sq_setreleasehook(m_pVM, 1, deleteClassInstance);

	HSQOBJECT instance;
	sq_resetobject(&instance);
	sq_getstackobj(m_pVM, 1, &instance);
	sq_addref(m_pVM, &instance);
	m_Instances.insert(std::pair<void*, HSQOBJECT>(pInstance, instance));
}
Beispiel #13
0
SQInteger div_v(HSQUIRRELVM v) {
	SQChar const * buff; sq_getstring(v,2,(SQChar const**)&buff);
	T* lhs;
	sq_getinstanceup(v,1,(SQUserPointer*)&lhs, 0);
	T* rhs;
	sq_getinstanceup(v,2,(SQUserPointer*)&rhs, 0);
	T * instance = new T(*lhs / *rhs);
	sq_setinstanceup(v, 2, instance);
	sq_setreleasehook(v,2, delete_instance<T>);
	return 1;
}
Beispiel #14
0
static SQRESULT sq_minizip_unzip_constructor(HSQUIRRELVM v)
{
    SQ_FUNC_VARS_NO_TOP(v);
    SQ_GET_STRING(v, 2, zip_fname);
    unzFile zip_archive = unzOpen64(zip_fname);
    if(!zip_archive)
    {
        return sq_throwerror(v, _SC("Cannot open %s\n"),zip_fname);
    }
    sq_setinstanceup(v, 1, zip_archive);
    sq_setreleasehook(v,1, sq_minizip_unzip_releasehook);
	return 1;
}
Beispiel #15
0
static SQRESULT sq_ssl_ctx_constructor(HSQUIRRELVM v)
{
	SQInteger options, num_sessions;
    sq_getinteger(v, 2, &options);
    sq_getinteger(v, 3, &num_sessions);

	SSL_CTX *ssl_ctx = ssl_ctx_new(options, num_sessions);
    if(!ssl_ctx)
        return sq_throwerror(v, _SC("Could'nt create an ssl context."));

    sq_setinstanceup(v, 1, ssl_ctx);
    sq_setreleasehook(v,1, ssl_ctx_release_hook);
	return 1;
}
Beispiel #16
0
static SQRESULT sq_libclang_constructor(HSQUIRRELVM v)
{
    //SQ_FUNC_VARS_NO_TOP(v);
    if(!load_dynamicLib(dynamicLibName)) return sq_throwerror(v, _SC("Failed to load libclang !"));

    MyLibClang *self = (MyLibClang *)sq_malloc(sizeof(MyLibClang));
    memset(self, 0, sizeof(MyLibClang));
    self->v = v;
    self->index = dlclang_createIndex(0, 0);

    sq_setinstanceup(v, 1, self);
    sq_setreleasehook(v,1, sq_libclang_releasehook);

    return 1;
}
Beispiel #17
0
	inline SQInteger DefSQConstructorCallback(HSQUIRRELVM vm)
	{
		/* Find the amount of params we got */
		int nparam = sq_gettop(vm);

		try {
			/* Create the real instance */
			Tcls *instance = HelperT<Tmethod>::SQConstruct((Tcls *)NULL, (Tmethod)NULL, vm);
			sq_setinstanceup(vm, -Tnparam, instance);
			sq_setreleasehook(vm, -Tnparam, DefSQDestructorCallback<Tcls>);
			instance->AddRef();
			return 0;
		} catch (SQInteger e) {
			sq_pop(vm, nparam);
			return e;
		}
	}
Beispiel #18
0
static SQRESULT ssl_constructor(HSQUIRRELVM v, SSL *ssl, int free_on_gc)
{
    if(!ssl)
        return sq_throwerror(v, _SC("Could'nt create an ssl object."));

    sq_pushstring(v, SQ_LIBNAME, -1);
    if(sq_getonroottable(v) == SQ_OK){
        sq_pushstring(v, ssl_NAME, -1);
        if(sq_get(v, -2) == SQ_OK){
            if(sq_createinstance(v, -1) == SQ_OK){
                sq_setinstanceup(v, -1, ssl);
                if(free_on_gc) sq_setreleasehook(v,-1, ssl_release_hook);
                return 1;
            }
        }
    }
	return SQ_ERROR;
}
Beispiel #19
0
SQInteger TransportPositionCtor(HSQUIRRELVM vm)
{
    SQInteger numargs = sq_gettop(vm);
    // check parameter count
    if(numargs > 4) {
        return sq_throwerror(vm, "too many parameters, expected at most 3");
    }
    if(numargs < 4) {
        return sq_throwerror(vm, "insufficient parameters, expected at least 3");
    }
    // get parameter 1 "bar" as integer
    SQInteger bar;
    if (SQ_FAILED(sq_getinteger(vm, 2, &bar))){
        return sq_throwerror(vm, "argument 1 \"bar\" is not of type integer");
    }

    // get parameter 2 "position" as integer
    SQInteger position;
    if (SQ_FAILED(sq_getinteger(vm, 3, &position))){
        return sq_throwerror(vm, "argument 2 \"position\" is not of type integer");
    }

    // get parameter 3 "division" as integer
    SQInteger division;
    if (SQ_FAILED(sq_getinteger(vm, 4, &division))){
        return sq_throwerror(vm, "argument 3 \"division\" is not of type integer");
    }

    TimePosition *obj;
    // call the implementation
    try {
        obj = new TimePosition(bar, position, division);
    }
    catch(std::exception const& e) {
        return sq_throwerror(vm, e.what());
    }

    // return pointer to new object
    sq_setinstanceup(vm, 1, (SQUserPointer*)obj);
    sq_setreleasehook(vm, 1, TransportPositionRelease);
    return 1;
}
Beispiel #20
0
void CSquirrelVM::PushInstance(const char* szClassName, void * pInstance)
{
	// TODO:: remove instances when they are destoryed
	if (m_Instances.find(pInstance) != m_Instances.end())
	{
		sq_pushobject(m_pVM, m_Instances.find(pInstance)->second);
	}
	else
	{
		CreateConstructNativeClassInstance(m_pVM, szClassName);

		sq_setinstanceup(m_pVM, -1, (SQUserPointer *) pInstance);
		sq_setreleasehook(m_pVM, -1, deleteClassInstance);

		HSQOBJECT instance;
		sq_resetobject(&instance);
		sq_getstackobj(m_pVM, -1, &instance);
		sq_addref(m_pVM, &instance);
		m_Instances.insert(std::pair<void*, HSQOBJECT>(pInstance, instance));
	}
}
Beispiel #21
0
/**
 * TJSオブジェクトのコンストラクタ
 * 引数1 オブジェクト
 * 引数2〜 引数
 * 自由変数1 TJSクラスオブジェクト
 */
SQRESULT
TJSObject::tjsConstructor(HSQUIRRELVM v)
{
    // クラスを生成する
    tTJSVariant tjsClassObj;
    if (SQ_SUCCEEDED(sq_getvariant(v, -1, &tjsClassObj)) && tjsClassObj.Type() == tvtObject) {
        FuncInfo info(v, tjsClassObj, 2);
        tTJSVariant variant;
        SQRESULT ret = info.create(variant);
        if (SQ_SUCCEEDED(ret)) {
            TJSObject *self = new TJSObject(v, 1, variant);
            if (SQ_SUCCEEDED(sq_setinstanceup(v, 1, self))) {
                sq_setreleasehook(v, 1, release);
            } else {
                delete self;
            }
        }
        return ret;
    }
    return ERROR_CREATE(v);
}
Beispiel #22
0
bool CreateNativeClassInstance(HSQUIRRELVM v,
	const SQChar *classname,
	SQUserPointer ud,
	SQRELEASEHOOK hook)
	 {
			// If we don't do this, SquirrelVM keeps an old pointer around and this 
				// will be used by SquirrelObject. That crashes when using several VMs.
			
			int oldtop = sq_gettop(v);
		sq_pushroottable(v);
		sq_pushstring(v, classname, -1);
		if (SQ_FAILED(sq_rawget(v, -2))){ //Get the class (created with sq_newclass()).
			sq_settop(v, oldtop);
			return false;
			
		}
			//sq_pushroottable(v);
			if (SQ_FAILED(sq_createinstance(v, -1))) {
				sq_settop(v, oldtop);
				return false;
				
			}
		
			#ifdef SQ_USE_CLASS_INHERITANCE
			 HSQOBJECT ho;
		sq_getstackobj(v, -1, &ho); // OT_INSTANCE
		SquirrelObject instance(ho);
		SqPlus::PopulateAncestry(v, instance, ud);
		#endif
			
			sq_remove(v, -3); //removes the root table
		sq_remove(v, -2); //removes the class
		if (SQ_FAILED(sq_setinstanceup(v, -1, ud))) {
			sq_settop(v, oldtop);
			return false;
			
		}
		sq_setreleasehook(v, -1, hook);
		return true;
		}
Beispiel #23
0
static SQRESULT sq_mysql_prepare(HSQUIRRELVM v){
	SQ_FUNC_VARS_NO_TOP(v);
	GET_mysql_INSTANCE();
    SQ_GET_STRING(v, 2, szSQL);

    MYSQL_STMT *stmt = dlmysql_stmt_init(self);
    if (!stmt) return sq_throwerror(v, _SC(" mysql_stmt_init(), out of memory\n"));

    if (dlmysql_stmt_prepare(stmt, szSQL, szSQL_size)) {
    	SQRESULT res = sq_throwerror(v, dlmysql_stmt_error(stmt));
    	dlmysql_stmt_close(stmt);
    	return res;
    }

	unsigned long expected_params = dlmysql_stmt_param_count(stmt);
	size_t bind_params_info_size = sizeof(MYSQL_BIND) * expected_params;
	size_t bind_params_data_size = sizeof(double) * expected_params;
	size_t bind_data_buffer_size = bind_params_info_size + bind_params_data_size;

	size_t st_mysq_stmt_size = sizeof(SQ_MysqlStatement) + bind_data_buffer_size;

    SQ_MysqlStatement *sq_stmt = (SQ_MysqlStatement*)sq_malloc(st_mysq_stmt_size);
    sq_stmt->stmt = stmt;
    sq_stmt->bind_data_buffer_size = bind_data_buffer_size;
    sq_stmt->param_count = expected_params;
    sq_stmt->bind_params_info = (MYSQL_BIND*)sq_stmt->bind_data_buffer;
    sq_stmt->bind_params_data = ((char*)sq_stmt->bind_params_info) + bind_params_info_size;

	sq_pushroottable(v);
	sq_pushstring(v, MySQL_Statement_TAG, -1);
	if(sq_get(v, -2) == SQ_OK){
		if(sq_createinstance(v, -1) == SQ_OK){
			sq_setinstanceup(v, -1, sq_stmt);
			sq_setreleasehook(v, -1, sq_mysql_statement_releasehook);
			return 1;
		}
    }
    return SQ_ERROR;
}
BOOL SbuCreateNativeClassInstance(HSQUIRRELVM v,const SQChar *classname,SQUserPointer ud,SQRELEASEHOOK hook)
{
	int oldtop = sq_gettop(v);
	sq_pushroottable(v);
	sq_pushstring(v,classname,-1);
	if(SQ_FAILED(sq_rawget(v,-2))){
		sq_settop(v,oldtop);
		return FALSE;
	}
	//sq_pushroottable(v);
	if(SQ_FAILED(sq_createinstance(v,-1))) {
		sq_settop(v,oldtop);
		return FALSE;
	}
	sq_remove(v,-3); //removes the root table
	sq_remove(v,-2); //removes the the class
	if(SQ_FAILED(sq_setinstanceup(v,-1,ud))) {
		sq_settop(v,oldtop);
		return FALSE;
	}
	sq_setreleasehook(v,-1,hook);
	return TRUE;
}
Beispiel #25
0
/* static */ bool Squirrel::CreateClassInstanceVM(HSQUIRRELVM vm, const char *class_name, void *real_instance, HSQOBJECT *instance, SQRELEASEHOOK release_hook)
{
	int oldtop = sq_gettop(vm);

	/* First, find the class */
	sq_pushroottable(vm);
	sq_pushstring(vm, OTTD2SQ(class_name), -1);
	if (SQ_FAILED(sq_get(vm, -2))) {
		DEBUG(misc, 0, "[squirrel] Failed to find class by the name '%s'", class_name);
		sq_settop(vm, oldtop);
		return false;
	}

	/* Create the instance */
	if (SQ_FAILED(sq_createinstance(vm, -1))) {
		DEBUG(misc, 0, "[squirrel] Failed to create instance for class '%s'", class_name);
		sq_settop(vm, oldtop);
		return false;
	}

	if (instance != NULL) {
		/* Find our instance */
		sq_getstackobj(vm, -1, instance);
		/* Add a reference to it, so it survives for ever */
		sq_addref(vm, instance);
	}
	sq_remove(vm, -2); // Class-name
	sq_remove(vm, -2); // Root-table

	/* Store it in the class */
	sq_setinstanceup(vm, -1, real_instance);
	if (release_hook != NULL) sq_setreleasehook(vm, -1, release_hook);

	if (instance != NULL) sq_settop(vm, oldtop);

	return true;
}
Beispiel #26
0
SQInteger TransportTimeSignatureCtor(HSQUIRRELVM vm)
{
    SQInteger numargs = sq_gettop(vm);
    // check parameter count
    if(numargs > 3) {
        return sq_throwerror(vm, "too many parameters, expected at most 2");
    }
    if(numargs < 3) {
        return sq_throwerror(vm, "insufficient parameters, expected at least 2");
    }
    // get parameter 1 "numerator" as integer
    SQInteger numerator;
    if (SQ_FAILED(sq_getinteger(vm, 2, &numerator))){
        return sq_throwerror(vm, "argument 1 \"numerator\" is not of type integer");
    }

    // get parameter 2 "denominator" as integer
    SQInteger denominator;
    if (SQ_FAILED(sq_getinteger(vm, 3, &denominator))){
        return sq_throwerror(vm, "argument 2 \"denominator\" is not of type integer");
    }

    TimeSignature *obj;
    // call the implementation
    try {
        obj = new TimeSignature(numerator, denominator);
    }
    catch(std::exception const& e) {
        return sq_throwerror(vm, e.what());
    }

    // return pointer to new object
    sq_setinstanceup(vm, 1, (SQUserPointer*)obj);
    sq_setreleasehook(vm, 1, TransportTimeSignatureRelease);
    return 1;
}
Beispiel #27
0
/*
** Creates a new SQuirrel vm.
*/
static SQRESULT sq_slave_vm_constructor (HSQUIRRELVM v)
{
    SQ_FUNC_VARS(v);
    SQ_OPT_INTEGER(v, 2, stack_size, 1024);
    HSQUIRRELVM self = sq_open(stack_size);

    /* Initialize environment */
    sq_setprintfunc(self,sq_getprintfunc(v),sq_geterrorfunc(v));

    /* load base libraries */
    sq_pushroottable(self);

    sqstd_register_bloblib(self);
    sqstd_register_iolib(self);
    sqstd_register_systemlib(self);
    sqstd_register_mathlib(self);
    sqstd_register_stringlib(self);
    sq_poptop(self); //remove root table

    sq_setinstanceup(v, 1, self);
    sq_setreleasehook(v, 1, sq_slave_vm_release_hook);

    return 1;
}
SQInteger construct_RefCounted(IUnknown *p)
{
    sq_setinstanceup(SquirrelVM::GetVMPtr(),1,p);
    sq_setreleasehook(SquirrelVM::GetVMPtr(),1,refcounted_release_hook);
    return 1;
}
int construct_RefCounted(HSQUIRRELVM v,IUnknown *p)
{
	sq_setinstanceup(v,1,p);
	sq_setreleasehook(v,1,refcounted_release_hook);
	return 1;
}
Beispiel #30
-6
/* static */ bool Squirrel::CreateClassInstanceVM(HSQUIRRELVM vm, const char *class_name, void *real_instance, HSQOBJECT *instance, SQRELEASEHOOK release_hook, bool prepend_API_name)
{
	Squirrel *engine = (Squirrel *)sq_getforeignptr(vm);

	int oldtop = sq_gettop(vm);

	/* First, find the class */
	sq_pushroottable(vm);

	if (prepend_API_name) {
		size_t len = strlen(class_name) + strlen(engine->GetAPIName()) + 1;
		char *class_name2 = (char *)alloca(len);
		seprintf(class_name2, class_name2 + len - 1, "%s%s", engine->GetAPIName(), class_name);

		sq_pushstring(vm, class_name2, -1);
	} else {
		sq_pushstring(vm, class_name, -1);
	}

	if (SQ_FAILED(sq_get(vm, -2))) {
		DEBUG(misc, 0, "[squirrel] Failed to find class by the name '%s%s'", prepend_API_name ? engine->GetAPIName() : "", class_name);
		sq_settop(vm, oldtop);
		return false;
	}

	/* Create the instance */
	if (SQ_FAILED(sq_createinstance(vm, -1))) {
		DEBUG(misc, 0, "[squirrel] Failed to create instance for class '%s%s'", prepend_API_name ? engine->GetAPIName() : "", class_name);
		sq_settop(vm, oldtop);
		return false;
	}

	if (instance != NULL) {
		/* Find our instance */
		sq_getstackobj(vm, -1, instance);
		/* Add a reference to it, so it survives for ever */
		sq_addref(vm, instance);
	}
	sq_remove(vm, -2); // Class-name
	sq_remove(vm, -2); // Root-table

	/* Store it in the class */
	sq_setinstanceup(vm, -1, real_instance);
	if (release_hook != NULL) sq_setreleasehook(vm, -1, release_hook);

	if (instance != NULL) sq_settop(vm, oldtop);

	return true;
}