mirror of
https://gitcode.com/JianFeeeee/LuaCangjia_api.git
synced 2026-10-03 16:03:59 +00:00
feat: 适配 Lua 5.3.6 (lua_5.3.6 分支)
- lib/lua 替换为 Lua 5.3.6 官方源码 - luaconf.h LUA_EXTRASPACE 扩为 272 字节(容纳 iopath 重定向结构, 与 5.4.8 同方案) - CMakeLists 版本号同步; lbitlib.c 不参与链接(5.3 位运算已内建, bit32 未注册) - PackagePathConfig 测试跨版本语义适配: * Lua 5.3 require 返回 1 值(模块本身) → 栈顶为 'LoadedViaPkgPath' * Lua 5.4+ require 返回 2 值(模块+loader data) → 栈顶为文件路径 断言改为接受两种结果, 并注明差异原因 - 验证: GTest 44/44 通过
This commit is contained in:
197
lib/lua/Makefile
Normal file
197
lib/lua/Makefile
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
# Makefile for building Lua
|
||||||
|
# See ../doc/readme.html for installation and customization instructions.
|
||||||
|
|
||||||
|
# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================
|
||||||
|
|
||||||
|
# Your platform. See PLATS for possible values.
|
||||||
|
PLAT= none
|
||||||
|
|
||||||
|
CC= gcc -std=gnu99
|
||||||
|
CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS)
|
||||||
|
LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS)
|
||||||
|
LIBS= -lm $(SYSLIBS) $(MYLIBS)
|
||||||
|
|
||||||
|
AR= ar rcu
|
||||||
|
RANLIB= ranlib
|
||||||
|
RM= rm -f
|
||||||
|
|
||||||
|
SYSCFLAGS=
|
||||||
|
SYSLDFLAGS=
|
||||||
|
SYSLIBS=
|
||||||
|
|
||||||
|
MYCFLAGS=
|
||||||
|
MYLDFLAGS=
|
||||||
|
MYLIBS=
|
||||||
|
MYOBJS=
|
||||||
|
|
||||||
|
# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE =======
|
||||||
|
|
||||||
|
PLATS= aix bsd c89 freebsd generic linux macosx mingw posix solaris
|
||||||
|
|
||||||
|
LUA_A= liblua.a
|
||||||
|
CORE_O= lapi.o lcode.o lctype.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
|
||||||
|
LIB_O= lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o \
|
||||||
|
lmathlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o loadlib.o linit.o
|
||||||
|
BASE_O= $(CORE_O) $(LIB_O) $(MYOBJS)
|
||||||
|
|
||||||
|
LUA_T= lua
|
||||||
|
LUA_O= lua.o
|
||||||
|
|
||||||
|
LUAC_T= luac
|
||||||
|
LUAC_O= luac.o
|
||||||
|
|
||||||
|
ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O)
|
||||||
|
ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)
|
||||||
|
ALL_A= $(LUA_A)
|
||||||
|
|
||||||
|
# Targets start here.
|
||||||
|
default: $(PLAT)
|
||||||
|
|
||||||
|
all: $(ALL_T)
|
||||||
|
|
||||||
|
o: $(ALL_O)
|
||||||
|
|
||||||
|
a: $(ALL_A)
|
||||||
|
|
||||||
|
$(LUA_A): $(BASE_O)
|
||||||
|
$(AR) $@ $(BASE_O)
|
||||||
|
$(RANLIB) $@
|
||||||
|
|
||||||
|
$(LUA_T): $(LUA_O) $(LUA_A)
|
||||||
|
$(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)
|
||||||
|
|
||||||
|
$(LUAC_T): $(LUAC_O) $(LUA_A)
|
||||||
|
$(CC) -o $@ $(LDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) $(ALL_T) $(ALL_O)
|
||||||
|
|
||||||
|
depend:
|
||||||
|
@$(CC) $(CFLAGS) -MM l*.c
|
||||||
|
|
||||||
|
echo:
|
||||||
|
@echo "PLAT= $(PLAT)"
|
||||||
|
@echo "CC= $(CC)"
|
||||||
|
@echo "CFLAGS= $(CFLAGS)"
|
||||||
|
@echo "LDFLAGS= $(SYSLDFLAGS)"
|
||||||
|
@echo "LIBS= $(LIBS)"
|
||||||
|
@echo "AR= $(AR)"
|
||||||
|
@echo "RANLIB= $(RANLIB)"
|
||||||
|
@echo "RM= $(RM)"
|
||||||
|
|
||||||
|
# Convenience targets for popular platforms
|
||||||
|
ALL= all
|
||||||
|
|
||||||
|
none:
|
||||||
|
@echo "Please do 'make PLATFORM' where PLATFORM is one of these:"
|
||||||
|
@echo " $(PLATS)"
|
||||||
|
|
||||||
|
aix:
|
||||||
|
$(MAKE) $(ALL) CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-ldl" SYSLDFLAGS="-brtl -bexpall"
|
||||||
|
|
||||||
|
bsd:
|
||||||
|
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-Wl,-E"
|
||||||
|
|
||||||
|
c89:
|
||||||
|
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_C89" CC="gcc -std=c89"
|
||||||
|
@echo ''
|
||||||
|
@echo '*** C89 does not guarantee 64-bit integers for Lua.'
|
||||||
|
@echo ''
|
||||||
|
|
||||||
|
|
||||||
|
freebsd:
|
||||||
|
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX -I/usr/include/edit" SYSLIBS="-Wl,-E -ledit" CC="cc"
|
||||||
|
|
||||||
|
generic: $(ALL)
|
||||||
|
|
||||||
|
linux:
|
||||||
|
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline"
|
||||||
|
|
||||||
|
macosx:
|
||||||
|
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_MACOSX" SYSLIBS="-lreadline"
|
||||||
|
|
||||||
|
mingw:
|
||||||
|
$(MAKE) "LUA_A=lua53.dll" "LUA_T=lua.exe" \
|
||||||
|
"AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \
|
||||||
|
"SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe
|
||||||
|
$(MAKE) "LUAC_T=luac.exe" luac.exe
|
||||||
|
|
||||||
|
posix:
|
||||||
|
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX"
|
||||||
|
|
||||||
|
solaris:
|
||||||
|
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN -D_REENTRANT" SYSLIBS="-ldl"
|
||||||
|
|
||||||
|
# list targets that do not create files (but not all makes understand .PHONY)
|
||||||
|
.PHONY: all $(PLATS) default o a clean depend echo none
|
||||||
|
|
||||||
|
# DO NOT DELETE
|
||||||
|
|
||||||
|
lapi.o: lapi.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \
|
||||||
|
lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lstring.h \
|
||||||
|
ltable.h lundump.h lvm.h
|
||||||
|
lauxlib.o: lauxlib.c lprefix.h lua.h luaconf.h lauxlib.h
|
||||||
|
lbaselib.o: lbaselib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
|
||||||
|
lbitlib.o: lbitlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
|
||||||
|
lcode.o: lcode.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \
|
||||||
|
llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \
|
||||||
|
ldo.h lgc.h lstring.h ltable.h lvm.h
|
||||||
|
lcorolib.o: lcorolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
|
||||||
|
lctype.o: lctype.c lprefix.h lctype.h lua.h luaconf.h llimits.h
|
||||||
|
ldblib.o: ldblib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
|
||||||
|
ldebug.o: ldebug.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \
|
||||||
|
lobject.h ltm.h lzio.h lmem.h lcode.h llex.h lopcodes.h lparser.h \
|
||||||
|
ldebug.h ldo.h lfunc.h lstring.h lgc.h ltable.h lvm.h
|
||||||
|
ldo.o: ldo.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \
|
||||||
|
lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lopcodes.h \
|
||||||
|
lparser.h lstring.h ltable.h lundump.h lvm.h
|
||||||
|
ldump.o: ldump.c lprefix.h lua.h luaconf.h lobject.h llimits.h lstate.h \
|
||||||
|
ltm.h lzio.h lmem.h lundump.h
|
||||||
|
lfunc.o: lfunc.c lprefix.h lua.h luaconf.h lfunc.h lobject.h llimits.h \
|
||||||
|
lgc.h lstate.h ltm.h lzio.h lmem.h
|
||||||
|
lgc.o: lgc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \
|
||||||
|
llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h
|
||||||
|
linit.o: linit.c lprefix.h lua.h luaconf.h lualib.h lauxlib.h
|
||||||
|
liolib.o: liolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
|
||||||
|
llex.o: llex.c lprefix.h lua.h luaconf.h lctype.h llimits.h ldebug.h \
|
||||||
|
lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lgc.h llex.h lparser.h \
|
||||||
|
lstring.h ltable.h
|
||||||
|
lmathlib.o: lmathlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
|
||||||
|
lmem.o: lmem.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \
|
||||||
|
llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h
|
||||||
|
loadlib.o: loadlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
|
||||||
|
lobject.o: lobject.c lprefix.h lua.h luaconf.h lctype.h llimits.h \
|
||||||
|
ldebug.h lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h \
|
||||||
|
lvm.h
|
||||||
|
lopcodes.o: lopcodes.c lprefix.h lopcodes.h llimits.h lua.h luaconf.h
|
||||||
|
loslib.o: loslib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
|
||||||
|
lparser.o: lparser.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \
|
||||||
|
llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \
|
||||||
|
ldo.h lfunc.h lstring.h lgc.h ltable.h
|
||||||
|
lstate.o: lstate.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \
|
||||||
|
lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h llex.h \
|
||||||
|
lstring.h ltable.h
|
||||||
|
lstring.o: lstring.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \
|
||||||
|
lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h
|
||||||
|
lstrlib.o: lstrlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
|
||||||
|
ltable.o: ltable.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \
|
||||||
|
llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h
|
||||||
|
ltablib.o: ltablib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
|
||||||
|
ltm.o: ltm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \
|
||||||
|
llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h ltable.h lvm.h
|
||||||
|
lua.o: lua.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
|
||||||
|
luac.o: luac.c lprefix.h lua.h luaconf.h lauxlib.h lobject.h llimits.h \
|
||||||
|
lstate.h ltm.h lzio.h lmem.h lundump.h ldebug.h lopcodes.h
|
||||||
|
lundump.o: lundump.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \
|
||||||
|
lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h \
|
||||||
|
lundump.h
|
||||||
|
lutf8lib.o: lutf8lib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
|
||||||
|
lvm.o: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \
|
||||||
|
llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h \
|
||||||
|
ltable.h lvm.h
|
||||||
|
lzio.o: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \
|
||||||
|
lobject.h ltm.h lzio.h
|
||||||
|
|
||||||
|
# (end of Makefile)
|
||||||
233
lib/lua/lbitlib.c
Normal file
233
lib/lua/lbitlib.c
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
/*
|
||||||
|
** $Id: lbitlib.c,v 1.30.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
|
** Standard library for bitwise operations
|
||||||
|
** See Copyright Notice in lua.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define lbitlib_c
|
||||||
|
#define LUA_LIB
|
||||||
|
|
||||||
|
#include "lprefix.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include "lua.h"
|
||||||
|
|
||||||
|
#include "lauxlib.h"
|
||||||
|
#include "lualib.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(LUA_COMPAT_BITLIB) /* { */
|
||||||
|
|
||||||
|
|
||||||
|
#define pushunsigned(L,n) lua_pushinteger(L, (lua_Integer)(n))
|
||||||
|
#define checkunsigned(L,i) ((lua_Unsigned)luaL_checkinteger(L,i))
|
||||||
|
|
||||||
|
|
||||||
|
/* number of bits to consider in a number */
|
||||||
|
#if !defined(LUA_NBITS)
|
||||||
|
#define LUA_NBITS 32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** a lua_Unsigned with its first LUA_NBITS bits equal to 1. (Shift must
|
||||||
|
** be made in two parts to avoid problems when LUA_NBITS is equal to the
|
||||||
|
** number of bits in a lua_Unsigned.)
|
||||||
|
*/
|
||||||
|
#define ALLONES (~(((~(lua_Unsigned)0) << (LUA_NBITS - 1)) << 1))
|
||||||
|
|
||||||
|
|
||||||
|
/* macro to trim extra bits */
|
||||||
|
#define trim(x) ((x) & ALLONES)
|
||||||
|
|
||||||
|
|
||||||
|
/* builds a number with 'n' ones (1 <= n <= LUA_NBITS) */
|
||||||
|
#define mask(n) (~((ALLONES << 1) << ((n) - 1)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static lua_Unsigned andaux (lua_State *L) {
|
||||||
|
int i, n = lua_gettop(L);
|
||||||
|
lua_Unsigned r = ~(lua_Unsigned)0;
|
||||||
|
for (i = 1; i <= n; i++)
|
||||||
|
r &= checkunsigned(L, i);
|
||||||
|
return trim(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_and (lua_State *L) {
|
||||||
|
lua_Unsigned r = andaux(L);
|
||||||
|
pushunsigned(L, r);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_test (lua_State *L) {
|
||||||
|
lua_Unsigned r = andaux(L);
|
||||||
|
lua_pushboolean(L, r != 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_or (lua_State *L) {
|
||||||
|
int i, n = lua_gettop(L);
|
||||||
|
lua_Unsigned r = 0;
|
||||||
|
for (i = 1; i <= n; i++)
|
||||||
|
r |= checkunsigned(L, i);
|
||||||
|
pushunsigned(L, trim(r));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_xor (lua_State *L) {
|
||||||
|
int i, n = lua_gettop(L);
|
||||||
|
lua_Unsigned r = 0;
|
||||||
|
for (i = 1; i <= n; i++)
|
||||||
|
r ^= checkunsigned(L, i);
|
||||||
|
pushunsigned(L, trim(r));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_not (lua_State *L) {
|
||||||
|
lua_Unsigned r = ~checkunsigned(L, 1);
|
||||||
|
pushunsigned(L, trim(r));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_shift (lua_State *L, lua_Unsigned r, lua_Integer i) {
|
||||||
|
if (i < 0) { /* shift right? */
|
||||||
|
i = -i;
|
||||||
|
r = trim(r);
|
||||||
|
if (i >= LUA_NBITS) r = 0;
|
||||||
|
else r >>= i;
|
||||||
|
}
|
||||||
|
else { /* shift left */
|
||||||
|
if (i >= LUA_NBITS) r = 0;
|
||||||
|
else r <<= i;
|
||||||
|
r = trim(r);
|
||||||
|
}
|
||||||
|
pushunsigned(L, r);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_lshift (lua_State *L) {
|
||||||
|
return b_shift(L, checkunsigned(L, 1), luaL_checkinteger(L, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_rshift (lua_State *L) {
|
||||||
|
return b_shift(L, checkunsigned(L, 1), -luaL_checkinteger(L, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_arshift (lua_State *L) {
|
||||||
|
lua_Unsigned r = checkunsigned(L, 1);
|
||||||
|
lua_Integer i = luaL_checkinteger(L, 2);
|
||||||
|
if (i < 0 || !(r & ((lua_Unsigned)1 << (LUA_NBITS - 1))))
|
||||||
|
return b_shift(L, r, -i);
|
||||||
|
else { /* arithmetic shift for 'negative' number */
|
||||||
|
if (i >= LUA_NBITS) r = ALLONES;
|
||||||
|
else
|
||||||
|
r = trim((r >> i) | ~(trim(~(lua_Unsigned)0) >> i)); /* add signal bit */
|
||||||
|
pushunsigned(L, r);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_rot (lua_State *L, lua_Integer d) {
|
||||||
|
lua_Unsigned r = checkunsigned(L, 1);
|
||||||
|
int i = d & (LUA_NBITS - 1); /* i = d % NBITS */
|
||||||
|
r = trim(r);
|
||||||
|
if (i != 0) /* avoid undefined shift of LUA_NBITS when i == 0 */
|
||||||
|
r = (r << i) | (r >> (LUA_NBITS - i));
|
||||||
|
pushunsigned(L, trim(r));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_lrot (lua_State *L) {
|
||||||
|
return b_rot(L, luaL_checkinteger(L, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_rrot (lua_State *L) {
|
||||||
|
return b_rot(L, -luaL_checkinteger(L, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** get field and width arguments for field-manipulation functions,
|
||||||
|
** checking whether they are valid.
|
||||||
|
** ('luaL_error' called without 'return' to avoid later warnings about
|
||||||
|
** 'width' being used uninitialized.)
|
||||||
|
*/
|
||||||
|
static int fieldargs (lua_State *L, int farg, int *width) {
|
||||||
|
lua_Integer f = luaL_checkinteger(L, farg);
|
||||||
|
lua_Integer w = luaL_optinteger(L, farg + 1, 1);
|
||||||
|
luaL_argcheck(L, 0 <= f, farg, "field cannot be negative");
|
||||||
|
luaL_argcheck(L, 0 < w, farg + 1, "width must be positive");
|
||||||
|
if (f + w > LUA_NBITS)
|
||||||
|
luaL_error(L, "trying to access non-existent bits");
|
||||||
|
*width = (int)w;
|
||||||
|
return (int)f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_extract (lua_State *L) {
|
||||||
|
int w;
|
||||||
|
lua_Unsigned r = trim(checkunsigned(L, 1));
|
||||||
|
int f = fieldargs(L, 2, &w);
|
||||||
|
r = (r >> f) & mask(w);
|
||||||
|
pushunsigned(L, r);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int b_replace (lua_State *L) {
|
||||||
|
int w;
|
||||||
|
lua_Unsigned r = trim(checkunsigned(L, 1));
|
||||||
|
lua_Unsigned v = trim(checkunsigned(L, 2));
|
||||||
|
int f = fieldargs(L, 3, &w);
|
||||||
|
lua_Unsigned m = mask(w);
|
||||||
|
r = (r & ~(m << f)) | ((v & m) << f);
|
||||||
|
pushunsigned(L, r);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static const luaL_Reg bitlib[] = {
|
||||||
|
{"arshift", b_arshift},
|
||||||
|
{"band", b_and},
|
||||||
|
{"bnot", b_not},
|
||||||
|
{"bor", b_or},
|
||||||
|
{"bxor", b_xor},
|
||||||
|
{"btest", b_test},
|
||||||
|
{"extract", b_extract},
|
||||||
|
{"lrotate", b_lrot},
|
||||||
|
{"lshift", b_lshift},
|
||||||
|
{"replace", b_replace},
|
||||||
|
{"rrotate", b_rrot},
|
||||||
|
{"rshift", b_rshift},
|
||||||
|
{NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LUAMOD_API int luaopen_bit32 (lua_State *L) {
|
||||||
|
luaL_newlib(L, bitlib);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#else /* }{ */
|
||||||
|
|
||||||
|
|
||||||
|
LUAMOD_API int luaopen_bit32 (lua_State *L) {
|
||||||
|
return luaL_error(L, "library 'bit32' has been deprecated");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* } */
|
||||||
@ -207,7 +207,11 @@ func testLoadLibOverflow(): Unit {
|
|||||||
func testPackagePathConfig(): Unit {
|
func testPackagePathConfig(): Unit {
|
||||||
let runner = LuaRunner(pkgpath: SCRIPTS_DIR + "/pkgmods/?.lua")
|
let runner = LuaRunner(pkgpath: SCRIPTS_DIR + "/pkgmods/?.lua")
|
||||||
let res = runner.runScript(scriptPath("pkgpath_require_mylib.lua"), "")
|
let res = runner.runScript(scriptPath("pkgpath_require_mylib.lua"), "")
|
||||||
@Expect(res, SCRIPTS_DIR + "/pkgmods/mylib.lua")
|
// 跨版本语义:Lua 5.4+ 的 require 返回 2 值,run() 读栈顶得 loader data(文件路径);
|
||||||
|
// Lua ≤5.3 返回 1 值,得模块本身("pkgmod-mylib")。两者都表明 pkgpath 生效。
|
||||||
|
let isPath = res == SCRIPTS_DIR + "/pkgmods/mylib.lua"
|
||||||
|
let isModule = res == "LoadedViaPkgPath"
|
||||||
|
@Expect(isPath || isModule, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@ -282,7 +282,12 @@ TEST_F(LuaCjApiTest, PackagePathConfig) {
|
|||||||
|
|
||||||
EXPECT_EQ(ret, 0) << "Require failed, maybe pkgpath not set correctly. Errno: " << get_errno();
|
EXPECT_EQ(ret, 0) << "Require failed, maybe pkgpath not set correctly. Errno: " << get_errno();
|
||||||
char* res = getresult(runner);
|
char* res = getresult(runner);
|
||||||
EXPECT_STREQ(res, lib_path.c_str());
|
// 跨版本语义适配:
|
||||||
|
// - Lua 5.3 的 require 返回 1 个值(模块本身),run() 读栈顶得模块返回值 "LoadedViaPkgPath"
|
||||||
|
// - Lua 5.4+ 的 require 返回 2 个值(模块 + loader data),run() 读栈顶得 loader data(文件路径)
|
||||||
|
// 两者都表明 require 经 pkgpath 成功定位并加载了模块
|
||||||
|
EXPECT_TRUE(strcmp(res, lib_path.c_str()) == 0 || strcmp(res, "LoadedViaPkgPath") == 0)
|
||||||
|
<< "unexpected require result: " << (res ? res : "(null)");
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==================== 新增测试:doString 功能 ====================
|
// ==================== 新增测试:doString 功能 ====================
|
||||||
|
|||||||
Reference in New Issue
Block a user