<!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>[198798] trunk/Source</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/198798">198798</a></dd>
<dt>Author</dt> <dd>sbarati@apple.com</dd>
<dt>Date</dt> <dd>2016-03-29 14:04:21 -0700 (Tue, 29 Mar 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Allow builtin JS functions to be intrinsics
https://bugs.webkit.org/show_bug.cgi?id=155960

Reviewed by Mark Lam.

Source/JavaScriptCore:

Builtin functions can now be recognized as intrinsics inside
the DFG. This gives us the flexibility to either lower a builtin
as an intrinsic in the DFG or as a normal function call.
Because we may decide to not lower it as an intrinsic, the DFG
inliner could still inline the function call.

You can annotate a builtin function like so to make
it be recognized as an intrinsic.
```
[intrinsic=FooIntrinsic] function foo() { ... }
```
where FooIntrinsic is an enum value of the Intrinsic enum.

So in the future if we write RegExp.prototype.test as a builtin, we would do:
``` RegExpPrototype.js
[intrinsic=RegExpTestIntrinsic] function test() { ... }
```

* Scripts/builtins/builtins_generate_combined_implementation.py:
(BuiltinsCombinedImplementationGenerator.generate_secondary_header_includes):
* Scripts/builtins/builtins_generate_separate_implementation.py:
(BuiltinsSeparateImplementationGenerator.generate_secondary_header_includes):
* Scripts/builtins/builtins_generator.py:
(BuiltinsGenerator.generate_embedded_code_string_section_for_function):
* Scripts/builtins/builtins_model.py:
(BuiltinObject.__init__):
(BuiltinFunction):
(BuiltinFunction.__init__):
(BuiltinFunction.fromString):
(BuiltinFunction.__str__):
* Scripts/builtins/builtins_templates.py:
* bytecode/UnlinkedFunctionExecutable.cpp:
(JSC::UnlinkedFunctionExecutable::visitChildren):
(JSC::UnlinkedFunctionExecutable::link):
* bytecode/UnlinkedFunctionExecutable.h:
* dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::attemptToInlineCall):
* runtime/Executable.cpp:
(JSC::ExecutableBase::clearCode):
(JSC::NativeExecutable::destroy):
(JSC::ScriptExecutable::ScriptExecutable):
(JSC::EvalExecutable::create):
(JSC::EvalExecutable::EvalExecutable):
(JSC::ProgramExecutable::ProgramExecutable):
(JSC::ModuleProgramExecutable::ModuleProgramExecutable):
(JSC::FunctionExecutable::FunctionExecutable):
(JSC::ExecutableBase::intrinsic): Deleted.
(JSC::NativeExecutable::intrinsic): Deleted.
* runtime/Executable.h:
(JSC::ExecutableBase::ExecutableBase):
(JSC::ExecutableBase::hasJITCodeFor):
(JSC::ExecutableBase::intrinsic):
(JSC::ExecutableBase::intrinsicFor):
(JSC::ScriptExecutable::finishCreation):
* runtime/Intrinsic.h:

Source/WebCore:

