THRIFT-4386 Add Lua 5.3/5.4 support
Clint: lua
Patch: Thomas Bruggink

This closes #3012
diff --git a/lib/lua/TCompactProtocol.lua b/lib/lua/TCompactProtocol.lua
index 8ec7b3a..f01c56f 100644
--- a/lib/lua/TCompactProtocol.lua
+++ b/lib/lua/TCompactProtocol.lua
@@ -18,9 +18,9 @@
 --
 
 require 'TProtocol'
-require 'libluabpack'
-require 'libluabitwise'
-require 'liblualongnumber'
+local libluabpack = require 'libluabpack'
+local libluabitwise = require 'libluabitwise'
+local liblualongnumber = require 'liblualongnumber'
 
 TCompactProtocol = __TObject.new(TProtocolBase, {
   __type = 'TCompactProtocol',
@@ -61,7 +61,8 @@
   COMPACT_LIST          = 0x09,
   COMPACT_SET           = 0x0A,
   COMPACT_MAP           = 0x0B,
-  COMPACT_STRUCT        = 0x0C
+  COMPACT_STRUCT        = 0x0C,
+  COMPACT_UUID          = 0x0D,
 }
 
 TTypeToCompactType = {}
@@ -77,21 +78,23 @@
 TTypeToCompactType[TType.SET]    = TCompactType.COMPACT_SET
 TTypeToCompactType[TType.MAP]    = TCompactType.COMPACT_MAP
 TTypeToCompactType[TType.STRUCT] = TCompactType.COMPACT_STRUCT
+TTypeToCompactType[TType.UUID]   = TCompactType.COMPACT_UUID
 
 CompactTypeToTType = {}
-CompactTypeToTType[TType.STOP]                        = TType.STOP
-CompactTypeToTType[TCompactType.COMPACT_BOOLEAN_TRUE] = TType.BOOL
+CompactTypeToTType[TType.STOP]                         = TType.STOP
+CompactTypeToTType[TCompactType.COMPACT_BOOLEAN_TRUE]  = TType.BOOL
 CompactTypeToTType[TCompactType.COMPACT_BOOLEAN_FALSE] = TType.BOOL
-CompactTypeToTType[TCompactType.COMPACT_BYTE]         = TType.BYTE
-CompactTypeToTType[TCompactType.COMPACT_I16]          = TType.I16
-CompactTypeToTType[TCompactType.COMPACT_I32]          = TType.I32
-CompactTypeToTType[TCompactType.COMPACT_I64]          = TType.I64
-CompactTypeToTType[TCompactType.COMPACT_DOUBLE]       = TType.DOUBLE
-CompactTypeToTType[TCompactType.COMPACT_BINARY]       = TType.STRING
-CompactTypeToTType[TCompactType.COMPACT_LIST]         = TType.LIST
-CompactTypeToTType[TCompactType.COMPACT_SET]          = TType.SET
-CompactTypeToTType[TCompactType.COMPACT_MAP]          = TType.MAP
-CompactTypeToTType[TCompactType.COMPACT_STRUCT]       = TType.STRUCT
+CompactTypeToTType[TCompactType.COMPACT_BYTE]          = TType.BYTE
+CompactTypeToTType[TCompactType.COMPACT_I16]           = TType.I16
+CompactTypeToTType[TCompactType.COMPACT_I32]           = TType.I32
+CompactTypeToTType[TCompactType.COMPACT_I64]           = TType.I64
+CompactTypeToTType[TCompactType.COMPACT_DOUBLE]        = TType.DOUBLE
+CompactTypeToTType[TCompactType.COMPACT_BINARY]        = TType.STRING
+CompactTypeToTType[TCompactType.COMPACT_LIST]          = TType.LIST
+CompactTypeToTType[TCompactType.COMPACT_SET]           = TType.SET
+CompactTypeToTType[TCompactType.COMPACT_MAP]           = TType.MAP
+CompactTypeToTType[TCompactType.COMPACT_STRUCT]        = TType.STRUCT
+CompactTypeToTType[TCompactType.COMPACT_UUID]          = TType.UUID
 
 function TCompactProtocol:resetLastField()
   self.lastField = {}
@@ -197,6 +200,11 @@
   self:writeVarint32(libluabpack.i32ToZigzag(i32))
 end
 
+function TCompactProtocol:writeUI32(i32)
+  local buff = libluabpack.bpack('I', i32)
+  self.trans:write(buff)
+end
+
 function TCompactProtocol:writeI64(i64)
   self:writeVarint64(libluabpack.i64ToZigzag(i64))
 end
@@ -211,6 +219,13 @@
   self:writeBinary(str)
 end
 
+function TCompactProtocol:writeUuid(uuid)
+  self:writeUI32(uuid.two)
+  self:writeUI32(uuid.three)
+  self:writeUI32(uuid.zero)
+  self:writeUI32(uuid.one)
+end
+
 function TCompactProtocol:writeBinary(str)
   -- Should be utf-8
   self:writeVarint32(string.len(str))
@@ -385,6 +400,12 @@
   return value
 end
 
+function TCompactProtocol:readUI32()
+  local buff = self.trans:readAll(4)
+  local val = libluabpack.bunpack('I', buff)
+  return val
+end
+
 function TCompactProtocol:readI64()
   local value = self:readVarint64()
   return value
@@ -400,6 +421,19 @@
   return self:readBinary()
 end
 
+function TCompactProtocol:readUuid()
+  local a = self:readUI32()
+  local b = self:readUI32()
+  local c = self:readUI32()
+  local d = self:readUI32()
+  return TUUID:new {
+    zero = c,
+    one = d,
+    two = a,
+    three = b
+  }
+end
+
 function TCompactProtocol:readBinary()
   local size = self:readVarint32()
   if size <= 0 then