ladybird/Libraries/LibJS/Runtime/Symbol.cpp
Timothy Flynn 0efa98a57a LibJS+LibWeb+WebContent: Port JS::PropertyKey to UTF-16
This has quite a lot of fall out. But the majority of it is just type or
UDL substitution, where the changes just fall through to other function
calls.

By changing property key storage to UTF-16, the main affected areas are:
* NativeFunction names must now be UTF-16
* Bytecode identifiers must now be UTF-16
* Module/binding names must now be UTF-16
2025-08-05 07:07:15 -04:00

55 lines
1.6 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/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 {};
}
}