Add toJS for JSC::PrivateName
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 2 Sep 2016 03:42:09 +0000 (03:42 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 2 Sep 2016 03:42:09 +0000 (03:42 +0000)
https://bugs.webkit.org/show_bug.cgi?id=161522

Reviewed by Ryosuke Niwa.

Source/JavaScriptCore:

Add the export annotation.
And we perform refactoring RefPtr<SymbolImpl> => Ref<SymbolImpl> for PrivateName,
since PrivateName never holds null SymbolImpl pointer. And along with this change,
we changed SymbolImpl* to SymbolImpl& in PrivateName::uid() callers.

* runtime/Completion.cpp:
(JSC::createSymbolForEntryPointModule):
* runtime/IdentifierInlines.h:
(JSC::Identifier::fromUid):
* runtime/JSFunction.cpp:
(JSC::JSFunction::setFunctionName):
* runtime/PrivateName.h:
(JSC::PrivateName::PrivateName):
(JSC::PrivateName::uid): Ugly const_cast. But const annotation is meaningless for SymbolImpl.
StringImpl should be observed as an immutable object. (Of course, its hash members etc. are mutable.
But most of the users (One of the exceptions is the concurrent JIT compiling thread!) should not care about this.)
(JSC::PrivateName::operator==):
(JSC::PrivateName::operator!=):
* runtime/PropertyName.h:
(JSC::PropertyName::PropertyName):
* runtime/Symbol.cpp:
(JSC::Symbol::finishCreation):
* runtime/Symbol.h:
* runtime/SymbolConstructor.cpp:
(JSC::symbolConstructorKeyFor):

Source/WebCore:

JSC::PrivateName is the wrapper to create and hold the ES6 Symbol instance.
This patch adds toJS support for JSC::PrivateName.
Later, the module integration patch will use this feature to call
DeferredWrapper::{resolve,reject} with JSC::PrivateName.

* bindings/js/JSDOMBinding.h:
(WebCore::toJS):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@205335 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/Completion.cpp
Source/JavaScriptCore/runtime/IdentifierInlines.h
Source/JavaScriptCore/runtime/JSFunction.cpp
Source/JavaScriptCore/runtime/PrivateName.h
Source/JavaScriptCore/runtime/PropertyName.h
Source/JavaScriptCore/runtime/Symbol.cpp
Source/JavaScriptCore/runtime/Symbol.h
Source/JavaScriptCore/runtime/SymbolConstructor.cpp
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSDOMBinding.h

index 5828bab..9da5c1c 100644 (file)
@@ -1,3 +1,36 @@
+2016-09-01  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        Add toJS for JSC::PrivateName
+        https://bugs.webkit.org/show_bug.cgi?id=161522
+
+        Reviewed by Ryosuke Niwa.
+
+        Add the export annotation.
+        And we perform refactoring RefPtr<SymbolImpl> => Ref<SymbolImpl> for PrivateName,
+        since PrivateName never holds null SymbolImpl pointer. And along with this change,
+        we changed SymbolImpl* to SymbolImpl& in PrivateName::uid() callers.
+
+        * runtime/Completion.cpp:
+        (JSC::createSymbolForEntryPointModule):
+        * runtime/IdentifierInlines.h:
+        (JSC::Identifier::fromUid):
+        * runtime/JSFunction.cpp:
+        (JSC::JSFunction::setFunctionName):
+        * runtime/PrivateName.h:
+        (JSC::PrivateName::PrivateName):
+        (JSC::PrivateName::uid): Ugly const_cast. But const annotation is meaningless for SymbolImpl.
+        StringImpl should be observed as an immutable object. (Of course, its hash members etc. are mutable.
+        But most of the users (One of the exceptions is the concurrent JIT compiling thread!) should not care about this.)
+        (JSC::PrivateName::operator==):
+        (JSC::PrivateName::operator!=):
+        * runtime/PropertyName.h:
+        (JSC::PropertyName::PropertyName):
+        * runtime/Symbol.cpp:
+        (JSC::Symbol::finishCreation):
+        * runtime/Symbol.h:
+        * runtime/SymbolConstructor.cpp:
+        (JSC::symbolConstructorKeyFor):
+
 2016-09-01  Dan Bernstein  <mitz@apple.com>
 
         Build fix.
index 4a30d45..e94239f 100644 (file)
@@ -142,7 +142,7 @@ static Symbol* createSymbolForEntryPointModule(VM& vm)
 {
     // Generate the unique key for the source-provided module.
     PrivateName privateName(PrivateName::Description, "EntryPointModule");
-    return Symbol::create(vm, *privateName.uid());
+    return Symbol::create(vm, privateName.uid());
 }
 
 static JSInternalPromise* rejectPromise(ExecState* exec, JSGlobalObject* globalObject)
index 52c11df..507c1d7 100644 (file)
@@ -85,7 +85,7 @@ inline Identifier Identifier::fromUid(ExecState* exec, UniquedStringImpl* uid)
 
 inline Identifier Identifier::fromUid(const PrivateName& name)
 {
-    return *name.uid();
+    return name.uid();
 }
 
 template<unsigned charactersCount>
index 32e772f..be1ac0b 100644 (file)
@@ -599,11 +599,11 @@ void JSFunction::setFunctionName(ExecState* exec, JSValue value)
     ASSERT(jsExecutable()->ecmaName().isNull());
     String name;
     if (value.isSymbol()) {
-        SymbolImpl* uid = asSymbol(value)->privateName().uid();
-        if (uid->isNullSymbol())
+        SymbolImpl& uid = asSymbol(value)->privateName().uid();
+        if (uid.isNullSymbol())
             name = emptyString();
         else
-            name = makeString('[', String(uid), ']');
+            name = makeString('[', String(&uid), ']');
     } else {
         VM& vm = exec->vm();
         JSString* jsStr = value.toString(exec);
index f0bc60d..847545c 100644 (file)
@@ -38,7 +38,7 @@ public:
     }
 
     explicit PrivateName(SymbolImpl& uid)
-        : m_uid(&uid)
+        : m_uid(uid)
     {
     }
 
@@ -48,13 +48,13 @@ public:
     {
     }
 
-    SymbolImpl* uid() const { return m_uid.get(); }
+    SymbolImpl& uid() const { return const_cast<SymbolImpl&>(m_uid.get()); }
 
-    bool operator==(const PrivateName& other) const { return uid() == other.uid(); }
-    bool operator!=(const PrivateName& other) const { return uid() != other.uid(); }
+    bool operator==(const PrivateName& other) const { return &uid() == &other.uid(); }
+    bool operator!=(const PrivateName& other) const { return &uid() != &other.uid(); }
 
 private:
-    RefPtr<SymbolImpl> m_uid;
+    Ref<SymbolImpl> m_uid;
 };
 
 }
