bool TypeInferenceOracle::elementReadShouldAlwaysLoadDoubles(RawScript script, jsbytecode *pc) { StackTypeSet *types = script->analysis()->poppedTypes(pc, 1); types::StackTypeSet::DoubleConversion conversion = types->convertDoubleElements(cx); return conversion == StackTypeSet::AlwaysConvertToDoubles; }
bool TypeInferenceOracle::elementWriteNeedsDoubleConversion(RawScript script, jsbytecode *pc) { StackTypeSet *types = script->analysis()->poppedTypes(pc, 2); types::StackTypeSet::DoubleConversion conversion = types->convertDoubleElements(cx); return conversion == StackTypeSet::AlwaysConvertToDoubles || conversion == StackTypeSet::MaybeConvertToDoubles; }
bool TypeInferenceOracle::elementWriteIsDenseNative(HandleScript script, jsbytecode *pc) { // Check whether the object is a dense array and index is int32 or double. StackTypeSet *obj = script->analysis()->poppedTypes(pc, 2); StackTypeSet *id = script->analysis()->poppedTypes(pc, 1); JSValueType idType = id->getKnownTypeTag(); if (idType != JSVAL_TYPE_INT32 && idType != JSVAL_TYPE_DOUBLE) return false; Class *clasp = obj->getKnownClass(); if (!clasp || !clasp->isNative()) return false; return obj->convertDoubleElements(cx) != StackTypeSet::AmbiguousDoubleConversion; }