Coverage Report

Created: 2023-11-12 09:30

/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