summarylogtreecommitdiffstats
path: root/pgmoon-lua53-compat.patch
blob: 17cd8c34f0dfd4c9e494c61a589a86328d6bf566 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
From ff188f9cab8f1310fb91c984bc532fd42fe91671 Mon Sep 17 00:00:00 2001
From: John Regan <john@jrjrtech.com>
Date: Mon, 23 Nov 2020 08:02:44 -0500
Subject: [PATCH 1/2] lua compatibility fixes

fixes affected_rows always nil on Lua 5.2+

fixes tests always failing on Lua 5.2+
---
 pgmoon/init.lua       | 2 +-
 pgmoon/init.moon      | 2 +-
 spec/pgmoon_spec.moon | 7 +++++--
 3 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/pgmoon/init.lua b/pgmoon/init.lua
index 4ebe466..ebd1413 100644
--- a/pgmoon/init.lua
+++ b/pgmoon/init.lua
@@ -362,7 +362,7 @@ do
       local command, affected_rows
       if command_complete then
         command = command_complete:match("^%w+")
-        affected_rows = tonumber(command_complete:match("%d+%z$"))
+        affected_rows = tonumber(command_complete:match("(%d+)%z$"))
       end
       if row_desc then
         if not (data_rows) then
diff --git a/pgmoon/init.moon b/pgmoon/init.moon
index c9f91a4..f1be491 100644
--- a/pgmoon/init.moon
+++ b/pgmoon/init.moon
@@ -330,7 +330,7 @@ class Postgres
 
     if command_complete
       command = command_complete\match "^%w+"
-      affected_rows = tonumber command_complete\match "%d+%z$"
+      affected_rows = tonumber command_complete\match "(%d+)%z$"
 
     if row_desc
       return {} unless data_rows
diff --git a/spec/pgmoon_spec.moon b/spec/pgmoon_spec.moon
index 46af904..8cebec0 100644
--- a/spec/pgmoon_spec.moon
+++ b/spec/pgmoon_spec.moon
@@ -23,8 +23,11 @@ describe "pgmoon with server", ->
       local pg
 
       setup ->
