2025-02-05 12:40:54 +10:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
2023-07-12 13:27:26 +10:00
|
|
|
* vim: set sw=4 ts=8 et tw=78:
|
2018-09-08 18:08:48 +08:00
|
|
|
*
|
|
|
|
|
* ***** BEGIN LICENSE BLOCK *****
|
|
|
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
|
|
|
*
|
|
|
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
|
* the License. You may obtain a copy of the License at
|
|
|
|
|
* http://www.mozilla.org/MPL/
|
|
|
|
|
*
|
|
|
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
|
* License.
|
|
|
|
|
*
|
|
|
|
|
* The Original Code is Mozilla Communicator client code, released
|
|
|
|
|
* March 31, 1998.
|
|
|
|
|
*
|
|
|
|
|
* The Initial Developer of the Original Code is
|
|
|
|
|
* Netscape Communications Corporation.
|
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
|
|
|
|
*
|
|
|
|
|
* Contributor(s):
|
|
|
|
|
*
|
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
|
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
|
|
|
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
|
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
|
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
|
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
|
* the provisions above, a recipient may use your version of this file under
|
|
|
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
|
|
|
*
|
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* JS array class.
|
2023-07-12 13:27:26 +10:00
|
|
|
*
|
2025-02-05 12:40:54 +10:00
|
|
|
* Array objects begin as "dense" arrays, optimized for index-only property
|
|
|
|
|
* access over a vector of slots with high load factor. Array methods
|
|
|
|
|
* optimize for denseness by testing that the object's class is
|
2023-07-12 13:27:26 +10:00
|
|
|
* &js_ArrayClass, and can then directly manipulate the slots for efficiency.
|
|
|
|
|
*
|
|
|
|
|
* We track these pieces of metadata for arrays in dense mode:
|
2025-02-05 12:40:54 +10:00
|
|
|
* - The array's length property as a uint32, accessible with
|
2025-03-19 21:25:58 +10:00
|
|
|
* getArrayLength(), setArrayLength().
|
2025-02-05 12:40:54 +10:00
|
|
|
* - The number of element slots (capacity), gettable with
|
|
|
|
|
* getDenseArrayCapacity().
|
2023-07-12 13:27:26 +10:00
|
|
|
*
|
2025-03-19 21:25:58 +10:00
|
|
|
* In dense mode, holes in the array are represented by
|
|
|
|
|
* MagicValue(JS_ARRAY_HOLE) invalid values.
|
2025-02-05 12:40:54 +10:00
|
|
|
*
|
|
|
|
|
* NB: the capacity and length of a dense array are entirely unrelated! The
|
2025-03-19 21:25:58 +10:00
|
|
|
* length may be greater than, less than, or equal to the capacity. The first
|
|
|
|
|
* case may occur when the user writes "new Array(100), in which case the
|
|
|
|
|
* length is 100 while the capacity remains 0 (indices below length and above
|
|
|
|
|
* capaicty must be treated as holes). See array_length_setter for another
|
|
|
|
|
* explanation of how the first case may occur.
|
2023-07-12 13:27:26 +10:00
|
|
|
*
|
|
|
|
|
* Arrays are converted to use js_SlowArrayClass when any of these conditions
|
|
|
|
|
* are met:
|
2025-03-19 21:25:58 +10:00
|
|
|
* - there are more than MIN_SPARSE_INDEX slots total
|
|
|
|
|
* - the load factor (COUNT / capacity) is less than 0.25
|
|
|
|
|
* - a property is set that is not indexed (and not "length")
|
2025-02-05 12:40:54 +10:00
|
|
|
* - a property is defined that has non-default property attributes.
|
2023-07-12 13:27:26 +10:00
|
|
|
*
|
2025-02-05 12:40:54 +10:00
|
|
|
* Dense arrays do not track property creation order, so unlike other native
|
|
|
|
|
* objects and slow arrays, enumerating an array does not necessarily visit the
|
|
|
|
|
* properties in the order they were created. We could instead maintain the
|
|
|
|
|
* scope to track property enumeration order, but still use the fast slot
|
|
|
|
|
* access. That would have the same memory cost as just using a
|
|
|
|
|
* js_SlowArrayClass, but have the same performance characteristics as a dense
|
|
|
|
|
* array for slot accesses, at some cost in code complexity.
|
2018-09-08 18:08:48 +08:00
|
|
|
*/
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include "jstypes.h"
|
2025-02-05 12:40:54 +10:00
|
|
|
#include "jsstdint.h"
|
2025-03-19 21:25:58 +10:00
|
|
|
#include "jsutil.h"
|
2018-09-08 18:08:48 +08:00
|
|
|
#include "jsapi.h"
|
|
|
|
|
#include "jsarray.h"
|
|
|
|
|
#include "jsatom.h"
|
2023-07-12 13:27:26 +10:00
|
|
|
#include "jsbit.h"
|
2018-09-08 18:08:48 +08:00
|
|
|
#include "jsbool.h"
|
2025-02-05 12:40:54 +10:00
|
|
|
#include "jstracer.h"
|
|
|
|
|
#include "jsbuiltins.h"
|
2018-09-08 18:08:48 +08:00
|
|
|
#include "jscntxt.h"
|
2025-02-03 12:35:24 +10:00
|
|
|
#include "jsversion.h"
|
2023-07-12 13:27:26 +10:00
|
|
|
#include "jsdbgapi.h" /* for js_TraceWatchPoints */
|
2018-09-08 18:08:48 +08:00
|
|
|
#include "jsfun.h"
|
|
|
|
|
#include "jsgc.h"
|
|
|
|
|
#include "jsinterp.h"
|
2025-02-05 12:40:54 +10:00
|
|
|
#include "jsiter.h"
|
2018-09-08 18:08:48 +08:00
|
|
|
#include "jslock.h"
|
|
|
|
|
#include "jsnum.h"
|
|
|
|
|
#include "jsobj.h"
|
2023-07-12 13:27:26 +10:00
|
|
|
#include "jsscope.h"
|
2018-09-08 18:08:48 +08:00
|
|
|
#include "jsstr.h"
|
2025-02-03 12:35:24 +10:00
|
|
|
#include "jsstaticcheck.h"
|
2025-02-05 12:40:54 +10:00
|
|
|
#include "jsvector.h"
|
2025-03-19 21:25:58 +10:00
|
|
|
#include "jswrapper.h"
|
2025-02-05 12:40:54 +10:00
|
|
|
|
|
|
|
|
#include "jsatominlines.h"
|
|
|
|
|
#include "jscntxtinlines.h"
|
2025-03-19 21:25:58 +10:00
|
|
|
#include "jsinterpinlines.h"
|
|
|
|
|
#include "jsobjinlines.h"
|
2025-02-05 12:40:54 +10:00
|
|
|
|
|
|
|
|
using namespace js;
|
2025-03-19 21:25:58 +10:00
|
|
|
using namespace js::gc;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
|
|
|
|
/* 2^32 - 1 as a number and a string */
|
|
|
|
|
#define MAXINDEX 4294967295u
|
|
|
|
|
#define MAXSTR "4294967295"
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
static inline bool
|
2025-03-19 21:25:58 +10:00
|
|
|
ENSURE_SLOW_ARRAY(JSContext *cx, JSObject *obj)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
return obj->getClass() == &js_SlowArrayClass ||
|
|
|
|
|
obj->makeDenseArraySlow(cx);
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
|
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
/*
|
|
|
|
|
* Determine if the id represents an array index or an XML property index.
|
|
|
|
|
*
|
|
|
|
|
* An id is an array index according to ECMA by (15.4):
|
|
|
|
|
*
|
|
|
|
|
* "Array objects give special treatment to a certain class of property names.
|
|
|
|
|
* A property name P (in the form of a string value) is an array index if and
|
|
|
|
|
* only if ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal
|
|
|
|
|
* to 2^32-1."
|
|
|
|
|
*
|
|
|
|
|
* In our implementation, it would be sufficient to check for JSVAL_IS_INT(id)
|
2025-03-19 21:25:58 +10:00
|
|
|
* except that by using signed 31-bit integers we miss the top half of the
|
2018-09-08 18:08:48 +08:00
|
|
|
* valid range. This function checks the string representation itself; note
|
|
|
|
|
* that calling a standard conversion routine might allow strings such as
|
|
|
|
|
* "08" or "4.0" as array indices, which they are not.
|
2025-03-19 21:25:58 +10:00
|
|
|
*
|
|
|
|
|
* 'id' is passed as a jsboxedword since the given id need not necessarily hold
|
|
|
|
|
* an atomized string.
|
2018-09-08 18:08:48 +08:00
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
bool
|
|
|
|
|
js_StringIsIndex(JSLinearString *str, jsuint *indexp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
const jschar *cp = str->chars();
|
2025-02-05 12:40:54 +10:00
|
|
|
if (JS7_ISDEC(*cp) && str->length() < sizeof(MAXSTR)) {
|
2018-09-08 18:08:48 +08:00
|
|
|
jsuint index = JS7_UNDEC(*cp++);
|
|
|
|
|
jsuint oldIndex = 0;
|
|
|
|
|
jsuint c = 0;
|
|
|
|
|
if (index != 0) {
|
|
|
|
|
while (JS7_ISDEC(*cp)) {
|
|
|
|
|
oldIndex = index;
|
|
|
|
|
c = JS7_UNDEC(*cp);
|
|
|
|
|
index = 10*index + c;
|
|
|
|
|
cp++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Ensure that all characters were consumed and we didn't overflow. */
|
|
|
|
|
if (*cp == 0 &&
|
|
|
|
|
(oldIndex < (MAXINDEX / 10) ||
|
|
|
|
|
(oldIndex == (MAXINDEX / 10) && c < (MAXINDEX % 10))))
|
|
|
|
|
{
|
|
|
|
|
*indexp = index;
|
2025-03-19 21:25:58 +10:00
|
|
|
return true;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
return false;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
static bool
|
|
|
|
|
ValueToLength(JSContext *cx, Value* vp, jsuint* plength)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
if (vp->isInt32()) {
|
|
|
|
|
int32_t i = vp->toInt32();
|
2023-07-12 13:27:26 +10:00
|
|
|
if (i < 0)
|
|
|
|
|
goto error;
|
2025-03-19 21:25:58 +10:00
|
|
|
|
|
|
|
|
*plength = (jsuint)(i);
|
|
|
|
|
return true;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
jsdouble d;
|
|
|
|
|
if (!ValueToNumber(cx, *vp, &d))
|
2023-07-12 13:27:26 +10:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
|
|
if (JSDOUBLE_IS_NaN(d))
|
|
|
|
|
goto error;
|
2025-03-19 21:25:58 +10:00
|
|
|
|
|
|
|
|
jsuint length;
|
2023-07-12 13:27:26 +10:00
|
|
|
length = (jsuint) d;
|
|
|
|
|
if (d != (jsdouble) length)
|
|
|
|
|
goto error;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
|
|
|
|
|
*plength = length;
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
error:
|
2023-07-12 13:27:26 +10:00
|
|
|
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
|
|
|
|
|
JSMSG_BAD_ARRAY_LENGTH);
|
2025-03-19 21:25:58 +10:00
|
|
|
return false;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JSBool
|
|
|
|
|
js_GetLengthProperty(JSContext *cx, JSObject *obj, jsuint *lengthp)
|
|
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
if (obj->isArray()) {
|
|
|
|
|
*lengthp = obj->getArrayLength();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (obj->isArguments() && !obj->isArgsLengthOverridden()) {
|
2025-03-19 21:25:58 +10:00
|
|
|
*lengthp = obj->getArgsInitialLength();
|
2025-02-05 12:40:54 +10:00
|
|
|
return true;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
AutoValueRooter tvr(cx);
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!obj->getProperty(cx, ATOM_TO_JSID(cx->runtime->atomState.lengthAtom), tvr.addr()))
|
|
|
|
|
return false;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (tvr.value().isInt32()) {
|
|
|
|
|
*lengthp = jsuint(jsint(tvr.value().toInt32())); /* jsuint cast does ToUint32 */
|
2025-02-05 12:40:54 +10:00
|
|
|
return true;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
|
|
|
|
|
JS_STATIC_ASSERT(sizeof(jsuint) == sizeof(uint32_t));
|
|
|
|
|
return ValueToECMAUint32(cx, tvr.value(), (uint32_t *)lengthp);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
JSBool JS_FASTCALL
|
|
|
|
|
js_IndexToId(JSContext *cx, jsuint index, jsid *idp)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
|
|
|
|
JSString *str;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (index <= JSID_INT_MAX) {
|
2023-07-12 13:27:26 +10:00
|
|
|
*idp = INT_TO_JSID(index);
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
str = js_NumberToString(cx, index);
|
|
|
|
|
if (!str)
|
|
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
return js_ValueToStringId(cx, StringValue(str), idp);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
BigIndexToId(JSContext *cx, JSObject *obj, jsuint index, JSBool createAtom,
|
|
|
|
|
jsid *idp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
jschar buf[10], *start;
|
2025-03-19 21:25:58 +10:00
|
|
|
Class *clasp;
|
2018-09-08 18:08:48 +08:00
|
|
|
JSAtom *atom;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
JS_STATIC_ASSERT((jsuint)-1 == 4294967295U);
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT(index > JSID_INT_MAX);
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
|
|
|
|
start = JS_ARRAY_END(buf);
|
|
|
|
|
do {
|
|
|
|
|
--start;
|
|
|
|
|
*start = (jschar)('0' + index % 10);
|
|
|
|
|
index /= 10;
|
|
|
|
|
} while (index != 0);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Skip the atomization if the class is known to store atoms corresponding
|
|
|
|
|
* to big indexes together with elements. In such case we know that the
|
|
|
|
|
* array does not have an element at the given index if its atom does not
|
2023-07-12 13:27:26 +10:00
|
|
|
* exist. Fast arrays (clasp == &js_ArrayClass) don't use atoms for
|
|
|
|
|
* any indexes, though it would be rare to see them have a big index
|
|
|
|
|
* in any case.
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
*/
|
|
|
|
|
if (!createAtom &&
|
2025-02-05 12:40:54 +10:00
|
|
|
((clasp = obj->getClass()) == &js_SlowArrayClass ||
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
clasp == &js_ArgumentsClass ||
|
|
|
|
|
clasp == &js_ObjectClass)) {
|
|
|
|
|
atom = js_GetExistingStringAtom(cx, start, JS_ARRAY_END(buf) - start);
|
|
|
|
|
if (!atom) {
|
2025-03-19 21:25:58 +10:00
|
|
|
*idp = JSID_VOID;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
} else {
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
atom = js_AtomizeChars(cx, start, JS_ARRAY_END(buf) - start, 0);
|
2018-09-08 18:08:48 +08:00
|
|
|
if (!atom)
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
|
|
|
|
*idp = ATOM_TO_JSID(atom);
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
bool
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject::willBeSparseDenseArray(uintN requiredCapacity, uintN newElementsHint)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
JS_ASSERT(isDenseArray());
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT(requiredCapacity > MIN_SPARSE_INDEX);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
uintN cap = numSlots();
|
|
|
|
|
JS_ASSERT(requiredCapacity >= cap);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (requiredCapacity >= JSObject::NSLOTS_LIMIT)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
uintN minimalDenseCount = requiredCapacity / 4;
|
|
|
|
|
if (newElementsHint >= minimalDenseCount)
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
2025-03-19 21:25:58 +10:00
|
|
|
minimalDenseCount -= newElementsHint;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (minimalDenseCount > cap)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
Value *elems = getDenseArrayElements();
|
|
|
|
|
for (uintN i = 0; i < cap; i++) {
|
|
|
|
|
if (!elems[i].isMagic(JS_ARRAY_HOLE) && !--minimalDenseCount)
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
static bool
|
|
|
|
|
ReallyBigIndexToId(JSContext* cx, jsdouble index, jsid* idp)
|
|
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
return js_ValueToStringId(cx, DoubleValue(index), idp);
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
static bool
|
|
|
|
|
IndexToId(JSContext* cx, JSObject* obj, jsdouble index, JSBool* hole, jsid* idp,
|
|
|
|
|
JSBool createAtom = JS_FALSE)
|
|
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
if (index <= JSID_INT_MAX) {
|
2025-02-05 12:40:54 +10:00
|
|
|
*idp = INT_TO_JSID(int(index));
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (index <= jsuint(-1)) {
|
|
|
|
|
if (!BigIndexToId(cx, obj, jsuint(index), createAtom, idp))
|
|
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (hole && JSID_IS_VOID(*idp))
|
2025-02-05 12:40:54 +10:00
|
|
|
*hole = JS_TRUE;
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ReallyBigIndexToId(cx, index, idp);
|
|
|
|
|
}
|
|
|
|
|
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
/*
|
|
|
|
|
* If the property at the given index exists, get its value into location
|
|
|
|
|
* pointed by vp and set *hole to false. Otherwise set *hole to true and *vp
|
|
|
|
|
* to JSVAL_VOID. This function assumes that the location pointed by vp is
|
|
|
|
|
* properly rooted and can be used as GC-protected storage for temporaries.
|
|
|
|
|
*/
|
2018-09-08 18:08:48 +08:00
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
GetElement(JSContext *cx, JSObject *obj, jsdouble index, JSBool *hole, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
JS_ASSERT(index >= 0);
|
|
|
|
|
if (obj->isDenseArray() && index < obj->getDenseArrayCapacity() &&
|
2025-03-19 21:25:58 +10:00
|
|
|
!(*vp = obj->getDenseArrayElement(uint32(index))).isMagic(JS_ARRAY_HOLE)) {
|
2023-07-12 13:27:26 +10:00
|
|
|
*hole = JS_FALSE;
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
if (obj->isArguments() &&
|
|
|
|
|
index < obj->getArgsInitialLength() &&
|
|
|
|
|
!(*vp = obj->getArgsElement(uint32(index))).isMagic(JS_ARGS_HOLE)) {
|
|
|
|
|
*hole = JS_FALSE;
|
|
|
|
|
JSStackFrame *fp = (JSStackFrame *)obj->getPrivate();
|
|
|
|
|
if (fp != JS_ARGUMENTS_OBJECT_ON_TRACE) {
|
|
|
|
|
if (fp)
|
|
|
|
|
*vp = fp->canonicalActualArg(index);
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
AutoIdRooter idr(cx);
|
|
|
|
|
|
|
|
|
|
*hole = JS_FALSE;
|
|
|
|
|
if (!IndexToId(cx, obj, index, hole, idr.addr()))
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
if (*hole) {
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setUndefined();
|
2025-02-05 12:40:54 +10:00
|
|
|
return JS_TRUE;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
JSObject *obj2;
|
|
|
|
|
JSProperty *prop;
|
|
|
|
|
if (!obj->lookupProperty(cx, idr.id(), &obj2, &prop))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
if (!prop) {
|
|
|
|
|
*hole = JS_TRUE;
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setUndefined();
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
} else {
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!obj->getProperty(cx, idr.id(), vp))
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
return JS_FALSE;
|
|
|
|
|
*hole = JS_FALSE;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
namespace js {
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
GetElements(JSContext *cx, JSObject *aobj, jsuint length, Value *vp)
|
|
|
|
|
{
|
|
|
|
|
if (aobj->isDenseArray() && length <= aobj->getDenseArrayCapacity() &&
|
|
|
|
|
!js_PrototypeHasIndexedProperties(cx, aobj)) {
|
|
|
|
|
/* The prototype does not have indexed properties so hole = undefined */
|
|
|
|
|
Value *srcbeg = aobj->getDenseArrayElements();
|
|
|
|
|
Value *srcend = srcbeg + length;
|
|
|
|
|
for (Value *dst = vp, *src = srcbeg; src < srcend; ++dst, ++src)
|
|
|
|
|
*dst = src->isMagic(JS_ARRAY_HOLE) ? UndefinedValue() : *src;
|
|
|
|
|
} else if (aobj->isArguments() && !aobj->isArgsLengthOverridden() &&
|
|
|
|
|
!js_PrototypeHasIndexedProperties(cx, aobj)) {
|
|
|
|
|
/*
|
|
|
|
|
* Two cases, two loops: note how in the case of an active stack frame
|
|
|
|
|
* backing aobj, even though we copy from fp->argv, we still must check
|
|
|
|
|
* aobj->getArgsElement(i) for a hole, to handle a delete on the
|
|
|
|
|
* corresponding arguments element. See args_delProperty.
|
|
|
|
|
*/
|
|
|
|
|
if (JSStackFrame *fp = (JSStackFrame *) aobj->getPrivate()) {
|
|
|
|
|
JS_ASSERT(fp->numActualArgs() <= JS_ARGS_LENGTH_MAX);
|
|
|
|
|
fp->forEachCanonicalActualArg(CopyNonHoleArgsTo(aobj, vp));
|
|
|
|
|
} else {
|
|
|
|
|
Value *srcbeg = aobj->getArgsElements();
|
|
|
|
|
Value *srcend = srcbeg + length;
|
|
|
|
|
for (Value *dst = vp, *src = srcbeg; src < srcend; ++dst, ++src)
|
|
|
|
|
*dst = src->isMagic(JS_ARGS_HOLE) ? UndefinedValue() : *src;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
for (uintN i = 0; i < length; i++) {
|
|
|
|
|
if (!aobj->getProperty(cx, INT_TO_JSID(jsint(i)), &vp[i]))
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
/*
|
|
|
|
|
* Set the value of the property at the given index to v assuming v is rooted.
|
|
|
|
|
*/
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
SetArrayElement(JSContext *cx, JSObject *obj, jsdouble index, const Value &v)
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
JS_ASSERT(index >= 0);
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (obj->isDenseArray()) {
|
|
|
|
|
/* Predicted/prefetched code should favor the remains-dense case. */
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject::EnsureDenseResult result = JSObject::ED_SPARSE;
|
|
|
|
|
do {
|
|
|
|
|
if (index > jsuint(-1))
|
|
|
|
|
break;
|
2025-02-05 12:40:54 +10:00
|
|
|
jsuint idx = jsuint(index);
|
2025-03-19 21:25:58 +10:00
|
|
|
result = obj->ensureDenseArrayElements(cx, idx, 1);
|
|
|
|
|
if (result != JSObject::ED_OK)
|
|
|
|
|
break;
|
|
|
|
|
if (idx >= obj->getArrayLength())
|
|
|
|
|
obj->setArrayLength(idx + 1);
|
|
|
|
|
obj->setDenseArrayElement(idx, v);
|
|
|
|
|
return true;
|
|
|
|
|
} while (false);
|
2025-02-03 12:35:24 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (result == JSObject::ED_FAILED)
|
|
|
|
|
return false;
|
|
|
|
|
JS_ASSERT(result == JSObject::ED_SPARSE);
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!obj->makeDenseArraySlow(cx))
|
2025-02-03 12:35:24 +10:00
|
|
|
return JS_FALSE;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
AutoIdRooter idr(cx);
|
|
|
|
|
|
|
|
|
|
if (!IndexToId(cx, obj, index, NULL, idr.addr(), JS_TRUE))
|
|
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT(!JSID_IS_VOID(idr.id()));
|
2025-02-05 12:40:54 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
Value tmp = v;
|
|
|
|
|
return obj->setProperty(cx, idr.id(), &tmp, true);
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
#ifdef JS_TRACER
|
|
|
|
|
JSBool JS_FASTCALL
|
|
|
|
|
js_EnsureDenseArrayCapacity(JSContext *cx, JSObject *obj, jsint i)
|
|
|
|
|
{
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
|
Class *origObjClasp = obj->clasp;
|
|
|
|
|
#endif
|
|
|
|
|
jsuint u = jsuint(i);
|
|
|
|
|
JSBool ret = (obj->ensureDenseArrayElements(cx, u, 1) == JSObject::ED_OK);
|
|
|
|
|
|
|
|
|
|
/* Partially check the CallInfo's storeAccSet is correct. */
|
|
|
|
|
JS_ASSERT(obj->clasp == origObjClasp);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
/* This function and its callees do not touch any object's .clasp field. */
|
|
|
|
|
JS_DEFINE_CALLINFO_3(extern, BOOL, js_EnsureDenseArrayCapacity, CONTEXT, OBJECT, INT32,
|
|
|
|
|
0, nanojit::ACCSET_STORE_ANY & ~tjit::ACCSET_OBJ_CLASP)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Delete the element |index| from |obj|. If |strict|, do a strict
|
|
|
|
|
* deletion: throw if the property is not configurable.
|
|
|
|
|
*
|
|
|
|
|
* - Return 1 if the deletion succeeds (that is, ES5's [[Delete]] would
|
|
|
|
|
* return true)
|
|
|
|
|
*
|
|
|
|
|
* - Return 0 if the deletion fails because the property is not
|
|
|
|
|
* configurable (that is, [[Delete]] would return false). Note that if
|
|
|
|
|
* |strict| is true we will throw, not return zero.
|
|
|
|
|
*
|
|
|
|
|
* - Return -1 if an exception occurs (that is, [[Delete]] would throw).
|
|
|
|
|
*/
|
|
|
|
|
static int
|
|
|
|
|
DeleteArrayElement(JSContext *cx, JSObject *obj, jsdouble index, bool strict)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
|
|
|
|
JS_ASSERT(index >= 0);
|
|
|
|
|
if (obj->isDenseArray()) {
|
|
|
|
|
if (index <= jsuint(-1)) {
|
|
|
|
|
jsuint idx = jsuint(index);
|
2025-03-19 21:25:58 +10:00
|
|
|
if (idx < obj->getDenseArrayCapacity()) {
|
|
|
|
|
obj->setDenseArrayElement(idx, MagicValue(JS_ARRAY_HOLE));
|
|
|
|
|
if (!js_SuppressDeletedIndexProperties(cx, obj, idx, idx+1))
|
|
|
|
|
return -1;
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
return 1;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
AutoIdRooter idr(cx);
|
|
|
|
|
|
|
|
|
|
if (!IndexToId(cx, obj, index, NULL, idr.addr()))
|
2025-03-19 21:25:58 +10:00
|
|
|
return -1;
|
|
|
|
|
if (JSID_IS_VOID(idr.id()))
|
|
|
|
|
return 1;
|
2025-02-05 12:40:54 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
Value v;
|
|
|
|
|
if (!obj->deleteProperty(cx, idr.id(), &v, strict))
|
|
|
|
|
return -1;
|
|
|
|
|
return v.isTrue() ? 1 : 0;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
/*
|
|
|
|
|
* When hole is true, delete the property at the given index. Otherwise set
|
|
|
|
|
* its value to v assuming v is rooted.
|
|
|
|
|
*/
|
|
|
|
|
static JSBool
|
2025-02-05 12:40:54 +10:00
|
|
|
SetOrDeleteArrayElement(JSContext *cx, JSObject *obj, jsdouble index,
|
2025-03-19 21:25:58 +10:00
|
|
|
JSBool hole, const Value &v)
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
{
|
|
|
|
|
if (hole) {
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT(v.isUndefined());
|
|
|
|
|
return DeleteArrayElement(cx, obj, index, true) >= 0;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
return SetArrayElement(cx, obj, index, v);
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
|
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
JSBool
|
2025-02-05 12:40:54 +10:00
|
|
|
js_SetLengthProperty(JSContext *cx, JSObject *obj, jsdouble length)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
Value v;
|
2018-09-08 18:08:48 +08:00
|
|
|
jsid id;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
v.setNumber(length);
|
2018-09-08 18:08:48 +08:00
|
|
|
id = ATOM_TO_JSID(cx->runtime->atomState.lengthAtom);
|
2025-03-19 21:25:58 +10:00
|
|
|
/* We don't support read-only array length yet. */
|
|
|
|
|
return obj->setProperty(cx, id, &v, false);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JSBool
|
|
|
|
|
js_HasLengthProperty(JSContext *cx, JSObject *obj, jsuint *lengthp)
|
|
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
JSErrorReporter older = JS_SetErrorReporter(cx, NULL);
|
2025-03-19 21:25:58 +10:00
|
|
|
AutoValueRooter tvr(cx);
|
2025-02-05 12:40:54 +10:00
|
|
|
jsid id = ATOM_TO_JSID(cx->runtime->atomState.lengthAtom);
|
|
|
|
|
JSBool ok = obj->getProperty(cx, id, tvr.addr());
|
2018-09-08 18:08:48 +08:00
|
|
|
JS_SetErrorReporter(cx, older);
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!ok)
|
|
|
|
|
return false;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!ValueToLength(cx, tvr.addr(), lengthp))
|
|
|
|
|
return false;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
return true;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
|
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
/*
|
2023-07-12 13:27:26 +10:00
|
|
|
* Since SpiderMonkey supports cross-class prototype-based delegation, we have
|
|
|
|
|
* to be careful about the length getter and setter being called on an object
|
|
|
|
|
* not of Array class. For the getter, we search obj's prototype chain for the
|
|
|
|
|
* array that caused this getter to be invoked. In the setter case to overcome
|
|
|
|
|
* the JSPROP_SHARED attribute, we must define a shadowing length property.
|
2018-09-08 18:08:48 +08:00
|
|
|
*/
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_length_getter(JSContext *cx, JSObject *obj, jsid id, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2023-07-12 13:27:26 +10:00
|
|
|
do {
|
2025-03-19 21:25:58 +10:00
|
|
|
if (obj->isArray()) {
|
|
|
|
|
vp->setNumber(obj->getArrayLength());
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
} while ((obj = obj->getProto()) != NULL);
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_TRUE;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_length_setter(JSContext *cx, JSObject *obj, jsid id, JSBool strict, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
jsuint newlen, oldlen, gap, index;
|
2025-03-19 21:25:58 +10:00
|
|
|
Value junk;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!obj->isArray()) {
|
2023-07-12 13:27:26 +10:00
|
|
|
jsid lengthId = ATOM_TO_JSID(cx->runtime->atomState.lengthAtom);
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
return obj->defineProperty(cx, lengthId, *vp, NULL, NULL, JSPROP_ENUMERATE);
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!ValueToLength(cx, vp, &newlen))
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
2025-03-19 21:25:58 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
oldlen = obj->getArrayLength();
|
2023-07-12 13:27:26 +10:00
|
|
|
|
|
|
|
|
if (oldlen == newlen)
|
2025-02-05 12:40:54 +10:00
|
|
|
return true;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setNumber(newlen);
|
2023-07-12 13:27:26 +10:00
|
|
|
if (oldlen < newlen) {
|
2025-03-19 21:25:58 +10:00
|
|
|
obj->setArrayLength(newlen);
|
2025-02-05 12:40:54 +10:00
|
|
|
return true;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (obj->isDenseArray()) {
|
2025-03-19 21:25:58 +10:00
|
|
|
/*
|
|
|
|
|
* Don't reallocate if we're not actually shrinking our slots. If we do
|
|
|
|
|
* shrink slots here, ensureDenseArrayElements will fill all slots to the
|
|
|
|
|
* right of newlen with JS_ARRAY_HOLE. This permits us to disregard
|
|
|
|
|
* length when reading from arrays as long we are within the capacity.
|
|
|
|
|
*/
|
|
|
|
|
jsuint oldcap = obj->getDenseArrayCapacity();
|
|
|
|
|
if (oldcap > newlen)
|
|
|
|
|
obj->shrinkDenseArrayElements(cx, newlen);
|
|
|
|
|
obj->setArrayLength(newlen);
|
2023-07-12 13:27:26 +10:00
|
|
|
} else if (oldlen - newlen < (1 << 24)) {
|
|
|
|
|
do {
|
|
|
|
|
--oldlen;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx)) {
|
|
|
|
|
obj->setArrayLength(oldlen + 1);
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
2025-03-19 21:25:58 +10:00
|
|
|
}
|
|
|
|
|
int deletion = DeleteArrayElement(cx, obj, oldlen, strict);
|
|
|
|
|
if (deletion <= 0) {
|
|
|
|
|
obj->setArrayLength(oldlen + 1);
|
|
|
|
|
return deletion >= 0;
|
|
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
} while (oldlen != newlen);
|
2025-03-19 21:25:58 +10:00
|
|
|
obj->setArrayLength(newlen);
|
2023-07-12 13:27:26 +10:00
|
|
|
} else {
|
|
|
|
|
/*
|
|
|
|
|
* We are going to remove a lot of indexes in a presumably sparse
|
|
|
|
|
* array. So instead of looping through indexes between newlen and
|
|
|
|
|
* oldlen, we iterate through all properties and remove those that
|
|
|
|
|
* correspond to indexes in the half-open range [newlen, oldlen). See
|
|
|
|
|
* bug 322135.
|
|
|
|
|
*/
|
2025-02-05 12:40:54 +10:00
|
|
|
JSObject *iter = JS_NewPropertyIterator(cx, obj);
|
2023-07-12 13:27:26 +10:00
|
|
|
if (!iter)
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
/* Protect iter against GC under JSObject::deleteProperty. */
|
2025-03-19 21:25:58 +10:00
|
|
|
AutoObjectRooter tvr(cx, iter);
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
gap = oldlen - newlen;
|
|
|
|
|
for (;;) {
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) || !JS_NextProperty(cx, iter, &id))
|
|
|
|
|
return false;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (JSID_IS_VOID(id))
|
2023-07-12 13:27:26 +10:00
|
|
|
break;
|
2025-02-05 12:40:54 +10:00
|
|
|
if (js_IdIsIndex(id, &index) && index - newlen < gap &&
|
2025-03-19 21:25:58 +10:00
|
|
|
!obj->deleteProperty(cx, id, &junk, false)) {
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
obj->setArrayLength(newlen);
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* We have only indexed properties up to capacity (excepting holes), plus the
|
|
|
|
|
* length property. For all else, we delegate to the prototype.
|
|
|
|
|
*/
|
|
|
|
|
static inline bool
|
|
|
|
|
IsDenseArrayId(JSContext *cx, JSObject *obj, jsid id)
|
|
|
|
|
{
|
|
|
|
|
JS_ASSERT(obj->isDenseArray());
|
|
|
|
|
|
|
|
|
|
uint32 i;
|
2025-03-19 21:25:58 +10:00
|
|
|
return JSID_IS_ATOM(id, cx->runtime->atomState.lengthAtom) ||
|
2025-02-05 12:40:54 +10:00
|
|
|
(js_IdIsIndex(id, &i) &&
|
|
|
|
|
obj->getArrayLength() != 0 &&
|
|
|
|
|
i < obj->getDenseArrayCapacity() &&
|
2025-03-19 21:25:58 +10:00
|
|
|
!obj->getDenseArrayElement(i).isMagic(JS_ARRAY_HOLE));
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
|
|
|
|
array_lookupProperty(JSContext *cx, JSObject *obj, jsid id, JSObject **objp,
|
|
|
|
|
JSProperty **propp)
|
|
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!obj->isDenseArray())
|
2023-07-12 13:27:26 +10:00
|
|
|
return js_LookupProperty(cx, obj, id, objp, propp);
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (IsDenseArrayId(cx, obj, id)) {
|
2025-03-19 21:25:58 +10:00
|
|
|
*propp = (JSProperty *) 1; /* non-null to indicate found */
|
2025-02-05 12:40:54 +10:00
|
|
|
*objp = obj;
|
|
|
|
|
return JS_TRUE;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
JSObject *proto = obj->getProto();
|
|
|
|
|
if (!proto) {
|
|
|
|
|
*objp = NULL;
|
|
|
|
|
*propp = NULL;
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
return proto->lookupProperty(cx, id, objp, propp);
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
js_GetDenseArrayElementValue(JSContext *cx, JSObject *obj, jsid id, Value *vp)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT(obj->isDenseArray());
|
2025-02-05 12:40:54 +10:00
|
|
|
|
|
|
|
|
uint32 i;
|
|
|
|
|
if (!js_IdIsIndex(id, &i)) {
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT(JSID_IS_ATOM(id, cx->runtime->atomState.lengthAtom));
|
|
|
|
|
vp->setNumber(obj->getArrayLength());
|
|
|
|
|
return JS_TRUE;
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
|
|
|
|
*vp = obj->getDenseArrayElement(i);
|
|
|
|
|
return JS_TRUE;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_getProperty(JSContext *cx, JSObject *obj, JSObject *receiver, jsid id, Value *vp)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
|
|
|
|
uint32 i;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (JSID_IS_ATOM(id, cx->runtime->atomState.lengthAtom)) {
|
|
|
|
|
vp->setNumber(obj->getArrayLength());
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (JSID_IS_ATOM(id, cx->runtime->atomState.protoAtom)) {
|
|
|
|
|
vp->setObjectOrNull(obj->getProto());
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!obj->isDenseArray())
|
2023-07-12 13:27:26 +10:00
|
|
|
return js_GetProperty(cx, obj, id, vp);
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!js_IdIsIndex(id, &i) || i >= obj->getDenseArrayCapacity() ||
|
|
|
|
|
obj->getDenseArrayElement(i).isMagic(JS_ARRAY_HOLE)) {
|
2023-07-12 13:27:26 +10:00
|
|
|
JSObject *obj2;
|
|
|
|
|
JSProperty *prop;
|
2025-03-19 21:25:58 +10:00
|
|
|
const Shape *shape;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
JSObject *proto = obj->getProto();
|
2023-07-12 13:27:26 +10:00
|
|
|
if (!proto) {
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setUndefined();
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setUndefined();
|
2025-02-03 12:35:24 +10:00
|
|
|
if (js_LookupPropertyWithFlags(cx, proto, id, cx->resolveFlags,
|
|
|
|
|
&obj2, &prop) < 0)
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (prop && obj2->isNative()) {
|
2025-03-19 21:25:58 +10:00
|
|
|
shape = (const Shape *) prop;
|
|
|
|
|
if (!js_NativeGet(cx, obj, obj2, shape, JSGET_METHOD_BARRIER, vp))
|
2025-02-05 12:40:54 +10:00
|
|
|
return JS_FALSE;
|
2025-02-03 12:35:24 +10:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_TRUE;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
*vp = obj->getDenseArrayElement(i);
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_TRUE;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
slowarray_addProperty(JSContext *cx, JSObject *obj, jsid id, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
|
|
|
|
jsuint index, length;
|
|
|
|
|
|
|
|
|
|
if (!js_IdIsIndex(id, &index))
|
|
|
|
|
return JS_TRUE;
|
2025-02-05 12:40:54 +10:00
|
|
|
length = obj->getArrayLength();
|
2023-07-12 13:27:26 +10:00
|
|
|
if (index >= length)
|
2025-03-19 21:25:58 +10:00
|
|
|
obj->setArrayLength(index + 1);
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
static JSType
|
|
|
|
|
array_typeOf(JSContext *cx, JSObject *obj)
|
|
|
|
|
{
|
|
|
|
|
return JSTYPE_OBJECT;
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_setProperty(JSContext *cx, JSObject *obj, jsid id, Value *vp, JSBool strict)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
|
|
|
|
uint32 i;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (JSID_IS_ATOM(id, cx->runtime->atomState.lengthAtom))
|
|
|
|
|
return array_length_setter(cx, obj, id, strict, vp);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!obj->isDenseArray())
|
2025-03-19 21:25:58 +10:00
|
|
|
return js_SetProperty(cx, obj, id, vp, strict);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
do {
|
|
|
|
|
if (!js_IdIsIndex(id, &i))
|
|
|
|
|
break;
|
|
|
|
|
if (js_PrototypeHasIndexedProperties(cx, obj))
|
|
|
|
|
break;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject::EnsureDenseResult result = obj->ensureDenseArrayElements(cx, i, 1);
|
|
|
|
|
if (result != JSObject::ED_OK) {
|
|
|
|
|
if (result == JSObject::ED_FAILED)
|
|
|
|
|
return false;
|
|
|
|
|
JS_ASSERT(result == JSObject::ED_SPARSE);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (i >= obj->getArrayLength())
|
|
|
|
|
obj->setArrayLength(i + 1);
|
|
|
|
|
obj->setDenseArrayElement(i, *vp);
|
|
|
|
|
return true;
|
|
|
|
|
} while (false);
|
|
|
|
|
|
|
|
|
|
if (!obj->makeDenseArraySlow(cx))
|
|
|
|
|
return false;
|
|
|
|
|
return js_SetProperty(cx, obj, id, vp, strict);
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JSBool
|
|
|
|
|
js_PrototypeHasIndexedProperties(JSContext *cx, JSObject *obj)
|
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
* Walk up the prototype chain and see if this indexed element already
|
|
|
|
|
* exists. If we hit the end of the prototype chain, it's safe to set the
|
|
|
|
|
* element on the original object.
|
|
|
|
|
*/
|
|
|
|
|
while ((obj = obj->getProto()) != NULL) {
|
|
|
|
|
/*
|
|
|
|
|
* If the prototype is a non-native object (possibly a dense array), or
|
|
|
|
|
* a native object (possibly a slow array) that has indexed properties,
|
|
|
|
|
* return true.
|
|
|
|
|
*/
|
|
|
|
|
if (!obj->isNative())
|
|
|
|
|
return JS_TRUE;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (obj->isIndexed())
|
2025-02-05 12:40:54 +10:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_defineProperty(JSContext *cx, JSObject *obj, jsid id, const Value *value,
|
|
|
|
|
PropertyOp getter, StrictPropertyOp setter, uintN attrs)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
if (JSID_IS_ATOM(id, cx->runtime->atomState.lengthAtom))
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_TRUE;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!obj->isDenseArray())
|
2025-02-05 12:40:54 +10:00
|
|
|
return js_DefineProperty(cx, obj, id, value, getter, setter, attrs);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
do {
|
|
|
|
|
uint32 i = 0; // init to shut GCC up
|
|
|
|
|
bool isIndex = js_IdIsIndex(id, &i);
|
|
|
|
|
if (!isIndex || attrs != JSPROP_ENUMERATE)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
JSObject::EnsureDenseResult result = obj->ensureDenseArrayElements(cx, i, 1);
|
|
|
|
|
if (result != JSObject::ED_OK) {
|
|
|
|
|
if (result == JSObject::ED_FAILED)
|
|
|
|
|
return false;
|
|
|
|
|
JS_ASSERT(result == JSObject::ED_SPARSE);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (i >= obj->getArrayLength())
|
|
|
|
|
obj->setArrayLength(i + 1);
|
|
|
|
|
obj->setDenseArrayElement(i, *value);
|
|
|
|
|
return true;
|
|
|
|
|
} while (false);
|
|
|
|
|
|
|
|
|
|
if (!obj->makeDenseArraySlow(cx))
|
|
|
|
|
return false;
|
|
|
|
|
return js_DefineProperty(cx, obj, id, value, getter, setter, attrs);
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-02-05 12:40:54 +10:00
|
|
|
array_getAttributes(JSContext *cx, JSObject *obj, jsid id, uintN *attrsp)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
*attrsp = JSID_IS_ATOM(id, cx->runtime->atomState.lengthAtom)
|
2023-07-12 13:27:26 +10:00
|
|
|
? JSPROP_PERMANENT : JSPROP_ENUMERATE;
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-02-05 12:40:54 +10:00
|
|
|
array_setAttributes(JSContext *cx, JSObject *obj, jsid id, uintN *attrsp)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
|
|
|
|
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
|
|
|
|
|
JSMSG_CANT_SET_ARRAY_ATTRS);
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_deleteProperty(JSContext *cx, JSObject *obj, jsid id, Value *rval, JSBool strict)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2023-07-12 13:27:26 +10:00
|
|
|
uint32 i;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!obj->isDenseArray())
|
2025-03-19 21:25:58 +10:00
|
|
|
return js_DeleteProperty(cx, obj, id, rval, strict);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (JSID_IS_ATOM(id, cx->runtime->atomState.lengthAtom)) {
|
|
|
|
|
rval->setBoolean(false);
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (js_IdIsIndex(id, &i) && i < obj->getDenseArrayCapacity())
|
|
|
|
|
obj->setDenseArrayElement(i, MagicValue(JS_ARRAY_HOLE));
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!js_SuppressDeletedProperty(cx, obj, id))
|
|
|
|
|
return false;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
rval->setBoolean(true);
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
static void
|
2025-03-19 21:25:58 +10:00
|
|
|
array_trace(JSTracer *trc, JSObject *obj)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT(obj->isDenseArray());
|
|
|
|
|
|
|
|
|
|
uint32 capacity = obj->getDenseArrayCapacity();
|
|
|
|
|
for (uint32 i = 0; i < capacity; i++)
|
|
|
|
|
MarkValue(trc, obj->getDenseArrayElement(i), "dense_array_elems");
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
static JSBool
|
|
|
|
|
array_fix(JSContext *cx, JSObject *obj, bool *success, AutoIdVector *props)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
|
|
|
|
JS_ASSERT(obj->isDenseArray());
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
/*
|
|
|
|
|
* We must slowify dense arrays; otherwise, we'd need to detect assignments to holes,
|
|
|
|
|
* since that is effectively adding a new property to the array.
|
|
|
|
|
*/
|
|
|
|
|
if (!obj->makeDenseArraySlow(cx) ||
|
|
|
|
|
!GetPropertyNames(cx, obj, JSITER_HIDDEN | JSITER_OWNONLY, props))
|
|
|
|
|
return false;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
*success = true;
|
|
|
|
|
return true;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
Class js_ArrayClass = {
|
2018-09-08 18:08:48 +08:00
|
|
|
"Array",
|
2025-03-19 21:25:58 +10:00
|
|
|
Class::NON_NATIVE |
|
|
|
|
|
JSCLASS_HAS_PRIVATE |
|
2025-02-05 12:40:54 +10:00
|
|
|
JSCLASS_HAS_CACHED_PROTO(JSProto_Array),
|
2025-03-19 21:25:58 +10:00
|
|
|
PropertyStub, /* addProperty */
|
|
|
|
|
PropertyStub, /* delProperty */
|
|
|
|
|
PropertyStub, /* getProperty */
|
|
|
|
|
StrictPropertyStub, /* setProperty */
|
|
|
|
|
EnumerateStub,
|
|
|
|
|
ResolveStub,
|
|
|
|
|
js_TryValueOf,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL, /* reserved0 */
|
|
|
|
|
NULL, /* checkAccess */
|
|
|
|
|
NULL, /* call */
|
|
|
|
|
NULL, /* construct */
|
|
|
|
|
NULL, /* xdrObject */
|
|
|
|
|
NULL, /* hasInstance */
|
|
|
|
|
NULL, /* mark */
|
|
|
|
|
JS_NULL_CLASS_EXT,
|
|
|
|
|
{
|
|
|
|
|
array_lookupProperty,
|
|
|
|
|
array_defineProperty,
|
|
|
|
|
array_getProperty,
|
|
|
|
|
array_setProperty,
|
|
|
|
|
array_getAttributes,
|
|
|
|
|
array_setAttributes,
|
|
|
|
|
array_deleteProperty,
|
|
|
|
|
NULL, /* enumerate */
|
|
|
|
|
array_typeOf,
|
|
|
|
|
array_trace,
|
|
|
|
|
array_fix,
|
|
|
|
|
NULL, /* thisObject */
|
|
|
|
|
NULL, /* clear */
|
|
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
};
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
Class js_SlowArrayClass = {
|
2023-07-12 13:27:26 +10:00
|
|
|
"Array",
|
2025-02-05 12:40:54 +10:00
|
|
|
JSCLASS_HAS_PRIVATE |
|
|
|
|
|
JSCLASS_HAS_CACHED_PROTO(JSProto_Array),
|
2025-03-19 21:25:58 +10:00
|
|
|
slowarray_addProperty,
|
|
|
|
|
PropertyStub, /* delProperty */
|
|
|
|
|
PropertyStub, /* getProperty */
|
|
|
|
|
StrictPropertyStub, /* setProperty */
|
|
|
|
|
EnumerateStub,
|
|
|
|
|
ResolveStub,
|
|
|
|
|
js_TryValueOf
|
2018-09-08 18:08:48 +08:00
|
|
|
};
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
static bool
|
|
|
|
|
AddLengthProperty(JSContext *cx, JSObject *obj)
|
|
|
|
|
{
|
|
|
|
|
const jsid lengthId = ATOM_TO_JSID(cx->runtime->atomState.lengthAtom);
|
|
|
|
|
JS_ASSERT(!obj->nativeLookup(lengthId));
|
|
|
|
|
|
|
|
|
|
return obj->addProperty(cx, lengthId, array_length_getter, array_length_setter,
|
|
|
|
|
SHAPE_INVALID_SLOT, JSPROP_PERMANENT | JSPROP_SHARED, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/*
|
|
|
|
|
* Convert an array object from fast-and-dense to slow-and-flexible.
|
|
|
|
|
*/
|
|
|
|
|
JSBool
|
2025-02-05 12:40:54 +10:00
|
|
|
JSObject::makeDenseArraySlow(JSContext *cx)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
JS_ASSERT(isDenseArray());
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/*
|
2025-03-19 21:25:58 +10:00
|
|
|
* Save old map now, before calling InitScopeForObject. We'll have to undo
|
|
|
|
|
* on error. This is gross, but a better way is not obvious.
|
2025-02-05 12:40:54 +10:00
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObjectMap *oldMap = map;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
/* Create a native scope. */
|
|
|
|
|
JSObject *arrayProto = getProto();
|
|
|
|
|
js::gc::FinalizeKind kind = js::gc::FinalizeKind(arena()->header()->thingKind);
|
|
|
|
|
if (!InitScopeForObject(cx, this, &js_SlowArrayClass, arrayProto, kind))
|
|
|
|
|
return false;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
uint32 capacity = getDenseArrayCapacity();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Begin with the length property to share more of the property tree.
|
|
|
|
|
* The getter/setter here will directly access the object's private value.
|
|
|
|
|
*/
|
|
|
|
|
if (!AddLengthProperty(cx, this)) {
|
|
|
|
|
setMap(oldMap);
|
|
|
|
|
return false;
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
/*
|
|
|
|
|
* Create new properties pointing to existing elements. Pack the array to
|
|
|
|
|
* remove holes, so that shapes use successive slots (as for other objects).
|
|
|
|
|
*/
|
|
|
|
|
uint32 next = 0;
|
2025-02-05 12:40:54 +10:00
|
|
|
for (uint32 i = 0; i < capacity; i++) {
|
|
|
|
|
jsid id;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!ValueToId(cx, Int32Value(i), &id)) {
|
|
|
|
|
setMap(oldMap);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (getDenseArrayElement(i).isMagic(JS_ARRAY_HOLE))
|
2023-07-12 13:27:26 +10:00
|
|
|
continue;
|
2025-03-19 21:25:58 +10:00
|
|
|
|
|
|
|
|
setDenseArrayElement(next, getDenseArrayElement(i));
|
|
|
|
|
|
|
|
|
|
if (!addDataProperty(cx, id, next, JSPROP_ENUMERATE)) {
|
|
|
|
|
setMap(oldMap);
|
|
|
|
|
return false;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
next++;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
/*
|
2025-03-19 21:25:58 +10:00
|
|
|
* Dense arrays with different numbers of slots but the same number of fixed
|
|
|
|
|
* slots and the same non-hole indexes must use their fixed slots consistently.
|
2025-02-03 12:35:24 +10:00
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
if (hasSlotsArray() && next <= numFixedSlots())
|
|
|
|
|
revertToFixedSlots(cx);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
ClearValueRange(slots + next, this->capacity - next, false);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
/*
|
|
|
|
|
* Finally, update class. If |this| is Array.prototype, then js_InitClass
|
|
|
|
|
* will create an emptyShape whose class is &js_SlowArrayClass, to ensure
|
|
|
|
|
* that delegating instances can share shapes in the tree rooted at the
|
|
|
|
|
* proto's empty shape.
|
|
|
|
|
*/
|
|
|
|
|
clasp = &js_SlowArrayClass;
|
|
|
|
|
return true;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/* Transfer ownership of buffer to returned string. */
|
|
|
|
|
static inline JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
BufferToString(JSContext *cx, StringBuffer &sb, Value *rval)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSString *str = sb.finishString();
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!str)
|
|
|
|
|
return false;
|
2025-03-19 21:25:58 +10:00
|
|
|
rval->setString(str);
|
2025-02-05 12:40:54 +10:00
|
|
|
return true;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
#if JS_HAS_TOSOURCE
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_toSource(JSContext *cx, uintN argc, Value *vp)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
|
|
|
|
JS_CHECK_RECURSION(cx, return false);
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return false;
|
|
|
|
|
if (!obj->isSlowArray() && !InstanceOf(cx, obj, &js_ArrayClass, vp + 2))
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/* Find joins or cycles in the reachable object graph. */
|
|
|
|
|
jschar *sharpchars;
|
|
|
|
|
JSHashEntry *he = js_EnterSharpObject(cx, obj, NULL, &sharpchars);
|
2018-09-08 18:08:48 +08:00
|
|
|
if (!he)
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
|
|
|
|
bool initiallySharp = IS_SHARP(he);
|
|
|
|
|
|
|
|
|
|
/* After this point, all paths exit through the 'out' label. */
|
|
|
|
|
MUST_FLOW_THROUGH("out");
|
|
|
|
|
bool ok = false;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* This object will take responsibility for the jschar buffer until the
|
|
|
|
|
* buffer is transferred to the returned JSString.
|
|
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
StringBuffer sb(cx);
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/* Cycles/joins are indicated by sharp objects. */
|
2018-09-08 18:08:48 +08:00
|
|
|
#if JS_HAS_SHARP_VARS
|
2025-02-05 12:40:54 +10:00
|
|
|
if (IS_SHARP(he)) {
|
|
|
|
|
JS_ASSERT(sharpchars != 0);
|
2025-03-19 21:25:58 +10:00
|
|
|
sb.replaceRawBuffer(sharpchars, js_strlen(sharpchars));
|
2025-02-05 12:40:54 +10:00
|
|
|
goto make_string;
|
|
|
|
|
} else if (sharpchars) {
|
|
|
|
|
MAKE_SHARP(he);
|
2025-03-19 21:25:58 +10:00
|
|
|
sb.replaceRawBuffer(sharpchars, js_strlen(sharpchars));
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
#else
|
2025-02-05 12:40:54 +10:00
|
|
|
if (IS_SHARP(he)) {
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!sb.append("[]"))
|
2025-02-05 12:40:54 +10:00
|
|
|
goto out;
|
|
|
|
|
cx->free(sharpchars);
|
|
|
|
|
goto make_string;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
#endif
|
2025-02-05 12:40:54 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!sb.append('['))
|
2025-02-05 12:40:54 +10:00
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
jsuint length;
|
|
|
|
|
if (!js_GetLengthProperty(cx, obj, &length))
|
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
for (jsuint index = 0; index < length; index++) {
|
|
|
|
|
/* Use vp to locally root each element value. */
|
|
|
|
|
JSBool hole;
|
|
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
2025-03-19 21:25:58 +10:00
|
|
|
!GetElement(cx, obj, index, &hole, vp)) {
|
2025-02-05 12:40:54 +10:00
|
|
|
goto out;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/* Get element's character string. */
|
|
|
|
|
JSString *str;
|
|
|
|
|
if (hole) {
|
|
|
|
|
str = cx->runtime->emptyString;
|
2018-09-08 18:08:48 +08:00
|
|
|
} else {
|
2025-02-05 12:40:54 +10:00
|
|
|
str = js_ValueToSource(cx, *vp);
|
|
|
|
|
if (!str)
|
|
|
|
|
goto out;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setString(str);
|
|
|
|
|
|
|
|
|
|
const jschar *chars = str->getChars(cx);
|
|
|
|
|
if (!chars)
|
|
|
|
|
goto out;
|
2025-02-05 12:40:54 +10:00
|
|
|
|
|
|
|
|
/* Append element to buffer. */
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!sb.append(chars, chars + str->length()))
|
2025-02-05 12:40:54 +10:00
|
|
|
goto out;
|
|
|
|
|
if (index + 1 != length) {
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!sb.append(", "))
|
2025-02-05 12:40:54 +10:00
|
|
|
goto out;
|
|
|
|
|
} else if (hole) {
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!sb.append(','))
|
2025-02-05 12:40:54 +10:00
|
|
|
goto out;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/* Finalize the buffer. */
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!sb.append(']'))
|
2025-02-05 12:40:54 +10:00
|
|
|
goto out;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
make_string:
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!BufferToString(cx, sb, vp))
|
2025-02-05 12:40:54 +10:00
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
ok = true;
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
if (!initiallySharp)
|
|
|
|
|
js_LeaveSharpObject(cx, NULL);
|
|
|
|
|
return ok;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static JSBool
|
|
|
|
|
array_toString_sub(JSContext *cx, JSObject *obj, JSBool locale,
|
2025-03-19 21:25:58 +10:00
|
|
|
JSString *sepstr, Value *rval)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
|
|
|
|
JS_CHECK_RECURSION(cx, return false);
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
/* Get characters to use for the separator. */
|
|
|
|
|
static const jschar comma = ',';
|
|
|
|
|
const jschar *sep;
|
|
|
|
|
size_t seplen;
|
|
|
|
|
if (sepstr) {
|
|
|
|
|
seplen = sepstr->length();
|
|
|
|
|
sep = sepstr->getChars(cx);
|
|
|
|
|
if (!sep)
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
sep = ,
|
|
|
|
|
seplen = 1;
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/*
|
|
|
|
|
* Use HashTable entry as the cycle indicator. On first visit, create the
|
|
|
|
|
* entry, and, when leaving, remove the entry.
|
|
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
BusyArraysMap::AddPtr hashp = cx->busyArrays.lookupForAdd(obj);
|
2025-02-05 12:40:54 +10:00
|
|
|
uint32 genBefore;
|
|
|
|
|
if (!hashp) {
|
|
|
|
|
/* Not in hash table, so not a cycle. */
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!cx->busyArrays.add(hashp, obj))
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
|
|
|
|
genBefore = cx->busyArrays.generation();
|
|
|
|
|
} else {
|
|
|
|
|
/* Cycle, so return empty string. */
|
2025-03-19 21:25:58 +10:00
|
|
|
rval->setString(ATOM_TO_STRING(cx->runtime->atomState.emptyAtom));
|
2025-02-05 12:40:54 +10:00
|
|
|
return true;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
AutoObjectRooter tvr(cx, obj);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/* After this point, all paths exit through the 'out' label. */
|
|
|
|
|
MUST_FLOW_THROUGH("out");
|
|
|
|
|
bool ok = false;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* This object will take responsibility for the jschar buffer until the
|
|
|
|
|
* buffer is transferred to the returned JSString.
|
|
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
StringBuffer sb(cx);
|
2025-02-05 12:40:54 +10:00
|
|
|
|
|
|
|
|
jsuint length;
|
|
|
|
|
if (!js_GetLengthProperty(cx, obj, &length))
|
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
for (jsuint index = 0; index < length; index++) {
|
|
|
|
|
/* Use rval to locally root each element value. */
|
|
|
|
|
JSBool hole;
|
|
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
2025-03-19 21:25:58 +10:00
|
|
|
!GetElement(cx, obj, index, &hole, rval)) {
|
2025-02-05 12:40:54 +10:00
|
|
|
goto out;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/* Get element's character string. */
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!(hole || rval->isNullOrUndefined())) {
|
2025-02-05 12:40:54 +10:00
|
|
|
if (locale) {
|
|
|
|
|
/* Work on obj.toLocalString() instead. */
|
|
|
|
|
JSObject *robj;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!js_ValueToObjectOrNull(cx, *rval, &robj))
|
2025-02-05 12:40:54 +10:00
|
|
|
goto out;
|
2025-03-19 21:25:58 +10:00
|
|
|
rval->setObjectOrNull(robj);
|
2025-02-05 12:40:54 +10:00
|
|
|
JSAtom *atom = cx->runtime->atomState.toLocaleStringAtom;
|
|
|
|
|
if (!js_TryMethod(cx, robj, atom, 0, NULL, rval))
|
|
|
|
|
goto out;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!ValueToStringBuffer(cx, *rval, sb))
|
2025-02-05 12:40:54 +10:00
|
|
|
goto out;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/* Append the separator. */
|
|
|
|
|
if (index + 1 != length) {
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!sb.append(sep, seplen))
|
2025-02-05 12:40:54 +10:00
|
|
|
goto out;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/* Finalize the buffer. */
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!BufferToString(cx, sb, rval))
|
2025-02-05 12:40:54 +10:00
|
|
|
goto out;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
ok = true;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
out:
|
|
|
|
|
if (genBefore == cx->busyArrays.generation())
|
|
|
|
|
cx->busyArrays.remove(hashp);
|
|
|
|
|
else
|
|
|
|
|
cx->busyArrays.remove(obj);
|
|
|
|
|
return ok;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
/* ES5 15.4.4.2. NB: The algorithm here differs from the one in ES3. */
|
2018-09-08 18:08:48 +08:00
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_toString(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return false;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
Value &join = vp[0];
|
|
|
|
|
if (!obj->getProperty(cx, ATOM_TO_JSID(cx->runtime->atomState.joinAtom), &join))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (!js_IsCallable(join)) {
|
|
|
|
|
JSString *str = obj_toStringHelper(cx, obj);
|
|
|
|
|
if (!str)
|
|
|
|
|
return false;
|
|
|
|
|
vp->setString(str);
|
|
|
|
|
return true;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
LeaveTrace(cx);
|
|
|
|
|
InvokeArgsGuard args;
|
|
|
|
|
if (!cx->stack().pushInvokeArgs(cx, 0, &args))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
args.callee() = join;
|
|
|
|
|
args.thisv().setObject(*obj);
|
|
|
|
|
|
|
|
|
|
/* Do the call. */
|
|
|
|
|
if (!Invoke(cx, args, 0))
|
|
|
|
|
return false;
|
|
|
|
|
*vp = args.rval();
|
|
|
|
|
return true;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_toLocaleString(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return false;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
/*
|
|
|
|
|
* Passing comma here as the separator. Need a way to get a
|
|
|
|
|
* locale-specific version.
|
|
|
|
|
*/
|
2025-02-05 12:40:54 +10:00
|
|
|
return array_toString_sub(cx, obj, JS_TRUE, NULL, vp);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
InitArrayElements(JSContext *cx, JSObject *obj, jsuint start, jsuint count, Value *vector)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
JS_ASSERT(count < MAXINDEX);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Optimize for dense arrays so long as adding the given set of elements
|
|
|
|
|
* wouldn't otherwise make the array slow.
|
|
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
do {
|
|
|
|
|
if (!obj->isDenseArray())
|
|
|
|
|
break;
|
|
|
|
|
if (js_PrototypeHasIndexedProperties(cx, obj))
|
|
|
|
|
break;
|
2025-02-05 12:40:54 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject::EnsureDenseResult result = obj->ensureDenseArrayElements(cx, start, count);
|
|
|
|
|
if (result != JSObject::ED_OK) {
|
|
|
|
|
if (result == JSObject::ED_FAILED)
|
|
|
|
|
return false;
|
|
|
|
|
JS_ASSERT(result == JSObject::ED_SPARSE);
|
|
|
|
|
break;
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
|
|
|
|
jsuint newlen = start + count;
|
|
|
|
|
if (newlen > obj->getArrayLength())
|
2025-03-19 21:25:58 +10:00
|
|
|
obj->setArrayLength(newlen);
|
|
|
|
|
|
|
|
|
|
JS_ASSERT(count < uint32(-1) / sizeof(Value));
|
2025-02-05 12:40:54 +10:00
|
|
|
memcpy(obj->getDenseArrayElements() + start, vector, sizeof(jsval) * count);
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT_IF(count != 0, !obj->getDenseArrayElement(newlen - 1).isMagic(JS_ARRAY_HOLE));
|
|
|
|
|
return true;
|
|
|
|
|
} while (false);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
Value* end = vector + count;
|
2025-02-05 12:40:54 +10:00
|
|
|
while (vector != end && start < MAXINDEX) {
|
|
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
2023-07-12 13:27:26 +10:00
|
|
|
!SetArrayElement(cx, obj, start++, *vector++)) {
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
|
|
|
|
|
if (vector == end)
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
|
|
|
|
|
/* Finish out any remaining elements past the max array index. */
|
|
|
|
|
if (obj->isDenseArray() && !ENSURE_SLOW_ARRAY(cx, obj))
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
|
|
|
|
|
JS_ASSERT(start == MAXINDEX);
|
2025-03-19 21:25:58 +10:00
|
|
|
AutoValueRooter tvr(cx);
|
2025-02-05 12:40:54 +10:00
|
|
|
AutoIdRooter idr(cx);
|
2025-03-19 21:25:58 +10:00
|
|
|
Value idval = DoubleValue(MAXINDEX);
|
2025-02-05 12:40:54 +10:00
|
|
|
do {
|
2025-03-19 21:25:58 +10:00
|
|
|
*tvr.addr() = *vector++;
|
|
|
|
|
if (!js_ValueToStringId(cx, idval, idr.addr()) ||
|
|
|
|
|
!obj->setProperty(cx, idr.id(), tvr.addr(), true)) {
|
2025-02-05 12:40:54 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
idval.getDoubleRef() += 1;
|
2025-02-05 12:40:54 +10:00
|
|
|
} while (vector != end);
|
|
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
InitArrayObject(JSContext *cx, JSObject *obj, jsuint length, const Value *vector)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
JS_ASSERT(obj->isArray());
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT(obj->isDenseArray());
|
|
|
|
|
obj->setArrayLength(length);
|
|
|
|
|
if (!vector || !length)
|
|
|
|
|
return true;
|
2025-02-03 12:35:24 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
/* Avoid ensureDenseArrayElements to skip sparse array checks there. */
|
|
|
|
|
if (!obj->ensureSlots(cx, length))
|
|
|
|
|
return false;
|
|
|
|
|
memcpy(obj->getDenseArrayElements(), vector, length * sizeof(Value));
|
|
|
|
|
return true;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Perl-inspired join, reverse, and sort.
|
|
|
|
|
*/
|
2025-02-05 12:40:54 +10:00
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_join(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
|
|
|
|
JSString *str;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (argc == 0 || vp[2].isUndefined()) {
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
str = NULL;
|
|
|
|
|
} else {
|
2023-07-12 13:27:26 +10:00
|
|
|
str = js_ValueToString(cx, vp[2]);
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
if (!str)
|
|
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
vp[2].setString(str);
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return false;
|
|
|
|
|
return array_toString_sub(cx, obj, JS_FALSE, str, vp);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_reverse(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return false;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
jsuint len;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!js_GetLengthProperty(cx, obj, &len))
|
|
|
|
|
return false;
|
|
|
|
|
vp->setObject(*obj);
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
do {
|
|
|
|
|
if (!obj->isDenseArray())
|
|
|
|
|
break;
|
|
|
|
|
if (js_PrototypeHasIndexedProperties(cx, obj))
|
|
|
|
|
break;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/* An empty array or an array with no elements is already reversed. */
|
|
|
|
|
if (len == 0 || obj->getDenseArrayCapacity() == 0)
|
2025-03-19 21:25:58 +10:00
|
|
|
return true;
|
2025-02-05 12:40:54 +10:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* It's actually surprisingly complicated to reverse an array due to the
|
|
|
|
|
* orthogonality of array length and array capacity while handling
|
|
|
|
|
* leading and trailing holes correctly. Reversing seems less likely to
|
|
|
|
|
* be a common operation than other array mass-mutation methods, so for
|
|
|
|
|
* now just take a probably-small memory hit (in the absence of too many
|
|
|
|
|
* holes in the array at its start) and ensure that the capacity is
|
|
|
|
|
* sufficient to hold all the elements in the array if it were full.
|
|
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject::EnsureDenseResult result = obj->ensureDenseArrayElements(cx, len, 0);
|
|
|
|
|
if (result != JSObject::ED_OK) {
|
|
|
|
|
if (result == JSObject::ED_FAILED)
|
|
|
|
|
return false;
|
|
|
|
|
JS_ASSERT(result == JSObject::ED_SPARSE);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
|
|
|
|
|
uint32 lo = 0, hi = len - 1;
|
|
|
|
|
for (; lo < hi; lo++, hi--) {
|
2025-03-19 21:25:58 +10:00
|
|
|
Value origlo = obj->getDenseArrayElement(lo);
|
|
|
|
|
Value orighi = obj->getDenseArrayElement(hi);
|
|
|
|
|
obj->setDenseArrayElement(lo, orighi);
|
|
|
|
|
if (orighi.isMagic(JS_ARRAY_HOLE) &&
|
|
|
|
|
!js_SuppressDeletedProperty(cx, obj, INT_TO_JSID(lo))) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
obj->setDenseArrayElement(hi, origlo);
|
|
|
|
|
if (origlo.isMagic(JS_ARRAY_HOLE) &&
|
|
|
|
|
!js_SuppressDeletedProperty(cx, obj, INT_TO_JSID(hi))) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Per ECMA-262, don't update the length of the array, even if the new
|
|
|
|
|
* array has trailing holes (and thus the original array began with
|
|
|
|
|
* holes).
|
|
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
return true;
|
|
|
|
|
} while (false);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
AutoValueRooter tvr(cx);
|
|
|
|
|
for (jsuint i = 0, half = len / 2; i < half; i++) {
|
|
|
|
|
JSBool hole, hole2;
|
|
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
2025-03-19 21:25:58 +10:00
|
|
|
!GetElement(cx, obj, i, &hole, tvr.addr()) ||
|
|
|
|
|
!GetElement(cx, obj, len - i - 1, &hole2, vp) ||
|
2025-02-05 12:40:54 +10:00
|
|
|
!SetOrDeleteArrayElement(cx, obj, len - i - 1, hole, tvr.value()) ||
|
|
|
|
|
!SetOrDeleteArrayElement(cx, obj, i, hole2, *vp)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setObject(*obj);
|
2025-02-05 12:40:54 +10:00
|
|
|
return true;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
typedef struct MSortArgs {
|
2018-09-08 18:08:48 +08:00
|
|
|
size_t elsize;
|
|
|
|
|
JSComparator cmp;
|
|
|
|
|
void *arg;
|
2025-03-19 21:25:58 +10:00
|
|
|
JSBool isValue;
|
2023-07-12 13:27:26 +10:00
|
|
|
} MSortArgs;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/* Helper function for js_MergeSort. */
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
static JSBool
|
2023-07-12 13:27:26 +10:00
|
|
|
MergeArrays(MSortArgs *msa, void *src, void *dest, size_t run1, size_t run2)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2023-07-12 13:27:26 +10:00
|
|
|
void *arg, *a, *b, *c;
|
|
|
|
|
size_t elsize, runtotal;
|
|
|
|
|
int cmp_result;
|
2018-09-08 18:08:48 +08:00
|
|
|
JSComparator cmp;
|
2025-03-19 21:25:58 +10:00
|
|
|
JSBool isValue;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
runtotal = run1 + run2;
|
|
|
|
|
|
|
|
|
|
elsize = msa->elsize;
|
|
|
|
|
cmp = msa->cmp;
|
|
|
|
|
arg = msa->arg;
|
2025-03-19 21:25:58 +10:00
|
|
|
isValue = msa->isValue;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
#define CALL_CMP(a, b) \
|
|
|
|
|
if (!cmp(arg, (a), (b), &cmp_result)) return JS_FALSE;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/* Copy runs already in sorted order. */
|
|
|
|
|
b = (char *)src + run1 * elsize;
|
|
|
|
|
a = (char *)b - elsize;
|
|
|
|
|
CALL_CMP(a, b);
|
|
|
|
|
if (cmp_result <= 0) {
|
|
|
|
|
memcpy(dest, src, runtotal * elsize);
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
#define COPY_ONE(p,q,n) \
|
2025-03-19 21:25:58 +10:00
|
|
|
(isValue ? (void)(*(Value*)p = *(Value*)q) : (void)memcpy(p, q, n))
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
a = src;
|
|
|
|
|
c = dest;
|
|
|
|
|
for (; runtotal != 0; runtotal--) {
|
|
|
|
|
JSBool from_a = run2 == 0;
|
|
|
|
|
if (!from_a && run1 != 0) {
|
|
|
|
|
CALL_CMP(a,b);
|
|
|
|
|
from_a = cmp_result <= 0;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
if (from_a) {
|
|
|
|
|
COPY_ONE(c, a, elsize);
|
|
|
|
|
run1--;
|
|
|
|
|
a = (char *)a + elsize;
|
|
|
|
|
} else {
|
|
|
|
|
COPY_ONE(c, b, elsize);
|
|
|
|
|
run2--;
|
|
|
|
|
b = (char *)b + elsize;
|
|
|
|
|
}
|
|
|
|
|
c = (char *)c + elsize;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
#undef COPY_ONE
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
#undef CALL_CMP
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_TRUE;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/*
|
|
|
|
|
* This sort is stable, i.e. sequence of equal elements is preserved.
|
|
|
|
|
* See also bug #224128.
|
|
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
bool
|
2023-07-12 13:27:26 +10:00
|
|
|
js_MergeSort(void *src, size_t nel, size_t elsize,
|
2025-03-19 21:25:58 +10:00
|
|
|
JSComparator cmp, void *arg, void *tmp,
|
|
|
|
|
JSMergeSortElemType elemType)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2023-07-12 13:27:26 +10:00
|
|
|
void *swap, *vec1, *vec2;
|
|
|
|
|
MSortArgs msa;
|
|
|
|
|
size_t i, j, lo, hi, run;
|
|
|
|
|
int cmp_result;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT_IF(JS_SORTING_VALUES, elsize == sizeof(Value));
|
|
|
|
|
bool isValue = elemType == JS_SORTING_VALUES;
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/* Avoid memcpy overhead for word-sized and word-aligned elements. */
|
|
|
|
|
#define COPY_ONE(p,q,n) \
|
2025-03-19 21:25:58 +10:00
|
|
|
(isValue ? (void)(*(Value*)p = *(Value*)q) : (void)memcpy(p, q, n))
|
2023-07-12 13:27:26 +10:00
|
|
|
#define CALL_CMP(a, b) \
|
|
|
|
|
if (!cmp(arg, (a), (b), &cmp_result)) return JS_FALSE;
|
|
|
|
|
#define INS_SORT_INT 4
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/*
|
|
|
|
|
* Apply insertion sort to small chunks to reduce the number of merge
|
|
|
|
|
* passes needed.
|
|
|
|
|
*/
|
|
|
|
|
for (lo = 0; lo < nel; lo += INS_SORT_INT) {
|
|
|
|
|
hi = lo + INS_SORT_INT;
|
|
|
|
|
if (hi >= nel)
|
|
|
|
|
hi = nel;
|
|
|
|
|
for (i = lo + 1; i < hi; i++) {
|
|
|
|
|
vec1 = (char *)src + i * elsize;
|
|
|
|
|
vec2 = (char *)vec1 - elsize;
|
|
|
|
|
for (j = i; j > lo; j--) {
|
|
|
|
|
CALL_CMP(vec2, vec1);
|
|
|
|
|
/* "<=" instead of "<" insures the sort is stable */
|
|
|
|
|
if (cmp_result <= 0) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/* Swap elements, using "tmp" as tmp storage */
|
|
|
|
|
COPY_ONE(tmp, vec2, elsize);
|
|
|
|
|
COPY_ONE(vec2, vec1, elsize);
|
|
|
|
|
COPY_ONE(vec1, tmp, elsize);
|
|
|
|
|
vec1 = vec2;
|
|
|
|
|
vec2 = (char *)vec1 - elsize;
|
|
|
|
|
}
|
|
|
|
|
}
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
#undef CALL_CMP
|
|
|
|
|
#undef COPY_ONE
|
|
|
|
|
|
|
|
|
|
msa.elsize = elsize;
|
|
|
|
|
msa.cmp = cmp;
|
|
|
|
|
msa.arg = arg;
|
2025-03-19 21:25:58 +10:00
|
|
|
msa.isValue = isValue;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
|
|
|
|
vec1 = src;
|
|
|
|
|
vec2 = tmp;
|
|
|
|
|
for (run = INS_SORT_INT; run < nel; run *= 2) {
|
|
|
|
|
for (lo = 0; lo < nel; lo += 2 * run) {
|
|
|
|
|
hi = lo + run;
|
|
|
|
|
if (hi >= nel) {
|
|
|
|
|
memcpy((char *)vec2 + lo * elsize, (char *)vec1 + lo * elsize,
|
|
|
|
|
(nel - lo) * elsize);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (!MergeArrays(&msa, (char *)vec1 + lo * elsize,
|
|
|
|
|
(char *)vec2 + lo * elsize, run,
|
|
|
|
|
hi + run > nel ? nel - hi : run)) {
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
swap = vec1;
|
|
|
|
|
vec1 = vec2;
|
|
|
|
|
vec2 = swap;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
if (src != vec1)
|
|
|
|
|
memcpy(src, tmp, nel * elsize);
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
|
|
|
|
return JS_TRUE;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
struct CompareArgs
|
|
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSContext *context;
|
|
|
|
|
InvokeSessionGuard session;
|
2025-02-05 12:40:54 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
CompareArgs(JSContext *cx)
|
|
|
|
|
: context(cx)
|
2025-02-05 12:40:54 +10:00
|
|
|
{}
|
|
|
|
|
};
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
static JS_REQUIRES_STACK JSBool
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
sort_compare(void *arg, const void *a, const void *b, int *result)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
const Value *av = (const Value *)a, *bv = (const Value *)b;
|
2018-09-08 18:08:48 +08:00
|
|
|
CompareArgs *ca = (CompareArgs *) arg;
|
|
|
|
|
JSContext *cx = ca->context;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/*
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
* array_sort deals with holes and undefs on its own and they should not
|
|
|
|
|
* come here.
|
2018-09-08 18:08:48 +08:00
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT(!av->isMagic() && !av->isUndefined());
|
|
|
|
|
JS_ASSERT(!av->isMagic() && !bv->isUndefined());
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx))
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
InvokeSessionGuard &session = ca->session;
|
|
|
|
|
session[0] = *av;
|
|
|
|
|
session[1] = *bv;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!session.invoke(cx))
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
jsdouble cmp;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!ValueToNumber(cx, session.rval(), &cmp))
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
|
|
|
|
|
/* Clamp cmp to -1, 0, 1. */
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
*result = 0;
|
2023-07-12 13:27:26 +10:00
|
|
|
if (!JSDOUBLE_IS_NaN(cmp) && cmp != 0)
|
|
|
|
|
*result = cmp > 0 ? 1 : -1;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/*
|
|
|
|
|
* XXX else report some kind of error here? ECMA talks about 'consistent
|
|
|
|
|
* compare functions' that don't return NaN, but is silent about what the
|
|
|
|
|
* result should be. So we currently ignore it.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
return JS_TRUE;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
typedef JSBool (JS_REQUIRES_STACK *JSRedComparator)(void*, const void*,
|
|
|
|
|
const void*, int *);
|
|
|
|
|
|
|
|
|
|
static inline JS_IGNORE_STACK JSComparator
|
|
|
|
|
comparator_stack_cast(JSRedComparator func)
|
|
|
|
|
{
|
|
|
|
|
return func;
|
|
|
|
|
}
|
|
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
static int
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
sort_compare_strings(void *arg, const void *a, const void *b, int *result)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSContext *cx = (JSContext *)arg;
|
|
|
|
|
JSString *astr = ((const Value *)a)->toString();
|
|
|
|
|
JSString *bstr = ((const Value *)b)->toString();
|
|
|
|
|
return JS_CHECK_OPERATION_LIMIT(cx) && CompareStrings(cx, astr, bstr, result);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JSBool
|
|
|
|
|
js::array_sort(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
jsuint len, newlen, i, undefs;
|
2023-07-12 13:27:26 +10:00
|
|
|
size_t elemsize;
|
|
|
|
|
JSString *str;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
Value *argv = JS_ARGV(cx, vp);
|
|
|
|
|
Value fval;
|
|
|
|
|
if (argc > 0 && !argv[0].isUndefined()) {
|
|
|
|
|
if (argv[0].isPrimitive()) {
|
2025-02-05 12:40:54 +10:00
|
|
|
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_SORT_ARG);
|
|
|
|
|
return false;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
fval = argv[0]; /* non-default compare function */
|
2018-09-08 18:08:48 +08:00
|
|
|
} else {
|
2025-03-19 21:25:58 +10:00
|
|
|
fval.setNull();
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return false;
|
|
|
|
|
if (!js_GetLengthProperty(cx, obj, &len))
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
2018-09-08 18:08:48 +08:00
|
|
|
if (len == 0) {
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setObject(*obj);
|
2025-02-05 12:40:54 +10:00
|
|
|
return true;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-03-19 21:25:58 +10:00
|
|
|
* We need a temporary array of 2 * len Value to hold the array elements
|
2023-07-12 13:27:26 +10:00
|
|
|
* and the scratch space for merge sort. Check that its size does not
|
|
|
|
|
* overflow size_t, which would allow for indexing beyond the end of the
|
|
|
|
|
* malloc'd vector.
|
2018-09-08 18:08:48 +08:00
|
|
|
*/
|
2023-07-12 13:27:26 +10:00
|
|
|
#if JS_BITS_PER_WORD == 32
|
2025-03-19 21:25:58 +10:00
|
|
|
if (size_t(len) > size_t(-1) / (2 * sizeof(Value))) {
|
2023-07-12 13:27:26 +10:00
|
|
|
js_ReportAllocationOverflow(cx);
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
#endif
|
2018-09-08 18:08:48 +08:00
|
|
|
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
/*
|
|
|
|
|
* Initialize vec as a root. We will clear elements of vec one by
|
2025-02-05 12:40:54 +10:00
|
|
|
* one while increasing the rooted amount of vec when we know that the
|
|
|
|
|
* property at the corresponding index exists and its value must be rooted.
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
*
|
|
|
|
|
* In this way when sorting a huge mostly sparse array we will not
|
|
|
|
|
* access the tail of vec corresponding to properties that do not
|
|
|
|
|
* exist, allowing OS to avoiding committing RAM. See bug 330812.
|
|
|
|
|
*/
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
Value *vec = (Value *) cx->malloc(2 * size_t(len) * sizeof(Value));
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!vec)
|
|
|
|
|
return false;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
DEFINE_LOCAL_CLASS_OF_STATIC_FUNCTION(AutoFreeVector) {
|
|
|
|
|
JSContext *const cx;
|
|
|
|
|
Value *&vec;
|
|
|
|
|
public:
|
|
|
|
|
AutoFreeVector(JSContext *cx, Value *&vec) : cx(cx), vec(vec) { }
|
2025-02-05 12:40:54 +10:00
|
|
|
~AutoFreeVector() {
|
|
|
|
|
cx->free(vec);
|
|
|
|
|
}
|
|
|
|
|
} free(cx, vec);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
AutoArrayRooter tvr(cx, 0, vec);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/*
|
|
|
|
|
* By ECMA 262, 15.4.4.11, a property that does not exist (which we
|
|
|
|
|
* call a "hole") is always greater than an existing property with
|
|
|
|
|
* value undefined and that is always greater than any other property.
|
|
|
|
|
* Thus to sort holes and undefs we simply count them, sort the rest
|
|
|
|
|
* of elements, append undefs after them and then make holes after
|
|
|
|
|
* undefs.
|
|
|
|
|
*/
|
|
|
|
|
undefs = 0;
|
|
|
|
|
newlen = 0;
|
|
|
|
|
bool allStrings = true;
|
|
|
|
|
for (i = 0; i < len; i++) {
|
|
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
/* Clear vec[newlen] before including it in the rooted set. */
|
|
|
|
|
JSBool hole;
|
2025-03-19 21:25:58 +10:00
|
|
|
vec[newlen].setNull();
|
2025-02-05 12:40:54 +10:00
|
|
|
tvr.changeLength(newlen + 1);
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!GetElement(cx, obj, i, &hole, &vec[newlen]))
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (hole)
|
|
|
|
|
continue;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (vec[newlen].isUndefined()) {
|
2025-02-05 12:40:54 +10:00
|
|
|
++undefs;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
allStrings = allStrings && vec[newlen].isString();
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
++newlen;
|
|
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (newlen == 0) {
|
|
|
|
|
vp->setObject(*obj);
|
2025-02-05 12:40:54 +10:00
|
|
|
return true; /* The array has only holes and undefs. */
|
2025-03-19 21:25:58 +10:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
|
|
|
|
/*
|
2025-02-05 12:40:54 +10:00
|
|
|
* The first newlen elements of vec are copied from the array object
|
|
|
|
|
* (above). The remaining newlen positions are used as GC-rooted scratch
|
|
|
|
|
* space for mergesort. We must clear the space before including it to
|
2025-03-19 21:25:58 +10:00
|
|
|
* the root set covered by tvr.count.
|
2023-07-12 13:27:26 +10:00
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
Value *mergesort_tmp = vec + newlen;
|
|
|
|
|
MakeRangeGCSafe(mergesort_tmp, newlen);
|
2025-02-05 12:40:54 +10:00
|
|
|
tvr.changeLength(newlen * 2);
|
|
|
|
|
|
|
|
|
|
/* Here len == 2 * (newlen + undefs + number_of_holes). */
|
2025-03-19 21:25:58 +10:00
|
|
|
if (fval.isNull()) {
|
2023-07-12 13:27:26 +10:00
|
|
|
/*
|
2025-02-05 12:40:54 +10:00
|
|
|
* Sort using the default comparator converting all elements to
|
|
|
|
|
* strings.
|
2023-07-12 13:27:26 +10:00
|
|
|
*/
|
2025-02-05 12:40:54 +10:00
|
|
|
if (allStrings) {
|
2025-03-19 21:25:58 +10:00
|
|
|
elemsize = sizeof(Value);
|
2025-02-05 12:40:54 +10:00
|
|
|
} else {
|
|
|
|
|
/*
|
|
|
|
|
* To avoid string conversion on each compare we do it only once
|
|
|
|
|
* prior to sorting. But we also need the space for the original
|
|
|
|
|
* values to recover the sorting result. To reuse
|
|
|
|
|
* sort_compare_strings we move the original values to the odd
|
|
|
|
|
* indexes in vec, put the string conversion results in the even
|
2025-03-19 21:25:58 +10:00
|
|
|
* indexes and pass 2 * sizeof(Value) as an element size to the
|
2025-02-05 12:40:54 +10:00
|
|
|
* sorting function. In this way sort_compare_strings will only
|
|
|
|
|
* see the string values when it casts the compare arguments as
|
2025-03-19 21:25:58 +10:00
|
|
|
* pointers to Value.
|
2025-02-05 12:40:54 +10:00
|
|
|
*
|
|
|
|
|
* This requires doubling the temporary storage including the
|
|
|
|
|
* scratch space for the merge sort. Since vec already contains
|
|
|
|
|
* the rooted scratch space for newlen elements at the tail, we
|
|
|
|
|
* can use it to rearrange and convert to strings first and try
|
|
|
|
|
* realloc only when we know that we successfully converted all
|
|
|
|
|
* the elements.
|
|
|
|
|
*/
|
2023-07-12 13:27:26 +10:00
|
|
|
#if JS_BITS_PER_WORD == 32
|
2025-03-19 21:25:58 +10:00
|
|
|
if (size_t(newlen) > size_t(-1) / (4 * sizeof(Value))) {
|
2025-02-05 12:40:54 +10:00
|
|
|
js_ReportAllocationOverflow(cx);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
#endif
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/*
|
|
|
|
|
* Rearrange and string-convert the elements of the vector from
|
|
|
|
|
* the tail here and, after sorting, move the results back
|
|
|
|
|
* starting from the start to prevent overwrite the existing
|
|
|
|
|
* elements.
|
|
|
|
|
*/
|
|
|
|
|
i = newlen;
|
|
|
|
|
do {
|
|
|
|
|
--i;
|
|
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx))
|
|
|
|
|
return false;
|
2025-03-19 21:25:58 +10:00
|
|
|
const Value &v = vec[i];
|
2025-02-05 12:40:54 +10:00
|
|
|
str = js_ValueToString(cx, v);
|
|
|
|
|
if (!str)
|
|
|
|
|
return false;
|
2025-03-19 21:25:58 +10:00
|
|
|
// Copying v must come first, because the following line overwrites v
|
|
|
|
|
// when i == 0.
|
2025-02-05 12:40:54 +10:00
|
|
|
vec[2 * i + 1] = v;
|
2025-03-19 21:25:58 +10:00
|
|
|
vec[2 * i].setString(str);
|
2025-02-05 12:40:54 +10:00
|
|
|
} while (i != 0);
|
|
|
|
|
|
|
|
|
|
JS_ASSERT(tvr.array == vec);
|
2025-03-19 21:25:58 +10:00
|
|
|
vec = (Value *) cx->realloc(vec, 4 * size_t(newlen) * sizeof(Value));
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!vec) {
|
2025-03-19 21:25:58 +10:00
|
|
|
vec = tvr.array; /* N.B. AutoFreeVector */
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
mergesort_tmp = vec + 2 * newlen;
|
2025-03-19 21:25:58 +10:00
|
|
|
MakeRangeGCSafe(mergesort_tmp, 2 * newlen);
|
2025-02-05 12:40:54 +10:00
|
|
|
tvr.changeArray(vec, newlen * 4);
|
2025-03-19 21:25:58 +10:00
|
|
|
elemsize = 2 * sizeof(Value);
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
|
|
|
|
if (!js_MergeSort(vec, size_t(newlen), elemsize,
|
2025-03-19 21:25:58 +10:00
|
|
|
sort_compare_strings, cx, mergesort_tmp,
|
|
|
|
|
JS_SORTING_GENERIC)) {
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!allStrings) {
|
|
|
|
|
/*
|
|
|
|
|
* We want to make the following loop fast and to unroot the
|
|
|
|
|
* cached results of toString invocations before the operation
|
|
|
|
|
* callback has a chance to run the GC. For this reason we do
|
|
|
|
|
* not call JS_CHECK_OPERATION_LIMIT in the loop.
|
|
|
|
|
*/
|
|
|
|
|
i = 0;
|
|
|
|
|
do {
|
|
|
|
|
vec[i] = vec[2 * i + 1];
|
|
|
|
|
} while (++i != newlen);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2025-03-19 21:25:58 +10:00
|
|
|
CompareArgs ca(cx);
|
|
|
|
|
if (!ca.session.start(cx, fval, UndefinedValue(), 2))
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!js_MergeSort(vec, size_t(newlen), sizeof(Value),
|
2025-02-05 12:40:54 +10:00
|
|
|
comparator_stack_cast(sort_compare),
|
2025-03-19 21:25:58 +10:00
|
|
|
&ca, mergesort_tmp,
|
|
|
|
|
JS_SORTING_VALUES)) {
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/*
|
|
|
|
|
* We no longer need to root the scratch space for the merge sort, so
|
|
|
|
|
* unroot it now to make the job of a potential GC under
|
|
|
|
|
* InitArrayElements easier.
|
|
|
|
|
*/
|
|
|
|
|
tvr.changeLength(newlen);
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!InitArrayElements(cx, obj, 0, newlen, vec))
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
/* Set undefs that sorted after the rest of elements. */
|
|
|
|
|
while (undefs != 0) {
|
|
|
|
|
--undefs;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
|
|
|
|
!SetArrayElement(cx, obj, newlen++, UndefinedValue())) {
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
2025-03-19 21:25:58 +10:00
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
/* Re-create any holes that sorted to the end of the array. */
|
|
|
|
|
while (len > newlen) {
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) || DeleteArrayElement(cx, obj, --len, true) < 0)
|
|
|
|
|
return false;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setObject(*obj);
|
2025-02-05 12:40:54 +10:00
|
|
|
return true;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Perl-inspired push, pop, shift, unshift, and splice methods.
|
|
|
|
|
*/
|
2025-02-05 12:40:54 +10:00
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_push_slowly(JSContext *cx, JSObject *obj, uintN argc, Value *argv, Value *rval)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
jsuint length;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
|
|
|
|
if (!js_GetLengthProperty(cx, obj, &length))
|
|
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!InitArrayElements(cx, obj, length, argc, argv))
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
return JS_FALSE;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
/* Per ECMA-262, return the new array length. */
|
2025-02-05 12:40:54 +10:00
|
|
|
jsdouble newlength = length + jsdouble(argc);
|
2025-03-19 21:25:58 +10:00
|
|
|
rval->setNumber(newlength);
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
return js_SetLengthProperty(cx, obj, newlength);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_push1_dense(JSContext* cx, JSObject* obj, const Value &v, Value *rval)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
uint32 length = obj->getArrayLength();
|
2025-03-19 21:25:58 +10:00
|
|
|
do {
|
|
|
|
|
JSObject::EnsureDenseResult result = obj->ensureDenseArrayElements(cx, length, 1);
|
|
|
|
|
if (result != JSObject::ED_OK) {
|
|
|
|
|
if (result == JSObject::ED_FAILED)
|
|
|
|
|
return false;
|
|
|
|
|
JS_ASSERT(result == JSObject::ED_SPARSE);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
obj->setArrayLength(length + 1);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT(obj->getDenseArrayElement(length).isMagic(JS_ARRAY_HOLE));
|
|
|
|
|
obj->setDenseArrayElement(length, v);
|
|
|
|
|
rval->setNumber(obj->getArrayLength());
|
|
|
|
|
return true;
|
|
|
|
|
} while (false);
|
|
|
|
|
|
|
|
|
|
if (!obj->makeDenseArraySlow(cx))
|
|
|
|
|
return false;
|
|
|
|
|
Value tmp = v;
|
|
|
|
|
return array_push_slowly(cx, obj, 1, &tmp, rval);
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ALWAYS_INLINE JSBool
|
|
|
|
|
ArrayCompPushImpl(JSContext *cx, JSObject *obj, const Value &v)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
uint32 length = obj->getArrayLength();
|
|
|
|
|
if (obj->isSlowArray()) {
|
|
|
|
|
/* This can happen in one evil case. See bug 630377. */
|
|
|
|
|
jsid id;
|
|
|
|
|
return js_IndexToId(cx, length, &id) &&
|
|
|
|
|
js_DefineProperty(cx, obj, id, &v, NULL, NULL, JSPROP_ENUMERATE);
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
JS_ASSERT(obj->isDenseArray());
|
|
|
|
|
JS_ASSERT(length <= obj->getDenseArrayCapacity());
|
|
|
|
|
|
|
|
|
|
if (length == obj->getDenseArrayCapacity()) {
|
|
|
|
|
if (length > JS_ARGS_LENGTH_MAX) {
|
|
|
|
|
JS_ReportErrorNumberUC(cx, js_GetErrorMessage, NULL,
|
|
|
|
|
JSMSG_ARRAY_INIT_TOO_BIG);
|
2025-03-19 21:25:58 +10:00
|
|
|
return false;
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
/*
|
|
|
|
|
* An array comprehension cannot add holes to the array. So we can use
|
|
|
|
|
* ensureSlots instead of ensureDenseArrayElements.
|
|
|
|
|
*/
|
|
|
|
|
if (!obj->ensureSlots(cx, length + 1))
|
|
|
|
|
return false;
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
obj->setArrayLength(length + 1);
|
2025-02-05 12:40:54 +10:00
|
|
|
obj->setDenseArrayElement(length, v);
|
2025-03-19 21:25:58 +10:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JSBool
|
|
|
|
|
js_ArrayCompPush(JSContext *cx, JSObject *obj, const Value &vp)
|
|
|
|
|
{
|
|
|
|
|
return ArrayCompPushImpl(cx, obj, vp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef JS_TRACER
|
|
|
|
|
JSBool JS_FASTCALL
|
|
|
|
|
js_ArrayCompPush_tn(JSContext *cx, JSObject *obj, ValueArgType v)
|
|
|
|
|
{
|
|
|
|
|
TraceMonitor *tm = JS_TRACE_MONITOR_ON_TRACE(cx);
|
|
|
|
|
|
|
|
|
|
if (!ArrayCompPushImpl(cx, obj, ValueArgToConstRef(v))) {
|
|
|
|
|
SetBuiltinError(tm);
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return WasBuiltinSuccessful(tm);
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_DEFINE_CALLINFO_3(extern, BOOL_FAIL, js_ArrayCompPush_tn, CONTEXT, OBJECT,
|
|
|
|
|
VALUE, 0, nanojit::ACCSET_STORE_ANY)
|
|
|
|
|
#endif
|
2025-02-05 12:40:54 +10:00
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_push(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return false;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
/* Insist on one argument and obj of the expected class. */
|
2025-02-05 12:40:54 +10:00
|
|
|
if (argc != 1 || !obj->isDenseArray())
|
|
|
|
|
return array_push_slowly(cx, obj, argc, vp + 2, vp);
|
2025-02-03 12:35:24 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
return array_push1_dense(cx, obj, vp[2], vp);
|
2025-02-03 12:35:24 +10:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_pop_slowly(JSContext *cx, JSObject* obj, Value *vp)
|
2025-02-03 12:35:24 +10:00
|
|
|
{
|
|
|
|
|
jsuint index;
|
|
|
|
|
JSBool hole;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
if (!js_GetLengthProperty(cx, obj, &index))
|
|
|
|
|
return JS_FALSE;
|
2023-07-12 13:27:26 +10:00
|
|
|
if (index == 0) {
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setUndefined();
|
2023-07-12 13:27:26 +10:00
|
|
|
} else {
|
2018-09-08 18:08:48 +08:00
|
|
|
index--;
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/* Get the to-be-deleted property's value into vp. */
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!GetElement(cx, obj, index, &hole, vp))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!hole && DeleteArrayElement(cx, obj, index, true) < 0)
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
return js_SetLengthProperty(cx, obj, index);
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_pop_dense(JSContext *cx, JSObject* obj, Value *vp)
|
2025-02-03 12:35:24 +10:00
|
|
|
{
|
|
|
|
|
jsuint index;
|
|
|
|
|
JSBool hole;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
index = obj->getArrayLength();
|
2025-02-03 12:35:24 +10:00
|
|
|
if (index == 0) {
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setUndefined();
|
2025-02-03 12:35:24 +10:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
index--;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!GetElement(cx, obj, index, &hole, vp))
|
2025-02-03 12:35:24 +10:00
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!hole && DeleteArrayElement(cx, obj, index, true) < 0)
|
2025-02-03 12:35:24 +10:00
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
obj->setArrayLength(index);
|
2025-02-03 12:35:24 +10:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_pop(JSContext *cx, uintN argc, Value *vp)
|
2025-02-03 12:35:24 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
2025-02-03 12:35:24 +10:00
|
|
|
if (!obj)
|
2025-03-19 21:25:58 +10:00
|
|
|
return false;
|
2025-02-05 12:40:54 +10:00
|
|
|
if (obj->isDenseArray())
|
|
|
|
|
return array_pop_dense(cx, obj, vp);
|
|
|
|
|
return array_pop_slowly(cx, obj, vp);
|
2025-02-03 12:35:24 +10:00
|
|
|
}
|
|
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_shift(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return JS_FALSE;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
jsuint length;
|
|
|
|
|
if (!js_GetLengthProperty(cx, obj, &length))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
2025-02-05 12:40:54 +10:00
|
|
|
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
if (length == 0) {
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setUndefined();
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
} else {
|
2018-09-08 18:08:48 +08:00
|
|
|
length--;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (obj->isDenseArray() && !js_PrototypeHasIndexedProperties(cx, obj) &&
|
|
|
|
|
length < obj->getDenseArrayCapacity()) {
|
|
|
|
|
*vp = obj->getDenseArrayElement(0);
|
2025-03-19 21:25:58 +10:00
|
|
|
if (vp->isMagic(JS_ARRAY_HOLE))
|
|
|
|
|
vp->setUndefined();
|
|
|
|
|
Value *elems = obj->getDenseArrayElements();
|
2025-02-05 12:40:54 +10:00
|
|
|
memmove(elems, elems + 1, length * sizeof(jsval));
|
2025-03-19 21:25:58 +10:00
|
|
|
obj->setDenseArrayElement(length, MagicValue(JS_ARRAY_HOLE));
|
|
|
|
|
obj->setArrayLength(length);
|
|
|
|
|
if (!js_SuppressDeletedProperty(cx, obj, INT_TO_JSID(length)))
|
|
|
|
|
return JS_FALSE;
|
2025-02-05 12:40:54 +10:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/* Get the to-be-deleted property's value into vp ASAP. */
|
2025-03-19 21:25:58 +10:00
|
|
|
JSBool hole;
|
|
|
|
|
if (!GetElement(cx, obj, 0, &hole, vp))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/* Slide down the array above the first element. */
|
2025-02-05 12:40:54 +10:00
|
|
|
AutoValueRooter tvr(cx);
|
2025-03-19 21:25:58 +10:00
|
|
|
for (jsuint i = 0; i < length; i++) {
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
2025-03-19 21:25:58 +10:00
|
|
|
!GetElement(cx, obj, i + 1, &hole, tvr.addr()) ||
|
2025-02-05 12:40:54 +10:00
|
|
|
!SetOrDeleteArrayElement(cx, obj, i, hole, tvr.value())) {
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/* Delete the only or last element when it exists. */
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!hole && DeleteArrayElement(cx, obj, length, true) < 0)
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
return js_SetLengthProperty(cx, obj, length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_unshift(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
Value *argv;
|
2025-02-05 12:40:54 +10:00
|
|
|
JSBool hole;
|
|
|
|
|
jsdouble last, newlen;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
jsuint length;
|
|
|
|
|
if (!js_GetLengthProperty(cx, obj, &length))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
2025-02-05 12:40:54 +10:00
|
|
|
newlen = length;
|
2018-09-08 18:08:48 +08:00
|
|
|
if (argc > 0) {
|
|
|
|
|
/* Slide up the array to make room for argc at the bottom. */
|
2023-07-12 13:27:26 +10:00
|
|
|
argv = JS_ARGV(cx, vp);
|
2018-09-08 18:08:48 +08:00
|
|
|
if (length > 0) {
|
2025-03-19 21:25:58 +10:00
|
|
|
bool optimized = false;
|
|
|
|
|
do {
|
|
|
|
|
if (!obj->isDenseArray())
|
|
|
|
|
break;
|
|
|
|
|
if (js_PrototypeHasIndexedProperties(cx, obj))
|
|
|
|
|
break;
|
|
|
|
|
JSObject::EnsureDenseResult result = obj->ensureDenseArrayElements(cx, length, argc);
|
|
|
|
|
if (result != JSObject::ED_OK) {
|
|
|
|
|
if (result == JSObject::ED_FAILED)
|
|
|
|
|
return false;
|
|
|
|
|
JS_ASSERT(result == JSObject::ED_SPARSE);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
Value *elems = obj->getDenseArrayElements();
|
2025-02-05 12:40:54 +10:00
|
|
|
memmove(elems + argc, elems, length * sizeof(jsval));
|
|
|
|
|
for (uint32 i = 0; i < argc; i++)
|
2025-03-19 21:25:58 +10:00
|
|
|
obj->setDenseArrayElement(i, MagicValue(JS_ARRAY_HOLE));
|
|
|
|
|
optimized = true;
|
|
|
|
|
} while (false);
|
|
|
|
|
|
|
|
|
|
if (!optimized) {
|
2025-02-05 12:40:54 +10:00
|
|
|
last = length;
|
|
|
|
|
jsdouble upperIndex = last + argc;
|
|
|
|
|
AutoValueRooter tvr(cx);
|
|
|
|
|
do {
|
|
|
|
|
--last, --upperIndex;
|
|
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
2025-03-19 21:25:58 +10:00
|
|
|
!GetElement(cx, obj, last, &hole, tvr.addr()) ||
|
2025-02-05 12:40:54 +10:00
|
|
|
!SetOrDeleteArrayElement(cx, obj, upperIndex, hole, tvr.value())) {
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
} while (last != 0);
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Copy from argv to the bottom of the array. */
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!InitArrayElements(cx, obj, 0, argc, argv))
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
return JS_FALSE;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
newlen += argc;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!js_SetLengthProperty(cx, obj, newlen))
|
|
|
|
|
return JS_FALSE;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
|
|
|
|
/* Follow Perl by returning the new array length. */
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setNumber(newlen);
|
|
|
|
|
return JS_TRUE;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_splice(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return false;
|
|
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
jsuint length, begin, end, count, delta, last;
|
2025-02-05 12:40:54 +10:00
|
|
|
JSBool hole;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
/* Create a new array value to return. */
|
|
|
|
|
JSObject *obj2 = NewDenseEmptyArray(cx);
|
2025-02-03 12:35:24 +10:00
|
|
|
if (!obj2)
|
|
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setObject(*obj2);
|
2025-02-03 12:35:24 +10:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/* Nothing to do if no args. Otherwise get length. */
|
2018-09-08 18:08:48 +08:00
|
|
|
if (argc == 0)
|
|
|
|
|
return JS_TRUE;
|
2025-03-19 21:25:58 +10:00
|
|
|
Value *argv = JS_ARGV(cx, vp);
|
|
|
|
|
if (!js_GetLengthProperty(cx, obj, &length))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
jsuint origlength = length;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
|
|
|
|
/* Convert the first argument into a starting index. */
|
2025-02-05 12:40:54 +10:00
|
|
|
jsdouble d;
|
|
|
|
|
if (!ValueToNumber(cx, *argv, &d))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
|
|
|
|
d = js_DoubleToInteger(d);
|
|
|
|
|
if (d < 0) {
|
|
|
|
|
d += length;
|
|
|
|
|
if (d < 0)
|
|
|
|
|
d = 0;
|
|
|
|
|
} else if (d > length) {
|
|
|
|
|
d = length;
|
|
|
|
|
}
|
|
|
|
|
begin = (jsuint)d; /* d has been clamped to uint32 */
|
|
|
|
|
argc--;
|
|
|
|
|
argv++;
|
|
|
|
|
|
|
|
|
|
/* Convert the second argument from a count into a fencepost index. */
|
|
|
|
|
delta = length - begin;
|
|
|
|
|
if (argc == 0) {
|
|
|
|
|
count = delta;
|
|
|
|
|
end = length;
|
|
|
|
|
} else {
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!ValueToNumber(cx, *argv, &d))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
|
|
|
|
d = js_DoubleToInteger(d);
|
|
|
|
|
if (d < 0)
|
|
|
|
|
d = 0;
|
|
|
|
|
else if (d > delta)
|
|
|
|
|
d = delta;
|
|
|
|
|
count = (jsuint)d;
|
|
|
|
|
end = begin + count;
|
|
|
|
|
argc--;
|
|
|
|
|
argv++;
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
AutoValueRooter tvr(cx);
|
2018-09-08 18:08:48 +08:00
|
|
|
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
/* If there are elements to remove, put them into the return value. */
|
|
|
|
|
if (count > 0) {
|
2025-02-05 12:40:54 +10:00
|
|
|
if (obj->isDenseArray() && !js_PrototypeHasIndexedProperties(cx, obj) &&
|
|
|
|
|
end <= obj->getDenseArrayCapacity()) {
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!InitArrayObject(cx, obj2, count, obj->getDenseArrayElements() + begin))
|
2025-02-05 12:40:54 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
} else {
|
|
|
|
|
for (last = begin; last < end; last++) {
|
|
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
2025-03-19 21:25:58 +10:00
|
|
|
!GetElement(cx, obj, last, &hole, tvr.addr())) {
|
2025-02-05 12:40:54 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/* Copy tvr.value() to the new array unless it's a hole. */
|
|
|
|
|
if (!hole && !SetArrayElement(cx, obj2, last - begin, tvr.value()))
|
|
|
|
|
return JS_FALSE;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!js_SetLengthProperty(cx, obj2, count))
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Find the direction (up or down) to copy and make way for argv. */
|
|
|
|
|
if (argc > count) {
|
|
|
|
|
delta = (jsuint)argc - count;
|
|
|
|
|
last = length;
|
2025-03-19 21:25:58 +10:00
|
|
|
bool optimized = false;
|
|
|
|
|
do {
|
|
|
|
|
if (!obj->isDenseArray())
|
|
|
|
|
break;
|
|
|
|
|
if (js_PrototypeHasIndexedProperties(cx, obj))
|
|
|
|
|
break;
|
|
|
|
|
if (length > obj->getDenseArrayCapacity())
|
|
|
|
|
break;
|
|
|
|
|
if (length != 0 && obj->getDenseArrayElement(length - 1).isMagic(JS_ARRAY_HOLE))
|
|
|
|
|
break;
|
|
|
|
|
JSObject::EnsureDenseResult result = obj->ensureDenseArrayElements(cx, length, delta);
|
|
|
|
|
if (result != JSObject::ED_OK) {
|
|
|
|
|
if (result == JSObject::ED_FAILED)
|
|
|
|
|
return false;
|
|
|
|
|
JS_ASSERT(result == JSObject::ED_SPARSE);
|
|
|
|
|
break;
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
Value *arraybeg = obj->getDenseArrayElements();
|
|
|
|
|
Value *srcbeg = arraybeg + last - 1;
|
|
|
|
|
Value *srcend = arraybeg + end - 1;
|
|
|
|
|
Value *dstbeg = srcbeg + delta;
|
|
|
|
|
for (Value *src = srcbeg, *dst = dstbeg; src > srcend; --src, --dst)
|
|
|
|
|
*dst = *src;
|
|
|
|
|
|
|
|
|
|
obj->setArrayLength(obj->getArrayLength() + delta);
|
|
|
|
|
optimized = true;
|
|
|
|
|
} while (false);
|
|
|
|
|
|
|
|
|
|
if (!optimized) {
|
2025-02-05 12:40:54 +10:00
|
|
|
/* (uint) end could be 0, so we can't use a vanilla >= test. */
|
|
|
|
|
while (last-- > end) {
|
|
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
2025-03-19 21:25:58 +10:00
|
|
|
!GetElement(cx, obj, last, &hole, tvr.addr()) ||
|
2025-02-05 12:40:54 +10:00
|
|
|
!SetOrDeleteArrayElement(cx, obj, last + delta, hole, tvr.value())) {
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
length += delta;
|
|
|
|
|
} else if (argc < count) {
|
|
|
|
|
delta = count - (jsuint)argc;
|
2025-02-05 12:40:54 +10:00
|
|
|
if (obj->isDenseArray() && !js_PrototypeHasIndexedProperties(cx, obj) &&
|
|
|
|
|
length <= obj->getDenseArrayCapacity()) {
|
2025-03-19 21:25:58 +10:00
|
|
|
|
|
|
|
|
Value *arraybeg = obj->getDenseArrayElements();
|
|
|
|
|
Value *srcbeg = arraybeg + end;
|
|
|
|
|
Value *srcend = arraybeg + length;
|
|
|
|
|
Value *dstbeg = srcbeg - delta;
|
|
|
|
|
for (Value *src = srcbeg, *dst = dstbeg; src < srcend; ++src, ++dst)
|
|
|
|
|
*dst = *src;
|
2025-02-05 12:40:54 +10:00
|
|
|
} else {
|
|
|
|
|
for (last = end; last < length; last++) {
|
|
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
2025-03-19 21:25:58 +10:00
|
|
|
!GetElement(cx, obj, last, &hole, tvr.addr()) ||
|
2025-02-05 12:40:54 +10:00
|
|
|
!SetOrDeleteArrayElement(cx, obj, last - delta, hole, tvr.value())) {
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
length -= delta;
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (length < origlength && !js_SuppressDeletedIndexProperties(cx, obj, length, origlength))
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/*
|
|
|
|
|
* Copy from argv into the hole to complete the splice, and update length in
|
|
|
|
|
* case we deleted elements from the end.
|
|
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
return InitArrayElements(cx, obj, begin, argc, argv) &&
|
2025-02-05 12:40:54 +10:00
|
|
|
js_SetLengthProperty(cx, obj, length);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Python-esque sequence operations.
|
|
|
|
|
*/
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_concat(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2023-07-12 13:27:26 +10:00
|
|
|
/* Treat our |this| object as the first argument; see ECMA 15.4.4.4. */
|
2025-03-19 21:25:58 +10:00
|
|
|
Value *p = JS_ARGV(cx, vp) - 1;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/* Create a new Array object and root it using *vp. */
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *aobj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!aobj)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
JSObject *nobj;
|
|
|
|
|
jsuint length;
|
2025-02-05 12:40:54 +10:00
|
|
|
if (aobj->isDenseArray()) {
|
2025-02-03 12:35:24 +10:00
|
|
|
/*
|
2025-02-05 12:40:54 +10:00
|
|
|
* Clone aobj but pass the minimum of its length and capacity, to
|
|
|
|
|
* handle a = [1,2,3]; a.length = 10000 "dense" cases efficiently. In
|
2025-03-19 21:25:58 +10:00
|
|
|
* the normal case where length is <= capacity, nobj and aobj will have
|
|
|
|
|
* the same capacity.
|
2025-02-03 12:35:24 +10:00
|
|
|
*/
|
2025-02-05 12:40:54 +10:00
|
|
|
length = aobj->getArrayLength();
|
|
|
|
|
jsuint capacity = aobj->getDenseArrayCapacity();
|
2025-03-19 21:25:58 +10:00
|
|
|
nobj = NewDenseCopiedArray(cx, JS_MIN(length, capacity), aobj->getDenseArrayElements());
|
2023-07-12 13:27:26 +10:00
|
|
|
if (!nobj)
|
|
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
nobj->setArrayLength(length);
|
|
|
|
|
vp->setObject(*nobj);
|
2023-07-12 13:27:26 +10:00
|
|
|
if (argc == 0)
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
argc--;
|
2025-03-19 21:25:58 +10:00
|
|
|
p++;
|
2023-07-12 13:27:26 +10:00
|
|
|
} else {
|
2025-03-19 21:25:58 +10:00
|
|
|
nobj = NewDenseEmptyArray(cx);
|
2023-07-12 13:27:26 +10:00
|
|
|
if (!nobj)
|
|
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setObject(*nobj);
|
2023-07-12 13:27:26 +10:00
|
|
|
length = 0;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
AutoValueRooter tvr(cx);
|
2018-09-08 18:08:48 +08:00
|
|
|
|
|
|
|
|
/* Loop over [0, argc] to concat args into nobj, expanding all Arrays. */
|
2025-03-19 21:25:58 +10:00
|
|
|
for (uintN i = 0; i <= argc; i++) {
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx))
|
|
|
|
|
return false;
|
2025-03-19 21:25:58 +10:00
|
|
|
const Value &v = p[i];
|
|
|
|
|
if (v.isObject()) {
|
|
|
|
|
aobj = &v.toObject();
|
|
|
|
|
if (aobj->isArray() ||
|
|
|
|
|
(aobj->isWrapper() && JSWrapper::wrappedObject(aobj)->isArray())) {
|
2025-02-05 12:40:54 +10:00
|
|
|
jsid id = ATOM_TO_JSID(cx->runtime->atomState.lengthAtom);
|
|
|
|
|
if (!aobj->getProperty(cx, id, tvr.addr()))
|
|
|
|
|
return false;
|
2025-03-19 21:25:58 +10:00
|
|
|
jsuint alength;
|
|
|
|
|
if (!ValueToLength(cx, tvr.addr(), &alength))
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
2025-03-19 21:25:58 +10:00
|
|
|
for (jsuint slot = 0; slot < alength; slot++) {
|
|
|
|
|
JSBool hole;
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
2025-03-19 21:25:58 +10:00
|
|
|
!GetElement(cx, aobj, slot, &hole, tvr.addr())) {
|
2025-02-05 12:40:54 +10:00
|
|
|
return false;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
/*
|
2025-02-05 12:40:54 +10:00
|
|
|
* Per ECMA 262, 15.4.4.4, step 9, ignore nonexistent
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
* properties.
|
|
|
|
|
*/
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!hole &&
|
|
|
|
|
!SetArrayElement(cx, nobj, length+slot, tvr.value())) {
|
|
|
|
|
return false;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
length += alength;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!SetArrayElement(cx, nobj, length, v))
|
|
|
|
|
return false;
|
2018-09-08 18:08:48 +08:00
|
|
|
length++;
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
return js_SetLengthProperty(cx, nobj, length);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_slice(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
Value *argv;
|
|
|
|
|
JSObject *nobj;
|
2018-09-08 18:08:48 +08:00
|
|
|
jsuint length, begin, end, slot;
|
2025-02-05 12:40:54 +10:00
|
|
|
JSBool hole;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
argv = JS_ARGV(cx, vp);
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (!js_GetLengthProperty(cx, obj, &length))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
|
|
|
|
begin = 0;
|
|
|
|
|
end = length;
|
|
|
|
|
|
|
|
|
|
if (argc > 0) {
|
2025-02-05 12:40:54 +10:00
|
|
|
jsdouble d;
|
|
|
|
|
if (!ValueToNumber(cx, argv[0], &d))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
|
|
|
|
d = js_DoubleToInteger(d);
|
|
|
|
|
if (d < 0) {
|
|
|
|
|
d += length;
|
|
|
|
|
if (d < 0)
|
|
|
|
|
d = 0;
|
|
|
|
|
} else if (d > length) {
|
|
|
|
|
d = length;
|
|
|
|
|
}
|
|
|
|
|
begin = (jsuint)d;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (argc > 1 && !argv[1].isUndefined()) {
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!ValueToNumber(cx, argv[1], &d))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
|
|
|
|
d = js_DoubleToInteger(d);
|
|
|
|
|
if (d < 0) {
|
|
|
|
|
d += length;
|
|
|
|
|
if (d < 0)
|
|
|
|
|
d = 0;
|
|
|
|
|
} else if (d > length) {
|
|
|
|
|
d = length;
|
|
|
|
|
}
|
|
|
|
|
end = (jsuint)d;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (begin > end)
|
|
|
|
|
begin = end;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (obj->isDenseArray() && end <= obj->getDenseArrayCapacity() &&
|
|
|
|
|
!js_PrototypeHasIndexedProperties(cx, obj)) {
|
2025-03-19 21:25:58 +10:00
|
|
|
nobj = NewDenseCopiedArray(cx, end - begin, obj->getDenseArrayElements() + begin);
|
2023-07-12 13:27:26 +10:00
|
|
|
if (!nobj)
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setObject(*nobj);
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Create a new Array object and root it using *vp. */
|
2025-03-19 21:25:58 +10:00
|
|
|
nobj = NewDenseAllocatedArray(cx, end - begin);
|
2023-07-12 13:27:26 +10:00
|
|
|
if (!nobj)
|
|
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setObject(*nobj);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
AutoValueRooter tvr(cx);
|
2023-07-12 13:27:26 +10:00
|
|
|
for (slot = begin; slot < end; slot++) {
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
2025-03-19 21:25:58 +10:00
|
|
|
!GetElement(cx, obj, slot, &hole, tvr.addr())) {
|
2025-02-05 12:40:54 +10:00
|
|
|
return JS_FALSE;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!hole && !SetArrayElement(cx, nobj, slot - begin, tvr.value()))
|
|
|
|
|
return JS_FALSE;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
return JS_TRUE;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if JS_HAS_ARRAY_EXTRAS
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_indexOfHelper(JSContext *cx, JSBool isLast, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
|
|
|
|
jsuint length, i, stop;
|
2025-03-19 21:25:58 +10:00
|
|
|
Value tosearch;
|
2018-09-08 18:08:48 +08:00
|
|
|
jsint direction;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
JSBool hole;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return false;
|
|
|
|
|
if (!js_GetLengthProperty(cx, obj, &length))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
|
|
|
|
if (length == 0)
|
|
|
|
|
goto not_found;
|
|
|
|
|
|
|
|
|
|
if (argc <= 1) {
|
|
|
|
|
i = isLast ? length - 1 : 0;
|
2025-03-19 21:25:58 +10:00
|
|
|
tosearch = (argc != 0) ? vp[2] : UndefinedValue();
|
2018-09-08 18:08:48 +08:00
|
|
|
} else {
|
|
|
|
|
jsdouble start;
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
tosearch = vp[2];
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!ValueToNumber(cx, vp[3], &start))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
|
|
|
|
start = js_DoubleToInteger(start);
|
|
|
|
|
if (start < 0) {
|
|
|
|
|
start += length;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
if (start < 0) {
|
|
|
|
|
if (isLast)
|
|
|
|
|
goto not_found;
|
|
|
|
|
i = 0;
|
|
|
|
|
} else {
|
|
|
|
|
i = (jsuint)start;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
} else if (start >= length) {
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
if (!isLast)
|
|
|
|
|
goto not_found;
|
2018-09-08 18:08:48 +08:00
|
|
|
i = length - 1;
|
|
|
|
|
} else {
|
|
|
|
|
i = (jsuint)start;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isLast) {
|
|
|
|
|
stop = 0;
|
|
|
|
|
direction = -1;
|
|
|
|
|
} else {
|
|
|
|
|
stop = length - 1;
|
|
|
|
|
direction = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (;;) {
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
2025-03-19 21:25:58 +10:00
|
|
|
!GetElement(cx, obj, (jsuint)i, &hole, vp)) {
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!hole) {
|
|
|
|
|
JSBool equal;
|
|
|
|
|
if (!StrictlyEqual(cx, *vp, tosearch, &equal))
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
if (equal) {
|
|
|
|
|
vp->setNumber(i);
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
if (i == stop)
|
|
|
|
|
goto not_found;
|
|
|
|
|
i += direction;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
not_found:
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setInt32(-1);
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_indexOf(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2023-07-12 13:27:26 +10:00
|
|
|
return array_indexOfHelper(cx, JS_FALSE, argc, vp);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_lastIndexOf(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2023-07-12 13:27:26 +10:00
|
|
|
return array_indexOfHelper(cx, JS_TRUE, argc, vp);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/* Order is important; extras that take a predicate funarg must follow MAP. */
|
2018-09-08 18:08:48 +08:00
|
|
|
typedef enum ArrayExtraMode {
|
|
|
|
|
FOREACH,
|
2023-07-12 13:27:26 +10:00
|
|
|
REDUCE,
|
|
|
|
|
REDUCE_RIGHT,
|
2018-09-08 18:08:48 +08:00
|
|
|
MAP,
|
|
|
|
|
FILTER,
|
|
|
|
|
SOME,
|
|
|
|
|
EVERY
|
|
|
|
|
} ArrayExtraMode;
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
#define REDUCE_MODE(mode) ((mode) == REDUCE || (mode) == REDUCE_RIGHT)
|
|
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_extra(JSContext *cx, ArrayExtraMode mode, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = ToObject(cx, &vp[1]);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return false;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
jsuint length;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!js_GetLengthProperty(cx, obj, &length))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* First, get or compute our callee, so that we error out consistently
|
|
|
|
|
* when passed a non-callable object.
|
|
|
|
|
*/
|
2025-02-03 12:35:24 +10:00
|
|
|
if (argc == 0) {
|
2025-03-19 21:25:58 +10:00
|
|
|
js_ReportMissingArg(cx, *vp, 0);
|
2025-02-03 12:35:24 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
Value *argv = vp + 2;
|
2025-02-05 12:40:54 +10:00
|
|
|
JSObject *callable = js_ValueToCallableObject(cx, &argv[0], JSV2F_SEARCH_STACK);
|
2018-09-08 18:08:48 +08:00
|
|
|
if (!callable)
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Set our initial return condition, used for zero-length array cases
|
|
|
|
|
* (and pre-size our map return to match our known length, for all cases).
|
|
|
|
|
*/
|
2025-02-05 12:40:54 +10:00
|
|
|
jsuint newlen;
|
|
|
|
|
JSObject *newarr;
|
2018-09-08 18:08:48 +08:00
|
|
|
#ifdef __GNUC__ /* quell GCC overwarning */
|
|
|
|
|
newlen = 0;
|
|
|
|
|
newarr = NULL;
|
|
|
|
|
#endif
|
2025-02-05 12:40:54 +10:00
|
|
|
jsint start = 0, end = length, step = 1;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
switch (mode) {
|
2023-07-12 13:27:26 +10:00
|
|
|
case REDUCE_RIGHT:
|
|
|
|
|
start = length - 1, end = -1, step = -1;
|
|
|
|
|
/* FALL THROUGH */
|
|
|
|
|
case REDUCE:
|
|
|
|
|
if (length == 0 && argc == 1) {
|
|
|
|
|
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
|
|
|
|
|
JSMSG_EMPTY_ARRAY_REDUCE);
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
if (argc >= 2) {
|
|
|
|
|
*vp = argv[1];
|
|
|
|
|
} else {
|
2025-02-05 12:40:54 +10:00
|
|
|
JSBool hole;
|
2023-07-12 13:27:26 +10:00
|
|
|
do {
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!GetElement(cx, obj, start, &hole, vp))
|
2023-07-12 13:27:26 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
start += step;
|
|
|
|
|
} while (hole && start != end);
|
|
|
|
|
|
|
|
|
|
if (hole && start == end) {
|
|
|
|
|
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
|
|
|
|
|
JSMSG_EMPTY_ARRAY_REDUCE);
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
2018-09-08 18:08:48 +08:00
|
|
|
case MAP:
|
|
|
|
|
case FILTER:
|
|
|
|
|
newlen = (mode == MAP) ? length : 0;
|
2025-03-19 21:25:58 +10:00
|
|
|
newarr = NewDenseAllocatedArray(cx, newlen);
|
2018-09-08 18:08:48 +08:00
|
|
|
if (!newarr)
|
|
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setObject(*newarr);
|
2018-09-08 18:08:48 +08:00
|
|
|
break;
|
|
|
|
|
case SOME:
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setBoolean(false);
|
2018-09-08 18:08:48 +08:00
|
|
|
break;
|
|
|
|
|
case EVERY:
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setBoolean(true);
|
2018-09-08 18:08:48 +08:00
|
|
|
break;
|
|
|
|
|
case FOREACH:
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setUndefined();
|
2018-09-08 18:08:48 +08:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (length == 0)
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
Value thisv = (argc > 1 && !REDUCE_MODE(mode)) ? argv[1] : UndefinedValue();
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
/*
|
|
|
|
|
* For all but REDUCE, we call with 3 args (value, index, array). REDUCE
|
|
|
|
|
* requires 4 args (accum, value, index, array).
|
|
|
|
|
*/
|
|
|
|
|
argc = 3 + REDUCE_MODE(mode);
|
2025-02-05 12:40:54 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
InvokeSessionGuard session;
|
|
|
|
|
if (!session.start(cx, ObjectValue(*callable), thisv, argc))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
MUST_FLOW_THROUGH("out");
|
2025-02-05 12:40:54 +10:00
|
|
|
JSBool ok = JS_TRUE;
|
|
|
|
|
JSBool cond;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
Value objv = ObjectValue(*obj);
|
2025-02-05 12:40:54 +10:00
|
|
|
AutoValueRooter tvr(cx);
|
|
|
|
|
for (jsint i = start; i != end; i += step) {
|
|
|
|
|
JSBool hole;
|
|
|
|
|
ok = JS_CHECK_OPERATION_LIMIT(cx) &&
|
2025-03-19 21:25:58 +10:00
|
|
|
GetElement(cx, obj, i, &hole, tvr.addr());
|
2018-09-08 18:08:48 +08:00
|
|
|
if (!ok)
|
2023-07-12 13:27:26 +10:00
|
|
|
goto out;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
if (hole)
|
2018-09-08 18:08:48 +08:00
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Push callable and 'this', then args. We must do this for every
|
2025-03-19 21:25:58 +10:00
|
|
|
* iteration around the loop since Invoke clobbers its arguments.
|
2018-09-08 18:08:48 +08:00
|
|
|
*/
|
2025-03-19 21:25:58 +10:00
|
|
|
uintN argi = 0;
|
2023-07-12 13:27:26 +10:00
|
|
|
if (REDUCE_MODE(mode))
|
2025-03-19 21:25:58 +10:00
|
|
|
session[argi++] = *vp;
|
|
|
|
|
session[argi++] = tvr.value();
|
|
|
|
|
session[argi++] = Int32Value(i);
|
|
|
|
|
session[argi] = objv;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
|
|
|
|
/* Do the call. */
|
2025-03-19 21:25:58 +10:00
|
|
|
ok = session.invoke(cx);
|
2018-09-08 18:08:48 +08:00
|
|
|
if (!ok)
|
|
|
|
|
break;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
const Value &rval = session.rval();
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
if (mode > MAP)
|
2025-03-19 21:25:58 +10:00
|
|
|
cond = js_ValueToBoolean(rval);
|
2023-07-12 13:27:26 +10:00
|
|
|
#ifdef __GNUC__ /* quell GCC overwarning */
|
|
|
|
|
else
|
|
|
|
|
cond = JS_FALSE;
|
|
|
|
|
#endif
|
2018-09-08 18:08:48 +08:00
|
|
|
|
|
|
|
|
switch (mode) {
|
|
|
|
|
case FOREACH:
|
|
|
|
|
break;
|
2023-07-12 13:27:26 +10:00
|
|
|
case REDUCE:
|
|
|
|
|
case REDUCE_RIGHT:
|
2025-03-19 21:25:58 +10:00
|
|
|
*vp = rval;
|
2023-07-12 13:27:26 +10:00
|
|
|
break;
|
2018-09-08 18:08:48 +08:00
|
|
|
case MAP:
|
2025-03-19 21:25:58 +10:00
|
|
|
ok = SetArrayElement(cx, newarr, i, rval);
|
2018-09-08 18:08:48 +08:00
|
|
|
if (!ok)
|
|
|
|
|
goto out;
|
|
|
|
|
break;
|
|
|
|
|
case FILTER:
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
if (!cond)
|
2018-09-08 18:08:48 +08:00
|
|
|
break;
|
2025-02-05 12:40:54 +10:00
|
|
|
/* The element passed the filter, so push it onto our result. */
|
|
|
|
|
ok = SetArrayElement(cx, newarr, newlen++, tvr.value());
|
2018-09-08 18:08:48 +08:00
|
|
|
if (!ok)
|
|
|
|
|
goto out;
|
|
|
|
|
break;
|
|
|
|
|
case SOME:
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
if (cond) {
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setBoolean(true);
|
2018-09-08 18:08:48 +08:00
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case EVERY:
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
if (!cond) {
|
2025-03-19 21:25:58 +10:00
|
|
|
vp->setBoolean(false);
|
2018-09-08 18:08:48 +08:00
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
out:
|
2018-09-08 18:08:48 +08:00
|
|
|
if (ok && mode == FILTER)
|
|
|
|
|
ok = js_SetLengthProperty(cx, newarr, newlen);
|
|
|
|
|
return ok;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_forEach(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2023-07-12 13:27:26 +10:00
|
|
|
return array_extra(cx, FOREACH, argc, vp);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_map(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2023-07-12 13:27:26 +10:00
|
|
|
return array_extra(cx, MAP, argc, vp);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_reduce(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2023-07-12 13:27:26 +10:00
|
|
|
return array_extra(cx, REDUCE, argc, vp);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_reduceRight(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2023-07-12 13:27:26 +10:00
|
|
|
return array_extra(cx, REDUCE_RIGHT, argc, vp);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_filter(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2023-07-12 13:27:26 +10:00
|
|
|
return array_extra(cx, FILTER, argc, vp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_some(JSContext *cx, uintN argc, Value *vp)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
|
|
|
|
return array_extra(cx, SOME, argc, vp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_every(JSContext *cx, uintN argc, Value *vp)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
|
|
|
|
return array_extra(cx, EVERY, argc, vp);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
static JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
array_isArray(JSContext *cx, uintN argc, Value *vp)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj;
|
|
|
|
|
vp->setBoolean(argc > 0 &&
|
|
|
|
|
vp[2].isObject() &&
|
|
|
|
|
((obj = &vp[2].toObject())->isArray() ||
|
|
|
|
|
(obj->isWrapper() && JSWrapper::wrappedObject(obj)->isArray())));
|
|
|
|
|
return true;
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
static JSFunctionSpec array_methods[] = {
|
|
|
|
|
#if JS_HAS_TOSOURCE
|
2025-02-03 12:35:24 +10:00
|
|
|
JS_FN(js_toSource_str, array_toSource, 0,0),
|
2018-09-08 18:08:48 +08:00
|
|
|
#endif
|
2025-02-03 12:35:24 +10:00
|
|
|
JS_FN(js_toString_str, array_toString, 0,0),
|
|
|
|
|
JS_FN(js_toLocaleString_str,array_toLocaleString,0,0),
|
2018-09-08 18:08:48 +08:00
|
|
|
|
|
|
|
|
/* Perl-ish methods. */
|
2025-02-05 12:40:54 +10:00
|
|
|
JS_FN("join", array_join, 1,JSFUN_GENERIC_NATIVE),
|
2025-02-03 12:35:24 +10:00
|
|
|
JS_FN("reverse", array_reverse, 0,JSFUN_GENERIC_NATIVE),
|
|
|
|
|
JS_FN("sort", array_sort, 1,JSFUN_GENERIC_NATIVE),
|
2025-02-05 12:40:54 +10:00
|
|
|
JS_FN("push", array_push, 1,JSFUN_GENERIC_NATIVE),
|
|
|
|
|
JS_FN("pop", array_pop, 0,JSFUN_GENERIC_NATIVE),
|
2025-02-03 12:35:24 +10:00
|
|
|
JS_FN("shift", array_shift, 0,JSFUN_GENERIC_NATIVE),
|
|
|
|
|
JS_FN("unshift", array_unshift, 1,JSFUN_GENERIC_NATIVE),
|
|
|
|
|
JS_FN("splice", array_splice, 2,JSFUN_GENERIC_NATIVE),
|
2023-07-12 13:27:26 +10:00
|
|
|
|
|
|
|
|
/* Pythonic sequence methods. */
|
2025-02-03 12:35:24 +10:00
|
|
|
JS_FN("concat", array_concat, 1,JSFUN_GENERIC_NATIVE),
|
|
|
|
|
JS_FN("slice", array_slice, 2,JSFUN_GENERIC_NATIVE),
|
2018-09-08 18:08:48 +08:00
|
|
|
|
|
|
|
|
#if JS_HAS_ARRAY_EXTRAS
|
2025-02-03 12:35:24 +10:00
|
|
|
JS_FN("indexOf", array_indexOf, 1,JSFUN_GENERIC_NATIVE),
|
|
|
|
|
JS_FN("lastIndexOf", array_lastIndexOf, 1,JSFUN_GENERIC_NATIVE),
|
|
|
|
|
JS_FN("forEach", array_forEach, 1,JSFUN_GENERIC_NATIVE),
|
|
|
|
|
JS_FN("map", array_map, 1,JSFUN_GENERIC_NATIVE),
|
|
|
|
|
JS_FN("reduce", array_reduce, 1,JSFUN_GENERIC_NATIVE),
|
|
|
|
|
JS_FN("reduceRight", array_reduceRight, 1,JSFUN_GENERIC_NATIVE),
|
|
|
|
|
JS_FN("filter", array_filter, 1,JSFUN_GENERIC_NATIVE),
|
|
|
|
|
JS_FN("some", array_some, 1,JSFUN_GENERIC_NATIVE),
|
|
|
|
|
JS_FN("every", array_every, 1,JSFUN_GENERIC_NATIVE),
|
2018-09-08 18:08:48 +08:00
|
|
|
#endif
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
JS_FS_END
|
2018-09-08 18:08:48 +08:00
|
|
|
};
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
static JSFunctionSpec array_static_methods[] = {
|
|
|
|
|
JS_FN("isArray", array_isArray, 1,0),
|
|
|
|
|
JS_FS_END
|
|
|
|
|
};
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
js_Array(JSContext *cx, uintN argc, Value *vp)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
|
|
|
|
if (argc == 0) {
|
2025-03-19 21:25:58 +10:00
|
|
|
obj = NewDenseEmptyArray(cx);
|
2018-09-08 18:08:48 +08:00
|
|
|
} else if (argc > 1) {
|
2025-03-19 21:25:58 +10:00
|
|
|
obj = NewDenseCopiedArray(cx, argc, vp + 2);
|
|
|
|
|
} else if (!vp[2].isNumber()) {
|
|
|
|
|
obj = NewDenseCopiedArray(cx, 1, vp + 2);
|
2018-09-08 18:08:48 +08:00
|
|
|
} else {
|
2025-03-19 21:25:58 +10:00
|
|
|
jsuint length;
|
|
|
|
|
if (!ValueToLength(cx, vp + 2, &length))
|
2018-09-08 18:08:48 +08:00
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
obj = NewDenseUnallocatedArray(cx, length);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
|
|
|
|
|
if (!obj)
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
vp->setObject(*obj);
|
|
|
|
|
|
|
|
|
|
return JS_TRUE;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *
|
|
|
|
|
js_InitArrayClass(JSContext *cx, JSObject *obj)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *proto = js_InitClass(cx, obj, NULL, &js_ArrayClass, js_Array, 1,
|
|
|
|
|
NULL, array_methods, NULL, array_static_methods);
|
|
|
|
|
if (!proto)
|
2025-02-05 12:40:54 +10:00
|
|
|
return NULL;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
/*
|
|
|
|
|
* Assert that js_InitClass used the correct (slow array, not dense array)
|
|
|
|
|
* class for proto's emptyShape class.
|
|
|
|
|
*/
|
|
|
|
|
JS_ASSERT(proto->emptyShapes && proto->emptyShapes[0]->getClass() == proto->getClass());
|
2025-02-05 12:40:54 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
proto->setArrayLength(0);
|
|
|
|
|
return proto;
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
/*
|
|
|
|
|
* Array allocation functions.
|
|
|
|
|
*/
|
|
|
|
|
namespace js {
|
|
|
|
|
|
|
|
|
|
template<bool allocateCapacity>
|
|
|
|
|
static JS_ALWAYS_INLINE JSObject *
|
|
|
|
|
NewArray(JSContext *cx, jsuint length, JSObject *proto)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT_IF(proto, proto->isArray());
|
|
|
|
|
|
|
|
|
|
gc::FinalizeKind kind = GuessObjectGCKind(length, true);
|
|
|
|
|
JSObject *obj = detail::NewObject<WithProto::Class, false>(cx, &js_ArrayClass, proto, NULL, kind);
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!obj)
|
|
|
|
|
return NULL;
|
2025-03-19 21:25:58 +10:00
|
|
|
|
|
|
|
|
obj->setArrayLength(length);
|
|
|
|
|
|
|
|
|
|
if (allocateCapacity && !obj->ensureSlots(cx, length))
|
|
|
|
|
return NULL;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
return obj;
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject * JS_FASTCALL
|
|
|
|
|
NewDenseEmptyArray(JSContext *cx, JSObject *proto)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
return NewArray<false>(cx, 0, proto);
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject * JS_FASTCALL
|
|
|
|
|
NewDenseAllocatedArray(JSContext *cx, uint32 length, JSObject *proto)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
return NewArray<true>(cx, length, proto);
|
|
|
|
|
}
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject * JS_FASTCALL
|
|
|
|
|
NewDenseUnallocatedArray(JSContext *cx, uint32 length, JSObject *proto)
|
|
|
|
|
{
|
|
|
|
|
return NewArray<false>(cx, length, proto);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JSObject *
|
2025-03-19 21:25:58 +10:00
|
|
|
NewDenseCopiedArray(JSContext *cx, uintN length, Value *vp, JSObject *proto)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject* obj = NewArray<true>(cx, length, proto);
|
2018-09-08 18:08:48 +08:00
|
|
|
if (!obj)
|
|
|
|
|
return NULL;
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
JS_ASSERT(obj->getDenseArrayCapacity() >= length);
|
2025-02-05 12:40:54 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (vp)
|
|
|
|
|
memcpy(obj->getDenseArrayElements(), vp, length * sizeof(Value));
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
return obj;
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
#ifdef JS_TRACER
|
|
|
|
|
JS_DEFINE_CALLINFO_2(extern, OBJECT, NewDenseEmptyArray, CONTEXT, OBJECT, 0,
|
|
|
|
|
nanojit::ACCSET_STORE_ANY)
|
|
|
|
|
JS_DEFINE_CALLINFO_3(extern, OBJECT, NewDenseAllocatedArray, CONTEXT, UINT32, OBJECT, 0,
|
|
|
|
|
nanojit::ACCSET_STORE_ANY)
|
|
|
|
|
JS_DEFINE_CALLINFO_3(extern, OBJECT, NewDenseUnallocatedArray, CONTEXT, UINT32, OBJECT, 0,
|
|
|
|
|
nanojit::ACCSET_STORE_ANY)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
JSObject *
|
2025-03-19 21:25:58 +10:00
|
|
|
NewSlowEmptyArray(JSContext *cx)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
JSObject *obj = NewNonFunction<WithProto::Class>(cx, &js_SlowArrayClass, NULL, NULL);
|
|
|
|
|
if (!obj || !AddLengthProperty(cx, obj))
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
obj->setArrayLength(0);
|
2018-09-08 18:08:48 +08:00
|
|
|
return obj;
|
|
|
|
|
}
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
2023-07-12 13:27:26 +10:00
|
|
|
JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
js_ArrayInfo(JSContext *cx, uintN argc, jsval *vp)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
|
|
|
|
uintN i;
|
|
|
|
|
JSObject *array;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < argc; i++) {
|
2025-03-19 21:25:58 +10:00
|
|
|
Value arg = Valueify(JS_ARGV(cx, vp)[i]);
|
2023-07-12 13:27:26 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
char *bytes = DecompileValueGenerator(cx, JSDVG_SEARCH_STACK, arg, NULL);
|
2023-07-12 13:27:26 +10:00
|
|
|
if (!bytes)
|
|
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
if (arg.isPrimitive() ||
|
|
|
|
|
!(array = arg.toObjectOrNull())->isArray()) {
|
2023-07-12 13:27:26 +10:00
|
|
|
fprintf(stderr, "%s: not array\n", bytes);
|
2025-02-05 12:40:54 +10:00
|
|
|
cx->free(bytes);
|
2023-07-12 13:27:26 +10:00
|
|
|
continue;
|
|
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
fprintf(stderr, "%s: %s (len %u", bytes,
|
|
|
|
|
array->isDenseArray() ? "dense" : "sparse",
|
2025-02-05 12:40:54 +10:00
|
|
|
array->getArrayLength());
|
|
|
|
|
if (array->isDenseArray()) {
|
2025-03-19 21:25:58 +10:00
|
|
|
fprintf(stderr, ", capacity %u",
|
2025-02-05 12:40:54 +10:00
|
|
|
array->getDenseArrayCapacity());
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
fputs(")\n", stderr);
|
2025-02-05 12:40:54 +10:00
|
|
|
cx->free(bytes);
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
2025-03-19 21:25:58 +10:00
|
|
|
|
|
|
|
|
JS_SET_RVAL(cx, vp, JSVAL_VOID);
|
|
|
|
|
return true;
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
#endif
|
2025-02-03 12:35:24 +10:00
|
|
|
|
|
|
|
|
JS_FRIEND_API(JSBool)
|
2025-02-05 12:40:54 +10:00
|
|
|
js_CoerceArrayToCanvasImageData(JSObject *obj, jsuint offset, jsuint count,
|
|
|
|
|
JSUint8 *dest)
|
2025-02-03 12:35:24 +10:00
|
|
|
{
|
|
|
|
|
uint32 length;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!obj || !obj->isDenseArray())
|
2025-02-03 12:35:24 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
length = obj->getArrayLength();
|
2025-02-03 12:35:24 +10:00
|
|
|
if (length < offset + count)
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
|
|
|
|
|
JSUint8 *dp = dest;
|
|
|
|
|
for (uintN i = offset; i < offset+count; i++) {
|
2025-03-19 21:25:58 +10:00
|
|
|
const Value &v = obj->getDenseArrayElement(i);
|
|
|
|
|
if (v.isInt32()) {
|
|
|
|
|
jsint vi = v.toInt32();
|
2025-02-05 12:40:54 +10:00
|
|
|
if (jsuint(vi) > 255)
|
|
|
|
|
vi = (vi < 0) ? 0 : 255;
|
|
|
|
|
*dp++ = JSUint8(vi);
|
2025-03-19 21:25:58 +10:00
|
|
|
} else if (v.isDouble()) {
|
|
|
|
|
jsdouble vd = v.toDouble();
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!(vd >= 0)) /* Not < so that NaN coerces to 0 */
|
|
|
|
|
*dp++ = 0;
|
|
|
|
|
else if (vd > 255)
|
|
|
|
|
*dp++ = 255;
|
|
|
|
|
else {
|
|
|
|
|
jsdouble toTruncate = vd + 0.5;
|
|
|
|
|
JSUint8 val = JSUint8(toTruncate);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* now val is rounded to nearest, ties rounded up. We want
|
|
|
|
|
* rounded to nearest ties to even, so check whether we had a
|
|
|
|
|
* tie.
|
|
|
|
|
*/
|
|
|
|
|
if (val == toTruncate) {
|
|
|
|
|
/*
|
|
|
|
|
* It was a tie (since adding 0.5 gave us the exact integer
|
|
|
|
|
* we want). Since we rounded up, we either already have an
|
|
|
|
|
* even number or we have an odd number but the number we
|
|
|
|
|
* want is one less. So just unconditionally masking out the
|
|
|
|
|
* ones bit should do the trick to get us the value we
|
|
|
|
|
* want.
|
|
|
|
|
*/
|
|
|
|
|
*dp++ = (val & ~1);
|
|
|
|
|
} else {
|
|
|
|
|
*dp++ = val;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2025-02-03 12:35:24 +10:00
|
|
|
return JS_FALSE;
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
2025-02-03 12:35:24 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JS_FRIEND_API(JSBool)
|
2025-02-05 12:40:54 +10:00
|
|
|
js_IsDensePrimitiveArray(JSObject *obj)
|
2025-02-03 12:35:24 +10:00
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!obj || !obj->isDenseArray())
|
2025-02-03 12:35:24 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
jsuint capacity = obj->getDenseArrayCapacity();
|
|
|
|
|
for (jsuint i = 0; i < capacity; i++) {
|
|
|
|
|
if (obj->getDenseArrayElement(i).isObject())
|
2025-02-03 12:35:24 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JS_FRIEND_API(JSBool)
|
2025-02-05 12:40:54 +10:00
|
|
|
js_CloneDensePrimitiveArray(JSContext *cx, JSObject *obj, JSObject **clone)
|
2025-02-03 12:35:24 +10:00
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
JS_ASSERT(obj);
|
|
|
|
|
if (!obj->isDenseArray()) {
|
|
|
|
|
/*
|
|
|
|
|
* This wasn't a dense array. Return JS_TRUE but a NULL clone to signal
|
|
|
|
|
* that no exception was encountered.
|
|
|
|
|
*/
|
|
|
|
|
*clone = NULL;
|
|
|
|
|
return JS_TRUE;
|
2025-02-03 12:35:24 +10:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
jsuint length = obj->getArrayLength();
|
2025-02-03 12:35:24 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
/*
|
|
|
|
|
* Must use the minimum of original array's length and capacity, to handle
|
2025-03-19 21:25:58 +10:00
|
|
|
* |a = [1,2,3]; a.length = 10000| "dense" cases efficiently. In the normal
|
|
|
|
|
* case where length is <= capacity, the clone and original array will have
|
|
|
|
|
* the same capacity.
|
2025-02-05 12:40:54 +10:00
|
|
|
*/
|
|
|
|
|
jsuint jsvalCount = JS_MIN(obj->getDenseArrayCapacity(), length);
|
2025-02-03 12:35:24 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
js::AutoValueVector vector(cx);
|
|
|
|
|
if (!vector.reserve(jsvalCount))
|
2025-02-03 12:35:24 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
for (jsuint i = 0; i < jsvalCount; i++) {
|
2025-03-19 21:25:58 +10:00
|
|
|
const Value &val = obj->getDenseArrayElement(i);
|
2025-02-03 12:35:24 +10:00
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
if (val.isString()) {
|
2025-02-05 12:40:54 +10:00
|
|
|
// Strings must be made immutable before being copied to a clone.
|
2025-03-19 21:25:58 +10:00
|
|
|
if (!js_MakeStringImmutable(cx, val.toString()))
|
2025-02-05 12:40:54 +10:00
|
|
|
return JS_FALSE;
|
2025-03-19 21:25:58 +10:00
|
|
|
} else if (val.isObject()) {
|
2025-02-05 12:40:54 +10:00
|
|
|
/*
|
|
|
|
|
* This wasn't an array of primitives. Return JS_TRUE but a null
|
|
|
|
|
* clone to signal that no exception was encountered.
|
|
|
|
|
*/
|
|
|
|
|
*clone = NULL;
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
2025-02-03 12:35:24 +10:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
vector.append(val);
|
2025-02-03 12:35:24 +10:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
*clone = NewDenseCopiedArray(cx, jsvalCount, vector.begin());
|
2025-02-05 12:40:54 +10:00
|
|
|
if (!*clone)
|
2025-02-03 12:35:24 +10:00
|
|
|
return JS_FALSE;
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
/* The length will be set to the JS_MIN, above, but length might be larger. */
|
|
|
|
|
(*clone)->setArrayLength(length);
|
2025-02-03 12:35:24 +10:00
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|