Backed out 2 changesets (bug 1487022) for causing spidermonkey bustages in /builds/worker/workspace/build/src/js/src/jit-test/tests/wasm/memory.js CLOSED TREE

Backed out changeset 860712299944 (bug 1487022)
Backed out changeset 1cf53a430311 (bug 1487022)
This commit is contained in:
shindli 2018-11-01 01:13:04 +02:00
parent fa05cca21b
commit ea6441668e
7 changed files with 61 additions and 92 deletions

View File

@ -2551,7 +2551,7 @@ js::NewDerivedTypedObject(JSContext* cx, unsigned argc, Value* vp)
MOZ_ASSERT(args.length() == 3);
MOZ_ASSERT(args[0].isObject() && args[0].toObject().is<TypeDescr>());
MOZ_ASSERT(args[1].isObject() && args[1].toObject().is<TypedObject>());
MOZ_RELEASE_ASSERT(args[2].isInt32());
MOZ_ASSERT(args[2].isInt32());
Rooted<TypeDescr*> descr(cx, &args[0].toObject().as<TypeDescr>());
Rooted<TypedObject*> typedObj(cx, &args[1].toObject().as<TypedObject>());
@ -2572,7 +2572,7 @@ js::AttachTypedObject(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 3);
MOZ_RELEASE_ASSERT(args[2].isInt32());
MOZ_ASSERT(args[2].isInt32());
OutlineTypedObject& handle = args[0].toObject().as<OutlineTypedObject>();
TypedObject& target = args[1].toObject().as<TypedObject>();
@ -2590,7 +2590,7 @@ js::SetTypedObjectOffset(JSContext*, unsigned argc, Value* vp)
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 2);
MOZ_ASSERT(args[0].isObject() && args[0].toObject().is<TypedObject>());
MOZ_RELEASE_ASSERT(args[1].isInt32());
MOZ_ASSERT(args[1].isInt32());
OutlineTypedObject& typedObj = args[0].toObject().as<OutlineTypedObject>();
int32_t offset = args[1].toInt32();
@ -2709,7 +2709,7 @@ js::StoreScalar##T::Func(JSContext* cx, unsigned argc, Value* vp)
CallArgs args = CallArgsFromVp(argc, vp); \
MOZ_ASSERT(args.length() == 3); \
MOZ_ASSERT(args[0].isObject() && args[0].toObject().is<TypedObject>()); \
MOZ_RELEASE_ASSERT(args[1].isInt32()); \
MOZ_ASSERT(args[1].isInt32()); \
MOZ_ASSERT(args[2].isNumber()); \
\
TypedObject& typedObj = args[0].toObject().as<TypedObject>(); \
@ -2733,7 +2733,7 @@ js::StoreReference##_name::Func(JSContext* cx, unsigned argc, Value* vp)
CallArgs args = CallArgsFromVp(argc, vp); \
MOZ_ASSERT(args.length() == 4); \
MOZ_ASSERT(args[0].isObject() && args[0].toObject().is<TypedObject>()); \
MOZ_RELEASE_ASSERT(args[1].isInt32()); \
MOZ_ASSERT(args[1].isInt32()); \
MOZ_ASSERT(args[2].isString() || args[2].isNull()); \
\
TypedObject& typedObj = args[0].toObject().as<TypedObject>(); \
@ -2761,7 +2761,7 @@ js::LoadScalar##T::Func(JSContext* cx, unsigned argc, Value* vp)
CallArgs args = CallArgsFromVp(argc, vp); \
MOZ_ASSERT(args.length() == 2); \
MOZ_ASSERT(args[0].isObject() && args[0].toObject().is<TypedObject>()); \
MOZ_RELEASE_ASSERT(args[1].isInt32()); \
MOZ_ASSERT(args[1].isInt32()); \
\
TypedObject& typedObj = args[0].toObject().as<TypedObject>(); \
int32_t offset = args[1].toInt32(); \
@ -2782,7 +2782,7 @@ js::LoadReference##_name::Func(JSContext* cx, unsigned argc, Value* vp)
CallArgs args = CallArgsFromVp(argc, vp); \
MOZ_ASSERT(args.length() == 2); \
MOZ_ASSERT(args[0].isObject() && args[0].toObject().is<TypedObject>()); \
MOZ_RELEASE_ASSERT(args[1].isInt32()); \
MOZ_ASSERT(args[1].isInt32()); \
\
TypedObject& typedObj = args[0].toObject().as<TypedObject>(); \
int32_t offset = args[1].toInt32(); \