index 9d3cc2b..634ce38 100644 (file)
@@ -45,7 +45,7 @@ public:
     }
 
     PropertyName(const PrivateName& propertyName)
-        : m_impl(propertyName.uid())
+        : m_impl(&propertyName.uid())
     {
         ASSERT(m_impl);
         ASSERT(m_impl->isSymbol());
index 666fc1c..5c35b81 100644 (file)
@@ -58,7 +58,7 @@ void Symbol::finishCreation(VM& vm)
     Base::finishCreation(vm);
     ASSERT(inherits(info()));
 
-    vm.symbolImplToSymbolMap.set(m_privateName.uid(), this);
+    vm.symbolImplToSymbolMap.set(&m_privateName.uid(), this);
 }
 
 inline SymbolObject* SymbolObject::create(VM& vm, JSGlobalObject* globalObject, Symbol* symbol)
index 933a2e5..8c70306 100644 (file)
@@ -49,7 +49,7 @@ public:
 
     static Symbol* create(VM&);
     static Symbol* create(ExecState*, JSString* description);
-    static Symbol* create(VM&, SymbolImpl& uid);
+    JS_EXPORT_PRIVATE static Symbol* create(VM&, SymbolImpl& uid);
 
     const PrivateName& privateName() const { return m_privateName; }
     String descriptiveString() const;
index df10562..ba2dfb0 100644 (file)
@@ -117,12 +117,12 @@ EncodedJSValue JSC_HOST_CALL symbolConstructorKeyFor(ExecState* exec)
     if (!symbolValue.isSymbol())
         return JSValue::encode(throwTypeError(exec, scope, SymbolKeyForTypeError));
 
-    SymbolImpl* uid = asSymbol(symbolValue)->privateName().uid();
-    if (!uid->symbolRegistry())
+    SymbolImpl& uid = asSymbol(symbolValue)->privateName().uid();
+    if (!uid.symbolRegistry())
         return JSValue::encode(jsUndefined());
 
-    ASSERT(uid->symbolRegistry() == &vm.symbolRegistry());
-    return JSValue::encode(jsString(exec, vm.symbolRegistry().keyForSymbol(*uid)));
+    ASSERT(uid.symbolRegistry() == &vm.symbolRegistry());
+    return JSValue::encode(jsString(exec, vm.symbolRegistry().keyForSymbol(uid)));
 }
 
 } // namespace JSC
index 4846690..ad16e86 100644 (file)
@@ -1,3 +1,18 @@
+2016-09-01  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        Add toJS for JSC::PrivateName
+        https://bugs.webkit.org/show_bug.cgi?id=161522
+
+        Reviewed by Ryosuke Niwa.
+
+        JSC::PrivateName is the wrapper to create and hold the ES6 Symbol instance.
+        This patch adds toJS support for JSC::PrivateName.
+        Later, the module integration patch will use this feature to call
+        DeferredWrapper::{resolve,reject} with JSC::PrivateName.
+
+        * bindings/js/JSDOMBinding.h:
+        (WebCore::toJS):
+
 2016-09-01  Dan Bernstein  <mitz@apple.com>
 
         Build fix.
index 67d8518..9aa3362 100644 (file)
@@ -264,6 +264,7 @@ template<typename T> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, RefP
 template<typename T> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, const Vector<T>&);
 template<typename T> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, const Vector<RefPtr<T>>&);
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, const String&);
+JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, const JSC::PrivateName&);
 
 JSC::JSValue toJSIterator(JSC::ExecState&, JSDOMGlobalObject&, JSC::JSValue);
 template<typename T> JSC::JSValue toJSIterator(JSC::ExecState&, JSDOMGlobalObject&, const T&);
@@ -576,6 +577,11 @@ inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject*, const String&
     return jsStringOrNull(exec, value);
 }
 
+inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject*, const JSC::PrivateName& privateName)
+{
+    return JSC::Symbol::create(exec->vm(), privateName.uid());
+}
+
 inline JSC::JSValue toJSIterator(JSC::ExecState& state, JSDOMGlobalObject&, JSC::JSValue value)
 {
     return createIteratorResultObject(&state, value, false);