diff options
Diffstat (limited to 'ThirdParty/tolua-5.2.4/src/bin/lua-5.0/variable.lua')
-rw-r--r-- | ThirdParty/tolua-5.2.4/src/bin/lua-5.0/variable.lua | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/ThirdParty/tolua-5.2.4/src/bin/lua-5.0/variable.lua b/ThirdParty/tolua-5.2.4/src/bin/lua-5.0/variable.lua new file mode 100644 index 0000000..176f739 --- /dev/null +++ b/ThirdParty/tolua-5.2.4/src/bin/lua-5.0/variable.lua @@ -0,0 +1,253 @@ +-- tolua: variable class +-- Written by Waldemar Celes +-- TeCGraf/PUC-Rio +-- Jul 1998 +-- $Id: variable.lua,v 1.1 2009-07-09 13:44:18 fabraham Exp $ + +-- This code is free software; you can redistribute it and/or modify it. +-- The software provided hereunder is on an "as is" basis, and +-- the author has no obligation to provide maintenance, support, updates, +-- enhancements, or modifications. + + +-- Variable class +-- Represents a extern variable or a public member of a class. +-- Stores all fields present in a declaration. +classVariable = { + _get = {}, -- mapped get functions + _set = {}, -- mapped set functions +} +classVariable.__index = classVariable +setmetatable(classVariable,classDeclaration) + +-- Print method +function classVariable:print (ident,close) + print(ident.."Variable{") + print(ident.." mod = '"..self.mod.."',") + print(ident.." type = '"..self.type.."',") + print(ident.." ptr = '"..self.ptr.."',") + print(ident.." name = '"..self.name.."',") + if self.dim then print(ident.." dim = '"..self.dim.."',") end + print(ident.." def = '"..self.def.."',") + print(ident.." ret = '"..self.ret.."',") + print(ident.."}"..close) +end + +-- Generates C function name +function classVariable:cfuncname (prefix) + local parent = "" + local unsigned = "" + local ptr = "" + + local p = self:inmodule() or self:innamespace() or self:inclass() + + if p then + parent = "_" .. p + end + + if strfind(self.mod,"(unsigned)") then + unsigned = "_unsigned" + end + + if self.ptr == "*" then ptr = "_ptr" + elseif self.ptr == "&" then ptr = "_ref" + end + + local name = prefix .. parent .. unsigned .. "_" .. gsub(self.name,".*::","") .. ptr + + return name + +end + +-- check if it is a variable +function classVariable:isvariable () + return true +end + +-- get variable value +function classVariable:getvalue (class,static) + if class and static then + return class..'::'..self.name + elseif class then + return 'self->'..self.name + else + return self.name + end +end + +-- get variable pointer value +function classVariable:getpointervalue (class,static) + if class and static then + return class..'::p' + elseif class then + return 'self->p' + else + return 'p' + end +end + +-- Write binding functions +function classVariable:supcode () + local class = self:inclass() + + -- get function ------------------------------------------------ + if class then + output("/* get function:",self.name," of class ",class," */") + self.cgetname = self:cfuncname("tolua_get_"..class) + else + output("/* get function:",self.name," */") + self.cgetname = self:cfuncname("tolua_get") + end + + output("static int",self.cgetname,"(lua_State* tolua_S)") + output("{") + + -- declare self, if the case + local _,_,static = strfind(self.mod,'^%s*(static)') + if class and static==nil then + output(' ',class,'*','self = ') + output('(',class,'*) ') + output('tolua_tousertype(tolua_S,1,0);') + elseif static then + _,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)') + end + + + -- check self value + if class and static==nil then + output('#ifndef TOLUA_RELEASE\n') + output(' if (!self) tolua_error(tolua_S,"invalid \'self\' in accessing variable \''..self.name..'\'",NULL);'); + output('#endif\n') + end + + -- return value + local type = self.type + if gsub(type,'const ','')=='char' and self.dim~='' then + type = 'char*' + end + local t,ct = isbasic(type) + if t then + output(' tolua_push'..t..'(tolua_S,(',ct,')'..self:getvalue(class,static)..');') + else + t = self.type + if self.ptr == '&' or self.ptr == '' then + output(' tolua_pushusertype(tolua_S,(void*)&'..self:getvalue(class,static)..',"',t,'");') + else + output(' tolua_pushusertype(tolua_S,(void*)'..self:getvalue(class,static)..',"',t,'");') + end + end + output(' return 1;') + output('}') + output('\n') + + -- set function ------------------------------------------------ + if not strfind(self.type,'const') then + if class then + output("/* set function:",self.name," of class ",class," */") + self.csetname = self:cfuncname("tolua_set_"..class) + else + output("/* set function:",self.name," */") + self.csetname = self:cfuncname("tolua_set") + end + output("static int",self.csetname,"(lua_State* tolua_S)") + output("{") + + -- declare self, if the case + if class and static==nil then + output(' ',class,'*','self = ') + output('(',class,'*) ') + output('tolua_tousertype(tolua_S,1,0);') + -- check self value + end + -- check types + output('#ifndef TOLUA_RELEASE\n') + output(' tolua_Error tolua_err;') + if class and static==nil then + output(' if (!self) tolua_error(tolua_S,"invalid \'self\' in accessing variable \''..self.name..'\'",NULL);'); + elseif static then + _,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)') + end + + -- check variable type + output(' if (!'..self:outchecktype(2,true)..')') + output(' tolua_error(tolua_S,"#vinvalid type in variable assignment.",&tolua_err);') + output('#endif\n') + + -- assign value + local def = 0 + if self.def ~= '' then def = self.def end + if self.type == 'char' and self.dim ~= '' then -- is string + output(' strncpy(') + if class and static then + output(class..'::'..self.name) + elseif class then + output('self->'..self.name) + else + output(self.name) + end + output(',tolua_tostring(tolua_S,2,',def,'),',self.dim,'-1);') + else + local ptr = '' + if self.ptr~='' then ptr = '*' end + output(' ') + if class and static then + output(class..'::'..self.name) + elseif class then + output('self->'..self.name) + else + output(self.name) + end + local t = isbasic(self.type) + output(' = ') + if not t and ptr=='' then output('*') end + output('((',self.mod,self.type) + if not t then + output('*') + end + output(') ') + if t then + if isenum(self.type) then + output('(int) ') + end + if t=='function' then t='value' end + output('tolua_to'..t,'(tolua_S,2,',def,'));') + else + output('tolua_tousertype(tolua_S,2,',def,'));') + end + end + output(' return 0;') + output('}') + output('\n') + end + +end + +function classVariable:register () + local parent = self:inmodule() or self:innamespace() or self:inclass() + if not parent then + if classVariable._warning==nil then + warning("Mapping variable to global may degrade performance") + classVariable._warning = 1 + end + end + if self.csetname then + output(' tolua_variable(tolua_S,"'..self.lname..'",'..self.cgetname..','..self.csetname..');') + else + output(' tolua_variable(tolua_S,"'..self.lname..'",'..self.cgetname..',NULL);') + end +end + +-- Internal constructor +function _Variable (t) + setmetatable(t,classVariable) + append(t) + return t +end + +-- Constructor +-- Expects a string representing the variable declaration. +function Variable (s) + return _Variable (Declaration(s,'var')) +end + + |