mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-10-16 13:09:41 +00:00
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
55 lines
1.6 KiB
C++
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 {};
|
|
}
|
|
|
|
}
|