mirror of
https://github.com/luau-lang/luau.git
synced 2025-01-19 17:28:06 +00:00
146 lines
2.8 KiB
C
146 lines
2.8 KiB
C
|
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
||
|
#pragma once
|
||
|
|
||
|
#include "NativeState.h"
|
||
|
|
||
|
#include "lobject.h"
|
||
|
#include "lstate.h"
|
||
|
|
||
|
namespace Luau
|
||
|
{
|
||
|
namespace CodeGen
|
||
|
{
|
||
|
|
||
|
// Here we define helper functions to wrap interaction with Luau custom execution API so that it works with or without LUA_CUSTOM_EXECUTION
|
||
|
|
||
|
#if LUA_CUSTOM_EXECUTION
|
||
|
|
||
|
inline lua_ExecutionCallbacks* getExecutionCallbacks(lua_State* L)
|
||
|
{
|
||
|
return &L->global->ecb;
|
||
|
}
|
||
|
|
||
|
inline NativeState* getNativeState(lua_State* L)
|
||
|
{
|
||
|
lua_ExecutionCallbacks* ecb = getExecutionCallbacks(L);
|
||
|
return (NativeState*)ecb->context;
|
||
|
}
|
||
|
|
||
|
inline void setNativeState(lua_State* L, NativeState* nativeState)
|
||
|
{
|
||
|
lua_ExecutionCallbacks* ecb = getExecutionCallbacks(L);
|
||
|
ecb->context = nativeState;
|
||
|
}
|
||
|
|
||
|
inline NativeState* createNativeState(lua_State* L)
|
||
|
{
|
||
|
NativeState* state = new NativeState();
|
||
|
setNativeState(L, state);
|
||
|
return state;
|
||
|
}
|
||
|
|
||
|
inline void destroyNativeState(lua_State* L)
|
||
|
{
|
||
|
NativeState* state = getNativeState(L);
|
||
|
setNativeState(L, nullptr);
|
||
|
delete state;
|
||
|
}
|
||
|
|
||
|
inline NativeProto* getProtoExecData(Proto* proto)
|
||
|
{
|
||
|
return (NativeProto*)proto->execdata;
|
||
|
}
|
||
|
|
||
|
inline void setProtoExecData(Proto* proto, NativeProto* nativeProto)
|
||
|
{
|
||
|
if (nativeProto)
|
||
|
LUAU_ASSERT(proto->execdata == nullptr);
|
||
|
|
||
|
proto->execdata = nativeProto;
|
||
|
}
|
||
|
|
||
|
#define offsetofProtoExecData offsetof(Proto, execdata)
|
||
|
|
||
|
#else
|
||
|
|
||
|
inline lua_ExecutionCallbacks* getExecutionCallbacks(lua_State* L)
|
||
|
{
|
||
|
return nullptr;
|
||
|
}
|
||
|
|
||
|
inline NativeState* getNativeState(lua_State* L)
|
||
|
{
|
||
|
return nullptr;
|
||
|
}
|
||
|
|
||
|
inline void setNativeState(lua_State* L, NativeState* nativeState) {}
|
||
|
|
||
|
inline NativeState* createNativeState(lua_State* L)
|
||
|
{
|
||
|
return nullptr;
|
||
|
}
|
||
|
|
||
|
inline void destroyNativeState(lua_State* L) {}
|
||
|
|
||
|
inline NativeProto* getProtoExecData(Proto* proto)
|
||
|
{
|
||
|
return nullptr;
|
||
|
}
|
||
|
|
||
|
inline void setProtoExecData(Proto* proto, NativeProto* nativeProto) {}
|
||
|
|
||
|
#define offsetofProtoExecData 0
|
||
|
|
||
|
#endif
|
||
|
|
||
|
inline int getOpLength(LuauOpcode op)
|
||
|
{
|
||
|
switch (op)
|
||
|
{
|
||
|
case LOP_GETGLOBAL:
|
||
|
case LOP_SETGLOBAL:
|
||
|
case LOP_GETIMPORT:
|
||
|
case LOP_GETTABLEKS:
|
||
|
case LOP_SETTABLEKS:
|
||
|
case LOP_NAMECALL:
|
||
|
case LOP_JUMPIFEQ:
|
||
|
case LOP_JUMPIFLE:
|
||
|
case LOP_JUMPIFLT:
|
||
|
case LOP_JUMPIFNOTEQ:
|
||
|
case LOP_JUMPIFNOTLE:
|
||
|
case LOP_JUMPIFNOTLT:
|
||
|
case LOP_NEWTABLE:
|
||
|
case LOP_SETLIST:
|
||
|
case LOP_FORGLOOP:
|
||
|
case LOP_LOADKX:
|
||
|
case LOP_FASTCALL2:
|
||
|
case LOP_FASTCALL2K:
|
||
|
case LOP_JUMPXEQKNIL:
|
||
|
case LOP_JUMPXEQKB:
|
||
|
case LOP_JUMPXEQKN:
|
||
|
case LOP_JUMPXEQKS:
|
||
|
return 2;
|
||
|
|
||
|
default:
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
enum class X64ABI
|
||
|
{
|
||
|
Windows,
|
||
|
SystemV,
|
||
|
};
|
||
|
|
||
|
inline X64ABI getCurrentX64ABI()
|
||
|
{
|
||
|
#if defined(_WIN32)
|
||
|
return X64ABI::Windows;
|
||
|
#else
|
||
|
return X64ABI::SystemV;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
} // namespace CodeGen
|
||
|
} // namespace Luau
|