Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
b1c426ef
Commit
b1c426ef
authored
Nov 24, 2014
by
Matt Stancliff
Committed by
antirez
Nov 25, 2014
Browse files
Fix lua-cmsgpack 64 bit integer on 32 bit platform
This syncs lua-cmsgpack with the mattsta/lua-cmsgpack upstream. Fixes #2161
parent
f2876f6c
Changes
1
Hide whitespace changes
Inline
Side-by-side
deps/lua/src/lua_cmsgpack.c
View file @
b1c426ef
...
@@ -13,11 +13,9 @@
...
@@ -13,11 +13,9 @@
#define LUACMSGPACK_COPYRIGHT "Copyright (C) 2012, Salvatore Sanfilippo"
#define LUACMSGPACK_COPYRIGHT "Copyright (C) 2012, Salvatore Sanfilippo"
#define LUACMSGPACK_DESCRIPTION "MessagePack C implementation for Lua"
#define LUACMSGPACK_DESCRIPTION "MessagePack C implementation for Lua"
#define LUACMSGPACK_MAX_NESTING 16
/* Max tables nesting. */
/* Allows a preprocessor directive to override MAX_NESTING */
/* Allows a preprocessor directive to override MAX_NESTING */
#ifndef LUACMSGPACK_MAX_NESTING
#ifndef LUACMSGPACK_MAX_NESTING
#define LUACMSGPACK_MAX_NESTING 16
#define LUACMSGPACK_MAX_NESTING 16
/* Max tables nesting. */
#endif
#endif
#if (_XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L)
#if (_XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L)
...
@@ -32,8 +30,19 @@
...
@@ -32,8 +30,19 @@
#define IS_INT64_EQUIVALENT(x) IS_INT_TYPE_EQUIVALENT(x, int64_t)
#define IS_INT64_EQUIVALENT(x) IS_INT_TYPE_EQUIVALENT(x, int64_t)
#define IS_INT_EQUIVALENT(x) IS_INT_TYPE_EQUIVALENT(x, int)
#define IS_INT_EQUIVALENT(x) IS_INT_TYPE_EQUIVALENT(x, int)
/* If size of pointer is equal to a 4 byte integer, we're on 32 bits. */
#if UINTPTR_MAX == UINT_MAX
#define BITS_32 1
#else
#define BITS_32 0
#endif
#if LUA_VERSION_NUM < 503
#if LUA_VERSION_NUM < 503
#define lua_pushunsigned(L, n) lua_pushinteger(L, n)
#if BITS_32
#define lua_pushunsigned(L, n) lua_pushnumber(L, n)
#else
#define lua_pushunsigned(L, n) lua_pushinteger(L, n)
#endif
#endif
#endif
/* =============================================================================
/* =============================================================================
...
@@ -72,7 +81,7 @@ static void memrevifle(void *ptr, size_t len) {
...
@@ -72,7 +81,7 @@ static void memrevifle(void *ptr, size_t len) {
int
test
=
1
;
int
test
=
1
;
unsigned
char
*
testp
=
(
unsigned
char
*
)
&
test
;
unsigned
char
*
testp
=
(
unsigned
char
*
)
&
test
;
if
(
testp
[
0
]
==
0
)
return
;
/* Big endian, nothi
g
n to do. */
if
(
testp
[
0
]
==
0
)
return
;
/* Big endian, nothin
g
to do. */
len
/=
2
;
len
/=
2
;
while
(
len
--
)
{
while
(
len
--
)
{
aux
=
*
p
;
aux
=
*
p
;
...
@@ -84,7 +93,7 @@ static void memrevifle(void *ptr, size_t len) {
...
@@ -84,7 +93,7 @@ static void memrevifle(void *ptr, size_t len) {
}
}
/* ---------------------------- String buffer ----------------------------------
/* ---------------------------- String buffer ----------------------------------
* This is a simple implementation of string buffers. The only oper
e
ation
* This is a simple implementation of string buffers. The only operation
* supported is creating empty buffers and appending bytes to it.
* supported is creating empty buffers and appending bytes to it.
* The string buffer uses 2x preallocation on every realloc for O(N) append
* The string buffer uses 2x preallocation on every realloc for O(N) append
* behavior. */
* behavior. */
...
@@ -108,7 +117,7 @@ static mp_buf *mp_buf_new(lua_State *L) {
...
@@ -108,7 +117,7 @@ static mp_buf *mp_buf_new(lua_State *L) {
mp_buf
*
buf
=
NULL
;
mp_buf
*
buf
=
NULL
;
/* Old size = 0; new size = sizeof(*buf) */
/* Old size = 0; new size = sizeof(*buf) */
buf
=
(
mp_buf
*
)
mp_realloc
(
L
,
buf
,
0
,
sizeof
(
*
buf
));
buf
=
(
mp_buf
*
)
mp_realloc
(
L
,
NULL
,
0
,
sizeof
(
*
buf
));
buf
->
L
=
L
;
buf
->
L
=
L
;
buf
->
b
=
NULL
;
buf
->
b
=
NULL
;
...
@@ -143,7 +152,7 @@ void mp_buf_free(mp_buf *buf) {
...
@@ -143,7 +152,7 @@ void mp_buf_free(mp_buf *buf) {
* be used to report errors. */
* be used to report errors. */
#define MP_CUR_ERROR_NONE 0
#define MP_CUR_ERROR_NONE 0
#define MP_CUR_ERROR_EOF 1
/* Not enough data to complete oper
e
ation. */
#define MP_CUR_ERROR_EOF 1
/* Not enough data to complete operation. */
#define MP_CUR_ERROR_BADFMT 2
/* Bad data format */
#define MP_CUR_ERROR_BADFMT 2
/* Bad data format */
typedef
struct
mp_cur
{
typedef
struct
mp_cur
{
...
@@ -160,7 +169,7 @@ static void mp_cur_init(mp_cur *cursor, const unsigned char *s, size_t len) {
...
@@ -160,7 +169,7 @@ static void mp_cur_init(mp_cur *cursor, const unsigned char *s, size_t len) {
#define mp_cur_consume(_c,_len) do { _c->p += _len; _c->left -= _len; } while(0)
#define mp_cur_consume(_c,_len) do { _c->p += _len; _c->left -= _len; } while(0)
/* When there is not enough room we set an error in the cursor and return
, t
his
/* When there is not enough room we set an error in the cursor and return
. T
his
* is very common across the code so we have a macro to make the code look
* is very common across the code so we have a macro to make the code look
* a bit simpler. */
* a bit simpler. */
#define mp_cur_need(_c,_len) do { \
#define mp_cur_need(_c,_len) do { \
...
@@ -350,7 +359,11 @@ static void mp_encode_lua_bool(lua_State *L, mp_buf *buf) {
...
@@ -350,7 +359,11 @@ static void mp_encode_lua_bool(lua_State *L, mp_buf *buf) {
/* Lua 5.3 has a built in 64-bit integer type */
/* Lua 5.3 has a built in 64-bit integer type */
static
void
mp_encode_lua_integer
(
lua_State
*
L
,
mp_buf
*
buf
)
{
static
void
mp_encode_lua_integer
(
lua_State
*
L
,
mp_buf
*
buf
)
{
#if (LUA_VERSION_NUM < 503) && BITS_32
lua_Number
i
=
lua_tonumber
(
L
,
-
1
);
#else
lua_Integer
i
=
lua_tointeger
(
L
,
-
1
);
lua_Integer
i
=
lua_tointeger
(
L
,
-
1
);
#endif
mp_encode_int
(
buf
,
(
int64_t
)
i
);
mp_encode_int
(
buf
,
(
int64_t
)
i
);
}
}
...
@@ -392,7 +405,7 @@ static void mp_encode_lua_table_as_map(lua_State *L, mp_buf *buf, int level) {
...
@@ -392,7 +405,7 @@ static void mp_encode_lua_table_as_map(lua_State *L, mp_buf *buf, int level) {
/* First step: count keys into table. No other way to do it with the
/* First step: count keys into table. No other way to do it with the
* Lua API, we need to iterate a first time. Note that an alternative
* Lua API, we need to iterate a first time. Note that an alternative
* would be to do a single run, and then hack the buffer to insert the
* would be to do a single run, and then hack the buffer to insert the
* map opcodes for message pack. Too hac
h
ish for this lib. */
* map opcodes for message pack. Too hac
k
ish for this lib. */
lua_pushnil
(
L
);
lua_pushnil
(
L
);
while
(
lua_next
(
L
,
-
2
))
{
while
(
lua_next
(
L
,
-
2
))
{
lua_pop
(
L
,
1
);
/* remove value, keep key for next iteration. */
lua_pop
(
L
,
1
);
/* remove value, keep key for next iteration. */
...
@@ -432,11 +445,12 @@ static int table_is_an_array(lua_State *L) {
...
@@ -432,11 +445,12 @@ static int table_is_an_array(lua_State *L) {
lua_pop
(
L
,
1
);
/* Stack: ... key */
lua_pop
(
L
,
1
);
/* Stack: ... key */
/* The <= 0 check is valid here because we're comparing indexes. */
/* The <= 0 check is valid here because we're comparing indexes. */
#if LUA_VERSION_NUM < 503
#if LUA_VERSION_NUM < 503
if
(
!
lua_isnumber
(
L
,
-
1
)
||
(
n
=
lua_tonumber
(
L
,
-
1
))
<=
0
||
if
(
(
LUA_TNUMBER
!=
lua_type
(
L
,
-
1
)
)
||
(
n
=
lua_tonumber
(
L
,
-
1
))
<=
0
||
!
IS_INT_EQUIVALENT
(
n
))
{
!
IS_INT_EQUIVALENT
(
n
))
#else
#else
if
(
!
lua_isinteger
(
L
,
-
1
)
||
(
n
=
lua_tointeger
(
L
,
-
1
))
<=
0
)
{
if
(
!
lua_isinteger
(
L
,
-
1
)
||
(
n
=
lua_tointeger
(
L
,
-
1
))
<=
0
)
#endif
#endif
{
lua_settop
(
L
,
stacktop
);
lua_settop
(
L
,
stacktop
);
return
0
;
return
0
;
}
}
...
@@ -473,7 +487,7 @@ static void mp_encode_lua_null(lua_State *L, mp_buf *buf) {
...
@@ -473,7 +487,7 @@ static void mp_encode_lua_null(lua_State *L, mp_buf *buf) {
static
void
mp_encode_lua_type
(
lua_State
*
L
,
mp_buf
*
buf
,
int
level
)
{
static
void
mp_encode_lua_type
(
lua_State
*
L
,
mp_buf
*
buf
,
int
level
)
{
int
t
=
lua_type
(
L
,
-
1
);
int
t
=
lua_type
(
L
,
-
1
);
/* Limit the encoding of nested tables to a spec
f
iied maximum depth, so that
/* Limit the encoding of nested tables to a speci
f
ied maximum depth, so that
* we survive when called against circular references in tables. */
* we survive when called against circular references in tables. */
if
(
t
==
LUA_TTABLE
&&
level
==
LUACMSGPACK_MAX_NESTING
)
t
=
LUA_TNIL
;
if
(
t
==
LUA_TTABLE
&&
level
==
LUACMSGPACK_MAX_NESTING
)
t
=
LUA_TNIL
;
switch
(
t
)
{
switch
(
t
)
{
...
@@ -630,7 +644,11 @@ void mp_decode_to_lua_type(lua_State *L, mp_cur *c) {
...
@@ -630,7 +644,11 @@ void mp_decode_to_lua_type(lua_State *L, mp_cur *c) {
break
;
break
;
case
0xd3
:
/* int 64 */
case
0xd3
:
/* int 64 */
mp_cur_need
(
c
,
9
);
mp_cur_need
(
c
,
9
);
#if LUA_VERSION_NUM < 503
lua_pushnumber
(
L
,
#else
lua_pushinteger
(
L
,
lua_pushinteger
(
L
,
#endif
((
int64_t
)
c
->
p
[
1
]
<<
56
)
|
((
int64_t
)
c
->
p
[
1
]
<<
56
)
|
((
int64_t
)
c
->
p
[
2
]
<<
48
)
|
((
int64_t
)
c
->
p
[
2
]
<<
48
)
|
((
int64_t
)
c
->
p
[
3
]
<<
40
)
|
((
int64_t
)
c
->
p
[
3
]
<<
40
)
|
...
...
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