elua: make the lua generator generate things again - type stuff will need re-work
This commit is contained in:
parent
c548981046
commit
30e8d8a735
|
@ -57,6 +57,9 @@ getopt.parse {
|
|||
for i, v in ipairs(opts["I"] or {}) do
|
||||
lualian.include_dir(v)
|
||||
end
|
||||
if os.getenv("EFL_RUN_IN_TREE") then
|
||||
lualian.system_directory_scan()
|
||||
end
|
||||
lualian.load_eot_files()
|
||||
for i, fname in ipairs(args) do
|
||||
gen_file(opts, i, fname)
|
||||
|
|
|
@ -51,18 +51,10 @@ local known_ptr_in = {
|
|||
local convfuncs = {}
|
||||
|
||||
local build_calln = function(tps, expr, isin)
|
||||
local nm, own
|
||||
local buf = { "__convert", isin and "IN" or "OUT" }
|
||||
local owns = {}
|
||||
while tps do
|
||||
tps, nm, own = tps:information_get()
|
||||
owns[#owns + 1] = own and "true" or "false"
|
||||
buf[#buf + 1] = nm:gsub("%s", "_"):gsub("%*", "_ptr"):gsub("__+", "_")
|
||||
end
|
||||
local funcn = table.concat(buf, "_")
|
||||
local funcn = "__convert_type_wip"
|
||||
convfuncs[funcn] = true
|
||||
return table.concat {
|
||||
funcn, "(", expr, ", ", table.concat(owns, ", "), ")"
|
||||
funcn, "(", expr, ")"
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -86,7 +78,7 @@ local typeconv_in = function(tps, tp, expr, isconst, isptr)
|
|||
end
|
||||
|
||||
local typeconv = function(tps, expr, isin)
|
||||
local tp = select(2, tps:information_get())
|
||||
local tp = tps:c_type_get()
|
||||
-- strip away type qualifiers
|
||||
local isconst, tpr = tp:match("^(const)[ ]+(.+)$")
|
||||
isconst = not not isconst
|
||||
|
@ -157,12 +149,12 @@ local Method = Node:clone {
|
|||
|
||||
local meth = self.method
|
||||
local pars = meth:parameters_list_get()
|
||||
local rett = meth:return_types_list_get(eolian.function_type.METHOD)
|
||||
local rett = meth:return_type_get(eolian.function_type.METHOD)
|
||||
|
||||
local proto = {
|
||||
name = meth:name_get()
|
||||
}
|
||||
proto.ret_type = rett and (select(2, rett:information_get())) or "void"
|
||||
proto.ret_type = rett and rett:c_type_get() or "void"
|
||||
local args, cargs, vargs = { "self" }, {}, {}
|
||||
proto.args, proto.cargs, proto.vargs = args, cargs, vargs
|
||||
local rets = {}
|
||||
|
@ -182,8 +174,8 @@ local Method = Node:clone {
|
|||
|
||||
if #pars > 0 then
|
||||
for i, v in ipairs(pars) do
|
||||
local dir, tp, nm = v:information_get()
|
||||
local tps = v:types_list_get()
|
||||
local dir, tps, nm = v:information_get()
|
||||
local tp = tps:c_type_get()
|
||||
if dir == dirs.OUT or dir == dirs.INOUT then
|
||||
if dir == dirs.INOUT then
|
||||
args[#args + 1] = nm
|
||||
|
@ -276,8 +268,8 @@ local Property = Method:clone {
|
|||
local argn = (#keys > 1) and "keys" or "key"
|
||||
for i, v in ipairs(keys) do
|
||||
local nm = v:name_get()
|
||||
local tps = v:types_list_get()
|
||||
local tp = select(2, tps:information_get())
|
||||
local tps = v:type_get()
|
||||
local tp = tps:c_type_get()
|
||||
cargs [#cargs + 1] = tp .. " " .. nm
|
||||
vargs [#vargs + 1] = typeconv(tps, argn .. "[" .. i
|
||||
.. "]", true)
|
||||
|
@ -289,13 +281,13 @@ local Property = Method:clone {
|
|||
if #vals > 0 then
|
||||
if self.isget then
|
||||
if #vals == 1 and not rett then
|
||||
local tps = vals[1]:types_list_get()
|
||||
proto.ret_type = (select(2, tps:information_get()))
|
||||
local tps = vals[1]:type_get()
|
||||
proto.ret_type = tps:c_type_get()
|
||||
rets[#rets + 1] = typeconv(tps, "v", false)
|
||||
else
|
||||
for i, v in ipairs(vals) do
|
||||
local dir, tp, nm = v:information_get()
|
||||
local tps = v:types_list_get()
|
||||
local dir, tps, nm = v:information_get()
|
||||
local tp = v:c_type_get()
|
||||
cargs [#cargs + 1] = tp .. " *" .. nm
|
||||
vargs [#vargs + 1] = nm
|
||||
allocs[#allocs + 1] = { tp, nm }
|
||||
|
@ -306,8 +298,8 @@ local Property = Method:clone {
|
|||
local argn = (#keys > 1) and "vals" or "val"
|
||||
args[#args + 1] = argn
|
||||
for i, v in ipairs(vals) do
|
||||
local dir, tp, nm = v:information_get()
|
||||
local tps = v:types_list_get()
|
||||
local dir, tps, nm = v:information_get()
|
||||
local tp = tps:c_type_get()
|
||||
cargs[#cargs + 1] = tp .. " " .. nm
|
||||
vargs[#vargs + 1] = typeconv(tps, argn .. "[" .. i .. "]",
|
||||
true)
|
||||
|
@ -681,6 +673,10 @@ M.load_eot_files = function()
|
|||
return eolian.all_eot_files_parse()
|
||||
end
|
||||
|
||||
M.system_directory_scan = function()
|
||||
return eolian.system_directory_scan()
|
||||
end
|
||||
|
||||
M.generate = function(fname, modname, libname, fstream)
|
||||
if not eolian.eo_file_parse(fname) then
|
||||
error("Failed parsing file: " .. fname)
|
||||
|
|
|
@ -6,6 +6,7 @@ local ffi = require("ffi")
|
|||
ffi.cdef [[
|
||||
typedef unsigned char Eina_Bool;
|
||||
typedef struct _Eina_List Eina_List;
|
||||
typedef struct _Eina_Iterator Eina_Iterator;
|
||||
|
||||
typedef struct _Eolian_Class Eolian_Class;
|
||||
typedef struct _Eolian_Function Eolian_Function;
|
||||
|
@ -86,7 +87,7 @@ ffi.cdef [[
|
|||
Eolian_Function_Type eolian_function_type_get(const Eolian_Function *function_id);
|
||||
Eolian_Function_Scope eolian_function_scope_get(const Eolian_Function *function_id);
|
||||
const char *eolian_function_name_get(const Eolian_Function *function_id);
|
||||
const char *eolian_function_full_c_name_get(const Eolian_Function function_id, const char *prefix);
|
||||
const char *eolian_function_full_c_name_get(const Eolian_Function *function_id, const char *prefix);
|
||||
const Eolian_Function *eolian_class_function_find_by_name(const Eolian_Class *klass, const char *func_name, Eolian_Function_Type f_type);
|
||||
const char *eolian_function_data_get(const Eolian_Function *function_id, const char *key);
|
||||
Eina_Bool eolian_function_is_virtual_pure(const Eolian_Function *function_id, Eolian_Function_Type f_type);
|
||||
|
@ -118,15 +119,15 @@ ffi.cdef [[
|
|||
Eina_Iterator *eolian_type_subtypes_list_get(const Eolian_Type *tp);
|
||||
Eina_Iterator *eolian_type_struct_field_names_list_get(const Eolian_Type *tp);
|
||||
const Eolian_Type *eolian_type_struct_field_get(const Eolian_Type *tp, const char *field);
|
||||
Eina_Stringshare *eolian_type_struct_field_description_get(const Eolian_Type *tp, const char *field);
|
||||
Eina_Stringshare *eolian_type_struct_description_get(const Eolian_Type *tp);
|
||||
const char *eolian_type_struct_field_description_get(const Eolian_Type *tp, const char *field);
|
||||
const char *eolian_type_struct_description_get(const Eolian_Type *tp);
|
||||
const Eolian_Type *eolian_type_return_type_get(const Eolian_Type *tp);
|
||||
const Eolian_Type *eolian_type_base_type_get(const Eolian_Type *tp);
|
||||
Eina_Bool eolian_type_is_own(const Eolian_Type *tp);
|
||||
Eina_Bool eolian_type_is_const(const Eolian_Type *tp);
|
||||
Eina_Stringshare *eolian_type_c_type_named_get(const Eolian_Type *tp, const char *name);
|
||||
Eina_Stringshare *eolian_type_c_type_get(const Eolian_Type *tp);
|
||||
Eina_Stringshare *eolian_type_name_get(const Eolian_Type *tp);
|
||||
const char *eolian_type_c_type_named_get(const Eolian_Type *tp, const char *name);
|
||||
const char *eolian_type_c_type_get(const Eolian_Type *tp);
|
||||
const char *eolian_type_name_get(const Eolian_Type *tp);
|
||||
]]
|
||||
|
||||
local cutil = require("cutil")
|
||||
|
@ -160,6 +161,7 @@ end
|
|||
|
||||
M.system_directory_scan = function()
|
||||
return eolian.eolian_system_directory_scan() ~= 0
|
||||
end
|
||||
|
||||
M.all_eo_files_parse = function()
|
||||
return eolian.eolian_all_eo_files_parse() ~= 0
|
||||
|
@ -302,8 +304,8 @@ M.Function = ffi.metatype("Eolian_Function", {
|
|||
return ffi.string(v)
|
||||
end,
|
||||
|
||||
full_c_name_get = function(self)
|
||||
local v = eolian.eolian_function_full_c_name_get(self)
|
||||
full_c_name_get = function(self, prefix)
|
||||
local v = eolian.eolian_function_full_c_name_get(self, prefix)
|
||||
if v == nil then return nil end
|
||||
return ffi.string(v)
|
||||
end,
|
||||
|
@ -423,8 +425,8 @@ ffi.metatype("Eolian_Implement", {
|
|||
end,
|
||||
|
||||
information_get = function(self)
|
||||
local cl = ffi.new("Eolian_Class[1]")
|
||||
local fn = ffi.new("Eolian_Function[1]")
|
||||
local cl = ffi.new("const Eolian_Class*[1]")
|
||||
local fn = ffi.new("const Eolian_Function*[1]")
|
||||
local tp = ffi.new("Eolian_Function_Type[1]")
|
||||
eolian.eolian_implement_information_get(self, cl, fn, tp)
|
||||
return cl[0], fn[0], tp[0]
|
||||
|
|
Loading…
Reference in New Issue