summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryexo <yexo@openttd.org>2009-09-10 20:19:12 +0000
committeryexo <yexo@openttd.org>2009-09-10 20:19:12 +0000
commitca6c4ee98ade5710757ed662108823525a4ee4c7 (patch)
tree4ff6fb521658b17e4e0801cd1d7b82f70fe5be85
parent6175ee0fa41ea8a9d5c84aed8e47a5f4d3e9a6b7 (diff)
downloadopenttd-ca6c4ee98ade5710757ed662108823525a4ee4c7.tar.xz
(svn r17498) -Add [NoAI]: Enable the squirrel std math library
-rw-r--r--projects/openttd_vs80.vcproj4
-rw-r--r--projects/openttd_vs90.vcproj4
-rw-r--r--source.list1
-rw-r--r--src/3rdparty/squirrel/include/squirrel.h1
-rw-r--r--src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp40
-rw-r--r--src/3rdparty/squirrel/squirrel/sqapi.cpp5
-rw-r--r--src/script/squirrel.hpp1
-rw-r--r--src/script/squirrel_std.cpp15
-rw-r--r--src/script/squirrel_std.hpp4
9 files changed, 42 insertions, 33 deletions
diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj
index b837c6174..4acb0236b 100644
--- a/projects/openttd_vs80.vcproj
+++ b/projects/openttd_vs80.vcproj
@@ -2448,6 +2448,10 @@
>
</File>
<File
+ RelativePath=".\..\src\3rdparty\squirrel\sqstdlib\sqstdmath.cpp"
+ >
+ </File>
+ <File
RelativePath=".\..\src\3rdparty\squirrel\squirrel\sqtable.cpp"
>
</File>
diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj
index 503039a3a..93c592a75 100644
--- a/projects/openttd_vs90.vcproj
+++ b/projects/openttd_vs90.vcproj
@@ -2445,6 +2445,10 @@
>
</File>
<File
+ RelativePath=".\..\src\3rdparty\squirrel\sqstdlib\sqstdmath.cpp"
+ >
+ </File>
+ <File
RelativePath=".\..\src\3rdparty\squirrel\squirrel\sqtable.cpp"
>
</File>
diff --git a/source.list b/source.list
index c1bdb6a30..c1ca1b352 100644
--- a/source.list
+++ b/source.list
@@ -541,6 +541,7 @@ script/squirrel_std.hpp
3rdparty/squirrel/squirrel/sqobject.cpp
3rdparty/squirrel/squirrel/sqstate.cpp
3rdparty/squirrel/sqstdlib/sqstdaux.cpp
+3rdparty/squirrel/sqstdlib/sqstdmath.cpp
3rdparty/squirrel/squirrel/sqtable.cpp
3rdparty/squirrel/squirrel/sqvm.cpp
diff --git a/src/3rdparty/squirrel/include/squirrel.h b/src/3rdparty/squirrel/include/squirrel.h
index 63fb96e39..7963a54c3 100644
--- a/src/3rdparty/squirrel/include/squirrel.h
+++ b/src/3rdparty/squirrel/include/squirrel.h
@@ -314,6 +314,7 @@ SQUIRREL_API bool sq_resumecatch(HSQUIRRELVM v, int suspend = -1);
SQUIRREL_API bool sq_resumeerror(HSQUIRRELVM v);
SQUIRREL_API SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool resumedret,SQBool retval,SQBool raiseerror,SQBool throwerror);
SQUIRREL_API SQInteger sq_getvmstate(HSQUIRRELVM v);
+SQUIRREL_API void sq_decreaseops(HSQUIRRELVM v, int amount);
/*compiler*/
SQUIRREL_API SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror);
diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp
index 7d35f40e4..0e8847dcf 100644
--- a/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp
+++ b/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp
@@ -4,15 +4,17 @@
#include <stdlib.h>
#include <sqstdmath.h>
-#define SINGLE_ARG_FUNC(_funcname) static SQInteger math_##_funcname(HSQUIRRELVM v){ \
+#define SINGLE_ARG_FUNC(_funcname, num_ops) static SQInteger math_##_funcname(HSQUIRRELVM v){ \
SQFloat f; \
+ sq_decreaseops(v,num_ops); \
sq_getfloat(v,2,&f); \
sq_pushfloat(v,(SQFloat)_funcname(f)); \
return 1; \
}
-#define TWO_ARGS_FUNC(_funcname) static SQInteger math_##_funcname(HSQUIRRELVM v){ \
+#define TWO_ARGS_FUNC(_funcname, num_ops) static SQInteger math_##_funcname(HSQUIRRELVM v){ \
SQFloat p1,p2; \
+ sq_decreaseops(v,num_ops); \
sq_getfloat(v,2,&p1); \
sq_getfloat(v,3,&p2); \
sq_pushfloat(v,(SQFloat)_funcname(p1,p2)); \
@@ -42,21 +44,21 @@ static SQInteger math_abs(HSQUIRRELVM v)
return 1;
}
-SINGLE_ARG_FUNC(sqrt)
-SINGLE_ARG_FUNC(fabs)
-SINGLE_ARG_FUNC(sin)
-SINGLE_ARG_FUNC(cos)
-SINGLE_ARG_FUNC(asin)
-SINGLE_ARG_FUNC(acos)
-SINGLE_ARG_FUNC(log)
-SINGLE_ARG_FUNC(log10)
-SINGLE_ARG_FUNC(tan)
-SINGLE_ARG_FUNC(atan)
-TWO_ARGS_FUNC(atan2)
-TWO_ARGS_FUNC(pow)
-SINGLE_ARG_FUNC(floor)
-SINGLE_ARG_FUNC(ceil)
-SINGLE_ARG_FUNC(exp)
+SINGLE_ARG_FUNC(sqrt, 100)
+SINGLE_ARG_FUNC(fabs, 1)
+SINGLE_ARG_FUNC(sin, 100)
+SINGLE_ARG_FUNC(cos, 100)
+SINGLE_ARG_FUNC(asin, 100)
+SINGLE_ARG_FUNC(acos, 100)
+SINGLE_ARG_FUNC(log, 100)
+SINGLE_ARG_FUNC(log10, 100)
+SINGLE_ARG_FUNC(tan, 100)
+SINGLE_ARG_FUNC(atan, 100)
+TWO_ARGS_FUNC(atan2, 100)
+TWO_ARGS_FUNC(pow, 100)
+SINGLE_ARG_FUNC(floor, 1)
+SINGLE_ARG_FUNC(ceil, 1)
+SINGLE_ARG_FUNC(exp, 100)
#define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),math_##name,nparams,tycheck}
static SQRegFunction mathlib_funcs[] = {
@@ -74,8 +76,10 @@ static SQRegFunction mathlib_funcs[] = {
_DECL_FUNC(floor,2,_SC(".n")),
_DECL_FUNC(ceil,2,_SC(".n")),
_DECL_FUNC(exp,2,_SC(".n")),
+#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
_DECL_FUNC(srand,2,_SC(".n")),
_DECL_FUNC(rand,1,NULL),
+#endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */
_DECL_FUNC(fabs,2,_SC(".n")),
_DECL_FUNC(abs,2,_SC(".n")),
{0,0,0,0},
@@ -96,9 +100,11 @@ SQRESULT sqstd_register_mathlib(HSQUIRRELVM v)
sq_createslot(v,-3);
i++;
}
+#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
sq_pushstring(v,_SC("RAND_MAX"),-1);
sq_pushinteger(v,RAND_MAX);
sq_createslot(v,-3);
+#endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */
sq_pushstring(v,_SC("PI"),-1);
sq_pushfloat(v,(SQFloat)M_PI);
sq_createslot(v,-3);
diff --git a/src/3rdparty/squirrel/squirrel/sqapi.cpp b/src/3rdparty/squirrel/squirrel/sqapi.cpp
index bfe4ba449..e3b37f420 100644
--- a/src/3rdparty/squirrel/squirrel/sqapi.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqapi.cpp
@@ -90,6 +90,11 @@ SQInteger sq_getvmstate(HSQUIRRELVM v)
}
}
+void sq_decreaseops(HSQUIRRELVM v, int amount)
+{
+ v->DecreaseOps(amount);
+}
+
bool sq_can_suspend(HSQUIRRELVM v)
{
return v->_nnativecalls <= 2;
diff --git a/src/script/squirrel.hpp b/src/script/squirrel.hpp
index 699a667d6..68948851d 100644
--- a/src/script/squirrel.hpp
+++ b/src/script/squirrel.hpp
@@ -55,6 +55,7 @@ protected:
public:
friend class AIScanner;
friend class AIInstance;
+ friend void squirrel_register_std(Squirrel *engine);
Squirrel();
~Squirrel();
diff --git a/src/script/squirrel_std.cpp b/src/script/squirrel_std.cpp
index 94e84245e..f831231d8 100644
--- a/src/script/squirrel_std.cpp
+++ b/src/script/squirrel_std.cpp
@@ -10,6 +10,7 @@
/** @file squirrel_std.cpp Implements the Squirrel Standard Function class */
#include <squirrel.h>
+#include <sqstdmath.h>
#include "../stdafx.h"
#include "../debug.h"
#include "squirrel.hpp"
@@ -17,17 +18,6 @@
#include "../core/alloc_func.hpp"
#include "../core/math_func.hpp"
-/* abs() is normally defined to myabs(), which we don't want in this file */
-#undef abs
-
-SQInteger SquirrelStd::abs(HSQUIRRELVM vm)
-{
- SQInteger tmp;
-
- sq_getinteger(vm, 2, &tmp);
- sq_pushinteger(vm, ::abs(tmp));
- return 1;
-}
SQInteger SquirrelStd::min(HSQUIRRELVM vm)
{
@@ -118,7 +108,8 @@ void squirrel_register_std(Squirrel *engine)
{
/* We don't use squirrel_helper here, as we want to register to the global
* scope and not to a class. */
- engine->AddMethod("abs", &SquirrelStd::abs, 2, ".i");
engine->AddMethod("min", &SquirrelStd::min, 3, ".ii");
engine->AddMethod("max", &SquirrelStd::max, 3, ".ii");
+
+ sqstd_register_mathlib(engine->GetVM());
}
diff --git a/src/script/squirrel_std.hpp b/src/script/squirrel_std.hpp
index 1751f6a67..76af3c155 100644
--- a/src/script/squirrel_std.hpp
+++ b/src/script/squirrel_std.hpp
@@ -25,10 +25,6 @@
*/
class SquirrelStd {
public:
- /**
- * Make an integer absolute.
- */
- static SQInteger abs(HSQUIRRELVM vm);
/**
* Get the lowest of two integers.