bool GetPropIRGenerator::tryAttachUnboxedArrayElement(HandleObject obj, ObjOperandId objId, ValOperandId indexId) { MOZ_ASSERT(idVal_.isInt32()); if (!obj->is<UnboxedArrayObject>()) return false; if (uint32_t(idVal_.toInt32()) >= obj->as<UnboxedArrayObject>().initializedLength()) return false; writer.guardGroup(objId, obj->group()); JSValueType elementType = obj->group()->unboxedLayoutDontCheckGeneration().elementType(); Int32OperandId int32IndexId = writer.guardIsInt32(indexId); writer.loadUnboxedArrayElementResult(objId, int32IndexId, elementType); // Only monitor the result if its type might change. if (elementType == JSVAL_TYPE_OBJECT) writer.typeMonitorResult(); else writer.returnFromIC(); return true; }
bool GetPropIRGenerator::tryAttachUnboxed(HandleObject obj, ObjOperandId objId, HandleId id) { if (!obj->is<UnboxedPlainObject>()) return false; const UnboxedLayout::Property* property = obj->as<UnboxedPlainObject>().layout().lookup(id); if (!property) return false; if (!cx_->runtime()->jitSupportsFloatingPoint) return false; maybeEmitIdGuard(id); writer.guardGroup(objId, obj->group()); writer.loadUnboxedPropertyResult(objId, property->type, UnboxedPlainObject::offsetOfData() + property->offset); if (property->type == JSVAL_TYPE_OBJECT) writer.typeMonitorResult(); else writer.returnFromIC(); preliminaryObjectAction_ = PreliminaryObjectAction::Unlink; return true; }