bool BaselineInspector::commonGetPropFunction(jsbytecode *pc, JSObject **holder, Shape **holderShape, JSFunction **commonGetter, Shape **globalShape, bool *isOwnProperty, ShapeVector &receiverShapes) { if (!hasBaselineScript()) return false; MOZ_ASSERT(receiverShapes.empty()); *holder = nullptr; const ICEntry &entry = icEntryFromPC(pc); for (ICStub *stub = entry.firstStub(); stub; stub = stub->next()) { if (stub->isGetProp_CallScripted() || stub->isGetProp_CallNative() || stub->isGetProp_CallNativePrototype()) { ICGetPropCallGetter *nstub = static_cast<ICGetPropCallGetter *>(stub); bool isOwn = stub->isGetProp_CallNative(); if (!AddReceiverShapeForGetPropFunction(receiverShapes, nstub)) return false; if (!*holder) { *holder = nstub->holder(); *holderShape = nstub->holderShape(); *commonGetter = nstub->getter(); *globalShape = GlobalShapeForGetPropFunction(nstub); *isOwnProperty = isOwn; } else if (nstub->holderShape() != *holderShape || GlobalShapeForGetPropFunction(nstub) != *globalShape || isOwn != *isOwnProperty) { return false; } else { MOZ_ASSERT(*commonGetter == nstub->getter()); } } else if (stub->isGetProp_Fallback()) { // If we have an unoptimizable access, don't try to optimize. if (stub->toGetProp_Fallback()->hadUnoptimizableAccess()) return false; } else if (stub->isGetName_Fallback()) { if (stub->toGetName_Fallback()->hadUnoptimizableAccess()) return false; } else { return false; } } if (!*holder) return false; MOZ_ASSERT(*isOwnProperty == receiverShapes.empty()); return true; }
JSObject * BaselineInspector::commonGetPropFunction(jsbytecode *pc, Shape **lastProperty, JSFunction **commonGetter) { const ICEntry &entry = icEntryFromPC(pc); for (ICStub *stub = entry.firstStub(); stub; stub = stub->next()) { if (stub->isGetProp_CallScripted() || stub->isGetProp_CallNative()) { ICGetPropCallGetter *nstub = static_cast<ICGetPropCallGetter *>(stub); *lastProperty = nstub->holderShape(); *commonGetter = nstub->getter(); return nstub->holder(); } } return nullptr; }
JSObject * BaselineInspector::commonGetPropFunction(jsbytecode *pc, Shape **lastProperty, JSFunction **commonGetter, Shape **globalShape) { if (!hasBaselineScript()) return nullptr; const ICEntry &entry = icEntryFromPC(pc); JSObject* holder = nullptr; Shape *holderShape = nullptr; JSFunction *getter = nullptr; Shape *global = nullptr; for (ICStub *stub = entry.firstStub(); stub; stub = stub->next()) { if (stub->isGetProp_CallScripted() || stub->isGetProp_CallNative() || stub->isGetProp_CallNativePrototype()) { ICGetPropCallGetter *nstub = static_cast<ICGetPropCallGetter *>(stub); if (!holder) { holder = nstub->holder(); holderShape = nstub->holderShape(); getter = nstub->getter(); global = GlobalShapeForGetPropFunction(nstub); } else if (nstub->holderShape() != holderShape || GlobalShapeForGetPropFunction(nstub) != global) { return nullptr; } else { MOZ_ASSERT(getter == nstub->getter()); } } else if (stub->isGetProp_Fallback() && stub->toGetProp_Fallback()->hadUnoptimizableAccess()) { // We have an unoptimizable access, so don't try to optimize. return nullptr; } } *lastProperty = holderShape; *commonGetter = getter; *globalShape = global; return holder; }