fix compat loadfilex issues and investigate luajit completely

This commit is contained in:
ThePhD 2017-09-10 12:08:43 -04:00
parent 7aca8ac8cd
commit b38a382b03
5 changed files with 55 additions and 24 deletions

View File

@ -20,8 +20,8 @@
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// This file was generated with a script.
// Generated 2017-09-10 14:55:41.345191 UTC
// This header was generated with sol v2.18.2 (revision ae07a5d)
// Generated 2017-09-10 16:07:52.509059 UTC
// This header was generated with sol v2.18.2 (revision 7aca8ac)
// https://github.com/ThePhD/sol2
#ifndef SOL_SINGLE_INCLUDE_HPP
@ -2320,8 +2320,12 @@ COMPAT53_API int luaL_fileresult (lua_State *L, int stat, const char *fname) {
static const char* compat53_f_parser_handler (lua_State *L, void *data, size_t *size) {
(void)L; /* better fix for unused parameter warnings */
struct compat53_f_parser_buffer *p = (struct compat53_f_parser_buffer*)data;
if (feof(p->file) != 0) {
*size = 0;
return NULL;
}
size_t readcount = fread(p->buffer + p->start, sizeof(*p->buffer), sizeof(p->buffer), p->file);
if (ferror(p->file) != 0 || feof(p->file) != 0) {
if (ferror(p->file) != 0) {
*size = 0;
return NULL;
}
@ -2378,6 +2382,7 @@ COMPAT53_API int luaL_loadfilex (lua_State *L, const char *filename, const char
struct compat53_f_parser_buffer fbuf;
fbuf.file = fp;
fbuf.start = 1;
fbuf.buffer[0] = (char)c;
status = lua_load(L, &compat53_f_parser_handler, &fbuf, filename);
fclose(fp);
return status;
@ -17215,7 +17220,7 @@ namespace sol {
if (loaded && loaded->valid())
return std::move(*loaded);
action();
auto sr = stack::get<stack_reference>(L);
stack_reference sr(L, -1);
if (create_global)
set(key, sr);
ensure_package(key, sr);
@ -17337,11 +17342,17 @@ namespace sol {
}
object require_script(const std::string& key, const string_view& code, bool create_global = true, const std::string& chunkname = detail::default_chunk_name(), load_mode mode = load_mode::any) {
return require_core(key, [this, &code, &chunkname, &mode]() {stack::script(L, code, chunkname, mode); }, create_global);
auto action = [this, &code, &chunkname, &mode]() {
stack::script(L, code, chunkname, mode);
};
return require_core(key, action, create_global);
}
object require_file(const std::string& key, const std::string& filename, bool create_global = true, load_mode mode = load_mode::any) {
return require_core(key, [this, &filename, &mode]() {stack::script_file(L, filename, mode); }, create_global);
auto action = [this, &filename, &mode]() {
stack::script_file(L, filename, mode);
};
return require_core(key, action, create_global);
}
template <typename E>

View File

@ -421,8 +421,12 @@ COMPAT53_API int luaL_fileresult (lua_State *L, int stat, const char *fname) {
static const char* compat53_f_parser_handler (lua_State *L, void *data, size_t *size) {
(void)L; /* better fix for unused parameter warnings */
struct compat53_f_parser_buffer *p = (struct compat53_f_parser_buffer*)data;
if (feof(p->file) != 0) {
*size = 0;
return NULL;
}
size_t readcount = fread(p->buffer + p->start, sizeof(*p->buffer), sizeof(p->buffer), p->file);
if (ferror(p->file) != 0 || feof(p->file) != 0) {
if (ferror(p->file) != 0) {
*size = 0;
return NULL;
}
@ -481,6 +485,7 @@ COMPAT53_API int luaL_loadfilex (lua_State *L, const char *filename, const char
struct compat53_f_parser_buffer fbuf;
fbuf.file = fp;
fbuf.start = 1;
fbuf.buffer[0] = (char)c;
status = lua_load(L, &compat53_f_parser_handler, &fbuf, filename);
fclose(fp);
return status;

View File

@ -146,7 +146,7 @@ namespace sol {
if (loaded && loaded->valid())
return std::move(*loaded);
action();
auto sr = stack::get<stack_reference>(L);
stack_reference sr(L, -1);
if (create_global)
set(key, sr);
ensure_package(key, sr);
@ -268,11 +268,17 @@ namespace sol {
}
object require_script(const std::string& key, const string_view& code, bool create_global = true, const std::string& chunkname = detail::default_chunk_name(), load_mode mode = load_mode::any) {
return require_core(key, [this, &code, &chunkname, &mode]() {stack::script(L, code, chunkname, mode); }, create_global);
auto action = [this, &code, &chunkname, &mode]() {
stack::script(L, code, chunkname, mode);
};
return require_core(key, action, create_global);
}
object require_file(const std::string& key, const std::string& filename, bool create_global = true, load_mode mode = load_mode::any) {
return require_core(key, [this, &filename, &mode]() {stack::script_file(L, filename, mode); }, create_global);
auto action = [this, &filename, &mode]() {
stack::script_file(L, filename, mode);
};
return require_core(key, action, create_global);
}
template <typename E>

View File

@ -40,12 +40,24 @@ struct write_file_attempt_object {
};
TEST_CASE("state/require_file", "opening files as 'requires'") {
static const char FILE_NAME[] = "./tmp_thingy.lua";
static const char FILE_NAME_USER[] = "./tmp_thingy_user.lua";
static const char file_require_file[] = "./tmp_thingy.lua";
static const char file_require_file_user[] = "./tmp_thingy_user.lua";
static const char require_file_code[] = "return { modfunc = function () return 221 end }";
static const char require_file_user_code[] = "return { modfunc = function () return foo.new(221) end }";
static std::atomic<int> finished(0);
static std::once_flag flag_file = {}, flag_file_user = {};
std::call_once(flag_file, write_file_attempt_object(), file_require_file, require_file_code);
std::call_once(flag_file_user, write_file_attempt_object(), file_require_file_user, require_file_user_code);
auto clean_files = []() {
if (finished.fetch_add(1) < 1) {
return;
}
std::remove(file_require_file);
std::remove(file_require_file_user);
};
SECTION("with usertypes") {
write_file_attempt(FILE_NAME_USER, "return { modfunc = function () return foo.new(221) end }");
struct foo {
foo(int bar) : bar(bar) {}
@ -60,7 +72,7 @@ TEST_CASE("state/require_file", "opening files as 'requires'") {
"bar", &foo::bar
);
const sol::table thingy1 = lua.require_file("thingy", FILE_NAME_USER);
const sol::table thingy1 = lua.require_file("thingy", file_require_file_user);
REQUIRE(thingy1.valid());
@ -69,16 +81,15 @@ TEST_CASE("state/require_file", "opening files as 'requires'") {
int val1 = foo_v.bar;
REQUIRE(val1 == 221);
clean_files();
}
SECTION("simple") {
write_file_attempt(FILE_NAME, "return { modfunc = function () return 221 end }");
sol::state lua;
lua.open_libraries(sol::lib::base);
const sol::table thingy1 = lua.require_file("thingy", FILE_NAME);
const sol::table thingy2 = lua.require_file("thingy", FILE_NAME);
const sol::table thingy1 = lua.require_file("thingy", file_require_file);
const sol::table thingy2 = lua.require_file("thingy", file_require_file);
REQUIRE(thingy1.valid());
REQUIRE(thingy2.valid());
@ -90,9 +101,8 @@ TEST_CASE("state/require_file", "opening files as 'requires'") {
REQUIRE(val2 == 221);
// must have loaded the same table
REQUIRE((thingy1 == thingy2));
clean_files();
}
std::remove(FILE_NAME);
}
TEST_CASE("state/require_script", "opening strings as 'requires' clauses") {
@ -337,7 +347,7 @@ TEST_CASE("state/script, do, and load", "test success and failure cases for load
std::call_once(flag_file_g, write_file_attempt_object(), file_good, good);
auto clean_files = []() {
if (finished.fetch_add(1) != 11) {
if (finished.fetch_add(1) < 10) {
return;
}
std::remove(file_bad_syntax);

View File

@ -1 +0,0 @@
return { modfunc = function () return foo.new(221) end }