From c5bba9ae8121d250284ecd1ce69ffe344f04fea8 Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Fri, 26 Jan 2018 05:45:38 +0330 Subject: fixed string type for xobjs, also xcall can now call functions by name as well --- bruiser/bruiser.cpp | 36 ++++++++++++++++++++++++------------ bruiser/bruiserffi.c | 12 ++++++++++-- bruiser/bruiserffi.h | 3 +-- bruiser/executioner.h | 7 +++++++ bruiser/lua-scripts/demo1.lua | 22 +++++++++++++++++++--- 5 files changed, 61 insertions(+), 19 deletions(-) diff --git a/bruiser/bruiser.cpp b/bruiser/bruiser.cpp index 1eff772..a052b64 100644 --- a/bruiser/bruiser.cpp +++ b/bruiser/bruiser.cpp @@ -1259,7 +1259,17 @@ class LuaWrapper int argc = lua_tointeger(__ls, 1); // 2-table of strings std::string ffi_ret_type_string = lua_tostring(__ls, 3); - int x_index = lua_tointeger(__ls, 4); + + void* x_ptr; + if (lua_type(__ls, 4) == LUA_TNUMBER) { + x_ptr = executioner.getvptrbyindex(lua_tointeger(__ls, 4)).first; + } else if (lua_type(__ls, 4) == LUA_TSTRING) { + x_ptr = executioner.getvptrbyname(lua_tostring(__ls, 4)).first; + } else { + PRINT_WITH_COLOR_LB(RED, "argument 4 is neihter an index nor a string."); + lua_pushnil(__ls); + return 1; + } // 5-the actual args-table of values // @DEVI-FIXME: currently we are not handling structs at all @@ -1275,6 +1285,7 @@ class LuaWrapper else if (std::strcmp(ffi_ret_type_string.c_str(), "sint64") == 0) {ret_type = ffi_type_sint64;} else if (std::strcmp(ffi_ret_type_string.c_str(), "float") == 0) {ret_type = ffi_type_float;} else if (std::strcmp(ffi_ret_type_string.c_str(), "double") == 0) {ret_type = ffi_type_double;} + else if (std::strcmp(ffi_ret_type_string.c_str(), "string") == 0) {ret_type = ffi_type_pointer;} else if (std::strcmp(ffi_ret_type_string.c_str(), "pointer") == 0) {ret_type = ffi_type_pointer;} else if (std::strcmp(ffi_ret_type_string.c_str(), "struct") == 0) {ret_type = ffi_type_pointer;} else {PRINT_WITH_COLOR_LB(RED, "unknown return type string.");return 0; @@ -1292,7 +1303,6 @@ class LuaWrapper for (int i = 1; i <= table_length_2; ++i) { lua_rawgeti(__ls, 2, i); args[i-1] = lua_tostring(__ls, i + numargs); - //std::cout << YELLOW << args[i-1] << NORMAL << "\n"; } std::list uints; @@ -1319,8 +1329,8 @@ class LuaWrapper std::cout << CYAN << "table_length: " << table_length_5 << NORMAL << "\n"; for (int i = 1; i <= table_length_5; ++i) { lua_rawgeti(__ls, 5, i); - if (lua_type(__ls, i) == LUA_TBOOLEAN) {} - else if (lua_type(__ls, i) == LUA_TLIGHTUSERDATA) {} + if (lua_type(__ls, i+numargs+argc) == LUA_TBOOLEAN) {} + else if (lua_type(__ls, i+numargs+argc) == LUA_TLIGHTUSERDATA) {} else if (lua_type(__ls, i+numargs+argc) == LUA_TNUMBER) { double dummy = lua_tonumber(__ls, i + numargs + argc); if (dummy == (long long int)dummy) { // FIXME @@ -1332,21 +1342,22 @@ class LuaWrapper values[i-1]=&doubles.back(); } // float } - else if (lua_type(__ls, i) == LUA_TSTRING) {} - else if (lua_type(__ls, i) == LUA_TTABLE) {} - else if (lua_type(__ls, i) == LUA_TFUNCTION) {} - else if (lua_type(__ls, i) == LUA_TUSERDATA) {} - else if (lua_type(__ls, i) == LUA_TTHREAD) {} + else if (lua_type(__ls, i+numargs+argc) == LUA_TSTRING) { + strings.push_back(lua_tostring(__ls, i + numargs + argc)); + values[i-1]=&strings.back(); + } + else if (lua_type(__ls, i+numargs+argc) == LUA_TTABLE) {} + else if (lua_type(__ls, i+numargs+argc) == LUA_TFUNCTION) {} + else if (lua_type(__ls, i+numargs+argc) == LUA_TUSERDATA) {} + else if (lua_type(__ls, i+numargs+argc) == LUA_TTHREAD) {} } - auto x_ptr = executioner.getvptrbyindex(x_index).first; void* result; if (x_ptr != nullptr) { - std::cout << "calling xobj named " << GREEN << executioner.getvptrbyindex(x_index).second << NORMAL << "\n"; result = ffi_callX(argc, args, ret_type, x_ptr, values); if (result == nullptr) {PRINT_WITH_COLOR_LB(RED, "ffi_callX returned null.");return 0;} - if (std::strcmp(ffi_ret_type_string.c_str(), "void") == 0) {return 0;} + if (std::strcmp(ffi_ret_type_string.c_str(), "void") == 0) {lua_pushnil(__ls);} else if (std::strcmp(ffi_ret_type_string.c_str(), "uint8") == 0) {lua_pushinteger(__ls, ffi_reinterpret_uint8_t(result));} else if (std::strcmp(ffi_ret_type_string.c_str(), "sint8") == 0) {lua_pushinteger(__ls, ffi_reinterpret_int8_t(result));} else if (std::strcmp(ffi_ret_type_string.c_str(), "uint16") == 0) {lua_pushinteger(__ls, ffi_reinterpret_uint16_t(result));} @@ -1357,6 +1368,7 @@ class LuaWrapper else if (std::strcmp(ffi_ret_type_string.c_str(), "sint64") == 0) {lua_pushinteger(__ls, ffi_reinterpret_int64_t(result));} else if (std::strcmp(ffi_ret_type_string.c_str(), "float") == 0) {lua_pushnumber(__ls, ffi_reinterpret_float(result));} else if (std::strcmp(ffi_ret_type_string.c_str(), "double") == 0) {lua_pushnumber(__ls, ffi_reinterpret_double(result));} + else if (std::strcmp(ffi_ret_type_string.c_str(), "string") == 0) {lua_pushstring(__ls, ffi_reinterpret_string(result));} else if (std::strcmp(ffi_ret_type_string.c_str(), "pointer") == 0) {lua_pushinteger(__ls, ffi_reinterpret_uintptr_t(result));} else if (std::strcmp(ffi_ret_type_string.c_str(), "struct") == 0) {} else {PRINT_WITH_COLOR_LB(RED, "unknown return type string.");return 0;} diff --git a/bruiser/bruiserffi.c b/bruiser/bruiserffi.c index 3594af7..454e3d7 100644 --- a/bruiser/bruiserffi.c +++ b/bruiser/bruiserffi.c @@ -45,8 +45,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.* X(int32_t, "uint8_t")\ X(int64_t, "uint8_t")\ X(uintptr_t, "uint8_t")\ - //X(float, "uint8_t")\ - X(double, "uint8_t") #define X(X1,X2) REINTERPRET_GENERATOR(X1) X_LIST_GEN @@ -55,6 +53,7 @@ X_LIST_GEN #undef REINTERPRET_GENERATOR float ffi_reinterpret_float(void* result) {return *(float*)&result;} double ffi_reinterpret_double(void* result) {return *(double*)&result;} +char* ffi_reinterpret_string(void* result) {return (char*)result;} void ffi_value_ctor(void** ret, int argc, ...) { va_list value_list; @@ -128,6 +127,7 @@ ffi_type* ffi_type_ctor(const char* arg_string) { else if (strcmp(arg_string, "float") == 0) {return &ffi_type_float;} else if (strcmp(arg_string, "double") == 0) {return &ffi_type_double;} else if (strcmp(arg_string, "pointer") == 0) {return &ffi_type_pointer;} + else if (strcmp(arg_string, "string") == 0) {return &ffi_type_pointer;} // @DEVI-FIXME: currently we are not handling structs at all else if (strcmp(arg_string, "struct") == 0) {return &ffi_type_pointer;} else { @@ -171,11 +171,13 @@ void* ffi_callX_var(int argc, const char** arg_string, ffi_type rtype, void* x_p uint32_t add2(uint32_t a, uint32_t b) {return a+b;} uint32_t sub2(uint32_t a, uint32_t b) {return a-b;} double addd(double a, double b) {return a+b;} +char* passthrough(char* a) {return a;} #pragma weak main int main(int argc, char** argv) { void* padd = &add2; void* psub = &sub2; void* padd2 = &addd; + void* pstring = &passthrough; int argcount = 2; ffi_type ret_type = ffi_type_uint32; const char* args[] = {"uint32", "uint32"}; @@ -197,6 +199,12 @@ int main(int argc, char** argv) { void* values2[] = {&c, &d}; result = ffi_callX(argcount, args2, ret_type, padd2, values2); fprintf(stdout, "result of calling addd is %f\n", ffi_reinterpret_double(result)); + const char* args3[] = {"string"}; + char* dummy = "i live!"; + void* values3[] = {&dummy}; + result = ffi_callX(1, args3, ffi_type_pointer, pstring, values3); + fprintf(stdout, "result of calling passthrough is %s\n", ffi_reinterpret_string(result)); + return 0; } /**********************************************************************************************************************/ diff --git a/bruiser/bruiserffi.h b/bruiser/bruiserffi.h index e9b6b27..c7a2821 100644 --- a/bruiser/bruiserffi.h +++ b/bruiser/bruiserffi.h @@ -41,8 +41,6 @@ extern "C" { X(int32_t, "uint8_t")\ X(int64_t, "uint8_t")\ X(uintptr_t, "uint8_t")\ - //X(float, "uint8_t")\ - X(double, "uint8_t") #define X(X1,X2) REINTERPRET_GENERATOR(X1) X_LIST_GEN @@ -51,6 +49,7 @@ X_LIST_GEN #undef REINTERPRET_GENERATOR float ffi_reinterpret_float(void* result); double ffi_reinterpret_double(void* result); +char* ffi_reinterpret_string(void* result); /** * @brief constructs the arguments to be passed to ffi_call. diff --git a/bruiser/executioner.h b/bruiser/executioner.h index 5c04be1..4793915 100644 --- a/bruiser/executioner.h +++ b/bruiser/executioner.h @@ -235,6 +235,12 @@ class Executioner { } return std::make_pair(nullptr, ""); } + std::pair getvptrbyname(const char* name) { + for (auto &iter : vptrs) { + if (std::strcmp(name, iter.second.c_str()) == 0) return iter; + } + return std::make_pair(nullptr, ""); + } private: std::vector> obj_mem_ptrs; @@ -328,6 +334,7 @@ class XGlobals { XGlobals() {} ~XGlobals() {} private: + std::list> globals; }; /**********************************************************************************************************************/ /**********************************************************************************************************************/ diff --git a/bruiser/lua-scripts/demo1.lua b/bruiser/lua-scripts/demo1.lua index 75778d2..5ef6bd2 100644 --- a/bruiser/lua-scripts/demo1.lua +++ b/bruiser/lua-scripts/demo1.lua @@ -152,6 +152,8 @@ function main() local adddouble_code = codeTableByName_number("'adddouble'") local subdouble_code = codeTableByName_number("'subdouble'") local triple_code = codeTableByName_number("'triple'") + local quad_code = codeTableByName_number("'quad'") + local passthrough_code = codeTableByName_number("'passthrough'") printFuncSizes() @@ -161,6 +163,9 @@ function main() xobjregister(adddouble_code, "adddouble") xobjregister(subdouble_code, "subdouble") xobjregister(triple_code, "triple") + xobjregister(quad_code, "quad") + xobjregister(passthrough_code, "passthrough") + a=xcall(2,{"uint32","uint32"},"uint32",0, {30,20}) print("call add result", a) a=xcall(2,{"uint32", "uint32"},"uint32",1, {30,20}) @@ -170,17 +175,28 @@ function main() arg2 = 200 a=xcall(2,{"sint32", "sint32"},"sint32",1, {arg1,arg2}) print("xcall returned:",a) + if a ~= -100 then print("test failed") end a=xcall(2,{"double", "double"},"double",2, {333.333,222.222}) print("xcall returned:",a) -- FIXME - if a ~= 555.555 then print("test failed") end + if tostring(a) ~= tostring(555.555) then print("test failed") end a=xcall(2,{"double", "double"},"double",3, {333.333,222.222}) print("xcall returned:",a) - if a ~= 111.111 then print("test failed") end + if tostring(a) ~= tostring(111.111) then print("test failed") end + a=xcall(3,{"double", "double", "double"},"double",4, {333.333,222.222,111.111}) print("xcall returned:",a) - if a ~= 666.666 then print("test failed") end + a=xcall(3,{"double", "double", "double"},"double","triple", {333.333,222.222,111.111}) + print("xcall returned:",a) + if tostring(a) ~= tostring(666.666) then print("test failed") end + + --a=xcall(4,{"sint32", "sint32", "sint32", "sint32"},"sint32",5, {10,20,30,40}) + --print("xcall returned:",a) + --if a ~= 100 then print("test failed") end + + a=xcall(1,{"string"},"string","passthrough", {"i live!"}) + print("xcall returned:",a) end main() -- cgit v1.2.3