NativeExecutable.h [plain text]
#pragma once
#include "ExecutableBase.h"
namespace JSC {
class NativeExecutable final : public ExecutableBase {
friend class JIT;
friend class LLIntOffsetsExtractor;
public:
typedef ExecutableBase Base;
static constexpr unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
static NativeExecutable* create(VM&, Ref<JITCode>&& callThunk, TaggedNativeFunction, Ref<JITCode>&& constructThunk, TaggedNativeFunction constructor, const String& name);
static void destroy(JSCell*);
template<typename CellType, SubspaceAccess>
static IsoSubspace* subspaceFor(VM& vm)
{
return &vm.nativeExecutableSpace;
}
CodeBlockHash hashFor(CodeSpecializationKind) const;
TaggedNativeFunction function() const { return m_function; }
TaggedNativeFunction constructor() const { return m_constructor; }
TaggedNativeFunction nativeFunctionFor(CodeSpecializationKind kind)
{
if (kind == CodeForCall)
return function();
ASSERT(kind == CodeForConstruct);
return constructor();
}
static ptrdiff_t offsetOfNativeFunctionFor(CodeSpecializationKind kind)
{
if (kind == CodeForCall)
return OBJECT_OFFSETOF(NativeExecutable, m_function);
ASSERT(kind == CodeForConstruct);
return OBJECT_OFFSETOF(NativeExecutable, m_constructor);
}
static Structure* createStructure(VM&, JSGlobalObject*, JSValue proto);
DECLARE_INFO;
const String& name() const { return m_name; }
const DOMJIT::Signature* signatureFor(CodeSpecializationKind) const;
Intrinsic intrinsic() const;
private:
NativeExecutable(VM&, TaggedNativeFunction, TaggedNativeFunction constructor);
void finishCreation(VM&, Ref<JITCode>&& callThunk, Ref<JITCode>&& constructThunk, const String& name);
TaggedNativeFunction m_function;
TaggedNativeFunction m_constructor;
String m_name;
};
}