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/
base_nodemcu/include
/lnodeaux.h
→
components/
lua/common
/lnodeaux.h
View file @
dba57fa0
...
@@ -36,6 +36,7 @@
...
@@ -36,6 +36,7 @@
#define _NODEMCU_LNODEAUX_H_
#define _NODEMCU_LNODEAUX_H_
#include "lua.h"
#include "lua.h"
#include <stdbool.h>
// lua_ref_t represents a reference to a lua object in the registry
// lua_ref_t represents a reference to a lua object in the registry
typedef
int
lua_ref_t
;
typedef
int
lua_ref_t
;
...
...
components/lua/common/lpanic.c
0 → 100644
View file @
dba57fa0
#include "lpanic.h"
#include "lauxlib.h"
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#ifndef LUA_CROSS_COMPILER
#include "esp_system.h"
/* defined in esp_system_internal.h */
void
esp_reset_reason_set_hint
(
esp_reset_reason_t
hint
);
#endif
#ifndef LUA_CROSS_COMPILER
/*
* upper 28 bit have magic value 0xD1EC0DE0
* if paniclevel is valid (i.e. matches magic value)
* lower 4 bits have paniclevel:
* 0 = no panic occurred
* 1..15 = one..fifteen subsequent panic(s) occurred
*/
static
__NOINIT_ATTR
uint32_t
l_rtc_panic_val
;
void
panic_clear_nvval
()
{
l_rtc_panic_val
=
0xD1EC0DE0
;
}
int
panic_get_nvval
()
{
if
((
l_rtc_panic_val
&
0xfffffff0
)
==
0xD1EC0DE0
)
{
return
(
l_rtc_panic_val
&
0xf
);
}
panic_clear_nvval
();
return
0
;
}
#endif
int
lpanic
(
lua_State
*
L
)
{
(
void
)
L
;
/* to avoid warnings */
#ifndef LUA_CROSS_COMPILER
uint8_t
paniclevel
=
panic_get_nvval
();
if
(
paniclevel
<
15
)
paniclevel
++
;
l_rtc_panic_val
=
0xD1EC0DE0
|
paniclevel
;
#endif
lua_writestringerror
(
"PANIC: unprotected error in call to Lua API (%s)
\n
"
,
lua_tostring
(
L
,
-
1
));
#ifndef LUA_CROSS_COMPILER
fflush
(
stdout
);
/* call abort() directly - we don't want another reset cause to intervene */
esp_reset_reason_set_hint
(
ESP_RST_PANIC
);
#endif
abort
();
while
(
1
)
{}
return
0
;
}
components/lua/common/lpanic.h
0 → 100644
View file @
dba57fa0
#ifndef _LUA_PANIC_H_
#define _LUA_PANIC_H_
#include "lua.h"
void
panic_clear_nvval
(
void
);
int
panic_get_nvval
(
void
);
int
lpanic
(
lua_State
*
L
);
#endif
components/lua/legc.c
deleted
100644 → 0
View file @
3a6961cc
// Lua EGC (Emergeny Garbage Collector) interface
#include "legc.h"
#include "lstate.h"
void
legc_set_mode
(
lua_State
*
L
,
int
mode
,
int
limit
)
{
global_State
*
g
=
G
(
L
);
g
->
egcmode
=
mode
;
g
->
memlimit
=
limit
;
}
components/lua/legc.h
deleted
100644 → 0
View file @
3a6961cc
// Lua EGC (Emergeny Garbage Collector) interface
#ifndef __LEGC_H__
#define __LEGC_H__
#include "lstate.h"
// EGC operations modes
#define EGC_NOT_ACTIVE 0 // EGC disabled
#define EGC_ON_ALLOC_FAILURE 1 // run EGC on allocation failure
#define EGC_ON_MEM_LIMIT 2 // run EGC when an upper memory limit is hit
#define EGC_ALWAYS 4 // always run EGC before an allocation
void
legc_set_mode
(
lua_State
*
L
,
int
mode
,
int
limit
);
#endif
components/lua/link_lua.lf
0 → 100644
View file @
dba57fa0
[sections:lua_libs]
entries:
.lua_libs
[sections:lua_libs_end_marker]
entries:
.lua_libs_end_marker
[sections:lua_rotable]
entries:
.lua_rotable
[sections:lua_rotable_end_marker]
entries:
.lua_rotable_end_marker
[scheme:lua_arrays]
entries:
lua_libs -> flash_rodata
lua_libs_end_marker -> flash_rodata
lua_rotable -> flash_rodata
lua_rotable_end_marker -> flash_rodata
# Important: don't change the alignments below without also updating the
# _Static_assert over in linit.c!
[mapping:lua]
archive: *
entries:
* (lua_arrays);
lua_libs -> flash_rodata KEEP() ALIGN(8) SURROUND(lua_libs_map),
lua_libs_end_marker -> flash_rodata KEEP(),
lua_rotable -> flash_rodata KEEP() ALIGN(8) SURROUND(lua_rotables_map),
lua_rotable_end_marker -> flash_rodata KEEP()
components/lua/lrotable.c
deleted
100644 → 0
View file @
3a6961cc
/* Read-only tables for Lua */
#define LUAC_CROSS_FILE
#include "lua.h"
#include <string.h>
#include "lrotable.h"
#include "lauxlib.h"
#include "lstring.h"
#include "lobject.h"
#include "lapi.h"
#ifdef _MSC_VER
#define ALIGNED_STRING __declspec( align( 4 ) ) char
#else
#define ALIGNED_STRING __attribute__((aligned(4))) char
#endif
#define LA_LINES 32
#define LA_SLOTS 4
//#define COLLECT_STATS
/*
* All keyed ROtable access passes through luaR_findentry(). ROTables
* are simply a list of <key><TValue value> pairs. The existing algo
* did a linear scan of this vector of pairs looking for a match.
*
* A N×M lookaside cache has been added, with a simple hash on the key's
* TString addr and the ROTable addr to identify one of N lines. Each
* line has M slots which are scanned. This is all done in RAM and is
* perhaps 20x faster than the corresponding random Flash accesses which
* will cause flash faults.
*
* 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 HASH(a,b) ((((519*(size_t)(a)))>>4) + ((b) ? (b)->tsv.hash: 0))
static
struct
{
unsigned
hash
;
unsigned
addr
:
24
;
unsigned
ndx
:
8
;
}
cache
[
LA_LINES
][
LA_SLOTS
];
#ifdef COLLECT_STATS
unsigned
cache_stats
[
3
];
#define COUNT(i) cache_stats[i]++
#else
#define COUNT(i)
#endif
static
int
lookup_cache
(
unsigned
hash
,
ROTable
*
rotable
)
{
int
i
=
(
hash
>>
2
)
&
(
LA_LINES
-
1
),
j
;
for
(
j
=
0
;
j
<
LA_SLOTS
;
j
++
)
{
if
(
cache
[
i
][
j
].
hash
==
hash
&&
((
size_t
)
rotable
&
0xffffffu
)
==
cache
[
i
][
j
].
addr
)
{
COUNT
(
0
);
return
cache
[
i
][
j
].
ndx
;
}
}
COUNT
(
1
);
return
-
1
;
}
static
void
update_cache
(
unsigned
hash
,
ROTable
*
rotable
,
unsigned
ndx
)
{
int
i
=
(
hash
)
>>
2
&
(
LA_LINES
-
1
),
j
;
COUNT
(
2
);
if
(
ndx
>
0xffu
)
return
;
for
(
j
=
LA_SLOTS
-
1
;
j
>
0
;
j
--
)
cache
[
i
][
j
]
=
cache
[
i
][
j
-
1
];
cache
[
i
][
0
].
hash
=
hash
;
cache
[
i
][
0
].
addr
=
(
size_t
)
rotable
;
cache
[
i
][
0
].
ndx
=
ndx
;
}
/*
* Find a string key entry in a rotable and return it. Note that this internally
* uses a null key to denote a metatable search.
*/
const
TValue
*
luaR_findentry
(
ROTable
*
rotable
,
TString
*
key
,
unsigned
*
ppos
)
{
const
luaR_entry
*
pentry
=
rotable
;
static
const
ALIGNED_STRING
metatablestr
[]
=
"__metatable"
;
const
char
*
strkey
=
key
?
getstr
(
key
)
:
metatablestr
;
unsigned
hash
=
HASH
(
rotable
,
key
);
unsigned
i
=
0
;
int
j
=
lookup_cache
(
hash
,
rotable
);
unsigned
l
=
key
?
key
->
tsv
.
len
:
sizeof
(
"__metatable"
)
-
1
;
if
(
pentry
)
{
if
(
j
>=
0
&&
!
strcmp
(
pentry
[
j
].
key
,
strkey
))
{
if
(
ppos
)
*
ppos
=
j
;
//printf("%3d hit %p %s\n", (hash>>2) & (LA_LINES-1), rotable, strkey);
return
&
pentry
[
j
].
value
;
}
/*
* The invariants for 1st word comparison are deferred to here since they
* aren't needed if there is a cache hit. Note that the termination null
* is included so a "on\0" has a mask of 0xFFFFFF and "a\0" has 0xFFFF.
*/
unsigned
name4
,
mask4
=
l
>
2
?
(
~
0u
)
:
(
~
0u
)
>>
((
3
-
l
)
*
8
);
memcpy
(
&
name4
,
strkey
,
sizeof
(
name4
));
for
(;
pentry
->
key
!=
NULL
;
i
++
,
pentry
++
)
{
if
(((
*
(
unsigned
*
)
pentry
->
key
^
name4
)
&
mask4
)
==
0
&&
!
strcmp
(
pentry
->
key
,
strkey
))
{
//printf("%p %s hit after %d probes \n", rotable, strkey, (int)(pentry-rotable));
if
(
ppos
)
*
ppos
=
i
;
update_cache
(
hash
,
rotable
,
pentry
-
rotable
);
//printf("%3d %3d %p %s\n", (hash>>2) & (LA_LINES-1), (int)(pentry-rotable), rotable, strkey);
return
&
pentry
->
value
;
}
}
}
//printf("%p %s miss after %d probes \n", rotable, strkey, (int)(pentry-rotable));
return
luaO_nilobject
;
}
/* Find the metatable of a given table */
void
*
luaR_getmeta
(
ROTable
*
rotable
)
{
const
TValue
*
res
=
luaR_findentry
(
rotable
,
NULL
,
NULL
);
return
res
&&
ttisrotable
(
res
)
?
rvalue
(
res
)
:
NULL
;
}
static
void
luaR_next_helper
(
lua_State
*
L
,
ROTable
*
pentries
,
int
pos
,
TValue
*
key
,
TValue
*
val
)
{
if
(
pentries
[
pos
].
key
)
{
/* Found an entry */
setsvalue
(
L
,
key
,
luaS_new
(
L
,
pentries
[
pos
].
key
));
setobj2s
(
L
,
val
,
&
pentries
[
pos
].
value
);
}
else
{
setnilvalue
(
key
);
setnilvalue
(
val
);
}
}
/* next (used for iteration) */
void
luaR_next
(
lua_State
*
L
,
ROTable
*
rotable
,
TValue
*
key
,
TValue
*
val
)
{
unsigned
keypos
;
/* Special case: if key is nil, return the first element of the rotable */
if
(
ttisnil
(
key
))
luaR_next_helper
(
L
,
rotable
,
0
,
key
,
val
);
else
if
(
ttisstring
(
key
))
{
/* Find the previous key again */
luaR_findentry
(
rotable
,
rawtsvalue
(
key
),
&
keypos
);
/* Advance to next key */
keypos
++
;
luaR_next_helper
(
L
,
rotable
,
keypos
,
key
,
val
);
}
}
components/lua/lrotable.h
deleted
100644 → 0
View file @
3a6961cc
/* Read-only tables for Lua */
#ifndef lrotable_h
#define lrotable_h
#include "lua.h"
#include "luaconf.h"
#include "lobject.h"
#include "llimits.h"
/* Macros one can use to define rotable entries */
#define LRO_FUNCVAL(v) {{.p = v}, LUA_TLIGHTFUNCTION}
#define LRO_LUDATA(v) {{.p = v}, LUA_TLIGHTUSERDATA}
#define LRO_NUMVAL(v) {{.n = v}, LUA_TNUMBER}
#define LRO_ROVAL(v) {{.p = (void*)v}, LUA_TROTABLE}
#define LRO_NILVAL {{.p = NULL}, LUA_TNIL}
#ifdef LUA_CROSS_COMPILER
#define LRO_STRKEY(k) k
#else
#define LRO_STRKEY(k) ((__attribute__((aligned(4))) char *) k)
#endif
#define LROT_TABLE(t) static const LUA_REG_TYPE t ## _map[];
#define LROT_PUBLIC_TABLE(t) const LUA_REG_TYPE t ## _map[];
#define LROT_TABLEREF(t) ((void *) t ## _map)
#define LROT_BEGIN(t) static const LUA_REG_TYPE t ## _map [] = {
#define LROT_PUBLIC_BEGIN(t) const LUA_REG_TYPE t ## _map[] = {
#define LROT_EXTERN(t) extern const LUA_REG_TYPE t ## _map[]
#define LROT_TABENTRY(n,t) {LRO_STRKEY(#n), LRO_ROVAL(t ## _map)},
#define LROT_FUNCENTRY(n,f) {LRO_STRKEY(#n), LRO_FUNCVAL(f)},
#define LROT_NUMENTRY(n,x) {LRO_STRKEY(#n), LRO_NUMVAL(x)},
#define LROT_LUDENTRY(n,x) {LRO_STRKEY(#n), LRO_LUDATA((void *) x)},
#define LROT_END(t,mt, f) {NULL, LRO_NILVAL} };
#define LROT_BREAK(t) };
#define LUA_REG_TYPE luaR_entry
#define LREGISTER(L, name, table) return 0
/* Maximum length of a rotable name and of a string key*/
#define LUA_MAX_ROTABLE_NAME 32
/* Type of a numeric key in a rotable */
typedef
int
luaR_numkey
;
/* An entry in the read only table */
typedef
struct
luaR_entry
{
const
char
*
key
;
const
TValue
value
;
}
luaR_entry
;
/*
* The current ROTable implmentation is a vector of luaR_entry terminated by a
* nil record. The convention is to use ROtable * to refer to the entire vector
* as a logical ROTable.
*/
typedef
const
struct
luaR_entry
ROTable
;
const
TValue
*
luaR_findentry
(
ROTable
*
tab
,
TString
*
key
,
unsigned
*
ppos
);
const
TValue
*
luaR_findentryN
(
ROTable
*
tab
,
luaR_numkey
numkey
,
unsigned
*
ppos
);
void
luaR_next
(
lua_State
*
L
,
ROTable
*
tab
,
TValue
*
key
,
TValue
*
val
);
void
*
luaR_getmeta
(
ROTable
*
tab
);
int
luaR_isrotable
(
void
*
p
);
/*
* Set inRO check depending on platform. Note that this implementation needs
* to work on both the host (luac.cross) and ESP targets. The luac.cross
* VM is used for the -e option, and is primarily used to be able to debug
* VM changes on the more developer-friendly hot gdb environment.
*/
#if defined(LUA_CROSS_COMPILER)
#if defined(_MSC_VER)
//msvc build uses these dummy vars to locate the beginning and ending addresses of the RO data
extern
const
char
_ro_start
[],
_ro_end
[];
#define IN_RODATA_AREA(p) (((const char*)(p)) >= _ro_start && ((const char *)(p)) <= _ro_end)
#else
/* one of the POSIX variants */
#if defined(__CYGWIN__)
#define _RODATA_END __end__
#elif defined(__MINGW32__)
#define _RODATA_END end
#else
#define _RODATA_END _edata
#endif
extern
const
char
_RODATA_END
[];
#define IN_RODATA_AREA(p) (((const char *)(p)) < _RODATA_END)
#endif
/* defined(_MSC_VER) */
#else
/* xtensa tool chain for ESP32 target */
#include "compiler.h"
#define IN_RODATA_AREA(p) (((const char *)p) >= RODATA_START_ADDRESS && ((const char *)p) <= RODATA_END_ADDRESS)
#endif
/* defined(LUA_CROSS_COMPILER) */
/* Return 1 if the given pointer is a rotable */
#define luaR_isrotable(p) IN_RODATA_AREA(p)
#endif
components/lua/compiler.h
→
components/lua/
lua-5.1/
compiler.h
View file @
dba57fa0
File moved
components/lua
c_cross/Makefile
→
components/lua
/lua-5.1/host/idf.mk
View file @
dba57fa0
...
@@ -2,72 +2,54 @@ all: build
...
@@ -2,72 +2,54 @@ all: build
HOSTCC
?=
$(PYTHON)
-m
ziglang cc
HOSTCC
?=
$(PYTHON)
-m
ziglang cc
# zig cc (0.8.0 at least) seems to get itself all confused with its cache
# when we're running a separate path for dependencies, so we skip them for
# now as for most people they're not needed anyway.
ifeq
($(findstring zig,$(HOSTCC)),zig)
WITHOUT_DEPS
:=
1
endif
ifeq
($V,)
ifeq
($V,)
Q
:=
@
Q
:=
@
endif
endif
LUAC_CFLAGS
:=
-I
$(COMPONENT_PATH)
/../uzlib
-I
$(COMPONENT_PATH)
/../lua
-I
$(BUILD_DIR_BASE)
/config
-I
$(COMPONENT_PATH)
/../base_nodemcu/include
-O2
-g
-Wall
-Wextra
LUAC_OBJ_DIR
:=
$(LUAC_BUILD_DIR)
/
$(
notdir
$(LUA_PATH)
)
LUAC_LDFLAGS
:=
-ldl
-lm
LUAC_DEFINES
+=
-DLUA_CROSS_COMPILER
-DLUA_USE_STDIO
LUAC_CFLAGS
:=
\
ifneq
($(CONFIG_LUA_OPTIMIZE_DEBUG),)
-I
$(LUAC_BUILD_DIR)
\
LUAC_DEFINES
+=
-DLUA_OPTIMIZE_DEBUG
=
$(CONFIG_LUA_OPTIMIZE_DEBUG)
-I
$(LUA_PATH)
\
endif
-I
$(LUA_PATH)
/host
\
-I
$(LUA_PATH)
/../common
\
-I
$(LUA_PATH)
/../../uzlib
\
-O2
-g
-Wall
-Wextra
-Wno-sign-compare
vpath
%.c
$(COMPONENT_PATH)
$(COMPONENT_PATH)/../lua
$(COMPONENT_PATH)/../uzlib
$(COMPONENT_PATH)/../base_nodemcu
LUAC_LDFLAGS
:=
-ldl
-lm
LUAC_LUACSRC
:=
\
LUAC_DEFINES
+=
\
luac.c lflashimg.c loslib.c print.c liolib.c
-DLUA_CROSS_COMPILER
\
-DLUA_USE_HOST
\
-DLUA_USE_STDIO
\
LUAC_LUASRC
:=
$(
addprefix
$(COMPONENT_PATH)
/../lua/,
\
vpath
%.c
$(LUA_PATH)/host
$(LUA_PATH)
$(LUA_PATH)/../common
$(LUA_PATH)/../../uzlib
LUA_SRCS
:=
\
luac.c lflashimg.c loslib.c print.c liolib.c
\
lapi.c lauxlib.c lbaselib.c lcode.c ldblib.c ldebug.c
\
lapi.c lauxlib.c lbaselib.c lcode.c ldblib.c ldebug.c
\
ldo.c ldump.c lfunc.c lgc.c llex.c
\
ldo.c ldump.c lfunc.c lgc.c llex.c
\
lmathlib.c lmem.c loadlib.c lobject.c lopcodes.c lparser.c
\
lmathlib.c lmem.c loadlib.c lobject.c lopcodes.c lparser.c
\
lrotable
.c lstate.c lstring.c lstrlib.c ltable.c ltablib.c
\
lnodemcu
.c lstate.c lstring.c lstrlib.c ltable.c ltablib.c
\
ltm.c lundump.c lvm.c lzio.c
\
ltm.c lundump.c lvm.c lzio.c
\
)
linit.c lpanic.c
\
LUAC_UZSRC
:=
$(
addprefix
$(COMPONENT_PATH)
/../uzlib/,
\
uzlib_deflate.c crc32.c
\
uzlib_deflate.c crc32.c
\
)
LUAC_NODEMCUSRC
:=
$(
addprefix
$(COMPONENT_PATH)
/../base_nodemcu/,
\
linit.c
\
)
LUAC_BUILD_DIR
:=
$(BUILD_DIR_BASE)
/luac_cross
LUAC_OBJS
:=
$
(
LUAC_LUACSRC:%.c
=
$(LUAC_BUILD_DIR)
/%.o
)
LUAC_OBJS
+=
$
(
LUAC_LUASRC:
$(COMPONENT_PATH)
/../lua/%.c
=
$(LUAC_BUILD_DIR)
/%.o
)
LUAC_OBJS
+=
$
(
LUAC_UZSRC:
$(COMPONENT_PATH)
/../uzlib/%.c
=
$(LUAC_BUILD_DIR)
/%.o
)
LUAC_OBJS
+=
$
(
LUAC_NODEMCUSRC:
$(COMPONENT_PATH)
/../base_nodemcu/%.c
=
$(LUAC_BUILD_DIR)
/%.o
)
ifneq
($(WITHOUT_DEPS),1)
LUAC_DEPS
:=
$(LUAC_OBJS:%.o=%.d)
endif
LUAC_OBJS
:=
$
(
LUA_SRCS:%.c
=
$(LUAC_OBJ_DIR)
/%.o
)
LUAC_CROSS
:=
$(LUAC_BUILD_DIR)
/luac.cross
LUAC_CROSS
:=
$(LUAC_BUILD_DIR)
/luac.cross
$(LUAC_
BUILD
_DIR)
:
$(LUAC_
OBJ
_DIR)
:
@
mkdir
-p
"
$@
"
@
mkdir
-p
"
$@
"
$(LUAC_
BUILD
_DIR)/%.o
:
%.c | $(LUAC_
BUILD
_DIR)
$(LUAC_
OBJ
_DIR)/%.o
:
%.c | $(LUAC_
OBJ
_DIR)
@
echo
'[hostcc]
$(
notdir
$@
)
'
@
echo
'[hostcc]
$(
notdir
$@
)
'
$Q$(HOSTCC)
$(LUAC_DEFINES)
$(LUAC_CFLAGS)
"
$<
"
-c
-o
"
$@
"
$Q$(HOSTCC)
$(LUAC_DEFINES)
$(LUAC_CFLAGS)
"
$<
"
-c
-o
"
$@
"
$(LUAC_
BUILD
_DIR)/%.d
:
SHELL=/bin/bash
$(LUAC_
OBJ
_DIR)/%.d
:
SHELL=/bin/bash
$(LUAC_
BUILD
_DIR)/%.d
:
%.c | $(LUAC_
BUILD
_DIR)
$(LUAC_
OBJ
_DIR)/%.d
:
%.c | $(LUAC_
OBJ
_DIR)
@
echo
'[ dep] $<'
@
echo
'[ dep] $<'
@
rm
-f
"
$@
"
@
rm
-f
"
$@
"
$Qset
-eo
pipefail
;
$(HOSTCC)
$(LUAC_DEFINES)
$(LUAC_CFLAGS)
-M
"
$<
"
|
sed
's,\($*\.o\)[ :]*,
$(LUAC_
BUILD
_DIR)
/\1 $@ : ,g'
>
"
$@
.tmp"
;
mv
"
$@
.tmp"
"
$@
"
$Qset
-eo
pipefail
;
$(HOSTCC)
$(LUAC_DEFINES)
$(LUAC_CFLAGS)
-M
"
$<
"
|
sed
's,\($*\.o\)[ :]*,
$(LUAC_
OBJ
_DIR)
/\1 $@ : ,g'
>
"
$@
.tmp"
;
mv
"
$@
.tmp"
"
$@
"
build
:
$(LUAC_DEPS) $(LUAC_CROSS)
build
:
$(LUAC_DEPS) $(LUAC_CROSS)
...
@@ -75,6 +57,12 @@ $(LUAC_CROSS): $(LUAC_OBJS)
...
@@ -75,6 +57,12 @@ $(LUAC_CROSS): $(LUAC_OBJS)
@
echo
'[ link]
$(
notdir
$@
)
'
@
echo
'[ link]
$(
notdir
$@
)
'
$Q$(HOSTCC)
$(LUAC_CFLAGS)
$^
$(LUAC_LDFLAGS)
-o
"
$@
"
$Q$(HOSTCC)
$(LUAC_CFLAGS)
$^
$(LUAC_LDFLAGS)
-o
"
$@
"
ifneq
($(MAKECMDGOALS),clean)
# zig cc (0.8.0 at least) seems to get itself all confused with its cache
-include
$(LUAC_DEPS)
# when we're running a separate path for dependencies, so we skip them for
# now as for most people they're not needed anyway.
ifneq
($(findstring zig,$(HOSTCC)),zig)
LUAC_DEPS
:=
$(LUAC_OBJS:%.o=%.d)
ifneq
($(MAKECMDGOALS),clean)
-include
$(LUAC_DEPS)
endif
endif
endif
components/lua
c_cr
os
s
/lflashimg.c
→
components/lua
/lua-5.1/h
os
t
/lflashimg.c
View file @
dba57fa0
...
@@ -6,7 +6,6 @@
...
@@ -6,7 +6,6 @@
#define LUAC_CROSS_FILE
#define LUAC_CROSS_FILE
#include "luac_cross.h"
#include <ctype.h>
#include <ctype.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
...
@@ -109,10 +108,11 @@ static uint *flashAddrTag = flashImage + LUA_MAX_FLASH_SIZE;
...
@@ -109,10 +108,11 @@ static uint *flashAddrTag = flashImage + LUA_MAX_FLASH_SIZE;
#define setFlashAddrTag(v) flashAddrTag[_TW(v)] |= _TB(v)
#define setFlashAddrTag(v) flashAddrTag[_TW(v)] |= _TB(v)
#define getFlashAddrTag(v) ((flashAddrTag[_TW(v)]&_TB(v)) != 0)
#define getFlashAddrTag(v) ((flashAddrTag[_TW(v)]&_TB(v)) != 0)
#define fatal luac_fatal
#ifdef _MSC_VER
#ifdef _MSC_VER
extern
void
__declspec
(
noreturn
)
fatal
(
const
char
*
message
);
extern
void
__declspec
(
noreturn
)
luac_
fatal
(
const
char
*
message
);
#else
#else
extern
void
__attribute__
((
noreturn
))
fatal
(
const
char
*
message
);
extern
void
__attribute__
((
noreturn
))
luac_
fatal
(
const
char
*
message
);
#endif
#endif
#ifdef LOCAL_DEBUG
#ifdef LOCAL_DEBUG
...
@@ -188,10 +188,8 @@ static void scanProtoStrings(lua_State *L, const Proto* f) {
...
@@ -188,10 +188,8 @@ static void scanProtoStrings(lua_State *L, const Proto* f) {
if
(
f
->
source
)
if
(
f
->
source
)
addTS
(
L
,
f
->
source
);
addTS
(
L
,
f
->
source
);
#ifdef LUA_OPTIMIZE_DEBUG
if
(
f
->
packedlineinfo
)
if
(
f
->
packedlineinfo
)
addTS
(
L
,
luaS_new
(
L
,
cast
(
const
char
*
,
f
->
packedlineinfo
)));
addTS
(
L
,
luaS_new
(
L
,
cast
(
const
char
*
,
f
->
packedlineinfo
)));
#endif
for
(
i
=
0
;
i
<
f
->
sizek
;
i
++
)
{
for
(
i
=
0
;
i
<
f
->
sizek
;
i
++
)
{
if
(
ttisstring
(
f
->
k
+
i
))
if
(
ttisstring
(
f
->
k
+
i
))
...
@@ -357,11 +355,7 @@ static void *flashCopy(lua_State* L, int n, const char *fmt, void *src) {
...
@@ -357,11 +355,7 @@ static void *flashCopy(lua_State* L, int n, const char *fmt, void *src) {
}
}
/* The debug optimised version has a different Proto layout */
/* The debug optimised version has a different Proto layout */
#ifdef LUA_OPTIMIZE_DEBUG
#define PROTO_COPY_MASK "AHAAAAAASIIIIIIIAI"
#define PROTO_COPY_MASK "AHAAAAAASIIIIIIIAI"
#else
#define PROTO_COPY_MASK "AHAAAAAASIIIIIIIIAI"
#endif
/*
/*
* Do the actual prototype copy.
* Do the actual prototype copy.
...
@@ -385,14 +379,10 @@ static void *functionToFlash(lua_State* L, const Proto* orig) {
...
@@ -385,14 +379,10 @@ static void *functionToFlash(lua_State* L, const Proto* orig) {
f
.
k
=
cast
(
TValue
*
,
flashCopy
(
L
,
f
.
sizek
,
"V"
,
f
.
k
));
f
.
k
=
cast
(
TValue
*
,
flashCopy
(
L
,
f
.
sizek
,
"V"
,
f
.
k
));
f
.
code
=
cast
(
Instruction
*
,
flashCopy
(
L
,
f
.
sizecode
,
"I"
,
f
.
code
));
f
.
code
=
cast
(
Instruction
*
,
flashCopy
(
L
,
f
.
sizecode
,
"I"
,
f
.
code
));
#ifdef LUA_OPTIMIZE_DEBUG
if
(
f
.
packedlineinfo
)
{
if
(
f
.
packedlineinfo
)
{
TString
*
ts
=
luaS_new
(
L
,
cast
(
const
char
*
,
f
.
packedlineinfo
));
TString
*
ts
=
luaS_new
(
L
,
cast
(
const
char
*
,
f
.
packedlineinfo
));
f
.
packedlineinfo
=
cast
(
unsigned
char
*
,
resolveTString
(
L
,
ts
))
+
sizeof
(
FlashTS
);
f
.
packedlineinfo
=
cast
(
unsigned
char
*
,
resolveTString
(
L
,
ts
))
+
sizeof
(
FlashTS
);
}
}
#else
f
.
lineinfo
=
cast
(
int
*
,
flashCopy
(
L
,
f
.
sizelineinfo
,
"I"
,
f
.
lineinfo
));
#endif
f
.
locvars
=
cast
(
struct
LocVar
*
,
flashCopy
(
L
,
f
.
sizelocvars
,
"SII"
,
f
.
locvars
));
f
.
locvars
=
cast
(
struct
LocVar
*
,
flashCopy
(
L
,
f
.
sizelocvars
,
"SII"
,
f
.
locvars
));
f
.
upvalues
=
cast
(
TString
**
,
flashCopy
(
L
,
f
.
sizeupvalues
,
"S"
,
f
.
upvalues
));
f
.
upvalues
=
cast
(
TString
**
,
flashCopy
(
L
,
f
.
sizeupvalues
,
"S"
,
f
.
upvalues
));
return
cast
(
void
*
,
flashCopy
(
L
,
1
,
PROTO_COPY_MASK
,
&
f
));
return
cast
(
void
*
,
flashCopy
(
L
,
1
,
PROTO_COPY_MASK
,
&
f
));
...
@@ -401,10 +391,10 @@ static void *functionToFlash(lua_State* L, const Proto* orig) {
...
@@ -401,10 +391,10 @@ static void *functionToFlash(lua_State* L, const Proto* orig) {
uint
dumpToFlashImage
(
lua_State
*
L
,
const
Proto
*
main
,
lua_Writer
w
,
uint
dumpToFlashImage
(
lua_State
*
L
,
const
Proto
*
main
,
lua_Writer
w
,
void
*
data
,
int
strip
,
void
*
data
,
int
strip
,
lu_int32
address
,
lu_int32
maxSize
)
{
lu_int32
address
,
lu_int32
maxSize
)
{
(
void
)
strip
;
// parameter strip is ignored for now
// parameter strip is ignored for now
(
void
)
strip
;
FlashHeader
*
fh
=
cast
(
FlashHeader
*
,
flashAlloc
(
L
,
sizeof
(
FlashHeader
)));
FlashHeader
*
fh
=
cast
(
FlashHeader
*
,
flashAlloc
(
L
,
sizeof
(
FlashHeader
)));
int
status
;
int
i
,
status
;
lua_newtable
(
L
);
lua_newtable
(
L
);
scanProtoStrings
(
L
,
main
);
scanProtoStrings
(
L
,
main
);
createROstrt
(
L
,
fh
);
createROstrt
(
L
,
fh
);
...
@@ -416,7 +406,7 @@ uint dumpToFlashImage (lua_State* L, const Proto *main, lua_Writer w,
...
@@ -416,7 +406,7 @@ uint dumpToFlashImage (lua_State* L, const Proto *main, lua_Writer w,
fatal
(
"The image is too large for specfied LFS size"
);
fatal
(
"The image is too large for specfied LFS size"
);
}
}
if
(
address
)
{
/* in absolute mode convert addresses to mapped address */
if
(
address
)
{
/* in absolute mode convert addresses to mapped address */
for
(
uint
i
=
0
;
i
<
curOffset
;
i
++
)
for
(
i
=
0
;
i
<
curOffset
;
i
++
)
if
(
getFlashAddrTag
(
i
))
if
(
getFlashAddrTag
(
i
))
flashImage
[
i
]
=
4
*
flashImage
[
i
]
+
address
;
flashImage
[
i
]
=
4
*
flashImage
[
i
]
+
address
;
lua_unlock
(
L
);
lua_unlock
(
L
);
...
@@ -434,7 +424,7 @@ uint dumpToFlashImage (lua_State* L, const Proto *main, lua_Writer w,
...
@@ -434,7 +424,7 @@ uint dumpToFlashImage (lua_State* L, const Proto *main, lua_Writer w,
status
=
uzlib_compress
(
&
oBuf
,
&
oLen
,
status
=
uzlib_compress
(
&
oBuf
,
&
oLen
,
(
const
uint8_t
*
)
flashImage
,
bmLen
+
fh
->
flash_size
);
(
const
uint8_t
*
)
flashImage
,
bmLen
+
fh
->
flash_size
);
if
(
status
!=
UZLIB_OK
)
{
if
(
status
!=
UZLIB_OK
)
{
fatal
(
"Out of memory during image compression"
);
luac_
fatal
(
"Out of memory during image compression"
);
}
}
lua_unlock
(
L
);
lua_unlock
(
L
);
#if 0
#if 0
...
...
components/lua
c_cr
os
s
/liolib.c
→
components/lua
/lua-5.1/h
os
t
/liolib.c
View file @
dba57fa0
...
@@ -17,7 +17,7 @@
...
@@ -17,7 +17,7 @@
#include "lauxlib.h"
#include "lauxlib.h"
#include "lualib.h"
#include "lualib.h"
#include "l
rotable
.h"
#include "l
nodemcu
.h"
#define IO_INPUT 1
#define IO_INPUT 1
#define IO_OUTPUT 2
#define IO_OUTPUT 2
...
@@ -439,7 +439,10 @@ static int f_flush (lua_State *L) {
...
@@ -439,7 +439,10 @@ static int f_flush (lua_State *L) {
return
pushresult
(
L
,
fflush
(
tofile
(
L
))
==
0
,
NULL
);
return
pushresult
(
L
,
fflush
(
tofile
(
L
))
==
0
,
NULL
);
}
}
LROT_PUBLIC_BEGIN
(
iolib
)
LROT_TABLE
(
iolib
);
LROT_BEGIN
(
iolib
,
NULL
,
LROT_MASK_GC_INDEX
)
LROT_TABENTRY
(
__index
,
iolib
)
LROT_FUNCENTRY
(
close
,
io_close
)
LROT_FUNCENTRY
(
close
,
io_close
)
LROT_FUNCENTRY
(
flush
,
io_flush
)
LROT_FUNCENTRY
(
flush
,
io_flush
)
LROT_FUNCENTRY
(
input
,
io_input
)
LROT_FUNCENTRY
(
input
,
io_input
)
...
@@ -449,10 +452,14 @@ LROT_PUBLIC_BEGIN(iolib)
...
@@ -449,10 +452,14 @@ LROT_PUBLIC_BEGIN(iolib)
LROT_FUNCENTRY
(
read
,
io_read
)
LROT_FUNCENTRY
(
read
,
io_read
)
LROT_FUNCENTRY
(
type
,
io_type
)
LROT_FUNCENTRY
(
type
,
io_type
)
LROT_FUNCENTRY
(
write
,
io_write
)
LROT_FUNCENTRY
(
write
,
io_write
)
LROT_TABENTRY
(
__index
,
iolib
)
LROT_END
(
iolib
,
NULL
,
LROT_MASK_GC_INDEX
)
LROT_END
(
iolib
,
NULL
,
0
)
LROT_BEGIN
(
flib
)
LROT_TABLE
(
flib
);
LROT_BEGIN
(
flib
,
NULL
,
LROT_MASK_GC_INDEX
)
LROT_FUNCENTRY
(
__gc
,
io_gc
)
LROT_TABENTRY
(
__index
,
flib
)
LROT_FUNCENTRY
(
__tostring
,
io_tostring
)
LROT_FUNCENTRY
(
close
,
io_close
)
LROT_FUNCENTRY
(
close
,
io_close
)
LROT_FUNCENTRY
(
flush
,
f_flush
)
LROT_FUNCENTRY
(
flush
,
f_flush
)
LROT_FUNCENTRY
(
lines
,
f_lines
)
LROT_FUNCENTRY
(
lines
,
f_lines
)
...
@@ -460,9 +467,6 @@ LROT_BEGIN(flib)
...
@@ -460,9 +467,6 @@ LROT_BEGIN(flib)
LROT_FUNCENTRY
(
seek
,
f_seek
)
LROT_FUNCENTRY
(
seek
,
f_seek
)
LROT_FUNCENTRY
(
setvbuf
,
f_setvbuf
)
LROT_FUNCENTRY
(
setvbuf
,
f_setvbuf
)
LROT_FUNCENTRY
(
write
,
f_write
)
LROT_FUNCENTRY
(
write
,
f_write
)
LROT_FUNCENTRY
(
__gc
,
io_gc
)
LROT_FUNCENTRY
(
__tostring
,
io_tostring
)
LROT_TABENTRY
(
__index
,
flib
)
LROT_END
(
flib
,
NULL
,
LROT_MASK_GC_INDEX
)
LROT_END
(
flib
,
NULL
,
LROT_MASK_GC_INDEX
)
static
const
luaL_Reg
io_base
[]
=
{{
NULL
,
NULL
}};
static
const
luaL_Reg
io_base
[]
=
{{
NULL
,
NULL
}};
...
...
components/lua
c_cr
os
s
/loslib.c
→
components/lua
/lua-5.1/h
os
t
/loslib.c
View file @
dba57fa0
...
@@ -6,7 +6,6 @@
...
@@ -6,7 +6,6 @@
#define LUAC_CROSS_FILE
#define LUAC_CROSS_FILE
#include "luac_cross.h"
#include <errno.h>
#include <errno.h>
#include <locale.h>
#include <locale.h>
#include <stdlib.h>
#include <stdlib.h>
...
@@ -20,8 +19,7 @@
...
@@ -20,8 +19,7 @@
#include "lauxlib.h"
#include "lauxlib.h"
#include "lualib.h"
#include "lualib.h"
#include "lrotable.h"
#include "lnodemcu.h"
static
int
os_pushresult
(
lua_State
*
L
,
int
i
,
const
char
*
filename
)
{
static
int
os_pushresult
(
lua_State
*
L
,
int
i
,
const
char
*
filename
)
{
int
en
=
errno
;
/* calls to Lua API may change this value */
int
en
=
errno
;
/* calls to Lua API may change this value */
...
@@ -221,32 +219,26 @@ static int os_exit (lua_State *L) {
...
@@ -221,32 +219,26 @@ static int os_exit (lua_State *L) {
exit
(
luaL_optint
(
L
,
1
,
EXIT_SUCCESS
));
exit
(
luaL_optint
(
L
,
1
,
EXIT_SUCCESS
));
}
}
#undef MIN_OPT_LEVEL
LROT_BEGIN
(
oslib
,
NULL
,
0
)
#define MIN_OPT_LEVEL 1
LROT_FUNCENTRY
(
clock
,
os_clock
)
#include "lrotable.h"
LROT_FUNCENTRY
(
date
,
os_date
)
LROT_PUBLIC_BEGIN
(
oslib
)
LROT_FUNCENTRY
(
clock
,
os_clock
)
LROT_FUNCENTRY
(
date
,
os_date
)
#if !defined LUA_NUMBER_INTEGRAL
#if !defined LUA_NUMBER_INTEGRAL
LROT_FUNCENTRY
(
difftime
,
os_difftime
)
LROT_FUNCENTRY
(
difftime
,
os_difftime
)
#endif
#endif
LROT_FUNCENTRY
(
execute
,
os_execute
)
LROT_FUNCENTRY
(
execute
,
os_execute
)
LROT_FUNCENTRY
(
exit
,
os_exit
)
LROT_FUNCENTRY
(
exit
,
os_exit
)
LROT_FUNCENTRY
(
getenv
,
os_getenv
)
LROT_FUNCENTRY
(
getenv
,
os_getenv
)
LROT_FUNCENTRY
(
remove
,
os_remove
)
LROT_FUNCENTRY
(
remove
,
os_remove
)
LROT_FUNCENTRY
(
rename
,
os_rename
)
LROT_FUNCENTRY
(
rename
,
os_rename
)
LROT_FUNCENTRY
(
setlocale
,
os_setlocale
)
LROT_FUNCENTRY
(
setlocale
,
os_setlocale
)
LROT_FUNCENTRY
(
time
,
os_time
)
LROT_FUNCENTRY
(
time
,
os_time
)
LROT_FUNCENTRY
(
tmpname
,
os_tmpname
)
LROT_FUNCENTRY
(
tmpname
,
os_tmpname
)
LROT_END
(
oslib
,
NULL
,
0
)
LROT_END
(
oslib
,
NULL
,
0
)
/* }====================================================== */
/* }====================================================== */
LUALIB_API
int
luaopen_os
(
lua_State
*
L
)
{
LUALIB_API
int
luaopen_os
(
lua_State
*
L
)
{
(
void
)
L
;
(
void
)
L
;
//LREGISTER(L, LUA_OSLIBNAME, oslib); // <------------- ???
return
1
;
return
0
;
}
}
components/lua
c_cr
os
s
/luac.c
→
components/lua
/lua-5.1/h
os
t
/luac.c
View file @
dba57fa0
...
@@ -5,15 +5,15 @@
...
@@ -5,15 +5,15 @@
*/
*/
#define LUAC_CROSS_FILE
#define LUAC_CROSS_FILE
#define luac_c
#define LUA_CORE
#include "luac_cross.h"
#include <errno.h>
#include <errno.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <time.h>
#define luac_c
#define LUA_CORE
#include "lua.h"
#include "lua.h"
#include "lauxlib.h"
#include "lauxlib.h"
...
@@ -42,11 +42,12 @@ static const char* execute; /* executed a Lua file */
...
@@ -42,11 +42,12 @@ static const char* execute; /* executed a Lua file */
static
const
char
*
progname
=
PROGNAME
;
/* actual program name */
static
const
char
*
progname
=
PROGNAME
;
/* actual program name */
static
DumpTargetInfo
target
;
static
DumpTargetInfo
target
;
void
fatal
(
const
char
*
message
)
void
luac_
fatal
(
const
char
*
message
)
{
{
fprintf
(
stderr
,
"%s: %s
\n
"
,
progname
,
message
);
fprintf
(
stderr
,
"%s: %s
\n
"
,
progname
,
message
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
#define fatal(s) luac_fatal(s)
static
void
cannot
(
const
char
*
what
)
static
void
cannot
(
const
char
*
what
)
{
{
...
@@ -280,8 +281,8 @@ static int pmain(lua_State* L)
...
@@ -280,8 +281,8 @@ static int pmain(lua_State* L)
if
(
!
lua_checkstack
(
L
,
argc
))
fatal
(
"too many input files"
);
if
(
!
lua_checkstack
(
L
,
argc
))
fatal
(
"too many input files"
);
if
(
execute
)
if
(
execute
)
{
{
if
(
luaL_loadfile
(
L
,
execute
)
!=
0
)
fatal
(
lua_tostring
(
L
,
-
1
));
luaL_openlibs
(
L
);
luaL_openlibs
(
L
);
if
(
luaL_loadfile
(
L
,
execute
)
!=
0
)
fatal
(
lua_tostring
(
L
,
-
1
));
lua_pushstring
(
L
,
execute
);
lua_pushstring
(
L
,
execute
);
if
(
lua_pcall
(
L
,
1
,
1
,
0
))
fatal
(
lua_tostring
(
L
,
-
1
));
if
(
lua_pcall
(
L
,
1
,
1
,
0
))
fatal
(
lua_tostring
(
L
,
-
1
));
if
(
!
lua_isfunction
(
L
,
-
1
))
if
(
!
lua_isfunction
(
L
,
-
1
))
...
...
components/lua
c_cr
os
s
/print.c
→
components/lua
/lua-5.1/h
os
t
/print.c
View file @
dba57fa0
...
@@ -6,7 +6,6 @@
...
@@ -6,7 +6,6 @@
#define LUAC_CROSS_FILE
#define LUAC_CROSS_FILE
#include "luac_cross.h"
#include <ctype.h>
#include <ctype.h>
#include <stdio.h>
#include <stdio.h>
...
...
components/lua/lapi.c
→
components/lua/
lua-5.1/
lapi.c
View file @
dba57fa0
...
@@ -6,11 +6,9 @@
...
@@ -6,11 +6,9 @@
#define lapi_c
#define lapi_c
#define LUA_CORE
#define LUA_CORE
#define LUAC_CROSS_FILE
#include "lua.h"
#include "lua.h"
//#include <assert.h>
#include <math.h>
#include <math.h>
#include <string.h>
#include <string.h>
#include "lapi.h"
#include "lapi.h"
...
@@ -26,7 +24,6 @@
...
@@ -26,7 +24,6 @@
#include "ltm.h"
#include "ltm.h"
#include "lundump.h"
#include "lundump.h"
#include "lvm.h"
#include "lvm.h"
#include "lrotable.h"
#if 0
#if 0
const char lua_ident[] =
const char lua_ident[] =
...
@@ -155,6 +152,16 @@ LUA_API lua_State *lua_newthread (lua_State *L) {
...
@@ -155,6 +152,16 @@ LUA_API lua_State *lua_newthread (lua_State *L) {
*/
*/
/*
** convert an acceptable stack index into an absolute index
*/
LUA_API
int
lua_absindex
(
lua_State
*
L
,
int
idx
)
{
return
(
idx
>
0
||
idx
<=
LUA_REGISTRYINDEX
)
?
idx
:
cast_int
(
L
->
top
-
L
->
base
)
-
1
+
idx
;
}
LUA_API
int
lua_gettop
(
lua_State
*
L
)
{
LUA_API
int
lua_gettop
(
lua_State
*
L
)
{
return
cast_int
(
L
->
top
-
L
->
base
);
return
cast_int
(
L
->
top
-
L
->
base
);
}
}
...
@@ -243,6 +250,12 @@ LUA_API void lua_pushvalue (lua_State *L, int idx) {
...
@@ -243,6 +250,12 @@ LUA_API void lua_pushvalue (lua_State *L, int idx) {
LUA_API
int
lua_type
(
lua_State
*
L
,
int
idx
)
{
LUA_API
int
lua_type
(
lua_State
*
L
,
int
idx
)
{
StkId
o
=
index2adr
(
L
,
idx
);
return
(
o
==
luaO_nilobject
)
?
LUA_TNONE
:
ttnov
(
o
);
}
LUA_API
int
lua_fulltype
(
lua_State
*
L
,
int
idx
)
{
StkId
o
=
index2adr
(
L
,
idx
);
StkId
o
=
index2adr
(
L
,
idx
);
return
(
o
==
luaO_nilobject
)
?
LUA_TNONE
:
ttype
(
o
);
return
(
o
==
luaO_nilobject
)
?
LUA_TNONE
:
ttype
(
o
);
}
}
...
@@ -250,7 +263,7 @@ LUA_API int lua_type (lua_State *L, int idx) {
...
@@ -250,7 +263,7 @@ LUA_API int lua_type (lua_State *L, int idx) {
LUA_API
const
char
*
lua_typename
(
lua_State
*
L
,
int
t
)
{
LUA_API
const
char
*
lua_typename
(
lua_State
*
L
,
int
t
)
{
UNUSED
(
L
);
UNUSED
(
L
);
return
(
t
==
LUA_TNONE
)
?
"no value"
:
luaT_typenames
[
t
];
return
(
t
==
LUA_TNONE
||
t
>=
LUA_NUMTAGS
)
?
"no value"
:
luaT_typenames
[
t
];
}
}
...
@@ -287,32 +300,25 @@ LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {
...
@@ -287,32 +300,25 @@ LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {
}
}
LUA_API
int
lua_
equal
(
lua_State
*
L
,
int
index1
,
int
index2
)
{
LUA_API
int
lua_
compare
(
lua_State
*
L
,
int
index1
,
int
index2
,
int
op
)
{
StkId
o1
,
o2
;
StkId
o1
,
o2
;
int
i
;
int
i
=
0
;
lua_lock
(
L
);
/* may call tag method */
lua_lock
(
L
);
/* may call tag method */
o1
=
index2adr
(
L
,
index1
);
o1
=
index2adr
(
L
,
index1
);
o2
=
index2adr
(
L
,
index2
);
o2
=
index2adr
(
L
,
index2
);
i
=
(
o1
==
luaO_nilobject
||
o2
==
luaO_nilobject
)
?
0
:
equalobj
(
L
,
o1
,
o2
);
if
(
o1
!=
luaO_nilobject
&&
o2
!=
luaO_nilobject
)
{
lua_unlock
(
L
);
switch
(
op
)
{
return
i
;
case
LUA_OPEQ
:
i
=
luaV_equalval
(
L
,
o1
,
o2
);
break
;
}
case
LUA_OPLT
:
i
=
luaV_lessthan
(
L
,
o1
,
o2
);
break
;
case
LUA_OPLE
:
i
=
luaV_lessequal
(
L
,
o1
,
o2
);
break
;
default:
api_check
(
L
,
0
);
LUA_API
int
lua_lessthan
(
lua_State
*
L
,
int
index1
,
int
index2
)
{
}
StkId
o1
,
o2
;
}
int
i
;
lua_lock
(
L
);
/* may call tag method */
o1
=
index2adr
(
L
,
index1
);
o2
=
index2adr
(
L
,
index2
);
i
=
(
o1
==
luaO_nilobject
||
o2
==
luaO_nilobject
)
?
0
:
luaV_lessthan
(
L
,
o1
,
o2
);
lua_unlock
(
L
);
lua_unlock
(
L
);
return
i
;
return
i
;
}
}
LUA_API
lua_Number
lua_tonumber
(
lua_State
*
L
,
int
idx
)
{
LUA_API
lua_Number
lua_tonumber
(
lua_State
*
L
,
int
idx
)
{
TValue
n
;
TValue
n
;
const
TValue
*
o
=
index2adr
(
L
,
idx
);
const
TValue
*
o
=
index2adr
(
L
,
idx
);
...
@@ -363,11 +369,10 @@ LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {
...
@@ -363,11 +369,10 @@ LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {
LUA_API
size_t
lua_objlen
(
lua_State
*
L
,
int
idx
)
{
LUA_API
size_t
lua_objlen
(
lua_State
*
L
,
int
idx
)
{
StkId
o
=
index2adr
(
L
,
idx
);
StkId
o
=
index2adr
(
L
,
idx
);
switch
(
tt
ype
(
o
))
{
switch
(
tt
nov
(
o
))
{
case
LUA_TSTRING
:
return
tsvalue
(
o
)
->
len
;
case
LUA_TSTRING
:
return
tsvalue
(
o
)
->
len
;
case
LUA_TUSERDATA
:
return
uvalue
(
o
)
->
len
;
case
LUA_TUSERDATA
:
return
uvalue
(
o
)
->
len
;
case
LUA_TTABLE
:
return
luaH_getn
(
hvalue
(
o
));
case
LUA_TTABLE
:
return
luaH_getn
(
hvalue
(
o
));
case
LUA_TROTABLE
:
return
luaH_getn_ro
(
rvalue
(
o
));
case
LUA_TNUMBER
:
{
case
LUA_TNUMBER
:
{
size_t
l
;
size_t
l
;
lua_lock
(
L
);
/* `luaV_tostring' may create a new string */
lua_lock
(
L
);
/* `luaV_tostring' may create a new string */
...
@@ -405,16 +410,14 @@ LUA_API lua_State *lua_tothread (lua_State *L, int idx) {
...
@@ -405,16 +410,14 @@ LUA_API lua_State *lua_tothread (lua_State *L, int idx) {
LUA_API
const
void
*
lua_topointer
(
lua_State
*
L
,
int
idx
)
{
LUA_API
const
void
*
lua_topointer
(
lua_State
*
L
,
int
idx
)
{
StkId
o
=
index2adr
(
L
,
idx
);
StkId
o
=
index2adr
(
L
,
idx
);
switch
(
ttype
(
o
))
{
switch
(
ttype
(
o
))
{
case
LUA_TTABLE
:
return
hvalue
(
o
);
case
LUA_TTABLE
:
case
LUA_TROTABLE
:
return
hvalue
(
o
);
case
LUA_TFUNCTION
:
return
clvalue
(
o
);
case
LUA_TFUNCTION
:
return
clvalue
(
o
);
case
LUA_TTHREAD
:
return
thvalue
(
o
);
case
LUA_TTHREAD
:
return
thvalue
(
o
);
case
LUA_TUSERDATA
:
case
LUA_TUSERDATA
:
return
lua_touserdata
(
L
,
idx
);
case
LUA_TLIGHTUSERDATA
:
case
LUA_TLIGHTUSERDATA
:
return
pvalue
(
o
);
return
lua_touserdata
(
L
,
idx
);
case
LUA_TLIGHTFUNCTION
:
return
fvalue
(
o
);
case
LUA_TROTABLE
:
return
rvalue
(
o
);
case
LUA_TLIGHTFUNCTION
:
return
fvalue
(
o
);
default:
return
NULL
;
default:
return
NULL
;
}
}
}
}
...
@@ -492,8 +495,12 @@ LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {
...
@@ -492,8 +495,12 @@ LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {
LUA_API
void
lua_pushcclosure
(
lua_State
*
L
,
lua_CFunction
fn
,
int
n
)
{
LUA_API
void
lua_pushcclosure
(
lua_State
*
L
,
lua_CFunction
fn
,
int
n
)
{
Closure
*
cl
;
lua_lock
(
L
);
lua_lock
(
L
);
if
(
n
==
0
)
{
setfvalue
(
L
->
top
,
fn
);
api_incr_top
(
L
);
}
else
{
Closure
*
cl
;
luaC_checkGC
(
L
);
luaC_checkGC
(
L
);
api_checknelems
(
L
,
n
);
api_checknelems
(
L
,
n
);
cl
=
luaF_newCclosure
(
L
,
n
,
getcurrenv
(
L
));
cl
=
luaF_newCclosure
(
L
,
n
,
getcurrenv
(
L
));
...
@@ -504,6 +511,7 @@ LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
...
@@ -504,6 +511,7 @@ LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
setclvalue
(
L
,
L
->
top
,
cl
);
setclvalue
(
L
,
L
->
top
,
cl
);
lua_assert
(
iswhite
(
obj2gco
(
cl
)));
lua_assert
(
iswhite
(
obj2gco
(
cl
)));
api_incr_top
(
L
);
api_incr_top
(
L
);
}
lua_unlock
(
L
);
lua_unlock
(
L
);
}
}
...
@@ -523,16 +531,10 @@ LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {
...
@@ -523,16 +531,10 @@ LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {
lua_unlock
(
L
);
lua_unlock
(
L
);
}
}
LUA_API
void
lua_pushrotable
(
lua_State
*
L
,
void
*
p
)
{
lua_lock
(
L
);
setrvalue
(
L
->
top
,
p
);
api_incr_top
(
L
);
lua_unlock
(
L
);
}
LUA_API
void
lua_push
lightfunction
(
lua_State
*
L
,
void
*
p
)
{
LUA_API
void
lua_push
rotable
(
lua_State
*
L
,
const
ROTable
*
t
)
{
lua_lock
(
L
);
lua_lock
(
L
);
set
f
value
(
L
->
top
,
p
);
set
h
value
(
L
,
L
->
top
,
cast
(
ROTable
*
,
t
)
);
api_incr_top
(
L
);
api_incr_top
(
L
);
lua_unlock
(
L
);
lua_unlock
(
L
);
}
}
...
@@ -553,17 +555,17 @@ LUA_API int lua_pushthread (lua_State *L) {
...
@@ -553,17 +555,17 @@ LUA_API int lua_pushthread (lua_State *L) {
*/
*/
LUA_API
void
lua_gettable
(
lua_State
*
L
,
int
idx
)
{
LUA_API
int
lua_gettable
(
lua_State
*
L
,
int
idx
)
{
StkId
t
;
StkId
t
;
lua_lock
(
L
);
lua_lock
(
L
);
t
=
index2adr
(
L
,
idx
);
t
=
index2adr
(
L
,
idx
);
api_checkvalidindex
(
L
,
t
);
api_checkvalidindex
(
L
,
t
);
luaV_gettable
(
L
,
t
,
L
->
top
-
1
,
L
->
top
-
1
);
luaV_gettable
(
L
,
t
,
L
->
top
-
1
,
L
->
top
-
1
);
lua_unlock
(
L
);
lua_unlock
(
L
);
return
ttnov
(
L
->
top
-
1
);
}
}
LUA_API
int
lua_getfield
(
lua_State
*
L
,
int
idx
,
const
char
*
k
)
{
LUA_API
void
lua_getfield
(
lua_State
*
L
,
int
idx
,
const
char
*
k
)
{
StkId
t
;
StkId
t
;
TValue
key
;
TValue
key
;
lua_lock
(
L
);
lua_lock
(
L
);
...
@@ -575,29 +577,58 @@ LUA_API void lua_getfield (lua_State *L, int idx, const char *k) {
...
@@ -575,29 +577,58 @@ LUA_API void lua_getfield (lua_State *L, int idx, const char *k) {
luaV_gettable
(
L
,
t
,
&
key
,
L
->
top
);
luaV_gettable
(
L
,
t
,
&
key
,
L
->
top
);
api_incr_top
(
L
);
api_incr_top
(
L
);
lua_unlock
(
L
);
lua_unlock
(
L
);
return
ttnov
(
L
->
top
-
1
);
}
}
LUA_API
int
lua_geti
(
lua_State
*
L
,
int
idx
,
int
n
)
{
StkId
t
;
TValue
key
;
lua_lock
(
L
);
t
=
index2adr
(
L
,
idx
);
api_checkvalidindex
(
L
,
t
);
fixedstack
(
L
);
setnvalue
(
&
key
,
n
);
unfixedstack
(
L
);
luaV_gettable
(
L
,
t
,
&
key
,
L
->
top
);
api_incr_top
(
L
);
lua_unlock
(
L
);
return
ttnov
(
L
->
top
-
1
);
}
LUA_API
void
lua_rawget
(
lua_State
*
L
,
int
idx
)
{
LUA_API
int
lua_rawget
(
lua_State
*
L
,
int
idx
)
{
StkId
t
;
StkId
t
;
const
TValue
*
res
;
lua_lock
(
L
);
lua_lock
(
L
);
t
=
index2adr
(
L
,
idx
);
t
=
index2adr
(
L
,
idx
);
api_check
(
L
,
ttistable
(
t
)
||
ttisrotable
(
t
));
api_check
(
L
,
ttistable
(
t
));
res
=
ttistable
(
t
)
?
luaH_get
(
hvalue
(
t
),
L
->
top
-
1
)
:
luaH_get_ro
(
rvalue
(
t
),
L
->
top
-
1
);
setobj2s
(
L
,
L
->
top
-
1
,
luaH_get
(
hvalue
(
t
),
L
->
top
-
1
));
setobj2s
(
L
,
L
->
top
-
1
,
res
);
lua_unlock
(
L
);
lua_unlock
(
L
);
return
ttnov
(
L
->
top
-
1
);
}
}
LUA_API
void
lua_rawgeti
(
lua_State
*
L
,
int
idx
,
int
n
)
{
LUA_API
int
lua_rawgeti
(
lua_State
*
L
,
int
idx
,
int
n
)
{
StkId
o
;
StkId
o
;
lua_lock
(
L
);
lua_lock
(
L
);
o
=
index2adr
(
L
,
idx
);
o
=
index2adr
(
L
,
idx
);
api_check
(
L
,
ttistable
(
o
)
||
ttisrotable
(
o
)
);
api_check
(
L
,
ttistable
(
o
));
setobj2s
(
L
,
L
->
top
,
ttistable
(
o
)
?
luaH_getnum
(
hvalue
(
o
),
n
)
:
luaH_getnum_ro
(
rvalue
(
o
),
n
)
)
setobj2s
(
L
,
L
->
top
,
luaH_getnum
(
hvalue
(
o
),
n
))
;
api_incr_top
(
L
);
api_incr_top
(
L
);
lua_unlock
(
L
);
lua_unlock
(
L
);
return
ttnov
(
L
->
top
-
1
);
}
LUA_API
int
lua_rawgetp
(
lua_State
*
L
,
int
idx
,
const
void
*
p
)
{
StkId
t
;
TValue
k
;
lua_lock
(
L
);
t
=
index2adr
(
L
,
idx
);
api_check
(
L
,
ttistable
(
t
));
setpvalue
(
&
k
,
cast
(
void
*
,
p
));
setobj2s
(
L
,
L
->
top
,
luaH_get
(
hvalue
(
t
),
&
k
));
api_incr_top
(
L
);
lua_unlock
(
L
);
return
ttnov
(
L
->
top
-
1
);
}
}
...
@@ -616,26 +647,20 @@ LUA_API int lua_getmetatable (lua_State *L, int objindex) {
...
@@ -616,26 +647,20 @@ LUA_API int lua_getmetatable (lua_State *L, int objindex) {
int
res
;
int
res
;
lua_lock
(
L
);
lua_lock
(
L
);
obj
=
index2adr
(
L
,
objindex
);
obj
=
index2adr
(
L
,
objindex
);
switch
(
tt
ype
(
obj
))
{
switch
(
tt
nov
(
obj
))
{
case
LUA_TTABLE
:
case
LUA_TTABLE
:
mt
=
hvalue
(
obj
)
->
metatable
;
mt
=
hvalue
(
obj
)
->
metatable
;
break
;
break
;
case
LUA_TUSERDATA
:
case
LUA_TUSERDATA
:
mt
=
uvalue
(
obj
)
->
metatable
;
mt
=
uvalue
(
obj
)
->
metatable
;
break
;
break
;
case
LUA_TROTABLE
:
mt
=
(
Table
*
)
luaR_getmeta
(
rvalue
(
obj
));
break
;
default:
default:
mt
=
G
(
L
)
->
mt
[
tt
ype
(
obj
)];
mt
=
G
(
L
)
->
mt
[
tt
nov
(
obj
)];
break
;
break
;
}
}
if
(
mt
==
NULL
)
if
(
mt
==
NULL
)
res
=
0
;
res
=
0
;
else
{
else
{
if
(
luaR_isrotable
(
mt
))
setrvalue
(
L
->
top
,
mt
)
else
sethvalue
(
L
,
L
->
top
,
mt
)
sethvalue
(
L
,
L
->
top
,
mt
)
api_incr_top
(
L
);
api_incr_top
(
L
);
res
=
1
;
res
=
1
;
...
@@ -730,40 +755,54 @@ LUA_API void lua_rawseti (lua_State *L, int idx, int n) {
...
@@ -730,40 +755,54 @@ LUA_API void lua_rawseti (lua_State *L, int idx, int n) {
}
}
LUA_API
void
lua_rawsetp
(
lua_State
*
L
,
int
idx
,
const
void
*
p
)
{
StkId
o
;
TValue
k
;
lua_lock
(
L
);
api_checknelems
(
L
,
1
);
o
=
index2adr
(
L
,
idx
);
api_check
(
L
,
ttistable
(
o
));
fixedstack
(
L
);
setpvalue
(
&
k
,
cast
(
void
*
,
p
))
setobj2t
(
L
,
luaH_set
(
L
,
hvalue
(
o
),
&
k
),
L
->
top
-
1
);
unfixedstack
(
L
);
luaC_barriert
(
L
,
hvalue
(
o
),
L
->
top
-
1
);
L
->
top
--
;
lua_unlock
(
L
);
}
LUA_API
int
lua_setmetatable
(
lua_State
*
L
,
int
objindex
)
{
LUA_API
int
lua_setmetatable
(
lua_State
*
L
,
int
objindex
)
{
TValue
*
obj
;
TValue
*
obj
;
Table
*
mt
;
Table
*
mt
;
int
isrometa
=
0
;
lua_lock
(
L
);
lua_lock
(
L
);
api_checknelems
(
L
,
1
);
api_checknelems
(
L
,
1
);
obj
=
index2adr
(
L
,
objindex
);
obj
=
index2adr
(
L
,
objindex
);
api_checkvalidindex
(
L
,
obj
);
api_checkvalidindex
(
L
,
obj
);
if
(
ttisnil
(
L
->
top
-
1
))
if
(
ttisnil
(
L
->
top
-
1
))
{
mt
=
NULL
;
mt
=
NULL
;
else
{
}
else
{
api_check
(
L
,
ttistable
(
L
->
top
-
1
)
||
ttisrotable
(
L
->
top
-
1
));
api_check
(
L
,
ttistable
(
L
->
top
-
1
));
if
(
ttistable
(
L
->
top
-
1
))
mt
=
hvalue
(
L
->
top
-
1
);
mt
=
hvalue
(
L
->
top
-
1
);
else
{
mt
=
(
Table
*
)
rvalue
(
L
->
top
-
1
);
isrometa
=
1
;
}
}
}
switch
(
ttype
(
obj
))
{
switch
(
ttype
(
obj
))
{
/* use basetype to retain subtypes*/
case
LUA_TTABLE
:
{
case
LUA_TTABLE
:
{
hvalue
(
obj
)
->
metatable
=
mt
;
hvalue
(
obj
)
->
metatable
=
mt
;
if
(
mt
&&
!
isro
me
ta
)
if
(
mt
&&
!
isrota
ble
(
mt
)
)
luaC_objbarriert
(
L
,
hvalue
(
obj
),
mt
);
luaC_objbarriert
(
L
,
hvalue
(
obj
),
mt
);
break
;
break
;
}
}
case
LUA_TUSERDATA
:
{
case
LUA_TUSERDATA
:
{
uvalue
(
obj
)
->
metatable
=
mt
;
uvalue
(
obj
)
->
metatable
=
mt
;
if
(
mt
&&
!
isro
me
ta
)
if
(
mt
&&
!
isrota
ble
(
mt
)
)
luaC_objbarrier
(
L
,
rawuvalue
(
obj
),
mt
);
luaC_objbarrier
(
L
,
rawuvalue
(
obj
),
mt
);
break
;
break
;
}
}
case
LUA_TISROTABLE
:
{
/* Ignore any changes to a ROTable MT */
break
;
}
default:
{
default:
{
G
(
L
)
->
mt
[
tt
ype
(
obj
)]
=
mt
;
G
(
L
)
->
mt
[
tt
nov
(
obj
)]
=
mt
;
break
;
break
;
}
}
}
}
...
@@ -914,14 +953,14 @@ LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,
...
@@ -914,14 +953,14 @@ LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,
}
}
LUA_API
int
lua_dump
(
lua_State
*
L
,
lua_Writer
writer
,
void
*
data
)
{
LUA_API
int
lua_dump
(
lua_State
*
L
,
lua_Writer
writer
,
void
*
data
,
int
stripping
)
{
int
status
;
int
status
;
TValue
*
o
;
TValue
*
o
;
lua_lock
(
L
);
lua_lock
(
L
);
api_checknelems
(
L
,
1
);
api_checknelems
(
L
,
1
);
o
=
L
->
top
-
1
;
o
=
L
->
top
-
1
;
if
(
isLfunction
(
o
))
if
(
isLfunction
(
o
))
status
=
luaU_dump
(
L
,
clvalue
(
o
)
->
l
.
p
,
writer
,
data
,
0
);
status
=
luaU_dump
(
L
,
clvalue
(
o
)
->
l
.
p
,
writer
,
data
,
stripping
);
else
else
status
=
1
;
status
=
1
;
lua_unlock
(
L
);
lua_unlock
(
L
);
...
@@ -929,6 +968,30 @@ LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) {
...
@@ -929,6 +968,30 @@ LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) {
}
}
LUA_API
int
lua_stripdebug
(
lua_State
*
L
,
int
stripping
){
TValue
*
o
=
L
->
top
-
1
;
Proto
*
p
=
NULL
;
int
res
=
-
1
;
lua_lock
(
L
);
api_checknelems
(
L
,
1
);
if
(
isLfunction
(
o
))
{
p
=
clvalue
(
o
)
->
l
.
p
;
if
(
p
&&
!
isLFSobject
(
p
)
&&
(
unsigned
)
stripping
<
3
)
{
// found a valid proto to strip
res
=
luaG_stripdebug
(
L
,
p
,
stripping
,
1
);
}
}
else
if
(
ttisnil
(
L
->
top
-
1
))
{
// get or set the default strip level
if
((
unsigned
)
stripping
<
3
)
G
(
L
)
->
stripdefault
=
stripping
;
res
=
G
(
L
)
->
stripdefault
;
}
L
->
top
--
;
lua_unlock
(
L
);
return
res
;
}
LUA_API
int
lua_status
(
lua_State
*
L
)
{
LUA_API
int
lua_status
(
lua_State
*
L
)
{
return
L
->
status
;
return
L
->
status
;
}
}
...
@@ -1039,8 +1102,8 @@ LUA_API int lua_next (lua_State *L, int idx) {
...
@@ -1039,8 +1102,8 @@ LUA_API int lua_next (lua_State *L, int idx) {
int
more
;
int
more
;
lua_lock
(
L
);
lua_lock
(
L
);
t
=
index2adr
(
L
,
idx
);
t
=
index2adr
(
L
,
idx
);
api_check
(
L
,
ttistable
(
t
)
||
ttisrotable
(
t
)
);
api_check
(
L
,
ttistable
(
t
));
more
=
ttistable
(
t
)
?
luaH_next
(
L
,
hvalue
(
t
),
L
->
top
-
1
)
:
luaH_next_ro
(
L
,
r
value
(
t
),
L
->
top
-
1
);
more
=
luaH_next
(
L
,
h
value
(
t
),
L
->
top
-
1
);
if
(
more
)
{
if
(
more
)
{
api_incr_top
(
L
);
api_incr_top
(
L
);
}
}
...
@@ -1149,3 +1212,15 @@ LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
...
@@ -1149,3 +1212,15 @@ LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
return
name
;
return
name
;
}
}
LUA_API
void
lua_setegcmode
(
lua_State
*
L
,
int
mode
,
int
limit
)
{
G
(
L
)
->
egcmode
=
mode
;
G
(
L
)
->
memlimit
=
limit
;
}
LUA_API
void
lua_getegcinfo
(
lua_State
*
L
,
int
*
totals
)
{
if
(
totals
)
{
totals
[
0
]
=
G
(
L
)
->
totalbytes
;
totals
[
1
]
=
G
(
L
)
->
estimate
;
}
}
components/lua/lapi.h
→
components/lua/
lua-5.1/
lapi.h
View file @
dba57fa0
File moved
components/lua/lauxlib.c
→
components/lua/
lua-5.1/
lauxlib.c
View file @
dba57fa0
...
@@ -4,20 +4,16 @@
...
@@ -4,20 +4,16 @@
** See Copyright Notice in lua.h
** See Copyright Notice in lua.h
*/
*/
#define LUAC_CROSS_FILE
#include "lua.h"
#include "lua.h"
#include <ctype.h>
#include <ctype.h>
#include <errno.h>
#include <errno.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <fcntl.h>
#ifndef LUA_CROSS_COMPILER
#ifndef LUA_CROSS_COMPILER
#include "esp_system.h"
#include "esp_system.h"
#include "vfs.h"
#include "vfs.h"
/* defined in esp_system_internal.h */
void
esp_reset_reason_set_hint
(
esp_reset_reason_t
hint
);
#else
#endif
#endif
/* This file uses only the official API of Lua.
/* This file uses only the official API of Lua.
...
@@ -27,14 +23,14 @@ void esp_reset_reason_set_hint(esp_reset_reason_t hint);
...
@@ -27,14 +23,14 @@ void esp_reset_reason_set_hint(esp_reset_reason_t hint);
#define lauxlib_c
#define lauxlib_c
#define LUA_LIB
#define LUA_LIB
#include "l
rotable
.h"
#include "l
nodemcu
.h"
#include "lauxlib.h"
#include "lauxlib.h"
#include "lgc.h"
#include "lgc.h"
#include "ldo.h"
#include "ldo.h"
#include "lobject.h"
#include "lobject.h"
#include "lstate.h"
#include "lstate.h"
#include "l
eg
c.h"
#include "l
pani
c.h"
#define FREELIST_REF 0
/* free list of references */
#define FREELIST_REF 0
/* free list of references */
...
@@ -277,7 +273,7 @@ LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) {
...
@@ -277,7 +273,7 @@ LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) {
return
1
;
return
1
;
}
}
LUALIB_API
int
luaL_rometatable
(
lua_State
*
L
,
const
char
*
tname
,
void
*
p
)
{
LUALIB_API
int
luaL_rometatable
(
lua_State
*
L
,
const
char
*
tname
,
const
ROTable
*
p
)
{
lua_getfield
(
L
,
LUA_REGISTRYINDEX
,
tname
);
/* get registry.name */
lua_getfield
(
L
,
LUA_REGISTRYINDEX
,
tname
);
/* get registry.name */
if
(
!
lua_isnil
(
L
,
-
1
))
/* name already in use? */
if
(
!
lua_isnil
(
L
,
-
1
))
/* name already in use? */
return
0
;
/* leave previous value on top, but return 0 */
return
0
;
/* leave previous value on top, but return 0 */
...
@@ -288,21 +284,25 @@ LUALIB_API int luaL_rometatable (lua_State *L, const char* tname, void *p) {
...
@@ -288,21 +284,25 @@ LUALIB_API int luaL_rometatable (lua_State *L, const char* tname, void *p) {
return
1
;
return
1
;
}
}
LUALIB_API
void
*
luaL_
check
udata
(
lua_State
*
L
,
int
ud
,
const
char
*
tname
)
{
LUALIB_API
void
*
luaL_
test
udata
(
lua_State
*
L
,
int
ud
,
const
char
*
tname
)
{
void
*
p
=
lua_touserdata
(
L
,
ud
);
void
*
p
=
lua_touserdata
(
L
,
ud
);
if
(
p
!=
NULL
)
{
/* value is a userdata? */
if
(
p
!=
NULL
)
{
/* value is a userdata? */
if
(
lua_getmetatable
(
L
,
ud
))
{
/* does it have a metatable? */
if
(
lua_getmetatable
(
L
,
ud
))
{
/* does it have a metatable? */
lua_getfield
(
L
,
LUA_REGISTRYINDEX
,
tname
);
/* get correct metatable */
lua_getfield
(
L
,
LUA_REGISTRYINDEX
,
tname
);
/* get correct metatable */
if
(
lua_rawequal
(
L
,
-
1
,
-
2
))
{
/* does it have the correct mt? */
if
(
!
lua_rawequal
(
L
,
-
1
,
-
2
))
/* not the same? */
p
=
NULL
;
/* value is a userdata with wrong metatable */
lua_pop
(
L
,
2
);
/* remove both metatables */
lua_pop
(
L
,
2
);
/* remove both metatables */
return
p
;
return
p
;
}
}
}
}
}
return
NULL
;
/* value is not a userdata with a metatable */
luaL_typerror
(
L
,
ud
,
tname
);
/* else error */
return
NULL
;
/* to avoid warnings */
}
}
LUALIB_API
void
*
luaL_checkudata
(
lua_State
*
L
,
int
ud
,
const
char
*
tname
)
{
void
*
p
=
luaL_testudata
(
L
,
ud
,
tname
);
if
(
p
==
NULL
)
luaL_typerror
(
L
,
ud
,
tname
);
return
p
;
}
LUALIB_API
void
luaL_checkstack
(
lua_State
*
L
,
int
space
,
const
char
*
mes
)
{
LUALIB_API
void
luaL_checkstack
(
lua_State
*
L
,
int
space
,
const
char
*
mes
)
{
if
(
!
lua_checkstack
(
L
,
space
))
if
(
!
lua_checkstack
(
L
,
space
))
...
@@ -315,22 +315,6 @@ LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) {
...
@@ -315,22 +315,6 @@ LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) {
tag_error
(
L
,
narg
,
t
);
tag_error
(
L
,
narg
,
t
);
}
}
LUALIB_API
void
luaL_checkanyfunction
(
lua_State
*
L
,
int
narg
)
{
if
(
lua_type
(
L
,
narg
)
!=
LUA_TFUNCTION
&&
lua_type
(
L
,
narg
)
!=
LUA_TLIGHTFUNCTION
)
{
const
char
*
msg
=
lua_pushfstring
(
L
,
"function or lightfunction expected, got %s"
,
luaL_typename
(
L
,
narg
));
luaL_argerror
(
L
,
narg
,
msg
);
}
}
LUALIB_API
void
luaL_checkanytable
(
lua_State
*
L
,
int
narg
)
{
if
(
lua_type
(
L
,
narg
)
!=
LUA_TTABLE
&&
lua_type
(
L
,
narg
)
!=
LUA_TROTABLE
)
{
const
char
*
msg
=
lua_pushfstring
(
L
,
"table or rotable expected, got %s"
,
luaL_typename
(
L
,
narg
));
luaL_argerror
(
L
,
narg
,
msg
);
}
}
LUALIB_API
void
luaL_checkany
(
lua_State
*
L
,
int
narg
)
{
LUALIB_API
void
luaL_checkany
(
lua_State
*
L
,
int
narg
)
{
if
(
lua_type
(
L
,
narg
)
==
LUA_TNONE
)
if
(
lua_type
(
L
,
narg
)
==
LUA_TNONE
)
...
@@ -449,7 +433,7 @@ LUALIB_API void luaI_openlib (lua_State *L, const char *libname,
...
@@ -449,7 +433,7 @@ LUALIB_API void luaI_openlib (lua_State *L, const char *libname,
for
(
i
=
0
;
i
<
nup
;
i
++
)
/* copy upvalues to the top */
for
(
i
=
0
;
i
<
nup
;
i
++
)
/* copy upvalues to the top */
lua_pushvalue
(
L
,
-
nup
);
lua_pushvalue
(
L
,
-
nup
);
if
(
ftype
==
LUA_USELIGHTFUNCTIONS
)
if
(
ftype
==
LUA_USELIGHTFUNCTIONS
)
lua_push
light
function
(
L
,
l
->
func
);
lua_push
c
function
(
L
,
l
->
func
);
else
else
lua_pushcclosure
(
L
,
l
->
func
,
nup
);
lua_pushcclosure
(
L
,
l
->
func
,
nup
);
lua_setfield
(
L
,
-
(
nup
+
2
),
l
->
name
);
lua_setfield
(
L
,
-
(
nup
+
2
),
l
->
name
);
...
@@ -561,7 +545,7 @@ LUALIB_API const char *luaL_findtable (lua_State *L, int idx,
...
@@ -561,7 +545,7 @@ LUALIB_API const char *luaL_findtable (lua_State *L, int idx,
lua_pushvalue
(
L
,
-
2
);
lua_pushvalue
(
L
,
-
2
);
lua_settable
(
L
,
-
4
);
/* set new table into field */
lua_settable
(
L
,
-
4
);
/* set new table into field */
}
}
else
if
(
!
lua_istable
(
L
,
-
1
)
&&
!
lua_isrotable
(
L
,
-
1
))
{
/* field has a non-table value? */
else
if
(
!
lua_istable
(
L
,
-
1
))
{
/* field has a non-table value? */
lua_pop
(
L
,
2
);
/* remove table and value */
lua_pop
(
L
,
2
);
/* remove table and value */
return
fname
;
/* return problematic part of the name */
return
fname
;
/* return problematic part of the name */
}
}
...
@@ -703,6 +687,26 @@ LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {
...
@@ -703,6 +687,26 @@ LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {
}
}
LUALIB_API
void
(
luaL_reref
)
(
lua_State
*
L
,
int
t
,
int
*
ref
)
{
int
reft
;
/*
* If the ref is positive and the entry in table t exists then
* overwrite the value otherwise fall through to luaL_ref()
*/
if
(
ref
)
{
if
(
*
ref
>=
0
)
{
t
=
abs_index
(
L
,
t
);
lua_rawgeti
(
L
,
t
,
*
ref
);
reft
=
lua_type
(
L
,
-
1
);
lua_pop
(
L
,
1
);
if
(
reft
!=
LUA_TNIL
)
{
lua_rawseti
(
L
,
t
,
*
ref
);
return
;
}
}
*
ref
=
luaL_ref
(
L
,
t
);
}
}
/*
/*
** {======================================================
** {======================================================
...
@@ -710,14 +714,33 @@ LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {
...
@@ -710,14 +714,33 @@ LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {
** =======================================================
** =======================================================
*/
*/
#ifdef LUA_CROSS_COMPILER
typedef
struct
LoadF
{
typedef
struct
LoadF
{
int
extraline
;
int
extraline
;
#ifdef LUA_CROSS_COMPILER
FILE
*
f
;
FILE
*
f
;
#else
int
f
;
#endif
char
buff
[
LUAL_BUFFERSIZE
];
char
buff
[
LUAL_BUFFERSIZE
];
}
LoadF
;
}
LoadF
;
#ifdef LUA_CROSS_COMPILER
# define freopen_bin(f,fn) freopen(f,"rb",fn)
# define read_buff(b,f) fread(b, 1, sizeof (b), f)
#else
# define strerror(n) ""
#undef feof
# define feof(f) vfs_eof(f)
#undef fopen
# define fopen(f, m) vfs_open(f, m)
# define freopen_bin(fn,f) ((void) vfs_close(f), vfs_open(fn, "r"))
#undef getc
# define getc(f) vfs_getc(f)
#undef ungetc
# define ungetc(c,f) vfs_ungetc(c, f)
# define read_buff(b,f) vfs_read(f, b, sizeof (b))
#endif
static
const
char
*
getF
(
lua_State
*
L
,
void
*
ud
,
size_t
*
size
)
{
static
const
char
*
getF
(
lua_State
*
L
,
void
*
ud
,
size_t
*
size
)
{
LoadF
*
lf
=
(
LoadF
*
)
ud
;
LoadF
*
lf
=
(
LoadF
*
)
ud
;
...
@@ -728,7 +751,7 @@ static const char *getF (lua_State *L, void *ud, size_t *size) {
...
@@ -728,7 +751,7 @@ static const char *getF (lua_State *L, void *ud, size_t *size) {
return
"
\n
"
;
return
"
\n
"
;
}
}
if
(
feof
(
lf
->
f
))
return
NULL
;
if
(
feof
(
lf
->
f
))
return
NULL
;
*
size
=
f
read
(
lf
->
buff
,
1
,
sizeo
f
(
lf
->
buff
)
,
lf
->
f
);
*
size
=
read
_buf
f
(
lf
->
buff
,
lf
->
f
);
return
(
*
size
>
0
)
?
lf
->
buff
:
NULL
;
return
(
*
size
>
0
)
?
lf
->
buff
:
NULL
;
}
}
...
@@ -748,14 +771,19 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
...
@@ -748,14 +771,19 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
int
c
;
int
c
;
int
fnameindex
=
lua_gettop
(
L
)
+
1
;
/* index of filename on the stack */
int
fnameindex
=
lua_gettop
(
L
)
+
1
;
/* index of filename on the stack */
lf
.
extraline
=
0
;
lf
.
extraline
=
0
;
if
(
filename
==
NULL
)
{
if
(
filename
==
NULL
)
{
#ifdef LUA_CROSS_COMPILER
lua_pushliteral
(
L
,
"=stdin"
);
lua_pushliteral
(
L
,
"=stdin"
);
lf
.
f
=
stdin
;
lf
.
f
=
stdin
;
#else
return
luaL_error
(
L
,
"filename is NULL"
);
#endif
}
}
else
{
else
{
lua_pushfstring
(
L
,
"@%s"
,
filename
);
lua_pushfstring
(
L
,
"@%s"
,
filename
);
lf
.
f
=
fopen
(
filename
,
"r"
);
lf
.
f
=
fopen
(
filename
,
"r"
);
if
(
lf
.
f
==
NULL
)
return
errfile
(
L
,
"open"
,
fnameindex
);
if
(
!
lf
.
f
)
return
errfile
(
L
,
"open"
,
fnameindex
);
}
}
c
=
getc
(
lf
.
f
);
c
=
getc
(
lf
.
f
);
if
(
c
==
'#'
)
{
/* Unix exec. file? */
if
(
c
==
'#'
)
{
/* Unix exec. file? */
...
@@ -764,8 +792,8 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
...
@@ -764,8 +792,8 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
if
(
c
==
'\n'
)
c
=
getc
(
lf
.
f
);
if
(
c
==
'\n'
)
c
=
getc
(
lf
.
f
);
}
}
if
(
c
==
LUA_SIGNATURE
[
0
]
&&
filename
)
{
/* binary file? */
if
(
c
==
LUA_SIGNATURE
[
0
]
&&
filename
)
{
/* binary file? */
lf
.
f
=
freopen
(
filename
,
"rb"
,
lf
.
f
);
/* reopen in binary mode */
lf
.
f
=
freopen
_bin
(
filename
,
lf
.
f
);
/* reopen in binary mode */
if
(
lf
.
f
==
NULL
)
return
errfile
(
L
,
"reopen"
,
fnameindex
);
if
(
!
lf
.
f
)
return
errfile
(
L
,
"reopen"
,
fnameindex
);
/* skip eventual `#!...' */
/* skip eventual `#!...' */
while
((
c
=
getc
(
lf
.
f
))
!=
EOF
&&
c
!=
LUA_SIGNATURE
[
0
])
{}
while
((
c
=
getc
(
lf
.
f
))
!=
EOF
&&
c
!=
LUA_SIGNATURE
[
0
])
{}
...
@@ -773,95 +801,21 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
...
@@ -773,95 +801,21 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
}
}
ungetc
(
c
,
lf
.
f
);
ungetc
(
c
,
lf
.
f
);
status
=
lua_load
(
L
,
getF
,
&
lf
,
lua_tostring
(
L
,
-
1
));
status
=
lua_load
(
L
,
getF
,
&
lf
,
lua_tostring
(
L
,
-
1
));
#ifdef LUA_CROSS_COMPILER
readstatus
=
ferror
(
lf
.
f
);
readstatus
=
ferror
(
lf
.
f
);
if
(
filename
)
fclose
(
lf
.
f
);
/* close file (even in case of errors) */
if
(
filename
)
fclose
(
lf
.
f
);
/* close file (even in case of errors) */
if
(
readstatus
)
{
if
(
readstatus
)
{
lua_settop
(
L
,
fnameindex
);
/* ignore results from `lua_load' */
lua_settop
(
L
,
fnameindex
);
/* ignore results from `lua_load' */
return
errfile
(
L
,
"read"
,
fnameindex
);
return
errfile
(
L
,
"read"
,
fnameindex
);
}
}
lua_remove
(
L
,
fnameindex
);
return
status
;
}
#else
#else
(
void
)
readstatus
;
#include <fcntl.h>
typedef
struct
LoadFSF
{
int
extraline
;
int
f
;
char
buff
[
LUAL_BUFFERSIZE
];
}
LoadFSF
;
static
const
char
*
getFSF
(
lua_State
*
L
,
void
*
ud
,
size_t
*
size
)
{
LoadFSF
*
lf
=
(
LoadFSF
*
)
ud
;
(
void
)
L
;
if
(
L
==
NULL
&&
size
==
NULL
)
// Direct mode check
return
NULL
;
if
(
lf
->
extraline
)
{
lf
->
extraline
=
0
;
*
size
=
1
;
return
"
\n
"
;
}
if
(
vfs_eof
(
lf
->
f
))
return
NULL
;
*
size
=
vfs_read
(
lf
->
f
,
lf
->
buff
,
sizeof
(
lf
->
buff
));
return
(
*
size
>
0
)
?
lf
->
buff
:
NULL
;
}
static
int
errfsfile
(
lua_State
*
L
,
const
char
*
what
,
int
fnameindex
)
{
const
char
*
filename
=
lua_tostring
(
L
,
fnameindex
)
+
1
;
lua_pushfstring
(
L
,
"cannot %s %s"
,
what
,
filename
);
lua_remove
(
L
,
fnameindex
);
return
LUA_ERRFILE
;
}
LUALIB_API
int
luaL_loadfsfile
(
lua_State
*
L
,
const
char
*
filename
)
{
LoadFSF
lf
;
int
status
;
int
c
;
int
fnameindex
=
lua_gettop
(
L
)
+
1
;
/* index of filename on the stack */
lf
.
extraline
=
0
;
if
(
filename
==
NULL
)
{
return
luaL_error
(
L
,
"filename is NULL"
);
}
else
{
lua_pushfstring
(
L
,
"@%s"
,
filename
);
lf
.
f
=
vfs_open
(
filename
,
"r"
);
if
(
!
lf
.
f
)
return
errfsfile
(
L
,
"open"
,
fnameindex
);
}
// if(fs_size(lf.f)>LUAL_BUFFERSIZE)
// return luaL_error(L, "file is too big");
c
=
vfs_getc
(
lf
.
f
);
if
(
c
==
'#'
)
{
/* Unix exec. file? */
lf
.
extraline
=
1
;
while
((
c
=
vfs_getc
(
lf
.
f
))
!=
VFS_EOF
&&
c
!=
'\n'
)
;
/* skip first line */
if
(
c
==
'\n'
)
c
=
vfs_getc
(
lf
.
f
);
}
if
(
c
==
LUA_SIGNATURE
[
0
]
&&
filename
)
{
/* binary file? */
vfs_close
(
lf
.
f
);
lf
.
f
=
vfs_open
(
filename
,
"r"
);
/* reopen in binary mode */
if
(
!
lf
.
f
)
return
errfsfile
(
L
,
"reopen"
,
fnameindex
);
/* skip eventual `#!...' */
while
((
c
=
vfs_getc
(
lf
.
f
))
!=
VFS_EOF
&&
c
!=
LUA_SIGNATURE
[
0
])
;
lf
.
extraline
=
0
;
}
vfs_ungetc
(
c
,
lf
.
f
);
status
=
lua_load
(
L
,
getFSF
,
&
lf
,
lua_tostring
(
L
,
-
1
));
if
(
filename
)
vfs_close
(
lf
.
f
);
/* close file (even in case of errors) */
if
(
filename
)
vfs_close
(
lf
.
f
);
/* close file (even in case of errors) */
#endif
lua_remove
(
L
,
fnameindex
);
lua_remove
(
L
,
fnameindex
);
return
status
;
return
status
;
}
}
#endif
typedef
struct
LoadS
{
typedef
struct
LoadS
{
const
char
*
s
;
const
char
*
s
;
...
@@ -959,56 +913,11 @@ LUALIB_API void luaL_assertfail(const char *file, int line, const char *message)
...
@@ -959,56 +913,11 @@ LUALIB_API void luaL_assertfail(const char *file, int line, const char *message)
#endif
#endif
}
}
#ifndef LUA_CROSS_COMPILER
/*
* upper 28 bit have magic value 0xD1EC0DE0
* if paniclevel is valid (i.e. matches magic value)
* lower 4 bits have paniclevel:
* 0 = no panic occurred
* 1..15 = one..fifteen subsequent panic(s) occurred
*/
static
__NOINIT_ATTR
uint32_t
l_rtc_panic_val
;
int
panic_get_nvval
()
{
if
((
l_rtc_panic_val
&
0xfffffff0
)
==
0xD1EC0DE0
)
{
return
(
l_rtc_panic_val
&
0xf
);
}
panic_clear_nvval
();
return
0
;
}
void
panic_clear_nvval
()
{
l_rtc_panic_val
=
0xD1EC0DE0
;
}
#endif
static
int
panic
(
lua_State
*
L
)
{
(
void
)
L
;
/* to avoid warnings */
#ifndef LUA_CROSS_COMPILER
uint8_t
paniclevel
=
panic_get_nvval
();
if
(
paniclevel
<
15
)
paniclevel
++
;
l_rtc_panic_val
=
0xD1EC0DE0
|
paniclevel
;
#endif
#if defined(LUA_USE_STDIO)
fprintf
(
stderr
,
"PANIC: unprotected error in call to Lua API (%s)
\n
"
,
lua_tostring
(
L
,
-
1
));
#else
luai_writestringerror
(
"PANIC: unprotected error in call to Lua API (%s)
\n
"
,
lua_tostring
(
L
,
-
1
));
#endif
#ifndef LUA_CROSS_COMPILER
/* call abort() directly - we don't want another reset cause to intervene */
esp_reset_reason_set_hint
(
ESP_RST_PANIC
);
abort
();
#endif
while
(
1
)
{}
return
0
;
}
LUALIB_API
lua_State
*
luaL_newstate
(
void
)
{
LUALIB_API
lua_State
*
luaL_newstate
(
void
)
{
lua_State
*
L
=
lua_newstate
(
l_alloc
,
NULL
);
lua_State
*
L
=
lua_newstate
(
l_alloc
,
NULL
);
lua_setallocf
(
L
,
l_alloc
,
L
);
/* allocator need lua_State. */
lua_setallocf
(
L
,
l_alloc
,
L
);
/* allocator need lua_State. */
if
(
L
)
lua_atpanic
(
L
,
&
panic
);
if
(
L
)
lua_atpanic
(
L
,
l
panic
);
return
L
;
return
L
;
}
}
components/lua/lauxlib.h
→
components/lua/
lua-5.1/
lauxlib.h
View file @
dba57fa0
...
@@ -8,12 +8,13 @@
...
@@ -8,12 +8,13 @@
#ifndef lauxlib_h
#ifndef lauxlib_h
#define lauxlib_h
#define lauxlib_h
#include "lua.h"
#include "lua.h"
#ifdef LUA_LIB
#include "lnodemcu.h"
#endif
#include <stdio.h>
#include <stdio.h>
#if defined(LUA_COMPAT_GETN)
#if defined(LUA_COMPAT_GETN)
LUALIB_API
int
(
luaL_getn
)
(
lua_State
*
L
,
int
t
);
LUALIB_API
int
(
luaL_getn
)
(
lua_State
*
L
,
int
t
);
LUALIB_API
void
(
luaL_setn
)
(
lua_State
*
L
,
int
t
,
int
n
);
LUALIB_API
void
(
luaL_setn
)
(
lua_State
*
L
,
int
t
,
int
n
);
...
@@ -62,11 +63,10 @@ LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,
...
@@ -62,11 +63,10 @@ LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,
LUALIB_API
void
(
luaL_checkstack
)
(
lua_State
*
L
,
int
sz
,
const
char
*
msg
);
LUALIB_API
void
(
luaL_checkstack
)
(
lua_State
*
L
,
int
sz
,
const
char
*
msg
);
LUALIB_API
void
(
luaL_checktype
)
(
lua_State
*
L
,
int
narg
,
int
t
);
LUALIB_API
void
(
luaL_checktype
)
(
lua_State
*
L
,
int
narg
,
int
t
);
LUALIB_API
void
(
luaL_checkany
)
(
lua_State
*
L
,
int
narg
);
LUALIB_API
void
(
luaL_checkany
)
(
lua_State
*
L
,
int
narg
);
LUALIB_API
void
(
luaL_checkanyfunction
)
(
lua_State
*
L
,
int
narg
);
LUALIB_API
void
(
luaL_checkanytable
)
(
lua_State
*
L
,
int
narg
);
LUALIB_API
int
(
luaL_newmetatable
)
(
lua_State
*
L
,
const
char
*
tname
);
LUALIB_API
int
(
luaL_newmetatable
)
(
lua_State
*
L
,
const
char
*
tname
);
LUALIB_API
int
(
luaL_rometatable
)
(
lua_State
*
L
,
const
char
*
tname
,
void
*
p
);
LUALIB_API
int
(
luaL_rometatable
)
(
lua_State
*
L
,
const
char
*
tname
,
const
ROTable
*
p
);
LUALIB_API
void
*
(
luaL_testudata
)
(
lua_State
*
L
,
int
ud
,
const
char
*
tname
);
LUALIB_API
void
*
(
luaL_checkudata
)
(
lua_State
*
L
,
int
ud
,
const
char
*
tname
);
LUALIB_API
void
*
(
luaL_checkudata
)
(
lua_State
*
L
,
int
ud
,
const
char
*
tname
);
LUALIB_API
void
(
luaL_where
)
(
lua_State
*
L
,
int
lvl
);
LUALIB_API
void
(
luaL_where
)
(
lua_State
*
L
,
int
lvl
);
...
@@ -77,12 +77,11 @@ LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,
...
@@ -77,12 +77,11 @@ LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,
LUALIB_API
int
(
luaL_ref
)
(
lua_State
*
L
,
int
t
);
LUALIB_API
int
(
luaL_ref
)
(
lua_State
*
L
,
int
t
);
LUALIB_API
void
(
luaL_unref
)
(
lua_State
*
L
,
int
t
,
int
ref
);
LUALIB_API
void
(
luaL_unref
)
(
lua_State
*
L
,
int
t
,
int
ref
);
#define luaL_unref2(l,t,r) do {luaL_unref(L, (t), (r)); r = LUA_NOREF;} while (0)
LUALIB_API
void
(
luaL_reref
)
(
lua_State
*
L
,
int
t
,
int
*
ref
);
#ifdef LUA_CROSS_COMPILER
LUALIB_API
int
(
luaL_loadfile
)
(
lua_State
*
L
,
const
char
*
filename
);
LUALIB_API
int
(
luaL_loadfile
)
(
lua_State
*
L
,
const
char
*
filename
);
#else
LUALIB_API
int
(
luaL_loadfsfile
)
(
lua_State
*
L
,
const
char
*
filename
);
#endif
LUALIB_API
int
(
luaL_loadbuffer
)
(
lua_State
*
L
,
const
char
*
buff
,
size_t
sz
,
LUALIB_API
int
(
luaL_loadbuffer
)
(
lua_State
*
L
,
const
char
*
buff
,
size_t
sz
,
const
char
*
name
);
const
char
*
name
);
LUALIB_API
int
(
luaL_loadstring
)
(
lua_State
*
L
,
const
char
*
s
);
LUALIB_API
int
(
luaL_loadstring
)
(
lua_State
*
L
,
const
char
*
s
);
...
@@ -112,7 +111,12 @@ LUALIB_API void luaL_assertfail(const char *file, int line, const char *message)
...
@@ -112,7 +111,12 @@ LUALIB_API void luaL_assertfail(const char *file, int line, const char *message)
#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n)))
#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n)))
#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d)))
#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d)))
#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n)))
#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n)))
#define luaL_checkunsigned(L,a) ((lua_Unsigned)luaL_checkinteger(L,a))
#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d)))
#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d)))
#define luaL_optunsigned(L,a,d) ((lua_Unsigned)luaL_optinteger(L,a,(lua_Integer)(d)))
#define luaL_checktable(L,n) luaL_checktype(L, (n), LUA_TTABLE);
#define luaL_checkfunction(L,n) luaL_checktype(L, (n), LUA_TFUNCTION);
#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i)))
#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i)))
...
@@ -121,7 +125,7 @@ LUALIB_API void luaL_assertfail(const char *file, int line, const char *message)
...
@@ -121,7 +125,7 @@ LUALIB_API void luaL_assertfail(const char *file, int line, const char *message)
(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
#else
#else
#define luaL_dofile(L, fn) \
#define luaL_dofile(L, fn) \
(luaL_loadf
sf
ile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
#endif
#endif
#define luaL_dostring(L, s) \
#define luaL_dostring(L, s) \
...
@@ -165,6 +169,18 @@ LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
...
@@ -165,6 +169,18 @@ LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
/* }====================================================== */
/* }====================================================== */
LUALIB_API
int
(
luaL_pushlfsmodules
)
(
lua_State
*
L
);
LUALIB_API
int
(
luaL_pushlfsmodule
)
(
lua_State
*
L
);
LUALIB_API
int
(
luaL_pushlfsdts
)
(
lua_State
*
L
);
LUALIB_API
void
(
luaL_lfsreload
)
(
lua_State
*
L
);
LUALIB_API
int
(
luaL_pcallx
)
(
lua_State
*
L
,
int
narg
,
int
nres
);
LUALIB_API
int
(
luaL_posttask
)
(
lua_State
*
L
,
int
prio
);
#define LUA_TASK_LOW 0
#define LUA_TASK_MEDIUM 1
#define LUA_TASK_HIGH 2
/* }====================================================== */
/* compatibility with ref system */
/* compatibility with ref system */
...
@@ -184,7 +200,3 @@ LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
...
@@ -184,7 +200,3 @@ LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
#endif
#endif
#ifndef LUA_CROSS_COMPILER
int
panic_get_nvval
();
void
panic_clear_nvval
();
#endif
components/lua/lbaselib.c
→
components/lua/
lua-5.1/
lbaselib.c
View file @
dba57fa0
...
@@ -8,17 +8,14 @@
...
@@ -8,17 +8,14 @@
#define lbaselib_c
#define lbaselib_c
#define LUA_LIB
#define LUA_LIB
#define LUAC_CROSS_FILE
#include "lua.h"
#include "lua.h"
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>
#include "lauxlib.h"
#include "lauxlib.h"
#include "lualib.h"
#include "lualib.h"
#include "lrotable.h"
/*
/*
...
@@ -27,6 +24,10 @@
...
@@ -27,6 +24,10 @@
** model but changing `fputs' to put the strings at a proper place
** model but changing `fputs' to put the strings at a proper place
** (a console window or a log file, for instance).
** (a console window or a log file, for instance).
*/
*/
#ifdef LUA_CROSS_COMPILER
#undef puts
#define puts(s) printf("%s",s)
#endif
static
int
luaB_print
(
lua_State
*
L
)
{
static
int
luaB_print
(
lua_State
*
L
)
{
int
n
=
lua_gettop
(
L
);
/* number of arguments */
int
n
=
lua_gettop
(
L
);
/* number of arguments */
int
i
;
int
i
;
...
@@ -40,20 +41,11 @@ static int luaB_print (lua_State *L) {
...
@@ -40,20 +41,11 @@ static int luaB_print (lua_State *L) {
if
(
s
==
NULL
)
if
(
s
==
NULL
)
return
luaL_error
(
L
,
LUA_QL
(
"tostring"
)
" must return a string to "
return
luaL_error
(
L
,
LUA_QL
(
"tostring"
)
" must return a string to "
LUA_QL
(
"print"
));
LUA_QL
(
"print"
));
#if defined(LUA_USE_STDIO)
if
(
i
>
1
)
puts
(
"
\t
"
);
if
(
i
>
1
)
fputs
(
"
\t
"
,
stdout
);
puts
(
s
);
fputs
(
s
,
stdout
);
#else
if
(
i
>
1
)
luai_writestring
(
"
\t
"
,
1
);
luai_writestring
(
s
,
strlen
(
s
));
#endif
lua_pop
(
L
,
1
);
/* pop result */
lua_pop
(
L
,
1
);
/* pop result */
}
}
#if defined(LUA_USE_STDIO)
puts
(
"
\n
"
);
fputs
(
"
\n
"
,
stdout
);
#else
luai_writeline
();
#endif
return
0
;
return
0
;
}
}
...
@@ -112,7 +104,7 @@ static int luaB_getmetatable (lua_State *L) {
...
@@ -112,7 +104,7 @@ static int luaB_getmetatable (lua_State *L) {
static
int
luaB_setmetatable
(
lua_State
*
L
)
{
static
int
luaB_setmetatable
(
lua_State
*
L
)
{
int
t
=
lua_type
(
L
,
2
);
int
t
=
lua_type
(
L
,
2
);
luaL_checktype
(
L
,
1
,
LUA_TTABLE
);
luaL_checktype
(
L
,
1
,
LUA_TTABLE
);
luaL_argcheck
(
L
,
t
==
LUA_TNIL
||
t
==
LUA_TTABLE
||
t
==
LUA_TROTABLE
,
2
,
luaL_argcheck
(
L
,
t
==
LUA_TNIL
||
t
==
LUA_TTABLE
,
2
,
"nil or table expected"
);
"nil or table expected"
);
if
(
luaL_getmetafield
(
L
,
1
,
"__metatable"
))
if
(
luaL_getmetafield
(
L
,
1
,
"__metatable"
))
luaL_error
(
L
,
"cannot change a protected metatable"
);
luaL_error
(
L
,
"cannot change a protected metatable"
);
...
@@ -175,7 +167,7 @@ static int luaB_rawequal (lua_State *L) {
...
@@ -175,7 +167,7 @@ static int luaB_rawequal (lua_State *L) {
static
int
luaB_rawget
(
lua_State
*
L
)
{
static
int
luaB_rawget
(
lua_State
*
L
)
{
luaL_check
any
table
(
L
,
1
);
luaL_checktable
(
L
,
1
);
luaL_checkany
(
L
,
2
);
luaL_checkany
(
L
,
2
);
lua_settop
(
L
,
2
);
lua_settop
(
L
,
2
);
lua_rawget
(
L
,
1
);
lua_rawget
(
L
,
1
);
...
@@ -183,7 +175,7 @@ static int luaB_rawget (lua_State *L) {
...
@@ -183,7 +175,7 @@ static int luaB_rawget (lua_State *L) {
}
}
static
int
luaB_rawset
(
lua_State
*
L
)
{
static
int
luaB_rawset
(
lua_State
*
L
)
{
luaL_checkt
yp
e
(
L
,
1
,
LUA_TTABLE
);
luaL_checkt
abl
e
(
L
,
1
);
luaL_checkany
(
L
,
2
);
luaL_checkany
(
L
,
2
);
luaL_checkany
(
L
,
3
);
luaL_checkany
(
L
,
3
);
lua_settop
(
L
,
3
);
lua_settop
(
L
,
3
);
...
@@ -233,7 +225,7 @@ static int luaB_type (lua_State *L) {
...
@@ -233,7 +225,7 @@ static int luaB_type (lua_State *L) {
static
int
luaB_next
(
lua_State
*
L
)
{
static
int
luaB_next
(
lua_State
*
L
)
{
luaL_check
any
table
(
L
,
1
);
luaL_checktable
(
L
,
1
);
lua_settop
(
L
,
2
);
/* create a 2nd argument if there isn't one */
lua_settop
(
L
,
2
);
/* create a 2nd argument if there isn't one */
if
(
lua_next
(
L
,
1
))
if
(
lua_next
(
L
,
1
))
return
2
;
return
2
;
...
@@ -245,7 +237,7 @@ static int luaB_next (lua_State *L) {
...
@@ -245,7 +237,7 @@ static int luaB_next (lua_State *L) {
static
int
luaB_pairs
(
lua_State
*
L
)
{
static
int
luaB_pairs
(
lua_State
*
L
)
{
luaL_check
any
table
(
L
,
1
);
luaL_checktable
(
L
,
1
);
lua_pushvalue
(
L
,
lua_upvalueindex
(
1
));
/* return generator, */
lua_pushvalue
(
L
,
lua_upvalueindex
(
1
));
/* return generator, */
lua_pushvalue
(
L
,
1
);
/* state, */
lua_pushvalue
(
L
,
1
);
/* state, */
lua_pushnil
(
L
);
/* and initial value */
lua_pushnil
(
L
);
/* and initial value */
...
@@ -255,7 +247,7 @@ static int luaB_pairs (lua_State *L) {
...
@@ -255,7 +247,7 @@ static int luaB_pairs (lua_State *L) {
static
int
ipairsaux
(
lua_State
*
L
)
{
static
int
ipairsaux
(
lua_State
*
L
)
{
int
i
=
luaL_checkint
(
L
,
2
);
int
i
=
luaL_checkint
(
L
,
2
);
luaL_check
any
table
(
L
,
1
);
luaL_checktable
(
L
,
1
);
i
++
;
/* next value */
i
++
;
/* next value */
lua_pushinteger
(
L
,
i
);
lua_pushinteger
(
L
,
i
);
lua_rawgeti
(
L
,
1
,
i
);
lua_rawgeti
(
L
,
1
,
i
);
...
@@ -264,7 +256,7 @@ static int ipairsaux (lua_State *L) {
...
@@ -264,7 +256,7 @@ static int ipairsaux (lua_State *L) {
static
int
luaB_ipairs
(
lua_State
*
L
)
{
static
int
luaB_ipairs
(
lua_State
*
L
)
{
luaL_check
any
table
(
L
,
1
);
luaL_checktable
(
L
,
1
);
lua_pushvalue
(
L
,
lua_upvalueindex
(
1
));
/* return generator, */
lua_pushvalue
(
L
,
lua_upvalueindex
(
1
));
/* return generator, */
lua_pushvalue
(
L
,
1
);
/* state, */
lua_pushvalue
(
L
,
1
);
/* state, */
lua_pushinteger
(
L
,
0
);
/* and initial value */
lua_pushinteger
(
L
,
0
);
/* and initial value */
...
@@ -296,7 +288,7 @@ static int luaB_loadfile (lua_State *L) {
...
@@ -296,7 +288,7 @@ static int luaB_loadfile (lua_State *L) {
#ifdef LUA_CROSS_COMPILER
#ifdef LUA_CROSS_COMPILER
return
load_aux
(
L
,
luaL_loadfile
(
L
,
fname
));
return
load_aux
(
L
,
luaL_loadfile
(
L
,
fname
));
#else
#else
return
load_aux
(
L
,
luaL_loadf
sf
ile
(
L
,
fname
));
return
load_aux
(
L
,
luaL_loadfile
(
L
,
fname
));
#endif
#endif
}
}
...
@@ -343,7 +335,7 @@ static int luaB_dofile (lua_State *L) {
...
@@ -343,7 +335,7 @@ static int luaB_dofile (lua_State *L) {
#ifdef LUA_CROSS_COMPILER
#ifdef LUA_CROSS_COMPILER
if
(
luaL_loadfile
(
L
,
fname
)
!=
0
)
lua_error
(
L
);
if
(
luaL_loadfile
(
L
,
fname
)
!=
0
)
lua_error
(
L
);
#else
#else
if
(
luaL_loadf
sf
ile
(
L
,
fname
)
!=
0
)
lua_error
(
L
);
if
(
luaL_loadfile
(
L
,
fname
)
!=
0
)
lua_error
(
L
);
#endif
#endif
lua_call
(
L
,
0
,
LUA_MULTRET
);
lua_call
(
L
,
0
,
LUA_MULTRET
);
return
lua_gettop
(
L
)
-
n
;
return
lua_gettop
(
L
)
-
n
;
...
@@ -462,29 +454,24 @@ static int luaB_newproxy (lua_State *L) {
...
@@ -462,29 +454,24 @@ static int luaB_newproxy (lua_State *L) {
return
1
;
return
1
;
}
}
#include "lrotable.h"
LROT_EXTERN
(
lua_rotable_base
);
/*
/*
* Separate ROTables are used for the base functions and library ROTables, with
** ESP builds use specific linker directives to marshal all the ROTable entries
* the base functions ROTable declared below. The library ROTable is chained
** for the library modules including the base library into an entry vector in
* from this using its __index meta-method.
** the PSECT ".lua_rotable" including the base library entries; this is bound
*
** into a ROTable in linit.c which then hooked into the __index metaentry for
* ESP builds use specific linker directives to marshal all the ROTable entries
** _G so that base library and ROM tables are directly resolved through _G.
* for the library modules into a single ROTable in the PSECT ".lua_rotable".
**
* This is not practical on Posix builds using a standard GNU link, so the
** The host-based luac.cross builds which must use a standard GNU link or
* equivalent ROTable for the core libraries defined in linit.c for the cross-
** MSVC so this linker-specfic assembly approach can't be used. In this case
* compiler build.
** luaopen_base returns a base_func ROTable so a two cascade resolution. See
*/
** description in init.c for further details.
*/
LROT_EXTERN
(
lua_rotables
);
#ifdef LUA_CROSS_COMPILER
LROT_BEGIN
(
base_func
,
NULL
,
0
)
LROT_PUBLIC_BEGIN
(
base_func_meta
)
#else
LROT_TABENTRY
(
__index
,
lua_rotables
)
LROT_ENTRIES_IN_SECTION
(
base_func
,
rotable
)
LROT_END
(
base_func
,
base_func_meta
,
LROT_MASK_INDEX
)
#endif
LROT_PUBLIC_BEGIN
(
base_func
)
LROT_FUNCENTRY
(
assert
,
luaB_assert
)
LROT_FUNCENTRY
(
assert
,
luaB_assert
)
LROT_FUNCENTRY
(
collectgarbage
,
luaB_collectgarbage
)
LROT_FUNCENTRY
(
collectgarbage
,
luaB_collectgarbage
)
LROT_FUNCENTRY
(
dofile
,
luaB_dofile
)
LROT_FUNCENTRY
(
dofile
,
luaB_dofile
)
...
@@ -509,13 +496,11 @@ LROT_PUBLIC_BEGIN(base_func)
...
@@ -509,13 +496,11 @@ LROT_PUBLIC_BEGIN(base_func)
LROT_FUNCENTRY
(
type
,
luaB_type
)
LROT_FUNCENTRY
(
type
,
luaB_type
)
LROT_FUNCENTRY
(
unpack
,
luaB_unpack
)
LROT_FUNCENTRY
(
unpack
,
luaB_unpack
)
LROT_FUNCENTRY
(
xpcall
,
luaB_xpcall
)
LROT_FUNCENTRY
(
xpcall
,
luaB_xpcall
)
LROT_TABENTRY
(
__metatable
,
base_func_meta
)
#ifdef LUA_CROSS_COMPILER
LROT_END
(
base_func
,
base_func_meta
,
LROT_MASK_INDEX
)
LROT_END
(
base_func
,
NULL
,
0
)
#else
LROT_BEGIN
(
G_meta
)
LROT_BREAK
(
base_func
)
LROT_TABENTRY
(
__index
,
base_func
)
#endif
LROT_END
(
G_meta
,
NULL
,
0
)
/*
/*
** {======================================================
** {======================================================
...
@@ -645,14 +630,14 @@ static int luaB_corunning (lua_State *L) {
...
@@ -645,14 +630,14 @@ static int luaB_corunning (lua_State *L) {
return
1
;
return
1
;
}
}
LROT_
PUBLIC_
BEGIN
(
co_funcs
)
LROT_BEGIN
(
co_funcs
,
NULL
,
0
)
LROT_FUNCENTRY
(
create
,
luaB_cocreate
)
LROT_FUNCENTRY
(
create
,
luaB_cocreate
)
LROT_FUNCENTRY
(
resume
,
luaB_coresume
)
LROT_FUNCENTRY
(
resume
,
luaB_coresume
)
LROT_FUNCENTRY
(
running
,
luaB_corunning
)
LROT_FUNCENTRY
(
running
,
luaB_corunning
)
LROT_FUNCENTRY
(
status
,
luaB_costatus
)
LROT_FUNCENTRY
(
status
,
luaB_costatus
)
LROT_FUNCENTRY
(
wrap
,
luaB_cowrap
)
LROT_FUNCENTRY
(
wrap
,
luaB_cowrap
)
LROT_FUNCENTRY
(
yield
,
luaB_yield
)
LROT_FUNCENTRY
(
yield
,
luaB_yield
)
LROT_END
(
co_funcs
,
NULL
,
0
)
LROT_END
(
co_funcs
,
NULL
,
0
)
/* }====================================================== */
/* }====================================================== */
...
@@ -661,19 +646,13 @@ static void auxopen (lua_State *L, const char *name,
...
@@ -661,19 +646,13 @@ static void auxopen (lua_State *L, const char *name,
lua_CFunction
f
,
lua_CFunction
u
)
{
lua_CFunction
f
,
lua_CFunction
u
)
{
lua_pushcfunction
(
L
,
u
);
lua_pushcfunction
(
L
,
u
);
lua_pushcclosure
(
L
,
f
,
1
);
lua_pushcclosure
(
L
,
f
,
1
);
lua_set
field
(
L
,
-
2
,
name
);
lua_set
global
(
L
,
name
);
}
}
static
void
base_open
(
lua_State
*
L
)
{
extern
LROT_TABLE
(
rotables
);
/* set global _G */
LUALIB_API
int
luaopen_base
(
lua_State
*
L
)
{
lua_pushvalue
(
L
,
LUA_GLOBALSINDEX
);
lua_pushvalue
(
L
,
LUA_GLOBALSINDEX
);
lua_setglobal
(
L
,
"_G"
);
lua_settable
(
L
,
LUA_GLOBALSINDEX
);
/* set global _G */
/* open lib into global table */
luaL_register_light
(
L
,
"_G"
,
&
((
luaL_Reg
)
{
0
}));
lua_pushrotable
(
L
,
LROT_TABLEREF
(
G_meta
));
lua_setmetatable
(
L
,
LUA_GLOBALSINDEX
);
lua_pushliteral
(
L
,
LUA_VERSION
);
lua_pushliteral
(
L
,
LUA_VERSION
);
lua_setglobal
(
L
,
"_VERSION"
);
/* set global _VERSION */
lua_setglobal
(
L
,
"_VERSION"
);
/* set global _VERSION */
/* `ipairs' and `pairs' need auxliliary functions as upvalues */
/* `ipairs' and `pairs' need auxliliary functions as upvalues */
...
@@ -681,16 +660,15 @@ static void base_open (lua_State *L) {
...
@@ -681,16 +660,15 @@ static void base_open (lua_State *L) {
auxopen
(
L
,
"pairs"
,
luaB_pairs
,
luaB_next
);
auxopen
(
L
,
"pairs"
,
luaB_pairs
,
luaB_next
);
/* `newproxy' needs a weaktable as upvalue */
/* `newproxy' needs a weaktable as upvalue */
lua_createtable
(
L
,
0
,
1
);
/* new table `w' */
lua_createtable
(
L
,
0
,
1
);
/* new table `w' */
lua_pushvalue
(
L
,
-
1
);
/* `w' will be its own metatable */
lua_setmetatable
(
L
,
-
2
);
lua_pushliteral
(
L
,
"kv"
);
lua_pushliteral
(
L
,
"kv"
);
lua_setfield
(
L
,
-
2
,
"__mode"
);
/* metatable(w).__mode = "kv" */
lua_setfield
(
L
,
-
2
,
"__mode"
);
/* metatable(w).__mode = "kv" */
lua_pushcclosure
(
L
,
luaB_newproxy
,
1
);
lua_pushvalue
(
L
,
-
1
);
/* `w' will be its own metatable */
lua_setmetatable
(
L
,
-
2
);
lua_pushcclosure
(
L
,
luaB_newproxy
,
1
);
/* Upval is table w */
lua_setglobal
(
L
,
"newproxy"
);
/* set global `newproxy' */
lua_setglobal
(
L
,
"newproxy"
);
/* set global `newproxy' */
}
lua_pushrotable
(
L
,
LROT_TABLEREF
(
rotables
));
lua_setglobal
(
L
,
"__index"
);
lua_pushvalue
(
L
,
LUA_GLOBALSINDEX
);
/* _G is its own metatable */
LUALIB_API
int
luaopen_base
(
lua_State
*
L
)
{
lua_setmetatable
(
L
,
LUA_GLOBALSINDEX
);
base_open
(
L
);
return
0
;
return
1
;
}
}
Prev
1
2
3
4
5
6
…
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