From e98245ae3492ce132ddfe9153b1a5a80f3a3e3e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Wed, 26 Jun 2019 15:34:13 +0800 Subject: =?UTF-8?q?=E8=AE=B0=E5=BD=95=20overload?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/vm/emmy.lua | 23 ++++++++++++++++++++++- server/src/vm/function.lua | 12 +++++++++++- server/src/vm/vm.lua | 2 +- 3 files changed, 34 insertions(+), 3 deletions(-) (limited to 'server/src/vm') diff --git a/server/src/vm/emmy.lua b/server/src/vm/emmy.lua index 42f3a72a..3ad0a472 100644 --- a/server/src/vm/emmy.lua +++ b/server/src/vm/emmy.lua @@ -8,6 +8,7 @@ function mt:clearEmmy() self._emmyReturns = nil self._emmyGeneric = nil self._emmyComment = nil + self._emmyOverLoads = nil end function mt:doEmmy(action) @@ -37,6 +38,8 @@ function mt:doEmmy(action) self:doEmmyFunctionType(action) elseif tp == 'emmySee' then self:doEmmySee(action) + elseif tp == 'emmyOverLoad' then + self:doEmmyOverLoad(action) elseif tp == 'emmyIncomplete' then self:doEmmyIncomplete(action) elseif tp == 'emmyComment' then @@ -64,6 +67,13 @@ function mt:addEmmyReturn(rtn) self._emmyReturns[#self._emmyReturns+1] = rtn end +function mt:addEmmyOverLoad(funcObj) + if not self._emmyOverLoads then + self._emmyOverLoads = {} + end + self._emmyOverLoads[#self._emmyOverLoads+1] = funcObj +end + function mt:getEmmyParams() local params = self._emmyParams self._emmyParams = nil @@ -76,6 +86,12 @@ function mt:getEmmyReturns() return returns end +function mt:getEmmyOverLoads() + local overLoads = self._emmyOverLoads + self._emmyOverLoads = nil + return overLoads +end + function mt:getEmmyGeneric() local generic = self._emmyGeneric self._emmyGeneric = nil @@ -302,12 +318,12 @@ function mt:buildEmmyFunctionType(source) func:setReturn(1, value) end funcObj:bindFunction(func) - self._emmy = funcObj return funcObj end function mt:doEmmyFunctionType(action) local funcObj = self:buildEmmyFunctionType(action) + self._emmy = funcObj return funcObj end @@ -338,3 +354,8 @@ function mt:doEmmySee(action) self:instantSource(action[2]) action[2]:set('emmy see', action) end + +function mt:doEmmyOverLoad(action) + local funcObj = self:buildEmmyFunctionType(action) + self:addEmmyOverLoad(funcObj) +end diff --git a/server/src/vm/function.lua b/server/src/vm/function.lua index 60498033..8f7ac6c2 100644 --- a/server/src/vm/function.lua +++ b/server/src/vm/function.lua @@ -465,7 +465,7 @@ function mt:markGlobal() end end -function mt:setEmmy(params, returns) +function mt:setEmmy(params, returns, overLoads) if params then self._emmyParams = params for _, param in ipairs(params) do @@ -479,6 +479,12 @@ function mt:setEmmy(params, returns) rtn:getSource():set('emmy function', self) end end + if overLoads then + self._emmyOverLoads = overLoads + for _, ol in ipairs(overLoads) do + ol:getSource():set('emmy function', self) + end + end end ---@param comment string @@ -495,6 +501,10 @@ function mt:getEmmyParams() return self._emmyParams end +function mt:getEmmyOverLoads() + return self._emmyOverLoads +end + local function create(source) if not source then error('Function need source') diff --git a/server/src/vm/vm.lua b/server/src/vm/vm.lua index 3a884404..f8632dab 100644 --- a/server/src/vm/vm.lua +++ b/server/src/vm/vm.lua @@ -1097,7 +1097,7 @@ end function mt:createFunction(source) local value = self:createValue('function', source) local func = functionMgr.create(source) - func:setEmmy(self:getEmmyParams(), self:getEmmyReturns()) + func:setEmmy(self:getEmmyParams(), self:getEmmyReturns(), self:getEmmyOverLoads()) func:setComment(self:getEmmyComment()) value:setFunction(func) value:setType('function', 1.0) -- cgit v1.2.3