Lua: Add "tonumber" method to NSTime

Absolute and Relative time fields could not be converted to seconds
without converting to string and parsing to number.

Fixed conversion in generated code that was subject to precision loss

Usage:
f=Field.new("frame.delta_time")
delta=f().value:tonumber()

Change-Id: I6ef91c6238a6c2ed9adf6cae03f8913f0a09332e
Reviewed-on: https://code.wireshark.org/review/22316
Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
Silvio Gissi 2017-06-21 15:46:45 -04:00 committed by Guy Harris
parent 16f70b9bb1
commit 59add43eec
3 changed files with 22 additions and 7 deletions

View File

@ -43,8 +43,8 @@ my %types = %{{
'address' => '{ Address a = (Address)g_malloc(sizeof(address)); copy_address(a, &(v->STR)); pushAddress(L,a); }',
'address*' => '{ Address a = (Address)g_malloc(sizeof(address)); copy_address(a, v->STR); pushAddress(L,a); }',
'int' => 'lua_pushnumber(L,(lua_Number)v->STR);',
'nstime_t' => '{ lua_Number t = (lua_Number) v->STR.secs; t += v->STR.nsecs * 1e-9; lua_pushnumber(L,t); }',
'nstime_t*' => '{ lua_Number t = (lua_Number) v->STR->secs; t += v->STR->nsecs * 1e-9; lua_pushnumber(L,t); }',
'nstime_t' => 'lua_pushnumber(L,(lua_Number)nstime_to_sec(&(v->STR)));',
'nstime_t*' => 'lua_pushnumber(L,(lua_Number)nstime_to_sec(v->STR));'
}};
my %comments = %{{
@ -164,6 +164,8 @@ print CFILE <<"HEADER";
#include "wslua.h"
#include <wsutil/nstime.h>
HEADER
print DOCFILE "\n";

View File

@ -30,7 +30,7 @@
#include "config.h"
#include "wslua.h"
#include <wsutil/nstime.h>
/* WSLUA_CONTINUE_MODULE Pinfo */
@ -61,6 +61,15 @@ WSLUA_METAMETHOD NSTime__call(lua_State* L) { /* Creates a NSTime object. */
WSLUA_RETURN(NSTime_new(L)); /* The new NSTime object. */
}
WSLUA_METHOD NSTime_tonumber(lua_State* L) {
/* Returns a Lua number of the `NSTime` representing seconds from epoch
* @since 2.4.0
* */
NSTime nstime = checkNSTime(L,1);
lua_pushnumber(L, (lua_Number)nstime_to_sec(nstime));
WSLUA_RETURN(1); /* The Lua number. */
}
WSLUA_METAMETHOD NSTime__tostring(lua_State* L) {
NSTime nstime = checkNSTime(L,1);
gchar *str;
@ -174,6 +183,7 @@ WSLUA_ATTRIBUTES NSTime_attributes[] = {
WSLUA_METHODS NSTime_methods[] = {
WSLUA_CLASS_FNREG(NSTime,new),
WSLUA_CLASS_FNREG(NSTime,tonumber),
{ NULL, NULL }
};

View File

@ -31,7 +31,7 @@ end
-- note ip only runs 3 times because it gets removed
-- and bootp only runs twice because the filter makes it run
-- once and then it gets replaced with a different one for the second time
local taptests = { [FRAME]=4, [OTHER]=37 }
local taptests = { [FRAME]=4, [OTHER]=40 }
local function getResults()
print("\n-----------------------------\n")
for k,v in pairs(taptests) do
@ -132,13 +132,16 @@ test("NSTime.tostring-32", tostring(first) == "0.000000000")
test("NSTime.tostring-33", tostring(second) == "100.000000100")
test("NSTime.tostring-34", tostring(third) == "0.000000100")
test("NSTime.tonumber-35", first:tonumber() == 0.0)
test("NSTime.tonumber-36", second:tonumber() == 100.0000001)
test("NSTime.tonumber-37", third:tonumber() == 0.0000001)
testing(OTHER,"setters/getters")
first.secs = 123
first.nsecs = 100
test("NSTime.set-35", first == NSTime(123,100))
test("NSTime.get-36", first.secs == 123)
test("NSTime.get-37", first.nsecs == 100)
test("NSTime.set-38", first == NSTime(123,100))
test("NSTime.get-39", first.secs == 123)
test("NSTime.get-40", first.nsecs == 100)
----------------------------------