Possible bug loading shared libraries with def_readonly
Tim Michals <[email protected]>
| Newsgroups | gmane.comp.lang.lua.bind.user |
|---|---|
| Message-ID | <[email protected]> |
Here is a brief description. Create a shared library and have class using the .def_readonly attribute... for example
What happens is the print(t.x) prints the following, the hello is the dll, the function is the print(t.x) this should print the value of t, just like the next statement, print(tt.x)
hello
function: 0086ADA0
ok
100
>>> This is the main.c file this is from the example test code file called test_class_info.cpp
// luaBindTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
// Copyright Daniel Wallin 2009. Use, modification and distribution is
// subject to the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <luabind/luabind.hpp>
#include <luabind/class_info.hpp>
#include <luabind/error.hpp>
#include <iostream>
extern "C" {
#include "lua.h"
#include "lstate.h"
#include "ldo.h"
#include "lgc.h"
#include "lauxlib.h"
#include "lualib.h"
#include "lobject.h"
}
struct X
{
void f()
{}
X():x(100), y(200){}
int x;
int y;
};
bool dostring(lua_State* L, const char* str)
{
if (luaL_loadbuffer(L, str, std::strlen(str), str) || lua_pcall(L, 0, 0, 0))
{
const char* a = lua_tostring(L, -1);
std::cout << a << "\n";
lua_pop(L, 1);
return true;
}
return false;
}
bool DOSTRING(struct lua_State *state_, std::string str)
{
try
{
dostring(state_, str.c_str());
}
catch (luabind::error const& e)
{
std::cout << "error" << e.what();
// TEST_ERROR(lua_tostring(e.state(), -1));
// lua_pop(L, 1);
}
catch (std::string const& s)
{
std::cout << "error" << s;
// TEST_ERROR(s.c_str());
}
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
using namespace luabind;
lua_State* L = lua_open();
luaL_openlibs(L);
luabind::open(L);
bind_class_info(L);
module(L) [
class_<X>("X")
.def(constructor<>())
.def("f", &X::f)
.def_readonly("x", &X::x)
.def_readonly("y", &X::y)
];
DOSTRING(L,
"x = X()\n"
"info = class_info(x)\n"
"assert(info.name == 'X')\n"
"assert(info.methods['f'] == x.f)\n"
"assert(info.methods['__init'] == x.__init)\n"
"assert(info.attributes[1] == 'y')\n"
"assert(info.attributes[2] == 'x')\n"
"require('luabindLaterLoader')\n"
"t = YY()\n"
"print(t.x)\n"
"print('ok')\n"
"tt=X()\n"
"print(tt.x)\n"
);
return 0;
}
The shared loadable module or dll in my case
// Copyright (c) 2005 Daniel Wallin and Arvid Norberg
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
// ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
// OR OTHER DEALINGS IN THE SOFTWARE.
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#include <iostream>
#include <luabind/luabind.hpp>
#ifdef WIN32
#ifdef LUABINDLATERLOADER_EXPORTS
#define PLUGIN_API __declspec(dllexport)
#else
#define PLUGIN_API __declspec(dllimport)
#endif
#else //LINUX
#define SIMPLECPLUGIN_API __attribute__ ((visibility("default")))
#endif
void greet()
{
std::cout << "hello world!\n";
}
struct YY
{
YY():x(10), y(-10){}
void f()
{}
int x;
int y;
};
bool PLUGIN_API bind_Plugin(lua_State* L)
{
using namespace luabind;
if (L == NULL)
return false;
try
{
// open(L);
module(L)
[
class_<YY>("YY")
.def(constructor<>())
.def("f", &YY::f)
.def_readonly("x", &YY::x)
.def_readonly("y", &YY::y)
,
def("greet", &greet)
];
} catch ( ... )
{
return false;
}
return true;
}
extern "C" int PLUGIN_API luaopen_luabindLaterLoader(lua_State *L)
{
puts("hello");
bind_Plugin(L);
return 0;
}
_________________________________________________________________
Windows Live™ SkyDrive™: Get 25 GB of free online storage.
http://windowslive.com/online/skydrive?ocid=TXT_TAGLM_WL_SD_25GB_062009
------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables unlimited
royalty-free distribution of the report engine for externally facing
server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
luabind-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/luabind-user