Files
ladybird/Libraries/LibJS/Runtime/Symbol.cpp
Andreas Kling 277551c40f LibJS: Account promise storage as external memory
Add shared helpers for estimating external string and container storage.
Use them for symbols, bound function arguments, promise reactions,
and promise combinator value lists.
2026-05-07 10:03:09 +02:00

64 lines
1.8 KiB
C++

/*
* Copyright (c) 2020, Matthew Olsson <mattco@serenityos.org>
* Copyright (c) 2022-2023, Linus Groh <linusg@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibGC/Heap.h>
#include <LibJS/Runtime/ExternalMemory.h>
#include <LibJS/Runtime/Symbol.h>
#include <LibJS/Runtime/VM.h>
namespace JS {
GC_DEFINE_ALLOCATOR(Symbol);
Symbol::Symbol(Optional<Utf16String> description, bool is_global)
: m_description(move(description))
, m_is_global(is_global)
{
}
GC::Ref<Symbol> Symbol::create(VM& vm, Optional<Utf16String> description, bool is_global)
{
return vm.heap().allocate<Symbol>(move(description), is_global);
}
// 20.4.3.3.1 SymbolDescriptiveString ( sym ), https://tc39.es/ecma262/#sec-symboldescriptivestring
Utf16String Symbol::descriptive_string() const
{
// 1. Let desc be sym's [[Description]] value.
// 2. If desc is undefined, set desc to the empty String.
// 3. Assert: desc is a String.
auto description = m_description.value_or({});
// 4. Return the string-concatenation of "Symbol(", desc, and ")".
return Utf16String::formatted("Symbol({})", description);
}
// 20.4.5.1 KeyForSymbol ( sym ), https://tc39.es/ecma262/#sec-keyforsymbol
Optional<Utf16String> Symbol::key() const
{
// 1. For each element e of the GlobalSymbolRegistry List, do
// a. If SameValue(e.[[Symbol]], sym) is true, return e.[[Key]].
if (m_is_global) {
// NOTE: Global symbols should always have a description string
VERIFY(m_description.has_value());
return m_description;
}
// 2. Assert: GlobalSymbolRegistry does not currently contain an entry for sym.
// 3. Return undefined.
return {};
}
size_t Symbol::external_memory_size() const
{
if (!m_description.has_value())
return 0;
return utf16_string_external_memory_size(*m_description);
}
}