Bug 854400 - Convert typed array store code to reuse jsop_setelem_typed r=bhackett

This commit is contained in:
Nicholas D. Matsakis 2013-05-08 11:02:45 -04:00
parent cdc6685302
commit 53716ec656
3 changed files with 21 additions and 26 deletions

View File

@ -6510,7 +6510,8 @@ IonBuilder::jsop_setelem()
int arrayType = TypedArray::TYPE_MAX;
if (ElementAccessIsTypedArray(object, index, &arrayType))
return jsop_setelem_typed(arrayType, object, index, value);
return jsop_setelem_typed(arrayType, SetElem_Normal,
object, index, value);
if (!PropertyWriteNeedsTypeBarrier(cx, current, &object, NULL, &value)) {
if (ElementAccessIsDenseNative(object, index)) {
@ -6651,6 +6652,7 @@ IonBuilder::jsop_setelem_typed_static(MDefinition *obj, MDefinition *id, MDefini
bool
IonBuilder::jsop_setelem_typed(int arrayType,
SetElemSafety safety,
MDefinition *obj, MDefinition *id, MDefinition *value)
{
bool staticAccess = false;
@ -6659,8 +6661,14 @@ IonBuilder::jsop_setelem_typed(int arrayType,
if (staticAccess)
return true;
SetElemICInspector icInspect(inspector->setElemICInspector(pc));
bool expectOOB = icInspect.sawOOBTypedArrayWrite();
bool expectOOB;
if (safety == SetElem_Normal) {
SetElemICInspector icInspect(inspector->setElemICInspector(pc));
expectOOB = icInspect.sawOOBTypedArrayWrite();
} else {
expectOOB = false;
}
if (expectOOB)
spew("Emitting OOB TypedArray SetElem");
@ -6673,7 +6681,7 @@ IonBuilder::jsop_setelem_typed(int arrayType,
MInstruction *length = getTypedArrayLength(obj);
current->add(length);
if (!expectOOB) {
if (!expectOOB && safety == SetElem_Normal) {
// Bounds check.
id = addBoundsCheck(id, length);
}
@ -6696,7 +6704,10 @@ IonBuilder::jsop_setelem_typed(int arrayType,
else
ins = MStoreTypedArrayElement::New(elements, id, toWrite, arrayType);
current->add(ins);
current->push(value);
if (safety == SetElem_Normal)
current->push(value);
return resumeAfter(ins);
}

View File

@ -385,6 +385,7 @@ class IonBuilder : public MIRGenerator
bool jsop_setelem_dense(types::StackTypeSet::DoubleConversion conversion,
MDefinition *object, MDefinition *index, MDefinition *value);
bool jsop_setelem_typed(int arrayType,
SetElemSafety safety,
MDefinition *object, MDefinition *index, MDefinition *value);
bool jsop_setelem_typed_static(MDefinition *object, MDefinition *index, MDefinition *value,
bool *psucceeded);

View File

@ -1034,28 +1034,11 @@ IonBuilder::inlineUnsafeSetTypedArrayElement(CallInfo &callInfo,
// - arr is a typed array
// - idx < length
uint32_t arri = base + 0;
uint32_t idxi = base + 1;
uint32_t elemi = base + 2;
MDefinition *obj = callInfo.getArg(base + 0);
MDefinition *id = callInfo.getArg(base + 1);
MDefinition *elem = callInfo.getArg(base + 2);
MInstruction *elements = getTypedArrayElements(callInfo.getArg(arri));
current->add(elements);
MToInt32 *id = MToInt32::New(callInfo.getArg(idxi));
current->add(id);
MDefinition *value = callInfo.getArg(elemi);
if (arrayType == TypedArray::TYPE_UINT8_CLAMPED) {
value = MClampToUint8::New(value);
current->add(value->toInstruction());
}
MStoreTypedArrayElement *store = MStoreTypedArrayElement::New(elements, id, value, arrayType);
store->setRacy();
current->add(store);
if (!resumeAfter(store))
if (!jsop_setelem_typed(arrayType, SetElem_Unsafe, obj, id, elem))
return false;
return true;