[JSC] Add JSC::keepAlive(JSValue)
authorysuzuki@apple.com <ysuzuki@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Mar 2020 00:40:46 +0000 (00:40 +0000)
committerysuzuki@apple.com <ysuzuki@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Mar 2020 00:40:46 +0000 (00:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=209398

Reviewed by Mark Lam.

Add JSC::keepAlive(JSValue). This is useful to make some JSValue variable alive from GC.

* heap/HeapCell.cpp:
* runtime/JSCJSValue.cpp:
(JSC::keepAlive):
* runtime/JSCJSValue.h:
(JSC::keepAlive):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/heap/HeapCell.cpp
Source/JavaScriptCore/runtime/JSCJSValue.cpp
Source/JavaScriptCore/runtime/JSCJSValue.h

index 6bab3bf..f137371 100644 (file)
@@ -1,3 +1,18 @@
+2020-03-22  Yusuke Suzuki  <ysuzuki@apple.com>
+
+        [JSC] Add JSC::keepAlive(JSValue)
+        https://bugs.webkit.org/show_bug.cgi?id=209398
+
+        Reviewed by Mark Lam.
+
+        Add JSC::keepAlive(JSValue). This is useful to make some JSValue variable alive from GC.
+
+        * heap/HeapCell.cpp:
+        * runtime/JSCJSValue.cpp:
+        (JSC::keepAlive):
+        * runtime/JSCJSValue.h:
+        (JSC::keepAlive):
+
 2020-03-20  Ross Kirsling  <ross.kirsling@sony.com>
 
         hasObservableSideEffectsForRegExpSplit doesn't check for @@match override
index 8d71465..b806c8e 100644 (file)
@@ -43,6 +43,7 @@ bool HeapCell::isLive()
 }
 
 #if !COMPILER(GCC_COMPATIBLE)
+// This makes the argument opaque from the compiler.
 NEVER_INLINE void keepAlive(const void*)
 {
 }
index 548010e..e590c1a 100644 (file)
@@ -427,4 +427,11 @@ String JSValue::toWTFStringSlowCase(JSGlobalObject* globalObject) const
     RELEASE_AND_RETURN(scope, string->value(globalObject));
 }
 
+#if !COMPILER(GCC_COMPATIBLE)
+// This makes the argument opaque from the compiler.
+NEVER_INLINE void keepAlive(JSValue)
+{
+}
+#endif
+
 } // namespace JSC
index 586af3f..fb06f1f 100644 (file)
@@ -637,4 +637,17 @@ bool isThisValueAltered(const PutPropertySlot&, JSObject* baseObject);
 // See section 7.2.9: https://tc39.github.io/ecma262/#sec-samevalue
 bool sameValue(JSGlobalObject*, JSValue a, JSValue b);
 
+#if COMPILER(GCC_COMPATIBLE)
+ALWAYS_INLINE void keepAlive(JSValue value)
+{
+#if USE(JSVALUE64)
+    asm volatile ("" : : "r"(bitwise_cast<uint64_t>(value)) : "memory");
+#else
+    asm volatile ("" : : "r"(value.payload()) : "memory");
+#endif
+}
+#else
+JS_EXPORT_PRIVATE void keepAlive(JSValue);
+#endif
+
 } // namespace JSC