summaryrefslogtreecommitdiffstats
path: root/js/src/vm/StaticStrings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/vm/StaticStrings.cpp')
-rw-r--r--js/src/vm/StaticStrings.cpp89
1 files changed, 89 insertions, 0 deletions
diff --git a/js/src/vm/StaticStrings.cpp b/js/src/vm/StaticStrings.cpp
new file mode 100644
index 0000000000..c88e02fa39
--- /dev/null
+++ b/js/src/vm/StaticStrings.cpp
@@ -0,0 +1,89 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: set ts=8 sts=2 et sw=2 tw=80:
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "vm/StaticStrings.h"
+
+#include "mozilla/HashFunctions.h" // mozilla::HashString
+
+#include <stddef.h> // size_t
+#include <stdint.h> // uint32_t
+
+#include "js/HashTable.h" // js::HashNumber
+#include "js/TypeDecls.h" // Latin1Char
+#include "vm/Realm.h" // AutoAllocInAtomsZone
+#include "vm/StringType.h" // JSString, JSLinearString
+
+#include "vm/Realm-inl.h" // AutoAllocInAtomsZone
+#include "vm/StringType-inl.h" // NewInlineAtom
+
+using namespace js;
+
+constexpr StaticStrings::SmallCharTable StaticStrings::createSmallCharTable() {
+ SmallCharTable array{};
+ for (size_t i = 0; i < SMALL_CHAR_TABLE_SIZE; i++) {
+ array[i] = toSmallChar(i);
+ }
+ return array;
+}
+
+const StaticStrings::SmallCharTable StaticStrings::toSmallCharTable =
+ createSmallCharTable();
+
+bool StaticStrings::init(JSContext* cx) {
+ AutoAllocInAtomsZone az(cx);
+
+ static_assert(UNIT_STATIC_LIMIT - 1 <= JSString::MAX_LATIN1_CHAR,
+ "Unit strings must fit in Latin1Char.");
+
+ for (uint32_t i = 0; i < UNIT_STATIC_LIMIT; i++) {
+ Latin1Char ch = Latin1Char(i);
+ HashNumber hash = mozilla::HashString(&ch, 1);
+ JSAtom* a = NewInlineAtom(cx, &ch, 1, hash);
+ if (!a) {
+ return false;
+ }
+ a->makePermanent();
+ unitStaticTable[i] = a;
+ }
+
+ for (uint32_t i = 0; i < NUM_LENGTH2_ENTRIES; i++) {
+ Latin1Char buffer[] = {firstCharOfLength2(i), secondCharOfLength2(i)};
+ HashNumber hash = mozilla::HashString(buffer, 2);
+ JSAtom* a = NewInlineAtom(cx, buffer, 2, hash);
+ if (!a) {
+ return false;
+ }
+ a->makePermanent();
+ length2StaticTable[i] = a;
+ }
+
+ for (uint32_t i = 0; i < INT_STATIC_LIMIT; i++) {
+ if (i < 10) {
+ intStaticTable[i] = unitStaticTable[i + '0'];
+ } else if (i < 100) {
+ auto index =
+ getLength2IndexStatic(char(i / 10) + '0', char(i % 10) + '0');
+ intStaticTable[i] = length2StaticTable[index];
+ } else {
+ Latin1Char buffer[] = {Latin1Char(firstCharOfLength3(i)),
+ Latin1Char(secondCharOfLength3(i)),
+ Latin1Char(thirdCharOfLength3(i))};
+ HashNumber hash = mozilla::HashString(buffer, 3);
+ JSAtom* a = NewInlineAtom(cx, buffer, 3, hash);
+ if (!a) {
+ return false;
+ }
+ a->makePermanent();
+ intStaticTable[i] = a;
+ }
+
+ // Static string initialization can not race, so allow even without the
+ // lock.
+ intStaticTable[i]->setIsIndex(i);
+ }
+
+ return true;
+}