diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj index b837c61746..4acb0236ba 100644 --- a/projects/openttd_vs80.vcproj +++ b/projects/openttd_vs80.vcproj @@ -2447,6 +2447,10 @@ RelativePath=".\..\src\3rdparty\squirrel\sqstdlib\sqstdaux.cpp" > + + diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj index 503039a3ac..93c592a75b 100644 --- a/projects/openttd_vs90.vcproj +++ b/projects/openttd_vs90.vcproj @@ -2444,6 +2444,10 @@ RelativePath=".\..\src\3rdparty\squirrel\sqstdlib\sqstdaux.cpp" > + + diff --git a/source.list b/source.list index c1bdb6a306..c1ca1b352f 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 63fb96e394..7963a54c3b 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 7d35f40e42..0e8847dcf2 100644 --- a/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp +++ b/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp @@ -4,15 +4,17 @@ #include #include -#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 bfe4ba449e..e3b37f420d 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 699a667d63..68948851d9 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 94e84245e0..f831231d8b 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 +#include #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 1751f6a677..76af3c155c 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.