<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[243617] trunk/Source/JavaScriptCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/243617">243617</a></dd>
<dt>Author</dt> <dd>ysuzuki@apple.com</dd>
<dt>Date</dt> <dd>2019-03-28 12:37:58 -0700 (Thu, 28 Mar 2019)</dd>
</dl>

<h3>Log Message</h3>
<pre>[JSC] Drop VM and Context cache map in JavaScriptCore.framework
https://bugs.webkit.org/show_bug.cgi?id=196341

Reviewed by Saam Barati.

Previously, we created Objective-C weak map to maintain JSVirtualMachine and JSContext wrappers corresponding to VM and JSGlobalObject.
But Objective-C weak map is really memory costly. Even if the entry is only one, it consumes 2.5KB per weak map. Since we can modify
JSC intrusively for JavaScriptCore.framework (and we already did it, like, holding JSWrapperMap in JSGlobalObject), we can just hold
a pointer to a wrapper in VM and JSGlobalObject.

This patch adds void* members to VM and JSGlobalObject, which holds a non-strong reference to a wrapper. When a wrapper is gone, we
clear this pointer too. This removes unnecessary two Objective-C weak maps, and save 5KB.

* API/JSContext.mm:
(-[JSContext initWithVirtualMachine:]):
(-[JSContext dealloc]):
(-[JSContext initWithGlobalContextRef:]):
(-[JSContext wrapperMap]):
(+[JSContext contextWithJSGlobalContextRef:]):
* API/JSVirtualMachine.mm:
(-[JSVirtualMachine initWithContextGroupRef:]):
(-[JSVirtualMachine dealloc]):
(+[JSVirtualMachine virtualMachineWithContextGroupRef:]):
(scanExternalObjectGraph):
(scanExternalRememberedSet):
(initWrapperCache): Deleted.
(wrapperCache): Deleted.
(+[JSVMWrapperCache addWrapper:forJSContextGroupRef:]): Deleted.
(+[JSVMWrapperCache wrapperForJSContextGroupRef:]): Deleted.
(-[JSVirtualMachine contextForGlobalContextRef:]): Deleted.
(-[JSVirtualMachine addContext:forGlobalContextRef:]): Deleted.
* API/JSVirtualMachineInternal.h:
* runtime/JSGlobalObject.h:
(JSC::JSGlobalObject::setAPIWrapper):
(JSC::JSGlobalObject::apiWrapper const):
* runtime/VM.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreAPIJSContextmm">trunk/Source/JavaScriptCore/API/JSContext.mm</a></li>
<li><a href="#trunkSourceJavaScriptCoreAPIJSVirtualMachinemm">trunk/Source/JavaScriptCore/API/JSVirtualMachine.mm</a></li>
<li><a href="#trunkSourceJavaScriptCoreAPIJSVirtualMachineInternalh">trunk/Source/JavaScriptCore/API/JSVirtualMachineInternal.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSGlobalObjecth">trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeVMh">trunk/Source/JavaScriptCore/runtime/VM.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreAPIJSContextmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/API/JSContext.mm (243616 => 243617)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/API/JSContext.mm     2019-03-28 19:32:53 UTC (rev 243616)
+++ trunk/Source/JavaScriptCore/API/JSContext.mm        2019-03-28 19:37:58 UTC (rev 243617)
</span><span class="lines">@@ -85,13 +85,15 @@
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     [self ensureWrapperMap];
</span><del>-    [m_virtualMachine addContext:self forGlobalContextRef:m_context];
</del><span class="cx"> 
</span><ins>+    toJSGlobalObject(m_context)->setAPIWrapper((__bridge void*)self);
+
</ins><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)dealloc
</span><span class="cx"> {
</span><ins>+    toJSGlobalObject(m_context)->setAPIWrapper((__bridge void*)nil);
</ins><span class="cx">     m_exception.clear();
</span><span class="cx">     JSGlobalContextRelease(m_context);
</span><span class="cx">     [m_virtualMachine release];
</span><span class="lines">@@ -308,7 +310,7 @@
</span><span class="cx">         context.exception = exceptionValue;
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    [m_virtualMachine addContext:self forGlobalContextRef:m_context];
</del><ins>+    toJSGlobalObject(m_context)->setAPIWrapper((__bridge void*)self);
</ins><span class="cx"> 
</span><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="lines">@@ -358,7 +360,7 @@
</span><span class="cx"> 
</span><span class="cx"> - (JSWrapperMap *)wrapperMap
</span><span class="cx"> {
</span><del>-    return toJS(m_context)->lexicalGlobalObject()->wrapperMap();
</del><ins>+    return toJSGlobalObject(m_context)->wrapperMap();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (JSValue *)wrapperForJSObject:(JSValueRef)value
</span><span class="lines">@@ -369,8 +371,7 @@
</span><span class="cx"> 
</span><span class="cx"> + (JSContext *)contextWithJSGlobalContextRef:(JSGlobalContextRef)globalContext
</span><span class="cx"> {
</span><del>-    JSVirtualMachine *virtualMachine = [JSVirtualMachine virtualMachineWithContextGroupRef:toRef(&toJS(globalContext)->vm())];
-    JSContext *context = [virtualMachine contextForGlobalContextRef:globalContext];
</del><ins>+    JSContext *context = (__bridge JSContext *)toJSGlobalObject(globalContext)->apiWrapper();
</ins><span class="cx">     if (!context)
</span><span class="cx">         context = [[[JSContext alloc] initWithGlobalContextRef:globalContext] autorelease];
</span><span class="cx">     return context;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreAPIJSVirtualMachinemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/API/JSVirtualMachine.mm (243616 => 243617)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/API/JSVirtualMachine.mm      2019-03-28 19:32:53 UTC (rev 243616)
+++ trunk/Source/JavaScriptCore/API/JSVirtualMachine.mm 2019-03-28 19:37:58 UTC (rev 243617)
</span><span class="lines">@@ -41,50 +41,9 @@
</span><span class="cx"> #import <wtf/BlockPtr.h>
</span><span class="cx"> #import <wtf/Lock.h>
</span><span class="cx"> 
</span><del>-static NSMapTable *globalWrapperCache = 0;
-
-static Lock wrapperCacheMutex;
-
-static void initWrapperCache()
-{
-    ASSERT(!globalWrapperCache);
-    NSPointerFunctionsOptions keyOptions = NSPointerFunctionsOpaqueMemory | NSPointerFunctionsOpaquePersonality;
-    NSPointerFunctionsOptions valueOptions = NSPointerFunctionsWeakMemory | NSPointerFunctionsObjectPersonality;
-    globalWrapperCache = [[NSMapTable alloc] initWithKeyOptions:keyOptions valueOptions:valueOptions capacity:0];
-}
-
-static NSMapTable *wrapperCache()
-{
-    if (!globalWrapperCache)
-        initWrapperCache();
-    return globalWrapperCache;
-}
-
-@interface JSVMWrapperCache : NSObject
-+ (void)addWrapper:(JSVirtualMachine *)wrapper forJSContextGroupRef:(JSContextGroupRef)group;
-+ (JSVirtualMachine *)wrapperForJSContextGroupRef:(JSContextGroupRef)group;
-@end
-
-@implementation JSVMWrapperCache
-
-+ (void)addWrapper:(JSVirtualMachine *)wrapper forJSContextGroupRef:(JSContextGroupRef)group
-{
-    std::lock_guard<Lock> lock(wrapperCacheMutex);
-    NSMapInsert(wrapperCache(), group, (__bridge void*)wrapper);
-}
-
-+ (JSVirtualMachine *)wrapperForJSContextGroupRef:(JSContextGroupRef)group
-{
-    std::lock_guard<Lock> lock(wrapperCacheMutex);
-    return (__bridge JSVirtualMachine *)NSMapGet(wrapperCache(), group);
-}
-
-@end
-
</del><span class="cx"> @implementation JSVirtualMachine {
</span><span class="cx">     JSContextGroupRef m_group;
</span><span class="cx">     Lock m_externalDataMutex;
</span><del>-    NSMapTable *m_contextCache;
</del><span class="cx">     NSMapTable *m_externalObjectGraph;
</span><span class="cx">     NSMapTable *m_externalRememberedSet;
</span><span class="cx"> }
</span><span class="lines">@@ -106,10 +65,6 @@
</span><span class="cx">     
</span><span class="cx">     m_group = JSContextGroupRetain(group);
</span><span class="cx">     
</span><del>-    NSPointerFunctionsOptions keyOptions = NSPointerFunctionsOpaqueMemory | NSPointerFunctionsOpaquePersonality;
-    NSPointerFunctionsOptions valueOptions = NSPointerFunctionsWeakMemory | NSPointerFunctionsObjectPersonality;
-    m_contextCache = [[NSMapTable alloc] initWithKeyOptions:keyOptions valueOptions:valueOptions capacity:0];
-    
</del><span class="cx">     NSPointerFunctionsOptions weakIDOptions = NSPointerFunctionsWeakMemory | NSPointerFunctionsObjectPersonality;
</span><span class="cx">     NSPointerFunctionsOptions strongIDOptions = NSPointerFunctionsStrongMemory | NSPointerFunctionsObjectPersonality;
</span><span class="cx">     m_externalObjectGraph = [[NSMapTable alloc] initWithKeyOptions:weakIDOptions valueOptions:strongIDOptions capacity:0];
</span><span class="lines">@@ -116,8 +71,8 @@
</span><span class="cx"> 
</span><span class="cx">     NSPointerFunctionsOptions integerOptions = NSPointerFunctionsOpaqueMemory | NSPointerFunctionsIntegerPersonality;
</span><span class="cx">     m_externalRememberedSet = [[NSMapTable alloc] initWithKeyOptions:weakIDOptions valueOptions:integerOptions capacity:0];
</span><del>-   
-    [JSVMWrapperCache addWrapper:self forJSContextGroupRef:group];
</del><ins>+
+    toJS(group)->m_apiWrapper = (__bridge void*)self;
</ins><span class="cx">  
</span><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="lines">@@ -124,8 +79,8 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)dealloc
</span><span class="cx"> {
</span><ins>+    toJS(m_group)->m_apiWrapper = (__bridge void*)nil;
</ins><span class="cx">     JSContextGroupRelease(m_group);
</span><del>-    [m_contextCache release];
</del><span class="cx">     [m_externalObjectGraph release];
</span><span class="cx">     [m_externalRememberedSet release];
</span><span class="cx">     [super dealloc];
</span><span class="lines">@@ -237,22 +192,13 @@
</span><span class="cx"> 
</span><span class="cx"> + (JSVirtualMachine *)virtualMachineWithContextGroupRef:(JSContextGroupRef)group
</span><span class="cx"> {
</span><del>-    JSVirtualMachine *virtualMachine = [JSVMWrapperCache wrapperForJSContextGroupRef:group];
</del><ins>+    auto* vm = toJS(group);
+    JSVirtualMachine *virtualMachine = (__bridge JSVirtualMachine *)vm->m_apiWrapper;
</ins><span class="cx">     if (!virtualMachine)
</span><span class="cx">         virtualMachine = [[[JSVirtualMachine alloc] initWithContextGroupRef:group] autorelease];
</span><span class="cx">     return virtualMachine;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (JSContext *)contextForGlobalContextRef:(JSGlobalContextRef)globalContext
-{
-    return (__bridge JSContext *)NSMapGet(m_contextCache, globalContext);
-}
-
-- (void)addContext:(JSContext *)wrapper forGlobalContextRef:(JSGlobalContextRef)globalContext
-{
-    NSMapInsert(m_contextCache, globalContext, (__bridge void*)wrapper);
-}
-
</del><span class="cx"> - (Lock&)externalDataMutex
</span><span class="cx"> {
</span><span class="cx">     return m_externalDataMutex;
</span><span class="lines">@@ -312,7 +258,7 @@
</span><span class="cx"> static void scanExternalObjectGraph(JSC::VM& vm, JSC::SlotVisitor& visitor, void* root, bool lockAcquired)
</span><span class="cx"> {
</span><span class="cx">     @autoreleasepool {
</span><del>-        JSVirtualMachine *virtualMachine = [JSVMWrapperCache wrapperForJSContextGroupRef:toRef(&vm)];
</del><ins>+        JSVirtualMachine *virtualMachine = (__bridge JSVirtualMachine *)vm.m_apiWrapper;
</ins><span class="cx">         if (!virtualMachine)
</span><span class="cx">             return;
</span><span class="cx">         NSMapTable *externalObjectGraph = [virtualMachine externalObjectGraph];
</span><span class="lines">@@ -350,7 +296,7 @@
</span><span class="cx"> void scanExternalRememberedSet(JSC::VM& vm, JSC::SlotVisitor& visitor)
</span><span class="cx"> {
</span><span class="cx">     @autoreleasepool {
</span><del>-        JSVirtualMachine *virtualMachine = [JSVMWrapperCache wrapperForJSContextGroupRef:toRef(&vm)];
</del><ins>+        JSVirtualMachine *virtualMachine = (__bridge JSVirtualMachine *)vm.m_apiWrapper;
</ins><span class="cx">         if (!virtualMachine)
</span><span class="cx">             return;
</span><span class="cx">         Lock& externalDataMutex = [virtualMachine externalDataMutex];
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreAPIJSVirtualMachineInternalh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/API/JSVirtualMachineInternal.h (243616 => 243617)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/API/JSVirtualMachineInternal.h       2019-03-28 19:32:53 UTC (rev 243616)
+++ trunk/Source/JavaScriptCore/API/JSVirtualMachineInternal.h  2019-03-28 19:37:58 UTC (rev 243617)
</span><span class="lines">@@ -44,8 +44,6 @@
</span><span class="cx"> 
</span><span class="cx"> + (JSVirtualMachine *)virtualMachineWithContextGroupRef:(JSContextGroupRef)group;
</span><span class="cx"> 
</span><del>-- (JSContext *)contextForGlobalContextRef:(JSGlobalContextRef)globalContext;
-- (void)addContext:(JSContext *)wrapper forGlobalContextRef:(JSGlobalContextRef)globalContext;
</del><span class="cx"> - (JSC::VM&)vm;
</span><span class="cx"> 
</span><span class="cx"> @end
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (243616 => 243617)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog    2019-03-28 19:32:53 UTC (rev 243616)
+++ trunk/Source/JavaScriptCore/ChangeLog       2019-03-28 19:37:58 UTC (rev 243617)
</span><span class="lines">@@ -1,3 +1,42 @@
</span><ins>+2019-03-27  Yusuke Suzuki  <ysuzuki@apple.com>
+
+        [JSC] Drop VM and Context cache map in JavaScriptCore.framework
+        https://bugs.webkit.org/show_bug.cgi?id=196341
+
+        Reviewed by Saam Barati.
+
+        Previously, we created Objective-C weak map to maintain JSVirtualMachine and JSContext wrappers corresponding to VM and JSGlobalObject.
+        But Objective-C weak map is really memory costly. Even if the entry is only one, it consumes 2.5KB per weak map. Since we can modify
+        JSC intrusively for JavaScriptCore.framework (and we already did it, like, holding JSWrapperMap in JSGlobalObject), we can just hold
+        a pointer to a wrapper in VM and JSGlobalObject.
+
+        This patch adds void* members to VM and JSGlobalObject, which holds a non-strong reference to a wrapper. When a wrapper is gone, we
+        clear this pointer too. This removes unnecessary two Objective-C weak maps, and save 5KB.
+
+        * API/JSContext.mm:
+        (-[JSContext initWithVirtualMachine:]):
+        (-[JSContext dealloc]):
+        (-[JSContext initWithGlobalContextRef:]):
+        (-[JSContext wrapperMap]):
+        (+[JSContext contextWithJSGlobalContextRef:]):
+        * API/JSVirtualMachine.mm:
+        (-[JSVirtualMachine initWithContextGroupRef:]):
+        (-[JSVirtualMachine dealloc]):
+        (+[JSVirtualMachine virtualMachineWithContextGroupRef:]):
+        (scanExternalObjectGraph):
+        (scanExternalRememberedSet):
+        (initWrapperCache): Deleted.
+        (wrapperCache): Deleted.
+        (+[JSVMWrapperCache addWrapper:forJSContextGroupRef:]): Deleted.
+        (+[JSVMWrapperCache wrapperForJSContextGroupRef:]): Deleted.
+        (-[JSVirtualMachine contextForGlobalContextRef:]): Deleted.
+        (-[JSVirtualMachine addContext:forGlobalContextRef:]): Deleted.
+        * API/JSVirtualMachineInternal.h:
+        * runtime/JSGlobalObject.h:
+        (JSC::JSGlobalObject::setAPIWrapper):
+        (JSC::JSGlobalObject::apiWrapper const):
+        * runtime/VM.h:
+
</ins><span class="cx"> 2019-03-28  Tadeu Zagallo  <tzagallo@apple.com>
</span><span class="cx"> 
</span><span class="cx">         In-memory code cache should not share bytecode across domains
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSGlobalObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h (243616 => 243617)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h     2019-03-28 19:32:53 UTC (rev 243616)
+++ trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h        2019-03-28 19:37:58 UTC (rev 243617)
</span><span class="lines">@@ -1005,6 +1005,8 @@
</span><span class="cx"> #if JSC_OBJC_API_ENABLED
</span><span class="cx">     JSWrapperMap* wrapperMap() const { return m_wrapperMap.get(); }
</span><span class="cx">     void setWrapperMap(JSWrapperMap* map) { m_wrapperMap = map; }
</span><ins>+    void setAPIWrapper(void* apiWrapper) { m_apiWrapper = apiWrapper; }
+    void* apiWrapper() const { return m_apiWrapper; }
</ins><span class="cx"> #endif
</span><span class="cx"> #ifdef JSC_GLIB_API_ENABLED
</span><span class="cx">     WrapperMap* wrapperMap() const { return m_wrapperMap.get(); }
</span><span class="lines">@@ -1047,6 +1049,7 @@
</span><span class="cx">     bool m_needsSiteSpecificQuirks { false };
</span><span class="cx"> #if JSC_OBJC_API_ENABLED
</span><span class="cx">     RetainPtr<JSWrapperMap> m_wrapperMap;
</span><ins>+    void* m_apiWrapper { nullptr };
</ins><span class="cx"> #endif
</span><span class="cx"> #ifdef JSC_GLIB_API_ENABLED
</span><span class="cx">     std::unique_ptr<WrapperMap> m_wrapperMap;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.h (243616 => 243617)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.h 2019-03-28 19:32:53 UTC (rev 243616)
+++ trunk/Source/JavaScriptCore/runtime/VM.h    2019-03-28 19:37:58 UTC (rev 243617)
</span><span class="lines">@@ -804,6 +804,10 @@
</span><span class="cx">     RTTraceList* m_rtTraceList;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if JSC_OBJC_API_ENABLED
+    void* m_apiWrapper { nullptr };
+#endif
+
</ins><span class="cx">     JS_EXPORT_PRIVATE void resetDateCache();
</span><span class="cx"> 
</span><span class="cx">     RegExpCache* regExpCache() { return m_regExpCache; }
</span></span></pre>
</div>
</div>

</body>
</html>