Wireshark mailing list archives

Re: Changes to internal Lua classes implementation (Pinfo, TvbRange, etc.)


From: Graham Bloice <graham.bloice () trihedral com>
Date: Mon, 3 Oct 2016 10:39:08 +0100

On 3 October 2016 at 00:51, Peter Wu <peter () 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-request () wireshark org?subject=unsubscribe

Current thread: