MIRType TypeInferenceOracle::elementWrite(UnrootedScript script, jsbytecode *pc) { StackTypeSet *objTypes = script->analysis()->poppedTypes(pc, 2); MIRType elementType = MIRType_None; unsigned count = objTypes->getObjectCount(); for (unsigned i = 0; i < count; i++) { if (objTypes->getSingleObject(i)) return MIRType_None; if (TypeObject *object = objTypes->getTypeObject(i)) { types::HeapTypeSet *elementTypes = object->getProperty(cx, JSID_VOID, false); if (!elementTypes) return MIRType_None; MIRType type = getMIRType(elementTypes); if (type == MIRType_None) return MIRType_None; if (elementType == MIRType_None) elementType = type; else if (elementType != type) return MIRType_None; } } return elementType; }
bool TypeInferenceOracle::propertyReadIdempotent(HandleScript script, jsbytecode *pc, HandleId id) { if (script->analysis()->getCode(pc).notIdempotent) return false; if (id != MakeTypeId(cx, id)) return false; StackTypeSet *types = script->analysis()->poppedTypes(pc, 0); if (!types || types->unknownObject()) return false; for (unsigned i = 0; i < types->getObjectCount(); i++) { if (types->getSingleObject(i)) return false; if (TypeObject *obj = types->getTypeObject(i)) { if (obj->unknownProperties()) return false; // Check if the property has been reconfigured or is a getter. HeapTypeSet *propertyTypes = obj->getProperty(cx, id, false); if (!propertyTypes || propertyTypes->isOwnProperty(cx, obj, true)) return false; } } return true; }