src/squirrel.cpp
author rubidium
Sun, 25 Mar 2007 15:22:56 +0000
branchnoai
changeset 9528 b2cc6f31363c
parent 9525 1d6c509b56ee
child 9535 522eb10df893
permissions -rw-r--r--
(svn r9448) [NoAI] -Codechange: extend the squirrel_export script to update ai_squirrel too.
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
     1
/* $Id$ */
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
     2
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
     3
/** @file squirrel.cpp the implementation of the Squirrel class. It handles all Squirrel-stuff and gives a nice API back to work with. */
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
     4
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
     5
#include <squirrel.h>
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
     6
#include <sqstdio.h>
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
     7
#include <stdarg.h>
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
     8
#include "stdafx.h"
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
     9
#include "debug.h"
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    10
#include "squirrel.hpp"
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    11
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    12
void Squirrel::CompileError(HSQUIRRELVM vm, const SQChar *desc, const SQChar *source, SQInteger line, SQInteger column)
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    13
{
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    14
#ifdef _SQ64
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
    15
	scprintf(_SC("Error %s:%ld/%ld: %s\n"), source, line, column, desc);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    16
#else
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
    17
	scprintf(_SC("Error %s:%d/%d: %s\n"), source, line, column, desc);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    18
#endif
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    19
}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    20
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    21
void Squirrel::RunError(HSQUIRRELVM vm, const char *error)
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    22
{
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    23
	printf("%s\n", error);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    24
}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    25
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    26
SQInteger Squirrel::_RunError(HSQUIRRELVM vm)
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    27
{
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    28
	const SQChar *sErr = 0;
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    29
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    30
	if (sq_gettop(vm) >= 1) {
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    31
		if (SQ_SUCCEEDED(sq_getstring(vm, -1, &sErr))) {
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
    32
			Squirrel::RunError(vm, FS2OTTD(sErr));
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    33
		}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    34
	}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    35
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    36
	Squirrel::RunError(vm, "Unknown error");
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    37
	return 0;
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    38
}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    39
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    40
void Squirrel::PrintFunc(HSQUIRRELVM vm, const SQChar *s, ...)
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    41
{
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    42
	va_list arglist;
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    43
	va_start(arglist, s);
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
    44
	scvprintf(s, arglist);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    45
	va_end(arglist);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    46
	printf("\n");
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    47
}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    48
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    49
void Squirrel::AddMethod(const char *method_name, SQFUNCTION proc, uint nparam, const char *params)
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    50
{
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
    51
	sq_pushstring(this->vm, OTTD2FS(method_name), -1);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    52
	sq_newclosure(this->vm, proc, 0);
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
    53
	sq_setparamscheck(this->vm, nparam, OTTD2FS(params));
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
    54
	sq_setnativeclosurename(this->vm, -1, OTTD2FS(method_name));
9525
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9435
diff changeset
    55
	sq_newslot(this->vm, -3, SQFalse);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    56
}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    57
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    58
void Squirrel::AddMethod(const char *method_name, SQFUNCTION proc)
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    59
{
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
    60
	sq_pushstring(this->vm, OTTD2FS(method_name), -1);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    61
	sq_newclosure(this->vm, proc, 0);
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
    62
	sq_setnativeclosurename(this->vm, -1, OTTD2FS(method_name));
9525
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9435
diff changeset
    63
	sq_newslot(this->vm, -3, SQFalse);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    64
}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    65
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    66
void Squirrel::AddMethod(const char *method_name, SQFUNCTION proc, void *userdata, int size)
9396
a05857491d2d (svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents: 9395
diff changeset
    67
{
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
    68
	sq_pushstring(this->vm, OTTD2FS(method_name), -1);
9396
a05857491d2d (svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents: 9395
diff changeset
    69
a05857491d2d (svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents: 9395
diff changeset
    70
	void *ptr;
a05857491d2d (svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents: 9395
diff changeset
    71
	ptr = sq_newuserdata(vm, size);
a05857491d2d (svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents: 9395
diff changeset
    72
	memcpy(ptr, userdata, size);
a05857491d2d (svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents: 9395
diff changeset
    73
a05857491d2d (svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents: 9395
diff changeset
    74
	sq_newclosure(this->vm, proc, 1);
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
    75
	sq_setnativeclosurename(this->vm, -1, OTTD2FS(method_name));
9525
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9435
diff changeset
    76
	sq_newslot(this->vm, -3, SQFalse);
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9435
diff changeset
    77
}
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9435
diff changeset
    78
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9435
diff changeset
    79
void Squirrel::AddConst(const char *var_name, int value)
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9435
diff changeset
    80
{
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9435
diff changeset
    81
	sq_pushstring(this->vm, OTTD2FS(var_name), -1);
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9435
diff changeset
    82
	sq_pushinteger(this->vm, value);
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9435
diff changeset
    83
	sq_newslot(this->vm, -3, SQTrue);
9396
a05857491d2d (svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents: 9395
diff changeset
    84
}
a05857491d2d (svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents: 9395
diff changeset
    85
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    86
void Squirrel::AddClassBegin(const char *class_name)
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    87
{
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    88
	sq_pushroottable(this->vm);
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
    89
	sq_pushstring(this->vm, OTTD2FS(class_name), -1);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    90
	sq_newclass(this->vm, SQFalse);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    91
}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    92
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    93
void Squirrel::AddClassEnd()
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    94
{
9525
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9435
diff changeset
    95
	sq_newslot(vm, -3, SQFalse);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    96
}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
    97
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    98
bool Squirrel::MethodExists(HSQOBJECT instance, const char *method_name)
9404
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
    99
{
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   100
	int top = sq_gettop(this->vm);
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   101
	/* Go to the instance-root */
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   102
	sq_pushobject(this->vm, instance);
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   103
	/* Find the function-name inside the script */
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
   104
	sq_pushstring(this->vm, OTTD2FS(method_name), -1);
9404
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   105
	if (SQ_FAILED(sq_get(this->vm, -2))) {
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   106
		sq_settop(this->vm, top);
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   107
		return false;
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   108
	}
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   109
	sq_settop(this->vm, top);
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   110
	return true;
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   111
}
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   112
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
   113
void Squirrel::CallMethod(HSQOBJECT instance, const char *method_name, HSQOBJECT *ret)
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   114
{
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   115
	/* Store the current top */
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   116
	int top = sq_gettop(this->vm);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   117
	/* Go to the instance-root */
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   118
	sq_pushobject(this->vm, instance);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   119
	/* Find the function-name inside the script */
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
   120
	sq_pushstring(this->vm, OTTD2FS(method_name), -1);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   121
	if (SQ_FAILED(sq_get(this->vm, -2))) {
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   122
		DEBUG(misc, 0, "[squirrel] Could not find '%s' in the class", method_name);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   123
		sq_settop(this->vm, top);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   124
		return;
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   125
	}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   126
	/* Call the method */
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   127
	sq_pushobject(this->vm, instance);
9404
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   128
	sq_call(this->vm, 1, ret == NULL ? SQFalse : SQTrue, SQFalse);
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
   129
	if (ret != NULL) sq_getstackobj(vm, -1, ret);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   130
	/* Reset the top */
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   131
	sq_settop(this->vm, top);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   132
}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   133
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
   134
bool Squirrel::CreateClassInstance(const char *class_name, void *real_instance, HSQOBJECT *instance)
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   135
{
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   136
	int oldtop = sq_gettop(this->vm);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   137
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   138
	/* First, find the class */
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   139
	sq_pushroottable(this->vm);
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
   140
	sq_pushstring(this->vm, OTTD2FS(class_name), -1);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   141
	if (SQ_FAILED(sq_get(this->vm, -2))) {
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   142
		DEBUG(misc, 0, "[squirrel] Failed to find class by the name '%s'", class_name);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   143
		sq_settop(this->vm, oldtop);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   144
		return false;
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   145
	}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   146
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   147
	/* Create the instance */
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   148
	if (SQ_FAILED(sq_createinstance(this->vm, -1))) {
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   149
		DEBUG(misc, 0, "[squirrel] Failed to create instance for class '%s'", class_name);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   150
		sq_settop(this->vm, oldtop);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   151
		return false;
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   152
	}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   153
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   154
	if (instance != NULL) {
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   155
		/* Find our instance */
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   156
		sq_getstackobj(this->vm, -1, instance);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   157
		/* Add a reference to it, so it survives for ever */
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   158
		sq_addref(this->vm, instance);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   159
	}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   160
	/* Store it in the class */
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   161
	sq_setinstanceup(this->vm, -1, real_instance);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   162
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   163
	/* Reset the top */
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   164
	sq_settop(this->vm, oldtop);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   165
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   166
	return true;
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   167
}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   168
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
   169
Squirrel::Squirrel()
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   170
{
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   171
	this->vm = sq_open(1024);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   172
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   173
	/* Handle compile-errors ourself, so we can display it nicely */
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
   174
	sq_setcompilererrorhandler(this->vm, &Squirrel::CompileError);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   175
	sq_notifyallexceptions(this->vm, SQTrue);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   176
	/* Set a good print-function */
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
   177
	sq_setprintfunc(this->vm, &Squirrel::PrintFunc);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   178
	/* Handle runtime-errors ourself, so we can display it nicely */
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
   179
	sq_newclosure(this->vm, &Squirrel::_RunError, 0);
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   180
	sq_seterrorhandler(this->vm);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   181
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   182
	sq_pushroottable(this->vm);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   183
}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   184
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
   185
bool Squirrel::LoadScript(const char *script)
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   186
{
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   187
	/* Load and run the script */
9435
9dad22394553 (svn r9245) [NoAI] -Fix: allow compilation with _UNICODE
glx
parents: 9434
diff changeset
   188
	if (SQ_FAILED(sqstd_dofile(this->vm, OTTD2FS(script), SQFalse, SQTrue))) {
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   189
		DEBUG(misc, 0, "[squirrel] Failed to compile '%s'", script);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   190
		return false;
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   191
	}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   192
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   193
	return true;
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   194
}
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   195
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
   196
Squirrel::~Squirrel()
9393
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   197
{
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   198
	/* Clean up the stuff */
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   199
	sq_pop(this->vm, 1);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   200
	sq_close(this->vm);
04bd925b9069 (svn r9185) [NoAI] -Codechange: split up the squirrel code so we have SquirrelCore
truelight
parents:
diff changeset
   201
}