@@ -206,36 +206,38 @@ local function type_descriptor_handler(descriptor)
206206 setmetatable (descriptor , {
207207 __index = __meta .lastType ;
208208 __call = function (self , ...)
209- local parent = self
210- local object = setmetatable ({}, {
211- __index = parent ,
212- __newindex = parent [" []" ] or parent .__newindex ,
213- __call = parent [" ()" ] or parent .__call ,
214- __tostring = parent .__tostring ,
215- __concat = parent [" .." ] or parent .__concat ,
216- __metatable = parent .__metatable ,
217- __mode = parent .__mode ,
218- __gc = parent .__gc ,
219- __len = parent [" #" ] or parent .__len ,
220- __pairs = parent .__pairs ,
221- __ipairs = parent .__ipairs ,
222- __add = parent [" +" ] or parent .__add ,
223- __sub = parent [" -" ] or parent .__sub ,
224- __mul = parent [" *" ] or parent .__mul ,
225- __div = parent [" /" ] or parent .__div ,
226- __pow = parent [" ^" ] or parent .__pow ,
227- __mod = parent [" %" ] or parent .__mod ,
228- __idiv = parent [" //" ] or parent .__idiv ,
229- __eq = parent [" ==" ] or parent .__eq ,
230- __lt = parent [" <" ] or parent .__lt ,
231- __le = parent [" <=" ] or parent .__le ,
232- __band = parent [" &" ] or parent .__band ,
233- __bor = parent [" |" ] or parent .__bor ,
234- __bxor = parent [" ~" ] or parent .__bxor ,
235- __bnot = parent [" not" ] or parent .__bnot ,
236- __shl = parent [" <<" ] or parent .__shl ,
237- __shr = parent [" >>" ] or parent .__shr
238- })
209+ if not self .__meta .__proto then
210+ self .__meta .__proto = {
211+ __index = self ,
212+ __newindex = self [" []" ] or self .__newindex ,
213+ __call = self [" ()" ] or self .__call ,
214+ __tostring = self .__tostring ,
215+ __concat = self [" .." ] or self .__concat ,
216+ __metatable = self .__metatable ,
217+ __mode = self .__mode ,
218+ __gc = self .__gc ,
219+ __len = self [" #" ] or self .__len ,
220+ __pairs = self .__pairs ,
221+ __ipairs = self .__ipairs ,
222+ __add = self [" +" ] or self .__add ,
223+ __sub = self [" -" ] or self .__sub ,
224+ __mul = self [" *" ] or self .__mul ,
225+ __div = self [" /" ] or self .__div ,
226+ __pow = self [" ^" ] or self .__pow ,
227+ __mod = self [" %" ] or self .__mod ,
228+ __idiv = self [" //" ] or self .__idiv ,
229+ __eq = self [" ==" ] or self .__eq ,
230+ __lt = self [" <" ] or self .__lt ,
231+ __le = self [" <=" ] or self .__le ,
232+ __band = self [" &" ] or self .__band ,
233+ __bor = self [" |" ] or self .__bor ,
234+ __bxor = self [" ~" ] or self .__bxor ,
235+ __bnot = self [" not" ] or self .__bnot ,
236+ __shl = self [" <<" ] or self .__shl ,
237+ __shr = self [" >>" ] or self .__shr
238+ }
239+ end
240+ local object = setmetatable ({}, self .__meta .__proto )
239241 if descriptor .constructor then
240242 descriptor .constructor (object , table.unpack ({... }))
241243 end
0 commit comments