From 922e61f4768e2c0ef2753f42e3714a954daacd81 Mon Sep 17 00:00:00 2001 From: Magnus Henoch Date: Mon, 3 Jul 2017 17:20:49 +0100 Subject: [PATCH 1/4] Add missing read_nil function 'nil' means the empty list here. --- lib/bert/decoder.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/bert/decoder.lua b/lib/bert/decoder.lua index f1f834c..ecff574 100644 --- a/lib/bert/decoder.lua +++ b/lib/bert/decoder.lua @@ -196,4 +196,8 @@ function Decoder:read_large_tuple() if self:read_1() ~= Types.LARGE_TUPLE then error("Invalid Type, not a large tuple") end local size = self:read_4() return self:read_tuple(size) -end \ No newline at end of file +end + +function Decoder:read_nil() + return {} +end From 24dfd90379630a372459a3284d83932631d02676 Mon Sep 17 00:00:00 2001 From: Magnus Henoch Date: Tue, 4 Jul 2017 16:36:07 +0100 Subject: [PATCH 2/4] Fix "Unknown type" error tostring is not defined. Just rely on the .. operator. --- lib/bert/decoder.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bert/decoder.lua b/lib/bert/decoder.lua index ecff574..f393d72 100644 --- a/lib/bert/decoder.lua +++ b/lib/bert/decoder.lua @@ -45,7 +45,7 @@ function Decoder:read_any_raw() elseif next_byte == Types.LIST then return self:read_list() elseif next_byte == Types.BIN then return self:read_bin() else - error("Unknown type: "..tostring(next_byte).." at "..tostring(self.current)) + error("Unknown type: "..next_byte.." at "..self.current) end end From 3dc1a88691b05818a3568f2b44946992ed2c207e Mon Sep 17 00:00:00 2001 From: Magnus Henoch Date: Tue, 4 Jul 2017 16:36:37 +0100 Subject: [PATCH 3/4] Support BERT time values Return them as a tuple, as they are used internally in Erlang. --- lib/bert/decoder.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/bert/decoder.lua b/lib/bert/decoder.lua index f393d72..536de3d 100644 --- a/lib/bert/decoder.lua +++ b/lib/bert/decoder.lua @@ -150,7 +150,8 @@ function Decoder:read_complex_type(arity) return false elseif item == sym.s"time" then -- Time.at(read_any_raw * 1_000_000 + read_any_raw, read_any_raw) - error "Not Yet Implemented" + -- Let's return a tuple, as used in Erlang + return tuple.t { self:read_any_raw(), self:read_any_raw(), self:read_any_raw() } elseif item == sym.s"regex" then error "Not Yet Implemented" elseif item == sym.s"dict" then From 4d14327e86d9d9382b60d9fc06e9071845a84e3f Mon Sep 17 00:00:00 2001 From: Magnus Henoch Date: Tue, 4 Jul 2017 16:36:58 +0100 Subject: [PATCH 4/4] Implement Decoder.read_int --- lib/bert/decoder.lua | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/bert/decoder.lua b/lib/bert/decoder.lua index 536de3d..c08d8d6 100644 --- a/lib/bert/decoder.lua +++ b/lib/bert/decoder.lua @@ -34,7 +34,7 @@ function Decoder:read_any_raw() local next_byte = self:peek_1() if next_byte == Types.ATOM then return self:read_atom() elseif next_byte == Types.SMALL_INT then return self:read_small_int() - elseif next_byte == Types.INT then return self:read_int() -- TODO + elseif next_byte == Types.INT then return self:read_int() elseif next_byte == Types.SMALL_BIGNUM then return self:read_small_bignum() elseif next_byte == Types.LAGE_BIGNUM then return self:read_large_bignum() elseif next_byte == Types.FLOAT then return self:read_float() @@ -98,12 +98,14 @@ end function Decoder:read_int() if self:read_1() ~= Types.INT then error("Invalid Type, not an int") end - local value = self:read_4() + local value = self:read_4() - error "Not Implemented" - -- negative = (value >> 31)[0] == 1 - -- value = (value - (1 << 32)) if negative - -- value = Fixnum.induced_from(value) + -- Poor man's bitwise operators, to be compatible with Lua 5.1 + if value >= 2 ^ 31 then + return value - 2 ^ 32 + else + return value + end end function Decoder:read_small_int()