<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Lua and OO bindings</title>
		<link>http://www.allegro.cc/forums/view/612599</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 17 May 2013 20:33:14 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This isn&#39;t actually a question. I finally managed to figure out the lua5.2 lib properly.</p><p>I thought I&#39;d share what I came up with:</p><p><a href="http://pastebin.com/C3Py3Msu">http://pastebin.com/C3Py3Msu</a>
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="p">#include &lt;cstdio&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;lua.hpp&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;cerrno&gt;</span>
<span class="number">   4</span><span class="p">#include &lt;cstring&gt;</span>
<span class="number">   5</span><span class="p">#include &lt;stdlib.h&gt;</span>
<span class="number">   6</span>
<span class="number">   7</span><span class="p">#include &lt;new&gt;</span>
<span class="number">   8</span>
<span class="number">   9</span><span class="k1">void</span> lua_stack_dump<span class="k2">(</span>lua_State <span class="k3">*</span>L<span class="k2">)</span><span class="k2">;</span>
<span class="number">  10</span>
<span class="number">  11</span><span class="p">#define _strify(str) #str</span>
<span class="number">  12</span><span class="p">#define _concat(str1, str2) str1 ## str2</span>
<span class="number">  13</span>
<span class="number">  14</span><span class="p">#define register_class(state, class_name, meta_table, class_table) do { \</span>
<span class="number">  15</span><span class="p">  luaL_newmetatable(state, #class_name); \ </span>
<span class="number">  16</span><span class="p">  lua_pushvalue(state, -1); \ </span>
<span class="number">  17</span><span class="p">  lua_setfield(state, -2, "__index"); \ </span>
<span class="number">  18</span><span class="p">  luaL_setfuncs(state, class_table, 0); \ </span>
<span class="number">  19</span><span class="p">  luaL_newlib(state, meta_table); \ </span>
<span class="number">  20</span><span class="p">  /* lua_pushvalue(state, -1);*/ \ </span>
<span class="number">  21</span><span class="p">  lua_setglobal(state, #class_name); \ </span>
<span class="number">  22</span><span class="p">  lua_stack_dump(state); \ </span>
<span class="number">  23</span><span class="p">} while(0) </span>
<span class="number">  24</span>
<span class="number">  25</span><span class="p">#define create_lua_object(state, class_name, obj) do { \</span>
<span class="number">  26</span><span class="p">  void *udata__ = lua_newuserdata(state, sizeof(_concat(Lua,class_name))); \ </span>
<span class="number">  27</span><span class="p">  _concat(Lua,class_name) *obj__ = ::new (udata__) _concat(Lua,class_name)(state, obj); \ </span>
<span class="number">  28</span><span class="p">  \ </span>
<span class="number">  29</span><span class="p">  luaL_getmetatable(state, #class_name); \ </span>
<span class="number">  30</span><span class="p">  lua_setmetatable(state, -2); \ </span>
<span class="number">  31</span><span class="p">  lua_stack_dump(state); \ </span>
<span class="number">  32</span><span class="p">} while(0) </span>
<span class="number">  33</span>
<span class="number">  34</span><span class="p">#define get_lua_object(state, class_name) (_concat(Lua,class_name) *)luaL_checkudata(state, 1, #class_name)</span>
<span class="number">  35</span>
<span class="number">  36</span><span class="p">#define destroy_lua_object(state, class_name) do { \</span>
<span class="number">  37</span><span class="p">  _concat(Lua, class_name) *udata__ = (_concat(Lua, class_name) *)luaL_checkudata(state, 1, #class_name); \ </span>
<span class="number">  38</span><span class="p">  udata__-&gt;~_concat(Lua, class_name)(); \ </span>
<span class="number">  39</span><span class="p">} while(0) </span>
<span class="number">  40</span>
<span class="number">  41</span><span class="k1">class</span> Test
<span class="number">  42</span><span class="k2">{</span>
<span class="number">  43</span>  public:
<span class="number">  44</span>    Test<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"new Test!\n"</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
<span class="number">  45</span>    ~Test<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"delete Test!\n"</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
<span class="number">  46</span>    
<span class="number">  47</span>    <span class="k1">void</span> it<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"TEST IT!\n"</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
<span class="number">  48</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  49</span>
<span class="number">  50</span><span class="k1">class</span> LuaTest
<span class="number">  51</span><span class="k2">{</span>
<span class="number">  52</span>  public:
<span class="number">  53</span>    LuaTest<span class="k2">(</span>lua_State <span class="k3">*</span>, Test <span class="k3">*</span>test<span class="k2">)</span> <span class="k2">:</span> test<span class="k2">(</span>test<span class="k2">)</span> <span class="k2">{</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"new LuaTest!\n"</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
<span class="number">  54</span>    ~LuaTest<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"delete LuaTest!\n"</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
<span class="number">  55</span>    <span class="k1">void</span> it<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> test-&gt;it<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
<span class="number">  56</span>  private:
<span class="number">  57</span>    Test <span class="k3">*</span>test<span class="k2">;</span>
<span class="number">  58</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  59</span>
<span class="number">  60</span><span class="k1">static</span> <span class="k1">int</span> Test_destroy<span class="k2">(</span>lua_State <span class="k3">*</span>state<span class="k2">)</span>
<span class="number">  61</span><span class="k2">{</span>
<span class="number">  62</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Test_destroy\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  63</span>  destroy_lua_object<span class="k2">(</span>state, Test<span class="k2">)</span><span class="k2">;</span>
<span class="number">  64</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  65</span><span class="k2">}</span>
<span class="number">  66</span>
<span class="number">  67</span><span class="k1">static</span> <span class="k1">int</span> Test_it<span class="k2">(</span>lua_State <span class="k3">*</span>state<span class="k2">)</span>
<span class="number">  68</span><span class="k2">{</span>
<span class="number">  69</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Test_it\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  70</span>  LuaTest <span class="k3">*</span>test <span class="k3">=</span> get_lua_object<span class="k2">(</span>state, Test<span class="k2">)</span><span class="k2">;</span>
<span class="number">  71</span>  test-&gt;it<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  72</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  73</span><span class="k2">}</span>
<span class="number">  74</span>
<span class="number">  75</span><span class="k1">static</span> <span class="k1">int</span> Test_new<span class="k2">(</span>lua_State <span class="k3">*</span>state<span class="k2">)</span>
<span class="number">  76</span><span class="k2">{</span>
<span class="number">  77</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Test_new begin\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  78</span>  Test <span class="k3">*</span>newTest <span class="k3">=</span> <span class="k1">new</span> Test<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  79</span>  create_lua_object<span class="k2">(</span>state, Test, newTest<span class="k2">)</span><span class="k2">;</span>
<span class="number">  80</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Test_new end\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  81</span>  <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  82</span><span class="k2">}</span>
<span class="number">  83</span>
<span class="number">  84</span><span class="k1">static</span> <span class="k1">const</span> luaL_Reg test_meta_methods<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span>
<span class="number">  85</span>  <span class="k2">{</span> <span class="s">"new"</span>, <span class="k3">&amp;</span>Test_new <span class="k2">}</span>,
<span class="number">  86</span>  <span class="k2">{</span> <span class="s">"__gc"</span>, <span class="k3">&amp;</span>Test_destroy <span class="k2">}</span>,
<span class="number">  87</span>  <span class="k2">{</span> <span class="n">0</span>, <span class="n">0</span> <span class="k2">}</span>
<span class="number">  88</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  89</span>
<span class="number">  90</span><span class="k1">static</span> <span class="k1">const</span> luaL_Reg test_methods<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span>
<span class="number">  91</span>  <span class="k2">{</span> <span class="s">"it"</span>, <span class="k3">&amp;</span>Test_it <span class="k2">}</span>,
<span class="number">  92</span>  <span class="k2">{</span> <span class="n">0</span>, <span class="n">0</span> <span class="k2">}</span>
<span class="number">  93</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  94</span>
<span class="number">  95</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number">  96</span><span class="k2">{</span>
<span class="number">  97</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"start\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  98</span>  lua_State <span class="k3">*</span>state <span class="k3">=</span> luaL_newstate<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  99</span>  luaL_openlibs<span class="k2">(</span>state<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 100</span>  
<span class="number"> 101</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"call register_class\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 102</span>  register_class<span class="k2">(</span>state, Test, test_meta_methods, test_methods<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 103</span>  
<span class="number"> 104</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"open lua file\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 105</span>  FILE <span class="k3">*</span>fh <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_337.html" target="_blank">fopen</a><span class="k2">(</span><span class="s">"luaobjtest.lua"</span>, <span class="s">"r"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 106</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>fh<span class="k2">)</span>
<span class="number"> 107</span>  <span class="k2">{</span>
<span class="number"> 108</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to open luaobjtest.lua: %s\n"</span>, <a href="http://www.delorie.com/djgpp/doc/libc/libc_759.html" target="_blank">strerror</a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_293.html" target="_blank">errno</a><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 109</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 110</span>  <span class="k2">}</span>
<span class="number"> 111</span>  
<span class="number"> 112</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_354.html" target="_blank">fseek</a><span class="k2">(</span>fh, <span class="n">0</span>, SEEK_END<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 113</span>  <span class="k1">long</span> len <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_366.html" target="_blank">ftell</a><span class="k2">(</span>fh<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 114</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_354.html" target="_blank">fseek</a><span class="k2">(</span>fh, <span class="n">0</span>, SEEK_SET<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 115</span>  
<span class="number"> 116</span>  <span class="k1">char</span> <span class="k3">*</span>script <span class="k3">=</span> <span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span><span class="k2">)</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span>len<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 117</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>script<span class="k2">)</span>
<span class="number"> 118</span>  <span class="k2">{</span>
<span class="number"> 119</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to allocate enough memory to load luaobjtest.lua\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 120</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 121</span>  <span class="k2">}</span>
<span class="number"> 122</span>  
<span class="number"> 123</span>  script<span class="k2">[</span>len<span class="k2">]</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 124</span>  <span class="k1">size_t</span> ret <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_349.html" target="_blank">fread</a><span class="k2">(</span>script, <span class="n">1</span>, len, fh<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 125</span>  <span class="k1">if</span><span class="k2">(</span>ret <span class="k3">!</span><span class="k3">=</span> <span class="k2">(</span><span class="k1">size_t</span><span class="k2">)</span>len<span class="k2">)</span>
<span class="number"> 126</span>  <span class="k2">{</span>
<span class="number"> 127</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to read entire luaobjtest.lua file, read %li bytes, expected %li bytes.\n"</span>, ret, len<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 128</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 129</span>  <span class="k2">}</span>
<span class="number"> 130</span>  
<span class="number"> 131</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>fh<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 132</span>
<span class="number"> 133</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"call luaL_loadstring\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 134</span>  <span class="k1">if</span><span class="k2">(</span>luaL_loadstring<span class="k2">(</span>state, script<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> LUA_OK<span class="k2">)</span>
<span class="number"> 135</span>  <span class="k2">{</span>
<span class="number"> 136</span>    <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>errstr <span class="k3">=</span> luaL_checklstring<span class="k2">(</span>state, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 137</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to load luaobjtest.lua: %s\n"</span>, errstr<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 138</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>script<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 139</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 140</span>  <span class="k2">}</span>
<span class="number"> 141</span>
<span class="number"> 142</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"call lua_pcall\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 143</span>  <span class="k1">if</span><span class="k2">(</span>lua_pcall<span class="k2">(</span>state, <span class="n">0</span>, LUA_MULTRET, <span class="n">0</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> LUA_OK<span class="k2">)</span>
<span class="number"> 144</span>  <span class="k2">{</span>
<span class="number"> 145</span>    <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>errstr <span class="k3">=</span> luaL_checklstring<span class="k2">(</span>state, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 146</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to run luaobjtest.lua: %s\n"</span>, errstr<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 147</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>script<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 148</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 149</span>  <span class="k2">}</span>
<span class="number"> 150</span>  
<span class="number"> 151</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"done!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 152</span>  
<span class="number"> 153</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 154</span><span class="k2">}</span>
<span class="number"> 155</span>
<span class="number"> 156</span><span class="k1">void</span> lua_stack_dump<span class="k2">(</span>lua_State <span class="k3">*</span>L<span class="k2">)</span>
<span class="number"> 157</span><span class="k2">{</span>
<span class="number"> 158</span>  <span class="k1">int</span> i<span class="k2">;</span>
<span class="number"> 159</span>  <span class="k1">int</span> top <span class="k3">=</span> lua_gettop<span class="k2">(</span>L<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 160</span>  <span class="k1">for</span> <span class="k2">(</span>i <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> i <span class="k3">&lt;</span><span class="k3">=</span> top<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>  <span class="c">/* repeat for each level */</span>
<span class="number"> 161</span>    <span class="k1">int</span> t <span class="k3">=</span> lua_type<span class="k2">(</span>L, i<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 162</span>    <span class="k1">switch</span> <span class="k2">(</span>t<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 163</span>
<span class="number"> 164</span>      <span class="k1">case</span> LUA_TSTRING:  <span class="c">/* strings */</span>
<span class="number"> 165</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"`%s'"</span>, lua_tostring<span class="k2">(</span>L, i<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 166</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 167</span>
<span class="number"> 168</span>      <span class="k1">case</span> LUA_TBOOLEAN:  <span class="c">/* booleans */</span>
<span class="number"> 169</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span>lua_toboolean<span class="k2">(</span>L, i<span class="k2">)</span> ? <span class="s">"true"</span> <span class="k2">:</span> <span class="s">"false"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 170</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 171</span>
<span class="number"> 172</span>      <span class="k1">case</span> LUA_TNUMBER:  <span class="c">/* numbers */</span>
<span class="number"> 173</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%g"</span>, lua_tonumber<span class="k2">(</span>L, i<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 174</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 175</span>
<span class="number"> 176</span>      default:  <span class="c">/* other values */</span>
<span class="number"> 177</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s"</span>, lua_typename<span class="k2">(</span>L, t<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 178</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 179</span>
<span class="number"> 180</span>    <span class="k2">}</span>
<span class="number"> 181</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"  "</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">/* put a separator */</span>
<span class="number"> 182</span>  <span class="k2">}</span>
<span class="number"> 183</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"\n"</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">/* end the listing */</span>
<span class="number"> 184</span><span class="k2">}</span>
</div></div><p>

Maybe it&#39;ll help someone here trying to embed lua in their own programs, who also want to use objects from C++.</p><p>append:</p><p>Forgot the actual lua script:</p><div class="source-code snippet"><div class="inner"><pre>local test <span class="k3">=</span> Test.new<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
test:it<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 17 May 2013 04:06:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Fjellstrom! This is...you are....nice one man! <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dizzy Egg)</author>
		<pubDate>Fri, 17 May 2013 04:16:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/612599/982917#target">Dizzy Egg</a> said:</div><div class="quote"><p>Fjellstrom! This is...you are....nice one man! </p></div></div><p>I take it you&#39;ve been fighting with lua 5.2 as well? Most of my frustration was due to a typo/thinko in luaL_checkudata, passed 0 instead of 1 as the second argument. tried changing everything but that, thinking it was ok <img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 17 May 2013 04:23:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ahh...err...well I&#39;ve been applying the &#39;copy &amp; paste&#39;  approach (because I&#39;m a lazy <span class="cuss"><span>bastard</span></span>), and have had not much luck so far with 5.2, I&#39;ve hacked? together a solution, but compared to what you&#39;ve just shared it looks like...well, a mess.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dizzy Egg)</author>
		<pubDate>Fri, 17 May 2013 04:31:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I.. Yeah, I tried the copy &amp; paste method hoping it would get me at least part way, but almost none of the available code is for 5.2.</p><p>I may change up the api later to use templates and other magic to make things a bit easier and cleaner. Maybe..</p><p>Right now thats just ripped out of a project I started trying to integrate lua into while I was at my moms. I spent <i>days</i> if not a week (or two) trying to get it to work properly.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 17 May 2013 04:34:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;s much appreciated! And &#39;hi&#39; to your mum! (and Jasper!)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dizzy Egg)</author>
		<pubDate>Fri, 17 May 2013 04:38:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That stuff looks way over my head. I&#39;ve got to break out of C++ one of these days
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 17 May 2013 05:15:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>lua&#39;s api really could have been done better.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 17 May 2013 05:19:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>So it&#39;s just a C api? I haven&#39;t looked at LUA in ages.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 17 May 2013 08:56:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>LUA&#39;s api isn&#39;t designed to be used in object-oriented fashion, provided <b>LUA don&#39;t support objects</b>. So it&#39;s as if you were complaining that OO-coding with plain assembly was hard and it could&#39;ve done it better.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Raidho36)</author>
		<pubDate>Fri, 17 May 2013 13:48:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Nobody is complaining. The only one (again!) that is <span class="cuss"><span>bitch</span></span>ing and moaning is... You. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>EDIT: And while the API for Lua is in C, the language itself <a href="http://www.lua.org/pil/16.html">supports OOP</a>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Vanneto)</author>
		<pubDate>Fri, 17 May 2013 13:54:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hey, I&#39;m not moaning. Also, that&#39;s not really an OOP, I mean you could do just the same with C, but that doesn&#39;t make C an object-oriented language.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Raidho36)</author>
		<pubDate>Fri, 17 May 2013 14:08:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I did something quite similar, very much inspired by this wrapper solution here, which also provides some nice templates and ugly macros ( <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /> ) for passing arguments : <a href="http://forums.tigsource.com/index.php?topic=22524.0">Embedding Lua for Fun and Profit</a></p><p>Had to adapt it to 5.2, too, though. As far as I remember, it wasn&#39;t more than replacing luaL_openlib with luaL_setfuncs. (edit: There was another thing, in Lua 5.2, tables can have a __gc metamethod while in 5.1 they can&#39;t, so I had to allow its execution for the userdata only, as this wrapper uses an userdata object wrapped inside a table for its c++-objects.) <br />Also, this wrapper doesn&#39;t require separate wrapper classes, as yours. <br />But I like the separation of class-methods and meta-methods, which you do, very much.</p><p>The one thing I found quite complicated to do about binding lua and c++ was to track userdata objects which contain other user-data objects, when the container is managed on the C side. You have to keep around a lua reference in your container object on the C-side in order to prevent the contained objects from being garbage-collected...<br />Have you thought about how do deal with that already? I&#39;d be interested in how you do it.</p><p>I also hacked the Lua core so I had to declare globals. I don&#39;t like the concept of treating everything that isn&#39;t anything else as globals implicitly (I mean, I don&#39;t think global by default is bad, but you should  be required to declare them in order to prevent typos from crashing your program, just as an extra-check).</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/612599/982956#target">Raidho36</a> said:</div><div class="quote"><p> I mean you could do just the same with C </p></div></div><p>
Last time I checked, C didn&#39;t provide anything like meta-methods, which allow you to do constructors, destructors,  operator overloading, ...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Polybios)</author>
		<pubDate>Fri, 17 May 2013 15:21:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I was comparing it to LUA&#39;s &quot;OO&quot;. Seriously, that ain&#39;t OO. It&#39;s just LUA&#39;s loose internal structure allows a lot of things to work, which makes it possible to run sort of OO there. But LUA by itself has no support for it so you&#39;d have to kludge up some kludgingly kludgy kludges to make it work right, just like you&#39;d have to with C.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Raidho36)</author>
		<pubDate>Fri, 17 May 2013 15:26:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s sort of right, but I&#39;d still argue that it works better with Lua than with C because you have metatables and metamethods. You simply can&#39;t do this implicit- function-calling-OOP-magic with C!<br />If you need native-true-OOP support out of the box, you should use a different embeddable scripting language, not Lua. <br />I like the concept of Lua&#39;s general purpose tables which is why I use it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Polybios)</author>
		<pubDate>Fri, 17 May 2013 16:49:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;s about as good as C++&#39;s OO support. It has some convenient syntax sugar to allow some OO concepts to work, just like lua does \o/</p><p>But yes, please keep this as on topic as possible, winging about random crap just because you can is looked down upon.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/612599/982959#target">Polybios</a> said:</div><div class="quote"><p>Also, this wrapper doesn&#39;t require separate wrapper classes, as yours. </p></div></div><p>I started off without the wrapper classes. I added them thinking not using them was causing issues somehow? I tried a lot of things to get my code to work. But it turns out I want to keep the wrappers anyhow, so I can let lua properly dispose of stuff.</p><p>The wrapper classes in some instances will be aloud to dispose of their wrapped objects, and you can&#39;t really do that by storing a single pointer in the udata.</p><p>It actually wouldn&#39;t take much to rip out the need for the wrapper class in those macros..</p><p>Something like:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="p">#include &lt;cstdio&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;lua.hpp&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;cerrno&gt;</span>
<span class="number">   4</span><span class="p">#include &lt;cstring&gt;</span>
<span class="number">   5</span><span class="p">#include &lt;stdlib.h&gt;</span>
<span class="number">   6</span>
<span class="number">   7</span><span class="p">#include &lt;new&gt;</span>
<span class="number">   8</span>
<span class="number">   9</span><span class="k1">void</span> lua_stack_dump<span class="k2">(</span>lua_State <span class="k3">*</span>L<span class="k2">)</span><span class="k2">;</span>
<span class="number">  10</span>
<span class="number">  11</span><span class="p">#define _strify(str) #str</span>
<span class="number">  12</span><span class="p">#define _concat(str1, str2) str1 ## str2</span>
<span class="number">  13</span>
<span class="number">  14</span><span class="p">#define register_class(state, class_name, meta_table, class_table) do { \</span>
<span class="number">  15</span><span class="p">  luaL_newmetatable(state, #class_name); \ </span>
<span class="number">  16</span><span class="p">  lua_pushvalue(state, -1); \ </span>
<span class="number">  17</span><span class="p">  lua_setfield(state, -2, "__index"); \ </span>
<span class="number">  18</span><span class="p">  luaL_setfuncs(state, class_table, 0); \ </span>
<span class="number">  19</span><span class="p">  luaL_newlib(state, meta_table); \ </span>
<span class="number">  20</span><span class="p">  lua_setglobal(state, #class_name); \ </span>
<span class="number">  21</span><span class="p">} while(0)  </span>
<span class="number">  22</span>
<span class="number">  23</span><span class="p">#define create_lua_object(state, class_name, obj) do { \</span>
<span class="number">  24</span><span class="p">  void **udata__ = (void **)lua_newuserdata(state, sizeof(class_name *)); \ </span>
<span class="number">  25</span><span class="p">  *udata__ = obj; \ </span>
<span class="number">  26</span><span class="p">  luaL_getmetatable(state, #class_name); \ </span>
<span class="number">  27</span><span class="p">  lua_setmetatable(state, -2); \ </span>
<span class="number">  28</span><span class="p">} while(0)  </span>
<span class="number">  29</span>
<span class="number">  30</span><span class="p">#define get_lua_object(state, class_name) *(class_name **)luaL_checkudata(state, 1, #class_name)</span>
<span class="number">  31</span>
<span class="number">  32</span><span class="p">#define destroy_lua_object(state, class_name) do { \</span>
<span class="number">  33</span><span class="p">  class_name **udata__ = (class_name **)luaL_checkudata(state, 1, #class_name); \ </span>
<span class="number">  34</span><span class="p">  (*udata__)-&gt;~class_name(); \ </span>
<span class="number">  35</span><span class="p">} while(0)  </span>
<span class="number">  36</span>
<span class="number">  37</span><span class="k1">class</span> Test
<span class="number">  38</span><span class="k2">{</span>
<span class="number">  39</span>  public:
<span class="number">  40</span>    Test<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"new Test!\n"</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
<span class="number">  41</span>    ~Test<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"delete Test!\n"</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
<span class="number">  42</span>    
<span class="number">  43</span>    <span class="k1">void</span> it<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"TEST IT!\n"</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
<span class="number">  44</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  45</span>
<span class="number">  46</span><span class="k1">static</span> <span class="k1">int</span> Test_destroy<span class="k2">(</span>lua_State <span class="k3">*</span>state<span class="k2">)</span>
<span class="number">  47</span><span class="k2">{</span>
<span class="number">  48</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Test_destroy\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  49</span>  destroy_lua_object<span class="k2">(</span>state, Test<span class="k2">)</span><span class="k2">;</span>
<span class="number">  50</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  51</span><span class="k2">}</span>
<span class="number">  52</span>
<span class="number">  53</span><span class="k1">static</span> <span class="k1">int</span> Test_it<span class="k2">(</span>lua_State <span class="k3">*</span>state<span class="k2">)</span>
<span class="number">  54</span><span class="k2">{</span>
<span class="number">  55</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Test_it\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  56</span>  Test <span class="k3">*</span>test <span class="k3">=</span> get_lua_object<span class="k2">(</span>state, Test<span class="k2">)</span><span class="k2">;</span>
<span class="number">  57</span>  test-&gt;it<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  58</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  59</span><span class="k2">}</span>
<span class="number">  60</span>
<span class="number">  61</span><span class="k1">static</span> <span class="k1">int</span> Test_new<span class="k2">(</span>lua_State <span class="k3">*</span>state<span class="k2">)</span>
<span class="number">  62</span><span class="k2">{</span>
<span class="number">  63</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Test_new begin\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  64</span>  Test <span class="k3">*</span>newTest <span class="k3">=</span> <span class="k1">new</span> Test<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  65</span>  create_lua_object<span class="k2">(</span>state, Test, newTest<span class="k2">)</span><span class="k2">;</span>
<span class="number">  66</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Test_new end\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  67</span>  <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  68</span><span class="k2">}</span>
<span class="number">  69</span>
<span class="number">  70</span><span class="k1">static</span> <span class="k1">const</span> luaL_Reg test_meta_methods<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span>
<span class="number">  71</span>  <span class="k2">{</span> <span class="s">"new"</span>, <span class="k3">&amp;</span>Test_new <span class="k2">}</span>,
<span class="number">  72</span>  <span class="k2">{</span> <span class="s">"__gc"</span>, <span class="k3">&amp;</span>Test_destroy <span class="k2">}</span>,
<span class="number">  73</span>  <span class="k2">{</span> <span class="n">0</span>, <span class="n">0</span> <span class="k2">}</span>
<span class="number">  74</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  75</span>
<span class="number">  76</span><span class="k1">static</span> <span class="k1">const</span> luaL_Reg test_methods<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span>
<span class="number">  77</span>  <span class="k2">{</span> <span class="s">"it"</span>, <span class="k3">&amp;</span>Test_it <span class="k2">}</span>,
<span class="number">  78</span>  <span class="k2">{</span> <span class="n">0</span>, <span class="n">0</span> <span class="k2">}</span>
<span class="number">  79</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  80</span>
<span class="number">  81</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number">  82</span><span class="k2">{</span>
<span class="number">  83</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"start\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  84</span>  lua_State <span class="k3">*</span>state <span class="k3">=</span> luaL_newstate<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  85</span>  luaL_openlibs<span class="k2">(</span>state<span class="k2">)</span><span class="k2">;</span>
<span class="number">  86</span>  
<span class="number">  87</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"call register_class\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  88</span>  register_class<span class="k2">(</span>state, Test, test_meta_methods, test_methods<span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</span>  
<span class="number">  90</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"open lua file\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  91</span>  FILE <span class="k3">*</span>fh <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_337.html" target="_blank">fopen</a><span class="k2">(</span><span class="s">"luaobjtest.lua"</span>, <span class="s">"r"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  92</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>fh<span class="k2">)</span>
<span class="number">  93</span>  <span class="k2">{</span>
<span class="number">  94</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to open luaobjtest.lua: %s\n"</span>, <a href="http://www.delorie.com/djgpp/doc/libc/libc_759.html" target="_blank">strerror</a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_293.html" target="_blank">errno</a><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  95</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  96</span>  <span class="k2">}</span>
<span class="number">  97</span>  
<span class="number">  98</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_354.html" target="_blank">fseek</a><span class="k2">(</span>fh, <span class="n">0</span>, SEEK_END<span class="k2">)</span><span class="k2">;</span>
<span class="number">  99</span>  <span class="k1">long</span> len <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_366.html" target="_blank">ftell</a><span class="k2">(</span>fh<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 100</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_354.html" target="_blank">fseek</a><span class="k2">(</span>fh, <span class="n">0</span>, SEEK_SET<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 101</span>  
<span class="number"> 102</span>  <span class="k1">char</span> <span class="k3">*</span>script <span class="k3">=</span> <span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span><span class="k2">)</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span>len<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 103</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>script<span class="k2">)</span>
<span class="number"> 104</span>  <span class="k2">{</span>
<span class="number"> 105</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to allocate enough memory to load luaobjtest.lua\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 106</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 107</span>  <span class="k2">}</span>
<span class="number"> 108</span>  
<span class="number"> 109</span>  script<span class="k2">[</span>len<span class="k2">]</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 110</span>  <span class="k1">size_t</span> ret <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_349.html" target="_blank">fread</a><span class="k2">(</span>script, <span class="n">1</span>, len, fh<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 111</span>  <span class="k1">if</span><span class="k2">(</span>ret <span class="k3">!</span><span class="k3">=</span> <span class="k2">(</span><span class="k1">size_t</span><span class="k2">)</span>len<span class="k2">)</span>
<span class="number"> 112</span>  <span class="k2">{</span>
<span class="number"> 113</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to read entire luaobjtest.lua file, read %li bytes, expected %li bytes.\n"</span>, ret, len<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 114</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 115</span>  <span class="k2">}</span>
<span class="number"> 116</span>  
<span class="number"> 117</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>fh<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 118</span>
<span class="number"> 119</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"call luaL_loadstring\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 120</span>  <span class="k1">if</span><span class="k2">(</span>luaL_loadstring<span class="k2">(</span>state, script<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> LUA_OK<span class="k2">)</span>
<span class="number"> 121</span>  <span class="k2">{</span>
<span class="number"> 122</span>    <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>errstr <span class="k3">=</span> luaL_checklstring<span class="k2">(</span>state, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 123</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to load luaobjtest.lua: %s\n"</span>, errstr<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 124</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>script<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 125</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 126</span>  <span class="k2">}</span>
<span class="number"> 127</span>
<span class="number"> 128</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"call lua_pcall\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 129</span>  <span class="k1">if</span><span class="k2">(</span>lua_pcall<span class="k2">(</span>state, <span class="n">0</span>, LUA_MULTRET, <span class="n">0</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> LUA_OK<span class="k2">)</span>
<span class="number"> 130</span>  <span class="k2">{</span>
<span class="number"> 131</span>    <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>errstr <span class="k3">=</span> luaL_checklstring<span class="k2">(</span>state, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 132</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to run luaobjtest.lua: %s\n"</span>, errstr<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 133</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>script<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 134</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 135</span>  <span class="k2">}</span>
<span class="number"> 136</span>  
<span class="number"> 137</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"done!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 138</span>  
<span class="number"> 139</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 140</span><span class="k2">}</span>
<span class="number"> 141</span>
<span class="number"> 142</span><span class="k1">void</span> lua_stack_dump<span class="k2">(</span>lua_State <span class="k3">*</span>L<span class="k2">)</span>
<span class="number"> 143</span><span class="k2">{</span>
<span class="number"> 144</span>  <span class="k1">int</span> i<span class="k2">;</span>
<span class="number"> 145</span>  <span class="k1">int</span> top <span class="k3">=</span> lua_gettop<span class="k2">(</span>L<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 146</span>  <span class="k1">for</span> <span class="k2">(</span>i <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> i <span class="k3">&lt;</span><span class="k3">=</span> top<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>  <span class="c">/* repeat for each level */</span>
<span class="number"> 147</span>    <span class="k1">int</span> t <span class="k3">=</span> lua_type<span class="k2">(</span>L, i<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 148</span>    <span class="k1">switch</span> <span class="k2">(</span>t<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 149</span>
<span class="number"> 150</span>      <span class="k1">case</span> LUA_TSTRING:  <span class="c">/* strings */</span>
<span class="number"> 151</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"`%s'"</span>, lua_tostring<span class="k2">(</span>L, i<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 152</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 153</span>
<span class="number"> 154</span>      <span class="k1">case</span> LUA_TBOOLEAN:  <span class="c">/* booleans */</span>
<span class="number"> 155</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span>lua_toboolean<span class="k2">(</span>L, i<span class="k2">)</span> ? <span class="s">"true"</span> <span class="k2">:</span> <span class="s">"false"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 156</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 157</span>
<span class="number"> 158</span>      <span class="k1">case</span> LUA_TNUMBER:  <span class="c">/* numbers */</span>
<span class="number"> 159</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%g"</span>, lua_tonumber<span class="k2">(</span>L, i<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 160</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 161</span>
<span class="number"> 162</span>      default:  <span class="c">/* other values */</span>
<span class="number"> 163</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s"</span>, lua_typename<span class="k2">(</span>L, t<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 164</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 165</span>
<span class="number"> 166</span>    <span class="k2">}</span>
<span class="number"> 167</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"  "</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">/* put a separator */</span>
<span class="number"> 168</span>  <span class="k2">}</span>
<span class="number"> 169</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"\n"</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">/* end the listing */</span>
<span class="number"> 170</span><span class="k2">}</span>
</div></div><p>

The only issue with that, is if you really want lua calling your destructor? Probably not, so that should probably be removed.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Have you thought about how do deal with that already? I&#39;d be interested in how you do it.</p></div></div><p>I haven&#39;t considered that. Even slightly. I&#39;m sure you can do it simply enough, possibly with a nice little &quot;smart_lua_ptr&quot; class to wrap those lua objects?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 17 May 2013 17:50:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Interesting. </p><p>You could use placement new directly on your C++-object/the userdata with (sizeof(YourClass) and call the destructor explicitly in the __gc method, can&#39;t you? Is there a difference between <tt>Lua - TestDestroy - ~LuaTest (explicitly) - ~Test (implicitly)</tt> and <tt>Lua - TestDestroy - ~Test (explicitly)</tt>? Isn&#39;t it just shorter?<br />At least that&#39;s how I do it. I found it to become really tedious to write the glue code, so I&#39;d like to minimize that and avoid extra wrapper classes when possible. (Of course you can emit the __gc glue-function (e. g. TestDestroy) in one line using a macro).</p><p>But: In what situation would you want the Lua wrapper class to let go of the wrapped C++ object? Wouldn&#39;t that be insecure? <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /></p><p>While a smart pointer is a good idea (of which I haven&#39;t thought <img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" /> ), I think it doesn&#39;t solve the problem with the references on its own. You&#39;d still need a place to store your <tt>lua_smart_ptrs</tt>; chances are that you don&#39;t want your C++-container-object to store them, because then, you couldn&#39;t use it with plain C++ objects anymore (?). Besides, I&#39;d prefer to not have my C++ objects &quot;contaminated&quot; with Lua glue code. You definitively need those references though, because it will inevitably crash when you don&#39;t have them (speaking from experience here <img src="http://www.allegro.cc/forums/smileys/cool.gif" alt="8-)" /> ). [As soon as Lua runs a GC-cycle, it will collect your <tt>CppObjects</tt>, because it is unable to &quot;see&quot; that they are &quot;referenced&quot; on the C++ side in your <tt>CppContainer</tt>.]</p><p>While I think about it, this container-object-reference-thing is actually the only case for which you definitively need a wrapper class, no?</p><p>Well, whatever, I just wanted to draw your attention to this problem, because it was the part which I found the most difficult. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /><br />I&#39;ve also spent quite some time in order to get it to work; I guess I spent even more time searching for premade solutions - which either didn&#39;t work, were made for Lua 5.1 or were overly complicated and took ages to compile because of all the templates involved.</p><p>(By the way, is there a reason you don&#39;t use lua_dofile in the example? )
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Polybios)</author>
		<pubDate>Fri, 17 May 2013 19:53:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The main reason I use pointers (or the wrapper object) rather than explicit objects is, at least in the project I wrote the original code for, most objects will be created in the C++ code, and exposed to lua. And I don&#39;t want lua destroying my objects on me.</p><p>With the wrapper class, I have an extra step where I can put some smarter code to handle the lua destruction event. It could potentially do smarter things. Maybe.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/612599/982974#target">Polybios</a> said:</div><div class="quote"><p>But: In what situation would you want the Lua wrapper class to let go of the wrapped C++ object? Wouldn&#39;t that be insecure? </p></div></div><p>Yeah, it could be. But its nice to allow it, say the lua code creates an object, and doesn&#39;t attach it to anything, and then exits? I&#39;d like the orphans to go away if at all possible.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>(By the way, is there a reason you don&#39;t use lua_dofile in the example? )</p></div></div><p>Nope. I yanked the loadstring call from another example that loads from an array of strings. I just forgot about dofile and friends.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 17 May 2013 20:05:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/612599/982975#target">Thomas Fjellstrom</a> said:</div><div class="quote"><p> <br />most objects will be created in the C++ code, and exposed to lua. And I don&#39;t want lua destroying my objects on me.
</p></div></div><p>
Ah, okay, understand now. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Polybios)</author>
		<pubDate>Fri, 17 May 2013 20:23:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In case you&#39;re interested, this is the other lua test I made:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;lua.hpp&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;cstring&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;cstdlib&gt;</span>
<span class="number">  4</span>
<span class="number">  5</span><span class="k1">struct</span> Script <span class="k2">{</span>
<span class="number">  6</span>  <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>name<span class="k2">;</span>
<span class="number">  7</span>  <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>script<span class="k2">;</span>
<span class="number">  8</span>  <span class="k1">bool</span> loaded<span class="k2">;</span>
<span class="number">  9</span><span class="k2">}</span> scripts<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span>
<span class="number"> 10</span>  <span class="k2">{</span> <span class="s">"luatest1"</span>, <span class="s">"bar = 123; print(\"luatest1 run!\"); function foo() \n print(\"Hi from luatest1.foo!\");\nend"</span>, <span class="k1">false</span> <span class="k2">}</span>,
<span class="number"> 11</span>  <span class="k2">{</span> <span class="s">"luatest2"</span>, <span class="s">"bar = 123; print(\"luatest2 run!\"); function foo() \n print(\"Hi from luatest2.foo!\");\nend"</span>, <span class="k1">false</span> <span class="k2">}</span>,
<span class="number"> 12</span>  <span class="k2">{</span> <span class="s">"luatest3"</span>, <span class="s">"bar = 123; print(\"luatest3 run!\"); function foo() \n print(\"Hi from luatest3.foo!\");\nend"</span>, <span class="k1">false</span> <span class="k2">}</span>,
<span class="number"> 13</span>  <span class="k2">{</span> <span class="s">"luatest4"</span>, <span class="s">"bar = 123; print(\"luatest4 run!\"); function foo() \n print(\"Hi from luatest4.foo!\");\nend"</span>, <span class="k1">false</span> <span class="k2">}</span>
<span class="number"> 14</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span><span class="k1">bool</span> load_script<span class="k2">(</span>lua_State <span class="k3">*</span>state, <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>name, <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>str<span class="k2">)</span>
<span class="number"> 17</span><span class="k2">{</span>
<span class="number"> 18</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"load script %s\n"</span>, name<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>  
<span class="number"> 20</span>  <span class="k1">if</span><span class="k2">(</span>luaL_loadstring<span class="k2">(</span>state, str<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> LUA_OK<span class="k2">)</span> <span class="c">// 1</span>
<span class="number"> 21</span>  <span class="k2">{</span>
<span class="number"> 22</span>    <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>errstr <span class="k3">=</span> luaL_checklstring<span class="k2">(</span>state, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to load luatest: %s\n"</span>, errstr<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 25</span>  <span class="k2">}</span>
<span class="number"> 26</span>  
<span class="number"> 27</span>  lua_newtable<span class="k2">(</span>state<span class="k2">)</span><span class="k2">;</span> <span class="c">// script env  // 21</span>
<span class="number"> 28</span>  lua_setglobal<span class="k2">(</span>state, name<span class="k2">)</span><span class="k2">;</span> <span class="c">// set global name for new table // 1</span>
<span class="number"> 29</span>
<span class="number"> 30</span>  lua_getglobal<span class="k2">(</span>state, name<span class="k2">)</span><span class="k2">;</span> <span class="c">// 21</span>
<span class="number"> 31</span>  lua_newtable<span class="k2">(</span>state<span class="k2">)</span><span class="k2">;</span> <span class="c">// metatable // 321</span>
<span class="number"> 32</span>  lua_getglobal<span class="k2">(</span>state, <span class="s">"_G"</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// 4321</span>
<span class="number"> 33</span>  lua_setfield<span class="k2">(</span>state, <span class="k3">-</span><span class="n">2</span>, <span class="s">"__index"</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// set __index in metatable to _G // 321</span>
<span class="number"> 34</span>  lua_setmetatable<span class="k2">(</span>state, <span class="k3">-</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// set metatable for script env // 21</span>
<span class="number"> 35</span>  
<span class="number"> 36</span>  lua_setupvalue<span class="k2">(</span>state, <span class="n">1</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// set env for state // 21</span>
<span class="number"> 37</span>  
<span class="number"> 38</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"run script %s\n"</span>, name<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 39</span>  <span class="k1">if</span><span class="k2">(</span>lua_pcall<span class="k2">(</span>state, <span class="n">0</span>, LUA_MULTRET, <span class="n">0</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> LUA_OK<span class="k2">)</span> <span class="c">// run script // 1</span>
<span class="number"> 40</span>  <span class="k2">{</span>
<span class="number"> 41</span>    <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>errstr <span class="k3">=</span> luaL_checklstring<span class="k2">(</span>state, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to run script %s: %s\n"</span>, name, errstr<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 43</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 44</span>  <span class="k2">}</span>
<span class="number"> 45</span>  
<span class="number"> 46</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 47</span><span class="k2">}</span>
<span class="number"> 48</span>
<span class="number"> 49</span><span class="k1">bool</span> run_script<span class="k2">(</span>lua_State <span class="k3">*</span>state, <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>name<span class="k2">)</span>
<span class="number"> 50</span><span class="k2">{</span>  
<span class="number"> 51</span>  lua_getglobal<span class="k2">(</span>state, name<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 52</span>  lua_getfield<span class="k2">(</span>state, <span class="k3">-</span><span class="n">1</span>, <span class="s">"foo"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 53</span>  <span class="k1">if</span><span class="k2">(</span>lua_pcall<span class="k2">(</span>state, <span class="n">0</span>, LUA_MULTRET, <span class="n">0</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> LUA_OK<span class="k2">)</span>
<span class="number"> 54</span>  <span class="k2">{</span>
<span class="number"> 55</span>    <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>errstr <span class="k3">=</span> luaL_checklstring<span class="k2">(</span>state, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 56</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to call %s.foo: %s\n"</span>, name, errstr<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 57</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 58</span>  <span class="k2">}</span>
<span class="number"> 59</span>  
<span class="number"> 60</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 61</span><span class="k2">}</span>
<span class="number"> 62</span>
<span class="number"> 63</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number"> 64</span><span class="k2">{</span>
<span class="number"> 65</span>  lua_State <span class="k3">*</span>state <span class="k3">=</span> luaL_newstate<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 66</span>  luaL_openlibs<span class="k2">(</span>state<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 67</span>  
<span class="number"> 68</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"begin\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 69</span>  
<span class="number"> 70</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> <span class="k1">sizeof</span><span class="k2">(</span>scripts<span class="k2">)</span> <span class="k3">/</span> <span class="k1">sizeof</span><span class="k2">(</span>Script<span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 71</span>  <span class="k2">{</span>
<span class="number"> 72</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>load_script<span class="k2">(</span>state, scripts<span class="k2">[</span>i<span class="k2">]</span>.name, scripts<span class="k2">[</span>i<span class="k2">]</span>.script<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 73</span>    <span class="k2">{</span>
<span class="number"> 74</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to load %s :(\n"</span>, scripts<span class="k2">[</span>i<span class="k2">]</span>.name<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 75</span>      <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 76</span>    <span class="k2">}</span>
<span class="number"> 77</span>    
<span class="number"> 78</span>    scripts<span class="k2">[</span>i<span class="k2">]</span>.loaded <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 79</span>  <span class="k2">}</span>
<span class="number"> 80</span>  
<span class="number"> 81</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> <span class="k1">sizeof</span><span class="k2">(</span>scripts<span class="k2">)</span> <span class="k3">/</span> <span class="k1">sizeof</span><span class="k2">(</span>Script<span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 82</span>  <span class="k2">{</span>
<span class="number"> 83</span>    <span class="k1">if</span><span class="k2">(</span>scripts<span class="k2">[</span>i<span class="k2">]</span>.loaded<span class="k2">)</span>
<span class="number"> 84</span>    <span class="k2">{</span>
<span class="number"> 85</span>      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>run_script<span class="k2">(</span>state, scripts<span class="k2">[</span>i<span class="k2">]</span>.name<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 86</span>      <span class="k2">{</span>
<span class="number"> 87</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"failed to run %s :(\n"</span>, scripts<span class="k2">[</span>i<span class="k2">]</span>.name<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 88</span>        <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 89</span>      <span class="k2">}</span>
<span class="number"> 90</span>    <span class="k2">}</span>
<span class="number"> 91</span>  <span class="k2">}</span>
<span class="number"> 92</span>  
<span class="number"> 93</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"done!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 94</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 95</span><span class="k2">}</span>
</div></div><p>

It loads each script into its own table/namespace in the same lua_State. I intend(ed) to use it to load a bunch of scripts that do certain things, and I can then just run them all in sequence without the overhead of separate states and the like. Oh, and they could potentially share some data if needed. They are partially sandboxed, so a bit safer than just loading a bunch of scripts into the same state, but not quite locked down, which you can do, but I didn&#39;t bother with the added complexity.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 17 May 2013 20:33:14 +0000</pubDate>
	</item>
</rss>
