mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-12 18:40:29 +00:00
(svn r23186) -Fix [FS#4830]: [Squirrel] replace custom qsort by std::sort to fix stack overflow
This commit is contained in:
parent
a778475eb4
commit
37797164ca
53
src/3rdparty/squirrel/squirrel/sqbaselib.cpp
vendored
53
src/3rdparty/squirrel/squirrel/sqbaselib.cpp
vendored
@ -12,6 +12,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
bool str2num(const SQChar *s,SQObjectPtr &res)
|
bool str2num(const SQChar *s,SQObjectPtr &res)
|
||||||
{
|
{
|
||||||
@ -506,40 +507,26 @@ bool _qsort_compare(HSQUIRRELVM v,SQObjectPtr &arr,SQObjectPtr &a,SQObjectPtr &b
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//QSORT ala Sedgewick
|
struct qsort_cmp
|
||||||
bool _qsort(HSQUIRRELVM v,SQObjectPtr &arr, SQInteger l, SQInteger r,SQInteger func)
|
|
||||||
{
|
{
|
||||||
SQInteger i, j;
|
HSQUIRRELVM v;
|
||||||
SQArray *a=_array(arr);
|
SQInteger func;
|
||||||
SQObjectPtr pivot,t;
|
bool operator() (SQObjectPtr &a, SQObjectPtr &b) const
|
||||||
if( l < r ){
|
{
|
||||||
pivot = a->_values[l];
|
SQInteger res;
|
||||||
i = l; j = r+1;
|
SQObjectPtr dummy;
|
||||||
while(1){
|
if (!_qsort_compare(v, dummy, a, b, func, res)) return false;
|
||||||
SQInteger ret;
|
return res < 0;
|
||||||
do {
|
|
||||||
++i;
|
|
||||||
if(i > r) break;
|
|
||||||
if(!_qsort_compare(v,arr,a->_values[i],pivot,func,ret))
|
|
||||||
return false;
|
|
||||||
} while( ret <= 0);
|
|
||||||
do {
|
|
||||||
--j;
|
|
||||||
if ( j < 0 ) {
|
|
||||||
v->Raise_Error( _SC("Invalid qsort, probably compare function defect") );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if(!_qsort_compare(v,arr,a->_values[j],pivot,func,ret))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
while( ret > 0 );
|
|
||||||
if( i >= j ) break;
|
|
||||||
t = a->_values[i]; a->_values[i] = a->_values[j]; a->_values[j] = t;
|
|
||||||
}
|
|
||||||
t = a->_values[l]; a->_values[l] = a->_values[j]; a->_values[j] = t;
|
|
||||||
if(!_qsort( v, arr, l, j-1,func)) return false;
|
|
||||||
if(!_qsort( v, arr, j+1, r,func)) return false;
|
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool _qsort(HSQUIRRELVM v,SQObjectPtr &arr, SQInteger func)
|
||||||
|
{
|
||||||
|
SQArray *a=_array(arr);
|
||||||
|
qsort_cmp cur_cmp;
|
||||||
|
cur_cmp.v = v;
|
||||||
|
cur_cmp.func = func;
|
||||||
|
std::sort(a->_values._vals, a->_values._vals + a->Size(), cur_cmp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -550,7 +537,7 @@ static SQInteger array_sort(HSQUIRRELVM v)
|
|||||||
SQObject &funcobj = stack_get(v,2);
|
SQObject &funcobj = stack_get(v,2);
|
||||||
if(_array(o)->Size() > 1) {
|
if(_array(o)->Size() > 1) {
|
||||||
if(type(funcobj) == OT_CLOSURE || type(funcobj) == OT_NATIVECLOSURE) func = 2;
|
if(type(funcobj) == OT_CLOSURE || type(funcobj) == OT_NATIVECLOSURE) func = 2;
|
||||||
if(!_qsort(v, o, 0, _array(o)->Size()-1, func))
|
if(!_qsort(v, o, func))
|
||||||
return SQ_ERROR;
|
return SQ_ERROR;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user