void AbstractValue::set(Graph& graph, const FrozenValue& value, StructureClobberState clobberState) { if (!!value && value.value().isCell()) { Structure* structure = value.structure(); // FIXME: This check may not be necessary since any frozen value should have its structure // watched already. // https://bugs.webkit.org/show_bug.cgi?id=136055 if (graph.registerStructure(structure) == StructureRegisteredAndWatched) { m_structure = structure; if (clobberState == StructuresAreClobbered) { m_arrayModes = ALL_ARRAY_MODES; m_structure.clobber(); } else m_arrayModes = asArrayModes(structure->indexingType()); } else { m_structure.makeTop(); m_arrayModes = ALL_ARRAY_MODES; } } else { m_structure.clear(); m_arrayModes = 0; } m_type = speculationFromValue(value.value()); m_value = value.value(); checkConsistency(); assertIsRegistered(graph); }
void AbstractValue::set(Graph& graph, const FrozenValue& value, StructureClobberState clobberState) { if (!!value && value.value().isCell()) { Structure* structure = value.structure(); if (graph.registerStructure(structure) == StructureRegisteredAndWatched) { m_structure = structure; if (clobberState == StructuresAreClobbered) { m_arrayModes = ALL_ARRAY_MODES; m_structure.clobber(); } else m_arrayModes = asArrayModes(structure->indexingType()); } else { m_structure.makeTop(); m_arrayModes = ALL_ARRAY_MODES; } } else { m_structure.clear(); m_arrayModes = 0; } m_type = speculationFromValue(value.value()); m_value = value.value(); checkConsistency(); assertIsRegistered(graph); }
bool AbstractValue::mergeOSREntryValue(Graph& graph, JSValue value) { AbstractValue oldMe = *this; if (isClear()) { FrozenValue* frozenValue = graph.freeze(value); if (frozenValue->pointsToHeap()) { m_structure = frozenValue->structure(); m_arrayModes = asArrayModes(frozenValue->structure()->indexingType()); } else { m_structure.clear(); m_arrayModes = 0; } m_type = speculationFromValue(value); m_value = value; } else { mergeSpeculation(m_type, speculationFromValue(value)); if (!!value && value.isCell()) { Structure* structure = value.asCell()->structure(); graph.registerStructure(structure); mergeArrayModes(m_arrayModes, asArrayModes(structure->indexingType())); m_structure.merge(StructureSet(structure)); } if (m_value != value) m_value = JSValue(); } checkConsistency(); assertIsRegistered(graph); return oldMe != *this; }
void AbstractValue::setMostSpecific(Graph& graph, JSValue value) { if (!!value && value.isCell()) { Structure* structure = value.asCell()->structure(); m_currentKnownStructure = structure; setFuturePossibleStructure(graph, structure); m_arrayModes = asArrayModes(structure->indexingType()); } else { m_currentKnownStructure.clear(); m_futurePossibleStructure.clear(); m_arrayModes = 0; } m_type = speculationFromValue(value); m_value = value; checkConsistency(); }
void AbstractValue::setOSREntryValue(Graph& graph, const FrozenValue& value) { if (!!value && value.value().isCell()) { Structure* structure = value.structure(); graph.registerStructure(structure); m_structure = structure; m_arrayModes = asArrayModes(structure->indexingType()); } else { m_structure.clear(); m_arrayModes = 0; } m_type = speculationFromValue(value.value()); m_value = value.value(); checkConsistency(); assertIsRegistered(graph); }
void ObjectInitializationScope::verifyPropertiesAreInitialized(JSObject* object) { Butterfly* butterfly = object->butterfly(); Structure* structure = object->structure(m_vm); IndexingType indexingType = structure->indexingType(); unsigned vectorLength = butterfly->vectorLength(); if (UNLIKELY(hasUndecided(indexingType)) || !hasIndexedProperties(indexingType)) { // Nothing to verify. } else if (LIKELY(!hasAnyArrayStorage(indexingType))) { auto data = butterfly->contiguous().data(); for (unsigned i = 0; i < vectorLength; ++i) { if (isScribbledValue(data[i].get())) { dataLogLn("Found scribbled value at i = ", i); ASSERT_NOT_REACHED(); } } } else { ArrayStorage* storage = butterfly->arrayStorage(); for (unsigned i = 0; i < vectorLength; ++i) { if (isScribbledValue(storage->m_vector[i].get())) { dataLogLn("Found scribbled value at i = ", i); ASSERT_NOT_REACHED(); } } } auto isSafeEmptyValueForGCScanning = [] (JSValue value) { #if USE(JSVALUE64) return !value; #else return !value || !JSValue::encode(value); #endif }; for (int64_t i = 0; i < static_cast<int64_t>(structure->outOfLineCapacity()); i++) { // We rely on properties past the last offset be zero for concurrent GC. if (i + firstOutOfLineOffset > structure->lastOffset()) ASSERT(isSafeEmptyValueForGCScanning(butterfly->propertyStorage()[-i - 1].get())); else if (isScribbledValue(butterfly->propertyStorage()[-i - 1].get())) { dataLogLn("Found scribbled property at i = ", -i - 1); ASSERT_NOT_REACHED(); } } }
void AbstractValue::set(Graph& graph, JSValue value) { if (!!value && value.isCell()) { m_currentKnownStructure.makeTop(); Structure* structure = value.asCell()->structure(); setFuturePossibleStructure(graph, structure); m_arrayModes = asArrayModes(structure->indexingType()); clobberArrayModes(); } else { m_currentKnownStructure.clear(); m_futurePossibleStructure.clear(); m_arrayModes = 0; } m_type = speculationFromValue(value); if (m_type == SpecInt52AsDouble) m_type = SpecInt52; m_value = value; checkConsistency(); }