/proc/self/cwd/source/extensions/filters/common/lua/lua.h
Line | Count | Source (jump to first uncovered line) |
1 | | #pragma once |
2 | | |
3 | | #include <memory> |
4 | | #include <string> |
5 | | #include <vector> |
6 | | |
7 | | #include "envoy/common/exception.h" |
8 | | #include "envoy/thread_local/thread_local.h" |
9 | | |
10 | | #include "source/common/common/assert.h" |
11 | | #include "source/common/common/c_smart_ptr.h" |
12 | | #include "source/common/common/logger.h" |
13 | | |
14 | | #include "lua.hpp" |
15 | | |
16 | | namespace Envoy { |
17 | | namespace Extensions { |
18 | | namespace Filters { |
19 | | namespace Common { |
20 | | namespace Lua { |
21 | | |
22 | | /** |
23 | | * Some general notes on everything in this file. Lua/C bindings are functional, but not the most |
24 | | * beautiful interfaces. For more general overview information see the following: |
25 | | * 1) https://www.lua.org/manual/5.1/manual.html#3 |
26 | | * 2) https://doc.lagout.org/programmation/Lua/Programming%20in%20Lua%20Second%20Edition.pdf |
27 | | * 3) http://luajit.org/extensions.html |
28 | | * |
29 | | * Instead of delving into crazy template metaprogramming in all cases, I've tried to use a mix |
30 | | * of templates and macros to try to hide the majority of the pain. I.e., most Lua/C pain should |
31 | | * be in this file. We do still expose basic Lua/C programming (manipulating the stack, etc.) out |
32 | | * to callers which avoids the messy C++ template programming I mentioned above. |
33 | | */ |
34 | | |
35 | | /** |
36 | | * Base macro for declaring a Lua/C function. Any function declared will need to be exported via |
37 | | * the exportedFunctions() function in BaseLuaObject. See BaseLuaObject below for more |
38 | | * information. This macro declares a static "thunk" which checks the user data, optionally checks |
39 | | * for object death (again see BaseLuaObject below for more info), and then invokes a normal |
40 | | * object method. The actual object method needs to be implemented by the class. |
41 | | * @param Class supplies the owning class name. |
42 | | * @param Name supplies the function name. |
43 | | * @param Index supplies the stack index where "this" (Lua/C userdata) is found. |
44 | | */ |
45 | | #define DECLARE_LUA_FUNCTION_EX(Class, Name, Index) \ |
46 | 0 | static int static_##Name(lua_State* state) { \ |
47 | 0 | Class* object = ::Envoy::Extensions::Filters::Common::Lua::alignAndCast<Class>( \ |
48 | 0 | luaL_checkudata(state, Index, typeid(Class).name())); \ |
49 | 0 | object->checkDead(state); \ |
50 | 0 | return object->Name(state); \ |
51 | 0 | } \ Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BufferWrapper::static_luaLength(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BufferWrapper::static_luaGetBytes(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BufferWrapper::static_luaSetBytes(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator::static_luaPairsIterator(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper::static_luaGet(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper::static_luaPairs(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaPeerCertificatePresented(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaPeerCertificateValidated(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaUriSanLocalCertificate(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaSubjectLocalCertificate(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaSha256PeerCertificateDigest(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaSerialNumberPeerCertificate(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaIssuerPeerCertificate(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaSubjectPeerCertificate(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaUriSanPeerCertificate(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaUrlEncodedPemEncodedPeerCertificate(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaUrlEncodedPemEncodedPeerCertificateChain(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaDnsSansPeerCertificate(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaDnsSansLocalCertificate(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaValidFromPeerCertificate(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaExpirationPeerCertificate(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaSessionId(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaCiphersuiteId(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaCiphersuiteString(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper::static_luaTlsVersion(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper::static_luaSsl(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator::static_luaPairsIterator(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper::static_luaAdd(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper::static_luaGet(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper::static_luaGetAtIndex(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper::static_luaGetNumValues(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper::static_luaPairs(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper::static_luaRemove(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper::static_luaReplace(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper::static_luaSetHttp1ReasonPhrase(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator::static_luaPairsIterator(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper::static_luaGet(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper::static_luaSet(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper::static_luaPairs(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper::static_luaProtocol(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper::static_luaDynamicMetadata(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper::static_luaDownstreamSslConnection(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper::static_luaDownstreamLocalAddress(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper::static_luaDownstreamDirectRemoteAddress(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper::static_luaDownstreamRemoteAddress(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper::static_luaRequestedServerName(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper::static_luaGet(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaHttpCall(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaRespond(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaHeaders(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaBody(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaBodyChunks(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaTrailers(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaMetadata(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaStreamInfo(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaConnection(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaLogTrace(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaLogDebug(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaLogInfo(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaLogWarn(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaLogErr(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaLogCritical(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaVerifySignature(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaImportPublicKey(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaBodyIterator(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaBase64Escape(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaTimestamp(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::static_luaTimestampString(lua_State*) |
52 | | int Name(lua_State* state); |
53 | | |
54 | | /** |
55 | | * Declare a Lua function in which userdata is in stack slot 1. See DECLARE_LUA_FUNCTION_EX() |
56 | | */ |
57 | | #define DECLARE_LUA_FUNCTION(Class, Name) DECLARE_LUA_FUNCTION_EX(Class, Name, 1) |
58 | | |
59 | | /** |
60 | | * Declare a Lua function in which userdata is in upvalue slot 1. See DECLARE_LUA_FUNCTION_EX() |
61 | | */ |
62 | | #define DECLARE_LUA_CLOSURE(Class, Name) DECLARE_LUA_FUNCTION_EX(Class, Name, lua_upvalueindex(1)) |
63 | | |
64 | | /** |
65 | | * Declare a Lua function in which values are added to a table to approximate an enum. |
66 | | */ |
67 | | #define LUA_ENUM(state, name, val) \ |
68 | 0 | lua_pushlstring(state, #name, sizeof(#name) - 1); \ |
69 | 0 | lua_pushnumber(state, val); \ |
70 | 0 | lua_settable(state, -3); |
71 | | |
72 | | /** |
73 | | * Get absl::string_view from Lua string. This checks if the argument at index is a string |
74 | | * and build an absl::string_view from it. |
75 | | * @param state the current Lua state. |
76 | | * @param index the index of argument. |
77 | | * @return absl::string_view of Lua string with proper string length. |
78 | | **/ |
79 | 0 | inline absl::string_view getStringViewFromLuaString(lua_State* state, int index) { |
80 | 0 | size_t input_size = 0; |
81 | | // When the argument at index in Lua state is not a string, for example, giving a table to |
82 | | // logTrace (which uses this function under the hood), Lua script exits with an error like the |
83 | | // following: "[string \"...\"]:3: bad argument #1 to 'logTrace' (string expected, got table)". |
84 | | // However,`luaL_checklstring` accepts a number as its argument and implicitly converts it to a |
85 | | // string, since Lua provides automatic conversion between string and number values at run time |
86 | | // (https://www.lua.org/manual/5.1/manual.html#2.2.1). |
87 | 0 | const char* input = luaL_checklstring(state, index, &input_size); |
88 | 0 | return {input, input_size}; |
89 | 0 | } |
90 | | |
91 | | /** |
92 | | * Calculate the maximum space needed to be aligned. |
93 | | */ |
94 | 0 | template <typename T> constexpr size_t maximumSpaceNeededToAlign() { |
95 | | // The allocated memory can be misaligned up to `alignof(T) - 1` bytes. Adding it to the size to |
96 | | // allocate. |
97 | 0 | return sizeof(T) + alignof(T) - 1; |
98 | 0 | } Unexecuted instantiation: unsigned long Envoy::Extensions::Filters::Common::Lua::maximumSpaceNeededToAlign<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>() Unexecuted instantiation: unsigned long Envoy::Extensions::Filters::Common::Lua::maximumSpaceNeededToAlign<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>() Unexecuted instantiation: unsigned long Envoy::Extensions::Filters::Common::Lua::maximumSpaceNeededToAlign<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>() Unexecuted instantiation: unsigned long Envoy::Extensions::Filters::Common::Lua::maximumSpaceNeededToAlign<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>() Unexecuted instantiation: unsigned long Envoy::Extensions::Filters::Common::Lua::maximumSpaceNeededToAlign<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>() Unexecuted instantiation: unsigned long Envoy::Extensions::Filters::Common::Lua::maximumSpaceNeededToAlign<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>() Unexecuted instantiation: unsigned long Envoy::Extensions::Filters::Common::Lua::maximumSpaceNeededToAlign<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>() Unexecuted instantiation: unsigned long Envoy::Extensions::Filters::Common::Lua::maximumSpaceNeededToAlign<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>() Unexecuted instantiation: unsigned long Envoy::Extensions::Filters::Common::Lua::maximumSpaceNeededToAlign<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>() Unexecuted instantiation: unsigned long Envoy::Extensions::Filters::Common::Lua::maximumSpaceNeededToAlign<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>() Unexecuted instantiation: unsigned long Envoy::Extensions::Filters::Common::Lua::maximumSpaceNeededToAlign<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>() Unexecuted instantiation: unsigned long Envoy::Extensions::Filters::Common::Lua::maximumSpaceNeededToAlign<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>() |
99 | | |
100 | 0 | template <typename T> inline T* alignAndCast(void* mem) { |
101 | 0 | size_t size = maximumSpaceNeededToAlign<T>(); |
102 | 0 | return static_cast<T*>(std::align(alignof(T), sizeof(T), mem, size)); |
103 | 0 | } Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BufferWrapper* Envoy::Extensions::Filters::Common::Lua::alignAndCast<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>(void*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator* Envoy::Extensions::Filters::Common::Lua::alignAndCast<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>(void*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper* Envoy::Extensions::Filters::Common::Lua::alignAndCast<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>(void*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper* Envoy::Extensions::Filters::Common::Lua::alignAndCast<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>(void*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper* Envoy::Extensions::Filters::Common::Lua::alignAndCast<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>(void*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator* Envoy::Extensions::Filters::Common::Lua::alignAndCast<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>(void*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper* Envoy::Extensions::Filters::Common::Lua::alignAndCast<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>(void*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator* Envoy::Extensions::Filters::Common::Lua::alignAndCast<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>(void*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper* Envoy::Extensions::Filters::Common::Lua::alignAndCast<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>(void*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper* Envoy::Extensions::Filters::Common::Lua::alignAndCast<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>(void*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper* Envoy::Extensions::Filters::Common::Lua::alignAndCast<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>(void*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper* Envoy::Extensions::Filters::Common::Lua::alignAndCast<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>(void*) |
104 | | |
105 | | /** |
106 | | * Create a new user data and assign its metatable. |
107 | | */ |
108 | 0 | template <typename T> inline T* allocateLuaUserData(lua_State* state) { |
109 | 0 | void* mem = lua_newuserdata(state, maximumSpaceNeededToAlign<T>()); |
110 | 0 | luaL_getmetatable(state, typeid(T).name()); |
111 | 0 | ASSERT(lua_istable(state, -1)); |
112 | 0 | lua_setmetatable(state, -2); |
113 | |
|
114 | 0 | return alignAndCast<T>(mem); |
115 | 0 | } Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BufferWrapper* Envoy::Extensions::Filters::Common::Lua::allocateLuaUserData<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper* Envoy::Extensions::Filters::Common::Lua::allocateLuaUserData<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper* Envoy::Extensions::Filters::Common::Lua::allocateLuaUserData<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper* Envoy::Extensions::Filters::Common::Lua::allocateLuaUserData<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper* Envoy::Extensions::Filters::Common::Lua::allocateLuaUserData<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper* Envoy::Extensions::Filters::Common::Lua::allocateLuaUserData<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper* Envoy::Extensions::Filters::Common::Lua::allocateLuaUserData<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator* Envoy::Extensions::Filters::Common::Lua::allocateLuaUserData<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper* Envoy::Extensions::Filters::Common::Lua::allocateLuaUserData<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper* Envoy::Extensions::Filters::Common::Lua::allocateLuaUserData<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>(lua_State*) Unexecuted instantiation: Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator* Envoy::Extensions::Filters::Common::Lua::allocateLuaUserData<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator* Envoy::Extensions::Filters::Common::Lua::allocateLuaUserData<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>(lua_State*) |
116 | | |
117 | | /** |
118 | | * This is the base class for all C++ objects that we expose out to Lua. The goal is to hide as |
119 | | * much ugliness as possible. In general, to use this, do the following: |
120 | | * 1) Make your class derive from BaseLuaObject<YourClass> |
121 | | * 2) Define methods using DECLARE_LUA_FUNCTION* macros |
122 | | * 3) Export your functions by declaring a static exportedFunctions() method in your class. |
123 | | * 4) Optionally manage "death" status on your object. (See checkDead() and markDead() below). |
124 | | * 5) Generally you will want to hold your objects inside a LuaRef or a LuaDeathRef. See below |
125 | | * for more information on those containers. |
126 | | * |
127 | | * It's very important to understand the Lua memory model: Once an object is created, *it is |
128 | | * owned by Lua*. Lua can GC it at any time. If you want to make sure that does not happen, you |
129 | | * must hold a ref to it in C++, generally via LuaRef or LuaDeathRef. |
130 | | */ |
131 | | template <class T> class BaseLuaObject : protected Logger::Loggable<Logger::Id::lua> { |
132 | | public: |
133 | | using ExportedFunctions = std::vector<std::pair<const char*, lua_CFunction>>; |
134 | | |
135 | 0 | virtual ~BaseLuaObject() = default; Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::~BaseLuaObject() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::~BaseLuaObject() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::~BaseLuaObject() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::~BaseLuaObject() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::~BaseLuaObject() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::~BaseLuaObject() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::~BaseLuaObject() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::~BaseLuaObject() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::~BaseLuaObject() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::~BaseLuaObject() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::~BaseLuaObject() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::~BaseLuaObject() |
136 | | |
137 | | /** |
138 | | * Create a new object of this type, owned by Lua. This type must have previously been registered |
139 | | * via the registerType() routine below. |
140 | | * @param state supplies the owning Lua state. |
141 | | * @param args supplies the variadic constructor arguments for the object. |
142 | | * @return a pair containing a pointer to the new object and the state it was created with. (This |
143 | | * is done for convenience when passing a created object to a LuaRef or a LuaDeathRef. |
144 | | */ |
145 | | template <typename... ConstructorArgs> |
146 | 0 | static std::pair<T*, lua_State*> create(lua_State* state, ConstructorArgs&&... args) { |
147 | | // Memory is allocated via Lua and it is raw. We use placement new to run the constructor. |
148 | 0 | T* mem = allocateLuaUserData<T>(state); |
149 | 0 | ENVOY_LOG(trace, "creating {} at {}", typeid(T).name(), static_cast<void*>(mem)); |
150 | 0 | return {new (mem) T(std::forward<ConstructorArgs>(args)...), state}; |
151 | 0 | } Unexecuted instantiation: std::__1::pair<Envoy::Extensions::Filters::Common::Lua::BufferWrapper*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::create<Envoy::Http::RequestOrResponseHeaderMap&, Envoy::Buffer::Instance&>(lua_State*, Envoy::Http::RequestOrResponseHeaderMap&, Envoy::Buffer::Instance&) Unexecuted instantiation: lua_filter.cc:std::__1::pair<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::create<Envoy::Http::RequestOrResponseHeaderMap&, Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::luaHeaders(lua_State*)::$_9>(lua_State*, Envoy::Http::RequestOrResponseHeaderMap&, Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::luaHeaders(lua_State*)::$_9&&) Unexecuted instantiation: lua_filter.cc:std::__1::pair<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::create<Envoy::Http::HeaderMap&, Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::luaTrailers(lua_State*)::$_10>(lua_State*, Envoy::Http::HeaderMap&, Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper::luaTrailers(lua_State*)::$_10&&) Unexecuted instantiation: std::__1::pair<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::create<google::protobuf::Struct const&>(lua_State*, google::protobuf::Struct const&) Unexecuted instantiation: std::__1::pair<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::create<Envoy::StreamInfo::StreamInfo&>(lua_State*, Envoy::StreamInfo::StreamInfo&) Unexecuted instantiation: std::__1::pair<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::create<Envoy::Network::Connection const*>(lua_State*, Envoy::Network::Connection const*&&) Unexecuted instantiation: std::__1::pair<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::create<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(lua_State*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Unexecuted instantiation: std::__1::pair<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::create<char const*&>(lua_State*, char const*&) Unexecuted instantiation: std::__1::pair<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::create<Envoy::Extensions::Filters::Common::Lua::Coroutine&, Envoy::Http::RequestOrResponseHeaderMap&, bool&, Envoy::Extensions::HttpFilters::Lua::Filter&, Envoy::Extensions::HttpFilters::Lua::FilterCallbacks&, Envoy::TimeSource&>(lua_State*, Envoy::Extensions::Filters::Common::Lua::Coroutine&, Envoy::Http::RequestOrResponseHeaderMap&, bool&, Envoy::Extensions::HttpFilters::Lua::Filter&, Envoy::Extensions::HttpFilters::Lua::FilterCallbacks&, Envoy::TimeSource&) Unexecuted instantiation: std::__1::pair<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::create<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper&>(lua_State*, Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper&) Unexecuted instantiation: std::__1::pair<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::create<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper&>(lua_State*, Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper&) Unexecuted instantiation: std::__1::pair<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::create<Envoy::Ssl::ConnectionInfo const&>(lua_State*, Envoy::Ssl::ConnectionInfo const&) Unexecuted instantiation: std::__1::pair<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::create<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper&>(lua_State*, Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper&) Unexecuted instantiation: std::__1::pair<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator*, lua_State*> Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::create<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper&>(lua_State*, Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper&) |
152 | | |
153 | | /** |
154 | | * Register a type with Lua. |
155 | | * @param state supplies the state to register with. |
156 | | */ |
157 | 5.68k | static void registerType(lua_State* state) { |
158 | 5.68k | std::vector<luaL_Reg> to_register; |
159 | | |
160 | | // Fetch all of the functions to be exported to Lua so that we can register them in the |
161 | | // metatable. |
162 | 5.68k | ExportedFunctions functions = T::exportedFunctions(); |
163 | 30.3k | for (auto function : functions) { |
164 | 30.3k | to_register.push_back({function.first, function.second}); |
165 | 30.3k | } |
166 | | |
167 | | // Always register a __gc method so that we can run the object's destructor. We do this |
168 | | // manually because the memory is raw and was allocated by Lua. |
169 | 5.68k | to_register.push_back( |
170 | 5.68k | {"__gc", [](lua_State* state) { |
171 | 0 | T* object = alignAndCast<T>(luaL_checkudata(state, 1, typeid(T).name())); |
172 | 0 | ENVOY_LOG(trace, "destroying {} at {}", typeid(T).name(), static_cast<void*>(object)); |
173 | 0 | object->~T(); |
174 | 0 | return 0; |
175 | 0 | }}); Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::registerType(lua_State*)::{lambda(lua_State*)#1}::operator()(lua_State*) const Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::registerType(lua_State*)::{lambda(lua_State*)#1}::operator()(lua_State*) const Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::registerType(lua_State*)::{lambda(lua_State*)#1}::operator()(lua_State*) const Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::registerType(lua_State*)::{lambda(lua_State*)#1}::operator()(lua_State*) const Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::registerType(lua_State*)::{lambda(lua_State*)#1}::operator()(lua_State*) const Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::registerType(lua_State*)::{lambda(lua_State*)#1}::operator()(lua_State*) const Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::registerType(lua_State*)::{lambda(lua_State*)#1}::operator()(lua_State*) const Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::registerType(lua_State*)::{lambda(lua_State*)#1}::operator()(lua_State*) const Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::registerType(lua_State*)::{lambda(lua_State*)#1}::operator()(lua_State*) const Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::registerType(lua_State*)::{lambda(lua_State*)#1}::operator()(lua_State*) const Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::registerType(lua_State*)::{lambda(lua_State*)#1}::operator()(lua_State*) const Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::registerType(lua_State*)::{lambda(lua_State*)#1}::operator()(lua_State*) const |
176 | | |
177 | | // Add the sentinel. |
178 | 5.68k | to_register.push_back({nullptr, nullptr}); |
179 | | |
180 | | // Register the type by creating a new metatable, setting __index to itself, and then |
181 | | // performing the register. |
182 | 5.68k | ENVOY_LOG(debug, "registering new type: {}", typeid(T).name()); |
183 | 5.68k | int rc = luaL_newmetatable(state, typeid(T).name()); |
184 | 5.68k | ASSERT(rc == 1); |
185 | | |
186 | 5.68k | lua_pushvalue(state, -1); |
187 | 5.68k | lua_setfield(state, -2, "__index"); |
188 | 5.68k | luaL_register(state, nullptr, to_register.data()); |
189 | 5.68k | } Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::registerType(lua_State*) Line | Count | Source | 157 | 474 | static void registerType(lua_State* state) { | 158 | 474 | std::vector<luaL_Reg> to_register; | 159 | | | 160 | | // Fetch all of the functions to be exported to Lua so that we can register them in the | 161 | | // metatable. | 162 | 474 | ExportedFunctions functions = T::exportedFunctions(); | 163 | 1.42k | for (auto function : functions) { | 164 | 1.42k | to_register.push_back({function.first, function.second}); | 165 | 1.42k | } | 166 | | | 167 | | // Always register a __gc method so that we can run the object's destructor. We do this | 168 | | // manually because the memory is raw and was allocated by Lua. | 169 | 474 | to_register.push_back( | 170 | 474 | {"__gc", [](lua_State* state) { | 171 | 474 | T* object = alignAndCast<T>(luaL_checkudata(state, 1, typeid(T).name())); | 172 | 474 | ENVOY_LOG(trace, "destroying {} at {}", typeid(T).name(), static_cast<void*>(object)); | 173 | 474 | object->~T(); | 174 | 474 | return 0; | 175 | 474 | }}); | 176 | | | 177 | | // Add the sentinel. | 178 | 474 | to_register.push_back({nullptr, nullptr}); | 179 | | | 180 | | // Register the type by creating a new metatable, setting __index to itself, and then | 181 | | // performing the register. | 182 | 474 | ENVOY_LOG(debug, "registering new type: {}", typeid(T).name()); | 183 | 474 | int rc = luaL_newmetatable(state, typeid(T).name()); | 184 | 474 | ASSERT(rc == 1); | 185 | | | 186 | 474 | lua_pushvalue(state, -1); | 187 | 474 | lua_setfield(state, -2, "__index"); | 188 | 474 | luaL_register(state, nullptr, to_register.data()); | 189 | 474 | } |
Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::registerType(lua_State*) Line | Count | Source | 157 | 474 | static void registerType(lua_State* state) { | 158 | 474 | std::vector<luaL_Reg> to_register; | 159 | | | 160 | | // Fetch all of the functions to be exported to Lua so that we can register them in the | 161 | | // metatable. | 162 | 474 | ExportedFunctions functions = T::exportedFunctions(); | 163 | 948 | for (auto function : functions) { | 164 | 948 | to_register.push_back({function.first, function.second}); | 165 | 948 | } | 166 | | | 167 | | // Always register a __gc method so that we can run the object's destructor. We do this | 168 | | // manually because the memory is raw and was allocated by Lua. | 169 | 474 | to_register.push_back( | 170 | 474 | {"__gc", [](lua_State* state) { | 171 | 474 | T* object = alignAndCast<T>(luaL_checkudata(state, 1, typeid(T).name())); | 172 | 474 | ENVOY_LOG(trace, "destroying {} at {}", typeid(T).name(), static_cast<void*>(object)); | 173 | 474 | object->~T(); | 174 | 474 | return 0; | 175 | 474 | }}); | 176 | | | 177 | | // Add the sentinel. | 178 | 474 | to_register.push_back({nullptr, nullptr}); | 179 | | | 180 | | // Register the type by creating a new metatable, setting __index to itself, and then | 181 | | // performing the register. | 182 | 474 | ENVOY_LOG(debug, "registering new type: {}", typeid(T).name()); | 183 | 474 | int rc = luaL_newmetatable(state, typeid(T).name()); | 184 | 474 | ASSERT(rc == 1); | 185 | | | 186 | 474 | lua_pushvalue(state, -1); | 187 | 474 | lua_setfield(state, -2, "__index"); | 188 | 474 | luaL_register(state, nullptr, to_register.data()); | 189 | 474 | } |
Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::registerType(lua_State*) Line | Count | Source | 157 | 474 | static void registerType(lua_State* state) { | 158 | 474 | std::vector<luaL_Reg> to_register; | 159 | | | 160 | | // Fetch all of the functions to be exported to Lua so that we can register them in the | 161 | | // metatable. | 162 | 474 | ExportedFunctions functions = T::exportedFunctions(); | 163 | 474 | for (auto function : functions) { | 164 | 0 | to_register.push_back({function.first, function.second}); | 165 | 0 | } | 166 | | | 167 | | // Always register a __gc method so that we can run the object's destructor. We do this | 168 | | // manually because the memory is raw and was allocated by Lua. | 169 | 474 | to_register.push_back( | 170 | 474 | {"__gc", [](lua_State* state) { | 171 | 474 | T* object = alignAndCast<T>(luaL_checkudata(state, 1, typeid(T).name())); | 172 | 474 | ENVOY_LOG(trace, "destroying {} at {}", typeid(T).name(), static_cast<void*>(object)); | 173 | 474 | object->~T(); | 174 | 474 | return 0; | 175 | 474 | }}); | 176 | | | 177 | | // Add the sentinel. | 178 | 474 | to_register.push_back({nullptr, nullptr}); | 179 | | | 180 | | // Register the type by creating a new metatable, setting __index to itself, and then | 181 | | // performing the register. | 182 | 474 | ENVOY_LOG(debug, "registering new type: {}", typeid(T).name()); | 183 | 474 | int rc = luaL_newmetatable(state, typeid(T).name()); | 184 | 474 | ASSERT(rc == 1); | 185 | | | 186 | 474 | lua_pushvalue(state, -1); | 187 | 474 | lua_setfield(state, -2, "__index"); | 188 | 474 | luaL_register(state, nullptr, to_register.data()); | 189 | 474 | } |
Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::registerType(lua_State*) Line | Count | Source | 157 | 474 | static void registerType(lua_State* state) { | 158 | 474 | std::vector<luaL_Reg> to_register; | 159 | | | 160 | | // Fetch all of the functions to be exported to Lua so that we can register them in the | 161 | | // metatable. | 162 | 474 | ExportedFunctions functions = T::exportedFunctions(); | 163 | 474 | for (auto function : functions) { | 164 | 474 | to_register.push_back({function.first, function.second}); | 165 | 474 | } | 166 | | | 167 | | // Always register a __gc method so that we can run the object's destructor. We do this | 168 | | // manually because the memory is raw and was allocated by Lua. | 169 | 474 | to_register.push_back( | 170 | 474 | {"__gc", [](lua_State* state) { | 171 | 474 | T* object = alignAndCast<T>(luaL_checkudata(state, 1, typeid(T).name())); | 172 | 474 | ENVOY_LOG(trace, "destroying {} at {}", typeid(T).name(), static_cast<void*>(object)); | 173 | 474 | object->~T(); | 174 | 474 | return 0; | 175 | 474 | }}); | 176 | | | 177 | | // Add the sentinel. | 178 | 474 | to_register.push_back({nullptr, nullptr}); | 179 | | | 180 | | // Register the type by creating a new metatable, setting __index to itself, and then | 181 | | // performing the register. | 182 | 474 | ENVOY_LOG(debug, "registering new type: {}", typeid(T).name()); | 183 | 474 | int rc = luaL_newmetatable(state, typeid(T).name()); | 184 | 474 | ASSERT(rc == 1); | 185 | | | 186 | 474 | lua_pushvalue(state, -1); | 187 | 474 | lua_setfield(state, -2, "__index"); | 188 | 474 | luaL_register(state, nullptr, to_register.data()); | 189 | 474 | } |
Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::registerType(lua_State*) Line | Count | Source | 157 | 474 | static void registerType(lua_State* state) { | 158 | 474 | std::vector<luaL_Reg> to_register; | 159 | | | 160 | | // Fetch all of the functions to be exported to Lua so that we can register them in the | 161 | | // metatable. | 162 | 474 | ExportedFunctions functions = T::exportedFunctions(); | 163 | 9.00k | for (auto function : functions) { | 164 | 9.00k | to_register.push_back({function.first, function.second}); | 165 | 9.00k | } | 166 | | | 167 | | // Always register a __gc method so that we can run the object's destructor. We do this | 168 | | // manually because the memory is raw and was allocated by Lua. | 169 | 474 | to_register.push_back( | 170 | 474 | {"__gc", [](lua_State* state) { | 171 | 474 | T* object = alignAndCast<T>(luaL_checkudata(state, 1, typeid(T).name())); | 172 | 474 | ENVOY_LOG(trace, "destroying {} at {}", typeid(T).name(), static_cast<void*>(object)); | 173 | 474 | object->~T(); | 174 | 474 | return 0; | 175 | 474 | }}); | 176 | | | 177 | | // Add the sentinel. | 178 | 474 | to_register.push_back({nullptr, nullptr}); | 179 | | | 180 | | // Register the type by creating a new metatable, setting __index to itself, and then | 181 | | // performing the register. | 182 | 474 | ENVOY_LOG(debug, "registering new type: {}", typeid(T).name()); | 183 | 474 | int rc = luaL_newmetatable(state, typeid(T).name()); | 184 | 474 | ASSERT(rc == 1); | 185 | | | 186 | 474 | lua_pushvalue(state, -1); | 187 | 474 | lua_setfield(state, -2, "__index"); | 188 | 474 | luaL_register(state, nullptr, to_register.data()); | 189 | 474 | } |
Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::registerType(lua_State*) Line | Count | Source | 157 | 474 | static void registerType(lua_State* state) { | 158 | 474 | std::vector<luaL_Reg> to_register; | 159 | | | 160 | | // Fetch all of the functions to be exported to Lua so that we can register them in the | 161 | | // metatable. | 162 | 474 | ExportedFunctions functions = T::exportedFunctions(); | 163 | 3.79k | for (auto function : functions) { | 164 | 3.79k | to_register.push_back({function.first, function.second}); | 165 | 3.79k | } | 166 | | | 167 | | // Always register a __gc method so that we can run the object's destructor. We do this | 168 | | // manually because the memory is raw and was allocated by Lua. | 169 | 474 | to_register.push_back( | 170 | 474 | {"__gc", [](lua_State* state) { | 171 | 474 | T* object = alignAndCast<T>(luaL_checkudata(state, 1, typeid(T).name())); | 172 | 474 | ENVOY_LOG(trace, "destroying {} at {}", typeid(T).name(), static_cast<void*>(object)); | 173 | 474 | object->~T(); | 174 | 474 | return 0; | 175 | 474 | }}); | 176 | | | 177 | | // Add the sentinel. | 178 | 474 | to_register.push_back({nullptr, nullptr}); | 179 | | | 180 | | // Register the type by creating a new metatable, setting __index to itself, and then | 181 | | // performing the register. | 182 | 474 | ENVOY_LOG(debug, "registering new type: {}", typeid(T).name()); | 183 | 474 | int rc = luaL_newmetatable(state, typeid(T).name()); | 184 | 474 | ASSERT(rc == 1); | 185 | | | 186 | 474 | lua_pushvalue(state, -1); | 187 | 474 | lua_setfield(state, -2, "__index"); | 188 | 474 | luaL_register(state, nullptr, to_register.data()); | 189 | 474 | } |
Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::registerType(lua_State*) Line | Count | Source | 157 | 474 | static void registerType(lua_State* state) { | 158 | 474 | std::vector<luaL_Reg> to_register; | 159 | | | 160 | | // Fetch all of the functions to be exported to Lua so that we can register them in the | 161 | | // metatable. | 162 | 474 | ExportedFunctions functions = T::exportedFunctions(); | 163 | 474 | for (auto function : functions) { | 164 | 0 | to_register.push_back({function.first, function.second}); | 165 | 0 | } | 166 | | | 167 | | // Always register a __gc method so that we can run the object's destructor. We do this | 168 | | // manually because the memory is raw and was allocated by Lua. | 169 | 474 | to_register.push_back( | 170 | 474 | {"__gc", [](lua_State* state) { | 171 | 474 | T* object = alignAndCast<T>(luaL_checkudata(state, 1, typeid(T).name())); | 172 | 474 | ENVOY_LOG(trace, "destroying {} at {}", typeid(T).name(), static_cast<void*>(object)); | 173 | 474 | object->~T(); | 174 | 474 | return 0; | 175 | 474 | }}); | 176 | | | 177 | | // Add the sentinel. | 178 | 474 | to_register.push_back({nullptr, nullptr}); | 179 | | | 180 | | // Register the type by creating a new metatable, setting __index to itself, and then | 181 | | // performing the register. | 182 | 474 | ENVOY_LOG(debug, "registering new type: {}", typeid(T).name()); | 183 | 474 | int rc = luaL_newmetatable(state, typeid(T).name()); | 184 | 474 | ASSERT(rc == 1); | 185 | | | 186 | 474 | lua_pushvalue(state, -1); | 187 | 474 | lua_setfield(state, -2, "__index"); | 188 | 474 | luaL_register(state, nullptr, to_register.data()); | 189 | 474 | } |
Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::registerType(lua_State*) Line | Count | Source | 157 | 474 | static void registerType(lua_State* state) { | 158 | 474 | std::vector<luaL_Reg> to_register; | 159 | | | 160 | | // Fetch all of the functions to be exported to Lua so that we can register them in the | 161 | | // metatable. | 162 | 474 | ExportedFunctions functions = T::exportedFunctions(); | 163 | 3.31k | for (auto function : functions) { | 164 | 3.31k | to_register.push_back({function.first, function.second}); | 165 | 3.31k | } | 166 | | | 167 | | // Always register a __gc method so that we can run the object's destructor. We do this | 168 | | // manually because the memory is raw and was allocated by Lua. | 169 | 474 | to_register.push_back( | 170 | 474 | {"__gc", [](lua_State* state) { | 171 | 474 | T* object = alignAndCast<T>(luaL_checkudata(state, 1, typeid(T).name())); | 172 | 474 | ENVOY_LOG(trace, "destroying {} at {}", typeid(T).name(), static_cast<void*>(object)); | 173 | 474 | object->~T(); | 174 | 474 | return 0; | 175 | 474 | }}); | 176 | | | 177 | | // Add the sentinel. | 178 | 474 | to_register.push_back({nullptr, nullptr}); | 179 | | | 180 | | // Register the type by creating a new metatable, setting __index to itself, and then | 181 | | // performing the register. | 182 | 474 | ENVOY_LOG(debug, "registering new type: {}", typeid(T).name()); | 183 | 474 | int rc = luaL_newmetatable(state, typeid(T).name()); | 184 | 474 | ASSERT(rc == 1); | 185 | | | 186 | 474 | lua_pushvalue(state, -1); | 187 | 474 | lua_setfield(state, -2, "__index"); | 188 | 474 | luaL_register(state, nullptr, to_register.data()); | 189 | 474 | } |
Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::registerType(lua_State*) Line | Count | Source | 157 | 474 | static void registerType(lua_State* state) { | 158 | 474 | std::vector<luaL_Reg> to_register; | 159 | | | 160 | | // Fetch all of the functions to be exported to Lua so that we can register them in the | 161 | | // metatable. | 162 | 474 | ExportedFunctions functions = T::exportedFunctions(); | 163 | 1.42k | for (auto function : functions) { | 164 | 1.42k | to_register.push_back({function.first, function.second}); | 165 | 1.42k | } | 166 | | | 167 | | // Always register a __gc method so that we can run the object's destructor. We do this | 168 | | // manually because the memory is raw and was allocated by Lua. | 169 | 474 | to_register.push_back( | 170 | 474 | {"__gc", [](lua_State* state) { | 171 | 474 | T* object = alignAndCast<T>(luaL_checkudata(state, 1, typeid(T).name())); | 172 | 474 | ENVOY_LOG(trace, "destroying {} at {}", typeid(T).name(), static_cast<void*>(object)); | 173 | 474 | object->~T(); | 174 | 474 | return 0; | 175 | 474 | }}); | 176 | | | 177 | | // Add the sentinel. | 178 | 474 | to_register.push_back({nullptr, nullptr}); | 179 | | | 180 | | // Register the type by creating a new metatable, setting __index to itself, and then | 181 | | // performing the register. | 182 | 474 | ENVOY_LOG(debug, "registering new type: {}", typeid(T).name()); | 183 | 474 | int rc = luaL_newmetatable(state, typeid(T).name()); | 184 | 474 | ASSERT(rc == 1); | 185 | | | 186 | 474 | lua_pushvalue(state, -1); | 187 | 474 | lua_setfield(state, -2, "__index"); | 188 | 474 | luaL_register(state, nullptr, to_register.data()); | 189 | 474 | } |
Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::registerType(lua_State*) Line | Count | Source | 157 | 474 | static void registerType(lua_State* state) { | 158 | 474 | std::vector<luaL_Reg> to_register; | 159 | | | 160 | | // Fetch all of the functions to be exported to Lua so that we can register them in the | 161 | | // metatable. | 162 | 474 | ExportedFunctions functions = T::exportedFunctions(); | 163 | 474 | for (auto function : functions) { | 164 | 0 | to_register.push_back({function.first, function.second}); | 165 | 0 | } | 166 | | | 167 | | // Always register a __gc method so that we can run the object's destructor. We do this | 168 | | // manually because the memory is raw and was allocated by Lua. | 169 | 474 | to_register.push_back( | 170 | 474 | {"__gc", [](lua_State* state) { | 171 | 474 | T* object = alignAndCast<T>(luaL_checkudata(state, 1, typeid(T).name())); | 172 | 474 | ENVOY_LOG(trace, "destroying {} at {}", typeid(T).name(), static_cast<void*>(object)); | 173 | 474 | object->~T(); | 174 | 474 | return 0; | 175 | 474 | }}); | 176 | | | 177 | | // Add the sentinel. | 178 | 474 | to_register.push_back({nullptr, nullptr}); | 179 | | | 180 | | // Register the type by creating a new metatable, setting __index to itself, and then | 181 | | // performing the register. | 182 | 474 | ENVOY_LOG(debug, "registering new type: {}", typeid(T).name()); | 183 | 474 | int rc = luaL_newmetatable(state, typeid(T).name()); | 184 | 474 | ASSERT(rc == 1); | 185 | | | 186 | 474 | lua_pushvalue(state, -1); | 187 | 474 | lua_setfield(state, -2, "__index"); | 188 | 474 | luaL_register(state, nullptr, to_register.data()); | 189 | 474 | } |
Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::registerType(lua_State*) Line | Count | Source | 157 | 474 | static void registerType(lua_State* state) { | 158 | 474 | std::vector<luaL_Reg> to_register; | 159 | | | 160 | | // Fetch all of the functions to be exported to Lua so that we can register them in the | 161 | | // metatable. | 162 | 474 | ExportedFunctions functions = T::exportedFunctions(); | 163 | 9.48k | for (auto function : functions) { | 164 | 9.48k | to_register.push_back({function.first, function.second}); | 165 | 9.48k | } | 166 | | | 167 | | // Always register a __gc method so that we can run the object's destructor. We do this | 168 | | // manually because the memory is raw and was allocated by Lua. | 169 | 474 | to_register.push_back( | 170 | 474 | {"__gc", [](lua_State* state) { | 171 | 474 | T* object = alignAndCast<T>(luaL_checkudata(state, 1, typeid(T).name())); | 172 | 474 | ENVOY_LOG(trace, "destroying {} at {}", typeid(T).name(), static_cast<void*>(object)); | 173 | 474 | object->~T(); | 174 | 474 | return 0; | 175 | 474 | }}); | 176 | | | 177 | | // Add the sentinel. | 178 | 474 | to_register.push_back({nullptr, nullptr}); | 179 | | | 180 | | // Register the type by creating a new metatable, setting __index to itself, and then | 181 | | // performing the register. | 182 | 474 | ENVOY_LOG(debug, "registering new type: {}", typeid(T).name()); | 183 | 474 | int rc = luaL_newmetatable(state, typeid(T).name()); | 184 | 474 | ASSERT(rc == 1); | 185 | | | 186 | 474 | lua_pushvalue(state, -1); | 187 | 474 | lua_setfield(state, -2, "__index"); | 188 | 474 | luaL_register(state, nullptr, to_register.data()); | 189 | 474 | } |
Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::registerType(lua_State*) Line | Count | Source | 157 | 474 | static void registerType(lua_State* state) { | 158 | 474 | std::vector<luaL_Reg> to_register; | 159 | | | 160 | | // Fetch all of the functions to be exported to Lua so that we can register them in the | 161 | | // metatable. | 162 | 474 | ExportedFunctions functions = T::exportedFunctions(); | 163 | 474 | for (auto function : functions) { | 164 | 474 | to_register.push_back({function.first, function.second}); | 165 | 474 | } | 166 | | | 167 | | // Always register a __gc method so that we can run the object's destructor. We do this | 168 | | // manually because the memory is raw and was allocated by Lua. | 169 | 474 | to_register.push_back( | 170 | 474 | {"__gc", [](lua_State* state) { | 171 | 474 | T* object = alignAndCast<T>(luaL_checkudata(state, 1, typeid(T).name())); | 172 | 474 | ENVOY_LOG(trace, "destroying {} at {}", typeid(T).name(), static_cast<void*>(object)); | 173 | 474 | object->~T(); | 174 | 474 | return 0; | 175 | 474 | }}); | 176 | | | 177 | | // Add the sentinel. | 178 | 474 | to_register.push_back({nullptr, nullptr}); | 179 | | | 180 | | // Register the type by creating a new metatable, setting __index to itself, and then | 181 | | // performing the register. | 182 | 474 | ENVOY_LOG(debug, "registering new type: {}", typeid(T).name()); | 183 | 474 | int rc = luaL_newmetatable(state, typeid(T).name()); | 184 | 474 | ASSERT(rc == 1); | 185 | | | 186 | 474 | lua_pushvalue(state, -1); | 187 | 474 | lua_setfield(state, -2, "__index"); | 188 | 474 | luaL_register(state, nullptr, to_register.data()); | 189 | 474 | } |
|
190 | | |
191 | | /** |
192 | | * This function is called as part of the DECLARE_LUA_FUNCTION* macros. The idea here is that |
193 | | * we cannot control when Lua destroys things. However, we may expose wrappers to a script that |
194 | | * should not be used after some event. This allows us to mark objects as dead so that if they |
195 | | * are used again they will throw a Lua error and not reach our code. |
196 | | * @param state supplies the calling LuaState. |
197 | | */ |
198 | 0 | int checkDead(lua_State* state) { |
199 | 0 | if (dead_) { |
200 | 0 | return luaL_error(state, "object used outside of proper scope"); |
201 | 0 | } |
202 | 0 | return 0; |
203 | 0 | } Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::checkDead(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::checkDead(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::checkDead(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::checkDead(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::checkDead(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::checkDead(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::checkDead(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::checkDead(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::checkDead(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::checkDead(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::checkDead(lua_State*) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::checkDead(lua_State*) |
204 | | |
205 | | /** |
206 | | * Mark an object as dead so that a checkDead() call will throw an error. See checkDead(). |
207 | | */ |
208 | 0 | void markDead() { |
209 | 0 | dead_ = true; |
210 | 0 | ENVOY_LOG(trace, "marking dead {} at {}", typeid(T).name(), static_cast<void*>(this)); |
211 | 0 | onMarkDead(); |
212 | 0 | } Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::markDead() |
213 | | |
214 | | /** |
215 | | * Mark an object as live so that a checkDead() call will not throw an error. See checkDead(). |
216 | | */ |
217 | 0 | void markLive() { |
218 | 0 | dead_ = false; |
219 | 0 | ENVOY_LOG(trace, "marking live {} at {}", typeid(T).name(), static_cast<void*>(this)); |
220 | 0 | onMarkLive(); |
221 | 0 | } |
222 | | |
223 | | protected: |
224 | | /** |
225 | | * Called from markDead() when an object is marked dead. This is effectively a C++ destructor for |
226 | | * Lua/C objects. Objects can perform inline cleanup or mark other objects as dead if needed. It |
227 | | * can also be used to protect objects from use if they get assigned to a global variable and |
228 | | * used across coroutines. |
229 | | */ |
230 | 0 | virtual void onMarkDead() {} Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::onMarkDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::onMarkDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::onMarkDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::onMarkDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::onMarkDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::onMarkDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::onMarkDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::onMarkDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::onMarkDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::onMarkDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::onMarkDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::onMarkDead() |
231 | | |
232 | | /** |
233 | | * Called from markLive() when an object is marked live. This is a companion to onMarkDead(). See |
234 | | * the comments there. |
235 | | */ |
236 | 0 | virtual void onMarkLive() {} Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::onMarkLive() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::onMarkLive() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::onMarkLive() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::onMarkLive() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::onMarkLive() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::onMarkLive() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::onMarkLive() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::onMarkLive() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::onMarkLive() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::onMarkLive() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::onMarkLive() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::onMarkLive() |
237 | | |
238 | | private: |
239 | | bool dead_{}; |
240 | | }; |
241 | | |
242 | | /** |
243 | | * This is basically a Lua smart pointer. The idea is that given a Lua object, if we want to |
244 | | * guarantee that Lua won't destroy it, we need to reference it. This wraps the reference |
245 | | * functionality. While a LuaRef owns an object it's guaranteed that Lua will not GC it. |
246 | | * TODO(mattklein123): Add dedicated unit tests. This will require mocking a Lua state. |
247 | | */ |
248 | | template <typename T> class LuaRef { |
249 | | public: |
250 | | /** |
251 | | * Create an empty LuaRef. |
252 | | */ |
253 | 182 | LuaRef() { reset(); } Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::LuaRef() Line | Count | Source | 253 | 182 | LuaRef() { reset(); } |
Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::LuaRef() |
254 | | |
255 | | /** |
256 | | * Create a LuaRef from an object. |
257 | | * @param object supplies the object. Generally this is the return value from a Object::create() |
258 | | * call. The object must be at the top of the Lua stack. |
259 | | * @param leave_on_stack supplies whether to leave the object on the stack or not when the ref |
260 | | * is constructed. |
261 | | */ |
262 | 0 | LuaRef(const std::pair<T*, lua_State*>& object, bool leave_on_stack) { |
263 | 0 | reset(object, leave_on_stack); |
264 | 0 | } Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::LuaRef(std::__1::pair<Envoy::Extensions::Filters::Common::Lua::BufferWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<lua_State>::LuaRef(std::__1::pair<lua_State*, lua_State*> const&, bool) |
265 | | |
266 | 182 | ~LuaRef() { unref(); } Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::~LuaRef() Line | Count | Source | 266 | 182 | ~LuaRef() { unref(); } |
Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<lua_State>::~LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::~LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::~LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::~LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::~LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::~LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::~LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::~LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::~LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::~LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::~LuaRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::~LuaRef() |
267 | 388 | T* get() { return object_.first; } Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<lua_State>::get() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::get() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::get() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::get() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::get() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::get() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::get() Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::get() Line | Count | Source | 267 | 388 | T* get() { return object_.first; } |
Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::get() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::get() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::get() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::get() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::get() |
268 | | |
269 | | /** |
270 | | * Same as the LuaRef non-default constructor, but post-construction. |
271 | | */ |
272 | 0 | void reset(const std::pair<T*, lua_State*>& object, bool leave_on_stack) { |
273 | 0 | unref(); |
274 | |
|
275 | 0 | if (leave_on_stack) { |
276 | 0 | lua_pushvalue(object.second, -1); |
277 | 0 | } |
278 | |
|
279 | 0 | object_ = object; |
280 | 0 | ref_ = luaL_ref(object_.second, LUA_REGISTRYINDEX); |
281 | 0 | ASSERT(ref_ != LUA_REFNIL); |
282 | 0 | } Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::reset(std::__1::pair<Envoy::Extensions::Filters::Common::Lua::BufferWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::reset(std::__1::pair<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::reset(std::__1::pair<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::reset(std::__1::pair<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::reset(std::__1::pair<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<lua_State>::reset(std::__1::pair<lua_State*, lua_State*> const&, bool) |
283 | | |
284 | | /** |
285 | | * Return a LuaRef to its default/empty state. |
286 | | */ |
287 | 182 | void reset() { |
288 | 182 | unref(); |
289 | 182 | object_ = std::pair<T*, lua_State*>{}; |
290 | 182 | ref_ = LUA_NOREF; |
291 | 182 | } Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::reset() Line | Count | Source | 287 | 182 | void reset() { | 288 | 182 | unref(); | 289 | 182 | object_ = std::pair<T*, lua_State*>{}; | 290 | 182 | ref_ = LUA_NOREF; | 291 | 182 | } |
Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::reset() |
292 | | |
293 | | /** |
294 | | * Push the referenced object back onto the stack. |
295 | | */ |
296 | 0 | void pushStack() { |
297 | 0 | ASSERT(object_.first); |
298 | 0 | lua_rawgeti(object_.second, LUA_REGISTRYINDEX, ref_); |
299 | 0 | } Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::pushStack() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::pushStack() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::pushStack() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::pushStack() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::pushStack() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::pushStack() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::pushStack() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::pushStack() |
300 | | |
301 | | protected: |
302 | 364 | void unref() { |
303 | 364 | if (object_.second != nullptr) { |
304 | 0 | luaL_unref(object_.second, LUA_REGISTRYINDEX, ref_); |
305 | 0 | } |
306 | 364 | } Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::unref() Line | Count | Source | 302 | 364 | void unref() { | 303 | 364 | if (object_.second != nullptr) { | 304 | 0 | luaL_unref(object_.second, LUA_REGISTRYINDEX, ref_); | 305 | 0 | } | 306 | 364 | } |
Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::unref() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::unref() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::unref() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::unref() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::unref() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<lua_State>::unref() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::unref() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::unref() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::unref() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::unref() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::unref() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaRef<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::unref() |
307 | | |
308 | | std::pair<T*, lua_State*> object_; |
309 | | int ref_; |
310 | | }; |
311 | | |
312 | | /** |
313 | | * This is a variant of LuaRef which also marks an object as dead during destruction. This is |
314 | | * useful if an object should not be used after the scope of the pcall() or resume(). |
315 | | * TODO(mattklein123): Add dedicated unit tests. This will require mocking a Lua state. |
316 | | */ |
317 | | template <typename T> class LuaDeathRef : public LuaRef<T> { |
318 | | public: |
319 | | using LuaRef<T>::LuaRef; |
320 | | |
321 | 182 | ~LuaDeathRef() { markDead(); } Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::~LuaDeathRef() Line | Count | Source | 321 | 182 | ~LuaDeathRef() { markDead(); } |
Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::~LuaDeathRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::~LuaDeathRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::~LuaDeathRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::~LuaDeathRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::~LuaDeathRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::~LuaDeathRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::~LuaDeathRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::~LuaDeathRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::~LuaDeathRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::~LuaDeathRef() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::~LuaDeathRef() |
322 | | |
323 | 182 | void markDead() { |
324 | 182 | if (this->object_.first) { |
325 | 0 | this->object_.first->markDead(); |
326 | 0 | } |
327 | 182 | } Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::markDead() Line | Count | Source | 323 | 182 | void markDead() { | 324 | 182 | if (this->object_.first) { | 325 | 0 | this->object_.first->markDead(); | 326 | 0 | } | 327 | 182 | } |
Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::markDead() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::markDead() |
328 | | |
329 | 0 | void markLive() { |
330 | 0 | if (this->object_.first) { |
331 | 0 | this->object_.first->markLive(); |
332 | 0 | } |
333 | 0 | } |
334 | | |
335 | 0 | void reset(const std::pair<T*, lua_State*>& object, bool leave_on_stack) { |
336 | 0 | markDead(); |
337 | 0 | LuaRef<T>::reset(object, leave_on_stack); |
338 | 0 | } Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::reset(std::__1::pair<Envoy::Extensions::Filters::Common::Lua::BufferWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::reset(std::__1::pair<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::reset(std::__1::pair<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::reset(std::__1::pair<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::reset(std::__1::pair<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator*, lua_State*> const&, bool) Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::reset(std::__1::pair<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator*, lua_State*> const&, bool) |
339 | | |
340 | 0 | void reset() { |
341 | 0 | markDead(); |
342 | 0 | LuaRef<T>::reset(); |
343 | 0 | } Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>::reset() Unexecuted instantiation: Envoy::Extensions::Filters::Common::Lua::LuaDeathRef<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>::reset() |
344 | | }; |
345 | | |
346 | | /** |
347 | | * This is a wrapper for a Lua coroutine. Lua intermixes coroutine and "thread." Lua does not have |
348 | | * real threads, only cooperatively scheduled coroutines. |
349 | | */ |
350 | | class Coroutine : Logger::Loggable<Logger::Id::lua> { |
351 | | public: |
352 | | enum class State { NotStarted, Yielded, Finished }; |
353 | | |
354 | | Coroutine(const std::pair<lua_State*, lua_State*>& new_thread_state); |
355 | 0 | lua_State* luaState() { return coroutine_state_.get(); } |
356 | 0 | State state() { return state_; } |
357 | | |
358 | | /** |
359 | | * Start a coroutine. |
360 | | * @param function_ref supplies the previously registered function to call. Registered with |
361 | | * ThreadLocalState::registerGlobal(). |
362 | | * @param num_args supplies the number of arguments to start the coroutine with. They should be |
363 | | * on the stack already. |
364 | | * @param yield_callback supplies a callback that will be invoked if the coroutine yields. |
365 | | */ |
366 | | void start(int function_ref, int num_args, const std::function<void()>& yield_callback); |
367 | | |
368 | | /** |
369 | | * Resume a previously yielded coroutine. |
370 | | * @param num_args supplies the number of arguments to resume the coroutine with. They should be |
371 | | * on the stack already. |
372 | | * @param yield_callback supplies a callback that will be invoked if the coroutine yields. |
373 | | */ |
374 | | void resume(int num_args, const std::function<void()>& yield_callback); |
375 | | |
376 | | private: |
377 | | LuaRef<lua_State> coroutine_state_; |
378 | | State state_{State::NotStarted}; |
379 | | }; |
380 | | |
381 | | using CoroutinePtr = std::unique_ptr<Coroutine>; |
382 | | using Initializer = std::function<void(lua_State*)>; |
383 | | using InitializerList = std::vector<Initializer>; |
384 | | |
385 | | /** |
386 | | * This class wraps a Lua state that can be used safely across threads. The model is that every |
387 | | * worker gets its own independent state. There is no truly global state that a script can access. |
388 | | * This is something that might be provided in the future via an API (not via Lua itself). |
389 | | */ |
390 | | class ThreadLocalState : Logger::Loggable<Logger::Id::lua> { |
391 | | public: |
392 | | ThreadLocalState(const std::string& code, ThreadLocal::SlotAllocator& tls); |
393 | | |
394 | | /** |
395 | | * @return CoroutinePtr a new coroutine. |
396 | | */ |
397 | | CoroutinePtr createCoroutine(); |
398 | | |
399 | | /** |
400 | | * @return a global reference previously registered via registerGlobal(). This may return |
401 | | * LUA_REFNIL if there was no such global. |
402 | | * @param slot supplies the global slot/index to lookup. |
403 | | */ |
404 | | int getGlobalRef(uint64_t slot); |
405 | | |
406 | | /** |
407 | | * Register a global for later use. |
408 | | * @param global supplies the name of the global. |
409 | | * @param initializers supplies a collection of initializers. |
410 | | * @return a slot/index for later use with getGlobalRef(). |
411 | | */ |
412 | | uint64_t registerGlobal(const std::string& global, const InitializerList& initializers); |
413 | | |
414 | | /** |
415 | | * Register a type with the thread local state. After this call the type will be available on |
416 | | * all threaded workers. |
417 | | */ |
418 | 5.68k | template <class T> void registerType() { |
419 | 5.68k | tls_slot_->runOnAllThreads( |
420 | 5.68k | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>()::{lambda(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>)#1}::operator()(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>) const Line | Count | Source | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); |
Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>()::{lambda(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>)#1}::operator()(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>) const Line | Count | Source | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); |
Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>()::{lambda(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>)#1}::operator()(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>) const Line | Count | Source | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); |
Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>()::{lambda(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>)#1}::operator()(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>) const Line | Count | Source | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); |
Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>()::{lambda(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>)#1}::operator()(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>) const Line | Count | Source | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); |
Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>()::{lambda(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>)#1}::operator()(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>) const Line | Count | Source | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); |
Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>()::{lambda(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>)#1}::operator()(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>) const Line | Count | Source | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); |
Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>()::{lambda(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>)#1}::operator()(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>) const Line | Count | Source | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); |
Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>()::{lambda(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>)#1}::operator()(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>) const Line | Count | Source | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); |
Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>()::{lambda(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>)#1}::operator()(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>) const Line | Count | Source | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); |
Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>()::{lambda(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>)#1}::operator()(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>) const Line | Count | Source | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); |
Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>()::{lambda(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>)#1}::operator()(Envoy::OptRef<Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::LuaThreadLocal>) const Line | Count | Source | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); |
|
421 | 5.68k | } void Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::Filters::Common::Lua::BufferWrapper>() Line | Count | Source | 418 | 474 | template <class T> void registerType() { | 419 | 474 | tls_slot_->runOnAllThreads( | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); | 421 | 474 | } |
void Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::Filters::Common::Lua::MetadataMapWrapper>() Line | Count | Source | 418 | 474 | template <class T> void registerType() { | 419 | 474 | tls_slot_->runOnAllThreads( | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); | 421 | 474 | } |
void Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::Filters::Common::Lua::MetadataMapIterator>() Line | Count | Source | 418 | 474 | template <class T> void registerType() { | 419 | 474 | tls_slot_->runOnAllThreads( | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); | 421 | 474 | } |
void Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::Filters::Common::Lua::ConnectionWrapper>() Line | Count | Source | 418 | 474 | template <class T> void registerType() { | 419 | 474 | tls_slot_->runOnAllThreads( | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); | 421 | 474 | } |
void Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::Filters::Common::Lua::SslConnectionWrapper>() Line | Count | Source | 418 | 474 | template <class T> void registerType() { | 419 | 474 | tls_slot_->runOnAllThreads( | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); | 421 | 474 | } |
void Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::HeaderMapWrapper>() Line | Count | Source | 418 | 474 | template <class T> void registerType() { | 419 | 474 | tls_slot_->runOnAllThreads( | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); | 421 | 474 | } |
void Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::HeaderMapIterator>() Line | Count | Source | 418 | 474 | template <class T> void registerType() { | 419 | 474 | tls_slot_->runOnAllThreads( | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); | 421 | 474 | } |
void Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::StreamInfoWrapper>() Line | Count | Source | 418 | 474 | template <class T> void registerType() { | 419 | 474 | tls_slot_->runOnAllThreads( | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); | 421 | 474 | } |
void Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapWrapper>() Line | Count | Source | 418 | 474 | template <class T> void registerType() { | 419 | 474 | tls_slot_->runOnAllThreads( | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); | 421 | 474 | } |
void Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::DynamicMetadataMapIterator>() Line | Count | Source | 418 | 474 | template <class T> void registerType() { | 419 | 474 | tls_slot_->runOnAllThreads( | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); | 421 | 474 | } |
void Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::StreamHandleWrapper>() Line | Count | Source | 418 | 474 | template <class T> void registerType() { | 419 | 474 | tls_slot_->runOnAllThreads( | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); | 421 | 474 | } |
void Envoy::Extensions::Filters::Common::Lua::ThreadLocalState::registerType<Envoy::Extensions::HttpFilters::Lua::PublicKeyWrapper>() Line | Count | Source | 418 | 474 | template <class T> void registerType() { | 419 | 474 | tls_slot_->runOnAllThreads( | 420 | 474 | [](OptRef<LuaThreadLocal> tls) { T::registerType(tls->state_.get()); }); | 421 | 474 | } |
|
422 | | |
423 | | /** |
424 | | * Return the number of bytes used by the runtime. |
425 | | */ |
426 | 0 | uint64_t runtimeBytesUsed() { |
427 | 0 | uint64_t bytes_used = lua_gc(tlsState().get(), LUA_GCCOUNT, 0) * 1024; |
428 | 0 | bytes_used += lua_gc(tlsState().get(), LUA_GCCOUNTB, 0); |
429 | 0 | return bytes_used; |
430 | 0 | } |
431 | | |
432 | | /** |
433 | | * Force a full runtime GC. |
434 | | */ |
435 | 0 | void runtimeGC() { lua_gc(tlsState().get(), LUA_GCCOLLECT, 0); } |
436 | | |
437 | | private: |
438 | | struct LuaThreadLocal : public ThreadLocal::ThreadLocalObject { |
439 | | LuaThreadLocal(const std::string& code); |
440 | | |
441 | | CSmartPtr<lua_State, lua_close> state_; |
442 | | std::vector<int> global_slots_; |
443 | | }; |
444 | | |
445 | 0 | CSmartPtr<lua_State, lua_close>& tlsState() { return (*tls_slot_)->state_; } |
446 | | |
447 | | ThreadLocal::TypedSlotPtr<LuaThreadLocal> tls_slot_; |
448 | | uint64_t current_global_slot_{}; |
449 | | }; |
450 | | |
451 | | using ThreadLocalStatePtr = std::unique_ptr<ThreadLocalState>; |
452 | | |
453 | | /** |
454 | | * An exception specific to Lua errors. |
455 | | */ |
456 | | class LuaException : public EnvoyException { |
457 | | public: |
458 | | using EnvoyException::EnvoyException; |
459 | | }; |
460 | | } // namespace Lua |
461 | | } // namespace Common |
462 | | } // namespace Filters |
463 | | } // namespace Extensions |
464 | | } // namespace Envoy |