On 3 October 2016 at 00:51, Peter Wu <pe...@lekensteyn.nl> wrote:

> Hi,
>
> To fix bug 12968 (__gc being called for tables, resulting in lua_error
> while exiting), I modified the way how classes are registered in
> https://code.wireshark.org/review/18026
>
> In these changes I also reduced the use of macros, following JoĆ£os
> concerns. Macros like WSLUA_META should most likely become typedefs.
> Below I will give a motivation for the changes (feedback welcome!).
>
>
> Consider class Address with function Address.ip and metamethods like
> address.__tostring. Previously you could have these strange invocations:
>
>     -- note: "Address" is the global class, "address" is an instance.
>     tostring(Address)   -- invokes metamethod __tostring (error!)
>     address.ip("foo")   -- invokes "static" class function
>     tostring(FileHandler)   -- error
>     filehandler.new(...)    -- huh?
>
> In the proposed change, there will be different method tables and
> metatables for the class ("Address") and its instances ("address").
> Further modification could disable the above badness, allowing just:
>
>     tostring(address)
>     Address.ip("foo")
>     tostring(filehandler)
>     FileHandler.new(...)
>
> This might break some dissectors that use non-documented invocations,
> but enables use of separate __call functions for example:
>
>     field = Field("x")  -- __call in metatable of class Field
>     fields = field()    -- __call in metatable of instance of Field
>
> Also changed is that attributes are no longer visible on the class, only
> its instances:
>
>     filehandler.read_open = x   -- ok, sets callback attribute
>     -- previously failed in the setter callback out because "self" is
>     -- not a FileHandler instance. Now it will already fail while
>     -- looking up the attribute (in the __newindex metamethod).
>     FileHandler.read_open = x
>
>
>
> Distinct metatables are good, but what about different method tables?
> The proposal will also disable invocations like Tvb.len(tvb) assuming
> that nobody wants to do it (tvb:len() is saner).
>
> Any objections with removing __setters/__getters/__methods?
> I doubt that dissectors use this. Users can read the WSDG and study the
> source code to discover available functions.
>
>
> Future work, in order (assuming the current proposal):
>  - grep for WSLUA_REGISTER_ATTRIBUTES, change their ClassName_register
>    functions to use the new wslua_class definition mechanism, including
>    setting the "attrs" member.
>  - Remove wslua_reg_attributes and macros.
>  - grep for WSLUA_REGISTER_META and WSLUA_REGISTER_CLASS to change the
>    remaining ClassName_register files.
>
> If you feel that the Lua core code needs some love, help is appreciated
> in these tasks :-)
> --
> Kind regards,
> Peter Wu
>

As a non-lua programmer most of that goes straight over my head, but I'm
intrigued\concerned about methods that are class based (i.e. similar to C++
class static methods ??) and instance based that differ only by the case of
the initial method letter.

Is this normal for Lua so won't be a surprise for users, or is it likely to
surprise\confuse users and cause lots of issues and support queries?

-- 
Graham Bloice
___________________________________________________________________________
Sent via:    Wireshark-dev mailing list <wireshark-dev@wireshark.org>
Archives:    https://www.wireshark.org/lists/wireshark-dev
Unsubscribe: https://www.wireshark.org/mailman/options/wireshark-dev
             mailto:wireshark-dev-requ...@wireshark.org?subject=unsubscribe

Reply via email to