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
Nodemcu Firmware
Commits
dba57fa0
Commit
dba57fa0
authored
Aug 24, 2021
by
Johny Mattsson
Browse files
Merge branch 'dev-esp32-idf4-lua53' into dev-esp32-idf4
parents
3a6961cc
8e5ce49d
Changes
224
Show whitespace changes
Inline
Side-by-side
components/lua/lua-5.1/lnodemcu.c
0 → 100644
View file @
dba57fa0
/*
** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
** Tag methods
** See Copyright Notice in lua.h
*/
#define lnodemcu_c
#define LUA_CORE
#include "lua.h"
#include <string.h>
#include "lobject.h"
#include "lstate.h"
#include "lauxlib.h"
#include "lgc.h"
#include "lstring.h"
#include "ltable.h"
#include "ltm.h"
#include "lnodemcu.h"
//== NodeMCU lauxlib.h API extensions ========================================//
#ifdef LUA_USE_ESP
#include "task/task.h"
#include "platform.h"
/*
** Error Reporting Task. We can't pass a string parameter to the error reporter
** directly through the task interface the call is wrapped in a C closure with
** the error string as an Upval and this is posted to call the Lua reporter.
*/
static
int
errhandler_aux
(
lua_State
*
L
)
{
lua_getfield
(
L
,
LUA_REGISTRYINDEX
,
"onerror"
);
if
(
!
lua_isfunction
(
L
,
-
1
))
{
lua_pop
(
L
,
1
);
lua_getglobal
(
L
,
"print"
);
}
lua_pushvalue
(
L
,
lua_upvalueindex
(
1
));
lua_call
(
L
,
1
,
0
);
/* Using an error handler would cause an infinite loop! */
return
0
;
}
/*
** Error handler for luaL_pcallx(), called from the lua_pcall() with a single
** argument -- the thrown error. This plus depth=2 is passed to debug.traceback()
** to convert into an error message which it handles in a separate posted task.
*/
static
int
errhandler
(
lua_State
*
L
)
{
lua_getglobal
(
L
,
"debug"
);
lua_getfield
(
L
,
-
1
,
"traceback"
);
if
(
lua_isfunction
(
L
,
-
1
))
{
lua_insert
(
L
,
1
);
/* insert tracback function above error */
lua_pop
(
L
,
1
);
/* dump the debug table entry */
lua_pushinteger
(
L
,
2
);
/* skip this function and traceback */
lua_call
(
L
,
2
,
1
);
/* call debug.traceback and return it as a string */
lua_pushcclosure
(
L
,
errhandler_aux
,
1
);
/* report with str as upval */
luaL_posttask
(
L
,
LUA_TASK_HIGH
);
}
return
0
;
}
/*
** Use in CBs and other C functions to call a Lua function. This includes
** an error handler which will catch any error and then post this to the
** registered reporter function as a separate follow-on task.
*/
LUALIB_API
int
luaL_pcallx
(
lua_State
*
L
,
int
narg
,
int
nres
)
{
// [-narg, +0, v]
int
status
;
int
base
=
lua_gettop
(
L
)
-
narg
;
lua_pushcfunction
(
L
,
errhandler
);
lua_insert
(
L
,
base
);
/* put under args */
status
=
lua_pcall
(
L
,
narg
,
nres
,
base
);
lua_remove
(
L
,
base
);
/* remove traceback function */
if
(
status
!=
LUA_OK
&&
status
!=
LUA_ERRRUN
)
{
lua_gc
(
L
,
LUA_GCCOLLECT
,
0
);
/* call onerror directly if handler failed */
lua_pushliteral
(
L
,
"out of memory"
);
lua_pushcclosure
(
L
,
errhandler_aux
,
1
);
/* report EOM as upval */
luaL_posttask
(
L
,
LUA_TASK_HIGH
);
}
return
status
;
}
static
task_handle_t
task_handle
=
0
;
/*
** Task callback handler. Uses luaN_call to do a protected call with full traceback
*/
static
void
do_task
(
task_param_t
task_fn_ref
,
task_prio_t
prio
)
{
lua_State
*
L
=
lua_getstate
();
if
(
prio
<
0
||
prio
>
2
)
luaL_error
(
L
,
"invalid posk task"
);
/* Pop the CB func from the Reg */
//dbg_printf("calling Reg[%u]\n", task_fn_ref);
lua_rawgeti
(
L
,
LUA_REGISTRYINDEX
,
(
int
)
task_fn_ref
);
luaL_checkfunction
(
L
,
-
1
);
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
(
int
)
task_fn_ref
);
lua_pushinteger
(
L
,
prio
);
luaL_pcallx
(
L
,
1
,
0
);
}
/*
** Schedule a Lua function for task execution
*/
LUALIB_API
int
luaL_posttask
(
lua_State
*
L
,
int
prio
)
{
// [-1, +0, -]
if
(
!
task_handle
)
task_handle
=
task_get_id
(
do_task
);
if
(
!
lua_isfunction
(
L
,
-
1
)
||
prio
<
LUA_TASK_LOW
||
prio
>
LUA_TASK_HIGH
)
luaL_error
(
L
,
"invalid posk task"
);
//void *cl = clvalue(L->top-1);
int
task_fn_ref
=
luaL_ref
(
L
,
LUA_REGISTRYINDEX
);
//dbg_printf("posting Reg[%u]=%p\n",task_fn_ref,cl);
if
(
!
task_post
(
prio
,
task_handle
,
(
task_param_t
)
task_fn_ref
))
{
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
task_fn_ref
);
luaL_error
(
L
,
"Task queue overflow. Task not posted"
);
}
return
task_fn_ref
;
}
#else
LUALIB_API
int
luaL_posttask
(
lua_State
*
L
,
int
prio
)
{
(
void
)
L
;
(
void
)
prio
;
return
0
;
}
/* Dummy stub on host */
#endif
#ifdef LUA_USE_ESP
/*
* Return an LFS function
*/
LUALIB_API
int
luaL_pushlfsmodule
(
lua_State
*
L
)
{
if
(
lua_pushlfsindex
(
L
)
==
LUA_TNIL
)
{
lua_remove
(
L
,
-
2
);
/* dump the name to balance the stack */
return
0
;
/* return nil if LFS not loaded */
}
lua_insert
(
L
,
-
2
);
lua_call
(
L
,
1
,
1
);
if
(
!
lua_isfunction
(
L
,
-
1
))
{
lua_pop
(
L
,
1
);
lua_pushnil
(
L
);
/* replace DTS by nil */
}
return
1
;
}
/*
* Return an array of functions in LFS
*/
LUALIB_API
int
luaL_pushlfsmodules
(
lua_State
*
L
)
{
if
(
lua_pushlfsindex
(
L
)
==
LUA_TNIL
)
return
0
;
/* return nil if LFS not loaded */
lua_call
(
L
,
0
,
2
);
lua_remove
(
L
,
-
2
);
/* remove DTS leaving array */
return
1
;
}
/*
* Return the Unix timestamp of the LFS image creation
*/
LUALIB_API
int
luaL_pushlfsdts
(
lua_State
*
L
)
{
if
(
lua_pushlfsindex
(
L
)
==
LUA_TNIL
)
return
0
;
/* return nil if LFS not loaded */
lua_call
(
L
,
0
,
1
);
return
1
;
}
#endif
//== NodeMCU lua.h API extensions ============================================//
LUA_API
int
lua_freeheap
(
void
)
{
#ifdef LUA_USE_HOST
return
MAX_INT
;
#else
return
(
int
)
esp_get_free_heap_size
();
#endif
}
#define api_incr_top(L) {api_check(L, L->top < L->ci->top); L->top++;}
LUA_API
int
lua_pushstringsarray
(
lua_State
*
L
,
int
opt
)
{
stringtable
*
tb
=
NULL
;
int
i
,
j
;
lua_lock
(
L
);
if
(
opt
==
0
)
tb
=
&
G
(
L
)
->
strt
;
#ifdef LUA_USE_ESP
else
if
(
opt
==
1
&&
G
(
L
)
->
ROstrt
.
hash
)
tb
=
&
G
(
L
)
->
ROstrt
;
#endif
if
(
tb
==
NULL
)
{
setnilvalue
(
L
->
top
);
api_incr_top
(
L
);
lua_unlock
(
L
);
return
0
;
}
Table
*
t
=
luaH_new
(
L
,
tb
->
nuse
,
0
);
sethvalue
(
L
,
L
->
top
,
t
);
api_incr_top
(
L
);
luaC_checkGC
(
L
);
lua_unlock
(
L
);
for
(
i
=
0
,
j
=
1
;
i
<
tb
->
size
;
i
++
)
{
GCObject
*
o
;
for
(
o
=
tb
->
hash
[
i
];
o
;
o
=
o
->
gch
.
next
)
{
TValue
v
;
setsvalue
(
L
,
&
v
,
o
);
setobj2s
(
L
,
luaH_setnum
(
L
,
hvalue
(
L
->
top
-
1
),
j
++
),
&
v
);
}
}
return
1
;
}
LUA_API
void
lua_createrotable
(
lua_State
*
L
,
ROTable
*
t
,
const
ROTable_entry
*
e
,
ROTable
*
mt
)
{
int
i
,
j
;
lu_byte
flags
=
~
0
;
const
char
*
plast
=
(
char
*
)
"_"
;
for
(
i
=
0
;
e
[
i
].
key
;
i
++
)
{
if
(
e
[
i
].
key
[
0
]
==
'_'
&&
strcmp
(
e
[
i
].
key
,
plast
))
{
plast
=
e
[
i
].
key
;
lua_pushstring
(
L
,
e
[
i
].
key
);
for
(
j
=
0
;
j
<
TM_EQ
;
j
++
){
if
(
rawtsvalue
(
L
->
top
-
1
)
==
G
(
L
)
->
tmname
[
i
])
{
flags
|=
cast_byte
(
1u
<<
i
);
break
;
}
}
lua_pop
(
L
,
1
);
}
}
t
->
next
=
(
GCObject
*
)
1
;
t
->
tt
=
LUA_TROTABLE
;
t
->
marked
=
LROT_MARKED
;
t
->
flags
=
flags
;
t
->
lsizenode
=
i
;
t
->
metatable
=
cast
(
Table
*
,
mt
);
t
->
entry
=
cast
(
ROTable_entry
*
,
e
);
}
#ifdef LUA_USE_ESP
#include "lfunc.h"
/* Push the LClosure of the LFS index function */
LUA_API
int
lua_pushlfsindex
(
lua_State
*
L
)
{
lua_lock
(
L
);
Proto
*
p
=
G
(
L
)
->
ROpvmain
;
if
(
p
)
{
Closure
*
cl
=
luaF_newLclosure
(
L
,
0
,
hvalue
(
gt
(
L
)));
cl
->
l
.
p
=
p
;
setclvalue
(
L
,
L
->
top
,
cl
);
}
else
{
setnilvalue
(
L
->
top
);
}
api_incr_top
(
L
);
lua_unlock
(
L
);
return
p
?
LUA_TFUNCTION
:
LUA_TNIL
;
}
#endif
components/lua/lua-5.1/lnodemcu.h
0 → 100644
View file @
dba57fa0
/*
* NodeMCU extensions to Lua 5.1 for readonly Flash memory support
*/
#ifndef lnodemcu_h
#define lnodemcu_h
#include "lua.h"
#include "lobject.h"
#include "llimits.h"
#include "ltm.h"
#ifdef LUA_USE_HOST
#define LRO_STRKEY(k) k
#define LOCK_IN_SECTION(s)
#else
#define LRO_STRKEY(k) ((__attribute__((aligned(4))) const char *) k)
#define LOCK_IN_SECTION(s) __attribute__((used,unused,section(".lua_" #s)))
#endif
/* Macros used to declare rotable entries */
#define LRO_FUNCVAL(v) {{.p = v}, LUA_TLIGHTFUNCTION}
#define LRO_LUDATA(v) {{.p = cast(void*,v)}, LUA_TLIGHTUSERDATA}
#define LRO_NILVAL {{.p = NULL}, LUA_TNIL}
#define LRO_NUMVAL(v) {{.n = v}, LUA_TNUMBER}
#define LRO_INTVAL(v) LRO_NUMVAL(v)
#define LRO_FLOATVAL(v) LRO_NUMVAL(v)
#define LRO_ROVAL(v) {{.gc = cast(GCObject *, &(v ## _ROTable))}, LUA_TROTABLE}
#define LROT_MARKED 0 //<<<<<<<<<< *** TBD *** >>>>>>>>>>>
#define LROT_FUNCENTRY(n,f) {LRO_STRKEY(#n), LRO_FUNCVAL(f)},
#define LROT_LUDENTRY(n,x) {LRO_STRKEY(#n), LRO_LUDATA(x)},
#define LROT_NUMENTRY(n,x) {LRO_STRKEY(#n), LRO_NUMVAL(x)},
#define LROT_INTENTRY(n,x) LROT_NUMENTRY(n,x)
#define LROT_FLOATENTRY(n,x) LROT_NUMENTRY(n,x)
#define LROT_TABENTRY(n,t) {LRO_STRKEY(#n), LRO_ROVAL(t)},
#define LROT_TABLE(rt) const ROTable rt ## _ROTable
#define LROT_ENTRYREF(rt) (rt ##_entries)
#define LROT_TABLEREF(rt) (&rt ##_ROTable)
#define LROT_BEGIN(rt,mt,f) LROT_TABLE(rt); \
static ROTable_entry rt ## _entries[] = {
#define LROT_ENTRIES_IN_SECTION(rt,s) \
static ROTable_entry LOCK_IN_SECTION(s) rt ## _entries[] = {
#define LROT_END(rt,mt,f) {NULL, LRO_NILVAL} }; \
const ROTable rt ## _ROTable = { \
(GCObject *)1, LUA_TROTABLE, LROT_MARKED, \
cast(lu_byte, ~(f)), (sizeof(rt ## _entries)/sizeof(ROTable_entry)) - 1, \
cast(Table *, mt), cast(ROTable_entry *, rt ## _entries) };
#define LROT_BREAK(rt) };
#define LROT_MASK(m) cast(lu_byte, 1<<TM_ ## m)
/*
* These are statically coded can be any combination of the fast index tags
* listed in ltm.h: EQ, GC, INDEX, LEN, MODE, NEWINDEX or combined by anding
* GC+INDEX is the only common combination used, hence the combinaton macro
*/
#define LROT_MASK_EQ LROT_MASK(EQ)
#define LROT_MASK_GC LROT_MASK(GC)
#define LROT_MASK_INDEX LROT_MASK(INDEX)
#define LROT_MASK_LEN LROT_MASK(LEN)
#define LROT_MASK_MODE LROT_MASK(MODE)
#define LROT_MASK_NEWINDEX LROT_MASK(NEWINDEX)
#define LROT_MASK_GC_INDEX (LROT_MASK_GC | LROT_MASK_INDEX)
#define LUA_MAX_ROTABLE_NAME 32
/* Maximum length of a rotable name and of a string key*/
#ifdef LUA_CORE
#endif
#endif
components/lua/loadlib.c
→
components/lua/
lua-5.1/
loadlib.c
View file @
dba57fa0
...
...
@@ -11,7 +11,6 @@
#define loadlib_c
#define LUA_LIB
#define LUAC_CROSS_FILE
#include "lua.h"
#include <stdlib.h>
...
...
@@ -24,7 +23,6 @@
#include "lauxlib.h"
#include "lualib.h"
#include "lrotable.h"
/* prefix for open functions in C libraries */
#define LUA_POF "luaopen_"
...
...
@@ -394,11 +392,7 @@ static int loader_Lua (lua_State *L) {
const
char
*
name
=
luaL_checkstring
(
L
,
1
);
filename
=
findfile
(
L
,
name
,
"path"
);
if
(
filename
==
NULL
)
return
1
;
/* library not found in this path */
#ifdef LUA_CROSS_COMPILER
if
(
luaL_loadfile
(
L
,
filename
)
!=
0
)
#else
if
(
luaL_loadfsfile
(
L
,
filename
)
!=
0
)
#endif
loaderror
(
L
,
filename
);
return
1
;
/* library loaded successfully */
}
...
...
@@ -479,7 +473,7 @@ static int ll_require (lua_State *L) {
}
/* Is this a readonly table? */
lua_getfield
(
L
,
LUA_GLOBALSINDEX
,
name
);
if
(
lua_is
ro
table
(
L
,
-
1
))
{
if
(
lua_istable
(
L
,
-
1
))
{
return
1
;
}
else
{
lua_pop
(
L
,
1
);
...
...
@@ -572,7 +566,7 @@ static int ll_module (lua_State *L) {
const
char
*
modname
=
luaL_checkstring
(
L
,
1
);
/* Is this a readonly table? */
lua_getfield
(
L
,
LUA_GLOBALSINDEX
,
modname
);
if
(
lua_is
ro
table
(
L
,
-
1
))
{
if
(
lua_istable
(
L
,
-
1
))
{
return
0
;
}
else
{
lua_pop
(
L
,
1
);
...
...
@@ -658,9 +652,9 @@ static const luaL_Reg ll_funcs[] = {
static
const
lua_CFunction
loaders
[]
=
{
loader_preload
,
loader_Lua
,
loader_C
,
loader_Croot
,
NULL
};
LROT_
PUBLIC_
BEGIN
(
lmt
)
LROT_FUNCENTRY
(
__gc
,
gctm
)
LROT_END
(
lmt
,
lmt
,
LROT_MASK_GC
)
LROT_BEGIN
(
lmt
,
NULL
,
LROT_MASK_GC
)
LROT_FUNCENTRY
(
__gc
,
gctm
)
LROT_END
(
lmt
,
NULL
,
LROT_MASK_GC
)
LUALIB_API
int
luaopen_package
(
lua_State
*
L
)
{
int
i
;
...
...
components/lua/lobject.c
→
components/lua/
lua-5.1/
lobject.c
View file @
dba57fa0
/*
** $Id: lobject.c,v 2.22.1.1 2007/12/27 13:02:25 roberto Exp $
** Some generic functions over Lua objects
...
...
@@ -7,7 +8,6 @@
#define lobject_c
#define LUA_CORE
#define LUAC_CROSS_FILE
#include "lua.h"
#include <stdio.h>
...
...
@@ -25,7 +25,6 @@
#else
#include <limits.h>
#endif
const
TValue
luaO_nilobject_
=
{
LUA_TVALUE_NIL
};
...
...
@@ -54,7 +53,23 @@ int luaO_fb2int (int x) {
int
luaO_log2
(
unsigned
int
x
)
{
#ifdef LUA_CROSS_COMPILER
static
const
lu_byte
log_2
[
256
]
=
{
0
,
1
,
2
,
2
,
3
,
3
,
3
,
3
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
};
int
l
=
-
1
;
while
(
x
>=
256
)
{
l
+=
8
;
x
>>=
8
;
}
return
l
+
log_2
[
x
];
#else
return
31
-
__builtin_clz
(
x
);
#endif
}
...
...
@@ -70,7 +85,7 @@ int luaO_rawequalObj (const TValue *t1, const TValue *t2) {
case
LUA_TLIGHTUSERDATA
:
return
pvalue
(
t1
)
==
pvalue
(
t2
);
case
LUA_TROTABLE
:
return
r
value
(
t1
)
==
r
value
(
t2
);
return
h
value
(
t1
)
==
h
value
(
t2
);
case
LUA_TLIGHTFUNCTION
:
return
fvalue
(
t1
)
==
fvalue
(
t2
);
default:
...
...
@@ -88,7 +103,7 @@ int luaO_str2d (const char *s, lua_Number *result) {
#if defined(LUA_CROSS_COMPILER)
{
long
lres
=
strtoul
(
s
,
&
endptr
,
16
);
#if
LONG
_MAX != 2147483647L
#if
INT
_MAX != 2147483647L
if
(
lres
&
~
0xffffffffL
)
*
result
=
cast_num
(
-
1
);
else
if
(
lres
&
0x80000000L
)
...
...
components/lua/lobject.h
→
components/lua/
lua-5.1/
lobject.h
View file @
dba57fa0
...
...
@@ -17,7 +17,7 @@
/* tags for values visible from Lua */
#define LAST_TAG LUA_TTHREAD
#define NUM
_
TAGS (LAST_TAG+1)
#define
LUA_
NUMTAGS (LAST_TAG+1)
#define READONLYMASK (1<<7)
/* denormalised bitmask for READONLYBIT and */
#define LFSMASK (1<<6)
/* LFSBIT to avoid include proliferation */
...
...
@@ -28,15 +28,18 @@
#define LUA_TUPVAL (LAST_TAG+2)
#define LUA_TDEADKEY (LAST_TAG+3)
#ifdef
__XTENSA__
#ifdef
LUA_USE_ESP8266
/*
** force aligned access to critical fields in Flash-based structures
** wo is the offset of aligned word in bytes 0,4,8,..
** bo is the field within the word in bits 0..31
**
** Note that this returns a lu_int32 as returning a byte can cause the
** gcc code generator to emit an extra extui instruction.
*/
#define GET_BYTE_FN(name,t,wo,bo) \
static inline lu_
byte
get ## name(void *o) { \
lu_
byte
res;
/* extract named field */
\
static inline lu_
int32
get ## name(void *o) { \
lu_
int32
res;
/* extract named field */
\
asm ("l32i %0, %1, " #wo "; extui %0, %0, " #bo ", 8;" : "=r"(res) : "r"(o) : );\
return res; }
#else
...
...
@@ -49,14 +52,12 @@ static inline lu_byte get ## name(void *o) { return ((t *)o)->name; }
*/
typedef
union
GCObject
GCObject
;
/*
** Common Header for all collectable objects (in macro form, to be
** included in other objects)
*/
#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked
/*
** Common header in struct form
*/
...
...
@@ -93,43 +94,47 @@ typedef union {
#define TValuefields Value value; int tt
#define LUA_TVALUE_NIL {NULL}, LUA_TNIL
#if
def
ined(LUA_PACK_TVALUES) && !defined(LUA_CROSS_COMPILER)
#pragma pack(4)
#ifdef
LUA_USE_ESP
#
pragma pack(4)
#endif
typedef
struct
lua_TValue
{
TValuefields
;
}
TValue
;
#if defined(LUA_PACK_TVALUES) && !defined(LUA_CROSS_COMPILER)
#pragma pack()
#ifdef LUA_USE_ESP
# pragma pack()
#endif
/* Macros to test type */
#define ttisnil(o) (ttype(o) == LUA_TNIL)
#define ttisnumber(o) (ttype(o) == LUA_TNUMBER)
#define ttisstring(o) (ttype(o) == LUA_TSTRING)
#define ttistable(o) (ttype(o) == LUA_TTABLE)
#define ttisfunction(o) (ttype(o) == LUA_TFUNCTION)
#define ttistable(o) (ttnov(o) == LUA_TTABLE)
#define ttisrwtable(o) (type(o) == LUA_TTABLE)
#define ttisrotable(o) (ttype(o) & LUA_TISROTABLE)
#define ttisboolean(o) (ttype(o) == LUA_TBOOLEAN)
#define ttisuserdata(o) (ttype(o) == LUA_TUSERDATA)
#define ttisthread(o) (ttype(o) == LUA_TTHREAD)
#define ttislightuserdata(o) (ttype(o) == LUA_TLIGHTUSERDATA)
#define ttisrotable(o) (ttype(o) == LUA_TROTABLE)
#define ttislightfunction(o) (ttype(o) == LUA_TLIGHTFUNCTION)
#define ttisclfunction(o) (ttype(o) == LUA_TFUNCTION)
#define ttisfunction(o) (ttnov(o) == LUA_TFUNCTION)
/* Macros to access values */
#define ttype(o) ((void) (o)->value, (o)->tt)
#define ttnov(o) ((void) (o)->value, ((o)->tt & LUA_TMASK))
#define gcvalue(o) check_exp(iscollectable(o), (o)->value.gc)
#define pvalue(o) check_exp(ttislightuserdata(o), (o)->value.p)
#define rvalue(o) check_exp(ttisrotable(o), (o)->value.p)
#define fvalue(o) check_exp(ttislightfunction(o), (o)->value.p)
#define nvalue(o) check_exp(ttisnumber(o), (o)->value.n)
#define rawtsvalue(o) check_exp(ttisstring(o), &(o)->value.gc->ts)
#define tsvalue(o) (&rawtsvalue(o)->tsv)
#define rawuvalue(o) check_exp(ttisuserdata(o), &(o)->value.gc->u)
#define uvalue(o) (&rawuvalue(o)->uv)
#define clvalue(o) check_exp(ttisfunction(o), &(o)->value.gc->cl)
#define clvalue(o) check_exp(ttis
cl
function(o), &(o)->value.gc->cl)
#define hvalue(o) check_exp(ttistable(o), &(o)->value.gc->h)
#define bvalue(o) check_exp(ttisboolean(o), (o)->value.b)
#define thvalue(o) check_exp(ttisthread(o), &(o)->value.gc->th)
...
...
@@ -156,9 +161,6 @@ typedef struct lua_TValue {
#define setpvalue(obj,x) \
{ void *i_x = (x); TValue *i_o=(obj); i_o->value.p=i_x; i_o->tt=LUA_TLIGHTUSERDATA; }
#define setrvalue(obj,x) \
{ void *i_x = (x); TValue *i_o=(obj); i_o->value.p=i_x; i_o->tt=LUA_TROTABLE; }
#define setfvalue(obj,x) \
{ void *i_x = (x); TValue *i_o=(obj); i_o->value.p=i_x; i_o->tt=LUA_TLIGHTFUNCTION; }
...
...
@@ -192,7 +194,7 @@ typedef struct lua_TValue {
#define sethvalue(L,obj,x) \
{ GCObject *i_x = cast(GCObject *, (x)); \
TValue *i_o=(obj); \
i_o->value.gc=i_x; i_o->tt=
LUA_TTABLE
; \
i_o->value.gc=i_x; i_o->tt=
gettt(x)
; \
checkliveness(G(L),i_o); }
#define setptvalue(L,obj,x) \
...
...
@@ -227,7 +229,7 @@ typedef struct lua_TValue {
#define setttype(obj, stt) ((void) (obj)->value, (obj)->tt = (stt))
#define iscollectable(o) (ttype(o) >= LUA_TSTRING)
#define iscollectable(o) (ttype(o) >= LUA_TSTRING
&& ttype(o) <= LUA_TMASK
)
typedef
TValue
*
StkId
;
/* index to stack elements */
...
...
@@ -245,19 +247,10 @@ typedef union TString {
}
tsv
;
}
TString
;
#ifdef LUA_CROSS_COMPILER
#define isreadonly(o) (0)
#else
#define isreadonly(o) ((o).marked & READONLYMASK)
#endif
#define ts_isreadonly(ts) isreadonly((ts)->tsv)
#define getstr(ts) (ts_isreadonly(ts) ? \
cast(const char *, *(const char**)((ts) + 1)) : \
cast(const char *, (ts) + 1))
#define getstr(ts) cast(const char *, (ts) + 1)
#define svalue(o) getstr(rawtsvalue(o))
typedef
union
Udata
{
L_Umaxalign
dummy
;
/* ensures maximum alignment for `local' udata */
struct
{
...
...
@@ -268,7 +261,12 @@ typedef union Udata {
}
uv
;
}
Udata
;
#ifdef LUA_CROSS_COMPILER
#define isreadonly(o) (0)
#else
#define isreadonly(o) (getmarked(o) & READONLYMASK)
#endif
#define islfs(o) (getmarked(o) & LFSMASK)
/*
...
...
@@ -279,20 +277,13 @@ typedef struct Proto {
TValue
*
k
;
/* constants used by the function */
Instruction
*
code
;
struct
Proto
**
p
;
/* functions defined inside the function */
#ifdef LUA_OPTIMIZE_DEBUG
unsigned
char
*
packedlineinfo
;
#else
int
*
lineinfo
;
/* map from opcodes to source lines */
#endif
struct
LocVar
*
locvars
;
/* information about local variables */
TString
**
upvalues
;
/* upvalue names */
TString
*
source
;
int
sizeupvalues
;
int
sizek
;
/* size of `k' */
int
sizecode
;
#ifndef LUA_OPTIMIZE_DEBUG
int
sizelineinfo
;
#endif
int
sizep
;
/* size of `p' */
int
sizelocvars
;
int
linedefined
;
...
...
@@ -303,7 +294,6 @@ typedef struct Proto {
lu_byte
is_vararg
;
lu_byte
maxstacksize
;
}
Proto
;
#define proto_isreadonly(p) isreadonly(*(p))
/* masks for new-style vararg */
...
...
@@ -373,6 +363,18 @@ typedef union Closure {
** Tables
*/
/*
** Common Table fields for both table versions (like CommonHeader in
** macro form, to be included in table structure definitions).
**
** Note that the sethvalue() macro works much like the setsvalue()
** macro and handles the abstracted type. the hvalue(o) macro can be
** used to access CommonTable fields and rw Table fields
*/
#define CommonTable CommonHeader; \
lu_byte flags; lu_byte lsizenode; struct Table *metatable
typedef
union
TKey
{
struct
{
TValuefields
;
...
...
@@ -390,10 +392,7 @@ typedef struct Node {
typedef
struct
Table
{
CommonHeader
;
lu_byte
flags
;
/* 1<<p means tagmethod(p) is not present */
lu_byte
lsizenode
;
/* log2 of size of `node' array */
struct
Table
*
metatable
;
CommonTable
;
TValue
*
array
;
/* array part */
Node
*
node
;
Node
*
lastfree
;
/* any free position is before this position */
...
...
@@ -401,7 +400,23 @@ typedef struct Table {
int
sizearray
;
/* size of `array' array */
}
Table
;
typedef
const
struct
luaR_entry
ROTable
;
GET_BYTE_FN
(
flags
,
Table
,
4
,
16
)
GET_BYTE_FN
(
lsizenode
,
Table
,
4
,
24
)
typedef
const
struct
ROTable_entry
{
const
char
*
key
;
const
TValue
value
;
}
ROTable_entry
;
typedef
struct
ROTable
{
/* next always has the value (GCObject *)((size_t) 1); */
/* flags & 1<<p means tagmethod(p) is not present */
/* lsizenode is unused */
/* Like TStrings, the ROTable_entry vector follows the ROTable */
CommonTable
;
ROTable_entry
*
entry
;
}
ROTable
;
/*
** `module' operation for hashing (size is always a power of 2)
...
...
components/lua/lopcodes.c
→
components/lua/
lua-5.1/
lopcodes.c
View file @
dba57fa0
...
...
@@ -6,9 +6,7 @@
#define lopcodes_c
#define LUA_CORE
#define LUAC_CROSS_FILE
#include "luac_cross.h"
#include "lopcodes.h"
/* ORDER OP */
...
...
components/lua/lopcodes.h
→
components/lua/
lua-5.1/
lopcodes.h
View file @
dba57fa0
components/lua/lparser.c
→
components/lua/
lua-5.1/
lparser.c
View file @
dba57fa0
...
...
@@ -7,7 +7,6 @@
#define lparser_c
#define LUA_CORE
#define LUAC_CROSS_FILE
#include "lua.h"
#include <string.h>
...
...
@@ -344,12 +343,10 @@ static void open_func (LexState *ls, FuncState *fs) {
fs
->
bl
=
NULL
;
f
->
source
=
ls
->
source
;
f
->
maxstacksize
=
2
;
/* registers 0/1 are always valid */
#ifdef LUA_OPTIMIZE_DEBUG
fs
->
packedlineinfoSize
=
0
;
fs
->
lastline
=
0
;
fs
->
lastlineOffset
=
0
;
fs
->
lineinfoLastPC
=
-
1
;
#endif
fs
->
h
=
luaH_new
(
L
,
0
,
0
);
/* anchor table of constants and prototype (to avoid being collected) */
sethvalue2s
(
L
,
L
->
top
,
fs
->
h
);
...
...
@@ -367,15 +364,9 @@ static void close_func (LexState *ls) {
luaK_ret
(
fs
,
0
,
0
);
/* final return */
luaM_reallocvector
(
L
,
f
->
code
,
f
->
sizecode
,
fs
->
pc
,
Instruction
);
f
->
sizecode
=
fs
->
pc
;
#ifdef LUA_OPTIMIZE_DEBUG
f
->
packedlineinfo
[
fs
->
lastlineOffset
+
1
]
=
0
;
luaM_reallocvector
(
L
,
f
->
packedlineinfo
,
fs
->
packedlineinfoSize
,
fs
->
lastlineOffset
+
2
,
unsigned
char
);
#else
luaM_reallocvector
(
L
,
f
->
lineinfo
,
f
->
sizelineinfo
,
fs
->
pc
,
int
);
f
->
sizelineinfo
=
fs
->
pc
;
#endif
luaM_reallocvector
(
L
,
f
->
k
,
f
->
sizek
,
fs
->
nk
,
TValue
);
f
->
sizek
=
fs
->
nk
;
luaM_reallocvector
(
L
,
f
->
p
,
f
->
sizep
,
fs
->
np
,
Proto
*
);
...
...
@@ -392,20 +383,11 @@ static void close_func (LexState *ls) {
L
->
top
-=
2
;
/* remove table and prototype from the stack */
}
#ifdef LUA_OPTIMIZE_DEBUG
static
void
compile_stripdebug
(
lua_State
*
L
,
Proto
*
f
)
{
int
level
;
lua_pushlightuserdata
(
L
,
&
luaG_stripdebug
);
lua_gettable
(
L
,
LUA_REGISTRYINDEX
);
level
=
lua_isnil
(
L
,
-
1
)
?
LUA_OPTIMIZE_DEBUG
:
lua_tointeger
(
L
,
-
1
);
lua_pop
(
L
,
1
);
if
(
level
>
1
)
{
int
len
=
luaG_stripdebug
(
L
,
f
,
level
,
1
);
UNUSED
(
len
);
}
int
level
=
G
(
L
)
->
stripdefault
;
if
(
level
>
0
)
luaG_stripdebug
(
L
,
f
,
level
,
1
);
}
#endif
Proto
*
luaY_parser
(
lua_State
*
L
,
ZIO
*
z
,
Mbuffer
*
buff
,
const
char
*
name
)
{
...
...
@@ -422,9 +404,7 @@ Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) {
chunk
(
&
lexstate
);
check
(
&
lexstate
,
TK_EOS
);
close_func
(
&
lexstate
);
#ifdef LUA_OPTIMIZE_DEBUG
compile_stripdebug
(
L
,
funcstate
.
f
);
#endif
L
->
top
--
;
/* remove 'name' from stack */
lua_assert
(
funcstate
.
prev
==
NULL
);
lua_assert
(
funcstate
.
f
->
nups
==
0
);
...
...
components/lua/lparser.h
→
components/lua/
lua-5.1/
lparser.h
View file @
dba57fa0
...
...
@@ -72,12 +72,10 @@ typedef struct FuncState {
lu_byte
nactvar
;
/* number of active local variables */
upvaldesc
upvalues
[
LUAI_MAXUPVALUES
];
/* upvalues */
unsigned
short
actvar
[
LUAI_MAXVARS
];
/* declared-variable stack */
#ifdef LUA_OPTIMIZE_DEBUG
int
packedlineinfoSize
;
/* only used during compilation for line info */
int
lastline
;
/* ditto */
int
lastlineOffset
;
/* ditto */
int
lineinfoLastPC
;
/* ditto */
#endif
}
FuncState
;
...
...
components/lua/lstate.c
→
components/lua/
lua-5.1/
lstate.c
View file @
dba57fa0
...
...
@@ -7,7 +7,6 @@
#define lstate_c
#define LUA_CORE
#define LUAC_CROSS_FILE
#include "lua.h"
...
...
@@ -185,6 +184,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
g
->
memlimit
=
0
;
g
->
gcpause
=
LUAI_GCPAUSE
;
g
->
gcstepmul
=
LUAI_GCMUL
;
g
->
stripdefault
=
CONFIG_LUA_OPTIMIZE_DEBUG
;
g
->
gcdept
=
0
;
#ifdef EGC_INITIAL_MODE
g
->
egcmode
=
EGC_INITIAL_MODE
;
...
...
@@ -202,8 +202,9 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
g
->
ROstrt
.
hash
=
NULL
;
g
->
ROpvmain
=
NULL
;
g
->
LFSsize
=
0
;
g
->
error_reporter
=
0
;
#endif
for
(
i
=
0
;
i
<
NUM
_
TAGS
;
i
++
)
g
->
mt
[
i
]
=
NULL
;
for
(
i
=
0
;
i
<
LUA_
NUMTAGS
;
i
++
)
g
->
mt
[
i
]
=
NULL
;
if
(
luaD_rawrunprotected
(
L
,
f_luaopen
,
NULL
)
!=
0
)
{
/* memory allocation error: free partial state */
close_state
(
L
);
...
...
@@ -229,9 +230,6 @@ lua_State *lua_open(void) {
return
lua_crtstate
;
}
lua_State
*
lua_getstate
(
void
)
{
return
lua_crtstate
;
}
LUA_API
void
lua_close
(
lua_State
*
L
)
{
#ifndef LUA_CROSS_COMPILER
lua_sethook
(
L
,
NULL
,
0
,
0
);
...
...
components/lua/lstate.h
→
components/lua/
lua-5.1/
lstate.h
View file @
dba57fa0
...
...
@@ -56,7 +56,7 @@ typedef struct CallInfo {
#define curr_func(L) (ttisfunction(L->ci->func) ? clvalue(L->ci->func) : NULL)
#define curr_func(L) (ttis
cl
function(L->ci->func) ? clvalue(L->ci->func) : NULL)
#define ci_func(ci) (ttisfunction((ci)->func) ? clvalue((ci)->func) : NULL)
#define f_isLua(ci) (!ttislightfunction((ci)->func) && !ci_func(ci)->c.isC)
#define isLua(ci) (ttisfunction((ci)->func) && f_isLua(ci))
...
...
@@ -87,17 +87,19 @@ typedef struct global_State {
lu_mem
gcdept
;
/* how much GC is `behind schedule' */
int
gcpause
;
/* size of pause between successive GCs */
int
gcstepmul
;
/* GC `granularity' */
int
stripdefault
;
/* default stripping level for compilation */
int
egcmode
;
/* emergency garbage collection operation mode */
lua_CFunction
panic
;
/* to be called in unprotected errors */
TValue
l_registry
;
struct
lua_State
*
mainthread
;
UpVal
uvhead
;
/* head of double-linked list of all open upvalues */
struct
Table
*
mt
[
NUM
_
TAGS
];
/* metatables for basic types */
struct
Table
*
mt
[
LUA_
NUMTAGS
];
/* metatables for basic types */
TString
*
tmname
[
TM_N
];
/* array with tag-method names */
#ifndef LUA_CROSS_COMPILER
stringtable
ROstrt
;
/* Flash-based hash table for RO strings */
Proto
*
ROpvmain
;
/* Flash-based Proto main */
int
LFSsize
;
/* Size of Lua Flash Store */
int
error_reporter
;
/* Registry Index of error reporter task */
#endif
}
global_State
;
...
...
@@ -159,7 +161,7 @@ union GCObject {
#define rawgco2u(o) check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u))
#define gco2u(o) (&rawgco2u(o)->uv)
#define gco2cl(o) check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl))
#define gco2h(o) check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h))
#define gco2h(o) check_exp((
(
o)->gch.tt
& LUA_TMASK)
== LUA_TTABLE, &((o)->h))
#define gco2p(o) check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p))
#define gco2uv(o) check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv))
#define ngcotouv(o) \
...
...
components/lua/lstring.c
→
components/lua/
lua-5.1/
lstring.c
View file @
dba57fa0
...
...
@@ -8,7 +8,6 @@
#define lstring_c
#define LUA_CORE
#define LUAC_CROSS_FILE
#include "lua.h"
#include <string.h>
...
...
@@ -18,8 +17,6 @@
#include "lstate.h"
#include "lstring.h"
#define LUAS_READONLY_STRING 1
#define LUAS_REGULAR_STRING 0
void
luaS_resize
(
lua_State
*
L
,
int
newsize
)
{
stringtable
*
tb
;
...
...
@@ -53,26 +50,20 @@ void luaS_resize (lua_State *L, int newsize) {
}
static
TString
*
newlstr
(
lua_State
*
L
,
const
char
*
str
,
size_t
l
,
unsigned
int
h
,
int
readonly
)
{
unsigned
int
h
)
{
TString
*
ts
;
stringtable
*
tb
;
stringtable
*
tb
=
&
G
(
L
)
->
strt
;
if
(
l
+
1
>
(
MAX_SIZET
-
sizeof
(
TString
))
/
sizeof
(
char
))
luaM_toobig
(
L
);
tb
=
&
G
(
L
)
->
strt
;
if
((
tb
->
nuse
+
1
)
>
cast
(
lu_int32
,
tb
->
size
)
&&
tb
->
size
<=
MAX_INT
/
2
)
luaS_resize
(
L
,
tb
->
size
*
2
);
/* too crowded */
ts
=
cast
(
TString
*
,
luaM_malloc
(
L
,
sizeof
(
TString
)
+
(
readonly
?
sizeof
(
char
**
)
:
(
l
+
1
)
*
sizeof
(
char
)))
)
;
ts
=
cast
(
TString
*
,
luaM_malloc
(
L
,
sizeof
(
TString
)
+
(
l
+
1
)
*
sizeof
(
char
)));
ts
->
tsv
.
len
=
l
;
ts
->
tsv
.
hash
=
h
;
ts
->
tsv
.
marked
=
luaC_white
(
G
(
L
));
ts
->
tsv
.
tt
=
LUA_TSTRING
;
if
(
!
readonly
)
{
memcpy
(
ts
+
1
,
str
,
l
*
sizeof
(
char
));
((
char
*
)(
ts
+
1
))[
l
]
=
'\0'
;
/* ending 0 */
}
else
{
*
(
char
**
)(
ts
+
1
)
=
(
char
*
)
str
;
l_setbit
((
ts
)
->
tsv
.
marked
,
READONLYBIT
);
}
h
=
lmod
(
h
,
tb
->
size
);
ts
->
tsv
.
next
=
tb
->
hash
[
h
];
/* chain new entry */
tb
->
hash
[
h
]
=
obj2gco
(
ts
);
...
...
@@ -80,15 +71,6 @@ static TString *newlstr (lua_State *L, const char *str, size_t l,
return
ts
;
}
static
int
lua_is_ptr_in_ro_area
(
const
char
*
p
)
{
#ifdef LUA_CROSS_COMPILER
(
void
)
p
;
return
0
;
// TStrings are never in RO in luac.cross
#else
return
IN_RODATA_AREA
(
p
);
#endif
}
/*
* The string algorithm has been modified to be LFS-friendly. The previous eLua
* algo used the address of the string was in flash and the string was >4 bytes
...
...
@@ -129,11 +111,7 @@ LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
}
}
#endif
/* New additions to the RAM strt are tagged as readonly if the string address
* is in the CTEXT segment (target only, not luac.cross) */
int
readonly
=
(
lua_is_ptr_in_ro_area
(
str
)
&&
l
+
1
>
sizeof
(
char
**
)
&&
l
==
strlen
(
str
)
?
LUAS_READONLY_STRING
:
LUAS_REGULAR_STRING
);
return
newlstr
(
L
,
str
,
l
,
h
,
readonly
);
/* not found */
return
newlstr
(
L
,
str
,
l
,
h
);
/* not found */
}
...
...
components/lua/lstring.h
→
components/lua/
lua-5.1/
lstring.h
View file @
dba57fa0
...
...
@@ -13,8 +13,7 @@
#include "lstate.h"
#define sizestring(s) (sizeof(union TString)+(testbit(getmarked(s), READONLYBIT) ? sizeof(char **) : ((s)->len+1)*sizeof(char)))
#define sizestring(s) (sizeof(union TString)+((s)->len+1)*sizeof(char))
#define sizeudata(u) (sizeof(union Udata)+(u)->len)
#define luaS_new(L, s) (luaS_newlstr(L, s, strlen(s)))
...
...
components/lua/lstrlib.c
→
components/lua/
lua-5.1/
lstrlib.c
View file @
dba57fa0
...
...
@@ -7,7 +7,6 @@
#define lstrlib_c
#define LUA_LIB
#define LUAC_CROSS_FILE
#include "lua.h"
#include <stdio.h>
...
...
@@ -15,13 +14,11 @@
#include "lauxlib.h"
#include "lualib.h"
#include "lrotable.h"
/* macro to `unsign' a character */
#define uchar(c) ((unsigned char)(c))
static
int
str_len
(
lua_State
*
L
)
{
size_t
l
;
luaL_checklstring
(
L
,
1
,
&
l
);
...
...
@@ -143,17 +140,25 @@ static int writer (lua_State *L, const void* b, size_t size, void* B) {
static
int
str_dump
(
lua_State
*
L
)
{
luaL_Buffer
b
;
int
strip
,
tstrip
=
lua_type
(
L
,
2
);
if
(
tstrip
==
LUA_TBOOLEAN
)
{
strip
=
lua_toboolean
(
L
,
2
)
?
2
:
0
;
}
else
if
(
tstrip
==
LUA_TNONE
||
tstrip
==
LUA_TNIL
)
{
strip
=
-
1
;
/* This tells lua_dump to use the global strip default */
}
else
{
strip
=
lua_tointeger
(
L
,
2
);
luaL_argcheck
(
L
,
(
unsigned
)(
strip
)
<
3
,
2
,
"strip out of range"
);
}
luaL_checktype
(
L
,
1
,
LUA_TFUNCTION
);
lua_settop
(
L
,
1
);
luaL_buffinit
(
L
,
&
b
);
if
(
lua_dump
(
L
,
writer
,
&
b
)
!=
0
)
luaL_error
(
L
,
"unable to dump given function"
);
if
(
lua_dump
(
L
,
writer
,
&
b
,
strip
)
!=
0
)
return
luaL_error
(
L
,
"unable to dump given function"
);
luaL_pushresult
(
&
b
);
return
1
;
}
/*
** {======================================================
** PATTERN MATCHING
...
...
@@ -825,7 +830,21 @@ static int str_format (lua_State *L) {
return
1
;
}
LROT_PUBLIC_BEGIN
(
strlib
)
static
int
str_format2
(
lua_State
*
L
)
{
if
(
lua_type
(
L
,
2
)
==
LUA_TTABLE
)
{
int
i
,
n
=
lua_objlen
(
L
,
2
);
lua_settop
(
L
,
2
);
for
(
i
=
1
;
i
<=
n
;
i
++
)
lua_rawgeti
(
L
,
2
,
i
);
lua_remove
(
L
,
2
);
}
return
str_format
(
L
);
}
LROT_BEGIN
(
strlib
,
NULL
,
LROT_MASK_INDEX
)
LROT_TABENTRY
(
__index
,
strlib
)
LROT_FUNCENTRY
(
__mod
,
str_format2
)
LROT_FUNCENTRY
(
byte
,
str_byte
)
LROT_FUNCENTRY
(
char
,
str_char
)
LROT_FUNCENTRY
(
dump
,
str_dump
)
...
...
@@ -845,8 +864,7 @@ LROT_PUBLIC_BEGIN(strlib)
LROT_FUNCENTRY
(
reverse
,
str_reverse
)
LROT_FUNCENTRY
(
sub
,
str_sub
)
LROT_FUNCENTRY
(
upper
,
str_upper
)
LROT_TABENTRY
(
__index
,
strlib
)
LROT_END
(
strlib
,
NULL
,
0
)
// OR DO WE NEED LRTO_MASK_INDEX **TODO**
LROT_END
(
strlib
,
NULL
,
LROT_MASK_INDEX
)
/*
** Open string library
...
...
components/lua/ltable.c
→
components/lua/
lua-5.1/
ltable.c
View file @
dba57fa0
...
...
@@ -20,7 +20,6 @@
#define ltable_c
#define LUA_CORE
#define LUAC_CROSS_FILE
#include "lua.h"
#include <math.h>
...
...
@@ -33,7 +32,8 @@
#include "lobject.h"
#include "lstate.h"
#include "ltable.h"
#include "lrotable.h"
#include "lstring.h"
/*
** max size of array part is 2^MAXBITS
...
...
@@ -68,6 +68,10 @@
*/
#define numints cast_int(sizeof(lua_Number)/sizeof(int))
static
const
TValue
*
rotable_findentry
(
ROTable
*
rotable
,
TString
*
key
,
unsigned
*
ppos
);
static
void
rotable_next_helper
(
lua_State
*
L
,
ROTable
*
pentries
,
int
pos
,
TValue
*
key
,
TValue
*
val
);
static
void
rotable_next
(
lua_State
*
L
,
ROTable
*
rotable
,
TValue
*
key
,
TValue
*
val
);
#define dummynode (&dummynode_)
...
...
@@ -105,11 +109,11 @@ static Node *mainposition (const Table *t, const TValue *key) {
return
hashstr
(
t
,
rawtsvalue
(
key
));
case
LUA_TBOOLEAN
:
return
hashboolean
(
t
,
bvalue
(
key
));
case
LUA_TROTABLE
:
return
hashpointer
(
t
,
rvalue
(
key
));
case
LUA_TLIGHTUSERDATA
:
case
LUA_TLIGHTFUNCTION
:
return
hashpointer
(
t
,
pvalue
(
key
));
case
LUA_TROTABLE
:
return
hashpointer
(
t
,
hvalue
(
key
));
default:
return
hashpointer
(
t
,
gcvalue
(
key
));
}
...
...
@@ -163,7 +167,12 @@ static int findindex (lua_State *L, Table *t, StkId key) {
int
luaH_next
(
lua_State
*
L
,
Table
*
t
,
StkId
key
)
{
int
i
=
findindex
(
L
,
t
,
key
);
/* find original element */
int
i
;
if
(
isrotable
(
t
))
{
rotable_next
(
L
,
(
ROTable
*
)
t
,
key
,
key
+
1
);
return
ttisnil
(
key
)
?
0
:
1
;
}
i
=
findindex
(
L
,
t
,
key
);
/* find original element */
for
(
i
++
;
i
<
t
->
sizearray
;
i
++
)
{
/* try first array part */
if
(
!
ttisnil
(
&
t
->
array
[
i
]))
{
/* a non-nil value? */
setnvalue
(
key
,
cast_num
(
i
+
1
));
...
...
@@ -182,12 +191,6 @@ int luaH_next (lua_State *L, Table *t, StkId key) {
}
int
luaH_next_ro
(
lua_State
*
L
,
void
*
t
,
StkId
key
)
{
luaR_next
(
L
,
t
,
key
,
key
+
1
);
return
ttisnil
(
key
)
?
0
:
1
;
}
/*
** {=============================================================
** Rehash
...
...
@@ -372,7 +375,7 @@ static int move_node (lua_State *L, Table *t, Node *node) {
static
int
move_number
(
lua_State
*
L
,
Table
*
t
,
Node
*
node
)
{
(
void
)
L
;
(
void
)
t
;
(
void
)
L
;
int
key
;
lua_Number
n
=
nvalue
(
key2tval
(
node
));
lua_number2int
(
key
,
n
);
...
...
@@ -565,6 +568,8 @@ static TValue *newkey (lua_State *L, Table *t, const TValue *key) {
** search function for integers
*/
const
TValue
*
luaH_getnum
(
Table
*
t
,
int
key
)
{
if
(
isrotable
(
t
))
return
luaO_nilobject
;
/* (1 <= key && key <= t->sizearray) */
if
(
cast
(
unsigned
int
,
key
-
1
)
<
cast
(
unsigned
int
,
t
->
sizearray
))
return
&
t
->
array
[
key
-
1
];
...
...
@@ -580,18 +585,16 @@ const TValue *luaH_getnum (Table *t, int key) {
}
}
/* same thing for rotables */
const
TValue
*
luaH_getnum_ro
(
void
*
t
,
int
key
)
{
(
void
)
t
;
(
void
)
key
;
const
TValue
*
res
=
NULL
;
// integer values not supported: luaR_findentryN(t, key, NULL);
return
res
?
res
:
luaO_nilobject
;
}
/*
** search function for strings
*/
const
TValue
*
luaH_getstr
(
Table
*
t
,
TString
*
key
)
{
if
(
isrotable
(
t
))
{
if
(
key
->
tsv
.
len
>
LUA_MAX_ROTABLE_NAME
)
return
luaO_nilobject
;
return
rotable_findentry
((
ROTable
*
)
t
,
key
,
NULL
);
}
Node
*
n
=
hashstr
(
t
,
key
);
do
{
/* check whether `key' is somewhere in the chain */
if
(
ttisstring
(
gkey
(
n
))
&&
rawtsvalue
(
gkey
(
n
))
==
key
)
...
...
@@ -601,31 +604,26 @@ const TValue *luaH_getstr (Table *t, TString *key) {
return
luaO_nilobject
;
}
/* same thing for rotables */
const
TValue
*
luaH_getstr_ro
(
void
*
t
,
TString
*
key
)
{
if
(
!
t
||
key
->
tsv
.
len
>
LUA_MAX_ROTABLE_NAME
)
return
luaO_nilobject
;
return
luaR_findentry
(
t
,
key
,
NULL
);
}
/*
** main search function
*/
const
TValue
*
luaH_get
(
Table
*
t
,
const
TValue
*
key
)
{
switch
(
ttype
(
key
))
{
case
LUA_TNIL
:
return
luaO_nilobject
;
case
LUA_TSTRING
:
return
luaH_getstr
(
t
,
rawtsvalue
(
key
));
case
LUA_TNUMBER
:
{
int
type
=
ttype
(
key
);
if
(
type
==
LUA_TNIL
)
return
luaO_nilobject
;
if
(
type
==
LUA_TSTRING
)
return
luaH_getstr
(
t
,
rawtsvalue
(
key
));
if
(
isrotable
(
t
))
return
luaO_nilobject
;
if
(
type
==
LUA_TNUMBER
)
{
int
k
;
lua_Number
n
=
nvalue
(
key
);
lua_number2int
(
k
,
n
);
if
(
luai_numeq
(
cast_num
(
k
),
nvalue
(
key
)))
/* index is int? */
return
luaH_getnum
(
t
,
k
);
/* use specialized version */
/* else go through */
}
/* fall-through */
default:
{
/* default */
Node
*
n
=
mainposition
(
t
,
key
);
do
{
/* check whether `key' is somewhere in the chain */
if
(
luaO_rawequalObj
(
key2tval
(
n
),
key
))
...
...
@@ -633,33 +631,14 @@ const TValue *luaH_get (Table *t, const TValue *key) {
else
n
=
gnext
(
n
);
}
while
(
n
);
return
luaO_nilobject
;
}
}
}
/* same thing for rotables */
const
TValue
*
luaH_get_ro
(
void
*
t
,
const
TValue
*
key
)
{
switch
(
ttype
(
key
))
{
case
LUA_TNIL
:
return
luaO_nilobject
;
case
LUA_TSTRING
:
return
luaH_getstr_ro
(
t
,
rawtsvalue
(
key
));
case
LUA_TNUMBER
:
{
int
k
;
lua_Number
n
=
nvalue
(
key
);
lua_number2int
(
k
,
n
);
if
(
luai_numeq
(
cast_num
(
k
),
nvalue
(
key
)))
/* index is int? */
return
luaH_getnum_ro
(
t
,
k
);
/* use specialized version */
/* else go through */
}
/* fall-through */
default:
{
return
luaO_nilobject
;
}
}
}
TValue
*
luaH_set
(
lua_State
*
L
,
Table
*
t
,
const
TValue
*
key
)
{
const
TValue
*
p
=
luaH_get
(
t
,
key
);
const
TValue
*
p
;
if
(
isrotable
(
t
))
luaG_runerror
(
L
,
"table is readonly"
);
p
=
luaH_get
(
t
,
key
);
t
->
flags
=
0
;
if
(
p
!=
luaO_nilobject
)
return
cast
(
TValue
*
,
p
);
...
...
@@ -673,7 +652,10 @@ TValue *luaH_set (lua_State *L, Table *t, const TValue *key) {
TValue
*
luaH_setnum
(
lua_State
*
L
,
Table
*
t
,
int
key
)
{
const
TValue
*
p
=
luaH_getnum
(
t
,
key
);
const
TValue
*
p
;
if
(
isrotable
(
t
))
luaG_runerror
(
L
,
"table is readonly"
);
p
=
luaH_getnum
(
t
,
key
);
if
(
p
!=
luaO_nilobject
)
return
cast
(
TValue
*
,
p
);
else
{
...
...
@@ -685,7 +667,10 @@ TValue *luaH_setnum (lua_State *L, Table *t, int key) {
TValue
*
luaH_setstr
(
lua_State
*
L
,
Table
*
t
,
TString
*
key
)
{
const
TValue
*
p
=
luaH_getstr
(
t
,
key
);
const
TValue
*
p
;
if
(
isrotable
(
t
))
luaG_runerror
(
L
,
"table is readonly"
);
p
=
luaH_getstr
(
t
,
key
);
if
(
p
!=
luaO_nilobject
)
return
cast
(
TValue
*
,
p
);
else
{
...
...
@@ -725,7 +710,10 @@ static int unbound_search (Table *t, unsigned int j) {
** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil).
*/
int
luaH_getn
(
Table
*
t
)
{
unsigned
int
j
=
t
->
sizearray
;
unsigned
int
j
;
if
(
isrotable
(
t
))
return
0
;
j
=
t
->
sizearray
;
if
(
j
>
0
&&
ttisnil
(
&
t
->
array
[
j
-
1
]))
{
/* there is a boundary in the array part: (binary) search for it */
unsigned
int
i
=
0
;
...
...
@@ -742,14 +730,138 @@ int luaH_getn (Table *t) {
else
return
unbound_search
(
t
,
j
);
}
/* same thing for rotables */
int
luaH_getn_ro
(
void
*
t
)
{
(
void
)
t
;
return
0
;
// Integer Keys are not currently supported for ROTables
}
int
luaH_isdummy
(
Node
*
n
)
{
return
n
==
dummynode
;
}
/*
** All keyed ROTable access passes through rotable_findentry(). ROTables
** are simply a list of <key><TValue value> pairs.
**
** The global KeyCache is used to avoid a relatively expensive Flash memory
** vector scan. A simple hash on the key's TString addr and the ROTable
** addr selects the cache line. The line's slots are then scanned for a
** hit.
**
** Unlike the standard hast which uses a prime line count therefore requires
** the use of modulus operation which is expensive on an IoT processor
** without H/W divide. This hash is power of 2 based which might not be
** quite so uniform but can be calcuated without using H/W-based instructions.
**
** If a match is found and the table addresses match, then this entry is
** probed first. In practice the hit-rate here is over 99% so the code
** rarely fails back to doing the linear scan in ROM.
** Note that this hash does a couple of prime multiples and a modulus 2^X
** with is all evaluated in H/W, and adequately randomizes the lookup.
*/
#define LA_LINES 32
#define LA_SLOTS 4
static
size_t
cache
[
LA_LINES
][
LA_SLOTS
];
#define HASH(a,b) ((((29*(size_t)(a)) ^ (37*((b)->tsv.hash)))>>4) % LA_LINES)
#define NDX_SHFT 24
#define ADDR_MASK (((size_t) 1<<24)-1)
/*
* Find a string key entry in a rotable and return it. Note that this internally
* uses a null key to denote a metatable search.
*/
static
const
TValue
*
rotable_findentry
(
ROTable
*
t
,
TString
*
key
,
unsigned
*
ppos
)
{
const
ROTable_entry
*
e
=
cast
(
const
ROTable_entry
*
,
t
->
entry
);
const
int
tl
=
getlsizenode
(
t
);
const
char
*
strkey
=
getstr
(
key
);
size_t
*
cl
=
cache
[
HASH
(
t
,
key
)];
int
i
,
j
=
1
,
l
;
if
(
!
e
||
gettt
(
key
)
!=
LUA_TSTRING
)
return
luaO_nilobject
;
l
=
key
->
tsv
.
len
;
/* scan the ROTable lookaside cache and return if hit found */
for
(
i
=
0
;
i
<
LA_SLOTS
;
i
++
)
{
int
cl_ndx
=
cl
[
i
]
>>
NDX_SHFT
;
if
((((
size_t
)
t
-
cl
[
i
])
&
ADDR_MASK
)
==
0
&&
cl_ndx
<
tl
&&
strcmp
(
e
[
cl_ndx
].
key
,
strkey
)
==
0
)
{
if
(
ppos
)
*
ppos
=
cl_ndx
;
return
&
e
[
cl_ndx
].
value
;
}
}
/*
* A lot of search misses are metavalues, but tables typically only have at
* most a couple of them, so these are always put at the front of the table
* in ascending order and the metavalue scan short circuits using a straight
* strcmp()
*/
lu_int32
name4
=
*
(
lu_int32
*
)
strkey
;
if
(
*
(
char
*
)
&
name4
==
'_'
)
{
for
(
i
=
0
;
i
<
tl
;
i
++
)
{
j
=
strcmp
(
e
[
i
].
key
,
strkey
);
if
(
j
>=
0
)
break
;
}
}
else
{
/*
* Ordinary (non-meta) keys can be unsorted. This is for legacy compatiblity,
* plus misses are pretty rare in this case. The masked name4 comparison is
* safe 4-byte comparison that nearly always avoids the more costly strcmp()
* for an actual hit validation.
*/
lu_int32
mask4
=
l
>
2
?
(
~
0u
)
:
(
~
0u
)
>>
((
3
-
l
)
*
8
);
for
(
i
=
0
;
i
<
tl
;
i
++
)
{
if
(((
*
(
lu_int32
*
)
e
[
i
].
key
^
name4
)
&
mask4
)
!=
0
)
continue
;
j
=
strcmp
(
e
[
i
].
key
,
strkey
);
if
(
j
==
0
)
break
;
}
}
if
(
j
)
return
luaO_nilobject
;
if
(
ppos
)
*
ppos
=
i
;
/* In the case of a hit, update the lookaside cache */
for
(
j
=
LA_SLOTS
-
1
;
j
>
0
;
j
--
)
cl
[
j
]
=
cl
[
j
-
1
];
cl
[
0
]
=
((
size_t
)
t
&
ADDR_MASK
)
+
(
i
<<
NDX_SHFT
);
return
&
e
[
i
].
value
;
}
static
void
rotable_next_helper
(
lua_State
*
L
,
ROTable
*
t
,
int
pos
,
TValue
*
key
,
TValue
*
val
)
{
const
ROTable_entry
*
e
=
cast
(
const
ROTable_entry
*
,
t
->
entry
);
if
(
pos
<
getlsizenode
(
t
))
{
/* Found an entry */
setsvalue
(
L
,
key
,
luaS_new
(
L
,
e
[
pos
].
key
));
setobj2s
(
L
,
val
,
&
e
[
pos
].
value
);
}
else
{
setnilvalue
(
key
);
setnilvalue
(
val
);
}
}
/* next (used for iteration) */
static
void
rotable_next
(
lua_State
*
L
,
ROTable
*
t
,
TValue
*
key
,
TValue
*
val
)
{
unsigned
keypos
=
getlsizenode
(
t
);
/* Special case: if key is nil, return the first element of the rotable */
if
(
ttisnil
(
key
))
rotable_next_helper
(
L
,
t
,
0
,
key
,
val
);
else
if
(
ttisstring
(
key
))
{
/* Find the previous key again */
if
(
ttisstring
(
key
))
{
rotable_findentry
(
t
,
rawtsvalue
(
key
),
&
keypos
);
}
/* Advance to next key */
rotable_next_helper
(
L
,
t
,
++
keypos
,
key
,
val
);
}
}
#if defined(LUA_DEBUG)
Node
*
luaH_mainposition
(
const
Table
*
t
,
const
TValue
*
key
)
{
return
mainposition
(
t
,
key
);
...
...
components/lua/ltable.h
→
components/lua/
lua-5.1/
ltable.h
View file @
dba57fa0
...
...
@@ -16,26 +16,24 @@
#define gnext(n) ((n)->i_key.nk.next)
#define key2tval(n) (&(n)->i_key.tvk)
#define isrotable(t) (gettt(t)==LUA_TROTABLE)
#define isrwtable(t) (gettt(t)==LUA_TTABLE)
LUAI_FUNC
const
TValue
*
luaH_getnum
(
Table
*
t
,
int
key
);
LUAI_FUNC
const
TValue
*
luaH_getnum_ro
(
void
*
t
,
int
key
);
LUAI_FUNC
TValue
*
luaH_setnum
(
lua_State
*
L
,
Table
*
t
,
int
key
);
LUAI_FUNC
const
TValue
*
luaH_getstr
(
Table
*
t
,
TString
*
key
);
LUAI_FUNC
const
TValue
*
luaH_getstr_ro
(
void
*
t
,
TString
*
key
);
LUAI_FUNC
TValue
*
luaH_setstr
(
lua_State
*
L
,
Table
*
t
,
TString
*
key
);
LUAI_FUNC
const
TValue
*
luaH_get
(
Table
*
t
,
const
TValue
*
key
);
LUAI_FUNC
const
TValue
*
luaH_get_ro
(
void
*
t
,
const
TValue
*
key
);
LUAI_FUNC
TValue
*
luaH_set
(
lua_State
*
L
,
Table
*
t
,
const
TValue
*
key
);
LUAI_FUNC
Table
*
luaH_new
(
lua_State
*
L
,
int
narray
,
int
lnhash
);
LUAI_FUNC
void
luaH_resizearray
(
lua_State
*
L
,
Table
*
t
,
int
nasize
);
LUAI_FUNC
void
luaH_free
(
lua_State
*
L
,
Table
*
t
);
LUAI_FUNC
int
luaH_next
(
lua_State
*
L
,
Table
*
t
,
StkId
key
);
LUAI_FUNC
int
luaH_next_ro
(
lua_State
*
L
,
void
*
t
,
StkId
key
);
LUAI_FUNC
int
luaH_getn
(
Table
*
t
);
LUAI_FUNC
int
luaH_getn_ro
(
void
*
t
);
LUAI_FUNC
int
luaH_isdummy
(
Node
*
n
);
#define LUA_MAX_ROTABLE_NAME 32
#if defined(LUA_DEBUG)
LUAI_FUNC
Node
*
luaH_mainposition
(
const
Table
*
t
,
const
TValue
*
key
);
#endif
...
...
components/lua/ltablib.c
→
components/lua/
lua-5.1/
ltablib.c
View file @
dba57fa0
...
...
@@ -7,13 +7,11 @@
#define ltablib_c
#define LUA_LIB
#define LUAC_CROSS_FILE
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
#include "lrotable.h"
#define aux_getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))
...
...
@@ -22,7 +20,7 @@
static
int
foreachi
(
lua_State
*
L
)
{
int
i
;
int
n
=
aux_getn
(
L
,
1
);
luaL_check
any
function
(
L
,
2
);
luaL_checkfunction
(
L
,
2
);
for
(
i
=
1
;
i
<=
n
;
i
++
)
{
lua_pushvalue
(
L
,
2
);
/* function */
lua_pushinteger
(
L
,
i
);
/* 1st argument */
...
...
@@ -38,7 +36,7 @@ static int foreachi (lua_State *L) {
static
int
foreach
(
lua_State
*
L
)
{
luaL_checktype
(
L
,
1
,
LUA_TTABLE
);
luaL_check
any
function
(
L
,
2
);
luaL_checkfunction
(
L
,
2
);
lua_pushnil
(
L
);
/* first key */
while
(
lua_next
(
L
,
1
))
{
lua_pushvalue
(
L
,
2
);
/* function */
...
...
@@ -266,7 +264,7 @@ static int sort (lua_State *L) {
/* }====================================================== */
LROT_
PUBLIC_
BEGIN
(
tab_funcs
)
LROT_BEGIN
(
tab_funcs
,
NULL
,
0
)
LROT_FUNCENTRY
(
concat
,
tconcat
)
LROT_FUNCENTRY
(
foreach
,
foreach
)
LROT_FUNCENTRY
(
foreachi
,
foreachi
)
...
...
components/lua/ltm.c
→
components/lua/
lua-5.1/
ltm.c
View file @
dba57fa0
...
...
@@ -5,37 +5,35 @@
*/
#include <string.h>
#define ltm_c
#define LUA_CORE
#define LUAC_CROSS_FILE
#include "lua.h"
#include <string.h>
#include "lobject.h"
#include "lstate.h"
#include "lgc.h"
#include "lstring.h"
#include "ltable.h"
#include "ltm.h"
#include "lrotable.h"
/* These must be correspond to the LUA_T* defines in lua.h */
const
char
*
const
luaT_typenames
[]
=
{
"nil"
,
"boolean"
,
"romtable"
,
"lightfunction"
,
"userdata"
,
"number"
,
"string"
,
"table"
,
"function"
,
"userdata"
,
"thread"
,
"nil"
,
"boolean"
,
"lightfunction"
,
"number"
,
// base type = 0, 1, 2, 3
"string"
,
"table"
,
"function"
,
"userdata"
,
"thread"
,
// base type = 4, 5, 6, 7, 8
"proto"
,
"upval"
};
void
luaT_init
(
lua_State
*
L
)
{
static
const
char
*
const
luaT_eventname
[]
=
{
/* ORDER TM */
"__index"
,
"__newindex"
,
"__gc"
,
"__mode"
,
"__eq"
,
"__add"
,
"__sub"
,
"__mul"
,
"__div"
,
"__mod"
,
"__pow"
,
"__unm"
,
"__len"
,
"__lt"
,
"__le"
,
"__concat"
,
"__call"
"__concat"
,
"__call"
,
"__metatable"
};
int
i
;
for
(
i
=
0
;
i
<
TM_N
;
i
++
)
{
...
...
@@ -50,22 +48,14 @@ void luaT_init (lua_State *L) {
** tag methods
*/
const
TValue
*
luaT_gettm
(
Table
*
events
,
TMS
event
,
TString
*
ename
)
{
const
TValue
*
tm
;
const
TValue
*
tm
=
luaH_getstr
(
events
,
ename
)
;
lua_assert
(
event
<=
TM_EQ
);
if
(
luaR_isrotable
(
events
))
{
tm
=
luaH_getstr_ro
(
events
,
ename
);
if
(
ttisnil
(
tm
))
{
/* no tag method? */
if
(
isrwtable
(
events
))
/* if this a (RW) Table */
events
->
flags
|=
cast_byte
(
1u
<<
event
);
/* then cache this fact */
return
NULL
;
}
}
else
{
tm
=
luaH_getstr
(
events
,
ename
);
if
(
ttisnil
(
tm
))
{
/* no tag method? */
events
->
flags
|=
cast_byte
(
1u
<<
event
);
/* cache this fact */
return
NULL
;
}
}
return
tm
;
else
return
tm
;
}
...
...
@@ -73,21 +63,14 @@ const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {
Table
*
mt
;
switch
(
ttype
(
o
))
{
case
LUA_TTABLE
:
mt
=
hvalue
(
o
)
->
metatable
;
break
;
case
LUA_TROTABLE
:
mt
=
(
Table
*
)
luaR_getmeta
(
rvalue
(
o
))
;
mt
=
hvalue
(
o
)
->
metatable
;
break
;
case
LUA_TUSERDATA
:
mt
=
uvalue
(
o
)
->
metatable
;
break
;
default:
mt
=
G
(
L
)
->
mt
[
tt
ype
(
o
)];
mt
=
G
(
L
)
->
mt
[
tt
nov
(
o
)];
}
if
(
!
mt
)
return
luaO_nilobject
;
else
if
(
luaR_isrotable
(
mt
))
return
luaH_getstr_ro
(
mt
,
G
(
L
)
->
tmname
[
event
]);
else
return
luaH_getstr
(
mt
,
G
(
L
)
->
tmname
[
event
]);
return
(
mt
?
luaH_getstr
(
mt
,
G
(
L
)
->
tmname
[
event
])
:
luaO_nilobject
);
}
components/lua/ltm.h
→
components/lua/
lua-5.1/
ltm.h
View file @
dba57fa0
...
...
@@ -7,10 +7,6 @@
#ifndef ltm_h
#define ltm_h
#include "lobject.h"
#include "lrotable.h"
/*
* WARNING: if you change the order of this enumeration,
* grep "ORDER TM"
...
...
@@ -33,11 +29,14 @@ typedef enum {
TM_LE
,
TM_CONCAT
,
TM_CALL
,
TM_METATABLE
,
TM_N
/* number of elements in the enum */
}
TMS
;
//#include "lobject.h"
#define gfasttm(g,et,e) ((et) == NULL ? NULL : \
(
!luaR_isrotable(et) && ((et)->
flags & (1u<<(e)))
)
? NULL : luaT_gettm(et, e, (g)->tmname[e]))
(
get
flags
(et)
& (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e]))
#define fasttm(l,et,e) gfasttm(G(l), et, e)
...
...
components/lua/lua-5.1/lua.c
0 → 100644
View file @
dba57fa0
#include "llimits.h"
#include "lauxlib.h"
#include "lualib.h"
#define LUA_VERSION_51
#include "../lua-5.3/lua.c"
Prev
1
2
3
4
5
6
7
8
…
12
Next
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