summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/jit/JITCode.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/jit/JITCode.cpp
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/jit/JITCode.cpp')
-rw-r--r--Source/JavaScriptCore/jit/JITCode.cpp169
1 files changed, 52 insertions, 117 deletions
diff --git a/Source/JavaScriptCore/jit/JITCode.cpp b/Source/JavaScriptCore/jit/JITCode.cpp
index 26b69c542..213b7000c 100644
--- a/Source/JavaScriptCore/jit/JITCode.cpp
+++ b/Source/JavaScriptCore/jit/JITCode.cpp
@@ -27,8 +27,7 @@
#include "JITCode.h"
#include "LLIntThunks.h"
-#include "JSCInlines.h"
-#include "ProtoCallFrame.h"
+#include "Operations.h"
#include <wtf/PrintStream.h>
namespace JSC {
@@ -42,42 +41,11 @@ JITCode::~JITCode()
{
}
-const char* JITCode::typeName(JITType jitType)
+JSValue JITCode::execute(VM* vm, ProtoCallFrame* protoCallFrame, Register* topOfStack)
{
- switch (jitType) {
- case None:
- return "None";
- case HostCallThunk:
- return "Host";
- case InterpreterThunk:
- return "LLInt";
- case BaselineJIT:
- return "Baseline";
- case DFGJIT:
- return "DFG";
- case FTLJIT:
- return "FTL";
- default:
- CRASH();
- return "";
- }
-}
-
-void JITCode::validateReferences(const TrackedReferences&)
-{
-}
-
-JSValue JITCode::execute(VM* vm, ProtoCallFrame* protoCallFrame)
-{
- void* entryAddress;
- JSFunction* function = jsDynamicCast<JSFunction*>(protoCallFrame->callee());
+ ASSERT(!vm->topCallFrame || ((Register*)(vm->topCallFrame) >= topOfStack));
- if (!function || !protoCallFrame->needArityCheck()) {
- ASSERT(!protoCallFrame->needArityCheck());
- entryAddress = executableAddress();
- } else
- entryAddress = addressForCall(MustCheckArity).executableAddress();
- JSValue result = JSValue::decode(vmEntryToJavaScript(entryAddress, vm, protoCallFrame));
+ JSValue result = JSValue::decode(callToJavaScript(executableAddress(), &vm->topCallFrame, protoCallFrame, topOfStack));
return vm->exception() ? jsNull() : result;
}
@@ -105,38 +73,52 @@ FTL::ForOSREntryJITCode* JITCode::ftlForOSREntry()
return 0;
}
-JITCodeWithCodeRef::JITCodeWithCodeRef(JITType jitType)
+PassRefPtr<JITCode> JITCode::hostFunction(JITCode::CodeRef code)
+{
+ return adoptRef(new DirectJITCode(code, HostCallThunk));
+}
+
+DirectJITCode::DirectJITCode(JITType jitType)
: JITCode(jitType)
{
}
-JITCodeWithCodeRef::JITCodeWithCodeRef(CodeRef ref, JITType jitType)
+DirectJITCode::DirectJITCode(const JITCode::CodeRef ref, JITType jitType)
: JITCode(jitType)
, m_ref(ref)
{
}
-JITCodeWithCodeRef::~JITCodeWithCodeRef()
+DirectJITCode::~DirectJITCode()
+{
+}
+
+void DirectJITCode::initializeCodeRef(const JITCode::CodeRef ref)
{
- if ((Options::dumpDisassembly() || (isOptimizingJIT(jitType()) && Options::dumpDFGDisassembly()))
- && m_ref.executableMemory())
- dataLog("Destroying JIT code at ", pointerDump(m_ref.executableMemory()), "\n");
+ RELEASE_ASSERT(!m_ref);
+ m_ref = ref;
}
-void* JITCodeWithCodeRef::executableAddressAtOffset(size_t offset)
+JITCode::CodePtr DirectJITCode::addressForCall()
+{
+ RELEASE_ASSERT(m_ref);
+ return m_ref.code();
+}
+
+void* DirectJITCode::executableAddressAtOffset(size_t offset)
{
RELEASE_ASSERT(m_ref);
return reinterpret_cast<char*>(m_ref.code().executableAddress()) + offset;
}
-void* JITCodeWithCodeRef::dataAddressAtOffset(size_t offset)
+void* DirectJITCode::dataAddressAtOffset(size_t offset)
{
RELEASE_ASSERT(m_ref);
ASSERT(offset <= size()); // use <= instead of < because it is valid to ask for an address at the exclusive end of the code.
return reinterpret_cast<char*>(m_ref.code().dataLocation()) + offset;
}
-unsigned JITCodeWithCodeRef::offsetOf(void* pointerIntoCode)
+unsigned DirectJITCode::offsetOf(void* pointerIntoCode)
{
RELEASE_ASSERT(m_ref);
intptr_t result = reinterpret_cast<intptr_t>(pointerIntoCode) - reinterpret_cast<intptr_t>(m_ref.code().executableAddress());
@@ -144,94 +126,47 @@ unsigned JITCodeWithCodeRef::offsetOf(void* pointerIntoCode)
return static_cast<unsigned>(result);
}
-size_t JITCodeWithCodeRef::size()
+size_t DirectJITCode::size()
{
RELEASE_ASSERT(m_ref);
return m_ref.size();
}
-bool JITCodeWithCodeRef::contains(void* address)
+bool DirectJITCode::contains(void* address)
{
RELEASE_ASSERT(m_ref);
return m_ref.executableMemory()->contains(address);
}
-DirectJITCode::DirectJITCode(JITType jitType)
- : JITCodeWithCodeRef(jitType)
-{
-}
-
-DirectJITCode::DirectJITCode(JITCode::CodeRef ref, JITCode::CodePtr withArityCheck, JITType jitType)
- : JITCodeWithCodeRef(ref, jitType)
- , m_withArityCheck(withArityCheck)
-{
-}
-
-DirectJITCode::~DirectJITCode()
-{
-}
-
-void DirectJITCode::initializeCodeRef(JITCode::CodeRef ref, JITCode::CodePtr withArityCheck)
-{
- RELEASE_ASSERT(!m_ref);
- m_ref = ref;
- m_withArityCheck = withArityCheck;
-}
-
-JITCode::CodePtr DirectJITCode::addressForCall(ArityCheckMode arity)
-{
- switch (arity) {
- case ArityCheckNotRequired:
- RELEASE_ASSERT(m_ref);
- return m_ref.code();
- case MustCheckArity:
- RELEASE_ASSERT(m_withArityCheck);
- return m_withArityCheck;
- }
- RELEASE_ASSERT_NOT_REACHED();
- return CodePtr();
-}
-
-NativeJITCode::NativeJITCode(JITType jitType)
- : JITCodeWithCodeRef(jitType)
-{
-}
-
-NativeJITCode::NativeJITCode(CodeRef ref, JITType jitType)
- : JITCodeWithCodeRef(ref, jitType)
-{
-}
-
-NativeJITCode::~NativeJITCode()
-{
-}
-
-void NativeJITCode::initializeCodeRef(CodeRef ref)
-{
- ASSERT(!m_ref);
- m_ref = ref;
-}
-
-JITCode::CodePtr NativeJITCode::addressForCall(ArityCheckMode)
-{
- RELEASE_ASSERT(!!m_ref);
- return m_ref.code();
-}
-
-#if ENABLE(JIT)
-RegisterSet JITCode::liveRegistersToPreserveAtExceptionHandlingCallSite(CodeBlock*, CallSiteIndex)
-{
- return RegisterSet();
-}
-#endif
-
} // namespace JSC
namespace WTF {
void printInternal(PrintStream& out, JSC::JITCode::JITType type)
{
- out.print(JSC::JITCode::typeName(type));
+ switch (type) {
+ case JSC::JITCode::None:
+ out.print("None");
+ return;
+ case JSC::JITCode::HostCallThunk:
+ out.print("Host");
+ return;
+ case JSC::JITCode::InterpreterThunk:
+ out.print("LLInt");
+ return;
+ case JSC::JITCode::BaselineJIT:
+ out.print("Baseline");
+ return;
+ case JSC::JITCode::DFGJIT:
+ out.print("DFG");
+ return;
+ case JSC::JITCode::FTLJIT:
+ out.print("FTL");
+ return;
+ default:
+ CRASH();
+ return;
+ }
}
} // namespace WTF