summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/jit/GCAwareJITStubRoutine.cpp')
-rw-r--r--Source/JavaScriptCore/jit/GCAwareJITStubRoutine.cpp85
1 files changed, 59 insertions, 26 deletions
diff --git a/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.cpp b/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.cpp
index f681dd847..bab6de13b 100644
--- a/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.cpp
+++ b/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2012, 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -28,24 +28,27 @@
#if ENABLE(JIT)
+#include "CodeBlock.h"
+#include "DFGCommonData.h"
#include "Heap.h"
#include "VM.h"
-#include "Operations.h"
+#include "JITStubRoutineSet.h"
+#include "JSCInlines.h"
#include "SlotVisitor.h"
#include "Structure.h"
+#include <wtf/RefPtr.h>
namespace JSC {
GCAwareJITStubRoutine::GCAwareJITStubRoutine(
- const MacroAssemblerCodeRef& code, VM& vm, bool isClosureCall)
+ const MacroAssemblerCodeRef& code, VM& vm)
: JITStubRoutine(code)
, m_mayBeExecuting(false)
, m_isJettisoned(false)
- , m_isClosureCall(isClosureCall)
{
- vm.heap.m_jitStubRoutines.add(this);
+ vm.heap.m_jitStubRoutines->add(this);
}
-
+
GCAwareJITStubRoutine::~GCAwareJITStubRoutine() { }
void GCAwareJITStubRoutine::observeZeroRefCount()
@@ -78,48 +81,78 @@ void GCAwareJITStubRoutine::markRequiredObjectsInternal(SlotVisitor&)
{
}
-MarkingGCAwareJITStubRoutineWithOneObject::MarkingGCAwareJITStubRoutineWithOneObject(
+MarkingGCAwareJITStubRoutine::MarkingGCAwareJITStubRoutine(
const MacroAssemblerCodeRef& code, VM& vm, const JSCell* owner,
- JSCell* object)
+ const Vector<JSCell*>& cells)
: GCAwareJITStubRoutine(code, vm)
- , m_object(vm, owner, object)
+ , m_cells(cells.size())
{
+ for (unsigned i = cells.size(); i--;)
+ m_cells[i].set(vm, owner, cells[i]);
}
-MarkingGCAwareJITStubRoutineWithOneObject::~MarkingGCAwareJITStubRoutineWithOneObject()
+MarkingGCAwareJITStubRoutine::~MarkingGCAwareJITStubRoutine()
{
}
-void MarkingGCAwareJITStubRoutineWithOneObject::markRequiredObjectsInternal(SlotVisitor& visitor)
+void MarkingGCAwareJITStubRoutine::markRequiredObjectsInternal(SlotVisitor& visitor)
{
- visitor.append(&m_object);
+ for (auto& entry : m_cells)
+ visitor.append(entry);
}
-PassRefPtr<JITStubRoutine> createJITStubRoutine(
- const MacroAssemblerCodeRef& code,
- VM& vm,
- const JSCell*,
- bool makesCalls)
+
+GCAwareJITStubRoutineWithExceptionHandler::GCAwareJITStubRoutineWithExceptionHandler(
+ const MacroAssemblerCodeRef& code, VM& vm, const JSCell* owner, const Vector<JSCell*>& cells,
+ CodeBlock* codeBlockForExceptionHandlers, CallSiteIndex exceptionHandlerCallSiteIndex)
+ : MarkingGCAwareJITStubRoutine(code, vm, owner, cells)
+ , m_codeBlockWithExceptionHandler(codeBlockForExceptionHandlers)
+ , m_exceptionHandlerCallSiteIndex(exceptionHandlerCallSiteIndex)
{
- if (!makesCalls)
- return adoptRef(new JITStubRoutine(code));
+ RELEASE_ASSERT(m_codeBlockWithExceptionHandler);
+ ASSERT(!!m_codeBlockWithExceptionHandler->handlerForIndex(exceptionHandlerCallSiteIndex.bits()));
+}
- return static_pointer_cast<JITStubRoutine>(
- adoptRef(new GCAwareJITStubRoutine(code, vm)));
+void GCAwareJITStubRoutineWithExceptionHandler::aboutToDie()
+{
+ m_codeBlockWithExceptionHandler = nullptr;
}
-PassRefPtr<JITStubRoutine> createJITStubRoutine(
+void GCAwareJITStubRoutineWithExceptionHandler::observeZeroRefCount()
+{
+#if ENABLE(DFG_JIT)
+ if (m_codeBlockWithExceptionHandler) {
+ m_codeBlockWithExceptionHandler->jitCode()->dfgCommon()->removeCallSiteIndex(m_exceptionHandlerCallSiteIndex);
+ m_codeBlockWithExceptionHandler->removeExceptionHandlerForCallSite(m_exceptionHandlerCallSiteIndex);
+ m_codeBlockWithExceptionHandler = nullptr;
+ }
+#endif
+
+ Base::observeZeroRefCount();
+}
+
+
+Ref<JITStubRoutine> createJITStubRoutine(
const MacroAssemblerCodeRef& code,
VM& vm,
const JSCell* owner,
bool makesCalls,
- JSCell* object)
+ const Vector<JSCell*>& cells,
+ CodeBlock* codeBlockForExceptionHandlers,
+ CallSiteIndex exceptionHandlerCallSiteIndex)
{
if (!makesCalls)
- return adoptRef(new JITStubRoutine(code));
+ return adoptRef(*new JITStubRoutine(code));
+
+ if (codeBlockForExceptionHandlers) {
+ RELEASE_ASSERT(JITCode::isOptimizingJIT(codeBlockForExceptionHandlers->jitType()));
+ return adoptRef(*new GCAwareJITStubRoutineWithExceptionHandler(code, vm, owner, cells, codeBlockForExceptionHandlers, exceptionHandlerCallSiteIndex));
+ }
+
+ if (cells.isEmpty())
+ return adoptRef(*new GCAwareJITStubRoutine(code, vm));
- return static_pointer_cast<JITStubRoutine>(
- adoptRef(new MarkingGCAwareJITStubRoutineWithOneObject(code, vm, owner, object)));
+ return adoptRef(*new MarkingGCAwareJITStubRoutine(code, vm, owner, cells));
}
} // namespace JSC