View File

@ -65,7 +65,7 @@ function TypedObjectGet(descr, typedObj, offset) {
function TypedObjectGetDerived(descr, typedObj, offset) {
assert(!TypeDescrIsSimpleType(descr),
"getDerived() used with simple type");
return NewDerivedTypedObject(descr, typedObj, offset | 0);
return NewDerivedTypedObject(descr, typedObj, offset);
}
function TypedObjectGetDerivedIf(descr, typedObj, offset, cond) {
@ -76,7 +76,7 @@ function TypedObjectGetOpaque(descr, typedObj, offset) {
assert(!TypeDescrIsSimpleType(descr),
"getDerived() used with simple type");
var opaqueTypedObj = NewOpaqueTypedObject(descr);
AttachTypedObject(opaqueTypedObj, typedObj, offset | 0);
AttachTypedObject(opaqueTypedObj, typedObj, offset);
return opaqueTypedObj;
}
@ -88,29 +88,29 @@ function TypedObjectGetScalar(descr, typedObj, offset) {
var type = DESCR_TYPE(descr);
switch (type) {
case JS_SCALARTYPEREPR_INT8:
return Load_int8(typedObj, offset | 0);
return Load_int8(typedObj, offset);
case JS_SCALARTYPEREPR_UINT8:
case JS_SCALARTYPEREPR_UINT8_CLAMPED:
return Load_uint8(typedObj, offset | 0);
return Load_uint8(typedObj, offset);
case JS_SCALARTYPEREPR_INT16:
return Load_int16(typedObj, offset | 0);
return Load_int16(typedObj, offset);
case JS_SCALARTYPEREPR_UINT16:
return Load_uint16(typedObj, offset | 0);
return Load_uint16(typedObj, offset);
case JS_SCALARTYPEREPR_INT32:
return Load_int32(typedObj, offset | 0);
return Load_int32(typedObj, offset);
case JS_SCALARTYPEREPR_UINT32:
return Load_uint32(typedObj, offset | 0);
return Load_uint32(typedObj, offset);
case JS_SCALARTYPEREPR_FLOAT32:
return Load_float32(typedObj, offset | 0);
return Load_float32(typedObj, offset);
case JS_SCALARTYPEREPR_FLOAT64:
return Load_float64(typedObj, offset | 0);
return Load_float64(typedObj, offset);
}
assert(false, "Unhandled scalar type: " + type);
@ -121,13 +121,13 @@ function TypedObjectGetReference(descr, typedObj, offset) {
var type = DESCR_TYPE(descr);
switch (type) {
case JS_REFERENCETYPEREPR_ANY:
return Load_Any(typedObj, offset | 0);
return Load_Any(typedObj, offset);
case JS_REFERENCETYPEREPR_OBJECT:
return Load_Object(typedObj, offset | 0);
return Load_Object(typedObj, offset);
case JS_REFERENCETYPEREPR_STRING:
return Load_string(typedObj, offset | 0);
return Load_string(typedObj, offset);
}
assert(false, "Unhandled scalar type: " + type);
@ -212,38 +212,38 @@ function TypedObjectSetScalar(descr, typedObj, offset, fromValue) {
var type = DESCR_TYPE(descr);
switch (type) {
case JS_SCALARTYPEREPR_INT8:
return Store_int8(typedObj, offset | 0,
return Store_int8(typedObj, offset,
TO_INT32(fromValue) & 0xFF);
case JS_SCALARTYPEREPR_UINT8:
return Store_uint8(typedObj, offset | 0,
return Store_uint8(typedObj, offset,
TO_UINT32(fromValue) & 0xFF);
case JS_SCALARTYPEREPR_UINT8_CLAMPED:
var v = ClampToUint8(+fromValue);
return Store_int8(typedObj, offset | 0, v);
return Store_int8(typedObj, offset, v);
case JS_SCALARTYPEREPR_INT16:
return Store_int16(typedObj, offset | 0,
return Store_int16(typedObj, offset,
TO_INT32(fromValue) & 0xFFFF);
case JS_SCALARTYPEREPR_UINT16:
return Store_uint16(typedObj, offset | 0,
return Store_uint16(typedObj, offset,
TO_UINT32(fromValue) & 0xFFFF);
case JS_SCALARTYPEREPR_INT32:
return Store_int32(typedObj, offset | 0,
return Store_int32(typedObj, offset,
TO_INT32(fromValue));
case JS_SCALARTYPEREPR_UINT32:
return Store_uint32(typedObj, offset | 0,
return Store_uint32(typedObj, offset,
TO_UINT32(fromValue));
case JS_SCALARTYPEREPR_FLOAT32:
return Store_float32(typedObj, offset | 0, +fromValue);
return Store_float32(typedObj, offset, +fromValue);
case JS_SCALARTYPEREPR_FLOAT64:
return Store_float64(typedObj, offset | 0, +fromValue);
return Store_float64(typedObj, offset, +fromValue);
}
assert(false, "Unhandled scalar type: " + type);
@ -254,14 +254,14 @@ function TypedObjectSetReference(descr, typedObj, offset, name, fromValue) {
var type = DESCR_TYPE(descr);
switch (type) {
case JS_REFERENCETYPEREPR_ANY:
return Store_Any(typedObj, offset | 0, name, fromValue);
return Store_Any(typedObj, offset, name, fromValue);
case JS_REFERENCETYPEREPR_OBJECT:
var value = (fromValue === null ? fromValue : ToObject(fromValue));
return Store_Object(typedObj, offset | 0, name, value);
return Store_Object(typedObj, offset, name, value);
case JS_REFERENCETYPEREPR_STRING:
return Store_string(typedObj, offset | 0, name, ToString(fromValue));
return Store_string(typedObj, offset, name, ToString(fromValue));
}
assert(false, "Unhandled scalar type: " + type);

View File

@ -2929,14 +2929,12 @@ class ICUnaryArith_Fallback : public ICFallbackStub
extra_ = 0;
}
static const uint16_t SAW_DOUBLE_RESULT_BIT = 0x1;
public:
bool sawDoubleResult() const {
return extra_ & SAW_DOUBLE_RESULT_BIT;
bool sawDoubleResult() {
return extra_;
}
void setSawDoubleResult() {
extra_ |= SAW_DOUBLE_RESULT_BIT;
extra_ = 1;
}
// Compiler for this stub kind.

View File

@ -760,26 +760,18 @@ BaselineInspector::hasSeenNonStringIterMore(jsbytecode* pc)
return stub->toIteratorMore_Fallback()->hasNonStringResult();
}
// defaultIfEmpty: if we've not seen *anything* (neither double nor non-double),
// return this value. This can happen with, for example, a never-taken branch
// inside a hot loop.
bool
BaselineInspector::hasSeenDoubleResult(jsbytecode* pc, bool defaultIfEmpty)
BaselineInspector::hasSeenDoubleResult(jsbytecode* pc)
{
if (!hasBaselineScript()) {
return false;
}
const ICEntry& entry = icEntryFromPC(pc);
ICFallbackStub* stub = entry.fallbackStub();
ICStub* stub = entry.fallbackStub();
MOZ_ASSERT(stub->isUnaryArith_Fallback() || stub->isBinaryArith_Fallback());
// If no attached stubs, and no failures, then this IC has never been executed.
if (stub->state().numOptimizedStubs() == 0 && !entry.fallbackStub()->state().hasFailures()) {
return defaultIfEmpty;
}
if (stub->isUnaryArith_Fallback()) {
return stub->toUnaryArith_Fallback()->sawDoubleResult();
}

View File

@ -124,7 +124,7 @@ class BaselineInspector
bool hasSeenNegativeIndexGetElement(jsbytecode* pc);
bool hasSeenAccessedGetter(jsbytecode* pc);
bool hasSeenDoubleResult(jsbytecode* pc, bool defaultIfEmpty);
bool hasSeenDoubleResult(jsbytecode* pc);
bool hasSeenNonStringIterMore(jsbytecode* pc);
MOZ_MUST_USE bool isOptimizableConstStringSplit(jsbytecode* pc, JSString** strOut,

View File

@ -98,7 +98,7 @@ MDefinition::PrintOpcodeName(GenericPrinter& out, Opcode op)
#endif
static MConstant*
EvaluateConstantOperands(TempAllocator& alloc, MBinaryInstruction* ins)
EvaluateConstantOperands(TempAllocator& alloc, MBinaryInstruction* ins, bool* ptypeChange = nullptr)
{
MDefinition* left = ins->getOperand(0);
MDefinition* right = ins->getOperand(1);
@ -189,6 +189,9 @@ EvaluateConstantOperands(TempAllocator& alloc, MBinaryInstruction* ins)
// denominator), decline folding.
MOZ_ASSERT(ins->type() == MIRType::Int32);
if (!retVal.isInt32()) {
if (ptypeChange) {
*ptypeChange = true;
}
return nullptr;
}
@ -2719,9 +2722,7 @@ MUrsh::infer(BaselineInspector* inspector, jsbytecode* pc)
return;
}
// defaultIfEmpty: if we haven't seen anything, assume no double has been seen:
// unsigned right shift only produces a double if the result overflows a signed int32, which is rare.
if (inspector->hasSeenDoubleResult(pc, /* defaultIfEmpty: */ false)) {
if (inspector->hasSeenDoubleResult(pc)) {
specialization_ = MIRType::Double;
setResultType(MIRType::Double);
return;
@ -2939,19 +2940,10 @@ MBinaryArithInstruction::setNumberSpecialization(TempAllocator& alloc, BaselineI
// Try to specialize as int32.
if (getOperand(0)->type() == MIRType::Int32 && getOperand(1)->type() == MIRType::Int32) {
// The defaultIfEmpty logic here is a little complex, so here's some pseudocode:
// If both arguments are integers, and this code/IC has never been ran:
// If opcode is Div:
// Assume the result is a double. (i.e. int/int division usually produces a double)
// Else (if opcode is not Div):
// Assume the result is an int. (i.e. int (op) int usually produces an int)
// Note, however, if we assume an int incorrectly (e.g. an int+int addition that
// overflows), we might bailout repeatedly. The "repeated bailout, let's not ion
// compile this" logic should catch this scenario.
bool defaultIfEmpty = op() == Opcode::Div;
bool seenDouble = inspector->hasSeenDoubleResult(pc, defaultIfEmpty);
bool seenDouble = inspector->hasSeenDoubleResult(pc);
// Use int32 specialization if the operation doesn't overflow on its
// constant operands and if the operation has never overflowed.
if (!seenDouble && !constantDoubleResult(alloc)) {
setInt32Specialization();
}
@ -2961,8 +2953,9 @@ MBinaryArithInstruction::setNumberSpecialization(TempAllocator& alloc, BaselineI
bool
MBinaryArithInstruction::constantDoubleResult(TempAllocator& alloc)
{
MConstant* constantResult = EvaluateConstantOperands(alloc, this);
return constantResult != nullptr && constantResult->type() == MIRType::Double;
bool typeChange = false;
EvaluateConstantOperands(alloc, this, &typeChange);
return typeChange;
}
MDefinition*

View File

@ -314,8 +314,8 @@ intrinsic_SubstringKernel(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args[0].isString());
MOZ_RELEASE_ASSERT(args[1].isInt32());
MOZ_RELEASE_ASSERT(args[2].isInt32());
MOZ_ASSERT(args[1].isInt32());
MOZ_ASSERT(args[2].isInt32());
RootedString str(cx, args[0].toString());
int32_t begin = args[1].toInt32();
@ -333,7 +333,6 @@ intrinsic_SubstringKernel(JSContext* cx, unsigned argc, Value* vp)
static void
ThrowErrorWithType(JSContext* cx, JSExnType type, const CallArgs& args)
{
MOZ_RELEASE_ASSERT(args[0].isInt32());
uint32_t errorNumber = args[0].toInt32();
#ifdef DEBUG
@ -408,7 +407,7 @@ intrinsic_GetErrorMessage(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 1);
MOZ_RELEASE_ASSERT(args[0].isInt32());
MOZ_ASSERT(args[0].isInt32());
const JSErrorFormatString* errorString = GetErrorMessage(nullptr, args[0].toInt32());
MOZ_ASSERT(errorString);
@ -429,8 +428,8 @@ intrinsic_CreateModuleSyntaxError(JSContext* cx, unsigned argc, Value* vp)
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 4);
MOZ_ASSERT(args[0].isObject());
MOZ_RELEASE_ASSERT(args[1].isInt32());
MOZ_RELEASE_ASSERT(args[2].isInt32());
MOZ_ASSERT(args[1].isInt32());
MOZ_ASSERT(args[2].isInt32());
MOZ_ASSERT(args[3].isString());
RootedModuleObject module(cx, &args[0].toObject().as<ModuleObject>());
@ -552,7 +551,7 @@ intrinsic_FinishBoundFunctionInit(JSContext* cx, unsigned argc, Value* vp)
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 3);
MOZ_ASSERT(IsCallable(args[1]));
MOZ_RELEASE_ASSERT(args[2].isInt32());
MOZ_ASSERT(args[2].isInt32());
RootedFunction bound(cx, &args[0].toObject().as<JSFunction>());
RootedObject targetObj(cx, &args[1].toObject());
@ -575,7 +574,6 @@ intrinsic_DecompileArg(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 2);
MOZ_RELEASE_ASSERT(args[0].isInt32());
HandleValue value = args[1];
JSString* str = DecompileArgument(cx, args[0].toInt32(), value);
@ -595,7 +593,6 @@ intrinsic_DefineDataProperty(JSContext* cx, unsigned argc, Value* vp)
// JSOP_INITELEM in the bytecode emitter so we shouldn't get here.
MOZ_ASSERT(args.length() == 4);
MOZ_ASSERT(args[0].isObject());
MOZ_RELEASE_ASSERT(args[3].isInt32());
RootedObject obj(cx, &args[0].toObject());
RootedId id(cx);
@ -644,7 +641,7 @@ intrinsic_DefineProperty(JSContext* cx, unsigned argc, Value* vp)
MOZ_ASSERT(args.length() == 6);
MOZ_ASSERT(args[0].isObject());
MOZ_ASSERT(args[1].isString() || args[1].isNumber() || args[1].isSymbol());
MOZ_RELEASE_ASSERT(args[2].isInt32());
MOZ_ASSERT(args[2].isInt32());
MOZ_ASSERT(args[5].isBoolean());
RootedObject obj(cx, &args[0].toObject());
@ -745,7 +742,7 @@ intrinsic_UnsafeSetReservedSlot(JSContext* cx, unsigned argc, Value* vp)
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 3);
MOZ_ASSERT(args[0].isObject());
MOZ_RELEASE_ASSERT(args[1].isInt32());
MOZ_ASSERT(args[1].isInt32());
args[0].toObject().as<NativeObject>().setReservedSlot(args[1].toPrivateUint32(), args[2]);
args.rval().setUndefined();
@ -758,7 +755,7 @@ intrinsic_UnsafeGetReservedSlot(JSContext* cx, unsigned argc, Value* vp)
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 2);
MOZ_ASSERT(args[0].isObject());
MOZ_RELEASE_ASSERT(args[1].isInt32());
MOZ_ASSERT(args[1].isInt32());
args.rval().set(args[0].toObject().as<NativeObject>().getReservedSlot(args[1].toPrivateUint32()));
return true;
@ -1015,9 +1012,6 @@ intrinsic_ArrayBufferCopyData(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 6);
MOZ_RELEASE_ASSERT(args[1].isInt32());
MOZ_RELEASE_ASSERT(args[3].isInt32());
MOZ_RELEASE_ASSERT(args[4].isInt32());
bool isWrapped = args[5].toBoolean();
Rooted<T*> toBuffer(cx);
@ -1197,9 +1191,6 @@ intrinsic_MoveTypedArrayElements(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 4);
MOZ_RELEASE_ASSERT(args[1].isInt32());
MOZ_RELEASE_ASSERT(args[2].isInt32());
MOZ_RELEASE_ASSERT(args[3].isInt32());
Rooted<TypedArrayObject*> tarray(cx, &args[0].toObject().as<TypedArrayObject>());
uint32_t to = uint32_t(args[1].toInt32());
@ -1295,7 +1286,6 @@ intrinsic_SetFromTypedArrayApproach(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 4);
MOZ_RELEASE_ASSERT(args[3].isInt32());
Rooted<TypedArrayObject*> target(cx, &args[0].toObject().as<TypedArrayObject>());
MOZ_ASSERT(!target->hasDetachedBuffer(),
@ -1542,7 +1532,6 @@ intrinsic_SetDisjointTypedElements(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 3);
MOZ_RELEASE_ASSERT(args[1].isInt32());
Rooted<TypedArrayObject*> target(cx, &args[0].toObject().as<TypedArrayObject>());
MOZ_ASSERT(!target->hasDetachedBuffer(),
@ -1570,7 +1559,6 @@ intrinsic_SetOverlappingTypedElements(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 3);
MOZ_RELEASE_ASSERT(args[1].isInt32());
Rooted<TypedArrayObject*> target(cx, &args[0].toObject().as<TypedArrayObject>());
cx->check(target);
@ -1654,8 +1642,8 @@ intrinsic_TypedArrayBitwiseSlice(JSContext* cx, unsigned argc, Value* vp)
MOZ_ASSERT(args.length() == 4);
MOZ_ASSERT(args[0].isObject());
MOZ_ASSERT(args[1].isObject());
MOZ_RELEASE_ASSERT(args[2].isInt32());
MOZ_RELEASE_ASSERT(args[3].isInt32());
MOZ_ASSERT(args[2].isInt32());
MOZ_ASSERT(args[3].isInt32());
Rooted<TypedArrayObject*> source(cx, &args[0].toObject().as<TypedArrayObject>());
MOZ_ASSERT(!source->hasDetachedBuffer());
@ -2025,14 +2013,12 @@ intrinsic_AddContentTelemetry(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 2);
MOZ_RELEASE_ASSERT(args[0].isInt32());
int id = args[0].toInt32();
MOZ_ASSERT(id < JS_TELEMETRY_END);
MOZ_ASSERT(id >= 0);
if (!cx->realm()->isProbablySystemCode()) {
MOZ_RELEASE_ASSERT(args[1].isInt32());
cx->runtime()->addTelemetry(id, args[1].toInt32());
}
@ -2045,7 +2031,7 @@ intrinsic_WarnDeprecatedStringMethod(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 2);
MOZ_RELEASE_ASSERT(args[0].isInt32());
MOZ_ASSERT(args[0].isInt32());
MOZ_ASSERT(args[1].isString());
uint32_t id = uint32_t(args[0].toInt32());