* ForwardingHeaders/runtime/Intrinsic.h: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreScriptsbuiltinsbuiltins_generate_combined_implementationpy">trunk/Source/JavaScriptCore/Scripts/builtins/builtins_generate_combined_implementation.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreScriptsbuiltinsbuiltins_generate_separate_implementationpy">trunk/Source/JavaScriptCore/Scripts/builtins/builtins_generate_separate_implementation.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreScriptsbuiltinsbuiltins_generatorpy">trunk/Source/JavaScriptCore/Scripts/builtins/builtins_generator.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreScriptsbuiltinsbuiltins_modelpy">trunk/Source/JavaScriptCore/Scripts/builtins/builtins_model.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreScriptsbuiltinsbuiltins_templatespy">trunk/Source/JavaScriptCore/Scripts/builtins/builtins_templates.py</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeUnlinkedFunctionExecutablecpp">trunk/Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeUnlinkedFunctionExecutableh">trunk/Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGByteCodeParsercpp">trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeExecutablecpp">trunk/Source/JavaScriptCore/runtime/Executable.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeExecutableh">trunk/Source/JavaScriptCore/runtime/Executable.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeIntrinsich">trunk/Source/JavaScriptCore/runtime/Intrinsic.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreForwardingHeadersruntimeIntrinsich">trunk/Source/WebCore/ForwardingHeaders/runtime/Intrinsic.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (198797 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-03-29 20:43:14 UTC (rev 198797)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -1,3 +1,66 @@
</span><ins>+2016-03-29  Saam barati  &lt;sbarati@apple.com&gt;
+
+        Allow builtin JS functions to be intrinsics
+        https://bugs.webkit.org/show_bug.cgi?id=155960
+
+        Reviewed by Mark Lam.
+
+        Builtin functions can now be recognized as intrinsics inside
+        the DFG. This gives us the flexibility to either lower a builtin
+        as an intrinsic in the DFG or as a normal function call.
+        Because we may decide to not lower it as an intrinsic, the DFG
+        inliner could still inline the function call.
+
+        You can annotate a builtin function like so to make
+        it be recognized as an intrinsic.
+        ```
+        [intrinsic=FooIntrinsic] function foo() { ... }
+        ```
+        where FooIntrinsic is an enum value of the Intrinsic enum.
+
+        So in the future if we write RegExp.prototype.test as a builtin, we would do:
+        ``` RegExpPrototype.js
+        [intrinsic=RegExpTestIntrinsic] function test() { ... }
+        ```
+
+        * Scripts/builtins/builtins_generate_combined_implementation.py:
+        (BuiltinsCombinedImplementationGenerator.generate_secondary_header_includes):
+        * Scripts/builtins/builtins_generate_separate_implementation.py:
+        (BuiltinsSeparateImplementationGenerator.generate_secondary_header_includes):
+        * Scripts/builtins/builtins_generator.py:
+        (BuiltinsGenerator.generate_embedded_code_string_section_for_function):
+        * Scripts/builtins/builtins_model.py:
+        (BuiltinObject.__init__):
+        (BuiltinFunction):
+        (BuiltinFunction.__init__):
+        (BuiltinFunction.fromString):
+        (BuiltinFunction.__str__):
+        * Scripts/builtins/builtins_templates.py:
+        * bytecode/UnlinkedFunctionExecutable.cpp:
+        (JSC::UnlinkedFunctionExecutable::visitChildren):
+        (JSC::UnlinkedFunctionExecutable::link):
+        * bytecode/UnlinkedFunctionExecutable.h:
+        * dfg/DFGByteCodeParser.cpp:
+        (JSC::DFG::ByteCodeParser::attemptToInlineCall):
+        * runtime/Executable.cpp:
+        (JSC::ExecutableBase::clearCode):
+        (JSC::NativeExecutable::destroy):
+        (JSC::ScriptExecutable::ScriptExecutable):
+        (JSC::EvalExecutable::create):
+        (JSC::EvalExecutable::EvalExecutable):
+        (JSC::ProgramExecutable::ProgramExecutable):
+        (JSC::ModuleProgramExecutable::ModuleProgramExecutable):
+        (JSC::FunctionExecutable::FunctionExecutable):
+        (JSC::ExecutableBase::intrinsic): Deleted.
+        (JSC::NativeExecutable::intrinsic): Deleted.
+        * runtime/Executable.h:
+        (JSC::ExecutableBase::ExecutableBase):
+        (JSC::ExecutableBase::hasJITCodeFor):
+        (JSC::ExecutableBase::intrinsic):
+        (JSC::ExecutableBase::intrinsicFor):
+        (JSC::ScriptExecutable::finishCreation):
+        * runtime/Intrinsic.h:
+
</ins><span class="cx"> 2016-03-29  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         JSC::Debugger cleanup after recent changes
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreScriptsbuiltinsbuiltins_generate_combined_implementationpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/Scripts/builtins/builtins_generate_combined_implementation.py (198797 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/Scripts/builtins/builtins_generate_combined_implementation.py        2016-03-29 20:43:14 UTC (rev 198797)
+++ trunk/Source/JavaScriptCore/Scripts/builtins/builtins_generate_combined_implementation.py        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -86,6 +86,9 @@
</span><span class="cx">             ([&quot;JavaScriptCore&quot;, &quot;WebCore&quot;],
</span><span class="cx">                 (&quot;JavaScriptCore&quot;, &quot;runtime/VM.h&quot;),
</span><span class="cx">             ),
</span><ins>+            ([&quot;JavaScriptCore&quot;, &quot;WebCore&quot;],
+                (&quot;JavaScriptCore&quot;, &quot;runtime/Intrinsic.h&quot;),
+            ),
</ins><span class="cx">         ]
</span><span class="cx"> 
</span><span class="cx">         return '\n'.join(self.generate_includes_from_entries(header_includes))
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreScriptsbuiltinsbuiltins_generate_separate_implementationpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/Scripts/builtins/builtins_generate_separate_implementation.py (198797 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/Scripts/builtins/builtins_generate_separate_implementation.py        2016-03-29 20:43:14 UTC (rev 198797)
+++ trunk/Source/JavaScriptCore/Scripts/builtins/builtins_generate_separate_implementation.py        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -101,6 +101,9 @@
</span><span class="cx">             ([&quot;WebCore&quot;],
</span><span class="cx">                 (&quot;WebCore&quot;, &quot;bindings/js/WebCoreJSClientData.h&quot;),
</span><span class="cx">             ),
</span><ins>+            ([&quot;JavaScriptCore&quot;, &quot;WebCore&quot;],
+                (&quot;JavaScriptCore&quot;, &quot;runtime/Intrinsic.h&quot;),
+            ),
</ins><span class="cx">         ]
</span><span class="cx"> 
</span><span class="cx">         return '\n'.join(self.generate_includes_from_entries(header_includes))
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreScriptsbuiltinsbuiltins_generatorpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/Scripts/builtins/builtins_generator.py (198797 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/Scripts/builtins/builtins_generator.py        2016-03-29 20:43:14 UTC (rev 198797)
+++ trunk/Source/JavaScriptCore/Scripts/builtins/builtins_generator.py        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -129,12 +129,14 @@
</span><span class="cx">             'codeName': BuiltinsGenerator.mangledNameForFunction(function) + 'Code',
</span><span class="cx">             'embeddedSource': embeddedSource,
</span><span class="cx">             'embeddedSourceLength': embeddedSourceLength,
</span><del>-            'canConstruct': constructAbility
</del><ins>+            'canConstruct': constructAbility,
+            'intrinsic': function.intrinsic
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         lines = []
</span><span class="cx">         lines.append(&quot;const JSC::ConstructAbility s_%(codeName)sConstructAbility = JSC::ConstructAbility::%(canConstruct)s;&quot; % args);
</span><span class="cx">         lines.append(&quot;const int s_%(codeName)sLength = %(embeddedSourceLength)d;&quot; % args);
</span><ins>+        lines.append(&quot;static const JSC::Intrinsic s_%(codeName)sIntrinsic = JSC::%(intrinsic)s;&quot; % args);
</ins><span class="cx">         lines.append(&quot;const char* s_%(codeName)s =\n%(embeddedSource)s\n;&quot; % args);
</span><span class="cx">         return '\n'.join(lines)
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreScriptsbuiltinsbuiltins_modelpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/Scripts/builtins/builtins_model.py (198797 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/Scripts/builtins/builtins_model.py        2016-03-29 20:43:14 UTC (rev 198797)
+++ trunk/Source/JavaScriptCore/Scripts/builtins/builtins_model.py        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -40,7 +40,8 @@
</span><span class="cx">     },
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-functionHeadRegExp = re.compile(r&quot;(?:function|constructor)\s+\w+\s*\(.*?\)&quot;, re.MULTILINE | re.S)
</del><ins>+functionHeadRegExp = re.compile(r&quot;(\[intrinsic=\w+\]\s+)?(?:function|constructor)\s+\w+\s*\(.*?\)&quot;, re.MULTILINE | re.S)
+functionIntrinsicRegExp = re.compile(r&quot;^\[intrinsic=(\w+)\]\s+&quot;, re.MULTILINE | re.S)
</ins><span class="cx"> functionNameRegExp = re.compile(r&quot;(?:function|constructor)\s+(\w+)\s*\(&quot;, re.MULTILINE | re.S)
</span><span class="cx"> functionIsConstructorRegExp = re.compile(r&quot;^constructor&quot;, re.MULTILINE | re.S)
</span><span class="cx"> functionParameterFinder = re.compile(r&quot;^(?:function|constructor)\s+(?:\w+)\s*\(((?:\s*\w+)?\s*(?:\s*,\s*\w+)*)?\s*\)&quot;, re.MULTILINE | re.S)
</span><span class="lines">@@ -93,16 +94,24 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> class BuiltinFunction:
</span><del>-    def __init__(self, function_name, function_source, is_constructor, parameters):
</del><ins>+    def __init__(self, function_name, function_source, is_constructor, parameters, intrinsic):
</ins><span class="cx">         self.function_name = function_name
</span><span class="cx">         self.function_source = function_source
</span><span class="cx">         self.is_constructor = is_constructor
</span><span class="cx">         self.parameters = parameters
</span><ins>+        self.intrinsic = intrinsic
</ins><span class="cx">         self.object = None  # Set by the owning BuiltinObject
</span><span class="cx"> 
</span><span class="cx">     @staticmethod
</span><span class="cx">     def fromString(function_string):
</span><span class="cx">         function_source = multilineCommentRegExp.sub(&quot;&quot;, function_string)
</span><ins>+
+        intrinsic = &quot;NoIntrinsic&quot;
+        intrinsicMatch = functionIntrinsicRegExp.search(function_source)
+        if intrinsicMatch:
+            intrinsic = intrinsicMatch.group(1)
+            function_source = functionIntrinsicRegExp.sub(&quot;&quot;, function_source)
+
</ins><span class="cx">         if os.getenv(&quot;CONFIGURATION&quot;, &quot;Debug&quot;).startswith(&quot;Debug&quot;):
</span><span class="cx">             function_source = lineWithOnlySingleLineCommentRegExp.sub(&quot;&quot;, function_source)
</span><span class="cx">             function_source = lineWithTrailingSingleLineCommentRegExp.sub(&quot;\n&quot;, function_source)
</span><span class="lines">@@ -114,7 +123,7 @@
</span><span class="cx">         if len(parameters[0]) == 0:
</span><span class="cx">             parameters = []
</span><span class="cx"> 
</span><del>-        return BuiltinFunction(function_name, function_source, is_constructor, parameters)
</del><ins>+        return BuiltinFunction(function_name, function_source, is_constructor, parameters, intrinsic)
</ins><span class="cx"> 
</span><span class="cx">     def __str__(self):
</span><span class="cx">         interface = &quot;%s(%s)&quot; % (self.function_name, ', '.join(self.parameters))
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreScriptsbuiltinsbuiltins_templatespy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/Scripts/builtins/builtins_templates.py (198797 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/Scripts/builtins/builtins_templates.py        2016-03-29 20:43:14 UTC (rev 198797)
+++ trunk/Source/JavaScriptCore/Scripts/builtins/builtins_templates.py        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -89,7 +89,7 @@
</span><span class="cx"> #define DEFINE_BUILTIN_GENERATOR(codeName, functionName, argumentCount) \\
</span><span class="cx"> JSC::FunctionExecutable* codeName##Generator(JSC::VM&amp; vm) \\
</span><span class="cx"> {\\
</span><del>-    return vm.builtinExecutables()-&gt;codeName##Executable()-&gt;link(vm, vm.builtinExecutables()-&gt;codeName##Source()); \
</del><ins>+    return vm.builtinExecutables()-&gt;codeName##Executable()-&gt;link(vm, vm.builtinExecutables()-&gt;codeName##Source(), Nullopt, s_##codeName##Intrinsic); \
</ins><span class="cx"> }
</span><span class="cx"> ${macroPrefix}_FOREACH_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR)
</span><span class="cx"> #undef DEFINE_BUILTIN_GENERATOR
</span><span class="lines">@@ -100,7 +100,7 @@
</span><span class="cx"> #define DEFINE_BUILTIN_GENERATOR(codeName, functionName, argumentCount) \\
</span><span class="cx"> JSC::FunctionExecutable* codeName##Generator(JSC::VM&amp; vm) \\
</span><span class="cx"> {\\
</span><del>-    return vm.builtinExecutables()-&gt;codeName##Executable()-&gt;link(vm, vm.builtinExecutables()-&gt;codeName##Source()); \
</del><ins>+    return vm.builtinExecutables()-&gt;codeName##Executable()-&gt;link(vm, vm.builtinExecutables()-&gt;codeName##Source(), Nullopt, s_##codeName##Intrinsic); \
</ins><span class="cx"> }
</span><span class="cx"> ${macroPrefix}_FOREACH_${objectMacro}_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR)
</span><span class="cx"> #undef DEFINE_BUILTIN_GENERATOR
</span><span class="lines">@@ -112,7 +112,7 @@
</span><span class="cx"> JSC::FunctionExecutable* codeName##Generator(JSC::VM&amp; vm) \\
</span><span class="cx"> {\\
</span><span class="cx">     JSVMClientData* clientData = static_cast&lt;JSVMClientData*&gt;(vm.clientData); \\
</span><del>-    return clientData-&gt;builtinFunctions().${objectNameLC}Builtins().codeName##Executable()-&gt;link(vm, clientData-&gt;builtinFunctions().${objectNameLC}Builtins().codeName##Source()); \\
</del><ins>+    return clientData-&gt;builtinFunctions().${objectNameLC}Builtins().codeName##Executable()-&gt;link(vm, clientData-&gt;builtinFunctions().${objectNameLC}Builtins().codeName##Source(), Nullopt, s_##codeName##Intrinsic); \\
</ins><span class="cx"> }
</span><span class="cx"> ${macroPrefix}_FOREACH_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR)
</span><span class="cx"> #undef DEFINE_BUILTIN_GENERATOR
</span><span class="lines">@@ -124,7 +124,7 @@
</span><span class="cx"> JSC::FunctionExecutable* codeName##Generator(JSC::VM&amp; vm) \\
</span><span class="cx"> {\\
</span><span class="cx">     JSVMClientData* clientData = static_cast&lt;JSVMClientData*&gt;(vm.clientData); \\
</span><del>-    return clientData-&gt;builtinFunctions().${objectNameLC}Builtins().codeName##Executable()-&gt;link(vm, clientData-&gt;builtinFunctions().${objectNameLC}Builtins().codeName##Source()); \\
</del><ins>+    return clientData-&gt;builtinFunctions().${objectNameLC}Builtins().codeName##Executable()-&gt;link(vm, clientData-&gt;builtinFunctions().${objectNameLC}Builtins().codeName##Source(), Nullopt, s_##codeName##Intrinsic); \\
</ins><span class="cx"> }
</span><span class="cx"> ${macroPrefix}_FOREACH_${objectMacro}_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR)
</span><span class="cx"> #undef DEFINE_BUILTIN_GENERATOR
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeUnlinkedFunctionExecutablecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.cpp (198797 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.cpp        2016-03-29 20:43:14 UTC (rev 198797)
+++ trunk/Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.cpp        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -127,7 +127,7 @@
</span><span class="cx">     visitor.append(&amp;thisObject-&gt;m_unlinkedCodeBlockForConstruct);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-FunctionExecutable* UnlinkedFunctionExecutable::link(VM&amp; vm, const SourceCode&amp; ownerSource, int overrideLineNumber)
</del><ins>+FunctionExecutable* UnlinkedFunctionExecutable::link(VM&amp; vm, const SourceCode&amp; ownerSource, Optional&lt;int&gt; overrideLineNumber, Intrinsic intrinsic)
</ins><span class="cx"> {
</span><span class="cx">     SourceCode source = m_sourceOverride ? SourceCode(m_sourceOverride) : ownerSource;
</span><span class="cx">     unsigned firstLine = source.firstLine() + m_firstLineOffset;
</span><span class="lines">@@ -155,9 +155,9 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    FunctionExecutable* result = FunctionExecutable::create(vm, code, this, firstLine, firstLine + lineCount, startColumn, endColumn);
-    if (overrideLineNumber != -1)
-        result-&gt;setOverrideLineNumber(overrideLineNumber);
</del><ins>+    FunctionExecutable* result = FunctionExecutable::create(vm, code, this, firstLine, firstLine + lineCount, startColumn, endColumn, intrinsic);
+    if (overrideLineNumber)
+        result-&gt;setOverrideLineNumber(*overrideLineNumber);
</ins><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(hasFunctionOverride)) {
</span><span class="cx">         result-&gt;overrideParameterAndTypeProfilingStartEndOffsets(
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeUnlinkedFunctionExecutableh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.h (198797 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.h        2016-03-29 20:43:14 UTC (rev 198797)
+++ trunk/Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.h        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> #include &quot;ExpressionRangeInfo.h&quot;
</span><span class="cx"> #include &quot;HandlerInfo.h&quot;
</span><span class="cx"> #include &quot;Identifier.h&quot;
</span><ins>+#include &quot;Intrinsic.h&quot;
</ins><span class="cx"> #include &quot;JSCell.h&quot;
</span><span class="cx"> #include &quot;JSString.h&quot;
</span><span class="cx"> #include &quot;ParserModes.h&quot;
</span><span class="lines">@@ -107,7 +108,7 @@
</span><span class="cx">         const Identifier&amp;, ExecState&amp;, const SourceCode&amp;, JSObject*&amp; exception, 
</span><span class="cx">         int overrideLineNumber);
</span><span class="cx"> 
</span><del>-    JS_EXPORT_PRIVATE FunctionExecutable* link(VM&amp;, const SourceCode&amp;, int overrideLineNumber = -1);
</del><ins>+    JS_EXPORT_PRIVATE FunctionExecutable* link(VM&amp;, const SourceCode&amp;, Optional&lt;int&gt; overrideLineNumber = Nullopt, Intrinsic = NoIntrinsic);
</ins><span class="cx"> 
</span><span class="cx">     void clearCode()
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGByteCodeParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp (198797 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp        2016-03-29 20:43:14 UTC (rev 198797)
+++ trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -1570,12 +1570,6 @@
</span><span class="cx">     if (!inliningBalance)
</span><span class="cx">         return false;
</span><span class="cx">     
</span><del>-    bool didInsertChecks = false;
-    auto insertChecksWithAccounting = [&amp;] () {
-        insertChecks(nullptr);
-        didInsertChecks = true;
-    };
-    
</del><span class="cx">     if (verbose)
</span><span class="cx">         dataLog(&quot;    Considering callee &quot;, callee, &quot;\n&quot;);
</span><span class="cx">     
</span><span class="lines">@@ -1587,6 +1581,13 @@
</span><span class="cx">     // exit to: LoadVarargs is effectful and it's part of the op_call_varargs, so we can't exit without
</span><span class="cx">     // calling LoadVarargs twice.
</span><span class="cx">     if (!InlineCallFrame::isVarargs(kind)) {
</span><ins>+
+        bool didInsertChecks = false;
+        auto insertChecksWithAccounting = [&amp;] () {
+            insertChecks(nullptr);
+            didInsertChecks = true;
+        };
+    
</ins><span class="cx">         if (InternalFunction* function = callee.internalFunction()) {
</span><span class="cx">             if (handleConstantInternalFunction(callTargetNode, resultOperand, function, registerOffset, argumentCountIncludingThis, specializationKind, insertChecksWithAccounting)) {
</span><span class="cx">                 RELEASE_ASSERT(didInsertChecks);
</span><span class="lines">@@ -1608,8 +1609,9 @@
</span><span class="cx">                 inliningBalance--;
</span><span class="cx">                 return true;
</span><span class="cx">             }
</span><ins>+
</ins><span class="cx">             RELEASE_ASSERT(!didInsertChecks);
</span><del>-            return false;
</del><ins>+            // We might still try to inline the Intrinsic because it might be a builtin JS function.
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeExecutablecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Executable.cpp (198797 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Executable.cpp        2016-03-29 20:43:14 UTC (rev 198797)
+++ trunk/Source/JavaScriptCore/runtime/Executable.cpp        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -101,20 +101,6 @@
</span><span class="cx">     ASSERT(classInfo() == NativeExecutable::info());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#if ENABLE(DFG_JIT)
-Intrinsic ExecutableBase::intrinsic() const
-{
-    if (const NativeExecutable* nativeExecutable = jsDynamicCast&lt;const NativeExecutable*&gt;(this))
-        return nativeExecutable-&gt;intrinsic();
-    return NoIntrinsic;
-}
-#else
-Intrinsic ExecutableBase::intrinsic() const
-{
-    return NoIntrinsic;
-}
-#endif
-
</del><span class="cx"> const ClassInfo NativeExecutable::s_info = { &quot;NativeExecutable&quot;, &amp;ExecutableBase::s_info, 0, CREATE_METHOD_TABLE(NativeExecutable) };
</span><span class="cx"> 
</span><span class="cx"> void NativeExecutable::destroy(JSCell* cell)
</span><span class="lines">@@ -122,17 +108,10 @@
</span><span class="cx">     static_cast&lt;NativeExecutable*&gt;(cell)-&gt;NativeExecutable::~NativeExecutable();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#if ENABLE(DFG_JIT)
-Intrinsic NativeExecutable::intrinsic() const
-{
-    return m_intrinsic;
-}
-#endif
-
</del><span class="cx"> const ClassInfo ScriptExecutable::s_info = { &quot;ScriptExecutable&quot;, &amp;ExecutableBase::s_info, 0, CREATE_METHOD_TABLE(ScriptExecutable) };
</span><span class="cx"> 
</span><del>-ScriptExecutable::ScriptExecutable(Structure* structure, VM&amp; vm, const SourceCode&amp; source, bool isInStrictContext, DerivedContextType derivedContextType, bool isInArrowFunctionContext)
-    : ExecutableBase(vm, structure, NUM_PARAMETERS_NOT_COMPILED)
</del><ins>+ScriptExecutable::ScriptExecutable(Structure* structure, VM&amp; vm, const SourceCode&amp; source, bool isInStrictContext, DerivedContextType derivedContextType, bool isInArrowFunctionContext, Intrinsic intrinsic)
+    : ExecutableBase(vm, structure, NUM_PARAMETERS_NOT_COMPILED, intrinsic)
</ins><span class="cx">     , m_features(isInStrictContext ? StrictModeFeature : 0)
</span><span class="cx">     , m_didTryToEnterInLoop(false)
</span><span class="cx">     , m_hasCapturedVariables(false)
</span><span class="lines">@@ -436,7 +415,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> EvalExecutable::EvalExecutable(ExecState* exec, const SourceCode&amp; source, bool inStrictContext, DerivedContextType derivedContextType, bool isArrowFunctionContext)
</span><del>-    : ScriptExecutable(exec-&gt;vm().evalExecutableStructure.get(), exec-&gt;vm(), source, inStrictContext, derivedContextType, isArrowFunctionContext)
</del><ins>+    : ScriptExecutable(exec-&gt;vm().evalExecutableStructure.get(), exec-&gt;vm(), source, inStrictContext, derivedContextType, isArrowFunctionContext, NoIntrinsic)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -448,7 +427,7 @@
</span><span class="cx"> const ClassInfo ProgramExecutable::s_info = { &quot;ProgramExecutable&quot;, &amp;ScriptExecutable::s_info, 0, CREATE_METHOD_TABLE(ProgramExecutable) };
</span><span class="cx"> 
</span><span class="cx"> ProgramExecutable::ProgramExecutable(ExecState* exec, const SourceCode&amp; source)
</span><del>-    : ScriptExecutable(exec-&gt;vm().programExecutableStructure.get(), exec-&gt;vm(), source, false, DerivedContextType::None, false)
</del><ins>+    : ScriptExecutable(exec-&gt;vm().programExecutableStructure.get(), exec-&gt;vm(), source, false, DerivedContextType::None, false, NoIntrinsic)
</ins><span class="cx"> {
</span><span class="cx">     m_typeProfilingStartOffset = 0;
</span><span class="cx">     m_typeProfilingEndOffset = source.length() - 1;
</span><span class="lines">@@ -464,7 +443,7 @@
</span><span class="cx"> const ClassInfo ModuleProgramExecutable::s_info = { &quot;ModuleProgramExecutable&quot;, &amp;ScriptExecutable::s_info, 0, CREATE_METHOD_TABLE(ModuleProgramExecutable) };
</span><span class="cx"> 
</span><span class="cx"> ModuleProgramExecutable::ModuleProgramExecutable(ExecState* exec, const SourceCode&amp; source)
</span><del>-    : ScriptExecutable(exec-&gt;vm().moduleProgramExecutableStructure.get(), exec-&gt;vm(), source, false, DerivedContextType::None, false)
</del><ins>+    : ScriptExecutable(exec-&gt;vm().moduleProgramExecutableStructure.get(), exec-&gt;vm(), source, false, DerivedContextType::None, false, NoIntrinsic)
</ins><span class="cx"> {
</span><span class="cx">     m_typeProfilingStartOffset = 0;
</span><span class="cx">     m_typeProfilingEndOffset = source.length() - 1;
</span><span class="lines">@@ -495,8 +474,8 @@
</span><span class="cx"> 
</span><span class="cx"> const ClassInfo FunctionExecutable::s_info = { &quot;FunctionExecutable&quot;, &amp;ScriptExecutable::s_info, 0, CREATE_METHOD_TABLE(FunctionExecutable) };
</span><span class="cx"> 
</span><del>-FunctionExecutable::FunctionExecutable(VM&amp; vm, const SourceCode&amp; source, UnlinkedFunctionExecutable* unlinkedExecutable, unsigned firstLine, unsigned lastLine, unsigned startColumn, unsigned endColumn)
-    : ScriptExecutable(vm.functionExecutableStructure.get(), vm, source, unlinkedExecutable-&gt;isInStrictContext(), unlinkedExecutable-&gt;derivedContextType(), false)
</del><ins>+FunctionExecutable::FunctionExecutable(VM&amp; vm, const SourceCode&amp; source, UnlinkedFunctionExecutable* unlinkedExecutable, unsigned firstLine, unsigned lastLine, unsigned startColumn, unsigned endColumn, Intrinsic intrinsic)
+    : ScriptExecutable(vm.functionExecutableStructure.get(), vm, source, unlinkedExecutable-&gt;isInStrictContext(), unlinkedExecutable-&gt;derivedContextType(), false, intrinsic)
</ins><span class="cx">     , m_unlinkedExecutable(vm, this, unlinkedExecutable)
</span><span class="cx"> {
</span><span class="cx">     RELEASE_ASSERT(!source.isNull());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeExecutableh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Executable.h (198797 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Executable.h        2016-03-29 20:43:14 UTC (rev 198797)
+++ trunk/Source/JavaScriptCore/runtime/Executable.h        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -75,10 +75,11 @@
</span><span class="cx">     static const int NUM_PARAMETERS_IS_HOST = 0;
</span><span class="cx">     static const int NUM_PARAMETERS_NOT_COMPILED = -1;
</span><span class="cx"> 
</span><del>-    ExecutableBase(VM&amp; vm, Structure* structure, int numParameters)
</del><ins>+    ExecutableBase(VM&amp; vm, Structure* structure, int numParameters, Intrinsic intrinsic)
</ins><span class="cx">         : JSCell(vm, structure)
</span><span class="cx">         , m_numParametersForCall(numParameters)
</span><span class="cx">         , m_numParametersForConstruct(numParameters)
</span><ins>+        , m_intrinsic(intrinsic)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -231,7 +232,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Intrinsics are only for calls, currently.
</span><del>-    Intrinsic intrinsic() const;
</del><ins>+    Intrinsic intrinsic() const { return m_intrinsic; }
</ins><span class="cx">         
</span><span class="cx">     Intrinsic intrinsicFor(CodeSpecializationKind kind) const
</span><span class="cx">     {
</span><span class="lines">@@ -243,6 +244,7 @@
</span><span class="cx">     void dump(PrintStream&amp;) const;
</span><span class="cx">         
</span><span class="cx"> protected:
</span><ins>+    Intrinsic m_intrinsic;
</ins><span class="cx">     RefPtr&lt;JITCode&gt; m_jitCodeForCall;
</span><span class="cx">     RefPtr&lt;JITCode&gt; m_jitCodeForConstruct;
</span><span class="cx">     MacroAssemblerCodePtr m_jitCodeForCallWithArityCheck;
</span><span class="lines">@@ -259,8 +261,8 @@
</span><span class="cx">     static NativeExecutable* create(VM&amp; vm, PassRefPtr&lt;JITCode&gt; callThunk, NativeFunction function, PassRefPtr&lt;JITCode&gt; constructThunk, NativeFunction constructor, Intrinsic intrinsic, const String&amp; name)
</span><span class="cx">     {
</span><span class="cx">         NativeExecutable* executable;
</span><del>-        executable = new (NotNull, allocateCell&lt;NativeExecutable&gt;(vm.heap)) NativeExecutable(vm, function, constructor);
-        executable-&gt;finishCreation(vm, callThunk, constructThunk, intrinsic, name);
</del><ins>+        executable = new (NotNull, allocateCell&lt;NativeExecutable&gt;(vm.heap)) NativeExecutable(vm, function, constructor, intrinsic);
+        executable-&gt;finishCreation(vm, callThunk, constructThunk, name);
</ins><span class="cx">         return executable;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -296,20 +298,19 @@
</span><span class="cx">     const String&amp; name() const { return m_name; }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    void finishCreation(VM&amp; vm, PassRefPtr&lt;JITCode&gt; callThunk, PassRefPtr&lt;JITCode&gt; constructThunk, Intrinsic intrinsic, const String&amp; name)
</del><ins>+    void finishCreation(VM&amp; vm, PassRefPtr&lt;JITCode&gt; callThunk, PassRefPtr&lt;JITCode&gt; constructThunk, const String&amp; name)
</ins><span class="cx">     {
</span><span class="cx">         Base::finishCreation(vm);
</span><span class="cx">         m_jitCodeForCall = callThunk;
</span><span class="cx">         m_jitCodeForConstruct = constructThunk;
</span><del>-        m_intrinsic = intrinsic;
</del><span class="cx">         m_name = name;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     friend class ExecutableBase;
</span><span class="cx"> 
</span><del>-    NativeExecutable(VM&amp; vm, NativeFunction function, NativeFunction constructor)
-        : ExecutableBase(vm, vm.nativeExecutableStructure.get(), NUM_PARAMETERS_IS_HOST)
</del><ins>+    NativeExecutable(VM&amp; vm, NativeFunction function, NativeFunction constructor, Intrinsic intrinsic)
+        : ExecutableBase(vm, vm.nativeExecutableStructure.get(), NUM_PARAMETERS_IS_HOST, intrinsic)
</ins><span class="cx">         , m_function(function)
</span><span class="cx">         , m_constructor(constructor)
</span><span class="cx">     {
</span><span class="lines">@@ -399,7 +400,7 @@
</span><span class="cx">     JSObject* prepareForExecutionImpl(ExecState*, JSFunction*, JSScope*, CodeSpecializationKind);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    ScriptExecutable(Structure*, VM&amp;, const SourceCode&amp;, bool isInStrictContext, DerivedContextType, bool isInArrowFunctionContext);
</del><ins>+    ScriptExecutable(Structure*, VM&amp;, const SourceCode&amp;, bool isInStrictContext, DerivedContextType, bool isInArrowFunctionContext, Intrinsic);
</ins><span class="cx"> 
</span><span class="cx">     void finishCreation(VM&amp; vm)
</span><span class="cx">     {
</span><span class="lines">@@ -580,9 +581,9 @@
</span><span class="cx"> 
</span><span class="cx">     static FunctionExecutable* create(
</span><span class="cx">         VM&amp; vm, const SourceCode&amp; source, UnlinkedFunctionExecutable* unlinkedExecutable, 
</span><del>-        unsigned firstLine, unsigned lastLine, unsigned startColumn, unsigned endColumn)
</del><ins>+        unsigned firstLine, unsigned lastLine, unsigned startColumn, unsigned endColumn, Intrinsic intrinsic)
</ins><span class="cx">     {
</span><del>-        FunctionExecutable* executable = new (NotNull, allocateCell&lt;FunctionExecutable&gt;(vm.heap)) FunctionExecutable(vm, source, unlinkedExecutable, firstLine, lastLine, startColumn, endColumn);
</del><ins>+        FunctionExecutable* executable = new (NotNull, allocateCell&lt;FunctionExecutable&gt;(vm.heap)) FunctionExecutable(vm, source, unlinkedExecutable, firstLine, lastLine, startColumn, endColumn, intrinsic);
</ins><span class="cx">         executable-&gt;finishCreation(vm);
</span><span class="cx">         return executable;
</span><span class="cx">     }
</span><span class="lines">@@ -697,7 +698,7 @@
</span><span class="cx">     friend class ExecutableBase;
</span><span class="cx">     FunctionExecutable(
</span><span class="cx">         VM&amp;, const SourceCode&amp;, UnlinkedFunctionExecutable*, unsigned firstLine, 
</span><del>-        unsigned lastLine, unsigned startColumn, unsigned endColumn);
</del><ins>+        unsigned lastLine, unsigned startColumn, unsigned endColumn, Intrinsic);
</ins><span class="cx">     
</span><span class="cx">     void finishCreation(VM&amp;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeIntrinsich"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Intrinsic.h (198797 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Intrinsic.h        2016-03-29 20:43:14 UTC (rev 198797)
+++ trunk/Source/JavaScriptCore/runtime/Intrinsic.h        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-enum Intrinsic {
</del><ins>+enum JS_EXPORT_PRIVATE Intrinsic {
</ins><span class="cx">     // Call intrinsics.
</span><span class="cx">     NoIntrinsic,
</span><span class="cx">     AbsIntrinsic,
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (198797 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-03-29 20:43:14 UTC (rev 198797)
+++ trunk/Source/WebCore/ChangeLog        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2016-03-29  Saam barati  &lt;sbarati@apple.com&gt;
+
+        Allow builtin JS functions to be intrinsics
+        https://bugs.webkit.org/show_bug.cgi?id=155960
+
+        Reviewed by Mark Lam.
+
+        * ForwardingHeaders/runtime/Intrinsic.h: Added.
+
</ins><span class="cx"> 2016-03-29  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Cocoa] Rename ScrollbarPainter variables to ScrollerImp
</span></span></pre></div>
<a id="trunkSourceWebCoreForwardingHeadersruntimeIntrinsich"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/ForwardingHeaders/runtime/Intrinsic.h (0 => 198798)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ForwardingHeaders/runtime/Intrinsic.h                                (rev 0)
+++ trunk/Source/WebCore/ForwardingHeaders/runtime/Intrinsic.h        2016-03-29 21:04:21 UTC (rev 198798)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+#ifndef WebCore_FWD_Intrinsic_h
+#define WebCore_FWD_Intrinsic_h
+#include &lt;JavaScriptCore/Intrinsic.h&gt;
+#endif
</ins></span></pre>
</div>
</div>

</body>
</html>