-        assert 0 == os.execute "dropdb -h '#{HOST}' -p '#{PORT}' --if-exists -U '#{USER}' '#{DB}'"
-        assert 0 == os.execute "createdb -h '#{HOST}' -p '#{PORT}' -U '#{USER}' '#{DB}'"
+        r = { os.execute "dropdb -h '#{HOST}' -p '#{PORT}' --if-exists -U '#{USER}' '#{DB}'" }
+        assert 0 == r[#r]
+
+        r = { os.execute "createdb -h '#{HOST}' -p '#{PORT}' -U '#{USER}' '#{DB}'" }
+        assert 0 == r[#r]
 
         pg = Postgres {
           database: DB

From 42773d45291258f809dfeb32146c34ccd690e0b0 Mon Sep 17 00:00:00 2001
From: John Regan <john@jrjrtech.com>
Date: Mon, 23 Nov 2020 08:04:42 -0500
Subject: [PATCH 2/2] add new lua 5.3+ bit module

---
 pgmoon-dev-1.rockspec |  2 +-
 pgmoon/bit.lua        | 55 ++++++++++++++++++++++++++
 pgmoon/bit.moon       | 70 ++++++++++++++++++++++++++++++++
 pgmoon/init.lua       |  2 +-
 pgmoon/init.moon      |  3 +-
 spec/pgmoon_spec.moon | 92 +++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 221 insertions(+), 3 deletions(-)
 create mode 100644 pgmoon/bit.lua
 create mode 100644 pgmoon/bit.moon

diff --git a/pgmoon-dev-1.rockspec b/pgmoon-dev-1.rockspec
index 52f505e..f672764 100644
--- a/pgmoon-dev-1.rockspec
+++ b/pgmoon-dev-1.rockspec
@@ -15,7 +15,6 @@ description = {
 
 dependencies = {
   "lua >= 5.1",
-  "luabitop",
   "lpeg",
 }
 
@@ -24,6 +23,7 @@ build = {
   modules = {
     ["pgmoon"] = "pgmoon/init.lua",
     ["pgmoon.arrays"] = "pgmoon/arrays.lua",
+    ["pgmoon.bit"] = "pgmoon/bit.lua",
     ["pgmoon.cqueues"] = "pgmoon/cqueues.lua",
     ["pgmoon.crypto"] = "pgmoon/crypto.lua",
     ["pgmoon.hstore"] = "pgmoon/hstore.lua",
diff --git a/pgmoon/bit.lua b/pgmoon/bit.lua
new file mode 100644
index 0000000..102f944
--- /dev/null
+++ b/pgmoon/bit.lua
@@ -0,0 +1,55 @@
+local rshift, lshift, band, ok, _
+local string_loader
+string_loader = function(str)
+  local sent = false
+  return function()
+    if sent then
+      return nil
+    end
+    sent = true
+    return str
+  end
+end
+ok, band = pcall(load(string_loader([[  return function(a,b)
+    a = a & b
+    if a > 0x7FFFFFFF then
+      -- extend the sign bit
+      a = ~0xFFFFFFFF | a
+    end
+    return a
+  end
+]])))
+if ok then
+  _, lshift = pcall(load(string_loader([[    return function(x,y)
+      -- limit to 32-bit shifts
+      y = y % 32
+      x = x << y
+      if x > 0x7FFFFFFF then
+        -- extend the sign bit
+        x = ~0xFFFFFFFF | x
+      end
+      return x
+    end
+  ]])))
+  _, rshift = pcall(load(string_loader([[    return function(x,y)
+      y = y % 32
+      -- truncate to 32-bit before applying shift
+      x = x & 0xFFFFFFFF
+      x = x >> y
+      if x > 0x7FFFFFFF then
+        x = ~0xFFFFFFFF | x
+       end
+      return x
+    end
+  ]])))
+else
+  do
+    local _obj_0 = require("bit")
+    rshift, lshift, band = _obj_0.rshift, _obj_0.lshift, _obj_0.band
+  end
+end
+return {
+  rshift = rshift,
+  lshift = lshift,
+  band = band
+}
diff --git a/pgmoon/bit.moon b/pgmoon/bit.moon
new file mode 100644
index 0000000..f2a2cc6
--- /dev/null
+++ b/pgmoon/bit.moon
@@ -0,0 +1,70 @@
+local rshift, lshift, band, ok, _
+local string_loader
+
+
+-- lua5.1 has separate 'loadstring' and 'load'
+-- functions ('load' doesn't accept strings).
+-- This provides a function that 'load' can use,
+-- and will work on all versions of lua
+
+string_loader = (str) ->
+  sent = false
+  return ->
+    if sent then
+      return nil
+    sent = true
+    return str
+
+
+-- use load to treat as a string to prevent
+-- parse errors under lua < 5.3
+
+-- luajit uses 32-bit integers for bitwise ops, but lua5.3+
+-- uses 32-bit or 64-bit integers, so these wrappers will
+-- truncate results and/or extend the sign, as appropriate
+-- to match luajit's behavior.
+ok, band = pcall(load(string_loader([[
+  return function(a,b)
+    a = a & b
+    if a > 0x7FFFFFFF then
+      -- extend the sign bit
+      a = ~0xFFFFFFFF | a
+    end
+    return a
+  end
+]])))
+
+if ok then
+  _, lshift = pcall(load(string_loader([[
+    return function(x,y)
+      -- limit to 32-bit shifts
+      y = y % 32
+      x = x << y
+      if x > 0x7FFFFFFF then
+        -- extend the sign bit
+        x = ~0xFFFFFFFF | x
+      end
+      return x
+    end
+  ]])))
+  _, rshift = pcall(load(string_loader([[
+    return function(x,y)
+      y = y % 32
+      -- truncate to 32-bit before applying shift
+      x = x & 0xFFFFFFFF
+      x = x >> y
+      if x > 0x7FFFFFFF then
+        x = ~0xFFFFFFFF | x
+       end
+      return x
+    end
+  ]])))
+else
+  import rshift, lshift, band from require "bit"
+
+return {
+  rshift: rshift
+  lshift: lshift
+  band: band
+}
+
diff --git a/pgmoon/init.lua b/pgmoon/init.lua
index ebd1413..9dce4c3 100644
--- a/pgmoon/init.lua
+++ b/pgmoon/init.lua
@@ -3,7 +3,7 @@ local insert
 insert = table.insert
 local rshift, lshift, band
 do
-  local _obj_0 = require("bit")
+  local _obj_0 = require("pgmoon.bit")
   rshift, lshift, band = _obj_0.rshift, _obj_0.lshift, _obj_0.band
 end
 local unpack = table.unpack or unpack
diff --git a/pgmoon/init.moon b/pgmoon/init.moon
index f1be491..a21641d 100644
--- a/pgmoon/init.moon
+++ b/pgmoon/init.moon
@@ -1,6 +1,7 @@
 socket = require "pgmoon.socket"
 import insert from table
-import rshift, lshift, band from require "bit"
+
+import rshift, lshift, band from require "pgmoon.bit"
 
 unpack = table.unpack or unpack
 
diff --git a/spec/pgmoon_spec.moon b/spec/pgmoon_spec.moon
index 8cebec0..4116cc7 100644
--- a/spec/pgmoon_spec.moon
+++ b/spec/pgmoon_spec.moon
@@ -11,6 +11,98 @@ DB = "pgmoon_test"
 psql = ->
   os.execute "psql -h '#{HOST}' -p '#{PORT}' -U '#{USER}'"
 
+describe "bit library compatibility", ->
+  import band, lshift, rshift from require "pgmoon.bit"
+
+  it "lshift works the same as luabitop", ->
+    assert 255 == lshift(0xff,0)
+    assert 65535 == lshift(0xffff,0)
+    assert 16777215 == lshift(0xffffff,0)
+    assert -1 == lshift(0xffffffff,0)
+    assert 65280 == lshift(0xff,8)
+    assert 16711680 == lshift(0xff,16)
+    assert -16777216 == lshift(0xff,24)
+    assert 255 == lshift(0xff,32)
+    assert 16776960 == lshift(0xffff,8)
+    assert -65536 == lshift(0xffff,16)
+    assert -16777216 == lshift(0xffff,24)
+    assert 65535 == lshift(0xffff,32)
+    assert -256 == lshift(0xffffff,8)
+    assert -65536 == lshift(0xffffff,16)
+    assert -16777216 == lshift(0xffffff,24)
+    assert 16777215 == lshift(0xffffff,32)
+    assert -256 == lshift(0xffffffff,8)
+    assert -65536 == lshift(0xffffffff,16)
+    assert -16777216 == lshift(0xffffffff,24)
+    assert -1 == lshift(0xffffffff,32)
+    assert 1 == lshift(1,0)
+    assert 256 == lshift(1,8)
+    assert 65536 == lshift(1,16)
+    assert 16777216 == lshift(1,24)
+    assert 1 == lshift(1,32)
+    assert -1 == lshift(-1,0)
+    assert -256 == lshift(-1,8)
+    assert -65536 == lshift(-1,16)
+    assert -16777216 == lshift(-1,24)
+    assert -1 == lshift(-1,32)
+
+  it "rshift works the same as luabitop", ->
+    assert 255 == rshift(0xff,0)
+    assert 65535 == rshift(0xffff,0)
+    assert 16777215 == rshift(0xffffff,0)
+    assert -1 == rshift(0xffffffff,0)
+    assert 0 == rshift(0xff,8)
+    assert 0 == rshift(0xff,16)
+    assert 0 == rshift(0xff,24)
+    assert 255 == rshift(0xff,32)
+    assert 255 == rshift(0xffff,8)
+    assert 0 == rshift(0xffff,16)
+    assert 0 == rshift(0xffff,24)
+    assert 65535 == rshift(0xffff,32)
+    assert 65535 == rshift(0xffffff,8)
+    assert 255 == rshift(0xffffff,16)
+    assert 0 == rshift(0xffffff,24)
+    assert 16777215 == rshift(0xffffff,32)
+    assert 16777215 == rshift(0xffffffff,8)
+    assert 65535 == rshift(0xffffffff,16)
+    assert 255 == rshift(0xffffffff,24)
+    assert -1 == rshift(0xffffffff,32)
+    assert 1 == rshift(1,0)
+    assert 0 == rshift(1,8)
+    assert 0 == rshift(1,16)
+    assert 0 == rshift(1,24)
+    assert 1 == rshift(1,32)
+    assert -1 == rshift(-1,0)
+    assert 16777215 == rshift(-1,8)
+    assert 65535 == rshift(-1,16)
+    assert 255 == rshift(-1,24)
+    assert -1 == rshift(-1,32)
+
+  it "band works the same as luabitop", ->
+    assert 0 == band(0xff,0)
+    assert 0 == band(0xffff,0)
+    assert 0 == band(0xffffff,0)
+    assert 0 == band(0xffffffff,0)
+    assert 255 == band(0xff,0xff)
+    assert 65535 == band(0xffff,0xffff)
+    assert 16777215 == band(0xffffff,0xffffff)
+    assert -1 == band(0xffffffff,0xffffffff)
+    assert 16777215 == band(0xffffffff,0xffffff)
+    assert 65535 == band(0xffffffff,0xffff)
+    assert 255 == band(0xffffffff,0xff)
+    assert 255 == band(0xff,-1)
+    assert 65535 == band(0xffff,-1)
+    assert 16777215 == band(0xffffff,-1)
+    assert -1 == band(0xffffffff,-1)
+    assert 0 == band(-1,0)
+    assert 255 == band(-1,0xff)
+    assert 65535 == band(-1,0xffff)
+    assert 16777215 == band(-1,0xffffff)
+    assert -1 == band(-1,0xffffffff)
+    assert -1 == band(-1,-1)
+    assert 255 == band(0xffffffffff,0xff)
+
+
 describe "pgmoon with server", ->
   setup ->
     os.execute "spec/postgres.sh start"