Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
a2f929ab
Commit
a2f929ab
authored
Nov 14, 2014
by
Salvatore Sanfilippo
Browse files
Merge pull request #1662 from mattsta/lua-add-bitops
Lua: Add bitop
parents
7ea331d6
3fecb961
Changes
4
Hide whitespace changes
Inline
Side-by-side
deps/lua/src/Makefile
View file @
a2f929ab
...
...
@@ -27,7 +27,8 @@ CORE_O= lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o \
lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o
\
lundump.o lvm.o lzio.o strbuf.o
LIB_O
=
lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o
\
lstrlib.o loadlib.o linit.o lua_cjson.o lua_struct.o lua_cmsgpack.o
lstrlib.o loadlib.o linit.o lua_cjson.o lua_struct.o lua_cmsgpack.o
\
lua_bit.o
LUA_T
=
lua
LUA_O
=
lua.o
...
...
deps/lua/src/lua_bit.c
0 → 100644
View file @
a2f929ab
/*
** Lua BitOp -- a bit operations library for Lua 5.1/5.2.
** http://bitop.luajit.org/
**
** Copyright (C) 2008-2012 Mike Pall. All rights reserved.
**
** Permission is hereby granted, free of charge, to any person obtaining
** a copy of this software and associated documentation files (the
** "Software"), to deal in the Software without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Software, and to
** permit persons to whom the Software is furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be
** included in all copies or substantial portions of the Software.
**
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**
** [ MIT license: http://www.opensource.org/licenses/mit-license.php ]
*/
#define LUA_BITOP_VERSION "1.0.2"
#define LUA_LIB
#include "lua.h"
#include "lauxlib.h"
#ifdef _MSC_VER
/* MSVC is stuck in the last century and doesn't have C99's stdint.h. */
typedef
__int32
int32_t
;
typedef
unsigned
__int32
uint32_t
;
typedef
unsigned
__int64
uint64_t
;
#else
#include <stdint.h>
#endif
typedef
int32_t
SBits
;
typedef
uint32_t
UBits
;
typedef
union
{
lua_Number
n
;
#ifdef LUA_NUMBER_DOUBLE
uint64_t
b
;
#else
UBits
b
;
#endif
}
BitNum
;
/* Convert argument to bit type. */
static
UBits
barg
(
lua_State
*
L
,
int
idx
)
{
BitNum
bn
;
UBits
b
;
#if LUA_VERSION_NUM < 502
bn
.
n
=
lua_tonumber
(
L
,
idx
);
#else
bn
.
n
=
luaL_checknumber
(
L
,
idx
);
#endif
#if defined(LUA_NUMBER_DOUBLE)
bn
.
n
+=
6755399441055744
.
0
;
/* 2^52+2^51 */
#ifdef SWAPPED_DOUBLE
b
=
(
UBits
)(
bn
.
b
>>
32
);
#else
b
=
(
UBits
)
bn
.
b
;
#endif
#elif defined(LUA_NUMBER_INT) || defined(LUA_NUMBER_LONG) || \
defined(LUA_NUMBER_LONGLONG) || defined(LUA_NUMBER_LONG_LONG) || \
defined(LUA_NUMBER_LLONG)
if
(
sizeof
(
UBits
)
==
sizeof
(
lua_Number
))
b
=
bn
.
b
;
else
b
=
(
UBits
)(
SBits
)
bn
.
n
;
#elif defined(LUA_NUMBER_FLOAT)
#error "A 'float' lua_Number type is incompatible with this library"
#else
#error "Unknown number type, check LUA_NUMBER_* in luaconf.h"
#endif
#if LUA_VERSION_NUM < 502
if
(
b
==
0
&&
!
lua_isnumber
(
L
,
idx
))
{
luaL_typerror
(
L
,
idx
,
"number"
);
}
#endif
return
b
;
}
/* Return bit type. */
#define BRET(b) lua_pushnumber(L, (lua_Number)(SBits)(b)); return 1;
static
int
bit_tobit
(
lua_State
*
L
)
{
BRET
(
barg
(
L
,
1
))
}
static
int
bit_bnot
(
lua_State
*
L
)
{
BRET
(
~
barg
(
L
,
1
))
}
#define BIT_OP(func, opr) \
static int func(lua_State *L) { int i; UBits b = barg(L, 1); \
for (i = lua_gettop(L); i > 1; i--) b opr barg(L, i); BRET(b) }
BIT_OP
(
bit_band
,
&=
)
BIT_OP
(
bit_bor
,
|=
)
BIT_OP
(
bit_bxor
,
^=
)
#define bshl(b, n) (b << n)
#define bshr(b, n) (b >> n)
#define bsar(b, n) ((SBits)b >> n)
#define brol(b, n) ((b << n) | (b >> (32-n)))
#define bror(b, n) ((b << (32-n)) | (b >> n))
#define BIT_SH(func, fn) \
static int func(lua_State *L) { \
UBits b = barg(L, 1); UBits n = barg(L, 2) & 31; BRET(fn(b, n)) }
BIT_SH
(
bit_lshift
,
bshl
)
BIT_SH
(
bit_rshift
,
bshr
)
BIT_SH
(
bit_arshift
,
bsar
)
BIT_SH
(
bit_rol
,
brol
)
BIT_SH
(
bit_ror
,
bror
)
static
int
bit_bswap
(
lua_State
*
L
)
{
UBits
b
=
barg
(
L
,
1
);
b
=
(
b
>>
24
)
|
((
b
>>
8
)
&
0xff00
)
|
((
b
&
0xff00
)
<<
8
)
|
(
b
<<
24
);
BRET
(
b
)
}
static
int
bit_tohex
(
lua_State
*
L
)
{
UBits
b
=
barg
(
L
,
1
);
SBits
n
=
lua_isnone
(
L
,
2
)
?
8
:
(
SBits
)
barg
(
L
,
2
);
const
char
*
hexdigits
=
"0123456789abcdef"
;
char
buf
[
8
];
int
i
;
if
(
n
<
0
)
{
n
=
-
n
;
hexdigits
=
"0123456789ABCDEF"
;
}
if
(
n
>
8
)
n
=
8
;
for
(
i
=
(
int
)
n
;
--
i
>=
0
;
)
{
buf
[
i
]
=
hexdigits
[
b
&
15
];
b
>>=
4
;
}
lua_pushlstring
(
L
,
buf
,
(
size_t
)
n
);
return
1
;
}
static
const
struct
luaL_Reg
bit_funcs
[]
=
{
{
"tobit"
,
bit_tobit
},
{
"bnot"
,
bit_bnot
},
{
"band"
,
bit_band
},
{
"bor"
,
bit_bor
},
{
"bxor"
,
bit_bxor
},
{
"lshift"
,
bit_lshift
},
{
"rshift"
,
bit_rshift
},
{
"arshift"
,
bit_arshift
},
{
"rol"
,
bit_rol
},
{
"ror"
,
bit_ror
},
{
"bswap"
,
bit_bswap
},
{
"tohex"
,
bit_tohex
},
{
NULL
,
NULL
}
};
/* Signed right-shifts are implementation-defined per C89/C99.
** But the de facto standard are arithmetic right-shifts on two's
** complement CPUs. This behaviour is required here, so test for it.
*/
#define BAD_SAR (bsar(-8, 2) != (SBits)-2)
LUALIB_API
int
luaopen_bit
(
lua_State
*
L
)
{
UBits
b
;
lua_pushnumber
(
L
,
(
lua_Number
)
1437217655L
);
b
=
barg
(
L
,
-
1
);
if
(
b
!=
(
UBits
)
1437217655L
||
BAD_SAR
)
{
/* Perform a simple self-test. */
const
char
*
msg
=
"compiled with incompatible luaconf.h"
;
#ifdef LUA_NUMBER_DOUBLE
#ifdef _WIN32
if
(
b
==
(
UBits
)
1610612736L
)
msg
=
"use D3DCREATE_FPU_PRESERVE with DirectX"
;
#endif
if
(
b
==
(
UBits
)
1127743488L
)
msg
=
"not compiled with SWAPPED_DOUBLE"
;
#endif
if
(
BAD_SAR
)
msg
=
"arithmetic right-shift broken"
;
luaL_error
(
L
,
"bit library self-test failed (%s)"
,
msg
);
}
#if LUA_VERSION_NUM < 502
luaL_register
(
L
,
"bit"
,
bit_funcs
);
#else
luaL_newlib
(
L
,
bit_funcs
);
#endif
return
1
;
}
src/scripting.c
View file @
a2f929ab
...
...
@@ -537,6 +537,7 @@ void luaLoadLib(lua_State *lua, const char *libname, lua_CFunction luafunc) {
LUALIB_API
int
(
luaopen_cjson
)
(
lua_State
*
L
);
LUALIB_API
int
(
luaopen_struct
)
(
lua_State
*
L
);
LUALIB_API
int
(
luaopen_cmsgpack
)
(
lua_State
*
L
);
LUALIB_API
int
(
luaopen_bit
)
(
lua_State
*
L
);
void
luaLoadLibraries
(
lua_State
*
lua
)
{
luaLoadLib
(
lua
,
""
,
luaopen_base
);
...
...
@@ -547,6 +548,7 @@ void luaLoadLibraries(lua_State *lua) {
luaLoadLib
(
lua
,
"cjson"
,
luaopen_cjson
);
luaLoadLib
(
lua
,
"struct"
,
luaopen_struct
);
luaLoadLib
(
lua
,
"cmsgpack"
,
luaopen_cmsgpack
);
luaLoadLib
(
lua
,
"bit"
,
luaopen_bit
);
#if 0 /* Stuff that we don't load currently, for sandboxing concerns. */
luaLoadLib(lua, LUA_LOADLIBNAME, luaopen_package);
...
...
tests/unit/scripting.tcl
View file @
a2f929ab
...
...
@@ -184,6 +184,25 @@ start_server {tags {"scripting"}} {
set e
}
{
*against a key*
}
test
{
EVAL - Numerical sanity check from bitop
}
{
r eval
{
assert
(
0x7fffffff == 2147483647,
"broken hex literals"
);
assert
(
0xffffffff == -1 or 0xffffffff == 2^32-1,
"broken hex literals"
);
assert
(
tostring
(
-1
)
==
"-1"
,
"broken tostring()"
);
assert
(
tostring
(
0xffffffff
)
==
"-1"
or
tostring
(
0xffffffff
)
==
"4294967295"
,
"broken tostring()"
)
}
0
}
{}
test
{
EVAL - Verify minimal bitop functionality
}
{
r eval
{
assert
(
bit.tobit
(
1
)
== 1
);
assert
(
bit.band
(
1
)
== 1
);
assert
(
bit.bxor
(
1,2
)
== 3
);
assert
(
bit.bor
(
1,2,4,8,16,32,64,128
)
== 255
)
}
0
}
{}
test
{
SCRIPTING FLUSH - is able to clear the scripts cache?
}
{
r set mykey myval
set v
[
r evalsha fd758d1589d044dd850a6f05d52f2eefd27f033f 1 mykey
]
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment