Changeset 269115 in webkit for trunk/Source/JavaScriptCore/parser/VariableEnvironment.h
- Timestamp:
- Oct 28, 2020, 12:25:14 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/parser/VariableEnvironment.h
r264488 r269115 30 30 #include <wtf/HashSet.h> 31 31 #include <wtf/IteratorRange.h> 32 #include <wtf/Variant.h> 32 33 33 34 namespace JSC { … … 120 121 121 122 class VariableEnvironment { 123 WTF_MAKE_FAST_ALLOCATED; 122 124 private: 123 125 typedef HashMap<PackedRefPtr<UniquedStringImpl>, VariableEnvironmentEntry, IdentifierRepHash, HashTraits<RefPtr<UniquedStringImpl>>, VariableEnvironmentEntryHashTraits> Map; … … 263 265 }; 264 266 265 class CompactVariableEnvironment { 267 using TDZEnvironment = HashSet<RefPtr<UniquedStringImpl>, IdentifierRepHash>; 268 269 class CompactTDZEnvironment { 266 270 WTF_MAKE_FAST_ALLOCATED; 267 WTF_MAKE_NONCOPYABLE(CompactVariableEnvironment); 268 269 friend class CachedCompactVariableEnvironment; 271 WTF_MAKE_NONCOPYABLE(CompactTDZEnvironment); 272 273 friend class CachedCompactTDZEnvironment; 274 275 using Compact = Vector<PackedRefPtr<UniquedStringImpl>>; 276 using Inflated = TDZEnvironment; 277 using Variables = Variant<Compact, Inflated>; 270 278 271 279 public: 272 CompactVariableEnvironment(const VariableEnvironment&); 273 VariableEnvironment toVariableEnvironment() const; 274 275 bool operator==(const CompactVariableEnvironment&) const; 280 CompactTDZEnvironment(const TDZEnvironment&); 281 282 bool operator==(const CompactTDZEnvironment&) const; 276 283 unsigned hash() const { return m_hash; } 277 284 278 private: 279 CompactVariableEnvironment() = default; 280 281 Vector<PackedRefPtr<UniquedStringImpl>> m_variables; 282 Vector<VariableEnvironmentEntry> m_variableMetadata; 285 static void sortCompact(Compact&); 286 287 TDZEnvironment& toTDZEnvironment() const 288 { 289 if (WTF::holds_alternative<Inflated>(m_variables)) 290 return const_cast<TDZEnvironment&>(WTF::get<Inflated>(m_variables)); 291 return toTDZEnvironmentSlow(); 292 } 293 294 private: 295 CompactTDZEnvironment() = default; 296 TDZEnvironment& toTDZEnvironmentSlow() const; 297 298 mutable Variables m_variables; 283 299 unsigned m_hash; 284 bool m_isEverythingCaptured; 285 }; 286 287 struct CompactVariableMapKey { 288 CompactVariableMapKey() 300 }; 301 302 struct CompactTDZEnvironmentKey { 303 CompactTDZEnvironmentKey() 289 304 : m_environment(nullptr) 290 305 { … … 292 307 } 293 308 294 Compact VariableMapKey(CompactVariableEnvironment& environment)309 CompactTDZEnvironmentKey(CompactTDZEnvironment& environment) 295 310 : m_environment(&environment) 296 311 { } 297 312 298 static unsigned hash(const Compact VariableMapKey& key) { return key.m_environment->hash(); }299 static bool equal(const Compact VariableMapKey& a, const CompactVariableMapKey& b) { return *a.m_environment == *b.m_environment; }313 static unsigned hash(const CompactTDZEnvironmentKey& key) { return key.m_environment->hash(); } 314 static bool equal(const CompactTDZEnvironmentKey& a, const CompactTDZEnvironmentKey& b) { return *a.m_environment == *b.m_environment; } 300 315 static constexpr bool safeToCompareToEmptyOrDeleted = false; 301 static void makeDeletedValue(Compact VariableMapKey& key)302 { 303 key.m_environment = reinterpret_cast<Compact VariableEnvironment*>(1);316 static void makeDeletedValue(CompactTDZEnvironmentKey& key) 317 { 318 key.m_environment = reinterpret_cast<CompactTDZEnvironment*>(1); 304 319 } 305 320 bool isHashTableDeletedValue() const 306 321 { 307 return m_environment == reinterpret_cast<Compact VariableEnvironment*>(1);322 return m_environment == reinterpret_cast<CompactTDZEnvironment*>(1); 308 323 } 309 324 bool isHashTableEmptyValue() const … … 312 327 } 313 328 314 Compact VariableEnvironment& environment()329 CompactTDZEnvironment& environment() 315 330 { 316 331 RELEASE_ASSERT(!isHashTableDeletedValue()); … … 320 335 321 336 private: 322 Compact VariableEnvironment* m_environment;337 CompactTDZEnvironment* m_environment; 323 338 }; 324 339 … … 328 343 329 344 template<typename T> struct DefaultHash; 330 template<> struct DefaultHash<JSC::Compact VariableMapKey> : JSC::CompactVariableMapKey { };331 332 template<> struct HashTraits<JSC::Compact VariableMapKey> : GenericHashTraits<JSC::CompactVariableMapKey> {345 template<> struct DefaultHash<JSC::CompactTDZEnvironmentKey> : JSC::CompactTDZEnvironmentKey { }; 346 347 template<> struct HashTraits<JSC::CompactTDZEnvironmentKey> : GenericHashTraits<JSC::CompactTDZEnvironmentKey> { 333 348 static constexpr bool emptyValueIsZero = true; 334 static JSC::Compact VariableMapKey emptyValue() { return JSC::CompactVariableMapKey(); }349 static JSC::CompactTDZEnvironmentKey emptyValue() { return JSC::CompactTDZEnvironmentKey(); } 335 350 336 351 static constexpr bool hasIsEmptyValueFunction = true; 337 static bool isEmptyValue(JSC::Compact VariableMapKey key) { return key.isHashTableEmptyValue(); }338 339 static void constructDeletedValue(JSC::Compact VariableMapKey& key) { JSC::CompactVariableMapKey::makeDeletedValue(key); }340 static bool isDeletedValue(JSC::Compact VariableMapKey key) { return key.isHashTableDeletedValue(); }352 static bool isEmptyValue(JSC::CompactTDZEnvironmentKey key) { return key.isHashTableEmptyValue(); } 353 354 static void constructDeletedValue(JSC::CompactTDZEnvironmentKey& key) { JSC::CompactTDZEnvironmentKey::makeDeletedValue(key); } 355 static bool isDeletedValue(JSC::CompactTDZEnvironmentKey key) { return key.isHashTableDeletedValue(); } 341 356 }; 342 357 … … 345 360 namespace JSC { 346 361 347 class Compact VariableMap : public RefCounted<CompactVariableMap> {362 class CompactTDZEnvironmentMap : public RefCounted<CompactTDZEnvironmentMap> { 348 363 public: 349 364 class Handle { 350 friend class CachedCompact VariableMapHandle;365 friend class CachedCompactTDZEnvironmentMapHandle; 351 366 352 367 public: 353 368 Handle() = default; 354 369 355 Handle(Compact VariableEnvironment&, CompactVariableMap&);370 Handle(CompactTDZEnvironment&, CompactTDZEnvironmentMap&); 356 371 357 372 Handle(Handle&& other) … … 378 393 explicit operator bool() const { return !!m_map; } 379 394 380 const Compact VariableEnvironment& environment() const395 const CompactTDZEnvironment& environment() const 381 396 { 382 397 return *m_environment; … … 390 405 } 391 406 392 Compact VariableEnvironment* m_environment { nullptr };393 RefPtr<Compact VariableMap> m_map;407 CompactTDZEnvironment* m_environment { nullptr }; 408 RefPtr<CompactTDZEnvironmentMap> m_map; 394 409 }; 395 410 396 Handle get(const VariableEnvironment&);411 Handle get(const TDZEnvironment&); 397 412 398 413 private: 399 414 friend class Handle; 400 friend class CachedCompact VariableMapHandle;401 402 Handle get(Compact VariableEnvironment*, bool& isNewEntry);403 404 HashMap<Compact VariableMapKey, unsigned> m_map;415 friend class CachedCompactTDZEnvironmentMapHandle; 416 417 Handle get(CompactTDZEnvironment*, bool& isNewEntry); 418 419 HashMap<CompactTDZEnvironmentKey, unsigned> m_map; 405 420 }; 406 421
Note:
See TracChangeset
for help on using the changeset viewer.