--- a/js/src/jit/IonBuilder.cpp
+++ b/js/src/jit/IonBuilder.cpp
@@ -9030,25 +9030,18 @@ IonBuilder::setElemTryReferenceElemOfTyp
{
ReferenceTypeDescr::Type elemType = elemPrediction.referenceType();
uint32_t elemSize = ReferenceTypeDescr::size(elemType);
LinearSum indexAsByteOffset(alloc());
if (!checkTypedObjectIndexInBounds(elemSize, obj, index, objPrediction, &indexAsByteOffset))
return Ok();
- MOZ_TRY_VAR(*emitted, storeReferenceTypedObjectValue(obj, indexAsByteOffset, elemType, value, nullptr));
- if (!*emitted)
- return Ok();
-
- current->push(value);
-
- trackOptimizationSuccess();
- *emitted = true;
- return Ok();
+ return setPropTryReferenceTypedObjectValue(emitted, obj, indexAsByteOffset,
+ elemType, value, nullptr);
}
AbortReasonOr<Ok>
IonBuilder::setElemTryScalarElemOfTypedObject(bool* emitted,
MDefinition* obj,
MDefinition* index,
TypedObjectPrediction objPrediction,
MDefinition* value,
@@ -9058,24 +9051,17 @@ IonBuilder::setElemTryScalarElemOfTypedO
// Must always be loading the same scalar type
ScalarTypeDescr::Type elemType = elemPrediction.scalarType();
MOZ_ASSERT(elemSize == ScalarTypeDescr::alignment(elemType));
LinearSum indexAsByteOffset(alloc());
if (!checkTypedObjectIndexInBounds(elemSize, obj, index, objPrediction, &indexAsByteOffset))
return Ok();
- // Store the element
- MOZ_TRY(storeScalarTypedObjectValue(obj, indexAsByteOffset, elemType, value));
-
- current->push(value);
-
- trackOptimizationSuccess();
- *emitted = true;
- return Ok();
+ return setPropTryScalarTypedObjectValue(emitted, obj, indexAsByteOffset, elemType, value);
}
AbortReasonOr<Ok>
IonBuilder::setElemTryTypedStatic(bool* emitted, MDefinition* object,
MDefinition* index, MDefinition* value)
{
MOZ_ASSERT(*emitted == false);
@@ -11751,25 +11737,17 @@ IonBuilder::setPropTryReferencePropOfTyp
TypeSet::ObjectKey* globalKey = TypeSet::ObjectKey::get(&script()->global());
if (globalKey->hasFlags(constraints(), OBJECT_FLAG_TYPED_OBJECT_HAS_DETACHED_BUFFER))
return Ok();
LinearSum byteOffset(alloc());
if (!byteOffset.add(fieldOffset))
return abort(AbortReason::Disable, "Overflow of field offset.");
- MOZ_TRY_VAR(*emitted, storeReferenceTypedObjectValue(obj, byteOffset, fieldType, value, name));
- if (!*emitted)
- return Ok();
-
- current->push(value);
-
- trackOptimizationSuccess();
- *emitted = true;
- return Ok();
+ return setPropTryReferenceTypedObjectValue(emitted, obj, byteOffset, fieldType, value, name);
}
AbortReasonOr<Ok>
IonBuilder::setPropTryScalarPropOfTypedObject(bool* emitted,
MDefinition* obj,
int32_t fieldOffset,
MDefinition* value,
TypedObjectPrediction fieldPrediction)
@@ -11781,23 +11759,17 @@ IonBuilder::setPropTryScalarPropOfTypedO
TypeSet::ObjectKey* globalKey = TypeSet::ObjectKey::get(&script()->global());
if (globalKey->hasFlags(constraints(), OBJECT_FLAG_TYPED_OBJECT_HAS_DETACHED_BUFFER))
return Ok();
LinearSum byteOffset(alloc());
if (!byteOffset.add(fieldOffset))
return abort(AbortReason::Disable, "Overflow of field offet.");
- MOZ_TRY(storeScalarTypedObjectValue(obj, byteOffset, fieldType, value));
-
- current->push(value);
-
- trackOptimizationSuccess();
- *emitted = true;
- return Ok();
+ return setPropTryScalarTypedObjectValue(emitted, obj, byteOffset, fieldType, value);
}
AbortReasonOr<Ok>
IonBuilder::setPropTryDefiniteSlot(bool* emitted, MDefinition* obj,
PropertyName* name, MDefinition* value,
bool barrier, TemporaryTypeSet* objTypes)
{
MOZ_ASSERT(*emitted == false);
@@ -13473,21 +13445,24 @@ IonBuilder::typeObjectForFieldFromStruct
MInstruction* unboxFieldType = MUnbox::New(alloc(), fieldType, MIRType::Object, MUnbox::Infallible);
current->add(unboxFieldType);
return unboxFieldType;
}
AbortReasonOr<Ok>
-IonBuilder::storeScalarTypedObjectValue(MDefinition* typedObj,
- const LinearSum& byteOffset,
- ScalarTypeDescr::Type type,
- MDefinition* value)
-{
+IonBuilder::setPropTryScalarTypedObjectValue(bool* emitted,
+ MDefinition* typedObj,
+ const LinearSum& byteOffset,
+ ScalarTypeDescr::Type type,
+ MDefinition* value)
+{
+ MOZ_ASSERT(!*emitted);
+
// Find location within the owner object.
MDefinition* elements;
MDefinition* scaledOffset;
int32_t adjustment;
uint32_t alignment = ScalarTypeDescr::alignment(type);
MOZ_TRY(loadTypedObjectElements(typedObj, byteOffset, alignment,
&elements, &scaledOffset, &adjustment));
@@ -13498,40 +13473,46 @@ IonBuilder::storeScalarTypedObjectValue(
current->add(toWrite->toInstruction());
}
MStoreUnboxedScalar* store =
MStoreUnboxedScalar::New(alloc(), elements, scaledOffset, toWrite,
type, MStoreUnboxedScalar::TruncateInput,
DoesNotRequireMemoryBarrier, adjustment);
current->add(store);
-
- return Ok();
-}
-
-AbortReasonOr<bool>
-IonBuilder::storeReferenceTypedObjectValue(MDefinition* typedObj,
- const LinearSum& byteOffset,
- ReferenceTypeDescr::Type type,
- MDefinition* value,
- PropertyName* name)
-{
+ current->push(value);
+
+ trackOptimizationSuccess();
+ *emitted = true;
+ return resumeAfter(store);
+}
+
+AbortReasonOr<Ok>
+IonBuilder::setPropTryReferenceTypedObjectValue(bool* emitted,
+ MDefinition* typedObj,
+ const LinearSum& byteOffset,
+ ReferenceTypeDescr::Type type,
+ MDefinition* value,
+ PropertyName* name)
+{
+ MOZ_ASSERT(!*emitted);
+
// Make sure we aren't adding new type information for writes of object and value
// references.
if (type != ReferenceTypeDescr::TYPE_STRING) {
MOZ_ASSERT(type == ReferenceTypeDescr::TYPE_ANY ||
type == ReferenceTypeDescr::TYPE_OBJECT);
MIRType implicitType =
(type == ReferenceTypeDescr::TYPE_ANY) ? MIRType::Undefined : MIRType::Null;
if (PropertyWriteNeedsTypeBarrier(alloc(), constraints(), current, &typedObj, name, &value,
/* canModify = */ true, implicitType))
{
trackOptimizationOutcome(TrackedOutcome::NeedsTypeBarrier);
- return false;
+ return Ok();
}
}
// Find location within the owner object.
MDefinition* elements;
MDefinition* scaledOffset;
int32_t adjustment;
uint32_t alignment = ReferenceTypeDescr::alignment(type);
@@ -13556,17 +13537,21 @@ IonBuilder::storeReferenceTypedObjectVal
case ReferenceTypeDescr::TYPE_STRING:
// Strings are not nursery allocated, so these writes do not need post
// barriers.
store = MStoreUnboxedString::New(alloc(), elements, scaledOffset, value, adjustment);
break;
}
current->add(store);
- return true;
+ current->push(value);
+
+ trackOptimizationSuccess();
+ *emitted = true;
+ return resumeAfter(store);
}
JSObject*
IonBuilder::checkNurseryObject(JSObject* obj)
{
// If we try to use any nursery pointers during compilation, make sure that
// the active thread will cancel this compilation before performing a minor
// GC. All constants used during compilation should either go through this
--- a/js/src/jit/IonBuilder.h
+++ b/js/src/jit/IonBuilder.h
@@ -278,21 +278,32 @@ class IonBuilder
PropertyName* name, MDefinition* value,
bool barrier, TemporaryTypeSet* objTypes);
AbortReasonOr<Ok> setPropTryTypedObject(bool* emitted, MDefinition* obj,
PropertyName* name, MDefinition* value);
AbortReasonOr<Ok> setPropTryReferencePropOfTypedObject(bool* emitted, MDefinition* obj,
int32_t fieldOffset, MDefinition* value,
TypedObjectPrediction fieldPrediction,
PropertyName* name);
+ AbortReasonOr<Ok> setPropTryReferenceTypedObjectValue(bool* emitted,
+ MDefinition* typedObj,
+ const LinearSum& byteOffset,
+ ReferenceTypeDescr::Type type,
+ MDefinition* value,
+ PropertyName* name);
AbortReasonOr<Ok> setPropTryScalarPropOfTypedObject(bool* emitted,
MDefinition* obj,
int32_t fieldOffset,
MDefinition* value,
TypedObjectPrediction fieldTypeReprs);
+ AbortReasonOr<Ok> setPropTryScalarTypedObjectValue(bool* emitted,
+ MDefinition* typedObj,
+ const LinearSum& byteOffset,
+ ScalarTypeDescr::Type type,
+ MDefinition* value);
AbortReasonOr<Ok> setPropTryCache(bool* emitted, MDefinition* obj,
PropertyName* name, MDefinition* value,
bool barrier, TemporaryTypeSet* objTypes);
// jsop_binary_arith helpers.
MBinaryArithInstruction* binaryArithInstruction(JSOp op, MDefinition* left, MDefinition* right);
AbortReasonOr<Ok> binaryArithTryConcat(bool* emitted, JSOp op, MDefinition* left,
MDefinition* right);
@@ -353,25 +364,16 @@ class IonBuilder
const LinearSum& byteOffset,
uint32_t scale,
MDefinition** ownerElements,
MDefinition** ownerScaledOffset,
int32_t* ownerByteAdjustment);
MDefinition* typeObjectForElementFromArrayStructType(MDefinition* typedObj);
MDefinition* typeObjectForFieldFromStructType(MDefinition* type,
size_t fieldIndex);
- AbortReasonOr<bool> storeReferenceTypedObjectValue(MDefinition* typedObj,
- const LinearSum& byteOffset,
- ReferenceTypeDescr::Type type,
- MDefinition* value,
- PropertyName* name);
- AbortReasonOr<Ok> storeScalarTypedObjectValue(MDefinition* typedObj,
- const LinearSum& byteOffset,
- ScalarTypeDescr::Type type,
- MDefinition* value);
bool checkTypedObjectIndexInBounds(uint32_t elemSize,
MDefinition* obj,
MDefinition* index,
TypedObjectPrediction objTypeDescrs,
LinearSum* indexAsByteOffset);
AbortReasonOr<Ok> pushDerivedTypedObject(bool* emitted,
MDefinition* obj,
const LinearSum& byteOffset,