diff options
Diffstat (limited to 'src/lua/operator.lua')
-rw-r--r-- | src/lua/operator.lua | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/lua/operator.lua b/src/lua/operator.lua new file mode 100644 index 00000000..7a42cf1b --- /dev/null +++ b/src/lua/operator.lua @@ -0,0 +1,111 @@ +-- tolua: operator class +-- Written by Waldemar Celes +-- TeCGraf/PUC-Rio +-- Jul 1998 +-- $Id: operator.lua,v 1.2 2001/11/26 23:00:27 darkgod 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. + + +-- Operator class +-- Represents an operator function or a class operator method. +-- It stores the same fields as functions do plus: +-- kind = set of character representing the operator (as it appers in C++ code) +classOperator = { + kind = '', + _base = classFunction, +} +settag(classOperator,tolua_tag) + +-- table to transform operator kind into the appropriate tag method name +_TM = {['+'] = 'operator_add', + ['-'] = 'operator_sub', + ['*'] = 'operator_mul', + ['/'] = 'operator_div', + ['<'] = 'operator_lt', + ['[]'] = 'operator_get', + ['&[]'] = 'operator_set', + } + + +-- Print method +function classOperator:print (ident,close) + print(ident.."Operator{") + print(ident.." kind = '"..self.kind.."',") + print(ident.." mod = '"..self.mod.."',") + print(ident.." type = '"..self.type.."',") + print(ident.." ptr = '"..self.ptr.."',") + print(ident.." name = '"..self.name.."',") + print(ident.." const = '"..self.const.."',") + print(ident.." cname = '"..self.cname.."',") + print(ident.." lname = '"..self.lname.."',") + print(ident.." args = {") + local i=1 + while self.args[i] do + self.args[i]:print(ident.." ",",") + i = i+1 + end + print(ident.." }") + print(ident.."}"..close) +end + +-- Internal constructor +function _Operator (t) + t._base = classOperator + settag(t,tolua_tag) + + if t.const ~= 'const' and t.const ~= '' then + error("#invalid 'const' specification") + end + + append(t) + if not t:inclass() then + error("#operator can only be defined as class member") + end + + t.cname = t:cfuncname("toluaI")..t:overload(t) + t.name = t.name..t.kind + return t +end + +-- Constructor +-- Expects three strings: one representing the function declaration, +-- another representing the argument list, and the third representing +-- the "const" or empty string. +function Operator (d,k,a,c) + local t = split(strsub(a,2,strlen(a)-1),',') -- eliminate braces + local i=1 + local l = {n=0} + while t[i] do + l.n = l.n+1 + l[l.n] = Declaration(t[i],'var') + i = i+1 + end + if k == '[]' then + d = gsub(d,'&','') + elseif k=='&[]' then + l.n = l.n+1 + l[l.n] = Declaration(d,'var') + l[l.n].name = 'toluaI_value' + end + local f = Declaration(d,'func') + if k == '[]' and (l[1]==nil or isbasic(l[1].type)~='number') then + error('operator[] can only be defined for numeric index.') + end + f.args = l + f.const = c + f.kind = gsub(k,"%s","") + f.lname = _TM[f.kind] + if not f.lname then + error("tolua: no support for operator" .. f.kind) + end + if f.kind == '[]' and not strfind(f.mod,'const') then + Operator(d,'&'..k,a,c) -- create correspoding set operator + end + return _Operator(f) +end + + |