Преглед на файлове

LibJS: Implement the CanBeHeldWeakly abstract operation

This AO is required for implementing the rest of the stage 3 'Symbol as
WeakMap Keys Proposal'.
Idan Horowitz преди 3 години
родител
ревизия
22a78e8a2c
променени са 2 файла, в които са добавени 20 реда и са изтрити 0 реда
  1. 19 0
      Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp
  2. 1 0
      Userland/Libraries/LibJS/Runtime/AbstractOperations.h

+ 19 - 0
Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp

@@ -456,6 +456,25 @@ Environment& get_this_environment(VM& vm)
     VERIFY_NOT_REACHED();
 }
 
+// 9.14 CanBeHeldWeakly ( v ), https://tc39.es/proposal-symbols-as-weakmap-keys/#sec-canbeheldweakly-abstract-operation
+bool can_be_held_weakly(Value value)
+{
+    // 1. If Type(v) is Object, return true.
+    if (value.is_object())
+        return true;
+
+    // 2. If Type(v) is Symbol, then
+    if (value.is_symbol()) {
+        // a. For each element e of the GlobalSymbolRegistry List (see 19.4.2.2), do
+        //     i. If SameValue(e.[[Symbol]], v) is true, return false.
+        // b. Return true.
+        return !value.as_symbol().is_global();
+    }
+
+    // 3. Return false.
+    return false;
+}
+
 // 13.3.7.2 GetSuperConstructor ( ), https://tc39.es/ecma262/#sec-getsuperconstructor
 Object* get_super_constructor(VM& vm)
 {

+ 1 - 0
Userland/Libraries/LibJS/Runtime/AbstractOperations.h

@@ -24,6 +24,7 @@ ObjectEnvironment* new_object_environment(Object&, bool is_with_environment, Env
 FunctionEnvironment* new_function_environment(ECMAScriptFunctionObject&, Object* new_target);
 PrivateEnvironment* new_private_environment(VM& vm, PrivateEnvironment* outer);
 Environment& get_this_environment(VM&);
+bool can_be_held_weakly(Value);
 Object* get_super_constructor(VM&);
 ThrowCompletionOr<Reference> make_super_property_reference(GlobalObject&, Value actual_this, PropertyKey const&, bool strict);
 ThrowCompletionOr<Value> require_object_coercible(GlobalObject&, Value);