From 27229fdca4e302fa14a728cccfc6a1dd0220a7a5 Mon Sep 17 00:00:00 2001 From: jugeeya Date: Sun, 24 Mar 2019 00:28:43 -0700 Subject: [PATCH] first commit: working damage replacement example --- Makefile | 175 + build/lapi.d | 56 + build/lapi.o | Bin 0 -> 25136 bytes build/lauxlib.d | 14 + build/lauxlib.o | Bin 0 -> 37912 bytes build/lbaselib.d | 17 + build/lbaselib.o | Bin 0 -> 25976 bytes build/lcode.d | 59 + build/lcode.o | Bin 0 -> 20784 bytes build/lcorolib.d | 17 + build/lcorolib.o | Bin 0 -> 9336 bytes build/lctype.d | 17 + build/lctype.o | Bin 0 -> 1240 bytes build/ldblib.d | 17 + build/ldblib.o | Bin 0 -> 24088 bytes build/ldebug.d | 65 + build/ldebug.o | Bin 0 -> 13792 bytes build/ldo.d | 62 + build/ldo.o | Bin 0 -> 13416 bytes build/ldump.d | 32 + build/ldump.o | Bin 0 -> 3960 bytes build/lfunc.d | 41 + build/lfunc.o | Bin 0 -> 5704 bytes build/lgc.d | 47 + build/lgc.o | Bin 0 -> 17976 bytes build/linit.d | 17 + build/linit.o | Bin 0 -> 3160 bytes build/liolib.d | 17 + build/liolib.o | Bin 0 -> 28576 bytes build/llex.d | 53 + build/llex.o | Bin 0 -> 15208 bytes build/lmathlib.d | 17 + build/lmathlib.o | Bin 0 -> 17096 bytes build/lmem.d | 38 + build/lmem.o | Bin 0 -> 3496 bytes build/loadlib.d | 17 + build/loadlib.o | Bin 0 -> 19440 bytes build/lobject.d | 47 + build/lobject.o | Bin 0 -> 11072 bytes build/lopcodes.d | 17 + build/lopcodes.o | Bin 0 -> 1080 bytes build/loslib.d | 17 + build/loslib.o | Bin 0 -> 14432 bytes build/lparser.d | 59 + build/lparser.o | Bin 0 -> 29000 bytes build/lstate.d | 53 + build/lstate.o | Bin 0 -> 6408 bytes build/lstring.d | 41 + build/lstring.o | Bin 0 -> 5696 bytes build/lstrlib.d | 17 + build/lstrlib.o | Bin 0 -> 44200 bytes build/ltable.d | 47 + build/ltable.o | Bin 0 -> 10312 bytes build/ltablib.d | 17 + build/ltablib.o | Bin 0 -> 14968 bytes build/ltests.d | 74 + build/ltests.o | Bin 0 -> 824 bytes build/ltm.d | 47 + build/ltm.o | Bin 0 -> 8056 bytes build/lua.d | 17 + build/lua.o | Bin 0 -> 824 bytes build/lundump.d | 47 + build/lundump.o | Bin 0 -> 7104 bytes build/lutf8lib.d | 17 + build/lutf8lib.o | Bin 0 -> 11152 bytes build/lvm.d | 56 + build/lvm.o | Bin 0 -> 33992 bytes build/lzio.d | 29 + build/lzio.o | Bin 0 -> 1832 bytes build/main.d | 335 ++ build/main.o | Bin 0 -> 12064 bytes build/saltysd_plugin_example.lst | 0 build/saltysd_plugin_example.map | 6403 +++++++++++++++++++++ saltysd_plugin_example.elf | Bin 0 -> 680656 bytes source/l2c.h | 254 + source/lua-master.zip | Bin 0 -> 491434 bytes source/lua/all | 9 + source/lua/bugs | 4052 ++++++++++++++ source/lua/lapi.c | 1408 +++++ source/lua/lapi.h | 37 + source/lua/lapi.o | Bin 0 -> 22960 bytes source/lua/lauxlib.c | 1026 ++++ source/lua/lauxlib.h | 262 + source/lua/lauxlib.o | Bin 0 -> 28472 bytes source/lua/lbaselib.c | 522 ++ source/lua/lbaselib.o | Bin 0 -> 19480 bytes source/lua/lcode.c | 1682 ++++++ source/lua/lcode.h | 93 + source/lua/lcode.o | Bin 0 -> 24048 bytes source/lua/lcorolib.c | 201 + source/lua/lcorolib.o | Bin 0 -> 7680 bytes source/lua/lctype.c | 55 + source/lua/lctype.h | 95 + source/lua/lctype.o | Bin 0 -> 1336 bytes source/lua/ldblib.c | 464 ++ source/lua/ldblib.o | Bin 0 -> 17792 bytes source/lua/ldebug.c | 844 +++ source/lua/ldebug.h | 47 + source/lua/ldebug.o | Bin 0 -> 16696 bytes source/lua/ldo.c | 822 +++ source/lua/ldo.h | 75 + source/lua/ldo.o | Bin 0 -> 12416 bytes source/lua/ldump.c | 230 + source/lua/ldump.o | Bin 0 -> 5616 bytes source/lua/lfunc.c | 273 + source/lua/lfunc.h | 69 + source/lua/lfunc.o | Bin 0 -> 5680 bytes source/lua/lgc.c | 1612 ++++++ source/lua/lgc.h | 186 + source/lua/lgc.o | Bin 0 -> 27488 bytes source/lua/liblua.a | Bin 0 -> 475816 bytes source/lua/linit.c | 65 + source/lua/linit.o | Bin 0 -> 3104 bytes source/lua/liolib.c | 803 +++ source/lua/liolib.o | Bin 0 -> 21528 bytes source/lua/ljumptab.h | 115 + source/lua/llex.c | 567 ++ source/lua/llex.h | 85 + source/lua/llex.o | Bin 0 -> 21584 bytes source/lua/llimits.h | 353 ++ source/lua/lmathlib.c | 756 +++ source/lua/lmathlib.o | Bin 0 -> 14712 bytes source/lua/lmem.c | 179 + source/lua/lmem.h | 93 + source/lua/lmem.o | Bin 0 -> 3632 bytes source/lua/loadlib.c | 713 +++ source/lua/loadlib.o | Bin 0 -> 15248 bytes source/lua/lobject.c | 520 ++ source/lua/lobject.h | 757 +++ source/lua/lobject.o | Bin 0 -> 13432 bytes source/lua/lopcodes.c | 109 + source/lua/lopcodes.h | 373 ++ source/lua/lopcodes.o | Bin 0 -> 1168 bytes source/lua/lopnames.h | 103 + source/lua/loslib.c | 408 ++ source/lua/loslib.o | Bin 0 -> 11744 bytes source/lua/lparser.c | 1846 ++++++ source/lua/lparser.h | 146 + source/lua/lparser.o | Bin 0 -> 27984 bytes source/lua/lprefix.h | 45 + source/lua/lstate.c | 420 ++ source/lua/lstate.h | 326 ++ source/lua/lstate.o | Bin 0 -> 6680 bytes source/lua/lstring.c | 283 + source/lua/lstring.h | 53 + source/lua/lstring.o | Bin 0 -> 5536 bytes source/lua/lstrlib.c | 1717 ++++++ source/lua/lstrlib.o | Bin 0 -> 40504 bytes source/lua/ltable.c | 917 +++ source/lua/ltable.h | 57 + source/lua/ltable.o | Bin 0 -> 12696 bytes source/lua/ltablib.c | 424 ++ source/lua/ltablib.o | Bin 0 -> 11912 bytes source/lua/ltests.c | 1812 ++++++ source/lua/ltests.h | 138 + source/lua/ltests.o | Bin 0 -> 944 bytes source/lua/ltm.c | 253 + source/lua/ltm.h | 93 + source/lua/ltm.o | Bin 0 -> 7560 bytes source/lua/lua.c | 622 +++ source/lua/lua.h | 514 ++ source/lua/lua.o | Bin 0 -> 944 bytes source/lua/luaconf.h | 734 +++ source/lua/lualib.h | 58 + source/lua/lundump.c | 307 + source/lua/lundump.h | 32 + source/lua/lundump.o | Bin 0 -> 8472 bytes source/lua/lutf8lib.c | 289 + source/lua/lutf8lib.o | Bin 0 -> 9016 bytes source/lua/lvm.c | 1809 ++++++ source/lua/lvm.h | 123 + source/lua/lvm.o | Bin 0 -> 38744 bytes source/lua/lzio.c | 68 + source/lua/lzio.h | 66 + source/lua/lzio.o | Bin 0 -> 1976 bytes source/lua/makefile | 198 + source/lua/manual/2html | 518 ++ source/lua/manual/manual.of | 8972 ++++++++++++++++++++++++++++++ source/lua/testes/all.lua | 299 + source/lua/testes/api.lua | 1382 +++++ source/lua/testes/attrib.lua | 487 ++ source/lua/testes/big.lua | 82 + source/lua/testes/bitwise.lua | 346 ++ source/lua/testes/bwcoercion.lua | 78 + source/lua/testes/calls.lua | 435 ++ source/lua/testes/closure.lua | 270 + source/lua/testes/code.lua | 384 ++ source/lua/testes/constructs.lua | 302 + source/lua/testes/coroutine.lua | 970 ++++ source/lua/testes/cstack.lua | 62 + source/lua/testes/db.lua | 949 ++++ source/lua/testes/errors.lua | 581 ++ source/lua/testes/events.lua | 474 ++ source/lua/testes/files.lua | 880 +++ source/lua/testes/gc.lua | 683 +++ source/lua/testes/gengc.lua | 83 + source/lua/testes/goto.lua | 271 + source/lua/testes/heavy.lua | 173 + source/lua/testes/libs/P1/dummy | 2 + source/lua/testes/libs/lib1.c | 44 + source/lua/testes/libs/lib11.c | 10 + source/lua/testes/libs/lib2.c | 23 + source/lua/testes/libs/lib21.c | 10 + source/lua/testes/libs/makefile | 27 + source/lua/testes/literals.lua | 309 + source/lua/testes/locals.lua | 510 ++ source/lua/testes/main.lua | 395 ++ source/lua/testes/math.lua | 1008 ++++ source/lua/testes/nextvar.lua | 669 +++ source/lua/testes/pm.lua | 391 ++ source/lua/testes/sort.lua | 310 ++ source/lua/testes/strings.lua | 404 ++ source/lua/testes/tpack.lua | 322 ++ source/lua/testes/utf8.lua | 238 + source/lua/testes/vararg.lua | 151 + source/lua/testes/verybig.lua | 152 + source/main.c | 367 ++ source/saltysd_core.h | 12 + source/saltysd_dynamic.h | 17 + source/saltysd_ipc.h | 17 + source/useful.h | 14 + switch.ld | 212 + switch.specs | 8 + 223 files changed, 66088 insertions(+) create mode 100644 Makefile create mode 100644 build/lapi.d create mode 100644 build/lapi.o create mode 100644 build/lauxlib.d create mode 100644 build/lauxlib.o create mode 100644 build/lbaselib.d create mode 100644 build/lbaselib.o create mode 100644 build/lcode.d create mode 100644 build/lcode.o create mode 100644 build/lcorolib.d create mode 100644 build/lcorolib.o create mode 100644 build/lctype.d create mode 100644 build/lctype.o create mode 100644 build/ldblib.d create mode 100644 build/ldblib.o create mode 100644 build/ldebug.d create mode 100644 build/ldebug.o create mode 100644 build/ldo.d create mode 100644 build/ldo.o create mode 100644 build/ldump.d create mode 100644 build/ldump.o create mode 100644 build/lfunc.d create mode 100644 build/lfunc.o create mode 100644 build/lgc.d create mode 100644 build/lgc.o create mode 100644 build/linit.d create mode 100644 build/linit.o create mode 100644 build/liolib.d create mode 100644 build/liolib.o create mode 100644 build/llex.d create mode 100644 build/llex.o create mode 100644 build/lmathlib.d create mode 100644 build/lmathlib.o create mode 100644 build/lmem.d create mode 100644 build/lmem.o create mode 100644 build/loadlib.d create mode 100644 build/loadlib.o create mode 100644 build/lobject.d create mode 100644 build/lobject.o create mode 100644 build/lopcodes.d create mode 100644 build/lopcodes.o create mode 100644 build/loslib.d create mode 100644 build/loslib.o create mode 100644 build/lparser.d create mode 100644 build/lparser.o create mode 100644 build/lstate.d create mode 100644 build/lstate.o create mode 100644 build/lstring.d create mode 100644 build/lstring.o create mode 100644 build/lstrlib.d create mode 100644 build/lstrlib.o create mode 100644 build/ltable.d create mode 100644 build/ltable.o create mode 100644 build/ltablib.d create mode 100644 build/ltablib.o create mode 100644 build/ltests.d create mode 100644 build/ltests.o create mode 100644 build/ltm.d create mode 100644 build/ltm.o create mode 100644 build/lua.d create mode 100644 build/lua.o create mode 100644 build/lundump.d create mode 100644 build/lundump.o create mode 100644 build/lutf8lib.d create mode 100644 build/lutf8lib.o create mode 100644 build/lvm.d create mode 100644 build/lvm.o create mode 100644 build/lzio.d create mode 100644 build/lzio.o create mode 100644 build/main.d create mode 100644 build/main.o create mode 100644 build/saltysd_plugin_example.lst create mode 100644 build/saltysd_plugin_example.map create mode 100644 saltysd_plugin_example.elf create mode 100644 source/l2c.h create mode 100644 source/lua-master.zip create mode 100644 source/lua/all create mode 100644 source/lua/bugs create mode 100644 source/lua/lapi.c create mode 100644 source/lua/lapi.h create mode 100644 source/lua/lapi.o create mode 100644 source/lua/lauxlib.c create mode 100644 source/lua/lauxlib.h create mode 100644 source/lua/lauxlib.o create mode 100644 source/lua/lbaselib.c create mode 100644 source/lua/lbaselib.o create mode 100644 source/lua/lcode.c create mode 100644 source/lua/lcode.h create mode 100644 source/lua/lcode.o create mode 100644 source/lua/lcorolib.c create mode 100644 source/lua/lcorolib.o create mode 100644 source/lua/lctype.c create mode 100644 source/lua/lctype.h create mode 100644 source/lua/lctype.o create mode 100644 source/lua/ldblib.c create mode 100644 source/lua/ldblib.o create mode 100644 source/lua/ldebug.c create mode 100644 source/lua/ldebug.h create mode 100644 source/lua/ldebug.o create mode 100644 source/lua/ldo.c create mode 100644 source/lua/ldo.h create mode 100644 source/lua/ldo.o create mode 100644 source/lua/ldump.c create mode 100644 source/lua/ldump.o create mode 100644 source/lua/lfunc.c create mode 100644 source/lua/lfunc.h create mode 100644 source/lua/lfunc.o create mode 100644 source/lua/lgc.c create mode 100644 source/lua/lgc.h create mode 100644 source/lua/lgc.o create mode 100644 source/lua/liblua.a create mode 100644 source/lua/linit.c create mode 100644 source/lua/linit.o create mode 100644 source/lua/liolib.c create mode 100644 source/lua/liolib.o create mode 100644 source/lua/ljumptab.h create mode 100644 source/lua/llex.c create mode 100644 source/lua/llex.h create mode 100644 source/lua/llex.o create mode 100644 source/lua/llimits.h create mode 100644 source/lua/lmathlib.c create mode 100644 source/lua/lmathlib.o create mode 100644 source/lua/lmem.c create mode 100644 source/lua/lmem.h create mode 100644 source/lua/lmem.o create mode 100644 source/lua/loadlib.c create mode 100644 source/lua/loadlib.o create mode 100644 source/lua/lobject.c create mode 100644 source/lua/lobject.h create mode 100644 source/lua/lobject.o create mode 100644 source/lua/lopcodes.c create mode 100644 source/lua/lopcodes.h create mode 100644 source/lua/lopcodes.o create mode 100644 source/lua/lopnames.h create mode 100644 source/lua/loslib.c create mode 100644 source/lua/loslib.o create mode 100644 source/lua/lparser.c create mode 100644 source/lua/lparser.h create mode 100644 source/lua/lparser.o create mode 100644 source/lua/lprefix.h create mode 100644 source/lua/lstate.c create mode 100644 source/lua/lstate.h create mode 100644 source/lua/lstate.o create mode 100644 source/lua/lstring.c create mode 100644 source/lua/lstring.h create mode 100644 source/lua/lstring.o create mode 100644 source/lua/lstrlib.c create mode 100644 source/lua/lstrlib.o create mode 100644 source/lua/ltable.c create mode 100644 source/lua/ltable.h create mode 100644 source/lua/ltable.o create mode 100644 source/lua/ltablib.c create mode 100644 source/lua/ltablib.o create mode 100644 source/lua/ltests.c create mode 100644 source/lua/ltests.h create mode 100644 source/lua/ltests.o create mode 100644 source/lua/ltm.c create mode 100644 source/lua/ltm.h create mode 100644 source/lua/ltm.o create mode 100644 source/lua/lua.c create mode 100644 source/lua/lua.h create mode 100644 source/lua/lua.o create mode 100644 source/lua/luaconf.h create mode 100644 source/lua/lualib.h create mode 100644 source/lua/lundump.c create mode 100644 source/lua/lundump.h create mode 100644 source/lua/lundump.o create mode 100644 source/lua/lutf8lib.c create mode 100644 source/lua/lutf8lib.o create mode 100644 source/lua/lvm.c create mode 100644 source/lua/lvm.h create mode 100644 source/lua/lvm.o create mode 100644 source/lua/lzio.c create mode 100644 source/lua/lzio.h create mode 100644 source/lua/lzio.o create mode 100644 source/lua/makefile create mode 100644 source/lua/manual/2html create mode 100644 source/lua/manual/manual.of create mode 100644 source/lua/testes/all.lua create mode 100644 source/lua/testes/api.lua create mode 100644 source/lua/testes/attrib.lua create mode 100644 source/lua/testes/big.lua create mode 100644 source/lua/testes/bitwise.lua create mode 100644 source/lua/testes/bwcoercion.lua create mode 100644 source/lua/testes/calls.lua create mode 100644 source/lua/testes/closure.lua create mode 100644 source/lua/testes/code.lua create mode 100644 source/lua/testes/constructs.lua create mode 100644 source/lua/testes/coroutine.lua create mode 100644 source/lua/testes/cstack.lua create mode 100644 source/lua/testes/db.lua create mode 100644 source/lua/testes/errors.lua create mode 100644 source/lua/testes/events.lua create mode 100644 source/lua/testes/files.lua create mode 100644 source/lua/testes/gc.lua create mode 100644 source/lua/testes/gengc.lua create mode 100644 source/lua/testes/goto.lua create mode 100644 source/lua/testes/heavy.lua create mode 100644 source/lua/testes/libs/P1/dummy create mode 100644 source/lua/testes/libs/lib1.c create mode 100644 source/lua/testes/libs/lib11.c create mode 100644 source/lua/testes/libs/lib2.c create mode 100644 source/lua/testes/libs/lib21.c create mode 100644 source/lua/testes/libs/makefile create mode 100644 source/lua/testes/literals.lua create mode 100644 source/lua/testes/locals.lua create mode 100644 source/lua/testes/main.lua create mode 100644 source/lua/testes/math.lua create mode 100644 source/lua/testes/nextvar.lua create mode 100644 source/lua/testes/pm.lua create mode 100644 source/lua/testes/sort.lua create mode 100644 source/lua/testes/strings.lua create mode 100644 source/lua/testes/tpack.lua create mode 100644 source/lua/testes/utf8.lua create mode 100644 source/lua/testes/vararg.lua create mode 100644 source/lua/testes/verybig.lua create mode 100644 source/main.c create mode 100644 source/saltysd_core.h create mode 100644 source/saltysd_dynamic.h create mode 100644 source/saltysd_ipc.h create mode 100644 source/useful.h create mode 100644 switch.ld create mode 100644 switch.specs diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..772bafe --- /dev/null +++ b/Makefile @@ -0,0 +1,175 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITPRO)),) +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") +endif + +TOPDIR ?= $(CURDIR) +include $(DEVKITPRO)/libnx/switch_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +# EXEFS_SRC is the optional input directory containing data copied into exefs, if anything this normally should only contain "main.npdm". +# +# NO_ICON: if set to anything, do not use icon. +# NO_NACP: if set to anything, no .nacp file is generated. +# APP_TITLE is the name of the app stored in the .nacp file (Optional) +# APP_AUTHOR is the author of the app stored in the .nacp file (Optional) +# APP_VERSION is the version of the app stored in the .nacp file (Optional) +# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) +# ICON is the filename of the icon (.jpg), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .jpg +# - icon.jpg +# - /default_icon.jpg +#--------------------------------------------------------------------------------- +TARGET := saltysd_plugin_example +BUILD := build +SOURCES := source source/lua +DATA := data +INCLUDES := include +EXEFS_SRC := exefs_src + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE -fno-plt -export-dynamic -s + +CFLAGS := -Wall -O2 \ + -ffast-math \ + $(ARCH) $(DEFINES) + +CFLAGS += $(INCLUDE) -DSWITCH + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=$(TOPDIR)/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := -lnx -lm + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) $(LIBNX) + + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +export BUILD_EXEFS_SRC := $(TOPDIR)/$(EXEFS_SRC) + +ifeq ($(strip $(ICON)),) + icons := $(wildcard *.jpg) + ifneq (,$(findstring $(TARGET).jpg,$(icons))) + export APP_ICON := $(TOPDIR)/$(TARGET).jpg + else + ifneq (,$(findstring icon.jpg,$(icons))) + export APP_ICON := $(TOPDIR)/icon.jpg + endif + endif +else + export APP_ICON := $(TOPDIR)/$(ICON) +endif + +ifeq ($(strip $(NO_ICON)),) + export NROFLAGS += --icon=$(APP_ICON) +endif + +ifeq ($(strip $(NO_NACP)),) + export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp +endif + +ifneq ($(APP_TITLEID),) + export NACPFLAGS += --titleid=$(APP_TITLEID) +endif + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(TARGET).pfs0 $(TARGET).nso $(TARGET).nro $(TARGET).nsp $(TARGET).nacp $(TARGET).elf + + +#--------------------------------------------------------------------------------- +else +.PHONY: all + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +all : $(OUTPUT).elf + +$(OUTPUT).elf : $(OFILES) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +%.elf.o : %.elf +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/build/lapi.d b/build/lapi.d new file mode 100644 index 0000000..4a711c0 --- /dev/null +++ b/build/lapi.d @@ -0,0 +1,56 @@ +lapi.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lapi.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lapi.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lfunc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lundump.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lvm.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lapi.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lfunc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lundump.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lvm.h: diff --git a/build/lapi.o b/build/lapi.o new file mode 100644 index 0000000000000000000000000000000000000000..f225dd147ca37e71732197885183381ec90bd1e8 GIT binary patch literal 25136 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 literal 0 HcmV?d00001 diff --git a/build/lauxlib.d b/build/lauxlib.d new file mode 100644 index 0000000..13d0840 --- /dev/null +++ b/build/lauxlib.d @@ -0,0 +1,14 @@ +lauxlib.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h: diff --git a/build/lauxlib.o b/build/lauxlib.o new file mode 100644 index 0000000000000000000000000000000000000000..c5518b89dd0ae0db74138d6b303a27b852c2b346 GIT binary patch literal 37912 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 wdOz}*y5KVXDPHE<0TK^=i~kDo%Zx@dZ`Gz>% literal 0 HcmV?d00001 diff --git a/build/lcorolib.d b/build/lcorolib.d new file mode 100644 index 0000000..1513b7b --- /dev/null +++ b/build/lcorolib.d @@ -0,0 +1,17 @@ +lcorolib.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lcorolib.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h: diff --git a/build/lcorolib.o b/build/lcorolib.o new file mode 100644 index 0000000000000000000000000000000000000000..f61db68c9beef9626399ba70189fa970f26ebcf0 GIT binary patch literal 9336 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 literal 0 HcmV?d00001 diff --git a/build/ldblib.d b/build/ldblib.d new file mode 100644 index 0000000..3bcc82a --- /dev/null +++ b/build/ldblib.d @@ -0,0 +1,17 @@ +ldblib.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldblib.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h: diff --git a/build/ldblib.o b/build/ldblib.o new file mode 100644 index 0000000000000000000000000000000000000000..1e50e5a8fc97f37967ffc5d54d6f3a9532fa48a2 GIT binary patch literal 24088 zcmeI4e{fvYb;s}S${=jx2wTPiT(kz07~?1c1Q_Ck)endXZZV()CvhUJrIn?!mV~qd z5qpXt%v94bQ+q7HNib16&Wx=(Q>IZTkh&mJPlhsX>k{KQiJ_8VI_|{jkYIv6!Ew*` z-g9=pe(Y;A?Z169yYIcv{oZrWJ@?%Eet6|aZd-GEGLdk$CEWL2>CC8e>%Lez&iKQO z`-q$8lFn^Cv-zbxiBCR#PvUnk4V+22ZA~t7I^%9VoOUDkoZ0;H?x|GU;o5ZSb$rfj z{`)zubUFP@5%WOg-@pzOmv9NC34&@c8{eNF2^zW zp`>eo7Ud|LkvdMw9!0zTIvRFv7T~na$2~L_m`UXaJ*+y7keAf zn!m7BPG9o(MelE|OZ>uoJDEyOOiR4r!*nX4{)KUeJ@IP-zQPA+B!2TTR>8+w?>lk? z=P3Jq>X<*UhcQJA#l~w{wPU_nY%Ffaq#V9TJ3emcH_kDZjlwd%{|hE?Y-0cx`nF&K zF-BdB@3?afe*C3x=+jiH?Xb*eZ*z&*OiSHpx%rMgd~Xta@E>+9x4(M!?9*uTSjzc% zgEIKpF81IT<{f+ngMZN+v^J1m=h)YL!o1H)8;^GigVubd?e{^ zKpFHFGql~FayQHp{E;)Am9h;JRDgWuz#ak4Kr=TRQw?6x7M+{b7;(;u8|Kuk=J za<21lGS5+F`2gGS-C_z~QI0mO46HbYx`s@pV#bilOYwct=d|Ttqx!`8hc=OaXp`es zyVyODmU;6(_2JkgU@F+Px!fV`u>VN zmxy1N%ICM&xYL)({^pd#3iR|EDrDiZK2&I(pJccMSiZJF3O$Mv-ybeKwGd;%I#YZR|rpu zZbM?^H5sedGSc72#h(%JWu%N9FtpiNEB;r6+%=zOQZ*A(zd8H2#k`lb_x+CMJ*V$) z+4I|LaIHG**9yKK`CRq$GvRXuIg^pLYt!xlS;t#tU7mO(>0ZD*vbE+4-;e4ETr)OE z8TuCN1Wm@(7VibZ`0w-MKl85JW;u$r;7ytLGq+}5K!0!_fLL3uEvax9wTmC{XFTa9 zP4`H0;V+;$w&>g6M8B6*1|8z~mgFMVeYqY@AcoK(j>y;2I)@{CKTl-+h7vvFQ41YL=XEuK?#P9k< zF@DvEnOwhr)127${$=j;*AdIRGA|&G==WGM^a=R_{=Ra=%W`NYwP-owdn|Ra&uio+ zVh(-#EZ1QEEt%^s3ORpFcdW z;Ezj%`??vuhFjak*dwnmLq7kLA4~XxcF<;%&PB@~KkjApXjA6fe6#&FtyyO_{~*MB zuoQ2^8f((&E8XdO#JVlykHs5yIEPUF%emqH1bL0PhczNxPf?CB`Ju$dd`J1k(hu_; z8kC_v`sVXp;*I#7lDdawjI(pGrYxE`ovK+rC1Wl3lD}%4C)d{VzkMmVvB#3N*R@uS zUHa&SL2rB{dHHqK!fR9RfeX)ft&60+_mghhSn?09gD-ON+6EtxBX<99{lNMRU#8A; z4durF7Ksz`I>b8MmxR8CbrkC}asxIjo?#42v9ug)q_GNf{StrOmmJo)zR=J053PMy zB2Rwg^Thi0s$R3v7GjODTO={QM0}~1Pe%NCSv2sqNzSdm3H25AYUCOr=kuLhlPo?q zMiwXZ%ltcGAI{0+8utLo;ZH_#V~NBH>rH9>zJU~B# zPi5|h@r)U@a_c|Vqj@^6@C9=MYY}W?yi(#bu7Q5N7k@E7{k2rq z=nWDhTZ``|8>kl@e|NcSHUCkL@n;SCgnPhf9*isr&+On~>`M1e)0c;`r1*g~RpKja zSQvAQZFV+Tb@5(ldX}5SdNcFMa9zh-#vH`_!}z~1YawhP7Cr{D7QX!J5DU{p%V!=L zc>!x2IM!0EiLmt{-PcC^96&jjd9ARSn?l=Y$J#eL(^3u=*4_l_!FJx^$CoXcWoLSIxGvWc?&>tTQ?F;(FKBEsai<)i*gKu1hc2SPDXD$mG^UL~U zewprNe?6go$-NqUnfXL$H|h`CgHLQ{=K7$8KgO*+YX{df?zg`uT+sM%T))evvo`k4D?kahj<;Hy+6Q|8ATfz2IDb;$@--hR2^y_80jw99$G8eG! zj7YntGhbg6y=aT?Rd8=__dszR>mGc?eKB%riLMWr$Czt2x3M-LHqp6_^%eEZ7u2yi z9oDnbyl$U4dxO~vWpqEL_vzBka;%T$uldjGGh&dIc1#1k>1zG+q&`pl_}u4-S3d~% z8(0Tzokx4P*1*28%p5lv&fPY=QyQNY-n$vIIQVf$y7{dY?#7w7H?h31`wi5^SYeFH-H#pC_>{XJD|gMcIcRHujj62L^HFAP!H=l+ zZ^XyY&(bybyL#V(=Ox&}^OE%ew(x9tQu=58!8=IwC29wC&{wo+zSYXTiacMnB4+lS z`dD)01s>BS!y8V8_QJLO(dC&J63J6HdH*H;JVtn@fOFWxdjnigalLAk5A5Sz!?--> zMt%FW^zpGrc8eywAAGb*p6T7kF1L31y^zHdeNQICy9n#=5}Bt~zGNJ63iA-D+LCuA`9a6rLZ-wsqz<3~l^$TF#v7=<6-ami?!ed7AF%+q5a$+j+Gwl&`A>QR>`a zA=`0(y6?f49wTM(>St_j|Q-ZEc(SI)!!Rd+!}647pEV zHRwys-@bl$CU*OV20BDH*xff!Xd4{p(E9nF-dty{3*VmPvx5a@4|Qh?DCig(7|8Yd zBCqQm>h}%x_GbsOn+9Fa;Dd57u+bOFS8sNc_Y`}xfwHcGbYie8H=x4a$a#+hpeNsv z&F6z4E0L85h<~A9h&4)b!-d>HZ#JLq?(0J=tj0jDFf<_jMGfdW`i6SZ0a#6&NY4Ez z$bO^f2Xg~{P~{Zo-lFV#db|2?p6`=-D8nY_1G$aj<-o&szA0D87V|{PHAQ@})002$ z>k+49)AODXZ5fY9`*QBvm;E{I%K16%pk7GD(2j($Bey|v$GOimH{X($G<)#=oh#LG>+0%JqbgK$iLc6~Y54NQWpiuYVqtPW?YCw4ZkkuMGx==d zGjF~z52s)&aUk11d^OIi-+A7%vs$)SjHOzhOt#N{^NrVkd}y9)oa53`Y<+A9+Vswf zXH&OrPu~9K8$b5;;KL}&WUCB2U+)<`ejNM8c~dXs z+u=+rJUJX(xzi5a3Xz_IUN+yZ+HT&S9825<>*9OU9I1c<=k?2EF~>HEuco3eV~H=T zzHyF(C+O26S*QAS(5wBH?a8&?bwSJIvqd%U1WhT1(t$R39vt`D-Ky<|R@)bQccOK~ z0*%AhrSdtX+Fj6U+qa`{cNcwitEA`y)yd0e=%$l9S3G-7(>IoW^UCILUD3RK`PkLX zPcD1vV@*$gbjMZ6&%OD^&wu)}pBxF{^f6f_7cOjmd`o>COMJH2&T5MZk}a?LX;f;Q zm)TkQ?D@^x&l{W7^kl_XO8vb@d+z%!_ws(@I7(k`w|-j^p+5&y+a3CIFtPK}XD?~q zUNg3+`N@l)TG;e-^`A(!pA-{JC0Zh88_qQ#^JU=V#RJ+*#fq zvfBi^13MOo>3^Ah;z&mQT0V>6c^6Um3@HHElu5Zg8i<{pxJF!jwbl zhqsixBrdn5#8Pw%SKANUxln{jvX2;HTPz=N!~xsBuyY@iJ@`9%j(oy)gM7SRo2c~E zxn|`V<&P`BSNTEZyOn=M`H1HDsPaDLRodlA<&P*osNByVVNWQp*HDcIVc2#1nY8U#JZZiVPw8U6|33E~=Vh{cWu&7Xy@VCTd9CU2+2mua2bmD_oh_ahXh zidWH61Hrxqzl7EQ*-pDlCGb;&d=3TIK_R|I+OMK>JN#k{&&Tl1G5pVB_%~wst{DEk z82)k$e>H}`9>f1VhQAlXQ!<~+#qGiverXI}9>Z~sE@yvr4F7x#$F;khoh>o^i5R{! zhW~X8e<_ClD2D%Q3_lXX|09Nf1KhJQDP;~zcC#s42;`0FuTexFg+&aY$m?_&5oS=h_@b9oG} zi{ZD#@H=Dp=VN%g@cDA(sh5}E*!siH^~UHQjo~iexgp=Pp{~O%9d?}?+W2`lJ2Y(1 zoKiwhph0(TS?OuDqdV7ezb|z1?3^w5R~-6YLhTfvz~x-c$P;qu#6LcVR!VlmdFkn0 z&cjo^_+03gmb``1gR%F+H(n<%EedtlqJiRbb~yIW-uUX$&WDHa(3F265DvX=X{TF# z*IjqsdD|Bp&he^auR;9`4V1 zIlVr>8zj`0R}DSA8-3|OpS)=ZLW+LLOt$x7uPd4pRiUrnGdV1U&R2mdH!#qrj>yZK z;#u49CV2&A^}2d;`A(dyX~VFUyhrqUN&{dX%eymQwKS4elJD8r?ccX_${Q1}=^5;> z*JoVE4>)Q`K+bU+piGk+`ugN0N3Xm-8|c{7FK@*}HjtASRv`IYZ}2|fm+jmz)Fp49 zhJ9oGcp-GZKP>d+HPBuC67NEn>*~r&^j+6O13eP+E-^T$N=+^wkWzZV+fs^!21@}& zb-dd1CM0Yjue=Fg$y!GTy8Vc>4P+mZT4D5%2&HCGBsR>JPe$K7rkA{p!aGZx2U)Nn zrl?IBM{5y6DfG#WV>HEMjPovyjcU>0rtDzojMObUpvU2*n|dJ3J5!8xUw^JwXR1ha zPRI+-L3vTx2I(5)6|y3{^7AVh?uYH37r^dYS4Mb)u6xiIU#<$ndjf3GGq>js=$8kH z|L)df=$SvR9QtcWKT3M$&yXJPpKRNu2e8k4uX5P`xQS(N&zsOQKSKIC(jV1h=$W4+ z{U=B-mkz%{&%8xB{HZ7XTGBJe{XI75uMLO(yFhy8qolu%^iPnUIqvVV!T$B((0|)| zvIWAgB)(Vm3nP3|Ir__Xjw^?K&XW_QXKwG(pyxcPko!n%u+O|kIrN+-%Sg{0_v_f8 zx7@}#erSsg_L;9!ZgH@Cl=aFj4#uA$`*>$zn|~K3C$P_aiu5;{SoZb~4tnN?NY8nD zR5|p_asQ1C{bf7y@aeaxeS7}_{Y^pQzn7Apd4qE3d0bYJp7~nR^SoF`dggi3bDsB; zp7}88SCapuq-Va1^f!}!FX@?|ApI?*mwyBI8{)~lLhcK(AwHiBhyHu6a_E_NlHS%> zR49<1`ACfZi5UG3(tnEl*-d)p2T0HJ;*fHi7j`W_QXKt^8 z5Kp#Kp|6yp{!}WD`ctJG@n<_}<*?6rSWkN98Pb26;<<+O%)3d?dDTyP=3}JidAE!7 z%qL0D*OC3CXMTwE-0o4*Ge1fCTdBVl`f3gFWL~2j@yw7uO?u{QNZ&~MwaRULtzwG{LH`!tRq;m7e z^asiQZDfC%>@a_aILF}>*}0wU%+>eM7+>bq%FX|Nt+QA;;`14@lU8p2n|`Ts*k^r% za@bi-c2<#|c?;?Jy0Dh?%-56t4zizDZhmI8te@<#ehb-Qe;y}2^R1-+EVVmMdgg~n zUr+j@q-UP43?jtsPSP(`jyN-KCq0jEKk1o|lAhO}9i(Tzi}Y*ApGnd)KSFx$*EH#w zpCbJ-vTv{0(O>5E7nI`jhoo;%4n6aAr2iw*cPh91AJ(#N<(5Cj`^i4r86*2wll@83 zGe1Q7yGZ{w>6xD*Jzu{nW{1k?FY{{U$RD0BHKb?0iu8Pc+d_Kg>q) z(ZL^nz8fJu^Ks=iE~DDUE^3#r`+Jq!c$xk=vd{X1WQXH$l=RGN<^%`eKj-aI<%mD? zRiwY0;6yE^L4 z=|4yQjFO)DR?>f-^y8#w{)+PGxExR(9hXC7pYwT|>@z<_`uoTqcVRfexG=9K&T&X9 z$N1Vk4lJx7J@ZwhUqS7*ke>N!<+eVIYn?U9Z5=S)O7{6VdOg`^-WjpKTkUs8>>J-g z_WAwHDA{K|NqW9693(ySY0~pLbAt5DtLFuW5r4jpELDziWWJj8U(mi{w~qA8yGhUU zr9gV-Bc$hXe1i1M$4LKi@@E(6neQh(KkpnMJ@XT!=e#{hdgdRHp5svYk>DKS$-G)Q z;?MnBOnT-m$}OKqwa=@`4qw04Dz`j0eJj~#{dmOwb83GV+5aNNd2htN>7OV2tbd#A za2}o@J@bmH&=}&wd0wR)@npW3^mmb;D@f0LCF#FJ`qiXo-b#92-?~Z9yr1-Z-P}TY z=A)$NaUUbj>(36d!}?vsS-)4g<Vi0CV&eQfm+z4454_|N0AMmhXvzK-b3{pZLI>-Q07{eI=vue8Sh z73J11c$Ypd91HeD3^EZvND({VL_=kMSDi(R^5{Jem*n zr04m#ia5t7Lv~odmN@HMm7D(=^?#jm^WS(rqF=50{)pbV{1vv}qWyhBd9=UJke>5l z7jgD~H`!tR^Tb)dPr3DXo%%ne-1=+$P(StQH^~?BDvd?zv$^Jd$&nnV0U#;BQ9o2T%D7SWvuaB|c9b`H}_`Zn#dF{iLa*WHDsb8-sUm4*CBKFPBG}&23c21BT=BG%{_oem^=V+IC zO?5B|Klwf(tsHvh^~x>&Q|eO#*=Zm@S1Gq~F?~ik?6ba8IsD=K*gWZ(? z>6z~*eVd78{|f1uA5xC~@_T?I%F!?8ZQ*h@n@7HZp`RRMd>!fUBYivRnfEJ?#4#IF=25LT`U>((P&B z&{v{Rw*Igy>h14VhKWOOzaJVQt|mMgB@Vs)u4pT9=c%C@)_WPtM;?UdQE4@M-`fl~-AaNl3-Omx?&=0GAnmCaC-OzF3(2uD8 z9pXUt_eZCQLofgFR@gKzYeIx5GL`Zrn_VksNx4cr zU**5$FOrnk>v?yCTf0w0xQ*|4gj>J%N4U+$4ruLZ^Qwhm-8SjO$|)cPab;%vWvGkyAk(9wetz2%AZ&-9jWt5cz#ahuoU z5pL^){m#nt_V;Kjbv_xlf1k=nxc&a$)eSzpNqz||`@%rjS++klV*ho_Y=N;h+C3#e2#v9``eDa0Zb}T;S{p_E z?t3%R(?iN1&FtBoH{X17=gyrwGxv?uxn{Yp=!Lr|n*Q5tEs;dgN(a90`6wRNzH-DDerMbsZ0ICl=tA{6&LrDlFH@7z|T-}-Al{K%d$UI9r*>oew|DY z4x^t}_GvxqI;sYrTS@7gbE(Q=*5g9<5!{ArZ#azZB}Z;4$?WcjHZHadcDw+(i>v7@B# z)>l1!9|cSMCind06h=SExeS+w`qX{lcK%i}B0CZ^U6 zqAu{c;D*igS06;vJx_FfIOTm6*k<%sZi9|#)LeyejohAEclzrU7Y82Mdhv{sQFlwd zE5H7ODenk#SHu3FOnFE1wZs58QvZS9?Y+plNnJhRwh7kLNA!CS#*jt(kFow{y$AL! z*%3AL>}ER->`U1(0=o?C+uM^JZW~-j%MX>n9;{!<#FY2BWGx}(vt3x;%g|{|&Fp8p zjzCZLsjp2<9fjP}L|U=yu&tTPAH`dRoH>k)%Y6}At;_VoVVi`ilS zpqpq~C!Qk}a}-681c;*sjo81w4;K zOKc|PTFg$~Z0tG7QR+^HjnB1LOsz1=Dd^JqOJx`n_zd$pby z!lN757G=_rIQfh@!qh)T55-uJKyl`&SpMv6oe0FVpPW(0=Se@1y^B zU^|xoGjQ3)_IBn~53)>d2V3N8l$`3LlsejL+o7V5|Iyn~{te^=y|_>5e+uT+2D_q< z1lvi`?W;`N7ygkUxty~fZpGeTmZ?3_h5k~Y3+rRUyxSq?Tkw}3k}Ew#j-qd&oRk53 zR!~AsTXBENFb!qfXssLkM~T)&^JwTGeB&VY7}@S)=xElDDzwC`@~}2Et2{Wn4E>rv z51ZSgwr&;uKL;Hh7z2Eznf)+^@^ScC7wiICRI)5C$53XyN;lH1{>Ltt#yJihZIej`|Vs_oriTgIztOzUG17@;t+?y>1(w zZo}AbTzL4imGH>)6|{t-nAkj$sbss`B}4_^J!*u>kh6!AG-(vtJuY zw;hu0vNZbnbI|KohTmM6-rr67on5FUuA*N0h}=KqUV*dvG_T#PjmCZg+4{Igu(qnu zHWz-EgY^SD^rJlV0C;1tBj)QuHu(m9kJ*}SJYP}Y1pD5Is^+ur zvTSoZ)=BCkb&z`T-X?VkLjEZ9ft>zo$jnLe4YDq!L_=0xCie_Y$7k?`evZpHCYyji zd<6eU)Y<#od|pmqelp4H#kjwxXo=;}JxkSwvYa@FAERasv5+c>*ir)1t zf}r)Z4Rer_q9wAScN}BOflU<558)i(Hq7r@5Un(~c?$k4`yW|~{SY!-qD>rU=d=$Y z?n=~^A@=&2zE5{TZ*oT~{grAv>!s`X$<$i5K^9^b%zb(Uvb*5lBdLz{{(Ktx2!4li zx$>6bpOsu6{a7m|TAl8Hi;Dl3{c;fYK|I=T%sG6%yO0>h=(k^Tf&ALs4>F*7ZPN(WDJU zosZDaf3hCiY|X>idt6Ur4ii&eSD~%>vT}UoPf_;^tPyE5oMYY-m^1k15f!p+$g_+y zNMFnQH(-y&x;h}mz)2jWp zzThj$#Qv1%1;3*3dha~}J-S+;^KPvp&_W&l-PCa$*gDLA{Jp7l?3=q$j;k5{tvGYp z{zp;vY}k4+m`&XmZUe)*)jpUS;Q8x(kNUoi`nxgz8SwogoPEWm^z*ynJ8rvH%(0Yp zY=LCFzd#1|<`o05K^!sGGPF$`uyvnaqYbg13gq$o&k0AgG7CDra1Z;Y(*G6srX7CP z$#y^=BS9J(siUF8*xNYf>QyL}<&CL#_hXOj8G-MzycpWICR4YImenn~Hsy`2f$hUL zHeg?TFaW<9QI{bWUaoU*;%sG~nosW?s4G>Xl{|hze5G#7ITU!(m`k1q9$QwJx_O-C z;0B|#{lh;ZZ!>c$Xgi)pOUPMoxxbC`S%-H}jJe+f|GaUIx=Z}j&2bU?&G<4(j6Fd5oN%9G z4`@T9sAK=g!dSErI@^)AK@pNJO* zSdS9u&+SwP_9#3jt=1B?I3H>>*cfM57<>6Yko{0C_VE`HBZc83<2Y|Z+!fvAz?m|V6Wug=Uv$&hr=pw2ABb*x`{C%OcZ#B$e)AdNOP2JF zuWC3qa8 zsY!jKu*>+8Mfbns+5(x6LZ*t`-lw;POnvVn$9m>7#x`TwM<%C^?#KBu2H)g5?#F{M zdZ4=pdj)ej?wc8(5#LK)Ii?vEIzk5Gl?==wVqeVfB-S*~6~B{=rF!}p=Q(4UGxE;p z_Tn=x-rD`z?P9~;Hl%RG5r%X3=l#(J=Rd`_G7 zm>r)H;xk)6&flS1(Ek?p1=nHR0bmcno|A~XurFXOv+aH=#)f#=@I&E)dOR^^__?k( z_LG71o?{JBeV5Nk?pveHmxmGm@|Z@2 zy`^1^aW2Q*jxi4spRxB${~5y=C*qIg@VEWR_q4`;eW@xO8qeR=>hb?`mOzB#rkuoBeK0lh}ntl zh!`36)ZcA$KF#)^r9tstcMkLEvQZu8S%0_X@$sFIw8MMA&35sDdlvUb%=F3X5d@o==S-0=-#4mq-NXPNvCz} z)<~cMp^=g58-sy*Jk~ZuLOVk(?%IaxP&>*y>l>@M!nfs%Ulvq7bLZXL>b~#Z*8A=^ z(7Z@!S5sq4prykA@=D#aki6XiRPGdPqD?}wFrV+YDLM?$vV+)t@PM{~BZ)cDn8e6JET+te?t>MAl+xp18)sMLEZRJX&K!nwb zxFe0g+yVa44I&A!OE3@#HQ=lBs{+;T`_Soq%*<#7Is32OD=a1zJMx$TxLebTy=!bMYYjo3)WJ z`Xky}TKb4PuR655t~OG#eyzJDR38eohTIQ6biaGUnupdD>dNECDIRQ3RFb{@9^0xk z7x6r23LIw%QORQM8OO6Jo}T31q_U^%-&H+Fm8WgWpD%pt&0k*m#pR2a7E?*;u34p; zS*6gd(r0Ith;q@zlcGNkfYG1(8T+&9SHN3LWvN>^Ln^@c6h9#0U7UG^&m=#aw6(_` zzF5j606lhwc3ea?k1dWbr&oUa=rmP9e?MH2~)f(8t!2nc8iIju`hD^8+;je3RUGudIava z;4cWg(1M>9xF+y&lsTQnm-RU!aD7h%cAjzcJ1jcX_c~y23cO+g9*`=GjNU`8>o0J9 zF9Y@=zH`}UlJPn0jC=n%@n!Sih#htPqx#7-bAI7&R>z%7&=Hcf=OgpT*)k9QWhr0C z(f2sWtDcA7Fb^ITa{R&=(*EC`haVICQ-YtTkAmo*1s)f;Ti|B}PD>4-P~iV1@Iry> z`y%Ro4SX*9Ul;tC;OqM&%ff!he&S9y1nc`F9+v>0OAggnhpO6kt_f0ZJM9cb8mqq1 zfIyLUw$~6s%-V*UMhdpIv>@WDuWblXZZ*}n1uA@vO}iSaL#|i$<-Uf{HyJHw#Sn7x^HyJ=x>|3g z7eXy9jV-%c_3@PXBH@-sy+xT1@qT?nV~74;pfg+A8gw!XDfP8RLMEf^o@JFtM^k8; z>h)m`7}2e%OASsT656*M8Y&l<^kQpwHJCg)i}83t#H<6ANGBuUq(XA3Sg2 zOZ!x7w#b;6?DGWs;1%&?2Wo)UCD1k@yCIv%j0=;O}jE zlKPYjIpr2P60flEor3SR@Fm_f4?i*wUlVbS)aNlFzf9oLJ`#W2!p{_ZzlAUHY71Y` zDQw|O{Gf&J7Zpb=e2Mo8oc9@i2a)NBh|5+2UoJu9?~1s|x-XRphmm%OiZzp<=k(=b4_@z39m5WIVQZ_gn!C}9}&2muT0?&F@ekZ zmG}vhocm02Ubo2MeUa07iyVnxGRes|sQT~idGHJol(QYo`ezDU>R&GU%@erPU*ZKO zIcELqEpnQKoQOq^#P`l4=dcMcG>vP}gq!t$eIES0z^!rGRe`e|&2iWJ0+)7pTIfF^ zaA^mL-xfIA(`*O%G9%>-3pq~lk|X6vJVW4CIZXm*Iif4w8WEEmGyb|sj(PtaH{lPP z?0HZOp8GZ9mrVF9IrHFdvG`ezd7bjzET<&k;*~`&AJ%_oaCr~O_gS1IU*1EG8}KwP z@7d)3C;9SzG7bH4lDNEob6aqE|F+hG%lkL!?^2Guf0OT<5|{UH(yt{h@83>Y4;Tx-BM<(dygl!ZC< zI{x7poL{*#e9h^4mQiwwbCF|L?#CfWnIh-2k8xo>f#M$1(yy#wt~nK;z%u{8?H@#2 zmMPo`Pezjc|Gfl6E?zIE(PBJt`-i3x<6%PR|CU8zIerP3i}vO-f+bwO%aD^}WYfR0 zoy_@<>ilfgpYWd!oaDY_lxFNN%iHlV*Zh%CNE3p2{#bXZzns50`v&hi{t=c_To{aB pV|bspw&!iZI(LBRym*M89c|(}i({TlUw6NLBXw-P=T2SINM0KKh^F5pO4P7&x@}rbljcz_ zUEA}|1J?}d{b0K`@S#D2`8j4X`bOz!ehwu;);|HPbFP^*DZZ^Po049)xuL|QUN0?L zRi{&;b1o%6*zOs)w&$lWju^i4lHVpL?P8uE82TXd9n+|GQvvN7G4RZxl_NUU63^wO zUX6Ui6!%Seh!UoQl6@IGX`W3--H-$Q1Q`hPLytrzE%WoufWs#HC-nFmB}BbU!@Bvq zTvL*lUv~{>@^ZP2x1>H3hE{H@Frlk9aFJ-p@21`ow#hIhbnx~P+i27I0?7IS^wpM_ zmi_$Yw4tlZOnNZ3Q=_3O=sa#v`55d{4?9-F&ULVFHEiI84eB9#9qS1BIv+Qar!mH+ z&mUwuOYS@~89-Zim`NXLm%K!^8pezn`GY*h4LLx!pCA*V&3ee6N2j4{d;UpTbA9jw zLmQMjT+OHCRbDUVrJEaArxEDOYkW1|OkUgbnzha&hVMMv^djikrV~a1#uN^+eEbZ+ zHr&3p=M`lxZE!VYy83N>famb*X7c03l!WZR4Cs_}XTh%7CcpOv;A;!X-0<5L+SU2p z%>#b;3-h(*q~8BXr4IhiSXe%36b+6;hJ9Vs+f_=vQU=(}lE;$!+unhX7qjeVUW7~q zDxX)tXF~A!%f{wgI(~#T?1TIlQmGSRg=h$zP%P5&N^zsSVmDiBw&`?S*Y?_2#4tEX$#R&6Kn53uTlj0k6}ard~Sl z)qd&5xbCHt?52f12VSN`_aZw_U1eVgRt+SVu|NEaWiJBlhE%F@3_jc`{8rjf#=m3B zliMb>;}IimL%qC%98FJUQ7y+i=d$2#*LKG0pf`~|N}p8sLATtJ0$Q*FcIzOmsR@3J zSV8>f53+BL8%8M{*fuAT$1Jz|_FX40?5`J3%j_j>)MwKBzW`6(uL5(Si{Q(-s}y|4;p1#u&ZRTa*!+KJ#Sh2J z!WuLA5pq=43Uk8?SyaifQ~*1TZ>NNY`8md(K>nK8Ly1BWM;|^!$@Nq?`VxNi4q9W` z6LKD;c-~=a9kfvwWxfCR4#-Jay_+cO(pMpKC-PrM1#MuR$E&p7uE)*x4UqTn;vrc?EBaD{KE42v>eWO-o6O6 zA9f;M9-(%E-B_NJe@xYO>hW!CCux7yjcs*a$$7?znW!RK$2OI|vkYUfZh5xl;fLdfW01!$!ya3Ty>=P)%TkAHxI@=2 z1(B#|haJ^;lY0;EH=HYY&dmL7`(Cq8gH7ZfH+~bXiDRGWf-Dyy zXXj%h?ax9l@UPtDpj~drhUZGc`t$QcYgmiBrjE03^ZsnD?-^@-Uxsh+9%#o;;ou{*aFpeJ4!DW6DWHP8k7d)! zAo8Opmue@C{PGX+JBBztj=6TurP_RF{%Dtj?nB;r!;2ih!;QM{^4@bH?6W5t{8OhJ z+*5&v{lkF<_b|)FdBFo)9@8C7JE0eR_`WA#58j{rEVnbO2R`0IPOV4XCjw_Hdrr)t zLmYn1@^f6h44GUGSA=aj3>{8@zk#(1!jI|^kIxfT*1>=FRhS7c8M%;m!9LjNx4L1~ zN6&$Or(wD9J8#4K!_i-v-TelFrb}z~EBZj-~r=%agmH zlhR)yQ$Zc{k3(PN-b;1ZC)l6gSLU|oS8G8UH07i&&jsv z&4Y~8`)M;R&M|P26^myu>*c+pC63!Dy%d6fE`oX zAZo9{N3rhXtIQ2k<>rRZAYMZ7HTKizunsT4SMP$az5rikpJn+c;jd@luhk9y;rg_{ zW?BCFQ`o3-iTU&h?8~XeV z7eXKJ0AuV+Y)h`&Aa6kz#f>79nvT4YTz4c?Pt;;BEI+$0~6MznDcT@YOz0_X$APu;k zlza+v)I*-*dhy*8*mItMuRK@dw(^~i49icD>#cg3_h+eBx-M<1PU{zkenpu37}gwi z9MzGxyFab&jNpJ={Jkus>gO{P$BE@zh>>79ZMX=#dM*9! z^N1h&F4w*8mqeTr{M@zC85t`&w#crzUmf^w)Qnt1@cCRre-?ae6KG1{^SqvM z#O!gb%NXh(!uzZ1`CGwh%Re}`mBc}h8X?Z#k%Ufc2ethiavSRWp=XOZXF04o;BUdl zve$L_WBPlK^#70G`y2y>wPw;$OUYu?YekTe$HG_2NuxEWA<8+ow_y#~mwC$h?=;!S zIWHh@*fj?Y78vnu2F`F?4~=&i1D#lB2jqW^jL|IQlT^wvkiwd!R#P$+#`DW~cG&hX zkn1=`#$8-9~0PR z>fHhN%~5x-p{=FKUA8k^A96QF-M8Evz2#O+%vW7wOCZut6btQ+@q08D2sXLHkAxyS zn!}G01q02^j0XcPE#a6u5{kC%47ppvEnkebMO#BH^`UxqFdPZD#Tr{eH_+9GAcERW zRqo6gm^-O*w>O5GA$Twnjz%GW)fZU?cU`!xrQQ;CX8IkG@J=_xh&DpWfI8`2RaJMm z%j!dqG&RONYb&8cb0`oExmT{b)xExARmJVh&}nf+R(fn3Id(7A7SD5$8(6WxYxwDz z?>^!kW)HgX@XpYu)7R9Q50Z6Z(ZU!_}{)2(~#PE?E-7U!|J z&hSm}sP5PLbi7vLcN{;yTKVRkfBTW_qgmcQN58T8fWGB7zkZ8l0nEq&ojXCsa$R70 zT$6nB%r}qZ9G&Cs%kIyrI^cN5s5+>B8}hvU)_ET9$^Dx8V#!sE#+V9_`dV@1vw4IRpS>E zV=tpEb>7T&t4-VJ?sV(UbZgpz7*>YgD}oQcE2a6s{yrYTTHR?qZQAz)?Sl$!b)UXP z(!!P)Lv#;*1#Em=mJK}f&uT{&9sQj5z`|z=H}@Cy6;~h1KUh$GIPW{}Y<}~c=fc}w zEW>%s2g1JM{vxJ3Sa2x+a2^kHgHOHS*UU_-ZC}FN+r*T#9PpEZWfb&$fz%WZ$Y0v=7?4_>asxn(OVG+kaElft+XN z9LzqH^_}ZfVMm{~M#FV)P1n8Ix$2bQ?_^nUaSk~nuxxXmJz9$~p6Q)pfu6U!t-C?OpbGXCt34Y&hYA#0*);G6o0%?yvTuM* zAkG`jL-+1>CZaa7DSkzh`>Bq2DU#M+CjK?_tb01@0CuWbJXlg90~mY{t!k|1N=_68L_B$AQlz z=l)snW0L<(HUn$_LKA;Onvu_sXTkqf@Yz4l=40(MXkM6wenQZXe8#4?_82rT&qDtP zNiP=J%K4zrMO@FMZxQf3#Cy#Go4=L!(JU4CseBukKC?>TBLbIx^%cfB9!0=gxf(;a z2>gn`$82`=9pE#`6P^X9=K63&ke2TzyOj4?=LZTlgn~_cKA;`G)<7g0iqMY6md0p9 zm307UYl(z$4p?4K&2540zLwCV+^F_NLosW7xbER}PjfUDv3p|;5gZ|!!z~Xzyt9>| zJAJ|Ca5O}Lx^N_hqedjyV3FSIYi)}*>;S+=7!ZC_3SkX`AhEXAM*_`J?)$nA2Z1)5 z;kSG{8X*_ZYF{MqXr!&BH4=`6g0WCNK{hch`a(EDgoD=6gQ>Sl#AlCv2!f_N@A83< zZ5E4hv;kr@rMox#Y@q6^_SnXjU@UB@SM6&EhnsAaTbAi87O_bCj<%Ly?N;ur^*t1d z#dg-U3#;Abi?z3glnGnIQ91N}D9FojuQkE_zR>Pauq_s{=V*>Fq*B0`6SJ3mkDxQP* z(DcH^~1%Fc6 zpHs@?mow-kUMw~b=Fcfmo)g^yXZ|W)CUBO2sUrWz3_f!6G&A@} z{B?zo>i=U3E}GUXQwqLZnb#>c-5cZ)xU^fV7-I@t+D+oE3LjOT{R*zi;}l6y@;@v1 z7YJPPmw2(jSxz`6(%rh;8GIzZd=@^Yf{UibXRm^*>-CC)tNOmF;HtjwD!6L@ zDS=D>@w2nwDig(x^dE`W2%PP(-X^u~4GMmTf_E$UmlgcbEcnS;aJhG9VO}Ak#my8v zC0--m=Zm}-UXV6~}_`4an)OU&Kmwe>+$c-7eJg4u@z~y;-Bm$Kl%GjMtS9m>Gv`S`c)*E8;|U2s6r8t7c|Xm}$gryuRFiUJ-u451vPqOX;)17X&Vr(H?}mQ%yE$ z)aIeQS~U*y{J)N0iLor#DwQePa{h7=H?mvGFJTiM+`e5Bi02*R@U$!gm*eE~Yv|{; z2&*);UyR=(>Soy?=a=taMPnxW4~ydC0l}E<&!5iZ_+r6ern$N6MUe=Pi~0GxG?xaM m{Xlw{d3z|I0lCG|%^*U(_RTvH8^?SILP&5} z+HCF3x=GdOq*x&Yet?WLO~l%VG!dB-$sITVHDQs~!I`jRNoaCPadnMaMP$xF*4znfZCDLL<@ z!o2E8-%*uxUZr%TPMeB(w1Q5L&qi7(Gw;<3%Ok(PoK^SF`uyq*`LI08w32@P-`$kl zsp!{P-ycZ5R?$Rt^wG|lysD;u_%H?E0~T{q(r*~kxkFm8d!v@2$olr&AqvKbIB{oRZ!I79DpT|DZ2|Tc>#0C~E$I6S4Wtwb55d>Gx;CA1QSu+qp|@xm zAJM>1JlefWpwI6OO)b`Q3|Gw8~)oy^Icj zq%8C4(%uF=^JC`4&bl@&yg0-8+u}z4S|~ix2p?cC^`bWZGWcG1(7>B63QxP}tBuf8 zXr%(q$-D4x`oG_u`3&OoIcY$DfWp4rG!Q}!@*d69o!>{9Ec{^qN6lE8(%*(o&gpCy zC0}lNmq9@GNARhw0o8S`CG_eq@Aw zuhPJ!YS?w5hMdFCp=Xv2)2@O(&8bakw)eOhPvhJuWD2d^NA>B6IxWMo?h>*79RA2y zInE^!=gZr)0>{CA8`fZl>fnOqs^HO@1ZfI?x#N zyGmG%z*6oK=9ZY3I@pescK|nMYF`)nyc@IeM{}-tkaQ{kYCI zMgwoWZ(tVc(>c_p61u(*e4<4+dyM<@Kj7t>$r(=FV}7gW^?+8m&UE(wp3!-Bo0X?5 z>h%ure{ydYjPNXavjKI%o}86=YPaf3ho@irD|mJJO%11~ku!4YnQNwwhPg|)2iQhx z2{zhFHm(XAUtY4=K;P?+Nc}^1P5ts4`pK1lJkzu?xm?Blv|yPWW=Gtsmf!85DR2Ggx*79BxL2IiY27IneH-XRuk`r8 zb9pe2xO2}?CXf4j6gG>ogXa=zEc2GbT~VZgZ$0Qs&DLD=Oeny5fib_V>GH^*%(-K} z4^hYF-9u62j@FOYcs6*5c6N6^=6|?1e(LCvMCg$Y|6u%BJbE(j-_gF+|7f5+u$`H) z)>s=UFZ7UexJ7BM_K_c0lfXN857qiFI4`PQ(BV1gwDu?>Wkj4 zanG5mCnwxzD<@s&Dn`yb2j6x;=;q&V%$gc%Bg`P_=bbF`?AwlS!bFkB3w0Wv_wn$` zDtLuzPh6x6S`rLljVVP_a`s<+|V^drm z0&lS4V>W)bkT_@Km-t3OuYev$Q9GHv$e$9|1T7+ViKoQ(85=I^v|z(!z9?|=`MyN- z0QSV7wI7xz+y&7O1FSZt0Q{=D?&DeN4H0!hY-o*os6*1pLJTGiV)4yf4&)e~oFP~s+EeCOya&q4z zu<~AHkzGQ5yJTb#OWL=-h@Qq_wftWe`5zXHoPRE*l$ZHu^>*7VGHhLNqzn5zi<}F) kJhRzz4~XuH;eCcb%9br0!v80$%KOFt$zLy%<)dBx|1WVLzW@LL literal 0 HcmV?d00001 diff --git a/build/lfunc.d b/build/lfunc.d new file mode 100644 index 0000000..d5deb06 --- /dev/null +++ b/build/lfunc.d @@ -0,0 +1,41 @@ +lfunc.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lfunc.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lfunc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lfunc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h: diff --git a/build/lfunc.o b/build/lfunc.o new file mode 100644 index 0000000000000000000000000000000000000000..be75aa4788a72bc7635ce642f6b5510b3c5e67b2 GIT binary patch literal 5704 zcmbVQU2GKB6+ZK0;~L8~{s9LAyWUXZT6FoTLAZ*_>@Gi{q7fLYtxDDP?0Ud1>s_-u z27}#XO=yHf9=x&%$pgeGMe6zqsZ{AoX=7;A7g{O&2DJj&JW)9hwBXvK+HB9cbFV!N z-ah1_nS1Yd&-v~-=bm$C&D%To?vf=5M3dkXSeOYE;Ek$q>+aTk^ z`9Py)waH*@hw8}@fYzr60@mfK#Y{W~o~ ztEy^NtLob2)Urx6SRl>4Va`l1KTiVbgrHc7gjU1jbuuKV>qCvPB@xjf3V%RT(d{)|9 zf1@6hv&0!b?U@OKG1)uMudC1`&e@KmG+G7eTT>Y0DU9jXG-OoF1w7B@ z?ND{(Zy3vZDcwT3Fs{_tamF+E)Iv@w0c-5!cV|+?kQrE~HS5neY?aocp1L{-&-1O1 zkZ(e%9u<0m^SwFSK8m+Ef65Wnt66mZpUZIdS9rGDp=k1-m`jyt&*?JFQaSz^`glo# zR$6}tZK+3pi*WrE?tOVM(0o~4-EtY^(#xx$a_95>mT^TLC4R~;@?{t17RAdM2Ry$~ z31E<7UJsBF`JM*Y;>=U3jh-O-i#ailzCGeGp*|Xc%mnHazCWKoPr5WFS;~chQoG&= z<25%t!)+mZq%(nR0Kn3*uAoA*yjWLc_d>ob)WdSL^`4BiiZPy!D%okYe@2lT=}dp; z)2yLlxN72lAIU2wUoD2#ws!+rvd@eBZOE@zYLX@`A-#J#SEO&z9UQo~S`K`&CtvBm{V)C8R$^AGPr(XS?;O0VZ&A$v#vkx*pz(IxjGAtmMpw7#H51-wERiz2@kIPPG}0q6!+T6mcCx{1 z-%7m(usam`p0}ahICiAd3~X)kCXJY(qt2$y-}Y|vZ}x8lsIX~4I@tnh?;5GD%)_u+ zj*E2^h4mckr#?`=@j~&%qTo3>G^7qI`$``^xO@9fIRuvO<|D?_#&rbGHk_Lr8=*c> zu3ad(xFmQ^eP7uzR6JZ1Ixqhi$-caM&!*csKlY;d71F`hM6W=(_kwy+2@c779zM8T zPLLO$J2b%7L9YdwVd+OGg(fy2JVR^PM(7pdzK|oKbMpJr&(Q_8J@a8LCOx&7-7)=b z96Ljphz05ILECM^1LtHrzU^FA#FT9B<=8m&FT~)y{DBmrK%Ar~+!tX$u~qn7;d&a5 zQLo~Hd{KJy;e&bKzu@aEPTcpv`$4t2*uEPI;NLHR??s&L%a2||`>6et<6m(6iVZ_&0UrE)%XrfK=tcY?cBm&F z^+#cCFGTfNj9uOkH;(soAJb!CCQsnlj705echcx4iO%@pF2n3dwEH_#N!`B**0w{e zN8b@9ig@Bgrx9a7D2&>P$S-KIHGJ4G&92A^KHo)aA!6%E8YIAgy)OWr@lKQNoFaix zIHD($oklWjiy!KYx7&6J?Ri5H*bz?Z$CEwr?qtF=qNc$uOc|z;OeT`tiXCCIBbhjE z6ZXVoo$(_MN;?{iteadTvE5~%I^pA*NN8_z#9tSuNT1g6~OWT4_I^W+s|>T3#UEwn}b>r z;*^J?iFy&Z@VT7}2wdcCuL~dH^Q$gge9!K?aPd8xb>ZTB)`0d=o8Olk`??Dk->nW8 zKFIU9--V0s4gKNs0zW_3J1$&&CuUr@_#S{ib)w7EBiNfsyYCPq{CTeXO{3QYf4gq# z;E$wI;7=xKLgJhJ+rS@9bafeV6k*av2i|q|&1T#8b>Ci8B$Ig>%+qLm^w_l^&RYo9 z;ebk869DhK*)LOojXb{edyn=Jbt&$ubsXnnTpOTa@t;+vDZudBZab;+*H z_&A%`U;MrjYr=kh%*<~Zi@FeUKjZelDgfRKJ<-33IE|e(Mxtr1U*cL2`;!c{J@_mZ z{}KMt+Q&Dd_!Fhj7x7B<7AiLhzV>aNiY<5{S(;1u}Cn R{U?=79DZVV^KZBQ{{RJH5$^y1 literal 0 HcmV?d00001 diff --git a/build/lgc.d b/build/lgc.d new file mode 100644 index 0000000..05e43dc --- /dev/null +++ b/build/lgc.d @@ -0,0 +1,47 @@ +lgc.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lfunc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lfunc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h: diff --git a/build/lgc.o b/build/lgc.o new file mode 100644 index 0000000000000000000000000000000000000000..d47dfb1472efd7e82cc46aaa955f977be0c73c82 GIT binary patch literal 17976 zcmbVy4|r77nfE()CLts-jY&Wnkj#WgG26xn;ZOYfGc6=A3_-|u(t zImykC^m%sg^Gxo!?|ILA-v8%4=cIGtl0}BcBl_{k&t&9FLq#rzM%t#`H02t}mCGCd zvH!AHdOpsPC4I!C2oAZvsyI0l(fyX($b!IY*`M<|8fDeMVnv>v# zZ}7^uNa78zNK(G-f3s$*tO;XY;s|JrqFW?uy8e`E_>WZTx*D`2N2I3i-e@-zxY1w z>G_avj3@8EM_bGIGr~(fJ!kMP@q3TG@09^xctTG`BC7}d7wwUZvqO-xOU&eEKX^-} z_WLnk3Fh;sQVo|k9JGO4D`Jm4{SIdy>i(62xzN#9Cf+$qYB{!`$`@AvfZ`)#!Cxe_CD z9sVq3$IuY$67osCrhOE+HIUa2e$OD*-@|y@-=JsO=aBf$hQVh7^LoH{O)g>%viMUs z&C`D7U0+3>A%=PEy@puyTB}I}f`Rtm0 z&(h5GC2>iTU)$!$G5!exSyb-4+tbh7`3Yj?pP_?Bw`hR0jf}(_NqA|NnbdrQnxuy? z{cZbbk+~tmmw1D;LQ7|C(S4mFYeM;t>?*_fkodN69Dco#3bUH?lMjun>CzsTH~!pN zkD${}pwj^Co}3}cBy=meX7c?1ajk$_wxgr4M`IJJIG~S zhMBakqz+t&*7g@6SFHmL@_y8igXI1EH$(l&8C=U=v2*D>^q)W<@wJZAaolj?xyMtM z_g%Th(Z?@c`jCMzaLyM>ay!mdl>D%FfJ`15w8SsL~QuK3oyplG5WnV^KMsB~n(V6Gne~_N;+(iAy%BQKnIOf^~dXeu0`@^6!bdz~7 zBt@?U#MojLpl-1J*`X_#zqHp=J>$zxyo?niw5bJMF>lR4+gyEp0du3s^w}Qz;IQqy z16Z>TXg{I9QMM>-G#&g{un*T)Eeqe5H~wOjz6#+p;rlS(EoRcdT#@_4&avTJ@Mex# z|M`Ld@~{WK64?=~4&};Sta}=f`+kMEi98mx^H2ymCx~1`yrB|-Pbcb6y@d4~YkZV5!$KNe5lMhcflL*v<&mqtM#~kzEvpz|_zscP2w0K|peTkVI$d`lt zxsrSZd_0;h$@ezN2J+I4u|eQb&LChrKz}XhV?C_Gk?uau8|MSe+B=Mcj9t#Q~7xoj9^rte?g=*XS^t!?H(e&CouLjE1Jii~_S zx$MO!-^hIAZ$Enfu9F`@Xgnd`~Dbsea|k^)$^eyO@?51`db2WK83llrd9*j$?vMqLLYsZ zKBw2dxtCKr3DavBX?iBGR`Lvd0GpSiZ=yF*Kfy@Uzw$-1`epFDFz`z8Gx;~}X5D2V zziV1tC;PmW^SU6Lg<8T7KhpZ=8tg~Ez~@j?RDBnACw>C8beAbTi8AT=zwrOfVd>$z z`yA?*SEoR4h~u&5EkzEn=lg8_{Dkt$0P@{g#Lkd6YXG&?PUaobSaiv$J+zFJU+a!< zohJ;)$sEBoZwT_wf$Ypn=h2=4*#nThqx7ZXj?B{C^pS9$RAu<&F8Vub$V}ir^WmnW zy2cgcu` z0`3s(as%e*zMQH`fJae03T#2U{LY(E&UrpSEk^zl$SoK%H*uSp>?=n8z72WQn^|th zg)1+U_UTKhsxFt@VeBgygOs}$a&vFN@2^81%J5r!e*txGqTZoRy4&lWyzI{TG2-0g z!nx;a9Gg$fpV$?I&QZ5w?!K9j8#QX*OsQrKN!#ti+wq6Ad|T)2^(^ckYcYoVwJ637 zp=Ba4xui{hJPiXD-%BD)~)ubuRyP)lRj>x z@~k`$eb5K;$v4Jo{HGPau~MuZA_ww7 z>lwu2BUo?ykYh?vn<5Sx`k+6?6!(y)u;(GI%YRDkB@XX4*o;`G{u{-&@=F&|4SUx&U9?<#SS`of zn49B20evg`)~oG2LmHx!&4Z-R+VXkm32T>4A31;JHL!1(xCKI3?XbxWty7(VbG=EI~L4!0o<_Dx% zI+|v_;+Oq@N1E`9z&QHYMS2*o={*m6(V3&=FL23E9wYM{`Gd{Ym^?m0xj{qAt$DPJ z(2d$(ZT}Tdj);MuH;2B=HNg6Q2@n7%hFObT%$$#W zH!9~d-}}h39hW|Pe;$VK>YP7bzW)aJ)?>P$2gaEnvF^bd)P%Vv`;QkNyC<;w5c2IT z=%EU8xbwc3dsO6P_V;5A9xLznah*Wk_p7)-J>3wwGCEfbA-B_i=71lb=aBa%_&W1W z0x?bhW&Vj{{`5R@+dEi;|4jawPJ3hgN1)3&it$Z8-@&)e#U^|lXHExMFNIOpLB{>u zPnq~O{6~uY$UU?pZRf7N^xlv0d-4kC-G=-HI$^9s%wb{XcjPDJq-vf`5zj&_1zz`W zsX=}5J;d4`pXWuk5&w29bQ+$sdrzW`JY$_q?eBUJ?{d(4P?Co*2WtWge0A?o`5gX$ zb2FU3$biQu2ljz?>SMU(!5kN+n#nfIzr$xHC!y}Nu1VA%K#hMKb?A_H@<5+abNm9v zAI{?*$N4^G$UyK)YQN>m!#lBdhqFN+YaMA0%Zl~x??GSNcnIfy)b*iDshwOye~I_M zf%l)|jl6%|LA>9^TOh~x@jig>TR9#%=uriK5O3Px2H=SDN6z;Q?D0&#e>dvNHSbT@ zQ_T8r27I$D%{T8yO{wcR)+Alb_3*(OS50!2Z-UOUE2+8EpI`YX&ag(+kbcmjoUB($ z6c4QNDDT6N;~d)LQ|I|tWl!<@IMbwWP-ogVV!+e&KF&aQat!+$6|E}3K0rJ1HP^VW zN%9+jIrYKl{VQuk!ndJT*@GHo4%Vef(4C&6qu5L?2ThzM&F#Q>&oRiEUL#S4)4)kA zLM;QFxfoxFHS0X)((LUuuN6AzKY!bDsmY47o1@;Z)KoXwLF#c_QGcakj3w+;}gg=+6E@_ z%YM}H%wz8$jy%X?KFq}$@vEvf34>187#Ad&5~~vL*|3aG&72M)prIJ*+1NuqDdbq@3zleVlwekRVR$U7SEt~5N3Z9q+p{Q3sl7JRw|-xl(ShBf1xeGj0|1Af<` z?{4rv8$X;QZQ;B{QnUqiqRkU==cmm>eh9Btv@FCzD|Bto33@BhKJC2@HJQW1?TUxf z$a#bz2ids7eHG3p5aadX$9N9poa@8H`b)2%);3>cuFYUvi5_&HYBnrhk5WY z?Bjv&(O=nzHQrulH^aV7(De}N@*moMQ8>_%Ozq@72+y3zPaD3!i*G#-asNi)(x%JN zPdwWCS7_7L-$6g^p#6!yRE1piF>FhJnvDE^+>oC0IO_|lJppt7A*?%L#0&Yn0dVr_ z!+CBOV3H;6-K&d1gKLj8)Jai!0_WI+{}NuX8D~tJMas*{cqW)()8V;4`Lgp1W5uPj zA?QD5NOCjmYGDmJJ zFVaruiQ`Fo$Q6HU;OC5&UKOW9-bn)=pjKo2uzeV`!q{t&AJ+3>?76O@dmrS7Ux%?r z>BE{qfAeCE<(Z%0Y=(50OD=)do^t0tqxUP0j6Z=*1?T+aE39<+cYs--1)a@p%DnYP zo~d#TFU`dn`wLygd$PJ$u0%d&{e}A2;R$oPY5WK@sB4Zrg1-NwbV50{qYw4NDEzH} zQLj&2#G0nsyU>0Z?ZBpB4$of$n>^U=@Epa&QFzg7L+CRzdFH|#C{vjS9|BCD&*-xm zziIR^9_ryQ%x50tf=;Z@U*k7&jr|QDyp7+;L-se;?@qJVdA^LDI4(_H{3I58LjSMKXD_NKOmD{ zqwOgt?ce=bs_GArlXLNxe!d(S^z`sdDgquNw;(>@_nae=o!cMzmL%^dJOns=)`oxo zn*PW-N!~+vUa-FmwjrGMYue?(y_0uKC`DcK zDeP1_1Yh8LPt4+(-v)SN{^dP{G*5+G(`Wl3mw7+#j29p`W4_@1&e<^W z-TsCnYwvb;^Su)n%EN!q9Im z_SLnLKhLp;<6BPc%C*+OTIJj|vi{l+zv+I=nHPH9-vu8E;QoU58O-~k zl)|%pxIauRbK1i8x14quYf=~ZtO1S%9=?S9$+g`No$wB6FZ5mt84@AHAlAffA;>cm zcEw#ocqaZ&WB9D!iF5XKu`Yp+1)vASZ#nUHdJ$ZZ7}I9d8~r&$!8O29Wsi}oa^Ga{PHDf7!XqKEoF~Z~12p7K4}hSU<|`^_Y7u_*huw zEt?+lvODLv>p8nV!o8N2FICK0_C8^@=gUK=Q_e%qpMFmE?*(nHji~d=W!7Pp z2a5)t#=L##8&dN!KOfJ#XUkitA4+8MS=NP-YiU;}Z*N47vbyi2SD#S&|CXd zuzK)H=;#H|{Tb-;{8cuc*nMF7Lq~;laW8t{A=y2MIv-=tE>`uM6@fn@=JvoJEZEWJ zXPuecjc@Ya4|yW+V+*mv?V*_@`GU@AkqzC0J7usJqEqF?hp%@3k=e>=zL$c0cmm-n2Jcyrbwv^Kk-TvnVZTjEfu>Tbf9LE^S^8n(T^8E|wa*kt}U*B>& z?5TBj5o1roeyn3z$CMzxy^zPYJ@b#so!ajPFQ%^Zz=tC6Q=4b_mG)7dsSx(Ddf$wB z$oFh~GnV<&`AO#`#&kDgt!n`FREErT){>$Dt`#+?34V{Xs=eI+5q@MZvG(6gEv(n=p@aOo3vxcxQ`KgoJ zILEWlV>-@3$WPul4{b&nI^JQd8ti8Rh-QO1ZRxBF# zujuf%w#EIHza!qhqIEg(ocH}TQU9t~+`_N9t;s)&y&^Y?+*(_Ei+@&AY~9Kg z@!-5Fe|xMYW_85;H_yJ&zo24vMJ4g_`3H~Z!FutnpYEBOTOw8Xo?=5qe&9hPnCE}O z_oO$p&A31N?YEBRNigTDy76`05Sa$lrD|N9?>qAHpD>>EeC_SGaJ}R7uVw?!dj455 zx}UskB^=M=&dcU+pK1@PH|Kd#wQc-69Xj=D9@06f`d?6Q&iA2e-%pw9hGpvY+(8-M z%#+%jTU9GK+^Wsdy}_J12Q8H6-)8iBsFGTRAIb?0k6ff$3v(7Z_>W?`X3mMn=je0k z6WLEr3~kHmolyHjqjr1dj*Nwmdw2ToJ$YjB+i(5m*l}_b%v(wXcJA~&?){;`F|{X8 zEd28rbtg}R#=>yMmw|^*6fgIZpkud+% zI(T)&TjIz?TBgEjBF>1P^m>*K>qAU*H7mU59Qn;BvYwm}+Lqay(KL(~+~M8s+n9a) zSkNIK%n1#*Z9jNk(V%_#@I9ztwk!(vrh@tL&4>Pi|J${nFY@mq$6sJh+b|c&++5OB`m3d0>b4ukosh@YU@+&Nk>=u&rsLb|6^&_G zHjNQ|+?7o=gmxOioHfI$G5%IH7v+T5ZPXq+e$RH_4sZRihJtw})k(e9v1jqI<9G30 zx6`;S`$RCOA^SvK&Z1+-Pb?-hbnLi|wbNLeeWEsJAu$%704vl*kq>|HtmYrLe}v#4 zENh7&D!9etP;OR6`duH zPHlbEQlOB{?oPv?qnywb>@mMkV{pexK1Xy|%P|Xg8uyJFB0mD!IW?xwWjovV7j8HH z@>s3%yu3=9bGyOFxIKFqj36IrFC6w$2b;JEUMF&0Z`TQl$n&jL3FaVPzlwo=p#DmYv-7Sy4*$0^jCTD{;XID^ zDB7U2!_x@AweyZ0FHpyI_Tv{;u*GO&PQ8xw za#5f-#NDiLmePk7t9(S3?4Vi>!H3Om`{#az-!Piy?bHz0CaRmkN|}cg?yntOC)bg- zZS+-|w3MMgcLI?h2miQr55I@(c2rXzRSM6JVYlBcRH3_!N$kXM8Z+)bflP*^?D&Qq zr}WUB2BUQikV6Q+J4X+~JWKKGQ*#wjH*TI5?eJ_jV#kO5aeOD-;h}3{_@8@7-Y0)d zjfLYC_FnyXMJ2JcE-xshKaLnz)5!*+;i7NX8-Pt!@U3cy?bm>nDtJEQ7Z2BUJ~!b< zI$IUo_Hn?lud(5kiq%1U^SKj0;-6FStu|ET8w#FKBD|pBVFj;LinMD8z~~S5yvon) z^&PNw1=se|>(jRt9CrZr6LwzmUA##rtl&)w-lO2JE4aOW0=7fJaffI>j6Xho_}Tm@ zxSkh9y(6!J`|-_Z5I^GQE<~jg-4Mg(~3U1n~B-UKT z?_~uK*hJdC6RjPlv(Nr|fTP z`qw+~51g0Wso;at9f0<$`xM+Pap2m2_~n(WqbCY{83VoyaE}YF!k5UPqnyP4a{f4U z#)D_s|BUWJx0_z=JZT+XanI&-c7Px1I{kTQ9Qfai1K%?aynh_{i{rpw9tZyBIPiDI zfqys-{PH+({9oOedieY}@bYosa|usZCceKs4nF;NEdAdLc!9?wL(1Qp6;1qatPNl4 zcL4hoe7%B8zyatu?Nabc1z)W2{~GYI=G~?66AFJR^u_1L3jTVj^KGxKX#S&uSI%(Y zzjj{ohJxD*Ctyny{9OfKTIK+Bo%^2({`wajxV@gS*|I!Z5tXv_(jK!~S~je*+E+Te zUSV@p+KCTWeWk6X)Q6?3cSR7uNP>yAe1rIF2rb~D}#^*8Z*QRCXymKCil*RBQ+ z1T3}@oGy-n2=O+4-rd+9Th+EM#&$#F@>o2+DzbsP#&=!gYFmA1E^K_jYH#JSg$*aT zwQa+S7<6s-Lc>k5NSq&wLD6clI#xVr6Rm6PXoeA2cEqjdO7^Q+1jiuJ=5|8vZnV`O zwW7`T5b~sl*EUA1_VyLAc3aNjuLy`K$g&mdNu;*1HTHmF{Eo&|V6ZK!FhDlC5<0e8 zz>_^=ZDX|AYF!S=o9r2DZS`=BeOA-q5Nu!D8eh=@#^VafHkLitvb8Pnc_#```>Lg- z7;#vxfq3t8!T-Vq|FsM5#@Ds|RM646fx~=iX-TKA>wCg+k23sBbKzGEL$OD5!QJyV zj{|Q}aPq_2Oh1o~gTHj5gF*aCjf{6(!3zOL3K3oJY*O$^Y4G2==-lk0BdYEpof}+m zpMsN)8}3iT_p32qOvBgkN(CqXvt9Jfao}}n^i4HpNg90(Zy1Np4-}ksoa37Jj0;}n zf;Z(lALMhc3w|$dzxbrXKj3Y?g3oiB_TT0r=Y#n3UGT>hd_Ld{T<|^xUyuf$W}kXq zJ?}3*KSCcDc*D=*s{W%LONXH%KT>eo(G7oI)qmvk78m|jRsW^KmjoOn!nt?Q&&w{j zTiz+kX{djvpDLa&ror{T$FGFc__}nhOM~luPfHqH?|WWIgX=u- zavFTA^81r%@N)|OVH#ZTdveu2Q1hwxJqyy{df&4t4X*b+Q+$r%G#$O~sY`?Fea{cl z;CkOPmfX>eVi>inpFB_8eG?*Qqi$tRosf; z9dCEu&ANpP6RRSQ(n%_sthgl=k&X_jXm4{qoHvKvT(LkZqHU{Ip|nIlN5z^^7T`)o zMbZEK<;PHlmQuqoAyc)^%o+ySjr6?<-GeS;+Px!xru;9bt@8lGgY#r56t(@9nF_Al zUG<8T-8kGF)lg|*7{*$JH2_`PTrh9USjoli63P#)tUf zdbIpnj>YI>+g+0oy}bmTo(MWQtnc`A*pH3S>k_IzzfN9K|-UTr8Yb;*dg!V?f2EkbTF&e9N zqV2?C=BEa83vpxdDPEY*X)EIWLub5Ne{I5K4^Q`I(#>NFLvxs%d9r~>Eru_x9{3HC`8d-X@T#5 zLT-T;x|0C878Z`QrHQZd2#wM#8niaSH6Cf^>yXEk_<1E$gB6PBn|_@rz6!dUGH6}? zY=gHnP@0EtZbRLnJRk4*BcpdB?}|e`bufYtMex%R{Cos2MerLD{B{JNjo^e ztK?a23~=dVsv|K}YdaStzCntkPOzOsu8vFlkA%i;^G)w}Kif2}$`3H7I_kJdg{$K- z20C)obxDU1SLY)&C0^oWy~I1DDCz{;5-<6(F5-9=)ulHOpI~3+Pw{H68-aMKds5+e z?$zat!fCxS-Z_QiSy`70Y{~p(9$AHNu15ou6i)RG_Nxlt!ZxWXwxzzz`#=J7Lkrg!$Qt=g|D_dDP7J?A;^dCz-(eCN9tp17xORXi4RcEsFYx$!GQoy%<* zPp5n`<*swn+}QTNJ~WnadlJs={;152ew2s}#lE?JUF@?TcQ?D#==sF-p-bP69lD%w zLyd05+i~IL66HfNm%X7z?xzI1B==lVYINASqmA*@=%sI0ANr^)H9EHawZY*;!`oud zZs`Aq8{8h`h3;JE_CRkU{+wjuE&ChW{-3>lqg#p&jlwq3nJf8W)1^dw0qpwd;rOAX zXgOE5=0;aGH96TWo+-SKn-hmBLhn}&t!M~ z-^a_gq>5ZU>UJ(swgB~lov7QK61NT5`NT~_z^XsH>Umao+>5*HFD3tC)Y0mPy1~}- zVjpnSHyCSKoZE)7bEjXLiSnnr=~H5#UajAkaEm`~UMcm-uJe9;xaQF4mfAyO z+yBPKFC^@#!M6Y$5lP32#(-TH#@g1`PcUmnV_GJSdK z`$n-BzBj+m6CbT8a--*Oa--*N3jHwY=DcnG=XQHT+RgHz+zbDQ?KP*!-H~&y9va6Z zTEEE0S7=AG-NqN#jeP$xlJ7OLf&KkY)juY6ep!6&q#YXN4Bh`Ex=ws%u?XM)&U(_u zb0r32;>T!g6pFo6q%8Bd#mhfwzmx~tE&h-PV+8so>Jr*JCGGjrOte!YwWsL|cU>%= z{pCcl7;OH0%snyL`SBb2=Ue`oY(YEUT$EZClX7q^ewKEREr4HR zC8^^pW+%4&xnQ_IC*_veJ@}ksE?MNRZ~E!nry8fZF3A@u3iVVZJKz@aMYnr_S9R+TGgYrMUYrcMW`>Is{*d9eYr3*aPjTJ>`PI z4$Muz6?>=4HEc{tS+7bx`{fVyiKRmO4#a)EWo*B3C@xr5u3^(0SNx&Gp|@v1=ALLQ znmr%MJYhCL*Z!_1ru@Qe!+dzCbS_c8AeWfs$48Vc{or%HM_p}R`sB9MsMOK7MNV`Z zu90~)?w*2PQw*_)alIlxuICan7yK_7U%+*)cu!7v{|(nm;OnyY+v2YN++C^BW~oC> z40Bn<(0js}xB0H6W@}PxN=l5f?{#%i+%OxrI;^)S<@$nsf9kFly7jp>K zWQ|fDVitOc*M#ssl6y5WK2-}JF`E?*&YymEbw7BBWyBw_V7J=?Ut+9imV8*(VU33S zFHLiPj)~>V##r#0A7g&k@e*Z13;k7eZopU)`eB%NEFSY?fnUG5p@kFJ3m?E%iGwhw zNq?&m44ON}qU(th`ElT~^mFssM~TGHxjAn1nCPFIlNyEpc49m)b%&1X`T=&rW*aZy z8=ITX>pB(p;eXs?pNWk(U>rbOjctFO#^V$D`Fg_kl<@$1+@94^H?$?%^|#V)C^IV@ zv@y~@lsce2o!B6Mdt@v+^m074tXkHJ@VntwkF2bd(ARO#+J0biY8md&IqbIm)s6d} z`&i;TCu>^x8JsJkkFgF|Qm{D*_da4;9wzEhcWA*z*b19aZ`1?$If*6ob1HvySmt2# z5nD&XN5hE*_2Z4QX0JH}9ccs4!Tq2ajhFCzqGQv7P#;_WJ8$dsBKHu+mLLB^Vq1x> z$z5H)ddx3>|gn8gx;>HD040QztTQ*8w)ED(cxqm#xT@SmBGgtf(=FQjg zwzIFEoD=#o^q}!;>G%2g*R@;wSXh6-4?mOjiuW0yT zT`%xlTqouKOLVwDqwERS!?Zrda}d_l{XPMLy{SAEx<0tgcH_^7Rqgl$&st={lEr_Sa*IZ51{;(4|^Um}hdr!2a z&17sZ_nMX;ZD8Xn%0PUCHQRWMn5{VH<3Ywl*!Q&9iZRUk^b^w8LmKlHo|oO|0QD_f zv!Nca1?8b!#1rmC`_$O>|B@dsu|`2zSc{;4O_%E%B_HN_j2|D%`s<2lj>=l-+2ZWF zKa9J@cy4Z*l0EKR>?vu_Wh)Zy`(jUh4QmX1cGK4_zsv{qO;b|GMtiyPy!)>wT$>AC07#k*2tW7|*r`XCSd|Kx-2 zdiXnxF>VihcquV!LH`u@kY97HjPKd7GVFWgZjSHCt#FYyQ5{FdoXHk!;n#2b9=vC1)KD2H8L7i+|H{EF8fe*klKMhNt8yH)%#Pnd_ zTv=$R{o};@UuQo1Vt&ro{z=GJBeq~(vgh5OYre7VC;U1NdCq+!?8_pC zY_AF9-N&<>k8SuK&tyMQ9(<2E0qxN!apl*OlVuK`686u;uTo~%6F}UBxR~x^zDE3J z`H}a>akuTyWi5E4l(ARz%VdA}Z5f|>1$xW=ZPKgJ?>*2hIpUr z+c(U6;D0=8d_DfM`oYRTxj7j-5L1{R;YZw?E@{*sY4dUD7hy~Q{uODbTw?n8oTlXr zCv1-~*kG{%`=D?3r1JYU{JawL&v$5-^YX0nr&0#yW7Mx%#|1pQpnPaOAB)7AjK zPx*cJu(rmSh_T$MpCo-jlSXZWdE`-rXWo3m~Y*7xvfwc3^yJHbWYhaZ{* zNBvMH{9rz)NriV{@Jo%X@6qSL11BY8hP4Z9hfYj&ERL}s8|qRn^&Ow{y`Gi_pIQ4@ zzTrfJ-jwujFq1O0aP}&ftIaN30uPjgRl^piZ!PqwHJ3KG^

J8nw`Fmjv`*OU=*cv7 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 aLR~G5^Y!vKQU1+a0;?~a@}K561O7K)IQupL literal 0 HcmV?d00001 diff --git a/build/llex.d b/build/llex.d new file mode 100644 index 0000000..718ad6a --- /dev/null +++ b/build/llex.d @@ -0,0 +1,53 @@ +llex.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llex.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lctype.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llex.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lparser.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lctype.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llex.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lparser.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h: diff --git a/build/llex.o b/build/llex.o new file mode 100644 index 0000000000000000000000000000000000000000..bb69c40ccd2eb406ccde6597bae7ec3a00c9a955 GIT binary patch literal 15208 zcmeHOeQ;FQbw6)+5dsle7-0)cqPGHUS;2}R0t*ibPXc26K_g?uLy~EcL)JhVe>XMzUduQ3QZZU-^Wl)5lQ4vvMBw$x6i_!~ReBM~>jB~GxxF`HQ4{?2{p zN>5k2lT7~Z)9l{+e)rt-bqq%P)B>SB-%+2{vC^l}MN%CYE(9a8uGB_T>#2^4)t&Q4t+S1KkuOfpQY8tfwOQHBLG51Fn)vZm2;^4ij1~S5-&>hZc_wpv9I<}8xp9NiH zk&|K_pj%-`VOALd+b$T}#&)qy?8{5RKv^*446|)a*RaA#v0Vd1D_!_8@&)gn?M^-z zy5k<)7tf)1X@Kf1jE@HA9hwLFhHD-8-m{u)c-0}%ZQ%WM`s%S@ zVHwY7y5HlTZT9PTDQK0=TjHeL2c4nCA^3{|=g-03NWe)o=1{7zC0xaR(>@!!xb2yb z=TWMjtn<0h?;Dr5z3PJYm%Ki(jpevGPAU?hRPSs`eLT-eG2cwQSnmMrV}1W6oqklW zht`kf%qM49`*AEdzwBkuMM~HYP71O3GS(^;o|nNJciH5i}|2WC_M*wuqiJRhLe?Sbu2 z@IFwn2HUmYc zV>R}v-w)W&8TTpc!h1Aj>Lc-52%nQZ)yLTDQ+O*MmwG-96>YjNM0NLBh=)jyGi=e} zD=9>Ci=lrchlVK#8&nK=c|!TonCrlo=DLp2beX)SzlPq-gZuBHZy}C2#>0rC0Q_eA zV#$kl@i**4ydUB{X~D*|AzFR_{>2`_zL|IE@0TPu&&AxT48F~#%ZEN)erx!XW#~0t zoPj4|ZkkWo7PfhKb3*#F>HDa9mZ#6)3l#V75!Piim+Iz2x1-3(P+%AKqVk!}(*wY7g$|pKY8jR6yYY187;+o)sKC8H20UMQd-p$?Kl0>Q z&_aIp@)2V3$mlv}xcFg;+t^=Yw>iTO)>@wjW03X9HN02ls1^ZzH zIx=6*^?ZL^blw3TtT)cNiSd7y{+nnm#5133Tw{chi+&lrs*LNL9V)+iwb26w4?H2f z50xOMS+^I)y|^CV`s|ea1G-(v8U5_PPa1oC{acZ~2BL!MgW-p4Dt^O%7OsR(SWYkez`Tn?&PUG8ocrgOvF<;H z?xrkD&V1~>GS2fSW_WfU&Om!&({#Oxk@tAb?Tu8&=OO!*{b`?!RPCqSRb#=c)gB(e zdaw-CvSoVxKWSWtn(NxAizgsfMl)C4@cp5Qn^|Nicye@>jusFH-Xdt=p zSK!6?KQbPo4|m>5b@r#}qpTm}sn!tUlKS~P+?2sqYr}N8moSfOqhwC#Sh8BxkHf_m zupd+DiSzYWpL%+Xh#o)7U{knyI&WQbS;)28rdNfRBfL0%P5)Fo8F-!Z*5tsYNnRtu zi(oJNXCHX!xL{vYX7Is*uT165drqH)yw@%_TK&%ltX5~amxl;GXy8oJs{@YgEv8nE%671sl&ISMl>k5ca9LWu)dlwQ$pY>x-QG_Me$9vs%~o$hEu= z&w_U*TgJ*W*mB&nC46==o|Z{Gjh1-vG&_S|+_I^>SXZ|3IoQE5aSdXE^W!k?O`lhn zPMym>_3uCDTB<9)O!4jSOzypzS|`~r{{y~*&mw;E5hpKNarzwEC#-mK4%H=*C)L{D zkh^LjYJ~;(=;z4Qc?9Sn$XSs0_zQH0g}6e!sGh~#1ygn7xc$~ln#*xpe+6<7 z>TS(GGJeI4TnDU82jdSTrWaRjZddG&dI4r|C~FlxcF6#8|bc^9+^v}e$A9DQGWH3#>Vz~2!3P2h!Xi|%Ba z*O&%+4Fo99X5Z)1%kZhv@j$+J=3V^b^z-pV!Biiqz5N@+6zpWa+ZR&ZbKw0r{8M

ezzy^3ub`0f3#4!mGLG#FTTel_Cf;MHEPbg}NI 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 Oqw4dTiEr&U4g4RC3PW`O literal 0 HcmV?d00001 diff --git a/build/lmathlib.d b/build/lmathlib.d new file mode 100644 index 0000000..5b3cc4a --- /dev/null +++ b/build/lmathlib.d @@ -0,0 +1,17 @@ +lmathlib.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmathlib.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h: diff --git a/build/lmathlib.o b/build/lmathlib.o new file mode 100644 index 0000000000000000000000000000000000000000..ce0a18edcb6a03de07bd48e2af2e27b2b404108f GIT binary patch literal 17096 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 S*-G|%`Twc|E?Zi9?f(TU$YxCd literal 0 HcmV?d00001 diff --git a/build/loadlib.d b/build/loadlib.d new file mode 100644 index 0000000..014ae55 --- /dev/null +++ b/build/loadlib.d @@ -0,0 +1,17 @@ +loadlib.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/loadlib.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h: diff --git a/build/loadlib.o b/build/loadlib.o new file mode 100644 index 0000000000000000000000000000000000000000..1d91c5579da0d6fe495a5ecec41c161e1a47bc36 GIT binary patch literal 19440 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 literal 0 HcmV?d00001 diff --git a/build/lobject.d b/build/lobject.d new file mode 100644 index 0000000..607f2d3 --- /dev/null +++ b/build/lobject.d @@ -0,0 +1,47 @@ +lobject.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lctype.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lvm.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lctype.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lvm.h: diff --git a/build/lobject.o b/build/lobject.o new file mode 100644 index 0000000000000000000000000000000000000000..a55d1bc9f0c6205ea808212fb71489b5665c745b GIT binary patch literal 11072 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 O4~XRMXC|fC`TrYoFHU0s literal 0 HcmV?d00001 diff --git a/build/lopcodes.d b/build/lopcodes.d new file mode 100644 index 0000000..85fe531 --- /dev/null +++ b/build/lopcodes.d @@ -0,0 +1,17 @@ +lopcodes.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lopcodes.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lopcodes.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lopcodes.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: diff --git a/build/lopcodes.o b/build/lopcodes.o new file mode 100644 index 0000000000000000000000000000000000000000..b5f58ba06bf0099ce5997d626ad3ae0cd849be1d GIT binary patch literal 1080 zcmbtT%}T>S5S}zuvqjL}3VMhrs341$A|eQp;?Kc@C$Eww3l$qvnziW3w-6sh@akju z8s5C=%x1R@o2a03m~ZCGH#7T}hoiIOn&W^m2VP*B85ZE9Kn98qfPn{IqrsTxVL%Rz z@OJ~KFHWr0@B07@%>m}KQ_qEyZg=0`h{gE&N*?ZZ{E--lFcbbxd(+?JZN9CR@Pnh} z*5UoLO5#@T5Wt06l^l8Z8@^uR=M_`tiFRS8q+dX$=}h$(Mlnc-Q5uVkN3a&d;5IzJ zOos_E06e=-WY|NLqa6DtlHyJRk3$&(?`0YAQJN=Fnk3>zn)d(2C2T-vJZm)ytlXr9 z=cA|<^u*aG8>p{kXV$k9$dfGQ0AV)U2hdfoYbf}<%p6cy~_^3sz8V#8B y7tx+g+E-ohrg09D_No3Y#Fpk6qP=(e^rQzYYn=fz*W^tMs_LJ$@W2Q)+Vx-hV>glj literal 0 HcmV?d00001 diff --git a/build/loslib.d b/build/loslib.d new file mode 100644 index 0000000..9f0b3f3 --- /dev/null +++ b/build/loslib.d @@ -0,0 +1,17 @@ +loslib.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/loslib.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h: diff --git a/build/loslib.o b/build/loslib.o new file mode 100644 index 0000000000000000000000000000000000000000..7d12d90bc453579618dcbb1c0aa221ce85209655 GIT binary patch literal 14432 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 literal 0 HcmV?d00001 diff --git a/build/lparser.d b/build/lparser.d new file mode 100644 index 0000000..7adafce --- /dev/null +++ b/build/lparser.d @@ -0,0 +1,59 @@ +lparser.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lparser.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lcode.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llex.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lopcodes.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lparser.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lfunc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lcode.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llex.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lopcodes.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lparser.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lfunc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h: diff --git a/build/lparser.o b/build/lparser.o new file mode 100644 index 0000000000000000000000000000000000000000..d2ae28a39a927ce3ef154e3f20a3d56578ce59bf GIT binary patch literal 29000 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 TK4;@UQD{&FjN8nwO&t9%436Qc literal 0 HcmV?d00001 diff --git a/build/ltablib.d b/build/ltablib.d new file mode 100644 index 0000000..60c0dd1 --- /dev/null +++ b/build/ltablib.d @@ -0,0 +1,17 @@ +ltablib.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltablib.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h: diff --git a/build/ltablib.o b/build/ltablib.o new file mode 100644 index 0000000000000000000000000000000000000000..73fda74cda71c868f9b36b9160cb1ee73c840e8d GIT binary patch literal 14968 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 TgJGVi|1SHG!gY;1WcL4WCE?69 literal 0 HcmV?d00001 diff --git a/build/ltests.d b/build/ltests.d new file mode 100644 index 0000000..e9c0ddc --- /dev/null +++ b/build/ltests.d @@ -0,0 +1,74 @@ +ltests.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltests.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lapi.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lcode.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llex.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lopcodes.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lparser.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lctype.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lfunc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lopnames.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lapi.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lcode.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llex.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lopcodes.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lparser.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lctype.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lfunc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lopnames.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h: diff --git a/build/ltests.o b/build/ltests.o new file mode 100644 index 0000000000000000000000000000000000000000..24b7a3ffd3bdcdcbe51b24b1d5f2594b00c8d6cb GIT binary patch literal 824 zcmb<-^>JfjWMqH=MuzPS2p&w7fx!Yv&;cy$z`()4&cNXA>};i=k&;@Lomt{&W};A( znv*p3AYD=fp)+8tlGKV42ECNTl0*i*q~c-*z2yAd+|;}hOyfuukp^l2 z`JD|-qXQZr#zhK#u#h5<1c{;h*a0kyNucXj2P)wJVsiEC0QG{*M2}tvpcn`!Lnt^2 zvmcqp7K<5B9TT85D11N|-nfKUvaKpNfcAgLcvc`hgoqhR*J_<}$NHvLRcg{Clt IP#Rr70Pa*LLjV8( literal 0 HcmV?d00001 diff --git a/build/ltm.d b/build/ltm.d new file mode 100644 index 0000000..1600da6 --- /dev/null +++ b/build/ltm.d @@ -0,0 +1,47 @@ +ltm.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lvm.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lvm.h: diff --git a/build/ltm.o b/build/ltm.o new file mode 100644 index 0000000000000000000000000000000000000000..f8ac42b398e5612f5510d9f5d5f705bc2d5da46f GIT binary patch literal 8056 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 literal 0 HcmV?d00001 diff --git a/build/lutf8lib.d b/build/lutf8lib.d new file mode 100644 index 0000000..4066e7f --- /dev/null +++ b/build/lutf8lib.d @@ -0,0 +1,17 @@ +lutf8lib.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lutf8lib.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lauxlib.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lualib.h: diff --git a/build/lutf8lib.o b/build/lutf8lib.o new file mode 100644 index 0000000000000000000000000000000000000000..7cc7050dd4f0fa4f15c5ae8efa6d07dfd28172d5 GIT binary patch literal 11152 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 literal 0 HcmV?d00001 diff --git a/build/lvm.d b/build/lvm.d new file mode 100644 index 0000000..a7e44f3 --- /dev/null +++ b/build/lvm.d @@ -0,0 +1,56 @@ +lvm.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lvm.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lfunc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lopcodes.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lvm.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ljumptab.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldebug.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ldo.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lfunc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lgc.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lopcodes.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstring.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltable.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lvm.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ljumptab.h: diff --git a/build/lvm.o b/build/lvm.o new file mode 100644 index 0000000000000000000000000000000000000000..052c750f72d9d9aed7de50e098522d2f56eb99d4 GIT binary patch literal 33992 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 P9gj+iDov=qz3u-G*M%{c literal 0 HcmV?d00001 diff --git a/build/lzio.d b/build/lzio.d new file mode 100644 index 0000000..67b73c7 --- /dev/null +++ b/build/lzio.d @@ -0,0 +1,29 @@ +lzio.o: \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.c \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h \ + /mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lprefix.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lua.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/luaconf.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/llimits.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lmem.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lstate.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lobject.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/ltm.h: + +/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNX/saltysd_plugin_example/source/lua/lzio.h: diff --git a/build/lzio.o b/build/lzio.o new file mode 100644 index 0000000000000000000000000000000000000000..79c2bcfc1bf577353b710475daee9334209091e4 GIT binary patch literal 1832 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 UJMcG*x$EDim#GAbiJ;g2KR@&D6#xJL literal 0 HcmV?d00001 diff --git a/build/saltysd_plugin_example.lst b/build/saltysd_plugin_example.lst new file mode 100644 index 0000000..e69de29 diff --git a/build/saltysd_plugin_example.map b/build/saltysd_plugin_example.map new file mode 100644 index 0000000..c2c3132 --- /dev/null +++ b/build/saltysd_plugin_example.map @@ -0,0 +1,6403 @@ +Archive member included to satisfy reference by file (symbol) + +/opt/devkitpro//libnx/lib/libnx.a(switch_crt0.o) + (_start) +/opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + /opt/devkitpro//libnx/lib/libnx.a(switch_crt0.o) (__nx_dynamic) +/opt/devkitpro//libnx/lib/libnx.a(init.o) + /opt/devkitpro//libnx/lib/libnx.a(switch_crt0.o) (__stack_top) +/opt/devkitpro//libnx/lib/libnx.a(newlib.o) + /opt/devkitpro//libnx/lib/libnx.a(init.o) (__libnx_init_time) +/opt/devkitpro//libnx/lib/libnx.a(argv.o) + /opt/devkitpro//libnx/lib/libnx.a(init.o) (argvSetup) +/opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + /opt/devkitpro//libnx/lib/libnx.a(init.o) (fsdevMountSdmc) +/opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) (decode_utf8) +/opt/devkitpro//libnx/lib/libnx.a(svc.o) + /opt/devkitpro//libnx/lib/libnx.a(init.o) (svcSetHeapSize) +/opt/devkitpro//libnx/lib/libnx.a(exception.o) + /opt/devkitpro//libnx/lib/libnx.a(switch_crt0.o) (__libnx_exception_entry) +/opt/devkitpro//libnx/lib/libnx.a(readtp.o) + /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) (__aarch64_read_tp) +/opt/devkitpro//libnx/lib/libnx.a(mutex.o) + /opt/devkitpro//libnx/lib/libnx.a(newlib.o) (mutexLock) +/opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + /opt/devkitpro//libnx/lib/libnx.a(init.o) (virtmemSetup) +/opt/devkitpro//libnx/lib/libnx.a(applet.o) + /opt/devkitpro//libnx/lib/libnx.a(init.o) (appletExit) +/opt/devkitpro//libnx/lib/libnx.a(time.o) + /opt/devkitpro//libnx/lib/libnx.a(init.o) (timeExit) +/opt/devkitpro//libnx/lib/libnx.a(hid.o) + /opt/devkitpro//libnx/lib/libnx.a(init.o) (hidExit) +/opt/devkitpro//libnx/lib/libnx.a(fs.o) + /opt/devkitpro//libnx/lib/libnx.a(init.o) (fsInitialize) +/opt/devkitpro//libnx/lib/libnx.a(apm.o) + /opt/devkitpro//libnx/lib/libnx.a(applet.o) (apmExit) +/opt/devkitpro//libnx/lib/libnx.a(sm.o) + /opt/devkitpro//libnx/lib/libnx.a(init.o) (smExit) +/opt/devkitpro//libnx/lib/libnx.a(fatal.o) + /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) (fatalSimple) +/opt/devkitpro//libnx/lib/libnx.a(env.o) + /opt/devkitpro//libnx/lib/libnx.a(init.o) (envSetup) +/opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + /opt/devkitpro//libnx/lib/libnx.a(argv.o) (nxlinkSetup) +/opt/devkitpro//libnx/lib/libnx.a(detect.o) + /opt/devkitpro//libnx/lib/libnx.a(applet.o) (kernelAbove200) +/opt/devkitpro//libnx/lib/libnx.a(tmem.o) + /opt/devkitpro//libnx/lib/libnx.a(applet.o) (tmemCreate) +/opt/devkitpro//libnx/lib/libnx.a(wait.o) + /opt/devkitpro//libnx/lib/libnx.a(applet.o) (waitObjects) +/opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + /opt/devkitpro//libnx/lib/libnx.a(hid.o) (rwlockReadLock) +/opt/devkitpro//libnx/lib/libnx.a(shmem.o) + /opt/devkitpro//libnx/lib/libnx.a(hid.o) (shmemLoadRemote) +/opt/devkitpro//libnx/lib/libnx.a(event.o) + /opt/devkitpro//libnx/lib/libnx.a(applet.o) (eventLoadRemote) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_cos.o) + lmathlib.o (cosf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp.o) + lmathlib.o (expf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_frexp.o) + ltable.o (frexpf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2.o) + lmathlib.o (log2f) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log.o) + lmathlib.o (logf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow.o) + lvm.o (powf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_sin.o) + lmathlib.o (sinf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_tan.o) + lmathlib.o (tanf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_acos.o) + lmathlib.o (acosf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_asin.o) + lmathlib.o (asinf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_atan2.o) + lmathlib.o (atan2f) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_fmod.o) + lmathlib.o (fmodf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_log10.o) + lmathlib.o (log10f) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_acos.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_acos.o) (__ieee754_acosf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_asin.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_asin.o) (__ieee754_asinf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_atan2.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_atan2.o) (__ieee754_atan2f) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_fmod.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_fmod.o) (__ieee754_fmodf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_log10.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_log10.o) (__ieee754_log10f) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_rem_pio2.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_cos.o) (__ieee754_rem_pio2f) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_sqrt.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_acos.o) (__ieee754_sqrtf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_cos.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_cos.o) (__kernel_cosf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_rem_pio2.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_rem_pio2.o) (__kernel_rem_pio2f) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_sin.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_cos.o) (__kernel_sinf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_tan.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_tan.o) (__kernel_tanf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-math_errf.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp.o) (__math_uflowf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_atan.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_atan2.o) (atanf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp2_data.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp.o) (__exp2f_data) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_fabs.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_acos.o) (fabsf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_floor.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_rem_pio2.o) (floorf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2_data.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2.o) (__log2f_data) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log_data.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log.o) (__logf_data) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow_log2_data.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow.o) (__powf_log2_data) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_scalbn.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_rem_pio2.o) (scalbnf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_lib_ver.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_acos.o) (__fdlib_version) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_matherr.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_acos.o) (matherr) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_nan.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_acos.o) (nan) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_copysign.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_scalbn.o) (copysignf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abort.o) + ldo.o (abort) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-bsearch.o) + /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) (bsearch) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-clock.o) + loslib.o (clock) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-difftime.o) + loslib.o (difftime) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-errno.o) + liolib.o (__errno) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-exit.o) + loslib.o (exit) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fclose.o) + liolib.o (fclose) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fflush.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fclose.o) (__sflush_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fgets.o) + ldblib.o (fgets) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fclose.o) (__sfp_lock_acquire) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fini.o) + main.o (__libc_fini_array) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fopen.o) + liolib.o (fopen) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fprintf.o) + liolib.o (fprintf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputc.o) + lauxlib.o (fputc) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputs.o) + lauxlib.o (fputs) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fread.o) + liolib.o (fread) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freer.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fclose.o) (_free_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freopen.o) + lauxlib.o (freopen) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseek.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fopen.o) (_fseek_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseeko.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseek.o) (_fseeko_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftell.o) + liolib.o (ftell) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftello.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftell.o) (_ftello_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fvwrite.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputs.o) (__sfvwrite_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwalk.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) (_fwalk) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwrite.o) + liolib.o (fwrite) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getc.o) + liolib.o (getc) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv.o) + loadlib.o (getenv) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv_r.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv.o) (_findenv_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime.o) + loslib.o (gmtime) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime_r.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime.o) (gmtime_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-impure.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-exit.o) (_global_impure_ptr) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-init.o) + main.o (__libc_init_array) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime.o) + loslib.o (localtime) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime_r.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime.o) (localtime_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-localeconv.o) + liolib.o (localeconv) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-localeconv.o) (__global_locale) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-makebuf.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseeko.o) (__smakebuf_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malign.o) + /opt/devkitpro//libnx/lib/libnx.a(tmem.o) (memalign) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malignr.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malign.o) (_memalign_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malloc.o) + lauxlib.o (free) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) (_malloc_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) (__ascii_mbtowc) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memchr.o) + lstrlib.o (memchr) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memcmp.o) + lstrlib.o (memcmp) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memcpy.o) + lauxlib.o (memcpy) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memmove.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fvwrite.o) (memmove) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memset.o) + /opt/devkitpro//libnx/lib/libnx.a(argv.o) (memset) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mktime.o) + loslib.o (mktime) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mlock.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freer.o) (__malloc_lock) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-month_lengths.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime_r.o) (__month_lengths) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-putc.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputc.o) (_putc_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-realloc.o) + lauxlib.o (realloc) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-reallocr.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fvwrite.o) (_realloc_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-refill.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fgets.o) (__srefill_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-remove.o) + loslib.o (remove) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rename.o) + loslib.o (rename) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rget.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getc.o) (__srget_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv.o) + /opt/devkitpro//libnx/lib/libnx.a(newlib.o) (setenv) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv_r.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv.o) (_setenv_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setjmp.o) + ldo.o (setjmp) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setvbuf.o) + liolib.o (setvbuf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abort.o) (raise) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-snprintf.o) + lstrlib.o (snprintf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) (__sread) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcasecmp.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) (strcasecmp) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcat.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) (strcat) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strchr.o) + liolib.o (strchr) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcmp.o) + lauxlib.o (strcmp) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcoll.o) + lvm.o (strcoll) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcpy.o) + /opt/devkitpro//libnx/lib/libnx.a(env.o) (strcpy) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strerror.o) + liolib.o (strerror) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) + loslib.o (strftime) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strlcpy.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) (strlcpy) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strlen.o) + liolib.o (strlen) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncasecmp.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) (strncasecmp) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncat.o) + /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) (strncat) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncmp.o) + lauxlib.o (strncmp) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncpy.o) + /opt/devkitpro//libnx/lib/libnx.a(newlib.o) (strncpy) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strnlen.o) + /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) (strnlen) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strpbrk.o) + lstrlib.o (strpbrk) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strspn.o) + liolib.o (strspn) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strstr.o) + lauxlib.o (strstr) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + lobject.o (strtof) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtol.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) (strtol) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoul.o) + /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) (strtoul) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-snprintf.o) (_svfprintf_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-system.o) + loslib.o (system) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-timelocal.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) (_C_time_locale) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-time.o) + lmathlib.o (time) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpfile.o) + liolib.o (tmpfile) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpfile.o) (_tmpnam_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzcalc_limits.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime_r.o) (__tzcalc_limits) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzlock.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime_r.o) (__tz_lock) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime_r.o) (_tzset_unlocked) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset.o) (_tzset_unlocked_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzvars.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) (_timezone) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ungetc.o) + liolib.o (ungetc) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-u_strerr.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strerror.o) (_user_strerror) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fprintf.o) (_vfprintf_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wbuf.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-putc.o) (__swbuf_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcrtomb.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) (_wcrtomb_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsrtombs.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) (_wcsrtombs_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wctomb_r.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) (__ascii_wctomb) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wsetup.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fvwrite.o) (__swsetup_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abs.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) (abs) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-__call_atexit.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-exit.o) (__call_exitprocs) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ctype_.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) (__set_ctype) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-div.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mktime.o) (div) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-dtoa.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) (_dtoa_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-environ.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv_r.o) (environ) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-envlock.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv_r.o) (__env_lock) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fdopen.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpfile.o) (_fdopen_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-flags.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fopen.o) (__sflags) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-gethex.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) (__gethex) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-hexnan.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) (__match) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gettzinfo.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime_r.o) (__gettzinfo) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-labs.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) (labs) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) (_Balloc) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sf_nan.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) (nanf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-s_frexp.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) (frexp) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-siscanf.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) (siscanf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sniprintf.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) (sniprintf) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sprintf.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) (_sprintf_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) (__chclass) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-siscanf.o) (__ssvfiscanf_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) (__sprint_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsnrtombs.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsrtombs.o) (_wcsnrtombs_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-callocr.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) (_calloc_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-iswspace.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) (iswspace) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-iswspace.o) (_jp2uc) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbrtowc.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) (_mbrtowc_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sccl.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) (__sccl) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoll.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) (_strtoll_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoull.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) (_strtoull_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) (setDefaultDevice) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(close.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) (_close_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(fstat.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseeko.o) (_fstat_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getpid.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) (_getpid_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(gettod.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-time.o) (_gettimeofday_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(isatty.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-makebuf.o) (_isatty_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(kill.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) (_kill_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(lseek.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) (_lseek_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(open.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fopen.o) (_open_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(read.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) (_read_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(sbrk.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freer.o) (_sbrk_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(times.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-clock.o) (_times_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(unlink.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-remove.o) (_unlink_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(write.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) (_write_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(_exit.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abort.o) (_exit) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(malloc_vars.o) + main.o (fake_heap_start) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) (chdir) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(rename.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rename.o) (_rename_r) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + /opt/devkitpro//libnx/lib/libnx.a(newlib.o) (__syscalls) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(close.o) (__release_handle) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getreent.o) + liolib.o (__getreent) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(trunctfdf2.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) (__trunctfdf2) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(sfp-exceptions.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(trunctfdf2.o) (__sfp_handle_exceptions) +/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strrchr.o) + /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) (strrchr) + +Allocating common symbols +Common symbol size file + +__nx_exceptiondump 0x340 /opt/devkitpro//libnx/lib/libnx.a(init.o) +__system_argv 0x8 /opt/devkitpro//libnx/lib/libnx.a(argv.o) +__system_argc 0x4 /opt/devkitpro//libnx/lib/libnx.a(argv.o) +orig_ctx 0x8 main.o +__stack_top 0x8 /opt/devkitpro//libnx/lib/libnx.a(init.o) +__nxlink_host 0x4 /opt/devkitpro//libnx/lib/libnx.a(argv.o) +orig_main_thread 0x4 main.o +orig_saved_lr 0x8 main.o + +Discarded input sections + + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + .data.__dso_handle + 0x0000000000000000 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + .comment 0x0000000000000000 0x23 main.o + .data 0x0000000000000000 0x0 liolib.o + .bss 0x0000000000000000 0x0 liolib.o + .comment 0x0000000000000000 0x23 liolib.o + .data 0x0000000000000000 0x0 lmem.o + .bss 0x0000000000000000 0x0 lmem.o + .comment 0x0000000000000000 0x23 lmem.o + .data 0x0000000000000000 0x0 lauxlib.o + .bss 0x0000000000000000 0x0 lauxlib.o + .comment 0x0000000000000000 0x23 lauxlib.o + .data 0x0000000000000000 0x0 ldebug.o + .bss 0x0000000000000000 0x0 ldebug.o + .comment 0x0000000000000000 0x23 ldebug.o + .data 0x0000000000000000 0x0 ldo.o + .bss 0x0000000000000000 0x0 ldo.o + .comment 0x0000000000000000 0x23 ldo.o + .data 0x0000000000000000 0x0 loadlib.o + .bss 0x0000000000000000 0x0 loadlib.o + .comment 0x0000000000000000 0x23 loadlib.o + .data 0x0000000000000000 0x0 lmathlib.o + .bss 0x0000000000000000 0x0 lmathlib.o + .comment 0x0000000000000000 0x23 lmathlib.o + .text 0x0000000000000000 0x0 lctype.o + .data 0x0000000000000000 0x0 lctype.o + .bss 0x0000000000000000 0x0 lctype.o + .comment 0x0000000000000000 0x23 lctype.o + .data 0x0000000000000000 0x0 lstate.o + .bss 0x0000000000000000 0x0 lstate.o + .comment 0x0000000000000000 0x23 lstate.o + .text 0x0000000000000000 0x0 lopcodes.o + .data 0x0000000000000000 0x0 lopcodes.o + .bss 0x0000000000000000 0x0 lopcodes.o + .comment 0x0000000000000000 0x23 lopcodes.o + .data 0x0000000000000000 0x0 lstrlib.o + .bss 0x0000000000000000 0x0 lstrlib.o + .comment 0x0000000000000000 0x23 lstrlib.o + .data 0x0000000000000000 0x0 loslib.o + .bss 0x0000000000000000 0x0 loslib.o + .comment 0x0000000000000000 0x23 loslib.o + .data 0x0000000000000000 0x0 lbaselib.o + .bss 0x0000000000000000 0x0 lbaselib.o + .comment 0x0000000000000000 0x23 lbaselib.o + .data 0x0000000000000000 0x0 lutf8lib.o + .bss 0x0000000000000000 0x0 lutf8lib.o + .comment 0x0000000000000000 0x23 lutf8lib.o + .data 0x0000000000000000 0x0 lparser.o + .bss 0x0000000000000000 0x0 lparser.o + .comment 0x0000000000000000 0x23 lparser.o + .data 0x0000000000000000 0x0 llex.o + .bss 0x0000000000000000 0x0 llex.o + .comment 0x0000000000000000 0x23 llex.o + .data 0x0000000000000000 0x0 ldblib.o + .bss 0x0000000000000000 0x0 ldblib.o + .comment 0x0000000000000000 0x23 ldblib.o + .data 0x0000000000000000 0x0 lzio.o + .bss 0x0000000000000000 0x0 lzio.o + .comment 0x0000000000000000 0x23 lzio.o + .data 0x0000000000000000 0x0 ltablib.o + .bss 0x0000000000000000 0x0 ltablib.o + .comment 0x0000000000000000 0x23 ltablib.o + .data 0x0000000000000000 0x0 ltable.o + .bss 0x0000000000000000 0x0 ltable.o + .comment 0x0000000000000000 0x23 ltable.o + .data 0x0000000000000000 0x0 linit.o + .bss 0x0000000000000000 0x0 linit.o + .comment 0x0000000000000000 0x23 linit.o + .data 0x0000000000000000 0x0 ltm.o + .bss 0x0000000000000000 0x0 ltm.o + .comment 0x0000000000000000 0x23 ltm.o + .data 0x0000000000000000 0x0 lgc.o + .bss 0x0000000000000000 0x0 lgc.o + .comment 0x0000000000000000 0x23 lgc.o + .text 0x0000000000000000 0x0 lua.o + .data 0x0000000000000000 0x0 lua.o + .bss 0x0000000000000000 0x0 lua.o + .comment 0x0000000000000000 0x23 lua.o + .data 0x0000000000000000 0x0 lstring.o + .bss 0x0000000000000000 0x0 lstring.o + .comment 0x0000000000000000 0x23 lstring.o + .data 0x0000000000000000 0x0 lvm.o + .bss 0x0000000000000000 0x0 lvm.o + .comment 0x0000000000000000 0x23 lvm.o + .data 0x0000000000000000 0x0 lcode.o + .bss 0x0000000000000000 0x0 lcode.o + .comment 0x0000000000000000 0x23 lcode.o + .data 0x0000000000000000 0x0 lundump.o + .bss 0x0000000000000000 0x0 lundump.o + .comment 0x0000000000000000 0x23 lundump.o + .data 0x0000000000000000 0x0 lcorolib.o + .bss 0x0000000000000000 0x0 lcorolib.o + .comment 0x0000000000000000 0x23 lcorolib.o + .data 0x0000000000000000 0x0 lapi.o + .bss 0x0000000000000000 0x0 lapi.o + .comment 0x0000000000000000 0x23 lapi.o + .data 0x0000000000000000 0x0 lfunc.o + .bss 0x0000000000000000 0x0 lfunc.o + .comment 0x0000000000000000 0x23 lfunc.o + .data 0x0000000000000000 0x0 lobject.o + .bss 0x0000000000000000 0x0 lobject.o + .comment 0x0000000000000000 0x23 lobject.o + .text 0x0000000000000000 0x0 ltests.o + .data 0x0000000000000000 0x0 ltests.o + .bss 0x0000000000000000 0x0 ltests.o + .comment 0x0000000000000000 0x23 ltests.o + .data 0x0000000000000000 0x0 ldump.o + .bss 0x0000000000000000 0x0 ldump.o + .comment 0x0000000000000000 0x23 ldump.o + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(switch_crt0.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(switch_crt0.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(switch_crt0.o) + .debug_line 0x0000000000000000 0xb4 /opt/devkitpro//libnx/lib/libnx.a(switch_crt0.o) + .debug_info 0x0000000000000000 0x2e /opt/devkitpro//libnx/lib/libnx.a(switch_crt0.o) + .debug_abbrev 0x0000000000000000 0x14 /opt/devkitpro//libnx/lib/libnx.a(switch_crt0.o) + .debug_aranges + 0x0000000000000000 0x30 /opt/devkitpro//libnx/lib/libnx.a(switch_crt0.o) + .debug_str 0x0000000000000000 0xa5 /opt/devkitpro//libnx/lib/libnx.a(switch_crt0.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + .debug_info 0x0000000000000000 0x3c9 /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + .debug_abbrev 0x0000000000000000 0x16b /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + .debug_loc 0x0000000000000000 0x1b8 /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + .debug_aranges + 0x0000000000000000 0x30 /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + .debug_ranges 0x0000000000000000 0x20 /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + .debug_line 0x0000000000000000 0x2ac /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + .debug_str 0x0000000000000000 0x80e /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(init.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(init.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(init.o) + .text.__libnx_init + 0x0000000000000000 0x28 /opt/devkitpro//libnx/lib/libnx.a(init.o) + .text.__libnx_exit + 0x0000000000000000 0x20 /opt/devkitpro//libnx/lib/libnx.a(init.o) + .debug_info 0x0000000000000000 0xaab /opt/devkitpro//libnx/lib/libnx.a(init.o) + .debug_abbrev 0x0000000000000000 0x27c /opt/devkitpro//libnx/lib/libnx.a(init.o) + .debug_loc 0x0000000000000000 0x2f6 /opt/devkitpro//libnx/lib/libnx.a(init.o) + .debug_aranges + 0x0000000000000000 0x70 /opt/devkitpro//libnx/lib/libnx.a(init.o) + .debug_ranges 0x0000000000000000 0xa0 /opt/devkitpro//libnx/lib/libnx.a(init.o) + .debug_line 0x0000000000000000 0x647 /opt/devkitpro//libnx/lib/libnx.a(init.o) + .debug_str 0x0000000000000000 0xb9e /opt/devkitpro//libnx/lib/libnx.a(init.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(init.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + .debug_info 0x0000000000000000 0x1f67 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + .debug_abbrev 0x0000000000000000 0x4aa /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + .debug_loc 0x0000000000000000 0xa0d /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + .debug_aranges + 0x0000000000000000 0xc0 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + .debug_ranges 0x0000000000000000 0x1b0 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + .debug_line 0x0000000000000000 0xbfa /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + .debug_str 0x0000000000000000 0x13d3 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(argv.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(argv.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(argv.o) + .debug_info 0x0000000000000000 0xeca /opt/devkitpro//libnx/lib/libnx.a(argv.o) + .debug_abbrev 0x0000000000000000 0x2cb /opt/devkitpro//libnx/lib/libnx.a(argv.o) + .debug_loc 0x0000000000000000 0x6be /opt/devkitpro//libnx/lib/libnx.a(argv.o) + .debug_aranges + 0x0000000000000000 0x30 /opt/devkitpro//libnx/lib/libnx.a(argv.o) + .debug_ranges 0x0000000000000000 0x20 /opt/devkitpro//libnx/lib/libnx.a(argv.o) + .debug_line 0x0000000000000000 0x62b /opt/devkitpro//libnx/lib/libnx.a(argv.o) + .debug_str 0x0000000000000000 0x891 /opt/devkitpro//libnx/lib/libnx.a(argv.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(argv.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .debug_info 0x0000000000000000 0x40be /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .debug_abbrev 0x0000000000000000 0x5c7 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .debug_loc 0x0000000000000000 0x40de /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .debug_aranges + 0x0000000000000000 0x260 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .debug_ranges 0x0000000000000000 0x600 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .debug_line 0x0000000000000000 0x1a42 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .debug_str 0x0000000000000000 0x1983 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + .debug_info 0x0000000000000000 0x170 /opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + .debug_abbrev 0x0000000000000000 0x9e /opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + .debug_loc 0x0000000000000000 0x334 /opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + .debug_aranges + 0x0000000000000000 0x30 /opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + .debug_ranges 0x0000000000000000 0x20 /opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + .debug_line 0x0000000000000000 0x27f /opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + .debug_str 0x0000000000000000 0x230 /opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + .debug_line 0x0000000000000000 0x906 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + .debug_info 0x0000000000000000 0x22 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + .debug_abbrev 0x0000000000000000 0x12 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + .debug_aranges + 0x0000000000000000 0x650 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + .debug_str 0x0000000000000000 0x9c /opt/devkitpro//libnx/lib/libnx.a(svc.o) + .debug_ranges 0x0000000000000000 0x650 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(exception.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(exception.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(exception.o) + .debug_line 0x0000000000000000 0x10f /opt/devkitpro//libnx/lib/libnx.a(exception.o) + .debug_info 0x0000000000000000 0x22 /opt/devkitpro//libnx/lib/libnx.a(exception.o) + .debug_abbrev 0x0000000000000000 0x12 /opt/devkitpro//libnx/lib/libnx.a(exception.o) + .debug_aranges + 0x0000000000000000 0x40 /opt/devkitpro//libnx/lib/libnx.a(exception.o) + .debug_str 0x0000000000000000 0xa3 /opt/devkitpro//libnx/lib/libnx.a(exception.o) + .debug_ranges 0x0000000000000000 0x40 /opt/devkitpro//libnx/lib/libnx.a(exception.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(readtp.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(readtp.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(readtp.o) + .debug_line 0x0000000000000000 0x84 /opt/devkitpro//libnx/lib/libnx.a(readtp.o) + .debug_info 0x0000000000000000 0x2e /opt/devkitpro//libnx/lib/libnx.a(readtp.o) + .debug_abbrev 0x0000000000000000 0x14 /opt/devkitpro//libnx/lib/libnx.a(readtp.o) + .debug_aranges + 0x0000000000000000 0x30 /opt/devkitpro//libnx/lib/libnx.a(readtp.o) + .debug_str 0x0000000000000000 0xa0 /opt/devkitpro//libnx/lib/libnx.a(readtp.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + .debug_info 0x0000000000000000 0x738 /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + .debug_abbrev 0x0000000000000000 0x1fe /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + .debug_loc 0x0000000000000000 0x3d1 /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + .debug_aranges + 0x0000000000000000 0x80 /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + .debug_ranges 0x0000000000000000 0x470 /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + .debug_line 0x0000000000000000 0x593 /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + .debug_str 0x0000000000000000 0x351 /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .debug_info 0x0000000000000000 0xaae /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .debug_abbrev 0x0000000000000000 0x2c6 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .debug_loc 0x0000000000000000 0x668 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .debug_aranges + 0x0000000000000000 0x70 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .debug_ranges 0x0000000000000000 0x170 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .debug_line 0x0000000000000000 0x5cd /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .debug_str 0x0000000000000000 0x957 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .data.__nx_applet_type + 0x0000000000000000 0x4 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .debug_info 0x0000000000000000 0x121a0 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .debug_abbrev 0x0000000000000000 0x75d /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .debug_loc 0x0000000000000000 0x1f223 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .debug_aranges + 0x0000000000000000 0x570 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .debug_ranges 0x0000000000000000 0x79f0 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .debug_line 0x0000000000000000 0x9aec /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .debug_str 0x0000000000000000 0x2c06 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(time.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(time.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(time.o) + .debug_info 0x0000000000000000 0x2f59 /opt/devkitpro//libnx/lib/libnx.a(time.o) + .debug_abbrev 0x0000000000000000 0x544 /opt/devkitpro//libnx/lib/libnx.a(time.o) + .debug_loc 0x0000000000000000 0x36b5 /opt/devkitpro//libnx/lib/libnx.a(time.o) + .debug_aranges + 0x0000000000000000 0xa0 /opt/devkitpro//libnx/lib/libnx.a(time.o) + .debug_ranges 0x0000000000000000 0xa30 /opt/devkitpro//libnx/lib/libnx.a(time.o) + .debug_line 0x0000000000000000 0x1163 /opt/devkitpro//libnx/lib/libnx.a(time.o) + .debug_str 0x0000000000000000 0x14f2 /opt/devkitpro//libnx/lib/libnx.a(time.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(time.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .debug_info 0x0000000000000000 0x8966 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .debug_abbrev 0x0000000000000000 0x6c5 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .debug_loc 0x0000000000000000 0xd56e /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .debug_aranges + 0x0000000000000000 0x390 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .debug_ranges 0x0000000000000000 0x2250 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .debug_line 0x0000000000000000 0x3d32 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .debug_str 0x0000000000000000 0x2e38 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .debug_info 0x0000000000000000 0x105b9 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .debug_abbrev 0x0000000000000000 0x6bc /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .debug_loc 0x0000000000000000 0x1d277 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .debug_aranges + 0x0000000000000000 0x430 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .debug_ranges 0x0000000000000000 0x9700 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .debug_line 0x0000000000000000 0x892d /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .debug_str 0x0000000000000000 0x1e77 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + .debug_info 0x0000000000000000 0x1b1c /opt/devkitpro//libnx/lib/libnx.a(apm.o) + .debug_abbrev 0x0000000000000000 0x442 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + .debug_loc 0x0000000000000000 0x23af /opt/devkitpro//libnx/lib/libnx.a(apm.o) + .debug_aranges + 0x0000000000000000 0x80 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + .debug_ranges 0x0000000000000000 0x610 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + .debug_line 0x0000000000000000 0xc35 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + .debug_str 0x0000000000000000 0x9f9 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .debug_info 0x0000000000000000 0x1dc4 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .debug_abbrev 0x0000000000000000 0x446 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .debug_loc 0x0000000000000000 0x2c40 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .debug_aranges + 0x0000000000000000 0xc0 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .debug_ranges 0x0000000000000000 0x670 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .debug_line 0x0000000000000000 0xe32 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .debug_str 0x0000000000000000 0xf7a /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + .debug_info 0x0000000000000000 0xd3a /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + .debug_abbrev 0x0000000000000000 0x368 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + .debug_loc 0x0000000000000000 0x895 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + .debug_aranges + 0x0000000000000000 0x60 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + .debug_ranges 0x0000000000000000 0x240 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + .debug_line 0x0000000000000000 0x5d6 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + .debug_str 0x0000000000000000 0x726 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .debug_info 0x0000000000000000 0x111a /opt/devkitpro//libnx/lib/libnx.a(env.o) + .debug_abbrev 0x0000000000000000 0x322 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .debug_loc 0x0000000000000000 0x362 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .debug_aranges + 0x0000000000000000 0x130 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .debug_ranges 0x0000000000000000 0x120 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .debug_line 0x0000000000000000 0x71b /opt/devkitpro//libnx/lib/libnx.a(env.o) + .debug_str 0x0000000000000000 0x1055 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + .debug_info 0x0000000000000000 0xb45 /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + .debug_abbrev 0x0000000000000000 0x242 /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + .debug_aranges + 0x0000000000000000 0x30 /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + .debug_ranges 0x0000000000000000 0x20 /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + .debug_line 0x0000000000000000 0x297 /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + .debug_str 0x0000000000000000 0x6c6 /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .debug_info 0x0000000000000000 0x46b /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .debug_abbrev 0x0000000000000000 0x12a /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .debug_aranges + 0x0000000000000000 0x90 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .debug_ranges 0x0000000000000000 0xb0 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .debug_line 0x0000000000000000 0x3a8 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .debug_str 0x0000000000000000 0x300 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + .debug_info 0x0000000000000000 0xff7 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + .debug_abbrev 0x0000000000000000 0x397 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + .debug_loc 0x0000000000000000 0x6e2 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + .debug_aranges + 0x0000000000000000 0x80 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + .debug_ranges 0x0000000000000000 0xf0 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + .debug_line 0x0000000000000000 0x4d5 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + .debug_str 0x0000000000000000 0xd26 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(wait.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(wait.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(wait.o) + .debug_info 0x0000000000000000 0xdfc /opt/devkitpro//libnx/lib/libnx.a(wait.o) + .debug_abbrev 0x0000000000000000 0x35d /opt/devkitpro//libnx/lib/libnx.a(wait.o) + .debug_loc 0x0000000000000000 0xfc5 /opt/devkitpro//libnx/lib/libnx.a(wait.o) + .debug_aranges + 0x0000000000000000 0x60 /opt/devkitpro//libnx/lib/libnx.a(wait.o) + .debug_ranges 0x0000000000000000 0x290 /opt/devkitpro//libnx/lib/libnx.a(wait.o) + .debug_line 0x0000000000000000 0x74f /opt/devkitpro//libnx/lib/libnx.a(wait.o) + .debug_str 0x0000000000000000 0x9b9 /opt/devkitpro//libnx/lib/libnx.a(wait.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(wait.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + .debug_info 0x0000000000000000 0x3cd /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + .debug_abbrev 0x0000000000000000 0x178 /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + .debug_loc 0x0000000000000000 0x246 /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + .debug_aranges + 0x0000000000000000 0x70 /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + .debug_ranges 0x0000000000000000 0x90 /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + .debug_line 0x0000000000000000 0x2e7 /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + .debug_str 0x0000000000000000 0x2b4 /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + .debug_info 0x0000000000000000 0xe85 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + .debug_abbrev 0x0000000000000000 0x36c /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + .debug_loc 0x0000000000000000 0x442 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + .debug_aranges + 0x0000000000000000 0x70 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + .debug_ranges 0x0000000000000000 0xe0 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + .debug_line 0x0000000000000000 0x3cd /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + .debug_str 0x0000000000000000 0xc71 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + .text 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(event.o) + .data 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(event.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro//libnx/lib/libnx.a(event.o) + .debug_info 0x0000000000000000 0x702 /opt/devkitpro//libnx/lib/libnx.a(event.o) + .debug_abbrev 0x0000000000000000 0x28b /opt/devkitpro//libnx/lib/libnx.a(event.o) + .debug_loc 0x0000000000000000 0x2e3 /opt/devkitpro//libnx/lib/libnx.a(event.o) + .debug_aranges + 0x0000000000000000 0x80 /opt/devkitpro//libnx/lib/libnx.a(event.o) + .debug_ranges 0x0000000000000000 0xe0 /opt/devkitpro//libnx/lib/libnx.a(event.o) + .debug_line 0x0000000000000000 0x378 /opt/devkitpro//libnx/lib/libnx.a(event.o) + .debug_str 0x0000000000000000 0x927 /opt/devkitpro//libnx/lib/libnx.a(event.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro//libnx/lib/libnx.a(event.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_cos.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_cos.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_cos.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_cos.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_frexp.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_frexp.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_frexp.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_frexp.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_sin.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_sin.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_sin.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_sin.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_tan.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_tan.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_tan.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_tan.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_acos.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_acos.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_acos.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_acos.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_asin.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_asin.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_asin.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_asin.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_atan2.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_atan2.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_atan2.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_atan2.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_fmod.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_fmod.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_fmod.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_fmod.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_log10.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_log10.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_log10.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_log10.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_acos.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_acos.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_acos.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_acos.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_asin.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_asin.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_asin.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_asin.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_atan2.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_atan2.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_atan2.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_atan2.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_fmod.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_fmod.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_fmod.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_fmod.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_log10.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_log10.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_log10.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_log10.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_rem_pio2.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_rem_pio2.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_rem_pio2.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_rem_pio2.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_sqrt.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_sqrt.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_sqrt.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_sqrt.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_cos.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_cos.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_cos.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_cos.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_rem_pio2.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_rem_pio2.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_rem_pio2.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_rem_pio2.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_sin.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_sin.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_sin.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_sin.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_tan.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_tan.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_tan.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_tan.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-math_errf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-math_errf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-math_errf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-math_errf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_atan.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_atan.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_atan.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_atan.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp2_data.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp2_data.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp2_data.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp2_data.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_fabs.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_fabs.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_fabs.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_fabs.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_floor.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_floor.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_floor.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_floor.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2_data.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2_data.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2_data.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2_data.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log_data.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log_data.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log_data.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log_data.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow_log2_data.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow_log2_data.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow_log2_data.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow_log2_data.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_scalbn.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_scalbn.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_scalbn.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_scalbn.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_lib_ver.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_lib_ver.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_lib_ver.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_lib_ver.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_matherr.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_matherr.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_matherr.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_matherr.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_nan.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_nan.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_nan.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_nan.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_copysign.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_copysign.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_copysign.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_copysign.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abort.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abort.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abort.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abort.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-bsearch.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-bsearch.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-bsearch.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-bsearch.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-clock.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-clock.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-clock.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-clock.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-difftime.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-difftime.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-difftime.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-difftime.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-errno.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-errno.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-errno.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-errno.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-exit.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-exit.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-exit.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-exit.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fclose.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fclose.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fclose.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fclose.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fflush.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fflush.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fflush.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fflush.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fgets.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fgets.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fgets.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fgets.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fini.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fini.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fini.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fini.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fopen.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fopen.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fopen.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fopen.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fprintf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fprintf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fprintf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fprintf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputc.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputc.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputc.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputc.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputs.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputs.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputs.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputs.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fread.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fread.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fread.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fread.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freer.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freer.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freer.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freer.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freopen.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freopen.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freopen.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freopen.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseek.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseek.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseek.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseek.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseeko.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseeko.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseeko.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseeko.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftell.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftell.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftell.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftell.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftello.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftello.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftello.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftello.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fvwrite.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fvwrite.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fvwrite.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fvwrite.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwalk.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwalk.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwalk.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwalk.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwrite.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwrite.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwrite.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwrite.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getc.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getc.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getc.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getc.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv_r.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv_r.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv_r.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv_r.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime_r.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime_r.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime_r.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime_r.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-impure.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-impure.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-impure.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-impure.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-init.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-init.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-init.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-init.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime_r.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime_r.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime_r.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime_r.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-localeconv.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-localeconv.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-localeconv.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-localeconv.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-makebuf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-makebuf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-makebuf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-makebuf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malign.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malign.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malign.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malign.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malignr.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malignr.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malignr.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malignr.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malloc.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malloc.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malloc.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malloc.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memchr.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memchr.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memcmp.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memcmp.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memcpy.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memcpy.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memmove.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memmove.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memset.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memset.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mktime.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mktime.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mktime.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mktime.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mlock.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mlock.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mlock.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mlock.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-month_lengths.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-month_lengths.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-month_lengths.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-month_lengths.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-putc.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-putc.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-putc.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-putc.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-realloc.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-realloc.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-realloc.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-realloc.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-reallocr.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-reallocr.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-reallocr.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-reallocr.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-refill.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-refill.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-refill.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-refill.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-remove.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-remove.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-remove.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-remove.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rename.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rename.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rename.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rename.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rget.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rget.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rget.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rget.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv_r.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv_r.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv_r.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv_r.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setjmp.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setjmp.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setvbuf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setvbuf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setvbuf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setvbuf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-snprintf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-snprintf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-snprintf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-snprintf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcasecmp.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcasecmp.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcasecmp.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcasecmp.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcat.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcat.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcat.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcat.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strchr.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strchr.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcmp.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcmp.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcoll.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcoll.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcoll.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcoll.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcpy.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcpy.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strerror.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strerror.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strerror.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strerror.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strlcpy.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strlcpy.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strlcpy.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strlcpy.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strlen.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strlen.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncasecmp.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncasecmp.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncasecmp.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncasecmp.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncat.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncat.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncat.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncat.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncmp.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncmp.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncpy.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncpy.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncpy.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncpy.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strnlen.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strnlen.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strpbrk.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strpbrk.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strpbrk.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strpbrk.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strspn.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strspn.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strspn.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strspn.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strstr.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strstr.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strstr.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strstr.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtol.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtol.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtol.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtol.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoul.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoul.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoul.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoul.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-system.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-system.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-system.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-system.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-timelocal.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-timelocal.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-timelocal.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-timelocal.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-time.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-time.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-time.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-time.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpfile.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpfile.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpfile.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpfile.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzcalc_limits.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzcalc_limits.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzcalc_limits.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzcalc_limits.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzlock.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzlock.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzlock.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzlock.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzvars.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzvars.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzvars.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzvars.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ungetc.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ungetc.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ungetc.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ungetc.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-u_strerr.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-u_strerr.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-u_strerr.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-u_strerr.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wbuf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wbuf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wbuf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wbuf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcrtomb.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcrtomb.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcrtomb.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcrtomb.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsrtombs.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsrtombs.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsrtombs.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsrtombs.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wctomb_r.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wctomb_r.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wctomb_r.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wctomb_r.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wsetup.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wsetup.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wsetup.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wsetup.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abs.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abs.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abs.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abs.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-__call_atexit.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-__call_atexit.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-__call_atexit.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-__call_atexit.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ctype_.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ctype_.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ctype_.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ctype_.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-div.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-div.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-div.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-div.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-dtoa.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-dtoa.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-dtoa.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-dtoa.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-environ.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-environ.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-environ.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-environ.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-envlock.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-envlock.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-envlock.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-envlock.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fdopen.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fdopen.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fdopen.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fdopen.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-flags.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-flags.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-flags.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-flags.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-gethex.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-gethex.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-gethex.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-gethex.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-hexnan.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-hexnan.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-hexnan.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-hexnan.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gettzinfo.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gettzinfo.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gettzinfo.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gettzinfo.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-labs.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-labs.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-labs.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-labs.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sf_nan.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sf_nan.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sf_nan.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sf_nan.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-s_frexp.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-s_frexp.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-s_frexp.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-s_frexp.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-siscanf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-siscanf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-siscanf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-siscanf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sniprintf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sniprintf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sniprintf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sniprintf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sprintf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sprintf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sprintf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sprintf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsnrtombs.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsnrtombs.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsnrtombs.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsnrtombs.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-callocr.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-callocr.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-callocr.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-callocr.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-iswspace.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-iswspace.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-iswspace.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-iswspace.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbrtowc.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbrtowc.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbrtowc.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbrtowc.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sccl.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sccl.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sccl.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sccl.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoll.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoll.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoll.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoll.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoull.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoull.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoull.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoull.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(close.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(close.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(close.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(close.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(fstat.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(fstat.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(fstat.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(fstat.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getpid.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getpid.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getpid.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getpid.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(gettod.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(gettod.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(gettod.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(gettod.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(isatty.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(isatty.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(isatty.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(isatty.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(kill.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(kill.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(kill.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(kill.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(lseek.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(lseek.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(lseek.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(lseek.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(open.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(open.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(open.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(open.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(read.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(read.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(read.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(read.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(sbrk.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(sbrk.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(sbrk.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(sbrk.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(times.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(times.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(times.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(times.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(unlink.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(unlink.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(unlink.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(unlink.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(write.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(write.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(write.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(write.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(_exit.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(_exit.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(_exit.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(_exit.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(malloc_vars.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(malloc_vars.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(malloc_vars.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(malloc_vars.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(rename.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(rename.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(rename.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(rename.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getreent.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getreent.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getreent.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getreent.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(trunctfdf2.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(trunctfdf2.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(trunctfdf2.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(trunctfdf2.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(sfp-exceptions.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(sfp-exceptions.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(sfp-exceptions.o) + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(sfp-exceptions.o) + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strrchr.o) + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strrchr.o) + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtend.o + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtend.o + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtend.o + .comment 0x0000000000000000 0x23 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtend.o + .text 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtn.o + .data 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtn.o + .bss 0x0000000000000000 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtn.o + +Memory Configuration + +Name Origin Length Attributes +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + + 0x0000000000000000 PROVIDE (__start__ = 0x0) + 0x0000000000000000 . = __start__ + +.crt0 0x0000000000000000 0x150 + *(.crt0) + .crt0 0x0000000000000000 0x14c /opt/devkitpro//libnx/lib/libnx.a(switch_crt0.o) + 0x0000000000000000 _start + 0x0000000000000120 __nx_exit + 0x0000000000000130 __nx_mod0 + 0x0000000000000150 . = ALIGN (0x8) + *fill* 0x000000000000014c 0x4 + +.init 0x0000000000000150 0x38 + *(.init) + .init 0x0000000000000150 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + 0x0000000000000150 _init + .init 0x0000000000000168 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtn.o + 0x0000000000000188 . = ALIGN (0x8) + *fill* 0x0000000000000184 0x4 + +.plt 0x0000000000000188 0x90 + *(.plt) + .plt 0x0000000000000188 0x90 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + *(.iplt) + 0x0000000000000218 . = ALIGN (0x8) + +.text 0x0000000000000240 0x639f0 + *(.text.unlikely .text.*_unlikely .text.unlikely.*) + *(.text.exit .text.exit.*) + .text.exit 0x0000000000000240 0x38 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-exit.o) + 0x0000000000000240 exit + *(.text.startup .text.startup.*) + *fill* 0x0000000000000278 0x8 + .text.startup 0x0000000000000280 0x1e4 main.o + 0x0000000000000280 main + *(.text.hot .text.hot.*) + *(.text .stub .text.* .gnu.linkonce.t.*) + *fill* 0x0000000000000464 0x4 + .text.deregister_tm_clones + 0x0000000000000468 0x2c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + *fill* 0x0000000000000494 0x4 + .text.register_tm_clones + 0x0000000000000498 0x38 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + .text.__do_global_dtors_aux + 0x00000000000004d0 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + .text.frame_dummy + 0x0000000000000518 0x34 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + *fill* 0x000000000000054c 0x4 + .text 0x0000000000000550 0x754 main.o + 0x0000000000000550 _ZN3app11peachdaikon32PEACH_PEACHDAIKON_DAIKON_1_POWEREv_replace_with_arg + 0x0000000000000560 _ZN2nn4util14DecompressZlibEPvmPKvmS1_m_intercept + 0x00000000000005f0 _ZN2nn2ro10LoadModuleEPNS0_6ModuleEPKvPvmi_intercept + 0x0000000000000670 ReadFile_intercept + 0x00000000000006f0 ReadFile_intercept2 + 0x0000000000000760 _ZN3app10sv_animcmd6ATTACKEP9lua_State_replace + 0x0000000000000b00 __libnx_init + 0x0000000000000b60 __libnx_exit + 0x0000000000000bb0 _ZN3app11peachdaikon32PEACH_PEACHDAIKON_DAIKON_1_POWEREv_replace + 0x0000000000000be0 attack_code_replace + 0x0000000000000bf0 SaltySD_function_replace + 0x0000000000000c80 SaltySD_function_replace_sym + *fill* 0x0000000000000ca4 0xc + .text 0x0000000000000cb0 0x1cd8 liolib.o + 0x0000000000002840 luaopen_io + *fill* 0x0000000000002988 0x8 + .text 0x0000000000002990 0x354 lmem.o + 0x0000000000002a00 luaM_shrinkvector_ + 0x0000000000002a90 luaM_toobig + 0x0000000000002ab0 luaM_free_ + 0x0000000000002af0 luaM_realloc_ + 0x0000000000002b80 luaM_growaux_ + 0x0000000000002c20 luaM_saferealloc_ + 0x0000000000002c60 luaM_malloc_ + *fill* 0x0000000000002ce4 0xc + .text 0x0000000000002cf0 0x2aa8 lauxlib.o + 0x00000000000033f0 luaL_where + 0x0000000000003490 luaL_error + 0x0000000000003550 luaL_argerror + 0x0000000000003760 luaL_fileresult + 0x0000000000003850 luaL_execresult + 0x00000000000038e0 luaL_newmetatable + 0x00000000000039c0 luaL_setmetatable + 0x0000000000003a10 luaL_testudata + 0x0000000000003ae0 luaL_checkstack + 0x0000000000003b50 luaL_traceback + 0x0000000000003ec0 luaL_checkany + 0x0000000000003f10 luaL_pushresult + 0x0000000000003f90 luaL_pushresultsize + 0x0000000000003fa0 luaL_buffinit + 0x0000000000003fc0 luaL_ref + 0x00000000000040f0 luaL_unref + 0x0000000000004190 luaL_loadfilex + 0x0000000000004450 luaL_loadbufferx + 0x0000000000004480 luaL_loadstring + 0x00000000000044e0 luaL_getmetafield + 0x00000000000045b0 luaL_typeerror + 0x0000000000004690 luaL_checkudata + 0x00000000000046f0 luaL_checktype + 0x0000000000004760 luaL_checklstring + 0x00000000000047e0 luaL_optlstring + 0x0000000000004870 luaL_checkoption + 0x0000000000004930 luaL_checknumber + 0x00000000000049a0 luaL_optnumber + 0x0000000000004a00 luaL_checkinteger + 0x0000000000004ac0 luaL_optinteger + 0x0000000000004b20 luaL_callmeta + 0x0000000000004ba0 luaL_len + 0x0000000000004c20 luaL_tolstring + 0x0000000000004ee0 luaL_setfuncs + 0x0000000000005150 luaL_prepbuffsize + 0x0000000000005200 luaL_addlstring + 0x0000000000005210 luaL_addstring + 0x0000000000005260 luaL_addvalue + 0x0000000000005310 luaL_buffinitsize + 0x0000000000005350 luaL_getsubtable + 0x0000000000005420 luaL_requiref + 0x0000000000005590 luaL_gsub + 0x0000000000005670 luaL_newstate + 0x0000000000005710 luaL_checkversion_ + *fill* 0x0000000000005798 0x8 + .text 0x00000000000057a0 0x1424 ldebug.o + 0x0000000000005d40 luaG_getfuncline + 0x0000000000005e40 lua_sethook + 0x0000000000005eb0 lua_gethook + 0x0000000000005ec0 lua_gethookmask + 0x0000000000005ed0 lua_gethookcount + 0x0000000000005ee0 lua_getstack + 0x0000000000005f30 luaG_findlocal + 0x0000000000006060 lua_getlocal + 0x00000000000060f0 lua_setlocal + 0x0000000000006140 lua_getinfo + 0x0000000000006620 luaG_addinfo + 0x00000000000066b0 luaG_errormsg + 0x0000000000006720 luaG_runerror + 0x0000000000006800 luaG_typeerror + 0x0000000000006850 luaG_concaterror + 0x0000000000006880 luaG_opinterror + 0x00000000000068a0 luaG_forerror + 0x00000000000068d0 luaG_tointerror + 0x0000000000006940 luaG_ordererror + 0x00000000000069c0 luaG_traceexec + *fill* 0x0000000000006bc4 0xc + .text 0x0000000000006bd0 0x15d0 ldo.o + 0x0000000000006c20 luaD_seterrorobj + 0x0000000000006cf0 luaD_throw + 0x0000000000006f20 luaD_rawrunprotected + 0x0000000000006fb0 luaD_reallocstack + 0x00000000000070f0 luaD_growstack + 0x00000000000071e0 luaD_shrinkstack + 0x0000000000007290 luaD_inctop + 0x00000000000072f0 luaD_hook + 0x0000000000007410 luaD_hookcall + 0x0000000000007480 luaD_tryfuncTM + 0x0000000000007510 luaD_poscall + 0x0000000000007860 luaD_pretailcall + 0x0000000000007990 luaD_call + 0x0000000000007c90 luaD_callnoyield + 0x0000000000007d20 lua_resume + 0x0000000000007f80 lua_isyieldable + 0x0000000000007f90 lua_yieldk + 0x0000000000008020 luaD_pcall + 0x00000000000080c0 luaD_protectedparser + .text 0x00000000000081a0 0x12c0 loadlib.o + 0x0000000000009190 luaopen_package + .text 0x0000000000009460 0x1028 lmathlib.o + 0x000000000000a330 luaopen_math + *fill* 0x000000000000a488 0x8 + .text 0x000000000000a490 0x818 lstate.o + 0x000000000000a5f0 luaE_setdebt + 0x000000000000a620 luaE_freeCI + 0x000000000000a700 luaE_enterCcall + 0x000000000000a720 luaE_extendCI + 0x000000000000a840 lua_newstate + 0x000000000000aa00 luaE_shrinkCI + 0x000000000000aa90 lua_newthread + 0x000000000000ab80 luaE_freethread + 0x000000000000abe0 lua_resetthread + 0x000000000000ac80 lua_close + 0x000000000000ac90 luaE_warning + *fill* 0x000000000000aca8 0x8 + .text 0x000000000000acb0 0x3fa0 lstrlib.o + 0x000000000000eb30 luaopen_string + .text 0x000000000000ec50 0xcd0 loslib.o + 0x000000000000f8b0 luaopen_os + .text 0x000000000000f920 0x1874 lbaselib.o + 0x00000000000110e0 luaopen_base + *fill* 0x0000000000011194 0xc + .text 0x00000000000111a0 0xc48 lutf8lib.o + 0x0000000000011d40 luaopen_utf8 + *fill* 0x0000000000011de8 0x8 + .text 0x0000000000011df0 0x357c lparser.o + 0x0000000000015150 luaY_parser + *fill* 0x000000000001536c 0x4 + .text 0x0000000000015370 0x16f8 llex.o + 0x00000000000153e0 luaX_init + 0x0000000000015470 luaX_token2str + 0x0000000000015af0 luaX_syntaxerror + 0x0000000000015b00 luaX_newstring + 0x0000000000016960 luaX_setinput + 0x00000000000169e0 luaX_next + 0x0000000000016a40 luaX_lookahead + *fill* 0x0000000000016a68 0x8 + .text 0x0000000000016a70 0x17a0 ldblib.o + 0x00000000000181a0 luaopen_debug + .text 0x0000000000018210 0x128 lzio.o + 0x0000000000018210 luaZ_fill + 0x0000000000018260 luaZ_init + 0x0000000000018270 luaZ_read + *fill* 0x0000000000018338 0x8 + .text 0x0000000000018340 0x115c ltablib.o + 0x0000000000019430 luaopen_table + *fill* 0x000000000001949c 0x4 + .text 0x00000000000194a0 0x1304 ltable.o + 0x0000000000019770 luaH_realasize + 0x00000000000197b0 luaH_next + 0x0000000000019980 luaH_new + 0x00000000000199c0 luaH_free + 0x0000000000019a10 luaH_getint + 0x0000000000019af0 luaH_getshortstr + 0x0000000000019b50 luaH_getstr + 0x0000000000019bf0 luaH_get + 0x0000000000019d00 luaH_setint + 0x0000000000019d90 luaH_resize + 0x000000000001a0b0 luaH_resizearray + 0x000000000001a0d0 luaH_newkey + 0x000000000001a510 luaH_set + 0x000000000001a570 luaH_getn + *fill* 0x000000000001a7a4 0xc + .text 0x000000000001a7b0 0x78 linit.o + 0x000000000001a7b0 luaL_openlibs + *fill* 0x000000000001a828 0x8 + .text 0x000000000001a830 0x7d8 ltm.o + 0x000000000001a830 luaT_init + 0x000000000001a8b0 luaT_gettm + 0x000000000001a910 luaT_gettmbyobj + 0x000000000001a970 luaT_objtypename + 0x000000000001aa20 luaT_callTM + 0x000000000001aa90 luaT_callTMres + 0x000000000001abe0 luaT_trybinTM + 0x000000000001aca0 luaT_trybinassocTM + 0x000000000001acc0 luaT_trybiniTM + 0x000000000001acf0 luaT_callorderTM + 0x000000000001ad80 luaT_callorderiTM + 0x000000000001adc0 luaT_adjustvarargs + 0x000000000001aee0 luaT_getvarargs + *fill* 0x000000000001b008 0x8 + .text 0x000000000001b010 0x28e4 lgc.o + 0x000000000001cff0 luaC_barrier_ + 0x000000000001d060 luaC_barrierback_ + 0x000000000001d110 luaC_fix + 0x000000000001d140 luaC_newobj + 0x000000000001d190 luaC_checkfinalizer + 0x000000000001d2e0 luaC_changemode + 0x000000000001d340 luaC_freeallobjects + 0x000000000001d410 luaC_runtilstate + 0x000000000001d460 luaC_step + 0x000000000001d7e0 luaC_fullgc + *fill* 0x000000000001d8f4 0xc + .text 0x000000000001d900 0x7f0 lstring.o + 0x000000000001d950 luaS_eqlngstr + 0x000000000001d9b0 luaS_hash + 0x000000000001d9f0 luaS_hashlongstr + 0x000000000001da50 luaS_resize + 0x000000000001dd40 luaS_clearcache + 0x000000000001dd90 luaS_init + 0x000000000001de40 luaS_createlngstrobj + 0x000000000001de90 luaS_remove + 0x000000000001def0 luaS_newlstr + 0x000000000001df60 luaS_new + 0x000000000001e040 luaS_newudata + .text 0x000000000001e0f0 0x4940 lvm.o + 0x000000000001e340 luaV_tonumber_ + 0x000000000001e400 luaV_flttointeger + 0x000000000001e680 luaV_tointegerns + 0x000000000001e6c0 luaV_tointeger + 0x000000000001e880 luaV_finishget + 0x000000000001e9d0 luaV_finishset + 0x000000000001ebd0 luaV_lessthan + 0x000000000001ec10 luaV_lessequal + 0x000000000001ec50 luaV_equalobj + 0x000000000001eec0 luaV_concat + 0x000000000001f160 luaV_objlen + 0x000000000001f270 luaV_idiv + 0x000000000001f2c0 luaV_mod + 0x000000000001f310 luaV_modf + 0x000000000001f380 luaV_shiftl + 0x000000000001f3b0 luaV_finishOp + 0x000000000001f4f0 luaV_execute + .text 0x0000000000022a30 0x2940 lcode.o + 0x0000000000023560 luaK_semerror + 0x0000000000023570 luaK_nil + 0x0000000000023630 luaK_concat + 0x00000000000236a0 luaK_jump + 0x00000000000236b0 luaK_ret + 0x00000000000236e0 luaK_getlabel + 0x0000000000023700 luaK_patchlist + 0x0000000000023710 luaK_patchtohere + 0x0000000000023730 luaK_codeABCk + 0x0000000000023750 luaK_codeABx + 0x0000000000023760 luaK_codeAsBx + 0x0000000000023780 luaK_checkstack + 0x00000000000237c0 luaK_reserveregs + 0x0000000000023810 luaK_stringK + 0x0000000000023840 luaK_int + 0x00000000000238d0 luaK_setreturns + 0x0000000000023930 luaK_setoneret + 0x00000000000239a0 luaK_dischargevars + 0x0000000000023f30 luaK_exp2nextreg + 0x0000000000023f90 luaK_exp2anyreg + 0x00000000000243d0 luaK_exp2anyregup + 0x00000000000243f0 luaK_exp2val + 0x0000000000024410 luaK_exp2RK + 0x00000000000244d0 luaK_storevar + 0x0000000000024610 luaK_self + 0x00000000000246c0 luaK_goiftrue + 0x0000000000024770 luaK_goiffalse + 0x0000000000024810 luaK_isKint + 0x0000000000024840 luaK_indexed + 0x00000000000249a0 luaK_prefix + 0x0000000000024b60 luaK_infix + 0x0000000000024c60 luaK_posfix + 0x0000000000025140 luaK_fixline + 0x0000000000025170 luaK_setlist + 0x0000000000025240 luaK_finish + .text 0x0000000000025370 0xa9c lundump.o + 0x0000000000025ba0 luaU_undump + *fill* 0x0000000000025e0c 0x4 + .text 0x0000000000025e10 0x730 lcorolib.o + 0x00000000000264d0 luaopen_coroutine + .text 0x0000000000026540 0x26d8 lapi.o + 0x0000000000026710 index2value + 0x00000000000267c0 lua_checkstack + 0x0000000000026870 lua_xmove + 0x00000000000268e0 lua_atpanic + 0x00000000000268f0 lua_version + 0x0000000000026900 lua_absindex + 0x0000000000026940 lua_gettop + 0x0000000000026960 lua_settop + 0x00000000000269b0 lua_rotate + 0x0000000000026aa0 lua_copy + 0x0000000000026b30 lua_pushvalue + 0x0000000000026b70 lua_type + 0x0000000000026bb0 lua_typename + 0x0000000000026bd0 lua_iscfunction + 0x0000000000026c00 lua_isinteger + 0x0000000000026c20 lua_isnumber + 0x0000000000026c60 lua_isstring + 0x0000000000026c90 lua_isuserdata + 0x0000000000026cc0 lua_rawequal + 0x0000000000026d40 lua_arith + 0x0000000000026da0 lua_compare + 0x0000000000026e70 lua_stringtonumber + 0x0000000000026eb0 lua_tonumberx + 0x0000000000026f10 lua_tointegerx + 0x0000000000026f70 lua_toboolean + 0x0000000000026fc0 lua_tolstring + 0x0000000000027080 lua_rawlen + 0x00000000000270f0 lua_tocfunction + 0x0000000000027140 lua_touserdata + 0x00000000000271b0 lua_tothread + 0x00000000000271e0 lua_topointer + 0x0000000000027270 lua_pushnil + 0x0000000000027280 lua_pushnumber + 0x00000000000272a0 lua_pushinteger + 0x00000000000272c0 lua_pushlstring + 0x0000000000027330 lua_pushstring + 0x00000000000273a0 lua_pushvfstring + 0x0000000000027400 lua_pushfstring + 0x00000000000274b0 lua_pushcclosure + 0x00000000000275a0 lua_pushboolean + 0x00000000000275d0 lua_pushlightuserdata + 0x00000000000275f0 lua_pushthread + 0x0000000000027620 lua_getglobal + 0x0000000000027660 lua_gettable + 0x0000000000027700 lua_getfield + 0x0000000000027730 lua_geti + 0x0000000000027810 lua_rawget + 0x0000000000027890 lua_rawgeti + 0x0000000000027910 lua_rawgetp + 0x00000000000279a0 lua_createtable + 0x0000000000027a30 lua_getmetatable + 0x0000000000027ab0 lua_getiuservalue + 0x0000000000027b20 lua_setglobal + 0x0000000000027b60 lua_settable + 0x0000000000027c30 lua_setfield + 0x0000000000027c60 lua_seti + 0x0000000000027d70 lua_rawset + 0x0000000000027e00 lua_rawseti + 0x0000000000027e80 lua_rawsetp + 0x0000000000027f20 lua_setmetatable + 0x0000000000028070 lua_setiuservalue + 0x0000000000028110 lua_callk + 0x00000000000281a0 lua_pcallk + 0x00000000000282c0 lua_load + 0x00000000000283a0 lua_dump + 0x00000000000283d0 lua_status + 0x00000000000283e0 lua_gc + 0x00000000000286b0 lua_error + 0x00000000000286c0 lua_next + 0x0000000000028720 lua_toclose + 0x0000000000028790 lua_concat + 0x0000000000028820 lua_len + 0x0000000000028860 lua_getallocf + 0x0000000000028880 lua_setallocf + 0x0000000000028890 lua_setwarnf + 0x00000000000288a0 lua_warning + 0x00000000000288b0 lua_newuserdatauv + 0x0000000000028920 lua_getupvalue + 0x0000000000028a10 lua_setupvalue + 0x0000000000028b30 lua_upvalueid + 0x0000000000028ba0 lua_upvaluejoin + *fill* 0x0000000000028c18 0x8 + .text 0x0000000000028c20 0x6e8 lfunc.o + 0x0000000000028d60 luaF_newCclosure + 0x0000000000028da0 luaF_newLclosure + 0x0000000000028e10 luaF_initupvals + 0x0000000000028eb0 luaF_findupval + 0x0000000000028f20 luaF_newtbcupval + 0x0000000000028fb0 luaF_unlinkupval + 0x0000000000028fd0 luaF_close + 0x00000000000291b0 luaF_newproto + 0x00000000000291f0 luaF_freeproto + 0x00000000000292a0 luaF_getlocalname + *fill* 0x0000000000029308 0x8 + .text 0x0000000000029310 0x10f4 lobject.o + 0x00000000000295a0 luaO_int2fb + 0x0000000000029620 luaO_fb2int + 0x0000000000029640 luaO_ceillog2 + 0x0000000000029680 luaO_rawarith + 0x0000000000029850 luaO_arith + 0x00000000000298c0 luaO_hexavalue + 0x00000000000298f0 luaO_str2num + 0x0000000000029bc0 luaO_utf8esc + 0x0000000000029be0 luaO_tostring + 0x0000000000029cf0 luaO_pushfstring + 0x0000000000029d70 luaO_pushvfstring + 0x000000000002a220 luaO_chunkid + *fill* 0x000000000002a404 0xc + .text 0x000000000002a410 0x7d0 ldump.o + 0x000000000002aa20 luaU_dump + .text.__nx_dynamic + 0x000000000002abe0 0xa0 /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + 0x000000000002abe0 __nx_dynamic + .text.__libnx_initheap + 0x000000000002ac80 0xd8 /opt/devkitpro//libnx/lib/libnx.a(init.o) + 0x000000000002ac80 __libnx_initheap + *fill* 0x000000000002ad58 0x8 + .text.__appInit + 0x000000000002ad60 0xa0 /opt/devkitpro//libnx/lib/libnx.a(init.o) + 0x000000000002ad60 __appInit + .text.__appExit + 0x000000000002ae00 0x44 /opt/devkitpro//libnx/lib/libnx.a(init.o) + 0x000000000002ae00 __appExit + *fill* 0x000000000002ae44 0xc + .text.mutexInit + 0x000000000002ae50 0x8 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + *fill* 0x000000000002ae58 0x8 + .text.rmutexInit + 0x000000000002ae60 0xc /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + *fill* 0x000000000002ae6c 0x4 + .text.__libnx_gtod + 0x000000000002ae70 0x8c /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + 0x000000000002ae70 __libnx_gtod + *fill* 0x000000000002aefc 0x4 + .text.__libnx_clock_settime + 0x000000000002af00 0x20 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + 0x000000000002af00 __libnx_clock_settime + .text.__libnx_nanosleep + 0x000000000002af20 0x28 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + 0x000000000002af20 __libnx_nanosleep + *fill* 0x000000000002af48 0x8 + .text.__libnx_get_reent + 0x000000000002af50 0x34 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + *fill* 0x000000000002af84 0xc + .text.__libnx_clock_gettime + 0x000000000002af90 0xf8 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + 0x000000000002af90 __libnx_clock_gettime + *fill* 0x000000000002b088 0x8 + .text.__libnx_clock_getres + 0x000000000002b090 0x58 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + 0x000000000002b090 __libnx_clock_getres + *fill* 0x000000000002b0e8 0x8 + .text.__libnx_init_time + 0x000000000002b0f0 0x27c /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + 0x000000000002b0f0 __libnx_init_time + *fill* 0x000000000002b36c 0x4 + .text.newlibSetup + 0x000000000002b370 0x118 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + 0x000000000002b370 newlibSetup + *fill* 0x000000000002b488 0x8 + .text.argvSetup + 0x000000000002b490 0x368 /opt/devkitpro//libnx/lib/libnx.a(argv.o) + 0x000000000002b490 argvSetup + *fill* 0x000000000002b7f8 0x8 + .text.fsdev_link + 0x000000000002b800 0x10 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text.fsdev_dirreset + 0x000000000002b810 0x10 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text.fsdev_chmod + 0x000000000002b820 0x10 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text.error_cmp + 0x000000000002b830 0x1c /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002b84c 0x4 + .text.fsdev_translate_error + 0x000000000002b850 0x58 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002b8a8 0x8 + .text.fsdev_fsync + 0x000000000002b8b0 0x40 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text.fsdev_ftruncate + 0x000000000002b8f0 0x60 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text.fsdev_dirclose + 0x000000000002b950 0x20 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text.fsdev_dirnext + 0x000000000002b970 0x16c /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002badc 0x4 + .text.fsdev_close + 0x000000000002bae0 0x1c /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002bafc 0x4 + .text.fsdev_fstat + 0x000000000002bb00 0xa4 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002bba4 0xc + .text.fsdev_seek + 0x000000000002bbb0 0xb0 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text.fsdev_read + 0x000000000002bc60 0x198 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002bdf8 0x8 + .text.fsdev_write + 0x000000000002be00 0x1a0 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text.fsdevFindDevice + 0x000000000002bfa0 0x120 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text._fsdevMountDevice + 0x000000000002c0c0 0x168 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002c228 0x8 + .text.fsdev_getfspath + 0x000000000002c230 0x1fc /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002c42c 0x4 + .text.fsdev_rmdir + 0x000000000002c430 0x70 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text.fsdev_statvfs + 0x000000000002c4a0 0xd4 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002c574 0xc + .text.fsdev_diropen + 0x000000000002c580 0xec /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002c66c 0x4 + .text.fsdev_mkdir + 0x000000000002c670 0x70 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text.fsdev_rename + 0x000000000002c6e0 0x114 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002c7f4 0xc + .text.fsdev_chdir + 0x000000000002c800 0xe8 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002c8e8 0x8 + .text.fsdev_unlink + 0x000000000002c8f0 0x70 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text.fsdev_stat + 0x000000000002c960 0x1bc /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002cb1c 0x4 + .text.fsdev_open + 0x000000000002cb20 0x19c /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002ccbc 0x4 + .text._fsdevUnmountDeviceStruct.part.4 + 0x000000000002ccc0 0xb8 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x000000000002cd78 0x8 + .text.fsdev_fchmod + 0x000000000002cd80 0x10 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .text.fsdevMountDevice + 0x000000000002cd90 0x14 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + 0x000000000002cd90 fsdevMountDevice + *fill* 0x000000000002cda4 0xc + .text.fsdevUnmountDevice + 0x000000000002cdb0 0x3c /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + 0x000000000002cdb0 fsdevUnmountDevice + *fill* 0x000000000002cdec 0x4 + .text.fsdevCommitDevice + 0x000000000002cdf0 0x28 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + 0x000000000002cdf0 fsdevCommitDevice + *fill* 0x000000000002ce18 0x8 + .text.fsdevSetArchiveBit + 0x000000000002ce20 0x68 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + 0x000000000002ce20 fsdevSetArchiveBit + *fill* 0x000000000002ce88 0x8 + .text.fsdevMountSdmc + 0x000000000002ce90 0x158 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + 0x000000000002ce90 fsdevMountSdmc + *fill* 0x000000000002cfe8 0x8 + .text.fsdevUnmountAll + 0x000000000002cff0 0x64 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + 0x000000000002cff0 fsdevUnmountAll + *fill* 0x000000000002d054 0xc + .text.fsdevGetDeviceFileSystem + 0x000000000002d060 0x20 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + 0x000000000002d060 fsdevGetDeviceFileSystem + .text.fsdevGetDefaultFileSystem + 0x000000000002d080 0x40 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + 0x000000000002d080 fsdevGetDefaultFileSystem + .text.fsdev_getmtime + 0x000000000002d0c0 0x20 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + 0x000000000002d0c0 fsdev_getmtime + .text.decode_utf8 + 0x000000000002d0e0 0x12c /opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + 0x000000000002d0e0 decode_utf8 + .text.svcSetHeapSize + 0x000000000002d20c 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d20c svcSetHeapSize + .text.svcSetMemoryPermission + 0x000000000002d220 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d220 svcSetMemoryPermission + .text.svcSetMemoryAttribute + 0x000000000002d228 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d228 svcSetMemoryAttribute + .text.svcMapMemory + 0x000000000002d230 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d230 svcMapMemory + .text.svcUnmapMemory + 0x000000000002d238 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d238 svcUnmapMemory + .text.svcQueryMemory + 0x000000000002d240 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d240 svcQueryMemory + .text.svcExitProcess + 0x000000000002d254 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d254 svcExitProcess + .text.svcCreateThread + 0x000000000002d25c 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d25c svcCreateThread + .text.svcStartThread + 0x000000000002d270 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d270 svcStartThread + .text.svcExitThread + 0x000000000002d278 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d278 svcExitThread + .text.svcSleepThread + 0x000000000002d280 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d280 svcSleepThread + .text.svcGetThreadPriority + 0x000000000002d288 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d288 svcGetThreadPriority + .text.svcSetThreadPriority + 0x000000000002d29c 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d29c svcSetThreadPriority + .text.svcGetThreadCoreMask + 0x000000000002d2a4 0x18 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d2a4 svcGetThreadCoreMask + .text.svcSetThreadCoreMask + 0x000000000002d2bc 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d2bc svcSetThreadCoreMask + .text.svcGetCurrentProcessorNumber + 0x000000000002d2c4 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d2c4 svcGetCurrentProcessorNumber + .text.svcSignalEvent + 0x000000000002d2cc 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d2cc svcSignalEvent + .text.svcClearEvent + 0x000000000002d2d4 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d2d4 svcClearEvent + .text.svcMapSharedMemory + 0x000000000002d2dc 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d2dc svcMapSharedMemory + .text.svcUnmapSharedMemory + 0x000000000002d2e4 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d2e4 svcUnmapSharedMemory + .text.svcCreateTransferMemory + 0x000000000002d2ec 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d2ec svcCreateTransferMemory + .text.svcCloseHandle + 0x000000000002d300 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d300 svcCloseHandle + .text.svcResetSignal + 0x000000000002d308 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d308 svcResetSignal + .text.svcWaitSynchronization + 0x000000000002d310 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d310 svcWaitSynchronization + .text.svcCancelSynchronization + 0x000000000002d324 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d324 svcCancelSynchronization + .text.svcArbitrateLock + 0x000000000002d32c 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d32c svcArbitrateLock + .text.svcArbitrateUnlock + 0x000000000002d334 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d334 svcArbitrateUnlock + .text.svcWaitProcessWideKeyAtomic + 0x000000000002d33c 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d33c svcWaitProcessWideKeyAtomic + .text.svcSignalProcessWideKey + 0x000000000002d344 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d344 svcSignalProcessWideKey + .text.svcGetSystemTick + 0x000000000002d34c 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d34c svcGetSystemTick + .text.svcConnectToNamedPort + 0x000000000002d354 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d354 svcConnectToNamedPort + .text.svcSendSyncRequest + 0x000000000002d368 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d368 svcSendSyncRequest + .text.svcSendSyncRequestWithUserBuffer + 0x000000000002d370 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d370 svcSendSyncRequestWithUserBuffer + .text.svcSendAsyncRequestWithUserBuffer + 0x000000000002d378 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d378 svcSendAsyncRequestWithUserBuffer + .text.svcGetProcessId + 0x000000000002d38c 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d38c svcGetProcessId + .text.svcGetThreadId + 0x000000000002d3a0 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d3a0 svcGetThreadId + .text.svcBreak + 0x000000000002d3b4 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d3b4 svcBreak + .text.svcOutputDebugString + 0x000000000002d3bc 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d3bc svcOutputDebugString + .text.svcReturnFromException + 0x000000000002d3c4 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d3c4 svcReturnFromException + .text.svcGetInfo + 0x000000000002d3cc 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d3cc svcGetInfo + .text.svcMapPhysicalMemory + 0x000000000002d3e0 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d3e0 svcMapPhysicalMemory + .text.svcUnmapPhysicalMemory + 0x000000000002d3e8 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d3e8 svcUnmapPhysicalMemory + .text.svcGetResourceLimitLimitValue + 0x000000000002d3f0 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d3f0 svcGetResourceLimitLimitValue + .text.svcGetResourceLimitCurrentValue + 0x000000000002d404 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d404 svcGetResourceLimitCurrentValue + .text.svcSetThreadActivity + 0x000000000002d418 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d418 svcSetThreadActivity + .text.svcGetThreadContext3 + 0x000000000002d420 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d420 svcGetThreadContext3 + .text.svcCreateSession + 0x000000000002d428 0x18 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d428 svcCreateSession + .text.svcAcceptSession + 0x000000000002d440 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d440 svcAcceptSession + .text.svcReplyAndReceive + 0x000000000002d454 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d454 svcReplyAndReceive + .text.svcReplyAndReceiveWithUserBuffer + 0x000000000002d468 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d468 svcReplyAndReceiveWithUserBuffer + .text.svcCreateEvent + 0x000000000002d47c 0x18 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d47c svcCreateEvent + .text.svcMapPhysicalMemoryUnsafe + 0x000000000002d494 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d494 svcMapPhysicalMemoryUnsafe + .text.svcUnmapPhysicalMemoryUnsafe + 0x000000000002d49c 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d49c svcUnmapPhysicalMemoryUnsafe + .text.svcSetUnsafeLimit + 0x000000000002d4a4 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d4a4 svcSetUnsafeLimit + .text.svcCreateCodeMemory + 0x000000000002d4ac 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d4ac svcCreateCodeMemory + .text.svcControlCodeMemory + 0x000000000002d4c0 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d4c0 svcControlCodeMemory + .text.svcReadWriteRegister + 0x000000000002d4c8 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d4c8 svcReadWriteRegister + .text.svcCreateSharedMemory + 0x000000000002d4dc 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d4dc svcCreateSharedMemory + .text.svcMapTransferMemory + 0x000000000002d4f0 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d4f0 svcMapTransferMemory + .text.svcUnmapTransferMemory + 0x000000000002d4f8 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d4f8 svcUnmapTransferMemory + .text.svcCreateInterruptEvent + 0x000000000002d500 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d500 svcCreateInterruptEvent + .text.svcQueryPhysicalAddress + 0x000000000002d514 0x18 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d514 svcQueryPhysicalAddress + .text.svcQueryIoMapping + 0x000000000002d52c 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d52c svcQueryIoMapping + .text.svcCreateDeviceAddressSpace + 0x000000000002d540 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d540 svcCreateDeviceAddressSpace + .text.svcAttachDeviceAddressSpace + 0x000000000002d554 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d554 svcAttachDeviceAddressSpace + .text.svcDetachDeviceAddressSpace + 0x000000000002d55c 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d55c svcDetachDeviceAddressSpace + .text.svcMapDeviceAddressSpaceByForce + 0x000000000002d564 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d564 svcMapDeviceAddressSpaceByForce + .text.svcMapDeviceAddressSpaceAligned + 0x000000000002d56c 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d56c svcMapDeviceAddressSpaceAligned + .text.svcUnmapDeviceAddressSpace + 0x000000000002d574 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d574 svcUnmapDeviceAddressSpace + .text.svcDebugActiveProcess + 0x000000000002d57c 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d57c svcDebugActiveProcess + .text.svcBreakDebugProcess + 0x000000000002d590 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d590 svcBreakDebugProcess + .text.svcTerminateDebugProcess + 0x000000000002d598 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d598 svcTerminateDebugProcess + .text.svcGetDebugEvent + 0x000000000002d5a0 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d5a0 svcGetDebugEvent + .text.svcLegacyContinueDebugEvent + 0x000000000002d5a8 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d5a8 svcLegacyContinueDebugEvent + .text.svcContinueDebugEvent + 0x000000000002d5b0 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d5b0 svcContinueDebugEvent + .text.svcGetProcessList + 0x000000000002d5b8 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d5b8 svcGetProcessList + .text.svcGetThreadList + 0x000000000002d5cc 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d5cc svcGetThreadList + .text.svcGetDebugThreadContext + 0x000000000002d5e0 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d5e0 svcGetDebugThreadContext + .text.svcSetDebugThreadContext + 0x000000000002d5e8 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d5e8 svcSetDebugThreadContext + .text.svcQueryDebugProcessMemory + 0x000000000002d5f0 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d5f0 svcQueryDebugProcessMemory + .text.svcReadDebugProcessMemory + 0x000000000002d604 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d604 svcReadDebugProcessMemory + .text.svcWriteDebugProcessMemory + 0x000000000002d60c 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d60c svcWriteDebugProcessMemory + .text.svcGetDebugThreadParam + 0x000000000002d614 0x18 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d614 svcGetDebugThreadParam + .text.svcGetSystemInfo + 0x000000000002d62c 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d62c svcGetSystemInfo + .text.svcCreatePort + 0x000000000002d640 0x18 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d640 svcCreatePort + .text.svcManageNamedPort + 0x000000000002d658 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d658 svcManageNamedPort + .text.svcConnectToPort + 0x000000000002d66c 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d66c svcConnectToPort + .text.svcSetProcessMemoryPermission + 0x000000000002d680 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d680 svcSetProcessMemoryPermission + .text.svcMapProcessMemory + 0x000000000002d688 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d688 svcMapProcessMemory + .text.svcUnmapProcessMemory + 0x000000000002d690 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d690 svcUnmapProcessMemory + .text.svcMapProcessCodeMemory + 0x000000000002d698 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d698 svcMapProcessCodeMemory + .text.svcUnmapProcessCodeMemory + 0x000000000002d6a0 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d6a0 svcUnmapProcessCodeMemory + .text.svcCreateProcess + 0x000000000002d6a8 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d6a8 svcCreateProcess + .text.svcStartProcess + 0x000000000002d6bc 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d6bc svcStartProcess + .text.svcTerminateProcess + 0x000000000002d6c4 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d6c4 svcTerminateProcess + .text.svcGetProcessInfo + 0x000000000002d6cc 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d6cc svcGetProcessInfo + .text.svcCreateResourceLimit + 0x000000000002d6e0 0x14 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d6e0 svcCreateResourceLimit + .text.svcSetResourceLimitLimitValue + 0x000000000002d6f4 0x8 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d6f4 svcSetResourceLimitLimitValue + .text.svcCallSecureMonitor + 0x000000000002d6fc 0x34 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x000000000002d6fc svcCallSecureMonitor + .text.__libnx_exception_entry + 0x000000000002d730 0x1c0 /opt/devkitpro//libnx/lib/libnx.a(exception.o) + 0x000000000002d730 __libnx_exception_entry + .text.__libnx_exception_returnentry + 0x000000000002d8f0 0x18 /opt/devkitpro//libnx/lib/libnx.a(exception.o) + 0x000000000002d8f0 __libnx_exception_returnentry + .text.__aarch64_read_tp + 0x000000000002d908 0xc /opt/devkitpro//libnx/lib/libnx.a(readtp.o) + 0x000000000002d908 __aarch64_read_tp + *fill* 0x000000000002d914 0xc + .text.mutexLock + 0x000000000002d920 0x8c /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + 0x000000000002d920 mutexLock + *fill* 0x000000000002d9ac 0x4 + .text.mutexTryLock + 0x000000000002d9b0 0x34 /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + 0x000000000002d9b0 mutexTryLock + *fill* 0x000000000002d9e4 0xc + .text.mutexUnlock + 0x000000000002d9f0 0x30 /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + 0x000000000002d9f0 mutexUnlock + .text.rmutexLock + 0x000000000002da20 0x4c /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + 0x000000000002da20 rmutexLock + *fill* 0x000000000002da6c 0x4 + .text.rmutexTryLock + 0x000000000002da70 0x5c /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + 0x000000000002da70 rmutexTryLock + *fill* 0x000000000002dacc 0x4 + .text.rmutexUnlock + 0x000000000002dad0 0x1c /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + 0x000000000002dad0 rmutexUnlock + *fill* 0x000000000002daec 0x4 + .text._GetRegionFromInfo.isra.1 + 0x000000000002daf0 0x7c /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + *fill* 0x000000000002db6c 0x4 + .text.virtmemSetup + 0x000000000002db70 0x114 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + 0x000000000002db70 virtmemSetup + *fill* 0x000000000002dc84 0xc + .text.virtmemReserve + 0x000000000002dc90 0x13c /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + 0x000000000002dc90 virtmemReserve + *fill* 0x000000000002ddcc 0x4 + .text.virtmemFree + 0x000000000002ddd0 0x4 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + 0x000000000002ddd0 virtmemFree + *fill* 0x000000000002ddd4 0xc + .text.virtmemReserveStack + 0x000000000002dde0 0xc8 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + 0x000000000002dde0 virtmemReserveStack + *fill* 0x000000000002dea8 0x8 + .text.virtmemFreeStack + 0x000000000002deb0 0x4 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + 0x000000000002deb0 virtmemFreeStack + *fill* 0x000000000002deb4 0xc + .text.ipcParse + 0x000000000002dec0 0x22c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002e0ec 0x4 + .text.ipcCloseObjectById + 0x000000000002e0f0 0x34 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002e124 0xc + .text._appletGetSession + 0x000000000002e130 0x1d8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002e308 0x8 + .text._appletReceiveMessage + 0x000000000002e310 0x19c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002e4ac 0x4 + .text._appletGetPerformanceMode.constprop.35 + 0x000000000002e4b0 0x18c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002e63c 0x4 + .text._appletCmdInU8 + 0x000000000002e640 0x17c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002e7bc 0x4 + .text._appletSetOperationModeChangedNotification.constprop.37 + 0x000000000002e7c0 0x164 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002e924 0xc + .text._appletSetPerformanceModeChangedNotification.constprop.38 + 0x000000000002e930 0x164 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002ea94 0xc + .text._appletSetOutOfFocusSuspendingEnabled + 0x000000000002eaa0 0x16c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002ec0c 0x4 + .text._appletGetHandle.constprop.33 + 0x000000000002ec10 0x178 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002ed88 0x8 + .text._appletGetEvent.constprop.32 + 0x000000000002ed90 0x54 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002ede4 0xc + .text._appletWaitLibraryAppletLaunchableEvent + 0x000000000002edf0 0x50 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .text._appletSetFocusHandlingMode + 0x000000000002ee40 0x17c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002efbc 0x4 + .text._appletCmdInHandle64 + 0x000000000002efc0 0x204 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002f1c4 0xc + .text._appletCmdInSession + 0x000000000002f1d0 0x1d8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002f3a8 0x8 + .text._appletGetSessionIn64.constprop.30 + 0x000000000002f3b0 0x1c4 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002f574 0xc + .text._appletStorageGetHandle + 0x000000000002f580 0x19c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002f71c 0x4 + .text._appletGetSessionProxy.constprop.31 + 0x000000000002f720 0x1f0 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .text._appletCreateLibraryApplet + 0x000000000002f910 0x1c4 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002fad4 0xc + .text._appletCreateTransferMemoryStorage.isra.20 + 0x000000000002fae0 0x1e4 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000002fcc4 0xc + .text._appletStorageAccessorRW + 0x000000000002fcd0 0x3f8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000300c8 0x8 + .text.ipcConvertSessionToDomain + 0x00000000000300d0 0xc4 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x0000000000030194 0xc + .text.ipcQueryPointerBufferSize + 0x00000000000301a0 0xc8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x0000000000030268 0x8 + .text._appletStorageRW + 0x0000000000030270 0x108 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x0000000000030378 0x8 + .text.ipcCloneSession.constprop.42 + 0x0000000000030380 0x10c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000003048c 0x4 + .text._appletCmdNoIO + 0x0000000000030490 0x384 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x0000000000030814 0xc + .text._appletCmdNoInOut64 + 0x0000000000030820 0x394 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x0000000000030bb4 0xc + .text._appletGetCurrentFocusState.constprop.36 + 0x0000000000030bc0 0x3ac /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x0000000000030f6c 0x4 + .text._appletGetOperationMode.constprop.34 + 0x0000000000030f70 0x3ac /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000003131c 0x4 + .text.appletGetAppletType + 0x0000000000031320 0x10 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000031320 appletGetAppletType + .text.appletHook + 0x0000000000031330 0x28 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000031330 appletHook + *fill* 0x0000000000031358 0x8 + .text.appletUnhook + 0x0000000000031360 0x34 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000031360 appletUnhook + *fill* 0x0000000000031394 0xc + .text.appletSetThemeColorType + 0x00000000000313a0 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000313a0 appletSetThemeColorType + *fill* 0x00000000000313ac 0x4 + .text.appletGetThemeColorType + 0x00000000000313b0 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000313b0 appletGetThemeColorType + *fill* 0x00000000000313bc 0x4 + .text.appletSetFocusHandlingMode + 0x00000000000313c0 0xec /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000313c0 appletSetFocusHandlingMode + *fill* 0x00000000000314ac 0x4 + .text.appletGetAppletResourceUserId + 0x00000000000314b0 0x28 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000314b0 appletGetAppletResourceUserId + *fill* 0x00000000000314d8 0x8 + .text._appletGetIndirectLayerConsumerHandle + 0x00000000000314e0 0x190 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .text._appletHolderCreate + 0x0000000000031670 0xbc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x000000000003172c 0x4 + .text.appletPopLaunchParameter + 0x0000000000031730 0x1d4 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000031730 appletPopLaunchParameter + *fill* 0x0000000000031904 0xc + .text.appletGetDesiredLanguage + 0x0000000000031910 0x3c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000031910 appletGetDesiredLanguage + *fill* 0x000000000003194c 0x4 + .text.appletSetTerminateResult + 0x0000000000031950 0x19c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000031950 appletSetTerminateResult + *fill* 0x0000000000031aec 0x4 + .text.appletSetMediaPlaybackState + 0x0000000000031af0 0x4c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000031af0 appletSetMediaPlaybackState + *fill* 0x0000000000031b3c 0x4 + .text.appletBeginBlockingHomeButton + 0x0000000000031b40 0x1a8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000031b40 appletBeginBlockingHomeButton + *fill* 0x0000000000031ce8 0x8 + .text.appletEndBlockingHomeButton + 0x0000000000031cf0 0x38 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000031cf0 appletEndBlockingHomeButton + *fill* 0x0000000000031d28 0x8 + .text.appletNotifyRunning + 0x0000000000031d30 0x1b0 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000031d30 appletNotifyRunning + .text.appletIsGamePlayRecordingSupported + 0x0000000000031ee0 0x1a0 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000031ee0 appletIsGamePlayRecordingSupported + .text.appletSetGamePlayRecordingState + 0x0000000000032080 0x1a8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000032080 appletSetGamePlayRecordingState + *fill* 0x0000000000032228 0x8 + .text.appletExit + 0x0000000000032230 0x69c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000032230 appletExit + *fill* 0x00000000000328cc 0x4 + .text.appletInitialize + 0x00000000000328d0 0x4f0 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000328d0 appletInitialize + .text._appletExitProcess + 0x0000000000032dc0 0x10 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .text.appletInitializeGamePlayRecording + 0x0000000000032dd0 0x10c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000032dd0 appletInitializeGamePlayRecording + *fill* 0x0000000000032edc 0x4 + .text.appletLockExit + 0x0000000000032ee0 0x10 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000032ee0 appletLockExit + .text.appletUnlockExit + 0x0000000000032ef0 0x10 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000032ef0 appletUnlockExit + .text.appletSetScreenShotPermission + 0x0000000000032f00 0x16c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000032f00 appletSetScreenShotPermission + *fill* 0x000000000003306c 0x4 + .text.appletSetScreenShotImageOrientation + 0x0000000000033070 0x18c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033070 appletSetScreenShotImageOrientation + *fill* 0x00000000000331fc 0x4 + .text.appletCreateManagedDisplayLayer + 0x0000000000033200 0x14 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033200 appletCreateManagedDisplayLayer + *fill* 0x0000000000033214 0xc + .text.appletCreateLibraryApplet + 0x0000000000033220 0x8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033220 appletCreateLibraryApplet + *fill* 0x0000000000033228 0x8 + .text.appletCreateLibraryAppletSelf + 0x0000000000033230 0x8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033230 appletCreateLibraryAppletSelf + *fill* 0x0000000000033238 0x8 + .text.appletHolderClose + 0x0000000000033240 0x94 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033240 appletHolderClose + *fill* 0x00000000000332d4 0xc + .text.appletHolderGetIndirectLayerConsumerHandle + 0x00000000000332e0 0x70 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000332e0 appletHolderGetIndirectLayerConsumerHandle + .text.appletHolderStart + 0x0000000000033350 0x50 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033350 appletHolderStart + .text.appletHolderJoin + 0x00000000000333a0 0x84 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000333a0 appletHolderJoin + *fill* 0x0000000000033424 0xc + .text.appletHolderGetExitReason + 0x0000000000033430 0x8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033430 appletHolderGetExitReason + *fill* 0x0000000000033438 0x8 + .text.appletHolderWaitInteractiveOut + 0x0000000000033440 0x88 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033440 appletHolderWaitInteractiveOut + *fill* 0x00000000000334c8 0x8 + .text.appletHolderPopOutData + 0x00000000000334d0 0x18 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000334d0 appletHolderPopOutData + *fill* 0x00000000000334e8 0x8 + .text.appletHolderPopInteractiveOutData + 0x00000000000334f0 0x18 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000334f0 appletHolderPopInteractiveOutData + *fill* 0x0000000000033508 0x8 + .text.appletCreateStorage + 0x0000000000033510 0x14 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033510 appletCreateStorage + *fill* 0x0000000000033524 0xc + .text.appletCreateTransferMemoryStorage + 0x0000000000033530 0xa8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033530 appletCreateTransferMemoryStorage + *fill* 0x00000000000335d8 0x8 + .text.appletCreateHandleStorage + 0x00000000000335e0 0x60 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000335e0 appletCreateHandleStorage + .text.appletCreateHandleStorageTmem + 0x0000000000033640 0xa0 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033640 appletCreateHandleStorageTmem + .text.appletStorageClose + 0x00000000000336e0 0x6c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000336e0 appletStorageClose + *fill* 0x000000000003374c 0x4 + .text.appletHolderPushExtraStorage + 0x0000000000033750 0x40 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033750 appletHolderPushExtraStorage + .text.appletHolderPushInteractiveInData + 0x0000000000033790 0x40 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033790 appletHolderPushInteractiveInData + .text.appletPushToGeneralChannel + 0x00000000000337d0 0x4c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000337d0 appletPushToGeneralChannel + *fill* 0x000000000003381c 0x4 + .text.appletHolderPushInData + 0x0000000000033820 0x40 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033820 appletHolderPushInData + .text.appletStorageCloseTmem + 0x0000000000033860 0x8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033860 appletStorageCloseTmem + *fill* 0x0000000000033868 0x8 + .text.appletStorageGetSize + 0x0000000000033870 0xc4 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033870 appletStorageGetSize + *fill* 0x0000000000033934 0xc + .text.appletStorageWrite + 0x0000000000033940 0x8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033940 appletStorageWrite + *fill* 0x0000000000033948 0x8 + .text.appletStorageRead + 0x0000000000033950 0x8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033950 appletStorageRead + *fill* 0x0000000000033958 0x8 + .text.appletStorageGetHandle + 0x0000000000033960 0xf8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033960 appletStorageGetHandle + *fill* 0x0000000000033a58 0x8 + .text.appletStorageMap + 0x0000000000033a60 0xcc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033a60 appletStorageMap + *fill* 0x0000000000033b2c 0x4 + .text.appletGetOperationMode + 0x0000000000033b30 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033b30 appletGetOperationMode + *fill* 0x0000000000033b3c 0x4 + .text.appletGetPerformanceMode + 0x0000000000033b40 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033b40 appletGetPerformanceMode + *fill* 0x0000000000033b4c 0x4 + .text.appletGetFocusState + 0x0000000000033b50 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033b50 appletGetFocusState + *fill* 0x0000000000033b5c 0x4 + .text.appletMainLoop + 0x0000000000033b60 0x17c /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x0000000000033b60 appletMainLoop + *fill* 0x0000000000033cdc 0x4 + .text.ipcCloseObjectById + 0x0000000000033ce0 0x34 /opt/devkitpro//libnx/lib/libnx.a(time.o) + *fill* 0x0000000000033d14 0xc + .text._timeGetSession + 0x0000000000033d20 0x12c /opt/devkitpro//libnx/lib/libnx.a(time.o) + *fill* 0x0000000000033e4c 0x4 + .text.timeExit + 0x0000000000033e50 0x1ec /opt/devkitpro//libnx/lib/libnx.a(time.o) + 0x0000000000033e50 timeExit + *fill* 0x000000000003403c 0x4 + .text.timeInitialize + 0x0000000000034040 0xd8 /opt/devkitpro//libnx/lib/libnx.a(time.o) + 0x0000000000034040 timeInitialize + *fill* 0x0000000000034118 0x8 + .text.timeGetSessionService + 0x0000000000034120 0xc /opt/devkitpro//libnx/lib/libnx.a(time.o) + 0x0000000000034120 timeGetSessionService + *fill* 0x000000000003412c 0x4 + .text.timeGetCurrentTime + 0x0000000000034130 0x124 /opt/devkitpro//libnx/lib/libnx.a(time.o) + 0x0000000000034130 timeGetCurrentTime + *fill* 0x0000000000034254 0xc + .text.timeSetCurrentTime + 0x0000000000034260 0x104 /opt/devkitpro//libnx/lib/libnx.a(time.o) + 0x0000000000034260 timeSetCurrentTime + *fill* 0x0000000000034364 0xc + .text.timeToCalendarTimeWithMyRule + 0x0000000000034370 0x118 /opt/devkitpro//libnx/lib/libnx.a(time.o) + 0x0000000000034370 timeToCalendarTimeWithMyRule + *fill* 0x0000000000034488 0x8 + .text._hidGetDeviceHandles.part.3 + 0x0000000000034490 0xe8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x0000000000034578 0x8 + .text.ipcCloseObjectById + 0x0000000000034580 0x34 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x00000000000345b4 0xc + .text._hidActivateVibrationDevice + 0x00000000000345c0 0xc8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x0000000000034688 0x8 + .text._hidGetSharedMemoryHandle.constprop.10 + 0x0000000000034690 0x124 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x00000000000347b4 0xc + .text._hidCreateActiveVibrationDeviceList + 0x00000000000347c0 0x134 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x00000000000348f4 0xc + .text._hidCreateAppletResource.constprop.9 + 0x0000000000034900 0x134 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x0000000000034a34 0xc + .text._hidCmdWithNoInput + 0x0000000000034a40 0x100 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .text._hidCmdWithInputU32 + 0x0000000000034b40 0x10c /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x0000000000034c4c 0x4 + .text._hidCmdWithInputU64.constprop.11 + 0x0000000000034c50 0x108 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x0000000000034d58 0x8 + .text.hidReset + 0x0000000000034d60 0x1d0 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000034d60 hidReset + .text.hidGetSessionService + 0x0000000000034f30 0xc /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000034f30 hidGetSessionService + *fill* 0x0000000000034f3c 0x4 + .text.hidGetSharedmemAddr + 0x0000000000034f40 0xc /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000034f40 hidGetSharedmemAddr + *fill* 0x0000000000034f4c 0x4 + .text.hidSetControllerLayout + 0x0000000000034f50 0x54 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000034f50 hidSetControllerLayout + *fill* 0x0000000000034fa4 0xc + .text.hidGetControllerLayout + 0x0000000000034fb0 0x50 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000034fb0 hidGetControllerLayout + .text.hidGetControllerType + 0x0000000000035000 0x78 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035000 hidGetControllerType + *fill* 0x0000000000035078 0x8 + .text.hidGetControllerColors + 0x0000000000035080 0xd4 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035080 hidGetControllerColors + *fill* 0x0000000000035154 0xc + .text.hidIsControllerConnected + 0x0000000000035160 0x7c /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035160 hidIsControllerConnected + *fill* 0x00000000000351dc 0x4 + .text.hidKeysHeld + 0x00000000000351e0 0x6c /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x00000000000351e0 hidKeysHeld + *fill* 0x000000000003524c 0x4 + .text.hidKeysDown + 0x0000000000035250 0x6c /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035250 hidKeysDown + *fill* 0x00000000000352bc 0x4 + .text.hidKeysUp + 0x00000000000352c0 0x6c /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x00000000000352c0 hidKeysUp + *fill* 0x000000000003532c 0x4 + .text.hidMouseButtonsHeld + 0x0000000000035330 0x3c /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035330 hidMouseButtonsHeld + *fill* 0x000000000003536c 0x4 + .text.hidMouseButtonsDown + 0x0000000000035370 0x3c /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035370 hidMouseButtonsDown + *fill* 0x00000000000353ac 0x4 + .text.hidMouseButtonsUp + 0x00000000000353b0 0x3c /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x00000000000353b0 hidMouseButtonsUp + *fill* 0x00000000000353ec 0x4 + .text.hidMouseRead + 0x00000000000353f0 0x48 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x00000000000353f0 hidMouseRead + *fill* 0x0000000000035438 0x8 + .text.hidKeyboardModifierHeld + 0x0000000000035440 0x48 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035440 hidKeyboardModifierHeld + *fill* 0x0000000000035488 0x8 + .text.hidKeyboardModifierDown + 0x0000000000035490 0x48 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035490 hidKeyboardModifierDown + *fill* 0x00000000000354d8 0x8 + .text.hidKeyboardModifierUp + 0x00000000000354e0 0x48 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x00000000000354e0 hidKeyboardModifierUp + *fill* 0x0000000000035528 0x8 + .text.hidKeyboardHeld + 0x0000000000035530 0x60 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035530 hidKeyboardHeld + .text.hidKeyboardDown + 0x0000000000035590 0x60 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035590 hidKeyboardDown + .text.hidKeyboardUp + 0x00000000000355f0 0x60 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x00000000000355f0 hidKeyboardUp + .text.hidTouchCount + 0x0000000000035650 0xc /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035650 hidTouchCount + *fill* 0x000000000003565c 0x4 + .text.hidScanInput + 0x0000000000035660 0x560 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035660 hidScanInput + .text.hidTouchRead + 0x0000000000035bc0 0x54 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035bc0 hidTouchRead + *fill* 0x0000000000035c14 0xc + .text.hidJoystickRead + 0x0000000000035c20 0xac /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035c20 hidJoystickRead + *fill* 0x0000000000035ccc 0x4 + .text.hidSixAxisSensorValuesRead + 0x0000000000035cd0 0x214 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035cd0 hidSixAxisSensorValuesRead + *fill* 0x0000000000035ee4 0xc + .text.hidGetHandheldMode + 0x0000000000035ef0 0x14 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035ef0 hidGetHandheldMode + *fill* 0x0000000000035f04 0xc + .text.hidSetSupportedNpadIdType + 0x0000000000035f10 0x198 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000035f10 hidSetSupportedNpadIdType + *fill* 0x00000000000360a8 0x8 + .text.hidSetSupportedNpadStyleSet + 0x00000000000360b0 0xc /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x00000000000360b0 hidSetSupportedNpadStyleSet + *fill* 0x00000000000360bc 0x4 + .text.hidAcquireNpadStyleSetUpdateEventHandle + 0x00000000000360c0 0x194 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x00000000000360c0 hidAcquireNpadStyleSetUpdateEventHandle + *fill* 0x0000000000036254 0xc + .text.hidSetNpadJoyHoldType + 0x0000000000036260 0x8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036260 hidSetNpadJoyHoldType + *fill* 0x0000000000036268 0x8 + .text.hidSetNpadJoyAssignmentModeSingleByDefault + 0x0000000000036270 0xc /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036270 hidSetNpadJoyAssignmentModeSingleByDefault + *fill* 0x000000000003627c 0x4 + .text.hidSetNpadJoyAssignmentModeDual + 0x0000000000036280 0xc /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036280 hidSetNpadJoyAssignmentModeDual + *fill* 0x000000000003628c 0x4 + .text.hidExit 0x0000000000036290 0x12c /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036290 hidExit + *fill* 0x00000000000363bc 0x4 + .text.hidInitialize + 0x00000000000363c0 0x168 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x00000000000363c0 hidInitialize + *fill* 0x0000000000036528 0x8 + .text.hidMergeSingleJoyAsDualJoy + 0x0000000000036530 0x110 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036530 hidMergeSingleJoyAsDualJoy + .text.hidGetVibrationDeviceInfo + 0x0000000000036640 0xf8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036640 hidGetVibrationDeviceInfo + *fill* 0x0000000000036738 0x8 + .text.hidSendVibrationValue + 0x0000000000036740 0x120 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036740 hidSendVibrationValue + .text.hidGetActualVibrationValue + 0x0000000000036860 0x128 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036860 hidGetActualVibrationValue + *fill* 0x0000000000036988 0x8 + .text.hidPermitVibration + 0x0000000000036990 0xd0 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036990 hidPermitVibration + .text.hidIsVibrationPermitted + 0x0000000000036a60 0xf4 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036a60 hidIsVibrationPermitted + *fill* 0x0000000000036b54 0xc + .text.hidSendVibrationValues + 0x0000000000036b60 0x144 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036b60 hidSendVibrationValues + *fill* 0x0000000000036ca4 0xc + .text.hidInitializeVibrationDevices + 0x0000000000036cb0 0x114 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036cb0 hidInitializeVibrationDevices + *fill* 0x0000000000036dc4 0xc + .text.hidGetSixAxisSensorHandles + 0x0000000000036dd0 0x2c /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036dd0 hidGetSixAxisSensorHandles + *fill* 0x0000000000036dfc 0x4 + .text.hidStartSixAxisSensor + 0x0000000000036e00 0x84 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036e00 hidStartSixAxisSensor + *fill* 0x0000000000036e84 0xc + .text.hidStopSixAxisSensor + 0x0000000000036e90 0x80 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x0000000000036e90 hidStopSixAxisSensor + .text.ipcPrepareHeader + 0x0000000000036f10 0x220 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .text.ipcParse + 0x0000000000037130 0x22c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + *fill* 0x000000000003735c 0x4 + .text.serviceIpcParse + 0x0000000000037360 0xb0 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .text.fsFsQueryEntry.part.12 + 0x0000000000037410 0x1f0 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .text.ipcCloseObjectById + 0x0000000000037600 0x34 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + *fill* 0x0000000000037634 0xc + .text._fsDeviceOperatorCheckInserted + 0x0000000000037640 0x104 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + *fill* 0x0000000000037744 0xc + .text.fsInitialize + 0x0000000000037750 0x200 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000037750 fsInitialize + .text.fsExit 0x0000000000037950 0x9c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000037950 fsExit + *fill* 0x00000000000379ec 0x4 + .text.fsGetServiceSession + 0x00000000000379f0 0xc /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x00000000000379f0 fsGetServiceSession + *fill* 0x00000000000379fc 0x4 + .text.fsOpenBisStorage + 0x0000000000037a00 0x128 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000037a00 fsOpenBisStorage + *fill* 0x0000000000037b28 0x8 + .text.fsOpenBisFileSystem + 0x0000000000037b30 0x170 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000037b30 fsOpenBisFileSystem + .text.fsMountSdcard + 0x0000000000037ca0 0x13c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000037ca0 fsMountSdcard + *fill* 0x0000000000037ddc 0x4 + .text.fsMountSaveData + 0x0000000000037de0 0x158 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000037de0 fsMountSaveData + *fill* 0x0000000000037f38 0x8 + .text.fsMountSystemSaveData + 0x0000000000037f40 0x158 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000037f40 fsMountSystemSaveData + *fill* 0x0000000000038098 0x8 + .text.fsOpenSaveDataIterator + 0x00000000000380a0 0x26c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x00000000000380a0 fsOpenSaveDataIterator + *fill* 0x000000000003830c 0x4 + .text.fsOpenDataStorageByCurrentProcess + 0x0000000000038310 0x13c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000038310 fsOpenDataStorageByCurrentProcess + *fill* 0x000000000003844c 0x4 + .text.fsOpenDeviceOperator + 0x0000000000038450 0x1cc /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000038450 fsOpenDeviceOperator + *fill* 0x000000000003861c 0x4 + .text.fsOpenSdCardDetectionEventNotifier + 0x0000000000038620 0x1cc /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000038620 fsOpenSdCardDetectionEventNotifier + *fill* 0x00000000000387ec 0x4 + .text.fsIsExFatSupported + 0x00000000000387f0 0x10c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x00000000000387f0 fsIsExFatSupported + *fill* 0x00000000000388fc 0x4 + .text.fsMount_SaveData + 0x0000000000038900 0x3c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000038900 fsMount_SaveData + *fill* 0x000000000003893c 0x4 + .text.fsMount_SystemSaveData + 0x0000000000038940 0x30 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000038940 fsMount_SystemSaveData + .text.fsOpenFileSystemWithId + 0x0000000000038970 0x248 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000038970 fsOpenFileSystemWithId + *fill* 0x0000000000038bb8 0x8 + .text.fsOpenFileSystem + 0x0000000000038bc0 0x10 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000038bc0 fsOpenFileSystem + .text.fsFsCreateFile + 0x0000000000038bd0 0x120 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000038bd0 fsFsCreateFile + .text.fsFsDeleteFile + 0x0000000000038cf0 0x118 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000038cf0 fsFsDeleteFile + *fill* 0x0000000000038e08 0x8 + .text.fsFsCreateDirectory + 0x0000000000038e10 0x118 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000038e10 fsFsCreateDirectory + *fill* 0x0000000000038f28 0x8 + .text.fsFsDeleteDirectory + 0x0000000000038f30 0x118 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000038f30 fsFsDeleteDirectory + *fill* 0x0000000000039048 0x8 + .text.fsFsDeleteDirectoryRecursively + 0x0000000000039050 0x118 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039050 fsFsDeleteDirectoryRecursively + *fill* 0x0000000000039168 0x8 + .text.fsFsRenameFile + 0x0000000000039170 0x190 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039170 fsFsRenameFile + .text.fsFsRenameDirectory + 0x0000000000039300 0x190 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039300 fsFsRenameDirectory + .text.fsFsGetEntryType + 0x0000000000039490 0x12c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039490 fsFsGetEntryType + *fill* 0x00000000000395bc 0x4 + .text.fsFsOpenFile + 0x00000000000395c0 0x150 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x00000000000395c0 fsFsOpenFile + .text.fsFsOpenDirectory + 0x0000000000039710 0x150 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039710 fsFsOpenDirectory + .text.fsFsCommit + 0x0000000000039860 0xe8 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039860 fsFsCommit + *fill* 0x0000000000039948 0x8 + .text.fsFsGetFreeSpace + 0x0000000000039950 0x12c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039950 fsFsGetFreeSpace + *fill* 0x0000000000039a7c 0x4 + .text.fsFsGetTotalSpace + 0x0000000000039a80 0x12c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039a80 fsFsGetTotalSpace + *fill* 0x0000000000039bac 0x4 + .text.fsFsCleanDirectoryRecursively + 0x0000000000039bb0 0x13c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039bb0 fsFsCleanDirectoryRecursively + *fill* 0x0000000000039cec 0x4 + .text.fsFsGetFileTimeStampRaw + 0x0000000000039cf0 0x190 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039cf0 fsFsGetFileTimeStampRaw + .text.fsFsQueryEntry + 0x0000000000039e80 0x5c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039e80 fsFsQueryEntry + *fill* 0x0000000000039edc 0x4 + .text.fsFsSetArchiveBit + 0x0000000000039ee0 0x1c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039ee0 fsFsSetArchiveBit + *fill* 0x0000000000039efc 0x4 + .text.fsFsClose + 0x0000000000039f00 0x6c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039f00 fsFsClose + *fill* 0x0000000000039f6c 0x4 + .text.fsFileRead + 0x0000000000039f70 0x170 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x0000000000039f70 fsFileRead + .text.fsFileWrite + 0x000000000003a0e0 0x10c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003a0e0 fsFileWrite + *fill* 0x000000000003a1ec 0x4 + .text.fsFileFlush + 0x000000000003a1f0 0xe8 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003a1f0 fsFileFlush + *fill* 0x000000000003a2d8 0x8 + .text.fsFileSetSize + 0x000000000003a2e0 0xf0 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003a2e0 fsFileSetSize + .text.fsFileGetSize + 0x000000000003a3d0 0x100 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003a3d0 fsFileGetSize + .text.fsFileClose + 0x000000000003a4d0 0x6c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003a4d0 fsFileClose + *fill* 0x000000000003a53c 0x4 + .text.fsDirClose + 0x000000000003a540 0x6c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003a540 fsDirClose + *fill* 0x000000000003a5ac 0x4 + .text.fsDirRead + 0x000000000003a5b0 0x16c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003a5b0 fsDirRead + *fill* 0x000000000003a71c 0x4 + .text.fsDirGetEntryCount + 0x000000000003a720 0x100 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003a720 fsDirGetEntryCount + .text.fsStorageRead + 0x000000000003a820 0x11c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003a820 fsStorageRead + *fill* 0x000000000003a93c 0x4 + .text.fsStorageWrite + 0x000000000003a940 0x124 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003a940 fsStorageWrite + *fill* 0x000000000003aa64 0xc + .text.fsStorageFlush + 0x000000000003aa70 0xe8 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003aa70 fsStorageFlush + *fill* 0x000000000003ab58 0x8 + .text.fsStorageSetSize + 0x000000000003ab60 0xf0 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003ab60 fsStorageSetSize + .text.fsStorageGetSize + 0x000000000003ac50 0x100 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003ac50 fsStorageGetSize + .text.fsStorageClose + 0x000000000003ad50 0x6c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003ad50 fsStorageClose + *fill* 0x000000000003adbc 0x4 + .text.fsSaveDataIteratorRead + 0x000000000003adc0 0x130 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003adc0 fsSaveDataIteratorRead + .text.fsSaveDataIteratorClose + 0x000000000003aef0 0x6c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003aef0 fsSaveDataIteratorClose + *fill* 0x000000000003af5c 0x4 + .text.fsEventNotifierGetEventHandle + 0x000000000003af60 0xf4 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003af60 fsEventNotifierGetEventHandle + *fill* 0x000000000003b054 0xc + .text.fsEventNotifierClose + 0x000000000003b060 0x6c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003b060 fsEventNotifierClose + *fill* 0x000000000003b0cc 0x4 + .text.fsDeviceOperatorIsSdCardInserted + 0x000000000003b0d0 0xc /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003b0d0 fsDeviceOperatorIsSdCardInserted + *fill* 0x000000000003b0dc 0x4 + .text.fsDeviceOperatorIsGameCardInserted + 0x000000000003b0e0 0xc /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003b0e0 fsDeviceOperatorIsGameCardInserted + *fill* 0x000000000003b0ec 0x4 + .text.fsDeviceOperatorGetGameCardHandle + 0x000000000003b0f0 0xfc /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003b0f0 fsDeviceOperatorGetGameCardHandle + *fill* 0x000000000003b1ec 0x4 + .text.fsDeviceOperatorGetGameCardAttribute + 0x000000000003b1f0 0xf4 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003b1f0 fsDeviceOperatorGetGameCardAttribute + *fill* 0x000000000003b2e4 0xc + .text.fsDeviceOperatorClose + 0x000000000003b2f0 0x6c /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0x000000000003b2f0 fsDeviceOperatorClose + *fill* 0x000000000003b35c 0x4 + .text.ipcCloseObjectById + 0x000000000003b360 0x34 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + *fill* 0x000000000003b394 0xc + .text._apmGetSession.constprop.4 + 0x000000000003b3a0 0x124 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + *fill* 0x000000000003b4c4 0xc + .text.apmExit 0x000000000003b4d0 0xf0 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + 0x000000000003b4d0 apmExit + .text.apmInitialize + 0x000000000003b5c0 0x8c /opt/devkitpro//libnx/lib/libnx.a(apm.o) + 0x000000000003b5c0 apmInitialize + *fill* 0x000000000003b64c 0x4 + .text.apmSetPerformanceConfiguration + 0x000000000003b650 0xcc /opt/devkitpro//libnx/lib/libnx.a(apm.o) + 0x000000000003b650 apmSetPerformanceConfiguration + *fill* 0x000000000003b71c 0x4 + .text.apmGetPerformanceConfiguration + 0x000000000003b720 0xf4 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + 0x000000000003b720 apmGetPerformanceConfiguration + *fill* 0x000000000003b814 0xc + .text.smAddOverrideHandle + 0x000000000003b820 0x44 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + 0x000000000003b820 smAddOverrideHandle + *fill* 0x000000000003b864 0xc + .text.smGetServiceOverride + 0x000000000003b870 0x60 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + 0x000000000003b870 smGetServiceOverride + .text.smHasInitialized + 0x000000000003b8d0 0x14 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + 0x000000000003b8d0 smHasInitialized + *fill* 0x000000000003b8e4 0xc + .text.smExit 0x000000000003b8f0 0x5c /opt/devkitpro//libnx/lib/libnx.a(sm.o) + 0x000000000003b8f0 smExit + *fill* 0x000000000003b94c 0x4 + .text.smEncodeName + 0x000000000003b950 0x38 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + 0x000000000003b950 smEncodeName + *fill* 0x000000000003b988 0x8 + .text.smGetServiceOriginal + 0x000000000003b990 0x12c /opt/devkitpro//libnx/lib/libnx.a(sm.o) + 0x000000000003b990 smGetServiceOriginal + *fill* 0x000000000003babc 0x4 + .text.smInitialize + 0x000000000003bac0 0x158 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + 0x000000000003bac0 smInitialize + *fill* 0x000000000003bc18 0x8 + .text.smGetService + 0x000000000003bc20 0x74 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + 0x000000000003bc20 smGetService + *fill* 0x000000000003bc94 0xc + .text.smRegisterService + 0x000000000003bca0 0x14c /opt/devkitpro//libnx/lib/libnx.a(sm.o) + 0x000000000003bca0 smRegisterService + *fill* 0x000000000003bdec 0x4 + .text.smUnregisterService + 0x000000000003bdf0 0xe0 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + 0x000000000003bdf0 smUnregisterService + .text._fatalImpl + 0x000000000003bed0 0x140 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + .text.fatalWithType + 0x000000000003c010 0x14 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + 0x000000000003c010 fatalWithType + *fill* 0x000000000003c024 0xc + .text.fatalSimple + 0x000000000003c030 0x14 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + 0x000000000003c030 fatalSimple + *fill* 0x000000000003c044 0xc + .text.fatalWithContext + 0x000000000003c050 0x14 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + 0x000000000003c050 fatalWithContext + *fill* 0x000000000003c064 0xc + .text.envSetup + 0x000000000003c070 0x208 /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c070 envSetup + *fill* 0x000000000003c278 0x8 + .text.envGetMainThreadHandle + 0x000000000003c280 0x20 /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c280 envGetMainThreadHandle + .text.envIsNso + 0x000000000003c2a0 0xc /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c2a0 envIsNso + *fill* 0x000000000003c2ac 0x4 + .text.envHasHeapOverride + 0x000000000003c2b0 0x14 /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c2b0 envHasHeapOverride + *fill* 0x000000000003c2c4 0xc + .text.envGetHeapOverrideAddr + 0x000000000003c2d0 0xc /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c2d0 envGetHeapOverrideAddr + *fill* 0x000000000003c2dc 0x4 + .text.envGetHeapOverrideSize + 0x000000000003c2e0 0xc /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c2e0 envGetHeapOverrideSize + *fill* 0x000000000003c2ec 0x4 + .text.envHasArgv + 0x000000000003c2f0 0x14 /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c2f0 envHasArgv + *fill* 0x000000000003c304 0xc + .text.envGetArgv + 0x000000000003c310 0xc /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c310 envGetArgv + *fill* 0x000000000003c31c 0x4 + .text.envIsSyscallHinted + 0x000000000003c320 0x20 /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c320 envIsSyscallHinted + .text.envGetOwnProcessHandle + 0x000000000003c340 0xc /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c340 envGetOwnProcessHandle + *fill* 0x000000000003c34c 0x4 + .text.envGetExitFuncPtr + 0x000000000003c350 0xc /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c350 envGetExitFuncPtr + *fill* 0x000000000003c35c 0x4 + .text.envSetExitFuncPtr + 0x000000000003c360 0xc /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c360 envSetExitFuncPtr + *fill* 0x000000000003c36c 0x4 + .text.envSetNextLoad + 0x000000000003c370 0x7c /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c370 envSetNextLoad + *fill* 0x000000000003c3ec 0x4 + .text.envHasNextLoad + 0x000000000003c3f0 0x14 /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c3f0 envHasNextLoad + *fill* 0x000000000003c404 0xc + .text.envGetLastLoadResult + 0x000000000003c410 0xc /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c410 envGetLastLoadResult + *fill* 0x000000000003c41c 0x4 + .text.envHasRandomSeed + 0x000000000003c420 0xc /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c420 envHasRandomSeed + *fill* 0x000000000003c42c 0x4 + .text.envGetRandomSeed + 0x000000000003c430 0x18 /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x000000000003c430 envGetRandomSeed + *fill* 0x000000000003c448 0x8 + .text.nxlinkSetup + 0x000000000003c450 0xc4 /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + 0x000000000003c450 nxlinkSetup + *fill* 0x000000000003c514 0xc + .text._CacheValues + 0x000000000003c520 0x180 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .text.kernelAbove200 + 0x000000000003c6a0 0x1c /opt/devkitpro//libnx/lib/libnx.a(detect.o) + 0x000000000003c6a0 kernelAbove200 + *fill* 0x000000000003c6bc 0x4 + .text.kernelAbove300 + 0x000000000003c6c0 0x1c /opt/devkitpro//libnx/lib/libnx.a(detect.o) + 0x000000000003c6c0 kernelAbove300 + *fill* 0x000000000003c6dc 0x4 + .text.kernelAbove400 + 0x000000000003c6e0 0x1c /opt/devkitpro//libnx/lib/libnx.a(detect.o) + 0x000000000003c6e0 kernelAbove400 + *fill* 0x000000000003c6fc 0x4 + .text.kernelAbove500 + 0x000000000003c700 0x1c /opt/devkitpro//libnx/lib/libnx.a(detect.o) + 0x000000000003c700 kernelAbove500 + *fill* 0x000000000003c71c 0x4 + .text.kernelAbove600 + 0x000000000003c720 0x1c /opt/devkitpro//libnx/lib/libnx.a(detect.o) + 0x000000000003c720 kernelAbove600 + *fill* 0x000000000003c73c 0x4 + .text.detectDebugger + 0x000000000003c740 0x30 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + 0x000000000003c740 detectDebugger + .text.tmemCreate + 0x000000000003c770 0xa8 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + 0x000000000003c770 tmemCreate + *fill* 0x000000000003c818 0x8 + .text.tmemCreateFromMemory + 0x000000000003c820 0x2c /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + 0x000000000003c820 tmemCreateFromMemory + *fill* 0x000000000003c84c 0x4 + .text.tmemLoadRemote + 0x000000000003c850 0x14 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + 0x000000000003c850 tmemLoadRemote + *fill* 0x000000000003c864 0xc + .text.tmemMap 0x000000000003c870 0x84 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + 0x000000000003c870 tmemMap + *fill* 0x000000000003c8f4 0xc + .text.tmemUnmap + 0x000000000003c900 0x58 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + 0x000000000003c900 tmemUnmap + *fill* 0x000000000003c958 0x8 + .text.tmemClose + 0x000000000003c960 0x68 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + 0x000000000003c960 tmemClose + *fill* 0x000000000003c9c8 0x8 + .text._waitLoop + 0x000000000003c9d0 0x104 /opt/devkitpro//libnx/lib/libnx.a(wait.o) + *fill* 0x000000000003cad4 0xc + .text._waitObjectsImpl + 0x000000000003cae0 0x334 /opt/devkitpro//libnx/lib/libnx.a(wait.o) + *fill* 0x000000000003ce14 0xc + .text.waitObjects + 0x000000000003ce20 0xc /opt/devkitpro//libnx/lib/libnx.a(wait.o) + 0x000000000003ce20 waitObjects + *fill* 0x000000000003ce2c 0x4 + .text.waitHandles + 0x000000000003ce30 0xc /opt/devkitpro//libnx/lib/libnx.a(wait.o) + 0x000000000003ce30 waitHandles + *fill* 0x000000000003ce3c 0x4 + .text.rwlockInit + 0x000000000003ce40 0xc /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + 0x000000000003ce40 rwlockInit + *fill* 0x000000000003ce4c 0x4 + .text.rwlockReadLock + 0x000000000003ce50 0x4c /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + 0x000000000003ce50 rwlockReadLock + *fill* 0x000000000003ce9c 0x4 + .text.rwlockReadUnlock + 0x000000000003cea0 0x4c /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + 0x000000000003cea0 rwlockReadUnlock + *fill* 0x000000000003ceec 0x4 + .text.rwlockWriteLock + 0x000000000003cef0 0x8 /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + 0x000000000003cef0 rwlockWriteLock + *fill* 0x000000000003cef8 0x8 + .text.rwlockWriteUnlock + 0x000000000003cf00 0x8 /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + 0x000000000003cf00 rwlockWriteUnlock + *fill* 0x000000000003cf08 0x8 + .text.shmemCreate + 0x000000000003cf10 0x14 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + 0x000000000003cf10 shmemCreate + *fill* 0x000000000003cf24 0xc + .text.shmemLoadRemote + 0x000000000003cf30 0x14 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + 0x000000000003cf30 shmemLoadRemote + *fill* 0x000000000003cf44 0xc + .text.shmemMap + 0x000000000003cf50 0x84 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + 0x000000000003cf50 shmemMap + *fill* 0x000000000003cfd4 0xc + .text.shmemUnmap + 0x000000000003cfe0 0x58 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + 0x000000000003cfe0 shmemUnmap + *fill* 0x000000000003d038 0x8 + .text.shmemClose + 0x000000000003d040 0x44 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + 0x000000000003d040 shmemClose + *fill* 0x000000000003d084 0xc + .text.eventCreate + 0x000000000003d090 0x38 /opt/devkitpro//libnx/lib/libnx.a(event.o) + 0x000000000003d090 eventCreate + *fill* 0x000000000003d0c8 0x8 + .text.eventLoadRemote + 0x000000000003d0d0 0xc /opt/devkitpro//libnx/lib/libnx.a(event.o) + 0x000000000003d0d0 eventLoadRemote + *fill* 0x000000000003d0dc 0x4 + .text.eventWait + 0x000000000003d0e0 0x38 /opt/devkitpro//libnx/lib/libnx.a(event.o) + 0x000000000003d0e0 eventWait + *fill* 0x000000000003d118 0x8 + .text.eventFire + 0x000000000003d120 0x14 /opt/devkitpro//libnx/lib/libnx.a(event.o) + 0x000000000003d120 eventFire + *fill* 0x000000000003d134 0xc + .text.eventClear + 0x000000000003d140 0x24 /opt/devkitpro//libnx/lib/libnx.a(event.o) + 0x000000000003d140 eventClear + *fill* 0x000000000003d164 0xc + .text.eventClose + 0x000000000003d170 0x50 /opt/devkitpro//libnx/lib/libnx.a(event.o) + 0x000000000003d170 eventClose + .text.cosf 0x000000000003d1c0 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_cos.o) + 0x000000000003d1c0 cosf + .text.expf 0x000000000003d268 0xdc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp.o) + 0x000000000003d268 expf + *fill* 0x000000000003d344 0x4 + .text.frexpf 0x000000000003d348 0x5c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_frexp.o) + 0x000000000003d348 frexpf + *fill* 0x000000000003d3a4 0x4 + .text.log2f 0x000000000003d3a8 0xe0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2.o) + 0x000000000003d3a8 log2f + .text.logf 0x000000000003d488 0xe0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log.o) + 0x000000000003d488 logf + .text.powf 0x000000000003d568 0x2ec /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow.o) + 0x000000000003d568 powf + *fill* 0x000000000003d854 0x4 + .text.sinf 0x000000000003d858 0xb0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_sin.o) + 0x000000000003d858 sinf + .text.tanf 0x000000000003d908 0x70 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_tan.o) + 0x000000000003d908 tanf + .text.acosf 0x000000000003d978 0xe8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_acos.o) + 0x000000000003d978 acosf + .text.asinf 0x000000000003da60 0xe8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_asin.o) + 0x000000000003da60 asinf + .text.atan2f 0x000000000003db48 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_atan2.o) + 0x000000000003db48 atan2f + *fill* 0x000000000003db4c 0x4 + .text.fmodf 0x000000000003db50 0xd4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_fmod.o) + 0x000000000003db50 fmodf + *fill* 0x000000000003dc24 0x4 + .text.log10f 0x000000000003dc28 0x128 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_log10.o) + 0x000000000003dc28 log10f + .text.__ieee754_acosf + 0x000000000003dd50 0x340 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_acos.o) + 0x000000000003dd50 __ieee754_acosf + .text.__ieee754_asinf + 0x000000000003e090 0x2dc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_asin.o) + 0x000000000003e090 __ieee754_asinf + *fill* 0x000000000003e36c 0x4 + .text.__ieee754_atan2f + 0x000000000003e370 0x218 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_atan2.o) + 0x000000000003e370 __ieee754_atan2f + .text.__ieee754_fmodf + 0x000000000003e588 0x180 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_fmod.o) + 0x000000000003e588 __ieee754_fmodf + .text.__ieee754_log10f + 0x000000000003e708 0xdc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_log10.o) + 0x000000000003e708 __ieee754_log10f + *fill* 0x000000000003e7e4 0x4 + .text.__ieee754_rem_pio2f + 0x000000000003e7e8 0x304 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_rem_pio2.o) + 0x000000000003e7e8 __ieee754_rem_pio2f + *fill* 0x000000000003eaec 0x4 + .text.__ieee754_sqrtf + 0x000000000003eaf0 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_sqrt.o) + 0x000000000003eaf0 __ieee754_sqrtf + .text.__kernel_cosf + 0x000000000003eaf8 0x160 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_cos.o) + 0x000000000003eaf8 __kernel_cosf + .text.__kernel_rem_pio2f + 0x000000000003ec58 0x84c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_rem_pio2.o) + 0x000000000003ec58 __kernel_rem_pio2f + *fill* 0x000000000003f4a4 0x4 + .text.__kernel_sinf + 0x000000000003f4a8 0xb8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_sin.o) + 0x000000000003f4a8 __kernel_sinf + .text.__kernel_tanf + 0x000000000003f560 0x210 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_tan.o) + 0x000000000003f560 __kernel_tanf + .text.with_errnof + 0x000000000003f770 0x2c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-math_errf.o) + *fill* 0x000000000003f79c 0x4 + .text.xflowf 0x000000000003f7a0 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-math_errf.o) + .text.__math_uflowf + 0x000000000003f7b8 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-math_errf.o) + 0x000000000003f7b8 __math_uflowf + .text.__math_may_uflowf + 0x000000000003f7c0 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-math_errf.o) + 0x000000000003f7c0 __math_may_uflowf + *fill* 0x000000000003f7cc 0x4 + .text.__math_oflowf + 0x000000000003f7d0 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-math_errf.o) + 0x000000000003f7d0 __math_oflowf + .text.__math_divzerof + 0x000000000003f7d8 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-math_errf.o) + 0x000000000003f7d8 __math_divzerof + .text.__math_invalidf + 0x000000000003f7f8 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-math_errf.o) + 0x000000000003f7f8 __math_invalidf + *fill* 0x000000000003f814 0x4 + .text.atanf 0x000000000003f818 0x244 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_atan.o) + 0x000000000003f818 atanf + *fill* 0x000000000003fa5c 0x4 + .text.fabsf 0x000000000003fa60 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_fabs.o) + 0x000000000003fa60 fabsf + .text.floorf 0x000000000003fa68 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_floor.o) + 0x000000000003fa68 floorf + .text.scalbnf 0x000000000003fa70 0x110 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_scalbn.o) + 0x000000000003fa70 scalbnf + .text.matherr 0x000000000003fb80 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_matherr.o) + 0x000000000003fb80 matherr + .text.nan 0x000000000003fb88 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_nan.o) + 0x000000000003fb88 nan + *fill* 0x000000000003fb94 0x4 + .text.copysignf + 0x000000000003fb98 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_copysign.o) + 0x000000000003fb98 copysignf + .text.abort 0x000000000003fbb0 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abort.o) + 0x000000000003fbb0 abort + .text.bsearch 0x000000000003fbc8 0xb8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-bsearch.o) + 0x000000000003fbc8 bsearch + .text.clock 0x000000000003fc80 0x3c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-clock.o) + 0x000000000003fc80 clock + *fill* 0x000000000003fcbc 0x4 + .text.difftime + 0x000000000003fcc0 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-difftime.o) + 0x000000000003fcc0 difftime + *fill* 0x000000000003fccc 0x4 + .text.__errno 0x000000000003fcd0 0x14 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-errno.o) + 0x000000000003fcd0 __errno + *fill* 0x000000000003fce4 0x4 + .text._fclose_r + 0x000000000003fce8 0x15c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fclose.o) + 0x000000000003fce8 _fclose_r + *fill* 0x000000000003fe44 0x4 + .text.fclose 0x000000000003fe48 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fclose.o) + 0x000000000003fe48 fclose + *fill* 0x000000000003fe64 0x4 + .text.__sflush_r + 0x000000000003fe68 0x214 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fflush.o) + 0x000000000003fe68 __sflush_r + *fill* 0x000000000004007c 0x4 + .text._fflush_r + 0x0000000000040080 0xb8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fflush.o) + 0x0000000000040080 _fflush_r + .text.fflush 0x0000000000040138 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fflush.o) + 0x0000000000040138 fflush + .text._fgets_r + 0x0000000000040178 0x1b0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fgets.o) + 0x0000000000040178 _fgets_r + .text.fgets 0x0000000000040328 0x3c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fgets.o) + 0x0000000000040328 fgets + *fill* 0x0000000000040364 0x4 + .text.std 0x0000000000040368 0x78 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + .text._cleanup_r + 0x00000000000403e0 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + 0x00000000000403e0 _cleanup_r + *fill* 0x00000000000403ec 0x4 + .text.__fp_lock + 0x00000000000403f0 0x34 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + *fill* 0x0000000000040424 0x4 + .text.__fp_unlock + 0x0000000000040428 0x34 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + *fill* 0x000000000004045c 0x4 + .text.__sfmoreglue + 0x0000000000040460 0x60 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + 0x0000000000040460 __sfmoreglue + .text._cleanup + 0x00000000000404c0 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + 0x00000000000404c0 _cleanup + .text.__sfp_lock_acquire + 0x00000000000404d0 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + 0x00000000000404d0 __sfp_lock_acquire + *fill* 0x00000000000404dc 0x4 + .text.__sfp_lock_release + 0x00000000000404e0 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + 0x00000000000404e0 __sfp_lock_release + *fill* 0x00000000000404ec 0x4 + .text.__sinit_lock_acquire + 0x00000000000404f0 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + 0x00000000000404f0 __sinit_lock_acquire + *fill* 0x00000000000404fc 0x4 + .text.__sinit_lock_release + 0x0000000000040500 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + 0x0000000000040500 __sinit_lock_release + *fill* 0x000000000004050c 0x4 + .text.__sinit 0x0000000000040510 0x80 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + 0x0000000000040510 __sinit + .text.__sfp 0x0000000000040590 0x118 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + 0x0000000000040590 __sfp + .text.__fp_lock_all + 0x00000000000406a8 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + 0x00000000000406a8 __fp_lock_all + .text.__fp_unlock_all + 0x00000000000406c8 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + 0x00000000000406c8 __fp_unlock_all + .text.__libc_fini_array + 0x00000000000406e8 0x44 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fini.o) + 0x00000000000406e8 __libc_fini_array + *fill* 0x000000000004072c 0x4 + .text._fopen_r + 0x0000000000040730 0x130 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fopen.o) + 0x0000000000040730 _fopen_r + .text.fopen 0x0000000000040860 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fopen.o) + 0x0000000000040860 fopen + .text._fprintf_r + 0x0000000000040890 0x70 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fprintf.o) + 0x0000000000040890 _fprintf_r + .text.fprintf 0x0000000000040900 0x94 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fprintf.o) + 0x0000000000040900 fprintf + *fill* 0x0000000000040994 0x4 + .text._fputc_r + 0x0000000000040998 0x9c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputc.o) + 0x0000000000040998 _fputc_r + *fill* 0x0000000000040a34 0x4 + .text.fputc 0x0000000000040a38 0xa4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputc.o) + 0x0000000000040a38 fputc + *fill* 0x0000000000040adc 0x4 + .text._fputs_r + 0x0000000000040ae0 0xb4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputs.o) + 0x0000000000040ae0 _fputs_r + *fill* 0x0000000000040b94 0x4 + .text.fputs 0x0000000000040b98 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputs.o) + 0x0000000000040b98 fputs + .text._fread_r + 0x0000000000040bc8 0x328 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fread.o) + 0x0000000000040bc8 _fread_r + .text.fread 0x0000000000040ef0 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fread.o) + 0x0000000000040ef0 fread + .text._malloc_trim_r + 0x0000000000040f30 0x118 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freer.o) + 0x0000000000040f30 _malloc_trim_r + .text._free_r 0x0000000000041048 0x2f4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freer.o) + 0x0000000000041048 _free_r + *fill* 0x000000000004133c 0x4 + .text._freopen_r + 0x0000000000041340 0x2b0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freopen.o) + 0x0000000000041340 _freopen_r + .text.freopen 0x00000000000415f0 0x34 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freopen.o) + 0x00000000000415f0 freopen + *fill* 0x0000000000041624 0x4 + .text._fseek_r + 0x0000000000041628 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseek.o) + 0x0000000000041628 _fseek_r + *fill* 0x000000000004162c 0x4 + .text.fseek 0x0000000000041630 0x3c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseek.o) + 0x0000000000041630 fseek + *fill* 0x000000000004166c 0x4 + .text._fseeko_r + 0x0000000000041670 0x4c4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseeko.o) + 0x0000000000041670 _fseeko_r + *fill* 0x0000000000041b34 0x4 + .text.fseeko 0x0000000000041b38 0x3c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseeko.o) + 0x0000000000041b38 fseeko + *fill* 0x0000000000041b74 0x4 + .text._ftell_r + 0x0000000000041b78 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftell.o) + 0x0000000000041b78 _ftell_r + *fill* 0x0000000000041b7c 0x4 + .text.ftell 0x0000000000041b80 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftell.o) + 0x0000000000041b80 ftell + *fill* 0x0000000000041b9c 0x4 + .text._ftello_r + 0x0000000000041ba0 0x164 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftello.o) + 0x0000000000041ba0 _ftello_r + *fill* 0x0000000000041d04 0x4 + .text.ftello 0x0000000000041d08 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftello.o) + 0x0000000000041d08 ftello + *fill* 0x0000000000041d24 0x4 + .text.__sfvwrite_r + 0x0000000000041d28 0x4b8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fvwrite.o) + 0x0000000000041d28 __sfvwrite_r + .text._fwalk 0x00000000000421e0 0xb8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwalk.o) + 0x00000000000421e0 _fwalk + .text._fwalk_reent + 0x0000000000042298 0xbc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwalk.o) + 0x0000000000042298 _fwalk_reent + *fill* 0x0000000000042354 0x4 + .text._fwrite_r + 0x0000000000042358 0xe0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwrite.o) + 0x0000000000042358 _fwrite_r + .text.fwrite 0x0000000000042438 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwrite.o) + 0x0000000000042438 fwrite + .text._getc_r 0x0000000000042478 0xb0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getc.o) + 0x0000000000042478 _getc_r + .text.getc 0x0000000000042528 0xb4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getc.o) + 0x0000000000042528 getc + *fill* 0x00000000000425dc 0x4 + .text._findenv + 0x00000000000425e0 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv.o) + 0x00000000000425e0 _findenv + .text.getenv 0x0000000000042610 0x24 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv.o) + 0x0000000000042610 getenv + *fill* 0x0000000000042634 0x4 + .text._findenv_r + 0x0000000000042638 0x100 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv_r.o) + 0x0000000000042638 _findenv_r + .text._getenv_r + 0x0000000000042738 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv_r.o) + 0x0000000000042738 _getenv_r + .text.gmtime 0x0000000000042750 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime.o) + 0x0000000000042750 gmtime + .text.gmtime_r + 0x0000000000042778 0x290 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime_r.o) + 0x0000000000042778 gmtime_r + .text.__libc_init_array + 0x0000000000042a08 0x8c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-init.o) + 0x0000000000042a08 __libc_init_array + *fill* 0x0000000000042a94 0x4 + .text.localtime + 0x0000000000042a98 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime.o) + 0x0000000000042a98 localtime + .text.localtime_r + 0x0000000000042ac0 0x380 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime_r.o) + 0x0000000000042ac0 localtime_r + .text.__localeconv_l + 0x0000000000042e40 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-localeconv.o) + 0x0000000000042e40 __localeconv_l + .text._localeconv_r + 0x0000000000042e48 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-localeconv.o) + 0x0000000000042e48 _localeconv_r + .text.localeconv + 0x0000000000042e70 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-localeconv.o) + 0x0000000000042e70 localeconv + .text.currentlocale + 0x0000000000042e98 0xb8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + .text.__loadlocale + 0x0000000000042f50 0x774 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x0000000000042f50 __loadlocale + *fill* 0x00000000000436c4 0x4 + .text.__get_locale_env + 0x00000000000436c8 0x88 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x00000000000436c8 __get_locale_env + .text._setlocale_r + 0x0000000000043750 0x3a4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x0000000000043750 _setlocale_r + *fill* 0x0000000000043af4 0x4 + .text.__locale_mb_cur_max + 0x0000000000043af8 0x2c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x0000000000043af8 __locale_mb_cur_max + *fill* 0x0000000000043b24 0x4 + .text.__locale_ctype_ptr_l + 0x0000000000043b28 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x0000000000043b28 __locale_ctype_ptr_l + .text.__locale_ctype_ptr + 0x0000000000043b30 0x2c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x0000000000043b30 __locale_ctype_ptr + *fill* 0x0000000000043b5c 0x4 + .text.setlocale + 0x0000000000043b60 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x0000000000043b60 setlocale + .text.__swhatbuf_r + 0x0000000000043b90 0xa4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-makebuf.o) + 0x0000000000043b90 __swhatbuf_r + *fill* 0x0000000000043c34 0x4 + .text.__smakebuf_r + 0x0000000000043c38 0x10c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-makebuf.o) + 0x0000000000043c38 __smakebuf_r + *fill* 0x0000000000043d44 0x4 + .text.memalign + 0x0000000000043d48 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malign.o) + 0x0000000000043d48 memalign + .text._memalign_r + 0x0000000000043d78 0x198 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malignr.o) + 0x0000000000043d78 _memalign_r + .text.malloc 0x0000000000043f10 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malloc.o) + 0x0000000000043f10 malloc + *fill* 0x0000000000043f2c 0x4 + .text.free 0x0000000000043f30 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malloc.o) + 0x0000000000043f30 free + *fill* 0x0000000000043f4c 0x4 + .text._malloc_r + 0x0000000000043f50 0x844 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + 0x0000000000043f50 _malloc_r + *fill* 0x0000000000044794 0x4 + .text._mbtowc_r + 0x0000000000044798 0x4c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + 0x0000000000044798 _mbtowc_r + *fill* 0x00000000000447e4 0x4 + .text.__ascii_mbtowc + 0x00000000000447e8 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + 0x00000000000447e8 __ascii_mbtowc + .text.__utf8_mbtowc + 0x0000000000044830 0x2c8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + 0x0000000000044830 __utf8_mbtowc + .text.__sjis_mbtowc + 0x0000000000044af8 0xcc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + 0x0000000000044af8 __sjis_mbtowc + *fill* 0x0000000000044bc4 0x4 + .text.__eucjp_mbtowc + 0x0000000000044bc8 0x120 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + 0x0000000000044bc8 __eucjp_mbtowc + .text.__jis_mbtowc + 0x0000000000044ce8 0x1d4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + 0x0000000000044ce8 __jis_mbtowc + .text 0x0000000000044ebc 0xd8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memchr.o) + 0x0000000000044ebc memchr + *fill* 0x0000000000044f94 0x2c + .text 0x0000000000044fc0 0xb0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memcmp.o) + 0x0000000000044fc0 memcmp + *fill* 0x0000000000045070 0x10 + .text 0x0000000000045080 0x16c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memcpy.o) + 0x0000000000045080 memcpy + *fill* 0x00000000000451ec 0x14 + .text 0x0000000000045200 0xac /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memmove.o) + 0x0000000000045200 memmove + *fill* 0x00000000000452ac 0x14 + .text 0x00000000000452c0 0x1d8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-memset.o) + 0x00000000000452c0 memset + .text.validate_structure + 0x0000000000045498 0x2f8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mktime.o) + .text.mktime 0x0000000000045790 0x4c0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mktime.o) + 0x0000000000045790 mktime + .text.__malloc_lock + 0x0000000000045c50 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mlock.o) + 0x0000000000045c50 __malloc_lock + *fill* 0x0000000000045c5c 0x4 + .text.__malloc_unlock + 0x0000000000045c60 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mlock.o) + 0x0000000000045c60 __malloc_unlock + *fill* 0x0000000000045c6c 0x4 + .text._putc_r 0x0000000000045c70 0xe0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-putc.o) + 0x0000000000045c70 _putc_r + .text.putc 0x0000000000045d50 0xe4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-putc.o) + 0x0000000000045d50 putc + *fill* 0x0000000000045e34 0x4 + .text.realloc 0x0000000000045e38 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-realloc.o) + 0x0000000000045e38 realloc + .text._realloc_r + 0x0000000000045e68 0x56c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-reallocr.o) + 0x0000000000045e68 _realloc_r + *fill* 0x00000000000463d4 0x4 + .text.lflush 0x00000000000463d8 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-refill.o) + .text.__srefill_r + 0x00000000000463f8 0x1d0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-refill.o) + 0x00000000000463f8 __srefill_r + .text._remove_r + 0x00000000000465c8 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-remove.o) + 0x00000000000465c8 _remove_r + *fill* 0x00000000000465e4 0x4 + .text.remove 0x00000000000465e8 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-remove.o) + 0x00000000000465e8 remove + *fill* 0x0000000000046604 0x4 + .text.rename 0x0000000000046608 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rename.o) + 0x0000000000046608 rename + .text.__srget_r + 0x0000000000046638 0x68 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rget.o) + 0x0000000000046638 __srget_r + .text.__srget 0x00000000000466a0 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rget.o) + 0x00000000000466a0 __srget + *fill* 0x00000000000466bc 0x4 + .text.setenv 0x00000000000466c0 0x3c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv.o) + 0x00000000000466c0 setenv + *fill* 0x00000000000466fc 0x4 + .text.unsetenv + 0x0000000000046700 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv.o) + 0x0000000000046700 unsetenv + *fill* 0x000000000004671c 0x4 + .text._setenv_r + 0x0000000000046720 0x264 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv_r.o) + 0x0000000000046720 _setenv_r + *fill* 0x0000000000046984 0x4 + .text._unsetenv_r + 0x0000000000046988 0xd4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv_r.o) + 0x0000000000046988 _unsetenv_r + .text 0x0000000000046a5c 0x74 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setjmp.o) + 0x0000000000046a5c setjmp + 0x0000000000046a94 longjmp + .text.setvbuf 0x0000000000046ad0 0x25c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setvbuf.o) + 0x0000000000046ad0 setvbuf + *fill* 0x0000000000046d2c 0x4 + .text._init_signal_r + 0x0000000000046d30 0x5c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + 0x0000000000046d30 _init_signal_r + *fill* 0x0000000000046d8c 0x4 + .text._signal_r + 0x0000000000046d90 0x84 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + 0x0000000000046d90 _signal_r + *fill* 0x0000000000046e14 0x4 + .text._raise_r + 0x0000000000046e18 0xb4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + 0x0000000000046e18 _raise_r + *fill* 0x0000000000046ecc 0x4 + .text.__sigtramp_r + 0x0000000000046ed0 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + 0x0000000000046ed0 __sigtramp_r + .text.raise 0x0000000000046f78 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + 0x0000000000046f78 raise + *fill* 0x0000000000046f94 0x4 + .text.signal 0x0000000000046f98 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + 0x0000000000046f98 signal + .text._init_signal + 0x0000000000046fc8 0x14 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + 0x0000000000046fc8 _init_signal + *fill* 0x0000000000046fdc 0x4 + .text.__sigtramp + 0x0000000000046fe0 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + 0x0000000000046fe0 __sigtramp + *fill* 0x0000000000046ffc 0x4 + .text._snprintf_r + 0x0000000000047000 0x130 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-snprintf.o) + 0x0000000000047000 _snprintf_r + .text.snprintf + 0x0000000000047130 0x14c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-snprintf.o) + 0x0000000000047130 snprintf + *fill* 0x000000000004727c 0x4 + .text.__sread 0x0000000000047280 0x50 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) + 0x0000000000047280 __sread + .text.__seofread + 0x00000000000472d0 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) + 0x00000000000472d0 __seofread + .text.__swrite + 0x00000000000472d8 0x6c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) + 0x00000000000472d8 __swrite + *fill* 0x0000000000047344 0x4 + .text.__sseek 0x0000000000047348 0x50 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) + 0x0000000000047348 __sseek + .text.__sclose + 0x0000000000047398 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) + 0x0000000000047398 __sclose + .text.strcasecmp + 0x00000000000473a0 0xa0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcasecmp.o) + 0x00000000000473a0 strcasecmp + .text.strcat 0x0000000000047440 0x74 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcat.o) + 0x0000000000047440 strcat + .text 0x00000000000474b4 0xdc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strchr.o) + 0x00000000000474b4 strchr + *fill* 0x0000000000047590 0x30 + .text 0x00000000000475c0 0xa4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcmp.o) + 0x00000000000475c0 strcmp + *fill* 0x0000000000047664 0x4 + .text.strcoll 0x0000000000047668 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcoll.o) + 0x0000000000047668 strcoll + *fill* 0x000000000004766c 0x14 + .text 0x0000000000047680 0x1b8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcpy.o) + 0x0000000000047680 strcpy + .text._strerror_r + 0x0000000000047838 0x418 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strerror.o) + 0x0000000000047838 _strerror_r + .text.strerror + 0x0000000000047c50 0x24 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strerror.o) + 0x0000000000047c50 strerror + *fill* 0x0000000000047c74 0x4 + .text.strerror_l + 0x0000000000047c78 0x24 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strerror.o) + 0x0000000000047c78 strerror_l + *fill* 0x0000000000047c9c 0x4 + .text.iso_year_adjust + 0x0000000000047ca0 0x170 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) + .text.__strftime + 0x0000000000047e10 0xf2c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) + *fill* 0x0000000000048d3c 0x4 + .text.strftime + 0x0000000000048d40 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) + 0x0000000000048d40 strftime + .text.strftime_l + 0x0000000000048d88 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) + 0x0000000000048d88 strftime_l + *fill* 0x0000000000048d8c 0x4 + .text.strlcpy 0x0000000000048d90 0x54 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strlcpy.o) + 0x0000000000048d90 strlcpy + *fill* 0x0000000000048de4 0x1c + .text 0x0000000000048e00 0x140 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strlen.o) + 0x0000000000048e00 strlen + .text.strncasecmp + 0x0000000000048f40 0xcc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncasecmp.o) + 0x0000000000048f40 strncasecmp + *fill* 0x000000000004900c 0x4 + .text.strncat 0x0000000000049010 0x84 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncat.o) + 0x0000000000049010 strncat + *fill* 0x0000000000049094 0x2c + .text 0x00000000000490c0 0x124 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncmp.o) + 0x00000000000490dc strncmp + *fill* 0x00000000000491e4 0x4 + .text.strncpy 0x00000000000491e8 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncpy.o) + 0x00000000000491e8 strncpy + *fill* 0x0000000000049290 0x30 + .text 0x00000000000492c0 0xe0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strnlen.o) + 0x00000000000492e4 strnlen + .text.strpbrk 0x00000000000493a0 0x64 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strpbrk.o) + 0x00000000000493a0 strpbrk + *fill* 0x0000000000049404 0x4 + .text.strspn 0x0000000000049408 0x54 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strspn.o) + 0x0000000000049408 strspn + *fill* 0x000000000004945c 0x4 + .text.critical_factorization + 0x0000000000049460 0x120 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strstr.o) + .text.two_way_long_needle + 0x0000000000049580 0x3b4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strstr.o) + *fill* 0x0000000000049934 0x4 + .text.strstr 0x0000000000049938 0x364 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strstr.o) + 0x0000000000049938 strstr + *fill* 0x0000000000049c9c 0x4 + .text.sulp 0x0000000000049ca0 0x54 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + *fill* 0x0000000000049cf4 0x4 + .text._strtod_l + 0x0000000000049cf8 0x10f0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + 0x0000000000049cf8 _strtod_l + .text._strtod_r + 0x000000000004ade8 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + 0x000000000004ade8 _strtod_r + .text.strtod_l + 0x000000000004ae28 0x34 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + 0x000000000004ae28 strtod_l + *fill* 0x000000000004ae5c 0x4 + .text.strtod 0x000000000004ae60 0x50 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + 0x000000000004ae60 strtod + .text.strtof_l + 0x000000000004aeb0 0x9c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + 0x000000000004aeb0 strtof_l + *fill* 0x000000000004af4c 0x4 + .text.strtof 0x000000000004af50 0xc8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + 0x000000000004af50 strtof + .text._strtol_l.isra.0 + 0x000000000004b018 0x1d0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtol.o) + .text._strtol_r + 0x000000000004b1e8 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtol.o) + 0x000000000004b1e8 _strtol_r + .text.strtol_l + 0x000000000004b230 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtol.o) + 0x000000000004b230 strtol_l + .text.strtol 0x000000000004b278 0x5c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtol.o) + 0x000000000004b278 strtol + *fill* 0x000000000004b2d4 0x4 + .text._strtoul_l.isra.0 + 0x000000000004b2d8 0x1e0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoul.o) + .text._strtoul_r + 0x000000000004b4b8 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoul.o) + 0x000000000004b4b8 _strtoul_r + .text.strtoul_l + 0x000000000004b500 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoul.o) + 0x000000000004b500 strtoul_l + .text.strtoul 0x000000000004b548 0x5c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoul.o) + 0x000000000004b548 strtoul + .text.get_arg 0x000000000004b5a4 0x76c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) + .text._svfprintf_r + 0x000000000004bd10 0x3b44 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) + 0x000000000004bd10 _svfprintf_r + *fill* 0x000000000004f854 0x4 + .text._system_r + 0x000000000004f858 0x34 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-system.o) + 0x000000000004f858 _system_r + *fill* 0x000000000004f88c 0x4 + .text.system 0x000000000004f890 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-system.o) + 0x000000000004f890 system + *fill* 0x000000000004f8ac 0x4 + .text.__time_load_locale + 0x000000000004f8b0 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-timelocal.o) + 0x000000000004f8b0 __time_load_locale + .text.time 0x000000000004f8b8 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-time.o) + 0x000000000004f8b8 time + .text._tmpfile_r + 0x000000000004f8f8 0xd8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpfile.o) + 0x000000000004f8f8 _tmpfile_r + .text.tmpfile 0x000000000004f9d0 0x14 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpfile.o) + 0x000000000004f9d0 tmpfile + *fill* 0x000000000004f9e4 0x4 + .text.worker 0x000000000004f9e8 0xd8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + .text._tmpnam_r + 0x000000000004fac0 0x78 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + 0x000000000004fac0 _tmpnam_r + .text._tempnam_r + 0x000000000004fb38 0xd8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + 0x000000000004fb38 _tempnam_r + .text.tempnam 0x000000000004fc10 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + 0x000000000004fc10 tempnam + .text.tmpnam 0x000000000004fc40 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + 0x000000000004fc40 tmpnam + *fill* 0x000000000004fc5c 0x4 + .text.__tzcalc_limits + 0x000000000004fc60 0x230 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzcalc_limits.o) + 0x000000000004fc60 __tzcalc_limits + .text.__tz_lock + 0x000000000004fe90 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzlock.o) + 0x000000000004fe90 __tz_lock + *fill* 0x000000000004fe9c 0x4 + .text.__tz_unlock + 0x000000000004fea0 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzlock.o) + 0x000000000004fea0 __tz_unlock + *fill* 0x000000000004feac 0x4 + .text._tzset_unlocked + 0x000000000004feb0 0x14 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset.o) + 0x000000000004feb0 _tzset_unlocked + *fill* 0x000000000004fec4 0x4 + .text.tzset 0x000000000004fec8 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset.o) + 0x000000000004fec8 tzset + *fill* 0x000000000004fee4 0x4 + .text._tzset_unlocked_r + 0x000000000004fee8 0x50c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) + 0x000000000004fee8 _tzset_unlocked_r + *fill* 0x00000000000503f4 0x4 + .text._tzset_r + 0x00000000000503f8 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) + 0x00000000000503f8 _tzset_r + .text.__submore + 0x0000000000050418 0xc8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ungetc.o) + 0x0000000000050418 __submore + .text._ungetc_r + 0x00000000000504e0 0x1f0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ungetc.o) + 0x00000000000504e0 _ungetc_r + .text.ungetc 0x00000000000506d0 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ungetc.o) + 0x00000000000506d0 ungetc + .text._user_strerror + 0x0000000000050700 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-u_strerr.o) + 0x0000000000050700 _user_strerror + .text.get_arg 0x0000000000050708 0x76c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + .text._vfprintf_r + 0x0000000000050e74 0x3bfc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + 0x0000000000050e74 _vfprintf_r + .text.vfprintf + 0x0000000000054a70 0x4c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + 0x0000000000054a70 vfprintf + .text.__sbprintf + 0x0000000000054abc 0xec /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + .text.__swbuf_r + 0x0000000000054ba8 0x118 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wbuf.o) + 0x0000000000054ba8 __swbuf_r + .text.__swbuf 0x0000000000054cc0 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wbuf.o) + 0x0000000000054cc0 __swbuf + .text._wcrtomb_r + 0x0000000000054cf0 0xd0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcrtomb.o) + 0x0000000000054cf0 _wcrtomb_r + .text.wcrtomb 0x0000000000054dc0 0xdc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcrtomb.o) + 0x0000000000054dc0 wcrtomb + *fill* 0x0000000000054e9c 0x4 + .text._wcsrtombs_r + 0x0000000000054ea0 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsrtombs.o) + 0x0000000000054ea0 _wcsrtombs_r + .text.wcsrtombs + 0x0000000000054eb0 0x44 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsrtombs.o) + 0x0000000000054eb0 wcsrtombs + *fill* 0x0000000000054ef4 0x4 + .text._wctomb_r + 0x0000000000054ef8 0x54 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wctomb_r.o) + 0x0000000000054ef8 _wctomb_r + *fill* 0x0000000000054f4c 0x4 + .text.__ascii_wctomb + 0x0000000000054f50 0x34 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wctomb_r.o) + 0x0000000000054f50 __ascii_wctomb + *fill* 0x0000000000054f84 0x4 + .text.__utf8_wctomb + 0x0000000000054f88 0xe4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wctomb_r.o) + 0x0000000000054f88 __utf8_wctomb + *fill* 0x000000000005506c 0x4 + .text.__sjis_wctomb + 0x0000000000055070 0x84 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wctomb_r.o) + 0x0000000000055070 __sjis_wctomb + *fill* 0x00000000000550f4 0x4 + .text.__eucjp_wctomb + 0x00000000000550f8 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wctomb_r.o) + 0x00000000000550f8 __eucjp_wctomb + .text.__jis_wctomb + 0x00000000000551a0 0xbc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wctomb_r.o) + 0x00000000000551a0 __jis_wctomb + *fill* 0x000000000005525c 0x4 + .text.__swsetup_r + 0x0000000000055260 0x140 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wsetup.o) + 0x0000000000055260 __swsetup_r + .text.abs 0x00000000000553a0 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abs.o) + 0x00000000000553a0 abs + *fill* 0x00000000000553ac 0x4 + .text.__call_exitprocs + 0x00000000000553b0 0x17c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-__call_atexit.o) + 0x00000000000553b0 __call_exitprocs + *fill* 0x000000000005552c 0x4 + .text.__set_ctype + 0x0000000000055530 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ctype_.o) + 0x0000000000055530 __set_ctype + .text.div 0x0000000000055540 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-div.o) + 0x0000000000055540 div + .text.quorem 0x0000000000055580 0x1a8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-dtoa.o) + .text._dtoa_r 0x0000000000055728 0x10dc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-dtoa.o) + 0x0000000000055728 _dtoa_r + *fill* 0x0000000000056804 0x4 + .text.__env_lock + 0x0000000000056808 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-envlock.o) + 0x0000000000056808 __env_lock + *fill* 0x0000000000056814 0x4 + .text.__env_unlock + 0x0000000000056818 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-envlock.o) + 0x0000000000056818 __env_unlock + *fill* 0x0000000000056824 0x4 + .text._fdopen_r + 0x0000000000056828 0x14c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fdopen.o) + 0x0000000000056828 _fdopen_r + *fill* 0x0000000000056974 0x4 + .text.fdopen 0x0000000000056978 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fdopen.o) + 0x0000000000056978 fdopen + .text.__sflags + 0x00000000000569a8 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-flags.o) + 0x00000000000569a8 __sflags + .text.rshift 0x0000000000056a50 0x114 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-gethex.o) + *fill* 0x0000000000056b64 0x4 + .text.__gethex + 0x0000000000056b68 0x7e8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-gethex.o) + 0x0000000000056b68 __gethex + .text.__match 0x0000000000057350 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-hexnan.o) + 0x0000000000057350 __match + .text.__hexnan + 0x0000000000057398 0x22c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-hexnan.o) + 0x0000000000057398 __hexnan + *fill* 0x00000000000575c4 0x4 + .text.__gettzinfo + 0x00000000000575c8 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gettzinfo.o) + 0x00000000000575c8 __gettzinfo + *fill* 0x00000000000575d4 0x4 + .text.labs 0x00000000000575d8 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-labs.o) + 0x00000000000575d8 labs + *fill* 0x00000000000575e4 0x4 + .text._Balloc 0x00000000000575e8 0x90 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x00000000000575e8 _Balloc + .text._Bfree 0x0000000000057678 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000057678 _Bfree + *fill* 0x0000000000057694 0x4 + .text.__multadd + 0x0000000000057698 0xe8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000057698 __multadd + .text.__s2b 0x0000000000057780 0x120 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000057780 __s2b + .text.__hi0bits + 0x00000000000578a0 0x5c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x00000000000578a0 __hi0bits + *fill* 0x00000000000578fc 0x4 + .text.__lo0bits + 0x0000000000057900 0xa0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000057900 __lo0bits + .text.__i2b 0x00000000000579a0 0x2c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x00000000000579a0 __i2b + *fill* 0x00000000000579cc 0x4 + .text.__multiply + 0x00000000000579d0 0x1c8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x00000000000579d0 __multiply + .text.__pow5mult + 0x0000000000057b98 0x104 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000057b98 __pow5mult + *fill* 0x0000000000057c9c 0x4 + .text.__lshift + 0x0000000000057ca0 0x134 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000057ca0 __lshift + *fill* 0x0000000000057dd4 0x4 + .text.__mcmp 0x0000000000057dd8 0x50 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000057dd8 __mcmp + .text.__mdiff 0x0000000000057e28 0x14c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000057e28 __mdiff + *fill* 0x0000000000057f74 0x4 + .text.__ulp 0x0000000000057f78 0x68 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000057f78 __ulp + .text.__b2d 0x0000000000057fe0 0x150 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000057fe0 __b2d + .text.__d2b 0x0000000000058130 0x138 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000058130 __d2b + .text.__ratio 0x0000000000058268 0xa0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000058268 __ratio + .text._mprec_log10 + 0x0000000000058308 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000058308 _mprec_log10 + .text.__copybits + 0x0000000000058338 0x68 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x0000000000058338 __copybits + .text.__any_on + 0x00000000000583a0 0x84 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x00000000000583a0 __any_on + *fill* 0x0000000000058424 0x4 + .text.nanf 0x0000000000058428 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sf_nan.o) + 0x0000000000058428 nanf + *fill* 0x0000000000058434 0x4 + .text.frexp 0x0000000000058438 0x7c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-s_frexp.o) + 0x0000000000058438 frexp + *fill* 0x00000000000584b4 0x4 + .text.siscanf 0x00000000000584b8 0xbc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-siscanf.o) + 0x00000000000584b8 siscanf + *fill* 0x0000000000058574 0x4 + .text._siscanf_r + 0x0000000000058578 0xcc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-siscanf.o) + 0x0000000000058578 _siscanf_r + *fill* 0x0000000000058644 0x4 + .text._sniprintf_r + 0x0000000000058648 0x130 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sniprintf.o) + 0x0000000000058648 _sniprintf_r + .text.sniprintf + 0x0000000000058778 0x14c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sniprintf.o) + 0x0000000000058778 sniprintf + *fill* 0x00000000000588c4 0x4 + .text._sprintf_r + 0x00000000000588c8 0x9c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sprintf.o) + 0x00000000000588c8 _sprintf_r + *fill* 0x0000000000058964 0x4 + .text.sprintf 0x0000000000058968 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sprintf.o) + 0x0000000000058968 sprintf + .text.get_arg 0x0000000000058a10 0x76c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + .text.__ssprint_r + 0x000000000005917c 0x1c0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + 0x000000000005917c __ssprint_r + .text._svfiprintf_r + 0x000000000005933c 0x2884 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + 0x000000000005933c _svfiprintf_r + .text.get_arg 0x000000000005bbc0 0x5c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) + .text._sungetc_r + 0x000000000005bc1c 0xf4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) + 0x000000000005bc1c _sungetc_r + .text.__ssrefill_r + 0x000000000005bd10 0x70 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) + 0x000000000005bd10 __ssrefill_r + .text._sfread_r + 0x000000000005bd80 0xe0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) + 0x000000000005bd80 _sfread_r + .text.__ssvfiscanf_r + 0x000000000005be60 0x2678 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) + 0x000000000005be60 __ssvfiscanf_r + .text.get_arg 0x000000000005e4d8 0x76c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + .text.__sprint_r + 0x000000000005ec44 0x3c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + 0x000000000005ec44 __sprint_r + .text._vfiprintf_r + 0x000000000005ec80 0x2984 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + 0x000000000005ec80 _vfiprintf_r + .text.vfiprintf + 0x0000000000061604 0x4c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + 0x0000000000061604 vfiprintf + .text.__sbprintf + 0x0000000000061650 0xec /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + *fill* 0x000000000006173c 0x4 + .text._wcsnrtombs_l + 0x0000000000061740 0x1dc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsnrtombs.o) + 0x0000000000061740 _wcsnrtombs_l + *fill* 0x000000000006191c 0x4 + .text._wcsnrtombs_r + 0x0000000000061920 0x54 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsnrtombs.o) + 0x0000000000061920 _wcsnrtombs_r + *fill* 0x0000000000061974 0x4 + .text.wcsnrtombs + 0x0000000000061978 0x64 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsnrtombs.o) + 0x0000000000061978 wcsnrtombs + *fill* 0x00000000000619dc 0x4 + .text._calloc_r + 0x00000000000619e0 0x94 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-callocr.o) + 0x00000000000619e0 _calloc_r + *fill* 0x0000000000061a74 0x4 + .text.iswspace + 0x0000000000061a78 0x84 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-iswspace.o) + 0x0000000000061a78 iswspace + *fill* 0x0000000000061afc 0x4 + .text.__jp2uc 0x0000000000061b00 0x244 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + *fill* 0x0000000000061d44 0x4 + .text._jp2uc 0x0000000000061d48 0xd0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + 0x0000000000061d48 _jp2uc + .text._mbrtowc_r + 0x0000000000061e18 0xd8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbrtowc.o) + 0x0000000000061e18 _mbrtowc_r + .text.mbrtowc 0x0000000000061ef0 0xf8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbrtowc.o) + 0x0000000000061ef0 mbrtowc + .text.__sccl 0x0000000000061fe8 0xbc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sccl.o) + 0x0000000000061fe8 __sccl + *fill* 0x00000000000620a4 0x4 + .text._strtoll_l.isra.0 + 0x00000000000620a8 0x1d0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoll.o) + .text._strtoll_r + 0x0000000000062278 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoll.o) + 0x0000000000062278 _strtoll_r + .text.strtoll_l + 0x00000000000622c0 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoll.o) + 0x00000000000622c0 strtoll_l + .text.strtoll 0x0000000000062308 0x5c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoll.o) + 0x0000000000062308 strtoll + *fill* 0x0000000000062364 0x4 + .text._strtoull_l.isra.0 + 0x0000000000062368 0x1e0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoull.o) + .text._strtoull_r + 0x0000000000062548 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoull.o) + 0x0000000000062548 _strtoull_r + .text.strtoull_l + 0x0000000000062590 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoull.o) + 0x0000000000062590 strtoull_l + .text.strtoull + 0x00000000000625d8 0x5c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoull.o) + 0x00000000000625d8 strtoull + *fill* 0x0000000000062634 0x4 + .text.null_write + 0x0000000000062638 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + .text.setDefaultDevice + 0x0000000000062640 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + 0x0000000000062640 setDefaultDevice + .text.FindDevice + 0x0000000000062658 0xf8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + 0x0000000000062658 FindDevice + .text.RemoveDevice + 0x0000000000062750 0x34 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + 0x0000000000062750 RemoveDevice + *fill* 0x0000000000062784 0x4 + .text.AddDevice + 0x0000000000062788 0xd8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + 0x0000000000062788 AddDevice + .text.GetDeviceOpTab + 0x0000000000062860 0x34 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + 0x0000000000062860 GetDeviceOpTab + *fill* 0x0000000000062894 0x4 + .text._close_r + 0x0000000000062898 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(close.o) + 0x0000000000062898 _close_r + .text._fstat_r + 0x0000000000062940 0x80 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(fstat.o) + 0x0000000000062940 _fstat_r + .text._getpid_r + 0x00000000000629c0 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getpid.o) + 0x00000000000629c0 _getpid_r + .text._gettimeofday_r + 0x00000000000629d0 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(gettod.o) + 0x00000000000629d0 _gettimeofday_r + .text._isatty_r + 0x00000000000629f8 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(isatty.o) + 0x00000000000629f8 _isatty_r + .text._kill_r 0x0000000000062a00 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(kill.o) + 0x0000000000062a00 _kill_r + .text._lseek_r + 0x0000000000062a10 0x94 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(lseek.o) + 0x0000000000062a10 _lseek_r + *fill* 0x0000000000062aa4 0x4 + .text._open_r 0x0000000000062aa8 0xe0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(open.o) + 0x0000000000062aa8 _open_r + .text._read_r 0x0000000000062b88 0xa4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(read.o) + 0x0000000000062b88 _read_r + *fill* 0x0000000000062c2c 0x4 + .text._sbrk_r 0x0000000000062c30 0x78 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(sbrk.o) + 0x0000000000062c30 _sbrk_r + .text._times_r + 0x0000000000062ca8 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(times.o) + 0x0000000000062ca8 _times_r + .text._unlink_r + 0x0000000000062cb8 0x74 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(unlink.o) + 0x0000000000062cb8 _unlink_r + *fill* 0x0000000000062d2c 0x4 + .text._write_r + 0x0000000000062d30 0xa4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(write.o) + 0x0000000000062d30 _write_r + *fill* 0x0000000000062dd4 0x4 + .text._exit 0x0000000000062dd8 0x24 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(_exit.o) + 0x0000000000062dd8 _exit + *fill* 0x0000000000062dfc 0x4 + .text._concatenate_path + 0x0000000000062e00 0x234 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + 0x0000000000062e00 _concatenate_path + *fill* 0x0000000000063034 0x4 + .text.chdir 0x0000000000063038 0x178 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + 0x0000000000063038 chdir + .text.getcwd 0x00000000000631b0 0xb8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + 0x00000000000631b0 getcwd + .text._rename_r + 0x0000000000063268 0x90 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(rename.o) + 0x0000000000063268 _rename_r + .text.__libc_lock_init + 0x00000000000632f8 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + 0x00000000000632f8 __libc_lock_init + .text.__libc_lock_acquire + 0x0000000000063310 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + 0x0000000000063310 __libc_lock_acquire + .text.__libc_lock_try_acquire + 0x0000000000063328 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + 0x0000000000063328 __libc_lock_try_acquire + .text.__libc_lock_release + 0x0000000000063348 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + 0x0000000000063348 __libc_lock_release + .text.__libc_lock_close + 0x0000000000063360 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + 0x0000000000063360 __libc_lock_close + .text.__libc_lock_init_recursive + 0x0000000000063378 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + 0x0000000000063378 __libc_lock_init_recursive + .text.__libc_lock_acquire_recursive + 0x0000000000063390 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + 0x0000000000063390 __libc_lock_acquire_recursive + .text.__libc_lock_try_acquire_recursive + 0x00000000000633a8 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + 0x00000000000633a8 __libc_lock_try_acquire_recursive + .text.__libc_lock_release_recursive + 0x00000000000633c8 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + 0x00000000000633c8 __libc_lock_release_recursive + .text.__libc_lock_close_recursive + 0x00000000000633e0 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + 0x00000000000633e0 __libc_lock_close_recursive + .text.__free_handle + 0x00000000000633f8 0x3c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + 0x00000000000633f8 __free_handle + *fill* 0x0000000000063434 0x4 + .text.__release_handle + 0x0000000000063438 0x58 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + 0x0000000000063438 __release_handle + .text.__alloc_handle + 0x0000000000063490 0xc0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + 0x0000000000063490 __alloc_handle + .text.__get_handle + 0x0000000000063550 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + 0x0000000000063550 __get_handle + .text.dup 0x0000000000063570 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + 0x0000000000063570 dup + .text.dup2 0x0000000000063618 0x130 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + 0x0000000000063618 dup2 + .text.__getreent + 0x0000000000063748 0x24 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getreent.o) + 0x0000000000063748 __getreent + *fill* 0x000000000006376c 0x4 + .text.__trunctfdf2 + 0x0000000000063770 0x350 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(trunctfdf2.o) + 0x0000000000063770 __trunctfdf2 + .text.__sfp_handle_exceptions + 0x0000000000063ac0 0x70 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(sfp-exceptions.o) + 0x0000000000063ac0 __sfp_handle_exceptions + .text 0x0000000000063b30 0x100 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strrchr.o) + 0x0000000000063b30 strrchr + 0x0000000000063c30 . = ALIGN (0x8) + +.fini 0x0000000000063c30 0x38 + *(.fini) + .fini 0x0000000000063c30 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + 0x0000000000063c30 _fini + .fini 0x0000000000063c48 0x1c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtn.o + 0x0000000000063c68 . = ALIGN (0x8) + *fill* 0x0000000000063c64 0x4 + 0x0000000000064000 . = ALIGN (0x1000) + +.rodata 0x0000000000064000 0x8dc0 + *(.rodata .rodata.* .gnu.linkonce.r.*) + .rodata 0x0000000000064000 0xd main.o + *fill* 0x000000000006400d 0x3 + .rodata.str1.8 + 0x0000000000064010 0x56b main.o + *fill* 0x000000000006457b 0x5 + .rodata 0x0000000000064580 0x1c liolib.o + *fill* 0x000000000006459c 0x4 + .rodata.str1.8 + 0x00000000000645a0 0x255 liolib.o + 0x285 (size before relaxing) + *fill* 0x00000000000647f5 0x3 + .rodata.str1.8 + 0x00000000000647f8 0x42 lmem.o + *fill* 0x000000000006483a 0x6 + .rodata.str1.8 + 0x0000000000064840 0x3be lauxlib.o + 0x408 (size before relaxing) + *fill* 0x0000000000064bfe 0x2 + .rodata 0x0000000000064c00 0x8e ldebug.o + *fill* 0x0000000000064c8e 0x2 + .rodata.str1.8 + 0x0000000000064c90 0x1be ldebug.o + 0x1de (size before relaxing) + *fill* 0x0000000000064e4e 0x2 + .rodata.str1.8 + 0x0000000000064e50 0x11a ldo.o + 0x12a (size before relaxing) + *fill* 0x0000000000064f6a 0x2 + .rodata 0x0000000000064f6c 0x4 loadlib.o + .rodata.str1.8 + 0x0000000000064f70 0x323 loadlib.o + 0x353 (size before relaxing) + *fill* 0x0000000000065293 0x5 + .rodata.str1.8 + 0x0000000000065298 0x133 lmathlib.o + 0x153 (size before relaxing) + *fill* 0x00000000000653cb 0x5 + .rodata 0x00000000000653d0 0x101 lctype.o + 0x00000000000653d0 luai_ctype_ + .rodata.str1.8 + 0x00000000000654d1 0x11 lstate.o + *fill* 0x00000000000654d1 0x7 + .rodata 0x00000000000654d8 0x56 lopcodes.o + 0x00000000000654d8 luaP_opmodes + *fill* 0x000000000006552e 0x2 + .rodata 0x0000000000065530 0x5b lstrlib.o + *fill* 0x000000000006558b 0x5 + .rodata.str1.8 + 0x0000000000065590 0x63f lstrlib.o + 0x66f (size before relaxing) + *fill* 0x0000000000065bcf 0x1 + .rodata 0x0000000000065bd0 0x18 loslib.o + .rodata.str1.8 + 0x0000000000065be8 0x220 loslib.o + 0x230 (size before relaxing) + .rodata 0x0000000000065e08 0x28 lbaselib.o + .rodata.str1.8 + 0x0000000000065e30 0x2bf lbaselib.o + 0x2df (size before relaxing) + *fill* 0x00000000000660ef 0x1 + .rodata 0x00000000000660f0 0x27 lutf8lib.o + *fill* 0x0000000000066117 0x1 + .rodata.str1.8 + 0x0000000000066118 0xbe lutf8lib.o + 0x11e (size before relaxing) + *fill* 0x00000000000661d6 0x2 + .rodata 0x00000000000661d8 0x4a lparser.o + *fill* 0x0000000000066222 0x6 + .rodata.str1.8 + 0x0000000000066228 0x2ca lparser.o + 0x2da (size before relaxing) + *fill* 0x00000000000664f2 0x2 + .rodata 0x00000000000664f4 0x100 llex.o + *fill* 0x00000000000665f4 0x4 + .rodata.str1.8 + 0x00000000000665f8 0x291 llex.o + 0x2e9 (size before relaxing) + *fill* 0x0000000000066889 0x3 + .rodata 0x000000000006688c 0x4 ldblib.o + .rodata.str1.8 + 0x0000000000066890 0x242 ldblib.o + 0x2ba (size before relaxing) + *fill* 0x0000000000066ad2 0x6 + .rodata.str1.8 + 0x0000000000066ad8 0x13d ltablib.o + 0x16d (size before relaxing) + *fill* 0x0000000000066c15 0x3 + .rodata 0x0000000000066c18 0x28 ltable.o + .rodata.str1.8 + 0x0000000000066c40 0x3b ltable.o + *fill* 0x0000000000066c7b 0x5 + .rodata.str1.8 + 0x0000000000066c80 0x25 linit.o + 0x56 (size before relaxing) + *fill* 0x0000000000066ca5 0x3 + .rodata 0x0000000000066ca8 0x9 ltm.o + *fill* 0x0000000000066cb1 0x7 + .rodata.str1.8 + 0x0000000000066cb8 0xb6 ltm.o + 0x176 (size before relaxing) + *fill* 0x0000000000066d6e 0x2 + .rodata 0x0000000000066d70 0x7 lgc.o + *fill* 0x0000000000066d77 0x1 + .rodata.str1.8 + 0x0000000000066d78 0x3b lgc.o + 0x42 (size before relaxing) + *fill* 0x0000000000066db3 0x5 + .rodata.str1.8 + 0x0000000000066db8 0x12 lstring.o + *fill* 0x0000000000066dca 0x6 + .rodata.str1.8 + 0x0000000000066dd0 0xd6 lvm.o + 0xe6 (size before relaxing) + *fill* 0x0000000000066ea6 0x2 + .rodata 0x0000000000066ea8 0x48 lcode.o + .rodata.str1.8 + 0x0000000000066ef0 0x5d lcode.o + 0x85 (size before relaxing) + *fill* 0x0000000000066f4d 0x3 + .rodata.str1.8 + 0x0000000000066f50 0x141 lundump.o + *fill* 0x0000000000067091 0x7 + .rodata.str1.8 + 0x0000000000067098 0xc7 lcorolib.o + 0xef (size before relaxing) + *fill* 0x000000000006715f 0x1 + .rodata 0x0000000000067160 0x81 lapi.o + 0x0000000000067160 lua_ident + *fill* 0x00000000000671e1 0x7 + .rodata.str1.8 + 0x00000000000671e8 0xa lapi.o + 0x1a (size before relaxing) + *fill* 0x00000000000671f2 0x6 + .rodata.str1.8 + 0x00000000000671f8 0x2c lfunc.o + 0x34 (size before relaxing) + *fill* 0x0000000000067224 0x4 + .rodata 0x0000000000067228 0x100 lobject.o + .rodata.str1.8 + 0x0000000000067328 0x7b lobject.o + 0x93 (size before relaxing) + .rodata.str1.8 + 0x00000000000673a3 0xf ldump.o + *fill* 0x00000000000673a3 0x5 + .rodata.__libnx_init_time.str1.8 + 0x00000000000673a8 0x3 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + *fill* 0x00000000000673ab 0x5 + .rodata._fsdevUnmountDeviceStruct.part.4.str1.8 + 0x00000000000673b0 0x2 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x00000000000673b2 0x6 + .rodata.error_table + 0x00000000000673b8 0x18 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .rodata.fsdevMountSdmc.str1.8 + 0x00000000000673d0 0x5 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x00000000000673d5 0x3 + .rodata.CSWTCH.83 + 0x00000000000673d8 0x14 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000673ec 0x4 + .rodata.appletInitialize.str1.8 + 0x00000000000673f0 0x19 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x0000000000067409 0x7 + .rodata.timeInitialize.str1.8 + 0x0000000000067410 0xf /opt/devkitpro//libnx/lib/libnx.a(time.o) + *fill* 0x000000000006741f 0x1 + .rodata 0x0000000000067420 0x24 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x0000000000067444 0x4 + .rodata.hidInitialize.str1.8 + 0x0000000000067448 0x4 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x000000000006744c 0x4 + .rodata.fsInitialize.str1.8 + 0x0000000000067450 0x8 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .rodata.apmInitialize.str1.8 + 0x0000000000067458 0xc /opt/devkitpro//libnx/lib/libnx.a(apm.o) + *fill* 0x0000000000067464 0x4 + .rodata.smInitialize.str1.8 + 0x0000000000067468 0x4 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + 0x9 (size before relaxing) + *fill* 0x000000000006746c 0x4 + .rodata._fatalImpl.str1.8 + 0x0000000000067470 0x8 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + .rodata.nxlinkSetup.str1.8 + 0x0000000000067478 0x9 /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + *fill* 0x0000000000067481 0x7 + .rodata.powf.cst8 + 0x0000000000067488 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow.o) + .rodata.acosf.str1.8 + 0x0000000000067490 0x6 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_acos.o) + 0x9 (size before relaxing) + *fill* 0x0000000000067496 0x2 + .rodata.asinf.str1.8 + 0x0000000000067498 0x6 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_asin.o) + 0x9 (size before relaxing) + *fill* 0x000000000006749e 0x2 + .rodata.fmodf.str1.8 + 0x00000000000674a0 0x6 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_fmod.o) + *fill* 0x00000000000674a6 0x2 + .rodata.log10f.str1.8 + 0x00000000000674a8 0x7 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_log10.o) + 0x9 (size before relaxing) + *fill* 0x00000000000674af 0x1 + .rodata.Zero 0x00000000000674b0 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_fmod.o) + .rodata.npio2_hw + 0x00000000000674b8 0x80 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_rem_pio2.o) + .rodata.two_over_pi + 0x0000000000067538 0x318 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_rem_pio2.o) + .rodata.PIo2 0x0000000000067850 0x2c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_rem_pio2.o) + *fill* 0x000000000006787c 0x4 + .rodata.init_jk + 0x0000000000067880 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_rem_pio2.o) + *fill* 0x000000000006788c 0x4 + .rodata.atanhi + 0x0000000000067890 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_atan.o) + .rodata.atanlo + 0x00000000000678a0 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_atan.o) + .rodata.__exp2f_data + 0x00000000000678b0 0x148 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp2_data.o) + 0x00000000000678b0 __exp2f_data + .rodata.__log2f_data + 0x00000000000679f8 0x120 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2_data.o) + 0x00000000000679f8 __log2f_data + .rodata.__logf_data + 0x0000000000067b18 0x120 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log_data.o) + 0x0000000000067b18 __logf_data + .rodata.__powf_log2_data + 0x0000000000067c38 0x128 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow_log2_data.o) + 0x0000000000067c38 __powf_log2_data + .rodata.__loadlocale + 0x0000000000067d60 0x6a /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + *fill* 0x0000000000067dca 0x6 + .rodata.__get_locale_env.str1.8 + 0x0000000000067dd0 0xd /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + *fill* 0x0000000000067ddd 0x3 + .rodata.__loadlocale.str1.8 + 0x0000000000067de0 0x103 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x10b (size before relaxing) + .rodata.currentlocale.str1.8 + 0x0000000000067ee3 0x2 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + *fill* 0x0000000000067ee3 0x5 + .rodata.str1.8 + 0x0000000000067ee8 0x54 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x64 (size before relaxing) + *fill* 0x0000000000067f3c 0x4 + .rodata.JIS_action_table + 0x0000000000067f40 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + .rodata.JIS_state_table + 0x0000000000067f88 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + .rodata.DAYS_IN_MONTH + 0x0000000000067fd0 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mktime.o) + .rodata._DAYS_BEFORE_MONTH + 0x0000000000068000 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mktime.o) + .rodata.__month_lengths + 0x0000000000068030 0x60 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-month_lengths.o) + 0x0000000000068030 __month_lengths + .rodata._strerror_r + 0x0000000000068090 0x11e /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strerror.o) + *fill* 0x00000000000681ae 0x2 + .rodata._strerror_r.str1.8 + 0x00000000000681b0 0x798 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strerror.o) + 0x799 (size before relaxing) + .rodata.__strftime + 0x0000000000068948 0xac /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) + *fill* 0x00000000000689f4 0x4 + .rodata.__strftime.str1.8 + 0x00000000000689f8 0x84 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) + 0x9c (size before relaxing) + *fill* 0x0000000000068a7c 0x4 + .rodata._strtod_l.cst8 + 0x0000000000068a80 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + .rodata._strtod_l.str1.8 + 0x0000000000068a98 0x13 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + *fill* 0x0000000000068aab 0x5 + .rodata.fpi.5241 + 0x0000000000068ab0 0x14 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + *fill* 0x0000000000068ac4 0x4 + .rodata.fpinan.5277 + 0x0000000000068ac8 0x14 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + *fill* 0x0000000000068adc 0x4 + .rodata.tinytens + 0x0000000000068ae0 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + .rodata.get_arg + 0x0000000000068b08 0x92 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) + *fill* 0x0000000000068b9a 0x2 + .rodata._svfprintf_r + 0x0000000000068b9c 0xb6 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) + .rodata._svfprintf_r.str1.1 + 0x0000000000068c52 0x3b /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) + *fill* 0x0000000000068c8d 0x3 + .rodata.blanks.6378 + 0x0000000000068c90 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) + .rodata.zeroes.6379 + 0x0000000000068ca0 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) + .rodata.str1.8 + 0x0000000000068cb0 0x1d4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-timelocal.o) + 0x1d9 (size before relaxing) + *fill* 0x0000000000068e84 0x4 + .rodata._tmpfile_r.str1.8 + 0x0000000000068e88 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpfile.o) + *fill* 0x0000000000068e8c 0x4 + .rodata._tempnam_r.str1.8 + 0x0000000000068e90 0x7 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + 0xf (size before relaxing) + *fill* 0x0000000000068e97 0x1 + .rodata._tmpnam_r.str1.8 + 0x0000000000068e98 0x5 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + 0xd (size before relaxing) + *fill* 0x0000000000068e9d 0x3 + .rodata.worker.str1.8 + 0x0000000000068ea0 0xb /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + *fill* 0x0000000000068eab 0x5 + .rodata._tzset_unlocked_r.str1.8 + 0x0000000000068eb0 0x5b /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) + 0x63 (size before relaxing) + .rodata.str1.8 + 0x0000000000068f0b 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzvars.o) + *fill* 0x0000000000068f0b 0x1 + .rodata.get_arg + 0x0000000000068f0c 0x92 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + *fill* 0x0000000000068f9e 0x2 + .rodata._vfprintf_r + 0x0000000000068fa0 0xb6 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + .rodata._vfprintf_r.str1.1 + 0x0000000000069056 0x3b /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + *fill* 0x0000000000069056 0x2 + .rodata.blanks.6393 + 0x0000000000069058 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + .rodata.zeroes.6394 + 0x0000000000069068 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + .rodata._ctype_ + 0x0000000000069078 0x101 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ctype_.o) + 0x0000000000069078 _ctype_ + *fill* 0x0000000000069179 0x7 + .rodata._dtoa_r.cst8 + 0x0000000000069180 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-dtoa.o) + .rodata._dtoa_r.str1.8 + 0x0000000000069198 0x1a /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-dtoa.o) + *fill* 0x00000000000691b2 0x6 + .rodata.__hexdig + 0x00000000000691b8 0x100 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-gethex.o) + 0x00000000000691b8 __hexdig + .rodata.__mprec_bigtens + 0x00000000000692b8 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x00000000000692b8 __mprec_bigtens + .rodata.__mprec_tens + 0x00000000000692e0 0xc8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x00000000000692e0 __mprec_tens + .rodata.__mprec_tinytens + 0x00000000000693a8 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x00000000000693a8 __mprec_tinytens + .rodata.p05.5161 + 0x00000000000693d0 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + .rodata.get_arg + 0x00000000000693dc 0x92 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + *fill* 0x000000000006946e 0x2 + .rodata._svfiprintf_r + 0x0000000000069470 0xb6 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + *fill* 0x0000000000069526 0x2 + .rodata.__action_table + 0x0000000000069528 0x6c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + 0x0000000000069528 __action_table + *fill* 0x0000000000069594 0x4 + .rodata.__chclass + 0x0000000000069598 0x100 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + 0x0000000000069598 __chclass + .rodata.__state_table + 0x0000000000069698 0x6c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + 0x0000000000069698 __state_table + .rodata._svfiprintf_r.str1.1 + 0x0000000000069704 0x29 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + *fill* 0x0000000000069704 0x4 + .rodata.blanks.6357 + 0x0000000000069708 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + .rodata.zeroes.6358 + 0x0000000000069718 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + .rodata.basefix.6052 + 0x0000000000069728 0x22 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) + *fill* 0x000000000006974a 0x2 + .rodata.get_arg + 0x000000000006974c 0x92 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + *fill* 0x00000000000697de 0x2 + .rodata._vfiprintf_r + 0x00000000000697e0 0xb6 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + .rodata._vfiprintf_r.str1.1 + 0x0000000000069896 0x29 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + *fill* 0x0000000000069896 0x2 + .rodata.blanks.6361 + 0x0000000000069898 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + .rodata.zeroes.6362 + 0x00000000000698a8 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + .rodata._jp2uc.str1.8 + 0x00000000000698b8 0x16 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + .rodata.a1 0x00000000000698b8 0xbc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + *fill* 0x0000000000069974 0x4 + .rodata.a2 0x0000000000069978 0xbc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + *fill* 0x0000000000069a34 0x4 + .rodata.a3 0x0000000000069a38 0x5b /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + *fill* 0x0000000000069a93 0x5 + .rodata.a6 0x0000000000069a98 0x70 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + .rodata.a7 0x0000000000069b08 0xa2 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + *fill* 0x0000000000069baa 0x6 + .rodata.a8 0x0000000000069bb0 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + .rodata.b02cf 0x0000000000069bf0 0x172a /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + *fill* 0x000000000006b31a 0x6 + .rodata.d02f4 0x000000000006b320 0x1a7c /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + .rodata._mbrtowc_r.str1.8 + 0x000000000006cd9c 0x1 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbrtowc.o) + *fill* 0x000000000006cd9c 0x4 + .rodata.AddDevice.str1.8 + 0x000000000006cda0 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + .rodata.DIRECTORY_PARENT + 0x000000000006cda8 0x3 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + 0x000000000006cda8 DIRECTORY_PARENT + *fill* 0x000000000006cdab 0x5 + .rodata.DIRECTORY_SEPARATOR + 0x000000000006cdb0 0x2 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + 0x000000000006cdb0 DIRECTORY_SEPARATOR + *fill* 0x000000000006cdb2 0x6 + .rodata.DIRECTORY_THIS + 0x000000000006cdb8 0x2 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + 0x000000000006cdb8 DIRECTORY_THIS + 0x000000000006cdc0 . = ALIGN (0x8) + *fill* 0x000000000006cdba 0x6 + +.eh_frame_hdr 0x000000000006cdc0 0x0 + 0x000000000006cdc0 __eh_frame_hdr_start = . + *(.eh_frame_hdr) + *(.eh_frame_entry .eh_frame_entry.*) + 0x000000000006cdc0 __eh_frame_hdr_end = . + +.eh_frame 0x000000000006cdc0 0x10a90 + *(.eh_frame) + .eh_frame 0x000000000006cdc0 0x80 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + .eh_frame 0x000000000006ce40 0x1e8 main.o + 0x1f8 (size before relaxing) + .eh_frame 0x000000000006d028 0x780 liolib.o + 0x798 (size before relaxing) + .eh_frame 0x000000000006d7a8 0x190 lmem.o + 0x1a0 (size before relaxing) + .eh_frame 0x000000000006d938 0xac8 lauxlib.o + 0xad8 (size before relaxing) + .eh_frame 0x000000000006e400 0x3d8 ldebug.o + 0x3f0 (size before relaxing) + .eh_frame 0x000000000006e7d8 0x530 ldo.o + 0x548 (size before relaxing) + .eh_frame 0x000000000006ed08 0x398 loadlib.o + 0x3b0 (size before relaxing) + .eh_frame 0x000000000006f0a0 0x488 lmathlib.o + 0x498 (size before relaxing) + .eh_frame 0x000000000006f528 0x248 lstate.o + 0x260 (size before relaxing) + .eh_frame 0x000000000006f770 0xa18 lstrlib.o + 0xa28 (size before relaxing) + .eh_frame 0x0000000000070188 0x2e0 loslib.o + 0x2f8 (size before relaxing) + .eh_frame 0x0000000000070468 0x5b0 lbaselib.o + 0x5c8 (size before relaxing) + .eh_frame 0x0000000000070a18 0x230 lutf8lib.o + 0x240 (size before relaxing) + .eh_frame 0x0000000000070c48 0x7d0 lparser.o + 0x7e8 (size before relaxing) + .eh_frame 0x0000000000071418 0x340 llex.o + 0x350 (size before relaxing) + .eh_frame 0x0000000000071758 0x478 ldblib.o + 0x488 (size before relaxing) + .eh_frame 0x0000000000071bd0 0x78 lzio.o + 0x88 (size before relaxing) + .eh_frame 0x0000000000071c48 0x330 ltablib.o + 0x340 (size before relaxing) + .eh_frame 0x0000000000071f78 0x370 ltable.o + 0x380 (size before relaxing) + .eh_frame 0x00000000000722e8 0x30 linit.o + 0x40 (size before relaxing) + .eh_frame 0x0000000000072318 0x230 ltm.o + 0x248 (size before relaxing) + .eh_frame 0x0000000000072548 0x7d8 lgc.o + 0x7f0 (size before relaxing) + .eh_frame 0x0000000000072d20 0x1f8 lstring.o + 0x210 (size before relaxing) + .eh_frame 0x0000000000072f18 0x478 lvm.o + 0x490 (size before relaxing) + .eh_frame 0x0000000000073390 0x928 lcode.o + 0x938 (size before relaxing) + .eh_frame 0x0000000000073cb8 0x190 lundump.o + 0x1a8 (size before relaxing) + .eh_frame 0x0000000000073e48 0x220 lcorolib.o + 0x238 (size before relaxing) + .eh_frame 0x0000000000074068 0xc08 lapi.o + 0xc20 (size before relaxing) + .eh_frame 0x0000000000074c70 0x1f0 lfunc.o + 0x208 (size before relaxing) + .eh_frame 0x0000000000074e60 0x2d0 lobject.o + 0x2e8 (size before relaxing) + .eh_frame 0x0000000000075130 0x120 ldump.o + 0x130 (size before relaxing) + .eh_frame 0x0000000000075250 0x18 /opt/devkitpro//libnx/lib/libnx.a(dynamic.o) + 0x30 (size before relaxing) + .eh_frame 0x0000000000075268 0x70 /opt/devkitpro//libnx/lib/libnx.a(init.o) + 0xb8 (size before relaxing) + .eh_frame 0x00000000000752d8 0x158 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + 0x168 (size before relaxing) + .eh_frame 0x0000000000075430 0xf8 /opt/devkitpro//libnx/lib/libnx.a(argv.o) + 0x108 (size before relaxing) + .eh_frame 0x0000000000075528 0x770 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + 0x788 (size before relaxing) + .eh_frame 0x0000000000075c98 0x18 /opt/devkitpro//libnx/lib/libnx.a(decode_utf8.o) + 0x28 (size before relaxing) + .eh_frame 0x0000000000075cb0 0x7c0 /opt/devkitpro//libnx/lib/libnx.a(svc.o) + 0x7d0 (size before relaxing) + .eh_frame 0x0000000000076470 0x28 /opt/devkitpro//libnx/lib/libnx.a(exception.o) + 0x40 (size before relaxing) + .eh_frame 0x0000000000076498 0x18 /opt/devkitpro//libnx/lib/libnx.a(readtp.o) + 0x28 (size before relaxing) + .eh_frame 0x00000000000764b0 0xb0 /opt/devkitpro//libnx/lib/libnx.a(mutex.o) + 0xc0 (size before relaxing) + .eh_frame 0x0000000000076560 0x108 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + 0x120 (size before relaxing) + .eh_frame 0x0000000000076668 0xf30 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0xf40 (size before relaxing) + .eh_frame 0x0000000000077598 0x180 /opt/devkitpro//libnx/lib/libnx.a(time.o) + 0x198 (size before relaxing) + .eh_frame 0x0000000000077718 0x958 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + 0x968 (size before relaxing) + .eh_frame 0x0000000000078070 0xbb0 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + 0xbc0 (size before relaxing) + .eh_frame 0x0000000000078c20 0x118 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + 0x128 (size before relaxing) + .eh_frame 0x0000000000078d38 0x1a8 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + 0x1c0 (size before relaxing) + .eh_frame 0x0000000000078ee0 0x70 /opt/devkitpro//libnx/lib/libnx.a(fatal.o) + 0x88 (size before relaxing) + .eh_frame 0x0000000000078f50 0x1c0 /opt/devkitpro//libnx/lib/libnx.a(env.o) + 0x1d8 (size before relaxing) + .eh_frame 0x0000000000079110 0x50 /opt/devkitpro//libnx/lib/libnx.a(nxlink.o) + 0x68 (size before relaxing) + .eh_frame 0x0000000000079160 0x120 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + 0x138 (size before relaxing) + .eh_frame 0x0000000000079280 0xf0 /opt/devkitpro//libnx/lib/libnx.a(tmem.o) + 0x108 (size before relaxing) + .eh_frame 0x0000000000079370 0xb0 /opt/devkitpro//libnx/lib/libnx.a(wait.o) + 0xc8 (size before relaxing) + .eh_frame 0x0000000000079420 0x98 /opt/devkitpro//libnx/lib/libnx.a(rwlock.o) + 0xa8 (size before relaxing) + .eh_frame 0x00000000000794b8 0xb8 /opt/devkitpro//libnx/lib/libnx.a(shmem.o) + 0xc8 (size before relaxing) + .eh_frame 0x0000000000079570 0xb0 /opt/devkitpro//libnx/lib/libnx.a(event.o) + 0xc0 (size before relaxing) + .eh_frame 0x0000000000079620 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_cos.o) + 0x40 (size before relaxing) + .eh_frame 0x0000000000079648 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_exp.o) + 0x28 (size before relaxing) + .eh_frame 0x0000000000079660 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_frexp.o) + 0x28 (size before relaxing) + .eh_frame 0x0000000000079678 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log2.o) + 0x28 (size before relaxing) + .eh_frame 0x0000000000079690 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_log.o) + 0x28 (size before relaxing) + .eh_frame 0x00000000000796a8 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_pow.o) + 0x28 (size before relaxing) + .eh_frame 0x00000000000796c0 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_sin.o) + 0x40 (size before relaxing) + .eh_frame 0x00000000000796e8 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_tan.o) + 0x48 (size before relaxing) + .eh_frame 0x0000000000079718 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_acos.o) + 0x50 (size before relaxing) + .eh_frame 0x0000000000079758 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_asin.o) + 0x50 (size before relaxing) + .eh_frame 0x0000000000079798 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_atan2.o) + 0x28 (size before relaxing) + .eh_frame 0x00000000000797b0 0x38 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_fmod.o) + 0x50 (size before relaxing) + .eh_frame 0x00000000000797e8 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-wf_log10.o) + 0x48 (size before relaxing) + .eh_frame 0x0000000000079818 0x68 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_acos.o) + 0x78 (size before relaxing) + .eh_frame 0x0000000000079880 0x88 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_asin.o) + 0x98 (size before relaxing) + .eh_frame 0x0000000000079908 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_atan2.o) + 0x58 (size before relaxing) + .eh_frame 0x0000000000079950 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_fmod.o) + 0x28 (size before relaxing) + .eh_frame 0x0000000000079968 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_log10.o) + 0x38 (size before relaxing) + .eh_frame 0x0000000000079990 0x38 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_rem_pio2.o) + 0x50 (size before relaxing) + .eh_frame 0x00000000000799c8 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-ef_sqrt.o) + 0x28 (size before relaxing) + .eh_frame 0x00000000000799e0 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_cos.o) + 0x28 (size before relaxing) + .eh_frame 0x00000000000799f8 0x58 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_rem_pio2.o) + 0x68 (size before relaxing) + .eh_frame 0x0000000000079a50 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_sin.o) + 0x28 (size before relaxing) + .eh_frame 0x0000000000079a68 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-kf_tan.o) + 0x38 (size before relaxing) + .eh_frame 0x0000000000079a88 0xa0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-math_errf.o) + 0xb0 (size before relaxing) + .eh_frame 0x0000000000079b28 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_atan.o) + 0x60 (size before relaxing) + .eh_frame 0x0000000000079b70 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_fabs.o) + 0x28 (size before relaxing) + .eh_frame 0x0000000000079b88 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_floor.o) + 0x28 (size before relaxing) + .eh_frame 0x0000000000079ba0 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_scalbn.o) + 0x58 (size before relaxing) + .eh_frame 0x0000000000079be8 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_matherr.o) + 0x28 (size before relaxing) + .eh_frame 0x0000000000079c00 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_nan.o) + 0x28 (size before relaxing) + .eh_frame 0x0000000000079c18 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-sf_copysign.o) + 0x28 (size before relaxing) + .eh_frame 0x0000000000079c30 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abort.o) + 0x30 (size before relaxing) + .eh_frame 0x0000000000079c48 0x68 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-bsearch.o) + 0x78 (size before relaxing) + .eh_frame 0x0000000000079cb0 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-clock.o) + 0x38 (size before relaxing) + .eh_frame 0x0000000000079cd0 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-difftime.o) + 0x28 (size before relaxing) + .eh_frame 0x0000000000079ce8 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-errno.o) + 0x38 (size before relaxing) + .eh_frame 0x0000000000079d08 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-exit.o) + 0x30 (size before relaxing) + .eh_frame 0x0000000000079d28 0x78 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fclose.o) + 0x90 (size before relaxing) + .eh_frame 0x0000000000079da0 0xa0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fflush.o) + 0xb8 (size before relaxing) + .eh_frame 0x0000000000079e40 0x80 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fgets.o) + 0x90 (size before relaxing) + .eh_frame 0x0000000000079ec0 0x198 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + 0x1a8 (size before relaxing) + .eh_frame 0x000000000007a058 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fini.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000007a080 0x60 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fopen.o) + 0x78 (size before relaxing) + .eh_frame 0x000000000007a0e0 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fprintf.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007a128 0x70 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputc.o) + 0x80 (size before relaxing) + .eh_frame 0x000000000007a198 0x58 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fputs.o) + 0x70 (size before relaxing) + .eh_frame 0x000000000007a1f0 0xf8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fread.o) + 0x108 (size before relaxing) + .eh_frame 0x000000000007a2e8 0x80 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freer.o) + 0x98 (size before relaxing) + .eh_frame 0x000000000007a368 0x78 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-freopen.o) + 0x90 (size before relaxing) + .eh_frame 0x000000000007a3e0 0x38 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseek.o) + 0x50 (size before relaxing) + .eh_frame 0x000000000007a418 0x98 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fseeko.o) + 0xb0 (size before relaxing) + .eh_frame 0x000000000007a4b0 0x38 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftell.o) + 0x48 (size before relaxing) + .eh_frame 0x000000000007a4e8 0x58 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ftello.o) + 0x68 (size before relaxing) + .eh_frame 0x000000000007a540 0xa0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fvwrite.o) + 0xb8 (size before relaxing) + .eh_frame 0x000000000007a5e0 0x98 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwalk.o) + 0xa8 (size before relaxing) + .eh_frame 0x000000000007a678 0x58 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fwrite.o) + 0x70 (size before relaxing) + .eh_frame 0x000000000007a6d0 0x68 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getc.o) + 0x80 (size before relaxing) + .eh_frame 0x000000000007a738 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007a780 0x68 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-getenv_r.o) + 0x78 (size before relaxing) + .eh_frame 0x000000000007a7e8 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000007a810 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gmtime_r.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007a828 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-init.o) + 0x40 (size before relaxing) + .eh_frame 0x000000000007a850 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000007a878 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-lcltime_r.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007a8b8 0x58 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-localeconv.o) + 0x68 (size before relaxing) + .eh_frame 0x000000000007a910 0x220 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x238 (size before relaxing) + .eh_frame 0x000000000007ab30 0x80 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-makebuf.o) + 0x98 (size before relaxing) + .eh_frame 0x000000000007abb0 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malign.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000007abd8 0x50 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malignr.o) + 0x68 (size before relaxing) + .eh_frame 0x000000000007ac28 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-malloc.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007ac68 0xc0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + 0xd0 (size before relaxing) + .eh_frame 0x000000000007ad28 0xf8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbtowc_r.o) + 0x110 (size before relaxing) + .eh_frame 0x000000000007ae20 0x80 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mktime.o) + 0x98 (size before relaxing) + .eh_frame 0x000000000007aea0 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mlock.o) + 0x40 (size before relaxing) + .eh_frame 0x000000000007aec8 0x68 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-putc.o) + 0x80 (size before relaxing) + .eh_frame 0x000000000007af30 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-realloc.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000007af58 0xf0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-reallocr.o) + 0x108 (size before relaxing) + .eh_frame 0x000000000007b048 0x70 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-refill.o) + 0x88 (size before relaxing) + .eh_frame 0x000000000007b0b8 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-remove.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007b0f8 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rename.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000007b120 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-rget.o) + 0x60 (size before relaxing) + .eh_frame 0x000000000007b168 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007b1b0 0xb0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv_r.o) + 0xc8 (size before relaxing) + .eh_frame 0x000000000007b260 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setvbuf.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007b2a0 0x178 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-signal.o) + 0x190 (size before relaxing) + .eh_frame 0x000000000007b418 0x68 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-snprintf.o) + 0x80 (size before relaxing) + .eh_frame 0x000000000007b480 0xb0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-stdio.o) + 0xc8 (size before relaxing) + .eh_frame 0x000000000007b530 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcasecmp.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007b570 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcat.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000007b598 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strcoll.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007b5b0 0x60 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strerror.o) + 0x78 (size before relaxing) + .eh_frame 0x000000000007b610 0x98 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strftime.o) + 0xb0 (size before relaxing) + .eh_frame 0x000000000007b6a8 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strlcpy.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007b6c0 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncasecmp.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007b708 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncat.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007b720 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strncpy.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007b738 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strpbrk.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007b750 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strspn.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007b768 0x168 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strstr.o) + 0x180 (size before relaxing) + .eh_frame 0x000000000007b8d0 0x2d0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtod.o) + 0x2e0 (size before relaxing) + .eh_frame 0x000000000007bba0 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtol.o) + 0xc0 (size before relaxing) + .eh_frame 0x000000000007bc48 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoul.o) + 0xc0 (size before relaxing) + .eh_frame 0x000000000007bcf0 0xb8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfprintf.o) + 0xc8 (size before relaxing) + .eh_frame 0x000000000007bda8 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-system.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007bde8 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-timelocal.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007be00 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-time.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000007be28 0x68 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpfile.o) + 0x80 (size before relaxing) + .eh_frame 0x000000000007be90 0xf8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tmpnam.o) + 0x110 (size before relaxing) + .eh_frame 0x000000000007bf88 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzcalc_limits.o) + 0x48 (size before relaxing) + .eh_frame 0x000000000007bfb8 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzlock.o) + 0x40 (size before relaxing) + .eh_frame 0x000000000007bfe0 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007c020 0xd8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) + 0xf0 (size before relaxing) + .eh_frame 0x000000000007c0f8 0xc0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ungetc.o) + 0xd8 (size before relaxing) + .eh_frame 0x000000000007c1b8 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-u_strerr.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007c1d0 0x108 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfprintf.o) + 0x120 (size before relaxing) + .eh_frame 0x000000000007c2d8 0x58 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wbuf.o) + 0x68 (size before relaxing) + .eh_frame 0x000000000007c330 0x70 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcrtomb.o) + 0x80 (size before relaxing) + .eh_frame 0x000000000007c3a0 0x38 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsrtombs.o) + 0x50 (size before relaxing) + .eh_frame 0x000000000007c3d8 0x88 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wctomb_r.o) + 0xa0 (size before relaxing) + .eh_frame 0x000000000007c460 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wsetup.o) + 0x40 (size before relaxing) + .eh_frame 0x000000000007c488 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-abs.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007c4a0 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-__call_atexit.o) + 0x60 (size before relaxing) + .eh_frame 0x000000000007c4e8 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-ctype_.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007c500 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-div.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007c518 0x98 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-dtoa.o) + 0xb0 (size before relaxing) + .eh_frame 0x000000000007c5b0 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-envlock.o) + 0x40 (size before relaxing) + .eh_frame 0x000000000007c5d8 0x68 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-fdopen.o) + 0x80 (size before relaxing) + .eh_frame 0x000000000007c640 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-flags.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007c658 0x60 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-gethex.o) + 0x78 (size before relaxing) + .eh_frame 0x000000000007c6b8 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gdtoa-hexnan.o) + 0x40 (size before relaxing) + .eh_frame 0x000000000007c6e0 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gettzinfo.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007c6f8 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-labs.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007c710 0x2f8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mprec.o) + 0x310 (size before relaxing) + .eh_frame 0x000000000007ca08 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sf_nan.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007ca20 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-s_frexp.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007ca38 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-siscanf.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007ca80 0x68 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sniprintf.o) + 0x80 (size before relaxing) + .eh_frame 0x000000000007cae8 0x40 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sprintf.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007cb28 0xe0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiprintf.o) + 0xf8 (size before relaxing) + .eh_frame 0x000000000007cc08 0xe8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-svfiscanf.o) + 0x100 (size before relaxing) + .eh_frame 0x000000000007ccf0 0x118 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-vfiprintf.o) + 0x130 (size before relaxing) + .eh_frame 0x000000000007ce08 0x128 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-wcsnrtombs.o) + 0x138 (size before relaxing) + .eh_frame 0x000000000007cf30 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-callocr.o) + 0x40 (size before relaxing) + .eh_frame 0x000000000007cf60 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-iswspace.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000007cf80 0x58 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-jp2uc.o) + 0x70 (size before relaxing) + .eh_frame 0x000000000007cfd8 0x70 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mbrtowc.o) + 0x88 (size before relaxing) + .eh_frame 0x000000000007d048 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-sccl.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007d060 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoll.o) + 0xc0 (size before relaxing) + .eh_frame 0x000000000007d108 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-strtoull.o) + 0xc0 (size before relaxing) + .eh_frame 0x000000000007d1b0 0x110 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + 0x128 (size before relaxing) + .eh_frame 0x000000000007d2c0 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(close.o) + 0x58 (size before relaxing) + .eh_frame 0x000000000007d308 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(fstat.o) + 0x48 (size before relaxing) + .eh_frame 0x000000000007d338 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getpid.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007d350 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(gettod.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007d368 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(isatty.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007d380 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(kill.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007d398 0x38 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(lseek.o) + 0x48 (size before relaxing) + .eh_frame 0x000000000007d3d0 0x38 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(open.o) + 0x50 (size before relaxing) + .eh_frame 0x000000000007d408 0x38 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(read.o) + 0x50 (size before relaxing) + .eh_frame 0x000000000007d440 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(sbrk.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007d458 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(times.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007d470 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(unlink.o) + 0x48 (size before relaxing) + .eh_frame 0x000000000007d4a0 0x38 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(write.o) + 0x50 (size before relaxing) + .eh_frame 0x000000000007d4d8 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(_exit.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000007d4f8 0x110 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + 0x128 (size before relaxing) + .eh_frame 0x000000000007d608 0x38 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(rename.o) + 0x48 (size before relaxing) + .eh_frame 0x000000000007d640 0xc8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + 0xe0 (size before relaxing) + .eh_frame 0x000000000007d708 0xf8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + 0x108 (size before relaxing) + .eh_frame 0x000000000007d800 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(getreent.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007d818 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(trunctfdf2.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000007d838 0x14 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a(sfp-exceptions.o) + 0x28 (size before relaxing) + .eh_frame 0x000000000007d84c 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtend.o + *(.eh_frame.*) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + +.gnu_extab + *(.gnu_extab*) + +.dynamic 0x000000000007d850 0x1a0 + *(.dynamic) + .dynamic 0x000000000007d850 0x1a0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + 0x000000000007d850 _DYNAMIC + +.dynsym 0x000000000007d9f0 0x5a78 + *(.dynsym) + .dynsym 0x000000000007d9f0 0x5a78 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + +.dynstr 0x0000000000083468 0x39b9 + *(.dynstr) + .dynstr 0x0000000000083468 0x39b9 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + +.rela.dyn 0x0000000000086e28 0x73f8 + *(.rela.*) + .rela.got 0x0000000000086e28 0x1cc8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.plt 0x000000000008e178 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.bss 0x0000000000088b98 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.ro + 0x0000000000088af0 0x1e0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.init_array + 0x0000000000088cd0 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.fini_array + 0x0000000000088ce8 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.ifunc 0x0000000000088da8 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.ro.local + 0x0000000000088d00 0x2eb0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.ro.local.fsdev_devoptab + 0x000000000008bbb0 0x210 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.local._impure_ptr + 0x000000000008bdc0 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.local.impure_data + 0x000000000008bdd8 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.ro.local._global_impure_ptr + 0x000000000008be20 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.__global_locale + 0x000000000008be38 0x138 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.ro.__C_locale + 0x000000000008bf70 0x138 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.ro.local.categories + 0x000000000008c0a8 0xa8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.__malloc_av_ + 0x000000000008c150 0x1800 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.ro.local._C_time_locale + 0x000000000008d950 0x5e8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.local._tzname + 0x000000000008df38 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.local.environ + 0x000000000008df68 0x18 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.devoptab_list + 0x000000000008df80 0x180 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.ro.local.dotab_stdnull + 0x000000000008e100 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .rela.data.rel.local.handles + 0x000000000008e130 0x48 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + +.interp 0x000000000008e220 0xd + *(.interp) + .interp 0x000000000008e220 0xd /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + +.hash 0x000000000008e230 0x1740 + *(.hash) + .hash 0x000000000008e230 0x1740 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + +.gnu.hash + *(.gnu.hash) + +.gnu.version 0x000000000008f970 0x0 + *(.gnu.version) + .gnu.version 0x000000000008f970 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + +.gnu.version_d 0x000000000008f970 0x0 + *(.gnu.version_d) + .gnu.version_d + 0x000000000008f970 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + +.gnu.version_r 0x000000000008f970 0x0 + *(.gnu.version_r) + .gnu.version_r + 0x000000000008f970 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + +.note.gnu.build-id + 0x000000000008f970 0x24 + *(.note.gnu.build-id) + .note.gnu.build-id + 0x000000000008f970 0x24 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + 0x0000000000090000 . = ALIGN (0x1000) + +.eh_frame + *(.eh_frame) + *(.eh_frame.*) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + +.gnu_extab + *(.gnu_extab*) + +.exception_ranges + *(.exception_ranges .exception_ranges*) + +.tdata 0x0000000000090000 0x0 + 0x0000000000090000 __tdata_lma = . + *(.tdata .tdata.* .gnu.linkonce.td.*) + 0x0000000000090000 . = ALIGN (0x8) + 0x0000000000090000 __tdata_lma_end = . + +.tbss 0x0000000000090000 0x4408 + *(.tbss .tbss.* .gnu.linkonce.tb.*) + .tbss.__fixedpath + 0x0000000000090000 0x401 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x0000000000090401 0x7 + .tbss.tmp_buffer.7030 + 0x0000000000090408 0x2000 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .tbss.tmp_buffer.7054 + 0x0000000000092408 0x2000 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *(.tcommon) + 0x0000000000094408 . = ALIGN (0x8) + +.preinit_array 0x0000000000090000 0x0 + 0x0000000000090000 PROVIDE (__preinit_array_start = .) + *(.preinit_array) + 0x0000000000090000 PROVIDE (__preinit_array_end = .) + +.init_array 0x0000000000090000 0x8 + 0x0000000000090000 PROVIDE (__init_array_start = .) + *(SORT_BY_NAME(.init_array.*)) + *(.init_array) + .init_array 0x0000000000090000 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + 0x0000000000090008 PROVIDE (__init_array_end = .) + +.fini_array 0x0000000000090008 0x8 + 0x0000000000090008 PROVIDE (__fini_array_start = .) + *(.fini_array) + .fini_array 0x0000000000090008 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + *(SORT_BY_NAME(.fini_array.*)) + 0x0000000000090010 PROVIDE (__fini_array_end = .) + +.ctors + *crtbegin.o(.ctors) + *(EXCLUDE_FILE(*crtend.o) .ctors) + *(SORT_BY_NAME(.ctors.*)) + *(.ctors) + +.dtors + *crtbegin.o(.dtors) + *(EXCLUDE_FILE(*crtend.o) .dtors) + *(SORT_BY_NAME(.dtors.*)) + *(.dtors) + 0x0000000000090010 __got_start__ = . + +.got 0x0000000000090010 0x9a0 + *(.got) + .got 0x0000000000090010 0x9a0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + 0x0000000000090010 _GLOBAL_OFFSET_TABLE_ + *(.igot) + +.got.plt 0x00000000000909b0 0x50 + *(.got.plt) + .got.plt 0x00000000000909b0 0x50 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + *(.igot.plt) + 0x0000000000090a00 __got_end__ = . + +.data 0x0000000000090a00 0x5218 + *(.data .data.* .gnu.linkonce.d.*) + .data.rel.ro 0x0000000000090a00 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + .data 0x0000000000090a00 0x4 main.o + 0x0000000000090a00 __nx_applet_type + *fill* 0x0000000000090a04 0x4 + .data.rel.ro.local + 0x0000000000090a08 0x1b0 liolib.o + .data.rel.ro.local + 0x0000000000090bb8 0x30 lauxlib.o + .data.rel.ro.local + 0x0000000000090be8 0xc8 loadlib.o + .data.rel.ro.local + 0x0000000000090cb0 0x1f0 lmathlib.o + .data.rel.ro.local + 0x0000000000090ea0 0x1c0 lstrlib.o + .data.rel.ro.local + 0x0000000000091060 0xf8 loslib.o + .data.rel.ro.local + 0x0000000000091158 0x1f8 lbaselib.o + .data.rel.ro.local + 0x0000000000091350 0x70 lutf8lib.o + .data.rel.ro.local + 0x00000000000913c0 0x128 llex.o + .data.rel.ro.local + 0x00000000000914e8 0x138 ldblib.o + .data.rel.ro.local + 0x0000000000091620 0x80 ltablib.o + .data.rel.ro 0x00000000000916a0 0xb0 linit.o + .data.rel.ro.local + 0x0000000000091750 0x128 ltm.o + 0x0000000000091818 luaT_typenames_ + .data.rel.ro.local + 0x0000000000091878 0x2b0 lvm.o + .data.rel.ro.local + 0x0000000000091b28 0xb0 lcorolib.o + .data.__nx_exception_stack_size + 0x0000000000091bd8 0x8 /opt/devkitpro//libnx/lib/libnx.a(init.o) + 0x0000000000091bd8 __nx_exception_stack_size + .data.__cwd 0x0000000000091be0 0x401 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x0000000000091fe1 0x3 + .data.fsdev_fsdevice_cwd + 0x0000000000091fe4 0x4 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .data.fsdev_fsdevice_default + 0x0000000000091fe8 0x4 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x0000000000091fec 0x4 + .data.rel.ro.local.fsdev_devoptab + 0x0000000000091ff0 0xe0 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .data.__nx_applet_auto_notifyrunning + 0x00000000000920d0 0x1 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000920d0 __nx_applet_auto_notifyrunning + *fill* 0x00000000000920d1 0x3 + .data.__fdlib_version + 0x00000000000920d4 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a(lib_a-s_lib_ver.o) + 0x00000000000920d4 __fdlib_version + .data.rel.local._impure_ptr + 0x00000000000920d8 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-impure.o) + 0x00000000000920d8 _impure_ptr + .data.rel.local.impure_data + 0x00000000000920e0 0x768 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-impure.o) + .data.rel.ro.local._global_impure_ptr + 0x0000000000092848 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-impure.o) + 0x0000000000092848 _global_impure_ptr + .data.__default_locale + 0x0000000000092850 0x20 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x0000000000092850 __default_locale + .data.rel.__global_locale + 0x0000000000092870 0x1a8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x0000000000092870 __global_locale + .data.rel.ro.__C_locale + 0x0000000000092a18 0x1a8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x0000000000092a18 __C_locale + .data.rel.ro.local.categories + 0x0000000000092bc0 0x38 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + .data.__malloc_sbrk_base + 0x0000000000092bf8 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + 0x0000000000092bf8 __malloc_sbrk_base + .data.__malloc_trim_threshold + 0x0000000000092c00 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + 0x0000000000092c00 __malloc_trim_threshold + .data.rel.__malloc_av_ + 0x0000000000092c08 0x810 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + 0x0000000000092c08 __malloc_av_ + .data.rel.ro.local._C_time_locale + 0x0000000000093418 0x1f8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-timelocal.o) + 0x0000000000093418 _C_time_locale + .data.rel.local._tzname + 0x0000000000093610 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzvars.o) + 0x0000000000093610 _tzname + .data.rel.local.environ + 0x0000000000093620 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-environ.o) + 0x0000000000093620 environ + .data.tzinfo 0x0000000000093628 0x58 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-gettzinfo.o) + .data.defaultDevice + 0x0000000000093680 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + *fill* 0x0000000000093684 0x4 + .data.rel.devoptab_list + 0x0000000000093688 0x80 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + 0x0000000000093688 devoptab_list + .data.rel.ro.local.dotab_stdnull + 0x0000000000093708 0xe0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(iosupport.o) + 0x0000000000093708 dotab_stdnull + .data._current_working_directory + 0x00000000000937e8 0x400 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + .data.__stderr_handle + 0x0000000000093be8 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + .data.__stdin_handle + 0x0000000000093bf8 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + .data.__stdout_handle + 0x0000000000093c08 0x10 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + .data.rel.local.handles + 0x0000000000093c18 0x2000 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + 0x0000000000095c18 __bss_start__ = . + +.tm_clone_table + 0x0000000000095c18 0x0 + .tm_clone_table + 0x0000000000095c18 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + .tm_clone_table + 0x0000000000095c18 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtend.o + +.bss 0x0000000000095c18 0x14c70 + *(.dynbss) + .dynbss 0x0000000000095c18 0x0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o + *(.bss .bss.* .gnu.linkonce.b.*) + .bss.completed.7821 + 0x0000000000095c18 0x1 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + *fill* 0x0000000000095c19 0x7 + .bss.object.7826 + 0x0000000000095c20 0x30 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o + .bss 0x0000000000095c50 0x8000 main.o + .bss.__nx_exception_ignoredebug + 0x000000000009dc50 0x4 /opt/devkitpro//libnx/lib/libnx.a(init.o) + 0x000000000009dc50 __nx_exception_ignoredebug + *fill* 0x000000000009dc54 0xc + .bss.__nx_exception_stack + 0x000000000009dc60 0x400 /opt/devkitpro//libnx/lib/libnx.a(init.o) + 0x000000000009dc60 __nx_exception_stack + .bss.__nx_heap_size + 0x000000000009e060 0x8 /opt/devkitpro//libnx/lib/libnx.a(init.o) + 0x000000000009e060 __nx_heap_size + .bss.__bootticks + 0x000000000009e068 0x8 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + .bss.__boottime + 0x000000000009e070 0x8 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + .bss.__nx_time_type + 0x000000000009e078 0x4 /opt/devkitpro//libnx/lib/libnx.a(newlib.o) + 0x000000000009e078 __nx_time_type + *fill* 0x000000000009e07c 0x4 + .bss.g_argv_empty + 0x000000000009e080 0x8 /opt/devkitpro//libnx/lib/libnx.a(argv.o) + .bss.fsdev_fsdevices + 0x000000000009e088 0x2300 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + .bss.fsdev_initialised + 0x00000000000a0388 0x1 /opt/devkitpro//libnx/lib/libnx.a(fs_dev.o) + *fill* 0x00000000000a0389 0x7 + .bss.g_AddressSpace + 0x00000000000a0390 0x10 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .bss.g_CurrentAddr + 0x00000000000a03a0 0x8 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .bss.g_CurrentMapAddr + 0x00000000000a03a8 0x8 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .bss.g_Region 0x00000000000a03b0 0x30 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + .bss.g_VirtMemMutex + 0x00000000000a03e0 0x4 /opt/devkitpro//libnx/lib/libnx.a(virtmem.o) + *fill* 0x00000000000a03e4 0x4 + .bss.__nx_applet_AppletAttribute + 0x00000000000a03e8 0x80 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000a03e8 __nx_applet_AppletAttribute + .bss.__nx_applet_PerformanceConfiguration + 0x00000000000a0468 0x8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000a0468 __nx_applet_PerformanceConfiguration + .bss.__nx_applet_exit_mode + 0x00000000000a0470 0x4 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + 0x00000000000a0470 __nx_applet_exit_mode + .bss.g_appletExitProcessFlag + 0x00000000000a0474 0x1 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a0475 0x3 + .bss.g_appletFirstHook + 0x00000000000a0478 0x18 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .bss.g_appletFocusState + 0x00000000000a0490 0x1 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a0491 0x7 + .bss.g_appletIApplicationCreator + 0x00000000000a0498 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a04a4 0x4 + .bss.g_appletIAudioController + 0x00000000000a04a8 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a04b4 0x4 + .bss.g_appletICommonStateGetter + 0x00000000000a04b8 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a04c4 0x4 + .bss.g_appletIDebugFunctions + 0x00000000000a04c8 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a04d4 0x4 + .bss.g_appletIDisplayController + 0x00000000000a04d8 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a04e4 0x4 + .bss.g_appletIFunctions + 0x00000000000a04e8 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a04f4 0x4 + .bss.g_appletIGlobalStateController + 0x00000000000a04f8 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a0504 0x4 + .bss.g_appletILibraryAppletCreator + 0x00000000000a0508 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a0514 0x4 + .bss.g_appletILibraryAppletSelfAccessor + 0x00000000000a0518 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a0524 0x4 + .bss.g_appletIProcessWindingController + 0x00000000000a0528 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a0534 0x4 + .bss.g_appletISelfController + 0x00000000000a0538 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a0544 0x4 + .bss.g_appletIWindowController + 0x00000000000a0548 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a0554 0x4 + .bss.g_appletLibraryAppletLaunchableEvent + 0x00000000000a0558 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a0564 0x4 + .bss.g_appletMessageEvent + 0x00000000000a0568 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .bss.g_appletNotifiedRunning + 0x00000000000a0574 0x1 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .bss.g_appletOperationMode + 0x00000000000a0575 0x1 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a0576 0x2 + .bss.g_appletPerformanceMode + 0x00000000000a0578 0x4 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + *fill* 0x00000000000a057c 0x4 + .bss.g_appletProxySession + 0x00000000000a0580 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .bss.g_appletRecordingInitialized + 0x00000000000a058c 0x4 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .bss.g_appletRecordingTmem + 0x00000000000a0590 0x28 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .bss.g_appletResourceUserId + 0x00000000000a05b8 0x8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .bss.g_appletSrv + 0x00000000000a05c0 0xc /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .bss.g_appletThemeColorType + 0x00000000000a05cc 0x4 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .bss.g_refCnt 0x00000000000a05d0 0x8 /opt/devkitpro//libnx/lib/libnx.a(applet.o) + .bss.g_refCnt 0x00000000000a05d8 0x8 /opt/devkitpro//libnx/lib/libnx.a(time.o) + .bss.g_timeLocalSystemClock + 0x00000000000a05e0 0xc /opt/devkitpro//libnx/lib/libnx.a(time.o) + *fill* 0x00000000000a05ec 0x4 + .bss.g_timeNetworkSystemClock + 0x00000000000a05f0 0xc /opt/devkitpro//libnx/lib/libnx.a(time.o) + *fill* 0x00000000000a05fc 0x4 + .bss.g_timeSrv + 0x00000000000a0600 0xc /opt/devkitpro//libnx/lib/libnx.a(time.o) + *fill* 0x00000000000a060c 0x4 + .bss.g_timeTimeZoneService + 0x00000000000a0610 0xc /opt/devkitpro//libnx/lib/libnx.a(time.o) + *fill* 0x00000000000a061c 0x4 + .bss.g_timeUserSystemClock + 0x00000000000a0620 0xc /opt/devkitpro//libnx/lib/libnx.a(time.o) + *fill* 0x00000000000a062c 0x4 + .bss.g_controllerDown + 0x00000000000a0630 0x50 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_controllerEntries + 0x00000000000a0680 0x1e0 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_controllerHeaders + 0x00000000000a0860 0x190 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_controllerHeld + 0x00000000000a09f0 0x50 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_controllerLayout + 0x00000000000a0a40 0x28 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_controllerOld + 0x00000000000a0a68 0x50 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_controllerP1AutoID + 0x00000000000a0ab8 0x4 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x00000000000a0abc 0x4 + .bss.g_controllerTimestamps + 0x00000000000a0ac0 0x50 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_controllerUp + 0x00000000000a0b10 0x50 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_hidIAppletResource + 0x00000000000a0b60 0xc /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x00000000000a0b6c 0x4 + .bss.g_hidLock + 0x00000000000a0b70 0x20 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_hidSharedmem + 0x00000000000a0b90 0x20 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_hidSrv 0x00000000000a0bb0 0xc /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x00000000000a0bbc 0x4 + .bss.g_keyboardDown + 0x00000000000a0bc0 0x20 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_keyboardEntry + 0x00000000000a0be0 0x38 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_keyboardHeld + 0x00000000000a0c18 0x20 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_keyboardModDown + 0x00000000000a0c38 0x8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_keyboardModHeld + 0x00000000000a0c40 0x8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_keyboardModOld + 0x00000000000a0c48 0x8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_keyboardModUp + 0x00000000000a0c50 0x8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_keyboardOld + 0x00000000000a0c58 0x20 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_keyboardTimestamp + 0x00000000000a0c78 0x8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_keyboardUp + 0x00000000000a0c80 0x20 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_mouseDown + 0x00000000000a0ca0 0x8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_mouseEntry + 0x00000000000a0ca8 0x30 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_mouseHeld + 0x00000000000a0cd8 0x8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_mouseOld + 0x00000000000a0ce0 0x8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_mouseTimestamp + 0x00000000000a0ce8 0x8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_mouseUp + 0x00000000000a0cf0 0x8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_refCnt 0x00000000000a0cf8 0x8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_sixaxisEnabled + 0x00000000000a0d00 0xa /opt/devkitpro//libnx/lib/libnx.a(hid.o) + *fill* 0x00000000000a0d0a 0x6 + .bss.g_sixaxisLayouts + 0x00000000000a0d10 0x4650 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_touchEntry + 0x00000000000a5360 0x298 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_touchTimestamp + 0x00000000000a55f8 0x8 /opt/devkitpro//libnx/lib/libnx.a(hid.o) + .bss.g_fsSrv 0x00000000000a5600 0xc /opt/devkitpro//libnx/lib/libnx.a(fs.o) + *fill* 0x00000000000a560c 0x4 + .bss.g_refCnt 0x00000000000a5610 0x8 /opt/devkitpro//libnx/lib/libnx.a(fs.o) + .bss.g_apmISession + 0x00000000000a5618 0xc /opt/devkitpro//libnx/lib/libnx.a(apm.o) + *fill* 0x00000000000a5624 0x4 + .bss.g_apmSrv 0x00000000000a5628 0xc /opt/devkitpro//libnx/lib/libnx.a(apm.o) + *fill* 0x00000000000a5634 0x4 + .bss.g_refCnt 0x00000000000a5638 0x8 /opt/devkitpro//libnx/lib/libnx.a(apm.o) + .bss.g_refCnt 0x00000000000a5640 0x8 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .bss.g_smHandle + 0x00000000000a5648 0x4 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + *fill* 0x00000000000a564c 0x4 + .bss.g_smOverrides + 0x00000000000a5650 0x200 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .bss.g_smOverridesNum + 0x00000000000a5850 0x8 /opt/devkitpro//libnx/lib/libnx.a(sm.o) + .bss.g_hasRandomSeed + 0x00000000000a5858 0x1 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .bss.g_isNso 0x00000000000a5859 0x1 /opt/devkitpro//libnx/lib/libnx.a(env.o) + *fill* 0x00000000000a585a 0x2 + .bss.g_lastLoadResult + 0x00000000000a585c 0x4 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .bss.g_loaderRetAddr + 0x00000000000a5860 0x8 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .bss.g_mainThreadHandle + 0x00000000000a5868 0x4 /opt/devkitpro//libnx/lib/libnx.a(env.o) + *fill* 0x00000000000a586c 0x4 + .bss.g_nextLoadArgv + 0x00000000000a5870 0x8 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .bss.g_nextLoadPath + 0x00000000000a5878 0x8 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .bss.g_overrideArgv + 0x00000000000a5880 0x8 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .bss.g_overrideHeapAddr + 0x00000000000a5888 0x8 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .bss.g_overrideHeapSize + 0x00000000000a5890 0x8 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .bss.g_processHandle + 0x00000000000a5898 0x4 /opt/devkitpro//libnx/lib/libnx.a(env.o) + *fill* 0x00000000000a589c 0x4 + .bss.g_randomSeed + 0x00000000000a58a0 0x10 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .bss.g_syscallHints + 0x00000000000a58b0 0x10 /opt/devkitpro//libnx/lib/libnx.a(env.o) + .bss.g_HasCached + 0x00000000000a58c0 0x1 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .bss.g_IsAbove200 + 0x00000000000a58c1 0x1 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .bss.g_IsAbove300 + 0x00000000000a58c2 0x1 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .bss.g_IsAbove400 + 0x00000000000a58c3 0x1 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .bss.g_IsAbove500 + 0x00000000000a58c4 0x1 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + .bss.g_IsAbove600 + 0x00000000000a58c5 0x1 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + *fill* 0x00000000000a58c6 0x2 + .bss.g_Mutex 0x00000000000a58c8 0x4 /opt/devkitpro//libnx/lib/libnx.a(detect.o) + *fill* 0x00000000000a58cc 0x4 + .bss.__sfp_recursive_mutex + 0x00000000000a58d0 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + *fill* 0x00000000000a58dc 0x4 + .bss.__sinit_recursive_mutex + 0x00000000000a58e0 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-findfp.o) + *fill* 0x00000000000a58ec 0x4 + .bss._PathLocale + 0x00000000000a58f0 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + 0x00000000000a58f0 _PathLocale + .bss.global_locale_string + 0x00000000000a58f8 0xe7 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + *fill* 0x00000000000a59df 0x1 + .bss.new_categories.4556 + 0x00000000000a59e0 0xe0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + .bss.saved_categories.4557 + 0x00000000000a5ac0 0xe0 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-locale.o) + .bss.__malloc_current_mallinfo + 0x00000000000a5ba0 0x28 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + 0x00000000000a5ba0 __malloc_current_mallinfo + .bss.__malloc_max_sbrked_mem + 0x00000000000a5bc8 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + 0x00000000000a5bc8 __malloc_max_sbrked_mem + .bss.__malloc_max_total_mem + 0x00000000000a5bd0 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + 0x00000000000a5bd0 __malloc_max_total_mem + .bss.__malloc_top_pad + 0x00000000000a5bd8 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mallocr.o) + 0x00000000000a5bd8 __malloc_top_pad + .bss.__malloc_recursive_mutex + 0x00000000000a5be0 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-mlock.o) + .bss.alloced.4037 + 0x00000000000a5bec 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-setenv_r.o) + .bss.__tz_mutex + 0x00000000000a5bf0 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzlock.o) + *fill* 0x00000000000a5bf4 0x4 + .bss.__tzname_dst + 0x00000000000a5bf8 0xb /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) + *fill* 0x00000000000a5c03 0x5 + .bss.__tzname_std + 0x00000000000a5c08 0xb /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) + *fill* 0x00000000000a5c13 0x5 + .bss.prev_tzenv + 0x00000000000a5c18 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzset_r.o) + .bss._daylight + 0x00000000000a5c20 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzvars.o) + 0x00000000000a5c20 _daylight + *fill* 0x00000000000a5c24 0x4 + .bss._timezone + 0x00000000000a5c28 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-tzvars.o) + 0x00000000000a5c28 _timezone + .bss.__atexit_recursive_mutex + 0x00000000000a5c30 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-__call_atexit.o) + 0x00000000000a5c30 __atexit_recursive_mutex + *fill* 0x00000000000a5c3c 0x4 + .bss.initial_env + 0x00000000000a5c40 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-environ.o) + .bss.__env_recursive_mutex + 0x00000000000a5c48 0xc /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a(lib_a-envlock.o) + *fill* 0x00000000000a5c54 0x4 + .bss.heap_start.5228 + 0x00000000000a5c58 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(sbrk.o) + .bss.fake_heap_end + 0x00000000000a5c60 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(malloc_vars.o) + 0x00000000000a5c60 fake_heap_end + .bss.fake_heap_start + 0x00000000000a5c68 0x8 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(malloc_vars.o) + 0x00000000000a5c68 fake_heap_start + .bss.temp_cwd 0x00000000000a5c70 0x400 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(chdir.o) + .bss.__syscalls + 0x00000000000a6070 0x90 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(syscall_support.o) + 0x00000000000a6070 __syscalls + .bss.__hndl_lock + 0x00000000000a6100 0x4 /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a(handle_manager.o) + *(COMMON) + *fill* 0x00000000000a6104 0x4 + COMMON 0x00000000000a6108 0x18 main.o + 0x00000000000a6108 orig_ctx + 0x00000000000a6110 orig_main_thread + 0x00000000000a6118 orig_saved_lr + COMMON 0x00000000000a6120 0x348 /opt/devkitpro//libnx/lib/libnx.a(init.o) + 0x00000000000a6120 __nx_exceptiondump + 0x00000000000a6460 __stack_top + COMMON 0x00000000000a6468 0x14 /opt/devkitpro//libnx/lib/libnx.a(argv.o) + 0x00000000000a6468 __system_argv + 0x00000000000a6470 __system_argc + 0x00000000000a6478 __nxlink_host + 0x00000000000a6480 . = ALIGN (0x8) + *fill* 0x00000000000a647c 0x4 + 0x00000000000a6480 __tls_start = . + 0x00000000000aa888 . = (. + (SIZEOF (.tdata) + SIZEOF (.tbss))) + *fill* 0x00000000000a6480 0x4408 + 0x00000000000aa888 __tls_end = . + 0x00000000000aa888 __bss_end__ = . + 0x00000000000aa888 __end__ = ABSOLUTE (.) + 0x00000000000ab000 . = ALIGN (0x1000) + 0x00000000000ab000 __argdata__ = ABSOLUTE (.) + +/DISCARD/ + *(.group .comment .note) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges + *(.debug_aranges) + +.debug_pubnames + *(.debug_pubnames) + +.debug_info + *(.debug_info) + +.debug_abbrev + *(.debug_abbrev) + +.debug_line + *(.debug_line) + +.debug_frame + *(.debug_frame) + +.debug_str + *(.debug_str) + +.debug_loc + *(.debug_loc) + +.debug_macinfo + *(.debug_macinfo) +LOAD /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crti.o +LOAD /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtbegin.o +LOAD main.o +LOAD liolib.o +LOAD lmem.o +LOAD lauxlib.o +LOAD ldebug.o +LOAD ldo.o +LOAD loadlib.o +LOAD lmathlib.o +LOAD lctype.o +LOAD lstate.o +LOAD lopcodes.o +LOAD lstrlib.o +LOAD loslib.o +LOAD lbaselib.o +LOAD lutf8lib.o +LOAD lparser.o +LOAD llex.o +LOAD ldblib.o +LOAD lzio.o +LOAD ltablib.o +LOAD ltable.o +LOAD linit.o +LOAD ltm.o +LOAD lgc.o +LOAD lua.o +LOAD lstring.o +LOAD lvm.o +LOAD lcode.o +LOAD lundump.o +LOAD lcorolib.o +LOAD lapi.o +LOAD lfunc.o +LOAD lobject.o +LOAD ltests.o +LOAD ldump.o +LOAD /opt/devkitpro//libnx/lib/libnx.a +LOAD /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libm.a +START GROUP +LOAD /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/libgcc.a +LOAD /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libg.a +LOAD /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libc.a +LOAD /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/../../../../aarch64-none-elf/lib/pic/libsysbase.a +END GROUP +LOAD /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtend.o +LOAD /opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/pic/crtn.o +OUTPUT(/mnt/c/Users/Jugeeya/Documents/Games/SwitchHacking/UltimateModding/SaltyNXHitboxVisualization/saltysd_plugin_example/saltysd_plugin_example.elf elf64-littleaarch64) diff --git a/saltysd_plugin_example.elf b/saltysd_plugin_example.elf new file mode 100644 index 0000000000000000000000000000000000000000..5925ac968305246f5db3a2171c45f49cac8c034c GIT binary patch literal 680656 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 y!$R2o^A;M|sSJIpN3 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

VXnXQ~bX}&+=_iSGY_G{?eC47uWm;=($REX>=pT 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

pn_0 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 z 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%0AX}Zmxq1)_Py3H=qZFZAxv)AZ0d!25xH|REd zlWw!O={9?ZZnFn;o4rf7*%P+EKkZ3pPtk4mG~H&;&~5fC-DVf*HoHl;*=uy0y-v5; z8+4n!Nw?YCbep|Hx7h=_&EBQk>@~X0 zUZ>ma4Z6+Vq}%Lmy3O99+w1||X7AE%_Jr;4O?%SWQ*@g>O}E)Ibela(x7kIy&2G|d z_8Q%0uhVVz2Hj?F(rxxO-DdC5ZT5g}vv=t>yUYE%Z69*mcii?Fw|#?cA933^-1Z3{ z(!cEk9&!KP3EH-=vF&4Q`xe_i#TLHpLu~sF+djj#udwYSZ2Jb=KEZ3ePn-5S?GEh? z+Fjb4w6|z))9%sUp*^6zOWXF5PS`%av{STgALtC-w$F2d{wHZq(N59+uRed3_p^PF z|FiRqF8!Hp`w-ju;^_1B*jVw_PXDuVG7c60_C5IjU$*V*duz`k%=Y&kcm01lf9(JC z2p+`mAO#Lm;J+;eH@^q=K?)qCz(EQeq`*N69HhWO z3LK=sK?)qCz(EQeq`*N69HhWO3LK=sK?)qCz(EQeq`*N69HhWO3LK=sK?)qCz(EQe zq`*N69HhYif)qGZFV-8iMt&|jG+%3^qC=%}sSzD&6q@*5gd;jst1RRj`RGugm|d*p zmkZIMh1GI?xilY6>Z{9YH);?qEal~@1k)(gs?nihzFv$Dl`D|o z7H|g*v@ut&>rJ!yS}nh-H?{M#6~qERhpJ0BQ6J*rzkJAlX5~8w-9;%LoPHf4dWPZ$ zw^E_&SJ{!>?~eCo)L`Q9WPY2Gib{s;vH}%DP|hF3Y&> z9_;Tw3%~L7OMXcul3!9Ecfs}eu|GAj9~Caj&dPTG6#b{@KP?K_aQORMIb6gwNip+Z z{f6GZ`VIB*5b+#4%%7oEoJgFwy*{9Cvncl7?D**tieI2x?ckENf1 zSK>srh_&)#_aFH;LE7fu>^FhSmb2#H_N|_<`+o=j@51%){FF=Z`4jZtv4rP!yRX^r zb^f~-tB3Bz`urLCGt2y$E!(Qc?;mmh?dTHqKgoTvy?=AdwwDr?J^$o$_UB*q#Qq$! XdT0Lk-P<5+%m1H?F*)5IS`__1+qBOE literal 0 HcmV?d00001 diff --git a/source/l2c.h b/source/l2c.h new file mode 100644 index 0000000..b2465e3 --- /dev/null +++ b/source/l2c.h @@ -0,0 +1,254 @@ +#ifndef L2C_H +#define L2C_H + +//#include "useful.h" +//#include "crc32.h" + +typedef struct Hash40 +{ + uint64_t hash : 40; +} Hash40; + +enum L2CVarType +{ + L2C_void = 0, + L2C_bool = 1, + L2C_integer = 2, + L2C_number = 3, + L2C_pointer = 4, + L2C_table = 5, + L2C_inner_function = 6, + L2C_hash = 7, + L2C_string = 8, +}; + +typedef struct L2CTable_meta +{ + uint64_t a; + uint64_t b; + uint64_t c; + uint64_t d; +} L2CTable_meta; + +typedef struct L2CTable +{ + uint32_t refcnt; + uint32_t unk; + + uint64_t begin; // L2CValue* + uint64_t end; // L2CValue* + uint64_t also_end; // L2CValue* + struct L2CTable_meta meta; + uint64_t unk_ptr; +} L2CTable; + +typedef struct L2CInnerFunctionBase +{ + uint64_t unk; + uint32_t refcnt; +} L2CInnerFunctionBase; + +typedef struct L2CValue +{ + uint32_t type; + uint32_t unk; + union + { + uint64_t raw; + float raw_float; + void* raw_pointer; + struct L2CTable* raw_table; + struct L2CInnerFunctionBase* raw_innerfunc; + //std::string* raw_string; + }; +} L2CValue; + +typedef struct L2CAgent +{ + uint64_t vtable; + uint64_t lua_state_agent; + uint64_t unk10; + uint64_t unk18; + uint64_t unk20; + uint64_t unk28; + uint64_t unk30; + uint64_t unk38; + uint64_t lua_state_agentbase; +} L2CAgent; + +typedef struct lua_State_smash +{ + uint64_t unk0; + uint64_t unk8; + uint64_t unk10; + uint64_t unk18; + uint64_t unk20; + uint64_t unk28; + uint64_t unk30; + uint64_t unk38; + uint64_t unk40; + uint64_t unkptr48; + uint64_t unkptr50; + uint64_t unk58; + uint64_t unk60; + uint64_t unk68; + uint64_t unk70; + uint64_t unk78; + uint64_t unk80; + uint64_t unk88; + uint64_t unk90; + uint64_t unkptr98; + uint64_t unkptrA0; + uint64_t unkA8; + uint64_t unkB0; + uint64_t unkB8; + uint64_t unkC0; + uint64_t unkptrC8; + uint64_t unkD0; + uint64_t unkD8; + uint64_t unkE0; + uint64_t unkE8; + uint64_t unkF0; + uint64_t unkF8; + uint64_t unk100; + uint64_t unk108; + uint64_t unk110; + uint64_t unkptr118; + uint64_t unk120; + uint64_t unk128; + uint64_t unk130; + uint64_t unk138; + uint64_t unk140; + uint64_t unk148; + uint64_t unk150; + uint64_t unkptr158; + uint64_t unk160; + uint64_t unk168; + uint64_t unk170; + uint64_t unk178; + uint64_t unk180; + uint64_t unk188; + uint64_t unk190; + uint64_t unk198; + uint64_t unk1A0; + uint64_t unk1A8; + uint64_t unk1B0; + uint64_t unk1B8; + uint64_t unk1C0; + uint64_t unk1C8; + uint64_t unk1D0; + uint64_t unk1D8; + uint64_t unk1E0; + uint64_t unk1E8; + uint64_t unk1F0; + uint64_t unk1F8; + uint64_t unk200; + uint64_t unk208; + uint64_t unk210; + uint64_t unk218; +} lua_State_smash; + +struct lua_Stateptr48 +{ + uint64_t vtable; +}; + +struct lua_Stateptr50 +{ + uint64_t vtable; +}; + +struct lua_Stateptr98 +{ + uint64_t vtable; +}; + +struct lua_StateptrA0 +{ + uint64_t vtable; +}; + +struct lua_StateptrC8 +{ + uint64_t vtable; +}; + +struct lua_Stateptr118 +{ + uint64_t vtable; +}; + +struct lua_Stateptr158 +{ + uint64_t vtable; +}; + +struct lua_Stateptr50Vtable +{ + uint64_t unk0; + uint64_t unk8; + uint64_t unk10; + uint64_t unk18; + uint64_t unk20; + uint64_t unk28; + uint64_t unk30; + uint64_t unk38; + uint64_t unk40; + uint64_t unk48; + uint64_t unk50; + uint64_t unk58; + uint64_t unk60; + uint64_t unk68; + uint64_t unk70; + uint64_t unk78; + uint64_t unk80; + uint64_t unk88; + uint64_t unk90; + uint64_t unk98; + uint64_t unkA0; + uint64_t unkA8; + uint64_t unkB0; + uint64_t unkB8; + uint64_t unkC0; + uint64_t unkC8; + uint64_t unkD0; + uint64_t unkD8; + uint64_t unkE0; + uint64_t unkE8; + uint64_t unkF0; + uint64_t unkF8; + uint64_t unk100; + uint64_t unk108; + uint64_t unk110; + uint64_t unk118; + uint64_t unk120; + uint64_t unk128; + uint64_t unk130; + uint64_t unk138; + uint64_t unk140; + uint64_t unk148; + uint64_t unk150; + uint64_t unk158; + uint64_t unk160; + uint64_t unk168; + uint64_t unk170; + uint64_t unk178; + uint64_t unk180; + uint64_t unk188; + uint64_t unk190; + uint64_t unk198; + uint64_t unk1A0; + uint64_t unk1A8; + uint64_t unk1B0; + uint64_t unk1B8; + uint64_t unk1C0; + uint64_t unk1C8; + uint64_t unk1D0; + uint64_t unk1D8; + uint64_t unk1E0; + uint64_t unk1E8; + uint64_t unk1F0; + uint64_t unk1F8; +}; + +#endif // L2C_H \ No newline at end of file diff --git a/source/lua-master.zip b/source/lua-master.zip new file mode 100644 index 0000000000000000000000000000000000000000..d2ccb9f462e48c81bdc20ca043264ac1a56fd23b GIT binary patch literal 491434 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,-l=K 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

bUY)AYc!z z_;GRcvu!*2IE$@Y)8v>g2zKM{0GeBQY_3osrNb~mo9pH6ubvOykV_!@B*b{t182Ao zVU2tK`Al5D?@vbuLvt%&?95yn{5wpZaghrwTnZL$frMTxrK*O3gtn{AY7=WMhFH&r z(u<}BTYhwo(JM&Em~VSNDh4TDv2xO+>MCuFLK9M)QS_`9)|Q;IAjTyXe4^>q3U+A$|6li$tFBEmA51Zv2Q!0i;;2L1`D_P zKPKXFTVsR@ajQRn6_)sRep5B4{=5`pvQxfK$*h(RHW@(0-wF18@1bM2NKM=GKEL=X7 zoOsi;of|UVM}tx{A0)y~=7BBZt@z~F??sLXIcfNRYVmPlT@CCktR@dqoMaoiqupy> za}cvJfMa>YPS#24)vW1Po#xKzxV*M)p-#2*DJq6a2BtlxR`x(z*=4G*=khStP6pra3pTl5f*O!0X#eb{R)|LOH zgLb|zF->jleY(I?$L^bYBCRyh;=zUF=a-^j16-FKXobKz$KI(jD~sXxy8hu)y19)p z05v;!o9pb?6-S{{;BD#OzeKuoM`2_G>;fen(2>iFPEwQ2#`PquO*>;$Nwtkz30mE= zWK*p8_6x7W^tI3w)q5qls~^_UQgu?n>vVYH>I9m3D$7~DTUC8hMtS8TcsZYm{j~z$ z<$Uj)){1?-w6-K(EURRd=Xj#a4I|90W=gbtX>xJjm?jI-C5~Z_W|FP|@HS1`o4p}M#Eq#J5QzWe>cK8u+xds0G~l~ZMn)btgb zrNYT;81i>Vk(|7~Q;!N)7Pw_sF7IK7p~Z_M*=UDH2VF(P=Q7)yDbJyRV%9i=Rfk0! zO8RiS2xWN>=%$_HhqlR;&s}DDxSq;1-57BfKd$^_W&QZ{dui%b9NnD%a9Vcw7mAp6 zQPLe=`-w~|u5}v0&|h<7F9DkGeZUX6Y#FTCb-BM!7x_KEq!O#JkKVdB@Owo*ck%mb zr>cDbNjC$Sh=f3}BU14EkhceqJp|9MhX%iqs<&*3(eb2ThdicOGGyb?BGG)+yQ!J3 zup1duDq-kZ4~wY@hfrsHT6#~}jm!~^WtUYzbhu+ws12vA3DdEmCS8Dk5Sa9@j+Ps* zwYz{&9Frglj zFn)ufEdRz0oUzHrk6h$=U!n>z^JFsglK%F?F77xi!=RPXdlBZ=4Gi`u;mPz8sk$~t zpF<%YU^=kN&J)@o&|ganKleHu?e)@C@fXBC@&9KpB;n$*eF#GVY@J_nSvjf)b%T z62!rVzje&mE3`_kYAHaz=uTY%7}JP7Kt7e30LuuaJUs!5=p)w2j8s`9(QGbqECNs- z3y;7a&~mm@vdU@M%I7Enf{_ZAE^$TNb06r^O$k9TGbt#FWki;}W9@kS7#?PtkGV;s zXKW^Yv7Dx9xswX*q5rQ`kR*aaFafbaJR>qmyrXR=15-aMgWx@1LvolvALpP_CWr>1 zfi&&XRzB5(<;{7xn3O0~!AJlPsl!CXil zWjkww_eYqwO}tvuBMeIeETlb5OE zN6!hYx7~b}?QUpa8q}fYGtM8-9Pe!Q|FOBdZl7UP&yWP$Lm{i(R>2 zhG=LK@&U=*JyDP-JLo7E{EOE^FCbAzKgvVMbpEZjFNT7KQSt^ad*pwd5cTr=PnU)O zaCHvoCiD>hLjV@ipc7klq-WMr?!;STRZxwRbJ4-cuwF^yvQOBhyOY`3h4i}n4xFri z&I7TZY}cOKd#yT>hjlrx8^n^)_yHUBu3Vr!=e-C6?O3$M6M-}AAUX;z8AeevDs6JkICvW@zh>^A<}h-q1mXs zZ%5G~FJmLng|L)vcI*=?In$T%iq4YaClyx#MM>tx&u?03P~M_H?*oq0`k!x8MORjuUEG zw#dDRQitFH?`gk=tqG4l1rrLDS@tlcq@!o2h4U;{OkSCHXj*nBBelfB;WG!8H$Vo5 zsU+WVaYi-C-AY-M*${Ex++UOg8eeFW1u^FQdGDIz%!2e1R;-Lde}sjY+kJgGE~nab z0@^sFmI>*gHzor6k~yjJkR#`f$j;)`8|(@Tnd9s_^=!&oP8onU=}fWKienP>4w-;u zI~!>nhe`;6RGz6c9*_lCK<5@4s8kp(o`OW4%S4o$q8N8EE&hGl*1app_N$5z_GenB z86N8t^C%KEokfs)wiE;t$t74oL4d@{XbM3XD&Ri%e#tudam_G$$`F#K;8{qJjQEZ1hHWx+b*}NExuZ9YEHF3f2FLD4pK=UYuC!=QL$3#*o7wBQ!R2mp7T#Pq{SaB@900;Vv6Z>4&7g% zy5z0E2HB(@zg%hLLL}Lx?w?zp_?ixx4i)j9j)-RWAyHj?GZY`!x;g4r-CB%mRqPM~ zE*GF?th5X@Cb6lznWud%M>ct51DbP*wZ6p(2b}unERjo;`fW4q`$t6pa`_`nC067u$ zbk;^T7&67tR-r|9-wOHRV8QR@HPyu$3!GeY0JI0Ufv;A%Yd{8jdM@Pvp^A({&S{P} zf#)T<&*u*Aj|>>FtSg2lL1_=>=)CN}EBBBdN|5v`PM)eBissTnkdQC6`6f>551*hbt&tHD9d)_F2INTv`n|KE(rp`v zpd&pf2O=_7F{uO?z{p~Zx23C#d_2A#=WOa>JhXs&(t*AOM0DRArER^6!xP zSAK*J6f_X%T5QNtYkMF@9Vrbfz2dC{Y+k2#I%zn0ymVPJU!q2oift1-%z&EvepVZc zlT6H^t7T-iTbmA2vuMITVxS#j5R)UDNJHuhss@d051$Oup?lAxJeTAh62Hbhm1%lZ z%PwNp(25M(iT;uv5Bh21$%>+hs_B*ycFY*pII7z(^LFY|F5y;1r$zSolIHaIHVRL5 zl$oBQP3{S|`a(ZP>j#g{?B?gn{F3C4n2O(TD_u~R2_K31zRwf|Nl(ycyp9|$2i@ma z1m;7?F0FFia%AEjQq0Kgg72r5V*1bg;Xr89ooUX40$s|+ZA!;7ywGkPP;s1DXL86) zrQy*Gtz{ou0H3;(Vl*Hgh|EvIf&XPc+BXiS2K@q^+XJx{NcF+oj;;H}X}>^ZxEwW= zxu~KT;PfBO75RUbf}K6=|9dNVBvsdXkO3vM zZl;byS@5h_%{=E5q#_0K4_rMr-o~UfMp$a{z`G(#@R{aU$gMU{Qtxnz#(qv@a4H8%oBO ztA{tEBN~7jTz(s1o#w;Dr=Fu7JiJZ!r)>rfAt5Kq#J%xIh0KIw@`;V|EOZqCS^mgH)E{sQ`+4}_JY(h2%+FB}~F z|9YVRI?sJnY~?o@5Pr74BC!b$l4}%3OC#7Rlc5R))fWmIWN93c!!)E1DO^=M8-9D8 zvYR2TUP(E3Kc}49c3U@W*X{?6C4gGSHOND8XBwl@U>9g$QP3-bC64Twi?le5U_6Pm zkG?3?7!V@CVcel6qFs%udh9eed8CBVQslnZHb&9q*CPX{EaRtzz_dfwQ%yBLMcMSX zy8_tTxxi4Hw7d@qg42&-ga9iP;v4-XC7p6<2oOAGO~@7%xD^W-(!3{;Ggr3^GD8Fw zSc*L$cquM#`Z>&?^EsDZh?Ffpun*5Wp`)Tfc@6-pVf0Z>ldvfjymFRGl0znuBPdpA zz@^iRd|@&VrmJ#eFKB_Uut}3F#g;KwK-twnZ`*8(Ua}k|w0vbvW@?>%!lzeGz2}gv zQIc}sdl;9as>8QJo$bKXZA05tGt+9O?WC};RNo}Bc0YoFUfNG!!EWp6H|@}C!b?vT zX$5P$J!R-{)S#UYo>LN>(*%ePA#`G43P#8G^UESJii-qaVeYsDJoS0IRcra7BvDO? ziUqc1ED?n(-(Y|J5Ck->`UL9|WW*W(twG8*rvDp<$5NO_4xQRZ8CqI&W~-6DpKzqj zgFqEt=H6_()Fjct>cePKm7e&k)q>Jwft7!|3RY|hNIxpNEKzn&d?c?^6Vt&|emNBl zW>e$K+EePA`sm#A3k4wieL4fl`l^vnUphfhD>?(JJG=&!<7~`T@R4R}o^#y+*oUvFDc?8{_dt{# zNxwz~m<#{TTiq_VpPEkqFZ(z5LSU4sEvxgCPwRg^OY5JSlI5+5hw_|NwW0vxK~vEo z=+sbt9;xtdSO%&m*l+yrN8jhf|fAj8vLzD*UBa}w!d5T5A)yu zgW9-nmU)*32LLd~^uNE4iP3*vr6t;zPMf2MzqNe_(WPXRij5Sk`qPtm%W7CLn4HEF zw#>2Oz=`6Bh!FK00&yEZyIpZ!2ZT~`WDSB_J3Bi!w=XW^QP(xsw)aElUnLT!ODq{T zGsEz27cA7K4dLcWG?CtE1lO+1Wq96p1#eYEG1e&bs|;+dE7f4|>14DUT$( z+PzTv1@$d%qKUfu+NT7BH7qKT|gc-hVEzg0@jt$918Kg9Qklu1IRg_CBciRNB~zjl-lG(G4U z$xg*+s;OUXKrfFTgegexLQgEOJ39cV<&zl6RAwHfQu8*HPxTx~pT^YJ=Rz`K2kQyx zF!zRN=0;MX;Z0rvG)D+{mXZn%dJ?`!j9+QTLm=ULQBh1Cl-X9V>wY*q+-KJZL(g^r;iMCPJ^bB8~>_QLfva%n~-f-7W(0K*hk9PN5YLr{UOB1-L*0UZXI@ft^zO6)HzbIO?Ja_DN<;D=+HpYj!Z z^E8(R)+r3tmIhm)H$iev+QU_9HO`bQTeMz%hZl5`Nf@)u4lO_!vm+?pc_4lWWkB6t z`^e>KS2-XY!X|)l$Zomj0#k6h!;?y{dyJIc{RPaR1ETOdPs6rKbO}=sZmM+1#}NCN zg_(n6y@L>d3Byo=v0A$1)_1K4{1Wl&Fu;J~i8wvY$0c9>d+SIBC8D(+n$0(C)2_Lw zV*{UvE@!&&aQ+NX3}X3nK90a#gDwnC{OO$gO;*bc%n^)Cdr3uy6_^7Wk=~(a%SHur7Q|l-?FQ4CnjEQfsSbp#bwhdVhBybu z3XkkRoLVGIq+VBnQJp6OtBv-JhK9l7wt}~3eshsaWp!tq?J?AuCge`-57+$vWC9xS zV*hZ#vN|IiY6^Y}r^QxaqJ z8S!ac6wWE;QnWJ}(XD~2t7-G#da1PZyuJpU8}%JP@}w*du(vsx6BTWtYPLzjtWbn3 zHiw3uS>TxdW4_ZLQu{LxU?>&V=c4*19@&L#pnGG2Kui{r%eH^G0Pk^WMlbk8<7gs5 z2uY^oVmkvagv(~4FqNH?Sg1vtz_1cxL8aM=GLdk7L$NWVC4i%91_fOByS{n7f^s~>YOuc#G0&S z^94L%B$N@rrrA`{U8n`_+jZM4`>7EFJyd4Q0tBzG>Za3ps|@tx5-PLI`7antS|_coiI!f`l}45)eIR<}q^T8Y15K9(uS{GCk`6y|Y4>R#g=dZ|C0??@fmD;wm@G$%$fNpjSPy;_D z8auk3VlAA;9T|1g?CS6_4a&#N%vVp^+e>koBO?0d_~iEFw~qSFhdsr3G1O{C4{Ax2 zo;#Q!o)uD^-kI%lN<7~-j>`{T4Jl#=h~sQl+AOV`$M_D62C?Zb!RuFJAXcz~5UOU* z(9d16A|evP|2n8BKZOS`M7kz+WqUX!PLb_TF8;~4+#{#~mHuG!ra-1Y`lB~pkXk`~ z+8^?o?|*AU%Y?@?ZtH{NObS!8T{edE*b4mVBmR5d?v-i0_Tj|vtrySMX~nT$U($54 z<5ti~%=(;P+gb3(KNgj+6T414>@p4qY`+c69iPn9Bf@T_)AX=z5xae`7WM}hmtTR; z;buS>-bYoFfDf=@EjdW4TI=yaMPS4z^`w%@q((2Yid%SfkrQ|YW_i~CfxtorhmqPH zu(&JZV`;339lh*!?n#H1ZElfmu%?eqPLkQJ=O}G7^f^K86Lb3}4xbHBv`c29ki>i` zEX7R>_>#hP;9q`A3am_HLuN2@`93RG3c0>>eq;8RLokf5S?K3e zu<0DuCBiN(QM=&)N~sL2`>muQwL6GM){u5?n@mS|!3WDQA517Q@~tHRLGEdgPY~#) z<+|#btSsb79)Pf}1u<;YXF(@>)h;kWGogEqWhGif7*{CJ&n5-~0*fS#p=IXAQ;5m$ z%yZ~mBM;n-HXvO7{spU!;KTtlYip9pRUIko=I1Gy|AFK(+3YVZTns+TD16v~-2iB| z>KF5@khw2b%~PUw~N!NpgJv=>P$gnO`AZ%RAJ5S1m+MM2rHAc{m`slZe9Xlr@-@h z69>^>-w0<~wEJG7ZS?*=bB`3m228^UG24x^tOX^+-NAQ_wjB!L_+|AEKr-1@WR{6^ zcye!GuO%z^D$7(#r!IV}4n=y&%DEE+BZV zDQe(0l=#oDnHYqI1!{%Njc!nrm4?E2l;-kzqEi)GcpfR1u-?UOcD|a3!BO15Sv*|< zs8=I#8Y354Pl(C95F8xXNEjC^V@8?DEP9W(Rc~4kEck{{`VGe9dmQkB%^zGd)YH$w zJ22WPB9AFEzf5?lHfiIV!!)Gg+V;F#Ch4dIT)UaYTZDrY$fi$_g915PaJ%I zmP-{=)Q(kkQ*v9s?F=NGR8Lr}o>-q+E>tq!Jc}{sfKy;WWZ#mnuKFRxw_Oo}dM}zq z(P^owpvJ;nCa*^9^!C|HKlxuL+M-a(4Y@0FKof+<}SlVbvVzU$lIOm$$K+4 zu2`IGdH|ySK0|__`-NqrdukWm8NHe@Si&LUTlF2k26OEBsT}$t46-M^9H#rIo7{yv zyzTU8OSf6N9dU}qOYo90IZTN!vXYpvU+R#;x0MxMj%%0tnxpIL)jn{hwvDIvB^^?; z;Q_<|1&!Gj{LIYX1R$@%uAzc$xVG4p;!&l4yGNt`G50#v+A;oxp|p0f6|a*=rxC<> zFl%(NP!979Mg3kf3C;zfCubBVM*G2~>?L@Qx7#DtLTVCIY#q4d*P2uOed%pe?i94;!2zkZOz)i+)^GXFq;e*$GY%5$gQoFtZ&`ic#Y z$5jxEy+^ku@BunUmaGKxag~<;nbb_|Rd`??Zs66mz&_Bsj zwBAvlM(h0czI`mCO{C}5thk~jV`{#8p)nRrG<~zh#;_$#vBaJ7ATFDu(?zM6{nP|+o7(~PCY z7GZ_p{*9mx#OFS)g<0~AlqeaHZhHNbt$6jvyp!jm&q3tKHcZdkQCQ<+o$zZvw0z2D z>?{qNWjAos;c+lw4Q6n0jXn44GV{q=-?dJB5M?JSo+JYtWI_kNDl}3>S#(l80ZOG9 zh__q;zOq4bd8@e6R%w~tQgG<-g&h9znB)iY6yvuI^dE7c+t176>yi?a# z0Ll?p0HrW7fB9R5vES{!JKbk5J z1)8xc;5JwQ*3C$c5??kM5!1b95RYhCHR<%3A~9t8o`qCaEHoD^w#>%$Rf_7&7|vM* zHmxbD^30`5R*o1|2I)-PDwm>t*BR#}6uG7)E)J>2Mmi!t#;?s?@3*?OU3Bw2Ir)*> zKIpd&7lhahnIYs zqQZwmq;P*}001ErMOE~Q@u4V+fYF*D&+O=_J+{o#{c*Cv6+t-QUSw89l^xL(h+zY? zWC9q0`hapKz~rnbs}Wj%CIgidO)hY>{y9OYbRhA+BEO7*9$Bai1m$9d(Sbxd3upNh zfnEu;A`H|`#kC|nTf`0dfb&2^D1f36>cJ+0XvbI-2&h0GV!xF^Amn3$Zh#V>TY^G3 zkxX%e91;i;;ZqUP4sAfA{)nL8Qp`b+goF?%nKa8~JEl*8XRHsPv!^kMKt3@~;=9HyfozLRPk5M7-5?`qy>4c^SW0dX_Q>hag_C zHx|zQeHqd^H4An4SGdm)^TJD2EiG+#F9;x0sN--p9rG9eVEeV27{#u+q9w@-_2Db| z7}5k*sN_;S1KuN|!sz+lL<54_y;*}W9IwKQ=McrT5f%xd!$A35;}3~D6f1zUkDY`X z1YxxVgwCa3xsO@)>ut}W@a_4jYw=itpVG4jt!eZD0}$#$XLJ&O(vbpZ@?@Q7vQm5M zQ(r;|^`cHc5AJ4;&yTK59A93%%QeIg-yHRwVT=p%b>XRZSULCIvT&dx_j6iP4s|Uz zIUx%>0(z~-#YQ!xge^FptUxQ_Wm5wxId3=*Nuoio$@q z!;!E_h7g4+mN+Sj1Q9_^Qw!Ue{Rd2YW)ZC-#K>cAg3(9uDr*_EPbF1E0g&r^6klYd zpcwG9(GU;y=P@<7#ZzF>kh)-i9RGm*bqh}PKfEQ%Wg_~ddY}=LM-K)A099=T3;Zw* zR%#c!?|)xB(=J)%Bl*0NM}w%K5-33<&0uUW(={1#^M?4ZGGhuWxHVcdI`t=|2xg8e%+bft$pROYasbQ)na}z>Lbn zH{YU~N)IJ&fDr~kDZxOKxEVOkSI#3B4ADya;!Mp0qMZ@mADD? ziXT%&2}Gf4$P#UrbtIQG<56H3Q^w*XsR~#a-5-N|#HW&%JSyFd>+>CSJwj$9mVo|= zavg4@oF9R+t0(U8kV;9aoI-;xw5zCrdIiQ0_GLsdb2)FsoaGB~mtYX zKF9DiC|D)E4I`FM+@GRgk60(%EJ4C`=-$H7YH5B?0j`gp-Ge=${&M4vTTi5;+nP+gPvhP3`0tBRmFj{C3yF!G({}b zdW#KgCL&5LcCCiv3SV~a8NA>byi#tZ1u}fj5(!}gj5}+*Nr-2}WIyG3(3z-NMX5 zRb%ZbO!>{9c19H#(S}>Q$Q8Uhb1wME4)I3|nhYVy?$`yagqws(a|*pfeAUz_-9lU@ zaOL?sRQN3;Bw?ML!azwy!-|dp<9j7}Z2YG^NkDDqi&GMnY*V1v>Kp2aVs`L&oVPua zQ_N1aA;3MZySU)xMsraaw3aT6ME@m~$jo-dIU3CZ7p?=s{XK=%0~QTUJIkbmjyz*$ z5`N}G)^+DPTQ&scx2-i7>Oiysnkqn})ISbaMc;pVU?C1U<5hhKzKLJ)SGiQ~IZGL@ zo9`}HPADi7KN5p9HhzIPV9CHO!xvP^ch$uKveh05m4F$}2H>>gxlM-D(%3qsl=NV6 zsh_iwb;BUMj`BC3DhXc7)2R1BLrx>19s>-qWtI}rz0gt8L1PJ0zMuKNhdL{H2sM_W>_+~4Q^GufcMGDC8p7BWx zll<}dJhWs0(qAT3sEcSv1vDMYh zTo4Zqz(4h4Yr#j~82FeuRuLiinm6<>U^m??`;vX&BE0?m|<%FkH)l`-m zA;edJ#GT>TID50dRwFLgDAlWo`zXH^sFzpd+)vaz>xhXhP9Lw5x1|>_%DWZ31gO2j zw1{w8*O{jYNZ_d(tCGX*I8`HM(Rp<`F|-C#MkSSB;YxH|C`!SmG|lnU^CVCHymopx z7&aI&m#ohyt6S&{n~iiHmRVwL6C&C47jg@pR+OhrLOr4`VljxSYyk_B)6S~)rUWOh z9z!h=+q4p7Cl7IuW-$oEmnyNbAoX9v{QA_WGnePGj_+X`a!lBB1h>2DIeHA|T>g;5pR zD_0wr7Mws#XyrX)2ZX~|vLcTt?UronYMz2zdgH&<99Z55fdJ;~bj+`r4k!xF1b=AX zb-hiPM{L4H;dbtUzIi5e%g?zCm4m&olRly_Wy#tByM6e7Y@O4ZV8Mbe%eHOXwr$(C zZQJOwZQJg$ZQHJz{?5(J>@!cXa%ILJfs5ZGD1T-t6K#~b)d zifJ?t+7L*4e_rJH_iSym>&dN#SipX= zigdU=vZ=xs62>-EFVAp1BRwg$Y&;b57Fd9N_uQ1v(m#@@>0CL2mP?5k7SdS0Qv>L6 zC&0QO0a5yDZ(GBh??wTkL>AmCOZm+st-_TWOw^+lw8O4O>3tfFN;2~R`sueGJACn&}yiFDnW7NvtAu2B=->Z0vbK0k0iTrR|xtEjDWxA!lb1oFI; zn>7+4&Du;VI`?aofO!PJt-obI1(VC4&ot8g;G6})3jOusaiL3yo{ZB!7H(J8;ePE*NKP@b*IM_NJrZ}SU z4jjpUP=M112(1EOq4_>HS@3*Vi~5D+Ph?I5$T2nba(9sbnTUhK#w3s+ZpV`ajk1k6 z`$s<2RMUhD!Cx@ZIT|j3K7*-?N%mfEjxO#Fwx7n;Pp8=DdBrN`*@a=(PeR$cWB8LL&f1VE$Ix`s0c zj}b1f6F4&9Q^zm@-=OS{>x&p<#cU~W*uyOIZJ1T^8W#q2!*Mx}3vi}xcu%N}<)Yo; z*l?6k$tDY}|WkTxRR82MilKyxQTV3uD_eilA{maMFci8e4)+Dcuz_Vx)#iq3OjD$|@hU4_K*&i8OkO<=%7 zAq`bN&JkU(ZU1)<9S>nP7iAA9NZo#xJ`PTvHEh5ra5)A;6tEphzSOQ^q5Ptmr8pMfSw-s%4<%x>O(WfE)BP8Wy#Z9=ACFS4m_* z;yZ^U7%R?tmGa}sHKLer4X6vBxInR4Bi0W5=mJ-jVisZPhJ+uUtDPyRInJ+ubJ`Tz ziT%%>tf^!r25EvNs+L@3urcuwi--aoqvLTU_svOs!|@+A&Em7s19* zy?8DlHaXx~Qd)Y3{J(sbC&@pFbYKshxW9k7;4QiB5nOC6+Jutwq)7~#7}+#WpOR;N z1Du4NW13|eH529p7l5cGO7vfTkM{ZZ+!_Q`;fy|Ea886?fD7;^AZ0nG6Hrt^VXZo8 zfvrkJSf7Z?Kysp#LM0NR5?|(f;CdXYc_=X%}sq$-2XEy)QQ+}WB_pi6#z zaGbwKQ4=mwEqVv1ebZ|79_Y=<&c^$7CGmHN%;WRp|tr*f5##H`%h+?D`p~2Z8460mGn}M}ao2pxS zs1jCrBz!ooF}7gRo-?WF9^x#xRNfFy<9zFJz2b`h_~qjF^K-Pe)i9JL_oqT74pjQR z>(RJX!H{0}xTqUoOmOZLqGqlh6@$+iq}6tuc4(LB{Lfx#Ofx@BYsZELbdN;%c?;1z zS=D!{D}w@%EVZfO_hrt-^@-VdSvLMu{ z`O8`l-sTgxIi!8=X2xSm|m;Ly4WwLwhXEkdNLLD`|390fHuFX9oeMAU(`{2kE zUo~W@seO0f%l0f(tZlxPYU;u>5?hq0>F{>XNi%Q#Z)8v%>uaIJ3#-jN;uC3T^p1Lk zPiukH!Me%r_%53xk^uCn=g|$`LynW<5 zb5rO0tN>)?vkmOx>=%(RoS5G~XmBm=ufK?>0=K5or4Nu`8FksODh*W3E7p7T*xaVMcU+~O`#Ps}?!WWL7rFw~_C#HCz~FoU{hkd#-bv0IgrN@gS* zwJ%J^53Mta86`Uz-x@E>xOO7aRu|8;cvo_`ZX%AAzYH{es-+_a+^3veY={`+6YBw@ z<4;r>|2X^hBt|vSLGel4kiXsX_I_4WI5=+GyB>*_;7wC)CrDkJFy_$AlcJ0Zrm-VV z(ceF>4A9<&bQG;d-3oWE8#(=M8~Unytf{+4cdYGvG9OD-G{K|FE(KUV)`5 z6sOyp;Cm5UjO~;m_tb3RoNzJGBrmwq@gPc2F{A`d1-zJ&tD{8T;PY=yR3sb>wl{lf z!r8tUjk-va`D}&5fV);{ZE4{%3erUH+z$vnht4DpIre>bwuA0)KzM=*0_6rch!` z+yH|8PzbW&W?M)1=Q3Xq{UJaZLq)!yf7h<%D#HkjS~|@hzG022yTVSjI%aEa#lJY;7=|qk?}xy z`jbnT9QqM=`=qVvz8Co<#3hi6xG!OkB!B=2d7JD$ByB2^HZw%s@+a;YBEa9x@^T~3 zypY6{(~dL!Ibzuqf4X^_j>0tF%oyIT*dj8fp4h>rGRU+E&BcYWee5??JXMNGmqu=S z01aQ%6d%^00(8YVc$H#Q-FO_1B#1Q^CrGZb-<1a(+s5r8IVZkChmV`5=WRzR+|>^K zfurR(o+si5p7M;leZnm_7rsum1MHvs^B78tu=j)6TB`K3G0J1+q^QN-Pu?&+gwr`Hjm^tPaeBWhVORE}=hPpI9_T;hS_;AmjoaToqw_nW~-V1>QddJ_fM z_M949oxkb|^&sJNRSn65rtJ@h#H_<-r&YNZ9OaKj4Z1S6a>Btzn#zWO9T=-PQNm(E z#>RBx9h4TTLN!s<$3>##eLA{0a`bg@@jF$1Pg)40^OkP$WzI7y+$T`DeIi<%ZLaZU z8T;KugdWBIj*j=|)zFdj~P9J7b`*o z!?K}88}QT&GH?{HkqDy;sDKpNSGO9z$TXPk(oH?S-F+=Hx@k^>sj`308Bik*51m{}ralRb*^$x;Pj^n+U>#aymms_kCx*I_Lf5dKXoV7r_9;EEPTRy-d2tS{Y8d%c9}=O zhg?8WVb>W^oAyB-?|s8Zk6CESIMD(hku|PsLp67xL#TnI4|^N@{Sr)g9}uYfJ2zJ@ z<<}e|{92N6>d4vgz@B9A4yx^ zQ&(;?ye6^(sTB>j-cr*u%in%FIh*pDenPVS_3y@_f6K3n~cr}hmY ztjb#dtGtU?e!QP03}e&tt8BpO<6iJtsQ@L7E9Vfo=ONKR^Rw51`-V|2^RTH_+dcs%XE#fH0PqCGTiOjYtG>om(nfHN3_pD&&H7 ztw(IE9}#LS-dZ%!wwuWSWl;|sc}y5Z?|!=bJ z`v)q}2%`_C>FeHALel~_x<6HlSJ zdv-U|YTV!_$DqwX*;;Mi5$a-Il)w$sZ*HAKP9Qhi?VDM|*I$kq&Z(Od&d92Qe$+9- z(Je}CVRBkNo8}Q8nzNt`^^HCJauB0+o}567GkWrsKz4D_IT#XAY_&pUDcu?F{4s^B zDp&Y`#vWWg!*0x43thzfy6EcNeypU;MRFhM{kDVIYu(JZFEP&0X`v)gYn*&wnxx9F&w(ZW9f1vc4Fv|N0b@cYAwvTh*6aT&J3w zb|~_V+NaOr=u~q+q?*hztGcaXyU_d(H_? znfZCl$>}ThN<+ok%ptqkJU?|`oLGNn?4FGxu~)8fdsGFbza5R<#=U=&t;y0)uev{| z@mVSMbX)dSGabRnn_zRq=^9A(NZlvCCs|g%?*6R4;>l39M+eOljnyoIDa}U*oXUFfM4wub*gOUP>Zs<%B3n> zv7uFER*+7d#9tj~yT(;21xZ@DS-oPMeWBl&={1=w74A1UkNoBdXI&(LQ; z+`Nfq!ew3rUTJ9M#8WqRX{sh95VHSEmcG=-#6n>BB9HYecM$xKaZTQxJVRb`G&8GX z_jGo|kWycek%tFkpX-yq(Z3|*^zhkq<1=rGBxy8;tehIVMdp?ZN;BIc>U5MXx|@Z% z;CE}0%Iu+Uy%4+R`bzkn9*lzSesC63d=`y3_9}(hu&@!!0tm_O+V(eL%vI@MC7XS3 z9dR%C6#>|WCTNvQt6vw9>wa!E81(69$;wF{+ey`7;1E@R`|L6 z1!n?^FDcY+oX?e7DqMa1h4jzZf&RQzvl#79P#_%{Xx}XJIiKvqDqS-CY9jx7m`-fb zaCkRvPTnq#9~VD2Po54KF1p6-PP~;myRfiAM0!=lKYD4MwTB&k23BI{;IuD9P*1^wMw?zkeWfMDi_Ko8dU!Wm!1Tw9KrFIDS0Yx=fMP~; zf|wyM7Bs&aMEvt>`HgYP`3|sYqDk7`X^6`qovbyFD1iuJzq+Iq3?|576eLLo>y2U7 zdp?S?wsBLm37F~EhHws4GuPRt3?wForTLgRJiv`#46+Z6D`q&XgKLSzaPeVK6d^6w zQ5Yp?$?nQvc-E!rmtyck8&mC_qmlgv$~Y|*Q6zc65`kO?=Qc_ByP($ff?sgSt{cF$ z9xv75$4CJCVO9$25ml!d4i>sWDjxywP^0AFmRLrf2$!JICh6pM2?^m;y;N1BuQufk zQPDIFi)Hk1Talbqu(FZK?tc`T6xWjIfV^eDxMfRZTb0JbdwM1;4o(CE z0J|65Q}vqz4G;iQYKtLm&Gfv>rr?SxY38d5WRf?k-rFvtRaM&bZvw<_&%@@`%d=ur zGD&{gPGS+|wayLtcMI7n%Q!@^E)Mx|=F>~Mt=UsO>c_@r4@OyFsO8nc>2S=CL7^6x`s!i|!%#un;-HzM3QQ1!x*$evntwjvAU4 z*deR|>b5>zPmo%?$|OLixN4*N9Tbluwtg|HhYif+IW-E+j(ffK?{e1L$Kbq^>(tac z4r|XD4SuDi7Q748xa=(xi0FY{_5ugL&FNQYCDBY~wnd zQA<_BTNl)zfio?ktf8y0$xvTta^Hl|uen>GT-SOIfwsyPyFC*?9#*4>e=LP=A__N< zQC=o~ad^6@{NV%gi_>j8reUOW))f{W3jdF_G(xr@U1jGA-XN_z6}Xul*dWSZ?m0(pLkymVr`_B|KRy5QQWZuD$r1rbEm*}?JQ z_K^Gv$lv3YSv$h~VmTUJF`p&#+4~&{dS9lA{!gC@WBdA2o1prdRO``kK3P2t5~+zH z7zw_OIXeM_DJl@Mh1n4|al;omQBrx4t}Np7iA1RK=eN5yE-3+ta2w+0bxO=^AU4=a z3Ui?PV6T|kQvZtSDwjU|_g4luvGsn5kYW>tPstN^WIPBVuh2U~2|3<0;mp5z9B7lg zR#LZ;YrGC_63IPBF{!6O@1b8OUtm^0GYx9PEAS6Qa~xUO%411utDaT8!!;1% zb2Cga3BhF|cDBb*^geoj#QG=`#E{V!P%A|G-cz8?G-59+w5`haGFGByZNs%7BS4{5 zwi54&!eW2jFaS1S1TYyMM?!9qy8*y)K|FKpR$=~H5;zzhyZ8VF*l`H-Sfg%Z>r@J% zl6rXv&)}xImHs_Y@+m+vkXsicbhxO+GLT=%n7#0TBagPllhgb`Q*NYrfDmf=B~|GQ zp1A>ZLn3E3IgUrLrlR>?o<>>y;YJ7yzK8f01*ht+s&xLnk!?p#ksSgtm(h#R4aF zRWDyVL8di27W*Xw7ypSI!6PV&r9qY<{yLda%mVd=ERyK zE@}o8ln8r%0^{h@YCkZluhxX?1Gs!D7YxB85ybAyqENfuMqF42#An zYN&r<)Bv-gNMj88m;>6%>h>E&D?M+j z9i;FZD;JGC;UYd+1v*;%VIgs2G$dHWo6MK{!3XU36+W_TD}hz*#PZGPiL9)Tq%YHj zAhb);22gY6uqtl*bY?82*elG_oY#Mw{DT9y0ayrM6uiB~5VmY~LBN6}=cle)MaVn2?5;V(y zk9ZXE+$?Ll3X!-6e{=@=oFbu2YdS{)5?WLNA>?oXDGhu9 zoqs?g2DXLnMPel8%dcSv23AsT-pMpK>gRgN@{Pz{geNJvPfoq{}`{`Wdkgym6)j6J5@H;6rq1m38iK%dOY;N@}e)R zBe?Z#oQYMU5%8akpatekfp(qHaV6VlN!?f*Vk%}^X%J%TbO@XZrBDb_t^JjY5=A*A z9AAzPt1U{_LvX75ZzcfY?B75JqW?wHp=A211)LJH`6}LqGt< z!CPr-2CE78Rp5ax&Rj5Rf9jpg9Ar4$KPNdQ3A%caW{}cgHa~1gfqOr_Z*$P86_8sH zYgsO{d|T>+D3|jFx6-dUxhwrwwQ-z6J^>e1BGzy=Kzaj%S~>>3o1kuZdhee!~jWqKu{x-2z5&V&yCyubpq7NW|!1}kz%K?@$Ml8 z4bo;V$2b8?SQTlihXU7&zg)_=>yZBOO9RpjBg8FS9@@>)XH0r4!zMXDaBx?>u%T$} z)W85R2<95FDCbRTPLj53E@`T+z+bjBh&~4+FHu`I)OPb9aR3DK*3p4D1NGA?r?N6w z#^S?24$)x;{$lLfejY9r?XU!@YV!60D$84yjGKuiT7q%dDE$;&#kBT`ZYf7uwQ5(V zkkZ~hpuk}IG7KBvan_CDsk8C)H925E3~^wpXkA)>JZB&pdARpD@U$4G@9|5hRQ?## zvTCfh*;RmO_-kY(kwSf7JjNj${qfI*)c~CucmOchfM04De=}fW{Gy!>y_C zz;6llxIF|Zu)xrHbd4YAZ+59JJiP)q?cCTHr3bDL!_O(pb22FOd9a;9=+EN>-t z2b!giDBs+|(n3mVyz$GB9Dey8>bAm$3{M9(AhJb^%0OR#q54qr3nqLq>RrS2z(7Rq zk=q#5P7O1V&YBqUik?R#giLo-tbLr{3;bt8)Y3rUaF8AF=qSyqU$RKUv+2v6w^^pD zTGpjR0gJhaUEd9*D%U=5qnMq37@D8I^~BdiV$PaN=CEA+^qV<7zxG?`CB&A|UO6u|8;vUNz;f^DKB zTR>YFg+s_?sj^~d``vGpVr8JfA_KWn=m~K{FTsY~)pQ@JCA2R66{9{f&7V2KVcje% zkVz<>+ZGj2wQNFK&}W>Jq;ypnT^(Etvgv>PH`)Mo4Ba6Go0?++bf8qvpHbrkEA=M7 zku{h-nlSL?>j4q{-ALJg7DxxJ5c}S?@{)RINF)4sNYUX#fo+_M6+Rk$*ptFnaFe}w zpu40XVQV*+l{6)zNJ$gciBhu19^mqj5C#iDqX%IXk-@Ye0eS%)fwP2|W=WXIwU z*wv$N20<;3*KblY(}1wnJ_C70sbrPQA&P_>iLb}?Gchj9O1_{7hSSkVeKxMuU!_0m z*A8Ey(Zq^IYq09)M38os5ezF*8TgAx?jqjA8WWs)5gvpDUrC32-XL=z+-}A~krW~DQ z?4EYOtdONJ4vl5ta+tb^iUBkO*z@OfKp3Ir;IXqTQ!}*c^@^N^p}ipSkrHQZ{{zp= z(lTSNm`-beY1ka!6egY;ChOqvmwfZ9qd%S4e9T6)nqmHK#(r<1a~2_G{95zMByAg$ z|AxZh5{RIoz{tTu2p>Vb z!L_GB4u0^b$BO4@|9~z$ug0^TmVF>5EWKY7w&*EMQ+M%1hJzO$hPg$5a5r;}G~Asd z9{_TbAS|}0qj;kCx>*h+SY5^hgxzs@uV2FXLol>K2wfXWr9QiUmY%I3{PX4}cs4(q z0I=3~S{g*r~M1M(-Z_*GB&vTA3WfG>~fW-T?8G z%7*2n97wo-Y$Y@06GNbZ>+&ApGsI0;riRF66E+z?yHN;ByAPpiEt?q~wH~2IFupeO z^y!3bgTu^$Gc%j%EKA{pC9De9Au~}ggW=N&m;ev$&tFA%guj>h3sZ{|@LOhbAbBop z3v9f}uvuyqym_heAq*4WgEk99@1vcYD=b*#7gcr+xv7JzVP~lJmfoMludr7{m`h>! z$JT^|Vgh6j&qe!R1opGaAD5(?L9^h4t#K=pn&CS#C~(p^9`Pp9dyv?!14=fu7e?zl zOBX=XoTN`;bhI!dRB{v=Vo1cyY^6CL_f&`989+@1;|M5;1nEPHXfJPVo3lLtay-O24#4)y-y^b~l)DZ4r%z>p0I%2JxAg)_G-( zh?Ci#%sQ=Qu!u5l29`j?L@DTOhM_XWUt&&WU)vyDD4nmQUgJy-pHjjh(bt)#4x@ma z_{6viO<1^&rJIJnMOsD`Y-$$J;#HUx!qH96<;|Q9d1XQZ4b`<47Xk+}v)`KTJuotc z`upi4BgvZ8TYh#|2K;$IRJT%A|Ad|Pz~|io5CpS9GrRQ3Qh3rn(g-Igq_D(`Hw<RV#Xn(HxK&w2-;_}80Q*l?x3A;V<9hwH}AZ9qJQgf-b;87 zDuC!WCkfTXHFG=ya!G>9MouW!HH7Ie3P(g-Z#PM?S3=7t(n?OG3BG1R<07W_TL|y? z(wv?CV$akWU>Nr381Ib65T@7%m}7SIu}y*xwoQvWYCAOXu|+;*s27rsWu4b#?YXB5 zR&;Ae7mSpM_Gnp=ghXj5h|8B0bQI)gehX zowL<+dFju z8zVFQ7om~-YD71?CR^Pof*=#!1=TQQdc${on&+?_t+XsS8fML}5KP@vyV$YCjS^7z z$rvuUA3biHcWC?XXxG0k->@1-MKW^;X|QMS0GwLZNn>75FDK>} zNZCv!!oczHdR`BsT;|XVg^%@OE?ve^+5i+q zBLM~0zh-M;!ilB@#Er-kZW_VxAe#ohD~&eJqkuFevQqPhkXsNx=0Q}GV8x-1?|Q%sFjUsrEAQ;Hih7ez2KDFZY;O>9y&m+PMx ze{JwK*FQ(&*x<^vMQ@c9kIW+8$(qmrwbSnlhgxr*dN>`goMd&T10`6I#SviM@kM#K z55_Y@l(2e+20eLaZa}a62h7<>ceU{+ywsIL=%itLp}kZ~1B@*@fDdG;uT^4}?+QWB z*}&B=MAuJz$X=zm$3x85qF9SOw0U_FV;@K^^vuafE=!m<5`b|S@;I)bfKL|y`c$m^ zHD|xoAg01#dvNBNyIi`JqdF{$Nx5uRIzU6S?%MMAn7e&RAJ`F|as-4j!p_4pRxf%g z5y=0zvVqUd@cXCKF1^BV+f79&s~vCbH+nwS(H~A5fcJ{d^1JX5%K?{e^ef0@hBKnvgGFrrBq-hQUGnKNBe)(q=Dfv8WO<4g z@b-jPE*pKSK8Psn)c;T@ws|&m5nTe7R3WS3zHe@(?=ziH&@28vGTUSVk z__~^w!&Ttu->PZE2w{GGBe~nT{-XdxbqNn|(}h)Xo0iDeH;34EiS^Z!2@e%%c((3lR5{dsNEJnJiiNx+> z>p2rIMi3lNy+IwF!Gs?j31l}pY{)OZ&n&zo0`Y%?(KKH< zx?|T}IIy!0gh$?x$@(HtQ`#{`9u>eR=`Th`fhCh|n`p^Ln4ojgMWR$M6yNz+zu>MF z*+j1s1(r*E(S3v3Oj58KKN%Y{aT?QzzMbLPm{fTNfJvb&VU-V`XA`V^GWvURA)!+n8<$krv zB;7>!_8a1}*+XvWN2RtP?3HrwyIH4bfi!R%qxVAK*Cvf$>#(+O+z8$M9Knbmn{ygholLQ)7fSwnSfOHj}iyw|Ky}vsWs23!h zeatd0yJ)c5@~NjHKf`!u)yIK&ACD zaijS0M)X-I=V zJ#%F`D};qU`I)63^s8IoT_o9b(X5n4S48?IkuQI6+vx%cD6ayk*7K{~I_L{R-7@Wq z6+u(H;ECAO0x=nj3!dPxJ1o$U$gW(o2WI1(ce>m>K0Ydh1?TTA%$o5y=+l!oh-b5FPI-Scp`_u8?oYB5@VOT zsm{0K!{e?z*zhg)6C3o~eTS{{VY5;)&MBXMglx<3z|I?JcXkRZ8j}h7J$5n=y7y@4 z*|Cc422iI_Nn`ayAYQZ%z3lGax0{E@cSgj;qq&XeLgBaopNOq4^?-CEX`!n-h)Ldue$D!(*V~u*mwm@>j6H z#JQ`)O91!_93QFj# z5!nf5?3%T%MqCcWR^vbxQLi+us19EeDnF@)DMVUeH_`}mkVVj53zca+&~AyTvuIA* zpnYHQ_kvB_L$T_!kD+PmVZ>ok!_cw$RfBQ|G6;L@qiDPtsEU9(@eE6RLnZz!gWtmS z?4=Tj#3=3^X)k)tC>*WDFhaD*(Xq)QMH4_&3a?dU?YZB@O5qj~0ZUc#p%B3`FJ^7C zsHuT5KM|10keXB$h;yBvqd9m%TcMF}us~#;*|E)B>V&&R9K1PTQox$wlqHSgMZDg{ zC_|#aWt8SCcBl$NT%(`&qDX!?smWi;o!U=!yVV)>dUu~J5fU^_VGglBZveG~e5>2< z6lOsS1G+A7MUC}tN*lryr2(~{KRaF+ye)h`XS?>10*8BmI(>HB@~yh5As|`L z6X&r|6K04PeEChOlW5STq=TgwFLv2e6{P|+tMu-LNXw!eO(4XhsjJSJcqvu;N z@n9N9an+z$9hiHIQfYUhg78aG=}m0`(fjj&O=y$7M-~5YQPa`(+mJN}rZgSJ=0ub? zCvHxAPMkc%F+kV!s=;xnc7AffrZAUAE7P?`cIl?#LTK;g$GcC?|MSK2*d5n-h**kRw#o5I3K`;zMw#<`_#8$h zN4X7Y1v9D!XCV^DG@FD~?9=!g^I$9_D+OzJN_8PbMo#zZYZt*-{D}@C$Cx^GLk_G( z-16I8cEpzt_=TcZNl+$m19;r;9V9$vw-piI?{=k80l|DZhPtH`RrQsOGZD&FSv`H*KOW~Ow|;oz3;mgM)VF;_fo)tzZ=z^ImM z(x;D!4xYukl=wVXo!^7Zh3bAUoQ1x*9Hvt(2aKCHC0Rn=2&Po9g1RFoAhV&&KlAMw zFAL7*Qe|Q5nqwnL{QWBy0_BRX|LZVtj9OHn9t0v6bmu;f5n!l8w+O>#btD~ax~`?Wr= zS?jvom&1XBgvB1_=KhcVJeR>{Me8B%Jrjf^$vzD>p?7fM{2nw>u52j?;a1gehXglGvz)vVSm@K~|C@Sr{jpx z3=`xyJ7g3TQR+48n_+?;;iTd& z2~<01VOdGVH9POSTl)xkbRVg{vKGKJ2}5azL&(} zMNaMVVNJuy%S}uG-U=Ugy&hu6O#A?Y7764Bb8l5V;CdNQ71iitU?#;+^7U?*EM2{D zk~o2@zWz4dP~zfqVLiOluw!#m*tK$%+o@lnOe{;E-5da}e{Y25G)HP`5t8IFYF{+@Ph*FxVR8L_Ty}5ob8j8SC=c4-0-vm~35v|~Megr`NM z<~Xw5+T3UB={(KKgIV_~J-o%GRE_%rnLB)cOaE3v8DA_!BRwnq>mmbBrj?-gL0Gi2pp)!H2kt94l<(TeNaa%2*=FLquf)vM{H9t?rJHDFiktQj zOd>J=P0>^&R)POH9Q#Te`Uz(M?y z%wy(q$F3wA53m7(gRsTRZFxqEgTK{ZDuWxu3Cr^uitRH_C zaq8CtVbH|1ZI2oFh)7Hk4)&<-H|Jo-j@4YXZ2#Pl`ZQhCA$Rz(Qw<5HK2nxwH z{{ak{coo{M>oG)<+192DWoHlFZ>TW~0hlprz|LIzAd_O$tp1;;MF9oB2qBK)P|F zi3XbFbkKF}-*Ek|?M6N?fO-7EhE8 z$L=+PQ*ygq3O6d8V|HhoWHz<3$oH(TNNy zO?|?|naRu5=|Ol@y>L(Ml&Gd}wpWL~w9TDefG~=sj%h~jQEA}h(8SpbiKcIv?BDO{ zNu_8smYg;BFBwO_H00F%nwH=je{nNn_HU=Lzlh4a9 zgU<P(RnsxM_9S;sTE@l$AQWzQqIg~N|Y^+tT1!#51S3bK;#z*-gJ)-COp z%3(ZgnW)#aETI!obj0d};9^cNC|CQ&rYjTbl@6H{WbND*OMIs4FYVojisO@pP^}wZ zeJ?xq%!<)0v{@3Xv`l@%Bk!!S$yj%Cv{5vgu#-@dj>XVX)C3ZRbw>Z70h__Zq{E1Z zAwdl+LDdyFGQ#5pNL{r=&s0B}(UmY426B^klW!g;GtVN#i0>FH0pQrZ7nfFxVm#Q3 z1T5Vr!o{PnNE(bSz@ii-2SHQq-vL7`X8KMrxlB7-3EQoCab$9gUroqB;m@4))BrL_ z&3)6Sl}OYrfdmc`j=eIzi>5ftaY^v%f)FP?2-w{4gfj~^5cuRoGvM(F4MNyuRP!?3 zWi-K^9etiC^FwMR;Dy~lir4G2Io2o~Z2{N(e3@a~FXnp|n!qy0OK=sHBCDn2^ zB~m!PneX3}5UaZ-f*U>3$)@&87+fieLujpO5IM1Flw(e4i}NF4}Da$k*iINEvP=nRUWRx?{&;>8@f*my+MNv;TuNsE%Hz zk3OL}5q#h&1_fB&WMcfLJfjCMY~ZKXBU6A=i1o4-mmNE!kvS}i0>;JBTIZJVpS*qa zjnxL=AGk}V0*E?Po14zH$?PUT9~>D?mVHQ_wg}h!Yo+UIdz3WmeVjcM-BX@GSi$fOlEQ*=Om~?Jvqf0 z4zsFsi12*r@xMt&Gfjm30LgZTe`WBtEa)Vz#;XAKLwofNc$gviX6^U|f(Z+}!{)XF zsuUt9S_4RU>O%yCP!qfy&HzlEsMyIsw1@kHxp6-|CpN&`obw8B5DGp+c8~vp2WoN} zx*#;`NXEMy4Ip!z@(Vob5kYwhQDBRQJF^x$wYs5M*HSLF@_&;MQTX?F=j_Xz z3HC`e8k`$X15;mbhZlkx3v^UP^OY(>W1Db2Tq0oS8k_$Ox!sR8En#1as3#*}s+jAt zFFI9Q!!tajEuKlB1G5#Na6J6*#nW+8wf&mK41iF%Hl$M@fCJ;1FbbqML1{0W7J>L;{K&$~8B;G^{+vZ|dQP>+;)HjD zhBkz@(g%U zMpv{d*K&lVXNjc|?N;l7unzTAhRj*!DCMpP0kl`o&F=1wXU7jmmnX{#o7fDioJ38? z%R!6L?yanl6dp83;>7v8KaGM3|J31Yk;VH$0pzxo@7#`wunCIZqidtqTz8_nkk9 zje``k=L%f~MX|6GHeWo|Cdrjv{^p5@><)QQLK~4>+?ya9tA$_Ox;x{kY2ZfeO$^ zbe*Pmbo>6~(GAmPDZ*RiP@M;{0FOK?g@+8royVbhRerghok#j{SuBiy<8f59HAs+m zGsIemzQ8(+f?so+Bo0Ly1vyWoOmM5XY7;Wv)_-VvNX5eT%dMqG1>1XB(A0Hd@{<}Q zcaK5hh5sVv9y(*9zQR$&T_E-58_Ra>qK19%F7%EhFaO9zdV)3cVQ6uP9%0 z16NdIn+bHX$Zd4-K|t6|GV+l7Q8nh1sng5 z?k{5iSD{R1b6YxL<%=?|i*)0H;em)aHHEWK+LkAXUh=R3cZ&-zTv@#%IP|!cUgb3x zK;ELbsLkqQpZS^#u1n?C+=c~o=u`iH2QZ{Y1QZ+p&GH@o7sC91pV0p&a?MrM{?E;W z;%DbKidm3oQVK(&#|8^2+Mo)BUK{YnQ0bJMJT}}|yg}EX-)~G_N~u7y7G5Pc=g!IQ z&JTBl;WqY(ju4u$_(LJ9K#gPYGuF_E<<69 zy#mK07$UM751XG3MwfDk36xGigPkhagAcOZlfa2qd)5Neb~!-Gm#Z5x6Ecg~7LxTl zI1@8P``!V)@zOeaeLHB_uPia~N~UAW;j2r^m`B>%u2Ae&DfB`yb| z&YoKZh6J%Ty4*gx{QBtYUkl+~CHOZZ#tPV-Gz%%4!4#M#oKE-FU6!}@wJt&qQN@UK zy$*7}z5n{+* z`FR70j>9sM-F)F7r{|y<3MeoCIeEWbot^yB;NhZTeSX`S)+&XtcCzeyuX~RJ9e-Q@ zZH4V2mdF86sJIEKnY*%2#W3IELON?sMz`{|e>iDiP20vky-u3>bKR{tFqaSq|jJQW$1+dw_~TdfSoB6^G;cJy`2zz8Y`G zd6~+ZfN`ly*aWP-PXf0p3oO<8Z<)Rh+2yH;&*SgU%hx!;4tIoJvF;KhpT%_8^Ha&>ss?ka`^+!gmYF-uIJ$#Q5b%M>MfqaeeQ@ zX;vM=3KA(j+j3# zSW^TRiE&{8~N5qgyB#sB(NybO*8wg-LW-OF2onTO_S1eNlfOxui_=Hf~jrL1qRsdb2RnjBhL7+_jvWwuRkylrxF zOHk}oR8ubf!?UH{`X|>%@|!E#21GO0`Spe^C@CO91$3YtMk4H8VB! zG7S@RV|PFQ$ZhMlr;o?i_TnP_z23iV_xU`&-5!V!4&5{Vc`B_jknel_(7Uhk_WMp_ z@Z8}hy9VwXfUL}>37_@dwR-uzzy0E2_;U08U;6!V%o?)qceZ}1bbvL)x#Od<$ty&+ z7~D2dx!@a}^wrZi$+{;ldxw^lmFXr-L-H2Hml}o`B;sV&WCV_W-;a;yXLs@YzG_3S zQyR{1R^7JEg;|qSxvHcAzF%!u>1HQN8dyjepG=|VGB=ZDS%9rqMAZ%D|zeM06 z(rZ)gY)`eDY$|OaELp?!txX#XmGTYX*2;eAKjJ{Q4}#Cblh?y}{vKZJEdCjL{$5`0 zpnmzo`}Ogcbq9-ZbcmNYcn|dquHgPDAOZo44K>u8tWLd?fYk?8j@0QGJ(B0e^F#N4 z_kogp_q{r$tE4kO010JwbB@)>uOEq80CH#*lZTxyOe2kb<0gr+0BoYU!n7Aa+sZJaqE91}Mx(_6U@cjSf?nrUL208IEj6Zko zH?%w9dwn1exp_O}u`j6`d0Bs!gedv*P&iZsJUjiA>#}-4fuvR7;K+J<<*kBuZFri|7EV1~v=;3>!|Z zdS)^lRcI2Lsh}v6^8b4E%$Z{V1*QervgKz~Gv&Fb*(Y&4oV$4VMfGgl0I|ly@jq7S zZt84%Y~}+ivs)c~6Iv&l@n)>m7D*Yv@rlM+s3KgIPA=W=0 z=3U(dp3-C>F*Ue?GqXt(xT$##I;CcbYSGDR1290#t0~Gc{c>pjtgL#{4KHS{A!jp^B8*l@% zLp?(@ymKZ*AMQ!tIpFyEIe8%Y_2kgB`}kq_^KE{8Zpz~a@{2WV+E_kJkHeee58bb8 z^MSv8Kh9n^uhWCTjQM1h$y&K-8^~{ThzgO^BbwL&Yo7-WNhV<1KFv%948*R1p1yCv`#!Z9oSET!2PVP$UTY6C;_`H>0TgwsR1A$Qw*O zc&5@$4G`Ip?*`!jMEp-DTjI&MLq6#N>Yt^VMpQY*sFW3x%k~Io07#9X-iU8Nxa`9= zEkTy8N{X-sh6OcKII&I( zm1F0SFvsf+RI%d9IVnlxig5NE$l(4ZpF1Du`dEXAVW*vT%9D@aUwjrqmGvg?Q0+K7 z=}q8c)^0FV8mFYEJZ%CuoV3A$c1dXPARS;ihL*WpQkcI7{tSyPJu7JrlFO@comUV*YQr3i8=m$y zc&$OTyksuuD1%lh1E1hB0JL>*V#QRRURLw&n3J$fq&W>ypCCh|D*^J5GC-6di2&q=W~I~eUwdBk-Pkpp5wnm}x7>}&$e8oH#eBjCuunCl1ny#-`$MyQlL zza>@_L}d>iV;SIFR3~%{6sLKIO^95oZ=uIDN#cjZv=J?hC-l(qO=3A<2goLHDTTVI{S*leK3l@4Y%JfnnW7%?j+m!7 zsKw(0&5|)(RsI4ur7O z2YfH@Zo4%_(>%i$Y(OlD(@lbTY(6hGW4B`dS&QTgZZ1Ja!M{BcRW@)h?L(k&5g5p> z5@=|Ld0|41gu2&w>ap_+7eHxVIk^ZiFqRZItj_u+k@^dCiWCXvM;aHrl&q~H%rQKM zg$=>ZVQ1lN&&e?+&+jSxq`ET~(sNiA7lEId_NG{kU!ac!xesr3G4Bcc`mm*BK7t{8 zP*sQKQuQO)OB^&<2A*-;xHH59D|03N7sm6@YGu=YC<3|rOI9Iknv(HtS)9|tWVt1P z8bf?YzWR!PH>*4w>D@|c&>QcvC8GHLHxY7BN@zG-A=EQaw$x;~!y?~^=;B*pJ^onw z-4K<0xy32onZuMm9tM7Vd_4SoUh!av;ldlkIq!IW1LEW7=J;tm3aYlogR&saGqKB5Cjx?}bc8z^Q6d$1kgrrl2xj+X}Vz+^j^>6OW^0LULTXQ|8Y!9aS$ zdr(Yon{5GE?P*F+M}f-;;dV56a7-*iTrlRnA1d=R0TTf(n|WVIz9&f}VV0GT$CiLl z$9mIE*7D_tdP9tv641K}|KW_UG7W$vKmcR{Rd?JiH~pu+KKoQ9>%y;tss$4Mf*v2W zGqGSb=1TN?x9~TFxnSEfItrbQ@Zze^va7(>34Doo73loBZC-z{3F=;@I z6ZlP;62RH;J2eeXu*-7%&u)Cmu_g2KA8!H}!|ilBzxfiQ>C&e+_YzlW)!x>`3ta={ zeU_ZV!D0eK(=!z`VX{etv|P9OK#GZ)Q@N>9H4;&cf*NTO+z%*f3cQv^0eh36>}7!> zSFRJ>1mfCNwT^lP6muOrW&egjAiqd34D59Zs$>EFx@JHw=u$H%ievV~DgdteO$q_a z^#uFtiAkFowgs6G$!zlwLKB&W1Rb~5Ed}@@U`7_?#4J#_>HLD4CdWljsL8ea_4cJa zz96(GBG%?U{;@LIsiFTo?N##_856!`P%^XA@ALIla)*+a=lf7$vu~|GNTGRKPxE;F zOX@ZL=iaaz%n$NArG-G95j0%?Fs(E8L1;CM(waTMvi?m^&r%co7ODW4Ei=8ot^SE` zj7KN7>1goN&q{Q)NMt{6G+EsXwa{}%0G#@ONhJF?vl~6T(4aI7bV`YY31~|Ryed+w zL6@m@`2PLIDZ!d?Ke0lB2#gNu#RGcWD+Z@Ig9 zeZ2hP;PLpd#CLgam}zZR|A{}WitF1k0IK2~6Ord>jOsnFIgTPSYB)GsS-jckKD&&D zA~ITO1z`mp=u=O*9VMyrKv~a3L31OeBA4hj#NVX|mbgvB@A3GtMP`vz1Q4-Ia^I@7 zpLsgXd2R|3(ex0qkdpur^40QFnxysYAYy-&{m}avmvV{zo^J7TXQfiYmX#9U29R}S z>*vG}mTS04PG-D|gcK}}%}c`2B3W`KxfUoRJxAoOC)gTQ0{9_sYc=~#W>Qf{vg3z? zJ1qATg!^@u?z*v{G>lDyHWUpo>Y|0Nn+)a(c0UC1zdI+$uW)=vUXG@I{ zzUlUd9Zsx^&GZsZkmLM}NKQJUkceY1=&cTaREKslcUHa@*R>(I3rS?Sn*awG+4($~ zZ?I1N?l}G1D`71ACZmCMisO&^!J%9<1T)}v7j(I5nv#4?f5-`d`3hlxD&#lF6q;lZ zih>}>P-Q=BC(Z$is%*t#z|S^n;|2Gr>LtJFkZHypC+jAJ$tN(=u-59pzlpVIn^e`( zKdzD>iR(gkPUyGZU_89NQ_s{{L)+C@?|v&0@x>5ad{2gAYB3I=Q7J}8eKY1o+I5Pk zG+SJYBmL?|pVlF#F%tG~H>v0l-%UT|$4JD~g4ib)&Fh5<^#bhNkw13YD^`=(pz(&^ z09>OkGiu}Ukf2+!qF9g2{76Jgew;voT#n{CKZ!8&JgT3PU6XBe?llWKTVwID(2(G$ z^5Wxdq`WjkXueS0(W4mBNzmf{j{&iQ!Sm`I6a!S|00{_<2G>WKnZLauatUI)H|0OVJV z1q zoubd=A|u6BPCg#gk+99qyYM*)%A+46lgkPLm_Qs8{p)+eHpiq^c#WuCT|UOI ziqJkac}l3`N%mm_?AQ+p9q2NhR+pjY&6wRo84pGqsgr0*MPxU{$rgbU2?KEf^?CJc zQZW>QV{?69K>V3zqa@9Uf~+ibTeg;vNk!5V!z{YR8cU|^%H&ennUyCxQlTdkUuXA1 zg@(uwZ5OtQ^wHjT=0Cu4pDq;)Tx0I#%*z1XQhb*JkkV5W;v2OgzYM zG+tf?JL2h$sZF|3!q|@Rg@;4Gy;zBBScbav2r*ty2(E@T!Qty`+t>`gI|jW2xw~Ez z62htGVcp$1!!4j-P7Bl`HE?+)7My0t_j2c!oJHXI+?~Vsnn-c8(;W4HE6!HqQJo7X z6r?W*PZ+nLtIqWNT``{LMNM7yVptqlZcOkOXK3OsV&-pp1I-=p0rP|8cbMODQBkExjjJt{^^8wVJLj5 z5>-+pKO!{iTwWMjr~u_02|06oY`39nu(R)Tjq)JWK#z*HB}BMc6erX3o0&mG0dmlW zkwZ{>GnL#x(V7eFoQkzGLQ!MqfPTkdqkPfur%uJ*?Dv6A&wB{1QZ|I<2kvtcY|}nd zAu=z6Lp&Ix!`*XA=DAnf)T^Ad^Lz7Bo=%@5M=a>d2%|aG5 zDcB%g{_cNw!`Z~<(28m=q6hSd5sLm64mM9&y{Rt|F$pE(YenNuAf%K2R{xSk%wU~^ z&XPq_S9;`ErYB(Nz=sbfo^nR4H?#ZtuYBTr|2>8~%JTL^-Gj>|o`uM zqnjF=x~TJ}D9uk&*fc+De0&QTKkF={OhZnEM_e$V9c@2>y1@gxCW_G!@!wlSSJt>U ziRqEfOB*7;MMYTpeVY=;+Kr8C(U%q9+Bgq3P)ojB9Zq~_C+#|TlYPSGq*-C+LB;X% zT0BE(m;@XiVX(r+?H$?Ch!Xp+r^-~>pa2K?5A!VsiF?zSaXNiE#us7(a?6JD0Ih$N zV9v=5%&Hq~7}g6%wjLbVukgIP`4)p=+gmf;mUYr=lcEolq(>zu<-r)zNGf!$NDmLH zmJaxD^LEjT`zWqMAbHSU#bQ>oTntzvVg$u7ZU>PESyu%jL*moM~AmBg1#0H=& zr)0V}3Q&mod0MChc?aA_y>^t4W;f`c{5hqQ{Mw&9ceU)x5rVNP!)Z}8LwNX;m3!08 zD~&gTOqxdm+YKR7{6;n^5d>R0Jx#)D)bJd>&n0IWxviB6AwyoRzU~wT%wg>Lk!sQq!~k=4VZDuzm5f08Mj|3uSq-n6H!qSV@3K0*Pm!$ z-XonGYV$mVj)j{*mm0fkvDXfPiR}~iNQy#Q7J@LwfO`;ep+Bk1jnl0#+e9ss?Lzd~ zGGa&U%YYpDy`7f%&38-SCDuC;T#~bsR9o3DbgErtnLLWOvJ>LA!$)j4y`Gv~UwEFA zp2tA&_m)l{?$Uu!unykY0VdJ>x5oficd*9UnSstC1H)t;#xgt%gI?qX+{NrpGeG@E5AZp|bygkNZdeDZm(nMA-@M`64{L{vE<} z_G=oNy8A_~GL=PK0m7{E35Z+4Yp|*~;_cMv88xEh0s=r0+6Qd`UKth$3xMr09VXSN z*bD|V7$ZRF9Sy5z3^$_rI-<$xlbR$sgm@w>8t~#{D9bCkljj)L5n~Fuu3E#ks8>J~ z6#f&tA+`NF>(L9~bCXmU>Wp)gk;FUs!IIb4alY?`i!kU2G&=ABKy#PiG zI$0&y3rPgzU+!?IXSoq5HAf~bH-$EP0~HjLl>}^(-R>*nO65M=ZzD8!chACmW8sa- zlKaXI!`u#Ru+y&l-r8Icv0ZVr5e4F-RNcXHNLgEX$<}`Y;snmNH{Q>Q5`b-D$id{? zAs>>-@o!cTEBYo0v>(t~nPeBuYkVzt84N^{G!tghTnt-}haXZV2&8s{HC=8s(c&*) z#;}R<7e*9Nx^IvtKr4bQb%(HTeZ zVh@u=MQQj%;CYc{fWKWZ;kM)oUsntSEPL)1L)$jkU<}hr3xV=xhY%nRh^Bf%^UxEj z)&5Y`e2;=dN64q&^dQRby7~`RtXUw@K5U;P_qaMJS)QW%e#|acZooOHhIDWtnuZOqJh(5uKNmUjOT^O?g5`0W_W8_ z!sX2{>rPKxzTnLO`T@jZSV9*EloaCZgq@k9{Iu-~@A9qI9G79>oL zLDt?jW!Me@WE-))9Tju?8tlbGR)$fD-dIxt7rFen&Ltx39tBScbbL1;fUi3u_BS4?Hg5l3=2bI!V zkt71MmHHd5W4w>gdyU;r4)xeS5~Y#xihK~qN)4S%j$^u?yqYT(xlEB_v$s={!A4GH| zXlnXz|L?z@W(#F}0uAgZJ2x<|r?{sf zwi!jLG_pEzg#z@|GD){4(EDA_?*5UX{NG)B1sx*0sZqF!9snkBDSRQ=smz`dl(^ZX zrt|Ky|F9R=#kPr1z7NlcQ8y>wr9;AeA$2r4BQi4BwD=k8v0zf!i+m`<0>C^HGpG|| zwUEoDwwl+FzFb2LKdw@a2@|*q3-MIEiGjmm=~E!82o&UrT^W2A!7^c=Fx`cz!$0Pp ziR;leUG_8y&fS>vp{yd^X1=%R0}vD+wWZjO?zlpMOF#*IQ%FXB;NVI8hyf0Y zs+X#;zsHynWzKX;mS7;XfcIPVv@}dyg+o=Z268>6uA|nO%d;9vp0xy2t$Ewpgb-W1K!U-`p?eu>Y?OLKBxX`g)d<`|Z` z<|sKLV5gK)1*i<}WjpI6?7L$GMm69j_V)5VO*qF+~JM*I9x9qdy8CQ!LBMSXkFiARIYUy(!RmmUJe9;B8xiIr3m5aY zAMdON+&LxJ>e{ENyNbx9m@KBa0Z_w!@v)&;HUg=2?BpTQ>QIPeIT5zW<)+waV(?We z(RRJ87TGF3vuiMNRagS!7?)F2t9I=y0yfQ<4^_#B;P;B=yIl<9ZkLxOnyN=<5nY#R z-7O9lwl}yQ+4;f~y=0fQ*VPzs9+CJ8pjW&&LavEqhcXc4rMbpmh<>KRa zK~#r}Zq_83m1_3{5zf0unB)87sO*Rvrz?E^aspbtvi4PdzP7W2fJ^sC zAb-x{Uy$(`7mE!zgPQv&Zs+723#&p1ZVu{}_eHC`N!Y<8*aL=Wh_=3ca|2muN;^SY zMbhuwUrV`YXO2&-;Ax68_*olEELrVY9S*Q@FwFbDmWIR;CFI*oyu)=&fZ%Ac=AJzG z*APe;u>0d=47Zn?pF13-@M5FYzfa3%Z{sky)i+}61acD)V~c|=fp@b5*WkzLsP5m1 z;NfQcgD?;JQ|N~FVzP8>9x8J5ll2;gbRD{K>N)<+wss`97=Uv-)k)*zGeQ3so=@v! zt{N)&LgK%{H$Q)lj4N476sXP$msyda^Af@hz>5uMiy3goUoUf;d)_rUhDJXFH$R^& zM^#1^<1SA5EPlRD=^5%cT!NaQrW3`7KM5D1H!OQ=;JU4M599vxHx70zETXw_a-+3d zh`1hU5skv9;BNDxvQBkZr0^=1imFmA$Eb>~9_50mEgb=tMn=gMKJC<7aD-6{Rc#P7 zQ8WGD!%fKDZ3fsO ztB$W{m*CrYUgdEK_0{xG&m5-<(I2q~7YZav+P-ZjN{R$Rj;-QhE|p-QzKV>(2F3=t zFr|EwBh;}>m$AB+l4yaqo< zQ(BaT?6lFqGScOeHUR@QGd&q<;Fh|rD()~Q8Ip9D7A5I_ddM>xg5NV3p++oNh5#nD zqw6o}3Cu>Fu_dyr+G7R9=2tZjt3~M@-$WQ%CX#p*IVu_19L~U=!8&o3VO%B($Ads`Mu;8wF3EVy5h`|1XMgM{ZlFTO(e{zwM(--35*-C%P2evUkgU)l zuxN=E-M>aKD|&Z;jY_GHlz%spmleg;7OBLItUH}J-BpGvOt3TAh6#6Zm?u~Sik+%T z#k`mMYP1?TVb$BVJ{W5SuFNA-ANXp4Z)gFqh>&puiOEBItORNzW6&Cz06CKk~K6_u4QN87EeICKuDg{A=g2Ur#HI)-#f z-{^HDjiWxFZU`3scL|+&F-?Y=-@yINK>*q?zW&&<(N1igMjoot6e&YWQ#a=}u@07{ z3eX%c>K@7K3>j5CDplU{$|WUTsM#BBEC(~y9hu%(>}RKZj^HuY01HyVNn=*q5>HJy zA~4`INGZn}XaaNrL2SE1jo%_+#7k@D^#h7*Dk--sDWr3#AU6Y%Nwhw|;D{uTzz5?&-|;_}M`{+ZywjQQxiA$5fz66ABPTB)$Ra-i6sSY0A#a zXIm9Vs23Y1kuE&tY3}Sv+GJbwf|nj#zUgSwg6*BUK~x7SZ`htG9?Cgp@A`K+h2B_^ zTc1$+t+hA%>gIUe&Zt%WW1!EZLZ~FVxm}dsXRt-mWxbWJeUg3&(1=~_TM<-sCclZT zNrtS0OE(6h>|31E?-Wq;swcvKfI?{ar{q>al9=H4qmB7uvlYDE_51m ziL_3*WLxkP<5A2{*53#9P7drT95VY?QlJmJM}ZMK)!48&g#m(vqDb>cMLv^R5!=ww z-_!blz$3YyeqWcz_4fY0u))fEAVt@YpWns%IR{R2>@paKc2A+UZqw!-qk<2SK8Su# zH*fMXNF-n|zR=p9d>R419@fq0W#yaCe`fk^+?n@+IV)(sq^?QU6dK{hMh0(5LI2E@ zOhb7oWg||@nj~~yNuo%cg}CXhZQWSF?eRio>aQK)C<=K2y>9ybYMs00MT(v7Axa1q zl0VVtheWFrTZtH{IE{`qNKN-ex{GE)BB8BVF+ z>zH&=)Kp!{t7!jar^BBv@`|;w(tnO3wO*EOg?!)DW zPMy1eh8q3SkbFj56HE!B?x}557_L^uPeafk9z2@H>J!Uu5=in<#8OdhPttFpsiOZ! z8Nqdwl#{XBDgS*L(&aLuHThdZ6eEi%iIQ3cOTsPP3<*K{r|78>b+c$naj`UpPK@4r zO4kP&W;j+T$}nHPGE3*R(pnO{Bj(1_87o1@RHKIwq6`i73kDNDWp;23VTQPZGYnbg zKTS4C%l1Yf3d7#8y8|_ReppJqfnhM}B(yS(+s0(`B>MXsa(xh=avU-6OvI78wsZCz z5Cj+bd}n9cl?#M*DB@-PVlSt$5e6@cwI!Tq%3UbMt|N})h`Ds17R z6~O{zrHuOSKJSOj-Q#4`Pq}DfYt#ZjE;OU-3NO;vI0>EtK>N9q_N@`PS_BJfqH{PT zTB_CHhZE_vBmLbWX-8dSE!!I7-G}?B@Y@3YAv`%};!6pxYhOJIYco&q2rnWgHS{~#s{Y%c^ z+6JF%wIB3=$OIxUgF%hZ<6o-5irwFYd@E`KZvkR@4|JM%9wq~Tbl0(jirCM2d$!eQ z1OH;k_@>9mn=n#7^AdMDcxb#9Pvdv!`o&HIM%L1&;J`!d2ppg83oCf`!o3~DS|+l; z^L1Tz@a*?%LA^dcfN>`2I#Ek0gsA`tzR+H&hY-f899VFf%@QeAnN|9wb6^)DofGJm zxU29DL>Vn7KQ?=w<|QIx1K$1^_sXZh`hg7s>SJOT(&S31?0Q*|`ph;5oNAq9kQfP` zwy^T)jIy3;!j|U1%tQsME-;xM+l?er?-gy0G?lwaM_o5jQw!x5s$Hds0)C!)i<=P- z1jn_m2v`VNPa!o23ff#?^&i?*6>1DtCjpip?}bRuA+Q%!{SjLBF6o41AF4z@9>?0k z&G#-2>PFDLCC_voO6?fl3%pd-SjXdqAw}tR%a}zriDNW|s5?e$PMg6_H*dPN3qt9Q zn>rOq`Q7{lkKQR&SSCtS0Y^@HNeeANJyokR;>tTxP@6T6Q35Jl7f?**1W(nV2F3uv zipMHlxW7*9kp$M4G_f5I-+jcf=>u{PvNxoz$qb}Pv62k%of#g+|Jw9GX}!}IM&kKy zl>gK&_k&y`k3&oxUSG0`z})GUD!sabVZgt?Vx=$$O)LLXYf)E?Mw+^9+BhZ7Gg|f8 zR-BNde^8Q(SXLI%c~5{^m0U4H4S1(mG#J?ilU6NX0rhJ8z^g@)z^Kf%Oi9zVi_I{I z;jwiMy)?2X05G7yo2%9@0X$o!hoA|IQ2nWG_O}PHXsBkR%16rI1AuZx9ic{K7ptex zqBG+{IhaARHygdVH8zU~nbI|Zkrd`R8)~Y&Lr5{;5HaMTK=qWF!VaTSzr}aRotkC* zCY@5Sx`+!?3%=u`|F(d3z((+}s+<1t z%m1~*T_!{o-KB9^aJLvGlr7SlCZ3QRxel}W z8Vy9;;G+XBd!-9`@5?gUj zfGj>OQ5o0`D!H)Z5FpYHWZr*CS2aIG<&?(bbJgw6r?5Mm*c0<;3%HJ&GodAcc`3@- z|3LXB-?NV34gY=U)9YvXJHm;UKtO5Ob>ezzpHIKx$>q~uc+^M$)~!{9OrYijAt<#z zngJaOYu^`WO6fJu=iq(c5)Tmy?ft%xHu8;WnCcu@7@c-#AUt2-VUCKDK>&0Hn@4f< zeyX(Fe3T&1nWuDGZY9QV%mN-XAi9$rFpwIriV4)kvtrt^L(41W?MvbEr>;lXbG^kw zHxfB-vuB*_-@Wq44l|6^bS)9_lf$-_l*%-;Y;suMM5LYv9?=6w zhXGS&Jn%Ns^PzfBo}9lja=O*=x5rs-Iu~(O0n3DN z^;io=(Y2e(Ez@7?JDju?_gP(L{Vb_O?l0-6L`5U8bZX!|M8epB6V9US4SH0l#KWz1 zv#{>tYf-|9G?eyfJ~DRWAckCeRg0()aK2Hc&Z>8LSmr4`S=EU5sx156gssTQ+ujL@ zQ(2edKG|aDsFI+jG&puFKWLkQ~ z_zM!QpCpD@qCK&ZDOzj78hr9qgkpcy{0*}8U%i=6Qx6)U-;3Z zU+91!r^4hwgJ%hgt&nd>*4Ojr;`RDH(+`v;vv+b41Qsg*JMDiLgvIysD{SHM2;eao ziQ)@ySpuc}!8*wvnnTrfmMTsQ7%Zxg6SE!v{`&8go)Wp7K(F%s%KS2winNIQhF zEiOOCgU0`BAMYLU0{MpeoHI4QM8GsISfT?bF=xgDrwsil?EXp*jmM&ert4&%+;kH_ zV(5lJdtj~(D{K&9gUOp~Il;lq&yqi+QnO8?_ROKRE~lt>&ncOJm^)%~JN~|Pmw!lj zr@BSx2DrLz{opu8fJ}wCjw-R8wprEFD3x@SQoaa$9wpqs&M5c~IG&kCizOXyr4E*I zzZiR0e9~p(EjjvH!QVQ*>J_~#$(4G)&LypC>ax*6h3@`SP>&K>&l-T)T_iy%kbsp$ z>?mwB-WA;1pR^o{iVfeJ2zj?5&>GPtcyDoHKUijA(3VPj7fhBo42DkQM_BoRvJxQC zVHACG|5Uw@8qT5(SVT@VZZ<|`vyIhjy7DJ&)GE?vAW4$I)1V9jH*B`CKO*Ma!RX!h zkt5rv{U;)w9kw@0)_4HZdF2WY?pRBgm?e7EeSW8)90S;rqMQm-@xWra(rwOV$+vn<>NepGrjpPFfQRyhB)ueAV=yD$c}2RJRESlr_oZ zjZ32cW5qM$<4f5&a^#qr{^oOOaQ|sR=-|$;%af%HdG0%56(Z&h7f`U&lmb20@(_hW zWa-|5^nD$ZQ0$QOFgQV7D_gqFL;2hKYk`ExexFpFu)+)H-kt&UV;S6L?#G+694DMT z;AOu+>9)Fuww=B_@TZAE5i{>)L7Co9nd?hI(P-`Vq9Vhb((2 zb>$zD8rExrJ2Mnc$Bl2%Cu@Zu27_`qHD2i^1nld@ysaNRGV;Cz`TbN44LZL}*Y;<& z$uTqWuS&3Y361r5`Sm0o08zCe z?LnOjc$Vaq9*sPZWTR{|cMt0cpPyihl6?78eL^%Q2aC3ThFD#p0a-`U8*9`>=JdjZ z^=P8@Un#6Th@w{a65?s(qI=3-GMPb?--SKboJIIeA9eQ+)V+y>lGlOJs+sx|d(CKl z#A}PW3it}YoKWP2t2?Qy0!0Cbd4iv|99L?f*K3Ws2JSj)_2w>~yZk=&H%`|NCpXS9 zCFU|82ci8*DDmL#C*Swd_*dL^6;g9gL|cdDzQOlOchx#k*QI18$l5T&o&gE za`?pgM^TN2m`for==^=Y@G!!riCY3%&C~XkEGviM%gwZPVE()1ut$wAmG)oRM?&q~ z>+H%U-+E;eZ%C5#M$EY)9hBhI*ilY0*kYLFY(}(&2wm24*djoJ@QgAB2w1`@G=lms zl)V*=ySUcHd?E9d4(axsN)9PrU3su#nCAT^s1?-IZ}e*vmdVfB;qm?b{_ZYtzjRB* z?+FPuo?dPIWV{}J0c|FJKB<0noJp+pDbLh3l!QjR_^`9?``HD>hyN&DzPD`F$@9xu zFR0(K_6iG;4KPGKsxR^4|C`R4fg^Zev3Fxwf)ok*iE7_Mg@qywe=un%4SLTCK@Lr7 z9*6Zc}$S2!$cst&{5<8!#4!4(G!oL{t_3YVuWoBL~Rg~=MYRwa>hd%`JO(5b6Cnx z^*t@GALGA%?A7X%?*aX0&};$BLjW zBc_b33se(=GHNGf&Ts~8=U!)3B$CqWJ_vyxQ)pBzF8|@ByHjl%X;88NT+JaKwfa4S&A@ z%o4sz9x+oA65_fDl&cf%3S$>MZ=Jc4K+Xt$M?!=mpvdTU7$k{&c&^S{mv#qqiFl)e zb!XtBTyAQ= z5C8z|=>Ko_?SG@7H5z{QTVhDxSwAS+ZQ&Ba38ZJ@QSGw>ia0AVhafFE0Aa$>s2zo^ zWE~(K$<-`3=6&p4BrVA&AmBO(B!`Y>uQOX28<==_*SI+Kd9y|6G!a7sf!`u?$a>T6 zH0v6q5fCj@77t4ELcMe*-SgK%mY7gv%&98g_3PXm+go3XvrQ7y6N@uOcjAAOGs^SM zZPCb7N&YnzoB0i18#LU}rDj?ST6=|osq}E>kp^mpB$jy3pm|4tVyHQlqJt`gP$`Oj z1lFJ_Me%*3(~S#JxvL44E|@o(WGvPzZAYG`kAUj09b#)LZHH?w@MWpGgZK+gixM^} zXwWb(Fpf8cFPlTc+qc0w-4F$k97#6XCZQLyu@MNXLwkaZF=;;vJ<4d8fks^+LuDZ| zZIP;Jn>h?=l&Mxs z`1l{$>~%|;RJ>)_YnJ$Vz+3~6z1OrPkesq3e+U&9DrojgnKnp9fup50f`H5mZ)&6i zg9(#NI0BB1!yzhg)2WUQx}*cpjZ=jHDsEy-BopSXYtV|AEo%{3>zzNF1&WA-#t2WRJ&YbJ{o=F!fGDrwozOb{BNfFwsKQ zs!|EtANQ88#csDarUVUfJm=cf9FotDcy+c^qn=Ooy3e()ilTYU?X)16J#2k-1f{E& z-1`-%jDDdB&NF2`)+?a+Y7vl5 zYubwT=!co=f+0{k|FK=qtY?eJieR!Zeo{O3?AKEV&7pS_Dz%rJeizaj#m|}pJ#50J z@EM(QHP%JN6dEoh3;_emplp#z9J7l|A)~_OCo%Pk*k=&iFNc9P)3eK{8^ zQHY9f*cS7cP?Wr_VX~eaZD+vc1^TvKTcV5RI=M!-au^$gdlC9dsZYI4P|gtQf&+j$ zn@jt`tHPcj0{kk5R#JP%(kON&zljhRZKvz?rfB{;Awa`Kg%@s-TdyKo9;htWKrdT9 zV>rGnExKV)J-vEtDQ8)4^JKZ7`&+g*TQ?h8H(S?D9*x`SRuChiU*|Ls3b?h3nJ~L# ze;&=nRaaVe)K>gxBRxVEPyBKE_t4q%=dNjug3#viW3QKBv4O9!`X3#GWcFKf( z#mg$x6+nDY|4Dx>&@Ce0ZGA93>RY>2^Pk3%GXf}do+wc#t=ucnFYiWZSVo`a?8LRy zC~!FoWpygPUQ6A*-Jt-T5G`aO(&yqVr|!_0lqG zKacORv8T8)W&7rmBy=N6Rn=Q1PktZX=WgP~@(HB~O5`UaRs&`|6eK{33a>T$;h!yg`F^f5; zYf0jj6RDT@TCZJO?XMpexAWVB++#m;lRb1mk2BGcUg!GEnUAd(Cj;W{Zg|)B0{?(6 zUs<(sj`w53`^K7}&qTwT(QK7SQyfplJc=@DZnWksbS{*0dx;m$($&&a*2Kn0*V5kJ z@58O#fa5KKXa)?R9>FY~!(am=iR9F$nm4Vms$E`b79ax%e>p&RFA|62; z#jo{bRLE|baFxpz!rvkz;sbD{bak_QI)_LGMdYh2)jxx~y+*SdET!uOrK{T-%R=Hr zAn^Inud*(}R-L5w{d^e-s%FK0br`QZobU%CM}{)YLYY-Sy7or1x@Hv4l>d0&(-eYV z^Nx`o(71ARQ12OzGHc6Gz<@ugOrvD4I9?A&X^>^98Ca&TLy*|6aba`?f0)RI{4MOd z(mQQrHV{e2wkFaClYPD?Z?mAVT=l3kQ7%{_ETW@l|5||sNK9LpK_dE*mO`QMvseJH z3M*dXzShrIg#ouv*(N`p%TIG2dupytk9(s|2t+exKn57#u0KRJdlgI)WxY#e<0%?u z3Ka=qb|H9ou+>0KV#N%({wa*K& z!4|~lv!Q^ogYzkaN9_8XxdSX!AT6;l;g;|vO7$i4$+Z2$ zRn#MrvHb%4>9fL)KuDR1AV}+nzUXGNC%|x9S=^yKf8DKk1KNupfzA)Zrj5MiC))Kd zzu{J(SSh654=+XkU1Kp0Ntdf?7u(ih!AFJbgMrj))>RZ^5o?qo-JQZVm9LYf*in!r ze#75gHUMxcj@_Ezi-^aX+!5|i`0{1d=dVD~6idrKce{V{EadAH(#s9JVb%0mDsE+C zF}-!U%0XvQ*TWh{e-Ff%E9SgJ783FRtbw)F_i9&@Go(RPDSidA2#4aPza?@4B3n7Srf! zoZhyh^1NohIUhOWunz71F3{0@J7BVB40_&D*HQ+S$uxw@WPf%yzxZ8=T|v` zN-6-*nUmvH0-NFoge+&aBSp*g2{?NIm5l(Gp*iHu3`x!1?K`0><}L$eCsZ?mU&xw83Daa= zlx0zlL^Q2ZLN^?-|A-QwAnC@l5-@9Jp{q_`WFpCDsagM=p6jwc8I?XTT!a?v#MF+x z!MpK~CQU88Z9d=FC2zygm%$G`nK-j(gvd`#o>;1(Qlg)^Gdcb)g(QS%>|-T!%%NCK zlpo3Ku8Ss@nw*Ul0SffNqoJQ-7Er<#jO4fTsup)9Lg31Rm|wP}xfQZLnV*qb)~Ds! z8fZ4;&_XLtkFsW!>tP>BwGZb*4-x#(;#%Ynf7^7lve}$XQ1pO2&?KMgdGHi!G_G>W z7D@L4Mr6K*hbnUD%OAj<$r{x@J)wIC_#yW5pZ<6Z`JpELSx>MDV4hH?cTM=SnrTj;`TkI25%VIg~IE*2|yn_ zp*_C;acKmu@OE7kqI0t+a!_M+A&Y~&i1ynnYy*VN6oTN#^~D})QgpmB#~ za7Plx<~AV3%X4`A^Y^~swp{b9)Dz7$A)woMhmEXy4XU@p;lb*t-NeFwJ)-dUKd%pN z&nHwQ1^~dM5&!`5f0Z~|+S^zf{h#|Y!(*+yE!LWMpzdtOjtL0{!_kE=Qy*oJEe&dn zz8~}EsjDosl&M&d;QYdX5ccakSCoe}<1cx+`T|beBA3VK^V!|ym1|pVZxh~^C!-fm zL)-Xl#f|1SRvJY%Nv_C>NIth40gx-|qt5P#2ehqD@8G09 zd9xv1CaI>X_b#i6D6R=!ZAWI=Fdv+B-K=WKH^P>Nkv-UN9kHo>$$dYdg8kzqw#}0% z`k@kOmbz+$H=;_I`7dThGbM&HBco=dCu2gJSco)KOkv80qTVQ10NVu|T+aFyrL(#< zKG9ba@gD2J4%z6ylk~t^2-8z_cl}TeguzbV`nraaV-SjPiDaP;-Up*0G0q?9g;6lCkiCIYKr$q ze2UWHkN>hsB7cZsyZpO_-7OSAyx(pGcjyABb zH|l3s0-M4oJo?zt+Z~-8UnpF3E7CSE2kuA_Cjn$4iS?DH{}pyDh~Kb$!4~Okq?QnV zwpu${xtk|+!nYsf?*XU7LQ97aydqLN}i z3&NkKUN9pJZ^}hUj5rYfY4L5i(lck6)cSG&J(y5ZYj-`CLc6KPasdpm0wB2E>})*y zU~X!%`cg2i6=1_B37eZxtfbloV~_j?w}!dqR%%t zKt2b9Ac!3?fIksl^-xk`K-gp7jl76166;&@DI;oj27G zrHDU@s{!6rBZvUQOMjwnfMY&qUI#ueyFM{Tfmyq(heU+1Ns5e|gQ`O8Lp)syurf@$ zbKh0osY7xeU3*)>nDN=+HQ}C#%=C_mo~Dx8?#9x7ef_*0Ur%)*w7~H|1Ym}@qKY2+ zV&^LIJdo+(hi~J!xeM$`e5Icx9h9T?D{UnT^!t8TQ80qPscQ%i5yZ2yjO@+N@PSgT z!3NN2(#*xYUGJ?w=kV1Xg7G2C(5;1>|ciz80 z9I6%cwDIgjUmG~pIHzk)v&Lv#M zQL_G}8S93c*2>0?r%(!;$?_N>rG}M5wdpT-2jauCSzs=Qy(}5UphN+V06Y|lM@A{f zJVHYq{d7N=3W+E0!Xpu~q#X!4m)RQa)DWU}1gwJ=6N4LYkQ9U{63Q^|{f}5xs>6c_ zp}rJqE9#h~``l958Y7t=+hBxtz*(p|f=%bqWI)@yzA&&mr-8DR|4=n%>h~kN@xBD( zi?YbF8T9{w+<-(r==akPMQ}{hrcXLy?k7dSmL1^zA^O~TC$l2>3Wk9i+(KKWM1qF) z4-#{sts*;LjJ%Vf@x%2l;hB38@rP|@wOK~S{a z5S9|D0&^JB0g_x$4Sg`pi@gkSP(PuVY|MNg=Lk5m#dFe8LUpRC=6P;y7wM-L1*@I_ zU>j_Y7)+7SX;D5l)15APC!&@cgVKU_NEY;jv&l`HuR#jf&b5mZ$gF?)c!diU2tWSF zZI{a8a{h?3!fI(VF1*bu(MggD^n4bRrxioPcIEH)5(~FcKa`hYmvqVw9_?mKuq;|s z*juK_0sKdGXNs#ORJ9TGFS6R4Risi(bQ;Jg&#Vy+GK81?^c}#b!NsrzXf1Vt`=I*r zSJ<#*ey7gKCng!*l%#5kNUeW5(wC#7oBM?Y+4)_h`(%HQ|ZL zGgTBIwFq+_2&~B-qc3F6Ikiw*{xq5gU!a$;CL^TiG#)*|TETnat|h{30W_X~ zsXK0-DU9THCBaf7^~e-4zJr3`M2I#RxJ_j3X9TRA!P2Sl=fd&Nz+}YcvFk#+RXm;1 z5)wsj(72ElPxED9)@>HB@@^&^HljOqFNzD+Zj^eop!+7%9=S|xm%v{+0tyM{${Y^? z;2Ma!f;^%an;(G)#PHRJACO)(K=A9fm;J!k7Vrz$ta{ z$Pb8WY{>T#@ED2p1a;$4L4J>Z*PySjRTZ_EIbqhr#hUWOWk6bvE#gcWHQ5f1c}Gv;JLXqWr%FpI?Ff`c_&e9IoEIT0 zjUgjZ{xp!WiNyGS4qj=m-eTg4Ja8qA{!L$O2g0{KV;;?kIn~`9dR22{+tv|Dbw~u@D?qf~OCearEuX{Y3e!}B z5kjOEkT-TjoRskVAV9<9=b>jq-*+PWrO=yImD5HbS3p^4QB;Emr611Cf}qF|Ee2w*jf37KAq~;N0i<{gahvkJp4wn$ZVKZ4A~3b1ym$l}STAR=`b1_H zXMFo-7&mU#x)SB5=1F!|3Vt6c6Oz%Ug>Nq?ny*u!e;WP*Un% zT(N={nVdXRIHC@Rsc0|_RE%2MsTjn1!i|#q38*8j5oZ9nn)f}{xF=;Aor3+(DrJ#i z%J1u_DwA>#zR2A=vy9%Di8r@NrQ?>s7SD%K(0oQdGGgT5$&usu8h?3I0BlMlm845M z=>&m2x-!f%rnDOiaI<1&8X#uphQ(60o+~EX^iJFBZs^jO$gFr^Fpwc2V?0LqSbB2i z0_D9clqk?`6iSlk9!_*NT1cdtY9AgSkQB4B!g29e99I_5FP?@A$V&r(bI$tLL@r9k z65u$ys$JEF;6CQ_*g@_oY?tlk5EALf0prgu?vMhv;G!JroaCF<=QIn-=AP1HOD4cP z-pB9z2om7vTRRNNQx&PqTU~+c0Q@pPbRF|0jtiz?i4%<`rA1zK}MICn8Q_D(1Vnr zNmRLHd!H|}^9tAqc1cjwa={M*NDnuQvK9|#@aQO8d zmuo`k9_K?Gzgo60sVQ&5#^G?U%-|;b7?A;=ReATtZCTMiQ%}r`jGmPB%nkQ>XI39Jiy~Oj+_D^fa#SZmpSd@`0Vd+ftjHa%5)WPZ%MVSuvKxPV+;N%Y~JEz z3NcBD7dn1Km3&G@>WlEAm9Ug`h2ApuAxe^SS89T~lPn0tSKtEI&H@HiOFlmf_~gpz zyxj%d-M~yoQh3|C5&t{7-GYe)trT;Ua2m^mUhL@U;e0Gq=j;v!5N0qyOkGqAxjM*r zeHu{YA_HZW)tVh2MF?uD!rG%eNUDf!vwPUnNVpqRL~?$T?()O2{Z_Ir*x~}Fy2(ee z2QM%J{)oX*mJ`%XJ5VgdzJ1Q3@?4i5&_YdycD{W9L=9~EzJ98ec$lE@D8e1Wsp;Xo zqkY_od$ymm#{38gKRIV})(d?^qgoz>tM_<-jR5n5g4IHU@?D|^g>kzQxMYag>k8N4 z?b1`$D!5%kPlj9Xgj?PzLCR>ZwjevUf@D0uhsEZKWT;cuK$Do_8aa(zFPW3N-DZub zoTET$q%As8!N=Kn-(+(V%n)YX@GRXygc#B zsoLLQO$LUup)B^XGj#G_9~p9NTXnyBk{IlRAQy=C;1FtXH+!IyCz|^;rV*@!`+YOh&LOX6Y6iX5Eq*IP$E%L)2J$Si zgc6iYrv39`lrZk+BWjqkqTA`jAtE>$?4m79+QLKg*-7cLH}6@4B0#wTm&Jn^ z;3v(x!db{TsLCqZ$vFk{>od!p66RhO;J-rMf&PCWbMk^ zCtx_V3`?8l-rCyEN74@}0;hPHHww7ChBcvWSjkv%^mBaO-+ARFv%1?Uk<*wFQy&+Ebc1rnwiqqaG}hcEj3GoE|M+u!8=q%ee%JYR}a z$CjlB{hKfJYH(o7YW_H75;lfQG1PC-!`$kOPjF z0Xm%G#CVMom_+ETKYFpKHH9%Fc@=2qad}vP_jXCQ9wQ6}jrD#%ajqA>9$Jc%uEWlF z%r3jL4g5i7#f4K1MlwbxLqQwteg*~TIr?2t~p?JR>TC4UHo2(Bqh zdN|-&z6L(>Zb$czuw+nx2{QbHQvcr1qG^bMNjtSlcJ09EVz|S(l4f$f zHtUD>)`1s=IB9BgipdqYK~<*x}LAT4p)NcJz33=EEg&(7Ax`*rl@^L=`CYzDab9;zxMKY|YvpEq5=II@Tu>N$rS zTl!61KpAouz<~M&we|>bFhfNT4GCt`=5!QV zL|@)nW+_U?1tD|_UnGQkgXca`xr-O z7tyuVM9QEMtyW2xjpYtYO2ZSrw~6K46vKgVZo!aDLGBYfQOI4-A1gwne|}9U_t&68 zK!G3i9i%!~i#j^eA44BYBNmhw$DdtUdf2%7`nJDK5EZW|td!)^r^;3uVgYHMB)NaXQ23E*hM3fitq>teSdD4!Ufu_qHR# zeY4Tuhe5pb1!uq@x?Oky-0_+TAp($gF;z{zS2?&_{o_CU#In|k%FELsFZ!`D>?Qhf zzU&``z((^YT4)YY$X@H!u6=QT1oti0hE>0I^B8-?+WYbL`iz|z&~LB2uZ+L%gKc0E z8l}8=hUsrq!KXff=DJ^s!Ac)JYIW~tX-{j(doZ=lSpN%dhNtBB7chF~vk%?etjk^6 z!CZSagEOziihLhUgV(`fd@cZwk3bUxukd@Dhm}vaqlF*x)Uh=UF3WUBHq_?_H5wwp zA@v>}e)M$A_!lB8GUT>QTxEtIx`D~;c$L{CQbz`!Dl=a5k(&2n%-Ae!=OI%>zl+MEHF*&ttPxmc@t{ue0}V8?%w%jLY3|z1ijB zyfR68Y2>(~OqYl;PS%Uz9A+&6t0C|uF{`4?iw@?a;hcK|p4`!8ju_dfl2yy)3aFN= zG*TTWb~g_A0q!*)CV7~tlbK2Gjclg-69C}$dW;{qYDo0fZubFK_W4`dB--bccPFCw zfpb`&B~xvm{whCci*qy1N_=!(!w*~65N%hHid13<`TJ!nc*Yzdlx{kqSN&b+ez#Dn zhDYDB82aNw_}K$90cJo{Y(-Yw+<_BXG{?t7OZC5C-5wrZS6)%vQI}~*nUZ@g)Jb0*wNIX=aE*VaUa@Px>9+ISJc@-7uRw52#`V=no{DAW@K_v{DYtdAhJw2f9`czTGQ&-iDO|}N;Sbg$$Yorf_qY=B z={Z(~^PGvy*5Atw)6ns9S!{}@(XMg!&&%zutBvh~t%B_mw(+wMk-m(%7{0u>Q*XC2 zMU6`8XFQAWF2I)k9S<~rhv5(5-|M&K4So9yaK#ZMoG^^a4QriLX8AMOgf8KsIY3?4 z8hA!p{j@_jn;39jrCneG={>za`YzT}((oP+Q@|o;>a{>N)ft$1`QlRKMu#3+e%06x zDDh;JLtb5dR%1<@O6px?dE<1IJX^i1FHp|efa+XEATH_z8cRV6b+CyP1u3>Woh&j> z5=_J*p0Gv`9s-FS#Jxp?Y*YRUKJx?c20r7v=4mw0j~hFh_US-{KK@D6Q%{S;Q7*<0 zx5;c&kfZvlzFL49423X7*_0^)N62DZh|v2UyG zj$dGAqZPh{z^zb*|KS+Tyu|+P)xkg5BdGZ_&kkB(*%!KL|DWd*cP8t^;2&ZWgdYF^ z@xRWejj8+pQP^szE?(A&8*TUn9f{{xEEqrtR zcrdf|^j->tlY<|OhBb+E&F>#Om~Cw|XT%+#njUAL*R7B}&`6POn#PWbVarIT)0|>s z)V9Lm(UTmtwXD*EOTbWqw-Vug^TIqT9Pms6%}c}*z&$dcdw|Lq;X@rdj?ySnkQf`K z-<@`&L+19Yd~oO*qsck18t9R8!~ z2}^ctT|Hh}{YGj(*S@RvKJ78f(bQ2xXk?HRn*Ly!*l6Ex&Yp7UC*n2Kp8@e<8 zc^+UXdC1bcwWeCGcA4iq^JwC^(~Kv$2E{xdZ)yEdgF7bPsNfTmA9a=ZQX3%%W1ARzV9|YIt_mH(` z3ghYo;e}9sf1FTIbKqK9k`31nXzcdK4m^p$)=@u3;+@!nNoL?*t5U5cNp*s8b76Vg zn(4yA$QV5E4cY$NY^+-T0RuW(6i3DhgI$r=9z^S)EFB9sfkQ6uBchj7Q-Xous4mD<7;1KY7f(scvd-yV>2I;qn`1Q`l%1cZF zcy}2m=s4l2?Qw9#iB0Dy*JLc~tF!we0p}-V?UgjOR#X83lZq z)yZbHAUlrfABV>RKMP;oJ)IogZhmLaZtgxxu58_H94fS!tJm9Co|eg&5hI?6N1pfc z8Q?wAd-U&a*P0BGNnJg zg0U$1L&_*)FaU7aj#E#F?g4h^`{FdXOUCK5r;0cPo`VB32Z<03JV5kt#ltMR!^9*c zm;hWvIS*x&bM0{oyYKc$Fr#cAUNIW^;?m%^8j#~qhES;4%6~s;!_nu{rRrc9IklB^ z9{j_}-<*6v1Sw(!1IeOx0L&v&DIjvA#Iw%@6cj*Kil1_D>yZk;PQBUWn+T!~OOS%q zMDT*)6Q!uke_a5MDSQWrO8ff!AQ{ep;G^4))97L zmRL>&2g4=Vqy_})odyMQ@8mZa#v8-UH^nKk!cEHjXE-F#va~G7``e@m!dgKn#EFw- zF@lwA%R*CNEN9I&jks7&+mu`($3*xc9Rq>cim;KUBs9`xw&GSMh=ZnL|2Zso(O zg*M^){%Pz{=QSBnA8(7LT1;|w02B5wAA8xs@)7n|j@<&>J#bFoskbD6aGX;}fiO%(3h)c4mMrt_ zDpqP)^W1wYxK#dK+PIkD&=b;~Ld}Nt-_4-3U#Say?N`vclv$M7weLwQkGqE|95@{cgkbzO0)c0IB zA6q<5@w9A8ki5u`X0W<19BQ#e(L^r7itrW4aQuXW3_QRi6o-HYXCUk$5f-mJ+7LXp z-w?wIO^*~VCz*>e26kzxnZM@k3bu|`!YLe2y;chV`>)+!Li_x$M=V6)!dc91>Pf=t z=Pw6Rkp3GpIy0mDOx&|)M1pC96TLEEG81m7lnVj_pmV0WAkRwabUFx`YfEr~RXblnFfVCR&kygrn%ysz z#@bDTZDBJoN3}?jQdIX-YcFXUkl~0_+FMFznTu_VupfQ{aJ_X+@xEAH-!hpFa~(tC zUQzB`1Dn9yhz@=PFu?PBlJl3wz!Kknx5ZDbMS_bGt`X86C1lQ}(Zj*ysnFyfQvrRB zs&_e4=Q%GE=c9sEO>7skVtX*rZ*+6^<;=_0IsyzZQb3u>6tlKMS_%i4I2Q1up?K#t zrt0xea+s?X`e_Y-dM2KZouhu=+JH~>#--xg=9AZHJ^CSPDi~UmD9$k!!vwI+2ECE^ zwK!GWYRUGegmwb7K(>?4blhSv?0tUb&aP|dskx>IcGAPG6^b4sdE;nYSzoRWEMKZQxlo;f9^+VyZJ35SjbG3Wf<@if6~!fDocfBentKK~Tm%wKl$l0Ob-=}-+qMuT z&)~Q{@YD;yQfL(vx*z*KO?>uNyvH6#2WoPk@elVL3D}~N^DK>xhWL7M)$DD~G-niWoweg` zBFz$sUM-QgI)WWaoStQDy$aXICJ?2mYpMts4fG)3s%M}GCPO9%-rn>Mh&=Jnj7paCzA&OKx@fzp3&zj(p9u;h@Agl%F45T z=C+crRT9UChl6iTBSDwCER&=Y$9^Rp$q}xCN42i2OAL~-C%?qLf<&SP8skbAc8nNm zLM_{x5$fqgdY)+&YvAAzd-r@oNz}x0=DdtC?62<><2=>2iCszQ&^kgT5qP zWPKf-xwpAmU!S5}A6HRbp>+3c&j#aMX5-|l+wxN-DghF@>XZb2$$5`sP%R}>gHfo% zLppj~oY`(Ad==J1X2xbH0*{hUAFN+i<@R}9nYJH+z8^1d=Kow@DD(tooZl-$g0pC6=ix4Q0XW6|yw- zYOai;dm(^Fwd~G+zE%)~ipf3W^ofQsRy7}Oo2lf=pJZ4-TEv;thei&@^>qU^>vpxi zkpPGl!kgXCb=gxmmlbm-JSmtAV9C4G*{1Yb6$rdi0xXwXwM}5V&%&TOTG*pa^l#$O}n7ea4G} zHyO`!xzE?MrKzW>C{$+r+Vl$|2wbn__lfx1R<`rG-2YNc{9HL9N z`ulCgy?5{=Di6B8*5Z0S1Khggq3UbZ$P}^RGvOFo5@?SRlpD~{A5uR_G+@H(z zN4JN6Gmv#PxV?DoIJJ~`1i=(X_}Nl^_P`|a58~g*QAE9`@$FwDrAUp{6$fsE*hQpV zE#pXc3eDn`epKBz%DvIWJo`yQwh8^qC3JH+_5eq9D*8fe#D(AD%AdC~c2gX4JDICr z;T5y5_&*)LTjL-4O3q{jKirm1;2i6w_2%D5VxwGUFK{tG z%a+OysA__VE-<>C@iL$VnNOjMBioC%$u&ef6#8hsE6l%sQW?z(>Is39JqL%m7okS5~R%&lAX~_>7e^4NkpM$feC_dFR7|SrDKNvHf;2U?^0}eHUMNDtG zi!dk~#3-@MtVAt$JgSYm&DTz@(oP-KyW4V7`1ER#@{RiY0RM9@h3#YVeEu&w(eW>I z`v2{v{Uqbh5E#D>5-)@PKdYhb%3I}aKOg#EnVaw4K3Zbize{cJRjgxWxz1SU!9 z5c&5Fjx*WVW9wbW@%?lLd~ZDMXuuujZs-x21=g#x{Gf-GW&@f25v-KR{&h}9Q+pC) z`q-}S-N%+7F%%u9-M@5({&L{mk->e8TCs7GvF2)kd)sNClUOgR&{7)gEN1)f43v{% z9zJ$nM|0}HfCD0#Wvg5ui^Of<$HthxFK#=*Juu+pfg`If_`=Tl{voWn`I)PrCz+Jq zKld;ilzy2cir88n0OxCCNa5@VFR(Ime5DDLNeFmtK!od*id{Pj@^hEE4fvS@6Fk!S zB4-<^_VxhKFAMnOW2;= zWzKrkoFv0H6X86MYpFp7SeR^kzOBgpNOPCYFl0@YMQVt{F=y>jv_`ivMu#cpT&Z+h zlu+MjhBmJ((qB9oX8A;r4JyL1YqI++6VU*5#Z$`O-QXz$A>M>_;};+E&d(ta_cL!Z z2bL_QV~^|-m2G^x4zeFoTE+b&NqY({&m?D`PoAhW#uC)wiZ;5`jJoty3r}eo%hY@_ zFnV=05`XwkLPGCfm7MXym76N6FwxqXOlan7sh^79*n8r?JXi%FGrnWj?#)1^C&Ph7 zO|caDosVY<7_M<(cCeaODClntY@b&5fyC{wqNH^?(yUvjKw%0;2x>~UIa;=vbqURi zwuS^rdl;a@ECcIFq;EE<<4o%Sm^&SE7D?D*$N|jLxeR5xOP9SqY1G$9JgXQ2YaK)> zXR<+m6(ws7y(t*vaXue|&`X+fi-qTlzQiW&J!T#kpAHeXKQJz- z^$gg{j~z#~*1qckDJR8%wrQ1aFK1uW^0rb-B_aTQW6Wm-BB=SoWfr*g2!8dg^+%qr9h};Vm3I0djJ1 zVuOVOxK*t;Dg$4<1la_bTm#Jx1rgBPbR-*E-ocYYsEeQ6IW4B3Fn| z#9Rk``aS#o*Y_dh4;zpf3;=)=Apii%fA6g=Z7rRh{*SDZqv>P6 z#fJ5}^?{v&O;~ucD_u(1gBnPcSS?rbUYqbz(`HtQ!qI#x*lU1C|N082xn!s&-Z33k zJ;C5KSAybVxLg>2QScq$oT4+n7@na8p?U7vfRch1Q5zKrA?VjF>;Z_>>5bL`xO%Or zv)TZWzjfV_NQM)|tvn<&N6g4_85B)rHd9z#$)x(kNt;np+oZyC`G|*BNBuw%K|r!R z@;_{yL$oNcwq=iP+qP}nwr$(CZQf(swr$(E$Ef>SRqy|5Wh7&_(nvCP=32{$;Lh9JDF+_7ZV;ZbVQ+bM|y_>r$qIR}!aA4m--v{NfBFPl+y}Rj64h zCEFR%I1=xmTSK8{z=T2nhd&XP%Q=zeD2FIt?m9&B5rYV#x+|u+7>L*r$&nNcqzy$1 zVkt|b4*&~huG$eu7|VfLp+$a3(GcH5^}a1u+r;4UL-OR64$rVAZDw#225y=2TUFCu zQFgR{-X2^~|83X+{>+jhh8x5}qlbdn43l*H4t(030GeGa^=>cf7;mEiJH|eIgPH$TUO*l(*2FuOdtrZ$Iab&(+K5LPdh%%pD_6d~ zcSH`&zCsS!NIh0uq@06vUTFdw_OM}~LS1s{Q^!Q#1D`lvaWNqn^k0JLFrEdhaPM8h zL>dCqAS#`FgQq;QgWgIFnp5=?(P)8 zVG<9ZasdAk>H&Um6Jtj&syHpTNIE- z5o+!sDh7_k1!q|cgZB=BHi~@3d@%je-m&thM2@_Fo^dL8_E5(&AUwH728UyMhPBX=( z6wq~!@eY*~JK2qtpS!NQvY+s^GH<$I9b4h>v<0z$!*OAlR1mmdq@Nuy|2mG|v~Q=L ztAzD}&)X@)&PO=x6ONxxNS}frARY;X0*95MbL2q{@y%BPlfJYKpt|;kSrI#7lbi&D zAe+N!7aO8Db!lCHfGKZY{)@Q{eh9~ zJ1J#o$LZN+J$wlwBHGTL$VEq(L1Kgf!sl%+ay^`XxOE^D-y@odq$P|g^yn_|GN@D{ zO>J*~7nQMv*5$nn7CECXp^@5fj2!Jqg5=^K4zq2C%=EGoB#QrRnC04*wPRZuRH{;2 zLUC<&vT__(2tuI}|L{pTi9c9)sNu{dL8Ukn|_#0&P7NK1RR!;Y$UQPSnIpVV^_%JaQ zq|1z&fhQfAOv!O#!xJSWA9zhXB?E&f|D5i*TkEWrq;LD}XzI3ksT#{m& zjh^KYM=mbTZCTDV0RywNxYHaFUoZVs#yor-lO=T)zfl_`E@S)Mfc(nL<Rply{~@z>;aeYs7aBqAYv|-$)j&rRGt_} z&1>qO$E<_RBU(Q)@!fux?dHJqY0Jgi)%{#l*2RY*vtA!dnpK+`1*^F)n2Oq21I&I2 z)oDUu4TtVLDCT?=TZbf#RZulc0>px%zXgc%6kgK%CrWj+lxm5(QpK!WCwdRx<}(;C z76LOpWDS|U_ZCZ$m!fLlOT(4>ut@d1WaW3VLx?Oo^a<2kE@e~URNT#~z;m!>J+wV# z70|{xB3SAGKzWO7NQ&oC2}xYevRu2Q2c?EK?FiI8(MDq(@|WIK%AHpPf8W|JcEeZB z2ai4&{i)NySI>Y0VK2^tG79SbPm~JZ!{Nh%InL?nnf~scUY`D|ZrKK=k8d+3H@Ztz zV1mIOiE~47WBs69_myCKuA30vj2)n4vQrR5=+#w_*-0o9%SAMQFQ?WOjt$0j)u_y4 zVAN!f&nOm=Jsti{E{5*APNilf9n9|Q_!^f3K$I@Y8^=kO@qzNUV3GGMp>W@ej;_w$ zc5ffAx45vIb=vIXzQ^NDnWCLe0T~3I`_R6Mqc4`$Rs)9KlP-7pDR#Q^nsiXZL}I13N^Tx7*t>{KQ*ded~1aI`Xc{_GmVj zW~K^CXyZ}3eF)QJk5HQRV5+&EH!=eY@}y%w3)x7LzXY*Y*@6o|1zJqwt%bo2?BqBx zkm*;qx;U4*&d^UYHnd{CA1=;(>{`i02X-Yb5dp(X+M!* zSyq~p9HtSmjuTsil>BZXd=IKT@6DbhY|I_Of)*Fzorl!$e~79&q(rWV%ZY=Swe)KB zW$s~o;gvHbKSX1UtL5P}Q97g%i{b~>C3})a!l-h2mC734OV^&R%Q8$h$8||OpX!#H zvF?bh+=HhUP8{FX&S#}NlvOrA{Vg_u*F{%ugX|vAC+wU%Z%^rpVzU)<4OmPjT=5)^ zDLg2-iy#W?#s<w-1aUb;%@Mi}N*Yp293qiMG zb+@TfBE*{#=ykAF#m?DiHozJ|uVM5_Fob+)*XdrgJM0<2UpaVS%z7^9)+}=`*ay|Q z(7=mSef-&uq5EA|1mLyQZ4`(Uu<0&YUR&~+&p!}Gz*ohP=X-LfTw#9%4lE~Q+FK1F zieDt#AH~p9o+C}+F2amor_}4&7?Zb5Q>kNU=(1XgEQee0hu&tLSrg_Yfz@#_ z+D4H5bG)R2sr3=*k5;7EIwr9Oa=|Py*pZXEKt>?yBR0;eL+rV-<*fct`q!-p=O|_? zS#G%^5bQhyMUl;>@Ex2me1VPNu`S#4YtMwOjy{WmPXY&Q>a)aTRcz2(a|g6zjN*PG zLG9FQJ<;!!3F1#ubfd!$;Ywo4L3H<;8!dR9QiR(tl1Ihgo<2N+*b=gqXr_!=xT*s> z!T~=XBEK>M+c4Y$UD8^S?P$)P3q$N^K2q@-sg$S!L1gZ$mp3~Q@x2d(E@1YU2C}t$ z=r|Pe-c$vQ#O_-OZ%N8|(0Gs+P58B5s)Ya8ag*o(b>dbu zjcSMBVeGpn8Tyb&Soh1lXf^r@?f4^=3;7eUe~5H4 z>iOgI@)MrD)pW6EKWA^(>#Raa2G~?9#i?bv)I(Yhi9UOb!Qu9*R7+8_$WDFR z@%_1rtCD?RjJW9&f#7Lj2Di(EvA|Jy#bEd97lFer4P-z(Sa3xKV0i?tF27LqRP}G4 zFuc&2(%;XPznDQ54ek@02IXl!i3G*UyIv8zSQq7sJ#$T?K_c?{d&gg1|A+Sj7Q00$ zHwpm2t;GKZzibU%EdE=*{;yl)yd<{CpWJ6e-!r7-fTIm(NdN+-73W130u$Qh9u^#9 zRAa1bIzc`$Y?=N0ofp5eQcJ=uC%k98334;`^xdJ=(ALz_MEt`Ql^11#mbOIFdmcNY z?|6U4BvZ@~4-zN+h8RC2(jUY#U1u4Xau{yomphieq?BV;FA&9nIzezy!@Gt0~(P0cB zlv^nUvGFJ-^+Dz^A{K38$4zW-B+1RLYib#TMz^Fti~}3fZB`7v`xwV^{B*aTeI1|2 z4+)0{kB`si@jKa&foGc^0`4VzXvpyXJ9+GT|K4Hm6;MgBNJr3$H1eINn<51K&#d4_ zDGE1v@0+c3gvVg9BOvuj>2yzWEyf!UrNZGEaUMbiN7)&Za~j@)P)Kr=dC}bx*WBj0 z_jl;}NnyMtqJA0EqjC#8_*t}(Rp4<2_M1LgsEb-@^adzB6Hz9BG2b8`C%*j2Te=mb zgJ6P_Cf%b7OkAs7mJwj<)^H;j;dMKBuj6WE80(wC81H>x)ea*5f0piVfne{*7w&I~ z{tZhGu?q5#DeY$ZmVy4qbUK%z8{O4upf8iEG61N7ce?H)jiIMygavD@VgMLFP>2+Z zZ)zW(NgU@<;mtV?MO#lxUiM=0wL(!y(iwVNgv0k(!GmBv%Ddeuxr8p%RfUVwp4| zf?(4$jL5d$XAk4!Zk_Ql1qCR!P5vFB_gVy9h?E(gL zTUf&@@Zq1Pmn0c(d7ElDSMJ~XQ9a#g6Pm%9no+alh-p>{ zP5^@h-5?9Mz-;lNvEcAoY5EB!=(O5E)3wM3FrFJ1^p~-U`F)dw5W8>oO z(27cVYts{0NMWCgw|e^OG%Cf$qPFO2HCMJ=2G;5(c~kbxP;V93mQ>7^!;*~5QvwK> zxaMWM`uW1e7SEjsH1O#WhUyJyaS4@;!(y>lHXUsj$J#`dzVDBC>@vDM_5qV^EY?Fe zQORtU`eYFZb7Er5FbEE#9JzPb{g6H_L{%O3pyW5tgswbhh=h$u>@C zOHZ7Z7LlxiiN}@}X;L-iPEbS98UZy-&uIJayr#qe4W z|9MLK{tO);@0lQi85F|wcl)3cXD@?@z=0p!nP811uOxtdw-kW+&SWJcZIafX!4c3I zzsVwlVYFST(Ve-wK&(5)^N}V|+g60tp#}#WD@48|6!qtEVA}?8!fRWnbQ$nr12$rP z$Qt!m_xuif?#$~{4j-DO+7J~mX-=C!b%X+u+(sherEqjo#T+B4$Dw=DA)4llHjT*q zrCgyqiLz@*jyfA#=O6Ij>IQtK9xIJ$zaGH283~}}Kw?Bwqx|xFmN*l+8BZy8mOSW_ z264NXzuMWD05|@Qx^1^>3`uVt43Ztjr0c8U7&_r{44e9`-~i-@Y!S^7dHv5+w)6g~ zLq{F%p!*RJ!bV~=d@0^uzsK+HWlc0wSkqid?&$tDbX|>jE1|uuB4X>OIM%~jyC`aY zFYfLed>{wa3DLCcZir>lOvp5gohj8*!z{g><}9}%!wC&*i3pRyxNFp>ETJ>WJ%%7X_3-B1X&oC`$^fsQSpOsQxUTx zy__EonB|wzgslVz5NKh@;58_Ye4GhJ|G@^X2e4f~Vue^Ju!Y0%57#vzP19BS-!=$m&OHgmR zolMA4crql9#N;{1(m?*~)T$MLtL#91qhPWxl_s362$CUQj=$UQ>Em09QbqOpbg-U! zh1OVov{&Ja)l>=QSGN9@gWgRi`7#L52;HmxZXLhl&Vq;wCXO=KloN|TBb2B`x(uSn z4v*V9ELB#;FJccLRHN-ozx;?qbc|wwvX>|FU*7TeNysbevnKa z%~O1xFfIwnSVv4(D@uNYu~Jbz=rlAEslbJp(Z|5sL8?- z4Yo=|x2p(}C)7@i=RWePAx97l1IiOdHVT4SvSun`}uw~3F7^IcQh$5O$!BDAv0nQI?l9X{8 z$1Rj2Iz49s?dMW-tRBlf=1^#hkpI5zzk{OLn-5qRE#D`sM^1_c)woffmvvaQm=}4T z;0Xk@K{Yy}o_=DPs}*Ubpp7@e9`-q9H$sj)Hu%MXM1rqQ#qneYyq%y24#4EG0%noK zoFkMC1hGVF6M}pj*)m08b78gbF}QifGfqCbKoIwOq42y@S~Be(wu%%NJRy-@d#F_H zz4Amex2ViQVL~*Jg+y_Vii;yzio-4CW@9eiCl2w6qnj-Z7Q9*`?5fA;9W@h{n=%*< zNL9hWI4u$4+jnMdLW~m4MVfEE2Dv+Rqfm_LWNZ}iF z<sPYh&Q{iSq6yk;Q>P5m++!GtlFhXyH0s5mi~co`Va3lez5ypxsv_Bd`?k zUIaeUQ?&-90QER{xmm`b#VZ}!Ek{3ltyQZd9&e{sih?(*dVi$g&~YRtnIJ(P-t}h0 z!w*X3>NOtZ`VB*#L4dLUg&1ecy2z&y=pQR@Vr0FG(Zj~NX`&>dUlQqbIl-y^=F%yr_!yM+y35Ludo6fo9V`lEFF_^I zo=52@shctsi@RcG42zQDfOC7zL_;$0Qn=iGs0rY8Su|wAG)-75vj(Ew-JZBT!o2G5 zpD?rX2N%yl@$&!io3$v?XI#Pdl|Ty;{r}jhGaqKMtidG8OdSI z*1w>@b%R}vto2f#gLGrpTD?-0ma0!M97}V~)8RgE2BgdJcXImt1%nC7nf&){)y@^> zV+K(mPPVz#vXzRo#BXMW)7u8H?HR_A1<-s}RMkKgQ=#B#VAqDGVc1(;$I5iFCPS3`%?VcTaM=-%Y!Rgbb#XSuxW0!IF{-oWMl1BrLxvhTklQWp!D$1)rAB{iteH zBK-jO-^Z(AzI#~7O|*96$qL@4+0`sdC6`!&a;>pm8jmEgWQ&(xxAU@EGMA1knzfe> z*)wHkNU(8pk`x!sb<$sHX|HLc&1zIe-j_jjxc(I&RzdiudcF=(=3px^mHwJ;DkwYa z;dJzzWyS6R{3g-ec|V(-BA@NoOFw7Cb}#3D@{~QEyjfi3i!?GOZ!K9-- z)G75rF=$-mc*`jQlmQ(~m~xa^3n+fE(gD=&As-5l_VfW-6_Uzjyw$c3+A-0;9WE4+ z2ysdBTrsqa(8wTlk36Drxnu@iRl2jFs9GweS}KIT4D(;~K=uqOK&(l@-}`_WiBA{# zLN-MZ6O9ld4|%4PHj?ieW^_eCOCG&31;eu`Mft}xKu+V{`9u9ddwFfE~-sp!LjAcS$$(sg^ieJRY>i9gFdaPF!eTKnO$ZZ52i+9WgN zBEPd(uB?=z`*ai#6{<#`+94IZeP=)t@bmtQA>Iss-3o`_3I_+jJe1nHO64;af7yC5 z8amVgE?%tq+a0FV+B@KMPNYSXC{k!lkQv~_UJ^vMd(d;FqEc_gd~zLbE05VPZzPjJR9mp zpt#hhDZ@BkC|^tSPvJWMsy1jVj5Yn`1vXCmZF`iAM?XXuWD06nA3AE%>Sy016fGUP zq|)3V8brGEOgRF22aLaEJ)XsChl^OG<`=pv;P&97RRf5bY%m;!n2-dIJnKob{;8)J zc3Yhj550Xuj;-^nv3>cwQ$?D5D!lLN*iOq7*Ep_=R5a(_TEi72XLkBp%oG%!EqxOf zCeCm}bOEXwO5En1s#eY3REg{@0^(feLhq(!q&pm8dxQDkP<$@xktPz#D{}n5)4YG+ zK~_+!+F!tu^+!s8uY3#@Vvi_0oJILcpvNmMP7suO7F6nkJ~TsvPV@>dmr$w3Q+z_B zrYB*Ipc?$(3-(wYZX#K~+!(=!Vp>5bM121g-NGu=w9inTf%57Kqix8f4_DAc)%M~V z-^Ls$A_57{4L&eL70gqe?_ZVxAD3T8_=KACjDRKBO{~U`&BaBhiRqe2|?HRz@K}XMC_J0)2!o@$M0?^t=!T2h0 z2DvWP+(E!^E)|)K-<^;)1mNqVa@Dtnf;^u9@D0jF#X(>%3=Xg60; znFv#`%hZl(M*>@rZY<7N(ORss=c8_K|1Re5toavf$M7Fs9WnM`R;U~s!mQ-43`^?h zDI*^H4|PSqtk7H=_<6j(T$A?7{N683oTu)6AU;0d>J!S}y=MN^Wjsv#^nLSDk7+-_ z!zg6_RLi%k{_t7`C?+0f%fC+6{_etNS{X;6S ze_Dycn=OiDg_AD}sgDQ*XVqCZpkh2KcM;2ZDsSOm% z>+^Q(DczjdRh(|x0COZ0mGJ_Enkyh+K+N+qD#C+}30Wg^gsE`T4xN7!tW5p7anJbs z`C;bj$-kRN6E-}gh03&jtg$Lk<53sd%EgQOj}&R|Ws?hOWpAV-(9{3qBCy+0f2;p# zP1}(FH#cQ#YWx4{`P8-lK@lkbbaW${UJWH&a$46F70e)-X_(Sl1eW-0Fbo!vY3)iS z)QXPXMZdmh2`MuANagEL&9$DKYj-|hJ}J*hAbIgkZ3NPKaLOKX(8i`7tj3h!#RpmG zomzve$~0%FwtG%+XI{P4B6=7eb+P@)LV-5x_2;DGJ-baYb0LST=Oj11dcIuQIsWY( z{lG${jT0O=}ZcJ#(_?{`U^{a zo>pvV)#SnA(LM0DJC(;pg#Z?@9JTps`ic)`g$~N=l&0>dj z<^j9osAfx+DW|bgu?knTH_NO8 z8rrfGwJjP0_p-9B09xL{dh4+ncZ;H_ z=MX!5elMVqd&SWiOWFe^jRY?iQR02Tc$?Y^^L$vQlJi>%Gb7JoLIqk$@66v5oDBjyGD9zNNDTZyN-r@F}5oAW<6a!d~QADqnop{ zoBMy=BinK05LncadzPYCcjOC%=##gxC?)8$C^V|#8+b+F(s^oj{gOLFqvpin`kx1k zXgdf-DP;hbXc_7&;ebh?fig4th+@y83XOVkU)0F-k9ToB1fK^5sNZAl#^TW25NxGc z%B1dPM*-#*k*$bHKr$Qpjas%Yc*$_czf{_@pt?^kBplw-bTl#M#Ob^_fY>t_cu%Nv zFTpa38syutN=41-(5=;tIeH{d!i}>-g^NNNlibMwG)$a;bcCv>)<(#~#jJ9$MTDcX zvQ3HwJNP7yfCCo@!F9(YTMwkq(shvN5<IX4FJ@bRBkXGEK22U*P(M^VvqC8eYx{oI!0W8Y znsxvpQ(;>U>p=07LrbMqRwvGzBT?Jtwn7vyB0PWF$o?6`JC`6f6Y`Ti4nQYn1vS`> zeVgGAOtr;!j6Q)Qt7;dEtJV>;jllzYNs5Nh3Dhyo_B4|enJD!gfKXal1l)WeyNo8?-m0yZDMhK_J0 zE@;LTmbfL6cXcV8;}kKptNei_d^AD}60>L6?0~$oGi>bUNp5mck61E(gH@;&b~kLb z&E009t&0fUelW?pC`Brt7+!$cPj>rzllxiop-y((~;huy8M~O+W)3RsjE_* zEA^v^)hO^0TF6G6Sb(ob-V#2zUlJn6miBZ=FV#~!ui6<04{|rVbs?Pg zfmhI@9`o1FfLAu^<}?O;;4OmX%l^;XY@3h%#N^J(<3)#rq%&q(7t7E9hZ}eoiP|@u zrPT;ENy8^==-nY~=xA_oS8-!k`0V%Ns6gqJV*E7SXXHSR|%(uUFj6Ni-XZbn+|0IEgvT=Ce9~nmmxk?l0*0!yA)UngisU z9m;!}p%W$V!OR+&+@P5YN0hWS{Zf$Zrmd`38t?B7x(Ab`gf*ir86)S&l95~HJ9HQ< zv}EM&{Yy<>r9Qc+uXG04&z!e&(A0xRjv7@`AMLbo;L#z!Gh(=#wWgIUYZ?xGT|(^r zOM2_gkax))evi0%zJGk(xTEI}V}^XFQi7#SRs+&!xz|w^(HDar1GwdAICd-PdbCot zAzT2SX!j8vF4IAp2vGWTB_VtOuuq_sy&0^RD_OAFL-$O{tirdL2t*X^hF1m6nxBL| zLvSKn6g!LwhFe-*Dw7hbTAU^=GIW1a`F6j3KV8r!Eu_W<$$8f5$&$*FvV}ZAYSc=< zBttNf*aodi({FJCXn=}r&;SMJH4RgRzeaf@a?b|vCJWsc1jw4%Fm%&a+&0J8a@0tr zP8pt=!aG11={4D!gm{u7kCKW^5+wzuOK8v`r>*5VuEA2rV_n{+Dpic2rCY?B>EMP* z9pk~j+@g>sg;FS7^qTDH&@+Qky(B$@bUX$!xq1!w^813?sJz|2Rz(vL5U7RVcvHpC za65{a&9he6*bW#)mm;Wq>cBd(7@if#nSkERolw{=!?}X0q%HK%$^RneD>7Rt?t1`Z*x26zQVJ@xbpgb3dUrJS0*DI=+Uk2~W zvcQ%%BzoPlTXR;1sLQRQK8=wT*jGW#VgM>_ppFeKSe2t?9lVF~w3mCj!Wc`Nkg)1# z#8c3i3jz)~AaKvvwNGa#LNE<(hU9}{<&2A^A68k~ww+EK4` zC_)~?nFcbqZ{`|sHGdt7nk^!33|2FSp+8CkTCwC+0$@08F5exxF}9F&3laY#nKeHq z*`)V3>zXOKKV2BhqBkwG+?u>_&;!?0;MkVL&MvbpK(;W}#aEwxf+ICiV&+SqNAMxa zbn(Pue1Q<-7B`FTfo#XH4w+V3lhZ8WEo3Vw40fi#0aup|NuV4MGy21vi-q?D5Q7w0 zaB~;KJ8WmoLm2p-DP8x#UB)msgK4cN4gt>rJMD)HGtP)9h9E4SahvxO*wEl7sfN0G zaSm8hb1w91A})fHv;|zo?W4AQ{y816);`(<2*DSVNV>L#l@q0 zpEfGpGi-4`V|Zj3UAlR;EpNjGMLgM9RAqvx(-zD2SBAH)G zWtgki9RQ=aePhqUr*$15=x>6!wRV*wR3-^yU=d)%>?4s&9a^&FUx5EU^E~FFL{$HU zZ-FWQZ{FG7(Byy81eVI!6G{Kf@Kd~ZV@PON0`|gTn|Q#%4hZuAz{hyx*WpB^sU&gj zT&+L$HR69iPZiDGq3aFZQ2$A_bW>AP-OWs&u0}sb!`{Xoj$0y@9FW9|cQw9%$KdXg z91vqcVN4C(#N$oL$}GviOe2`-N>IQr9_gaZo`iDBL|M{^q(pSWdN^hJIn$pg(4$?H zMwMcgN+60!&<%--Mwrr|A%R6x$cS<;Z!CkWNIFs9b@j$Y;}oJiH6lDcXh%r$;*#xv zL3Cd7DKbmgIr;J;6plqF_7{!lm_v#MURK%tboGBNiOLm;{*DecU}Earz=Mz38%m|b z961q*BG5B?xNT*FU(Me8pN)`6c|ZBT3rmblYM_xa<2VZvWdhlg(AZnr?#nA1UtRSf z$s+a~xs!jM{h|qME6@yHM^h*v&LpuU6U7)aCMkbmp&pviAv01HdjMeo5RwW3WLzkb z2{Y0rGbX}&&_>emiz+_^T`(ZpcBzgP!^PLsfMy3&%8)HA58dt`UfziQ@)m(}M?LUN z4>|%a3dc+zGr^59p(i(wD;hjHm56{W5X2#GcEB_};5>-Yg&hh&8p_`>zj?m^zPEC} zlUQ<(JxLaUt*zdV9XxRQu$NQ_Vz3BeYy$&EP-}o_76p2TdAhU$m;OP_L3ec9@8#zP zlC#VM2cb@vE>KN0+k?NohDd}7QzMun`DjWxjP5435ao!PKp>E3;*1vfy2~KdFVQ(I zn3y0j`#>HLG>F_rcGoWPiJRmV8%jh6s7C-VNJBT0x4F^!4lO)b_<1m(?Ke*Ft0eEB zNz>%Y7SZ&cM|@eb(=T5rXt}GqQv+g6?g`p+PK*09;HU zFJdf?9R~Bcxwc{eIqnYt>TFgODY{CjS_(pCs)4ND1=1Vw_6}mKV0l| z6X?0zkdFZ8;#lNZkOVBg6oj?^W*(B^IpwPAsrsvq{(W$;f9?C*+yut;hRPaU@!)!w z$v1i?2H(Dcm|#t$L&GH+g&w^doINuj9}+ zb~c9Jc}S7`cr#*%9+*1`)ED)A1b>*{lUw_C^SuJz&@)quMS~4-PthAJ0XQykn`Ine ziKADJ>Gdo$%rp%Rg0{GDTom)J;^+bX^gwZe6ra(5-;x@a6ZfP8vU{{X(C$Wr=;?NP zEXgselwyMrX`P8`l!^4s7VUxzY6hIoX^b_6*JN8g3!y(H(skg#Bgg!*SHaQCfefze za1rX^?*{k`^VBWUB>;xT>zCzwz}%J?UUQ(Zi^eozn0%1XY?YQ0uxkWqMoug#nViwg zNRrqK*#yEi<&Asu-HZSqekWH47bbkwhOkGNSJ-nM(b|Su6|GndHyz;0Gz$K`s=o#*al;|!ykS=LS=0Ci4vQ|xh8+l(#*21x8!2fNxT^_=j(QD6N=54{SP&?UfqzMmxZ!e(sck3y8MI2j| z91_tq4(ii=vnYzR^B{Htt>UR%dYdI?A#T=bb_ZYu(0k>_*4Tv`<2hVB_}d-*AEymp zXRBHB6&aI)Y>`*o6$5 zODbLn4@Fb05+v11`s;6cfqe|Xm(`esi$EWN^28=g-QNr4swGCP_P7RG91jMQm0;gs zCPIDKR$TVyL}&RG3WP?cMjfxy@U2lqr*o3McuRKU{Rrw3T@pM^EFha%y*+zQ#foi^_Uv1qK%80 ztW8V6a?U6)etAC9z`@|}WA`@=nA;Rg%Qk;*PVR23XYRQ>2UL>*y0s?V&&j_`tiD5` zA^SLWHBWF!WhAuybW;=7E+)k+V9t4hA;a&=(lNL56(OcN8otju&53m5JnmzkRo_=9q<6>!#JY;=wwmNFQ{j)a@-Orb!p?0-VVkz*;LK9v`IvYwqK zN<#Dh9&7|D)V2x_f`55N?SC@(yGplWK*0L%@t23>TxPm~*pPU6(eYRG%aW}rrjcQQ z5l2|h1Ect-h81l$VF{D~JYXD`;#8l^psMzy<2zx&>?5BC8n~+dEx?=(1SV$ymOIdr z-|hPlP<8!=1um~x3E z-tyCN#T_k$;#*NnAwN1QoDLmsE5pbZ`dCQ|s~68)aGdMGcPC9a3tyEj3ypfn6|5el z*i;!R%zw&vjtN+H6FJ@cJVRF(7azmtAgk7p0|4;}1hoaJvVeRM>!+{w3OINe^3*Ho zq1UERcaJ&jUSMqQiyf4`32}X9@|@O75h%zB%=h2!g{9<4SjwA^j>#zr42g8^F>q(^ zC!kta%>vd_z?()*b41_l zUOo|LXU80TagdY@#g;{Iut7p2WXqbFz%#@t9ec_RH}mckW#6Z8t=-;xqPbQoiORBZ z`7A_sG>oa~fiY@sL>TSKMJUIWtRKx-Pl8U%4{xzyy&zh!tyRjYM`D$FcS8u!SB zsN-wnpKTAc&p?pPRL{n3em=05we{BR_`=G?z~*LLWU^t6rKpChDJE1Z9?LB87?2BW&Lgg)%DHq`NwhNx z7l9TwtuH2&b-#5pA=AqJ*}X5x04MV^+yI9#i(Qe<;ol}MhIHv`LS2%D<-%4dD<~(3 zVyV^yxO=CwA2pkXP>~p|APTFrj`YUcnc9w?nVGM_*wrhHL{@vn(@=*kSecyB>`a}#QJM(UAiy~5 zo#M{43Rla9^{rq^EFD{aQLR;Q)SpbE#x;OK0*pRGMZkcP_Pu35-Q{IKL?kt*i%Uge z8{ve?lLF;vncU&gGRBbVBw}GgQ&5?0X(i*C5agcKXq!&Dz^#5x8`2srY2}6TQgp3o zs)0X!0}*Z~0><9}uUVDEh)%`|UJ1h@yUS?&4qWBCLPU7*vW^u8bR~Ja3El*WEs_0h zwCGVue>509!>8gj41#(bl2(|g2_gEI$vqGA)-T`8y_7khTE|=(1*=v0Vl#SVWI~#> zSs^_RX3zp_i>P!Yi!?wlc+g1qlb~>)>&8>3F*WSD4r3WoMIN+3Jaz?Y)ZY3Y<$$}~ ze0e(9fwqOnbWizu$~GsD^G#C%2Q4~zThcD2a5|}zep>Zm0uq3gv3q$r@SY7}LX4%- z&p#-Sk2Uv?I|~H1v(QH5^0;d-sY_va*h3~Nf7nmN0xGocwqC4~^1uk5PHYPsJaxPd z<3_cL*j?y)4^FblmVDon7-#!Lq|4Fga2Be^rrP7ESygJ6ts48uQJlAqRSvlE)AheI1K3~zTSxP@`%!#dJo?Vs@n@Qq3RQW zQBiin>LR?HY`)rJu#KxGVD;^P>IWLsY^g;Czj~;8au>;@%q}rdeynVW0O#`KqVEWb z){>>JYRE0W&vTSeeN;6oHFF5I6%G{^U;DlxPb>5Ja3ZikUY#dEL7zS?Q`f^bI8|t( zOqT{4{!c0oxm=)A8%q9<@?XYVjYO~hdzh}@OxI+&T>z`sz5sq9QED-o{Jr-RtJ#n;$n1gV@t867s)SRs1Bio zQL)rPWCfD?i4mhlGX}K>nJasLd_LYnhxvjFLLk8=!C(8&;h?INrn~j|pBtM{ec_b1 z`X3hXn0TFZI_R!T)Qm#CdtvF{iN^`t7d!5)Xeo^b+fQQ~7EMUvsva4B1lh_Rx5@_s zk5w=>e{EBfg}P)P-tx%5FxSayU1*I~t=U#BZ(TY{kO**O_FLhgSgDTCMH`QLEc(uCd2G7kYZ+k}KZK>?*78 ziIgz+&@@yJfe_{}gN(FCZ?}2bIKWAw*JMTNA;WN;#Wre-p$dss>wb$T(WS3t5Sp`K z$!1;&F2|=!xuII<0Lx{xCO|v+4%dME`o;`F>@Ken{~GQTBy8ChEXArX4ChJiD8J+pt zWRG;Y_>POp0z2THevo3UI}q~O{19$#1LV6i4re||0|k1K!xdvWpnVbLDBFk-i0D3f zEra(qvZT)aIah=xV4V)0jw#}xx`n{qj^8y5ib-}aL89f+?jCX2hm7%96=XX5xO!i4@+%qv5P`1 zS=I}goSl`4J^LA|weMIN_t6|^!e8;=WcQRSvj|Yy!}j-XcCtl|JitquuD}g|SGC5b z)<`o+tt{JXHJVo!nT5(a-bhkny?1$2W&n(2?f@r9v6mZMSNdqeOmBPT`q~|5vNWu9 zGM;0BO4;*1q0ncZpcdjBJLYJ;ArAakeO1viRUX3_ukA9eAyG;b3j0@=ZUnlh+KI8! zK&FSQ8Zt_4WtIU@$VMI2N~IY%%JkR*bPMaVH-A`EXnM-bLwD=^RLV|~sKfMHGT7;( zB99zQyJZ|QsZIm*gi6Y35tyH?a{mgYxHj8!Jh$8+@!v zJ$cds?gT|z@sLE%Grd5r=9Ljs-GBhBL|R1sbf||jH8?`H=Fi1Ih3KI-v7|5kb1V{_xb=3KZwE6=zFH{|YQI*8xn$(Q8?MqqF zKx}SGMqSqu7>VvS`s!&DuR@S=foB{kFo1>M9J z5p>JxhswY7nOkb5jUeTu3zzWldzMF2W zQm`SdAD?v9NI;*ZTxe0N7r18@rbX;ax;V8%;%eOnE5%-=L*U)r0$ZcauiNH79AigmSf5Efl<*xzrgZTbg3COVhM&<8{OD2x8Zl5;Ir~2L`-21YUa1E2>vWM|Qpzz_kbv$$K`5L=Rn7 zkzw!-0Rl~+^2x8yXS%Hot!UOQAU^_B()yoUVq=~tAtSt?MoqSAdR)-#cu_B6^u z&NlSaU(&N0kncY9CEwFqiTI})YIyhJ7W8e}Ul~j|EQaJBAx8!SIBZN?2{~%FYuc|3 z3UALlSyaOdHWzW=Z}+leG*Lvig5yD0c}nStXvaolsA`R7zmTqxS58l6;ObMT%;a>< z_87=jE*v&sgL1`_!X}P>=0JakaTDR4d{F256e!+0+aKm8z~S-ref!^UhA`Vo=_;e> z(zlvH_)pR?0FV4XfnodYYLFR!^l8v&rdKRT(deXiE3}etx5P1!^Al<~{eS zW1o|VrX?R)9&cVPQw+TUQX(aH)y*_PKLAE)-Po8KpSk=Ut#uE+u%DD=_uqe3t4L$G zti*0YnzlH#6Bh9rwwKILdifaeVdRG^PV%+eT8NZIhCuUGD{KvF%{_*y0G=aaWQt%T zK{mer!``RpZW`n8&)&Dm|NqhB4J}QK{%5%JHrKb>=HFC4GQW}G+W_MFi0fjC5d!Ol zVx1YJ1?2qA?ck5Gg*DX#F-;$T51XCc-q)S?xoB(b1?Sgn9d>_~%nm)LJ~Q|3M|-od z?{9WqeGAt27_nvD;h$I|v-Q9xO!RJXLe?4)Ws(eX4cBRCSH&>t8Cna<)2mPFKAOb! zZo@K-6ya==z!H~sHox}AxBa2M5${ZhT8C&NCP&A6$FJ|MS37-K!oucQj>}>XK)N)q z#~C53H;+sagNfG@y6OfI_37<|#>gSVR>o9gDj^F-i#XJX{1R4%G2v0nh|10E!+aLB zM+qLQIFp(HP`zf+wcPG6d|X##26Qyv2vET{Bz((5kiEAUfQL)_xl_cZcPom#yhoc12e zTGqh8{!qMlY6A~4s|Q)E;csj&tE2e!&bk?p;Cmp|^QGg3n1nn$3TX4h51s9kEd+{! zk{URVSX;=E34L8@39j^~P{;Y_0`s>RZ(eNzm~WFsvjY(GL7L~WkZxVwHi_t}btiKd zuUkVrfz03@{_$?`O;ea1=m3}}nZYa44U9^U3BwEBul5twp~J7Ezqeh$}KXTU?)!NV_xhSk3U_ ziKq76PXjhAkG>$SAmq{)-`VMbA0_eTpi`>f=*=b*l9jko?K+j+x%nN=e3*pH5xkJ zS3ULP5(M%4JY3S9O}0q+e4G3GGxOf#0!=Hs+gctVb3r6vCC=yL)+_nJx5yBh)U+S6 z3tt@)pBLhyi4&g~VghLZN*ew2(F>zMv&~n7jyxx#K*wA4VR@0a=>4ZZ?SiLT=C8Ox zx5B0T=cd$zXQKrqmVnoIp)4DXMFlI(d$i;4)6K40>e2dinmR(wdp6>FWy$K2Awk;K zY-JhM-EEx;X&CunR?GzPV%TFIg~0YWI2F-Q3s$L~5R^AOXd-UOHS>nALCt&Hlvj_+ zgfQ8pN5GW{VNZx2XB3-7@#Q_TI8n~&zWDSYOvl8MrNRe!@-+zK*tN|`G`xd1hI#0H z)sc$ecrSe7c_w)%SHyxW07@-J2B_sFnCDT_$K+xn+b1RRA-x0(UEWHjpw{f_WXMHE zs&ezCg5Z1{O$G#(Dj}jK;WRmfaP^o`rfRBiv(q9HB5=nEU1E3x!U!jtoFss+<;nUf<1#I1rM}TKMtUA z^%Wtu2hUg2#KIL=6VssMJOtMe=P3vK&j4A;9#eUc#KJr`_1a74op6@eyAV-Bzo$)xK+&i zJXTOxQy=bW!PNj@Q=IWC&5Kqz&;>5_ph;snx^!%V^+dg?T&V;~;FJZj)D<}@_rIZm zhB#{=jlkU)8%ZU4-$~$hevf}xhJXTz56kj-=jrRqF`d~cUoY>^{Xmj$mB)x+XeP=d zxkfOBqTsjK`gh_swS*2jNGgybMyc+w+inA6n2NYHk(|1kNkiCIooNLPX8T2ODgJY0 z6nkA{DIIFi0M5bzW}UGd(pbq%rd+B)0eSt*mXa;l6*M;2;}ChEG$m|Rwfr?S2y`JB zBpXj%OqRZC#MO-pA##t5)hf$cVKq5>izf}XH>nxyoG!{&@vsBJIg6d?%#fm_SU?Tb z9r%88;5!L;4}^p}vrYu67U$ZOpvI{$COIzt#l9~v(j7&_{sxKd#WQS<}lctClvB!8TFqahB@Xu%WyPwQWdX%AiI{2jI#pN5}OF=?nqqA0_Imm>0=MwnxE{OMdSTXBh?(-Ew z2NC~(*a-V3Wxc;&J!!pb-Mh-9ziKZ&b z)CqCRFS4rRCh4`*}!K3WSO)WB+#wkZQK z7l`g|ANI-Qvf>idaM4l>LbCT6@v85`kRn*%yZ`31l-*-h zAN$6`JOi!PbmDkbNCU|F==Jas#^t@*^ zkLAi503Y(zTYQ=0fJ%rEiyR-P4}~!zVQOHE#>r3_^E6Hv(e~8gP?^98DK0Ir8MJywa;(zm zzfDU*!cDEet_+Dkfd;*otSQv1iZB8U$eAZpSYAg?FJ9*nE0#~MR9i=&ZkQw4!8z%S z4@1&Q7@b5Cs1ZD}jLVfvS=^pvQpgIdMWC;@Ps338iZs|92wH$6K#r0b%s900XM7|c zre0xTFE1gbRuK8H4jbr?CG;SENXF741?6P0m;tPJ5h-BOS+>_2D0DeDA`=M%G2qI8 zSY?TJXoSE)t&|4Q6%(CJ7Mxi=x|eD~^IzEQA#jRWBN?l&IG#)?_+Y3sxkxH!q@12( zx`SrqvqugVp&1Z7lMSHM_$d9Qvj`q#nf7FY3kp@V^(U;PlsYC2k#wr#XR>G6O$ zb6Ho}K>rEdH3sk`!VblRvr^QUNhVM?Fy=vUdMs(cCd(t|NdzC?OQLBV zQ_BkKz7|T?k_k)D1~K9%b&rmMc-4I4+$x>8?!LlXiRyJaiE$h)QBT`4EvP{vH4HG? z6<1H$IC8aqw0+c%M&;DLexl5>afM|1mIou}dQQB$AEP9l^;3&ov1e(TEnmQni7_7= zAwanFd8s#!HWJ+je-5HEXBfu})SreF@l-&kC5gzYQ4eOrkD;H zs&=M_kF$V!vL^hqWh1x9HLB8&G;&k)U}n8FLa-ZrVISZLAVMrpQ5zRH@xq2pt2d4) z*>o91d^F=(z|3Qxx0-TXnU6Q*y=}D#KES1WkP)_s*f0|CoNFO0kr}}GFpoF~##UC* z-qQV}RQ8xPjN)_jpu0H+06_)?_LxzcPu(8qaJwS7b~vfe?fI|ErGsRW^g{4ZdS>RP z6-0DoUOggIP$A_*VVwA426J3s72?~hT2${#HOG}n?HpU^J3Aqx+LcB1aUAFx$d>hd zKZCw1W88+i+`f-{FB*eQl8MD+%e&cs4SttL;Q6w@$#&ejnlDZKFr&5O2-)fVJ$wl* z*Fn>QDg9?~x<{M?P20U0mlU4M(a~?%pWl|6j_$021^o)VcE@&of=aQj2D;EpwG9lH$5f+x#<<%*MNBY?W3K(R&EN{1!!gF99_Hr&ip z$UBi4=GA;te!9YF;{kd-AAQ|je|`qozEd)n0pi^fZP?YZm`4j#O7q)fg=65ezD!vN z#984SCrn$Ejtq}7p>k!aZUBK8Qw{Sp7NHZltJOG)J=s7uoOz+h8!330%a*}Pk9Ysz zBi-lFW5Jgeh;M|8sVkod)?7Y)1nno4?Q(y*{&vaQuQOvj#jIRa2Ft@+6h94%(F_45 zy1KEIj9QTy;pVeIUyS$klEqz;dvbtp9mPwH!{D;W`4&0fSyR8k?y!ssj6(vz1Dyh- zG85EIa!grW`XjGY7FxY%Y&Xn{hmjbvpZAn6`Ot$i)kv2FA7fj;ve~3gP`nku#STmz zUnAI2z2swTM4r7S`<~`fd-u?k*PGzDz%HX#hv?INE+fo6G}AUHEH0jg)Bmcg#Au;A zhyKH?nM09>T%LP6)sxAg%g1Pk8IAq(Uq))&{7qXX;tMoyF}>q#t7a$irxU!U-IDgt zXWqseNK3gUK{4Vyp$a>FER7}R?4g;3ye?+7>~nB4M*`D-LtsBHyjt6dY3ML+5n|iO za!$?Uk{3C*qI17nta5JBz@gp#0Q}P>zTkY-kn#eijmX?-cNmG~J@fXz z`a4JR%X6rU6|Xgw^x8S3&da^6aGx$X2lt&cL6XzKN@Ggf=*gNELa@9=vLpP>bDnwq^jH&2 zdcCOJO$F2*)Qt(i&^2-MX$RYeK6~?*o9S_CCp!#jRPnR>|JZ@C1LzEIrO%XpjFL_j+{46iC!pYFCtn7 zx|WEIqA2BH{@WaLG6B>eKJtYI8lu7dBC_0hU@LZ*Qr3W;b-WRvGr!dOkN~cRX|eHI zx_REPvW0cM!>+cet*y-yyPmv4&HPm00&^IoqEA_Lf>IyD)M~k9k$Q-&M8T2=y}>RQ z)hSp8RbIw4BssZJS28JbgC~;2hi;hD_;am|syqp~ydCdt;wEjt=owOA;y2a`tLJt% zJCEngABEHOtnAee*O`~x7>{cu%8mZn=(KT>dh`pYmHkS#lOo?3y0@Q~i}#b_=dmOP zt6MG{D$)+W>`cve8A$vW;8=q+xvgs&25nj#QjY#=qR)GZlS)hk^5EOf@#>OfYfKTtH;wRCTgt z$#kkc6pD*qtdu|eu<?y<&hjZP3Y>45zb}!UHR#*hpG10D+RMwfFxS*S|Sfc`CKB@K;Hs-?P(iF*)+f-~7%IWu;FE z4iB|z!@qx!Npcm3=pvyG;d9o$tqcw5?3s?IXiK4FAwljIqZXHqW2ImLHPQ4M@vznK zccGZ-jR$9!i3wvwZO=kVroF(&muHffNFsN*sVG4(iw-10c&6WwKK5x*RJ5(a3-5-$ zM`sln_Z`8^?EUlu{@=U9*v<(m$p3bSITim;t@6Ju6Vu#QPMfWbdDnUYoo0lJDqF+X zJZ(nH97a{L7aWn>5yv}fx8~$fiRwzkVff$d6}NVMp8)*+h1h0^Q^ZLU#7LjRhHee& zXP-Z|eRMyrtb8aIyq`*cmwzO`VDn^dpearq6O1KNjxvyqJ>NL~WVRAk^S;bcn42#G`8`>H{x zq_}8DuoXcwqRs356(SISheI_=D)%O^eK4l|0F6QRw3kGK;v_#+K)r7V5wQ@RZ`a5z zW1L_nt*<{nYsokosUKi&bh?G%nWXFh5g`^5O+CA{hM4JhYK@)>ZxnwlcMRjHhYD47 z*?GE&8i!hf@pFhYOOP~Fm?%t^G*wZyAhEIvJ%*?(rHEr>TIE&|(WDZP65S$QmfRCQ z6uw%l#+1rNm=_^j?AX}PAhB+5Jn$DFwRonhk@m1hkdX& zBlGvm>ofc+`0R|fb>P2~hCe33-(zTy7R)!n?3_^yWKa?555`W1gV%2$PucZNY#De}^+qWAu+<6`O>8^I=^)9y3*}IN;8Y?{{^x zrzrhsjY)9_t#T(*h@CeW{`&z99vBYia(|Tp@mKuu%aZ#q0RTtZJhwY?^iaU0_*#J? z2~`88#U2F)>E-ywdBREp6U0CC65V|saN=Q4&Iz%fM{uxSsL)+pMrAe|_|pl%&R4_c z8@E6Gr405!8}OseSe-xgBQ`JLRV)Hv=bAnD)*Q8eu#lrejI0#o&5v$v)CF(fT-iE3|=QM$LW(mVZ~|V`3pOxh))Ng7ML=E5}5nNJibjzVJPZMJn%` zBxu4ipbRJZ75-KOr7}1hp#9JmK?CFYx(nGK!zq^Rd`y zl3E8Jt+hMM{2iQ))DmanU;$C!F6mBTn{xlX{q+U2@UUycww!N5PU4=BqI%tyN z9pYL92J*R1i?@RU7aNejtTz*$1?zdd093zjI6VNT08SL~)Ka$$L-?0Qw_s7|TWrNx z%?BZpk5C3dn<_|k!CF^aXFlw|}w(6v0wH5sXxeA939r1^s#@?8?#Ssl+jXhV4eb+xC>xaIq zXA|I7YCIXbhiM@c=}0QD8_&51rcSn=Z0sx<7uPMr7T;Twsd>t(@k4%<*QC|tAGYcX z6;~$vXw6Ud`+v5&h_9Q|=QJ`;ttXD0(#y7|)~Hqh9NWvI14D05@0((0rt9YBw5*9P z!aGFRsZv9~R=}_xL4L3QcJ*-(f5Xi^6Z6vG*4}TRLCh%z2JgVb+eTkxEn#q zjxFXGM~1QB@KKNqZm65RF4h=gJBeDS(z+#XQYw3vM>4eJ=J??=`sYzVlw*|M;ecT}wT2}+Y4<`+?Uv0F!G(#AcZ z-LGotz8a2Sa*H#JiU0~Jhv3ng@buDC#D#M$ViPEil%5s{bkqz4rAa&GL8A6{proI5`p&XmBjtcby~XT=v1|8ksr0)eUFs`2b)j_PE!O{=$kyP*4~ zHIT9O=k5AC_XoV-FQHa$l5zx@PRE@+nwLrXCt=k9X3N9xQ@DI-jeSpAE^e5dY5FRn zJvrXqmp4}rBP0guc5<_Oo!UUQTb5Zvn;vCgz-dEc8EgCEicV$S3v0BSP6?|Ezy+mk zCSBDj@%SI_ARxl`)h$~|J~VW})yE;dmk#gFP# zrW(Ph*MXMq=KV=x#Y3~ZIN9bp>5%=7S+95*NG3a#7y<%D()wx`siK8GEDmp^Kx))q}C>2BIklGg7y)B1Y5vbz^`!Fh9X z`u@QxEK|~!RbdVv*>o_t`$9@=&<8|I$hB-;G@}<@1uRuq<+YF;QmLN+mGt+7{Hf#9 z2B_>rlp1TLrFXE~&gH3Pa?Y!+GkQH8rSs~~y(KgK*jNg_?_uy__zl;SK??}?BwbZI zQn~=;n*r+y&%g9SaxjXnRZL@;t?JiJ&W`4=P3#FHE9|c{Hd1Rg*A8dk0H&^SuSdu z3f8nl+`Vg6y`Iok<9XUmoaZ?_=+%XDgP$omkro)}Y;Tzt5a!qwfeiIiZ z`#;VG*L3?p_M^7-?rj6%OPSVq`u#d(qd~Ha010q~Wy0!UIIS%&?D~oAW1rURa|iJ$ zC(m*HOPj-yIT}{^|RZT9s^km2tKM|iP3540>eSD(aJOL0qwhJ z#vsILn|O&WN7FBK8D7&Gc2$cp#k7bTU;}Wpm%hv?#ebi9!yZNut4vCrnZ5?o^1zx9 z54@$Ria5eaeCZlxz&>oICc63i_~3_W6?FwXc@OeWpNEc`R*zR>*qk(hSSILO{RBFrkzLNx)iJ>BSq;Lj^$1OCwB!_`s!I1F>dlkHG6=*H%u1qK5$__Q;P(EJoUJImtxUXfsam!^>k~&!lQ6(iDw=xITy(rPFTByrg|#^#cd%?T(C zv;A!CCnMw^cH*c?(v%N*8 z^^@VNuV0!Wf51utB{G(q2cua+9EDgG&S|aHN5@bavdxH(TB~g6y@5JU?G`FJ=~g4A)o?Q5>9U9J?Q(>F}CFF^73kix*;vS>CIF-mLs)CvTN)3~9No_oEZp-1AqWeh zEqXr@a*SZbnS3S*TqvMk^7+2UBV3b3T$cjfLHF}-gfoMV^X38PkI5!TGdIXs*_}@U zYd%|1m?eu@;ewIS!E9cO2=&LLH4v>)`oRO~ur*7TUM1jML}yQ3ctDockvawrj$9lk zQY(B7u>_Dbml89jm@KG&&P&$6SRVqyC8U073|Px$j1J{fLF}1%$()(;TRY(W3}$|m zi6zv{%s+SvZ5lFK+E0)kCUT~{fPr{(=y%hIH&mBbQxfPJMFF!$g{zP*kxSmzKgtXj z3X6!U>{QPSmIZVuZlWX#`N8V}9Yb=%Jmys)`43RYIu9A+3g{ZBSc15ofdMnA7N}L_8@{4 zKFoe=rWV3-gG^e$cp?&&$<)$WZ1_boP(*XxJu|)%Bdd$omdMOc!c4ZL0c#`+L!I3` z1!N;_g|&W^O~u{SYA)JL0b)kkBpr=<8o^HJnmz`-{-?~*bA$!9rtXk(yg}RotAqG6 zraaf8R+4Ilr4!fNfE2#3$j2Im%th7{DLes>)#NXt;(7Hvyq;c8Jee8V8Mc{x`my0D zbMUuIIQw6KN*5JN;L-A=5Ik*cqO<_j{g{Tx9Jt|#mt_JYucOx;me0oAC*}myD6~QREQ}5Mg_qNNBX?z?#9vg$d~cP zRCx0TX6Z{}-VTyx-f)*6$#k+>GVpk6Lps(K`+*I%j?A8o8=`qqHbrIS(_5@8uO8DQ z$7`KivD+l}+Zpee4z}!Q^SGicZaVaQvlYxKyQb6g3YY0|5#3}k12i`X4}zKbr_uVX zAKPZ0T41l!yvE{ncn~apwzW^`mMTv0f$RJ!`hyp^2uQj*N{p|l3L#!e+S%ez+K#<# z-<{0cwYk~R&1PkFKO!-u3W;XIYMQ@m+xN}4#@npWmZKjrR%I(o=8QUDL$T03vY5FN zYZvqt-RmotNDTuwx{-{V=VFkb90mfY7P)+c`MmsYTLNh`Q$?1&bGc)T!swmYAhJ2p zP!LNM=k0H&b&+))iXtTobgNdjo@#BanM!>XhbC>TnVY&w7rg5`-VaZ-PC6t%OK?u9 zdqjnCt9reKbBnfgdMs^WGZs|Aw1;Y&f%$MF4AxQeMzq2%SyuO+^_cCcuU|s2cf1s+ z-zWaP89PF9=CJ_!`}thOxck9aB2UZ2oB@cBAn=1`EPC+QS(yy_;Dp|<+8{h{oHYO> zxqWl!`CHJ>sP&H1Y$5t8D2Z_7SI@)Yvm@2?gk}S+)~n|%Q8|`?>!1C`ksew`26;=Ya3XVql4)d_XnEteYmssw ze6-&A;vF1WJ>0xIis*#Dx)u|!C_urygI>{d`wqNty~%*^b7YV(T%m`7*$;Zjv=0V; zT>#BGz;6V8U5w9cNa?WEajU#(7tAYiW+(IfXooX>Nk9h=u?z)x;Uf`LLOWN>I((0r zL{b^G=%gNx0cX;3v>cH;#rxK|Mw15fy`DT~TOh!vsL?%#0lr$pC8ra0**n|Eck8X& z$xBY)=xPtxzNT?IyCMsx-^z0<>t5bR-3Ynw+E1d3-VMTCl1W5zM6deJ|21}~daQ!3 zJ$Q_Ph$L4Z8&xUeLeRWD(We;sM{b{h@0Yn`F)>;awzTVhP|je)1n$f$8A<~GcQGj zDXmfZUt_voPfhu=qTj+q@ZrwO#4}N@B=-d-aCPTP_r0w3j#=sCrGp#0G>&pC$X)E{gHYHWJUj$I() zUA#?j^n8)7ey^#7RY{0TTjnRf@K#;WC3vmNF?*T>oStTw>a-94jsfI!E1Jtvz)G6J zOmeHjBQJ2wrr76LT9n0x#Y(}$O!1qENzCot;mlj5U>BZBZeOtB^sMko*&@a5bOe@P z0_g{?t6&A?4#3*8w>>d;B@aHt{Qmqh!NA4o!GO3)_J5AXsnGA@CLew+XtN8Whu-|l zHHS0|^tKxzuraOlv~PeCRQ=25)A9Fl)-s!DrqIC6m!YO=L{4#}XQuLg`RG}WOs!5& z@8@+!uB&SaGss1k_d~$^&AvW8q8}QsUg-j>D;;O=bT5G*6LW3~YL+8@T>v?=T)+$3 znA$)orh+>zL|s>Fp-^tl?<)Mu2k$ zK8Q$-DqEB-@y*^y=STmN^{*4MOvM{=%H+Y&7Iy+>LtkH?2*rKnOznPDtIgQCk3DbT zA9fpS0+l#pFkct9*Wdq09`t8#VTuF-0H}xme}g^j?2YVk*1zn%&npz*YJ3cIQ8q^+Oc|=KPT01R{fM&H@Nptd-Ck2xUjd^7go*WV` z`&P-m+#8Tz^2GfR(H&tp0EE9G7Y>JeHbQdmN5S9S-KV`boELnu*2jWH1=T>~!Lld* zm*%4xU*3XfJ>nToYQ)5U^R#&he&D+q-H4*xXC1r*ogEiI8N>u6Jpq)wkI0#|JkU0e=s$lL22-6+NXdf&wwkGhm+IFz!sG8EAb33%y382*P$Hs(2I!BY7F)Hks8VxtcOI`rFx-QiGa_1yQ@~s} z5E}uiYt@BPlH7d=0WMU{w5T2NC4H^DLTjQEi%;2qi4%qDbDnJHY#kJc!qExf`PCs2 zeC@oS`Ay>SzjwQGsn78LdnR;FZ@&r(2LMn<`+ryQe-DLPG~d-W#gTs2f2ce&GVlYY z5FKe&c_q?^^%0D+i0zs%bFJCb8>r9E0h%~|UTQ9EC2A(8t|t4X>r3h?dn;>eYg0YF zih3FZe6M9*BQC*_{UnQOFyB$>G{2}io`n|VtQ~KI9SpmS4dhH?#Sj^blhb|gFgV?s z(zQPtmlzy46{DAfbb$dhV?+nY7CRcaVHrX5EH>}vU zwXwze?#N}u!zZsPBvX?|n7P9It1D^JhC?sJ1|dl#I>#GsP7<$KE+cS2hMppWX3)mY zOEgf^7oPG*2shyEShM6UP6L#rRpV$`e|0&u41nwihT_}KpP<8SgJ5)5?CUnbS-+RP ze?O47w$rz=&uoi9Zod*c0C{RhBpw6JKOt5&Vr)~&=nN@rl%IDoer%1mPQD^?bo9Zf z!R!e-N!g-xU^ zs66RsK5C2OA8;t?;NE$P4O< zZ|Mhd#tHp3TB_#~znZt(7(Mg#ZX6d^jX<&}Z~mzY9TSej9WtZ2*r~#de6&w-AA2;M zwd7r4VL)}R^o~n0=CBC7+x|%H@JZLK@DVPaoL8~7gi9#}adB>sjX;n3IJR|%+Gxnh zCVqdF{W2?PnU>Y)m#xxEUGq_RO~Ap>ui}S>lm$s}7L1|$|vgr6Kjv04U&@4h>A1^|eU}LcW4lfEpPxlfcPx6I|?a!jA&sh^r(n2RIWX z=R$b7cU8D)lqq~)Ej`1OB+Q|+MT_pqLL(YAxA}G7F_#ByZ0n4 znel)R%a0(K`*+Q@B9vv%lnipd<^EhCw^4-16Y+w`_2;6-lnz!ZkCHNRW_%6+QPcH5 z;KaOBmY{e8bBY-goZg3TyNQd}w6boiWN6 zha17`S7K3Mu{Aq)C`?uomP#d{2xW|)ScX*3^Ru?e6IlI-G?vPnti-dJG@d9KPlGjf zgk)cpa~U%}TJM;6fWMbsk*Y_mFH~2m7(Vu$9cl*+s_k>x?M==t6RX!UcUGGYFya)O zEVEix;b}-zW}Z=TC{vtOF!qE7?g$H{R?3H~V?&_Tk>buH55y-z0+S_tCMF3{nQSWpvV!aQ zfC#WobsSi=vaXPBX!}@-=vRqe{;3dH2P&xpiUA!{2hD_t?|@=P&+p&{$xxEISvRjiv`beGK1QD=OT-=7|WB{He3bk zN@T0{OKK}iTba)PY)!dXWD)@mk@-}H*X2A-Bb`eeVYQA%nM?PHxNeYAAsx4$>-Miw ze`z> zR+FE9r{J@h)tys?t`u6zTrfxC1ccN7JT<>{_V09YaWd$+wcPwelY>zc0F-3>3o&TG z-#7#x_C)htJj&26C#CS#0l`@lh{D!jN1HT~9$JYoc7Hl(567pb50u)R>vu#CDV*kD zeweC8BM3Wr0i82E#eva#Tlp6dt_WzEJl)zBZJ5@}hXVu)gnxG{q)$sr>nmyi#UnN= za)8po=UMkQO~?(Wdz4HeFM5`v$pA9T$i4n~3A(_&_|K}E3Y%kt-09w5UTKT;#5^q| zlK3mPszmnOJTQEs1R&=+Knq`6)PLki+uve9EfYd+T8@Oo)r9VZ2zs7!p-7b&F zS;n|R!}@Vj^C_K9R;&OVOm~NEI}lqGf7O4fc*c7v&jpBYVKCh1J^wBz`*$Rb;ZPAd z>t;nEg>ZY@o8%#)_j%@ym8&pUvbWliW%yU`Bz9cd}Eo!2?H^)iuI->#d`G1~wxMxN5qWgK(Mu-o||Ym&&27c&nmWZ)5fLvv{gzn!yuJ_XZJY3zs7i*=L$Gw4sA&q0>`iy-_B*B2_HGkz z8#yW_6?bJ4M>YC5cV&u(#i>nA&S8q{&dLUdZR-$YITuRMu(A8bBmEMV0QZxcWAkE# zVyc9j)&eV$jAM@;C3y8GDVD3e>8S^+8cGG*sawoU?Ziv*n8@vORHYymSwWj5vy(S~ z&&OV)YBT;L_RBe9i8_KgCwlu89MsSeS|UwFzI}f!M0If|32KCr)m&S3)%IYoxzi)S z>%$DqI8&ZW3U##}L46L9(YWX2G|zK*KreJv{+;C<4aJo+oIP{w!*`Z(mpN984X;`h z$j`GMJvoy2vLy4u5!K{qXkNx1Bm0^+wgd=bN1w#s)o zcdN$W3&7Kpm(cfv7U6UO-RdgDOq70nziik!ox$VS*F)eYLL@wK#Vip#%=Go~*Wun_ zbi^;f>c!7A3qxX1U$uX2gF;=}C-u~nUMhD+z`F=ykl1#%mhZN^!2<%>{Tbiw!xA?@ za5P5N=EQSlC^gpNuGj&Z8kTAAP>n|MoW`OR`g7}tY;e6$g1#Z~mLcL|{n2Du{2QE3 zuBy}a2KAbuY)HHcbybOoE42o9@>dvS$i#BUxoOm+6D2{H1_4r@75^hDX0#qsTkxy3wZY}}wOl0o>5dR1)!C9ar znV*o|pak+32t-HrqmbmEuY{t~lZA!dtQ2)13ttKkpeoW}?-@xSqX^_4Ni{+kze1J0 zG&-!OrU^Cj>ZO@89e=?r*&H}5qkv&C8fCNJFi(6)aZ4Ucn^NC$LtW=@iCCT?awUx< zQ2-k)^P}X}W$xYAFoYoSix{%+Y@@yV7sXWflfb}{_CQ`w!D+~EM!jjhC;!nGMjQ;1 zjYn9+KUDD!&n{v1Jft4b)UCjm=4+4^mkYl~0OD&Vf|o-WEQT|JxJScmFamYgh7P|e zg5fH!U-amOSIVQ#zln%4w(H9WJvDr(*On8YlZWB5M{^PfPBoV#5n1?0in1_RCczwO5Hcq ztd5w$Q}IAVqVTnOY%($Yxp|Drf!K6fPJLdNNK&)+Qc%xb?@)M!+^3;}JaJ$_AkJ*| zs0g4Cz>g}oi#!}(xRO1P02j*?M5C7>w4kqCrWt7(cfq;^g(5lzB_`T17oXcU63Y*A-$xGZ z%Q?Q>o)ytbi{PDP_T!4<>F%VGtDWOo4}P~r_eTG7XgA~gKN`r%^~#!NKmY*ue;{U5 z07w997Xum_11Dz_M>=aeds_pWe=^8_H;^XD0(RN-2qCvWsEfp5U@Ge`8*gxH_v)7PI_7|?O&OF^;J3GzPn)I&g*ZV@-S6#goe4brpFPS>A zA`mQp(P#&X2mNXHw!FD*a)_=%f7}Cgx_m;+jj!JCk!|@uLAAlA z$l4*Xt!RQ2F(bJYR7Wz48kvq)ByrV7lqCcxi8M_GOONQ!8=7#XcwASCh7YaNhBxn) z^yXC=7Ag~SoAqd(h!itx5*qzyNXfFYtsNW3$NwF;*YN*pzvnct=CTIA?7S`ROd`mP zqeyq4NL3Ip8!H-%7h_1`7AR6}6+1`RT?#<42o|agHl&N&+^Q=h}T5rLlH&3Z&*Vn z{U{|VO>Jy3n3$5qsbG2sv#@P#?V~&ED$%f(?CVxYO1`{Ie-mc*-n>MA|Hl%kT>OAy z%Rk`u2qgdj@_&ABr~l2L{VxD@K#ITB8f$mjM)tG$6%$bh$;R{X|PQb|M$I*8EJ$dPLuA3^@rG_xv#nJJCnn`+TNb{t{XlTvm~2E zqbGs*4nGZ)ABTP#ivB{TzKY_B7_2fS=K_FIKV1=!l%kz1R%tYuDsh>pD3BtG#cb(6 znb!6WYqfeP$5AXb@nMjE=v|)=d);RM5yio58A{>I7AfrAJ()T+>+=t@B=BeQ$@E9- zTc$#kb?sXUQkK7|Xik_m7nIE@eesufM9nFK>2I~#At~u&>zjX&OfSlmNXFs@=!YUm z;v1P}Q4))6A%kcf!AgviRH&&G4LH*n&(IL#WgI8~J3|`D0{_f}pGq-FljTB&Vzd%7 z8Bf&oj6Wd{{vb|7ruZb<8LzLWGa;oj`Pj_}4|9tc; z2w!%8pIbO(LlaC$1hnZ>LAp!;?URRCe4?eMvLG5PnDXvd56 z^*~)MuYYD1e*zEjTTQ@^^XZc#oKDbbckViGJFCt+SoXud?7!@H`}6)qf6!m{ulqmu zZ~JfhD@Oa1ck92`=k<&FpnhGy zt-qhC@y3|iAR=JlX61g6jXZw6i|cGs-DQv_QRum;ckrW{4>K7wg#qxk%Ob=^Obf{KHd=4Pr~jiw z(opk7?9Urdw|W=@JmgmFQ%JQPOdx4S6vf1wVB`%wHgv%KEuaJ8}tAJcx zyt+KUcy|3_(EX*e^N*8SwXb22tIox%-uYF>+kkHNcAP_y@(`tcOFvFgf{ZKXCvitj z33*BvZ~TF#FIcSL`v%h9nFS~znQ4`~qtXt@?n?2fB@T`~5kT`TU0Fc|h!#PdiTkgL z!m8qW`cT`>xwG?;S(|Sjig0<|>lq=wAlClQP|IryR*WPY$~ze>)mlB_G6JnSbnetK z?FIAD6cXs3c=Etvaop600eGZ{!~rm)$;kyQ-T~_%g-816WEEXGh$cz_^%a5=i6Rlg zqkiZkL7Q?pN|KrM;{uFZyL2g$i{hjYK`XMUoXzme7O!I@dXE)qO$(`8Mq*}VL3nBp^LUAl+;u&UBk2~ zn3_3{_J`_OI0QBy2BjK7hxcnG#NHd%l4+{@l{~-zp^4vfC&Rz1&XuMKwLH!;#ypPw z+(gDW_SVY61wZbZ=jFh z1KMRxF+fohTvH5_hJH`%WopjKutjvhlN|vp`@~1wjY3U~pLl0^hXh zz;XjG^nDu&&cCk{dI=Dt#e%~n0-hcnRbg+-oN>8@Xc=&|2AI1a0aJ)s(6p`=g2|V= zt@c$wg5txuC&OL}ktViZ9kX9y0iybG*@c|<6MPp>xn3lee;ync89rH53OBK0{}glo zE}Adr?9wz!geaWIg%IrIbaitT*D$+`XjmvA{u9aY(~nz!gU^H8NM<=dLyr* z{8r-3It;mKEp@}BHus?HF5-t4p*(&}zhJfIX5L>=h<(*l5$d4DUSuTO7E3PZ)5`-& z`)z5gz`lpCV?XD@_-N3~N4af33zb5AjE9OI8K9eMYIJJdDowLy+uC%WYT_YT02u%| zX6M(>3s8K_74k@;3F#P8mqbhx?paPBJhk!LQ3I{Q)W9xUzB5fm?6-K&v&@^z2l$^F z>~^udQ(}aTn&oJOxxdd6-bPSMNt|3n%0q;y#dr6QJ%gS*_gu~cn5s$B8ntPJ!oJ>w z=iFDp)Z&hKIJ;9TZmV2IP41~vYK^H&dQ#ObfNGN2-DRY zbgT#;=`^wX!XxQcGk5RfW@(HZ7tOX4#oM2zARcxhA{;)OXFE53(9@@>1Gjz}168^+ zSSuk}^e0yk$}(Ye6NO8EWvnO-#9A^0U@m$XqXe51m@DfR~a!g94|AlT9zBF0jULQ7~87o z#MC@(Qafe}0?G+~@Tg&&?)s{oyBxrwQ06}Lu>!Gyg3eBv354uJv_KM!X3}SgLUHX` zB7zbSh`y}gIZXQqDt)a%F6Yr|mg1{(9-l?v$5?7cvUpK|yg?l0NlP3|U@09={8Q8w6ChyB1+Ec+ zs9NFc6^Lv8x!bTM!|=2!B3T7zTXBHDgMfSQBCi%%3Nlb52uj3QWQ;+bVRVkR%9GJ&)@(-$Lrd~jWe z8!TO-Sj*N{Hp(oIvg;w3P)U( zH$S>aet_8&2Us3j@j_DZ5DT-bku!V36DG(zsg9r!#z&e7L&BiB4#|^f1ro>2bx=K# z9-mam;!w8+%wr$6>T9q`RRletBJgnum`2bwXg#G8uo+DaJk5)YuxYR~u=E6=vvy{( z{#q`h9lq6A*b^JKLPdBc4^0YLQ6lo$!aQf{hhcmS{q#xDi)g+DbL95B#tqHt zH`RgC^RZA5UPNLe{7{@7Qx(h$deOZbfRie~N$Gafx=OSz4GnKsftl5bR~7c_A2j$8 zqkLAdKL3}gjopwvbRa_Dt6#D7eC)M{=RFV|ez*HQd~4#ruim}lzb^WhovZWL@3u`I z0CIVK(Rtl%6F4T-`?GbH`2dp)}avoCt2fgEJt{1?>*l7p7Yh`Qx6JXg7k>P!~zp*7rK=gM1Cq&C^e zJRB{va_YA(ZA`2&n7ITh-Rm6Vl~3nw_i8w}Znrywfq2Tx7w6sH_3KXlqO?W`XH=sz z>qZuoW)t&l(Mo(zv}n|d(aU2m2ZjUUpMI-huK>6sXM&>v66+1he@{Ojixt@@ z3IG5A2mr`QZ%$LL)`%QA005oO000yK2>@($VJ&T8b97~LFKlpOa&u*JE@M?x1ponA z&x>5Oef@hAIg;?t!(XAv-OzS$0%3RW-j@v7hk?N4CL~-4b9*l@m#1xak{+CHpSvB% zLhf(B`jS*qs~xjDn`Z{w-TEk%N~KbL>EY(R%}w*q2h%5JHqRGLvDluNf5vBr%iO%7 zC;01aQJClT{AN*JT(;(@Zp%qw%F4`^`S#_#&4>5y{nNBKFRQ{fb2f2L4&OaHdwzVf z4`s?~GFwgyvoV`5;N|D-%Z+>L@sG3es%)F>%RTk1X%}U6fzNb(>~|x0GO4EpK2wjT z#dvuUKdYk$=gVpmJ(?AtqbFCzRrI7D|5i-e_~9I(XriZr*zjS~=4}kG9cu8f&BwEX z5q0n3rn$;LmsiUxQ!TH?#lqC*W>!z~nYqpvC6;W=93JDK+On?9;A+{lW?Y!&Du;0` z?ipj+%e*p=|MX~Nrpv;#H9RQH_@*rocynGauJU$hU{dW2zJB(XU!R@4{qDQRj~?Cg zQ+=5?SIb$uDB8it;dkE+;9v9fsrmK!v%^F4^{cVJq3*MjS3`z>Tukz1Qy758@OT@O zFAB4)%JZ_A0vrTRGs&x}Sd8cgBM?D{rv_`!>#}NLoW*}H^I6&6Ak@;Ff2KxI{5QND zEBJ07~ks!cimlYpX*4IDc3N$_5RU&8)8HVM`g+%BY&b*HM)UA#2BzuogcS zBC6*FO(0PD*0|W3%<2Yc44~V_wr<@d?cQ^wFkb+^aDJH{7R6+_Xb>Y+U2Or)U6mCq zH@mVwRbo&8$UG0w!Sgq7O2I?xN@)$Zhr{C-S&V-?Ar`p0&WDhbAgTCjLZZO*5V3S zn9Wa@$YliDGbw*)o|&g@1{xhGu|BKjQ1%>}w22#xSp@Zwg`E4X(|e znGF>s46ycWL=Z}syu?lmXaYcmHM%fW@mXjWhn-EbUFISq(|j!Frfj#>5+gc?+EgjA z1|}XHB%yYj8-{t8H-Z?fKcH2KkAQ%ei^}ZauUq)Pn86k!4FWn8Bngxx9$fQp_0NlZ(meXKMYA%T7O zg@*V2U@{ygxe=40S!YN{KH;d$K?RaPL#&-z9AOKKyhOR8;z!&R?gEZyN=waUy_`*9 z$+eS9*csqyond_xXK_#&Euzc}UkF0{oA|OZ+7{`M|kp4zAv{C7=pc$t28|bf#W!;-FBL^4Z8Ttt(2{9RP#*^X#gm&0gavqZ3K4O$Hz?}C zLPt4|&Wg+i_yh#}Y#47n3u&F2g;rze9e&^)g2!VB_EVvabD{_W0G?V=#)>!fY}%B6 zB?)J155GZ&(4?iJ*Jl@t`qMS68(M87zo8h!g+|m?<$ncDq@;<%dh%-yXRWtCpPZh- zVQ+*-+2ByQLG=3RvIHa!EOb9cP4njE0eLS4A3XT5EeJvSe0NBaohql{)kWo-jQaT* zoVmyOVo?@;)FWF+FDTvKg9pLJxhQZRlEm?;Y%hsCE`T^HlVPjfT^%Z(-8ud1%>9d- zYMQsX*__@?z~w$dFwPE+PW!-!`g7-bu)>O-xmgKV&1Z!JDo1gm~;_b}wwpA`Su*g#QufWX)1gX`f#`G)c^Y|vX~ zXGn)PrnXlFOAW+ZwiIJAAVVxzX<;P_M}}D$5FM{gvw2apOwmdCytMonz7i(vAu2{( zNDwelCE-q{`YdmnV$lw;jUR($q?gxyd+d_s3#C8kMFy}fT6F+FCut1i5SSfUR#+!9 z6IzK=KhfJ*bwH>h9=tt_mtH>oZ7G0b8z~Ws8oz7h(YP2VLNlaL80hB@q$w&7@DFzR zfqZOjS!vA83#~!j#FjJxJQ5KypUAY#C%aAp5w1jHPlzxS;=E38IY&L+thg>_CTnZ@ zlHHB5MR8SM7mTa~)ks4;loZ8OW($ta;h=0KwIS#Nd#*qNJzHC(_}iVdvvZ&$#8q7tSm#a#j$>}9VXK3Rv6A56w5D*d@30OFCommO`C!3w zlv2XGM{tO>D`+_fswp2l(DFO$BbW2{u>7zq;p#)X#7cVbPx-S0v!vZT%yT(Ucq!qLhpavQCMG!{1+Jr0Uil#rUQT3eLTN=hQS;FI)qWSSm zvuDMesW`rM7K(d@esi}^StCZsFN!HcP7ggkUgB{y?-imgwQQS%bHj>FZvhy=j!wuS z%Y@}!Ft}P&7^rP8rX`Ns>DzTn=3-WlL97KLYq6aSz{m_BK0^f3x7?i1@{0~`8z8(H zZjAZz^9sV$tP&4Mi1=~dD2)w@7R(riLN?~A2C^V5H%{x~4$9QbufHB2ycn5BR^?Kh z=gS!li3h~Bl#+#1uz-5En24$?sXxQj3tN(yY=97*nuRFUXgX@(*w ziFv^ROSUU`&7d8jtjKpO=*&ZBy5AXO34&0#@zND zk8;5j)rQ(BcxN;D`C`k z{mU5{vWuz36SpFj0q*zG+y}0tspT0R5m``i4ibx^0ruLM^F@6{_JPl^E}I4=7P9bX zMaE>6Rq(1IV}LKy;K|FLTA4L;NQqCTh_mvd>OGgrSL~y!=YtfxpYs{Pp1_qW%m#1WE;)&*Cje_kbZZ?B6#x{wf2kRf;+QV%FD_oTg zu27k(xSOh+xr5aCqJZICj0D@ZLo&v+!ULgv<3}6y=kW<}6^mJSi; z7eNSBQ*tHAxHh|FOxh)gX*a-}o8=g4@)MSgNs|qEe#Mo0hRBi<*`l8>DfD zt=p5hV?amKVh&hf5f>eV0KR+L;|HZj+Fy}5e+RhOKci>QL3)@C@FAR$hRSiR$f0ml z;d9x><(+P?Di*L@o5HI;bFyx*sQ*W;1MpNFhj=AzY_7_CK*d@i7ojUQ=HKQw#FGS@ps9$WT9lWnYU zeULLMyd60p2_%4mp~HSc{l0LBtJsW8WJTs*GWZh00+M=L&#r}6&`8j#OWso1MTUeX z8YA+yVp}s)DGZNJ7PNJc4pUshv~yL)x=TKnteSW?-y??B(@s}7L4XO=#BOpC%s&Ag z9iizp!Mb^Y2f6!Bvv<)7CzXNl0C?F3M1{33;4Fw*I3Pgq-x&7@0&!}6vYf=g zM{qlpBlcjEd392bGjuB|gq^{aWwIQ~j*s>{!XIJNG0t#>5IJ15o=)ayhsR+CBtM@x zkmi$Npl-Ner5z5s5-kI2?G(?V@e?iB`JXA#$6~AefQ{K7xK)0@eyH88t%Q~{(!7w% zUqa3e%mRL@fO}23&fVrHM*#vAHM3!kK<%v5GdKJFrWB|tq}i! zn-z9DCQ3Tf%~=1Lv^jvGF6VG`aJa8l5Gf9%cp!H z8|b#UK6!sQp*7f!#u+a%+9__xJ5}vF!P;bz3yt;oQR9bVo72LtRnO@6ibTm ze)9Ek-ZxhN(NW~u9jRk@3zjgWYUTc8`H-4>R62TZW_9Rk0s;_)rsL9G)vxElVpp-; z!nscw-R@V#sD;>erIZ^lO>v1WX&s2{2w9m$!a+xeWmO`mau0Zrhoj#`A+;BRwcZ^fD1s{^aefpNggG^)M{O14a_uOw(C;yWqZ=}yg>M$tM3#H#8hY^{~YLc zP(SqSr{{DQJ$`fc{P6hgeqc8rnMb55y{ESCooM9*PPwA<2{|KBC=Ar9SUCoO$+}}^ zsbwgLnAjAcO)Gba*nt6^*_;wgI^czjJCveAcIc&2D>;ew9**oeNMJ#rhv2$bl-Kf< z7QXk4nrlaZa3;obN{|up|04_R`Jk z;LNs8I8fsjky2<-nbeW?4qb)~`|x|bKU*&Ix9Fke-MKiHWelwD(#xgW$=g)}L9e_Ox3S`r6IkAkGLSV-BG zS}b>1l=Z|pO14|yWgbdvIAeZc@j30h{OtG@O^4Tms_JTgx1M;b=2>kSWQlYw!5Rrx zgZ!p-rgWs~JxMKo)qz?>q21j3T2VWin?|cG;41NI3st8f(_sw4E2X$)^-IKc^cJFG z3q@vS{hS={ouxpJXDIQ6u-qg0LhqI`&SAjmd$wV<%SDR$kURcp0?x>QbPheLO|=y{ z2Gco|ktQMN=z}#USzTdhN6P)V-^By6QqL&>U6`O^b>c_`wSBEb7=aX<%;uIdRQQ_< zeftKtamJGC62R-IY}`B(LCw(*Ks=!4L*-@Aarv4%+f1NOV1KQ-NN#iIrUl;wI`YMO zcJk`%r_U-pPBaJo{#bKs9Kz<650-MjLPke#xo>_6$YlQc5*Y>IVsL0zUf>|bj!{rv z`$f@Q`1vO*W^jN(iH%QYNEFCkmJ13fnCAha>2Pxja=9>)cPINnJ7h6kil&<6`usXC zXCzzMRZZbcO-&;Fh+It^|R)$fEHq^LXF}$-D7dH-Xpkq;4!iF z$g^XP{2^&*AgESnI4|+Q?iBJ<4v}`GekFfhq|9kyh}WdBGxjd_r~^Z8TH>#e_WSW4vTluYfmVdawvd(vW3NCo~OZ?5vs!`jMb6b-wU^s_$IPrLv|=GnM8gdYdi0k^NmkFKAOG8OQ7`YY;9SJn&m zNxO5(T(8DdPcT;$>czn#D_c@7){$ei^0{^n)x(Hsd1g<$DjAAiJ*SQKmQyG^{X71E zWPyrbojiN}`q_y&d3U(~*3h%Rvr)IJ2a0wpBDqLoQK+5QvswKKeM&>M(Wc3kRa?$7 zUhR#cm{*{3f+1F~=&L+zNFRCw=lk`b6pLQYst#&Y4!aJQE1Pz24e0U+9;4pY3KJ%q=rF5h1_V$Rg2yCy14f z5&;10C;O-GPL8}m!0A+dN`TO@GUFeavDtJ;_VB9MKA@ z6p-*f+s@2alRW_(V7M{&+rNuM4uVd$%BvgL`<8PnT-}RflNtROZBO1+K+G7aR?qA? z!ba~p7eBvw1ipLjWsHCu_P)4#_*@Rgp1sdFYfAPZb3O;XAY*CXzo802c^!(E*P=!6 z7;vc(s5tZzsJ_1ZJuJxok>z7KliV`TYuPAkmf3%wKAuuOu6vS(2>XEl+eJO&U~$3m zwQ{JVMOFgQ8Z;3&#PM8+zX+wFGWcjw&RctCCNtfol&D+uP<3vXuxKXrVhYnXqvg=3 zDtWpJoY3-{M0q&&Lzjj44)+zeY65mpp&D$?-;Jmb0Hb9U(_aE*o0Ey7MOO{TaX{}fo`pq*}$C?)LQtuP~tIjqV6u*ox8Sx+-glaQmk$0inRlicGzp~1E2 zR`PvR-nkky%{C%Js@MYI5eSjoqd`lG^SCO6OrithDmuZb!ZBTMYbS2KnY0u)L`g-| z%Cju3d-}ak%{i=6!`$w!>Q9yk_Idd7VE^#N+p{y4WHDPdm(ImocZWe(I`D<*%q~TxSPRt8z;*sU^s3=La_GI+@p%@64Py-0 z_Yr>AM-e79eEsh56hsNTgy_xIR**&|?HWB;R;ahB6f3h#Y}o6-Z0FwjFpHdW7tQ>Q z)1IC;KWE>>Iek4~osLWT6|E@T^D(TSbM0j)Yh|{{%&WI)6F`{<fWv}dICQ$`BQUcE`jR6Hc-yCUO6icu4!1%>;$ z<&aX}lb?NdYmb&e7A~NGAp#LT+|7obadGZ1esP=8@Kg@KVAl(Pc)Nc}mXd+w6hOjw zKc9S%JX%0CkI%;gnsDfiPC7+P^HyRgB#FVK+awfAYtQd)?Q&=jPO3SU^lfvul(qHt z_c@suIhiOGK!GaEd~uNsa;{K2a@F_*73XM8K9d>}pPX7sZ%+2#aN60CZNx39n32pe z9Zath!oJ1hx1pARVIVW$@3-c|T@0ZwyMn;wtmWuf)VQHJ3wo3yFdJspI|q~F33wSv z8^zVUy>Xo1t*Mpzp}u{IhX?Xn5U_ubU2ASU`1JN zIK`9Dy_hdx|8TUDOjqMvA8eN_9Jjw$Mst0m*X`6^)KtG_uX`Bk*Wh3m~4=_g$WBnybJb^Uc_q=NtIWjGxD(` z3%}ULMX9azmWb@@!2G8C*qv#S_YE!%U&gbPE@_ad3F6V&<=2yx%4}fpA~@l+6I-y znREK_Q)fZ*X-1Vo9H^wrq>~y$Tar&23*pxE^;T)1h%KxN15N4=`{aV)e3_Dq>{%>o z4=~+z3s0O>04=aSJD&G$_~-FzxmziW?b&??Q#UxSvwQDug94DWWzG&ZtcC}a1Aj%+u~ zXjLnsj&>G(Q2LTYl|GQTQK^RskkjqMB71v!a&Yu2)eFDT9fZ;OSZ>rwR_c08sMwwV zN+#uj`xfUYkz@3HtLA%+!(Vcv^_jF67faUc#(VAUJ?HM|jM+A8!qM>&9dFndHgCj@ zf|VUS272l|M<@#)205gH=9$VQX^@xLl=_F8#0^2U66tP)R@YPA@SMjX<`x+izaAE? z<=ip@9NYuX{@vjYSOne7FiHx{{3hT74|Yc8vGU4+BOQ`ECzh~uAF5cnZ-G7cQ8Io? zF-*iwEB+!6g+|F|-9L;L1)hxVz|}KVjDLWcX5a4wF1-AAH_@n5$fCT; z7dMph_s%^|6}A%kS7N?wA+ua}JuYrJ@hZJVFaPfBXKQmyqAAQCafxnABDjQ`rBRCA znCHn^#U5~M=937PZv8cx(6VxgshgXtaXkxJPsftIJcs20Leg5(r%P|`S=v{V3Nj0v zFuaM0bf#$dB;zl?aBTjo|9bm(DW^OD3X7cla@W$$%9A7$)wbX7tnFHD+xA&BQPH{V zHfZs^Yfq)s~W2ABmg}W8U zpWO5at*$jCTH1GP)Yuu`fd$1{);c4tBP`fu814Eoo5e+H>G07gzFXrPWD2#+?|@NG zG4TZ}!pz=P#~{yLK%J__3!^APV;=ha)$@*d@%Yqv-W|U=!QZu^#0TSza0B2X5TOO{DpV3;@l>0f^R6UbF(fGJZd$(E|0G6B-iugnY>?!0O0Ntt7+q~Y3KJ%p|vK6HKk%gFo-mWD3>h@XENnLkk-EPFr0 zMTbkv7XR0g`By9^pJCHK{s?9F_FUorJ2L+#H3}+>d+UmE{9$Ae1Mw%-efo4{euV#? zu2cAbpzz)ZgZ!lM=4{76Vqw3Flb*i!nS-B?Ewm2Q}xR z<|bE3I&6kP^&T5cJcV55*M*(5vS?D%#-LhUvVhP*rVSre=w#-L##YD7>iLIl;+1=P zPL&h%V;-^0GUBh6fY;v%-=av+s3c4Zs>zO;qyA{TrA$vm+=3d-r?CnH31I1|ynhV~ zJQy}HnP5WerUQjkRHtuh+2eu4(;zV>K9xPs-q&ic7NA>amsKk_yJ%E&l69=U|CGhR zkW|HW4n z0}Z|O!-5Qk7h?!DU49(iZ6jebvwq+uf z&eKgBrxwLKxI8ukdv^fejOFhnfSD7;-_QjQB*Mo=`04-}Guy&u{E(Bs%Z8?h?e+^I19RnC266GP_(isNCwRZH8zaD8bvyH9)k4@c~;a zZGb-EAwsOP_&YdlFf!ljG`qzAvExe)ZnPUR&o(7L>*B&`J1J%R$Fi}yVr)em&TTR- zHFt6VKoz*Yb^&eRmp)|R;ONEvU*5e@ZeCo^6IWmeClIXllXLpR9>@)%)pLqYpihmz zT1MH&jYi9kj`WdKaW*^uxS%{xG#Vh#s{RzYVO_e&1Oor<>B(;AwS$J|bvMQkCDucl z^yH{Iv3g+psqTkxAm>3sfFy?a`h(vOLrib$;pg{3fTaqKjq8J-o_GL|7Z6Z za@R{K$B}E3!B{vp`rMHfm~#ScxHDVI*~@xBt~XG7_UZs$UGvOW*V{I=$mOn_(?SjM zeJElN4V2?bZ#wwSIjNXvU*-f_mthmp;nix}DY_s|u`kg3@mPRHjBjx^NgWh?7*h&i ze)9Dpmv6SX=LXUV95h^n<1M{+SD~=O1-_T-GAv$#TRPa!meVH4l^m{#_Hb>RK*T|ct~ODf>N1Qs&uIzRd!d4~hdNvXFHp7aPNO)WbZf^s`EoOA{dzy& z)sRI_n7Dv?P8#$o3holQ`(6;c>AZ(?3gO`e>0Phv26c1*%vA&mGM`Bx{&@~_(`1sZ zWoC;1Mj?7UNH@` zy9OuDiS9DI4}$xDX;U9}?jH+NpmU;7mu`C3-QeUB_``ulPGC0OtaA%@DhHoA+kp_I zvc;xd8e6sE<cn#^iOABiJ@Y^3o|;l(v>L?uUuB8wI5$Aw>pCIe;nzM`SvmW}LrN^UF@Qnn%N7 zcRQldrZC?@wJ!s2!9o>;r5CFF;D@1^bu;ckibQo3p{L zI@>wPhAZ zu9PI$@Y$;QQY5g0RQxzSTRZ-mK^m}5{Msq}*hd-jwyjF{(U^>yz2_n=bYgx9FC)(S zgcXB8q%H-fgwp}%*VZ7~FzAp-Y!W`4ag|@6v)n%3=Cs4IRoJv^(ItBx|5jMALD-8c z5Ok>kgNdEq1?fiLr`XtZ7dc)2&=wcPf^7G4u?t>BLRn?n zt-ltFdPLoc`oEEb5?*ClW~|Y97{%A^q}WfH(55iMu)$;tef);UcKXZa7reR~UZ9o{ zuQhmT9^qb1-->PaA@!U!6*YI?rBigbi)|;OeB@k5FzK6PKhqAav+n{0dOhEKLU+H> zN0{`@xyCt}Zr$R0p32IE<0N5S#>F z1#5@z8q44#qvZ#9{|M4~W+t%e;LM1$jyg@?2UmPG8Q-s1&p{BzNTC5vNdt3$E#dPK zA0q4$5*CE3wyZ#MBMnJ?j;-tr$sX8#q8?~Xt9H6qw!@oLh_er|3@?^ax5DC(e3BVy z2KIO-#ku_s`Vx&a6a(%sfBy&a*#ZXr^7sT39}u&a?>qG4RDRv=rW(Pq1dSXXAG=2I zyKe-4-6jOW)zSq*34FYoLT9TaIV>0EM&X>%cA$u)4>n5eQLnfdiWE3oI?i3J&V^-Rr9b4+$pXy$Ra%W=CfC2lPc2*Nq`F>I%d6gVt-GGPBZEst8+S)q=n?$?9{>5^*6tc7E*qR0CIOT;<%CgWO^zZE z*el*QsK|!!#ewBz$mgAsCY@MdaBe*uh8r%{zrQ5=O|4V1X^VNHARAls^|DE=J{dJo z3bAKmwsJ~N8Wv+PMgf?<4A#-P!j?-$*BZ<98AGYuLnH24b!t<(xO_>jeN$*X+vkxo`UnOmqV zC7u)bykp5afXQgq0!wfxWj#jvcES$h@KmvT@9y*)YiA~6!==l-(Gf@vj(9Wa(~@^h ziGLi$=16yZNiDHIu3loiF(OoSIHZZRtCD@9nmPJ$p-UZ_!5p!yUZG6(TL|pq^b%c5 z4Q0z=z~u3X8OWCS)vnm#Iy%RAt4&CiJ-Wb1xZ``g$RDB)mq|sEVz&Oe^d1`>`%yTj zGHS}kStwJk13Tb5(r>t^>-;=rL z_@rMQ>h*g(4}**#%H;ZUdq3#B2HF{h3X}M@+s|!yQ7B3`9L~=tb97hX#z%M#r0eC# z1rl9&tZ9>kWIC(aBK+Rj8I|#f@)`0(N;}M>ygOyV7tGKs%T>AdYIv5v5HQX(P1*u6 zblIaSLp!9CV=d7PaXr8oU)KWV#2ItpRX+p@3kC`mBc2677b=rrVR1f;5huLHChW}u zxp=}YfypX!Vx;pa8*ZG@+_Noj3Tm;!CWGuV@dk_-Xy&Jr{b#>;YZ#NMlYTbcg)Xb@ zg-qA+)t@8`B@*IcjMwq$Fq#Y~5-gd+~KI{`O4e{^8It6aGM3f$c$sDTk)~ z(wWXz8y077XS3FPg*$B`kG(~k;L7ZjNt`Yh_P07ao*1|Vrm&$1Zr4a)Fv_%7F25wr zrMqm1P1!sKf9WwbNQ7mVsIThCz_R^*9<8r5?JMJ%aZEJv{)Xgw2CKO`OE}F7iNjRo z^MZFV+3wV+NMSgLY0nYxwnaq$@<# zYWa#&<$3nRod8lO$2&10yHYYJOJ1-Q-%f2p{RjF2(cl7SAhw*M*NN5sit|f^7CLrI zbE{NMWJ#d{LIO4?7K5ZbS$u7Ei&dA^BxkbpT)E?L=BLn`L`&`B7~2znJ5L;a%Ja2OK2i*J z0APVJ+y5f0F?xP$-V=K0$A@*@G5m-X%a`+CDOa|jyvc^ig3=gU*Oh3)k^`yV*tng< z2v#`S_(`M*TCa;VLV8qd(t}u-ymp-_lL$po=8BWc!ApH`Nt%>nK&gN{X55mc^gJUa ze!^*kPV;^D{n>4Kyn3@=M_VDX+^1w%Q%~YoF+Q}k5E|`?;FJRQ$H@#Qygse!ejyA*~Xj$dwNp=F0-pYv~6T9mn8xo#0RDVXn&wObAE!fELnp2d(AVrj-74k~<4 zl@0Ey7ohA%iGcc@AH8h7NG{%r>SwCOukACWo^hFF#tIJ+da|Agtfa zf$&0|1a)k~4pJw$u9x0L46n=Gar)2FUaI!19a?|qoI3|QCj{Bn!d&W#ro*gQCB2px zAQ0``HLDxDENXeT)=d9;7xph5ZVX@$1h1S28a>JX!OXK4coV&+hzV-4dWg zJ}GslxerZ$&CyMJOC5vah57GGnuB*MK!JFH5h*pBlt3(u%J=!&-N1~fC*{RWN&}5n zBcxz4;*dkwvr6a+ooXA_dL_WiHMot36$p7qTQX{K1`!6OO~?N`8z5>*8Q8WPtLkF; zNo_WU8HxdbxbqT9C+xZs^WBtJHMF9YnYd75n22OCd^N=obFM)j!UB`xc{Nz%fP-Z{ z2p1Q$~qrQe0xjIwZYlEdI- zwU=8KB>E@4LWg9MvFKA0oYk#-pgP{a-YnM5&+2=-rn8rwSkkAx)x{@ho$3^*k!5&a zxIA2xK0#|3lT8h?d_u2OfBjjSWH5r^39)NfRKQZkv6D8?Dvvfa9mz>FZ1#V&!P5%h zcU_t)yyYXJrX{7Mu_Hyep)KNy}T@gf6!4|Nn!C7R(2f@EIleP?}x`jN3{XK&C=Q2=NIBqQQ`Q@6^b4_yh9r6 z+4J)IO`LZOPMHE`-auIYgqVHjS}d*x)tvArtp()&^nkAR{_wEWjyO(BG;#Yq9~p8o z+E-X@ADg>)vEqXxA8aFM4~HU>TW=-ySG~&3Ygjt`-5}(DMp7IEKOt}5#aqu@MOa!( zEsbB+lm9l!nDF8j?FX&U2|oyG zNYW13&?l`jj3;@_b1cl|g5yVT;#bY+deW=uK$)Mk-4{4lL0C;nN95CUj*M!*hg?Pu zow$3u@&6BaGzSXxF$g3OP(14Y8LRv+Xi~MNj>85AnqQ9pkg&E|a{|T90}qkxLSJPj zgfyzHH?(C$ecNaeg^Kj1`;YGlULuNbc@*$N6#YH#OQjDFLG;M2v-T&HIz0|;W)gX4 zQG*ukZlvPrnS=}%=Tp0KRB^EEff|FbRhhO^JzlgTWH4sMVkjMH=Eu=4xBv}(5-QkP zr!_3Jqz0z|N?#`AugeNof6B~p8U(Hzef)3YCfg8FTdNENn{*ZTXu3m@fvn$Z#`Lg`5Mt`-l*XpkfC@iz26qq(9F`(7 zD{Re`#x|QwDqn@Fd=3Tc()fXQw_T~|g2x5@TWC3aI&ft1C+T0RAny>d8X{+;MU~pn zZc8N5uWI8wL5C8Uk+%gwJ?rXree|Iws$ypFi!s#NFsSwSd|`cr`nhj7|CkEbZZ#R5 z>Z1)MvJ0A{vw~|@<{7rG{d4^I1Htp5y)N3YL)C>U-AP)VXR#( z>5_7^oRRshVxMkKax(B^;hmvbH9S>%0UD_W(`Gza z7ihfy<8N*Ie$ayWi+8NLY>mfi%gSDZD?ORrE6HKBisz+igUC$28Ur?Yoo@T1S#h&7 z>&r|mrqy1r3c7-{>$`+rPvB)z8FYrQ(xQ1MzJ7@y>PS@{fu)VNL!je3rOl8|tU>Az ze%>d*aM7KTEAT+d-$w}}9ga{!5YE?aK+yq+aBqqByT6nHUIN#Yn2^tkYVt=Y`r1UL zzsqxhllk=>eIJ{a4afCiG!x9|_0|-IqYpGRf64S369I~W?PXz>4xQpD1fg8=;JufA z#d`siabpS3Y5jl)jpI37Mc1bItkx5(5^tSLg6RCEc))fgI!5Xi6_@FV($^qxkDUm; zM$yX&>_(Em-TLOlhO*DIv9`o$#XNz^H6!+za93#|F133!Ku8ZZjj`hj)PlPPj&Iq@ zG)zPG_MX>~AYUs@2Q3NO!DE9rzL(D@S%;KVk1gomd%OVdUh5x^S&fYkODFEtZ5_?J z%Epo$;K9Wpwh-R5LdUdKt3~fCs7VC62*O!`Ztvq)T{Wnyakf{}&l==PI)u`yw3au4yACY8*n|dej!tS~Zt2Rh zE+8G|LQbgsiji$5OwS>T#w@uzK#|+Y!Vzv(dP@_D5sA~lIc;*YHvRrDQb=OkSX@Mg zu=9vJFy_#OIfBK>*a4gO68c=azEYmQgyu`X_NN92+H%Pv-8t_>OeYbW)hNcO|NTnC zUp5P7y@a~-vtycIYp2GIIO|qA1H*^S-=Wzfh0rBS{z^OQ+P@xLw}rT1PIS_Lj{>)U z9t?rSiwV*g#JlN%*?0ylD#*aG$uXuJYT~Rf&+wGd)v+cRp*t7z^BrrO+jE`?w+43> zMQ^0m=q_f6lAB!;7vN03_GEvZPEyDU1f4F)`wagnbsEI7ma#9hbkk_ zt)L)F?!m_Th9^aX>k~uIh?$RWYgi~~_)kb6HQ28txWToGSlen}xnFx4igT|s2)n;Y zEkRe_*D5(30CBo38;%;2YX#^i&Lp-keNrMzRm!+)2rKcCS26g%6f z{4!dfzy*t81TeZdwY+enFIYk~AKsKGb^RdIHnxjO4`NRSc=!#bSBR5LQ*8@#x(y1% z%ca)bo^ConFPPPG++fBGHdlETsAQf;rsFJKKHGZzTtDCAnV(3>{A@-$C4C$SJYEr3 zyXD6^9eumJBM;}s?G1F&%d#YQw|u9qzC>`d4$l&Pv@p=z4bQwD2>72m4ra2mA3EPM z{!eCo0jTz6=|AKkKj{DG@pLvbxBC6xh=Xn_6V?YzXnHFKPO>uTSS1RC$?1V~EH$cd zeGD2R^{5r(Lm-kcscd%CUoQz+!x5sDF|+(HZqv$W5Jpg#)L)=a%|^PN`s$8*CWzO> zp~y1UyA^@yP&flT)dHB!i)AivXL#^?_xDnvRy?wf0@($ou{y7LgSIMs6!hDw2k-Gt+MO%s zHKdIlGn-D zk*nE%gHBZAY&dTWKefF_HYL^pMJCdhBHE#~4fMiHg(UKkZ2itKXCi6^LkiO5_|S{=MzYdG-()rX6P0KGdheQO%EMyK{9h+=fI%0iE#LS@w*I7v?? zp&Hjqp|ByhhfNt)DQX+dIQ8*m`|afVIHXcDuWQX`WQ$pHBWdL5;SWz_MPM!xYBt|Ic^WhnVJ=;W$M zfwX`W6&8g5bqn{=&4oH-tuCux1!PUdvhzZZN?I4OUx8GC#5@~A7IgqK%D^#Fkm^j` zY?D4f@{qKQW9vD_k_HEMArJopf+LXiO#^PDQdQ_hf8k>K5#>sr!;C0P#40l&|44)! ze52hc!0U58WZ70_ zC_g!iH^{b*9)t3dF)LLJv=3~xYtS^A5@$Vd;H0X4OBYU1U@#%5&44*&eMBF2r1ZYO zlh?2#2G0ioqN|aDCl;Vpd{1j+1pDK!d)*0+Wx88@ZxP9^abVjRG1RFa0o9zinYvd?%)$gtG87f4IZ=idr<_s{1%osXyn12-pM}nBc@vkHP^oJ_cKFy= zuVqRE3&&T)z!Tx9tT!R!DO8G1NMejYQ=SpIe?=$8YI_3|6e~1nFzS ztdvhK2@(!u+#nGNNiEA}-uPSpPA$Ix4!;^A=AN1`p@{nqvj1WBt8j!wZ-0)$VB9(d zeFMj(SK9k?P;x_rspydhj3ykc78Mc#y44;^g6xzc*5I)UBdF#aXc^|bRN1h0EQV5rHP?JKvTL;2VmEY6zii;!iQlGDhA>^)4<#<1Rr_BHN`dSEW2?LC&QPYd(T1Ut~w-szaTZnBV5L*R7 z_Yw#JNhD*CRSqKsW`5R`nFOQ|?xzzMLMnmmL)3{N*hL}I=){6txLcAjGpB1=o0p%R zp*GOK;K>yFl&c@ZE!$X$WAZC_ON)uUQfAz6KfTOgOs-&so%;??&KlJB4;9a1vaD&K zrZMJeyKIy*EZFQ~W;LFkFx8{#Zl*!eGncQLKe z%wI!S#{k_CqoqUFKu&z)#*6h8W-HVmpZTA0xU%!ei4Bvs zp8NNvSC}Y)lYLI&#quExhvJHtZ-VcIWYz)5U_u8gg7^|ev>wnrv&32$X2XfEGNM|D zBvJQ`pkXUU$w0XSv_qH?=4vJ40%2W;Sq_3yLzBO5!Nnl=MocfNJF1qv7eVEH;AJ3$ z3kAZc6i5vo>Zr`w)&3|HkX*A z**UnMuF{^I3O2MP*?Rl8bL+n*9KmIaq1q1$>Gbgt@k}-AZeU*( zvEu9pq`uI=MK47<+Iz4f2dHt7UP!m20))hGcY%9pQ%iSsP{MK zY*9jz?fTaa4OT?6IED~^22(={Gq_`?kn&Cmg|Mpfx{`xZrSjodgOQO2xb%b=6HBq( z`1HTd=WNP((aRlBAyPqB>F!dGMA5NuuF?^FjUaqWJ7BRo26LfthM9~$5_O8viGZ3G z+={+W!VQ53L%fYTFxR%I6iR?H3S$geG68{W{p)fIP@TKy#DTr3$U_n3#|nRuYTe0f zn!@H^$P^TL68G2wTN;h~4N8*}94J~+9X5%-)mPb1}4PdrDCbS-9)F4JyhtcQzy z3k^k3bbp1G>_MdGfHv(3?0RCjdJ4f=2APL1N|qpj^#d+qmAsj}u6;lNO_snNCvZv9_NG%~>|hUQ{F1~un-*vOke|vRt{L_^2C^AV(elvpvQo$?SP0J&ArvSJ;=G99b6XBhjsiq* zA_!(Al7o zNsnTw=#BpuDtu5r)y}7nb7c%C?I~E#HWI{n_>-{VVJ+B&s#G08PB|Ow2!N*b>Tet` zC^ApJg4a2H&|wtkJ1v`V>2c_(MB*aj@otvw2sR&+*k~|C+R)70``CDCxZorJN>pB- zl(a7=mrtLCe#b8r7UB)hIBPie-1h$76$my=#NsK$6L%(OaCI+f7Ko^(UKRS>Oehlm z6P6bk84{*KG+7PO_m!8wW5*yVC0pW-=lpmPtWNM2x7UP|K(-`J?E)=x%klxMl z=$qet;?fU&4!mKhmzZ0IOIgB>5%+E1^$!eE{^ZSa&O5LP&cNn^BQ>Ymgevu?$wQJnm{&Ay& zkb(Y;$D?OcG2KZ+2*kvnC!Q_W9XjBPp=e=i6HV^MeC6i)=6Iz~*Be4uxpD=aHV=wx z2zV#TAn&iu38_9ZqR_i1WF`ceCklb(@m_V~p>k2IcfH zE`3-d<)|uL6#mP6?XWDM{SefKjX3hJ+kImzW;_^%R8~sdfZ?o`k;xoCPe2&ZviwG4 z6jtlY1p{RnGZlR}r@y77L%~Pvn@~N={@(%@)|;V)a!e~r=MkAFAQ*Zqy&_&wo-6=Q z*iEL#JZN-ltd0KVkOZ!{oj<8JEd^NJ84x&f!_YV6|ybP6>phsTDmfY*LH z%nCN{y1a6uAUglEz?{ERdBCi|1lixKFE}{9Z~N$3zON)&F6`e@7=lZj-b7DM0pL-R{&ITk3*g*2vC%oQT&si4{y3b z&!;;JXUfV#TPfjyJd|LvSR+59`zwPP6f{`RR32Wq1H{?YKY&IIKESYQt$+7r*&3?s4_RwC<;ZdXcSacHEJl0c}q1p6`A@JeANyI4sQ727g(< zIZBh@+37N>Rm@!$Hl{u#Qgd(cW|ZQWJW=Ffv85JAjd^^lW-9wF?6rPZSSi>KZviLa z(+GI2Tjy1GD5m?sq~v;RW9fMX*MT&oErf)KKf=MLch;AQ!zz@>=m5 zH#`huosvS&WaEh9GFo*|*$BeGk^Cfp1fZ^-Zp>6U;s6FXYmVe2QU=Y`#Bt-$B-iop zac7)v?ZK|v$EfhREX^k5le9)NUt;+WN;u@Z_%jW9Sd;b%Xwn@D3?j#c-F>}T-@mW7 z#i51rM8WF0fUTWnm9AdjWDs+i>9)Fi(&L6%b9j?%Dsty@@#U2s2Yl4Ub#8m>Y4QNd zi6pW3u5fO)KISS(p31<+%f4RzC=cwMXk25`Q!kzrf;@T!2tari@bbA?IF*?)a^*vB zKT6rmOIu;MA*%#bbkD&?c)~rT=>=vwTy0HKajW)2fI7qhmDd*GABwX0{xJ(djQc0SQ34rkH};s2bm<4UDo9{$bP zhjjnfjQ!s>5ZWIuq%8^GTJN+-+-3rFDjk_CDQC9m@)O!QP3u#UflZ9r{@0lPAyl_gxF`wC(V7~s z=1n^~iR_bTx)zqYIkXO}L1|y#OarUe?lCxCxhOgUGXh22`Tz`d-<4jYO=ZGm5~V(j zJPERm6MiPqO@8_3$4bganbjDUcuCtTZp=`lQB88$Iq9XsD?^xk!_-r` zNB7DFP8kOEZDiW)2S=3B7XuRn`HKL6+u~b$AFLR0GfU4%cLcW1WJeTnO@{ zow9FY|9Pl(aZjU^vtx52&GQSq1C4gm_NnB89hzVR|~f zGH#}*OnfSJK}>vOjq)1;86uBC#`Y}iLG^UXcKK)4V2HRe9xO(`hfy;5TEikfW`crU z4Qk!=k-)8_kg-NKVuQ^7uu4=HF9j*jMR<;TSOKs7Rm>@Ay0HQB8JUU0p@Qc$et&%G ztp!2HLV*dp^MnLMbydWrE?wSi-4hH1n|8z~lkY03an|*PHxZc1X)4Y?EwNFBLq7kx z6QX~$xOol{&#Gowoa7ae|$(v30dfh~Z%Nq2$^TuhX-U%T!8A=H&6 zLBrud%5=5K7!G)CFWm!t7#@C*Bw@}sqHQ^~n2NwTAR=_~LG!4PDgD`(u#`($>PUFZ z+lV}RGu%wri=tlF!Z0a$r+PE55qI9Jlm@?G*qrZ6)Rq&$kunJcRDS>!od4cEzdmNY zLN^I+{6;SY%~DRXuP5+@Z(=ZU$LTKn$R!Q$85u|ou{)XT zq8(%Fa1GgxzzNXo013?i4HN#W=uPRUvOT%$tt|=GX>@XmtzmhWMg+7P=!uKM=4f_o znlZ~RvhZ@d%wsSoUs=<@FecwxlrE;ts(cu!XLQRnA#=BaJY1<|R^}+WE+E3gR zEIVMQ@<&dB<~JFOYY(Z7TD|k}N1ix^OQgi*^b;r^8vJatU6e6eP#**{=i~vjy}hLY!}yho z>yjfsU#+sIm67uu7G>QaGDGB&%u$z13&D+qw}I;1*pZ6uUe_3Y(dFMwvX+H*wlS_c z14@!~EWP)jR4xil`-~bk@i>xt@qa3dgd174%c+vnGQ`+-K-n})5i-;>3%3g#VuD`Q z00la3$iod8rkY%}Z%FC6qzM2#_EHH1p#t{T1IoUfw2k|CwM{BEgL9rhgIe~7|Fzj#M zC;uRWii6u=jL+J=oJQ7NHjn$3Qd9LS2_JQu{@R^YR9cfH#Tvff#%A9xsguYN&Y8I_ zYf@0RhmPEq-8kE6!d~ZzD+WgOw6Op1&dZN{g{x_mQacyv| z1Br_dgbkbWCy5#~EgWn7JKP?3&UD^hty&tjZYR-!sf!9Ym<5GfZjZC6%^bh{d9zOE z4CszYGyXqF0LLiVQMc!23hfHj5Lt)x65_*&o+*Lo6S{wnaepA!-}hIq?mSM4$1Mx~ zx-dU0zDqsbxHCHn4zKAgNi53k&g|&tg3~KH+xvjZF&{5hZf;K}XXOXGzbkHwIUa7F zF3$If$JOc;&avl5gA1xWG&ICtRvm}As04Sls)zn9d_?cQgY#2Rq|9$hTpXovDKZry zo`!X;S`bfTr;jH1E^5{=Z5NwISl!XdbhghG^d;lFB6wTtA7_caWe0hWB}my`e2#%R zyMxxX-LLyLyr-I5=uyE(@7Tqo?Ly64rPgy7KLkTS$yu#O&O^wU)O$z(^4Xr>0w;2f zB*nkgk<3Zn3zf`?5hVvFvAAB%Fk(KVRbr4aOfe+hh&0j7x;bK77+=XWilW4U7?+CN-$o}I^w8!$FIZ4Ub& z%gyckd3%E&LyptWc7iC^a?-ef?jTdq{s2jLN+=EL#Md>Z&LSyxfe2i)Jj|{H+QXWw zOsTE><%AGpwD``VxK|{f6%3Cr;zKuLDXL#pd%8eM(nX7Mk)ptFUQ?_@{BdHOa&g5h zYvVMkkD;z;G-?3$QJFQ=Qm1;LohqHAcmcim=+5EK>E|-<`!>bN=yiDGN>E!azfTU{ zTvoF1PjL{-#Mn-jGGL+J;AowWVsk?uL$$(H?)H4S229-id0#?Zlx?C~_SuG9^!FFU zHZWj)y1`kjm)W2~Y*85gY>Z*XRmAVVp$&no@HNf)Z6`SXv{Rb45_>1eWJHqxYqFTK z;>;`f_2Uda>8tJ+j+)CrzF-RB{kzen<b?q>xH&$C(6-#cdJpkW_)+ zLh(%Bg^WYOEf4*9+h8?4GDr+teKG_2ZDQyquTUv=u4ev4D$ADeSMG{e81+^vPxC1@>njN$A45GMJE$PnAzz!)~X6hWitb1%T&8GZa#FSmkH<#8S=o z9e5}G@V&3)DwxT5C9n)Mf!9&G0hFb}oEE<*X}F?FG`SM1c}aSCj%lz%Cv&d7M%1I8Ovt!;u$LaCEamPs z1w1NM`=k(jg$VC}!u3}kWAMk!7JWZqdqDq-Sn?om#_UOJMsjQ(_pjm&uFw|RM4FX+ z4sNG$#SCe0H4V^XB&qLDG$j5v-MmrO^CYvKuwDr3=_+wyJ@q`v4+?l4CIgsoX9>GK z4jGDxf*=@36kJ5*w%0s08F}As;-G=<47|Vc6`I!smpSQhl78;CI4k6QwV9_+v{j3w zk?f11@0WE?IeXUku{xUtGb;kIAw186xNWpO*cvCZ@D9q)@V{q3>VB~$SfMt+m93f+q=iYTdXD0X8T^RmIg(i6h+dEKgZ8O-s!@} zT&~OHEGgYRJWpFf9md9!ZAzrR*Mo~lL7;XZfE#k>1Y8@cnscm6Mp%QMDQ&7@jonkb z?Y6csN}vDRRA*)%7G7|(L)gd@hkp6g;PC!QOj234i_H-oMI_oJ$d#;k8q~d?Ye5t@ z*Os|%z>=5^Un>|r_fl9)`qy4&inCw&3oXq{l~19vld!nnFC&V+YKfk=g43?ql;Lgp zw?lX6N73kzaA4tgZz=Ymly4|XpZ(eK!^qmk+mxcf>+vDaZwHMUNFD2S`ZvGEv8`x) zHGdobqN=as>nmFyw+~fAFk4hT*D+&!jb$xmBr|duo_VyA5a1RF0n_lSLPg*ILZ67H|V*0m-x8S0>%*nPnoE^b8nu$hOX$HcJ>i8quYYh7`I+lg!X@q8B(aAlndIno0Z&z2&p4n$ zad$P7t6>1S2eRr(A2wWa6L~pQ2^V8~yNAe5`;_nV3^B@1_3Aj)N|r3onv!BsGO&Ww z0Vm5Vl|C^`a*F<%b@(H#4G_hkprYa{jYkbZgMEd^=#H6n$8V0`cJwRHwa4g9E_PKe>@-d zoIkhnNgCGzoquSYwz_^UUT?7i<|}m}YtqCUspxPf%!n|1%li+Q5gAA1S zIi=4r%W8@#Np&14bRY?y&tsgUyZXP|JM`@gUWY`yd=2USSRZ}x->P5DthduY3?Z{C zk1IjcYpXh*zx$rjcQKY5ecp6^jwEz{!Px|ro@G7G6`MOMr@87(>NVQ4l4|9Cq~avS z#wM!N>}G4XVB|S@JsB|KE~-ZkAU*O(wr9y@0_AGnu$E@P`+R&^C}=!ppaUjmG6)j4 zmUHxQFzm?s;bcNx5aKmdA0(Pd7m8Yng#U%L85zI{QQSsaR4WQ;Tr}B=o9~c zTP|E&ovrLG{@X@AMN3C@Lkh!>z;8&J1vb$HS7fQP3RD$Nlw1vX4Me4>$#y^SsF^%| ziNFnZKYi@`nLo|G+$>X?0x@FiTHxg&TlU$Tw~OHOx4;)A+OUQvH(|*wY4+AF=ijj+ zB_w{TCboDq@KJhDEfob=_RujHhI6uGN}0ZL{hA7&9Ie)Q4n_1sax^!VNq4UgUf$Xg z>(sRI2b|KWv7wQqyEDKAYiClLm9ipwCtWJ~_p8~Tu1)CJ9Ukt6gK53}yLuNE^&~F^ zz+SpOuV&fMdPL4<xZo*8yMe_Wzjm76dhe--EGh5EvvPMfSXu5uKO^`3z*_ZuTSn5yovK&JT|v>8s$%STUYnj5rB=^Ju8hvZ*M9qx!b4Z(uXCJA(tJMooFmTNv*PJ!-*sRiA zBNLADj_mpMM%n9!C|93nDXy4?)!dGQ00WhPfY%Zc5U-+$fl?oxloEy-&FvlhooP zvZa~ahOEiUWsqU&8|W$cQC#Q2daM-gaq6CRQLkYS9aM%D05wxN?=3maY1OrV=}ueDkcQJr>$4 z(1^hV2vD+5IVRvs%%N4;Yf-9PWYzP1F~K5z|14q<+lMmiBKZAEN!2!H(JS=Gb$uct zhl?m_)`T|^@kP*4$d(ByGG^({4}$56ijhLUE515igRbcMU}z7A9C-z$-2vnNHbsu- z-gO6oe3`{G70x}8+XR$|wT|7Mi<*>htZiIIhBv>i6|0?ImusJ!>BS?^(<3;P9FieT zwu%j{LAn-ILb+`#@RpV7KeyA}L#kI5gcXp9Y?`lRcrP{19b+HmVtM8?^|@#`lAQO# zoGPh74Jep&O`dp03`MN17{bf0-gb)@Zx!*}sz58*q%J%h>zVc)E`}2R<20ugv4d`*Tuv{C zRyH(W^Ow)&kFrO2dP}dsoVggqo~ewRavqy4#mcW5a>QVkh5*Z0d25wdybMUB9l(cO zS+v>B2H~u=!5j2fv`NlffEn3=k22EQtS-+_XS@}s4X85TuPUbi8KMvnE>rTgx4 z^>XwK47NL?^d$XwBpBxyxkT`%Rq;dFe4-{s2c8Pl;wsJuqa43AZe^xQ!;@Thr920b z{%{PGMElSx^FQN-ot(gYv4tYIm2N8s2| zit6pu%>3|P3v`8k$fu5M(sYzy<#zUVkG|3ggAKa+PrBLpaNaZo|7&k;wF|k+@^n|k zXKQfIfw*C?^t0-)O)Ra7!GYr#N%btwmFhCB->a%&*QJNmAyiEBB5d)tTqmq#rz<0M zOW#q$3oLA>I;L)WixDNPP+F~?q$zG~1#94m3(?V(9zwD;mxdPGIPuH4`r=*tz&PtBoMS{2IkUb4=aGGDR#puAdcO5@9fMXV`{ z?1bz`dqG{ncq%xMQm<0R-C_xqsrP50m@a&I4qjPCo!mW%jwu0Zlv88CD zb1G#Dxf**uo%;BNZ}fztiOZg|-iEX~$PVP}wZCa+-%9@3XPjC8*>t9%Wri@dlAmq_ zCe%fzBkwOW4D$=}UMVRT3LSduUKQ*{ZP0##pQtP<($zIb6uAbAt|Z#2ABw>YNxknS zrd(_m?jPlPOgkjmC{Fb;Hj-%0n#w}ZaLePu-}aS{GHYB?z(ka3F68ti-S%O@8IZz} zWyj7yIaheJuZo4e1tov(q*2v0DQ2bT4%|O&+&LSk`XBuS%(U?mqn&IrZlJ>)S$0!R zeAyhIZrfm79=8`4u-=9)p zD5#LJc#Xdn)65b|+uSHN0-JSIc9 zqiDaSFku}fTic>|qq;~&-B!Ct$<#K+`t8#3%c*mxuEzld`?L;7?!FC_;^f8-ANpfU z?_DQHUp9WalUgeft6wPQOc?hMFpgmyC5AHonMvQIC}C{b!%3 z52&vnt|e@dv)^ihA~P(scvun8IdCldb2G8vc2ixt}TywEE#B?{M}8hwRkCX zuVQYh#ngb*_T>o*f0lZoSRXQV@{eR}B8}S$LL>jfzPOBnQkeqaI3+t^j^e?RI%F`* z>GS_Rz+l^&B5JHe^vCr>q-EmKf+{LxVOYh@)8m#J4{jiNum_246?so0HwWs_CyRo^ zN>Be`<;t$piMAg{vU8mtdh4Mbd$a{kBD;vwGKJ_Uop7qVAzhi{zEQ8JCgiiHo@K(yTb}L$~1G$_44>lh6Wr{x!Kh?+i1U9r}xB2AFt;2uL-c2c& zh4GbbU7Y5L6ypA`AKaHx1M2sG)T0+^TdH}000B*c|DPY{|5~$!swpdOFd_L-^z5r4 z$%y0~xS>j+8snlI<%hONFOjzm6V&M0mKJ}$XJ;0%ZNYe!op*d(Uw>R*8sQXEXKkh! z2y;6W*D!!(fo+(&fW)57~Tu2z48}6oKmkAShnV~ z7PQq}xY)0tofgjtE#tttI3v&od0z1yg2Bq#!J$SJ13;QM1d0qD`nGp_(@O*3xrKT1 zeg$R)jFUN@Lq*$5wjA79-lJwX^hN|UmebA|i~8#|COIss#HxcJK?bJ}#l@UMX9?rs zSvaN(!Bn>(StcFw!@}~WTWeE~;TJ^SusV(@ce1+#8sftBn%(jS&2-nmronlm&oGKE zY3M4_ZOg=CR>3rXAh`SI3chrnkT zrcz3V=IwjR)JAa)|1>25Zv@j%b6&2waem!BI)XO2*U!r(!LqX=oq`R9&e6%o!>KSN z*$s0X#aAIZ4R$|oIGA#vIiZXUN|GD_ zL`QbeTArRk7eF;iA~AqE~cCi zH>P`=2G7YW+7)dxeP6aOOS!o=;#7STk3k(D-q~D^e%%07E9LBf&KGBi|7SFD!1=5}^RtRy6v zFtQDjA=GSY;@sC&i~g2g45T=3`dR}IB{T42gT9`+p5B+EgM|a*>%-ZjbUelpjr=fV z((cUbwH>zEf+air?iP*q7FdH1x=;dH2h6=$XXH59Oe7Et_(U1qfjWn#*pVs1PPrEz zB;&);6ir)3TA!yrMG}`(J&~Ryuz_2c+*YwT$443;XagI%>Sb2c^3_GV!HdFD`I&?t>pkS$%B^{5n43rlt-%yQ@B|_`anH?CP=!GZl$sn zYTQ!|B0(6Wb0)}&KyHP$PYj(GvTulw8U#cJNU&guiyC?0%dnFnc&ME!7~60BFGpkZ zbmSpTRB4|nK{W!Bhrf(@pRdGnW7Mjb?|n-erJ#Q2$Jx?G4nX2*Z@Wtp!0R8`V8v2s z)t5z4$w&1-bVwlb2izT5-mnwcofN+M&dy`LW97=rZ#GT144 z;n+&V^E8YSJw#d~%(_Nd`_Q_dn8Qgc3{v<-aG!`KlATSK2?3ZstyBx!V5kylFYAch z6%{RtNKimaOO(S7k27$VI<@#kR)JUSQm#_cEfjeQWiEK!pQ%5S?(68t`$8j}zH z5ZrYZHm5@)m@?4r`SBA(SV3uRjatTV9(uA;Y`9DAfbMi3FQ93HYnAr`yyprGcm;l* z^cCJZzUyc}jivTXfy~B2ie@5C@j`%zvuy#eu*Uy;0=mO`+k@ zFB-)by8+A;YgHZrZj8r7YWtTJS){pQYcXd)@&3)RY@q{|i?1J=xZ(L(BSJz_Vp;@; zx%=p&$ur;>0LFkS2P zgwnoVN&06@pcM{zEQ(!r326GW1IikI1xUHz(i9v+ODM*%7cBT-Y=DF6VmEms8C|M*8>pPyN!@?jt=_#(Qo3d!@z+D$`? zSF4;R&|!e9mAB0EAcch|R{j6Bqn5BTFHsvtm>8K4`T>o{YN;7=d=K9W@Eb^QE2=V` z^|;38c>=mtHyaFK+R(voG~HRU0{CZx5ny7OfOXKFr82>%HD4C|(Xk$DN?zeaG;P|H8xHA1t z_FE>+>d|3e7FMTJC!P|pOe*U=e2N4vA^3HlF5X|~buW^w`dP)MqXz4qCn4t9c8+iBf zhm)U>DxeymgbkZ~UE)N+z&28u7F5!zUE{(LK2=kP*%r;+U~g<~ zQ~akdZ(lHMy7<&PvyhLbQ^VL@jf%Zq@B$QMEe?9pupZyAkx-`VMdNB;!?jdM1lyNo zKF;$LtUWJh%#l- zV0yv*swGxo>U9>OH=#uL9!&KLj99RN*VzP(;ZBpT)RoSCyo#0m+woWZVb#~KE>7UT zAKrZX79YQ^p=0s`DhTiIt<`VXoq@CfDn^Xnp+H=x*mS%~CeDc^eK><&l$rYa22`ikHZtZP zI9gQOmzUlVUwqY+QV^SA#8F$_I~Z{$l4s2Nmj(GlHNWN zAS}^q48w;1<~e9hF{}o06$)4vNFsGw2vZQe(v_iXMTpTd-$eiUvK?Cpb0PQd@hAb-I0fuiu?fdr+yhz5EO2`}z&f7b>;2 zx6D6p-`ECL5YuXN&Dye0Tnu8iY#H zo@tQTg!uZW*x0R(>x%cN6k)@^3B~mt$=>$mJyK5Jk)C~z6wr4h;~G)lOHeNoqu}Zd3|`|FDU;uCRikt@xkP>LNH#$dQo4(Ly#jMcul?0Z zU`mQbn1P50e;$UtEov^?>X~g`yU-YJF?ua+^G@SsIhR!@&&pMvlG(C~C+k&#TOU*a z*A3pR3SI_e>{;tlTmas7E2tQs;*?t@4?xpybQiVWVh&ZHzjbDwq&%=JJ-A$ zFMUB53{Qk{NbQC}b((x@ni z^*0gdQaov(2qP`;EuAl75*0#1Pvnibn{XyLE)p@l9Zx^@N4~yS8vnL4 zSR_S3o9`d=@MU0K0w9_!2sl)w(WBnj8;+cYTYOBGL0kYzQT)XRR|fzaXxt6_)_A62 z;$Y2T&zr#}JJ$|srkE>qTV)RtJC{T@9ixvN#QoHv(CbvckWYU)fMbcIDEsDA{vC{2iBqp z!!kHz!VsUOB;!w*q*&d#1I>F2#}tE$u&XD*efXzWlfy)4;}vKNap{wrCz<@mc;cuK zR0^2K$Sga^bfcb?2xd3winfk->a2z~DwO0I;uM6r_V8{ zcVax$AX$5k+XYB4D9xpI^G#1-5RwHBFAjM$y5HkN-Ldr4U4ky!Luc;z#ux zGs;0|NnOH_Xi^vxnBB-|9_kvhLQ0)xS|IGYT{yR>=~|j2ur4q_yc~>dEz60PJe3O6{{5$hYVt3ev zTq7Qh*(1Y26)h>_1#^_ZT}hHI4iQ7265$4sW(fld+Wi>E%L3ht99qDP#OftVd1q!V z<1*oRbKO@03Vg4@nB;}hjiFoYCp{d1BOAaSE^Y=#q8PykG!Dq>MiftzX%@sXB#)-s@S0@*O1zT!b9A%~xQZrFnQaKOAXNcpS)xV&KJr0$ zo7EfvN4U)04w2mY+BBE71Qb1k1>HFpKu?kq)2%Se|ujU>SIJ8=yWM9*V zXUEmR_+FD>#U1tqty$t(VcFSWoRTl<7?56U{X&Ar=&++BlNKqSif=t7B5N;_|b2}Xk@#(9n{ zX|*fSUG&$8#)3i19$E397;faXBfF;;G8Nm_Gdro|9fVXY5ww z7Ojl>RY#p`M;X>mo8w9M?4%K14O7NWm6Y~b)qoTfqR0iz<(Y`m9;7QUF7a9q))xzRbKr)i z&=Z}Dd}peQP)WqKD+h7=ysAOmZ#Nb_gplZodDmz!#0^RF^xS(w=c@$&O(vj&aTIoq zVwl$`-g!HI<0am2MkA1fI93n$L)`by@&@4GpU;>i_Eibjq>4La|K*ebSka}-+DJA& z6`n`g6px#>qlhq0oc7#unk`-_*Ju>!zh>Kpb+Fhh*cHct4~&LJl?QN3q-pJb3(Qrq zhkrHxtQKLI?E}oP#}Q(=;<6~}y;xVr$gqRNq)yT0Q7aAwzdJcQyZGU!H}Agxp&4s? zGJ@fjBOufm52DXwRlqmEfcqS5?6bQ7Of1%mngo>It)J_Qdv`8#(q~(!S-`yY0&2*! zouN0%T;tvKjXid08naWPtQ+jh6ztepf<8abq#U_(-J?7G8(z&rSMyMXNFP>w*du)^ zg|%Z&lYj?DZ$8t3cXv!%ns^4I>DArX_ISHJqaUWDP*raU?~%YEumhsiWNvo&VG5`d z7ReMhVn=qrKRq=5q>*XH1ger*!e^G~h}C@MYK_pbH5#OcTsOqlU8;szz6RK{HcF?l zq?$OCq4qPNa@@ZYubO`nfjjFWx(M>AmTzu<0jd(?dxOVtap8V5eoKDjJYWZhcr*_8 z@s#nQ_G#ds-~tN`?5>0kQqNbbcv3P#(6vkutvjjt52iaf=EjPVW4!`l=mN6*GiEhv z;8SD>R&jqeL;-^8yB6FS-A4E-{ZfMW=7;CXGL~<@9@e90pv2zwD#-X1P zRghKb(+CQR0`1BX7?qy8zj}sF<{&M#yZ5Vy=B0u@D(!O+Uk1V4fD6oTpGBl?0(&iWI)UT)M@{^Bb?1Ad)1!1H-;7mBILy zs2WmKwI^0L6;R<-eHqU1s?V;#-^hq|Nc!l_RC^F5g z57f-la& zytToo=Br^-y|*NuLfQtw1Lo%aQr;q9)8$cZ%B#3_(r#>KUuq~Ebctr@s_a&Ws>WK6 zPQr75s9;@2>+7bIH2BTm!$7cqVG4lyj?uEM{2`WK>Qlx7(@HWD|LpQ3JjsJ+!F%W~ zGJ7Rd^BKL>?s+Cw?lLUUU0XZqmL;h@8!OrnX`vv2%DM9DR?oko%6Pp@lSzWXgTJg} zwB%RKGU2(~hoH7mi>e*2{HBNYx|0`pSUts9D-iJL!tjSX3- zRJN6=4^*C)O=`0v9pCxWh=Y;Bm0|_Yplhgz>VT+gW~axiV&ZJI{=mcLBQ!(oQu)Pw zkIhyM;ruzSQa53jm}0cQPk~DZM%Dr!-4{$7wrpbSiXOf(BLiEYt!J&Y3^m7^8(NXQ z(yf~r_DqVefL8)KE^+0~OH@wde82fPj!3gLSUg$j_8sd-X?#tg_8qs@B*I7SmePis z(&ByoRep7z3NG_{z(+o~c#`!siQ%Oux_7lecK2TOSd6Y=HJnCegs{Xn>m{9FCVQd# zs8>%m12BSDR|{A^ivzpzla2}BFw@0?mh__lADXhQ{#KCti)3{ zwthkR*vA(8)Qu7WNZ~O);CqV=Cj?}aL8Sotdn)3$!fsxtanF~{z8>ju&utU(Hf1pR zpP@oj$joS2^^@KhmS;@`+{#b$0xeT}T5KGn&M?W-G@g{kkQz1k)rp5*%!EifoE(asiKl@G6SIV3nhbRK)*?rcQdaQ-I8-t*7-v1ca@i#~ z!Hr*!Cd#Qh#>(wxyk{t*CX@AIoziI-NpawgVyQKtiRrkB-J@aEVfCEQorL$zbtxvjeulC&0-x;v<52) zNs3*~z;2Cw6I-YMY0d!ZJBn$AwPaq}SQcwE+OZ^s=C|hDC`Jltu_J^W1-nJBvpLU6 z3rD#exR#;vRfBqjYW~&c+^w*Jrj05Rt*os|5>_+j-Fp0AxUo^!?(fo?wp9MTjrkTE zfEm^-bduuck(FHz`1sA8&^L+da38iMmG3vCq^8QAg~GZ?mAJr2&WNr`brK+`Hnd1oNkaF~oa}!{ zaziD)QdzeGm3GT_lx*)Nx!q}Wk)S!jB<&PMlY0_vcf|9yR@1_WgzhTt;d|Vab>=ZF z$^Kqa)v&VmO_M>TjVWics(6^p9fh>3AGb+a$;fU(tb1ZX(Rm(>Wl=OO3QO0Gw90u! zvN)BSgO&Xpw;w(y1$0Vi!7z!M>#CwU;Yjz`QdK&kIvi`_SG5T7>B6oxw>x!Z%0j{o zb^!lw%C^?vdCF>;31K`%nUrf4x#7Hsx4%0{%O8-YMY#F9H$S~Tx%j;~TD)W!WET=7 z4gt#7y?Zd(-&AgyAL8q18c&i1td4Y{2OwfVA!rgX4CLTlB7zxi&t9Fse)FxpH~}RJ z3#rTRetHcbdk?*Qs1`!!7A51Pl>0QUFpLel<8)`7LY9n&gW$BJJ2u8K9VsQ2!B)m` z`8kfknxlR9Z;m9o8Pltx@=N2CGh-{vLW}Eanp|-dG{b@}O2|RY7-N>dF}fonDm%Ub z&i#nZnDEy$o|QU|L5(no=)w@p+q+E3Ecxa@Uq^9vdH&+NZ|~jfc2jiW&C_JjeSLC% zary1(_v9<+?S4ZGkp<8Ruzg~(t)exKrp|S!*dM2Cb{;`u!AF%ZACWCE2Daicc3C1~ z^}b1~s>)qEtytbnaeIje49XVJ1n_P5T9^tnNPmEo&L4+pSIwzOdODpVhhoR?GfV~5 zoq`-14TI-UWFHNy;7LGdUWfP?g-Y~Q#GOp|8VXORUbK;irMkuh*haD^Z(tP;#jj0( zVCyPOvKhq}hUd{a7-$kZ58zCbk1<%ES7yQ>+pci|xW)zc8rRpZYqa;nyYF9J{`<+9 z{Wxg)>gRL0ES4Y*%UPF)io?_l_WGh9Ajh3vzB_p-c^I$#6xG)fYhj{$iG>EkgM$Mj zlJPZ2Vp#e*!w$}~Gk||}iek`3U`fcV5Z`)qLFan7+#hz@Mp@adp`*r5nHOX%JQ7^N zV1NW+sf>k2kl<#xRw0)oOH_wzGS-@7wRUAwikU0!)Yq3buEo(U4(7)h-j5~wkVtA zonaIwDHUg5TfH7?zjrG?d&W*|4iOu~(-2pqB5H&j8g3wv_dQ=iGfS{@ zO=d|y4YXRbA})X*iZw=F!)i<{KA6Vv zWy-EuKydApS`Cn^a3*c=Ao>15_%tP9+-+v zX>w56BUj3`PZJ}C9t}U}_=L)?z+ShYWG^Z)T2;AVBLW|QD>^^_Oo5uDTe^<5*Zm7x z8a~?4mH~rv@>9(!DDDDU!8ZSGD^lGxTyNu50_6QG-r80%!-TmpNQdY#_#EA^DUulb zh;CEEXd~3!Fu5cMn6q_s5WE9?&9#NcbWRLB$rp<}>qz?r-312>PSRopstV@0O7PS( zEOMX@gNUO4quc?dm_pk55X{uvXA!42bnRCczq?Ry5D?I25!3Q5iM*qZD_&oCAC#Op7XS?q-|0 zhpsr~^X~;n~ z7QIX<9k_@xJdKRrV%w#&+X-rJfS?m~%ykFiA1d5Mnjv-)nk}n!ftjN~+beOrPU)=q zq)Y_=d?mb%3nENJ<#_nbgo#3HN*Co*xWrR;D5Ds|&tIzAsJOySD_#G%0uP8j(vY?hG({ zXxeL!AL~16?C^3sSk)~4Uy;W@aBHq?%j$0%Hq)49pZE(Hi4?PifZk$!rYk(g4ulTD zD5uBXV#ixb{w0DvW?~X#-dRcFLnq`M3-YYp4FuGPztJr6i2Cu)rB$~nxUI^F+^(}{ zEU*AM78yoqbWYDt&o5qmkJmoP0hkQ!>8Pk?o~ZpjNBdO-gtTEL1lYBlfP)sQI~sc8 zH}U#Hol3+OO#THKeigv&oWK>7%L4l7IpQ$^0#+{&I#4XWiM~$Ho~XwcZ{D1}I#GMc z_3eHlZQk#%^lUc|+q$hKG_{*c#z3ORV}FUw2HFhT{DmMiHGFpB^l{U}!`UP+(tQz94})9PoeWaGdt;x^^Yk}iRyPAK7x z=!4W?)md$UR^RqDQ^rG?6!bv-sbqT<4VS{L{Skgnrsdp?aASq;p>=eC^_CZ9&sCHi z$%9buwb=#o?r~V{POqz9HJaP@scZvF21veABQkeh31IiSSeDWSgB?#vwB`OaeBTc& znRR_U@AK7nwfo($7J7JUrKvOe%A}|K0!yu|qq|40JvPn;-ofBG6-s%vt7)9k#TAYd zd{*J_eppywPtg$PsHntr;l4>t+VIDw(1wMtScNYA4ODKQ>b%;Ja9fHyz8WTftY*(fn<_Onka@@{i-^~Q(FuID+5rk9-GS*&0!jT z+Ls=hx8fW2woS~qjN)man)QuwDX}rQjyFa&ob9XNBq zWss!x386!{b#9Cg?&NT3e7^>*;qJk~fzGvkhnn=j)00fQc&m@^E>n?%q(nKVz4L0} zy@u@bnNI7~W|)H%iRc+pS?vgK%K~Wb2Xv`%9ErK*jUtMSe6egurAzd zG*nw@A>xy8L|)Y(k5qe=ll-@p?x!}_OQJHt@SEIzTiajP_SfGk18-0zn}?@IXT_e# z>AL#o72ggx%?jEUz=-VRPQ0`@O{4TTv+IMr(_rS&-fcE3K(^@k4Kw3e#CATf?5|l3 z%~$r@_YEjD&Jqu!{y^?R=v|=N7N4?5_(dpPR;HxyNOTttlDXYHp{<6v{E{L4QW+9$ zVW5yb{9qJXIRkHYDQd=3%Pphqn&#YIzt~I*a*$Tq>eSHX?lDGrT%G?NlPM~b(bvfO zFt41$XtLA2jx|`0HCR9@w?oD^f*y=@h-aLY$trFLfNo54W7Y(F1t=Xe7mW%Ni18XB ztzpXPD9MW8*Lal|)m&uhP4jsndATsVbdeIzrKZDGVZ3 z>t)S4{z`~cQ|{DVhq&^a0ik9q&brzFw&I|o0v_b^L50S6){5pW4O%D(s`wyW`4A}Bq;u#kVqFLBCHsOcu}IKF}RT^e}dg39)nU@ z^DB7{hX>l@U_z-|;^MpmFTXdw?GLzx?B!n{zB|W%e)k1ryb-u2hYx2)Ujl%H#J$ir zSX$05vCkh*zJ2k3FJ8IppsHW)-5Xx3d!Zgyb_tEIb)00;>ZamsrK^uK8x-Yl4}zA0 zo7eY7f1y@0KmLt2F+B&jse1n69$i5E;`Bm>Q}9JSewb$W{6#Pdi=Nl(%X?i8137=e zL1ugoRJJ=KPnT2m-u@>H7OJB5DJHWjY4%{J>&4x-B zfr}eUkeaaODy&dt8XLF!8ZDq1Om{NJF=1dAeV5kx@F#aDZ;pfCMz=?LaD1j!PN=8> zQVbvk)8hGh5REq4TTa1FzGdeW4vQ>b8Fw(v*BB-^Ju!3HwWt|E&;Z-&wj905t8qyOT=^`JAz2rkR+l zoqs)YnfMQJgtsQjhIj35y`&Jr*fDqQT@(KBB08?>dgr8ig~$TiweB>=+m8SGhA-^F zKL3haG!)(;*Y5ca^uMm@J36Mb<^lu~D$%%IYlPJD71exg$5110MR zDZ{%vQj1If3T3D)DkB4s0t=8zrOm`^8Wo{PC6$1bF9b{P8==~A2$#(AC4nf*2lyjI!^`OS|Y6;cQV-oTaQ+;S|%>&L}*WGNmQt zpO&hXO<{>|rHe^$)6cXq4E-y9!p9--q<_#jF6sVjt-W%D6g50^8LjTKQQ%@qrl$0q*6cN+h~uXV!M0YF7=Gwg#jH#l;z)er1bD`#u43R zPf{GD4lX`W?{V+p$b`6=TV8oD@%B!1QNVGO(DrN=kOG8&;cK~5@~beqqRhKW#IBr% zaSkfzV;rQ(0+A@fMfXr2@A^2?sCx-N?b@IT8(>dn&VQI>4*BT8>IWcWAyW!-|EMO17AcXOTi1%5N zV%!JcDMDYvf&izHY~(FqO0G(~8_j#zh{H703-B5u%LL@2Ck$CPp_g>sc;%p?f6*SM zE;kkRj=+(@53UGDs=|vqE37Lu=JguIJYSXVef)5DjcO-py$WrWwDxg!XN77P|J6`K zX@adi{hw{?RXeu~s_t3uDZ&a_^Kb)`*}vgTQdzO!R1>ueVEv zI3Yx8K%ceSPf4-TWfxK^r3jMwYk=Xy%AHzC>>BL2;n)-BSsDtf!M1|z!@^lqS#J=*b-yr9ll zT~YdWIpOF*Ts-*vA@qzFtbk@Q#4T8wi(oFFJkT(!9)R;vs)eN(yLfw)v>x zGmP&7-3+WOw3cLT1E6vA8IcS7->8vzdJuGxCZG~`&h3AWZVIl2I>KxXQ?s4+WtPT3 z!H`M92OY5yCD$rUZmiwVpfT(nFsU2J<8cR4iEU|YW*QeujH1LLY*>X2wDmG9K3%$H zoM5?0y=hsqmy87Zoe3Uz^);RII&KvKOOI63Z3GMDa)WZ)Qn8NG6e-7ohmR@oOkF?( zb#biN*2Dn z@wq0JP%5($@X)j4;QR%XTeZtXb%}X18@g584zs1OH>~iCJ+n5d*<^yZ=M-Z(fM~I4 zxyO!~TBwa%r!i-$U>fib?`<`S*DuZRt09t%jfPYw?tHIfqL=yd#^)K{2P#$*-dTZ# zt_(erR&HnZ8(jf#GRZzY<@yc)GNtAu)~bTz#ry-}&RH+3+Xm$K4akZhdO;wz}AKF+1! z@>=m%D_V7uE9ar1?e)2rk3#1QT|}#od>aFwl2P|HYhS27@P0=a8iB`#6F7e&)0J82 z7^5{6Otir6gLz-6eZd3PYUIJHaomW55m1a>N%vWrXu>hyfOwu++NnjY)pq8L%+=bn zkwXA26WZF~-4Xi-?PhzGVw1z(Y7<`?$HX`7!pxsm1##>WA97arO2C5d4AlNW&J!7b z2<_2vh;p!JH|vi42K*?60X73lAl}v);HhGGHn9pu_b@~1H0(PEW`!m!boHv-%lg6m zz%9Q_2Xu6KsH2hEZz3eGgTX<|w#greg{^VmgRnB`08!w*VzfA{^frofhP|C_6Y#$f z23lieN1X;mtRzimRtY{n2Pf7OUAMvtvuZGA8U zr5pZ_tis;BOawV921zNgC~Gf5L*0j6X>CfaQ9cs!^JPbVweO(Ddo2wo7|-vO^soM zdzwu$WaIL+4Ssl7?!I5O(<>XiUT%_qKBm~bkYqi+3%Dh(oHP`(*p#wgA~3zMI+?Y- z$8bgr-h%mdDGJTB$WcKp=zDqx{ccLKg*>&#!@>qUqxachxp|NNUx;E8(TH-90JUXc z<5u9QF$U?QjuEldK!OP?7XVZtYmVRC30-m8KiOKTY`o{swMFWt#7Lv_+67Ppq)g&M zy7E2AChR}f^QfG^+cqMv$zI}p=eo`Ghnh(L44db_%P6T)JGKS`5J`(VvUx*6GeO&h ze;u<6VB&KaaE2eMc8@vCLO`PBfPZbpMrB2P$nazJwETS|ut9z@vl5^kiZ%I(YV!j_N z)|kR7uQFQ;lMeNwx>7G zb=u~aGTd$TZe*d241MRMMRruJV-W;s**h6fcL3b&Noau&d2QIfcVpQE0Uj!QZ%~G} zh&TGvcNEK*bvDgk!>ysy4i-#Vx(b;uudi9c`q^cHzr-r`Sr zJ6$i9@)m!}TfART-r`U5mM!JJ$^ar?_!6#;xsA)bE!JZxjX&ir5QDsgU*;W#@R+yw zTi%;y?Y)TdeifTR!!P>|&t}H9@Q`2_&!ar+Q0n%D(5rF>Ph4 z7C-P8zTXo6e@lnN{J;as%Dn*PhA!M_QaI7~K;Jkz(UqlBWBL#fkwX@L22!xs{%`@T z1pm$RX<@dl&+vLWyzZlDEM}yu<#l(mywfq3iaCF0MVu*ZZ$`2gP|=PKkK2}n0od7i zh2evg#RSkBCtN*N43A$lF5Ip%{^?}A!Z0X3zF88dQ?39Lzr3U?AX@990Qe>VDn*zTfND?H5}cTU+K2r<0c^Z<0}-?vBkL@X^^S zG4!A|gR7*zit*v6G&OI^3vU|0$^APFbp?2eYIBoR z8R4H`oR|gl0I2l1Xk_MfYDq(rPnx00rifL+H$E;(nmzW0xe}OVS!YDrLAIOj(n_Kd z_$e!rJo0Z5Aax>=%zy$lLINyjO+3VIjO1~d=h-AHW_nl|ue>e7F&QOk0Zg0T0DxNy zB`=eSnF4iypQygvRWkAr%Dl8ZDwUT*=26Gto&+`G*`P<$LdL* zEnpJ(OmjR6%JbmKBpt10_)tG9TMuUA)`La5Xgy(>Xg#b!j?&Jv3h>o>$g&?kyIE+- z{PE;3C$CR0KDBw(3WnoXYWeB(zu%f^#!{CQ2w+vz*$g=kdJy`oYOs*M87Fmf32z4| zAmwxbf5v9Zym^1}@e&%C9kU+?^Py2>K8xgQwpcBCgp1|xv~ex70$U;wD?SH*bIU_H z>cDf08=6I$)T@e?VMcc#`a@#z#;?{y*ypl|I;+I_egi!4<0Wy&`Cxx#UcGV%7@CWp zl6;lMYK`xohI3i~w{`PC246&9I2S`DQRHpaFa^`J$W*1_h`Y9E+dE@Dp|gF@nbMKlD|g%m5$l9J9^T z9Y$rDr%3^AmT}Ny8MZ?KXogt}Z03mr3dz*v0`%|Q5>SNr$;c9rIxkIfQ)Uw|8Ix7M zg6ALrm z$G`0}u3C6TmaY8S8J?l%2P<6iGUzl}Ef#kO6bQ5FK3qZ*RB7256n{}SL{s1P(j1vz zH;no9*YnS3XZJ&LIxgP+_@5Vl9UAju3k(}b7a2JC&D;nmG_Y1Tct{R)%De)x=`K?$|vY~T(4@fwfIxOaMLRN zx*QZkvzf(*V7i)B1va+;b$WV!aS2ipn{AVkoUR(=2XtxRA2Ak;n^xHvU6s|S$Qm+VF!b6dErBv3-v!er~Zeq zv~jXRU*n3~%IMIelP;OU4~8lec(3vkL%2GCL3H-l9H?nzDF6nO>H7w5@2dk+Z0 zg7dI&kYxpeGj0Sf;A=-F6bu2hN`C=gPMi{1^R7834na6LX`G%mdlAbfxF$E?SLEew zO+E-sWWypfX*$M=#U6gThkt1fSm!wu==Gt8Ut9eUI51{q z1THDB45i6`gtY_%IL8J|lJ4e2@q2*x()?o;^GxnHz6IT!O`U>ZIBa4g)B?&?E<>-I zB$Rym0XxxbM6qX9Oj3#goMTO#A9HYmY6`>}gmzSwb1>Y4CYd3;Xx=mt@hB)hmKA(@ zGtYq&>yjOi+Z3ZA_y=JT7$le%MM}WAKq|&ri7-%4vw0CNBo)4eYx1FiC{bF)78*ZT z7))X)+Le{-*8C=CF0Fz6!G{>26iARVfaWp3HB3ZS@1KDeFJ979M;&i;O-9SBlG_16 z7b*t*e>m&wFZN7{(_or6EodEZpWc7`bn&qV96J}LsUMlo+4;ME0M=~)8TmwW%FAL# zP}?9oFkgT8aQ61(ya%ZFV9e;TiJiWCfARU#+mC-bxj5;apLGb#@-a|ves~zbv=;zq zzGRg*4|ko7d-|gMZLDX{i=Vm-8d&`;;CyC18C3ViQDL|SI22k9QJ!#g`~ZXBJBfdD zm5%3V9ndtBY)12aGC^c_(C9QGv>=QqRiHBuB5@ULv#g=q0*o+ZNwsFaD8boo68Lvj zPU>Cr1F|f+hLj1g0R~~GW)E?M&OEC{aQG$!P}7J|0Ms`46%*DM zQTj`LRRKq`SwGvA0$L84);u=1{>sTyA!-*Kcq7k)ITRY_}3pHizAZn;FPJ)_Q z#nqsD3ECD%>QP#!XDu$?@6k(Ly*6NNM$Ei=hz?1ZvwXf+fPM0Ap5ICjT0ICK0 zL`^aZW;N=A^n0|)G61)H61a{=nFc_nPXf}XdP&`;zvO|gWu&1wY^o4izm5{6WM`vv zRBJl-N?%-5XqKnSFHR^9?y8I`?Mp%0M5Rl)nh1hyGx&fy<2I|)VJo9z77%eDOH)#U zoo)nT$K8!}3`x&u8g+tWL#+7CAgggM_A|O~SxtruBgtci6Z^RLqjG{ei->4ukzLG- z4It9#`DTBz>pW76BL#z+ zprWAIj-wq8HDGc+d?%d~L^*Z1kDKFTvoBoMd2z7r#lNk4@gM76?EgEw z!AQgUviR`3Js#d1o4x*S-@z2v)h{?c^a<|o4$KJsQ)C`?f-QvY?Zb8mApC-FW3#zQ z&0ZXsS01(a)PHzIEkfrUpR}bZw7&fkLnciThfMF_bSn86Al1+dp|=2ISmZ3F#0#ce zN*aNr)>_{Zf?#Te0b#)GEK|y+@%kTOXKN0gt(CXNOWUD#enO^A8*0;(JXAP{$MI21 z#$YH!FLZA|>WC7J9jJ`NtBWzxD8=@!VQ#Q47n<^j{`%MA4LZ<^J zB@^(7TQ5sXk#M9+oC@nJ{&Gn;m!G#lu} zX;m&*Cz&1N_9pgX1%y|Y6{=Lgf`bZH1k=89l0yVbL%h_f+ zcpt*~nYf3Hz%l?Q}fLtHkNP2-e#PTBG(eAbTAe1c! zGL)>tWZT=;jx^Ps@UT*d%3Od?kuH|a-Cz@qFgE!)`{EM02@tT@p#}!fTit!{)j0SA z!sULpjL<{hq8wcx)VL^|Exa3=V4TCyIPGhjAPdXP&XHZ0W1K7&Pf)h4f+ais)VoeH zfR4{H-0OP6V!Z`dUG3~aqVOR~%bBKK@h~RD6hDH5P#s~~2R&`a@3?#A{XN<^oK|T{ zI9S8D-iiTIXz$I%MzsBk{fR=vj627;wjtvlQQqkN!Z7Fc>(M{+!yzKh9RK>KKpjza zhlBzuBrBIqwy?1P8OV;Opkn6;6iLlinmp1mC^C_w=Z3v7Y66@b+1QbF59R1>YE8^0 z0S@=ok-1p`arw`|-!d3=StJoMAoeA%lzNv9%-ccdsvK3(qz55bc?w2Y0q_%}_O>wT zHp_Ex2W)P^!uTj%}l3+ty@0OwG)T`xox5x~Ia}Dz{l6HB4No z91ie$UZHDX3cN5th=Ehnqbp!=dS39%!L5_KiSR;LBDr)Dq-~p7^sTjGK><2q(}zez zASZtSPAD=6>^}-D*{8>zt96PK zIKetChZr`0s04)BiF51D{jEX_Tua9p6fzAUds@W}!2soB4W?-5)YAS(kU%>!cHliI z;5N3sz@y5aU93B|6>j|~V~(q;76^i9{$V3uap)4Hocf}{y{=~sX1g7Js)Hyo3lh$n z<1NihPTewd!K42G3F1JZ52pJwRamwvP#kG?kX5apfoYXL)*H+b_+Qe4VQ9t=nK!U) z>r3RLxDh<0Cb~RLeP4h~b^(uA>jY)6l+rE9tIVPTkIFn2O4T8dZ$0R2wvzLDsBy2c z&xJBMaqoyvjK4T+#HxCf=$y#N5!w;y6yP7U2LBtHuu(XDOJy8N1kJL!8uK{}xZBg; zLBERERWirx6q^CeyubI1e+kW;b5jta>A9$)4+B1zMuv6-wdI{K9lW%enm25`NCv_a zlAuaGM0sW6p@=h3E5GdZbpi%fbr;*^+T%|Xt{beHMZJ_pM% z-i^15#;r~=(KY^1Y5jS!sA(vteyLS{uw+!;vD&Wtiz`;?1l?p6`);RH!L6S~c5;F9 z3izE;)KE$At@VJbl*5QNoIo=kplNj?O(8l!B;DJAQFk=j9gQ0Q&xxAxuQxOU<416~ z20!Id5R*qs0e(Vv#T+VC1Cow@zz~gXw>_gaA7KFwP;-_rbn0`O&n8Qoq!L6n^HJtxSpaAVx9z`aLmf9xKGDjD5FVm3&D z-S=R03mDn0(-Eu-L6{3cNH$Q<9f31(=xhkr+6saQ*Bl)V80e_*OAzZBi%|36wS$3sK8anH|x@g8vA^}a!g}M?6VrTtO z^h{j?)P>bCxbf?F7KvxnpRo0R&>vV+ZeQU)F{PtAS4TSPlp=LCA6p~{yA?U-ZwgI# zuJh7k_18;$E?^&lDM8mRcMisrJ_rF)`3r^GUT5T>4v(`>cyZ9dt4z6xGbwJC%Spx) zv?m9U=OR$v?O^tqn{0cTV0fhEUOt>n(M|1`(JXcL zZi&l*MT?;!%Oqs$&Mshh=m26c8zfxPJv)u5;G|NW>#G`SIEzy+7h(&y<+$GcO1CLL z_Zlhp!EtN8#GI}cECzPT1Vh?q8Hn%k)4TiW#r0gwF>uE!4N2IvRRuHa*3v8PlY5YR z@^^n;iA{v0V+xQQZUjPBdIa#J`!us*783n- zEU0Wzfj;}ahm_5?&{~Zv3}ITPxz)?xz8+Z5R~K*NUyO;wTW`0;NH4y3O@WaAhiYY5(oI?Hj*fp7 zRq0NiAei7+Z>VMVeKS@hhgkiSQ=P)g@Rl1YY3NksmR@Tf?NZ!BIj0!N1}IZ5{D}cZ z7s%zMS^ScBR$VUt%SyEB0{3o1kRiuob8Gwk&S(IOmwM6#`NGnz zK{cXVqvD2E)AzEiM^Lb=^7q*kleDc-Og*c4CMB3%Gg~gnA=9irErGX~cT|f1l|d@? zAZ*K(s+~{DhYQryXZbm0DR4KrTqpWZBxe{R62`jL>->q$@KTuB-BYCJ7?8W(h>O!U z_tX`RW+&Ql$aN7q(ou@A6xZV5@h6)~+~BC^;KE&NgvrTRqFl~d=62VQo0gO7hmT!RAqT1;Rc(-|Cyxvmo-;N5 zZ=f$Uhj+MfJ~b@a(e4r{SRIt*2bF_Y{f|*k3*O(nyCwGnemwat%32(LNOC({x220s z7MoM)#xyMyrGtCbAZ6d+r2774ce^2Oxb3hp0<7XXtL)%!qkUWbq5~n5 zN{`&fGskjgjAUOxgaXps(v4XcHK#eK?1Xu&ko}lG9s$b=^R4~RjDSP6Jp2v^%K}t2)s46B9790d1VM} ziRj{$!h_p!I`kv&Ti#`=U~y^lMip*cTY7{dY?e6H!V;2kw=%-SX03Ep2jFH!~QZD za+-v!Q|1RZFXjAgrQGFaQ7{q?=iGZgljvK%>cOvKyAh31A(7Vm?#0U*u|?rdaTK-u zrSR@F9e;-H6^8|W9yJyWokNuQkLJ)x@S3w38e%C>%YPmU{~GgOn!5ON!~n!Q=JY-? zJNxMhwW}1HU9QP3CxuN1u_ef{BF{PJK(xbUJ7P%^|0c%#sdshQPHA@lF)MRL@7HCk z0YZU)_a^43l@xAWIf(vr&z>%Sz#%t^?}Uw{B%w-}yr5KNTYnlx*@S!-%xf)&%&N94 ziAl;GQF}@riWaZWXr1fiO<-`?uA*>xlJj+tbI3BsKZvr2a3uDA-0Kc;Vz6iBsx%BM z@am>n9iIZdZgIXPR|eh=RJ=Wn0mCx_2{Q~QV zdrVzWLSK%R>;WnL}f9Yf-UEQ3*=kt)MB6K8Kq zl$z7Oi}oBxq3XA8z%{ObuX9N}3$laBB6qCcv`O9d-aOQr)r>!!nQ|RnmPhg);c--s z+F5ZY)Utf+9$Z}PeU2dHZg;oRFaHyr_g+`NpMY#Folm>Sb}+?nXOm;!N};yzDm#IS zPL#wZJ=(+$>iZ(TG_8=LP!VTCygYJXDE{_F;n>|T<~4w-ycmO9C9axibH?&E5Zt-U zkt<`Z=crm%bfWImD*Y-F-G=5OXSj&>G2bAbu*`7TFv&i81)&~XX<=z{5B&>1K6*-& zg_vm_L)_c3x|-cd5`$w?WCPrSKOW-}-Z#Z|fGZ9C^D*+4UvZU=X@_6?A>!xq=y0j9 z4sxFzoiN;jsjMW>q6}Y@(3UxaNzAc&xvqxI$9#CLd|-(9LWwUj5x0MbO*2RzBL8e9 z%;P&}QrN4{@5s{s;hKWcNx0PTZi!PF&Oi5h&`h+&c+qlS{^sd6aVHJH zMVj$z>m@sg$CNM7M7Ye9o5gY4+JLdMljNj)GL_-nQUpg=&5{M@`+56ps;x4D_;s^y?ejvH z!*u92I@r*<*#A~q9umlBmAn)oe!XEC@$*nM{k=Q=3{RdC+O9iGhnpdrUKLv<5>t&bcoiDKgnO zN%R#2zTOoc%Ft9=n{(1fd!m}OCC?z+a?jl^i*E;Iq?qF`-#It7zV~7#+^x%+2|cvCq3O(iL>qvG<$F^KFdPWlyvro?hGlQYx;mNJ&{Y zKnfA})wWhiJzs%zx5LqAmqx0r+2R~>=TS8ej;5FT*bP>{mxA%Cl!8*-d@eCyUz8Si zI7k?2iD%$fA12TgEmpE839#_qv=wynIU#g~&}!nI-Rr*_#<92{?kA{*YU|=V@hnDd z#Zh;`&XL6UcDuqDWQ=af>z{gc-~PRJz%Z97x86%(9>G>T@0oaL&T`p3)KH+$OPXo6 zQM#?Bj@x-oy%DyIfHR;L{f5QRbL$#_nL-iC`(R7h0JGq-dnyp>iI%j00t)%Aa@#)G zvv1Y)r$qxwkfDB+Z_AopBou>4WhUjU4w1O(Q-Adq$|;n)8NyV~KyxhT0yF$IMt!$_ z;mSt%<8*Vqcnyg!);NUVv54Px?Hr#B?`lM(9AQp;KhH(g;T)p0>Z&5`Fp{*d1`kzY zGZy+lpxss}y1)#1Y*lxGEV4`b91`0}(I_pnzyNKIGf-yZZ8KZgytK5>I#Khww`N?t zXzelZ{Yu|zX;P$X{0%nE0KcrPZYR$Df{cd}{f|Y9Yd2nm*jj7;);Hb5eiN2b8-M1Y zUmSva8N0a;H?}2IK7E1A;GK@@{EjNEeW|(eTZRkh;B9ZsN)p2v0iOG_8wG(@u)e%()~K;9?g=h#91q$%yhB~! zIc5d>X#!X%*7?(P6GLwYO_%X4)bi@T*&VAn4PqF5lI7@s%bD&uK@Au)Hk;fYxSAh| z$Oi&!hk+#s7r}6Wcpak;ePi6seZnnAAA3N?*ptDIM>aK4jufKn6o71(6T^&cVwPCu zjsAs+hB(G-q1N2ADCUR!r2)QyUpONI!L=T(^)1`Th>VG52Ty$C>u(#vRS>gi8&gvZ zB`RCM=n=emg9%S`p%>9vZBkuBjoSvZi8YI6`ASO-)O((eP8d51mOsKZ0rdJ7P$c| z&YA6Op#)t94BxNQ#e3Im1hP5> zsWy&@8$332)rx)Lwvwc{yp@9Pe{B^ZX-_j|ur3ZA#nBlc-KRGq&?e$JC^HlQQGk~! zbpZ#_tWm>eV*~68B!Ji<|AUde*4iF9w@#-cOA-@D4VCO7gp&Id zlZdH?((G^kMNMFQ#^$-r4d(%o<^Wc`5VlE_qQ;$v^SMX@PpE9IkK+HX_JS-6J=F!o zx+bfg*sf%)_V3XZlsuB2&;%~a#>8W>`o_XpB#A^Hi10E~|oxk^5l-#9gchr@}) z8+7J;#1qy?*DLeFxB6?Bi*!c(f0N2@`*NSz@A1oU@P3Um^RU{Tmq{-)f}>Y*&sAzz zm44);^-dIk1?#s!>lS23#%duiM-k)l?o@`?cp-Xua8XV!K3v_7!kW3Tr~2#Ch|#zF zY1t@pKVJlLpJZo^7FtZQFzcGA#PciLhWX`{dN?AFkFH;UZun`SB14`3(CrwNJoj!g zLpz(4bF{{7a0J_|Lg`)c{qcYJr0yFP^x=>IfGDQ_8#4Z%i7`u~|KXGB#(KBkV0$}0 zsNLz(rX_Ds?!OkcsfCSbouq9(EKSg3+IsAHh$14&UbJDg6hnW@2 zAHDu8iG_bcfFInJOEM>-E%dB7O49g%TbW+uiM#WzXJ~H=U{~sjZ5pp&p-P!++h?a7 zk|*n&S#na1VlPptN0o|hiXyB03@-fqv`1-I(Bhh1aqM<_`Z{>Kco1JLaLHDSL=9${ z*xelYsij}j^2;x2r3{%o&TCVTgYLMjI2EV09Sw*mfmf%Ly+!EsTUlr6Zfx@tMRrY@ z$o)ny&=D<;Xkxg>{*`8=i&k8xlPp#h*rg!?%$e-LL@}uqC0cCEXXoNY-;^AghhYW; zIP?m+bL?;9c)fkw+;XwEzdjK-V3HC!J`C^v_4nUFMe=5=xwrhQE!AU#j;sFP_d1MO z`&$SQ>?My_tDoej0N;wV=GhL-;;vZ}#vt{tZD8*@0vC#)sZn4q?9j6FM(bW_dU4_a zLP(g7^ErM=1&{w$JGc#Q6`pm@+@_jr|kprtwu&E(X0mTE=Jl9 zRYwha@GD|394^oJYbl65^*KZ2%RqX7VD$3>W0f4V46#jtfK8dpOfR1b>?59I2!@fj zB&I`aCeXT$H)Fhc(KN6mE2C=5-Z4nRn$G%P93B!PlMk{IF{C$+e~|qTJBY`q5QO-3 zfEfVF*4CrOm4FYC&%py~4Ajdl=YPUqeRxC-l>G<-5Oy`!Tz(OLGGl5nNX3vUF=U#L zq%c)%S-SA>&-*sj8U^24V?FPhGdQV?OAs)KL28Tlgcp<8!5eks#h^-|Gtq02Exk=r z)*UCcPz$Qz9YI@|?f8y`d%#yc&Y-Cr(P_QyH8h^&7_W z2tRSJ##AR<`?I#t^0}lvIEuCm)oIu|4y?HuL}nai%mwTRP~a9M)WlAYub|%GnH~BU zXj@*z@)`jCNB^ffTyMB;e<&=Hs^yx*3b+X}h$iFf8X3FS=}@-Vih-Q)^2My< zSKZ7vmk97XYsSs*kS)eg^yB?~TJZLp?J0R}D7>?oVe+8U z!#yh0q%lwfz41yUtgt{GJ-yVr*uU_lU4|@3_-aZM+!@3;y-F02Pa2s3kusxv4$yb{ zJkUU7!URu9LPf#eU;~D52Z-T7r^$R93N;N6qU1mj<^UNa!P_)}b%ji5NhI2v_&}>) zYDx*>UQj0hvHIZ`2@`?2{7ZDN&_M#QUJ+1FJZX$^NtD`Qf{kyi34I^3lgERkt!nv} zmekG`KGS1?Glv;=4+%7^DC(r7Um<(%2_B?97&AIicSDD0n0{bqJ}Ck3^y5rT&B6DQ zlzKggFc<=oUf8MulZuII6(p_0cq|Br7AqFC)eQYrtLJ zf_L^KMk1B8XBQQ_F>clfsK%KbaGP5g3^c6-uah&{Y_Mz@R<_u;TCi&9m`|PuttSq; zjzUs1QHhJbM*f{X2?Ff}`KgN|n0VdD9u!?%AEvZ!eG7?T8!Eb_&&~s7OVkYdXyb`B zKOu(ayd!BTI(1dZS)Ih%2(r7Cioi*|dueE!E7uYW;scQ!UQqJgw+=e{6=X@^9Lg+H zqsnU|=;ZvOY?H@444%9ml@KlUNrDJ;f~1oInwr+r^mRIv`_@-@tmxydatiCWo9hoh z3xlQq>K6WUOM};^N;_e(ZaNL;+wdbE>;M`tDol3WuO5?Y^DbboNxlaL^Q2Qk-q>+MU(9jA>pb`hp=|!0ALhQsX$8`oDo0-nTvBkERxuC==GS z-Ii3uWrziW@(mGBep!`{Ri)HGE0`lHG6fJ3=ogtOYt#x4VxeKH$N>wSL0SQ5z(7lE zr1;`3m{)-glS*uB!M84_2_AT(y)nyU#V zI!upxqwA|cJVPbRHvMqW37oQyU{8D>?Gn8UbAR#D{Hjq$HxEeRB99e;po0eac_h;m zZqk0Z7n~1|8@b!LIlpsZg>R=P9YOE1WKx|#%;RqJI3$r(F?qiTqER7A7x4W&n0|dO zNrd0^CCfzpzT@dfr%)cko`%26oCD_6mG)w z3)ZzQxq>}X2caO_Gb)A#ZHV3bXArDf?=bI;BOLf!!A7_&P3l(~M`TWAvBJ4$vRGy< zjt6>lNu-0r5nz{R_WyfIn_t#whA z`#LuQMNtH%7sf0+5KIC9pgIl;mJwDQ&ENXhKRiaMO;wJ4x@a>Xkr8U>&VcjR(k{bE zJ&maMW{`5|j@l?<`2j~k#%Q?wb!cQ~>YW+Sx(Q%>=oVQK?Fb+J6EU%}PJ*p+0Dn}0;oohWW%6nD zwSRkYTsjTUTTgfOCWMuyP<-=UNCxY6{oU%Z(82CyE*+0^rVFNYIF4aOC6(RMfF&l} zG=Z8O?kODX%spn|x#0uJ$sH^EXEh(>sxTw58x9q7TWm7}o=!=5)7yUV@6jbSvFd8y zxXoZ_4%?%wi7)%2iN{}4hydr6`dr=B2dqHB$yXfq1)l^1!nZV8M4zl%gUa*bNUx-- z&hXYJabxwd*wTx8YYQ|Oldov=V`KKe_%m)f#cg1j_XazkBFa!sX;!tgEe^niEu-{P z|I$^&)}QKrV@9E>SG=p-eJa6iN)DRjOikBoWF!2M{IV(P4s(dS%-FGTm7|Qd7tgya zi-DF+8BWxs%g>j+$Uk9XRp%Jy9ATsHsA{-P{u&;k?zpCbZ9#mTVjbEVY^skIwOb}) z<8jasWTYld93vH9I_LrRAW@K-0v-Wvy5QCf`S1mYK=XWeDNmVZ z;7f5e1cgogh5dfm$#r99a=m3XFnm@&(X$R*(s@r6SCNmIc8@`w8>t~YM1a7irl$jb z{vQw`P_?&OQPk0iMKnc9JbSlD;%sy0@G@kndg}gdObS*RNVDUkr)K{bttQ`YzNU04 zJ3zJ`^)x|r6jBek<~#bvu1Cy+eHl~JgZ&S6gF-hwD2;Nij#as~vNvf;u_6uc@MuU! zkA7CSXpz>_-(XVMWIp~T4V!{VH)KKEY~mg>vciBe(0YBeXz#9VOCco?FlxxbfpB5_ zRBMoWF1v}DPEmq~5cA0i$>hRVXvH0=~V*-qd# zvTn6o4L3u-NKyO~nN-L2niA>d{U} zOYwbS606jt9Gm}|y=*oMPs3`qO+waQslzh~XU2n|kDfarhiIW5+#BhzU|Q=G4^C5M zw_tcUQ=udNI_K!F#c*4-`btmi09+=wgT{T)9^WsgspJ8T5RHnyKDc-U$C*7l5QB?9 zD-cx(Ry^;Ie;(;q%o=RrnX|yxaQLj@eu3P@5E^R>WZkr1y-HY9PkEZVWnHgeJGd>4 zPvK4Jg4EE=`Q6>ov{?`6k)5udPd2WQ`%mk&E~&Q?;}XMo=ruP+V#$B*p0(SHYxf`0 z$8<^B>k_*q>MpOzBJ;Snb6d~59rLW)>fXHv7SUPQ1SWV+i5{_IWa!U%OzXb089oF( z4Byka(7bzwmBM8S;BdCM5vW^Xjc_3qf55pyIKaWy0;Qu<|KcWVvhbG6n~JD3P=t`*IKore2*O>gn8{qm;6&N&Olj@YTO- zV;IksI`Tl;@fUinK+EIK9htrussHx)J}Qk~Xtl4(JN4e@6gta#M}3NFE{9*9t48He zbw}M<7`E}ZI->;pQD(Xq2}_(@HIzR_?&^1QHgFx$Lr1*2J4L2tt&FNUM(R)I7x2Tq zEQAT3@Hu%vT4vOGIA-KtFzNP$`Y_t2UBu{|)JR-1kxS_uk#}C8cax${1Z-&Q_0_vk z-1u84-LycUKE7SftdJj<@^ID?B}w{Dxi@$6jRVXj(fo@JSGRgzzv=(?hEFw-YS542 zM=#j+|Jd-EI=eXkk2T7YueLY#Nc~RZBemFQ0z;laW}f_$VAF}PV)CSMgo=k`c60L! zcrW0`1&}crib~A**Y|w>`4lLB;wr6h5V?eY>A#+Bd*1bR=&yZ~Hy#Z&N6i%Oq#b^S zQH?}Ur7AC^kv_%L zZL~2TMX*xM6q!8&$zW65OBy^|-|v&T+>%=wN#nT#ivr{@_3*;N#(QIm#G)kAA6MHn z6FtHGz;wa=sKl3JMisJvyQ4u-isR!5mHT{!Wg=^0>e#9*b)Ip$8CwjddsQ-pJj0kw zIX@x`wPT{JF?)H(#AXwv(xU7{c8F$mXGZ+%&;orKAUBOF_d=OSco1>_81;&j4ri zn>u;nlogONc18E@l4Z(Tl~T@=o?4RTEJ*_1LaTqkfj0zs z6-;sjc?y2%#9y%qEM%r(&>g|kZsc8{z6zRah+oa%7d%1rv|{n-@VvA!g_a+Lfo7A_ z(`qT3?}-~3hqDV-=>4G4(FOPl?TJ`#e$)|=1}dqJfdxeAqGJto0g`qYj#viN6j}ky z0g%Ky4i)qpbgEdjj1zaX7#kZIEdQxYDyecX{l9-FsTOeRcuyWDgF3r?3#M3L=BpAtAa?|!yjdr{(9tO8Avkl!AXe)};q}OW zB*$V<6wHBs#W(uD2r@lYR7fMNLlD7Qfx%sjbY{#Pkz8)Kui&S5A2`w1;RW=P=Wveg zz*6ctWVf$!I|Nk*ff%-Ip_MTk7c5m|f~#uousDk70;N>L6cFh#6MQmc0Mv6dOhKE# z@FvNKQk&n%JC#)chJan4j2J_Y&ceUAe{$W>Jc42zEO?|e!V9RtxV6 z`Yf{1&}el<+6h8(-344Vj0BVjKl4R_K!5;23!vq?SIV?Y<~8t5WogP-oS{IdAd#ii zMCn{$T8J35*IwKdACr_}ms3IULwdZ;=F1h?jT+@lMXBjCI$2UXfUlO;&UZXAq0)hW zBsW+ig4t$|K882r)9^D4h&>EH@`miNSrK{;52WNV{(T#CqF%gsxr2H0I1RO_SaQ=+ zd>6=T+dhdkS)Iw$HQR7A?nN-ZqK;3%F0iv#nWKzZn)ojTfM>lAQ z2Ndy-Bt{dpAgi~pd*?QK=fR32Sz|&^@-29W?yl;$GzhjbRv)HZK?4)13V&Ith_Ysj zoFZmo-E!m;*FYQgS{>lVrT-uNR9P%eQiIGMVXbZZYb*1ZmzrJo+nJOm|(=S!?+5U!UjAt8o7B42nAL zoo_Hh)S|MeW5v)8UxfEB$P}eA2qNgYch0bS3W?zWDK{oB@0au4n}ezH^aa)vZ2ZVY z3TiR5&w(a#B(S=hbH4Qcb?ShGJMg5#`o+gs|85>WeqZm8r<3FTLVYg@ca24Z>Yx-} z>MMbYp}eR3Ad83Ny#s%IfA$xBn$0}Le}Pp6z%D@+;5krx77dUR(hSzqiKG?dgdZy- zTHV(>7?WU9kS$0KxxGN>{z80YCIP%2=f*@2IH@O1+Pgw^s}Pw9rnQS_HP&TsfGJ)bpP|XB?$uxDUrJY=&09WP{jV#U8;N2w4Dti}maXQ~ zbm~Ocy7uCemvYfTdVLD3E`v{Frx2mOMM@A*loo?XUKEjFdj9YlTTTVr#g<{o(E4b& z!nO(}ClKp=I*CEEd~) zk6>Q_^1?7KgoS!dVq*~iNuRV*gEqSABcdQrCs58C#ZABhR(|V`&UiD7OCVL?Ck1Rw zdZo?)L8hI;!DmQNRZt3L(KTQ7%BKNfl?S0F%)HcI;f&D}u17p%Xk4zY-Wb4)dH`B8 z%zN=8_na7D$KbUPHRCzHl*~gO^aIOZm>;`Irv`(WWY!6{WYvW%@Uw5Rs%H>pKMJ=R z%}C>IRBjloxrk4MAdCX^^(GUuk*<2904t@XC!a!RB8(UBoGSmJzM(}-7?24aqUh~_ zf9on93orl8E`PCuzNqRmQ7|AcFRhml8`!`qv;0LR~2Oe$52ZKySf~M_vb#G7+QE`kQp_;un1D6(Wr9>PCj|L*85me69W% zm}1K^p)t*ziubk=E@ed!2Do@uh7iE2y%b~E+zgjefkS$7_XI>i%BWl!@Q11*u)_6q zjX4fkup@X9iN?}Rm3~HG?cKicAZh(2WdpV9O-mzQYTdtakCa9CAQIWb$LSd@3uXN` zBugCRM;7r;4R$=PqSO&pL!m4*ADhPfQ4NBVLD%oRx;ksQ0#vtHNaC5*uR!oBQKfue zPBVi36JTFOg(8-KvEhJGz(6lc5jW;wJ53!**Q7y^V2WVCJz6qI-nffBE+D&%2zv@4 zq-L7-e2=Uh$Z(}lR?njy&{RSyIO9O9bIfj$NBiE#Lg#$3z%g7NgM#1|jk_5wr@xwS zFr&TjqUQ{;QqM?`0oURfWC4$O2zR=AC;P7v)ol&b(!9-fnl zF}EoTtZuo?#fX#r?SwxN!1iSon`d;2|NZ*AtM;)R`%tV|%rajnkV+3_WDP_$PSC89!ICWz45`~>SrTiY3gd7nwwK1_# zgKo?x5xlcd+AG<^(;0;OSlO-D_-kN?hDxRgmv2q&9(srhFEPZDECSDrAR~~+x4rb#R1IxN_7|1N zrX@x);hLu$mNRl3Gx?^GlKWOOf$O}Jd%Uh%&NgUF!`8cB{4P~sQUkeWGNRB~e!sux z?fvV}At!uz4j+#%$f=CBWMJNV(S_R^2Y4L>)NztcEmeNTpW`wi*@l^1V~Y{I9inn_ zs#)@YhLp3xeIo)^qR7o8N(AUKhzR0o5-y6O?S2_)5mc(+1E3(=5<~gmOOU*>Qj^2v z58lf%-^iVIBY}f>H&m_sHhh2qxDhd=pZ~+A_!)#xohDOG^k&=@Ys#=QJps!!L;5Zq zK8g+E5ccdEpGM^aQmzGtSwsAQixUJGpKrmRFc)||)pStig?0EP#gUZg0{ zh2UM%VtZQ5EG|)Hx@s6Ba>HT~p+?{$e==zx(h!(}Z_3EpCVQI>WeI4ED(1UuJhUYf z&B-|#0?EmMi(TkE$d6EL3IVM8Vxby5$#hJqB1SssQRM(+v^t{C)UFi)B@|^IS!o~~ zS0KLv*V97eA_gH7KbT_xr%d3wl{`V%qt^PQVHnZm`3rnnvMT67At_E>+Z9B)sdm~v zLTD0`EM&vv^V7bUZHtIp)@s&X+S!saL0LF?4TW#z@;reiyOryC*%CsGR*V)C#Y7^9(ztpb2%|ry zirth_Cznm4f$KH^UlDOG&>u`}Ys`T~(=5;R-Q-{{VRStcas-yQD5;pWB&nE5hm0>Q zmnLCfd$imWFCTcp*itb)a(BpQHTLypg3%pv9FtJU(^!Eg2RYj_C0GMg(kU1nckLGr zTy=K8kDAcp2AQl!enmcPjq|LBA(64{*e)C})tbwKFysaVyX_t#_iv$e^CuF>I0Ipq z#AyQ}dF1Y6z#M;7A!4Fes+slb0bRv;k|o1H4YWUzol-<-wgtn1Wq7Q3o+bz@ttqFt zGci{Z<8LqXc4aa4ThyBdmm4uUm3Y_OUHWX2mqYcQ^4jl@TsePg=%=FAZj47`L*COT`C5g})|i8gL?`2_g)LXFZF+tx#Dx zB0L6JP%Asuf5+g(9h?SI^~tB&(!l&)ehP-20jnA|42b)g$oO$|b@1>$fk~S-e=}&1 zvDa17Od#?u#LqBE5-a>gaf*QUqsEkPqQ$(G*Q>22m=-0hM8wHp`i#TJi&4;u^ zT~SAKoCK}r$amDy2WnDh8x#c4=oSsrom2_nH1^xs$_#Tjv4r#lWD}Ct(3SP=V;(xC zT}I7v42&zPUM0~g7!i?DU9O6rCN)_$6zGBWsTC5f17xr3MYB;Cf#TtHKiD%zfDtNs zn#ux(l`36Zf7^u7uznJJF+|=+X`Mm8pXY5LbSRj%N|Pz1w)FQ}{!+w-cU3|nd|q`; z{LOogs@aW~{Sp2Ed(||O_{*ewn5s1I2}g8*qA-T0t*M){BQH?III%_jv8iFH&aQ`( z@3MJ~$p7w5j$#3w>thW5)vYnC4|W#GOv;$g`CGIgvj`n_0G3>a@I~C%K#LZ_Iw~7Z z|1xu}B|nC=I^$a7#3El{B6^j7lR*mC*{!aM`aS#r1t2u%ErJ;ooGGxDC>VUiNzi zY?JUT*adabvid*t>7SWyGp&^#E2IQ%jt>HeC*$pIxSDK9?YdFxdvZ8|lNKh31LFA~ zqGLK*ych9D9oUuYmO!K!g7FEqQltEr%3;uYBJ3arw{S^;6)epT(f;HQV+rc8?ZVLec8AgL7N|o+yG?9*IUA3%N-lJMkbaL7FNLzFpD^) zP+!Zb4VZ|!;K(EWy~buh^bS*6 zrq01;ev}E6<`#MsNo`4WrMX8}EueoDd|&Njr$|9p0(l7mJC7>i zq41GVrVE{DPU!VfHW{J$Rsja?CD#c zIW(>NO69!Y&gIsHAcKsZq{;m28!jp^b&n$C1|7HP2JLbi3YTEoPHnJte*%MP^%}ET zBlvF32&3hwgl6tzsrM3RX(QY`*8mZJ@xj|$ex%u$B@$_^*E~ve|9@Q=e z>A5(_&L&KTN>DY1D(CpmR_%9-d|9UcvPc^<>aQ2;Gb77)8r+B9uhn(6wG4%duK30O zE3xx~oCNw0y56xp7cFYijcwb;3Ri5~wr!g$wr$(CZQIrpJL&zc`#q=oM~pc~U8CwQ zw&3}8T0#pK6vSe8mK}xWMzEo-AUlKH{!I5YaRL3j9dv^;cq)4;^s z5U2l$B=zinh?6`*FZ}v%qqep_Jmg3JXr2(;6h76!y2P>Ef!QP^8x`{z71o*y}mU7h2_ZFA7rW;o{%h9?HJAbF!YQ9_{OQ2~VLc>otam zM_Y>HI3Q_I9odBzX0+@_{q&u4+103`SYkuU>h-hLCu=U2?rB_UwLEYtIYihj4NHh3 zDo3%qa!B2|n6tR?sn$qJXFJ0Wx4pSRjpDM8TPQyv+aiE1~rZxWY9)-bp!IYOwvA=aJjU zk1}-Sb6b4F5ayp~g8hp5!*#e9$PcCUC?96W27!NZY5cW&wSDJL3`(VQa*qhN^ce#o zx@Z3R%gk)`Y6l#MARy50>&bJqYJIpfN|>d3>PZ zIGE)N-55{tTQV%n1){X~jY`S^figmvLX}J|LVKPNLF!1}DS41^njRyS%mG;(mEWZ{ z5v$O-KO_*#7nlFUG4~6}+zJJu7z)f3xIfMh2JCY(1s3#YM|y>4%ChP~h@{Lj!da+c zA;iuS<#ktDFL6cR07+1sVad543-1`(Rq1_KEgynlr|3I83ppO3gUHHslJl(7J`6Nf z{HWoQ!K14q-V)1{R|7B-E1N;pKu1R4g`yNyOBGBD-)Yg^jTHm0-hvkACXX^!swsTn zN)9IN5iigXAm4~vjGe1TKq5WkY;2~AD@GxA6{HN$szK&jaz;*xnp50*m1*hexEF($ zw&_@*{y2G`xWGN-Gb1+_zEK4|At#f*SmzUP@g{gta#|*(1@%m7*jx*5dTr@ONKFrNbO>(&1;L+I4;(*f8 zi?v2TQ$`pX92!)7#`&~q+>~fIx&(`NV&Ph7o+x7|8mdhBnc;_^142|$r6@SY_=Nl z*JMw%cmBCG4(&0Uf)4$ITJw#SZqfk$k3;@%?LNZ$CcXaS$dQnV5T(B#kn;rBhhEY3cZCQmrjb7}^6EHzoV+lRmjUIE;0HliZV z!@voQrz$4x^DQ&rGzmw;Hi`kgV07tyesEdlJ@7hjZPkhz+6uJ&!9gX%zIuvU$G()i zS3~$^JB4iR!;`j<3s})rZavx?r0o>eK+i)5XD1qAIL*|g~sA!NM)oJLkYem`fBkC8ojIeq-!O$X-YO>qpOVE|OLN|QM#GE+-+ z+939fR)+1;1Lg~6oa*VJMoHkkSJl24uV%1Ij^90&;tEFc8sQFHW^b9V{7 zMXfxn;i|7*GaJ^jz}0&mSc87w0|G(9-cv;oNY4~7!C^RAW|}Z$cDxX*$`C=1^N!(P z<0WTEkKiF4O)^{d|x} zG0t1X@`pdaeYT1RT2~j!x3X(7!F)J{$f0u%Q4s$w7-y^&Eo40H2|9QAv9d!K;@Lg+ za)^5bsIwk{POPz$Z@D)GgxpEh<5n8f^LVtd<*cfa-LBCnPc=?S)8kUiDY+?PUTT$3 zsw(u+cwZ`>Jhss~atiN0PX$dE+9!HWvs1{Y3&P;cQIJ5trCUCHsVR8GSmSP8G>87n z&=)qK%m%@syzKW#)TL;w%`B@i5GH8%I-Wqf9kjUTnG6hQOw0j38PLI`B1_yxksg%< zpqf#620WfCe7SdEF7znoMkKgM1(f+fKqK=BAmH!$@Vz-fFbVy_tybXsa9=#P!%2hQKZ7)kl~X;_36( zW)eL(O_N_gFf@J}qL`SN07BgjK#m$wP@zDBhL3=aRh&qV6kkPLCC&H*3z?8W9$Rgf zP~K&1ibcJWXNU-QYBn6uiA(F1Nazq(-3NZ0OH3*(jmw)Az{A&@QmajXXLUbEbv`Co z-r%f}jvr$4!UHjH=}6j15i=jz<{J^~+1TlixqzG%?;1xlL{srWTS&wfC@#K}!Q(Z@ zeqYaq2igkZrkjs3#m7c?6j$qLSnC2p$tdDhDfn{Jf=#rQ97pR@3h$g0$DZ}j9y61F zzqCXa(ViU$C$8+FNd$c;;g=N}Z>ba1x)0os#tG^E+kV`A?>83yCG&NKtxnuEy)`k~#F)NsG`uiBs(WIdA_XylOM zpwp!U+r+Qx|X}xy#INx&oXeNHxRLN2!&ZsDM*WLbhwi=8q=ZrhU_(P z)EsE&(G92we7fDIz``~M-tkhG#e@kdF_{;n3FI+yKcVp$yo3ntX#L7%3ImMNP+eyR zEU@UTrFZ7+ISYJfl_o9lPky)??>O7?)EIXpMW|^%%Ijh7x(6g-Jqcln8hmbDW?~X0 zc+n}iLeEFY^EGAjxrk=Y^~b+P@8X+VXtX9;bO^#nnh^^cOrw#yTzXKu;1-d_)o*x? z%-!ZkM#37tClgDK-FM?^pF6Zvo}%{?8bKf=snD}?20%4ZNXp))XPtQ%> zVJMrKIyJig&Ikw(F?4*+W17Pqqrrxn3Dfrwb)4yWEozgBkCv=L27Xg(9Z2ywZuf;m z73FW4q`a*T&8XS)iI|w2`++2>-2{w3NuDw8*d>oR6#^~i!zn<_bQ*Uo&+9}Zp*Uj$ z&HYgJScjGx;;d$S|5bimxz+o0xg?mb#fZv}Zc^2~V|H-7;2wgG3hJ`8HjW#iz{=lZ z3R1rHeDL1fxxeI`)+KHGak@zBJ(Ak``0v35MP`(T7Kp~@CLF9in{fNq?gR$`;&`wW z!?;wm`GCqvo(uJ#2bJAy(!RW)eXak?j+9Town3Ru>O%-PcQB|&oYm@Q{o8g=wTXs@4T*&sJ zMId$zhPq2Ds4`CBZ2*n-O*6qkFPN=cfNQAHhDNp+2E5$7!eNw-cZ?(%S(w~I?pFI-n&Cq z$o_AO8TJSTa5(vzQJ)g8GhJspXOk~yG$fy59qgUiELh4uUl@e&qd5rs(WWO@4m-3} zw-R`!iU$hP92Ln#f*q|ed7|k@TV^1UZA!*V6$G7jyO$|ZtE_geO6Yy}vMvXmJ}=qbTFZqMJsVP1}Wnq+?6*odbccLEfC^3uOBPF*T0(#V^lNz)d|Wer7# zk+QbyF>O@Y?8^o6Vu7S8rM14o!!HPCANl}J6(28Gr2|#!g82-@$df@Pv{dc*mPZP{5)e>(VUejX;@hPVY%`f}FRfmz$(zTnv8G zfV$@F^|EJc&-3xG&+q4*JpcFASnz_e@S|k!`HCmy%K+jbLaXa#>0r)r(&$7BOVxeE znyOqJGV&j4zIrPd4e?**h5`T_1FQaxG(5ZprkmHSW`|A#6AMn-umXM$R{NMeD8)ZI zN$5nx8F56se$Mv*Tx+-oa#Bgv*O(`faspA8C`65=hIlO%5eWUFk?dYq+O;KCr@SSn zRA~pYio8niK46oCVD=i8e!61WdOje13KXz3h4F{gQAhEE<{Yt+Y;FXyzg;r6E?fubo~zID+l+xiPnzUFFE57r;~dl)b2-vDC%vM49Hm?j%+@rq29 z7_}|RWDXmqP3DW#lU5)iExccFwQy;JH4-d>tDgrSfh)Y_#JGAw_k{%2+}*cSjmJ6X zTJHVMG_jona+AosF^VuzdT0ObK~Fs=Y)Coe>J(PgH3d3w`iTUaY^o3}xP{Ei_Z*hS zrdCZ5QRw4oq!?QV$HQyEAp|4whXj6R7pOoD)0c)+&~4gkcy}zWZ!1v|El+l&#a6}i zkb0w5S9kzCdRdk8ck8!-Fvq24R&0+o^1e!|EcunB))?AGuivyNQ5MB&F2ySFgwtH3 z)$QrcjT?7$BLR0XnkBOFEXgzPeMJ5N6mdl={gB=<>?YBCD@-gqeS7GmfPMt5yP4A= z1_zfIYE*40-l{nhfk>xWlG3({fiiSlLe5hPhs|XquR{T^`p);KXl5930 zHsTafrA@>56fb1`F7QiSkV}Pz^v4kPE!=W!#CKh9SfZOP0M_1TdPVvocD#&}990Kh zT)sE1Wu4E&(rzhU*N`?#Z&QVL!kEd<^apfU4S zt*|UGlZ$1&irq^Po!x#`aQiXbv7CROfkYpE-Mt4XoMv_oZYgkwyDRV_hN8o`%1CHC z@NL{c7~laRbfi3ys3i6m!!m=j>w-x-V30K5dSB9Smcy&E6f`R&nObap2!mIxC4;61 z=Z`r3vk{rgf>f*e#`?&jeS)}MHzp`TkHDHANOk%2T0CjTfn-e{;=yc7F+`i7=SeuY zK=)Sxh}Sa1a`rt9u`eQJPdi&c$hiv;5|;gE=yNXq)}Zr+6C2i7px!*4EJoSNHbiN> zV>s5wjomP3z;u5;Yzko_qResaGFJZnZ86qk$I;>XrCaa#chiSRTG3cL^U$UJ9m%0DmSpBDwc~(x)TlQiSLQpFqeIv;MJS9M_9S&ASSRZwdt~<%TxLDf zW|O&RL4BkRF6>ON{B!v==KH;jfMcPOQ8;wWMi;wv+1h@d&(T#ZCkg3Bwc8Y!Uia9| z!;MQonA?e*j&rDmgD>+g8~>VUCm1be*w(Lz|KC`@riqPsm=A$<(5mw>((Wk#R%tZjVnM&S!RB|eXJ_N>9E~t z49Xz3nG*RI;UNdbPube>5eIjr`5xZpB9kcLX0>^LYb+(tRG-fGMRZ917x+}jw#@BC z?}}rsD?(KOE*4{|8)k4b6bRpk>pW^`-t8N5Pqn*53QIjteyr@kf^{OzHRAXAIHA^I z^Xu>1_|L)TfNwsRhymbH-fbS-6)$SdGB%fY$XOk^Aa{yYucSGCicLWyiv(~$U*ZV0 zuWWSV&2WVPzuHXXQU%}qXN%Alb-hMRNb{xT=^Rj`;2{P?VxSMq@1y}mbP)W zHQSi2PichQADt_D^_P!T4&+8Fi99=T{53_oafI{|XUD3jV6XWp#q(Lqb~pbIG>Ko# za{luP%m{5SkjkMCd|+54>`@ogsa;5MYa8x(?XrFt`&jHm=4|M@o4ongZ_oMpBQsuk z)rVa8D#%K!yAan@=+J{<|J;pW;hs>DXx_phB-RS&vvQcw&$S$_XF?6Ma)Y7j2hLOC zHdRBs&3Q{8FwD**?r2h_H8+EcPFlS(tjtvh0hsf5d@mqi>$;fQbLTuOy*^>aR%xWt z^L)%%QNsnwy_TMUp*HrKMPE{dZq)w_rP`paGf|tdO_rz-qRMxmFwTRJI(^b! z42HRwomTOmYvPWFVYtVN@#p1yKWqVdKIgBHfge2JdkfS4v=$0^KxbM%kk#od4D=mk zafJN9oT+n(1C0hU4fv<}==KSJV#4&|l1tMReQBN{Zf_pht#@z1HP5s3U%dLfL|6Gm z;t5h&V(b8L&%LHrjQvTkZG~+Qy#2ut8M^ljwi`(xR8Z#A&u59e5_c)4$o2Xrnt0;M zc#m2!_t3VR>|vPIo>trYCp!sBx6GJ-G0?XlpB{Sxnj&xOIf)?LM?iq+|6%1U>0&S@&@2X{XD|E`+dPkM4QQE#CdsY6!SCo^Y#+n-6Y%{ZwRu1u>f+ct}? zr-|+T3W#7oeogPUBIFbVE7BRy&6q95ECsxp(ZG~`&D9JuEwX6-92$0N^Ux9Z0{xf{ z>e6ov^p#qB_Vtml&Z=Efrnq&h;Obw3;7^TohJ*Ut$oBknk@Y6bZj`zPS~SlQ!9?A> z-ESx74jeW$if>lgg!-*&8Xq+KEIFMJ?l(Z}Oz=9hwQ}G#OK@je2V_Y#s$-Pc+M8R2 zSQ0C8IF~U>N!6;PdYyva6xfhgiU|(c0la)${HuncOKN`l|6qFYEK3(^FxVYJ3~BfN zp7uROvwUHzjDsE6O10?<=Gnw$Ud~@<`123c}dA ze4io0Cierlza;)iB}+_DeUp%u<-eaEfj2^c4_-fsipV5HB1;p?j-g;);8hhZu^)Pe zF|t*e+JJeJK~x?3oRpL7&(ct+tdq*%o6X7DVWfj!=!o zWk!&E6#&Zm)tA9P$i=lnwEGj(2uajOY5U!^M&xsfqTPI1fQqKiEUeSV`b_R(-a;gR zj+B%0?}5}x`+vDUYBOMa#vmPC@@*3)NNuB=IHIpxFqOpY%0_sqDVUtRN z>$tte$_svwF@pau_YRBWQar9~f}w`!yEaUlSb8hkp3c;Bsih#_=coVwhySo1rZ)r) z4g_=w`~S)<{BJTzikkO-_y?rltq-)eRtZyexok7=PEY!L4!I*)x1jaWNY@Yn>ExME z65fQ#BEjCz*kqfDIGg{VAB#Kp?swb-E!k?Ydhmz(f!3AHTsr-aCTIVX>tsLt`w=inhkl#CK-*`+ELg&An4=jlr46DPu>r?Bv(6`CS}(EFU6Ivh2m zW1bTz$VZ}sWf+JOFHmeV zm}Z|q{R((4bu6Ju{noqi^xl&k&gK6E4P5Z41^o6h6^?RU<;n4Lh79tc5`iO?SeR|A zsfpU<;GhSkG=wC(8l0HP4F+9`$(H+BYZaJ<5T&ic3My5$`e5g4o~5ai`mYmWhDCoy zFSSF7eKsC#%pb$dq3kPV9X|_LqU;1{C596a5UftOJ1@Cqs%1hh`_@!qCi7ZKLEG15=Gt9ee>h1&$88ikB8$wELg#))^h_`U^Da zf^LggVIyRjDThV+iksIL>OCsZvrxD^;A~4B>@8(T|1 z4JBso)8?Ecgc8fD8^s|Q7*er~kr|{MMk9N23D@JU>=;^BK<|;49TUu~3zt!wQ!jO8 zOPmVv4<$9(r+$yLb7dk>{*>LX)jp~;bzX6VUg*PL)&dx7qzzoARhkt|7Ptsn6OCCE z1xdffGA1PMW|qOX6zK`%;D!W}vCcZer`sDe=f>$zBR2h_FwnZNgY{2=ZNg>^ zrYrHe)N0Wj;SHmWanFqBukD`GBfb>>Ob?OGQnO(E`<_d(CL|aTB5AYU)0#T`uF%dR z4Y_`synAN9EG1!=p_Qh4gnz2MuV03*oyv*{r|KbJd#F~X`sX+mj&DY_Sv{wTVMN7j zx}7Xd6Auq)TXLX1ei6SqhU`yJF8d?>Fc5p)ghTQNonBSIck<5a6KKrAp#VrzMt*2KN zgJG^%&IWf?i*c6o&;b$J(=5fHEgMc~-_LISba3!T|HdHW?xCz?hoEM1-0Dr_f{5Ij zQ)D|t_^13Vb7p%WBm)IQcTK&gL$@Q5&SVMl-{mqZ`Hd>5+H%fYlZ-_t^P}y|rme(( za^+SD8{P+AE?@^2PhZ{syaZn@Ox%}GVn;U={}2rb3ODhx7v2xweK$B0H>$vmbjgivN3bCrH1;5T8vra> zuj42VOdbJjn9~rAP^Z+#c!BX3V}~+T%J) z`nN5hMp!bH&3fstUZ#iD#M*p>LAh43tm#Cx@L7u$DL-0n=R#Fy;#UoKifEaR57N#2 zg~ilqAUQnu)`(1|JX|t&8|)PQgZAtOnS&tEnVp@J(^oZhz0L-NCEsnq_bw6;TQ@ee z;NjsYo%wUixGKxidgw^p>HA22WS8e!rilTYTezV?NNSlN6VjMe)5p5UAsM6jpS{j3 zi|knlnm}{H=wj7mr)1J))wIqnT`wGuZ2uTyPIR^%1#VW%CY8EWwAMMbl_}N}eOlL1UXRrPqQtRJA8F%1=#CB3e zk|fRTb{b)Jm>byyiJ^9bgst$GrtFcT3HPJXC0Jy8a&wHSn>w_Jlc{%!<@+tQ{LZyy zsm{@E+k@yeZY2u!;;^g?%Z<#_Z=@BD19Zm~qUSYhh+}HhpHm=*(CQT#rC^Z7B+5ES z8G<-|nOeYq;Odayf=B+y!5gvn=6~`-o=1}*Y{op&UIz-b%{DD|Gj#^A zu&olTE(5!PFL|k_Ff$e<>T=ahN1&)lIOh~Wn(C^amcezLGrSXPD8lXB&P`W11o z^*jMhl&ve>uWlHRp0mBV3bPjzPl8dqf{s2mq4>MRh?pQ8Q`s{dNbWev^C40jD`N{5 z1_oh^SOpH>T-fOXJm70jz=n1dwtXRzYD4ozr$}4U)&-uA#y>><|s6f%nWy>MDIe7m`O+3;gSp{a+STJ=fyB&+a> zQx_us4{H7|`<&Ze=`W95s3`U235XCWbHLn2+O32wTj}UMZP$s^hyo3%Od4FY(*^8hvo8k!)!5Ni=V2U>xb5b zap2#rfE<8*I43e5a9RfwIG~}19(3b$9^!f=!qB3>*U#0E@$kQFPEQm(eU^~6B{lUb z<8pf=u{X8Z^X6KMg)6A~<2W|+s9iB{(ovu!XR#JEy}4Vr%uXUrGe+t{N6W_KR(1)J zq5N?Nd`rW;>X?$wC!-3sNr)^?5=4Hsn2x9{d0b3S8XN3&+FtZ=^-crNIk);He+_4t zwURyEPus_osfiW00wFPJV@U<1(9&!I>N0D1Uykq;iN1=rAmVdV0PR^{oPB80);-`U zFA%(}Ch(>)m`|I4<1b`=NEN4v@^>*%wH^UipfK5@JNT}^ehjKd(I&_$@7smhZ!ph@ z3`rUN#rhP%I_OC*FToDI$Rrg_b4CT7VNnq1_&9Qa1f}znqB`QGFgBPUEFa53HIR>O zx|EN_tOQGwf%74SUOv(nl9i1~*a>iIeY1uY`oxA!VFj!!X8ws!h%+f-UwjFxBj8t- za4d8O_2txmGC26`p!#+J5$#OdFa|EPID+_Gcr0zT|;>8fh!;H|tFs8zo`Dpr9;Ipw84Z+F^}J$46wXfV*UETn*# zJ$&0S#fX14E`am24>wlq=#_nqkYQJyyP5qU?OR$1}(ABLT^MN1|F30eaH!N29@1ASuKhMc$Ex$F9#*|1Q+z|f8bf2iNQ?Z;{HZ$Ol zDK8z<{5l8|L3+~7lMeFwT%jx$9lkL~oIbEa=YL9kb2p1~WvF{K{ZZa+f)d`9J3@#7 zTyT>#tKmuRb8^o4wV8U0m!{uSDrC!X(RZQqw$=J>{#8=xbw?SA&h4mMfvYzkqC5kp zA*78xUk)qI-eg~15w6$L)NcBZDjx@H2Oi9Wd5``2BNG@^&%@m)2IX|bcF#AM26?cv^>!DX`a0;dsu*0(`gh1D&l`-nSLICU ztSVQ5om^gk5(E111e%kqR44Pzq@e%wtV1L-LLxuD zG~iF(0QZy@gHX~e*SsXg<)o2}KsO&hDqJiCnYsm54UbfltZCAzw5@QEoRJKrh%kYzP-_YV&Hw(no)sK_hr6I-}5_A}sU zn{lFU%22;9rm3W@H*R7#(5tii^lNYE%?-^w$BFx+b?7;Qv#iz9fyr zS<3sGX-^tej;X)6GqW~oeIy})zqFAHC9Qz|HuVL_N91WH|cVD zY$3Z(StBg(`r*s(r{%>g<=GQtS=Rs?3;pIbin;0h$u;l_-mq&M6;*=H0&~av^lJ{B zApc&qJeCej8Bu%OG`{na%EX2;#4SSg$SU?3F}2A9vF#|w>L^~<#P_wXK@`u#oLnN& z@BA#dZqENuqJJCW<9WrBZF!k3AsXtz~9%8yfBoWltBTcZ)vGUW^Jlf0+ zTS%IvQ&_txzgncz93{fE+RY15A#r*=+3sBns@mOPbDnAeor?Yi`k%XEZ({F|6DSZ6 z9L)c9SNz{vJ4e;lep3SJC)$4`TqR{jv2fd0dXpPj*jXYr2e!0gIcnZ0?#A}!??Y|D zxy$dj**AzMX}mB@M$VdfZicR$w^$wI9mN4>F%2#mKrYW0LpYRXLbxJMS)~5)q;%i0 zuzv;}5ve_(*(7-QJO^hKI!+`!VU|fg8Wp9Z|FpPh4y#;nk^Gr@CA90H zhTE}jHc-5NLK+H%!U!yd=vXuy{1_R(9SqGh6kM4H(>F2-R!3;93qQtwpzjt0)zJIN zt`jGDlTOiiF%S?3e9V^DUUa|aN8feS6*flOg0?BY~!YMO39#U;*xTdRHMH_x0!CpMfV)`Rq<`^XI0b$T%fkI zj0N&v`kw*VTl6#dz6eU_QUL_hO%F%nsPt2t9Sh)qGp5Ub$q4m`W-`PysB}a29`>4D zld=cRf3__HbuubM6SzJCn--_4lG6EW@FvZ@Rqd}6H?9P|Fg6HG_n6SyMPdPaYX6sN9^lMM!X%^@ z5XBL*fe~UOJsDqvQr80z!awU(MCr+%4q%C`x4n8*i8@pt+W6X8ghK(X^8W_Y^_2YT zfARkX%UI0aXsPhG*ykU>PkGur7p>15Rt?ehPZfDMV$gl*NwpY((;k|$3zs1y|8|f$ zQ^a{G7Sl`$1j_o#iX<;NPjAWDMd~CNb(qthn{I&~m1Nud>|FY4TOT53`j&D`~Cj-ix`lftkauK8v$)lT2{8Vvy_y!rMjyo)63 z8gc)bI%bPn{FwSvuvpU*p{5UI(8edTdoZ8jHR>@o@OF8AI`qELwN&(4G;cTNzjd*1 z1610?kZnoMs9bJ{jNHNp2ST3#k~s}f1OjqU_HBXv{l`-tkbTPz?CX{SMGmd2?phPXJC+ef-dytI)XN1 z=NM4_U$btwRIwcJ6SZn8EzzqIW~I+~=_AQp;vR_(`!#8_6@oFH?IWG9KxZ0IT&v1V zQDxoj85b(p0kNd=6foF56)Fh?UO!O^HFv?!I3zKD7A)Kv;up$TB5I{rgr&b;5zq0w+~6Du&y;czA;vwk8lFUS$hcTEpT z@TLz$KuyG~>i~idpyK}jB*BNLcuv5{AL;qg#Ol(lnum!xFDX{(`FiF~flCysirWK* z93-_iE>KSh`9M3w8P4etecp9gCLK)Pz5YT;`X^?F%F?tUhHhbTZ9lcS^^@H1aeb8} z?EOS!wG@`r^C1Xfk~SwD_-GkyE?kzT=`;>w3*RFW@g20qgoU5hkWKZPNEwBvjwd~_ zNjLO&BZUd06lw?lfK!@J9X5;oapf}5JHW*^e2r)69bS9C$tH-yv^j}nl;MH(F7h0C zUmTxPK~;Ev&}&}_~q#+8WcJ(+QpK=L)zd9p7KiUFq}kwAfJGWKv7B$)qF>IR)i?F{bxzL6LLV|$gngp?j(zP#>8YK)-F3W?*E6e9kR|b zc)Mninv-Wz@`olnoNApKJ@N@Am1cWVf-oAyqfr`elq4SQRg8_9NY0^q{fHWc+KFSG zeW18H!q7eGgE>YvC!A>!d%?7mL>B(?igp=9DfW6RO<>$+2PfGgoreY5=WLKODs%cn z&4Cx>Zy7-fg%L*5W##!8I4KA zN+`@>dSdYgSa!({id^1l6u1*Ea1{{o_Op;v1QLDCVmek12)^LoNu5R*R&lbduH=Y# zNjl4SZfKIa8otP##B~(g@z~CPm>BqzrcV9}`GIbT@p}RsLxBa*kixE6NBgFF6lgpk zIMD0!pkRa8;ag^m3oOxxI8(S-8ND$+SllMMW-VV+S*vMS1M-<(H5jP*g#W~3FS$kz;1}$&jXvTH@aFMIWW*>G_m+YHS0k{fZCKi;JZR8zPB$T> zqArLu+3~15pqW6ULa1}k1~3z?5!-kI7psqgOluaSzasgr=OFafaqH)htpWSdKx2+? zqWvufjM7@|ccSccsrvW|f?WHZV{a5QMOcB13x*C`G>M+PjdJh)8g7l5Gpwp2Qq~2N z^|7HEB>6}hz>@PIIP;|HBx+FT$Uk}|7JNix@h&qaYEVZ6hn6_*un%bs9U6~)6wjZ+ zXf@mh_no=RP@THg=2wN5&Z!uRSe=YvLP4jilD1mlQ)adgOEg}9_79lFEoOxDaqpsR&KsWLg9&>Z|xJ)GQk#%VK;B{{{d!eF*8AT{2*xiIanP1BL}g zye3t+m6|mHt#&#axC-rXOEEs+#{B8F2bq$-T4>Bkmj^3v4?ZrIx+BV&g%r@Vpjw4K zCsxkaK&170|kNa@qZo` zqoy&`tCt`OSlWJt?9ghdX!)3F*}A+y9YlRHMp59y$vv7%$*S^<2JQlN3LB7gzjh$# zmBrnQ;rsQSD98=GVu8@1-7x7A9wD-IOfySpjry$y)(LBD2L~!qp@v|_(b`K262n1K zgIWh8>~L_S7b>GZE<8&lODz!CU7B0Z)Pz|lRW*)Yc zL>fd2COEtk$K>G#0h4_2*YFU$gusMXyrUm!x`NvNfydd`@W-x1jucXmNG-DKwi>(# zJy-`8M#oDCM-#znPRsL<*>FESV;5r&OQOJ+g<%!41_njDKl&TL_0>OzFOs)@{3hh? zU3miQ-yOYo!@?_hDF75;tW1*z8B|6HPyqH8!@?rdI=Y(v!KKzz))kmPV2ctH_7=H0D+R_1vVW6l$M!qA4ry%YOC0 z=xjBzOvVCR%Tx4VTFw#8!{JG?ckd^xY#liL?@%*>MHuTgkgZ>`eTDA0=0wjwvJ6AI0@mg>Lf~y z^$|^LCTH8%QcDSDSeb!p%RL+Z><>$6dp|&iz;QlO?}ugw$tiZkn3d0+bpH%s_%-Z8 z9tlRq>ITkfuXK#%r9LY{JVN6CeHKONxT+`#KK~AzYWX4dSi5l1udtg6gh(?@n!2~`&7p;;p}5)`b}ifz6HeYq-!gA?pT|^t z1s~>}0Q(|fhoCt1$F^a8admJgk40-NPP1y~BW^f4Tx2e}9iliT&r{ZBsj~Gvn1Jvi z;bQ383jA4M+F3;VD*!*0XKRT+4q*`@12@3<`gGVu!B&uAWG8fB>Z< zAqb(3u?M*b>|L_JQ#x4s|H@Dy@CvX1{(E~b)~3z!o+lP!XxloCh^;S8lVbHxOdNcO_yNzr9?LVV zI$6vE_x^HWb3K<)*;oL_Kko9Wa$$mk1Q*Ls!N}{6F)~)1W(DVYFWndqblTPrZXhCV zy7!K{P;1k7ynnX;u)B9FNGC>#JDBVXyY`~?d&MsEuWKqP03U0MjF>mGwfI#f3i&D+ zt-Dsz-Ucn{*gtacb9sOMoPUWs%$! z`SbJ$d|8oc6AvMlEfsg2k~=HNsh-L6>vGF#J0fOD9j>c{gTbA9|Gf~Dp=`uTVa&o*#ry$j^ivO1DExhWQ=CzBXJIHLaa1y489bBAI ztT>Y8?eo|8N$~J3e;#YINKF+hVw_Kswl4%_%ufrXjtDVBEPQ8PhL*ZSc2%~xdYo#> z)*IU^YUVscZXJbj(KqP?%?QvTxc&|P2AQSn0FL{}iJHI4wzRct3MCK+c5-UxY*;V8 zM9+(t;VS{XxceqglEO;Zs*owYyN{{)mf?ekpeEQcMA6Y^tJogMZ<1_|Bohm39FD%c ziXyM~Oe}^Lv1wlBcYpbi8lH$WEjp35c+riZAJC(q5%SZPsph_T|(_@8kaNe>66s}`(Lh0lLvUzJ3p8LEK5&h$$F&tcs>xU|lr;Lm;~bL}>EYV(_FNqnQ1r(#Wa~1Bg*G(je6; zMOCtr#Iz@^CwU-D@wrzuyUWf#qgw@phl5e|P>8`*1^P?7H^1Rl{6;VqOFO5AyE~K4 zt5Xs|KI@b#n*XlCFuAJ{?l(7{27~&+PcGW#p0dJ+)8jO|+dVTh_T?L0>M%P@_-0G$#$12r20t8J~YUxNL;{6HeFttekU(M&t>uggy zFuK<8MH`xXnv3UFqxvu5J;Ayyp$<6|BKw(VWL95ZE2A6D-B6cGdEO(_nV33#qJoU9 zw~W8qdGNR_aIMh`!!5(7&Q4N{u3wu=^=4y;;7ycem}%l;{2wv=aA7zSP*Q8wEYV7RFlw_)Ujo)zP$m`>K z7-l8MEgNklw!kJALHHGOA6agLRMJufPa+bL(4+FW!2I zFP6^BpiwfO>ARRME;gxH`@62j>zY&sM#E1jSmV_xE|RuUyZL-xo#FVkT=;@@ryt*g zas|S#4XG-0iNm4-QS(^Oqpe;zjI~SDYQ3|cz5S~(X@hxOLpcH`sTYK(K;Lvl54t5% zYr{io81;timRK>dOC?Pd1@#U2xO_pzV;@2;v@b@jjKI)?^90xrv@ zZQHhO+qP}nwkvJhwr!i0wmsFWp82|G6MrBU@#5X{&eg4f{W9|xTy;4|_VN(~Xr~jf zkvYjL@OxzRn4Q7D@|fva9nh_7=q6P3sOR%EVQ5(!V*^iX=|@0QRG zKIFo^59LO1gmB=}>=HKUJo$9e?1w;vj@ALa*Yc`CY|p`B*~9I_&RL}!?BfoOk)5MK#)lEu?Na_XHIm8VI8>mjqZRo{hzIg`%!lQSE8xg*~qNyfRdclBu{ z*9mI&)W7m#35L{B!Ai<|_y-qn@QmB7O{!%lo8#wGQs=Q)c;N4%PkvbV(a{HF|MTWUeIk*PMA%tk7Q#UIP4hyw%L&8TMZ;h0%Lnk&r zwcBZ3r*HSvO}}GpL@?B7<$~2A^W&!XE|*Rr%?|L|*v?q-ZFPW`D({w~u<#8rtmz@e z89~|U(P%&&pkbeA$W%gVR1_qT`G;(uWkftf;uLYli`|#q;!^N@S1)B$e@bf>= zDAMSfsUHLY07TyZb&LMraaRqtrE`|V3-b@EZe~qXaVoqiQ&*OwS!I2QEgMF20NDgy zs!%y8qhP<&`n}Ax|K4jSHVEw7xJGJJN$H;N)8*RC`I`j~ng8M%e^ULOoZGSd+ZF|n zlZ?vYn`OeWU^8hLx-GQ5^vF^&$Bx{%5hr(Ru!j(x(rp_7$&hX?Ie%{M?#@n5h|eMf zAdb`ojoi(WLDy6y=4qgOV+LGtD`s#2%kjh*c>DGJ<}@pFeHN`n+J8^6pKsG@ zVEiy#_*Z0oK1x3;YA`b|EGGAD=3}>Yb}6DBhBmUo``@bzK*UE)yxhcoWM;*3+EW3s ztmo50VdTJUF|jD5daawZ6pZA6?aXNTHa=Ebs+Q{k;8}^`&54ULY4NwM_Idu9*GZ`3XlMJNO6<`lk%E=Lt%z?^@x>O~iyV3n=BsOm0i` z$I0X*la%;($@fL9561vle4gXXe&z(eS0V!RS0cGSQY$*8v8!Kh>y}WbF&S(a-@I`c zeLjh%gGq`>N<0(AFd>N^pnMtbdl-B~c^q_KvVKz_wrOD3R&`80cyJlT7?IF0X;<$Z z5o!oQm~b%hhD>l}UKSizHoSoh0}LDB3k~$ICTP!$U_;iPE;&1jj-g8+Ck}Z@vrr17 zZj!(77EB_;8CxbSq3$rW88;Rf2=8fS*$sWbrKT(58)M^0 zKkzy9c_E@f-hjLbw1*6ab6Nwz`u73RaWJGR+Q>9-PDIHrC%oz?%wrSfJI$t3EsbTG zY`rb1>P`etlg}&hQ*Tf1v9HBEiQxzNPrwZ*`{XIi{?N!n^P3}a_G9zQ*rb)u(%J{(pd8PEX+wmi3Z(Q#Fk6hKGn4>hAs@}Vo&WUoV! z6k1cIhcP${|9f__nB9?1nbOCCuOgD#C*@IVE1N?-xtD1K$Xx4nLNU2TjOaNi$p{?i z_)S0D^&B*>EjS(U>uDm!COVv5i;CMhu`TWCJL)KS_b_HX=o2l9EhZ$@28eN?H)?SC z7{6cAN!gy$nx}`k8fwLnq_jaS?5ZQ0Xb$BLYJ8N5g8GRni%CpDI8To&ZUHPaq%&%Q zJZC+h&KE>crVTNs1ey^8sIgWH0+l1rXHF4C0o__2i3B=CDM&9XW4M_eNDn&fnGCA& zVDL=GL*lQK0VICD);%)!nE{I9>w-D@%FK6(0BINLs)ih?9UgQ)uA6YHpeWATOaOox zhq!m8)E_f`hu~mr?6NzkfBGR%iGBTv*Nn^-Zk{bEOmKLrFOI8(Yhv_{%)EN8iv`fC zit(w>H0vjPvzg>4ptlLZK^aF@QE$?RtKbgVRrblz!yo2K{enNwEKZ1_;K(%3 zUr$s1*HV;yv~Q&j;@2&)?{N{LWldgX9Olsqj8CDK+9S`lqva8UH++Gb(#}#ud3?{{ zb(z?dRbw?n!4xUcWgRLE^8WGpOo0s#EWS5bh;>~h;yOb(h}D!YEr=olE@Gag@-d95 zUi0^3P7oTiX=gV&s2C#S0Wlp_2)d^gBQ~Ri*lP?RB@4IwFTN2mW;9yR~sb{JZ+S9%yQt4 zUXi^VKGcVNpDgwj)dBC-YIsj^Jfr+sjzw{Y-^!)$ra;eDh+sr=NAs~gOju*%u^@Za ziqmJD*6)isqrt0fDiq!i$Hb?`zi~zTjtAO@ySvZR0@oV}N|DBgJBX<0d~>SDek1_$ z3$niDDXk$s^ChG9mD*eIvZ?-A>+FLjfyQ+L^yg;nev=CXj2p@l;{AiyirX zMyr{v58B+5&{ns4WM(npg@(awrbIWtMMDF>m^Qy9{jyI2Tfn;DpNpw@0D2``8k--Z z*=GG&(iq?Hu4ekBr9fs*E4Y;@HB>W`eNrXu?_jfz>4)zrR)6!hWp?^WAQ{;;e$;f> zK`RT?*5TR%mVy}YxBWq=?<_-2Z_kb9S$g!--ySRrABdhmjU04Z=A`ijd5Z z=j+{TtdxEhgNe?-Z=<`Qa2~J?JmBVV4&#@uc8(-?qjPft;78{y`$mcBWk=dlJ{pnL zxHlKSqqfk}w5mc1DBsYk?1RBCd)MaVx<68Hu}SYH!^X#hz1v?($*j3NT8aSWZ#D2H zcTOI4bvASO7ACS3_RjvwlI-ofJYUzk|KXij(Pp3*e8s%kJ<#81`&bin-`h8+tIwjG zZFs{}o7uU;^iDzR{*4v4^7RX!=jHa*xND?RXd;?!0{^2htYE(q_1CsVr{HxtzA)io zK3yc)rI-Shnn5UR0pdscpsxv%@lP1zMKwV3>HVzV0*k0DuMRYideSk$qzSVUTsLbd zrX5}~1npYK*&`l{we3=~PT(4R8q0IPsjuBMuF@~+_u*H051c`KcQX9$Bw2Nr-#&16 z-_>TBV2{+x5euD@in8(A%52kXdPsjt@p6dC>|_}25|7$)3+-BI+ zOm_`^BPt$%O{Z_s>Vtpz+>F2o=U{os-PkO+2VW*A#Ac%3$US}8UDZPWquyAS$=)qg$3SltWgaAo=S zP2~|lJ|X>6@y_FVSY+LzzSO*2N)9MnXtM2QQMPy7Q_8RT`1rcEJXg?4mf!fseXzpx zM2?7(GbwO0U>&%^@(#bo3S_-*)6_i689{J#gF$uJ-YHoDcU60FG=KZahlD zksoe}5&Md?n1K&Abn`w?TO=k!z~dOWs-(&bLLq#}#3{xjVB+vcoCq+o z5ICijqsa3}$Lo>7guIoa{reY$l0s<0SL*jA>84)>I@_nuOSzSC*UlXpAB522Bb=TRx;(>Be1j0ZI*!Fjfn+WQ zNX8u!2gpy(x64yMHmdnpT*Ir2YU|Jsd!w3BmK!r78pV=f!pWBsyZO|5LObQzJGH(7 zVKScs%y#nWPa^0K!%x5!XU;3vk?s=F9R`7Sg~u)0Jdz=>X=c$z4$W>&^|iLQ%i&JVI7n}ISut>0$QrliVm%oa zb4M}kW`_!1MCgJ6dckfy~I_a3vJ9xH#qbH(}YND8-LE1IK0U!Yn#F! zqI}$yeID0AX#jtyX&`$bhBus8d|xt5A_cQ0#p|?%QZm<{JsCUMmq5h>H-h{h4MitQ zq;YJVEX&|hc@@{I0OnDy?7 zo>oA(FZg~3;Y9AH@Hn;mtcp1E9RNZVJvh8a1-c0a`#R7=a04`Tiuq~;Hk?b}iDU)S z5uC{UF;?*o%gent6AJ#E^dMJmoyB;mkYM`j#SFuGc2m=Tv0j2mb}w(4pVAVr!FAoL z1T<_2x@PjbYQPe%pJOPLVq)(?QgKa%S;+m@*_6=kOL>@=Z9{(eoj-5?6+zzDIM( zS$YoX`vRF1C$&Eh>9IxHNe0n@1UN+HkQlZzMdoRfx~Wo!Y4Ql3F`vA3Hr2cWuQu(8 z`!<3fAf_7vCro#QfaW*A-~cjXFbY{+hK}^$Eb$rE^NWD?u?2VypJqyjyT{@@Ey_j! z`xHEKP$3lPv99BDHQ zS52f6p(g+p@&E{vAQ)6zB_E&Y9qU;SH_+|CSJoiz5JGQ#h~`;4Gb!M{@unxhcY52> z>H;y_thn$aUM7|QC4bOkKP`8>J{nxb3D;m-uty84ogo)tHy?GX%~C%GB9NUT4f8AN z3RrEykPMVr1Gqs-*tU4N!U9`{-kIN#M|P^{A~Wg%X{ORFZ>^e33$qf2S%;ol2ngjQ zU~_#$+Iw2GV_5=?3}A{ux<-GK%(kZ4O3d~MMDncGn;}_CV_Y-169T@e?;45B$YVf( zRqe}2==wsU zjva&}^>~rY*LZn|4JeFYfoSlO(%HVRd*c6{dgm7pKXC43vmu^3p3dfc=5k}$+1uJj z^T&MGiKa`_$NdcseFJWd-M`)Ek~cvcPD}?cKzigrOx7{F?NDMcYLN@N6eW{8qPa_f zAOd01u(5@2Yi-R1eH>SJ26k^<_X6V&me8bSpm-SERzI9GtcPiIsefCwl4iy)HP~8R zOsRN`~e<&m(SI4T_qpvDx)JT06Np-RD=Kiw$*1X;+E zjF?@EPOmPAA+km^K5UynJN&adi~5CoGDV$QOeBY(P`F3~*)0PfLMrC(^{mpovh$_`q~ROp3vK z*2{Dp;x>rBD#%cwQ<(&Kj{x3&aM0?pDl&JMNH%ivz5pW;yVOJir##3jpBiy6e`I0q z!?!c=(~*R^Kl$Y|u8^qWydB-1s%YjRygM9dADqbWt`?)0Du4jSFd%F&Q z%YEtb{!{Goz~tlRtU36y086j|>4HwW7$UezgzU0zMD8pcp3cjOAv5~4ofq8? zMkM|)Cc&asBMJn;z|G6^;qTd%jaB=w8-HLGjj0FqT7|~A%99zh0vCPX#j_xIz7Am{L}@=d2s9?Ac0Z&i zlPd5~V-`p2z+_Fg@pTJ{sATj#jO*yzlMwxowtJevPTKq8iWE*Lj*CfDCH!nFxb`__ zhpBCXI2LvyU6AK!4BR+3Tz^=wFMaQ~+EuSZ^sf)Gn=KDC57(!6fO$Gqh%7WF6P+_h zOlY?vkQ|i?lHYZ&Npt0w{@|wXhTB)f!pPih9F_K{GFz^UAwHPdxU4@w9or3+@w2vfUo5D3?{_#_i$-B9&Fg&MrL^;Z;h@oZOc^sV`+`0f0u&?vMZZns37W$0!l^c<=Uug>S3J?BZYtYt;0)j zU=S3hMvwrF>4Re1Uv*0~6HZ$j)L;o_1`y+ZbcXm{{8+Q_BWAr>59)Rrx+DsW>%dW9 z=#c!CoQDS((lT+j5qP8sokJ7e@+qkX!^^yzOFL(n>oKgyKNsmh{NB^(J5h+_9O2?) z;D3^#g|Ud0nv*ky(Ss32@M9mtuCKDdDw`jQ(A#C7 zAW28`34YnB2AzSc^ybk{>48!W_>5u;QgFiuI#K+Dhb07}O$#!7Ct(dRn=T5zAwtLu ze-K^HJiMU7AN7}*7jRufOI&@pc&ji-a4A=87TP1GK8~--x#?4+(Kt-h6)g3ibdZJZ z_c>>I1kk%ANi}7JCz7*+7H9NwN$M>bwi?P7|LT#quic>I^M!PL-4#r_5HG3Q^8Nly zyTE|q^A!^eO-|FFk#{~@qRJuRw{qb&`MuHur+;@+i)=g`0GlPdbYb#X!Qk2AOmxDGp7+4{oToeF8o9@at` znJ=A-mT^xnnP80O!i4YqWz2Fcls0Dr$qr+a8cI8&KkaA3%e>!;^Z1u0w)3@eW2Bw3 z(scO`S(Y^Xje^>#NX;*EY*Yp&ESgC~&Q%__r- z8N5r*fI)$+kWD;DKn8Q9y{+hpPKYD6`Q~X)H-=0w&uIqlc+&#JIK90(oy6PPd>(69 zbiR>D{c|5LMVxKOIf91GleICet`~9aB+$Yv-5KiFruy~G99)uNNkk>Bh`PUd4JvTy zvW(llyWmT>0f{HfGlvot86&ZAb|f+43PS<{B~-4>+ur%7fU~m*y|s&_4^1~!Wc&W) zygW1+(>5CToe7YE^vTFk^i+48t9jTn4XhVQ3mHC&6mEbkfsD0J48%gy0>)YpoM)WH zc?6b$Xs7V0#aeO~&D_D_`7;eouA}xPsivw4iz)&jw|!ZX_LUHkl*>^(S|zH;fv@|8 z2jp$YqY{4Rm->SRE;Fn=XKnf;T;FjpcYO zIb8896Hw2GiBkAZnh_dsAzjX)A>xS99ARAd1R*VQ3Zgal1TjCP!mGcdIqu#E4u;%O zyjT)#^0PdVP_3ASgmyrf)&FdTLv@S`CIc;QOzfDe--fDRPJ(@s`U-qcNJpcMha(j{ zfU8iOE;QYOeJ4cxq~V_f)#l~p$%!RPadnf@&+eAbpYBKaEDuG0A45it_Y^uEUK`^* z)gX>+jG=I;)JnsLt4ULEbz|DmE{LTah&ZVxht6ya2_mes_ROeM9SP_-|dFT`+$zIwKGmIHSo$!=N_l1zE(S3Wnha58kka z7f|li)rd`BcT+J;QAe8??*Z$A@PrTJI(f-Gvjt@Lz;m>>jO~vCl`C0WykX1V)5Beb z*Tj^=6aP^;>jn8&?HaIVku9dYSlyg}csQ^^FKp-#S=8NX@njGd|`9-kpbIBBD6=?3R(aNiKHY&=~|KQP@ zrY^V;;U?8wx(5o_+5?#n4LPQ%!$Wq{5NFPeM5xdW-%D~bjZY!d-O+0ei8dQcpkMAv zJ26^F{kusQr$Y9u1KtTGQ>351h;xHS6!#F_53w3kOQ7AGHVYX#D!2kN+zU?*bA@nr zKwXRtB;kh4+Is^`3JqwtNp#s#84wIw)dSd=J7ao%qaahny&#{IWKAiCN(yKY4{MID zMn;}A7HJ_=&SXD;O&n|_&nehJNFDboCXU{ZzA<<;|0&Z5GPLgaN%G>eDo(^ka}79Kx|Mf>F+=Mk)cEF)9l8nGy9~ zW$tTBddNV!fCNCo}6;aD@$vf{L*68knPhMR{ zfKt-vcwC8-;v22*)O@=UYMR7w(^I{sY4S@{Gaa^a3C z3>2`TV_8F0kyIqVEa`tFN_Px9q}2jU+1zk=9KhkW2wz^#R~lHXMe3|cNI-H%#}?RR zr10#ZCx$lHe(8#w}nnLjV@M ziNx!#WRZY%Y?$9a!UB?#chbc~B?tg~O)NPxVM;a2JY>BOm2Nz(Jh3wLcESWCg=@USOSuS63Nkc|Mfo@Vq9c&3oC zdPfHox&I)X1VWCBKIWRxt@iUh%E7PAELoH!#1(F$aLV2iO2 zhqQo9UuZ#$!mt?IXfjXKh8~9+IJ-;r#5Sqn<=(NgK7}OM_;$L>Tif|KB$&U4LW@_Q z%bjVv=#5JWshao}fyNhXo^PvoVOXF7>B>`sPdFE(@}-i#_H)Je#1qWovc#HDv5-NkHfC3= zb77b8wcJ^1If^nfFr)-LB3*Y>Um4q^vyPLW8?%>>hnvAc4#}7X+_ZykW=)NVVU_CJ zX zKgZ*t&mSopo#`0-f#@{CEpJB&W-BL_w$fF{8KpSE-CFk+QmcOLqp;j*d%E}BCA&~6 zC1~xS3ROePJF55(-Q!`kpxtS{Y$}}BV|ymd1OWvcj9$ zFbagX)bdiLnNrDNsv1U~yrom-$>aMs2{QcBwca4FOb6HbRdc;=I(;>e>T<4V0ZJ6( zP365$XmS>ITNys;c2~#!RNc+S4ov6m4i5ahxAk^|6~1wCbnlckweqa(N*&y=sp2i2 z7k79&5<1H(#YevkK%16m5AQ*-6uRegR9OVCuX_3ffy_=6yz_0U!whLPes&M(cs(5-X#}8T!NgSVZSZkj-T0$qIqCUDF(#=Mwx-C= zjPu}Kjy@0L!i*%dYKN6cq&%rf*Q2O`pc|dQ*#2bD{uxnf-nVChfXA;yNdQn&5S2n$wlH#rxaB)0FsQO(~m&m?x4Q$qaiG}hc`w_9X*T8MRWz$z&h$&#iDhT zsp;p`GhhGr7mJspf#deE5mpq56g-GhlxJSl6YBTEWcrCHaV@Z%KnJe~SSs8`Sm9b5#F&B*Os@v}oX&iVPUFN_O^Bl zyWCxEpiV+q!5f}E_zo-w6zp}QF2@4(1;9AouH1SH3*hZv_#(=7oZIO1Oq)i^%Q(T5 zTPA|uKRbc>4uAq6r)kLe>UQJcLNUyKG#(`yBZV$O*+k=OB}gpxd1{(WMc@jn??**9 z530zzW9gU-I1YJ7C|(Nalo|8XMWEKMhZfK@8C_!8rmb6){Vm;tmcDsB+TWhu59> zkFcStf}D#2iiP4H*0yw2!70ek|C^w^6d|zkI({pSSwXJb;C#NM}F97vWcs(ZQMMeM<}R=w;rgLx*GUyA_l@`GX)S zcd1fm4OW`R2vx(z-wqZfrmPH|nIk+>FbgJ%VtO)2k0g3Ydj)-#f%@YF)_Xv33znef zMS=*hFgSRq?Dw&CgeVerXM>>Hd>;;Xc03tC<_Ts9jMW|a30@sc zI92?W`T+@7<6+cv0Z%KcezN$T`%Dk9x63mhwIx0#nL+fTlVvDT24w1h2L~a(CvF}I zML+m=-;tDw14-NOI-VJn1%&3K8U-nNRGihR1pDl`FR#22oyQlBEHm<008&N4mo^A$ z7$R=~46F8=Iv+leq;Q4m5Qbto1XsJv%H3?AS(>4i`(eMwaWLxb#{g{0`{!egqr)%Clq^F~m!(7bcv zfx@$Mf5y8#MI7!NK@J7W>XYzrkaSN+Js$IseA44wN5pOx9yLm+UXOABG?tj>ba0NG zrr&YdR>}4h)11>fhQ50iHDs{h8>%8LggfNSUpc>*d}5U_pMt_!z9<>G%)w7@;lx(x z(b9zj=B0L{O0*7zu^kLZ^vcKd0zku4g!iYsedRKKya3DL?=tVFpmk8c$Crjgu}5r4 zgK~)QWh`%P*J^h8adYE;Pa~{StK2b~(H{=ZGt4eX2PWy-rH^>-QFdSyDFY;0N8Yv73LDB!1Ds)JFMz zSSTYG5irlmEwJCC88r)cPsKpz!t@F@+}MATwGWo3xL>&R;dFbk-oA{?)_z>9{N!#e z<=J@Ne~sYnCm&=bv;6zMfzpFCd12LQf8>J#Jj~azbt4x(DxsuMLV6s0QXfI8r`@U^ z?<2PDrMjb{iE`)gU-xcWM~Q`AXix;gr8j*l*+55+wC+5#p_a9`4m7B4448bqG$Rm4 zYzgPN`sKMY=aBA%ogkv+oW)PplTUO*HC(ugxTl2~x}sW#q4TJ41Q!^oh@7xGnxlwB z)Ek7z{}2Z>_KqdDJvL%72sL5BPF5+slNqY|^;|SnIb_MYTuI9o7ex&ZWKU z82;PH1`i&w#N(XFxz_-DbAaYE_)SiigTc%_&m66)IbQq%{l8&D6Hy>k5g-6S9?1Xn zf4UmlSQ`CbSwrZup!^^M3iw^qC(7JG;57hVY;KrDHs&+~!)}_;p2m@dwHRi&9>$=mjD10+JU_1ldr5$h}nzUOs}7T~qpaXqujF(E5Tt-#Ts!IdqR7&nR_&YDc48 zEWsFBJh^6yPS>-=hvsF-;KmfIKO0_sGl!E!S^V4Y+JvICvifg9 zbfx1vqsZb`UiNoPuwNbSJtfFGDapLDS)Ah(cH$Ix1r33UbMLA2HxmR+~MbsQy#)E?Qv-Z zl~5fJG#V1AnSI^SV+_vB(P~DFX%$P_5-q*1Q{Ue8Z|9Md-b$wkRRZ7p1($0%@OEIt z(c)-l<8+#YqQ>d-`Hz>2>Xr^84FLeqfc3v5Np>c#whsT7$f873-+7Az&fks?bah9T zbWL)}dn2p;JSVGEd#-#|_R8gD@!Z2Cqp>AXGFGC*t?vB>JRwD9!YOH%PZRL|R2%>V z;;-s!{#K}d_@lA}G#|a%h9gKH5-sWhPGh#HQ7S2Amaswy0xh&3wWa4YMs~DKGI?}K zP@;n5Fu_4NDUTkWi#{$6PhJzpLG?0sER~c4Z+fo2o-Tp>U{P~A^I5S4mE7vs)NG)z zAF*og-N^leZR{T#7poM`EL3QsPL>6NVbFN2VpMHb3ZobFXq8}%!E(f!zKh}8NQzg4 zA$qeRXLv;NCGIrxdom>FzudDGv>t-?tI@sz>beG1GPVG`@7edBNJUaD6Bv_#g_J~~ zzuW*xd2y=c7%stlKfcV}AvdtTqCwK3fY8oo4-O+A;I9Y$1;FZ z&WXY54Fc}lRg~|o+ixW^QxYk@BfOjCLbF1w0)Ye`&Il)$P0t z-hJLqVB~yEfRM>S0CA^*@CtT4$3CjU_()1yey=ob>BBE~t@j}P7;|h>5xsq*LY6H4oi_!m7d6x^kUcWThL~y;!y*4h zLh+pr)dPoZ*bZY~brXE_w)S`g^Lsr22jmM$e!gwc>m9QhrU9Kx`t>|q@{`k_-1)?{WxS1!Bmv}({pKY+zhA+RTLNd#Q-ke+k~S;IIel&>*~J|3w%VdXZx zws3Gy@+tK}n%olFkV&qQqS{#i7fVVcLntk5v%cEC6P^TiX_pVmZw2!Cc3{y4+GRA9 zW)y78G!)xbXrb(r#cCQRVU$=WB+6gP9NGS4WS36L{iOAH>-}yT!k6>?KX~I zpODnaTkfr0W~PMVDN?b}>Uc!+{&ti6BW&01yA7T^XQ;*C{@Hf2OKGQ9D9u4~2Ns#o z?PCcSTq_W!G>rqd8Ekb4`Ji1`Na|6!45-pDQ{%#f z1y+`(F-B6|Y{%-sVE@V8cuPkg96eA@#^1Eai#~Q#DYll!2a=pw%Av}tTT08Ly5*p< zmbUD&0e44YdK9mIG_mq8!om1Hm~TO>i2VxQI<6lbeOYW@L)$ePBvLKwl>s`TZ}-qiL3c?twDHPHli#1c>?l;I>q z{8mg2_J!-3b@9kOY|P!zts09`nkkA~0y~uvtG&dzFY~B38PmmE61ivIbumSzideAK z_O)=DUF*`h#`BdIKHGCKk3xS789Q`zFICbn)iviDyq+mFVSqJ<4{;#Ni!)+K24sRy z+z?e-yH_x2yLU7hzt?OAu8ocDb;r1U?Nk?WH~a}PffWf^+s|~SUMM4}JRu8t`)sP% zr0VfDwt6rU`fHW9hr^d0pxyq$aa{&)f_y6cn(13sa$;1}qm0_x!!8j%q(}11nhsrW z(haoKCCduZPE|we>^!R(I718VJh}p{8D&lBopSXkXI*%J@CE@bj$(*cdu-=Bup%PI zsAJe`p{pBet=peHF=0qS-}SM~jp7Ymojk>-P?qVYRd)WNmXxWuLQWxzGUeFmv5zUa z`l~Y$8hPc0)&x)OQiTEkivdfvrjE|n9YXu<^Wn#U`KJHr)h~#D@Kl*b7@naZjZDa` zSsKHHWqN z;2aRJDind}6HCycfZ%rJ@X_fal)hNC24;iH#%OaN2KRFsU3Guww49A_t3g*$+`d&; zxLJBSbh1)5P+Tzzm%**2#b*A1U`mvDDyqio(Xm^c)+fy}Q7>&Tm(U`5+ED7dFb&ee zYhU-W(&~t2akJrxv~$^GwO@{Mpwn>Ft&$GdGZMOG9-8w@d**KBr3f*rOc;%$4E5^F z%PN1B`#HJOWWU{$gKn1`yj6{Jxui!Kv*^UGyHq~AKhme)ACF)E{dpC-G2eb=`T>sI z_OhvRzxI%&7kD|Cqd7R_qs*t6!sSLgKl#RyFJ#AOfA?4l)xhbnTR?fEco734XwrHL zIve6?VNQ)RP{_g{oW6`BZl5|n?|lA($TuKH!$e=-S%o;B!4Xtxr}nSoLe_2!GX5xv|x_=|)8_@rE3i)rI#Z^hy zeu)9aSI%!lmD@5B(zeV}|KB1-W^%c-TsLDqh{%|G{U7mh9Wz)rW~ZXjhV)Lz_nPfo zcXN*s3NfH4wkNnFxygDRF_buF6-wEhiMY~SXog~j3pU98KJ@kw#h70C@&|3NJyb_i z5Ch^|=Pn}L0w+vZQF5{}$9`g{pbKgumoSb*az_y?xDze5-fS3rPVo7eoA?FvO`9S< z;bB1v8byMTnDCY5cUY@;QoX36rMuSYsquz|CKicP&Nl&<)5EY!u# zyPKvDnk=j7F?!0EM}H1DD3;cAO{5Gxc|r3_p7Zz0Br!60oJX#=n>QC{?DIk%Kds6p z5nOT3WgU*{^!(ZgvnctI9o$Ou#)`h%4sFWwA`E65jRqZTyCFNUl1dPywm_+KVAZ~# z-YToi>CiT8O~G>IYbM(x&3R@r%at#5qgkzV3Fe(+%~U>UTz4{cWc8p41g{Y^D17*K zTjMl}6(|xLP5*VkW1`A0yc5#$lP|pU=?1^05lS%C!^pEP)D+8)jPUE$TPf%zo_ON} zyGrzu9Ggi}6!qsn$^_~Igs`&ynGL7$0RT|{!-VbXV#e`bzZ1r)Dxd&>nsd=QGn%&c z*z8C@INwle=NnzE#S(5?Ac@!gk#hlnthBXk4gtmxm#C(Ux{j`&hvR?F{61%(Cr+%^ zrnCD>5(YXfx__l;h-=hLkx;2tNT^CY{?y_zxwcUZe>N*LphyKzTGXFi^_;on&K>Jmp0j0) z+F3Zca^>iBgJPB(6=zE>$f{vZ*MLXcjbZaeJ?NN?7&sorl3G7WmZu#b}H^--@2vqubSw zN;Xcv&F5PG(yVZHEfdUH3=J?Cs&hQ;ka4mU4MCPv@;#k6%gFS`tK^Y$MXVk)7pw>G z8;--M-Gdc&^nuaWgB^nFB>Ah^iGrXTkpS>$P&`hQ1I$qzAwq^o`l{scH9|FmTKJdM z!)=UN8uIXvEy~|q*8rSq5;{E&QAioP(FtlwvIyeK5#u^i=UZD2I#B{QY7Uo>Kn768 zz@z`K44P@Fq7#fW1{@MbS|L4<9##?yHN&AWxeeHtt#AU$XE~Bz+-Q#M7~VZ*PPqhO zgim?LmpY{@jkg%Q*x~nzNf6sMpFn;!00=HB1uTO?Qy{`0=m?`UQFx<2iM`N?GRzs# zKxS!DRi+&#^9boCDD(=!$`E3^sL{C;N{I9%qZq}D-WdxA=15Gme>(G3X2A~&$47Kb zJp-i-vX}V6zKLi}(guuF@|AbuA2cYL_|fxJ8Uh3ZBNRJbhWncYv(o~^hGiu%*vz39 zJps)`GuDOm(w(UCeOLj-rw~xR_s!xRVhy68`A#$Gh$jj_BQ@9xo4IC+>ed`1Y?fAY>3qia^3AivZ<%8kS8*h&u;5e0Tspc#MI=sJkQolxweGir7&ZEYcMsZ% zii{b97?K+0p;G|>pochRMS}FmB3WcSm1)u0SQ+y?$dh@sGfvbTT!6n^T}b?(M$ipk`FY?qMOlR1zCZ}SBh&w6 zKwe`kPw%xqegIL?4g#&dJn#(T!hF0A#}}04{Ii!uD+m^nABx|fKv(cKg!X^=nl#K5 zz;gSOfeC1g!Qi0H`m0y5?awDJWX1~C)jvYSGSieAW*z0`7)VL@5J~{bVM>x&H~RXA zK$=wfd<#%9m4%635TLIK@Vy-o|IClGW5i@-Whp#;lKa5{{S>t)U^cpls6f%AqOKzm z+6w!IMCerQj%DG2iB*AAM-lS$x7Ugk5_k2#QjM_)kmi{r8C3sCaVy4Nk~iBg7q2RP zF!n6;0*%GtVm&Z^gf6Qs57{Tk*jX4=vp-v}6tbQlO3i_W-8^ZKiyb#)UiV=lohIp~ zNq-tHCwHsAh-<4J66nvYyZ~?J(M63Sb+`wthW9>9e8%tV{HZ7Z=mmnw<<@TX&?;`T z%oNB9g7&Nblqm(Uc?iuGa7h{gSoO>69T;~T3IOB&`@pALejEza-MJ(`1ynR=c+qMv z_2~nmWMSvL-V2LfRK|9|grEWL0GxH(vV>!3QB{b0ybWD}M`|qZb6O~21?wME4=n(w z?J7XdLd=OJd>tx&eYR9Njh=uvK+>!l(ul!asuovW?cR6{NYbSldFW7JS(>4aA@Mq} zUgQ=mSl>nOlso_VnP#QsW{QHT+ER;9B+`u`APqc0U%M4?JX}3P{hpn~B!#r7bebj} zX&Mcm-N+_&$Mo?_V1CkeOmp)%)|57k#W%USO(ehnz(C~PMW#$K7;i$nv77lAUIR4^ z3+h%-vRe}jK>ercaNz!PU67yEeYo;ZaqQ=;Q9FuUL9P?HY8M4yXFY$xk3ZaZ?3!be zom1o@!uL6r*&K5BtTLrMt+c@jMEM$H)?=i~NQ+L5!H{-26>~3RyO+_uthV|-P`wkz z^P2mM^{QG+r6oBHrcqLhl__0DDRpUB#Ne9vXTuDTr?huz#TW`!){kZM2La~YlyUJX zN1Yst_ChNxiaw^I{u+g40cJKFwvP$nV6*Y!FCS=0JB|$5@ES${y$ZllC3m}%FHfrz z*qj?fwcIo__*&avkcxopeY!M|0oC5R)>0HsuDXcQ&$cQ%c$t7l_}HbET^L>{7LtlE z8qhfKW#Gvf3l5CCHsCili&lvlhx9h!V@P3Q_eP4vRB8d##r{+$%EVk@DeTTrLK{Md@7Wqb zFhlHf3jTEqYJ2Pa@I0R-7W=Sil~>mEmNfMbm+p5E-E!4UJyWA;IZEn*!TQ& zep<_FZ>YBoLXZgu;Faw2g1u;8#VkSx_LapmQg5f&OX6Ik*Lsds0hWHN6?P#2!tHL8 z+$HB3(DVqUM^-)2AODWla40b>@$hVgF~gp!_Sy&@nSp66BK$*5+dgdC^;)_aTzG$0 z-&B-IV_7r87WAyUY%TvN=)LnUd6ytGEz7V2H%}h-NJ-;Q{74!i&g<4m=J)3;!Rw&LKz? zV9DBT+q`Ytwr$(CZ5y|3+qP}nwvD;7nt4C=6}8I9%E&tBJBu#1z6auk=#}KN(_C9O zVf(h~iLe!$s(NZ6dm&(PivfZ+KuepUY(W z8!VJ-HZ47`6P{{`IW~1y-(omRWoZoFg6~y8r;D~66&^a+d-~^qu~mQ*?dhIAAn6Ip zy1}V)O)stv`h|eA+g#l7hE{p_z8^oL(C?iF0eUT1ZTlQ(7o|T|TPBjkuq1x*A>OB{ znq9k13Tuy0{XDG7ag}>lJU-A*rj6#9-5OFRtWvZDHb1O2m(QNyDX>DX+XGil<66As zw(;RB9xQLDXq7Cxt+?r2qWKHdIb-ZHa=LaR6=Y!DbYZV|1YmqD*_&|D?R5Y(S$J(| z3xVE98fZ#6d~$8Cen0dtmTOB>Q)fF?@j}1hFH=wPR&L?;Cg0bmpTnN1aJ;;H8&|6Z zC)SGHzk~#9!E_h>w8=AaJGblwE_Ge>GXG4sftj|yqgyck`*^Kd4lbUYRjLZbt2n!zF@>p-sgd>jIkxuvxCGq?%#u=5lw%;n z^N`GzZvILx)8a;e61Z;S=4?hh@l!5&?1KxYn*#V=1+iEv_fMPtD{cC;6c&fjLo_{b zr}v*bauQMOt`jBz0PL;*n_}SlzXM*jeJtEIMH|k{KGm9d+@$46O(fFcZzWTlj5S(V zN=V{TBxWX$F8uMy34s8?0GhX=ckTR|pWxyNNjRA>bCbdWIx0IWtu8MvF4U~#R#%4n zaN$}+Jb85EhWz%O?64v)i^@t2C`SyKB^xmGa!2adX35+{962h66m&@xs1v1&7VUkW zoUfM`OZ~8hgvg`oXbHcUxOO|&_;@+|Zza%*7X_$uN|S(icWUBtwCwcY7rCoe#O$in zEEr`g7JS&?Dic0Ss=y?4z5bH={OTkar@qbHK)L?5Kbj)EmZrWf_@;W%g)UM*=<0mX zJ^au)D8JK@De#6%-P&k`sAzkQe!J+Z8t^?ss~X)7vvj+EJfX_mZE^uRA<8aR5S5rv z`=-Z|1@0xY2P~6^dW7Ohs1Acp!F=fzdGI27kkS@H2n4V53%|P~sX{6j=1O3pA9Kon zds6iL$& zR1-A_p)a6E_8HQ1#YI=)Mpz>d2&S_|I=g5>65$OI=pTxDWE{z1Jc%lrViIMCW6g~H zoRjB8@i|LKAFYy{U>tgds$pp=Y|YK(hFpL)Cg@YW^SC{`I@sP1bJc=%#2YORQ#mideT-zyyE|rjeZQQn?55?`XyNp zS({60q=l=0Wb;r^r6(}i>i-kItyACrj+-Et0bD1*D?$h~AqD|Kfd}?h93#@ZIl#+! z4Sol2fdX-QcXqWm*bf=Y!Jk(4fyxyMy+>JvQc&r-jy(3*o#L}|y$ zEg1UK#mCL%^GgiDKc|yrX5t9>Z^P+MHkZJ3UR`7|PX`%dB@fEyLgS8${Wj}b7%CB1 z1Us#HJS6o71yL*8I|_{0Vn9KX>5p`+cV%7tN? zY~R}}wgq*G=luQ#G=Utwz`Th_R}(>3Gs!%I@gY@z?#y<0Aa5U*p`s)|L{dh2G@k<7 zV=^ha9#dklj>l>}W&-qKg%Oy8rT<-<0YaGz(gtfS3mp-QHb@v<(3PhrU%&!(yuBex z{{|h_RUadA04ZM14eUq^0csBu)7lheYa6845h+E8YtBLj7z-b5*Ljtq!y1{iL}xj_ zPG4Q2J-*pjP#Il*CGV@5>0IZv1U4I^;tJuEtSes|SXE6B9bO_kA!fUh*F4ligAyI za?d_OU<=KHRS|sbuE5b6zlPJ&+VqX1%2{T3^ug4?w*C_1b`G$x{YE zxrU%s%amif*LeG#Nxf-&as6SGiC!cv6`F$OL{DQ{kX+V~r%)@^fNvbjX%0Fi-wH3_-T1%##oL;7C@3K=?O-Z6F%2^RCv{Zm(E}t(*s=p2<0kBg08S&JVq7uwVhwLCZGmf;9)y&NK zcdPS{LatQd8P5EUooNI9pAIMoSoBl!3M48>me5iS2>yjTXdBU@><#COSzv%Zbk#G1 z=4FpzVhxX%1uClV#FKWK(t`>rltV+Us1rsl)d0N{Q%5~#ylnsp1en-ek(5Ri$7qS& z?fHm%Of=BMPO>HbmI#DssqCk{2EAV5Dc%bO0@L_hEbbdnCu-t%+(cZ*rG zQk3XzZvjZ-0jmYdYlk*t3Y<#zmKI*psbHGOA?hj*n%59^qiE`355%Ai%ja~DF_q4{u`Vmu42^=?L^V6c2dp!IF%t1Zr*RxR;^1{1tt{(L0ojmTE&7ZM?` zW0T)iQ}2|ru`3rwPTE)1Y<)s*>mMBe(^CR7EvYMNxIHLY=R-ad2c z>&^imW?kHdZ-onMcn6|{GKR5#lvd`7WDy8}C~C?C#PAD_97?#XlKK{^aAqPb^-AS= zG$_i=Uy`ikS)_he#Qs3y-h?k+T-f_J7=Vp>EZ65QRE?)~CVQ|CFIT1QgC3mUdorF> z9JWCf(?v+;k3fl6AV@9NuBKdu>vemVv&WdCc7%)o5Ngd^;U1$=;Yaev02Kmo1@PzH z3KXMx2r3&jt(WevgXT41z25q-0`-v|+&&KP&vyplZL;dfG%~jbk~jfe#{^k!r8tVP zzU&utWDYqf^g;RObIUadczsMe3sI9fYy!w!RW4l@=m zdkp0P5yAum{Kl#0uiDsVTcZ?cMC>Dk-ffu}0gUg%{Zu-PUeSOI`j|{i)}m>x0e)Lf znI0RamZhlTuHu}kwgl0`3*@vZlxu{Lq0ZnZdCf`)5FngvTXJ?q3|Qg#gy}AV{If`m z9JP-@oEpDc{P1rAy{AkjNn|SfRU{y{P>Ru*b4S8{!y|H&WGq~X#WPR1~HmKXR;9@l&vS(4JsOyGUK;ni!d3v5YU!1X$@nDEH9D<oTP|E=R2&jQqc*sbjmfIw!*CU~TNs3A4H>QJhq{11 zNk)QT1KLQ-RawzD@yt11N}^PC+GG4ZSpZfS+g!g%9F}}VWmv=_mdsqny9Eb5)8HxD007!k!gCT9(|*&XdjPKK>ftlOa6VZ`}>)L}7kx=9mit7_QM#;O0JZ(6q6 z@nWr<9d#*L?oUk;uXorY#p0XS!_1>xfL!^v18dd%%tXenBctJ%{Wn><<}4`xVDvt@|JxgMl>S(BiuV^~S;jd)+8i)5>D3LynCLm)v3 zGHa4KR?Izx7^>M8jbIqcs_+s!-yn$F-{r5@evE}X+z>H&elWBxzal1Lnv;e#6?aGc z4%rQ~-6+_nBl1;-2@OIM9VxGnD#;~zPd_0Y$W>FgK{!JB>|=F+&_&mjpqaLWUKTz9 zH%+bs#?dt-%oTrYuBxJ>Wf6{K-*-jGY7{oly=gckW3?aZsY$`^rY_6~h{#Ioj@zue zr3=}ROJOtJ>`?%SkZDOm_nxmYeR^#Ps4$zRA$hv`uMTXG=5nx+g0h^1vhG}d;wIMh zq77p^nzPW*pf9N|xM2YTf2=pz9q1#ro`hv{hCshC!{)wm|Hw^L0yM|a>hvpPXzjx; z#Gc7fonwLPI1+(%B?x`yc#@^cs~s6NYCvc2$pqldMNo%%p!}g2QtE=)tg%#y{p_D3 z({p^8vFGOwYl&lXcsUC*EuD&Byknb4)?2Wi1*U;{E@@pdDRhr+8eHl_u^TTM8E^fr zuZS8n9&N7#p|f-7 zi=tw^p}Zf|IBxhFCxGrbp;J*eb{x=TFB*SeimS!o%odzTGCWvk1bWw$S_p~{oRP|A zx^XwmRuW7g8SV#2(4`ve&+66+-bE4X zOET9au_}#oJ8&YbLs8o0@kN5FY_fgUL#2#OjRno-m3z(p-ENgy^r8y!q;0vH4@9j-0<6iKp|`FhyD#)U>Yn*I1}P16-`V^ zGrLL}{z$p)MQ^iyk!Fn+3E2Q>;}hs1%5+#>3tD;Kh)~}P<*3TV8MCqSy@(K&fu+y- z0@pRuQ3Bd^vuHZvNBTF}96!UeXAx5d&l6Oh)xoaZ+@1HqP?hk5r314#DXee#JqArx z$1-<_B9>F`<3*+E4*OHR1HnOo1Ap~lQABjX)r*{9Y|m~(&wS#kM`fy+!6?MN;_f;F zcfae7+B}5mnH(8$BFzK<%R=VCQE0_`@ayI%>lV!qHZCdGrkld#ZxY!gWXGn`?fiUv_{<8$V5?H&}Az*Kme8$R^yW|`d z{E|w0(5F(+c$yzc!V?LFgco%PK@|sO90@X+m$S}qYT4Wml$5%vn7~*d?qEO!G?r>~ z%pYwv|Ioc&_1UfLSg&J4uei2~-fn|zbiq_ivwqx8KdN@x*bpx8f;+>4sS_Kh`rKAn zl^yZ-U5o+GphwqoadG~Bz3dGsT{zzJ=SUrA{|)Gt<~=&Y@ec+n2P03&wui;Jp|+Kz zKzLnpysiVWPqk*DdoZo>2I5-5uKy+c2dHn}wcG!s@ytcw=?lWEudSN`kwO-*qH~%2FSZdN#h1J z=!HRHGHt$;_IjMbFDdB|gI#G+o*nW^JH*u^U`+iFd>g7NLQiX}wna=>Uvieiy zix{RR4Z-=ff7RG2VoNUwo~Yv-jpH1x8WlSaHP4`l%6arpOQ)u;BML|Obf~I@dw(zF zXIwPBZl;$&86X3GacrSaV^)3^eI|;KKn~}%&8EUz4~(;nU<^FF0Id#maDpJ>Jn^83 zJ^84%m?&rDppJdkMqYK6WtjC>iPv4bzi6Z>HAZ(#TeNM$h{x(A%lhv>dgSW3!QQ_O z!BESRvCX4So6N^r#?UA#iFjfPVr6C23xA|3PVXe_A?yco zd*1d%u2y{?e^6|l`w?t>VP_Fix6yYCWWSeEcI1JzP88;__?EjQ2zGC5%e(f9Dk38A zJE}^=_Ez2ElVFgZ1#mk+b)-r0YysMK8JjU^mmVlH*%w7F*n=yinCAS9K;Nmb8yIdt z)j9TzEzqU))VYXQavA$tFbJ@WIq-f507-7uE+!e_m@wr9b&ze_P;89XbSG&+2E6o* zlsNY(cvXIy;sO_ZNNEwV+n|;-(R{lG=GiEZ?)8VjTN3Blf&?QzmvzPEYVmH{VjS8tm6-$Rz5^!BB z;WEGvp9LZvyGZ0@{Cnr#47Y~-$11DV8Z}l7RxHDZh%30?3w8!R+EU9z;LMXb|5%@j z3EV~SXqtg|kP;UP8U)NxPpf+_l%eGL0Gzzn)dpJ3eVN6Sao_MMVc=b|o~;@$#Q344 zH1++1r@P-jU5>;^kwHsPG1ifTNf4?9_nfq$|5iC$mNSXwrXNKeB_V8SykYLT7f*-x z;~KYnV^Gp5&Ikwdg9R0fiTe9-121HFQ?n(|nm!;!YK zLu)8En}7B_qz=F{f#)YxIvgf#!;HTu6wKVzj45j_kyci#t4xUGS9XisjWl#9kSb4z zbEWycH~%K6kt)FeGAS%-LQBFLjzd8CWSgRvF!e3JmRvYt!Berx1eMZii9ob{E6u+y zW9g&YV8~V1CsGb%RF?8>3Mgou2=0F{t~S1161>V=rQF|au8(on%wPwV)Vm3PYOpiE73|7~0O{r+)xFwXRoNgz4*Pr8pfFTuLp9 z2*|AlRG$E=K_eX(1+YvqI-H60I=EsP&fRiU%Ew8I&CM#5T1-B*w=Oy2uuM;4fe8MF z#0HdWO9dTq_NQ?iqTxiT)e5gHfbVcIP8fYrS|yd*>!}Ief@2nw;PS^`Vb1k?B%`t! z0QxcbXIQmhEYvoQ6n5No4wH3i^)67Xpmo?ELpQ${%N<=l3QosI6I@yw5+0JxndDwy z3mUyLFv;o`O1khCL^Co;E416lHU|VNth-a=Ml^4sZOh<{huRcZ3@5Sd#x}rG!SI*( ziwxc2k316@%E@#>HBRuafo;dGorODSi7Fd+c9MI(qa-RWU72pRee+@8+4=ZH5%#ZbmiQqS}V0Bu|U>u`Gn1a*PqUz#Qt2g_*V3#fK)CHwmh%{l6^ z*@RNvxdJ1aH|1T9E#P&j_?w;o!>ItU)b4jeh99=^zV zOanre6NCXDARf-U>_g$WXD+Sk$P2isT2(!)!JJL*h0(fib}Ww|h&_FxY|Sb{Hw$vb zah7(00QZXH2Y^{o3}A@(YMxEkqP7NIvf)be+KR zM@?a)F@?u`N(j+nEL4NJphk z0&V;lTnUm$B%l~b>9k4g@h1t4Hg(0B9i>X!gEzSjuNb%1GbZmnEiT;dFdT^5SX5@l zWRin0>b%JC)_rUrQ^u?#j*PaSG5gD&o!0gDSz-@P8>S?a|=y zA0>G5+?owL(P1R*d4_T7g7ug6eQC&D(3J0Y{DU9!)m~>vg8K+G8Ea>eJaiEi>SE`NSc#IjVh!M{_N});uioUxiHa% zr5YqQ+a%@);EhYT`f~)NuF=tHMr43BYE>ZQN=UoUfT%;iKTP*Uh{t7dDRyZ(!Gya0bU+Cz?gnf zskbCdN*OSX8%qOXBRfD>^7a6CCe!Rl#^S<(LB`9howw%RVV#gv@$$PhR|_6D-J)Ks zK*yAptC?5pmcc_~x6Va{3LYiYO?)-xPgU!k`6&~y=y@$}63Yw-9#6P1*s3;=ly1hK zmf0T zkFBm^&XDM*aww145#tWpuWIqau2+F=Z24|w z40=$iuXcet5pQay;jy(pDN38WBVcR6KGKBuo4CvQtryVAM4KhS#EK|R0U2o&EW+{e zRP4ff7r~*Nsm&~P?(d(Z?XYk%WW{N%jM6OcXzvu6KfY7Hi$D2h#I4G~BPqkV@_paO ze`YR!@H`y!BN|aA7hO+c49r&%+W}bw*bNJYjw!w1N1TVhlXQV2ecDD)ILPRc` zP%@NUtVgk_kg<#9uaodIQjnv_$dXPJ&_3ssuD>xhID(QUevVwp{RMqec05Yp3 z9p@f^lx<@iPCrMC(TN;&qMF`s5lhY~FV;D<8e&&N@5*oc?Q%_4vqO>|gl5Mw+yXUGTs*G6gA%2)4-5 z1$p4X*SBFeK;DOpgF_zDC~cn+f3^vQRm2qpNsyD5!#U6Bb`|dQLU^HFlodfYxB_{dxqJ4KlqrR!wuQw&_{NM#*(+6W zOuEMlnK~6BlGdkL4np9sV5hV3lZ(0cFj5+-YorPB_za>Ov>&+3GdZO??!o}(Ndy_o zEp2JTk}Z>-$`-P_vIT;cTE!KN!I;O@T|wr^rNdy$TEuK7jU?Sa4DiST;%2@_9AL-f zpEeNW5C8!pFH5z2`AJJKeo6~@p8kdU=7yc%wo(sUsSt7IhJNDDsSqI;!JtDhiJi$8 zao>TOOx+)XHSyvqZ37JFw7eG;>>D?Si^$BOL=q@`bYsRY`QrF!2P;I|5a{}Udenx? z{bMO9&8nHWf@DWlCAbp0#2V7d8%i9lRlryL)VVo2yFVFZ+GbjwwT~O=8oK*M<@@6iTR$pGLbW?~zj7oKA9p zPK-!k2W^YPF4C66BoQ9!Vls5m_=)6p+L3OvDd#x*m!i6Ab1v3EXwXs6)d(P>rCJ{9 zz6j?m8Y2+`0xCtTO(NdOhB<`D0RsWl-o5(zNCB6iCRoh zOdY3|ebaD@cZ#_0&ekZnPA4GD<#{BJk?=K=2g{u`l!mpcJt~nrjiG;wo1N$T^(_Ze zMz7NQri*ni$pO{fCiH6W!JXcuzLAB%F6oOnds`#-eGEo5iB(6u#(z-ApI(7at+Tst z$Vzd`z|ChTGdJAOu{rhM)VpeOo(W zcJi*B;$Na(Cv!=uKAL`=UZReHctL+rp$>*n{Sl& z17(WQ`jLn0*L13PC7P6sKrVi+^7%_IT_VN3?5EjWz_9E})>%p~l2yWMmknoRHSKk7Ih|(R+%d71dYu^=e#|%st2aBUXi*YC?cXiVajCgzh?9!K zS}}hY#xKJkA7Q#V^9GpIT-hPni7dd+wdTfLCQv6lW zEZ;5q+oaH4X1RcB4|j4=YU()mtR{pY>-I+y3Hp*oj)kT_FUE6{dK>HSsuAKF%~Sd= zWcd;nLT|7lmru0fr&^RmOynrkgdf)oJLg+IDfKBW)v2Z}qe2u*%nw@9sI>z?fTXcVC+czRbr zLIWV&rOnuZLWJ404cw-|fn$%jSXmkXx#U$aN|!91Qxo&Ouj?+b`>SvZgq(k=7sB=TQEWkG zMyJd{rE=0tcf!;B#o%$!a;r18@}wU0y`fus_njo8A)~ID8JHEW=KM)tp?gB-CjN)% z`=0^uiB>>x#i@Y4?9d(k@`8CPToINKRPe+cGsiFuF zS-*n5jKtWrP(l5{Zvwf*0?s!Rdb9k_@mT{DOBYV&L_kNpe-_%t$Mf=w#|-Qz{a#0I zLRn$Ow2J;Zjvk34gD$+>u@QjQxN&mkd-y`eZ_DxyKWV!|#>}8w7 z+d=l6eLEF0eDfAJm-7?&X3cnt?vGrov`!#pJ(O`iH$ks?M1)8#m4uyK;XS$e$mW%O6( zWyM$+$+;Gc(Tbl%i&C9eR{^`su|Ls1nwFTp+JedMo-)Ia?-n3+dMOymhY;H58!a`5 zt|JCZsqJD5b`m;t>uU&lSC&TOpgZ{as1;VPJvA7s;J=L8x4u-yc-&y?J3cv;!!P~2 zreTF%T669q7U}~BFm`{)&xZ)b+bBxbdI5HRK7YLPuUZrEr6rlBfdBC+d?C*;xZ;ZzuARFK$w@t;u!_Ow43{ zZUk{di@A`G=u@>?C%C&_36>st)9U*Uv_L5J3LEDm^uZi7LqjY)nvFtpEI+ev5 zKHUFvlsF2dw?dj_*j{VGX0NuUyk+m^F5h!_M}&WQ?{IN(uq*9nG)sMF)LD@P^248! zcf}g)BbfCuXB`h=|BIg3-Zn{GzenU6mvZv#S(Lt-3EpJ8X)kM_T|1W%n$Vx)SA%wj z%!pryS8j!peCsM~OGUCkI3p-Icff8Nva(0<2e&{@`}>$w=#^DVn%apNAX)CtNXfLS zK~S9Z=iZzolfwMThn_7fStNLszGbc*yw!A(xx+(YfMMYw(7WFAMJv`UYq3_ihvDuM znj=#g4bA!SNL2_eTq0|^2EcK=I6{We%9vJYs-OfmEDHctl@%U6b7gD&@BwF_nbw9} zAo17`MDg3!$EVwaA1xP-JzY*}5paJb9n6GA!laNo61R2K*$duRt;0p^qkvy=99v4q zEtEx8l4f6BR}fcpbfrV5Lv}kK=9igkumJhmn@cFe(o|RjFeKBVe(lJH*Z4vCAzp;c z{xOa#`Ssm@xRi+Q_g@wg9`W%YyhKA}BmBZ*kn&oxUf zaiK#8YXY03tk9cV;t&c%L~#L^IcEFsccw^`>Ub?Ye$VSDS@+=~9o#dA)?kpmG637~L)qZ)`zi|_3S=JRrkhB=! z>hf}Zsn^_DW3z0ebM7d_%KXE=0#`as$mdnPpl22K`+Eiun1%im%^Vh5nn}xp0uH?u zT|bBZbl!Av1MBt$xM%|KW~oOGWrN21mU))-@70`5z)HK0v7Iymq-Zsl%!lZ_S)aW! zTbeim9SXHH5fxSIH#rd1e)e1o*|8VS_?M@?W2%We=IYfmJi5HB9(#qRkE~xVTP>o! z{25+iH{w6xN`19CV(*5sxv5V72_Oqv|AcB6Wb=|k`G$n&`EjR)@k@e~59<6GLXx7^ z_G-j?(M2WhzdTY@IV=pv$-mT-;vm6ef`G4iR$X@h0r<7BI{?V3{)gjwYW&tw{sj5E z@NWz7A=--ORl?R)g7(al&QfeiuShE3#jut68Y5cc5-&I@(~DKKIe(FrY8yEk;gm$D zX)dIRQR`(1W~OMt4KAw2^Wfq+clLr<+Nz>N~}2~9CzSh(&!1g-S_eRT4a?n0xH%&rU|gy z#p9v*B&RHB6$PDxs*z zv|O>E%ZES~k47vK7Ga<~QxYRet)hzypNMw^?|$+)Z-yJ#?Hl$Jduc~SoM^6dTOTU) z$TFI~Cy@m(3@vriwN@>YwzAGeKo6U6v!~x)Tb!huZD8RKnHUgn$&**(Rop4ScGd{D zop8TmE&G!Re%xqLPYJb3#FNcb5;DCSI38KiKV{Jy1=t(QD;#pXA9NLaG+^`?%Zn)r z76SxURVDAyBmP>y)6op7-ppWcFW81o5gl3Y?}%ST9=hYm+@wYR4%}Sa4rTNu z!@kq2JJHariantV2fv@Whfk#d4!Y0^tkvW4_vHE{!~n;}xw^vq;U8OT)u|`(VF=Qr z=K=O`|0DL*R-_sJHs6*b_w{ozwY1qIhHrxz5Zst+yx3+jtt!P)Nli4ux$g;gPi@gp zo4Qrv=I&{S(f;UQiuAW!5;>&!u0wN@^N1iudy=-21I+BkvF&D8BNKD-)G}XtWeaxn zqY;dQD6^{n0b(N7v^wK#Lzf;hsH}5c_fml}e=&*$DVav+47|In1(4K|)8+ zeW;6;$OF?EZ8S(RTA)A55lPfxn=4PTKUf5DhoC=(a|ybUtHh2Q;5p3TOXDaW`?Mmo z-91R_PNVg*Ky+7GIQ@{B%D6`+01+4E{nv2GM=1L}A{312-3eTzwi78t&Yi1`2_;(% zRRTwVU}};a-1_Yw=os`IH#aAj9dLqN*-5<%BHPaUA!*u1RaAXbm|rK))n|UAF=@G? znj{tH&tIc3r;=HN6(6(B`f$H&QqVi2AhQjQIwwrEu0_?2&GMOmn9sQB%dDFmrjM&Y zlb+?kzlQR*lteQ&5{yP3mu3a4F;im?Gr#=YN97&+LpWdf--D^tjpK9RDFfAxb?k!o zIMltTgu|aeCvSnd_W(gjY-{{ihmuuUiHC#a&KyM z_m8!H@&3~sG=kB40uBlQa037TGza|;*`Qm^#%_}p;m7(nQc7tmG5=&3FUh7KAulbU z5AcMvZw?iVMgh?*eMww0R^h7mHWmr>orYyY9|%T#v@;AIkC%J=bnwR>;&yZ#^=SEl zI_UMuTaB?SxP@fWVEjN@Ty~%0)V?yZ8BH!dB%*=v1fTebglqC+@X_~IxrlL}!eF}L zhhoRj;!(Jeab_}ju#;QCY`xQ#fBN^Nej93o1QdrlYe`?i{`GFt+R^Xx&4Mu_^cu&( zL~P`OKZM6BB;nX`=Dgf*!fEieSm$Xb3?Fq!QdRpO|DZ^dCZCo?A6363UJlIOqEwrd zkY~(wdBu2tYKZD3c z3II;J(1J20bu0KN0=JvH6}`J-UiY@3vnPc?R!b{bywMYID6UGd$+DO}`x4_AI$IXD zM`Z^N5$|NS#Q>3KmcR(rZJXk7%yXP(P_HC09szDz&c|G1%|*)C%%!Xj zEHPXk=r}#tj9y&lk7!+WH2_IqQ*yl)m|$vX?laeoLqSqa8b;pUJRu>k!p7TKaP(0L zj5P$UsA&NXbJ8X;woE;i!M zu^?-0^oEbJD80<_EmPINSHFOQh}iP4&f-kDcJLh_t<)Q)W;);3gkwDlZ1s%`FrQ0f zlj-Fwbj7ct8%*!jHO=Rb&3ia!X0$G2QG>v0MWEG*HFgyv?ImDCBgH&8H-q^LgD0oa zb4^>}HjnfTwm)mln8p>HK|pmfQ0!9h*sCOT!xG zsv)^Fd!@raZMc{rtDkp{+#KY8y>aPw;m!ulWA``vn(+t_tWOF75R0csZE->$5coeQ zxB=*GN5VvoCQ>N(cl#1gVCVjkUW95IQ9Othi-i}O$+G=dc@Udhp?hLmWM5`jnxh;9 z$qcbaIX+lOPh!&Fwr=+w^{f>+;-_*wv<(N)uC-E5jnXMGMh^H%9wOFfJVQP&4K#Wb zmbcZ^sF4(GQeBgB*zi_s3-d*MA*vYiMkQYZSU6^}<#zW>7!x*1h;T$sM0B{-Id;!w znps#j&k3D^?|+Mafd8|52HnVbTmIw1Q2y(ni2nyM#M8p=f6+pUmBwWc`4PH5sU$I( zA2NceNb@j<0LKZD!lh_aQdw;cT4~(8(m)<=m6oqzYYv4DJZsdREjQazE(eB%d_k8Z z*e+pcA>OvpK`+(e6kVvxNepJA`*jxoaQ$dfx?7{nV%P(!Q93Hsn?0DZ7gH+Oq4_nm`=R?<-KC=l| z2-n+TsFXK4=8Jz4(7LMx__(hHc{%P40>ys~85aKvGS5@_mdNjk)&(iqBO_+92vUws z6aljhhsM-&mt|Z{$Kn8;1?}q-IjyWG$cg5Z4Ta?<_hWiMqtW%TPT_L*2qSv?TCy11 z;W`8SQ#^11zJ3BD(iinHZ;<&BRjOb9hho$lp2=+1iXC{!Y zZz`frQ$Y;$^J+cX#TYe#YF`rdzibEkQ+?Y$ENfRecr0@nk>emGWQt$}9xj_*&&xh* zH1jUSN)-46ZnFb))9o0SBrj#vBn7e!FdcH|4yw|v@%?9onhyixss5|boc~XS{?7v+ zqby^$Ne{y#)*EQBs4>*CNH2yOPJYlfMUCTJq1d^xeMi?Cm_b|v}U(QqfPo{et~ z>``5#I)DdFFymsXIF&}J8{xEJ6%?lDm`Pl#6wEY|g{!gBX1WM|F?wit6ry)z&W!cx zPZ~mK_3S@s>W1w+KBi2DhSuRf{KRkp@ltD!Y)1#k9hYKnI3O=uvroleK#9FNF8McS zwr2XcI2c=Pl5oa3CrKeP3FlSn2D%Hf0H6LXhM?eA@|K}R-_z^Vc~iU#FOSFLU*@e1 zb{rct2EGJM?S9d;D>VEgrpKqLm{hD4$DUO?yCXAx;%I*C!R`JGm0Y_M^Pu@-dMMKB zFd7H(+_yf2UH_sZzm8!@3muqec*ztpKUwd!cArn`ofHfe8I<5QvgENxg7y0zIPNf` zz4%9{jk(AA_c$hVHfM_1GyKr_JfE|ZPvd*5#h25MJ@}?z>Gm@~T+4lw3R*uIgpT9g zYXEe3u0pZ0?zj{`+wCu}>|W^vCFb)(%W4a1h2kA~DtvM!Aazij7A+B5GLG>b8>W7H zqx!u*lt9hhUB6O!tL$eIrH$Fm7u-VTe(Mi4OXIG*TFMEM<)8$lFp+xNL`zUx1Uqy2 zBvMR>jDkfa^x>bf7dZN(A`956bs^QvURnB%GJZ_xGegOYjjncUtoGsu00E7RCp2+{%FKrC0OiV4T zP5y(g^xp#~&JPqJO}uAyL-l6^61}R*3Ra;ng|&%A0AL8=e2S*T)6+rG_j4y#;=jaH zTOR!D4+6rt(ZlV*&ak4-@Y8*=c5$Y0^opZZnT%nJ`lCWp<2ZK`5I??H9n%MICY@PivrTCN5T{9)mUPT(c9Ai;7H5j4X3oTVaCWAB; zV!M-UL5BwjNF`RFGLnak+K4bo#xlrO-FG23605mb8np>k1|j)Vsoc@HAofS4Altr! z)fBheru9Tslul`i6`BQ;B~S!%^KiUTxnx=3wQvIncM$sP>POTO9;qnxyqfeQ zTQvJo>*#44KqAAc~S8_+MFWT-bOm})@hQG+_0MY$g$N%J19 z2HnEv6g)eapBC1wKGisw{u|6X-?n6Q#>WsZ75JW5iT(T374X7|a9K+bqH_JU7>or; z$P(z)TVxd?O~vBUiRv#!WJ2q5VqGjn0DCYRN_HKDLT{-d2+n`jL2KDl=AlWn&|c9} z$yZk_5hSSkixh~Kerj-B8q-ass7%gf1uKa<${=Mno+{qkA|X@RV6=|c@2gnmOn3F1 z33eUp?H1S%T!iI?-uo5~l74F)P`TlS^7g223(9EQH8B0`efBylOVp@B|G3D~$m+Ta zN1<=`Qu;#!ol1zK(@8*o`uA!GtlaFEutpArrXSehZ+&R3a+aLvbSQ%Ey>BhQqT61) z#Gw4AqiGF(f!YD@R#xwjS~CZ5KS``nRHR~H z<5T9ybe;7M;L=e3+#tA1Ik_SL6pl|}agqYuT_WNGU08MCH+5059)DmRnUk3hC8DmV z^@*(hF)xFV|6S(H=-jjcxl!oA_k_RP&r!Ik)c&bA^D)XU0bvwQq#MO;5DaGXlP^=Y zQ*@>sBgYWoZ_x}P{l$zQqO-jIM*H0CFil1#EPtF$_cD6*=i2T{4?eH`b$agOrtcoVs{bmssm6NRY7TdsX&M-aZ7bCZ- zXe@`Chf11C<9PM7L&-wo`^jS`$(bAgD!+42Q`$xyp4j>tLf1xs8t~kpXa4oTBwbDi;YXEs@cYcd=x(sQec5u2Tm$hkT5z$ez?@jnncZAFc6W^e!kpe8V4c|@Pes;O39ZH+yh+dB*bC25H3Q{lsdt^f zx{J{7dmEvR6v&4J>ywx(%O`R|3vp4=iG+Uq7i~% zUk^&NB(|X2i?X6h&Dyg!qgz-LK=-nxNE97Fen!^S$A@qk$IRFk5jIX+{>G@Z##-2! zx|;c&4FRTJYuQR$crnpu^b;@9{gPOKHW`o`gixTTL2&w({!DwKDc+%A^#`1Gl{*$f zlR*X$z%1rsH5rEwiGDgV?d~8N77gQiJ984SH*@>zeqw4Ma`{tg4L|gBl6h$Wf}@5Z z79$b3H0&eUu(yPi{zmLceQ`-`a5;?uomfFxr^lK`4G4-BeNaa0w~Ug4skONzM(8HO zAMzOCM~}t;81PkrHn=#lw_>t4nQ7W-Y>nn3h3+6-h#c_h5{-F@|U{B{#LG5tzZfeFa9Pxd47B;$=e`@)lnl87I>Qi(F4OY=ylT5a{GHYg z3+}+ca~?|`C!a5|=_vcDSUU%&c1FT2<@c(R;0MVclBXoEJGj+nZuJjV(_ghHFoJD4W28fb{+FK&&nvzE z%J%@kxP;w52iX7rApg&NZ~G6>&hVdf|6hTS|1WSH{MAt8UrEZ29st1jUjv!Voo%fD z6J3LC<+RE6z~u)PsmzukuSoiPb*c5LxOUTY)PvQb&WVHzD?E@?mNJouaH{t3^SUhx z0!lG4DN8s>ebBJMj@DIx_pP7{Rm2UqOea@2!FVFq89ev2WmEWwJ5oasz50#v1<7%q z#3r#Ra0WVcHewc|qnk(~`+;BPcEEW6V;wDQg!Uk?{$B|f1zGABpZufJfm{>mgsQjT zXnl5!$HQ;_)ZM51lWZAxfly=C2YA1?=jVxczn$#F4sFt-8NI&j9uA`B?d!ih9Otfn zJU=O44u2n_VL5#sw6YtEH+g(S;<|-|`5yLg!UyC>nfJxaq(pO_U&gg~kHO?fWOW;z zClZHhb6?>xw3+qE9@&1Hqw7MSNTtZ+Og_KJPm_f`S&I|(rsy9y!cVFZwc*noH+&8by%~rTfcU22d2CjPAp=_>81C7yorFw}!|2k2NgafQpRg1C)*AhZ=X2K_&P&af z=4iKUJ#rYJ&=CJ?IuR^nornT&dI#?`CrGQFxK$^Ue9SJwoh4PY5P?Ud;b#Bg|3vVb z3+&cH9DMfMqA#Wio@h2Hn9>-C94+(G%fP*zU2=#x+Svx|_$j$0BVK zb?>=|X9B+Ke2u;VS_5Q3ZkjQYwfexjGZB!(YFJ(|S)k5rR9QWiSxIZv#8aKj7dBYO} z@JUSVXM~#+x2_yfsfh%rO&lbCg$PZ4a|I0VpnfpeiMn?prI-@FRuAPMKS3?-iiumF z1=vVfRU=&Sdy!{^A*^AHq`MdM3{wq6u)Trr9&8h!0e&dqd+MgHOdyPm$LGVJFQn#z z`km4wSY}klxgxnx@Ko&C1%}c9sdFJleofW*z$udiRT^(3^|k4|K}y1Z7bG|CV3> z1jFt9LkhZS0lO~8w}NiNK_M96bu36~S>D(o652Sjh*m9@gwf3-i_tl(g)meusXZ-b zlKFcQzo{Y9RDj|bSNTpL=?l;ksp-a$!y{e7!#~-@nO+m95JBP~#9$g*utLbaxi^Ml z{~AsNm5wI-3d!`B`IV9I(OG>p6-7+rUD+ROD14E32ZGQB%=Qgu97d)58zlv&8R=q) zpX~^IH?;yC81UwzW&;+!2hXywQ))dB22HfqK7f8jq6U^^cxc_gnpE;Ug|}C(KV?OnrP`IKJwC!37lIJ3=WJd+ zZ_F778aImW{;odjaHVj`A#Up|z{2}GMLMCB8tm?}>)xy)8V{&CjFqK@uXqE8KP@vm zhJF%e+UunK9*&f@0u0(BgVjDYBI+S$>y=AYGMxcmYg-?7e$ob>$p9_^5`b!?`(^=) zwA(yFimqNZ+g^H>CH>G(1gX7*PYEYt6F66_I1T0Q@BCzOo@SMxF4VZNCCOIbh-}L* z)$DT&AdIwtwzmvBxs{-`^gP5gEU10ybPQKLSEc(1w4|oPGzMKsudz^U3Xq-eUR3BY z(#g0*0YQ4ok*A}v==MP9tHqSu>VoOmgmK!7EEh zhfU~#-T_N@JwhYYYu4RfQ<>$^ zL0{2u(do=-Nj%la4Q~ylf&54p`@nu(E*>ji3MZjAfQIiv`n@u@mTdJN{I-fCwcM!K zvtwDQPFH(aLnMG7>s=sei@UF0*ix?rYzTZ_qw;5D@~D{!U0+5c zf5Zdq7liWQ-Ks$hOriB4oOcoao}~053~F6;I7jtzmwJ@H_S5&7j}-T(_xl+OT%{#Z zZ3)VFdw#HkuaF*hw|{KmPUs4wwY2>fVoQ==Q1gXj=-Z>DCK!|iJTeXgW~2U=`OWNo z`;r>x+SbM;9$&eNN@zFC(6?RuYYe9 z<)6t`_)cn8FtPz}RccEsXEkk`_5!L$pQ3uE2u*0-O(gC_2zlgAMNHq+{?HiVlmaxt z8tfL;?K1`Al9%!qlk@Qw9&WeoDsfwT4K&=>;m}GVdrg-j`-Sppg*q8RtpK{1nuK;L z5*IS?!KF)^vP_U*B;>xOQI&NMT~(}`8qpg4yP!(wZZjO+d&6mC>m=~pvCi_^QQHA( zWrM0It&t?#vB1g~u^0)Q3|MCR#9iumq|%JfRyv8)>blI|yD}NJlOSOSc-QOq5ZIKb z_Qx^a%r-*GD^;wh{CQkL&t095@~c>FxvyW#T^KD^Fkfixx%IZ*_czb7oapZZ5+OD@ zl`fXFU;=`-9ZUB>-&ZWyo_%W|Bu}IF(%#XJj+xYmrtw7CE(LA}f3k-e7s9gSmTM?H zL2hX+08I?!uV?yb9P4{^u-SRxo0Q* zmkmwf6aWr$Uy@}|hCj3ic>IO5Os$E8urG}+c-IA%e6l&#g61%i#^an~cbQEx;K9); z<$kfhQf&Bfg+dtYNehYpq-dv@JgvY)*!J{emcdlz%Q3tpKM#;nS6u=DfMOUPI)re; zR+lkF0JkK`5$f^W8qkGxr{3MtL78z$XejxC;1D|&n)koTARp$}*WntGa+o>f&P*ce z1ef^@A{+x+@Zjq%jl87Hp>i!?xl|L?&LrqKICJ2u+t~&Pq`KL2FrH5eKfp22^DJd({pPeAu~^fo)TNnT_FgBq=1# zZ0mL8Kh=s0^gAts1pdGS=CK+x>6$|Q`*4Wy&P2NSYCF?LPvr5ghxoMSE{%~_r0LxK zFDwy6HueJHZR+V5H2DU8;SB{~vOx;Eu@7@zZhbwH$Nr4ig{#sL9A{nqy+H8Vd;Ne{ z%a^UHE2;yLTzex2*a#=K8@mXB6pUp$9?-oS59qZnmH{>6R;C1zv-L{p7!{GD3F|}+ z$gkluA)=K*IUs>%Cnw*)JbN?SP2*O;qKaS5mRd|CpQm4fU=gzSD081?Xhf9<)Ga!( zY0y7$T`&P|cq#Ma)~eqbpD-E6QV6MGcmb zzje0}1KycXZS$o&?xX|SZ?hvgH$4ZxKef}%E^TbDVA@MrZfFf_!Xsc<=`_WQQ5Oq zb+9duxyxI;^aEJO+-QXgCK~DKo=hmNZjIf)m#Z z^s<}jWb#wq3QV<@Nm*iEIu@Tvj1Mz;%Ua#m^;844wnn-FZK*R1CIy}6c8Nd{c9-Di zB5>}|fNmLFJQ|PGuy@62p|yxCIdRCjxvvHV&D@0g%rA^?&uRv;tx`;=AV)tTQOoS2 zcF2{t%8`B`S8Rc2(B6AS+>*^nP_o@Yurw8GduIfKnx48|eT7Zd2NSnIxSrZ$M6;T3 zwGf;m_FWfAI{dfFXjO6k(MIxXKg96t8C`?<^-|DFW7Ww~Q?=9{#oV(}&z9#y5o={W6VI z8;NJRr1fHZK9cCuxW6fy`I!G2F@pg{PaZxFqw=Q`#NQ`9H1GX>zZ;ylM~#8nb}p8B zmJb;wGt=2W z3>8w=d(mG_MP^y(!Y*wlzd6F|gPTTGu~)qRLR`94Liu^)SZl|}4vpe@Gm;bzF}hig zAw0hPlN1f}Z65vzH2?uLOu$gW1|Frv2*O(&MHX?79#@k=6NCeP&)MlY^nNN?Tc2mT@Gq ziQa}+D!=n&vaPa~mgw43hrYeV=IWt^acQYgt=i_{*F}}qRK2~jbZ(EWk;+_0Y&R8ES@bG~$_TZ|Wd%nQ6j(XCi>I_A--M+C08`+-YHlRer{? z(%g4OU3DQ6#dm%gRmfA6*34C<648@ua(RFkr}ym9LR&H8vAFR0(cPK9Etq7#!ECK% zO^vIwI~RF&zcm1v)sxzEJb?trX%X?_nyTBZEVC&TIh~z)K6yB?ZJ>_gDOA(ub8jLtari};&WSgwHvb+%`IYkr({#D0JM zZdOE8ZmkXFn1L%VOMO-+5_TsVCy!$b_~k4cfJ-Nyir?f9M!W5=|9NagUwY$YZf`j- zba}A7H`4tyl+>z%T7Q#Wb9dGqWgn7ZGphGJQt4X)*kP5_X1W#{6vrskcao!Q^d5Fp zj|-1nU|Ka&yMwXybq)PC8`TevRpwQ_lXJ3R+Zv~4_YP&tj2e0v*HZUXbAie;Vv#H6h@hhAkOmFTfbd#_C{~gQzR<@ z&d@hw@1&k*QPsF;5q*1#kLQyF@2F=?2E>E0Q@x*ner30jBJl7(4rE@2hzMPuq@_dT|G_SXw!}hF95n`WCkxKyjPV`ngvnuh}XD$ zaOA#v(2OW;{ZXS^UH-r1~j1ZSHk)z+V(ot##gZY*7-St%5_`bh}3eAo&M7BS(p#8`-lbQKG?bm4u16?R~|~0>YH0_;_m;7 zzB{`~4tIDhg$?>DQMZvQICIBf5%W^!zCd)+K%u+zk6`J$1%;0$fKowr*sJR-3(l_y zqrtLR2l#54l1qYn*a}tsuDg(Aga>fsenl-$_Ua-+01Kk%vV+SR1wasoyR|X5x=r z45~SEg{Q+43u$>Qy90})nY@i@&c2CkhBSf1jdboek`N ze=HWUoLC*BV0o=upXbM!CkDDbMl@%hoP~v&nVz?)Q`O6rHM~EeavPEVaf+z@4?i`A}V=1wj-t-fYH>K7wlc$SFk-BzKYXWB$-ln{R zvTW46!&impH%2sS3+F`at1tE^v6B&;6x#5g_I^A@-4gJ9d@Y~jXm>m5mOF~mf=x5H z4HKA*-lwqR5cf3ixlTdWa#)!+)iOlXF<2~VBSbL(SUMZiRO~j@^-^eYb5n-HQu%Ez z3H$cY8I>fWX`8Nuqi)b;*6H7{X$p%)QidP`xaQas#PbMAEh7x@ld%snlCb` zb8Et?go=4uWs&|Qh|~{FDoyTVpX=zW)bC@{pd@n0muVc(mtmBZcaFl+svg3~B9yg+ zw-KSE&4|3xh1!hs!tL(Ys1L{Hb<|C0jqdthqI;5m{#sWlM3%y|mR)Zo{M!3PFFXZfoDma7 z63fv4Z=sI79;<;93Y-|V$)HAf<~3ChL{_-nIOBhrYzoLK$+31>+h4nSVB7tE z+gm;Kx=j~?c5_x2#p8N3Bw!syo5}GqO1cu9)52-Rlkr(yY7Bb4(?5r5c{jqF1KEhz z9RyyjHP^cHq*LgQ#mvVn8v|gBfXR+UK@kaZd-}QPCup-hJj?8QRtI* zCbsZ|xE41JtiDJP5imMVMCK2a$PR_Wk~OXgYJ|qBTW&Rx%mdj8)UA;EqCB6kc*c2r zcUmuAjo`?#=TTCU_y7^C+`CNcyS81j7*c_f&99_+1BR&-y*@(d?@tojnoX9)bYEZw zp&Z(rmp0T@cxz`!ahnPk=~nz@%Im|^%k8jnPOP3*7r8}jz?^{v_#_32vfMW zJFL%=foC0r+2`6Jvf=ES=z=HUonUmxsR@-pFjFW@8`PQL))t}d-G(z31tQ6z$`pH4 zup)lmJ~wql&w9_%da;C!V@mc0syW512$?=|W_uUl&sO_xgZUaQj8XbN-f+^=*ZE6h zI&aSHe^M4xVHikj7*mA6T>zaIILnrEo@^!MD=`MMfTw#$0x1lQubAt0t*pL02j4TYtf}*91pN!hY!rpFX0wLtBz~L5hx!-1s4gp zQ(3v1d+LFi0~ImhY&}piu5Se;xx5nW&1$p_+W|{6#VbA<0=FHV>7a#O<0u zx1bF~XSV++*>A?c{iiyEkQYxW0VbS7)S8{~QKm*)A?tD8XQz7eF$SQ`O&aa2#+{Os z9LX#b{H65zJIaN_Z^U;4mF6lv$0L=$X~c6o9Y>C*J}NDEt*KAtG2p9 zF9{mmynTqAfSATcd|zif6i?lKPp$f8IBj~oPym~!jzPW7$)W#kd+x$z$BfJ@F&Kvr zjXU91;!>R|HAyu02Qe;5FWKY37jXFHX-r;kRj3w>GP(Sl0~Vh{w|%_!EgJq3Mi4ip zP;>BpxT}&Hfppaj+4E(+eh<2R?wID|)!{5r`0<=riA*^hBid}9`nC5{h+Wv#hfKp)kbV zs_aPNNc7muAnw2n@o|i2yuxdECh%=TA-hC4o()nr`*&j>Rl`u21#dh6%>CqZ_jY(% zS~zYEgl*~k{yyj6QQ@~2GCKxfXYv`tp41|uykAcv4Wh~&gh*EZ-%yE!z(OEB%!*xV zp0{5cPJ-0ZNoOB}`gWSzmP_Hh5s@etg}J>tdkN$gF~FB`0D7XaXOn=;h-aR5jyFX% zU6v|}oEK<*9ju!@W*$aZE~x}`MoseG9S&$dS~{>!d9@nlld0XPfSxR>wH;+%?D4Aa zDU~@b@^Mi27{#>ZT26KTrWDHt?8ijR7(0u9KPi?1RGfmvp2jeCp{}5H=v9&h9uD+=z&V|697}2O1#mJk@{yF~|ko{=8)*V1XQTcB)HbQ%}VY@=fA2`fhv7B{9Q!B*ONms2|%p!82~ zxVpAt8PZ3a6-MIMhZV9Zj$i1n-+?s1?~N){A+49|Y!PwatGl!@?d@x1m_-@d_%rsH zMg-C!X>l=J2VXa9I7%F_Jg^kuJoIoUK8{2eh$ek6u!(<8&))Uoo=k09&eQWs0r`(KJz*prb41#-roW)I( zy$_A~{G9Ea5x4?C&F08PmQinF2ArnBGE>HPK3w(%ca)i&2(}4U*Q`0)jS+!DOaZ|j zHI(qli<4QOgHRg}e~4qlRVv+Dhcmg`ktfgBAy#XOJd&ifow76aL}NR=ak7qZlcQoP zv+XB4AY!ewRZ1e0<~^tSdtwGs{V*@EG^p1TNr+%&y?icK$>&RKQT3A}@i5nJ*~Mn?^xxotHXYJg6d z7>SeMYuo}Ftg{Z1%rxiG!Z?z_Y4r{rc7cK!d)~?RoKRT|G8L_IA5U!ek0L%IAONs+ z(4gOmC@B>e7nToh3_be1J#WgXf#~r|o<2ikVTT1f;h_?1)2s+w>M~8MXgscBfXC*< zQ30;^gkT&kMAo8O%04Fpt99?qE**KbpXb$px-E&c7`ZG;fkn-K|C}j=o}FJ>L~5n&-I*B z*HOc>v0$y}?y_#B867B)a}syV{~BvWT`e{LRIam1MGz{_7sN0j*e>i(xl?e|n{FO+ z%1?q~6ZnOOE^mt-1;!w7gzCx9(_{ukq-_48@z72k<`wKTCcwO?t{cFva_~nkGlze< z@gL^+uaTBc1AG}fG@h`&>13|)?0IO;KMUwx6Xqz1?$L?I)-CxqrP3j{E{(r?pSSnn zqrQwLq^4XF2!9)$ccv261{qTpKlyRF&VD^u;WUqL9|?MEgr zqNcoMkj+N+fsk}x@!fycx>}T7oX-L<&-zGTYTWN1B#!9OTP=!W6o)eEtBME!T?#+8 zDo3g>@;!V@!cQKE1$e)zM7BRsUKHOD%}HcjCdkV{H74M_xR~-AEd%lA#N@k#XH?7$ zS|2zai2?8a<+%w*TY3u+!3Q8j84Xh?Md5E6qEB%V7*Ntr3Sp*KGZNw@EAF6=#fW&bXXM3n7RbkSU9VK<`o=B8Ja!{OEBy=h=8550qT z*K>dajb(hQm={kYk@k3iA>dBdMnH&&TZAdsZ8##~5ArK38CKnbckGfq|Hh9jG3Ige z^?ar?HOGLeg2<+HvOyg}>QRbmo!QKi|MHis%WofK!WI0cwkZ`lz<;#TUD1kuE_f!^!H$KeFijW(2K zVKI`ZYpTA;p^&PLU{RcAve45x$l`YT*D=D2MmxF*N2dMhy`JVOQ3ZFf#GZbNIwS3a z?}qynL|0J*4;jK$6o$p$evuvs!Xwq1w*nH3RfK%sTJ!8oMuXw?%)k>ZY#kB^Pdz7; zT$Z*NIsAG!#rY=FmD=-AjXbk>W)FHq*sk?s^!%d8{@xi#MZ2B!_H?h~gs~Zl z&_1L@mm8;m|6QHsV%)zO=pPOg&VPS|U)8AvFRGb*%w0Q*^nGaceOaI7-m%xxaxV=9 z@_X&dbKy6Tb(s!U8u`bv`x(hH*b3T$F`^CZtK$%Zb%%L3?d(%L&~?d}40!zbYZEsC z)Zo0`ddFJ2E30ZSNo1saq@}V;@x(`IQpvjjHbsck;fK(YcKlbkkYHA}g!))ex-t^& zgWCT0=b@@25_u?bv_6@q=aRK6Q&2$M?vz3D4`U=amjCSWdee_VI|>vqaMI;U=T$YT zZAuAyst)2Yn7*)b)WZ?_QR4WOt83d0SGR>l?ZG4s4T@gdcax0&Z^uJwN4Pj_ppzYg z4k6HN?NtO}(VxdI)v-;}d8HPcZ0H}pQ{Uu!Ur>&ZE0BFk>qDPvXqZ!0_}L9SLX~s$ z?GPmguTFDCy%BMq zVp^@+uvz4Pc&gjCQMN_g4p>zCl*h(v-5@K$76m~Z*1W>eK|s`-^&h8)FaC~!<(m5f zHAGww^KM)Y&SGR4VF=dxY#t6*Rc61)p~iy(2zYkyh}rwLi_3ePe0zeeoP5fd%) zgjY>nI^@G3kwUc}&l<~dWCkqb^!SjDRRrw()B#9J%S|mb)_(Bpv)>O);WHXzpsZto z60JsO^nC0&`5CAH0*R(sP+5%b98M0v93s1aaRI+hG~*Ehtl~5r$Rw;;939bT5_FvY zK&`Vt9|===Me^U1-w|@0om=4PtPf@ODtn@GZuNmM&cS>Y#ept90Lh&Ncb@a4qnC=W zDFjAF%(zy-Q8@k>1NPG9P3l`05rF?$FuTuNF;^1f0g9r>9e&@`p>hZ{G=MgFK-+*lJIK=hUv1a?b45|=kUNK`MyojO^Yhs z$HlczKoj-pKt1#aogM|Jm-l4Ct7;0$FsCs{Q`&_4TG~<}eqIkd7U@4TY>;xc8^1zs zVyRX!J?2S5*|mZ4wWr}SqI-mhN^VB>p<3~Ui-wy2g}-@WkZh=*Yl82#OfkAd-zHyn zP~Abj9+>8Skl|;4vFUa>4`#n-%j)WuNwf>iD8y(j=A>p6abmD$y(zOekc-s~qf8z()}4Wtt`h z25%<)+)`4iFNY9&08t%bqGGzN(Pu&Ux?baW<#{g(_m!SP^7aM{s zj5$J1nns?H!WfUJKl4=Xrh00c;CSJ`W+NhhXodW;!M+YsWrkm5LOkj29K0^=7=`}W zPp9A6lX9B0neHy{?k_U~`M04J6-f3*TyE{}7!7BGUG*KLM_g3eNzzmzc$3gDJD(qA)H zcE0#+VB4QQuvjE2tSC8bkKBG+!n-e`Zy&7e zf-Yi@&ZgIRrm%-sGvKgB04Tk_Qf5Mt%cMaG(+UcT73{((5yLHW&IPCKi=r84GeKSU zB5)GBb)ka5hRq;%{U&MR)_HPKAkqtsx98PxP%-$5X@R0ai_>oQ!DxfT)M*Nxz?-4p z@A@h0`oOrs8-a^_)J4&0UzA^y8~lt$)pX(&yhwK*odZV2zz7#Ho~(*R20%VZ1N^@3 zh{V_ITdElh1V^V%o*;pzCLHyG`(wp6q%auA?N6s;3hV%LfjQLegfO?$9r`RkZz7f zy$nS|)FB*VcX=P5x2HCIq;`m3M8O!{`{TiDG%Z4tF`gL_5Xt5gq5b5X^v;F zcyCMuZ*n{iw0yjmS37VSCMRN0vXiqYP=?9``x=zr&76l%Xd+owOm>X!qlk=94wr)5 zj{gYhZ?a5+YwtCZVuR1k`|Za?r`w^Kx6BzCWUD|c7=jgzc1O41vSJ6s$zZ2Yz4Ep~ zCk4XSs|aP8_T)Sr!2hlT`1lHTRb*U}OJei%vO%|h_f)5}mz0oY> zxqyGjjpuOpY(N3VZ_lWTCwvJ={1e2?_-+@S=OQJSw3CC|bKKW5$dI5B)V)+#b|DL{ z``&=2NOQK)@N>J|cs*@NT6)Vu497PMM;MzvjPXihnWC9i&`2*I#G_qC1OPSD7wzzB zqbpjo8q|%*lp(L5G^!g}IGVf65;l?rHpw6+MU;fYg(RKt+&ry?1b;dSsq6Y%<3U8+ zBNWCJcDnRyr()Ow!X5@Z$>Qt&!hXVzn={B9ycqix2~X#K%$wiY8UD7Lqt|2a=@CB9 z*T_!vZPw|h-0gh9kXLXM3?%cJcW7r^kv{>10V+AN1N@nfC3aPN|3(BK!ypgIs^KF_ zs(JPjojXIoB9(D%`KiW%9066Wsm77@tyeF@7Q+-TC3X5n*-o%23Z&D4dQGQ^E`JcI zx3mnwC?`H77c%xj+C^1I-XASu81BLBP@C2o;|i5yQPcf^D3wJC04yu+F9o~OnQp)i zZtPScjT+Z^#FH>9!Muyc0aJ(F%`4Zs)}eBbwGEdG$hMDa(HI9xHd5-#Hhcn>jFn!6 zqzcQCLzFkOH_tXu=pD1P`I@9?Se(at856YxV(=-v;qxy;Nk-Q>qAIVDVR`NP!HS96MD7%mY6LOF%6hLIG@V1*CE(Q#dEj6QG3oNGGcUbhp zmnMngm3s`ErIq5l1&LslOizYp6*p<1Z8KH`9g{{DW;du9aJV9frL#T|+p~Ecg@y~3 zCe@h)4f7I0&2L8{%8YMOT7UCX4la7$d~b69MoY!hQ*w25vUwY8-HGVa~c_rL0zr-B0`?76J%Z@ zpTkx@I-e(cG57MyZ#Ps3qhJ%dk5?0qFanJzZ)Z&d&=~@S`3irxGZWY$>7a8rBS(HpK9o8#ItHqR;n1%)U>0?VqWX;O z7W)XP8W?}zH%ITiq3!Mn0-w>Ujkdnw&$?L{8wRS;LQ4?65GIPF)I=XRW zTbDm3qqq#@27xlzuy-l;1qM{wwm*SN$1s%@?VGeoU$It1fijlucZ#s4AZqI!t%^+D z=7}EBfZkA8pSx&ub4ikT{Yb_+MvxwoN({a`ba6vZ|AGL8+GF3wF1V*lCcMI1aZE_d{5Za|BE~^1ol!mDi zq93mKF0>g%>8Y_mb|)ph;hwbxiGpHZlDq#<!a1+#jcr;0qN+N@Zh<;ug4IwKV_ z-sB@lqHpP&3O)VzA+*3=OKInwTjV?l$A4AmHEB15$(fuK>)dh?LIo5b4pw zrU~**%^tmVDC2Y^RSzE_%sc71HzTRN*yxH^IjG{_u1_4z4t%aJ&aAuOqs!ZZFL(^W z9j;LLL)~!_ym!~Ei^G_ynZ#?~m(I3jC-A*|KHJ)0+(w8;u)t2m8R=qPfJ&xZTlY9X zP`o;VE1e~%zdr4XN23&DOk}Z72$GIuFvD};3NbO-WeYGN92vvr?h|f?M$|d`;k3)) z)y@u))yg1G0~+{{*1z(2^jdX2^?uHu33XKvd@c3ry}P5|-8mDS_tiTWx2%b`Sx$Z; zSR2i{r<%+yQ=e^uHWRzdT7dJrb{QJ!pm()e^&+^dvEdo#L8^ z;2o7!g-L)tJ8i~5!Y2vCYlO#(rZrC}6d~hqOwL1z z$xGYXJSxRT5t+GF@Gv{yj8E33g8Ly}m229EJ>!feJtOui%^&4I&53 zTW*GM|Iz_wIIl(c^R>)~wsAFQ@EKmdXiNhCkV95RZ00f>BLLFHII@!lzmR}-$deR> zI;z<$pkX@TbD~u{F#-AbDDbu~G=bzmC_bQlOTtvcpgd*(dxH&OI`{)khW6^2;h9Uy z1tc;L5eE>y;GyulTi7to!~PaFWf4_c=vhOHbOEI;ytL)WBDv@!dz}oCR>+U6tx}YM zo+|spC0^MEg0k=&E_PZ|yg$y13!yE z!F-5vRf>0?@7J)L0jY@A(XGY`FU6|rQKV93vzejy@mZi<2#CpbmR#p+}f z9?)Cc2@fiXAA*pL=;Bw$&$n2Fx1^hP7<1%s=R+Wb9gVqPqa9v(7a6fI4i2X!3R+O%h?5iaYm1C|g9Z_{jIU3xKmbn+e(^ z*!9G~WIbR%`}l)tVuPOO|(_G{+g5@|IoP-qBc z$qeph|HeTUw*#a3Da^N}0J)(|)JIwKGmmP=vLajO#Ypotg}1xU^D^@BI4VH#qIq^} zbIPj9ivG<<$AfR9&ZGF(tz^wx;I!xg)utGlceCl2V(Zoa0ZKr%zgi6+wYr9g_(_2OB$YL*K?UDVY- zOC-C}S&2i6hP1tSbMopHLsefM;eEEaEI4|Qhs6VE>eu;s$-EGukQJCME?`tKTnmw5 zwMSe1vw?SVU!2Kx6`mt)`4tF;|x)UM;BjjBQNnR7%D?PK3V zardGv&Z@=HD=z*-eEmh$Yl^=pHL8RFo|PAs=;%BP{)MC>*4LWhv+T+iVJNhtinDU1rHmsYh2{FmsnSt~w9@aYQ?p7HIP@o3@Dd2~qrHrX z9e*zWkZBpeEgOAAAP4%Rzmce=1j-0g4x^0xb6zLEXnO5IzQAvFCVUG2<7#a3kEbpF zydT!G5d{nUh*%u+m{{hjMBsn0<7V-FV{z-Kw^IHzmMTNAQ$;*Bo3tfFd&rXvrqQr~#EEJkZC&xZvk6 z@$(b>`~`mgH-7$G_V4)bzwq-1{QT@Q{`tG#;fqhQXV1_8KR?6I-^uT2j8^%xY=Zwz z@$(Kpclh}oe!j)eCr`4c@(X^>@N+Id=kgO-LDa}j8{e|CSC8z|8gQE_axgq82_0Dk z!S;wt7Cg}rzVnYQZIhy%Q+yp>}>?&*{jShuz8(lTBZ z(%H##k;6k^k07?e&ayL+C}AanNJ^F=ybEVEHj(=aM9(tKh??YQSCf`qQ^I>uM)Toe zpWglL2E6Bg{^t%=flFgy>49cNx5lu`6j0bPBEO_Rmb4I7#wz{K;J$LtSm=4VTn@(K zC;Nk0i42Y^O$VB1lf;v^@b|+(tIm9zlY4@0#FVDK7+Rsxr2=263@^h@g&NRF{Q30D zqu=bj5Vz4DG@?KqxF^Bb+1ne5pGj+&~! z_!$lQuI#(%;4H@uGp309hncyZ&Xsw#B(S=o(KKN52Qlv`J{?JzparHqKHhPLp(OX3 zXZXP8dc6Wcn!Fg)x=%JPs_l7JdRhs~84oNX^GG_wK#YY)Wvg zaZBE}Re4pa#8&TiTFg}&XWc)x%;{M380_>5&ECZsVY(D7CBaQ*vgH=z?=6wmAJGy3-y#^!Lcdck&PKr`;}(8?KJWh9nMU@tCW{q3O% zx;+3NLmW+#qHy^;wj-E;nGbI2SRV@GnhAy76Qr%UjjpA3z*Y*qSZ$D%Sm>=JrbUK| zxnRIn39}(mbF!e$c0$-%oz9D>vLO3oAX8NVO$ zW_x8|3rUaeG~e8HflS8Exk_wb1DfE|iMR;!Ruw87)vive7yJZr@!4zEt~;~-%}JxjB|6H4+{*- z+eBU|@@M%+#j5#Ref;S0gOBj{1N-}L4<1N^zy0<<=+W`Rzdii)x8Cf#@2FkIpS^u6 z51u{yF7sz}KOt8n49|cD()6;(o?O5+Ev}=ak#JIRGV&r3(^BM0&s3#>2@~N{xF^JW z;z0NS`96vxoog>~W*^B1krJ03ZQu+=!YFa;Ypw7FPdm$Q5!hcr(ZcI?g;qoiCEi78 zM`I(d3}H)P>6g9}=-mCrhS$~;CU{5j(1!ht7lh`ssC%tX=&uMTPK_rqbQ+MOsw2-e z4LU~|5c(8@ee~YhEltrq%hau1q!0+z3a+KpBg5}6caoe41e;x|Hk{_-<}T(wY~J0@ zqLm}@p0NGH8|jdK`%mib4`ZLk1KhhVv(I}2P3!yt>)J%?`bJzWhFfp?uC`cKH_9GK zD4zANm7ie?*gm)36Gn=%GuyP-cN`n0e8%@_6@D{3kUfsv@drp;puKrQlgmDG{-( zMRfA)@*hyz<2=tFfBGx>`S9la9RKxQHctPlBzdNZ%ez>!_n3o>Uk3T*BwfuVg z>HPTD<F@}-@Fu))#Fdgg9Q%2)O>u_SZW%L$OtXMABWBK5_gI85d?^TM=yol< z-kFEJsXKSXDoE9G^{>-4NycveRmzeRmH8??5HSG=Hqwc(wvh%;?5WWx0`JdZm`U+swm95%l0Du(XSd9 zweb90fQeT8cSMR>3HrR-UKA)AnGq7BhTlElmJix*q^t~b{lBZ7cm6tLI81Fk%5fl5i&<7Mr264*cay{xZx3GU+v z#enzTaJ(W+ovG7I+>f_fD21- zkym(@Dq&!k<1CD+Poc2mz6Wxvtt93kvCrppJ>O|O;LY6`|D_r(D?Ak@Z%7c??!{So zsa!QzWnbMM02}Fbi1=8E!+irpct1G-fkZp4H~noi?k)={WGzcXS2Awy%cz+U_^w=6 zi)Mvn4whLB6EOPk4WMLgk>vckiM~U4u*wPtR)l#E7sN3CQ~>_Vm-d4XLe- zc?PB{^!l>wDk~AZX*xr6#55O6i-;`NXVt})p9PWmZrSW~IR1-RR@{V_CWGUZ)7JCtDvR=3V%I_4BbIQ0x5j#cbjmseb}sIW zXlF!!Y4vm(g7eHGpU`-pHuw6|*@3-srD*c=vMM6<*a+EciS>P|>XoYl5i?6gp>9-Y+u6jf!IQzuFh zGXgx(T!w0-V&w&dXj82}RxLHiE+l5HB{rVFRUb)Z-o!f55L?lGD5;?tVh+K#Qs`Po zTQd+<@Nn>L?tZ8G{cOjJ-lZQ~kMYMQ*Ve_Y|!0-iez7T%?)^Oo^cC zk|!c@L93O9KY0h@cC0lZ>H*lO`c3lCN-Xx)knu9nyjH|c$PnU zNC1rD*w0Vzitir31%N$zI16q;upz;DhFg64b{D5821Trp@g1+Lw-6z1JelyE&X}o5l@W<65Wv{E{)FEZlPx5id;s8`oE;Jh!LE z$e3lX&Uv5d7kJXzUW1osN8Fv(|L|A?+lvB@zyw1TVR@l>m#@x$FDzFE|O)4{_lX8^xi&f>ET1nSE$eXKc_AA@p(1cQI-dS#&dyB z^=Qi-M`U^Qg|@YKiM;1VNy#S3ug*DjvTxnYR0iiO5}{iKC2li!pD-?&EoBD-0z~@$ zBHIHR@!=2w!d<22+2_n~NbIlx5IcF(z3wH7Ny?_^{SGxX5M+v`_(nd*SM2J|HLUil z2C0nn&;xi(dj+l?d*MAW5zrvq=vbe>tfM1cHO)rIW>wcNm%1duwjlMVi9S+qd90swaLZ2gI@mPfzA#=S8z%7yDSqMsB}z6tB1p{JBf}4eG9( zu}ci6zU+b|%*lv4sO}{8z*1d^hS&2M#oCgl@oNrG|NT3Ru71pwmE}NveSc%?Icg)1 z##Dn(o=Bg0^gy)ZvKc5wUrBZu)l#rtl`RvZzO<0%;0Wg7HscZIaLdJ}u=~Z|N%Rr* z;jND&0~ejx{~*pfsAa+_1(#nJuLpoK_Z39t4bIA7O_G`GnGb5)nT1Mc6o=7soh@;n z!gq{O&NzxF0!xVc!Dmy!@+*NIzK}yza-5J9>KLf;68*erN^U)^f6WdMraU)@hv#wv z@*#VKFwap|&mxQIS#qY0ixrkh3%kkAshQNi9* z|I+y}Q|HANVM>bzN>rdx7bZbP8Mk5*q#Pk1D=vw4Q!Ohdny19s*v2z65Nepz?5YwE zKf01i(xXf;;?%EllxMwZouy=|@g|(U!G+Yf@W-~nDFXsL0tSTjI!_SJr2a-)gN&ab z>1Ji6&BFWSvTAHt=N2ZYfLXndWS)UrarGm7F)ZSlp&ZpoO18ye74vAv$Q?0NRvxQY#09~E3<>Ril-PR?_y9X zPVJ1CUYi@RU(qL0khc0~d1tk0A!vxxlVO8$pehV{5~*_oPyR?51ymzGY?>($u{Omj z6s4{$Gh|eYoRtZ_5(XvxQ#Qi{Yki0f+^Lq^xWk}G6fB59QHgI4nm>-+;zR(oM9^4W zP^=}MjXBZbYKAS4TrNEP6qNtWi{RE;*oieoT;^qGOhw$Q<(gnZ6EQEQGZ0R`XA4Qy z$Cq9hn9$Fu?Q`%PIla5uNf9YTCpMAzL--Z+mVFUwq$qc{qLe?Isp|&vi#2X*^g;BL zd3I)w8Jn3Yg6o5LBE7pIR0>|5NN5I^%uWPfuiR_O`!z$-Mp7=CVny7;t%{>0(tsa; zkj60tsr$*7DUh-#{s}NR^*o^p$QAqmYUIO%C^v5u~EqI`scakGnHZ9m0>fu^h zD7%rnC?%bhMgu58%}!uZu^X8A*{f(3^K^c-4FPI8m4d+I=&U?agG#``tQ(A9xl?l_ zjEIbhLb$nA0_uXf2KSqV*)h_19uvkc{zHjoOd}b5B>lpBNMwOH&>uq_50J5+Lb$qk z3Ex*r)c1(kQ|Jg>6N)X=4itq3OR1eFF~;g(zi7uv z-!2jS2<8~dg7jx};Y6J4x*!X(X`xX^LGhhqccyAt9!Y|3nrG@N8GNJEossj*cyAwy z{;f~$l2NTy_?0yK!lFrY;qS@=*LRP*Ta2Yb|yp`Dn1Og#reXk_Kb{zf$bM#px7E)jZ`QVafG z`H0JeV4CpvE{U-an{piKpd(6&FT_)cEBTAy#U+tbiCdYtjLj_M_kd%3qTba0JSL?M z$(9o>d~k?YzKv1OaDZ{3N`2`ANX2+Jq&SQ5bQ}rtV&Bth09YQSk|6Zpn;()Z{8TP1 z6P8MW$zbP~;a6oI26}h_u58CF(l{MLR&&}w~=TE0Wug-T@Z!;!Gy7OtfAVfKUcf}Kk<=O5}H42Ngu zY>NtV;a@H9sZo^pgJ?D$3ZQ9Ejr$*@!#0Cnlyf+rR0!;zre7DPl(LVXW}b@qnjKpj z>17rxu;OIqia%)6EDn7X61)7ONub2kXuxwQEu%FQVCQiE6!>S|R|v_jY2?>aNuuBJ z@vUs*CD>?X;!5bNw}df6`YAa4q&r_nMh9P zwa`Rtw3-2XxuR1VCz*3BK132rF0CS0JjGzAEA+ZsfC1Mhl<1Q5n1jS!F$ zo*UgBrLWms{rqb+dlm2_us>M@+xNsfAo*$t_6IiCOb~A*_166#8JETW&G$Bh^NWWa z5R?4gxgbPpK7Y>ySPg$x)hxHXZ%enMt-^Wixj%j#^eR#*;Oll&H!;vu=-el1AlpYX8CI!nxc5Nw%K$UL{ZBdaUv-)8(YApCo_ zfjv&eaaxprydrjSZaI8CGDC&8!V>cvHs)150^J9%_3@5f`&U-%e9(s895owOj;xvs z7|{j|@OT$;NG$ji`m)wI3T^D68T4+)iM|i41qw{OBra(?SVnkh3wr(a>2N8bkxdwg ztLb;+^Od#|fUOR>8&jCb2W3q=fFoeHq#-;?tlj`*)R1lJeV19hklXpt0oHBq!jHI$ z&jU8VFRP$l_2wVz-nr&o%!G#1qPYV%f3of1(OkfJeN3X&8j7)IKbnsld?%_EVmP1L z2qKn^c>C&P*#pBJa&u(BCDtJ-M>QDrfM>2$KtKseun(yhry{I>nHTZ&5RqQUtHvuX_Yi;pB1yS*@Cmh zW55p>DxWN*SK1JKP9M)Dg=Sclv8VV|0u@k2vlL;t&d4xij1_`Yw;p z;y@or?l4H5Fqj30GwSMP^X^&wBR`vH!|p$u$Nq^WfQlf1K8Z^#>>Z1K5^wC@Cy2~i z4p-&F-OO%h(W2~Iai@k3cWmH0`mx*F%~1XVH%z?wM?YuE_`#p=P5lmF2#)gu0bf%q zMd;)JF0pv9C^@KV(#w!Ma!aV?`RN^9Ki<86PNx!CEnhk=7=(?nTlsk?nPK9fA%}_E z1L2px*L!?RxKUDL16`wvrNX=p=2G|2krtU6Lu3+D(GZjrn1-*74DZsw_*9wm{N`?q z(cokQlEogmgYHzbO-uWD_X8tNsV41Dk9I$F+p}I15JfM3x%)xMq~mA&my_8q7VP3mO`SGzzmSx{WF`D)#22^A4zt=ox>r7^}M&Uciiof#WY zeGo!X-dl6r4XNhD41MpE()!IB9QcvuD}#j+olt`#Nd*=5h?s&-LmI@D{ME~sFZ2KS z)u%g889xn-TeM2gzjS)($!%BFS<5H6XiAurOrqi3=~{=g;sTz717gM{3If8{aA1$4 z4(VFGd>;THH_<1Ynn*B)?xR|2eCK^r$JS-IMwd4j(=&!XfARXwtGi8ey;BcKs4&%@ z&-3O?X_h0(AQ#TpT;4jlJ2GpUw(P4t77Y>7RLPK>v8@uz@O8l@7ld7}YDjjsv&>U! z0gGS^jmh_+v{JBb1l3JeL3;v9{Ujah6 z@MGeAp|v059A4DMf<(<;7yD!I7F;(+Qc6NRg1vhQP#Dw-DQ^v{i>y-p15`onCsIID zChBDrC9kTWJx?^t8CrEd>w*n@g?a2Vuz8l;Kivfv&k#O-R`uqb=i9=OvGZwUa8L=% z3C!mzqJ1!R*%ML^la_zq{a~$;RNr4b|4Z3^UbNx$*WX5O{}rASGAA~equG-dzx&

6Q=pf9E9$l2RDI|jJQ;Fp&$HL%h14`9kqH^X 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%0Du>gYv$>3e4*b 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 Aod5s; literal 0 HcmV?d00001 diff --git a/source/lua/all b/source/lua/all new file mode 100644 index 0000000..8f78ee4 --- /dev/null +++ b/source/lua/all @@ -0,0 +1,9 @@ +make -s -j +cd testes/libs; make -s +cd .. # back to directory 'testes' +ulimit -S -s 2000 +if { ../lua all.lua; } then + echo -e "\n\n final OK!!!!\n\n" +else + echo -e "\n\n >>>> BUG!!!!\n\n" +fi diff --git a/source/lua/bugs b/source/lua/bugs new file mode 100644 index 0000000..a965025 --- /dev/null +++ b/source/lua/bugs @@ -0,0 +1,4052 @@ +--[=[ +** lua.stx / llex.c +Tue Dec 2 10:45:48 EDT 1997 +>> BUG: "lastline" was not reset on function entry, so debug information +>> started only in the 2nd line of a function. + + + +================================================================= +--- Version 3.1 alpha + +** lua.c +Thu Jan 15 14:34:58 EDT 1998 +>> must include "stdlib.h" (for "exit()"). + +** lbuiltin.c / lobject.h +Thu Jan 15 14:34:58 EDT 1998 +>> MAX_WORD may be bigger than MAX_INT +(by lhf) + +** llex.c +Mon Jan 19 18:17:18 EDT 1998 +>> wrong line number (+1) in error report when file starts with "#..." + +** lstrlib.c +Tue Jan 27 15:27:49 EDT 1998 +>> formats like "%020d" were considered too big (3 digits); moreover, +>> some sistems limit printf to at most 500 chars, so we can limit sizes +>> to 2 digits (99). + +** lapi.c +Tue Jan 27 17:12:36 EDT 1998 +>> "lua_getstring" may create a new string, so should check GC + +** lstring.c / ltable.c +Wed Jan 28 14:48:12 EDT 1998 +>> tables can become full of "empty" slots, and keep growing without limits. + +** lstrlib.c +Mon Mar 9 15:26:09 EST 1998 +>> gsub('a', '(b?)%1*' ...) loops (because the capture is empty). + +** lstrlib.c +Mon May 18 19:20:00 EST 1998 +>> arguments for "format" 'x', 'X', 'o' and 'u' must be unsigned int. + + + +================================================================= +--- Version 3.1 + +** liolib.c / lauxlib.c +Mon Sep 7 15:57:02 EST 1998 +>> function "luaL_argerror" prints wrong argument number (from a user's point +of view) when functions have upvalues. + +** lstrlib.c +Tue Nov 10 17:29:36 EDT 1998 +>> gsub/strfind do not check whether captures are properly finished. +(by roberto/tomas) + +** lbuiltin.c +Fri Dec 18 11:22:55 EDT 1998 +>> "tonumber" goes crazy with negative numbers in other bases (not 10), +because "strtol" returns long, not unsigned long. +(by Visual C++) + +** lstrlib.c +Mon Jan 4 10:41:40 EDT 1999 +>> "format" does not check size of format item (such as "%00000...00000d"). + +** lapi.c +Wed Feb 3 14:40:21 EDT 1999 +>> getlocal cannot return the local itself, since lua_isstring and +lua_isnumber can modify it. + +** lstrlib.c +Thu Feb 4 17:08:50 EDT 1999 +>> format "%s" may break limit of "sprintf" on some machines. +(by Marcelo Sales) + +** lzio.c +Thu Mar 4 11:49:37 EST 1999 +>> file stream cannot call fread after EOF. +(by lhf) + + + +================================================================= +--- Version 3.2 (beta) + +** lstrlib.c +Fri Apr 30 11:10:20 EST 1999 +>> '$' at end of pattern was matching regular '$', too. +(by anna; since 2.5) + +** lbuiltin.c +Fri May 21 17:15:11 EST 1999 +>> foreach, foreachi, foreachvar points to function in stack when stack +can be reallocated. +(by tomas; since 3.2 beta) + +** lparser.c +Wed Jun 16 10:32:46 EST 1999 +>> cannot assign to unlimited variables, because it causes overflow in +the number of returns of a function. +(since 3.1) + + + +================================================================= +--- Version 3.2 + +** lmathlib.c +Wed Aug 18 11:28:38 EST 1999 +>> random(0) and random(x,0) are wrong (0 is read as no argument!). +(by Dave Bollinger; since 3.1) + +** lparser.c +Thu Sep 2 10:07:20 EST 1999 +>> in the (old) expression << ls->fs->f->consts[checkname(ls)] >>, checkname +could realloc f->consts. +(by Supratik Champati; since 3.2 beta) + +** lobject.c / lbuiltin.c +Wed Sep 8 17:41:54 EST 1999 +>> tonumber'e1' and tonumber(' ', x), for x!=10, gave 0 instead of nil. +(since 3.1) + +** lstrlib.c +Thu Nov 11 14:36:30 EDT 1999 +>> `strfind' does not handle \0 in plain search. +(by Jon Kleiser; since 3.1) + +** lparser.c +Wed Dec 29 16:05:43 EDT 1999 +>> return gives wrong line in debug information +(by lhf; since 3.2 [at least]) + +** ldo.c +Thu Dec 30 16:39:33 EDT 1999 +>> cannot reopen stdin (for binary mode) +(by lhf & roberto; since 3.1) + +** lapi.c +Thu Mar 2 09:41:53 EST 2000 +>> lua_settable should check stack space (it could call a T.M.) +(by lhf & celes; since 3.2; it was already fixed by fixed stack) + +** lparser.c +Mon Apr 3 09:59:06 EST 2000 +>> '%' should be in expfollow +(by Edgar Toernig; since 3.1; it was already fixed) + +** lbuiltin.c +Mon Apr 3 10:05:05 EST 2000 +>> tostring() without arguments gives seg. fault. +(by Edgar Toernig; since 3.0) + + + +================================================================= +--- Version 4.0 alpha + +Tested with full test suites (as locked in Mon Apr 24 14:23:11 EST 2000) +in the following platforms: +* Linux - gcc, g++ +* AIX - gcc +* Solaris - gcc, cc +* IRIX - cc, cc-purify +* Windows - Visual C++ (.c e .cpp, warning level=4) + + +** lstrlib.c +Tue May 2 15:27:58 EST 2000 +>> `strfind' gets wrong subject length when there is an offset +(by Jon Kleiser; since 4.0a) + +** lparser.c +Fri May 12 15:11:12 EST 2000 +>> first element in a list constructor is not adjusted to one value +>> (e.g. «a = {gsub('a','a','')}») +(by Tomas; since 4.0a) + +** lparser.c +Wed May 24 14:50:16 EST 2000 +>> record-constructor starting with an upvalue name gets an error +>> (e.g. «local a; function f() x = {a=1} end») +(by Edgar Toernig; since 3.1) + +** lparser.c +Tue Aug 29 15:56:05 EST 2000 +>> error message for `for' uses `while' +(since 4.0a; already corrected) + +** lgc.c +Tue Aug 29 15:57:41 EST 2000 +>> gc tag method for nil could call line hook +(by ry; since ?) + + + +================================================================= +--- Version 4.0 Beta + +** liolib.c +Fri Sep 22 15:12:37 EST 2000 +>> `read("*w")' should return nil at EOF +(by roberto; since 4.0b) + +** lvm.c +Mon Sep 25 11:47:48 EST 2000 +>> lua_gettable does not get key from stack top +(by Philip Yi; since 4.0b) + +** lgc.c +Mon Sep 25 11:50:48 EST 2000 +>> GC may crash when checking locked C closures +(by Philip Yi; since 4.0b) + +** lapi.c +Wed Sep 27 09:50:19 EST 2000 +>> lua_tag should return LUA_NOTAG for non-valid indices +(by Paul Hankin; since 4.0b) + +** llex.h / llex.c / lparser.c +Wed Sep 27 13:39:45 EST 2000 +>> parser overwrites semantic information when looking ahead +>> (e.g. «a = {print'foo'}») +(by Edgar Toernig; since 4.0b, deriving from previous bug) + +** liolib.c +Thu Oct 26 10:50:46 EDT 2000 +>> in function `read_file', realloc() doesn't free the buffer if it can't +>> allocate new memory +(by Mauro Vezzosi; since 4.0b) + + + +================================================================= +--- Version 4.0 + +** lparser.c +Wed Nov 29 09:51:44 EDT 2000 +>> parser does not accept a `;' after a `return' +(by lhf; since 4.0b) + +** liolib.c +Fri Dec 22 15:30:42 EDT 2000 +>> when `read' fails it must return nil (and not no value) +(by cassino; since at least 3.1) + +** lstring.c/lapi.c +Thu Feb 1 11:55:45 EDT 2001 +>> lua_pushuserdata(L, NULL) is buggy +(by Edgar Toernig; since 4.0) + +** ldo.c +Fri Feb 2 14:06:40 EDT 2001 +>> «while 1 dostring[[print('hello\n')]] end» never reclaims memory +(by Andrew Paton; since 4.0b) + +** lbaselib.c +Tue Feb 6 11:57:13 EDT 2001 +>> ESC (which starts precompiled code) in C is \33, not \27 +(by Edgar Toernig and lhf; since 4.0b) + +** lparser.c +Tue Jul 10 16:59:18 EST 2001 +>> error message for `%a' gave wrong line number +(by Leonardo Constantino; since 4.0) + +** lbaselib.c +Fri Dec 21 15:21:05 EDT 2001 +>> seg. fault when rawget/rawset get extra arguments +(by Eric Mauger; since 4.0b) + +** lvm.c +Wed Jun 19 13:28:20 EST 2002 +>> line hook gets wrong `ar' +(by Daniel C. Sinclair; since 4.0.b) + +** ldo.c +Wed Jun 19 13:31:49 EST 2002 +>> `protectedparser' may run GC, and then collect `filename' +>> (in function `parse_file') +(by Alex Bilyk; since 4.0) + + + + +================================================================= +--- Version 5.0 alpha + +** lgc.c +Fri Aug 30 13:49:14 EST 2002 +>> GC metamethod stored in a weak metatable being collected together with +>> userdata may not be cleared properly +(by Roberto; since 5.0a) + +** lapi.c +Thu Nov 21 11:00:00 EST 2002 +>> ULONG_MAX>>10 may not fit into an int +(by Jeff Petkau; since 4.0) + +** lparser.c +Fri Dec 6 17:06:40 UTC 2002 +>> scope of generic for variables is not sound +(by Gavin Wraith; since 5.0a) + + + + +================================================================= +--- Version 5.0 beta +** lbaselib.c +Fri Dec 20 09:53:19 UTC 2002 +>> `resume' was checking the wrong value for stack overflow +(by Maik Zimmermann; since 5.0b) + +** ldo.c +Thu Jan 23 11:29:06 UTC 2003 +>> error during garbage collection in luaD_protectedparser is not being +>> protected +(by Benoit Germain; since 5.0a) + +** ldo.c (and others) +Fri Feb 28 14:20:33 EST 2003 +>> GC metamethod calls could mess C/Lua stack syncronization +(by Roberto; since 5.0b) + +** lzio.h/zlio.c +Thu Mar 20 11:40:12 EST 2003 +>> zio mixes a 255 as first char in a buffer with EOZ +(by lhf; since 5.0a) + + + +--]=] +----------------------------------------------------------------- +-- Lua 5.0 (final) + +Bug{ +what = [[lua_closethread exists only in the manual]], +report = [[by Nguyen Binh, 28/04/2003]], +patch = [[no patch; the manual is wrong]], +} + + +Bug{ +what = [[attempt to resume a running coroutine crashes Lua]], +example = [[ +function co_func (current_co) + coroutine.resume(co) +end +co = coroutine.create(co_func) +coroutine.resume(co) +coroutine.resume(co) --> seg. fault +]], +report = [[by Alex Bilyk, 09/05/2003]], +patch = [[ +* ldo.c: +325,326c325 +< if (nargs >= L->top - L->base) +< luaG_runerror(L, "cannot resume dead coroutine"); +--- +> lua_assert(nargs < L->top - L->base); +329c328,329 +< else if (ci->state & CI_YIELD) { /* inside a yield? */ +--- +> else { /* inside a yield */ +> lua_assert(ci->state & CI_YIELD); +344,345d343 +< else +< luaG_runerror(L, "cannot resume non-suspended coroutine"); +351a350,358 +> static int resume_error (lua_State *L, const char *msg) { +> L->top = L->ci->base; +> setsvalue2s(L->top, luaS_new(L, msg)); +> incr_top(L); +> lua_unlock(L); +> return LUA_ERRRUN; +> } +> +> +355a363,368 +> if (L->ci == L->base_ci) { +> if (nargs >= L->top - L->base) +> return resume_error(L, "cannot resume dead coroutine"); +> } +> else if (!(L->ci->state & CI_YIELD)) /* not inside a yield? */ +> return resume_error(L, "cannot resume non-suspended coroutine"); +]], +} + + +Bug{ +what = [[file:close cannot be called without a file. (results in seg fault)]], +example = [[ +> io.stdin.close() -- correct call shold be io.stdin:close() +]], +report = [[by Tuomo Valkonen, 27/05/2003]], +patch = [[ +* liolib.c: +161c161 +< if (lua_isnone(L, 1)) { +--- +> if (lua_isnone(L, 1) && lua_type(L, lua_upvalueindex(1)) == LUA_TTABLE) { +]], --}} +} + + +Bug{ +what = [[C functions also may have stacks larger than current top]], +example = [[ +Must recompile lua with a change in lua.c and with lua_assert defined: +* lua.c: +381a382 +> lua_checkstack(l, 1000); +]], +report = [[Alex Bilyk, 09/06/2003]], +patch = [[ +* lgc.c: +247c247 +< if (!(ci->state & CI_C) && lim < ci->top) +--- +> if (lim < ci->top) +]], +} + + +Bug{ +what = [[`pc' address is invalidated when a coroutine is suspended]], +example = [[ +function g(x) + coroutine.yield(x) +end + +function f (i) + debug.sethook(print, "l") + for j=1,1000 do + g(i+j) + end +end + +co = coroutine.wrap(f) +co(10) +pcall(co) +pcall(co) +]], +report = [[Nick Trout, 07/07/2003]], +patch = [[ +* lvm.c: +402,403c402,403 +< L->ci->u.l.pc = &pc; +< if (L->hookmask & LUA_MASKCALL) +--- +> if (L->hookmask & LUA_MASKCALL) { +> L->ci->u.l.pc = &pc; +404a405 +> } +405a407 +> L->ci->u.l.pc = &pc; +676,678c678 +< lua_assert(ci->u.l.pc == &pc && +< ttisfunction(ci->base - 1) && +< (ci->state & CI_SAVEDPC)); +--- +> lua_assert(ttisfunction(ci->base - 1) && (ci->state & CI_SAVEDPC)); +]] +} + + +Bug{ +what = [[userdata to be collected still counts into new GC threshold, +increasing memory consumption]], +report = [[Roberto, 25/07/2003]], +example = [[ +a = newproxy(true) +getmetatable(a).__gc = function () end +for i=1,10000000 do + newproxy(a) + if math.mod(i, 10000) == 0 then print(gcinfo()) end +end +]], +patch = [[ +* lgc.h: +18c18 +< void luaC_separateudata (lua_State *L); +--- +> size_t luaC_separateudata (lua_State *L); + +* lgc.c: +113c113,114 +< void luaC_separateudata (lua_State *L) { +--- +> size_t luaC_separateudata (lua_State *L) { +> size_t deadmem = 0; +127a129 +> deadmem += sizeudata(gcotou(curr)->uv.len); +136a139 +> return deadmem; +390c393 +< static void checkSizes (lua_State *L) { +--- +> static void checkSizes (lua_State *L, size_t deadmem) { +400c403 +< G(L)->GCthreshold = 2*G(L)->nblocks; /* new threshold */ +--- +> G(L)->GCthreshold = 2*G(L)->nblocks - deadmem; /* new threshold */ +454c457,458 +< static void mark (lua_State *L) { +--- +> static size_t mark (lua_State *L) { +> size_t deadmem; +467c471 +< luaC_separateudata(L); /* separate userdata to be preserved */ +--- +> deadmem = luaC_separateudata(L); /* separate userdata to be preserved */ +475a480 +> return deadmem; +480c485 +< mark(L); +--- +> size_t deadmem = mark(L); +482c487 +< checkSizes(L); +--- +> checkSizes(L, deadmem); +]] +} + +Bug{ +what=[[IBM AS400 (OS400) has sizeof(void *)==16, and a `%p' may generate +up to 60 characters in a `printf'. That causes a buffer overflow in +`tostring'.]], + +report = [[David Burgess, 25/08/2003]], + +example = [[print{}; (in an AS400 machine)]], + +patch = [[ +* liolib.c: +178c178 +< char buff[32]; +--- +> char buff[128]; + +* lbaselib.c: +327c327 +< char buff[64]; +--- +> char buff[128]; +]] +} + + +Bug{ +what = [[syntax `local function' does not increment stack size]], + +report = [[Rici Lake, 26/09/2003]], + +example = [[ +-- must run this with precompiled code +local a,b,c +local function d () end +]], + +patch = [[ +* lparser.c: +1143a1144 +> FuncState *fs = ls->fs; +1145c1146,1147 +< init_exp(&v, VLOCAL, ls->fs->freereg++); +--- +> init_exp(&v, VLOCAL, fs->freereg); +> luaK_reserveregs(fs, 1); +1148c1150,1152 +< luaK_storevar(ls->fs, &v, &b); +--- +> luaK_storevar(fs, &v, &b); +> /* debug information will only see the variable after this point! */ +> getlocvar(fs, fs->nactvar - 1).startpc = fs->pc; +]], + +} + + +Bug{ + +what = [[count hook may be called without being set]], + +report = [[Andreas Stenius, 06/10/2003]], + +example = [[ +set your hooks with + + lua_sethook(L, my_hook, LUA_MASKLINE | LUA_MASKRET, 1); + +(It is weird to use a count > 0 without setting the count hook, +but it is not wrong.) +]], + +patch = [[ +* lvm.c: +69c69 +< if (mask > LUA_MASKLINE) { /* instruction-hook set? */ +--- +> if (mask & LUA_MASKCOUNT) { /* instruction-hook set? */ +]], + +} + + +Bug{ + +what = [[`dofile' eats one return value when called without arguments]], + +report = [[Frederico Abraham, 15/01/2004]], + +example = [[ +a,b = dofile() --< here you enter `return 1,2,3 ' +print(a,b) --> 2 3 (should be 1 and 2) +]], + +patch = [[ +* lbaselib.c: +313a314 +> int n = lua_gettop(L); +317c318 +< return lua_gettop(L) - 1; +--- +> return lua_gettop(L) - n; +]], + +} + + + +----------------------------------------------------------------- +-- Lua 5.0.2 + +Bug{ +what = [[string concatenation may cause arithmetic overflow, leading +to a buffer overflow]], + +report = [[Rici Lake, 20/05/2004]], + +example = [[ +longs = string.rep("\0", 2^25) +function catter(i) + return assert(loadstring( + string.format("return function(a) return a%s end", + string.rep("..a", i-1))))() +end +rep129 = catter(129) +rep129(longs) +]], + +patch = [[ +* lvm.c: +@@ -321,15 +321,15 @@ + luaG_concaterror(L, top-2, top-1); + } else if (tsvalue(top-1)->tsv.len > 0) { /* if len=0, do nothing */ + /* at least two string values; get as many as possible */ +- lu_mem tl = cast(lu_mem, tsvalue(top-1)->tsv.len) + +- cast(lu_mem, tsvalue(top-2)->tsv.len); ++ size_t tl = tsvalue(top-1)->tsv.len; + char *buffer; + int i; +- while (n < total && tostring(L, top-n-1)) { /* collect total length */ +- tl += tsvalue(top-n-1)->tsv.len; +- n++; ++ /* collect total length */ ++ for (n = 1; n < total && tostring(L, top-n-1); n++) { ++ size_t l = tsvalue(top-n-1)->tsv.len; ++ if (l >= MAX_SIZET - tl) luaG_runerror(L, "string length overflow"); ++ tl += l; + } +- if (tl > MAX_SIZET) luaG_runerror(L, "string size overflow"); + buffer = luaZ_openspace(L, &G(L)->buff, tl); + tl = 0; + for (i=n; i>0; i--) { /* concat all strings */ +]] +} + + +Bug{ +what = [[lua_getupvalue and setupvalue do not check for index too small]], + +report = [[Mike Pall, ?/2004]], + +example = [[debug.getupvalue(function() end, 0)]], + +patch = [[ +* lapi.c +941c941 +< if (n > f->c.nupvalues) return NULL; +--- +> if (!(1 <= n && n <= f->c.nupvalues)) return NULL; +947c947 +< if (n > p->sizeupvalues) return NULL; +--- +> if (!(1 <= n && n <= p->sizeupvalues)) return NULL; +]] +} + + +Bug{ +what = [[values holded in open upvalues of suspended threads may be +incorrectly collected]], + +report = [[Spencer Schumann, 31/12/2004]], + +example = [[ +local thread_id = 0 +local threads = {} + +function fn(thread) + thread_id = thread_id + 1 + threads[thread_id] = function() + thread = nil + end + coroutine.yield() +end + +while true do + local thread = coroutine.create(fn) + coroutine.resume(thread, thread) +end +]], + +patch = [[ +* lgc.c: +221,224c221,222 +< if (!u->marked) { +< markobject(st, &u->value); +< u->marked = 1; +< } +--- +> markobject(st, u->v); +> u->marked = 1; +]], +} + + +Bug{ +what = [[rawset/rawget do not ignore extra arguments]], + +report = [[Romulo Bahiense, 11/03/2005]], + +example = [[ +a = {} +rawset(a, 1, 2, 3) +print(a[1], a[2]) -- should be 2 and nil +]], + +patch = [[ +* lbaselib.c: +175a176 +> lua_settop(L, 2); +183a185 +> lua_settop(L, 3); +]], +} + + +Bug{ +what = [[weak tables that survive one collection are never collected]], + +report = [[Chromix, 02/01/2006]], + +example = [[ +a = {} +print(gcinfo()) +for i = 1, 10000 do + a[i] = setmetatable({}, {__mode = "v"}) +end +collectgarbage() +a = nil +collectgarbage() +print(gcinfo()) +]], + +patch = [[ +* lgc.c +@@ -366,7 +366,7 @@ + GCObject *curr; + int count = 0; /* number of collected items */ + while ((curr = *p) != NULL) { +- if (curr->gch.marked > limit) { ++ if ((curr->gch.marked & ~(KEYWEAK | VALUEWEAK)) > limit) { + unmark(curr); + p = &curr->gch.next; + } +]], + +} + + +Bug{ +what = [[Some "not not exp" may not result in boolean values]], +report = [[]], +since = [[4.0]], +example = [[ +-- should print false, but prints nil +print(not not (nil and 4)) +]], +patch = [[]], +} + + +Bug{ +what = [[On some machines, closing a "piped file" (created with io.popen) +may crash Lua]], +report = [[]], +since = [[5.0]], +example = [[ +-- only on some machines + f = io.popen("ls") + f:close() +]], +patch = [[]], +} + + + +----------------------------------------------------------------- +-- Lua 5.1 + +Bug{ +what = [[In 16-bit machines, expressions and/or with numeric constants as the +right operand may result in weird values]], + +report = [[Andreas Stenius/Kein-Hong Man, 15/03/2006]], + +example = [[ +print(false or 0) -- on 16-bit machines +]], + +patch = [[ +* lcode.c: +@@ -731,17 +731,15 @@ + case OPR_AND: { + lua_assert(e1->t == NO_JUMP); /* list must be closed */ + luaK_dischargevars(fs, e2); +- luaK_concat(fs, &e1->f, e2->f); +- e1->k = e2->k; e1->u.s.info = e2->u.s.info; +- e1->u.s.aux = e2->u.s.aux; e1->t = e2->t; ++ luaK_concat(fs, &e2->f, e1->f); ++ *e1 = *e2; + break; + } + case OPR_OR: { + lua_assert(e1->f == NO_JUMP); /* list must be closed */ + luaK_dischargevars(fs, e2); +- luaK_concat(fs, &e1->t, e2->t); +- e1->k = e2->k; e1->u.s.info = e2->u.s.info; +- e1->u.s.aux = e2->u.s.aux; e1->f = e2->f; ++ luaK_concat(fs, &e2->t, e1->t); ++ *e1 = *e2; + break; + } +]], + +} + + +Bug{ +what = [[luaL_checkudata may produce wrong error message]], + +report = [[Greg Falcon, 21/03/2006]], + +example = [[ +getmetatable(io.stdin).__gc() + --> bad argument #1 to '__gc' (FILE* expected, got table) +]], + +patch = [[ +* lauxlib.c: +@@ -123,11 +123,17 @@ + + LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) { + void *p = lua_touserdata(L, ud); +- lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get correct metatable */ +- if (p == NULL || !lua_getmetatable(L, ud) || !lua_rawequal(L, -1, -2)) +- luaL_typerror(L, ud, tname); +- lua_pop(L, 2); /* remove both metatables */ +- return p; ++ if (p != NULL) { /* value is a userdata? */ ++ if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ ++ lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get correct metatable */ ++ if (lua_rawequal(L, -1, -2)) { /* does it have the correct mt? */ ++ lua_pop(L, 2); /* remove both metatables */ ++ return p; ++ } ++ } ++ } ++ luaL_typerror(L, ud, tname); /* else error */ ++ return NULL; /* to avoid warnings */ + } +]] + +} + + +Bug{ +what = [[ +In Windows, +when Lua is used in an application that also uses DirectX, +it may present an erractic behavior. +THIS IS NOT A LUA BUG! +The problem is that DirectX violates an ABI that Lua depends on.]], + +patch = [[ +The simplest solution is to use DirectX with +the D3DCREATE_FPU_PRESERVE flag. + +Otherwise, you can change the definition of lua_number2int, +in luaconf.h, to this one: +#define lua_number2int(i,d) __asm fld d __asm fistp i +]], + +} + + +Bug{ +what = [[option '%q' in string.format does not handle '\r' correctly.]], + +example = [[ +local s = "a string with \r and \n and \r\n and \n\r" +local c = string.format("return %q", s) +assert(assert(loadstring(c))() == s) +]], + +patch = [[ +* lstrlib.c: +@@ -703,6 +703,10 @@ + luaL_addchar(b, *s); + break; + } ++ case '\r': { ++ luaL_addlstring(b, "\\r", 2); ++ break; ++ } + case '\0': { + luaL_addlstring(b, "\\000", 4); + break; +]], + +} + + +Bug{ +what = [[lua_dostring/lua_dofile should return any values returned +by the chunk]], + +patch = [[ +* lauxlib.h: +@@ -108,9 +108,11 @@ + + #define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) + +-#define luaL_dofile(L, fn) (luaL_loadfile(L, fn) || lua_pcall(L, 0, 0, 0)) ++#define luaL_dofile(L, fn) \ ++ (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +-#define luaL_dostring(L, s) (luaL_loadstring(L, s) || lua_pcall(L, 0, 0, 0))+#define luaL_dostring(L, s) \ ++ (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) + + #define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) +]], + +} + + +Bug{ + +what = [[garbage collector does not compensate enough for finalizers]], + +patch = [[ +lgc.c: +@@ -322,4 +322,6 @@ + +-static void propagateall (global_State *g) { +- while (g->gray) propagatemark(g); ++static size_t propagateall (global_State *g) { ++ size_t m = 0; ++ while (g->gray) m += propagatemark(g); ++ return m; + } +@@ -542,3 +544,3 @@ + marktmu(g); /* mark `preserved' userdata */ +- propagateall(g); /* remark, to propagate `preserveness' */ ++ udsize += propagateall(g); /* remark, to propagate `preserveness' */ + cleartable(g->weak); /* remove collected objects from weak tables */ +@@ -592,2 +594,4 @@ + GCTM(L); ++ if (g->estimate > GCFINALIZECOST) ++ g->estimate -= GCFINALIZECOST; +]] +} + + +Bug{ + +what = [[debug hooks may get wrong when mixed with coroutines]], + +report = [[by Ivko Stanilov, 03/06/2006]], + +example = [[ +co = coroutine.create(function (a,b) + coroutine.yield(a, b) + return b, "end" +end) + +debug.sethook(co, function() end, "lcr") +coroutine.resume(co, 100, 2000) +coroutine.resume(co, 100, 2000) +]], + +patch = [[ +* ldo.c: +@@ -389,6 +389,7 @@ + return; + } + else { /* resuming from previous yield */ ++ L->status = 0; + if (!f_isLua(ci)) { /* `common' yield? */ + /* finish interrupted execution of `OP_CALL' */ + lua_assert(GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_CALL || +@@ -399,7 +400,6 @@ + else /* yielded inside a hook: just continue its execution */ + L->base = L->ci->base; + } +- L->status = 0; + luaV_execute(L, cast_int(L->ci - L->base_ci)); + } +]], + +} + + + +----------------------------------------------------------------- +-- Lua 5.1.1 + +Bug{ +what = [[list constructors have wrong limit]], + +report = [[by Norman Ramsey, June 2006]], + +since = "5.1", + +example = [[ +a = {} +a[1] = "x={1" +for i = 2, 2^20 do + a[i] = 1 +end +a[#a + 1] = "}" +s = table.concat(a, ",") +assert(loadstring(s))() +print(#x) +]], + +patch = [[ +* lparser.c: +@@ -489,7 +489,7 @@ + + static void listfield (LexState *ls, struct ConsControl *cc) { + expr(ls, &cc->v); +- luaY_checklimit(ls->fs, cc->na, MAXARG_Bx, "items in a constructor"); ++ luaY_checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); + cc->na++; + cc->tostore++; + } +]], + +} + + +Bug{ +what = [[wrong message error in some cases involving closures]], + +report = [[Shmuel Zeigerman, on 07/2006]], + +since = "5.1", + +example = [[ +local Var +local function main() + NoSuchName (function() Var=0 end) +end +main() +--> lua5.1: temp:3: attempt to call upvalue 'Var' (a nil value) +]], + +patch = [[ +*ldebug.c: +@@ -435,14 +435,16 @@ + break; + } + case OP_CLOSURE: { +- int nup; ++ int nup, j; + check(b < pt->sizep); + nup = pt->p[b]->nups; + check(pc + nup < pt->sizecode); +- for (; nup>0; nup--) { +- OpCode op1 = GET_OPCODE(pt->code[pc+nup]); ++ for (j = 1; j <= nup; j++) { ++ OpCode op1 = GET_OPCODE(pt->code[pc + j]); + check(op1 == OP_GETUPVAL || op1 == OP_MOVE); + } ++ if (reg != NO_REG) /* tracing? */ ++ pc += nup; /* do not 'execute' these pseudo-instructions */ + break; + } + case OP_VARARG: { +]], + +} + + +Bug{ +what = [[string.format("%") may read past the string]], +report = [[Roberto, on 09/2006]], +since = [[5.0]], +example = [[print(string.format("%"))]], +patch = [[ +*lstrlib.c: +@@ -723,7 +723,7 @@ + + static const char *scanformat (lua_State *L, const char *strfrmt, char *form) { const char *p = strfrmt; +- while (strchr(FLAGS, *p)) p++; /* skip flags */ ++ while (*p != '\0' && strchr(FLAGS, *p) != NULL) p++; /* skip flags */ + if ((size_t)(p - strfrmt) >= sizeof(FLAGS)) + luaL_error(L, "invalid format (repeated flags)"); + if (isdigit(uchar(*p))) p++; /* skip width */ +]], +} + + +Bug{ +what = [[os.date throws an error when result is the empty string]], +report = [[]], +since = [[4.0]], +example = [[print(os.date(""))]], +patch = [[ +*loslib.c: +@@ -148,7 +148,18 @@ + else { +- char b[256]; +- if (strftime(b, sizeof(b), s, stm)) +- lua_pushstring(L, b); +- else +- return luaL_error(L, LUA_QL("date") " format too long"); ++ char cc[3]; ++ luaL_Buffer b; ++ cc[0] = '%'; cc[2] = '\0'; ++ luaL_buffinit(L, &b); ++ for (; *s; s++) { ++ if (*s != '%' || *(s + 1) == '\0') /* no conversion specifier? */ ++ luaL_addchar(&b, *s); ++ else { ++ size_t reslen; ++ char buff[200]; /* should be big enough for any conversion result */ ++ cc[1] = *(++s); ++ reslen = strftime(buff, sizeof(buff), cc, stm); ++ luaL_addlstring(&b, buff, reslen); ++ } ++ } ++ luaL_pushresult(&b); + } +]], +} + + +Bug{ +what = [[setfenv accepts invalid 1st argument]], +report = [[Doug Rogers, on 02/2007]], +since = [[5.0]], +example = [[setfenv(nil, {}) -- should throw an error]], +patch = [[ +*lbaselib.c: +@@ -116,3 +116,3 @@ + +-static void getfunc (lua_State *L) { ++static void getfunc (lua_State *L, int opt) { + if (lua_isfunction(L, 1)) lua_pushvalue(L, 1); +@@ -120,3 +120,3 @@ + lua_Debug ar; +- int level = luaL_optint(L, 1, 1); ++ int level = opt ? luaL_optint(L, 1, 1) : luaL_checkint(L, 1); + luaL_argcheck(L, level >= 0, 1, "level must be non-negative"); +@@ -133,3 +133,3 @@ + static int luaB_getfenv (lua_State *L) { +- getfunc(L); ++ getfunc(L, 1); + if (lua_iscfunction(L, -1)) /* is a C function? */ +@@ -144,3 +144,3 @@ + luaL_checktype(L, 2, LUA_TTABLE); +- getfunc(L); ++ getfunc(L, 0); + lua_pushvalue(L, 2); +]], +} + + +Bug{ +what = [[wrong code for arithmetic expressions in some specific scenarios]], +report = [[Thierry Grellier, on 01/2007]], +since = [[5.1]], +example = [[ +-- use a large number of names (almost 256) +v1=1; v2=1; v3=1; v4=1; v5=1; v6=1; v7=1; v8=1; v9=1; +v10=1; v11=1; v12=1; v13=1; v14=1; v15=1; v16=1; v17=1; +v18=1; v19=1; v20=1; v21=1; v22=1; v23=1; v24=1; v25=1; +v26=1; v27=1; v28=1; v29=1; v30=1; v31=1; v32=1; v33=1; +v34=1; v35=1; v36=1; v37=1; v38=1; v39=1; v40=1; v41=1; +v42=1; v43=1; v44=1; v45=1; v46=1; v47=1; v48=1; v49=1; +v50=1; v51=1; v52=1; v53=1; v54=1; v55=1; v56=1; v57=1; +v58=1; v59=1; v60=1; v61=1; v62=1; v63=1; v64=1; v65=1; +v66=1; v67=1; v68=1; v69=1; v70=1; v71=1; v72=1; v73=1; +v74=1; v75=1; v76=1; v77=1; v78=1; v79=1; v80=1; v81=1; +v82=1; v83=1; v84=1; v85=1; v86=1; v87=1; v88=1; v89=1; +v90=1; v91=1; v92=1; v93=1; v94=1; v95=1; v96=1; v97=1; +v98=1; v99=1; v100=1; v101=1; v102=1; v103=1; v104=1; v105=1; +v106=1; v107=1; v108=1; v109=1; v110=1; v111=1; v112=1; v113=1; +v114=1; v115=1; v116=1; v117=1; v118=1; v119=1; v120=1; v121=1; +v122=1; v123=1; v124=1; v125=1; v126=1; v127=1; v128=1; v129=1; +v130=1; v131=1; v132=1; v133=1; v134=1; v135=1; v136=1; v137=1; +v138=1; v139=1; v140=1; v141=1; v142=1; v143=1; v144=1; v145=1; +v146=1; v147=1; v148=1; v149=1; v150=1; v151=1; v152=1; v153=1; +v154=1; v155=1; v156=1; v157=1; v158=1; v159=1; v160=1; v161=1; +v162=1; v163=1; v164=1; v165=1; v166=1; v167=1; v168=1; v169=1; +v170=1; v171=1; v172=1; v173=1; v174=1; v175=1; v176=1; v177=1; +v178=1; v179=1; v180=1; v181=1; v182=1; v183=1; v184=1; v185=1; +v186=1; v187=1; v188=1; v189=1; v190=1; v191=1; v192=1; v193=1; +v194=1; v195=1; v196=1; v197=1; v198=1; v199=1; v200=1; v201=1; +v202=1; v203=1; v204=1; v205=1; v206=1; v207=1; v208=1; v209=1; +v210=1; v211=1; v212=1; v213=1; v214=1; v215=1; v216=1; v217=1; +v218=1; v219=1; v220=1; v221=1; v222=1; v223=1; v224=1; v225=1; +v226=1; v227=1; v228=1; v229=1; v230=1; v231=1; v232=1; v233=1; +v234=1; v235=1; v236=1; v237=1; v238=1; v239=1; v240=1; v241=1; +v242=1; v243=1; v244=1; v245=1; v246=1; v247=1; v248=1; v249=1; +v250=1; +v251={k1 = 1}; +v252=1; +print(2 * v251.k1, v251.k1 * 2); -- 2 2, OK +v253=1; +print(2 * v251.k1, v251.k1 * 2); -- 1 2, ??? +]], +patch = [[ +*lcode.c: +@@ -657,10 +657,16 @@ + if (constfolding(op, e1, e2)) + return; + else { +- int o1 = luaK_exp2RK(fs, e1); + int o2 = (op != OP_UNM && op != OP_LEN) ? luaK_exp2RK(fs, e2) : 0; +- freeexp(fs, e2); +- freeexp(fs, e1); ++ int o1 = luaK_exp2RK(fs, e1); ++ if (o1 > o2) { ++ freeexp(fs, e1); ++ freeexp(fs, e2); ++ } ++ else { ++ freeexp(fs, e2); ++ freeexp(fs, e1); ++ } + e1->u.s.info = luaK_codeABC(fs, op, 0, o1, o2); + e1->k = VRELOCABLE; + } +@@ -718,10 +724,15 @@ + luaK_exp2nextreg(fs, v); /* operand must be on the `stack' */ + break; + } +- default: { ++ case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV: ++ case OPR_MOD: case OPR_POW: { + if (!isnumeral(v)) luaK_exp2RK(fs, v); + break; + } ++ default: { ++ luaK_exp2RK(fs, v); ++ break; ++ } + } + } +]], +} + +Bug{ +what = [[assignment of nil to parameter may be optimized away]], +report = [[Thomas Lauer, on 03/2007]], +since = [[5.1]], +example = [[ +function f (a) + a=nil + return a +end + +print(f("test")) +]], +patch = [[ +*lcode.c: +@@ -35,16 +35,20 @@ + void luaK_nil (FuncState *fs, int from, int n) { + Instruction *previous; + if (fs->pc > fs->lasttarget) { /* no jumps to current position? */ +- if (fs->pc == 0) /* function start? */ +- return; /* positions are already clean */ +- previous = &fs->f->code[fs->pc-1]; +- if (GET_OPCODE(*previous) == OP_LOADNIL) { +- int pfrom = GETARG_A(*previous); +- int pto = GETARG_B(*previous); +- if (pfrom <= from && from <= pto+1) { /* can connect both? */ +- if (from+n-1 > pto) +- SETARG_B(*previous, from+n-1); +- return; ++ if (fs->pc == 0) { /* function start? */ ++ if (from >= fs->nactvar) ++ return; /* positions are already clean */ ++ } ++ else { ++ previous = &fs->f->code[fs->pc-1]; ++ if (GET_OPCODE(*previous) == OP_LOADNIL) { ++ int pfrom = GETARG_A(*previous); ++ int pto = GETARG_B(*previous); ++ if (pfrom <= from && from <= pto+1) { /* can connect both? */ ++ if (from+n-1 > pto) ++ SETARG_B(*previous, from+n-1); ++ return; ++ } + } + } + } +]], +} + + +Bug{ +what = [[__concat metamethod converts numbers to strings]], +report = [[Paul Winwood, on 12/2006]], +since = [[5.0]], +example = [[ +a = {} +setmetatable(a, {__concat = function (a,b) print(type(a), type(b)) end}) +a = 4 .. a +]], +patch = [[ +*lvm.c: +@@ -281,10 +281,12 @@ + do { + StkId top = L->base + last + 1; + int n = 2; /* number of elements handled in this pass (at least 2) */ +- if (!tostring(L, top-2) || !tostring(L, top-1)) { ++ if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) { + if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) + luaG_concaterror(L, top-2, top-1); +- } else if (tsvalue(top-1)->len > 0) { /* if len=0, do nothing */ ++ } else if (tsvalue(top-1)->len == 0) /* second op is empty? */ ++ (void)tostring(L, top - 2); /* result is first op (as string) */ ++ else { + /* at least two string values; get as many as possible */ + size_t tl = tsvalue(top-1)->len; + char *buffer; +]], +} + + +Bug{ +what = [[As a library, loadlib.c should not access Lua internals +(via lobject.h)]], +report = [[Jérôme Vuarand, on 03/2007]], +since = [[5.0]], +example = [[the bug has no effect on external behavior]], +patch = [[remove the '#include "lobject.h" and use +'lua_pushfstring' instead of 'luaO_pushfstring']], +} + + + +----------------------------------------------------------------- +-- Lua 5.1.2 + +Bug{ +what = [[Lua may close standard files, +which then may be used by C]], +report = [[David Manura/Ross Berteig, on 04/2007]], +since = [[]], +example = [[ +io.close(io.stderr) +-- in some systems, following attempts to write to 'stderr' may crash +a = a + 1 +]], +patch = [[ +]], +} + +Bug{ +what = [[code generated for "-nil", "-true", and "-false" is wrong]], +report = [[David Manura/Rici Lake, on 04/2007]], +since = [[5.1]], +example = [[print(-nil)]], +patch = [[ +lcode.c: +@@ -699,7 +699,7 @@ + e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0; + switch (op) { + case OPR_MINUS: { +- if (e->k == VK) ++ if (!isnumeral(e)) + luaK_exp2anyreg(fs, e); /* cannot operate on non-numeric constants */ + codearith(fs, OP_UNM, e, &e2); + break; +]], +} + +Bug{ +what = [[Count hook may be called without being set.]], +report = [[Mike Pall, on 05/2007]], +since = [[?]], +example = [[]], +patch = [[ +lvm.c: +@@ -61,11 +61,9 @@ + lu_byte mask = L->hookmask; + const Instruction *oldpc = L->savedpc; + L->savedpc = pc; +- if (mask > LUA_MASKLINE) { /* instruction-hook set? */ +- if (L->hookcount == 0) { +- resethookcount(L); +- luaD_callhook(L, LUA_HOOKCOUNT, -1); +- } ++ if ((mask & LUA_MASKCOUNT) && L->hookcount == 0) { ++ resethookcount(L); ++ luaD_callhook(L, LUA_HOOKCOUNT, -1); + } + if (mask & LUA_MASKLINE) { + Proto *p = ci_func(L->ci)->l.p; +]], +} + +Bug{ +what = [[recursive coroutines may overflow C stack]], +report = [[ , on ]], +since = [[5.0]], +example = [[ +a = function(a) coroutine.wrap(a)(a) end +a(a) +]], +patch = [[The 'nCcalls' counter should be shared by all threads. +(That is, it should be declared in the 'global_State' structure, +not in 'lua_State'.) +]], +} + +Bug{ +what = [[wrong error message in some concatenations]], +report = [[Alex Davies, on 05/2007]], +since = [[5.1.2]], +example = [[a = nil; a = (1)..a]], +patch = [[ +ldebug.c: +@@ -563,8 +563,8 @@ + + + void luaG_concaterror (lua_State *L, StkId p1, StkId p2) { +- if (ttisstring(p1)) p1 = p2; +- lua_assert(!ttisstring(p1)); ++ if (ttisstring(p1) || ttisnumber(p1)) p1 = p2; ++ lua_assert(!ttisstring(p1) && !ttisnumber(p1)); + luaG_typeerror(L, p1, "concatenate"); + } + +]], +} + +Bug{ +what = [[Very small numbers all collide in the hash function. +(This creates only performance problems; the behavoir is correct.)]], +report = [[, on ]], +since = [[5.0]], +example = [[]], +patch = [[ +ltable.c: +87,88c87,88 +< n += 1; /* normalize number (avoid -0) */ +< lua_assert(sizeof(a) <= sizeof(n)); +--- +> if (luai_numeq(n, 0)) /* avoid problems with -0 */ +> return gnode(t, 0); +]], +} + +Bug{ +what = [[Too many variables in an assignment may cause a +C stack overflow]], +report = [[Mike Pall, on 07/2007]], +since = [[5.0]], +example = [[ +$ ulimit -s 1024 # Reduce C stack to 1MB for quicker results +$ lua -e 'local s = "a,"; for i=1,18 do s = s..s end print(loadstring("local a;"..s.."a=nil", ""))' +]], +patch = [[ +lparser.c: +@@ -938,6 +938,8 @@ + primaryexp(ls, &nv.v); + if (nv.v.k == VLOCAL) + check_conflict(ls, lh, &nv.v); ++ luaY_checklimit(ls->fs, nvars, LUAI_MAXCCALLS - ls->L->nCcalls, ++ "variable names"); + assignment(ls, &nv, nvars+1); + } + else { /* assignment -> `=' explist1 */ +]], +} + +Bug{ +what = [[An error in a module loaded through the '-l' option +shows no traceback]], +report = [[David Manura, on 08/2007]], +since = [[5.1]], +example = [[lua -ltemp (assuming temp.lua has an error)]], +patch = [[ +lua.c: +@@ -144,7 +144,7 @@ + static int dolibrary (lua_State *L, const char *name) { + lua_getglobal(L, "require"); + lua_pushstring(L, name); +- return report(L, lua_pcall(L, 1, 0, 0)); ++ return report(L, docall(L, 1, 1)); + } +]], +} + +Bug{ +what = [['gsub' may go wild when wrongly called without its third +argument and with a large subject]], +report = [[Florian Berger, on 10/2007]], +since = [[5.1]], +example = [[ +x = string.rep('a', 10000) .. string.rep('b', 10000) +print(#string.gsub(x, 'b')) +]], +patch = [[ +lstrlib.c: +@@ -631,6 +631,2 @@ + } +- default: { +- luaL_argerror(L, 3, "string/function/table expected"); +- return; +- } + } +@@ -650,2 +646,3 @@ + const char *p = luaL_checkstring(L, 2); ++ int tr = lua_type(L, 3); + int max_s = luaL_optint(L, 4, srcl+1); +@@ -655,2 +652,5 @@ + luaL_Buffer b; ++ luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING || ++ tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3, ++ "string/function/table expected"); + luaL_buffinit(L, &b); +]], +} + +Bug{ +what = [[table.remove removes last element of a table when given +an out-of-bound index]], +report = [[Patrick Donnelly, on 11/2007]], +since = [[5.0]], +example = [[ +a = {1,2,3} +table.remove(a, 4) +print(a[3]) --> nil (should be 3) +]], +patch = [[ +ltablib.c: +@@ -118,7 +118,8 @@ + static int tremove (lua_State *L) { + int e = aux_getn(L, 1); + int pos = luaL_optint(L, 2, e); +- if (e == 0) return 0; /* table is `empty' */ ++ if (!(1 <= pos && pos <= e)) /* position is outside bounds? */ ++ return 0; /* nothing to remove */ + luaL_setn(L, 1, e - 1); /* t.n = n-1 */ + lua_rawgeti(L, 1, pos); /* result = t[pos] */ + for ( ;pos debug.setfenv(3, {}) +]], +patch = [[ +lapi.c: +@@ -749,7 +749,7 @@ + res = 0; + break; + } +- luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1)); ++ if (res) luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1)); + L->top--; + lua_unlock(L); + return res; +]], +} + +Bug{ +what = [[stand-alone interpreter shows incorrect error message +when the "message" is a coroutine]], +report = [[Patrick Donnelly, on 17/12/2007]], +since = [[5.1]], +example = [[> error(coroutine.create(function() end))]], +patch = [[ +lua.c: +@@ -74,6 +74,8 @@ + + + static int traceback (lua_State *L) { ++ if (!lua_isstring(L, 1)) /* 'message' not a string? */ ++ return 1; /* keep it intact */ + lua_getfield(L, LUA_GLOBALSINDEX, "debug"); + if (!lua_istable(L, -1)) { + lua_pop(L, 1); + +]], +} + +Bug{ +what = [[debug.sethook/gethook may overflow the thread's stack]], +report = [[Ivko Stanilov, on 2008/01/04]], +since = [[5.1]], +example = [[ +a = coroutine.create(function() yield() end) +coroutine.resume(a) +debug.sethook(a) -- may overflow the stack of 'a' +]], +patch = [[ +ldblib.c: +@@ -268,12 +268,11 @@ + count = luaL_optint(L, arg+3, 0); + func = hookf; mask = makemask(smask, count); + } +- gethooktable(L1); +- lua_pushlightuserdata(L1, L1); ++ gethooktable(L); ++ lua_pushlightuserdata(L, L1); + lua_pushvalue(L, arg+1); +- lua_xmove(L, L1, 1); +- lua_rawset(L1, -3); /* set new hook */ +- lua_pop(L1, 1); /* remove hook table */ ++ lua_rawset(L, -3); /* set new hook */ ++ lua_pop(L, 1); /* remove hook table */ + lua_sethook(L1, func, mask, count); /* set hooks */ + return 0; + } +@@ -288,11 +287,10 @@ + if (hook != NULL && hook != hookf) /* external hook? */ + lua_pushliteral(L, "external hook"); + else { +- gethooktable(L1); +- lua_pushlightuserdata(L1, L1); +- lua_rawget(L1, -2); /* get hook */ +- lua_remove(L1, -2); /* remove hook table */ +- lua_xmove(L1, L, 1); ++ gethooktable(L); ++ lua_pushlightuserdata(L, L1); ++ lua_rawget(L, -2); /* get hook */ ++ lua_remove(L, -2); /* remove hook table */ + } + lua_pushstring(L, unmakemask(mask, buff)); + lua_pushinteger(L, lua_gethookcount(L1)); +]] +} + + + +----------------------------------------------------------------- +-- Lua 5.1.3 + +Bug{ +what = [[LUAI_MAXCSTACK must be smaller than -LUA_REGISTRYINDEX]], +report = [[Patrick Donnelly, on 2008/02/11]], +since = [[5.1.3]], +example = [[ +j = 1e4 +co = coroutine.create(function() + t = {} + for i = 1, j do t[i] = i end + return unpack(t) +end) +print(coroutine.resume(co)) +]], +patch = [[ +luaconf.h: +443c443,444 +< ** functions to consume unlimited stack space. +--- +> ** functions to consume unlimited stack space. (must be smaller than +> ** -LUA_REGISTRYINDEX) +445,446c446 +< #define LUAI_MCS_AUX ((int)(INT_MAX / (4*sizeof(LUA_NUMBER)))) +< #define LUAI_MAXCSTACK (LUAI_MCS_AUX > SHRT_MAX ? SHRT_MAX : LUAI_MCS_AUX) +--- +> #define LUAI_MAXCSTACK 8000 +]], +} + +Bug{ +what = [[coroutine.resume pushes element without ensuring stack size]], +report = [[on 2008/02/11]], +since = [[5.0]], +example = [[(this bug cannot be detected without internal assertions)]], +patch = [[ +lbaselib.c: +@@ -526,7 +526,7 @@ + status = lua_resume(co, narg); + if (status == 0 || status == LUA_YIELD) { + int nres = lua_gettop(co); +- if (!lua_checkstack(L, nres)) ++ if (!lua_checkstack(L, nres + 1)) + luaL_error(L, "too many results to resume"); + lua_xmove(co, L, nres); /* move yielded values */ + return nres; +]], +} + +Bug{ +what = [[lua_checkstack may have arithmetic overflow for large 'size']], +report = [[Patrick Donnelly, on 2008/02/12]], +since = [[5.0]], +example = [[ +print(unpack({1,2,3}, 0, 2^31-3)) +]], +patch = [[ +--- lapi.c 2008/01/03 15:20:39 2.55.1.3 ++++ lapi.c 2008/02/14 16:05:21 +@@ -93,15 +93,14 @@ + + + LUA_API int lua_checkstack (lua_State *L, int size) { +- int res; ++ int res = 1; + lua_lock(L); +- if ((L->top - L->base + size) > LUAI_MAXCSTACK) ++ if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK) + res = 0; /* stack overflow */ +- else { ++ else if (size > 0) { + luaD_checkstack(L, size); + if (L->ci->top < L->top + size) + L->ci->top = L->top + size; +- res = 1; + } + lua_unlock(L); + return res; +]], +} + +Bug{ +what = [[unpack with maximum indices may crash due to arithmetic overflow]], +report = [[Patrick Donnelly, on 2008/02/12]], +since = [[5.1]], +example = [[ +print(unpack({1,2,3}, 2^31-1, 2^31-1)) +]], +patch = [[ +--- lbaselib.c 2008/02/11 16:24:24 1.191.1.5 ++++ lbaselib.c 2008/02/14 16:10:25 +@@ -344,10 +344,12 @@ + luaL_checktype(L, 1, LUA_TTABLE); + i = luaL_optint(L, 2, 1); + e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1)); ++ if (i > e) return 0; /* empty range */ + n = e - i + 1; /* number of elements */ +- if (n <= 0) return 0; /* empty range */ +- luaL_checkstack(L, n, "table too big to unpack"); +- for (; i<=e; i++) /* push arg[i...e] */ ++ if (n <= 0 || !lua_checkstack(L, n)) /* n <= 0 means arith. overflow */ ++ return luaL_error(L, "too many results to unpack"); ++ lua_rawgeti(L, 1, i); /* push arg[i] (avoiding overflow problems) */ ++ while (i++ < e) /* push arg[i + 1...e] */ + lua_rawgeti(L, 1, i); + return n; + } +]], +} + +Bug{ +what = [[The validator for precompiled code has several flaws that +allow malicious binary code to crash the application]], +report = [[Peter Cawley, on 2008/03/24]], +since = [[5.0]], +example = [[ +a = string.dump(function()return;end) +a = a:gsub(string.char(30,37,122,128), string.char(34,0,0), 1) +loadstring(a)() +]], +patch = [[ +--- ldebug.c 2007/12/28 15:32:23 2.29.1.3 ++++ ldebug.c 2008/04/04 15:15:40 +@@ -275,12 +275,12 @@ + + static int precheck (const Proto *pt) { + check(pt->maxstacksize <= MAXSTACK); +- lua_assert(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize); +- lua_assert(!(pt->is_vararg & VARARG_NEEDSARG) || ++ check(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize); ++ check(!(pt->is_vararg & VARARG_NEEDSARG) || + (pt->is_vararg & VARARG_HASARG)); + check(pt->sizeupvalues <= pt->nups); + check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0); +- check(GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); ++ check(pt->sizecode > 0 && GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); + return 1; + } + +@@ -363,7 +363,11 @@ + } + switch (op) { + case OP_LOADBOOL: { +- check(c == 0 || pc+2 < pt->sizecode); /* check its jump */ ++ if (c == 1) { /* does it jump? */ ++ check(pc+2 < pt->sizecode); /* check its jump */ ++ check(GET_OPCODE(pt->code[pc+1]) != OP_SETLIST || ++ GETARG_C(pt->code[pc+1]) != 0); ++ } + break; + } + case OP_LOADNIL: { +@@ -428,7 +432,10 @@ + } + case OP_SETLIST: { + if (b > 0) checkreg(pt, a + b); +- if (c == 0) pc++; ++ if (c == 0) { ++ pc++; ++ check(pc < pt->sizecode - 1); ++ } + break; + } + case OP_CLOSURE: { +]], +} + +Bug{ +what = [[maliciously crafted precompiled code can blow the C stack]], +report = [[Greg Falcon, on 2008/03/25]], +since = [[5.0]], +example = [[ +function crash(depth) + local init = '\27\76\117\97\81\0\1\4\4\4\8\0\7\0\0\0\61\115\116' .. + '\100\105\110\0\1\0\0\0\1\0\0\0\0\0\0\2\2\0\0\0\36' .. + '\0\0\0\30\0\128\0\0\0\0\0\1\0\0\0\0\0\0\0\1\0\0\0' .. + '\1\0\0\0\0\0\0\2' + local mid = '\1\0\0\0\30\0\128\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\0' + local fin = '\0\0\0\0\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0' .. + '\0\0\97\0\1\0\0\0\1\0\0\0\0\0\0\0' + local lch = '\2\0\0\0\36\0\0\0\30\0\128\0\0\0\0\0\1\0\0\0\0\0\0' .. + '\0\1\0\0\0\1\0\0\0\0\0\0\2' + local rch = '\0\0\0\0\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0' .. + '\0\0\97\0\1\0\0\0\1' + for i=1,depth do lch,rch = lch..lch,rch..rch end + loadstring(init .. lch .. mid .. rch .. fin) +end +for i=1,25 do print(i); crash(i) end +]], +patch = [[ +--- lundump.c 2008/04/04 16:00:45 2.7.1.3 ++++ lundump.c 2008/04/04 19:51:41 2.7.1.4 +@@ -161,7 +161,9 @@ + + static Proto* LoadFunction(LoadState* S, TString* p) + { +- Proto* f=luaF_newproto(S->L); ++ Proto* f; ++ if (++S->L->nCcalls > LUAI_MAXCCALLS) error(S,"code too deep"); ++ f=luaF_newproto(S->L); + setptvalue2s(S->L,S->L->top,f); incr_top(S->L); + f->source=LoadString(S); if (f->source==NULL) f->source=p; + f->linedefined=LoadInt(S); +@@ -175,6 +177,7 @@ + LoadDebug(S,f); + IF (!luaG_checkcode(f), "bad code"); + S->L->top--; ++ S->L->nCcalls--; + return f; + } +]], +} + +Bug{ +what = [[code validator may reject (maliciously crafted) correct code]], +report = [[Greg Falcon, on 2008/03/26]], +since = [[5.0]], +example = [[ +z={} +for i=1,27290 do z[i]='1,' end +z = 'if 1+1==2 then local a={' .. table.concat(z) .. '} end' +func = loadstring(z) +print(loadstring(string.dump(func))) +]], +patch = [[ +--- ldebug.c 2008/04/04 15:30:05 2.29.1.4 ++++ ldebug.c 2008/04/04 15:47:10 +@@ -346,9 +346,18 @@ + int dest = pc+1+b; + check(0 <= dest && dest < pt->sizecode); + if (dest > 0) { +- /* cannot jump to a setlist count */ +- Instruction d = pt->code[dest-1]; +- check(!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)); ++ int j; ++ /* check that it does not jump to a setlist count; this ++ is tricky, because the count from a previous setlist may ++ have the same value of an invalid setlist; so, we must ++ go all the way back to the first of them (if any) */ ++ for (j = 0; j < dest; j++) { ++ Instruction d = pt->code[dest-1-j]; ++ if (!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)) break; ++ } ++ /* if 'j' is even, previous value is not a setlist (even if ++ it looks like one) */ ++ check((j&1) == 0); + } + } + break; +]], +} + +Bug{ +what = [[maliciously crafted precompiled code can inject invalid boolean +values into Lua code]], +report = [[Greg Falcon, on 2008/03/27]], +since = [[5.0]], +example = [[ +maybe = string.dump(function() return ({[true]=true})[true] end) +maybe = maybe:gsub('\1\1','\1\2') +maybe = loadstring(maybe)() +assert(type(maybe) == "boolean" and maybe ~= true and maybe ~= false) +]], +patch = [[ +--- lundump.c 2008/01/18 16:39:11 2.7.1.2 ++++ lundump.c 2008/04/04 15:50:39 +@@ -115,7 +115,7 @@ + setnilvalue(o); + break; + case LUA_TBOOLEAN: +- setbvalue(o,LoadChar(S)); ++ setbvalue(o,LoadChar(S)!=0); + break; + case LUA_TNUMBER: + setnvalue(o,LoadNumber(S)); +]], +} + + +Bug{ +what = [['string.byte' gets confused with some out-of-range negative indices]], +report = [[Mike Pall, on 2008/06/03]], +since = [[5.1]], +example = [[ +print(string.byte("abc", -5)) --> 97 98 99 (should print nothing) +]], +patch = [[ +--- lstrlib.c 2007/12/28 15:32:23 1.132.1.3 ++++ lstrlib.c 2008/07/05 11:53:42 +@@ -35,7 +35,8 @@ + + static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) { + /* relative string position: negative means back from end */ +- return (pos>=0) ? pos : (ptrdiff_t)len+pos+1; ++ if (pos < 0) pos += (ptrdiff_t)len + 1; ++ return (pos >= 0) ? pos : 0; + } + + +]], +} + + +Bug{ +what = [[user-requested GC step may loop forever]], +report = [[Makoto Hamanaka, on 2008/07/01]], +since = [[5.1]], +example = [[ +collectgarbage("setpause", 100) -- small value +collectgarbage("setstepmul", 2000) -- large value +collectgarbage("step",0) +]], +patch = [[ +--- lapi.c 2008/02/14 16:46:39 2.55.1.4 ++++ lapi.c 2008/07/04 18:34:48 +@@ -929,10 +929,13 @@ + g->GCthreshold = g->totalbytes - a; + else + g->GCthreshold = 0; +- while (g->GCthreshold <= g->totalbytes) ++ while (g->GCthreshold <= g->totalbytes) { + luaC_step(L); +- if (g->gcstate == GCSpause) /* end of cycle? */ +- res = 1; /* signal it */ ++ if (g->gcstate == GCSpause) { /* end of cycle? */ ++ res = 1; /* signal it */ ++ break; ++ } ++ } + break; + } + case LUA_GCSETPAUSE: { +]], +} + + +Bug{ +what = [['module' may change the environment of a C function]], +report = [[Peter Cawley, on 2008/07/16]], +since = [[5.1]], +example = [[ +pcall(module, "xuxu") +assert(debug.getfenv(pcall) == xuxu) +]], +patch = [[ +--- loadlib.c 2007/12/28 14:58:43 1.52.1.2 ++++ loadlib.c 2008/08/05 19:39:00 +@@ -506,8 +506,11 @@ + + static void setfenv (lua_State *L) { + lua_Debug ar; +- lua_getstack(L, 1, &ar); +- lua_getinfo(L, "f", &ar); ++ if (lua_getstack(L, 1, &ar) == 0 || ++ lua_getinfo(L, "f", &ar) == 0 || /* get calling function */ ++ lua_iscfunction(L, -1)) ++ luaL_error(L, "function " LUA_QL("module") ++ " not called from a Lua function"); + lua_pushvalue(L, -2); + lua_setfenv(L, -2); + lua_pop(L, 1); +]], +} + + +Bug{ +what = [[internal macro 'svalue' is wrong]], +report = [[Martijn van Buul, on 2008/08/04]], +since = [[5.1]], +example = [[ +/* in luaconf.h */ +#define LUAI_USER_ALIGNMENT_T union { char b[32]; } +]], +patch = [[ +--- lobject.h 2007/12/27 13:02:25 2.20.1.1 ++++ lobject.h 2008/08/05 19:40:48 +@@ -210,3 +210,3 @@ + #define getstr(ts) cast(const char *, (ts) + 1) +-#define svalue(o) getstr(tsvalue(o)) ++#define svalue(o) getstr(rawtsvalue(o)) + +]], +} + + +----------------------------------------------------------------- +-- Lua 5.1.4 + +Bug{ +what = [[malicious zero-length string in binary code may segfault Lua]], +report = [[Peter Cawley, on 2008/09/01]], +since = [[5.1]], +example = [[ +loadstring(('').dump(function()X''end):gsub('\2%z%z%zX','\0\0\0'))() +]], +patch = [[ +]], +} + + +Bug{ +what = [[wrong code generation for some particular boolean expressions]], +report = [[Brian Kelley, on 2009/04/15]], +since = [[5.0]], +example = [[ +print(((1 or false) and true) or false) --> 1 +-- should be 'true' +]], +patch = [[ +--- lcode.c 2007/12/28 15:32:23 2.25.1.3 ++++ lcode.c 2009/06/15 14:07:34 +@@ -544,15 +544,18 @@ + pc = NO_JUMP; /* always true; do nothing */ + break; + } +- case VFALSE: { +- pc = luaK_jump(fs); /* always jump */ +- break; +- } + case VJMP: { + invertjump(fs, e); + pc = e->u.s.info; + break; + } ++ case VFALSE: { ++ if (!hasjumps(e)) { ++ pc = luaK_jump(fs); /* always jump */ ++ break; ++ } ++ /* else go through */ ++ } + default: { + pc = jumponcond(fs, e, 0); + break; +@@ -572,14 +575,17 @@ + pc = NO_JUMP; /* always false; do nothing */ + break; + } +- case VTRUE: { +- pc = luaK_jump(fs); /* always jump */ +- break; +- } + case VJMP: { + pc = e->u.s.info; + break; + } ++ case VTRUE: { ++ if (!hasjumps(e)) { ++ pc = luaK_jump(fs); /* always jump */ ++ break; ++ } ++ /* else go through */ ++ } + default: { + pc = jumponcond(fs, e, 1); + break; +]], +} + +Bug{ +what = [['luaV_settable' may invalidate a reference to a table and try +to reuse it]], +report = [[Mark Feldman, on 2009/06/27]], +since = [[5.0]], +example = [[ +grandparent = {} +grandparent.__newindex = function(s,_,_) print(s) end + +parent = {} +parent.__newindex = parent +setmetatable(parent, grandparent) + +child = setmetatable({}, parent) +child.foo = 10 --> (crash on some machines) +]], +patch = [[ +--- lvm.c 2007/12/28 15:32:23 2.63.1.3 ++++ lvm.c 2009/07/01 20:36:59 +@@ -133,6 +133,7 @@ + + void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) { + int loop; ++ TValue temp; + for (loop = 0; loop < MAXTAGLOOP; loop++) { + const TValue *tm; + if (ttistable(t)) { /* `t' is a table? */ +@@ -152,7 +153,9 @@ + callTM(L, tm, t, key, val); + return; + } +- t = tm; /* else repeat with `tm' */ ++ /* else repeat with `tm' */ ++ setobj(L, &temp, tm); /* avoid pointing inside table (may rehash) */ ++ t = &temp; + } + luaG_runerror(L, "loop in settable"); + } +]], +} + +Bug{ +what = [[smart use of varargs may create functions that return too +many arguments and overflow the stack of C functions]], +report = [[Patrick Donnelly, on 2008/12/10]], +since = [[]], +example = [[ +local function lunpack(i, ...) + if i == 0 then return ... + else + return lunpack(i-1, 1, ...) + end +end + +Now, if C calls lunpack(n) with a huge n, it may end with +too many values in its stack and confuse its stack indices. +]], +patch = [[ +]], +} + +Bug{ +what = [['debug.getfenv' does not check whether it has an argument]], +report = [[Patrick Donnelly, 2009/07/30]], +since = [[5.1]], +example = [[debug.getfenv() -- should raise an error]], +patch = [[ +--- ldblib.c 2008/01/21 13:11:21 1.104.1.3 ++++ ldblib.c 2009/08/04 18:43:12 +@@ -45,6 +45,7 @@ + + + static int db_getfenv (lua_State *L) { ++ luaL_checkany(L, 1); + lua_getfenv(L, 1); + return 1; + } +]], +} + +Bug{ +what = [[GC may get stuck during a parser and avoids proper resizing of +the string table, +making its lists grow too much and degrading performance]], +report = [[Sean Conner, 2009/11/10]], +since = [[5.1]], +example = [[See http://lua-users.org/lists/lua-l/2009-11/msg00463.html]], +patch = [[ +--- llex.c 2007/12/27 13:02:25 2.20.1.1 ++++ llex.c 2009/11/23 14:49:40 +@@ -118,8 +118,10 @@ + lua_State *L = ls->L; + TString *ts = luaS_newlstr(L, str, l); + TValue *o = luaH_setstr(L, ls->fs->h, ts); /* entry for `str' */ +- if (ttisnil(o)) ++ if (ttisnil(o)) { + setbvalue(o, 1); /* make sure `str' will not be collected */ ++ luaC_checkGC(L); ++ } + return ts; + } + +]] +} + +Bug{ +what = [['string.format' may get buffer as an argument when there are +missing arguments and format string is too long]], +report = [[Roberto I., 2010/04/12]], +since = [[5.0]], +example = [[ +x = string.rep("x", 10000) .. "%d" +print(string.format(x)) -- gives wrong error message +]], +patch = [[ +--- lstrlib.c 2008/07/11 17:27:21 1.132.1.4 ++++ lstrlib.c 2010/05/14 15:12:53 +@@ -754,6 +754,7 @@ + + + static int str_format (lua_State *L) { ++ int top = lua_gettop(L); + int arg = 1; + size_t sfl; + const char *strfrmt = luaL_checklstring(L, arg, &sfl); +@@ -768,7 +769,8 @@ + else { /* format item */ + char form[MAX_FORMAT]; /* to store the format (`%...') */ + char buff[MAX_ITEM]; /* to store the formatted item */ +- arg++; ++ if (++arg > top) ++ luaL_argerror(L, arg, "no value"); + strfrmt = scanformat(L, strfrmt, form); + switch (*strfrmt++) { + case 'c': { +]] +} + +Bug{ +what = [['io.read(op, "*n")' may return garbage if second read fails]], +report = [[Roberto I., 2010/04/12]], +since = [[5.0]], +example = [[ +print(io.read("*n", "*n")) --<< enter "10 hi" +--> file (0x884420) nil +]], +patch = [[ +--- liolib.c 2008/01/18 17:47:43 2.73.1.3 ++++ liolib.c 2010/05/14 15:29:29 +@@ -276,7 +276,10 @@ + lua_pushnumber(L, d); + return 1; + } +- else return 0; /* read fails */ ++ else { ++ lua_pushnil(L); /* "result" to be removed */ ++ return 0; /* read fails */ ++ } + } + + +]] +} + +Bug{ +what = [[wrong code generation for some particular boolean expressions]], +report = [[Thierry Van Elsuwe, 2011/01/20]], +since = [[5.0]], +example = [[ +print((('hi' or true) and true) or true) +--> hi (should be true) +print(((nil and nil) or false) and true) +--> nil (should be false) +]], +patch = [[ +--- lcode.c 2009/06/15 14:12:25 2.25.1.4 ++++ lcode.c 2011/01/31 14:44:25 +@@ -549,13 +549,6 @@ + pc = e->u.s.info; + break; + } +- case VFALSE: { +- if (!hasjumps(e)) { +- pc = luaK_jump(fs); /* always jump */ +- break; +- } +- /* else go through */ +- } + default: { + pc = jumponcond(fs, e, 0); + break; +@@ -579,13 +572,6 @@ + pc = e->u.s.info; + break; + } +- case VTRUE: { +- if (!hasjumps(e)) { +- pc = luaK_jump(fs); /* always jump */ +- break; +- } +- /* else go through */ +- } + default: { + pc = jumponcond(fs, e, 1); + break; +]] +} + +Bug{ +what = [[__newindex metamethod may not work if metatable is its own +metatable]], +report = [[Cuero Bugot, 2011/08/09]], +since = [[5.1]], +example = [[ +meta={} +setmetatable(meta, meta) +meta.__newindex = function(t, key, value) print("set") end +o = setmetatable({}, meta) +o.x = 10 -- should print 'set' +]], +patch = [[ +--- lvm.c 2009/07/01 21:10:33 2.63.1.4 ++++ lvm.c 2011/08/17 20:36:28 +@@ -142,6 +142,7 @@ + if (!ttisnil(oldval) || /* result is no nil? */ + (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */ + setobj2t(L, oldval, val); ++ h->flags = 0; + luaC_barriert(L, h, val); + return; + } +]] +} + +Bug{ +what = [[parser may collect a prototype while building it]], +report = [[Ingo van Lil, 2011/10/13]], +since = [[5.1.4 (caused by patch 5.1.4-6)]], +example = nil, +patch = [[ +--- lparser.c 2007/12/28 15:32:23 2.42.1.3 ++++ lparser.c 2011/10/17 13:10:43 +@@ -374,9 +374,9 @@ + lua_assert(luaG_checkcode(f)); + lua_assert(fs->bl == NULL); + ls->fs = fs->prev; +- L->top -= 2; /* remove table and prototype from the stack */ + /* last token read was anchored in defunct function; must reanchor it */ + if (fs) anchor_token(ls); ++ L->top -= 2; /* remove table and prototype from the stack */ + } + + +]] +} + + +Bug{ +what = [[When loading a file, +Lua may call the reader function again after it returned end of input +]], +report = [[Chris Howie, 2013/06/05]], +since = [[5.1]], +fix = [[5.2]], +example = [[ +load(function () print("called"); return nil end) +--> called +--> called (should be called only once!) +]], +patch = [[ +--- lzio.h 2007/12/27 13:02:25 1.21.1.1 ++++ lzio.h 2013/07/04 13:55:59 +@@ -59,6 +59,7 @@ + lua_Reader reader; + void* data; /* additional data */ + lua_State *L; /* Lua state (for reader) */ ++ int eoz; /* true if reader has no more data */ + }; + + +--- lzio.c 2007/12/27 13:02:25 1.31.1.1 ++++ lzio.c 2013/07/04 13:53:06 +@@ -22,10 +22,14 @@ + size_t size; + lua_State *L = z->L; + const char *buff; ++ if (z->eoz) return EOZ; + lua_unlock(L); + buff = z->reader(L, z->data, &size); + lua_lock(L); +- if (buff == NULL || size == 0) return EOZ; ++ if (buff == NULL || size == 0) { ++ z->eoz = 1; /* avoid calling reader function next time */ ++ return EOZ; ++ } + z->n = size - 1; + z->p = buff; + return char2int(*(z->p++)); +@@ -51,6 +55,7 @@ + z->data = data; + z->n = 0; + z->p = NULL; ++ z->eoz = 0; + } +]] +} + + +----------------------------------------------------------------- +-- Lua 5.2.0 + +Bug{ +what = [[memory hoarding when creating Lua hooks for coroutines]], +report = [[Arseny Vakhrushev, 2012/01/16]], +since = [[5.1]], +fix = [[5.2.1]], +example = [[ +collectgarbage(); print(collectgarbage'count' * 1024) + +for i = 1, 100 do + local co = coroutine.create(function () end) + local x = {} + for j=1,1000 do x[j] = j end + debug.sethook(co, function () return x end, 'l') +end + +collectgarbage(); print(collectgarbage'count' * 1024) +-- value should back to near the original level +]], +patch = [[ +-- For 5.2 + +--- ldblib.c 2011/10/24 14:54:05 1.131 ++++ ldblib.c 2012/01/18 02:36:59 +@@ -253,14 +253,15 @@ + } + + +-#define gethooktable(L) luaL_getsubtable(L, LUA_REGISTRYINDEX, HOOKKEY); ++#define gethooktable(L) luaL_getsubtable(L, LUA_REGISTRYINDEX, HOOKKEY) + + + static void hookf (lua_State *L, lua_Debug *ar) { + static const char *const hooknames[] = + {"call", "return", "line", "count", "tail call"}; + gethooktable(L); +- lua_rawgetp(L, -1, L); ++ lua_pushthread(L); ++ lua_rawget(L, -2); + if (lua_isfunction(L, -1)) { + lua_pushstring(L, hooknames[(int)ar->event]); + if (ar->currentline >= 0) +@@ -306,10 +307,15 @@ + count = luaL_optint(L, arg+3, 0); + func = hookf; mask = makemask(smask, count); + } +- gethooktable(L); ++ if (gethooktable(L) == 0) { /* creating hook table? */ ++ lua_pushstring(L, "k"); ++ lua_setfield(L, -2, "__mode"); /** hooktable.__mode = "k" */ ++ lua_pushvalue(L, -1); ++ lua_setmetatable(L, -2); /* setmetatable(hooktable) = hooktable */ ++ } ++ lua_pushthread(L1); lua_xmove(L1, L, 1); + lua_pushvalue(L, arg+1); +- lua_rawsetp(L, -2, L1); /* set new hook */ +- lua_pop(L, 1); /* remove hook table */ ++ lua_rawset(L, -3); /* set new hook */ + lua_sethook(L1, func, mask, count); /* set hooks */ + return 0; + } +@@ -325,7 +331,8 @@ + lua_pushliteral(L, "external hook"); + else { + gethooktable(L); +- lua_rawgetp(L, -1, L1); /* get hook */ ++ lua_pushthread(L1); lua_xmove(L1, L, 1); ++ lua_rawget(L, -2); /* get hook */ + lua_remove(L, -2); /* remove hook table */ + } + lua_pushstring(L, unmakemask(mask, buff)); +]] +} + +Bug{ +what = [[Lexical gets confused with some combination of arithmetic +operators and hexadecimal numbers]], +report = [[Alexandra Barros, 2012/01/17]], +since = [[5.2.0]], +fix = [[5.2.1]], +example = [[print(0xE+1)]], +patch = [[ +--- llex.c 2011/11/30 12:43:51 2.59 ++++ llex.c 2012/01/20 18:22:50 +@@ -223,12 +223,19 @@ + + /* LUA_NUMBER */ + static void read_numeral (LexState *ls, SemInfo *seminfo) { ++ const char *expo = "Ee"; ++ int first = ls->current; + lua_assert(lisdigit(ls->current)); +- do { +- save_and_next(ls); +- if (check_next(ls, "EePp")) /* exponent part? */ ++ save_and_next(ls); ++ if (first == '0' && check_next(ls, "Xx")) /* hexadecimal? */ ++ expo = "Pp"; ++ for (;;) { ++ if (check_next(ls, expo)) /* exponent part? */ + check_next(ls, "+-"); /* optional exponent sign */ +- } while (lislalnum(ls->current) || ls->current == '.'); ++ if (lisxdigit(ls->current) || ls->current == '.') ++ save_and_next(ls); ++ else break; ++ } + save(ls, '\0'); + buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */ + if (!buff2d(ls->buff, &seminfo->r)) /* format error? */ +]] +} + +Bug{ +what = [[Finalizers may call functions from a dynamic library after +the library has been unloaded]], +report = [[Josh Haberman, 2012/04/08]], +since = [[5.1]], +fix = [[5.2.1]], +example = [[ +local u = setmetatable({}, {__gc = function () foo() end}) +local m = require 'mod' -- 'mod' may be any dynamic library written in C +foo = m.foo -- 'foo' may be any function from 'mod' +-- end program; it crashes +]], +patch = [[ +loadlib.c: +95c95 +< #define LIBPREFIX "LOADLIB: " +--- +> #define CLIBS "_CLIBS" +251,266c251,256 +< +< static void **ll_register (lua_State *L, const char *path) { +< void **plib; +< lua_pushfstring(L, "%s%s", LIBPREFIX, path); +< lua_gettable(L, LUA_REGISTRYINDEX); /* check library in registry? */ +< if (!lua_isnil(L, -1)) /* is there an entry? */ +< plib = (void **)lua_touserdata(L, -1); +< else { /* no entry yet; create one */ +< lua_pop(L, 1); /* remove result from gettable */ +< plib = (void **)lua_newuserdata(L, sizeof(const void *)); +< *plib = NULL; +< luaL_setmetatable(L, "_LOADLIB"); +< lua_pushfstring(L, "%s%s", LIBPREFIX, path); +< lua_pushvalue(L, -2); +< lua_settable(L, LUA_REGISTRYINDEX); +< } +--- +> static void *ll_checkclib (lua_State *L, const char *path) { +> void *plib; +> lua_getfield(L, LUA_REGISTRYINDEX, CLIBS); +> lua_getfield(L, -1, path); +> plib = lua_touserdata(L, -1); /* plib = CLIBS[path] */ +> lua_pop(L, 2); /* pop CLIBS table and 'plib' */ +270a261,270 +> static void ll_addtoclib (lua_State *L, const char *path, void *plib) { +> lua_getfield(L, LUA_REGISTRYINDEX, CLIBS); +> lua_pushlightuserdata(L, plib); +> lua_pushvalue(L, -1); +> lua_setfield(L, -3, path); /* CLIBS[path] = plib */ +> lua_rawseti(L, -2, luaL_len(L, -2) + 1); /* CLIBS[#CLIBS + 1] = plib */ +> lua_pop(L, 1); /* pop CLIBS table */ +> } +> +> +272,273c272,273 +< ** __gc tag method: calls library's `ll_unloadlib' function with the lib +< ** handle +--- +> ** __gc tag method for CLIBS table: calls 'll_unloadlib' for all lib +> ** handles in list CLIBS +276,278c276,281 +< void **lib = (void **)luaL_checkudata(L, 1, "_LOADLIB"); +< if (*lib) ll_unloadlib(*lib); +< *lib = NULL; /* mark library as closed */ +--- +> int n = luaL_len(L, 1); +> for (; n >= 1; n--) { /* for each handle, in reverse order */ +> lua_rawgeti(L, 1, n); /* get handle CLIBS[n] */ +> ll_unloadlib(lua_touserdata(L, -1)); +> lua_pop(L, 1); /* pop handle */ +> } +284,286c287,292 +< void **reg = ll_register(L, path); +< if (*reg == NULL) *reg = ll_load(L, path, *sym == '*'); +< if (*reg == NULL) return ERRLIB; /* unable to load library */ +--- +> void *reg = ll_checkclib(L, path); /* check loaded C libraries */ +> if (reg == NULL) { /* must load library? */ +> reg = ll_load(L, path, *sym == '*'); +> if (reg == NULL) return ERRLIB; /* unable to load library */ +> ll_addtoclib(L, path, reg); +> } +292c298 +< lua_CFunction f = ll_sym(L, *reg, sym); +--- +> lua_CFunction f = ll_sym(L, reg, sym); +675,676c681,683 +< /* create new type _LOADLIB */ +< luaL_newmetatable(L, "_LOADLIB"); +--- +> /* create table CLIBS to keep track of loaded C libraries */ +> luaL_getsubtable(L, LUA_REGISTRYINDEX, CLIBS); +> lua_createtable(L, 0, 1); /* metatable for CLIBS */ +678a686 +> lua_setmetatable(L, -2); +]] +} + +Bug{ +what = [[wrong handling of 'nCcalls' in coroutines]], +report = [[Alexander Gavrilov, 2012/04/18]], +since = [[5.2.0]], +fix = [[5.2.1]], +example = [[ +coroutine.wrap(function() + print(pcall(pcall,pcall,pcall,pcall,pcall,error,3)) +end)() +]], +patch = [[ +--- ldo.c 2011/11/29 15:55:08 2.102 ++++ ldo.c 2012/04/26 20:38:32 +@@ -402,8 +402,6 @@ + int n; + lua_assert(ci->u.c.k != NULL); /* must have a continuation */ + lua_assert(L->nny == 0); +- /* finish 'luaD_call' */ +- L->nCcalls--; + /* finish 'lua_callk' */ + adjustresults(L, ci->nresults); + /* call continuation function */ +@@ -513,7 +511,6 @@ + api_checknelems(L, n); + firstArg = L->top - n; /* yield results come from continuation */ + } +- L->nCcalls--; /* finish 'luaD_call' */ + luaD_poscall(L, firstArg); /* finish 'luaD_precall' */ + } + unroll(L, NULL); +]] +} + +Bug{ +what = [[Internal Lua values may escape through the debug API]], +report = [[Dan Tull, 2012/04/20]], +since = [[5.1]], +fix = [[5.2.1]], +example = [[ +-- for Lua 5.1 +local firsttime = true +local function foo () + if firsttime then + firsttime = false + return "a = 1" + else + for i = 1, 10 do + print(debug.getlocal(2, i)) + end + end +end + +print(load(foo)) -- prints some lines and then seg. fault. +]], +patch = [[ +]] +} + +Bug{ +what = [[Problems when yielding from debug hooks]], +report = [[Erik Cassel, 2012/06/05]], +since = [[5.2.0]], +fix = [[5.2.1]], +example = [[ +Set, in C, a line hook that simply yields, +and then call any Lua function. +You get an infinite loop of yields. +]], +patch = [[ +]] +} + + +----------------------------------------------------------------- +-- Lua 5.2.1 + +Bug{ +what = [[Some patterns can overflow the C stack, due to recursion]], +report = [[Tim Starling, 2012/07/08]], +since = [[2.5]], +fix = [[5.2.2]], +example = [[print(string.find(string.rep("a", 2^20), string.rep(".?", 2^20)))]], +patch = [[ +]] +} + + +Bug{ +what = [['pcall' may not restore previous error function when +inside coroutines]], +report = [[Alexander Gavrilov, 2012/06/12]], +since = [[5.2.0]], +fix = [[5.2.2]], +example = [[ +function errfunc(x) + return 'errfunc' +end + +function test(do_yield) + print(do_yield and "yielding" or "not yielding") + pcall(function() -- this pcall sets errfunc back to none + if do_yield then + coroutine.yield() -- stops errfunc from being restored + end + end) + error('fail!') +end + +coro = coroutine.wrap(function() + print(xpcall(test, errfunc, false)) + print(xpcall(test, errfunc, true)) + print(xpcall(test, errfunc, false)) +end) + +coro() +--> not yielding +--> false errfunc +--> yielding +coro() +--> false temp:12: fail! <<<< should be 'errfunc' too +--> not yielding +--> false errfunc +]], +patch = [[ +--- ldo.c 2012/08/28 18:30:45 2.107 ++++ ldo.c 2012/09/23 15:49:55 +@@ -403,7 +403,11 @@ + int n; + lua_assert(ci->u.c.k != NULL); /* must have a continuation */ + lua_assert(L->nny == 0); +- /* finish 'lua_callk' */ ++ if (ci->callstatus & CIST_YPCALL) { /* was inside a pcall? */ ++ ci->callstatus &= ~CIST_YPCALL; /* finish 'lua_pcall' */ ++ L->errfunc = ci->u.c.old_errfunc; ++ } ++ /* finish 'lua_callk'/'lua_pcall' */ + adjustresults(L, ci->nresults); + /* call continuation function */ + if (!(ci->callstatus & CIST_STAT)) /* no call status? */ +]] +} + +Bug{ +what = [[Check for garbage collector in function calls does not cover +all paths]], +report = [[Roberto, 2012/08/15]], +since = [[5.2.1]], +fix = [[5.2.2]], +example = [[ +See +http://lua-users.org/lists/lua-l/2012-08/msg00149.html +]], +patch = [[ +@@ -311,6 +311,7 @@ + ci->top = L->top + LUA_MINSTACK; + lua_assert(ci->top <= L->stack_last); + ci->callstatus = 0; ++ luaC_checkGC(L); /* stack grow uses memory */ + if (L->hookmask & LUA_MASKCALL) + luaD_hook(L, LUA_HOOKCALL, -1); + lua_unlock(L); +@@ -338,6 +339,7 @@ + ci->u.l.savedpc = p->code; /* starting point */ + ci->callstatus = CIST_LUA; + L->top = ci->top; ++ luaC_checkGC(L); /* stack grow uses memory */ + if (L->hookmask & LUA_MASKCALL) + callhook(L, ci); + return 0; +@@ -393,7 +395,6 @@ + luaV_execute(L); /* call it */ + if (!allowyield) L->nny--; + L->nCcalls--; +- luaC_checkGC(L); + } +]] +} + +Bug{ +what = [[load/loadfile returns wrong result when given an environment +for a binary chunk with no upvalues]], +report = [[Vladimir Strakh, 2012/11/28]], +since = [[5.2.0]], +fix = [[5.2.2]], +example = [[ +f = load(string.dump(function () return 1 end), nil, "b", {}) +print(type(f)) --> table (whould be a function) +]], +patch = [[ +--- lbaselib.c 2012/04/27 14:13:19 1.274 ++++ lbaselib.c 2012/12/03 20:08:15 +@@ -244,5 +244,11 @@ + +-static int load_aux (lua_State *L, int status) { +- if (status == LUA_OK) ++static int load_aux (lua_State *L, int status, int envidx) { ++ if (status == LUA_OK) { ++ if (envidx != 0) { /* 'env' parameter? */ ++ lua_pushvalue(L, envidx); /* environment for loaded function */ ++ if (!lua_setupvalue(L, -2, 1)) /* set it as 1st upvalue */ ++ lua_pop(L, 1); /* remove 'env' if not used by previous call */ ++ } + return 1; ++ } + else { +@@ -258,9 +264,5 @@ + const char *mode = luaL_optstring(L, 2, NULL); +- int env = !lua_isnone(L, 3); /* 'env' parameter? */ ++ int env = (!lua_isnone(L, 3) ? 3 : 0); /* 'env' index or 0 if no 'env' */ + int status = luaL_loadfilex(L, fname, mode); +- if (status == LUA_OK && env) { /* 'env' parameter? */ +- lua_pushvalue(L, 3); +- lua_setupvalue(L, -2, 1); /* set it as 1st upvalue of loaded chunk */ +- } +- return load_aux(L, status); ++ return load_aux(L, status, env); + } +@@ -309,5 +311,5 @@ + size_t l; +- int top = lua_gettop(L); + const char *s = lua_tolstring(L, 1, &l); + const char *mode = luaL_optstring(L, 3, "bt"); ++ int env = (!lua_isnone(L, 4) ? 4 : 0); /* 'env' index or 0 if no 'env' */ + if (s != NULL) { /* loading a string? */ +@@ -322,7 +324,3 @@ + } +- if (status == LUA_OK && top >= 4) { /* is there an 'env' argument */ +- lua_pushvalue(L, 4); /* environment for loaded function */ +- lua_setupvalue(L, -2, 1); /* set it as 1st upvalue */ +- } +- return load_aux(L, status); ++ return load_aux(L, status, env); + } +]] +} + +Bug{ +what = [[Lua does not check memory use when creating error messages]], +report = [[John Dunn, 2012/09/24]], +since = [[5.2.0]], +fix = nil, +example = [[ +local code = "function test()\n bob.joe.larry = 23\n end" + +load(code)() + +-- memory will grow steadly +for i = 1, math.huge do + pcall(test) + if i % 100000 == 0 then + io.write(collectgarbage'count'*1024, "\n") + end +end +]], +patch = [[ +]] +} + + + + + +----------------------------------------------------------------- +-- Lua 5.2.2 + + +Bug{ +what = [[stack overflow in vararg functions with many fixed +parameters called with few arguments]], +report = [[云风, 2013/04/17]], +since = [[5.1]], +fix = [[5.2.3]], +example = [[ +function f(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, + p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, + p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, + p31, p32, p33, p34, p35, p36, p37, p38, p39, p40, + p41, p42, p43, p44, p45, p46, p48, p49, p50, ...) + local a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 +end + +f() -- seg. fault (on some machines) +]], +patch = [[ +--- ldo.c 2012/10/01 14:05:04 2.108 ++++ ldo.c 2013/04/19 20:56:06 +@@ -324,7 +324,7 @@ + case LUA_TLCL: { /* Lua function: prepare its call */ + StkId base; + Proto *p = clLvalue(func)->p; +- luaD_checkstack(L, p->maxstacksize); ++ luaD_checkstack(L, p->maxstacksize + p->numparams); + func = restorestack(L, funcr); + n = cast_int(L->top - func) - 1; /* number of real arguments */ + for (; n < p->numparams; n++) +]], +} + +Bug{ +what = [[garbage collector can trigger too many times in recursive loops]], +report = [[Roberto, 2013/04/25]], +since = [[5.2.2]], +fix = [[5.2.3]], +example = [[ +function f() f() end +f() -- it takes too long before a "stack overflow" error +]], +patch = [[ +--- lgc.c 2013/04/12 18:48:47 2.140.1.1 ++++ lgc.c 2013/04/25 21:30:20 +@@ -495,2 +495,3 @@ + static lu_mem traversestack (global_State *g, lua_State *th) { ++ int n = 0; + StkId o = th->stack; +@@ -505,3 +506,9 @@ + } +- return sizeof(lua_State) + sizeof(TValue) * th->stacksize; ++ else { /* count call infos to compute size */ ++ CallInfo *ci; ++ for (ci = &th->base_ci; ci != th->ci; ci = ci->next) ++ n++; ++ } ++ return sizeof(lua_State) + sizeof(TValue) * th->stacksize + ++ sizeof(CallInfo) * n; + } +]] +} + +-- [[]] +Bug{ +what = [[Wrong assert when reporting concatenation errors +(manifests only when Lua is compiled in debug mode)]], +report = [[Roberto, 2013/05/05]], +since = [[?]], +fix = [[5.2.3]], +example = [[ +-- only with Lua compiled in debug mode +print({} .. 2) +]], +patch = [[ +--- ldebug.c 2013/04/12 18:48:47 2.90.1.1 ++++ ldebug.c 2013/05/05 14:38:30 +@@ -519,5 +519,5 @@ + l_noret luaG_concaterror (lua_State *L, StkId p1, StkId p2) { + if (ttisstring(p1) || ttisnumber(p1)) p1 = p2; +- lua_assert(!ttisstring(p1) && !ttisnumber(p2)); ++ lua_assert(!ttisstring(p1) && !ttisnumber(p1)); + luaG_typeerror(L, p1, "concatenate"); + } +]] +} + +Bug{ +what = [[Wrong error message in some short-cut expressions]], +report = [[Egor Skriptunoff, 2013/05/10]], +since = [[5.0]], +fix = [[5.2.3]], +example = [[ +> a,b,c = true,true,true +> (a and b or c)('', '') +stdin:1: attempt to call a boolean value (global 'c') + + (It should be global 'b' instead of 'c'.) +]], +patch = [[ +--- ldebug.c 2013/05/06 17:20:22 2.90.1.2 ++++ ldebug.c 2013/05/14 19:52:48 +@@ -327,12 +327,20 @@ + } + + ++static int filterpc (int pc, int jmptarget) { ++ if (pc < jmptarget) /* is code conditional (inside a jump)? */ ++ return -1; /* cannot know who sets that register */ ++ else return pc; /* current position sets that register */ ++} ++ ++ + /* + ** try to find last instruction before 'lastpc' that modified register 'reg' + */ + static int findsetreg (Proto *p, int lastpc, int reg) { + int pc; + int setreg = -1; /* keep last instruction that changed 'reg' */ ++ int jmptarget = 0; /* any code before this address is conditional */ + for (pc = 0; pc < lastpc; pc++) { + Instruction i = p->code[pc]; + OpCode op = GET_OPCODE(i); +@@ -341,33 +349,38 @@ + case OP_LOADNIL: { + int b = GETARG_B(i); + if (a <= reg && reg <= a + b) /* set registers from 'a' to 'a+b' */ +- setreg = pc; ++ setreg = filterpc(pc, jmptarget); + break; + } + case OP_TFORCALL: { +- if (reg >= a + 2) setreg = pc; /* affect all regs above its base */ ++ if (reg >= a + 2) /* affect all regs above its base */ ++ setreg = filterpc(pc, jmptarget); + break; + } + case OP_CALL: + case OP_TAILCALL: { +- if (reg >= a) setreg = pc; /* affect all registers above base */ ++ if (reg >= a) /* affect all registers above base */ ++ setreg = filterpc(pc, jmptarget); + break; + } + case OP_JMP: { + int b = GETARG_sBx(i); + int dest = pc + 1 + b; + /* jump is forward and do not skip `lastpc'? */ +- if (pc < dest && dest <= lastpc) +- pc += b; /* do the jump */ ++ if (pc < dest && dest <= lastpc) { ++ if (dest > jmptarget) ++ jmptarget = dest; /* update 'jmptarget' */ ++ } + break; + } + case OP_TEST: { +- if (reg == a) setreg = pc; /* jumped code can change 'a' */ ++ if (reg == a) /* jumped code can change 'a' */ ++ setreg = filterpc(pc, jmptarget); + break; + } + default: + if (testAMode(op) && reg == a) /* any instruction that set A */ +- setreg = pc; ++ setreg = filterpc(pc, jmptarget); + break; + } + } +]] +} + +Bug{ +what = [[luac listings choke on long strings]], +report = [[Ashwin Hirschi, 2013/07/03]], +since = [[5.1.2]], +fix = [[5.2.3]], +example = [[ +-- When you call 'luac -l' over this chunk, it chokes the output +s="Lorem ipsum dolor sit amet, consectetur, " +]], +patch = [[ +--- luac.c 2011-11-29 15:46:33 -0200 1.69 ++++ luac.c 2013-07-03 21:26:01 -0300 +@@ -251,7 +251,7 @@ + static void PrintConstant(const Proto* f, int i) + { + const TValue* o=&f->k[i]; +- switch (ttype(o)) ++ switch (ttypenv(o)) + { + case LUA_TNIL: + printf("nil"); +]] +} + +Bug{ +what = [[GC can collect a long string still in use during parser]], +report = [[Roberto, 2013/08/30]], +since = [[5.2]], +fix = [[5.2.3]], +example = [[This bug is very difficult to happen (and to reproduce), +because it depends on the GC running in a very specific way when +parsing a source code with long (larger than 40 characters) identifiers.]], +patch = [[ +--- ltable.h 2013/04/12 18:48:47 2.16.1.1 ++++ ltable.h 2013/08/30 15:34:24 +@@ -18,4 +18,8 @@ + #define invalidateTMcache(t) ((t)->flags = 0) + ++/* returns the key, given the value of a table entry */ ++#define keyfromval(v) \ ++ (gkey(cast(Node *, cast(char *, (v)) - offsetof(Node, i_val)))) ++ + + LUAI_FUNC const TValue *luaH_getint (Table *t, int key); + +--- llex.c 2013/04/12 18:48:47 2.63.1.1 ++++ llex.c 2013/08/30 15:34:59 +@@ -134,4 +134,7 @@ + luaC_checkGC(L); + } ++ else { /* string already present */ ++ ts = rawtsvalue(keyfromval(o)); /* re-use value previously stored */ ++ } + L->top--; /* remove string from stack */ + return ts; +]] +} + + +Bug{ +what = [[Call to macro 'luai_userstateclose' should be done only +after the calls to __gc methods.]], +report = [[Jean-Luc Jumpertz, 2013/09/02]], +since = [[ ]], +fix = nil, +example = [[No example]], +patch = [[ +--- lstate.c 2013/04/12 18:48:47 2.99.1.1 ++++ lstate.c 2013/11/08 17:39:57 +@@ -194,2 +194,4 @@ + g->gcrunning = 1; /* allow gc */ ++ g->version = lua_version(NULL); ++ luai_userstateopen(L); + } +@@ -224,2 +226,4 @@ + luaC_freeallobjects(L); /* collect all objects */ ++ if (g->version) /* closing a fully built state? */ ++ luai_userstateclose(L); + luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size); +@@ -289,3 +293,3 @@ + g->panic = NULL; +- g->version = lua_version(NULL); ++ g->version = NULL; + g->gcstate = GCSpause; +@@ -308,4 +312,2 @@ + } +- else +- luai_userstateopen(L); + return L; +@@ -317,3 +319,2 @@ + lua_lock(L); +- luai_userstateclose(L); + close_state(L); +]] +} + + +Bug{ +what = [[Resuming the running coroutine makes it unyieldable]], +report = [[Florian Nücke, 2013/10/28]], +since = [[5.2]], +fix = [[5.2.3]], +example = [[ +-- should print 'true' +print(coroutine.resume(coroutine.create(function() + coroutine.resume(coroutine.running()) + coroutine.yield() +end))) +]], +patch = [[ +--- ldo.c 2013/04/19 21:03:23 2.108.1.2 ++++ ldo.c 2013/11/08 18:20:57 +@@ -536,2 +536,3 @@ + int status; ++ int oldnny = L->nny; /* save 'nny' */ + lua_lock(L); +@@ -557,3 +558,3 @@ + } +- L->nny = 1; /* do not allow yields */ ++ L->nny = oldnny; /* restore 'nny' */ + L->nCcalls--; +]] +} + + + +----------------------------------------------------------------- +-- Lua 5.2.3 + +Bug{ +what = [[compiler can optimize away overflow check in 'table.unpack']], +report = [[Paige DePol, 2014/03/30]], +since = [[5.1 (at least)]], +fix = nil, +example = [[ +> unpack({}, 0, 2^31 - 1) +(segfaults on some platforms with some compiler options) +]], +patch = [[ +--- ltablib.c 2013/04/12 18:48:47 1.65.1.1 ++++ ltablib.c 2014/05/07 16:32:55 1.65.1.2 +@@ -134,13 +135,14 @@ + + + static int unpack (lua_State *L) { +- int i, e, n; ++ int i, e; ++ unsigned int n; + luaL_checktype(L, 1, LUA_TTABLE); + i = luaL_optint(L, 2, 1); + e = luaL_opt(L, luaL_checkint, 3, luaL_len(L, 1)); + if (i > e) return 0; /* empty range */ +- n = e - i + 1; /* number of elements */ +- if (n <= 0 || !lua_checkstack(L, n)) /* n <= 0 means arith. overflow */ ++ n = (unsigned int)e - (unsigned int)i; /* number of elements minus 1 */ ++ if (n > (INT_MAX - 10) || !lua_checkstack(L, ++n)) + return luaL_error(L, "too many results to unpack"); + lua_rawgeti(L, 1, i); /* push arg[i] (avoiding overflow problems) */ + while (i++ < e) /* push arg[i + 1...e] */ +]] +} + +Bug{ +what = [[Ephemeron table can wrongly collect entry with strong key]], +report = [[Jörg Richter, 2014/08/22]], +since = [[5.2]], +fix = nil, +example = [[ +(This bug is very hard to reproduce, +because it depends on a specific interleaving of +events between the incremental collector and the program.) +]], +patch = [[ +--- lgc.c 2013/04/26 18:22:05 2.140.1.2 ++++ lgc.c 2014/09/01 13:24:33 +@@ -403,7 +403,7 @@ + reallymarkobject(g, gcvalue(gval(n))); /* mark it now */ + } + } +- if (prop) ++ if (g->gcstate != GCSatomic || prop) + linktable(h, &g->ephemeron); /* have to propagate again */ + else if (hasclears) /* does table have white keys? */ + linktable(h, &g->allweak); /* may have to clean white keys */ +]] +} + +Bug{ +what = [[Chunk with too many lines can seg. fault]], +report = [[Roberto, 2014/11/14]], +since = [[5.1 (at least)]], +fix = nil, +example = [[ +-- the cause of the bug is the use of an unitialized variable, so +-- it cannot be reproduced reliably +local s = string.rep("\n", 2^24) +print(load(function () return s end)) +]], +patch = [[ +--- llex.c 2013/08/30 15:49:41 2.63.1.2 ++++ llex.c 2015/02/09 17:05:31 +@@ -153,5 +153,5 @@ + next(ls); /* skip `\n\r' or `\r\n' */ + if (++ls->linenumber >= MAX_INT) +- luaX_syntaxerror(ls, "chunk has too many lines"); ++ lexerror(ls, "chunk has too many lines", 0); + } + +]] +} + + +----------------------------------------------------------------- +-- Lua 5.3.0 + +Bug{ +what = [['string.format("%f")' can cause a buffer overflow +(only when 'lua_Number' is long double!)]], +report = [[Roberto, 2015/01/13]], +since = [[5.3]], +fix = nil, +example = [[string.format("%.99f", 1e4000) -- when floats are long double]], +patch = [[ +--- lstrlib.c 2014/12/11 14:03:07 1.221 ++++ lstrlib.c 2015/02/23 19:01:42 +@@ -800,3 +800,4 @@ + /* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */ +-#define MAX_ITEM 512 ++#define MAX_ITEM \ ++ (sizeof(lua_Number) <= 4 ? 150 : sizeof(lua_Number) <= 8 ? 450 : 5050) + +]] +} + +Bug{ +what = [['debug.getlocal' on a coroutine suspended in a hook +can crash the interpreter]], +report = [[云风, 2015/02/11]], +since = [[5.2]], +fix = nil, +example = [[see http://lua-users.org/lists/lua-l/2015-02/msg00146.html]], +patch = [[ +--- ldebug.c 2015/01/02 12:52:22 2.110 ++++ ldebug.c 2015/02/13 16:03:23 +@@ -49,4 +49,14 @@ + + ++static void swapextra (lua_State *L) { ++ if (L->status == LUA_YIELD) { ++ CallInfo *ci = L->ci; /* get function that yielded */ ++ StkId temp = ci->func; /* exchange its 'func' and 'extra' values */ ++ ci->func = restorestack(L, ci->extra); ++ ci->extra = savestack(L, temp); ++ } ++} ++ ++ + /* + ** this function can be called asynchronous (e.g. during a signal) +@@ -145,4 +155,5 @@ + const char *name; + lua_lock(L); ++ swapextra(L); + if (ar == NULL) { /* information about non-active function? */ + if (!isLfunction(L->top - 1)) /* not a Lua function? */ +@@ -159,4 +170,5 @@ + } + } ++ swapextra(L); + lua_unlock(L); + return name; +@@ -166,10 +178,13 @@ + LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { + StkId pos = 0; /* to avoid warnings */ +- const char *name = findlocal(L, ar->i_ci, n, &pos); ++ const char *name; + lua_lock(L); ++ swapextra(L); ++ name = findlocal(L, ar->i_ci, n, &pos); + if (name) { + setobjs2s(L, pos, L->top - 1); + L->top--; /* pop value */ + } ++ swapextra(L); + lua_unlock(L); + return name; +@@ -271,4 +286,5 @@ + StkId func; + lua_lock(L); ++ swapextra(L); + if (*what == '>') { + ci = NULL; +@@ -289,4 +305,5 @@ + api_incr_top(L); + } ++ swapextra(L); + if (strchr(what, 'L')) + collectvalidlines(L, cl); +]] +} + + +Bug{ +what = [[suspended '__le' metamethod can give wrong result]], +report = [[Eric Zhong, 2015/04/07]], +since = [[5.2]], +fix = nil, + +example = [[ +mt = {__le = function (a,b) coroutine.yield("yield"); return a.x <= b.x end} +t1 = setmetatable({x=1}, mt) +t2 = {x=2} +co = coroutine.wrap(function (a,b) return t2 <= t1 end) +co() +print(co()) --> true (should be false) +]], + +patch = [[ +--- lstate.h 2014/10/30 18:53:28 2.119 ++++ lstate.h 2015/04/13 15:58:40 +@@ -94,6 +94,7 @@ + #define CIST_YPCALL (1<<4) /* call is a yieldable protected call */ + #define CIST_TAIL (1<<5) /* call was tail called */ + #define CIST_HOOKYIELD (1<<6) /* last hook called yielded */ ++#define CIST_LEQ (1<<7) /* using __lt for __le */ + + #define isLua(ci) ((ci)->callstatus & CIST_LUA) + +--- lvm.c 2014/12/27 20:30:38 2.232 ++++ lvm.c 2015/04/13 15:51:30 +@@ -292,9 +292,14 @@ + return l_strcmp(tsvalue(l), tsvalue(r)) <= 0; + else if ((res = luaT_callorderTM(L, l, r, TM_LE)) >= 0) /* first try 'le' */ + return res; +- else if ((res = luaT_callorderTM(L, r, l, TM_LT)) < 0) /* else try 'lt' */ +- luaG_ordererror(L, l, r); +- return !res; ++ else { /* try 'lt': */ ++ L->ci->callstatus |= CIST_LEQ; /* mark it is doing 'lt' for 'le' */ ++ res = luaT_callorderTM(L, r, l, TM_LT); ++ L->ci->callstatus ^= CIST_LEQ; /* clear mark */ ++ if (res < 0) ++ luaG_ordererror(L, l, r); ++ return !res; /* result is negated */ ++ } + } + + +@@ -553,11 +558,11 @@ + case OP_LE: case OP_LT: case OP_EQ: { + int res = !l_isfalse(L->top - 1); + L->top--; +- /* metamethod should not be called when operand is K */ +- lua_assert(!ISK(GETARG_B(inst))); +- if (op == OP_LE && /* "<=" using "<" instead? */ +- ttisnil(luaT_gettmbyobj(L, base + GETARG_B(inst), TM_LE))) +- res = !res; /* invert result */ ++ if (ci->callstatus & CIST_LEQ) { /* "<=" using "<" instead? */ ++ lua_assert(op == OP_LE); ++ ci->callstatus ^= CIST_LEQ; /* clear mark */ ++ res = !res; /* negate result */ ++ } + lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_JMP); + if (res != GETARG_A(inst)) /* condition failed? */ + ci->u.l.savedpc++; /* skip jump instruction */ +]] +} + + +Bug{ +what = [[return hook may not see correct values for + active local variables when function returns]], +report = [[Philipp Janda/Peng Yi, 2015/05/19]], +since = [[5.0]], +fix = nil, +example = [[ +see messasge http://lua-users.org/lists/lua-l/2015-05/msg00376.html]], +patch = [[ +]] +} + + + +----------------------------------------------------------------- +-- Lua 5.3.1 + +Bug{ +what = [['io.lines' does not check maximum number of options]], +report = [[Patrick Donnell, 2015/07/10]], +since = [[5.3.0]], +fix = nil, +example = [[ +-- can segfault in some machines +t ={}; for i = 1, 253 do t[i] = 1 end +io.lines("someexistingfile", table.unpack(t))() +]], +patch = [[ +--- liolib.c 2015/07/07 17:03:34 2.146 ++++ liolib.c 2015/07/15 14:40:28 2.147 +@@ -318,8 +318,15 @@ + static int io_readline (lua_State *L); + + ++/* ++** maximum number of arguments to 'f:lines'/'io.lines' (it + 3 must fit ++** in the limit for upvalues of a closure) ++*/ ++#define MAXARGLINE 250 ++ + static void aux_lines (lua_State *L, int toclose) { + int n = lua_gettop(L) - 1; /* number of arguments to read */ ++ luaL_argcheck(L, n <= MAXARGLINE, MAXARGLINE + 2, "too many arguments"); + lua_pushinteger(L, n); /* number of arguments to read */ + lua_pushboolean(L, toclose); /* close/not close file when finished */ + lua_rotate(L, 2, 2); /* move 'n' and 'toclose' to their positions */ +]] +} + + +----------------------------------------------------------------- +-- Lua 5.3.2 + +Bug{ +what = [[Metatable may access its own dealocated field when +it has a self reference in __newindex]], +report = [[actboy168@gmail.com, 2016/01/01]], +since = [[5.3.2]], +fix = nil, +example = [[ +local mt = {} +mt.__newindex = mt +local t = setmetatable({}, mt) +t[1] = 1 -- will segfault on some machines +]], +patch = [[ +--- lvm.c 2015/11/23 11:30:45 2.265 ++++ lvm.c 2016/01/01 14:34:12 +@@ -190,18 +190,19 @@ + for (loop = 0; loop < MAXTAGLOOP; loop++) { + const TValue *tm; + if (oldval != NULL) { +- lua_assert(ttistable(t) && ttisnil(oldval)); ++ Table *h = hvalue(t); /* save 't' table */ ++ lua_assert(ttisnil(oldval)); + /* must check the metamethod */ +- if ((tm = fasttm(L, hvalue(t)->metatable, TM_NEWINDEX)) == NULL && ++ if ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL && + /* no metamethod; is there a previous entry in the table? */ + (oldval != luaO_nilobject || + /* no previous entry; must create one. (The next test is + always true; we only need the assignment.) */ +- (oldval = luaH_newkey(L, hvalue(t), key), 1))) { ++ (oldval = luaH_newkey(L, h, key), 1))) { + /* no metamethod and (now) there is an entry with given key */ + setobj2t(L, cast(TValue *, oldval), val); +- invalidateTMcache(hvalue(t)); +- luaC_barrierback(L, hvalue(t), val); ++ invalidateTMcache(h); ++ luaC_barrierback(L, h, val); + return; + } + /* else will try the metamethod */ +]] +} + + +Bug{ +what = [[label between local definitions can mix-up their initializations]], +report = [[Karel Tuma, 2016/03/01]], +since = [[5.2]], +fix = nil, +example = [[ +do + local k = 0 + local x + ::foo:: + local y -- should be reset to nil after goto, but it is not + assert(not y) + y = true + k = k + 1 + if k < 2 then goto foo end +end +]], +patch = [[ +--- lparser.c 2015/11/02 16:09:30 2.149 ++++ lparser.c 2016/03/03 12:03:37 +@@ -1226,7 +1226,7 @@ + checkrepeated(fs, ll, label); /* check for repeated labels */ + checknext(ls, TK_DBCOLON); /* skip double colon */ + /* create new entry for this label */ +- l = newlabelentry(ls, ll, label, line, fs->pc); ++ l = newlabelentry(ls, ll, label, line, luaK_getlabel(fs)); + skipnoopstat(ls); /* skip other no-op statements */ + if (block_follow(ls, 0)) { /* label is last no-op statement in the block? */ + /* assume that locals are already out of scope */ +]] +} + + +Bug{ +what = [['gmatch' iterator fails when called from a coroutine different +from the one that created it]], +report = [[Nagaev Boris, 2016/03/18]], +since = [[5.3.2]], +fix = nil, +example = [[ +local f = string.gmatch("1 2 3 4 5", "%d+") +print(f()) --> 1 +co = coroutine.wrap(f) +print(co()) --> ??? (should be 2) +]], +patch = [[ +--- lstrlib.c 2015/11/25 16:28:17 1.239 ++++ lstrlib.c 2016/04/11 15:29:41 +@@ -688,6 +688,7 @@ + static int gmatch_aux (lua_State *L) { + GMatchState *gm = (GMatchState *)lua_touserdata(L, lua_upvalueindex(3)); + const char *src; ++ gm->ms.L = L; + for (src = gm->src; src <= gm->ms.src_end; src++) { + const char *e; + reprepstate(&gm->ms); +]] +} + + +----------------------------------------------------------------- +-- Lua 5.3.3 + + +Bug{ +what = [[expression list with four or more expressions in +a 'for' loop can crash the interpreter]], +report = [[Marco Schöpl, 2016/06/17]], +since = [[5.2]], +fix = nil, +example = [[ +-- the next loop will probably crash the interpreter +repeat until load "for _ in _,_,_,_ do local function _() end" +]], +patch = [[ +--- lparser.c 2016/05/13 19:10:16 2.153 ++++ lparser.c 2016/06/17 19:52:48 +@@ -323,6 +323,8 @@ + luaK_nil(fs, reg, extra); + } + } ++ if (nexps > nvars) ++ ls->fs->freereg -= nexps - nvars; /* remove extra values */ + } + + +@@ -1160,11 +1162,8 @@ + int nexps; + checknext(ls, '='); + nexps = explist(ls, &e); +- if (nexps != nvars) { ++ if (nexps != nvars) + adjust_assign(ls, nvars, nexps, &e); +- if (nexps > nvars) +- ls->fs->freereg -= nexps - nvars; /* remove extra values */ +- } + else { + luaK_setoneret(ls->fs, &e); /* close last expression */ + luaK_storevar(ls->fs, &lh->v, &e); +]] +} + + +Bug{ +what = [[Checking a format for 'os.date' may read pass the format string]], +report = [[Nagaev Boris, 2016/07/10]], +since = [[5.3.3]], +fix = nil, +example = [[ +This bug does not seem to happen with regular compilers. +It needs an "interceptor" 'memcmp' function that continues +reading memory after a difference is found.]], +patch = [[ +2c2 +< ** $Id: bugs,v 1.160 2018/05/24 20:25:14 roberto Exp roberto $ +--- +> ** $Id: bugs,v 1.160 2018/05/24 20:25:14 roberto Exp roberto $ +263c263,264 +< for (option = LUA_STRFTIMEOPTIONS; *option != '\0'; option += oplen) { +--- +> int convlen = (int)strlen(conv); +> for (option = LUA_STRFTIMEOPTIONS; *option != '\0' && oplen <= convlen; option += oplen) { +]] +} + + +Bug{ +what = [[Lua can generate wrong code in functions with too many constants]], +report = [[Marco Schöpl, 2016/07/17]], +since = [[5.3.3]], +fix = nil, +example = [[See http://lua-users.org/lists/lua-l/2016-07/msg00303.html]], +patch = [[ +--- lcode.c 2016/06/20 19:12:46 2.110 ++++ lcode.c 2016/07/18 15:43:41 +@@ -1018,8 +1018,8 @@ + */ + static void codebinexpval (FuncState *fs, OpCode op, + expdesc *e1, expdesc *e2, int line) { +- int rk1 = luaK_exp2RK(fs, e1); /* both operands are "RK" */ +- int rk2 = luaK_exp2RK(fs, e2); ++ int rk2 = luaK_exp2RK(fs, e2); /* both operands are "RK" */ ++ int rk1 = luaK_exp2RK(fs, e1); + freeexps(fs, e1, e2); + e1->u.info = luaK_codeABC(fs, op, 0, rk1, rk2); /* generate opcode */ + e1->k = VRELOCABLE; /* all those operations are relocatable */ +]] +} + + +Bug{ +what = [[When a coroutine tries to resume a non-suspended coroutine, +it can do some mess (and break C assertions) before detecting the error]], +report = [[Marco Schöpl, 2016/07/20]], +since = [[ ]], +fix = nil, +example = [[ +-- with C assertions on +A = coroutine.running() +B = coroutine.create(function() coroutine.resume(A) end) +coroutine.resume(B) + +-- or +A = coroutine.wrap(function() pcall(A, _) end) +A() +]], +patch = [[ +]] +} + + +----------------------------------------------------------------- +-- Lua 5.3.4 + + +Bug{ +what = [[Wrong code for a goto followed by a label inside an 'if']], +report = [[云风, 2017/04/13]], +since = [[5.2]], +fix = nil, +example = [[ +-- should print 32323232..., but prints only '3' +if true then + goto LBL + ::loop:: + print(2) + ::LBL:: + print(3) + goto loop +end +]], +patch = [[ +--- lparser.c 2017/04/19 17:20:42 2.155.1.1 ++++ lparser.c 2017/04/29 18:11:40 2.155.1.2 +@@ -1392,7 +1392,7 @@ + luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */ + enterblock(fs, &bl, 0); /* must enter block before 'goto' */ + gotostat(ls, v.t); /* handle goto/break */ +- skipnoopstat(ls); /* skip other no-op statements */ ++ while (testnext(ls, ';')) {} /* skip semicolons */ + if (block_follow(ls, 0)) { /* 'goto' is the entire block? */ + leaveblock(fs); + return; /* and that is it */ +]] +} + + +Bug{ +what = [[Lua crashes when building sequences with more than 2^30 elements.]], +report = [[Viacheslav Usov, 2017/05/11]], +since = [[ ]], +fix = nil, +example = [[ +-- crashes if machine has enough memory +local t = {} +for i = 1, 0x7fffffff do + t[i] = i +end +]], +patch = [[ +--- ltable.c 2017/04/19 17:20:42 2.118.1.1 ++++ ltable.c 2018/05/24 18:34:38 +@@ -223,7 +223,9 @@ + unsigned int na = 0; /* number of elements to go to array part */ + unsigned int optimal = 0; /* optimal size for array part */ + /* loop while keys can fill more than half of total size */ +- for (i = 0, twotoi = 1; *pna > twotoi / 2; i++, twotoi *= 2) { ++ for (i = 0, twotoi = 1; ++ twotoi > 0 && *pna > twotoi / 2; ++ i++, twotoi *= 2) { + if (nums[i] > 0) { + a += nums[i]; + if (a > twotoi/2) { /* more than half elements present? */ +]] +} + + +Bug{ +what = [[Table length computation overflows for sequences larger than +2^31 elements.]], +report = [[Viacheslav Usov, 2017/05/12]], +since = [[ ]], +fix = nil, +example = [[ +-- on a machine with enough memory +local t = {} +for i = 1, 2147483681 do + t[i] = i +end +print(#t) +]], +patch = [[ +--- ltable.h 2017/04/19 17:20:42 2.23.1.1 ++++ ltable.h 2018/05/24 19:31:50 +@@ -56,3 +56,3 @@ + LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key); +-LUAI_FUNC int luaH_getn (Table *t); ++LUAI_FUNC lua_Unsigned luaH_getn (Table *t); + +--- ltable.c 2018/05/24 19:22:37 2.118.1.2 ++++ ltable.c 2018/05/24 19:25:05 +@@ -614,4 +614,4 @@ + +-static int unbound_search (Table *t, unsigned int j) { +- unsigned int i = j; /* i is zero or a present index */ ++static lua_Unsigned unbound_search (Table *t, lua_Unsigned j) { ++ lua_Unsigned i = j; /* i is zero or a present index */ + j++; +@@ -620,3 +620,3 @@ + i = j; +- if (j > cast(unsigned int, MAX_INT)/2) { /* overflow? */ ++ if (j > l_castS2U(LUA_MAXINTEGER) / 2) { /* overflow? */ + /* table was built with bad purposes: resort to linear search */ +@@ -630,3 +630,3 @@ + while (j - i > 1) { +- unsigned int m = (i+j)/2; ++ lua_Unsigned m = (i+j)/2; + if (ttisnil(luaH_getint(t, m))) j = m; +@@ -642,3 +642,3 @@ + */ +-int luaH_getn (Table *t) { ++lua_Unsigned luaH_getn (Table *t) { + unsigned int j = t->sizearray; +]] +} + + +Bug{ +what = [[Lua does not check GC when creating error messages]], +report = [[Viacheslav Usov, 2017/07/06]], +since = [[5.3.2]], +fix = nil, +example = [[ +function test() + bob.joe.larry = 23 +end + +-- memory will grow steadly +for i = 1, math.huge do + pcall(test) + if i % 100000 == 0 then + io.write(collectgarbage'count'*1024, "\n") + end +end +]], +patch = [[ +--- ldebug.c 2017/04/19 17:20:42 2.121.1.1 ++++ ldebug.c 2017/07/10 17:08:39 +@@ -653,6 +653,7 @@ + CallInfo *ci = L->ci; + const char *msg; + va_list argp; ++ luaC_checkGC(L); /* error message uses memory */ + va_start(argp, fmt); + msg = luaO_pushvfstring(L, fmt, argp); /* format message */ + va_end(argp); +]] +} + + +Bug{ +what = [[dead keys with nil values can stay in weak tables]], +report = [[云风 Cloud Wu, 2017/08/15]], +since = [[5.2]], +fix = nil, +example = [[ +-- The following chunk, under a memory checker like valgrind, +-- produces a memory access violation. + +local a = setmetatable({}, {__mode = 'kv'}) + +a['ABCDEFGHIJKLMNOPQRSTUVWXYZ' .. 'abcdefghijklmnopqrstuvwxyz'] = {} +a[next(a)] = nil +collectgarbage() +print(a['BCDEFGHIJKLMNOPQRSTUVWXYZ' .. 'abcdefghijklmnopqrstuvwxyz']) +]], +patch = [[ +--- lgc.c 2016/12/22 13:08:50 2.215 ++++ lgc.c 2017/08/31 16:08:23 +@@ -643,8 +643,9 @@ + for (n = gnode(h, 0); n < limit; n++) { + if (!ttisnil(gval(n)) && (iscleared(g, gkey(n)))) { + setnilvalue(gval(n)); /* remove value ... */ +- removeentry(n); /* and remove entry from table */ + } ++ if (ttisnil(gval(n))) /* is entry empty? */ ++ removeentry(n); /* remove entry from table */ + } + } + } +]] +} + + +Bug{ +what = [['lua_pushcclosure' should not call the garbage collector when +'n' is zero.]], +report = [[Andrew Gierth, 2017/12/05]], +since = [[5.3.3]], +fix = nil, +example = [[ ]], +patch = [[ +--- lapi.c 2017/04/19 17:13:00 2.259.1.1 ++++ lapi.c 2017/12/06 18:14:45 +@@ -533,6 +533,7 @@ + lua_lock(L); + if (n == 0) { + setfvalue(L->top, fn); ++ api_incr_top(L); + } + else { + CClosure *cl; +@@ -546,9 +547,9 @@ + /* does not need barrier because closure is white */ + } + setclCvalue(L, L->top, cl); ++ api_incr_top(L); ++ luaC_checkGC(L); + } +- api_incr_top(L); +- luaC_checkGC(L); + lua_unlock(L); + } +]] +} + + +Bug{ +what = [[memory-allocation error when resizing a table can leave it +in an inconsistent state.]], +report = [[Roberto, 2017/12/08]], +since = [[5.0]], +fix = nil, +example = [[ +local a = {x = 1, y = 1, z = 1} +a[1] = 10 -- goes to the hash part (which has 4 slots) +print(a[1]) --> 10 + +-- assume that the 2nd memory allocation from now fails +pcall(rawset, a, 2, 20) -- forces a rehash + +-- a[1] now exists both in the array part (because the array part +-- grew) and in the hash part (because the allocation of the hash +-- part failed, keeping it as it was). +-- This makes the following traversal goes forever... +for k,v in pairs(a) do print(k,v) end +]], +patch = [[ +--- ltable.c 2018/05/24 19:39:05 2.118.1.3 ++++ ltable.c 2018/06/04 16:00:25 +@@ -332,17 +332,34 @@ + } + + ++typedef struct { ++ Table *t; ++ unsigned int nhsize; ++} AuxsetnodeT; ++ ++ ++static void auxsetnode (lua_State *L, void *ud) { ++ AuxsetnodeT *asn = cast(AuxsetnodeT *, ud); ++ setnodevector(L, asn->t, asn->nhsize); ++} ++ ++ + void luaH_resize (lua_State *L, Table *t, unsigned int nasize, + unsigned int nhsize) { + unsigned int i; + int j; ++ AuxsetnodeT asn; + unsigned int oldasize = t->sizearray; + int oldhsize = allocsizenode(t); + Node *nold = t->node; /* save old hash ... */ + if (nasize > oldasize) /* array part must grow? */ + setarrayvector(L, t, nasize); + /* create new hash part with appropriate size */ +- setnodevector(L, t, nhsize); ++ asn.t = t; asn.nhsize = nhsize; ++ if (luaD_rawrunprotected(L, auxsetnode, &asn) != LUA_OK) { /* mem. error? */ ++ setarrayvector(L, t, oldasize); /* array back to its original size */ ++ luaD_throw(L, LUA_ERRMEM); /* rethrow memory error */ ++ } + if (nasize < oldasize) { /* array part must shrink? */ + t->sizearray = nasize; + /* re-insert elements from vanishing slice */ +]] +} + + + +--[=[ +Bug{ +what = [[Long brackets with a huge number of '=' overflow some +internal buffer arithmetic]], +report = [[Marco, 2018/12/12]], +since = [[5.1]], +fix = nil, +example = [[ +local eqs = string.rep("=", 0x3ffffffe) +local code = "return [" .. eqs .. "[a]" .. eqs .. "]" +print(#assert(load(code))()) +]], +patch = [[ +]] +} +]=] + + + + +--[=[ +Bug{ +what = [[ ]], +report = [[ ]], +since = [[ ]], +fix = nil, +example = [[ ]], +patch = [[ +]] +} +]=] + + diff --git a/source/lua/lapi.c b/source/lua/lapi.c new file mode 100644 index 0000000..dd07a5f --- /dev/null +++ b/source/lua/lapi.c @@ -0,0 +1,1408 @@ +/* +** $Id: lapi.c $ +** Lua API +** See Copyright Notice in lua.h +*/ + +#define lapi_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lapi.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lundump.h" +#include "lvm.h" + + + +const char lua_ident[] = + "$LuaVersion: " LUA_COPYRIGHT " $" + "$LuaAuthors: " LUA_AUTHORS " $"; + + + +/* +** Test for a valid index. +** '!ttisnil(o)' implies 'o != &G(L)->nilvalue', so it is not needed. +** However, it covers the most common cases in a faster way. +*/ +#define isvalid(L, o) (!ttisnil(o) || o != &G(L)->nilvalue) + + +/* test for pseudo index */ +#define ispseudo(i) ((i) <= LUA_REGISTRYINDEX) + +/* test for upvalue */ +#define isupvalue(i) ((i) < LUA_REGISTRYINDEX) + + +LUA_API char *index2value (lua_State *L, int idx) { + CallInfo *ci = L->ci; + if (idx > 0) { + StkId o = ci->func + idx; + api_check(L, idx <= L->ci->top - (ci->func + 1), "unacceptable index"); + if (o >= L->top) return &G(L)->nilvalue; + else return s2v(o); + } + else if (!ispseudo(idx)) { /* negative index */ + api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index"); + return s2v(L->top + idx); + } + else if (idx == LUA_REGISTRYINDEX) + return &G(L)->l_registry; + else { /* upvalues */ + idx = LUA_REGISTRYINDEX - idx; + api_check(L, idx <= MAXUPVAL + 1, "upvalue index too large"); + if (ttislcf(s2v(ci->func))) /* light C function? */ + return &G(L)->nilvalue; /* it has no upvalues */ + else { + CClosure *func = clCvalue(s2v(ci->func)); + return (idx <= func->nupvalues) ? &func->upvalue[idx-1] : &G(L)->nilvalue; + } + } +} + + +static StkId index2stack (lua_State *L, int idx) { + CallInfo *ci = L->ci; + if (idx > 0) { + StkId o = ci->func + idx; + api_check(L, o < L->top, "unacceptable index"); + return o; + } + else { /* non-positive index */ + api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index"); + api_check(L, !ispseudo(idx), "invalid index"); + return L->top + idx; + } +} + + +LUA_API int lua_checkstack (lua_State *L, int n) { + int res; + CallInfo *ci = L->ci; + lua_lock(L); + api_check(L, n >= 0, "negative 'n'"); + if (L->stack_last - L->top > n) /* stack large enough? */ + res = 1; /* yes; check is OK */ + else { /* no; need to grow stack */ + int inuse = cast_int(L->top - L->stack) + EXTRA_STACK; + if (inuse > LUAI_MAXSTACK - n) /* can grow without overflow? */ + res = 0; /* no */ + else /* try to grow stack */ + res = luaD_growstack(L, n, 0); + } + if (res && ci->top < L->top + n) + ci->top = L->top + n; /* adjust frame top */ + lua_unlock(L); + return res; +} + + +LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) { + int i; + if (from == to) return; + lua_lock(to); + api_checknelems(from, n); + api_check(from, G(from) == G(to), "moving among independent states"); + api_check(from, to->ci->top - to->top >= n, "stack overflow"); + from->top -= n; + for (i = 0; i < n; i++) { + setobjs2s(to, to->top, from->top + i); + to->top++; /* stack already checked by previous 'api_check' */ + } + lua_unlock(to); +} + + +LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) { + lua_CFunction old; + lua_lock(L); + old = G(L)->panic; + G(L)->panic = panicf; + lua_unlock(L); + return old; +} + + +LUA_API lua_Number lua_version (lua_State *L) { + UNUSED(L); + return LUA_VERSION_NUM; +} + + + +/* +** basic stack manipulation +*/ + + +/* +** convert an acceptable stack index into an absolute index +*/ +LUA_API int lua_absindex (lua_State *L, int idx) { + return (idx > 0 || ispseudo(idx)) + ? idx + : cast_int(L->top - L->ci->func) + idx; +} + + +LUA_API int lua_gettop (lua_State *L) { + return cast_int(L->top - (L->ci->func + 1)); +} + + +LUA_API void lua_settop (lua_State *L, int idx) { + StkId func = L->ci->func; + lua_lock(L); + if (idx >= 0) { + StkId newtop = (func + 1) + idx; + api_check(L, idx <= L->stack_last - (func + 1), "new top too large"); + while (L->top < newtop) + setnilvalue(s2v(L->top++)); + L->top = newtop; + } + else { + api_check(L, -(idx+1) <= (L->top - (func + 1)), "invalid new top"); + L->top += idx+1; /* 'subtract' index (index is negative) */ + } + luaF_close(L, L->top, LUA_OK); + lua_unlock(L); +} + + +/* +** Reverse the stack segment from 'from' to 'to' +** (auxiliary to 'lua_rotate') +** Note that we move(copy) only the value inside the stack. +** (We do not move additional fields that may exist.) +*/ +static void reverse (lua_State *L, StkId from, StkId to) { + for (; from < to; from++, to--) { + TValue temp; + setobj(L, &temp, s2v(from)); + setobjs2s(L, from, to); + setobj2s(L, to, &temp); + } +} + + +/* +** Let x = AB, where A is a prefix of length 'n'. Then, +** rotate x n == BA. But BA == (A^r . B^r)^r. +*/ +LUA_API void lua_rotate (lua_State *L, int idx, int n) { + StkId p, t, m; + lua_lock(L); + t = L->top - 1; /* end of stack segment being rotated */ + p = index2stack(L, idx); /* start of segment */ + api_check(L, (n >= 0 ? n : -n) <= (t - p + 1), "invalid 'n'"); + m = (n >= 0 ? t - n : p - n - 1); /* end of prefix */ + reverse(L, p, m); /* reverse the prefix with length 'n' */ + reverse(L, m + 1, t); /* reverse the suffix */ + reverse(L, p, t); /* reverse the entire segment */ + lua_unlock(L); +} + + +LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) { + TValue *fr, *to; + lua_lock(L); + fr = index2value(L, fromidx); + to = index2value(L, toidx); + api_check(l, isvalid(L, to), "invalid index"); + setobj(L, to, fr); + if (isupvalue(toidx)) /* function upvalue? */ + luaC_barrier(L, clCvalue(s2v(L->ci->func)), fr); + /* LUA_REGISTRYINDEX does not need gc barrier + (collector revisits it before finishing collection) */ + lua_unlock(L); +} + + +LUA_API void lua_pushvalue (lua_State *L, int idx) { + lua_lock(L); + setobj2s(L, L->top, index2value(L, idx)); + api_incr_top(L); + lua_unlock(L); +} + + + +/* +** access functions (stack -> C) +*/ + + +LUA_API int lua_type (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (isvalid(L, o) ? ttype(o) : LUA_TNONE); +} + + +LUA_API const char *lua_typename (lua_State *L, int t) { + UNUSED(L); + api_check(L, LUA_TNONE <= t && t < LUA_NUMTAGS, "invalid tag"); + return ttypename(t); +} + + +LUA_API int lua_iscfunction (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (ttislcf(o) || (ttisCclosure(o))); +} + + +LUA_API int lua_isinteger (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return ttisinteger(o); +} + + +LUA_API int lua_isnumber (lua_State *L, int idx) { + lua_Number n; + const TValue *o = index2value(L, idx); + return tonumber(o, &n); +} + + +LUA_API int lua_isstring (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (ttisstring(o) || cvt2str(o)); +} + + +LUA_API int lua_isuserdata (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (ttisfulluserdata(o) || ttislightuserdata(o)); +} + + +LUA_API int lua_rawequal (lua_State *L, int index1, int index2) { + const TValue *o1 = index2value(L, index1); + const TValue *o2 = index2value(L, index2); + return (isvalid(L, o1) && isvalid(L, o2)) ? luaV_rawequalobj(o1, o2) : 0; +} + + +LUA_API void lua_arith (lua_State *L, int op) { + lua_lock(L); + if (op != LUA_OPUNM && op != LUA_OPBNOT) + api_checknelems(L, 2); /* all other operations expect two operands */ + else { /* for unary operations, add fake 2nd operand */ + api_checknelems(L, 1); + setobjs2s(L, L->top, L->top - 1); + api_incr_top(L); + } + /* first operand at top - 2, second at top - 1; result go to top - 2 */ + luaO_arith(L, op, s2v(L->top - 2), s2v(L->top - 1), L->top - 2); + L->top--; /* remove second operand */ + lua_unlock(L); +} + + +LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) { + const TValue *o1; + const TValue *o2; + int i = 0; + lua_lock(L); /* may call tag method */ + o1 = index2value(L, index1); + o2 = index2value(L, index2); + if (isvalid(L, o1) && isvalid(L, o2)) { + switch (op) { + case LUA_OPEQ: i = luaV_equalobj(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, "invalid option"); + } + } + lua_unlock(L); + return i; +} + + +LUA_API size_t lua_stringtonumber (lua_State *L, const char *s) { + size_t sz = luaO_str2num(s, s2v(L->top)); + if (sz != 0) + api_incr_top(L); + return sz; +} + + +LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *pisnum) { + lua_Number n; + const TValue *o = index2value(L, idx); + int isnum = tonumber(o, &n); + if (!isnum) + n = 0; /* call to 'tonumber' may change 'n' even if it fails */ + if (pisnum) *pisnum = isnum; + return n; +} + + +LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *pisnum) { + lua_Integer res; + const TValue *o = index2value(L, idx); + int isnum = tointeger(o, &res); + if (!isnum) + res = 0; /* call to 'tointeger' may change 'n' even if it fails */ + if (pisnum) *pisnum = isnum; + return res; +} + + +LUA_API int lua_toboolean (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return !l_isfalse(o); +} + + +LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) { + TValue *o = index2value(L, idx); + if (!ttisstring(o)) { + if (!cvt2str(o)) { /* not convertible? */ + if (len != NULL) *len = 0; + return NULL; + } + lua_lock(L); /* 'luaO_tostring' may create a new string */ + luaO_tostring(L, o); + luaC_checkGC(L); + o = index2value(L, idx); /* previous call may reallocate the stack */ + lua_unlock(L); + } + if (len != NULL) + *len = vslen(o); + return svalue(o); +} + + +LUA_API lua_Unsigned lua_rawlen (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + switch (ttypetag(o)) { + case LUA_TSHRSTR: return tsvalue(o)->shrlen; + case LUA_TLNGSTR: return tsvalue(o)->u.lnglen; + case LUA_TUSERDATA: return uvalue(o)->len; + case LUA_TTABLE: return luaH_getn(hvalue(o)); + default: return 0; + } +} + + +LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + if (ttislcf(o)) return fvalue(o); + else if (ttisCclosure(o)) + return clCvalue(o)->f; + else return NULL; /* not a C function */ +} + + +static void *touserdata (const TValue *o) { + switch (ttype(o)) { + case LUA_TUSERDATA: return getudatamem(uvalue(o)); + case LUA_TLIGHTUSERDATA: return pvalue(o); + default: return NULL; + } +} + + +LUA_API void *lua_touserdata (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return touserdata(o); +} + + +LUA_API lua_State *lua_tothread (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (!ttisthread(o)) ? NULL : thvalue(o); +} + + +/* +** Returns a pointer to the internal representation of an object. +** Note that ANSI C does not allow the conversion of a pointer to +** function to a 'void*', so the conversion here goes through +** a 'size_t'. (As the returned pointer is only informative, this +** conversion should not be a problem.) +*/ +LUA_API const void *lua_topointer (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + switch (ttypetag(o)) { + case LUA_TLCF: return cast_voidp(cast_sizet(fvalue(o))); + case LUA_TUSERDATA: case LUA_TLIGHTUSERDATA: + return touserdata(o); + default: { + if (iscollectable(o)) + return gcvalue(o); + else + return NULL; + } + } +} + + + +/* +** push functions (C -> stack) +*/ + + +LUA_API void lua_pushnil (lua_State *L) { + lua_lock(L); + setnilvalue(s2v(L->top)); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushnumber (lua_State *L, lua_Number n) { + lua_lock(L); + setfltvalue(s2v(L->top), n); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { + lua_lock(L); + setivalue(s2v(L->top), n); + api_incr_top(L); + lua_unlock(L); +} + + +/* +** Pushes on the stack a string with given length. Avoid using 's' when +** 'len' == 0 (as 's' can be NULL in that case), due to later use of +** 'memcmp' and 'memcpy'. +*/ +LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) { + TString *ts; + lua_lock(L); + ts = (len == 0) ? luaS_new(L, "") : luaS_newlstr(L, s, len); + setsvalue2s(L, L->top, ts); + api_incr_top(L); + luaC_checkGC(L); + lua_unlock(L); + return getstr(ts); +} + + +LUA_API const char *lua_pushstring (lua_State *L, const char *s) { + lua_lock(L); + if (s == NULL) + setnilvalue(s2v(L->top)); + else { + TString *ts; + ts = luaS_new(L, s); + setsvalue2s(L, L->top, ts); + s = getstr(ts); /* internal copy's address */ + } + api_incr_top(L); + luaC_checkGC(L); + lua_unlock(L); + return s; +} + + +LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt, + va_list argp) { + const char *ret; + lua_lock(L); + ret = luaO_pushvfstring(L, fmt, argp); + luaC_checkGC(L); + lua_unlock(L); + return ret; +} + + +LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) { + const char *ret; + va_list argp; + lua_lock(L); + va_start(argp, fmt); + ret = luaO_pushvfstring(L, fmt, argp); + va_end(argp); + luaC_checkGC(L); + lua_unlock(L); + return ret; +} + + +LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { + lua_lock(L); + if (n == 0) { + setfvalue(s2v(L->top), fn); + api_incr_top(L); + } + else { + CClosure *cl; + api_checknelems(L, n); + api_check(L, n <= MAXUPVAL, "upvalue index too large"); + cl = luaF_newCclosure(L, n); + cl->f = fn; + L->top -= n; + while (n--) { + setobj2n(L, &cl->upvalue[n], s2v(L->top + n)); + /* does not need barrier because closure is white */ + } + setclCvalue(L, s2v(L->top), cl); + api_incr_top(L); + luaC_checkGC(L); + } + lua_unlock(L); +} + + +LUA_API void lua_pushboolean (lua_State *L, int b) { + lua_lock(L); + setbvalue(s2v(L->top), (b != 0)); /* ensure that true is 1 */ + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushlightuserdata (lua_State *L, void *p) { + lua_lock(L); + setpvalue(s2v(L->top), p); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API int lua_pushthread (lua_State *L) { + lua_lock(L); + setthvalue(L, s2v(L->top), L); + api_incr_top(L); + lua_unlock(L); + return (G(L)->mainthread == L); +} + + + +/* +** get functions (Lua -> stack) +*/ + + +static int auxgetstr (lua_State *L, const TValue *t, const char *k) { + const TValue *slot; + TString *str = luaS_new(L, k); + if (luaV_fastget(L, t, str, slot, luaH_getstr)) { + setobj2s(L, L->top, slot); + api_incr_top(L); + } + else { + setsvalue2s(L, L->top, str); + api_incr_top(L); + luaV_finishget(L, t, s2v(L->top - 1), L->top - 1, slot); + } + lua_unlock(L); + return ttype(s2v(L->top - 1)); +} + + +LUA_API int lua_getglobal (lua_State *L, const char *name) { + Table *reg = hvalue(&G(L)->l_registry); + lua_lock(L); + return auxgetstr(L, luaH_getint(reg, LUA_RIDX_GLOBALS), name); +} + + +LUA_API int lua_gettable (lua_State *L, int idx) { + const TValue *slot; + TValue *t; + lua_lock(L); + t = index2value(L, idx); + if (luaV_fastget(L, t, s2v(L->top - 1), slot, luaH_get)) { + setobj2s(L, L->top - 1, slot); + } + else + luaV_finishget(L, t, s2v(L->top - 1), L->top - 1, slot); + lua_unlock(L); + return ttype(s2v(L->top - 1)); +} + + +LUA_API int lua_getfield (lua_State *L, int idx, const char *k) { + lua_lock(L); + return auxgetstr(L, index2value(L, idx), k); +} + + +LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { + TValue *t; + const TValue *slot; + lua_lock(L); + t = index2value(L, idx); + if (luaV_fastgeti(L, t, n, slot)) { + setobj2s(L, L->top, slot); + } + else { + TValue aux; + setivalue(&aux, n); + luaV_finishget(L, t, &aux, L->top, slot); + } + api_incr_top(L); + lua_unlock(L); + return ttype(s2v(L->top - 1)); +} + + +static int finishrawget (lua_State *L, const TValue *val) { + if (isempty(val)) /* avoid copying empty items to the stack */ + setnilvalue(s2v(L->top)); + else + setobj2s(L, L->top, val); + api_incr_top(L); + lua_unlock(L); + return ttype(s2v(L->top - 1)); +} + + +static Table *gettable (lua_State *L, int idx) { + TValue *t = index2value(L, idx); + api_check(L, ttistable(t), "table expected"); + return hvalue(t); +} + + +LUA_API int lua_rawget (lua_State *L, int idx) { + Table *t; + const TValue *val; + lua_lock(L); + api_checknelems(L, 1); + t = gettable(L, idx); + val = luaH_get(t, s2v(L->top - 1)); + L->top--; /* remove key */ + return finishrawget(L, val); +} + + +LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) { + Table *t; + lua_lock(L); + t = gettable(L, idx); + return finishrawget(L, luaH_getint(t, n)); +} + + +LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) { + Table *t; + TValue k; + lua_lock(L); + t = gettable(L, idx); + setpvalue(&k, cast_voidp(p)); + return finishrawget(L, luaH_get(t, &k)); +} + + +LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { + Table *t; + lua_lock(L); + t = luaH_new(L); + sethvalue2s(L, L->top, t); + api_incr_top(L); + if (narray > 0 || nrec > 0) + luaH_resize(L, t, narray, nrec); + luaC_checkGC(L); + lua_unlock(L); +} + + +LUA_API int lua_getmetatable (lua_State *L, int objindex) { + const TValue *obj; + Table *mt; + int res = 0; + lua_lock(L); + obj = index2value(L, objindex); + switch (ttype(obj)) { + case LUA_TTABLE: + mt = hvalue(obj)->metatable; + break; + case LUA_TUSERDATA: + mt = uvalue(obj)->metatable; + break; + default: + mt = G(L)->mt[ttype(obj)]; + break; + } + if (mt != NULL) { + sethvalue2s(L, L->top, mt); + api_incr_top(L); + res = 1; + } + lua_unlock(L); + return res; +} + + +LUA_API int lua_getiuservalue (lua_State *L, int idx, int n) { + TValue *o; + int t; + lua_lock(L); + o = index2value(L, idx); + api_check(L, ttisfulluserdata(o), "full userdata expected"); + if (n <= 0 || n > uvalue(o)->nuvalue) { + setnilvalue(s2v(L->top)); + t = LUA_TNONE; + } + else { + setobj2s(L, L->top, &uvalue(o)->uv[n - 1].uv); + t = ttype(s2v(L->top)); + } + api_incr_top(L); + lua_unlock(L); + return t; +} + + +/* +** set functions (stack -> Lua) +*/ + +/* +** t[k] = value at the top of the stack (where 'k' is a string) +*/ +static void auxsetstr (lua_State *L, const TValue *t, const char *k) { + const TValue *slot; + TString *str = luaS_new(L, k); + api_checknelems(L, 1); + if (luaV_fastget(L, t, str, slot, luaH_getstr)) { + luaV_finishfastset(L, t, slot, s2v(L->top - 1)); + L->top--; /* pop value */ + } + else { + setsvalue2s(L, L->top, str); /* push 'str' (to make it a TValue) */ + api_incr_top(L); + luaV_finishset(L, t, s2v(L->top - 1), s2v(L->top - 2), slot); + L->top -= 2; /* pop value and key */ + } + lua_unlock(L); /* lock done by caller */ +} + + +LUA_API void lua_setglobal (lua_State *L, const char *name) { + Table *reg = hvalue(&G(L)->l_registry); + lua_lock(L); /* unlock done in 'auxsetstr' */ + auxsetstr(L, luaH_getint(reg, LUA_RIDX_GLOBALS), name); +} + + +LUA_API void lua_settable (lua_State *L, int idx) { + TValue *t; + const TValue *slot; + lua_lock(L); + api_checknelems(L, 2); + t = index2value(L, idx); + if (luaV_fastget(L, t, s2v(L->top - 2), slot, luaH_get)) { + luaV_finishfastset(L, t, slot, s2v(L->top - 1)); + } + else + luaV_finishset(L, t, s2v(L->top - 2), s2v(L->top - 1), slot); + L->top -= 2; /* pop index and value */ + lua_unlock(L); +} + + +LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { + lua_lock(L); /* unlock done in 'auxsetstr' */ + auxsetstr(L, index2value(L, idx), k); +} + + +LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) { + TValue *t; + const TValue *slot; + lua_lock(L); + api_checknelems(L, 1); + t = index2value(L, idx); + if (luaV_fastgeti(L, t, n, slot)) { + luaV_finishfastset(L, t, slot, s2v(L->top - 1)); + } + else { + TValue aux; + setivalue(&aux, n); + luaV_finishset(L, t, &aux, s2v(L->top - 1), slot); + } + L->top--; /* pop value */ + lua_unlock(L); +} + + +LUA_API void lua_rawset (lua_State *L, int idx) { + Table *t; + TValue *slot; + lua_lock(L); + api_checknelems(L, 2); + t = gettable(L, idx); + slot = luaH_set(L, t, s2v(L->top - 2)); + setobj2t(L, slot, s2v(L->top - 1)); + invalidateTMcache(t); + luaC_barrierback(L, obj2gco(t), s2v(L->top - 1)); + L->top -= 2; + lua_unlock(L); +} + + +LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) { + Table *t; + lua_lock(L); + api_checknelems(L, 1); + t = gettable(L, idx); + luaH_setint(L, t, n, s2v(L->top - 1)); + luaC_barrierback(L, obj2gco(t), s2v(L->top - 1)); + L->top--; + lua_unlock(L); +} + + +LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) { + Table *t; + TValue k, *slot; + lua_lock(L); + api_checknelems(L, 1); + t = gettable(L, idx); + setpvalue(&k, cast_voidp(p)); + slot = luaH_set(L, t, &k); + setobj2t(L, slot, s2v(L->top - 1)); + luaC_barrierback(L, obj2gco(t), s2v(L->top - 1)); + L->top--; + lua_unlock(L); +} + + +LUA_API int lua_setmetatable (lua_State *L, int objindex) { + TValue *obj; + Table *mt; + lua_lock(L); + api_checknelems(L, 1); + obj = index2value(L, objindex); + if (ttisnil(s2v(L->top - 1))) + mt = NULL; + else { + api_check(L, ttistable(s2v(L->top - 1)), "table expected"); + mt = hvalue(s2v(L->top - 1)); + } + switch (ttype(obj)) { + case LUA_TTABLE: { + hvalue(obj)->metatable = mt; + if (mt) { + luaC_objbarrier(L, gcvalue(obj), mt); + luaC_checkfinalizer(L, gcvalue(obj), mt); + } + break; + } + case LUA_TUSERDATA: { + uvalue(obj)->metatable = mt; + if (mt) { + luaC_objbarrier(L, uvalue(obj), mt); + luaC_checkfinalizer(L, gcvalue(obj), mt); + } + break; + } + default: { + G(L)->mt[ttype(obj)] = mt; + break; + } + } + L->top--; + lua_unlock(L); + return 1; +} + + +LUA_API int lua_setiuservalue (lua_State *L, int idx, int n) { + TValue *o; + int res; + lua_lock(L); + api_checknelems(L, 1); + o = index2value(L, idx); + api_check(L, ttisfulluserdata(o), "full userdata expected"); + if (!(0 < n && n <= uvalue(o)->nuvalue)) + res = 0; + else { + setobj(L, &uvalue(o)->uv[n - 1].uv, s2v(L->top - 1)); + luaC_barrierback(L, gcvalue(o), s2v(L->top - 1)); + res = 1; + } + L->top--; + lua_unlock(L); + return res; +} + + +/* +** 'load' and 'call' functions (run Lua code) +*/ + + +#define checkresults(L,na,nr) \ + api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)), \ + "results from function overflow current stack size") + + +LUA_API void lua_callk (lua_State *L, int nargs, int nresults, + lua_KContext ctx, lua_KFunction k) { + StkId func; + lua_lock(L); + api_check(L, k == NULL || !isLua(L->ci), + "cannot use continuations inside hooks"); + api_checknelems(L, nargs+1); + api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread"); + checkresults(L, nargs, nresults); + func = L->top - (nargs+1); + if (k != NULL && yieldable(L)) { /* need to prepare continuation? */ + L->ci->u.c.k = k; /* save continuation */ + L->ci->u.c.ctx = ctx; /* save context */ + luaD_call(L, func, nresults); /* do the call */ + } + else /* no continuation or no yieldable */ + luaD_callnoyield(L, func, nresults); /* just do the call */ + adjustresults(L, nresults); + lua_unlock(L); +} + + + +/* +** Execute a protected call. +*/ +struct CallS { /* data to 'f_call' */ + StkId func; + int nresults; +}; + + +static void f_call (lua_State *L, void *ud) { + struct CallS *c = cast(struct CallS *, ud); + luaD_callnoyield(L, c->func, c->nresults); +} + + + +LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, + lua_KContext ctx, lua_KFunction k) { + struct CallS c; + int status; + ptrdiff_t func; + lua_lock(L); + api_check(L, k == NULL || !isLua(L->ci), + "cannot use continuations inside hooks"); + api_checknelems(L, nargs+1); + api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread"); + checkresults(L, nargs, nresults); + if (errfunc == 0) + func = 0; + else { + StkId o = index2stack(L, errfunc); + api_check(L, ttisfunction(s2v(o)), "error handler must be a function"); + func = savestack(L, o); + } + c.func = L->top - (nargs+1); /* function to be called */ + if (k == NULL || !yieldable(L)) { /* no continuation or no yieldable? */ + c.nresults = nresults; /* do a 'conventional' protected call */ + status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func); + } + else { /* prepare continuation (call is already protected by 'resume') */ + CallInfo *ci = L->ci; + ci->u.c.k = k; /* save continuation */ + ci->u.c.ctx = ctx; /* save context */ + /* save information for error recovery */ + ci->u2.funcidx = cast_int(savestack(L, c.func)); + ci->u.c.old_errfunc = L->errfunc; + L->errfunc = func; + setoah(ci->callstatus, L->allowhook); /* save value of 'allowhook' */ + ci->callstatus |= CIST_YPCALL; /* function can do error recovery */ + luaD_call(L, c.func, nresults); /* do the call */ + ci->callstatus &= ~CIST_YPCALL; + L->errfunc = ci->u.c.old_errfunc; + status = LUA_OK; /* if it is here, there were no errors */ + } + adjustresults(L, nresults); + lua_unlock(L); + return status; +} + + +LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, + const char *chunkname, const char *mode) { + ZIO z; + int status; + lua_lock(L); + if (!chunkname) chunkname = "?"; + luaZ_init(L, &z, reader, data); + status = luaD_protectedparser(L, &z, chunkname, mode); + if (status == LUA_OK) { /* no errors? */ + LClosure *f = clLvalue(s2v(L->top - 1)); /* get newly created function */ + if (f->nupvalues >= 1) { /* does it have an upvalue? */ + /* get global table from registry */ + Table *reg = hvalue(&G(L)->l_registry); + const TValue *gt = luaH_getint(reg, LUA_RIDX_GLOBALS); + /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */ + setobj(L, f->upvals[0]->v, gt); + luaC_barrier(L, f->upvals[0], gt); + } + } + lua_unlock(L); + return status; +} + + +LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data, int strip) { + int status; + TValue *o; + lua_lock(L); + api_checknelems(L, 1); + o = s2v(L->top - 1); + if (isLfunction(o)) + status = luaU_dump(L, getproto(o), writer, data, strip); + else + status = 1; + lua_unlock(L); + return status; +} + + +LUA_API int lua_status (lua_State *L) { + return L->status; +} + + +/* +** Garbage-collection function +*/ +LUA_API int lua_gc (lua_State *L, int what, ...) { + va_list argp; + int res = 0; + global_State *g = G(L); + lua_lock(L); + va_start(argp, what); + switch (what) { + case LUA_GCSTOP: { + g->gcrunning = 0; + break; + } + case LUA_GCRESTART: { + luaE_setdebt(g, 0); + g->gcrunning = 1; + break; + } + case LUA_GCCOLLECT: { + luaC_fullgc(L, 0); + break; + } + case LUA_GCCOUNT: { + /* GC values are expressed in Kbytes: #bytes/2^10 */ + res = cast_int(gettotalbytes(g) >> 10); + break; + } + case LUA_GCCOUNTB: { + res = cast_int(gettotalbytes(g) & 0x3ff); + break; + } + case LUA_GCSTEP: { + int data = va_arg(argp, int); + l_mem debt = 1; /* =1 to signal that it did an actual step */ + lu_byte oldrunning = g->gcrunning; + g->gcrunning = 1; /* allow GC to run */ + if (data == 0) { + luaE_setdebt(g, 0); /* do a basic step */ + luaC_step(L); + } + else { /* add 'data' to total debt */ + debt = cast(l_mem, data) * 1024 + g->GCdebt; + luaE_setdebt(g, debt); + luaC_checkGC(L); + } + g->gcrunning = oldrunning; /* restore previous state */ + if (debt > 0 && g->gcstate == GCSpause) /* end of cycle? */ + res = 1; /* signal it */ + break; + } + case LUA_GCSETPAUSE: { + int data = va_arg(argp, int); + res = getgcparam(g->gcpause); + setgcparam(g->gcpause, data); + break; + } + case LUA_GCSETSTEPMUL: { + int data = va_arg(argp, int); + res = getgcparam(g->gcstepmul); + setgcparam(g->gcstepmul, data); + break; + } + case LUA_GCISRUNNING: { + res = g->gcrunning; + break; + } + case LUA_GCGEN: { + int minormul = va_arg(argp, int); + int majormul = va_arg(argp, int); + res = isdecGCmodegen(g) ? LUA_GCGEN : LUA_GCINC; + if (minormul != 0) + g->genminormul = minormul; + if (majormul != 0) + setgcparam(g->genmajormul, majormul); + luaC_changemode(L, KGC_GEN); + break; + } + case LUA_GCINC: { + int pause = va_arg(argp, int); + int stepmul = va_arg(argp, int); + int stepsize = va_arg(argp, int); + res = isdecGCmodegen(g) ? LUA_GCGEN : LUA_GCINC; + if (pause != 0) + setgcparam(g->gcpause, pause); + if (stepmul != 0) + setgcparam(g->gcstepmul, stepmul); + if (stepsize != 0) + g->gcstepsize = stepsize; + luaC_changemode(L, KGC_INC); + break; + } + default: res = -1; /* invalid option */ + } + va_end(argp); + lua_unlock(L); + return res; +} + + + +/* +** miscellaneous functions +*/ + + +LUA_API int lua_error (lua_State *L) { + lua_lock(L); + api_checknelems(L, 1); + luaG_errormsg(L); + /* code unreachable; will unlock when control actually leaves the kernel */ + return 0; /* to avoid warnings */ +} + + +LUA_API int lua_next (lua_State *L, int idx) { + Table *t; + int more; + lua_lock(L); + api_checknelems(L, 1); + t = gettable(L, idx); + more = luaH_next(L, t, L->top - 1); + if (more) { + api_incr_top(L); + } + else /* no more elements */ + L->top -= 1; /* remove key */ + lua_unlock(L); + return more; +} + + +LUA_API void lua_toclose (lua_State *L, int idx) { + int nresults; + StkId o; + lua_lock(L); + o = index2stack(L, idx); + nresults = L->ci->nresults; + api_check(L, L->openupval == NULL || uplevel(L->openupval) <= o, + "marked index below or equal new one"); + luaF_newtbcupval(L, o); /* create new to-be-closed upvalue */ + if (!hastocloseCfunc(nresults)) /* function not marked yet? */ + L->ci->nresults = codeNresults(nresults); /* mark it */ + lua_assert(hastocloseCfunc(L->ci->nresults)); + lua_unlock(L); +} + + +LUA_API void lua_concat (lua_State *L, int n) { + lua_lock(L); + api_checknelems(L, n); + if (n >= 2) { + luaV_concat(L, n); + } + else if (n == 0) { /* push empty string */ + setsvalue2s(L, L->top, luaS_newlstr(L, "", 0)); + api_incr_top(L); + } + /* else n == 1; nothing to do */ + luaC_checkGC(L); + lua_unlock(L); +} + + +LUA_API void lua_len (lua_State *L, int idx) { + TValue *t; + lua_lock(L); + t = index2value(L, idx); + luaV_objlen(L, L->top, t); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) { + lua_Alloc f; + lua_lock(L); + if (ud) *ud = G(L)->ud; + f = G(L)->frealloc; + lua_unlock(L); + return f; +} + + +LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) { + lua_lock(L); + G(L)->ud = ud; + G(L)->frealloc = f; + lua_unlock(L); +} + + +void lua_setwarnf (lua_State *L, lua_WarnFunction f, void *ud) { + lua_lock(L); + G(L)->ud_warn = ud; + G(L)->warnf = f; + lua_unlock(L); +} + + +void lua_warning (lua_State *L, const char *msg, int tocont) { + lua_lock(L); + luaE_warning(L, msg, tocont); + lua_unlock(L); +} + + + +LUA_API void *lua_newuserdatauv (lua_State *L, size_t size, int nuvalue) { + Udata *u; + lua_lock(L); + api_check(L, 0 <= nuvalue && nuvalue < USHRT_MAX, "invalid value"); + u = luaS_newudata(L, size, nuvalue); + setuvalue(L, s2v(L->top), u); + api_incr_top(L); + luaC_checkGC(L); + lua_unlock(L); + return getudatamem(u); +} + + + +static const char *aux_upvalue (TValue *fi, int n, TValue **val, + GCObject **owner) { + switch (ttypetag(fi)) { + case LUA_TCCL: { /* C closure */ + CClosure *f = clCvalue(fi); + if (!(1 <= n && n <= f->nupvalues)) return NULL; + *val = &f->upvalue[n-1]; + if (owner) *owner = obj2gco(f); + return ""; + } + case LUA_TLCL: { /* Lua closure */ + LClosure *f = clLvalue(fi); + TString *name; + Proto *p = f->p; + if (!(1 <= n && n <= p->sizeupvalues)) return NULL; + *val = f->upvals[n-1]->v; + if (owner) *owner = obj2gco(f->upvals[n - 1]); + name = p->upvalues[n-1].name; + return (name == NULL) ? "(no name)" : getstr(name); + } + default: return NULL; /* not a closure */ + } +} + + +LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { + const char *name; + TValue *val = NULL; /* to avoid warnings */ + lua_lock(L); + name = aux_upvalue(index2value(L, funcindex), n, &val, NULL); + if (name) { + setobj2s(L, L->top, val); + api_incr_top(L); + } + lua_unlock(L); + return name; +} + + +LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { + const char *name; + TValue *val = NULL; /* to avoid warnings */ + GCObject *owner = NULL; /* to avoid warnings */ + TValue *fi; + lua_lock(L); + fi = index2value(L, funcindex); + api_checknelems(L, 1); + name = aux_upvalue(fi, n, &val, &owner); + if (name) { + L->top--; + setobj(L, val, s2v(L->top)); + luaC_barrier(L, owner, val); + } + lua_unlock(L); + return name; +} + + +static UpVal **getupvalref (lua_State *L, int fidx, int n, LClosure **pf) { + LClosure *f; + TValue *fi = index2value(L, fidx); + api_check(L, ttisLclosure(fi), "Lua function expected"); + f = clLvalue(fi); + api_check(L, (1 <= n && n <= f->p->sizeupvalues), "invalid upvalue index"); + if (pf) *pf = f; + return &f->upvals[n - 1]; /* get its upvalue pointer */ +} + + +LUA_API void *lua_upvalueid (lua_State *L, int fidx, int n) { + TValue *fi = index2value(L, fidx); + switch (ttypetag(fi)) { + case LUA_TLCL: { /* lua closure */ + return *getupvalref(L, fidx, n, NULL); + } + case LUA_TCCL: { /* C closure */ + CClosure *f = clCvalue(fi); + api_check(L, 1 <= n && n <= f->nupvalues, "invalid upvalue index"); + return &f->upvalue[n - 1]; + } + default: { + api_check(L, 0, "closure expected"); + return NULL; + } + } +} + + +LUA_API void lua_upvaluejoin (lua_State *L, int fidx1, int n1, + int fidx2, int n2) { + LClosure *f1; + UpVal **up1 = getupvalref(L, fidx1, n1, &f1); + UpVal **up2 = getupvalref(L, fidx2, n2, NULL); + *up1 = *up2; + luaC_objbarrier(L, f1, *up1); +} + + diff --git a/source/lua/lapi.h b/source/lua/lapi.h new file mode 100644 index 0000000..5a4206f --- /dev/null +++ b/source/lua/lapi.h @@ -0,0 +1,37 @@ +/* +** $Id: lapi.h $ +** Auxiliary functions from Lua API +** See Copyright Notice in lua.h +*/ + +#ifndef lapi_h +#define lapi_h + + +#include "llimits.h" +#include "lstate.h" + +#define api_incr_top(L) {L->top++; api_check(L, L->top <= L->ci->top, \ + "stack overflow");} + +#define adjustresults(L,nres) \ + { if ((nres) <= LUA_MULTRET && L->ci->top < L->top) L->ci->top = L->top; } + +#define api_checknelems(L,n) api_check(L, (n) < (L->top - L->ci->func), \ + "not enough elements in the stack") + + +/* +** To reduce the overhead of returning from C functions, the presence of +** to-be-closed variables in these functions is coded in the CallInfo's +** field 'nresults', in a way that functions with no to-be-closed variables +** with zero, one, or "all" wanted results have no overhead. Functions +** with other number of wanted results, as well as functions with +** variables to be closed, have an extra check. +*/ + +#define hastocloseCfunc(n) ((n) < LUA_MULTRET) + +#define codeNresults(n) (-(n) - 3) + +#endif diff --git a/source/lua/lapi.o b/source/lua/lapi.o new file mode 100644 index 0000000000000000000000000000000000000000..5d0c040ba46c45105970c38c1b019b71cfbea9b2 GIT binary patch literal 22960 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 literal 0 HcmV?d00001 diff --git a/source/lua/lauxlib.c b/source/lua/lauxlib.c new file mode 100644 index 0000000..e9c02d3 --- /dev/null +++ b/source/lua/lauxlib.c @@ -0,0 +1,1026 @@ +/* +** $Id: lauxlib.c $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + +#define lauxlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include +#include + + +/* +** This file uses only the official API of Lua. +** Any function declared here could be written as an application function. +*/ + +#include "lua.h" + +#include "lauxlib.h" + + +#if !defined(MAX_SIZET) +/* maximum value for size_t */ +#define MAX_SIZET ((size_t)(~(size_t)0)) +#endif + + +/* +** {====================================================== +** Traceback +** ======================================================= +*/ + + +#define LEVELS1 10 /* size of the first part of the stack */ +#define LEVELS2 11 /* size of the second part of the stack */ + + + +/* +** search for 'objidx' in table at index -1. +** return 1 + string at top if find a good name. +*/ +static int findfield (lua_State *L, int objidx, int level) { + if (level == 0 || !lua_istable(L, -1)) + return 0; /* not found */ + lua_pushnil(L); /* start 'next' loop */ + while (lua_next(L, -2)) { /* for each pair in table */ + if (lua_type(L, -2) == LUA_TSTRING) { /* ignore non-string keys */ + if (lua_rawequal(L, objidx, -1)) { /* found object? */ + lua_pop(L, 1); /* remove value (but keep name) */ + return 1; + } + else if (findfield(L, objidx, level - 1)) { /* try recursively */ + lua_remove(L, -2); /* remove table (but keep name) */ + lua_pushliteral(L, "."); + lua_insert(L, -2); /* place '.' between the two names */ + lua_concat(L, 3); + return 1; + } + } + lua_pop(L, 1); /* remove value */ + } + return 0; /* not found */ +} + + +/* +** Search for a name for a function in all loaded modules +*/ +static int pushglobalfuncname (lua_State *L, lua_Debug *ar) { + int top = lua_gettop(L); + lua_getinfo(L, "f", ar); /* push function */ + lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + if (findfield(L, top + 1, 2)) { + const char *name = lua_tostring(L, -1); + if (strncmp(name, LUA_GNAME ".", 3) == 0) { /* name start with '_G.'? */ + lua_pushstring(L, name + 3); /* push name without prefix */ + lua_remove(L, -2); /* remove original name */ + } + lua_copy(L, -1, top + 1); /* move name to proper place */ + lua_pop(L, 2); /* remove pushed values */ + return 1; + } + else { + lua_settop(L, top); /* remove function and global table */ + return 0; + } +} + + +static void pushfuncname (lua_State *L, lua_Debug *ar) { + if (pushglobalfuncname(L, ar)) { /* try first a global name */ + lua_pushfstring(L, "function '%s'", lua_tostring(L, -1)); + lua_remove(L, -2); /* remove name */ + } + else if (*ar->namewhat != '\0') /* is there a name from code? */ + lua_pushfstring(L, "%s '%s'", ar->namewhat, ar->name); /* use it */ + else if (*ar->what == 'm') /* main? */ + lua_pushliteral(L, "main chunk"); + else if (*ar->what != 'C') /* for Lua functions, use */ + lua_pushfstring(L, "function <%s:%d>", ar->short_src, ar->linedefined); + else /* nothing left... */ + lua_pushliteral(L, "?"); +} + + +static int lastlevel (lua_State *L) { + lua_Debug ar; + int li = 1, le = 1; + /* find an upper bound */ + while (lua_getstack(L, le, &ar)) { li = le; le *= 2; } + /* do a binary search */ + while (li < le) { + int m = (li + le)/2; + if (lua_getstack(L, m, &ar)) li = m + 1; + else le = m; + } + return le - 1; +} + + +LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, + const char *msg, int level) { + lua_Debug ar; + int top = lua_gettop(L); + int last = lastlevel(L1); + int n1 = (last - level > LEVELS1 + LEVELS2) ? LEVELS1 : -1; + if (msg) + lua_pushfstring(L, "%s\n", msg); + luaL_checkstack(L, 10, NULL); + lua_pushliteral(L, "stack traceback:"); + while (lua_getstack(L1, level++, &ar)) { + if (n1-- == 0) { /* too many levels? */ + lua_pushliteral(L, "\n\t..."); /* add a '...' */ + level = last - LEVELS2 + 1; /* and skip to last ones */ + } + else { + lua_getinfo(L1, "Slnt", &ar); + lua_pushfstring(L, "\n\t%s:", ar.short_src); + if (ar.currentline > 0) + lua_pushfstring(L, "%d:", ar.currentline); + lua_pushliteral(L, " in "); + pushfuncname(L, &ar); + if (ar.istailcall) + lua_pushliteral(L, "\n\t(...tail calls...)"); + lua_concat(L, lua_gettop(L) - top); + } + } + lua_concat(L, lua_gettop(L) - top); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Error-report functions +** ======================================================= +*/ + +LUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) { + lua_Debug ar; + if (!lua_getstack(L, 0, &ar)) /* no stack frame? */ + return luaL_error(L, "bad argument #%d (%s)", arg, extramsg); + lua_getinfo(L, "n", &ar); + if (strcmp(ar.namewhat, "method") == 0) { + arg--; /* do not count 'self' */ + if (arg == 0) /* error is in the self argument itself? */ + return luaL_error(L, "calling '%s' on bad self (%s)", + ar.name, extramsg); + } + if (ar.name == NULL) + ar.name = (pushglobalfuncname(L, &ar)) ? lua_tostring(L, -1) : "?"; + return luaL_error(L, "bad argument #%d to '%s' (%s)", + arg, ar.name, extramsg); +} + + +int luaL_typeerror (lua_State *L, int arg, const char *tname) { + const char *msg; + const char *typearg; /* name for the type of the actual argument */ + if (luaL_getmetafield(L, arg, "__name") == LUA_TSTRING) + typearg = lua_tostring(L, -1); /* use the given type name */ + else if (lua_type(L, arg) == LUA_TLIGHTUSERDATA) + typearg = "light userdata"; /* special name for messages */ + else + typearg = luaL_typename(L, arg); /* standard name */ + msg = lua_pushfstring(L, "%s expected, got %s", tname, typearg); + return luaL_argerror(L, arg, msg); +} + + +static void tag_error (lua_State *L, int arg, int tag) { + luaL_typeerror(L, arg, lua_typename(L, tag)); +} + + +/* +** The use of 'lua_pushfstring' ensures this function does not +** need reserved stack space when called. +*/ +LUALIB_API void luaL_where (lua_State *L, int level) { + lua_Debug ar; + if (lua_getstack(L, level, &ar)) { /* check function at level */ + lua_getinfo(L, "Sl", &ar); /* get info about it */ + if (ar.currentline > 0) { /* is there info? */ + lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline); + return; + } + } + lua_pushfstring(L, ""); /* else, no information available... */ +} + + +/* +** Again, the use of 'lua_pushvfstring' ensures this function does +** not need reserved stack space when called. (At worst, it generates +** an error with "stack overflow" instead of the given message.) +*/ +LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) { + va_list argp; + va_start(argp, fmt); + luaL_where(L, 1); + lua_pushvfstring(L, fmt, argp); + va_end(argp); + lua_concat(L, 2); + return lua_error(L); +} + + +LUALIB_API int luaL_fileresult (lua_State *L, int stat, const char *fname) { + int en = errno; /* calls to Lua API may change this value */ + if (stat) { + lua_pushboolean(L, 1); + return 1; + } + else { + lua_pushnil(L); + if (fname) + lua_pushfstring(L, "%s: %s", fname, strerror(en)); + else + lua_pushstring(L, strerror(en)); + lua_pushinteger(L, en); + return 3; + } +} + + +#if !defined(l_inspectstat) /* { */ + +#if defined(LUA_USE_POSIX) + +#include + +/* +** use appropriate macros to interpret 'pclose' return status +*/ +#define l_inspectstat(stat,what) \ + if (WIFEXITED(stat)) { stat = WEXITSTATUS(stat); } \ + else if (WIFSIGNALED(stat)) { stat = WTERMSIG(stat); what = "signal"; } + +#else + +#define l_inspectstat(stat,what) /* no op */ + +#endif + +#endif /* } */ + + +LUALIB_API int luaL_execresult (lua_State *L, int stat) { + const char *what = "exit"; /* type of termination */ + if (stat == -1) /* error? */ + return luaL_fileresult(L, 0, NULL); + else { + l_inspectstat(stat, what); /* interpret result */ + if (*what == 'e' && stat == 0) /* successful termination? */ + lua_pushboolean(L, 1); + else + lua_pushnil(L); + lua_pushstring(L, what); + lua_pushinteger(L, stat); + return 3; /* return true/nil,what,code */ + } +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** Userdata's metatable manipulation +** ======================================================= +*/ + +LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) { + if (luaL_getmetatable(L, tname) != LUA_TNIL) /* name already in use? */ + return 0; /* leave previous value on top, but return 0 */ + lua_pop(L, 1); + lua_createtable(L, 0, 2); /* create metatable */ + lua_pushstring(L, tname); + lua_setfield(L, -2, "__name"); /* metatable.__name = tname */ + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, tname); /* registry.name = metatable */ + return 1; +} + + +LUALIB_API void luaL_setmetatable (lua_State *L, const char *tname) { + luaL_getmetatable(L, tname); + lua_setmetatable(L, -2); +} + + +LUALIB_API void *luaL_testudata (lua_State *L, int ud, const char *tname) { + void *p = lua_touserdata(L, ud); + if (p != NULL) { /* value is a userdata? */ + if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ + luaL_getmetatable(L, tname); /* get correct metatable */ + 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 */ + return p; + } + } + return NULL; /* value is not a userdata with a metatable */ +} + + +LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) { + void *p = luaL_testudata(L, ud, tname); + luaL_argexpected(L, p != NULL, ud, tname); + return p; +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Argument check functions +** ======================================================= +*/ + +LUALIB_API int luaL_checkoption (lua_State *L, int arg, const char *def, + const char *const lst[]) { + const char *name = (def) ? luaL_optstring(L, arg, def) : + luaL_checkstring(L, arg); + int i; + for (i=0; lst[i]; i++) + if (strcmp(lst[i], name) == 0) + return i; + return luaL_argerror(L, arg, + lua_pushfstring(L, "invalid option '%s'", name)); +} + + +/* +** Ensures the stack has at least 'space' extra slots, raising an error +** if it cannot fulfill the request. (The error handling needs a few +** extra slots to format the error message. In case of an error without +** this extra space, Lua will generate the same 'stack overflow' error, +** but without 'msg'.) +*/ +LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) { + if (!lua_checkstack(L, space)) { + if (msg) + luaL_error(L, "stack overflow (%s)", msg); + else + luaL_error(L, "stack overflow"); + } +} + + +LUALIB_API void luaL_checktype (lua_State *L, int arg, int t) { + if (lua_type(L, arg) != t) + tag_error(L, arg, t); +} + + +LUALIB_API void luaL_checkany (lua_State *L, int arg) { + if (lua_type(L, arg) == LUA_TNONE) + luaL_argerror(L, arg, "value expected"); +} + + +LUALIB_API const char *luaL_checklstring (lua_State *L, int arg, size_t *len) { + const char *s = lua_tolstring(L, arg, len); + if (!s) tag_error(L, arg, LUA_TSTRING); + return s; +} + + +LUALIB_API const char *luaL_optlstring (lua_State *L, int arg, + const char *def, size_t *len) { + if (lua_isnoneornil(L, arg)) { + if (len) + *len = (def ? strlen(def) : 0); + return def; + } + else return luaL_checklstring(L, arg, len); +} + + +LUALIB_API lua_Number luaL_checknumber (lua_State *L, int arg) { + int isnum; + lua_Number d = lua_tonumberx(L, arg, &isnum); + if (!isnum) + tag_error(L, arg, LUA_TNUMBER); + return d; +} + + +LUALIB_API lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number def) { + return luaL_opt(L, luaL_checknumber, arg, def); +} + + +static void interror (lua_State *L, int arg) { + if (lua_isnumber(L, arg)) + luaL_argerror(L, arg, "number has no integer representation"); + else + tag_error(L, arg, LUA_TNUMBER); +} + + +LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int arg) { + int isnum; + lua_Integer d = lua_tointegerx(L, arg, &isnum); + if (!isnum) { + interror(L, arg); + } + return d; +} + + +LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int arg, + lua_Integer def) { + return luaL_opt(L, luaL_checkinteger, arg, def); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + +/* userdata to box arbitrary data */ +typedef struct UBox { + void *box; + size_t bsize; +} UBox; + + +static void *resizebox (lua_State *L, int idx, size_t newsize) { + void *ud; + lua_Alloc allocf = lua_getallocf(L, &ud); + UBox *box = (UBox *)lua_touserdata(L, idx); + void *temp = allocf(ud, box->box, box->bsize, newsize); + if (temp == NULL && newsize > 0) /* allocation error? */ + luaL_error(L, "not enough memory for buffer allocation"); + box->box = temp; + box->bsize = newsize; + return temp; +} + + +static int boxgc (lua_State *L) { + resizebox(L, 1, 0); + return 0; +} + + +static const luaL_Reg boxmt[] = { /* box metamethods */ + {"__gc", boxgc}, + {"__close", boxgc}, + {NULL, NULL} +}; + + +static void newbox (lua_State *L) { + UBox *box = (UBox *)lua_newuserdatauv(L, sizeof(UBox), 0); + box->box = NULL; + box->bsize = 0; + if (luaL_newmetatable(L, "_UBOX*")) /* creating metatable? */ + luaL_setfuncs(L, boxmt, 0); /* set its metamethods */ + lua_setmetatable(L, -2); +} + + +/* +** check whether buffer is using a userdata on the stack as a temporary +** buffer +*/ +#define buffonstack(B) ((B)->b != (B)->init.b) + + +/* +** Compute new size for buffer 'B', enough to accommodate extra 'sz' +** bytes. +*/ +static size_t newbuffsize (luaL_Buffer *B, size_t sz) { + size_t newsize = B->size * 2; /* double buffer size */ + if (MAX_SIZET - sz < B->n) /* overflow in (B->n + sz)? */ + return luaL_error(B->L, "buffer too large"); + if (newsize < B->n + sz) /* double is not big enough? */ + newsize = B->n + sz; + return newsize; +} + + +/* +** Returns a pointer to a free area with at least 'sz' bytes in buffer +** 'B'. 'boxidx' is the relative position in the stack where the +** buffer's box is or should be. +*/ +static char *prepbuffsize (luaL_Buffer *B, size_t sz, int boxidx) { + if (B->size - B->n >= sz) /* enough space? */ + return B->b + B->n; + else { + lua_State *L = B->L; + char *newbuff; + size_t newsize = newbuffsize(B, sz); + /* create larger buffer */ + if (buffonstack(B)) /* buffer already has a box? */ + newbuff = (char *)resizebox(L, boxidx, newsize); /* resize it */ + else { /* no box yet */ + lua_pushnil(L); /* reserve slot for final result */ + newbox(L); /* create a new box */ + /* move box (and slot) to its intended position */ + lua_rotate(L, boxidx - 1, 2); + lua_toclose(L, boxidx); + newbuff = (char *)resizebox(L, boxidx, newsize); + memcpy(newbuff, B->b, B->n * sizeof(char)); /* copy original content */ + } + B->b = newbuff; + B->size = newsize; + return newbuff + B->n; + } +} + +/* +** returns a pointer to a free area with at least 'sz' bytes +*/ +LUALIB_API char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz) { + return prepbuffsize(B, sz, -1); +} + + +LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { + if (l > 0) { /* avoid 'memcpy' when 's' can be NULL */ + char *b = prepbuffsize(B, l, -1); + memcpy(b, s, l * sizeof(char)); + luaL_addsize(B, l); + } +} + + +LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) { + luaL_addlstring(B, s, strlen(s)); +} + + +LUALIB_API void luaL_pushresult (luaL_Buffer *B) { + lua_State *L = B->L; + lua_pushlstring(L, B->b, B->n); + if (buffonstack(B)) { + lua_copy(L, -1, -3); /* move string to reserved slot */ + lua_pop(L, 2); /* pop string and box (closing the box) */ + } +} + + +LUALIB_API void luaL_pushresultsize (luaL_Buffer *B, size_t sz) { + luaL_addsize(B, sz); + luaL_pushresult(B); +} + + +/* +** 'luaL_addvalue' is the only function in the Buffer system where the +** box (if existent) is not on the top of the stack. So, instead of +** calling 'luaL_addlstring', it replicates the code using -2 as the +** last argument to 'prepbuffsize', signaling that the box is (or will +** be) bellow the string being added to the buffer. (Box creation can +** trigger an emergency GC, so we should not remove the string from the +** stack before we have the space guaranteed.) +*/ +LUALIB_API void luaL_addvalue (luaL_Buffer *B) { + lua_State *L = B->L; + size_t len; + const char *s = lua_tolstring(L, -1, &len); + char *b = prepbuffsize(B, len, -2); + memcpy(b, s, len * sizeof(char)); + luaL_addsize(B, len); + lua_pop(L, 1); /* pop string */ +} + + +LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) { + B->L = L; + B->b = B->init.b; + B->n = 0; + B->size = LUAL_BUFFERSIZE; +} + + +LUALIB_API char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz) { + luaL_buffinit(L, B); + return prepbuffsize(B, sz, -1); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Reference system +** ======================================================= +*/ + +/* index of free-list header */ +#define freelist 0 + + +LUALIB_API int luaL_ref (lua_State *L, int t) { + int ref; + if (lua_isnil(L, -1)) { + lua_pop(L, 1); /* remove from stack */ + return LUA_REFNIL; /* 'nil' has a unique fixed reference */ + } + t = lua_absindex(L, t); + lua_rawgeti(L, t, freelist); /* get first free element */ + ref = (int)lua_tointeger(L, -1); /* ref = t[freelist] */ + lua_pop(L, 1); /* remove it from stack */ + if (ref != 0) { /* any free element? */ + lua_rawgeti(L, t, ref); /* remove it from list */ + lua_rawseti(L, t, freelist); /* (t[freelist] = t[ref]) */ + } + else /* no free elements */ + ref = (int)lua_rawlen(L, t) + 1; /* get a new reference */ + lua_rawseti(L, t, ref); + return ref; +} + + +LUALIB_API void luaL_unref (lua_State *L, int t, int ref) { + if (ref >= 0) { + t = lua_absindex(L, t); + lua_rawgeti(L, t, freelist); + lua_rawseti(L, t, ref); /* t[ref] = t[freelist] */ + lua_pushinteger(L, ref); + lua_rawseti(L, t, freelist); /* t[freelist] = ref */ + } +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Load functions +** ======================================================= +*/ + +typedef struct LoadF { + int n; /* number of pre-read characters */ + FILE *f; /* file being read */ + char buff[BUFSIZ]; /* area for reading file */ +} LoadF; + + +static const char *getF (lua_State *L, void *ud, size_t *size) { + LoadF *lf = (LoadF *)ud; + (void)L; /* not used */ + if (lf->n > 0) { /* are there pre-read characters to be read? */ + *size = lf->n; /* return them (chars already in buffer) */ + lf->n = 0; /* no more pre-read characters */ + } + else { /* read a block from file */ + /* 'fread' can return > 0 *and* set the EOF flag. If next call to + 'getF' called 'fread', it might still wait for user input. + The next check avoids this problem. */ + if (feof(lf->f)) return NULL; + *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); /* read block */ + } + return lf->buff; +} + + +static int errfile (lua_State *L, const char *what, int fnameindex) { + const char *serr = strerror(errno); + const char *filename = lua_tostring(L, fnameindex) + 1; + lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr); + lua_remove(L, fnameindex); + return LUA_ERRFILE; +} + + +static int skipBOM (LoadF *lf) { + const char *p = "\xEF\xBB\xBF"; /* UTF-8 BOM mark */ + int c; + lf->n = 0; + do { + c = getc(lf->f); + if (c == EOF || c != *(const unsigned char *)p++) return c; + lf->buff[lf->n++] = c; /* to be read by the parser */ + } while (*p != '\0'); + lf->n = 0; /* prefix matched; discard it */ + return getc(lf->f); /* return next character */ +} + + +/* +** reads the first character of file 'f' and skips an optional BOM mark +** in its beginning plus its first line if it starts with '#'. Returns +** true if it skipped the first line. In any case, '*cp' has the +** first "valid" character of the file (after the optional BOM and +** a first-line comment). +*/ +static int skipcomment (LoadF *lf, int *cp) { + int c = *cp = skipBOM(lf); + if (c == '#') { /* first line is a comment (Unix exec. file)? */ + do { /* skip first line */ + c = getc(lf->f); + } while (c != EOF && c != '\n'); + *cp = getc(lf->f); /* skip end-of-line, if present */ + return 1; /* there was a comment */ + } + else return 0; /* no comment */ +} + + +LUALIB_API int luaL_loadfilex (lua_State *L, const char *filename, + const char *mode) { + LoadF lf; + int status, readstatus; + int c; + int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ + if (filename == NULL) { + lua_pushliteral(L, "=stdin"); + lf.f = stdin; + } + else { + lua_pushfstring(L, "@%s", filename); + lf.f = fopen(filename, "r"); + if (lf.f == NULL) return errfile(L, "open", fnameindex); + } + if (skipcomment(&lf, &c)) /* read initial portion */ + lf.buff[lf.n++] = '\n'; /* add line to correct line numbers */ + if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */ + lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */ + if (lf.f == NULL) return errfile(L, "reopen", fnameindex); + skipcomment(&lf, &c); /* re-read initial portion */ + } + if (c != EOF) + lf.buff[lf.n++] = c; /* 'c' is the first character of the stream */ + status = lua_load(L, getF, &lf, lua_tostring(L, -1), mode); + readstatus = ferror(lf.f); + if (filename) fclose(lf.f); /* close file (even in case of errors) */ + if (readstatus) { + lua_settop(L, fnameindex); /* ignore results from 'lua_load' */ + return errfile(L, "read", fnameindex); + } + lua_remove(L, fnameindex); + return status; +} + + +typedef struct LoadS { + const char *s; + size_t size; +} LoadS; + + +static const char *getS (lua_State *L, void *ud, size_t *size) { + LoadS *ls = (LoadS *)ud; + (void)L; /* not used */ + if (ls->size == 0) return NULL; + *size = ls->size; + ls->size = 0; + return ls->s; +} + + +LUALIB_API int luaL_loadbufferx (lua_State *L, const char *buff, size_t size, + const char *name, const char *mode) { + LoadS ls; + ls.s = buff; + ls.size = size; + return lua_load(L, getS, &ls, name, mode); +} + + +LUALIB_API int luaL_loadstring (lua_State *L, const char *s) { + return luaL_loadbuffer(L, s, strlen(s), s); +} + +/* }====================================================== */ + + + +LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) { + if (!lua_getmetatable(L, obj)) /* no metatable? */ + return LUA_TNIL; + else { + int tt; + lua_pushstring(L, event); + tt = lua_rawget(L, -2); + if (tt == LUA_TNIL) /* is metafield nil? */ + lua_pop(L, 2); /* remove metatable and metafield */ + else + lua_remove(L, -2); /* remove only metatable */ + return tt; /* return metafield type */ + } +} + + +LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) { + obj = lua_absindex(L, obj); + if (luaL_getmetafield(L, obj, event) == LUA_TNIL) /* no metafield? */ + return 0; + lua_pushvalue(L, obj); + lua_call(L, 1, 1); + return 1; +} + + +LUALIB_API lua_Integer luaL_len (lua_State *L, int idx) { + lua_Integer l; + int isnum; + lua_len(L, idx); + l = lua_tointegerx(L, -1, &isnum); + if (!isnum) + luaL_error(L, "object length is not an integer"); + lua_pop(L, 1); /* remove object */ + return l; +} + + +LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { + if (luaL_callmeta(L, idx, "__tostring")) { /* metafield? */ + if (!lua_isstring(L, -1)) + luaL_error(L, "'__tostring' must return a string"); + } + else { + switch (lua_type(L, idx)) { + case LUA_TNUMBER: { + if (lua_isinteger(L, idx)) + lua_pushfstring(L, "%I", (LUAI_UACINT)lua_tointeger(L, idx)); + else + lua_pushfstring(L, "%f", (LUAI_UACNUMBER)lua_tonumber(L, idx)); + break; + } + case LUA_TSTRING: + lua_pushvalue(L, idx); + break; + case LUA_TBOOLEAN: + lua_pushstring(L, (lua_toboolean(L, idx) ? "true" : "false")); + break; + case LUA_TNIL: + lua_pushliteral(L, "nil"); + break; + default: { + int tt = luaL_getmetafield(L, idx, "__name"); /* try name */ + const char *kind = (tt == LUA_TSTRING) ? lua_tostring(L, -1) : + luaL_typename(L, idx); + lua_pushfstring(L, "%s: %p", kind, lua_topointer(L, idx)); + if (tt != LUA_TNIL) + lua_remove(L, -2); /* remove '__name' */ + break; + } + } + } + return lua_tolstring(L, -1, len); +} + + +/* +** set functions from list 'l' into table at top - 'nup'; each +** function gets the 'nup' elements at the top as upvalues. +** Returns with only the table at the stack. +*/ +LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) { + luaL_checkstack(L, nup, "too many upvalues"); + for (; l->name != NULL; l++) { /* fill the table with given functions */ + int i; + for (i = 0; i < nup; i++) /* copy upvalues to the top */ + lua_pushvalue(L, -nup); + lua_pushcclosure(L, l->func, nup); /* closure with those upvalues */ + lua_setfield(L, -(nup + 2), l->name); + } + lua_pop(L, nup); /* remove upvalues */ +} + + +/* +** ensure that stack[idx][fname] has a table and push that table +** into the stack +*/ +LUALIB_API int luaL_getsubtable (lua_State *L, int idx, const char *fname) { + if (lua_getfield(L, idx, fname) == LUA_TTABLE) + return 1; /* table already there */ + else { + lua_pop(L, 1); /* remove previous result */ + idx = lua_absindex(L, idx); + lua_newtable(L); + lua_pushvalue(L, -1); /* copy to be left at top */ + lua_setfield(L, idx, fname); /* assign new table to field */ + return 0; /* false, because did not find table there */ + } +} + + +/* +** Stripped-down 'require': After checking "loaded" table, calls 'openf' +** to open a module, registers the result in 'package.loaded' table and, +** if 'glb' is true, also registers the result in the global table. +** Leaves resulting module on the top. +*/ +LUALIB_API void luaL_requiref (lua_State *L, const char *modname, + lua_CFunction openf, int glb) { + luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + lua_getfield(L, -1, modname); /* LOADED[modname] */ + if (!lua_toboolean(L, -1)) { /* package not already loaded? */ + lua_pop(L, 1); /* remove field */ + lua_pushcfunction(L, openf); + lua_pushstring(L, modname); /* argument to open function */ + lua_call(L, 1, 1); /* call 'openf' to open module */ + lua_pushvalue(L, -1); /* make copy of module (call result) */ + lua_setfield(L, -3, modname); /* LOADED[modname] = module */ + } + lua_remove(L, -2); /* remove LOADED table */ + if (glb) { + lua_pushvalue(L, -1); /* copy of module */ + lua_setglobal(L, modname); /* _G[modname] = module */ + } +} + + +LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p, + const char *r) { + const char *wild; + size_t l = strlen(p); + luaL_Buffer b; + luaL_buffinit(L, &b); + while ((wild = strstr(s, p)) != NULL) { + luaL_addlstring(&b, s, wild - s); /* push prefix */ + luaL_addstring(&b, r); /* push replacement in place of pattern */ + s = wild + l; /* continue after 'p' */ + } + luaL_addstring(&b, s); /* push last suffix */ + luaL_pushresult(&b); + return lua_tostring(L, -1); +} + + +static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { + (void)ud; (void)osize; /* not used */ + if (nsize == 0) { + free(ptr); + return NULL; + } + else + return realloc(ptr, nsize); +} + + +static int panic (lua_State *L) { + lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n", + lua_tostring(L, -1)); + return 0; /* return to Lua to abort */ +} + + +/* +** Emit a warning. '*previoustocont' signals whether previous message +** was to be continued by the current one. +*/ +static void warnf (void *ud, const char *message, int tocont) { + int *previoustocont = (int *)ud; + if (!*previoustocont) /* previous message was the last? */ + lua_writestringerror("%s", "Lua warning: "); /* start a new warning */ + lua_writestringerror("%s", message); /* write message */ + if (!tocont) /* is this the last part? */ + lua_writestringerror("%s", "\n"); /* finish message with end-of-line */ + *previoustocont = tocont; +} + + +LUALIB_API lua_State *luaL_newstate (void) { + lua_State *L = lua_newstate(l_alloc, NULL); + if (L) { + int *previoustocont; /* space for warning state */ + lua_atpanic(L, &panic); + previoustocont = (int *)lua_newuserdatauv(L, sizeof(int), 0); + luaL_ref(L, LUA_REGISTRYINDEX); /* make sure it won't be collected */ + *previoustocont = 0; /* next message starts a new warning */ + lua_setwarnf(L, warnf, previoustocont); + } + return L; +} + + +LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver, size_t sz) { + lua_Number v = lua_version(L); + if (sz != LUAL_NUMSIZES) /* check numeric types */ + luaL_error(L, "core and library have incompatible numeric types"); + else if (v != ver) + luaL_error(L, "version mismatch: app. needs %f, Lua core provides %f", + (LUAI_UACNUMBER)ver, (LUAI_UACNUMBER)v); +} + diff --git a/source/lua/lauxlib.h b/source/lua/lauxlib.h new file mode 100644 index 0000000..e5d378a --- /dev/null +++ b/source/lua/lauxlib.h @@ -0,0 +1,262 @@ +/* +** $Id: lauxlib.h $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lauxlib_h +#define lauxlib_h + + +#include +#include + +#include "lua.h" + + +/* global table */ +#define LUA_GNAME "_G" + + + +/* extra error code for 'luaL_loadfilex' */ +#define LUA_ERRFILE (LUA_ERRERR+1) + + +/* key, in the registry, for table of loaded modules */ +#define LUA_LOADED_TABLE "_LOADED" + + +/* key, in the registry, for table of preloaded loaders */ +#define LUA_PRELOAD_TABLE "_PRELOAD" + + +typedef struct luaL_Reg { + const char *name; + lua_CFunction func; +} luaL_Reg; + + +#define LUAL_NUMSIZES (sizeof(lua_Integer)*16 + sizeof(lua_Number)) + +LUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver, size_t sz); +#define luaL_checkversion(L) \ + luaL_checkversion_(L, LUA_VERSION_NUM, LUAL_NUMSIZES) + +LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); +LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); +LUALIB_API const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len); +LUALIB_API int (luaL_argerror) (lua_State *L, int arg, const char *extramsg); +LUALIB_API int (luaL_typeerror) (lua_State *L, int arg, const char *tname); +LUALIB_API const char *(luaL_checklstring) (lua_State *L, int arg, + size_t *l); +LUALIB_API const char *(luaL_optlstring) (lua_State *L, int arg, + const char *def, size_t *l); +LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int arg); +LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int arg, lua_Number def); + +LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int arg); +LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int arg, + lua_Integer def); + +LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); +LUALIB_API void (luaL_checktype) (lua_State *L, int arg, int t); +LUALIB_API void (luaL_checkany) (lua_State *L, int arg); + +LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); +LUALIB_API void (luaL_setmetatable) (lua_State *L, const char *tname); +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_where) (lua_State *L, int lvl); +LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); + +LUALIB_API int (luaL_checkoption) (lua_State *L, int arg, const char *def, + const char *const lst[]); + +LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname); +LUALIB_API int (luaL_execresult) (lua_State *L, int stat); + + +/* predefined references */ +#define LUA_NOREF (-2) +#define LUA_REFNIL (-1) + +LUALIB_API int (luaL_ref) (lua_State *L, int t); +LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); + +LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename, + const char *mode); + +#define luaL_loadfile(L,f) luaL_loadfilex(L,f,NULL) + +LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz, + const char *name, const char *mode); +LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); + +LUALIB_API lua_State *(luaL_newstate) (void); + +LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx); + +LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, + const char *r); + +LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup); + +LUALIB_API int (luaL_getsubtable) (lua_State *L, int idx, const char *fname); + +LUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1, + const char *msg, int level); + +LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname, + lua_CFunction openf, int glb); + +/* +** =============================================================== +** some useful macros +** =============================================================== +*/ + + +#define luaL_newlibtable(L,l) \ + lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1) + +#define luaL_newlib(L,l) \ + (luaL_checkversion(L), luaL_newlibtable(L,l), luaL_setfuncs(L,l,0)) + +#define luaL_argcheck(L, cond,arg,extramsg) \ + ((void)((cond) || luaL_argerror(L, (arg), (extramsg)))) + +#define luaL_argexpected(L,cond,arg,tname) \ + ((void)((cond) || luaL_typeerror(L, (arg), (tname)))) + +#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) +#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) + +#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) + +#define luaL_dofile(L, fn) \ + (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_dostring(L, s) \ + (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) + +#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) + +#define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL) + + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + +typedef struct luaL_Buffer { + char *b; /* buffer address */ + size_t size; /* buffer size */ + size_t n; /* number of characters in buffer */ + lua_State *L; + union { + LUAI_MAXALIGN; /* ensure maximum alignment for buffer */ + char b[LUAL_BUFFERSIZE]; /* initial buffer */ + } init; +} luaL_Buffer; + + +#define luaL_addchar(B,c) \ + ((void)((B)->n < (B)->size || luaL_prepbuffsize((B), 1)), \ + ((B)->b[(B)->n++] = (c))) + +#define luaL_addsize(B,s) ((B)->n += (s)) + +LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); +LUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz); +LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); +LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s); +LUALIB_API void (luaL_addvalue) (luaL_Buffer *B); +LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); +LUALIB_API void (luaL_pushresultsize) (luaL_Buffer *B, size_t sz); +LUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz); + +#define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE) + +/* }====================================================== */ + + + +/* +** {====================================================== +** File handles for IO library +** ======================================================= +*/ + +/* +** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and +** initial structure 'luaL_Stream' (it may contain other fields +** after that initial structure). +*/ + +#define LUA_FILEHANDLE "FILE*" + + +typedef struct luaL_Stream { + FILE *f; /* stream (NULL for incompletely created streams) */ + lua_CFunction closef; /* to close stream (NULL for closed streams) */ +} luaL_Stream; + +/* }====================================================== */ + +/* +** {================================================================== +** "Abstraction Layer" for basic report of messages and errors +** =================================================================== +*/ + +/* print a string */ +#if !defined(lua_writestring) +#define lua_writestring(s,l) fwrite((s), sizeof(char), (l), stdout) +#endif + +/* print a newline and flush the output */ +#if !defined(lua_writeline) +#define lua_writeline() (lua_writestring("\n", 1), fflush(stdout)) +#endif + +/* print an error message */ +#if !defined(lua_writestringerror) +#define lua_writestringerror(s,p) \ + (fprintf(stderr, (s), (p)), fflush(stderr)) +#endif + +/* }================================================================== */ + + +/* +** {============================================================ +** Compatibility with deprecated conversions +** ============================================================= +*/ +#if defined(LUA_COMPAT_APIINTCASTS) + +#define luaL_checkunsigned(L,a) ((lua_Unsigned)luaL_checkinteger(L,a)) +#define luaL_optunsigned(L,a,d) \ + ((lua_Unsigned)luaL_optinteger(L,a,(lua_Integer)(d))) + +#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) +#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) + +#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) +#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) + +#endif +/* }============================================================ */ + + + +#endif + + diff --git a/source/lua/lauxlib.o b/source/lua/lauxlib.o new file mode 100644 index 0000000000000000000000000000000000000000..5d5e622919cc9a569f93e738b51be08c2a3f73e0 GIT binary patch literal 28472 zcmb_^4R}=5wf0GZ5(!R1)f$!RK?e*4W8yDZsu?nY6BrN#6h#d~G9iI5lTOa?qh5ZT z1UZeN+^6lm+SW>+YrXcX&n@@1RqAi}FD37RiYrGv1@AYRW6Lp1qV!G8&5b(@PzdM>~^%I3axCK9lInaWc)%%nsjgrq& zq2Fn}b{>1!of-CCN1o!Sy6EN$Xrph^+sl-K!tUOCpm^cnP{ruRg#(r%=zi&GFEX{^ zJ8MD3&uM%A-RQT_oX~7Ec+M=<*=TdI7CcUUsoJXd)q6YCt<&QaO!E%G9Hb|;rMfrE zQ*~(`a>*a`O?rFr=2O8XB}2Et{c42&!QQi+#z5EZm1j9U@iNC7vWvJd^&!Uc*~ZoM}s*uO*Bp}M#KS*nTqvwJXl)Z33P zx!vjhHdPSu{fU%~e|KE%BxiC=k2C_IiiMEz5 z?|57OZiUso==S1mDBrc)@jiBo9q+k5QZv(o%m~d6Jw^B&$2(45y=ySt^^Z2=y*|CY zAXNI;?BL1qdsCM=jc0^bPY7B)QwqG2b>TD0+ymRG zcq-V73#X?uc$B^|P_zSwgJn)nIB4$*2aC&)gYThLiV+T$YtKLn(9Jad^*zc`#4$Je zd(C!Idmat5)wt09|H3Tqc=bmrrsY^NY0PM>>vX%pG99GIPY|Ilbzoi0D7)R*H19R< z9aF-L7_u?V3dWx>DWvu|-B1++%t!8jzIg*s?;X<*TIH+=HLs{CA@wQ6Pc@2CL&^HZ z{j2r3&JCy-C;hKAZ^+JPI-Y%jcy^4!M*7`yr^gLy5B6S(ct;$LWl+TNwmIE1ik3mDC+ zz!2n_m1bexdDZ(6`{(6MU~0l8zcvFRGd6VWq$$W`swvjoIPl|~nOluP1XORY8aZNq z(&~Js=xkd(x6M=Gc7yh}{iOC6SU6?Wr8QWiS`45owyBb|9*B_hACc0IJV9zI^;rIq zu3ohUP#xivhF{V+)N{O-Xs}@t&8*jG8qg70O|2FwLd&*{BCy(dPS;^~6fx0o*kImm z%E|i5K7)OLqRlz-Kv9Hww^jG{^)NwKZu8c+fqN>Q%!CAAN{7E}~==M+p z0(K-=Zj|CG`o=05tHHEPmJ-%?hRVpD-}Urv!U|S3ZV3+pij;Jz=Gb|+sUXt#r zCwEta%jr&(JKZ;7C3>~d-RY^do$*EP7-Nzr1{lVGHKP*6=WW+B0IBNjLn+^=we{<$VTL4rHX zX~fF2XGTHII(JYNVz=${jsJ$wx=v`a!yQ5^sS0IDikLIi(C0ldSu&^l;XG@$llA5J zW>t2E2UQIrRr7lyB={|)rv>jEa9eVu( z>YmhkGG<-%Nm>|n9YbCJQ(LMalbJuIQX7w+JlS`Sj&BlQM|c6pJzAl9S0EN+%4FsB zz`?*O-?l+buh{)!lShkL_WA$9f*r%6E;Eq~hXBldI-8cLYD&j?n#=#ETo2^LyX-oS z`$os%u3m4Odl~BR1#b#sFw#j=Q!y<`wq^T=@^hjdElxx}uZLA^MY!_xJc>s`?wo9- zNuMZGOMmz5EJkt31b{7ho|Q zLn>{h+*}op>G>J$x6n9cqwx6G+zW-*sumeV-y`2vD`3(ap^Elv^!&~27E~sP_T8!dlD0s@reWQ9 zK7}$GJM?fx^VO3Xev*UdEZFsD>vOvH(E{S?ipmSV$IE|!VIQN^fd^pm((cYHR?3?4GYRufEjd{zb=jjj;m z$;c}grMh}oejT)OHe|n-i3b@GG$eKZ>IX6C2kiJ~^MgE0yijT=wg>^pDT{coDTip@ zpd=cbd=rW(ofV+6GMz6>Srn~`h#Aw9h*LXKM z4=pNqYJvWvvKk{iRqxi%Wif|gHq~>HdVNzy!Y^Gwe zg^WZ9qi{^v7}{q2k!O2qqc7$_*UNIM()+W_^H@C|;8x`Pnf}bSE`6fFZ7p5jjokE! zB6k#GSZUV-xXV)dH<|UaZh8Mk(Vw)TRn*eXw^2%U6Hfr-fM#vGNRP*?P{rx$<=tW3 zQDfG=8ZbA&t%tJ|U1#5Dz*&1JBV>g^X-wOton1M4LnOyq@4b4}ze>9Z?acMM0*^Vk zH!;nZcJ4q&0PxKfIg@?g&%kNc&nJw6$`h36K1{#ZGu2pX_Ep`YaH@ZYsVa9}!v^ZV zC)b~`zN@G3LyxsTr^njfd%EMzioZU6t>s2T&!R#sSq_Ir9|?W@w@m+b9bS2U^?|It zuz1DB4M9q&GyZR>_v*Ws7JKgitWWRM2L$!qHy#apUz!abRgiidBMuu0V8)L^4IjVA z%Tno|w2}7I^Mm)DkDu3}3Xh~F<8xD4qQTaBq$ zqG}Zn6&|KO*y4DLF=3TB-tV2FS~Y!X1^C>CR}4m1r|}SrO8wSgm@;XrVQzJ2?E-=! zysM^|zD*v6OeyFRQk`z{Lp`aJ>M4x@SXU~L)!ca(ns;CBbkD*Lcb76W8q#+e`7R1r*{XM)#d%v@N5SV5tg2pe;L>U9H;k zL8dJTlEqE|I^4HD(=E)}huTS=e<+Prnihzb{x;J-$9vyd^Qna;hU2~H^n`53TY=4I zh&P|1Vx3j6>{M+DHrk*2E{8llzv=Z0J%mzSiL*mB2e{#!cp#QU^ehm1VUwo{D0`SO zue{`-xvSnc&)Z8YrHsCr^^M-nsiCf)?V&e9-X8X*cXEX0+`xx#$p$V{Q;x2*6Q+3? z9m*SB@)spV%U7LDPaieGOc|Joi1#Jgn_RwnUnCoP#iRV}L`ig-D_Lz>2lk@0um(eA z_BqOvXg^!;og_0j-e1TYk7KT@_nyN6Mg@9NaVdt<;X=f_D~Qg-Sp#W97u=mVHaiO@ zg}zgI#^O0QxUq+!vMpZy)OZ96PVwnf_o@$fsjGgRSo2)xtW<_R~;#U?9BdM8&vg^ z+OU}Yud}wq{NHN?|vlnMw$&(b2jv9&NK?%UfNmp&=e!60&YZ8kNs12?0srO~!j%#JN@k2SinChOZBZc}UAs)6m2 zR-!!?w~`C2WK3VhqD@v?>%tb-PIbhRO;I;W^_sF{?S-l{tkyV$wl>*`_N;zxG8MC$ zqir2ASj0_qxJlU98d-0RY_{U9s(2(ZaJLNn@>@#&d1 zCGwwGJds-1VlRm;NhDX;%_zi`qFkaeN{z7MsU-`bMoYBAjwc}0jV;7&GS;4qb-<4_ z3GxyP7NK^#Ef!zsw%D!2cI{}~l&~(&w*F#!Nvgwz3^$dG+fkcsqSUe)6Ui9LHQ8;g z3zAW&)e>DAgOtX^l6F+Kpe<%YrC74H(RNp~$2xQ=%YuV-kW(ya?N}0Z8(XfiqwVdL zc03kq!YFATtBjz8!%$0Gn_`5T!vB-+$+a+d#heAHxSO)Cth}PK>XNHc>aKca^;MNs zS5#J4kJcIXWmVNzRb5pz9`euRItuQ%!75l@R&d_X!NnU8xhb*^=e&#fdn~@I`1&-8 z?l%O=?kx-j%GVZ!19p1QO+&T?%0oK?WfS)ViYJ#?HK5GLhtgsCGclJxIZ#!2_mF@+ z38heo%G`)s2-LTeN-XON6nluuA|>e$Wb_nH43ytXb*>#03RI*|sfVE1fr?40EC>)) z0qV=dN4k~%Wa|!*u5*W&T0$k%u3~Br(ogA6maE!TxFACgLnURiam>G#_~Ag=ia@c# zXE1IPK08o075F$@wlMx{!j=5V8M_ra8Tn30N?e0V?RbdGE}*h7O}cP$U_-&OA%U_` zpx7yytG=1Lm$|!{yO#PVT{JClw4m^D)nt@GUJX8*` z?1q3{xF}FwtIS)Dtg+0yfO+Y{o0Tmc+&i4tLwN()VG4ZomLY)(cocd>8)8aHI8Xug zG5`*{Q2YlhYYxfE>N6!^-+)F>R{EeQu91oEBr)an+6y8m@&cFt53&bp`W}s!^+k07 zyJyhEK*hbMVBoDiH53?^9(+S!Z$Z(F!Xbfip+FVJ(!_ubuGTI@cBSziq$LW{mGmd8 zPkq3qPS85kkq+n^@-8Yfm&@FgTV`^=PNIxfb}E(8#Z|nym&>RZr%;Y!&_>2gETXaW z8^*Si?5wTfVjK^q!`9z{t$}1rTUVmS(orsZ1C@ooGJbsr9#YR9LUtUkp0!(6Pp%zd zBeo-K#&*Q`swrAokl&8v^KC3o`49Zy7T78Xyp!>3a4qaREl|~xu@Cvhqs&{I%Y$D` z6a7#a!i{#?sU2Ex6o9E>}B1x!IX=6H6LIInwkI1w?xp!>?J40vRr=Hw+Tk+8 zCtNZM2s$T&zy(!*yDV=C$wO;7-qZ(b?#lExjiH|~PuWcJsvwyM+tiXNnKGp7UM`a+ z+1Wl;F%ZN4W`uA(=+M!%C2jJyu4I z4N#84ks&MpXYNemX4^^2128c;AgIu|f0TJ|(7c7Vt*7jsB8*4b5AD8wm|hYF{ScS^ z7hF@>uf#<3VP-7X6t)M(P5MeeBps?wBLS9m0qgJ;zrv_3B*&7m2WugUWo=ycLM1`Z z?W-9Z$WE;p|E?>c@{cn2Yh0fCq?a-3D`C57GB$@O&gyAH_2Y+J<{m1O^${$e(u2t8 zIn(}Bt$PJ8(3LNuSOq>47+aVtNBKtKEh_TB%kY#9`7O--lDS{8+iYENj@`l~6kafA zWQHiT(XnYW%iGTK{!V|+2)tHYc>h2%9Lkda4I-gPsvTMXn~M2=w(&oTzhjw~B6608 zD98&$_^CrG^Q1OM%*#|{phRvo$a??eKzT(2zAQU0*iwTu8p0R zU1SaQA^Nrmk5&AMUYVgj^QZd&41_ zKj-1o9+mht9BOuJy7j9({N6nHA6QNqhoCoE&P#dt2lL>^SeIW1x#N~nPKMXk8xtIB7 z1{%ruUdGKn@N&kFGQM5aiZw|d`Sp45IeGA=Ja{4xekX9He?Tju_LsO^%eY;takZDk z<9Tp;?P4JQcHpG{reRu7<8S*J-^;k#qk{5Q9y#wazl;~D zYqdD*%RKzk5MQX?jm+<4emU@g^c>0jsxvf^)|Qm6WPCN_W}O;lyqED>O}B1jyo@&H zNKN|7YBq8hznAf4zz5Q2rIB-%CQf1g_ww)`VE%mO8$BOod?Vv&mP5xw1J(OS=2v}P z6RVhiz{qEO8smL=7|MK}hd&7Mo%*Yc7es0=2L2hq2h!8dgIDIkC*;AW z0H=B_UU&Tqw`*=5erq25&OG=%dGPhXsouS`&_%jXe_0zDpTX-oc3*1~VB9GrEu-Vs}nSZ?97 zu+hS4Q9GS25n9tNHby8W4 ziS`vZc0>d+2-~n&d-_~8e4Ei+1v&; z?4)f6CJy-OuWx`hjU+76u&gDP)Xe~J*8sf}n$PJsx_8EageF_7;T#m$+ru28XY(5ml9 zn`~Pe=vH)kL;*UVJXefVgj-oJ8PiscF6h9Bi7h9T91?oAs%tmF*34w#jMT8u zTE&Vqq~a_o0`H1q=(RysGaWx)bp<&RUy*dmw{SL0-P^3sf%W0FQiyW(F|Mjmi({|E z7gruJhRpViR$8};hF;cx=uVA$Re`c#rbF2NW~}mUjuCMjo^!7R=reK*j%4E!HJrJm zK5u5r=^JhbN@O#cEgiMBLuQkFeORqqL}%gTI7%|zEY`T`jEr5}oMGSE!KNd_x1x*H z`8TU4h6RrH+f_%a5f`B_MbWZDG0CkOsiRUnqA_I57)&i?VY(x67T<_KqYN#Brbe=H zGIO6*PlZu2w2Yr-J(mJWYC&dTMjDa`o2|x!p|TG1TJ}OvseACh2B0)X8Hd)Ko2c6! zjkl_}MGdDHQPiN|PU55a1`^Z2HZQ-pTl@dHp5l&OM!Pf|!reuS!7dTD5 z27gfCw4^ZjZv;+LufY!poTf~J9}>8%_b}tMP2;VvLXHc*jcX%kFqTx5s9jS2nF1ey zJi{L&a9J-s@1R6-F2u+1Z)V)+L-~|qf`1Y24S$i3k7cMz%LG3t_&*Z(NP$1-lVhHo zsh@X(M|zAB{ND>XvR&`w!Hc;e^koY<=L%ff^J0NZ`LzPSSjd?o@Ct$7EO6Q0#f%#} zo3$N1N1#Msqwz6zUL$a+=X!xlJr4-{n?lYf0v{uA+P71p?6LTmdM{zz=y@rTkj4xC zCAc^I8i7kWbpo#x{22n5eA?$zGWA}jZ>?K=xY4Is$dURi5xA6}6u8tUEpW+S$GFjF z1nbk|!;L=o3prAsjRKeQe=cyT&r<@I{Yf-m)XMc`7-8v>X5 zoWcW~{G4t=#{^EkX84~8 z{3?Nu!hVbr=_&1SDdR@ZTNMlEE`l%ZK>I*ShEL}wl%hU7tzm1ikVAcL^jz=b$C!U# z9{w+U{7KCJw>_Fql_|F`{m+gH( z;1>%yzZAG!hdeHDIbUpL+}QtTkVR>a;7dRJi@?bTjsEWoe1gCW`1v>4LDoA|;I`mj z%ec|!SIDDO>%$+>uywPLBiq{~a2s5sXF}jo|1QS;_5M>H{KrC$Z0~-72SvT+{Q|Os zoHsuf{Obh2ke|~N-xl~_#*Ln4U3jM8*9iUyfrkWMEpW-dP2f`hPJv6m{bzyK3HiSi zxRmp>z~wr2zrdw^PN#+;G+b7N`Ok~@gn7)E%57+Z{&;;_zZzxDR4UbF#O2^mv+8M z;PkA(@D~ewmcV-iF6;e~z$O0|0+;pvS>Uo=uLxYqe^=mA{>K8B^W%h4D2+t@DE((9 zY@yG&0-q;vN8r*vHwpRD{tbdJ?Xy_m(mtI+4$Z&ISvP71!1^Np|RnyAh?A?Ip=+X4>@e7?YM6}as8 zR)NcY_wwM6FmC$StQ-GB@Eb(ETLdoS=Wd^zPPX&@Jp5M$zCg%7?343-mh++D%eZmg z87PcI_LP1V7C6nlroR>mJSy-Wfy;J1AaJSY9|bP!?Gw1%CFn z(%tKp^8_yK@Q;ie{U3oWO7{!C)c;|Dr@%AqdP3mRKF2D!{OZ!h1xEwEY1-=Y&O}&kb8$A!Oo=XH@+HIY{<$Ux*flGh;nZOr`dLL%o z)cXS0`)k3M_5M-dG7i5aaM`XmeDY1Z4hz1Nf7Urx=x|E|Dm1^#1!OFwy7;CBlCHi6$I@QbODNTjyJR|{Oun|~6x^pj%( zmvT-cXGJ3UbZP9cUf}Zi)z1Yk`I`hT=Zj|rew~oNN8r+b{wnYq!MFJREYpvJkVk14 zYKaBZ2?R4vE$1mf+ z^oS2PzY{U@ypdym4`Lc`aP#|)FabygH!rQ+<-?8rf8fK-?>qMTaPxbOV&R8GF~8TS z^5N!p77-tAeot|q4_6a9=hHw#qJJ8Q64gl`oBjJ%A3mS)4L-b=@rQi4`5nY& zA8vjJ@u3gz<>!6$9yXL%~Fne&!65)miR{A=i8^|;^w{m zHXm-@+keQ1oA>r#_TlEe{R-L)AenZpK2zT>_u*x{pWNuf&3pJS_;B+cKK^AXm5hAz zzWuE}d_FIx*7Cn zW#yPRm*HC`Q~n%sE|HA>=KFf&(Y3$4`QgX4hR8CE{S4g5<$cvyH5cgu zW}fHbmTfNh`*wT})PIjOX~KNwQU6ihrhe0Zi-D0Y{(9QE{;QBDlhNCJyT~-xlJ_u| zml$39xgKNw_CLbqTX;MhIYxhT--(NX+F#7$i+=AziP}#`m8QID|1e-h`1sTOMH>0O qFT<}t-TQT?B4wBAg5!8zrg2AGT7Uf%J_oAbnV`$J`v$hZ{{I887b!ge literal 0 HcmV?d00001 diff --git a/source/lua/lbaselib.c b/source/lua/lbaselib.c new file mode 100644 index 0000000..d4b619a --- /dev/null +++ b/source/lua/lbaselib.c @@ -0,0 +1,522 @@ +/* +** $Id: lbaselib.c $ +** Basic library +** See Copyright Notice in lua.h +*/ + +#define lbaselib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +static int luaB_print (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int i; + lua_getglobal(L, "tostring"); + for (i=1; i<=n; i++) { + const char *s; + size_t l; + lua_pushvalue(L, -1); /* function to be called */ + lua_pushvalue(L, i); /* value to print */ + lua_call(L, 1, 1); + s = lua_tolstring(L, -1, &l); /* get result */ + if (s == NULL) + return luaL_error(L, "'tostring' must return a string to 'print'"); + if (i>1) lua_writestring("\t", 1); + lua_writestring(s, l); + lua_pop(L, 1); /* pop result */ + } + lua_writeline(); + return 0; +} + + +static int luaB_warn (lua_State *L) { + const char *msg = luaL_checkstring(L, 1); + lua_warning(L, msg, lua_toboolean(L, 2)); + return 0; +} + + +#define SPACECHARS " \f\n\r\t\v" + +static const char *b_str2int (const char *s, int base, lua_Integer *pn) { + lua_Unsigned n = 0; + int neg = 0; + s += strspn(s, SPACECHARS); /* skip initial spaces */ + if (*s == '-') { s++; neg = 1; } /* handle sign */ + else if (*s == '+') s++; + if (!isalnum((unsigned char)*s)) /* no digit? */ + return NULL; + do { + int digit = (isdigit((unsigned char)*s)) ? *s - '0' + : (toupper((unsigned char)*s) - 'A') + 10; + if (digit >= base) return NULL; /* invalid numeral */ + n = n * base + digit; + s++; + } while (isalnum((unsigned char)*s)); + s += strspn(s, SPACECHARS); /* skip trailing spaces */ + *pn = (lua_Integer)((neg) ? (0u - n) : n); + return s; +} + + +static int luaB_tonumber (lua_State *L) { + if (lua_isnoneornil(L, 2)) { /* standard conversion? */ + if (lua_type(L, 1) == LUA_TNUMBER) { /* already a number? */ + lua_settop(L, 1); /* yes; return it */ + return 1; + } + else { + size_t l; + const char *s = lua_tolstring(L, 1, &l); + if (s != NULL && lua_stringtonumber(L, s) == l + 1) + return 1; /* successful conversion to number */ + /* else not a number */ + luaL_checkany(L, 1); /* (but there must be some parameter) */ + } + } + else { + size_t l; + const char *s; + lua_Integer n = 0; /* to avoid warnings */ + lua_Integer base = luaL_checkinteger(L, 2); + luaL_checktype(L, 1, LUA_TSTRING); /* no numbers as strings */ + s = lua_tolstring(L, 1, &l); + luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range"); + if (b_str2int(s, (int)base, &n) == s + l) { + lua_pushinteger(L, n); + return 1; + } /* else not a number */ + } /* else not a number */ + lua_pushnil(L); /* not a number */ + return 1; +} + + +static int luaB_error (lua_State *L) { + int level = (int)luaL_optinteger(L, 2, 1); + lua_settop(L, 1); + if (lua_type(L, 1) == LUA_TSTRING && level > 0) { + luaL_where(L, level); /* add extra information */ + lua_pushvalue(L, 1); + lua_concat(L, 2); + } + return lua_error(L); +} + + +static int luaB_getmetatable (lua_State *L) { + luaL_checkany(L, 1); + if (!lua_getmetatable(L, 1)) { + lua_pushnil(L); + return 1; /* no metatable */ + } + luaL_getmetafield(L, 1, "__metatable"); + return 1; /* returns either __metatable field (if present) or metatable */ +} + + +static int luaB_setmetatable (lua_State *L) { + int t = lua_type(L, 2); + luaL_checktype(L, 1, LUA_TTABLE); + luaL_argexpected(L, t == LUA_TNIL || t == LUA_TTABLE, 2, "nil or table"); + if (luaL_getmetafield(L, 1, "__metatable") != LUA_TNIL) + return luaL_error(L, "cannot change a protected metatable"); + lua_settop(L, 2); + lua_setmetatable(L, 1); + return 1; +} + + +static int luaB_rawequal (lua_State *L) { + luaL_checkany(L, 1); + luaL_checkany(L, 2); + lua_pushboolean(L, lua_rawequal(L, 1, 2)); + return 1; +} + + +static int luaB_rawlen (lua_State *L) { + int t = lua_type(L, 1); + luaL_argexpected(L, t == LUA_TTABLE || t == LUA_TSTRING, 1, + "table or string"); + lua_pushinteger(L, lua_rawlen(L, 1)); + return 1; +} + + +static int luaB_rawget (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checkany(L, 2); + lua_settop(L, 2); + lua_rawget(L, 1); + return 1; +} + +static int luaB_rawset (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checkany(L, 2); + luaL_checkany(L, 3); + lua_settop(L, 3); + lua_rawset(L, 1); + return 1; +} + + +static int pushmode (lua_State *L, int oldmode) { + lua_pushstring(L, (oldmode == LUA_GCINC) ? "incremental" : "generational"); + return 1; +} + + +static int luaB_collectgarbage (lua_State *L) { + static const char *const opts[] = {"stop", "restart", "collect", + "count", "step", "setpause", "setstepmul", + "isrunning", "generational", "incremental", NULL}; + static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, + LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL, + LUA_GCISRUNNING, LUA_GCGEN, LUA_GCINC}; + int o = optsnum[luaL_checkoption(L, 1, "collect", opts)]; + switch (o) { + case LUA_GCCOUNT: { + int k = lua_gc(L, o); + int b = lua_gc(L, LUA_GCCOUNTB); + lua_pushnumber(L, (lua_Number)k + ((lua_Number)b/1024)); + return 1; + } + case LUA_GCSTEP: { + int step = (int)luaL_optinteger(L, 2, 0); + int res = lua_gc(L, o, step); + lua_pushboolean(L, res); + return 1; + } + case LUA_GCSETPAUSE: + case LUA_GCSETSTEPMUL: { + int p = (int)luaL_optinteger(L, 2, 0); + int previous = lua_gc(L, o, p); + lua_pushinteger(L, previous); + return 1; + } + case LUA_GCISRUNNING: { + int res = lua_gc(L, o); + lua_pushboolean(L, res); + return 1; + } + case LUA_GCGEN: { + int minormul = (int)luaL_optinteger(L, 2, 0); + int majormul = (int)luaL_optinteger(L, 3, 0); + return pushmode(L, lua_gc(L, o, minormul, majormul)); + } + case LUA_GCINC: { + int pause = (int)luaL_optinteger(L, 2, 0); + int stepmul = (int)luaL_optinteger(L, 3, 0); + int stepsize = (int)luaL_optinteger(L, 4, 0); + return pushmode(L, lua_gc(L, o, pause, stepmul, stepsize)); + } + default: { + int res = lua_gc(L, o); + lua_pushinteger(L, res); + return 1; + } + } +} + + +static int luaB_type (lua_State *L) { + int t = lua_type(L, 1); + luaL_argcheck(L, t != LUA_TNONE, 1, "value expected"); + lua_pushstring(L, lua_typename(L, t)); + return 1; +} + + +static int luaB_next (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + lua_settop(L, 2); /* create a 2nd argument if there isn't one */ + if (lua_next(L, 1)) + return 2; + else { + lua_pushnil(L); + return 1; + } +} + + +static int luaB_pairs (lua_State *L) { + luaL_checkany(L, 1); + if (luaL_getmetafield(L, 1, "__pairs") == LUA_TNIL) { /* no metamethod? */ + lua_pushcfunction(L, luaB_next); /* will return generator, */ + lua_pushvalue(L, 1); /* state, */ + lua_pushnil(L); /* and initial value */ + } + else { + lua_pushvalue(L, 1); /* argument 'self' to metamethod */ + lua_call(L, 1, 3); /* get 3 values from metamethod */ + } + return 3; +} + + +/* +** Traversal function for 'ipairs' +*/ +static int ipairsaux (lua_State *L) { + lua_Integer i = luaL_checkinteger(L, 2) + 1; + lua_pushinteger(L, i); + return (lua_geti(L, 1, i) == LUA_TNIL) ? 1 : 2; +} + + +/* +** 'ipairs' function. Returns 'ipairsaux', given "table", 0. +** (The given "table" may not be a table.) +*/ +static int luaB_ipairs (lua_State *L) { + luaL_checkany(L, 1); + lua_pushcfunction(L, ipairsaux); /* iteration function */ + lua_pushvalue(L, 1); /* state */ + lua_pushinteger(L, 0); /* initial value */ + return 3; +} + + +static int load_aux (lua_State *L, int status, int envidx) { + if (status == LUA_OK) { + if (envidx != 0) { /* 'env' parameter? */ + lua_pushvalue(L, envidx); /* environment for loaded function */ + if (!lua_setupvalue(L, -2, 1)) /* set it as 1st upvalue */ + lua_pop(L, 1); /* remove 'env' if not used by previous call */ + } + return 1; + } + else { /* error (message is on top of the stack) */ + lua_pushnil(L); + lua_insert(L, -2); /* put before error message */ + return 2; /* return nil plus error message */ + } +} + + +static int luaB_loadfile (lua_State *L) { + const char *fname = luaL_optstring(L, 1, NULL); + const char *mode = luaL_optstring(L, 2, NULL); + int env = (!lua_isnone(L, 3) ? 3 : 0); /* 'env' index or 0 if no 'env' */ + int status = luaL_loadfilex(L, fname, mode); + return load_aux(L, status, env); +} + + +/* +** {====================================================== +** Generic Read function +** ======================================================= +*/ + + +/* +** reserved slot, above all arguments, to hold a copy of the returned +** string to avoid it being collected while parsed. 'load' has four +** optional arguments (chunk, source name, mode, and environment). +*/ +#define RESERVEDSLOT 5 + + +/* +** Reader for generic 'load' function: 'lua_load' uses the +** stack for internal stuff, so the reader cannot change the +** stack top. Instead, it keeps its resulting string in a +** reserved slot inside the stack. +*/ +static const char *generic_reader (lua_State *L, void *ud, size_t *size) { + (void)(ud); /* not used */ + luaL_checkstack(L, 2, "too many nested functions"); + lua_pushvalue(L, 1); /* get function */ + lua_call(L, 0, 1); /* call it */ + if (lua_isnil(L, -1)) { + lua_pop(L, 1); /* pop result */ + *size = 0; + return NULL; + } + else if (!lua_isstring(L, -1)) + luaL_error(L, "reader function must return a string"); + lua_replace(L, RESERVEDSLOT); /* save string in reserved slot */ + return lua_tolstring(L, RESERVEDSLOT, size); +} + + +static int luaB_load (lua_State *L) { + int status; + size_t l; + const char *s = lua_tolstring(L, 1, &l); + const char *mode = luaL_optstring(L, 3, "bt"); + int env = (!lua_isnone(L, 4) ? 4 : 0); /* 'env' index or 0 if no 'env' */ + if (s != NULL) { /* loading a string? */ + const char *chunkname = luaL_optstring(L, 2, s); + status = luaL_loadbufferx(L, s, l, chunkname, mode); + } + else { /* loading from a reader function */ + const char *chunkname = luaL_optstring(L, 2, "=(load)"); + luaL_checktype(L, 1, LUA_TFUNCTION); + lua_settop(L, RESERVEDSLOT); /* create reserved slot */ + status = lua_load(L, generic_reader, NULL, chunkname, mode); + } + return load_aux(L, status, env); +} + +/* }====================================================== */ + + +static int dofilecont (lua_State *L, int d1, lua_KContext d2) { + (void)d1; (void)d2; /* only to match 'lua_Kfunction' prototype */ + return lua_gettop(L) - 1; +} + + +static int luaB_dofile (lua_State *L) { + const char *fname = luaL_optstring(L, 1, NULL); + lua_settop(L, 1); + if (luaL_loadfile(L, fname) != LUA_OK) + return lua_error(L); + lua_callk(L, 0, LUA_MULTRET, 0, dofilecont); + return dofilecont(L, 0, 0); +} + + +static int luaB_assert (lua_State *L) { + if (lua_toboolean(L, 1)) /* condition is true? */ + return lua_gettop(L); /* return all arguments */ + else { /* error */ + luaL_checkany(L, 1); /* there must be a condition */ + lua_remove(L, 1); /* remove it */ + lua_pushliteral(L, "assertion failed!"); /* default message */ + lua_settop(L, 1); /* leave only message (default if no other one) */ + return luaB_error(L); /* call 'error' */ + } +} + + +static int luaB_select (lua_State *L) { + int n = lua_gettop(L); + if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') { + lua_pushinteger(L, n-1); + return 1; + } + else { + lua_Integer i = luaL_checkinteger(L, 1); + if (i < 0) i = n + i; + else if (i > n) i = n; + luaL_argcheck(L, 1 <= i, 1, "index out of range"); + return n - (int)i; + } +} + + +/* +** Continuation function for 'pcall' and 'xpcall'. Both functions +** already pushed a 'true' before doing the call, so in case of success +** 'finishpcall' only has to return everything in the stack minus +** 'extra' values (where 'extra' is exactly the number of items to be +** ignored). +*/ +static int finishpcall (lua_State *L, int status, lua_KContext extra) { + if (status != LUA_OK && status != LUA_YIELD) { /* error? */ + lua_pushboolean(L, 0); /* first result (false) */ + lua_pushvalue(L, -2); /* error message */ + return 2; /* return false, msg */ + } + else + return lua_gettop(L) - (int)extra; /* return all results */ +} + + +static int luaB_pcall (lua_State *L) { + int status; + luaL_checkany(L, 1); + lua_pushboolean(L, 1); /* first result if no errors */ + lua_insert(L, 1); /* put it in place */ + status = lua_pcallk(L, lua_gettop(L) - 2, LUA_MULTRET, 0, 0, finishpcall); + return finishpcall(L, status, 0); +} + + +/* +** Do a protected call with error handling. After 'lua_rotate', the +** stack will have ; so, the function passes +** 2 to 'finishpcall' to skip the 2 first values when returning results. +*/ +static int luaB_xpcall (lua_State *L) { + int status; + int n = lua_gettop(L); + luaL_checktype(L, 2, LUA_TFUNCTION); /* check error function */ + lua_pushboolean(L, 1); /* first result */ + lua_pushvalue(L, 1); /* function */ + lua_rotate(L, 3, 2); /* move them below function's arguments */ + status = lua_pcallk(L, n - 2, LUA_MULTRET, 2, 2, finishpcall); + return finishpcall(L, status, 2); +} + + +static int luaB_tostring (lua_State *L) { + luaL_checkany(L, 1); + luaL_tolstring(L, 1, NULL); + return 1; +} + + +static const luaL_Reg base_funcs[] = { + {"assert", luaB_assert}, + {"collectgarbage", luaB_collectgarbage}, + {"dofile", luaB_dofile}, + {"error", luaB_error}, + {"getmetatable", luaB_getmetatable}, + {"ipairs", luaB_ipairs}, + {"loadfile", luaB_loadfile}, + {"load", luaB_load}, + {"next", luaB_next}, + {"pairs", luaB_pairs}, + {"pcall", luaB_pcall}, + {"print", luaB_print}, + {"warn", luaB_warn}, + {"rawequal", luaB_rawequal}, + {"rawlen", luaB_rawlen}, + {"rawget", luaB_rawget}, + {"rawset", luaB_rawset}, + {"select", luaB_select}, + {"setmetatable", luaB_setmetatable}, + {"tonumber", luaB_tonumber}, + {"tostring", luaB_tostring}, + {"type", luaB_type}, + {"xpcall", luaB_xpcall}, + /* placeholders */ + {LUA_GNAME, NULL}, + {"_VERSION", NULL}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_base (lua_State *L) { + /* open lib into global table */ + lua_pushglobaltable(L); + luaL_setfuncs(L, base_funcs, 0); + /* set global _G */ + lua_pushvalue(L, -1); + lua_setfield(L, -2, LUA_GNAME); + /* set global _VERSION */ + lua_pushliteral(L, LUA_VERSION); + lua_setfield(L, -2, "_VERSION"); + return 1; +} + diff --git a/source/lua/lbaselib.o b/source/lua/lbaselib.o new file mode 100644 index 0000000000000000000000000000000000000000..a143deebbc095c83decb2dab95fb85e578279221 GIT binary patch literal 19480 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 N6_6fwjo;n>e**x^<5d6v literal 0 HcmV?d00001 diff --git a/source/lua/lcode.c b/source/lua/lcode.c new file mode 100644 index 0000000..1872ede --- /dev/null +++ b/source/lua/lcode.c @@ -0,0 +1,1682 @@ +/* +** $Id: lcode.c $ +** Code generator for Lua +** See Copyright Notice in lua.h +*/ + +#define lcode_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "llex.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstring.h" +#include "ltable.h" +#include "lvm.h" + + +/* Maximum number of registers in a Lua function (must fit in 8 bits) */ +#define MAXREGS 255 + + +#define hasjumps(e) ((e)->t != (e)->f) + + +static int codesJ (FuncState *fs, OpCode o, int sj, int k); + + + +/* semantic error */ +l_noret luaK_semerror (LexState *ls, const char *msg) { + ls->t.token = 0; /* remove "near " from final message */ + luaX_syntaxerror(ls, msg); +} + + +/* +** If expression is a numeric constant, fills 'v' with its value +** and returns 1. Otherwise, returns 0. +*/ +static int tonumeral(const expdesc *e, TValue *v) { + if (hasjumps(e)) + return 0; /* not a numeral */ + switch (e->k) { + case VKINT: + if (v) setivalue(v, e->u.ival); + return 1; + case VKFLT: + if (v) setfltvalue(v, e->u.nval); + return 1; + default: return 0; + } +} + + +/* +** Return the previous instruction of the current code. If there +** may be a jump target between the current instruction and the +** previous one, return an invalid instruction (to avoid wrong +** optimizations). +*/ +static Instruction *previousinstruction (FuncState *fs) { + static const Instruction invalidinstruction = -1; + if (fs->pc > fs->lasttarget) + return &fs->f->code[fs->pc - 1]; /* previous instruction */ + else + return cast(Instruction*, &invalidinstruction); +} + + +/* +** Create a OP_LOADNIL instruction, but try to optimize: if the previous +** instruction is also OP_LOADNIL and ranges are compatible, adjust +** range of previous instruction instead of emitting a new one. (For +** instance, 'local a; local b' will generate a single opcode.) +*/ +void luaK_nil (FuncState *fs, int from, int n) { + int l = from + n - 1; /* last register to set nil */ + Instruction *previous = previousinstruction(fs); + if (GET_OPCODE(*previous) == OP_LOADNIL) { /* previous is LOADNIL? */ + int pfrom = GETARG_A(*previous); /* get previous range */ + int pl = pfrom + GETARG_B(*previous); + if ((pfrom <= from && from <= pl + 1) || + (from <= pfrom && pfrom <= l + 1)) { /* can connect both? */ + if (pfrom < from) from = pfrom; /* from = min(from, pfrom) */ + if (pl > l) l = pl; /* l = max(l, pl) */ + SETARG_A(*previous, from); + SETARG_B(*previous, l - from); + return; + } /* else go through */ + } + luaK_codeABC(fs, OP_LOADNIL, from, n - 1, 0); /* else no optimization */ +} + + +/* +** Gets the destination address of a jump instruction. Used to traverse +** a list of jumps. +*/ +static int getjump (FuncState *fs, int pc) { + int offset = GETARG_sJ(fs->f->code[pc]); + if (offset == NO_JUMP) /* point to itself represents end of list */ + return NO_JUMP; /* end of list */ + else + return (pc+1)+offset; /* turn offset into absolute position */ +} + + +/* +** Fix jump instruction at position 'pc' to jump to 'dest'. +** (Jump addresses are relative in Lua) +*/ +static void fixjump (FuncState *fs, int pc, int dest) { + Instruction *jmp = &fs->f->code[pc]; + int offset = dest - (pc + 1); + lua_assert(dest != NO_JUMP); + if (!(-OFFSET_sJ <= offset && offset <= MAXARG_sJ - OFFSET_sJ)) + luaX_syntaxerror(fs->ls, "control structure too long"); + lua_assert(GET_OPCODE(*jmp) == OP_JMP); + SETARG_sJ(*jmp, offset); +} + + +/* +** Concatenate jump-list 'l2' into jump-list 'l1' +*/ +void luaK_concat (FuncState *fs, int *l1, int l2) { + if (l2 == NO_JUMP) return; /* nothing to concatenate? */ + else if (*l1 == NO_JUMP) /* no original list? */ + *l1 = l2; /* 'l1' points to 'l2' */ + else { + int list = *l1; + int next; + while ((next = getjump(fs, list)) != NO_JUMP) /* find last element */ + list = next; + fixjump(fs, list, l2); /* last element links to 'l2' */ + } +} + + +/* +** Create a jump instruction and return its position, so its destination +** can be fixed later (with 'fixjump'). +*/ +int luaK_jump (FuncState *fs) { + return codesJ(fs, OP_JMP, NO_JUMP, 0); +} + + +/* +** Code a 'return' instruction +*/ +void luaK_ret (FuncState *fs, int first, int nret) { + OpCode op; + switch (nret) { + case 0: op = OP_RETURN0; break; + case 1: op = OP_RETURN1; break; + default: op = OP_RETURN; break; + } + luaK_codeABC(fs, op, first, nret + 1, 0); +} + + +/* +** Code a "conditional jump", that is, a test or comparison opcode +** followed by a jump. Return jump position. +*/ +static int condjump (FuncState *fs, OpCode op, int A, int B, int k) { + luaK_codeABCk(fs, op, A, B, 0, k); + return luaK_jump(fs); +} + + +/* +** returns current 'pc' and marks it as a jump target (to avoid wrong +** optimizations with consecutive instructions not in the same basic block). +*/ +int luaK_getlabel (FuncState *fs) { + fs->lasttarget = fs->pc; + return fs->pc; +} + + +/* +** Returns the position of the instruction "controlling" a given +** jump (that is, its condition), or the jump itself if it is +** unconditional. +*/ +static Instruction *getjumpcontrol (FuncState *fs, int pc) { + Instruction *pi = &fs->f->code[pc]; + if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1)))) + return pi-1; + else + return pi; +} + + +/* +** Patch destination register for a TESTSET instruction. +** If instruction in position 'node' is not a TESTSET, return 0 ("fails"). +** Otherwise, if 'reg' is not 'NO_REG', set it as the destination +** register. Otherwise, change instruction to a simple 'TEST' (produces +** no register value) +*/ +static int patchtestreg (FuncState *fs, int node, int reg) { + Instruction *i = getjumpcontrol(fs, node); + if (GET_OPCODE(*i) != OP_TESTSET) + return 0; /* cannot patch other instructions */ + if (reg != NO_REG && reg != GETARG_B(*i)) + SETARG_A(*i, reg); + else { + /* no register to put value or register already has the value; + change instruction to simple test */ + *i = CREATE_ABCk(OP_TEST, GETARG_B(*i), 0, 0, GETARG_k(*i)); + } + return 1; +} + + +/* +** Traverse a list of tests ensuring no one produces a value +*/ +static void removevalues (FuncState *fs, int list) { + for (; list != NO_JUMP; list = getjump(fs, list)) + patchtestreg(fs, list, NO_REG); +} + + +/* +** Traverse a list of tests, patching their destination address and +** registers: tests producing values jump to 'vtarget' (and put their +** values in 'reg'), other tests jump to 'dtarget'. +*/ +static void patchlistaux (FuncState *fs, int list, int vtarget, int reg, + int dtarget) { + while (list != NO_JUMP) { + int next = getjump(fs, list); + if (patchtestreg(fs, list, reg)) + fixjump(fs, list, vtarget); + else + fixjump(fs, list, dtarget); /* jump to default target */ + list = next; + } +} + + +/* +** Path all jumps in 'list' to jump to 'target'. +** (The assert means that we cannot fix a jump to a forward address +** because we only know addresses once code is generated.) +*/ +void luaK_patchlist (FuncState *fs, int list, int target) { + lua_assert(target <= fs->pc); + patchlistaux(fs, list, target, NO_REG, target); +} + + +void luaK_patchtohere (FuncState *fs, int list) { + int hr = luaK_getlabel(fs); /* mark "here" as a jump target */ + luaK_patchlist(fs, list, hr); +} + + +/* +** MAXimum number of successive Instructions WiTHout ABSolute line +** information. +*/ +#if !defined(MAXIWTHABS) +#define MAXIWTHABS 120 +#endif + + +/* limit for difference between lines in relative line info. */ +#define LIMLINEDIFF 0x80 + + +/* +** Save line info for a new instruction. If difference from last line +** does not fit in a byte, of after that many instructions, save a new +** absolute line info; (in that case, the special value 'ABSLINEINFO' +** in 'lineinfo' signals the existence of this absolute information.) +** Otherwise, store the difference from last line in 'lineinfo'. +*/ +static void savelineinfo (FuncState *fs, Proto *f, int line) { + int linedif = line - fs->previousline; + int pc = fs->pc - 1; /* last instruction coded */ + if (abs(linedif) >= LIMLINEDIFF || fs->iwthabs++ > MAXIWTHABS) { + luaM_growvector(fs->ls->L, f->abslineinfo, fs->nabslineinfo, + f->sizeabslineinfo, AbsLineInfo, MAX_INT, "lines"); + f->abslineinfo[fs->nabslineinfo].pc = pc; + f->abslineinfo[fs->nabslineinfo++].line = line; + linedif = ABSLINEINFO; /* signal that there is absolute information */ + fs->iwthabs = 0; /* restart counter */ + } + luaM_growvector(fs->ls->L, f->lineinfo, pc, f->sizelineinfo, ls_byte, + MAX_INT, "opcodes"); + f->lineinfo[pc] = linedif; + fs->previousline = line; /* last line saved */ +} + + +/* +** Remove line information from the last instruction. +** If line information for that instruction is absolute, set 'iwthabs' +** above its max to force the new (replacing) instruction to have +** absolute line info, too. +*/ +static void removelastlineinfo (FuncState *fs) { + Proto *f = fs->f; + int pc = fs->pc - 1; /* last instruction coded */ + if (f->lineinfo[pc] != ABSLINEINFO) { /* relative line info? */ + fs->previousline -= f->lineinfo[pc]; /* last line saved */ + fs->iwthabs--; + } + else { /* absolute line information */ + fs->nabslineinfo--; /* remove it */ + lua_assert(f->abslineinfo[fs->nabslineinfo].pc = pc); + fs->iwthabs = MAXIWTHABS + 1; /* force next line info to be absolute */ + } +} + + +/* +** Remove the last instruction created, correcting line information +** accordingly. +*/ +static void removelastinstruction (FuncState *fs) { + removelastlineinfo(fs); + fs->pc--; +} + + +/* +** Emit instruction 'i', checking for array sizes and saving also its +** line information. Return 'i' position. +*/ +static int luaK_code (FuncState *fs, Instruction i) { + Proto *f = fs->f; + /* put new instruction in code array */ + luaM_growvector(fs->ls->L, f->code, fs->pc, f->sizecode, Instruction, + MAX_INT, "opcodes"); + f->code[fs->pc++] = i; + savelineinfo(fs, f, fs->ls->lastline); + return fs->pc - 1; /* index of new instruction */ +} + + +/* +** Format and emit an 'iABC' instruction. (Assertions check consistency +** of parameters versus opcode.) +*/ +int luaK_codeABCk (FuncState *fs, OpCode o, int a, int b, int c, int k) { + lua_assert(getOpMode(o) == iABC); + lua_assert(a <= MAXARG_A && b <= MAXARG_B && + c <= MAXARG_C && (k & ~1) == 0); + return luaK_code(fs, CREATE_ABCk(o, a, b, c, k)); +} + + +/* +** Format and emit an 'iABx' instruction. +*/ +int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) { + lua_assert(getOpMode(o) == iABx); + lua_assert(a <= MAXARG_A && bc <= MAXARG_Bx); + return luaK_code(fs, CREATE_ABx(o, a, bc)); +} + + +/* +** Format and emit an 'iAsBx' instruction. +*/ +int luaK_codeAsBx (FuncState *fs, OpCode o, int a, int bc) { + unsigned int b = bc + OFFSET_sBx; + lua_assert(getOpMode(o) == iAsBx); + lua_assert(a <= MAXARG_A && b <= MAXARG_Bx); + return luaK_code(fs, CREATE_ABx(o, a, b)); +} + + +/* +** Format and emit an 'isJ' instruction. +*/ +static int codesJ (FuncState *fs, OpCode o, int sj, int k) { + unsigned int j = sj + OFFSET_sJ; + lua_assert(getOpMode(o) == isJ); + lua_assert(j <= MAXARG_sJ && (k & ~1) == 0); + return luaK_code(fs, CREATE_sJ(o, j, k)); +} + + +/* +** Emit an "extra argument" instruction (format 'iAx') +*/ +static int codeextraarg (FuncState *fs, int a) { + lua_assert(a <= MAXARG_Ax); + return luaK_code(fs, CREATE_Ax(OP_EXTRAARG, a)); +} + + +/* +** Emit a "load constant" instruction, using either 'OP_LOADK' +** (if constant index 'k' fits in 18 bits) or an 'OP_LOADKX' +** instruction with "extra argument". +*/ +static int luaK_codek (FuncState *fs, int reg, int k) { + if (k <= MAXARG_Bx) + return luaK_codeABx(fs, OP_LOADK, reg, k); + else { + int p = luaK_codeABx(fs, OP_LOADKX, reg, 0); + codeextraarg(fs, k); + return p; + } +} + + +/* +** Check register-stack level, keeping track of its maximum size +** in field 'maxstacksize' +*/ +void luaK_checkstack (FuncState *fs, int n) { + int newstack = fs->freereg + n; + if (newstack > fs->f->maxstacksize) { + if (newstack >= MAXREGS) + luaX_syntaxerror(fs->ls, + "function or expression needs too many registers"); + fs->f->maxstacksize = cast_byte(newstack); + } +} + + +/* +** Reserve 'n' registers in register stack +*/ +void luaK_reserveregs (FuncState *fs, int n) { + luaK_checkstack(fs, n); + fs->freereg += n; +} + + +/* +** Free register 'reg', if it is neither a constant index nor +** a local variable. +) +*/ +static void freereg (FuncState *fs, int reg) { + if (reg >= fs->nactvar) { + fs->freereg--; + lua_assert(reg == fs->freereg); + } +} + + +/* +** Free two registers in proper order +*/ +static void freeregs (FuncState *fs, int r1, int r2) { + if (r1 > r2) { + freereg(fs, r1); + freereg(fs, r2); + } + else { + freereg(fs, r2); + freereg(fs, r1); + } +} + + +/* +** Free register used by expression 'e' (if any) +*/ +static void freeexp (FuncState *fs, expdesc *e) { + if (e->k == VNONRELOC) + freereg(fs, e->u.info); +} + + +/* +** Free registers used by expressions 'e1' and 'e2' (if any) in proper +** order. +*/ +static void freeexps (FuncState *fs, expdesc *e1, expdesc *e2) { + int r1 = (e1->k == VNONRELOC) ? e1->u.info : -1; + int r2 = (e2->k == VNONRELOC) ? e2->u.info : -1; + freeregs(fs, r1, r2); +} + + +/* +** Add constant 'v' to prototype's list of constants (field 'k'). +** Use scanner's table to cache position of constants in constant list +** and try to reuse constants. Because some values should not be used +** as keys (nil cannot be a key, integer keys can collapse with float +** keys), the caller must provide a useful 'key' for indexing the cache. +*/ +static int addk (FuncState *fs, TValue *key, TValue *v) { + lua_State *L = fs->ls->L; + Proto *f = fs->f; + TValue *idx = luaH_set(L, fs->ls->h, key); /* index scanner table */ + int k, oldsize; + if (ttisinteger(idx)) { /* is there an index there? */ + k = cast_int(ivalue(idx)); + /* correct value? (warning: must distinguish floats from integers!) */ + if (k < fs->nk && ttypetag(&f->k[k]) == ttypetag(v) && + luaV_rawequalobj(&f->k[k], v)) + return k; /* reuse index */ + } + /* constant not found; create a new entry */ + oldsize = f->sizek; + k = fs->nk; + /* numerical value does not need GC barrier; + table has no metatable, so it does not need to invalidate cache */ + setivalue(idx, k); + luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants"); + while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]); + setobj(L, &f->k[k], v); + fs->nk++; + luaC_barrier(L, f, v); + return k; +} + + +/* +** Add a string to list of constants and return its index. +*/ +int luaK_stringK (FuncState *fs, TString *s) { + TValue o; + setsvalue(fs->ls->L, &o, s); + return addk(fs, &o, &o); /* use string itself as key */ +} + + +/* +** Add an integer to list of constants and return its index. +** Integers use userdata as keys to avoid collision with floats with +** same value; conversion to 'void*' is used only for hashing, so there +** are no "precision" problems. +*/ +static int luaK_intK (FuncState *fs, lua_Integer n) { + TValue k, o; + setpvalue(&k, cast_voidp(cast_sizet(n))); + setivalue(&o, n); + return addk(fs, &k, &o); +} + +/* +** Add a float to list of constants and return its index. +*/ +static int luaK_numberK (FuncState *fs, lua_Number r) { + TValue o; + setfltvalue(&o, r); + return addk(fs, &o, &o); /* use number itself as key */ +} + + +/* +** Add a boolean to list of constants and return its index. +*/ +static int boolK (FuncState *fs, int b) { + TValue o; + setbvalue(&o, b); + return addk(fs, &o, &o); /* use boolean itself as key */ +} + + +/* +** Add nil to list of constants and return its index. +*/ +static int nilK (FuncState *fs) { + TValue k, v; + setnilvalue(&v); + /* cannot use nil as key; instead use table itself to represent nil */ + sethvalue(fs->ls->L, &k, fs->ls->h); + return addk(fs, &k, &v); +} + + +/* +** Check whether 'i' can be stored in an 'sC' operand. +** Equivalent to (0 <= i + OFFSET_sC && i + OFFSET_sC <= MAXARG_C) +** but without risk of overflows in the addition. +*/ +static int fitsC (lua_Integer i) { + return (-OFFSET_sC <= i && i <= MAXARG_C - OFFSET_sC); +} + + +/* +** Check whether 'i' can be stored in an 'sBx' operand. +*/ +static int fitsBx (lua_Integer i) { + return (-OFFSET_sBx <= i && i <= MAXARG_Bx - OFFSET_sBx); +} + + +void luaK_int (FuncState *fs, int reg, lua_Integer i) { + if (fitsBx(i)) + luaK_codeAsBx(fs, OP_LOADI, reg, cast_int(i)); + else + luaK_codek(fs, reg, luaK_intK(fs, i)); +} + + +static int floatI (lua_Number f, lua_Integer *fi) { + return (luaV_flttointeger(f, fi, 0) && fitsBx(*fi)); +} + + +static void luaK_float (FuncState *fs, int reg, lua_Number f) { + lua_Integer fi; + if (floatI(f, &fi)) + luaK_codeAsBx(fs, OP_LOADF, reg, cast_int(fi)); + else + luaK_codek(fs, reg, luaK_numberK(fs, f)); +} + + +/* +** Fix an expression to return the number of results 'nresults'. +** Either 'e' is a multi-ret expression (function call or vararg) +** or 'nresults' is LUA_MULTRET (as any expression can satisfy that). +*/ +void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) { + Instruction *pc = &getinstruction(fs, e); + if (e->k == VCALL) /* expression is an open function call? */ + SETARG_C(*pc, nresults + 1); + else if (e->k == VVARARG) { + SETARG_C(*pc, nresults + 1); + SETARG_A(*pc, fs->freereg); + luaK_reserveregs(fs, 1); + } + else lua_assert(nresults == LUA_MULTRET); +} + + +/* +** Fix an expression to return one result. +** If expression is not a multi-ret expression (function call or +** vararg), it already returns one result, so nothing needs to be done. +** Function calls become VNONRELOC expressions (as its result comes +** fixed in the base register of the call), while vararg expressions +** become VRELOC (as OP_VARARG puts its results where it wants). +** (Calls are created returning one result, so that does not need +** to be fixed.) +*/ +void luaK_setoneret (FuncState *fs, expdesc *e) { + if (e->k == VCALL) { /* expression is an open function call? */ + /* already returns 1 value */ + lua_assert(GETARG_C(getinstruction(fs, e)) == 2); + e->k = VNONRELOC; /* result has fixed position */ + e->u.info = GETARG_A(getinstruction(fs, e)); + } + else if (e->k == VVARARG) { + SETARG_C(getinstruction(fs, e), 2); + e->k = VRELOC; /* can relocate its simple result */ + } +} + + +/* +** Ensure that expression 'e' is not a variable. +** (Expression still may have jump lists.) +*/ +void luaK_dischargevars (FuncState *fs, expdesc *e) { + switch (e->k) { + case VLOCAL: { /* already in a register */ + e->k = VNONRELOC; /* becomes a non-relocatable value */ + break; + } + case VUPVAL: { /* move value to some (pending) register */ + e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0); + e->k = VRELOC; + break; + } + case VINDEXUP: { + e->u.info = luaK_codeABC(fs, OP_GETTABUP, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOC; + break; + } + case VINDEXI: { + freereg(fs, e->u.ind.t); + e->u.info = luaK_codeABC(fs, OP_GETI, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOC; + break; + } + case VINDEXSTR: { + freereg(fs, e->u.ind.t); + e->u.info = luaK_codeABC(fs, OP_GETFIELD, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOC; + break; + } + case VINDEXED: { + freeregs(fs, e->u.ind.t, e->u.ind.idx); + e->u.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOC; + break; + } + case VVARARG: case VCALL: { + luaK_setoneret(fs, e); + break; + } + default: break; /* there is one value available (somewhere) */ + } +} + + +/* +** Ensures expression value is in register 'reg' (and therefore +** 'e' will become a non-relocatable expression). +** (Expression still may have jump lists.) +*/ +static void discharge2reg (FuncState *fs, expdesc *e, int reg) { + luaK_dischargevars(fs, e); + switch (e->k) { + case VNIL: { + luaK_nil(fs, reg, 1); + break; + } + case VFALSE: case VTRUE: { + luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0); + break; + } + case VK: { + luaK_codek(fs, reg, e->u.info); + break; + } + case VKFLT: { + luaK_float(fs, reg, e->u.nval); + break; + } + case VKINT: { + luaK_int(fs, reg, e->u.ival); + break; + } + case VRELOC: { + Instruction *pc = &getinstruction(fs, e); + SETARG_A(*pc, reg); /* instruction will put result in 'reg' */ + break; + } + case VNONRELOC: { + if (reg != e->u.info) + luaK_codeABC(fs, OP_MOVE, reg, e->u.info, 0); + break; + } + default: { + lua_assert(e->k == VJMP); + return; /* nothing to do... */ + } + } + e->u.info = reg; + e->k = VNONRELOC; +} + + +/* +** Ensures expression value is in any register. +** (Expression still may have jump lists.) +*/ +static void discharge2anyreg (FuncState *fs, expdesc *e) { + if (e->k != VNONRELOC) { /* no fixed register yet? */ + luaK_reserveregs(fs, 1); /* get a register */ + discharge2reg(fs, e, fs->freereg-1); /* put value there */ + } +} + + +static int code_loadbool (FuncState *fs, int A, int b, int jump) { + luaK_getlabel(fs); /* those instructions may be jump targets */ + return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump); +} + + +/* +** check whether list has any jump that do not produce a value +** or produce an inverted value +*/ +static int need_value (FuncState *fs, int list) { + for (; list != NO_JUMP; list = getjump(fs, list)) { + Instruction i = *getjumpcontrol(fs, list); + if (GET_OPCODE(i) != OP_TESTSET) return 1; + } + return 0; /* not found */ +} + + +/* +** Ensures final expression result (which includes results from its +** jump ** lists) is in register 'reg'. +** If expression has jumps, need to patch these jumps either to +** its final position or to "load" instructions (for those tests +** that do not produce values). +*/ +static void exp2reg (FuncState *fs, expdesc *e, int reg) { + discharge2reg(fs, e, reg); + if (e->k == VJMP) /* expression itself is a test? */ + luaK_concat(fs, &e->t, e->u.info); /* put this jump in 't' list */ + if (hasjumps(e)) { + int final; /* position after whole expression */ + int p_f = NO_JUMP; /* position of an eventual LOAD false */ + int p_t = NO_JUMP; /* position of an eventual LOAD true */ + if (need_value(fs, e->t) || need_value(fs, e->f)) { + int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs); + p_f = code_loadbool(fs, reg, 0, 1); + p_t = code_loadbool(fs, reg, 1, 0); + luaK_patchtohere(fs, fj); + } + final = luaK_getlabel(fs); + patchlistaux(fs, e->f, final, reg, p_f); + patchlistaux(fs, e->t, final, reg, p_t); + } + e->f = e->t = NO_JUMP; + e->u.info = reg; + e->k = VNONRELOC; +} + + +/* +** Ensures final expression result is in next available register. +*/ +void luaK_exp2nextreg (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + freeexp(fs, e); + luaK_reserveregs(fs, 1); + exp2reg(fs, e, fs->freereg - 1); +} + + +/* +** Ensures final expression result is in some (any) register +** and return that register. +*/ +int luaK_exp2anyreg (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + if (e->k == VNONRELOC) { /* expression already has a register? */ + if (!hasjumps(e)) /* no jumps? */ + return e->u.info; /* result is already in a register */ + if (e->u.info >= fs->nactvar) { /* reg. is not a local? */ + exp2reg(fs, e, e->u.info); /* put final result in it */ + return e->u.info; + } + } + luaK_exp2nextreg(fs, e); /* otherwise, use next available register */ + return e->u.info; +} + + +/* +** Ensures final expression result is either in a register +** or in an upvalue. +*/ +void luaK_exp2anyregup (FuncState *fs, expdesc *e) { + if (e->k != VUPVAL || hasjumps(e)) + luaK_exp2anyreg(fs, e); +} + + +/* +** Ensures final expression result is either in a register +** or it is a constant. +*/ +void luaK_exp2val (FuncState *fs, expdesc *e) { + if (hasjumps(e)) + luaK_exp2anyreg(fs, e); + else + luaK_dischargevars(fs, e); +} + + +/* +** Try to make 'e' a K expression with an index in the range of R/K +** indices. Return true iff succeeded. +*/ +static int luaK_exp2K (FuncState *fs, expdesc *e) { + if (!hasjumps(e)) { + int info; + switch (e->k) { /* move constants to 'k' */ + case VTRUE: info = boolK(fs, 1); break; + case VFALSE: info = boolK(fs, 0); break; + case VNIL: info = nilK(fs); break; + case VKINT: info = luaK_intK(fs, e->u.ival); break; + case VKFLT: info = luaK_numberK(fs, e->u.nval); break; + case VK: info = e->u.info; break; + default: return 0; /* not a constant */ + } + if (info <= MAXINDEXRK) { /* does constant fit in 'argC'? */ + e->k = VK; /* make expression a 'K' expression */ + e->u.info = info; + return 1; + } + } + /* else, expression doesn't fit; leave it unchanged */ + return 0; +} + + +/* +** Ensures final expression result is in a valid R/K index +** (that is, it is either in a register or in 'k' with an index +** in the range of R/K indices). +** Returns 1 iff expression is K. +*/ +int luaK_exp2RK (FuncState *fs, expdesc *e) { + if (luaK_exp2K(fs, e)) + return 1; + else { /* not a constant in the right range: put it in a register */ + luaK_exp2anyreg(fs, e); + return 0; + } +} + + +static void codeABRK (FuncState *fs, OpCode o, int a, int b, + expdesc *ec) { + int k = luaK_exp2RK(fs, ec); + luaK_codeABCk(fs, o, a, b, ec->u.info, k); +} + + +/* +** Generate code to store result of expression 'ex' into variable 'var'. +*/ +void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { + switch (var->k) { + case VLOCAL: { + freeexp(fs, ex); + exp2reg(fs, ex, var->u.info); /* compute 'ex' into proper place */ + return; + } + case VUPVAL: { + int e = luaK_exp2anyreg(fs, ex); + luaK_codeABC(fs, OP_SETUPVAL, e, var->u.info, 0); + break; + } + case VINDEXUP: { + codeABRK(fs, OP_SETTABUP, var->u.ind.t, var->u.ind.idx, ex); + break; + } + case VINDEXI: { + codeABRK(fs, OP_SETI, var->u.ind.t, var->u.ind.idx, ex); + break; + } + case VINDEXSTR: { + codeABRK(fs, OP_SETFIELD, var->u.ind.t, var->u.ind.idx, ex); + break; + } + case VINDEXED: { + codeABRK(fs, OP_SETTABLE, var->u.ind.t, var->u.ind.idx, ex); + break; + } + default: lua_assert(0); /* invalid var kind to store */ + } + freeexp(fs, ex); +} + + +/* +** Emit SELF instruction (convert expression 'e' into 'e:key(e,'). +*/ +void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { + int ereg; + luaK_exp2anyreg(fs, e); + ereg = e->u.info; /* register where 'e' was placed */ + freeexp(fs, e); + e->u.info = fs->freereg; /* base register for op_self */ + e->k = VNONRELOC; /* self expression has a fixed register */ + luaK_reserveregs(fs, 2); /* function and 'self' produced by op_self */ + codeABRK(fs, OP_SELF, e->u.info, ereg, key); + freeexp(fs, key); +} + + +/* +** Negate condition 'e' (where 'e' is a comparison). +*/ +static void negatecondition (FuncState *fs, expdesc *e) { + Instruction *pc = getjumpcontrol(fs, e->u.info); + lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET && + GET_OPCODE(*pc) != OP_TEST); + SETARG_k(*pc, (GETARG_k(*pc) ^ 1)); +} + + +/* +** Emit instruction to jump if 'e' is 'cond' (that is, if 'cond' +** is true, code will jump if 'e' is true.) Return jump position. +** Optimize when 'e' is 'not' something, inverting the condition +** and removing the 'not'. +*/ +static int jumponcond (FuncState *fs, expdesc *e, int cond) { + if (e->k == VRELOC) { + Instruction ie = getinstruction(fs, e); + if (GET_OPCODE(ie) == OP_NOT) { + removelastinstruction(fs); /* remove previous OP_NOT */ + return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond); + } + /* else go through */ + } + discharge2anyreg(fs, e); + freeexp(fs, e); + return condjump(fs, OP_TESTSET, NO_REG, e->u.info, cond); +} + + +/* +** Emit code to go through if 'e' is true, jump otherwise. +*/ +void luaK_goiftrue (FuncState *fs, expdesc *e) { + int pc; /* pc of new jump */ + luaK_dischargevars(fs, e); + switch (e->k) { + case VJMP: { /* condition? */ + negatecondition(fs, e); /* jump when it is false */ + pc = e->u.info; /* save jump position */ + break; + } + case VK: case VKFLT: case VKINT: case VTRUE: { + pc = NO_JUMP; /* always true; do nothing */ + break; + } + default: { + pc = jumponcond(fs, e, 0); /* jump when false */ + break; + } + } + luaK_concat(fs, &e->f, pc); /* insert new jump in false list */ + luaK_patchtohere(fs, e->t); /* true list jumps to here (to go through) */ + e->t = NO_JUMP; +} + + +/* +** Emit code to go through if 'e' is false, jump otherwise. +*/ +void luaK_goiffalse (FuncState *fs, expdesc *e) { + int pc; /* pc of new jump */ + luaK_dischargevars(fs, e); + switch (e->k) { + case VJMP: { + pc = e->u.info; /* already jump if true */ + break; + } + case VNIL: case VFALSE: { + pc = NO_JUMP; /* always false; do nothing */ + break; + } + default: { + pc = jumponcond(fs, e, 1); /* jump if true */ + break; + } + } + luaK_concat(fs, &e->t, pc); /* insert new jump in 't' list */ + luaK_patchtohere(fs, e->f); /* false list jumps to here (to go through) */ + e->f = NO_JUMP; +} + + +/* +** Code 'not e', doing constant folding. +*/ +static void codenot (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + switch (e->k) { + case VNIL: case VFALSE: { + e->k = VTRUE; /* true == not nil == not false */ + break; + } + case VK: case VKFLT: case VKINT: case VTRUE: { + e->k = VFALSE; /* false == not "x" == not 0.5 == not 1 == not true */ + break; + } + case VJMP: { + negatecondition(fs, e); + break; + } + case VRELOC: + case VNONRELOC: { + discharge2anyreg(fs, e); + freeexp(fs, e); + e->u.info = luaK_codeABC(fs, OP_NOT, 0, e->u.info, 0); + e->k = VRELOC; + break; + } + default: lua_assert(0); /* cannot happen */ + } + /* interchange true and false lists */ + { int temp = e->f; e->f = e->t; e->t = temp; } + removevalues(fs, e->f); /* values are useless when negated */ + removevalues(fs, e->t); +} + + +/* +** Check whether expression 'e' is a small literal string +*/ +static int isKstr (FuncState *fs, expdesc *e) { + return (e->k == VK && !hasjumps(e) && e->u.info <= MAXARG_B && + ttisshrstring(&fs->f->k[e->u.info])); +} + +/* +** Check whether expression 'e' is a literal integer. +*/ +int luaK_isKint (expdesc *e) { + return (e->k == VKINT && !hasjumps(e)); +} + + +/* +** Check whether expression 'e' is a literal integer in +** proper range to fit in register C +*/ +static int isCint (expdesc *e) { + return luaK_isKint(e) && (l_castS2U(e->u.ival) <= l_castS2U(MAXARG_C)); +} + + +/* +** Check whether expression 'e' is a literal integer in +** proper range to fit in register sC +*/ +static int isSCint (expdesc *e) { + return luaK_isKint(e) && fitsC(e->u.ival); +} + + +/* +** Check whether expression 'e' is a literal integer or float in +** proper range to fit in register sC +*/ +static int isSCnumber (expdesc *e, lua_Integer *i) { + if (e->k == VKINT) + *i = e->u.ival; + else if (!(e->k == VKFLT && floatI(e->u.nval, i))) + return 0; /* not a number */ + if (!hasjumps(e) && fitsC(*i)) { + *i += OFFSET_sC; + return 1; + } + else + return 0; +} + + +/* +** Create expression 't[k]'. 't' must have its final result already in a +** register or upvalue. Upvalues can only be indexed by literal strings. +** Keys can be literal strings in the constant table or arbitrary +** values in registers. +*/ +void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { + lua_assert(!hasjumps(t) && (vkisinreg(t->k) || t->k == VUPVAL)); + if (t->k == VUPVAL && !isKstr(fs, k)) /* upvalue indexed by non string? */ + luaK_exp2anyreg(fs, t); /* put it in a register */ + t->u.ind.t = t->u.info; /* register or upvalue index */ + if (t->k == VUPVAL) { + t->u.ind.idx = k->u.info; /* literal string */ + t->k = VINDEXUP; + } + else if (isKstr(fs, k)) { + t->u.ind.idx = k->u.info; /* literal string */ + t->k = VINDEXSTR; + } + else if (isCint(k)) { + t->u.ind.idx = cast_int(k->u.ival); /* integer constant in proper range */ + t->k = VINDEXI; + } + else { + t->u.ind.idx = luaK_exp2anyreg(fs, k); /* register */ + t->k = VINDEXED; + } +} + + +/* +** Return false if folding can raise an error. +** Bitwise operations need operands convertible to integers; division +** operations cannot have 0 as divisor. +*/ +static int validop (int op, TValue *v1, TValue *v2) { + switch (op) { + case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR: + case LUA_OPSHL: case LUA_OPSHR: case LUA_OPBNOT: { /* conversion errors */ + lua_Integer i; + return (tointegerns(v1, &i) && tointegerns(v2, &i)); + } + case LUA_OPDIV: case LUA_OPIDIV: case LUA_OPMOD: /* division by 0 */ + return (nvalue(v2) != 0); + default: return 1; /* everything else is valid */ + } +} + + +/* +** Try to "constant-fold" an operation; return 1 iff successful. +** (In this case, 'e1' has the final result.) +*/ +static int constfolding (FuncState *fs, int op, expdesc *e1, + const expdesc *e2) { + TValue v1, v2, res; + if (!tonumeral(e1, &v1) || !tonumeral(e2, &v2) || !validop(op, &v1, &v2)) + return 0; /* non-numeric operands or not safe to fold */ + luaO_rawarith(fs->ls->L, op, &v1, &v2, &res); /* does operation */ + if (ttisinteger(&res)) { + e1->k = VKINT; + e1->u.ival = ivalue(&res); + } + else { /* folds neither NaN nor 0.0 (to avoid problems with -0.0) */ + lua_Number n = fltvalue(&res); + if (luai_numisnan(n) || n == 0) + return 0; + e1->k = VKFLT; + e1->u.nval = n; + } + return 1; +} + + +/* +** Emit code for unary expressions that "produce values" +** (everything but 'not'). +** Expression to produce final result will be encoded in 'e'. +*/ +static void codeunexpval (FuncState *fs, OpCode op, expdesc *e, int line) { + int r = luaK_exp2anyreg(fs, e); /* opcodes operate only on registers */ + freeexp(fs, e); + e->u.info = luaK_codeABC(fs, op, 0, r, 0); /* generate opcode */ + e->k = VRELOC; /* all those operations are relocatable */ + luaK_fixline(fs, line); +} + + +/* +** Emit code for binary expressions that "produce values" +** (everything but logical operators 'and'/'or' and comparison +** operators). +** Expression to produce final result will be encoded in 'e1'. +** Because 'luaK_exp2anyreg' can free registers, its calls must be +** in "stack order" (that is, first on 'e2', which may have more +** recent registers to be released). +*/ +static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2, + OpCode op, int v2, int k, int line) { + int v1 = luaK_exp2anyreg(fs, e1); + int pc = luaK_codeABCk(fs, op, 0, v1, v2, k); + freeexps(fs, e1, e2); + e1->u.info = pc; + e1->k = VRELOC; /* all those operations are relocatable */ + luaK_fixline(fs, line); +} + + +/* +** Emit code for binary expressions that "produce values" over +** two registers. +*/ +static void codebinexpval (FuncState *fs, OpCode op, + expdesc *e1, expdesc *e2, int line) { + int v2 = luaK_exp2anyreg(fs, e2); /* both operands are in registers */ + finishbinexpval(fs, e1, e2, op, v2, 0, line); +} + + +/* +** Code binary operators ('+', '-', ...) with immediate operands. +*/ +static void codebini (FuncState *fs, OpCode op, + expdesc *e1, expdesc *e2, int k, int line) { + int v2 = cast_int(e2->u.ival) + OFFSET_sC; /* immediate operand */ + finishbinexpval(fs, e1, e2, op, v2, k, line); +} + + +static void swapexps (expdesc *e1, expdesc *e2) { + expdesc temp = *e1; *e1 = *e2; *e2 = temp; /* swap 'e1' and 'e2' */ +} + + +/* +** Code arithmetic operators ('+', '-', ...). If second operand is a +** constant in the proper range, use variant opcodes with immediate +** operands or K operands. +*/ +static void codearith (FuncState *fs, OpCode op, + expdesc *e1, expdesc *e2, int flip, int line) { + if (isSCint(e2)) /* immediate operand? */ + codebini(fs, cast(OpCode, op - OP_ADD + OP_ADDI), e1, e2, flip, line); + else if (tonumeral(e2, NULL) && luaK_exp2K(fs, e2)) { /* K operand? */ + int v2 = e2->u.info; /* K index */ + op = cast(OpCode, op - OP_ADD + OP_ADDK); + finishbinexpval(fs, e1, e2, op, v2, flip, line); + } + else { /* 'e2' is neither an immediate nor a K operand */ + if (flip) + swapexps(e1, e2); /* back to original order */ + codebinexpval(fs, op, e1, e2, line); /* use standard operators */ + } +} + + +/* +** Code commutative operators ('+', '*'). If first operand is a +** numeric constant, change order of operands to try to use an +** immediate or K operator. +*/ +static void codecommutative (FuncState *fs, OpCode op, + expdesc *e1, expdesc *e2, int line) { + int flip = 0; + if (tonumeral(e1, NULL)) { /* is first operand a numeric constant? */ + swapexps(e1, e2); /* change order */ + flip = 1; + } + codearith(fs, op, e1, e2, flip, line); +} + + +/* +** Code bitwise operations; they are all associative, so the function +** tries to put an integer constant as the 2nd operand (a K operand). +*/ +static void codebitwise (FuncState *fs, BinOpr opr, + expdesc *e1, expdesc *e2, int line) { + int inv = 0; + int v2; + OpCode op; + if (e1->k == VKINT && luaK_exp2RK(fs, e1)) { + swapexps(e1, e2); /* 'e2' will be the constant operand */ + inv = 1; + } + else if (!(e2->k == VKINT && luaK_exp2RK(fs, e2))) { /* no constants? */ + op = cast(OpCode, opr - OPR_BAND + OP_BAND); + codebinexpval(fs, op, e1, e2, line); /* all-register opcodes */ + return; + } + v2 = e2->u.info; /* index in K array */ + op = cast(OpCode, opr - OPR_BAND + OP_BANDK); + lua_assert(ttisinteger(&fs->f->k[v2])); + finishbinexpval(fs, e1, e2, op, v2, inv, line); +} + + +/* +** Code shift operators. If second operand is constant, use immediate +** operand (negating it if shift is in the other direction). +*/ +static void codeshift (FuncState *fs, OpCode op, + expdesc *e1, expdesc *e2, int line) { + if (isSCint(e2)) { + int changedir = 0; + if (op == OP_SHL) { + changedir = 1; + e2->u.ival = -(e2->u.ival); + } + codebini(fs, OP_SHRI, e1, e2, changedir, line); + } + else + codebinexpval(fs, op, e1, e2, line); +} + + +/* +** Emit code for order comparisons. +** When the first operand A is an integral value in the proper range, +** change (A < B) to (B > A) and (A <= B) to (B >= A) so that +** it can use an immediate operand. +*/ +static void codeorder (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) { + int r1, r2; + lua_Integer im; + if (isSCnumber(e2, &im)) { + /* use immediate operand */ + r1 = luaK_exp2anyreg(fs, e1); + r2 = cast_int(im); + op = cast(OpCode, (op - OP_LT) + OP_LTI); + } + else if (isSCnumber(e1, &im)) { + /* transform (A < B) to (B > A) and (A <= B) to (B >= A) */ + r1 = luaK_exp2anyreg(fs, e2); + r2 = cast_int(im); + op = (op == OP_LT) ? OP_GTI : OP_GEI; + } + else { /* regular case, compare two registers */ + r1 = luaK_exp2anyreg(fs, e1); + r2 = luaK_exp2anyreg(fs, e2); + } + freeexps(fs, e1, e2); + e1->u.info = condjump(fs, op, r1, r2, 1); + e1->k = VJMP; +} + + +/* +** Emit code for equality comparisons ('==', '~='). +** 'e1' was already put as RK by 'luaK_infix'. +*/ +static void codeeq (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) { + int r1, r2; + lua_Integer im; + OpCode op; + if (e1->k != VNONRELOC) { + lua_assert(e1->k == VK || e1->k == VKINT || e1->k == VKFLT); + swapexps(e1, e2); + } + r1 = luaK_exp2anyreg(fs, e1); /* 1nd expression must be in register */ + if (isSCnumber(e2, &im)) { + op = OP_EQI; + r2 = cast_int(im); /* immediate operand */ + } + else if (luaK_exp2RK(fs, e2)) { /* 1st expression is constant? */ + op = OP_EQK; + r2 = e2->u.info; /* constant index */ + } + else { + op = OP_EQ; /* will compare two registers */ + r2 = luaK_exp2anyreg(fs, e2); + } + freeexps(fs, e1, e2); + e1->u.info = condjump(fs, op, r1, r2, (opr == OPR_EQ)); + e1->k = VJMP; +} + + +/* +** Apply prefix operation 'op' to expression 'e'. +*/ +void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) { + static const expdesc ef = {VKINT, {0}, NO_JUMP, NO_JUMP}; + switch (op) { + case OPR_MINUS: case OPR_BNOT: /* use 'ef' as fake 2nd operand */ + if (constfolding(fs, op + LUA_OPUNM, e, &ef)) + break; + /* FALLTHROUGH */ + case OPR_LEN: + codeunexpval(fs, cast(OpCode, op + OP_UNM), e, line); + break; + case OPR_NOT: codenot(fs, e); break; + default: lua_assert(0); + } +} + + +/* +** Process 1st operand 'v' of binary operation 'op' before reading +** 2nd operand. +*/ +void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { + switch (op) { + case OPR_AND: { + luaK_goiftrue(fs, v); /* go ahead only if 'v' is true */ + break; + } + case OPR_OR: { + luaK_goiffalse(fs, v); /* go ahead only if 'v' is false */ + break; + } + case OPR_CONCAT: { + luaK_exp2nextreg(fs, v); /* operand must be on the stack */ + break; + } + case OPR_ADD: case OPR_SUB: + case OPR_MUL: case OPR_DIV: case OPR_IDIV: + case OPR_MOD: case OPR_POW: + case OPR_BAND: case OPR_BOR: case OPR_BXOR: + case OPR_SHL: case OPR_SHR: { + if (!tonumeral(v, NULL)) + luaK_exp2anyreg(fs, v); + /* else keep numeral, which may be folded with 2nd operand */ + break; + } + case OPR_EQ: case OPR_NE: { + if (!tonumeral(v, NULL)) + luaK_exp2RK(fs, v); + /* else keep numeral, which may be an immediate operand */ + break; + } + case OPR_LT: case OPR_LE: + case OPR_GT: case OPR_GE: { + lua_Integer dummy; + if (!isSCnumber(v, &dummy)) + luaK_exp2anyreg(fs, v); + /* else keep numeral, which may be an immediate operand */ + break; + } + default: lua_assert(0); + } +} + +/* +** Create code for '(e1 .. e2)'. +** For '(e1 .. e2.1 .. e2.2)' (which is '(e1 .. (e2.1 .. e2.2))', +** because concatenation is right associative), merge both CONCATs. +*/ +static void codeconcat (FuncState *fs, expdesc *e1, expdesc *e2, int line) { + Instruction *ie2 = previousinstruction(fs); + if (GET_OPCODE(*ie2) == OP_CONCAT) { /* is 'e2' a concatenation? */ + int n = GETARG_B(*ie2); /* # of elements concatenated in 'e2' */ + lua_assert(e1->u.info + 1 == GETARG_A(*ie2)); + freeexp(fs, e2); + SETARG_A(*ie2, e1->u.info); /* correct first element ('e1') */ + SETARG_B(*ie2, n + 1); /* will concatenate one more element */ + } + else { /* 'e2' is not a concatenation */ + luaK_codeABC(fs, OP_CONCAT, e1->u.info, 2, 0); /* new concat opcode */ + freeexp(fs, e2); + luaK_fixline(fs, line); + } +} + + +/* +** Finalize code for binary operation, after reading 2nd operand. +*/ +void luaK_posfix (FuncState *fs, BinOpr opr, + expdesc *e1, expdesc *e2, int line) { + switch (opr) { + case OPR_AND: { + lua_assert(e1->t == NO_JUMP); /* list closed by 'luK_infix' */ + luaK_dischargevars(fs, e2); + luaK_concat(fs, &e2->f, e1->f); + *e1 = *e2; + break; + } + case OPR_OR: { + lua_assert(e1->f == NO_JUMP); /* list closed by 'luK_infix' */ + luaK_dischargevars(fs, e2); + luaK_concat(fs, &e2->t, e1->t); + *e1 = *e2; + break; + } + case OPR_CONCAT: { /* e1 .. e2 */ + luaK_exp2nextreg(fs, e2); + codeconcat(fs, e1, e2, line); + break; + } + case OPR_ADD: case OPR_MUL: { + if (!constfolding(fs, opr + LUA_OPADD, e1, e2)) + codecommutative(fs, cast(OpCode, opr + OP_ADD), e1, e2, line); + break; + } + case OPR_SUB: case OPR_DIV: + case OPR_IDIV: case OPR_MOD: case OPR_POW: { + if (!constfolding(fs, opr + LUA_OPADD, e1, e2)) + codearith(fs, cast(OpCode, opr + OP_ADD), e1, e2, 0, line); + break; + } + case OPR_BAND: case OPR_BOR: case OPR_BXOR: { + if (!constfolding(fs, opr + LUA_OPADD, e1, e2)) + codebitwise(fs, opr, e1, e2, line); + break; + } + case OPR_SHL: { + if (!constfolding(fs, LUA_OPSHL, e1, e2)) { + if (isSCint(e1)) { + swapexps(e1, e2); + codebini(fs, OP_SHLI, e1, e2, 1, line); + } + else + codeshift(fs, OP_SHL, e1, e2, line); + } + break; + } + case OPR_SHR: { + if (!constfolding(fs, LUA_OPSHR, e1, e2)) + codeshift(fs, OP_SHR, e1, e2, line); + break; + } + case OPR_EQ: case OPR_NE: { + codeeq(fs, opr, e1, e2); + break; + } + case OPR_LT: case OPR_LE: { + OpCode op = cast(OpCode, (opr - OPR_EQ) + OP_EQ); + codeorder(fs, op, e1, e2); + break; + } + case OPR_GT: case OPR_GE: { + /* '(a > b)' <=> '(b < a)'; '(a >= b)' <=> '(b <= a)' */ + OpCode op = cast(OpCode, (opr - OPR_NE) + OP_EQ); + swapexps(e1, e2); + codeorder(fs, op, e1, e2); + break; + } + default: lua_assert(0); + } +} + + +/* +** Change line information associated with current position, by removing +** previous info and adding it again with new line. +*/ +void luaK_fixline (FuncState *fs, int line) { + removelastlineinfo(fs); + savelineinfo(fs, fs->f, line); +} + + +/* +** Emit a SETLIST instruction. +** 'base' is register that keeps table; +** 'nelems' is #table plus those to be stored now; +** 'tostore' is number of values (in registers 'base + 1',...) to add to +** table (or LUA_MULTRET to add up to stack top). +*/ +void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) { + int c = (nelems - 1)/LFIELDS_PER_FLUSH + 1; + int b = (tostore == LUA_MULTRET) ? 0 : tostore; + lua_assert(tostore != 0 && tostore <= LFIELDS_PER_FLUSH); + if (c <= MAXARG_C) + luaK_codeABC(fs, OP_SETLIST, base, b, c); + else if (c <= MAXARG_Ax) { + luaK_codeABC(fs, OP_SETLIST, base, b, 0); + codeextraarg(fs, c); + } + else + luaX_syntaxerror(fs->ls, "constructor too long"); + fs->freereg = base + 1; /* free registers with list values */ +} + + +/* +** return the final target of a jump (skipping jumps to jumps) +*/ +static int finaltarget (Instruction *code, int i) { + int count; + for (count = 0; count < 100; count++) { /* avoid infinite loops */ + Instruction pc = code[i]; + if (GET_OPCODE(pc) != OP_JMP) + break; + else + i += GETARG_sJ(pc) + 1; + } + return i; +} + + +/* +** Do a final pass over the code of a function, doing small peephole +** optimizations and adjustments. +*/ +void luaK_finish (FuncState *fs) { + int i; + Proto *p = fs->f; + for (i = 0; i < fs->pc; i++) { + Instruction *pc = &p->code[i]; + lua_assert(i == 0 || isOT(*(pc - 1)) == isIT(*pc)); + switch (GET_OPCODE(*pc)) { + case OP_RETURN0: case OP_RETURN1: { + if (!(fs->needclose || p->is_vararg)) + break; /* no extra work */ + /* else use OP_RETURN to do the extra work */ + SET_OPCODE(*pc, OP_RETURN); + } /* FALLTHROUGH */ + case OP_RETURN: case OP_TAILCALL: { + if (fs->needclose || p->is_vararg) { + SETARG_C(*pc, p->is_vararg ? p->numparams + 1 : 0); + SETARG_k(*pc, 1); /* signal that there is extra work */ + } + break; + } + case OP_JMP: { + int target = finaltarget(p->code, i); + fixjump(fs, i, target); + break; + } + default: break; + } + } +} diff --git a/source/lua/lcode.h b/source/lua/lcode.h new file mode 100644 index 0000000..0758f88 --- /dev/null +++ b/source/lua/lcode.h @@ -0,0 +1,93 @@ +/* +** $Id: lcode.h $ +** Code generator for Lua +** See Copyright Notice in lua.h +*/ + +#ifndef lcode_h +#define lcode_h + +#include "llex.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" + + +/* +** Marks the end of a patch list. It is an invalid value both as an absolute +** address, and as a list link (would link an element to itself). +*/ +#define NO_JUMP (-1) + + +/* +** grep "ORDER OPR" if you change these enums (ORDER OP) +*/ +typedef enum BinOpr { + OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW, + OPR_DIV, + OPR_IDIV, + OPR_BAND, OPR_BOR, OPR_BXOR, + OPR_SHL, OPR_SHR, + OPR_CONCAT, + OPR_EQ, OPR_LT, OPR_LE, + OPR_NE, OPR_GT, OPR_GE, + OPR_AND, OPR_OR, + OPR_NOBINOPR +} BinOpr; + + +#define luaK_codeABC(fs,o,a,b,c) luaK_codeABCk(fs,o,a,b,c,0) + + +typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr; + + +/* get (pointer to) instruction of given 'expdesc' */ +#define getinstruction(fs,e) ((fs)->f->code[(e)->u.info]) + + +#define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET) + +#define luaK_jumpto(fs,t) luaK_patchlist(fs, luaK_jump(fs), t) + +LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx); +LUAI_FUNC int luaK_codeAsBx (FuncState *fs, OpCode o, int A, int Bx); +LUAI_FUNC int luaK_codeABCk (FuncState *fs, OpCode o, int A, + int B, int C, int k); +LUAI_FUNC int luaK_isKint (expdesc *e); +LUAI_FUNC void luaK_fixline (FuncState *fs, int line); +LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n); +LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n); +LUAI_FUNC void luaK_checkstack (FuncState *fs, int n); +LUAI_FUNC int luaK_stringK (FuncState *fs, TString *s); +LUAI_FUNC void luaK_int (FuncState *fs, int reg, lua_Integer n); +LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2anyregup (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key); +LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k); +LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_goiffalse (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e); +LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults); +LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_jump (FuncState *fs); +LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret); +LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target); +LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list); +LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2); +LUAI_FUNC int luaK_getlabel (FuncState *fs); +LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v, int line); +LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v); +LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, + expdesc *v2, int line); +LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore); +LUAI_FUNC void luaK_finish (FuncState *fs); +LUAI_FUNC l_noret luaK_semerror (LexState *ls, const char *msg); + + +#endif diff --git a/source/lua/lcode.o b/source/lua/lcode.o new file mode 100644 index 0000000000000000000000000000000000000000..033c02a16e7276c26ca120a169892e4334734321 GIT binary patch literal 24048 zcmeHve_UMEweJ}qFa$a?saUzzTgQr(Sf!Ar3jUk}GvSbs1kEq}2}mX(%?}XHB(c>1 zJrHv`8Oyu1y?*q*+w@*mHzX?n)U>74%@@^_A|+biHV82__Vs# zK_h-cD4z4Jp=91=z%=Xlgjp~v5!O69USt31kZ)`%L+RO?);6Tz$ei*nO-QozZ~9JL4J@U>y&~J{Qk&bQ625Vi3a!X+rW{%LWX4|Jd^b zlk)3}^+meAIy+p_Y}ij4iJX1bPLEw`FPIs&+j53$BHE3&DYnG3k$9eGzbUyIt#9jMAg8h< zc8%dpGfTtv%F@Q0ZoXB&MZZi8V(1%nzhSgSUUq%po>Q;yT|I{=hO|omQ(K;HSB=y-?qfN zsllsTkxM=Lv087)^dF1l2hDtt9jneSjEAX#eAgGORMw{XVQCLlJMYTrX%Bl)FP=wtSt*aK z744~YRj#Uozf!zApyFN80ODOW+<*3|@$T7pmOV6-^jo8zp4SluJbyQMkp_PG`|K?A zt4;bl)DfEgY<=s_*@>%r61}il?HcIWv+gtTb12Fk>dxP9=k01R?C~8m9wS~UX2%il z{Cz(_1sS$34O_QgShT>fKh^E0BZz#7j@!{>!XJJynf39+ME_vyQOWUL=6I>( z2-w=~br_-usqjDR+FbuVe#CVMcocpVjOR|2?4gm#IBUdbd5y%vl7L|!9uAjyv+$=F z#*$NFAgTnCSD!%d7)Ql(*HC2d_U+B45MkGNpPs#5h7c zlW%`AF){W_%!sJoiynvzHSierf#e8P-zW4&GEqIMC+i7u5W%cjsv#dG$4vW$x7Qk71AG?5=rXr#EFXC2Qq&$f3o?J-0WjF}(UQT6L16}aJ}L{B1pN;T`Xf90 z2mO6FrS&X2sEfm#u#g4C>|p)CiYVBFTjhmj7nB1Dz+}+>?eo!e&$~;0{{(tK7iB~K z2Z?Lnpuax{ReQ6i5dO)u8X34!@4|&Kk8&UoJ|Kjz$BZR18|z z<(l~v%zGf47GF|SwImQjfPlTF4b1<2niR5MveUh_!b^lkjn>-WRkbA>x{bKsh}VVc z6ZO3(BJpWhrbL328;jyKV((8Beh#5VM>Ysf5&U$|VAb&5O;tm8)l?04UspBkpFfV+ ztoI)3?$IWYH;(3AM46$UzcXBgur=tPi@(oKM@8TwO`Fj2hjcq%$!)#q5km{)AFxJp zQ~e*(EJ5#)M58BM_40--W8W9w*2l;nKQPNy3kxq$kdr1kZ zQcp{CQXYM1v{)ZH=pQ;52^{wNmYmP1adu)0m{vXC`RNTKvn)o z>MBAf`C+{bdxo(}`nNR{Rvp+-*n9FM#OclrZR#jIighgB9S{qdunt;J{nRAv-=-JZ zJ3Zs!s=*DuYeW;@CcO|jPuO!Hv}s+~-IVPS_Et=ZjA75j3ULUlhP5xWiJa}T5DYQ0 zn5=SAJ_M9+k@&PeiUp`t2D`PF8+H*m(8_b#@{=6?fLsTDWA98pfT#z)r8nP7oZ(x& zJBgwFvhW*E{()pEsF_0M3-i2cdlb*Ljt9)C*70fP+2m6irgqcy*^~1ZuSisTFekl- z;nteHGylCEv?AHlNK0h;6B97}{GIkR5jzGX!|B8@2eu{qTP*q;4i98!?alS0`6Pdl zzby9d&CLT$QpIxyV9Xbh&DgWNyTC8$wT|bnyFp)!uzymn(q6Sj5BRsun+knTt(;%I z&P$0CefWRZgDa_mCdu4<}3Br`Sk+Bbq@O-kbH?gnaTf6~^#rU1dQeI`-0l z$eMQ_y7R-eUTY*T`O?wT*^E5~z4?E)*z4c6c53qTWT)G@AVUpg2talD!`8^uZzjR)(cZvR0fH}HEE$CwhrSk;aVe8Fh#xZA-Vavit7u!-1-TGh_U-syu(sB z2MHOL>55}}J}Mo;N;kPdKqWrRvuW`vHWCBm2ZmgM)~+Qt!UpY#Xc0vAQ%c!S@|)-t zJ=r@+(s}4BHC;}MjAuqXEeI(pRmgS{ukq?tyZwD9uq2{6>`V+L594_JT`+k~ETkb# z_kAAj7w-y$ z<8z9_RU`hs-$E)9{naCs-}w9fjBgN%P2YqW5b>PqFGPR3Jrs`wBlhb6^r6@D!q{9D zhV6HHN02ml>_|!S({ZBO3o3>^#GGngMNNEBFpRBNp@`tb!yZO@ZZD!xp3H)W38~_% z(Z%tweNd+E$l1g8>XPIkSTh8V*yEz=O%iGZn6RLl0Q5Ssx28xulsy$Y5_Yx=$y47! zbjc&{(3m6khvv6aUI6ezOqY@9qR9}3o_ZE~Tjp2~_#h*mOY!!3c!Bx%*73Ypc^&dZ z1nncq2gwR+)Ar5rNkpc?0ehcF5@wo>A_}Tr{M#0Vv3f_CyBF;_R^MNAHk0#X|RNdHLw6!QcpX%Bk(|16v&l|OXY-+Pc! z3p!&O8T+ksJkESvjM%zc%QL6r1VTtCApf=nVG4QjWa8#qA!O>lPi4F_5;5SfBp*Vz zW4~WE;4nIwA6i%Cndcf}v5}#J!zZma$PZ+KZ>Id)BGu46wy)1K@eK3;FBy9lv*NIC zah`Mx(|`$pfj=XX_@`mxSm&Uu$KGro7|69Dpv;ce zFKHLAB(sHF=5_USyd#Y(QZcAoC$A!junUmVK_I<%P?zFK(fXqhDc}TZp&>t5q2-|yb5U10onD$`BL$4Pj*fk)XFBI*= z_DK4ioGv~Us^-8h{W(Z@5(B?qjn^Qu|W%67C<6p%Q zQ6Y?|81+g$dQW9)O+Ta+;z4B0%bO5HUmUhm!f9TK zRQx_kj_){{OZ(p`} zAR;);DZ?O)_*^6zFpYQw_7KB+7sP=FATZ&HUx8sGg4lF$xf{%n8#sud0Cu?EKH?bn z*=l}_xQ=w1->7_vB{D!`Obd~(D>`@38Bwtpij*E^AXs}`v_Cm&Ne`I*2!{`!n~9iQ2+Jz zd-_7r!NlVwG=-1B6w)>jKE?6tq*?`ndg*s7eL&}eDinnkf$x4T4yJBP{c@n6Ei1b zZje~+@;mB<`_Rl%eQfk*inS1e0{++DV!v_H(=IjnWzdg3nw}5q$~?1`7BxEOe1p13 z{Rw-;bUmdoq$e0M(kU7urBhyb{frb6jN8GD^UF!OKSTZO!px>>P%Y=tNOXFWKY%xn z{lh8qEd!4;7fCM*;rL3g*@VC!-jM~4h>9{1L=crCE%45@N8#l=J}aw}^U z_dX&wo-$im2!4BI)*(fqElHS`5MS&p5fzRkx4HGv_0x zt(PQEw%G_iW-AU_&3W=1P%fYwL}Lg?tC3U^2}hzjg?kJgb1pO~oU~6dI-~$9A13*J z?(m1x&PQsCs%it+xAS?3!~crOm#@G9;ig$r<5^Ik`E{t$-}gf~TgtNbW={pMOfHSc z$mD!kSLXQp{#{Vg8ciEjWf=L0Tn61JY^s?W`%%0a`-1{E2Q6M*R8<{_{UfU7!D#|l z7P$P`XAB+0ZNR+Bo;$q@{rx5xD7xO8O-2i4NC86J-rv6f1O}MMgGK*6!lFfkLT3Ze z2db)z{QYx@zLh)mf9G1!+;0qxqEo#Rmn-O$HULsBDXKq%Kb#;nK96`?Y@N*V_uYf8 z><mo|I$5-?0_ToM4W8${)I`Y#=t7rS%@#c>w;$GLijqzjpkGvP{}#K~3aMrb6h4{`#?@c~Q$c~k#2 zsMDdsFQFx*kd0~3yQ$^*s6AEw-*UStsKKg?X!juO&$GNXOt>e4JQQA&hu{IEl1os5U4$IMjtW$fK7K{x@H@uA^IX>& z3F=oxO8oc!3nEkb$FD^_WnJ;?9hm6}e_t3?=?zadR!ve$JEBs>G2J@x znXo<1CsH_o4q)$u>il8eEGA!>m=IfaYV&7&?2Tw*w;1uJeuK?E<)qp6HbaX(5T> zQuRF&_v)9y;2goA2Nc?*Wt4M+2VhUB4@9;u;+NQ$5Gh<*>_YU%ufbR9XE2^+1L!~X zE4+!dLdF&{`d#P&TM@N|ITyP-gqqYW%)E@?N0QYL3?`M@OPJjKP%rx9SJGd5FjY@% zML0i_JR8KR%P@0}`KEquKtC$X$nDE%yScx@h*Ar|S;l9QIC;e=a=Q17_!WqT-cG?BQ;;}7ra{e(`fH(ZS; zF1@;&=v?q1Z9Xtvh?O2|xi{QW&o_1GS3kEhPsougN+4t9S}Eh}PNcIt_xP!65#*7l`% zwzjY7GF#S|;?3-AUlr^!J7cY8tTP%k+uMVy+Se?XM1;0?PJ%Rne=C2}z~40R|B(jh z9~?Lf;*2QEVryE>742(+@ZjkBj?QRT7k#aXMwfO8mtNhn=FVVeboq)dGuqjuX|**q zR|ZQL-5y(G#)4lfn^{(V+2t|uRk5Ms^0M-oWfc|EWkqmCdBx@BmzP(e<09_d^Nkxc z&-#Gp^M!fd0pt#JHgg`=(Z3#{LKv;0RBGizU|2>)iSn}n&qjWKou1Xcz`a@3zT!l7 z#24J0qx(uXP6_+Ut=zS~$~IqUnXgj!l^edwrM}Pt@vcwxmFm7AnxJX5&l@S22{w-~ z&y~z`bC&Ka-k2Ts1+APVzS1SW^3|eQ*jKEJW}sV$-)r1%3C2aTe1~MYmt;xgRQpOd zlPnu^bzh~GH`~|H?rU7)YhLPW)O`(Ew@md_q81WYJH)9j5aYg@_@OM84}mo>Hr;_O zWsLMqh4i?dG0Ll`5Vo1I8i7b`3uBdpwfO?|c>Id7pAa_ZFOKJWUnr{!D&2)K3}X;a zVH8h8t0U0QGd{1TT?!UCSevL^Onhhi0#;V7uRQC9slGtXE}wUHLDs`Q?=A!L1-ep@ z%w&4p&>)lX1vb(=SlP3EL9`*&>pri69Gz^XnQ4DSyrFxZvl^PS24C~SslFf@%jtqz z1^@fF4cQUNvpEYhx-lCDVdX5{1?pi)|CG;5IvZr#%ZL_*us<+H?^@Uwpl6b?pAv>b z*a^mjJuw!b?Kui@0yu%w+8E9oQzu=x~Gz zwf!f?&K8KowlY>mShF14ZpMUtt@H)Rr(b03LZX9*+=j_6$Ll!b?SzZDGidJWe4+K} zxeFKEqNY)fKZl4ltw}xvR>@ccV)1OHj7yV~hkhe}mqd72dVc#ax&m;O%{D%f!EBvRP zePIjJE;x-Ap^1GBL()R1e~M|p%wsxp%$T#((r|DQ2KSs1Ri8p4>2FwZTxR#YNqL~Y&dPMW)~Q~ zwurA|v9C?{HN*POFrTvumiXFc`#R7KtsCdDb6cnN>s-Tb_f^7su9y5yTeq4{UC4y* zn9TQF;)@c%Zxdt6*U7H`iLnR~onj|TF!wdWPU;Hg`if_XSB=(){oJOO+MG$}HMH)o za!Doarx5D_mFzS4QA}DJ)?&SYEYA=oJ-eVijn6BfwW)!5+)Iqme}Y_pGp*4ZY2CM` z%*N7EC)I@L01B|2Re<>@trJUuLeQMnnk~%FCVr>rAZw278jDSBfuMbgY5Py7ZA{a` zHc8*dnO4PMlD#mW8fw~CY5dN<%FT51Sq0xnzlRI%Out78zMg&$!yj(}i(8oA4_Tk5 z>7o{{h!wCD+QAAZM{X3{=+aJIK~_Q%r4=^2fa12IPqfiT1Vh~Ay{Om1Bb_t^y-8AiJB6eN3Eh3*C`cjJ`JISB;t?CU+g zMq~=j^F^wZ{Xo`KUn4&23TXXlG*+p{ooP6Z+b z%hT^V#m%endxYD*%57PG#B7!y5!%Yl>XZ6&B#%U&q0rRiXzz;9;wH&H<9~?-|G@vw zRIS-7xX6`(&1O8nLsPjf#Yf`b!T5B1Q(2B5;aeD2Id2E!qm28A7=^}7^y7@z z2vpPlneh;-PUOG99%a0T@t-jLuNg0ARft@c>#{Wtiu_HF5&Wp%X08&sEU-T@KFYYr zTYYwrrj$a+8oA58Mhg~k?{@|q@VFN#|*ejI;8@5kgryPxs>jEfuubq_IKULpy3*xLVKyn*o_GoKxdYZpo2RmQbd zbUa?xs&%xOt!-u$hvL!YT4!{1``YN*mQ^vFoYUD^lX%y_UAj^;+t|_qaqCqrU1pkgS!Xl~#$6h{;9Rb3MOSA_*%f6SEuCgrCAwJN zVn%U9zjOs1-pSgEa&6g)^Cs{HD&9by7Hd%|SPqDQ-TeY0ZjNL`0LhrnN-~FsF$$ zAkj`K)10Q|QFB$x?NKHc219cpsigh1w_%zUv!zkJx@M*Gizkg#s&`eZueNCGN=#`h zlj6)a+PPMmizRJOu7HB4Q;!?)CHM|)TL9WUff+&g9>t$Asd?9Ut~G+HJ~m5<{|c@h;jF8-+` zw@i=ltWC!c_o<>35P(8_h+bvT0mj|*cVwVnn}Pl%2Yw0ot9}a+zo@8weezQ) zW!&BG0SEqN&?-JB9QdUU+{bybTR*E9r@Vm1tMW5-7DfGD=HN4n6+(Q}+Jska7bglt zPiwT2XC?2a3IB=%f6{@MJMhbRlHBy?apK~Z=WD#4Q?*({@v2?PxSPHs1AQz5{hPeb ztMRJ+#uqtpA^z3)sqxNWT+weLVNmXK(9giPqW{o=JN0%mCw#>JItP6L=NE*3)q&sP zz^`%OpE_`-oB_^9h>w$gt^;?{-|E0?9Q^;_z{3u_jrSSE--$n(0sl<~{6q%)K{h@& z|6g;W;KuXWunDIF06&<(B8}4ET3AFLTq6GERO(s#W{798UO%-YHKJ<4SLpthX5sdZ!+~ z#DQDUtGGOqapFH4KQ%849rzpv9&_N%dFgZDPW${f2kxBr4;WYSG?M@*Ip@o#d%R~k zaHsym4&14qOD~w@@SizwC!ZG_xRcL#iR4f7OCgrVK;;9* zX}r!jeQ4Z(W>q~qKuM=wDs_=b`vwNlKlZ*!?yEGnP{-rKF z$T+PXR22UP=2I!*G#=swHRQq@7&lz_dd3@E_;$t{UHCY!6U{C>$@Fb5{36CXGT`f7 zcsbMeWWYDM@Ne+CGT_2DF@C=b-@^Eo4EVz?d>_+qb>X9oZ+GDh0SOGc@HWQxxo{=_ z{tWnw8Sv2zcrpV%o&i6e0T%{^I%RJm9E4J@U4tDxNt?^=)x6!a|XOE1K#1ngWT_W7p~;* z$$)RlfDdHA@6Uj5$$&rX!nd%TTV1%4f4d8B=JjSU1HLZefZy-Ji-VXnlr0(Xhcn!Gw z9-@s5it-~x-@y3QF8UtEmHjLF0mhfQ=(jMg>{ihaGQQbGKg#$P7e3DTuUxpg|Jvum z)&1B1bm8j$>wOol?!QWNq&}3K>i+9$7v97Bng$oXpYeSzT-{%vaN+9y+L+?%m(Qox zyKr@n_K*u#_h|cFxVrBy;{Bf*m%8t6cH!#2`(YQppU;)l{xZ#n@4MIYzEk1q{%*4i zSNC^YT)4Ww`-2Nt_vZM28x=+ISND1gUAVf}d&q^Wd%gWGT;1!PaN+7+FW@+LrM}g@ zUb72V_j-daJiz(SxC`IU_$_qsfTG5w?)6L;uI}}=x^Q)`rG9Z$1UKHJn= zXLMCdnTZP!t!!zF*`k%*-qocEpe(j#)rytTRd;G-o$XXdtt-kZ@JVeXc4}RvR@U0S zdUX`nF=cDo&1hNeyhWGETO8Ra+SatJvt@Nuj_d#RZx9S9M6)@j*@gJ+)r-=QcnO^P zDW;KJF66?CbqVyaz0r1+`e8FjpZ9->aSj)<5&m9C6=x{CoTO_m#T)Vbzim(dedd|Q z|JU{(;`TG}bQaa#aDsSO@~h`U#>hUMrGv-+uxns${m)0EGwJ_+?pWC~>7S;;t$)fd zNEWyJ#g_m?DVLA*U)5g8zY;a{?xr)i{pIPF@rU%BPZFp?!Eclm3hal0wCM(jQ&bsP=r^f&b6*(`}Dh7T-vJHSN3dk^bwJpT6C) k6LH(uWRp?$ADZ`4{M`Lh*mIePXlPs`9@>+xN_YSN3!mRvb^rhX literal 0 HcmV?d00001 diff --git a/source/lua/lcorolib.c b/source/lua/lcorolib.c new file mode 100644 index 0000000..cdb5fed --- /dev/null +++ b/source/lua/lcorolib.c @@ -0,0 +1,201 @@ +/* +** $Id: lcorolib.c $ +** Coroutine Library +** See Copyright Notice in lua.h +*/ + +#define lcorolib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +static lua_State *getco (lua_State *L) { + lua_State *co = lua_tothread(L, 1); + luaL_argexpected(L, co, 1, "thread"); + return co; +} + + +static int auxresume (lua_State *L, lua_State *co, int narg) { + int status, nres; + if (!lua_checkstack(co, narg)) { + lua_pushliteral(L, "too many arguments to resume"); + return -1; /* error flag */ + } + if (lua_status(co) == LUA_OK && lua_gettop(co) == 0) { + lua_pushliteral(L, "cannot resume dead coroutine"); + return -1; /* error flag */ + } + lua_xmove(L, co, narg); + status = lua_resume(co, L, narg, &nres); + if (status == LUA_OK || status == LUA_YIELD) { + if (!lua_checkstack(L, nres + 1)) { + lua_pop(co, nres); /* remove results anyway */ + lua_pushliteral(L, "too many results to resume"); + return -1; /* error flag */ + } + lua_xmove(co, L, nres); /* move yielded values */ + return nres; + } + else { + lua_xmove(co, L, 1); /* move error message */ + return -1; /* error flag */ + } +} + + +static int luaB_coresume (lua_State *L) { + lua_State *co = getco(L); + int r; + r = auxresume(L, co, lua_gettop(L) - 1); + if (r < 0) { + lua_pushboolean(L, 0); + lua_insert(L, -2); + return 2; /* return false + error message */ + } + else { + lua_pushboolean(L, 1); + lua_insert(L, -(r + 1)); + return r + 1; /* return true + 'resume' returns */ + } +} + + +static int luaB_auxwrap (lua_State *L) { + lua_State *co = lua_tothread(L, lua_upvalueindex(1)); + int r = auxresume(L, co, lua_gettop(L)); + if (r < 0) { + if (lua_type(L, -1) == LUA_TSTRING) { /* error object is a string? */ + luaL_where(L, 1); /* add extra info */ + lua_insert(L, -2); + lua_concat(L, 2); + } + return lua_error(L); /* propagate error */ + } + return r; +} + + +static int luaB_cocreate (lua_State *L) { + lua_State *NL; + luaL_checktype(L, 1, LUA_TFUNCTION); + NL = lua_newthread(L); + lua_pushvalue(L, 1); /* move function to top */ + lua_xmove(L, NL, 1); /* move function from L to NL */ + return 1; +} + + +static int luaB_cowrap (lua_State *L) { + luaB_cocreate(L); + lua_pushcclosure(L, luaB_auxwrap, 1); + return 1; +} + + +static int luaB_yield (lua_State *L) { + return lua_yield(L, lua_gettop(L)); +} + + +#define COS_RUN 0 +#define COS_DEAD 1 +#define COS_YIELD 2 +#define COS_NORM 3 + + +static const char *statname[] = {"running", "dead", "suspended", "normal"}; + + +static int auxstatus (lua_State *L, lua_State *co) { + if (L == co) return COS_RUN; + else { + switch (lua_status(co)) { + case LUA_YIELD: + return COS_YIELD; + case LUA_OK: { + lua_Debug ar; + if (lua_getstack(co, 0, &ar)) /* does it have frames? */ + return COS_NORM; /* it is running */ + else if (lua_gettop(co) == 0) + return COS_DEAD; + else + return COS_YIELD; /* initial state */ + } + default: /* some error occurred */ + return COS_DEAD; + } + } +} + + +static int luaB_costatus (lua_State *L) { + lua_State *co = getco(L); + lua_pushstring(L, statname[auxstatus(L, co)]); + return 1; +} + + +static int luaB_yieldable (lua_State *L) { + lua_pushboolean(L, lua_isyieldable(L)); + return 1; +} + + +static int luaB_corunning (lua_State *L) { + int ismain = lua_pushthread(L); + lua_pushboolean(L, ismain); + return 2; +} + + +static int luaB_kill (lua_State *L) { + lua_State *co = getco(L); + int status = auxstatus(L, co); + switch (status) { + case COS_DEAD: case COS_YIELD: { + status = lua_resetthread(co); + if (status == LUA_OK) { + lua_pushboolean(L, 1); + return 1; + } + else { + lua_pushboolean(L, 0); + lua_xmove(co, L, 1); /* copy error message */ + return 2; + } + } + default: /* normal or running coroutine */ + return luaL_error(L, "cannot kill a %s coroutine", statname[status]); + } +} + + +static const luaL_Reg co_funcs[] = { + {"create", luaB_cocreate}, + {"resume", luaB_coresume}, + {"running", luaB_corunning}, + {"status", luaB_costatus}, + {"wrap", luaB_cowrap}, + {"yield", luaB_yield}, + {"isyieldable", luaB_yieldable}, + {"kill", luaB_kill}, + {NULL, NULL} +}; + + + +LUAMOD_API int luaopen_coroutine (lua_State *L) { + luaL_newlib(L, co_funcs); + return 1; +} + diff --git a/source/lua/lcorolib.o b/source/lua/lcorolib.o new file mode 100644 index 0000000000000000000000000000000000000000..0eb0ccac0d6481e0818d753cfc9cb8e47ccba9ef GIT binary patch literal 7680 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 z + +LUAI_DDEF const lu_byte luai_ctype_[UCHAR_MAX + 2] = { + 0x00, /* EOZ */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0. */ + 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 1. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, /* 2. */ + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, /* 3. */ + 0x16, 0x16, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x05, /* 4. */ + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, /* 5. */ + 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x05, + 0x04, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x05, /* 6. */ + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, /* 7. */ + 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 8. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 9. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* a. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* b. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* c. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* d. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* e. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* f. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +#endif /* } */ diff --git a/source/lua/lctype.h b/source/lua/lctype.h new file mode 100644 index 0000000..cbff4d7 --- /dev/null +++ b/source/lua/lctype.h @@ -0,0 +1,95 @@ +/* +** $Id: lctype.h $ +** 'ctype' functions for Lua +** See Copyright Notice in lua.h +*/ + +#ifndef lctype_h +#define lctype_h + +#include "lua.h" + + +/* +** WARNING: the functions defined here do not necessarily correspond +** to the similar functions in the standard C ctype.h. They are +** optimized for the specific needs of Lua +*/ + +#if !defined(LUA_USE_CTYPE) + +#if 'A' == 65 && '0' == 48 +/* ASCII case: can use its own tables; faster and fixed */ +#define LUA_USE_CTYPE 0 +#else +/* must use standard C ctype */ +#define LUA_USE_CTYPE 1 +#endif + +#endif + + +#if !LUA_USE_CTYPE /* { */ + +#include + +#include "llimits.h" + + +#define ALPHABIT 0 +#define DIGITBIT 1 +#define PRINTBIT 2 +#define SPACEBIT 3 +#define XDIGITBIT 4 + + +#define MASK(B) (1 << (B)) + + +/* +** add 1 to char to allow index -1 (EOZ) +*/ +#define testprop(c,p) (luai_ctype_[(c)+1] & (p)) + +/* +** 'lalpha' (Lua alphabetic) and 'lalnum' (Lua alphanumeric) both include '_' +*/ +#define lislalpha(c) testprop(c, MASK(ALPHABIT)) +#define lislalnum(c) testprop(c, (MASK(ALPHABIT) | MASK(DIGITBIT))) +#define lisdigit(c) testprop(c, MASK(DIGITBIT)) +#define lisspace(c) testprop(c, MASK(SPACEBIT)) +#define lisprint(c) testprop(c, MASK(PRINTBIT)) +#define lisxdigit(c) testprop(c, MASK(XDIGITBIT)) + +/* +** this 'ltolower' only works for alphabetic characters +*/ +#define ltolower(c) ((c) | ('A' ^ 'a')) + + +/* two more entries for 0 and -1 (EOZ) */ +LUAI_DDEC(const lu_byte luai_ctype_[UCHAR_MAX + 2];) + + +#else /* }{ */ + +/* +** use standard C ctypes +*/ + +#include + + +#define lislalpha(c) (isalpha(c) || (c) == '_') +#define lislalnum(c) (isalnum(c) || (c) == '_') +#define lisdigit(c) (isdigit(c)) +#define lisspace(c) (isspace(c)) +#define lisprint(c) (isprint(c)) +#define lisxdigit(c) (isxdigit(c)) + +#define ltolower(c) (tolower(c)) + +#endif /* } */ + +#endif + diff --git a/source/lua/lctype.o b/source/lua/lctype.o new file mode 100644 index 0000000000000000000000000000000000000000..3db082c3626407831a7308a98fed09eca958c16d GIT binary patch literal 1336 zcmcgs%}#?r5FQHkr}5H*jfodLsfpcyK@v?gm_~b1nx`@31rT%^$Nryj@&fHZ% zFf)b#B$E8^x3H8IL+NUf< zY-1MNYk6XCK{feJ?C^YfhyR+ti}~!eESrD8`^zUU`WNScaSUd*mWzWbo5?DvOgra; zx)RUn;s&0gUvSmX7Zs_9Z6hbo&g$Irfv%ZRfn1i^^6V^p#sfci?m9}g&*IOtRpC|r NZ+X!Uj}t=f{|)ecJh}h? literal 0 HcmV?d00001 diff --git a/source/lua/ldblib.c b/source/lua/ldblib.c new file mode 100644 index 0000000..ada3525 --- /dev/null +++ b/source/lua/ldblib.c @@ -0,0 +1,464 @@ +/* +** $Id: ldblib.c $ +** Interface from Lua to its debug API +** See Copyright Notice in lua.h +*/ + +#define ldblib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** The hook table at registry[&HOOKKEY] maps threads to their current +** hook function. (We only need the unique address of 'HOOKKEY'.) +*/ +static const int HOOKKEY = 0; + + +/* +** If L1 != L, L1 can be in any state, and therefore there are no +** guarantees about its stack space; any push in L1 must be +** checked. +*/ +static void checkstack (lua_State *L, lua_State *L1, int n) { + if (L != L1 && !lua_checkstack(L1, n)) + luaL_error(L, "stack overflow"); +} + + +static int db_getregistry (lua_State *L) { + lua_pushvalue(L, LUA_REGISTRYINDEX); + return 1; +} + + +static int db_getmetatable (lua_State *L) { + luaL_checkany(L, 1); + if (!lua_getmetatable(L, 1)) { + lua_pushnil(L); /* no metatable */ + } + return 1; +} + + +static int db_setmetatable (lua_State *L) { + int t = lua_type(L, 2); + luaL_argexpected(L, t == LUA_TNIL || t == LUA_TTABLE, 2, "nil or table"); + lua_settop(L, 2); + lua_setmetatable(L, 1); + return 1; /* return 1st argument */ +} + + +static int db_getuservalue (lua_State *L) { + int n = (int)luaL_optinteger(L, 2, 1); + if (lua_type(L, 1) != LUA_TUSERDATA) + lua_pushnil(L); + else if (lua_getiuservalue(L, 1, n) != LUA_TNONE) { + lua_pushboolean(L, 1); + return 2; + } + return 1; +} + + +static int db_setuservalue (lua_State *L) { + int n = (int)luaL_optinteger(L, 3, 1); + luaL_checktype(L, 1, LUA_TUSERDATA); + luaL_checkany(L, 2); + lua_settop(L, 2); + if (!lua_setiuservalue(L, 1, n)) + lua_pushnil(L); + return 1; +} + + +/* +** Auxiliary function used by several library functions: check for +** an optional thread as function's first argument and set 'arg' with +** 1 if this argument is present (so that functions can skip it to +** access their other arguments) +*/ +static lua_State *getthread (lua_State *L, int *arg) { + if (lua_isthread(L, 1)) { + *arg = 1; + return lua_tothread(L, 1); + } + else { + *arg = 0; + return L; /* function will operate over current thread */ + } +} + + +/* +** Variations of 'lua_settable', used by 'db_getinfo' to put results +** from 'lua_getinfo' into result table. Key is always a string; +** value can be a string, an int, or a boolean. +*/ +static void settabss (lua_State *L, const char *k, const char *v) { + lua_pushstring(L, v); + lua_setfield(L, -2, k); +} + +static void settabsi (lua_State *L, const char *k, int v) { + lua_pushinteger(L, v); + lua_setfield(L, -2, k); +} + +static void settabsb (lua_State *L, const char *k, int v) { + lua_pushboolean(L, v); + lua_setfield(L, -2, k); +} + + +/* +** In function 'db_getinfo', the call to 'lua_getinfo' may push +** results on the stack; later it creates the result table to put +** these objects. Function 'treatstackoption' puts the result from +** 'lua_getinfo' on top of the result table so that it can call +** 'lua_setfield'. +*/ +static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) { + if (L == L1) + lua_rotate(L, -2, 1); /* exchange object and table */ + else + lua_xmove(L1, L, 1); /* move object to the "main" stack */ + lua_setfield(L, -2, fname); /* put object into table */ +} + + +/* +** Calls 'lua_getinfo' and collects all results in a new table. +** L1 needs stack space for an optional input (function) plus +** two optional outputs (function and line table) from function +** 'lua_getinfo'. +*/ +static int db_getinfo (lua_State *L) { + lua_Debug ar; + int arg; + lua_State *L1 = getthread(L, &arg); + const char *options = luaL_optstring(L, arg+2, "flnSrtu"); + checkstack(L, L1, 3); + if (lua_isfunction(L, arg + 1)) { /* info about a function? */ + options = lua_pushfstring(L, ">%s", options); /* add '>' to 'options' */ + lua_pushvalue(L, arg + 1); /* move function to 'L1' stack */ + lua_xmove(L, L1, 1); + } + else { /* stack level */ + if (!lua_getstack(L1, (int)luaL_checkinteger(L, arg + 1), &ar)) { + lua_pushnil(L); /* level out of range */ + return 1; + } + } + if (!lua_getinfo(L1, options, &ar)) + return luaL_argerror(L, arg+2, "invalid option"); + lua_newtable(L); /* table to collect results */ + if (strchr(options, 'S')) { + settabss(L, "source", ar.source); + settabss(L, "short_src", ar.short_src); + settabsi(L, "linedefined", ar.linedefined); + settabsi(L, "lastlinedefined", ar.lastlinedefined); + settabss(L, "what", ar.what); + } + if (strchr(options, 'l')) + settabsi(L, "currentline", ar.currentline); + if (strchr(options, 'u')) { + settabsi(L, "nups", ar.nups); + settabsi(L, "nparams", ar.nparams); + settabsb(L, "isvararg", ar.isvararg); + } + if (strchr(options, 'n')) { + settabss(L, "name", ar.name); + settabss(L, "namewhat", ar.namewhat); + } + if (strchr(options, 'r')) { + settabsi(L, "ftransfer", ar.ftransfer); + settabsi(L, "ntransfer", ar.ntransfer); + } + if (strchr(options, 't')) + settabsb(L, "istailcall", ar.istailcall); + if (strchr(options, 'L')) + treatstackoption(L, L1, "activelines"); + if (strchr(options, 'f')) + treatstackoption(L, L1, "func"); + return 1; /* return table */ +} + + +static int db_getlocal (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + lua_Debug ar; + const char *name; + int nvar = (int)luaL_checkinteger(L, arg + 2); /* local-variable index */ + if (lua_isfunction(L, arg + 1)) { /* function argument? */ + lua_pushvalue(L, arg + 1); /* push function */ + lua_pushstring(L, lua_getlocal(L, NULL, nvar)); /* push local name */ + return 1; /* return only name (there is no value) */ + } + else { /* stack-level argument */ + int level = (int)luaL_checkinteger(L, arg + 1); + if (!lua_getstack(L1, level, &ar)) /* out of range? */ + return luaL_argerror(L, arg+1, "level out of range"); + checkstack(L, L1, 1); + name = lua_getlocal(L1, &ar, nvar); + if (name) { + lua_xmove(L1, L, 1); /* move local value */ + lua_pushstring(L, name); /* push name */ + lua_rotate(L, -2, 1); /* re-order */ + return 2; + } + else { + lua_pushnil(L); /* no name (nor value) */ + return 1; + } + } +} + + +static int db_setlocal (lua_State *L) { + int arg; + const char *name; + lua_State *L1 = getthread(L, &arg); + lua_Debug ar; + int level = (int)luaL_checkinteger(L, arg + 1); + int nvar = (int)luaL_checkinteger(L, arg + 2); + if (!lua_getstack(L1, level, &ar)) /* out of range? */ + return luaL_argerror(L, arg+1, "level out of range"); + luaL_checkany(L, arg+3); + lua_settop(L, arg+3); + checkstack(L, L1, 1); + lua_xmove(L, L1, 1); + name = lua_setlocal(L1, &ar, nvar); + if (name == NULL) + lua_pop(L1, 1); /* pop value (if not popped by 'lua_setlocal') */ + lua_pushstring(L, name); + return 1; +} + + +/* +** get (if 'get' is true) or set an upvalue from a closure +*/ +static int auxupvalue (lua_State *L, int get) { + const char *name; + int n = (int)luaL_checkinteger(L, 2); /* upvalue index */ + luaL_checktype(L, 1, LUA_TFUNCTION); /* closure */ + name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n); + if (name == NULL) return 0; + lua_pushstring(L, name); + lua_insert(L, -(get+1)); /* no-op if get is false */ + return get + 1; +} + + +static int db_getupvalue (lua_State *L) { + return auxupvalue(L, 1); +} + + +static int db_setupvalue (lua_State *L) { + luaL_checkany(L, 3); + return auxupvalue(L, 0); +} + + +/* +** Check whether a given upvalue from a given closure exists and +** returns its index +*/ +static int checkupval (lua_State *L, int argf, int argnup) { + int nup = (int)luaL_checkinteger(L, argnup); /* upvalue index */ + luaL_checktype(L, argf, LUA_TFUNCTION); /* closure */ + luaL_argcheck(L, (lua_getupvalue(L, argf, nup) != NULL), argnup, + "invalid upvalue index"); + return nup; +} + + +static int db_upvalueid (lua_State *L) { + int n = checkupval(L, 1, 2); + lua_pushlightuserdata(L, lua_upvalueid(L, 1, n)); + return 1; +} + + +static int db_upvaluejoin (lua_State *L) { + int n1 = checkupval(L, 1, 2); + int n2 = checkupval(L, 3, 4); + luaL_argcheck(L, !lua_iscfunction(L, 1), 1, "Lua function expected"); + luaL_argcheck(L, !lua_iscfunction(L, 3), 3, "Lua function expected"); + lua_upvaluejoin(L, 1, n1, 3, n2); + return 0; +} + + +/* +** Call hook function registered at hook table for the current +** thread (if there is one) +*/ +static void hookf (lua_State *L, lua_Debug *ar) { + static const char *const hooknames[] = + {"call", "return", "line", "count", "tail call"}; + lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY); + lua_pushthread(L); + if (lua_rawget(L, -2) == LUA_TFUNCTION) { /* is there a hook function? */ + lua_pushstring(L, hooknames[(int)ar->event]); /* push event name */ + if (ar->currentline >= 0) + lua_pushinteger(L, ar->currentline); /* push current line */ + else lua_pushnil(L); + lua_assert(lua_getinfo(L, "lS", ar)); + lua_call(L, 2, 0); /* call hook function */ + } +} + + +/* +** Convert a string mask (for 'sethook') into a bit mask +*/ +static int makemask (const char *smask, int count) { + int mask = 0; + if (strchr(smask, 'c')) mask |= LUA_MASKCALL; + if (strchr(smask, 'r')) mask |= LUA_MASKRET; + if (strchr(smask, 'l')) mask |= LUA_MASKLINE; + if (count > 0) mask |= LUA_MASKCOUNT; + return mask; +} + + +/* +** Convert a bit mask (for 'gethook') into a string mask +*/ +static char *unmakemask (int mask, char *smask) { + int i = 0; + if (mask & LUA_MASKCALL) smask[i++] = 'c'; + if (mask & LUA_MASKRET) smask[i++] = 'r'; + if (mask & LUA_MASKLINE) smask[i++] = 'l'; + smask[i] = '\0'; + return smask; +} + + +static int db_sethook (lua_State *L) { + int arg, mask, count; + lua_Hook func; + lua_State *L1 = getthread(L, &arg); + if (lua_isnoneornil(L, arg+1)) { /* no hook? */ + lua_settop(L, arg+1); + func = NULL; mask = 0; count = 0; /* turn off hooks */ + } + else { + const char *smask = luaL_checkstring(L, arg+2); + luaL_checktype(L, arg+1, LUA_TFUNCTION); + count = (int)luaL_optinteger(L, arg + 3, 0); + func = hookf; mask = makemask(smask, count); + } + if (lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY) == LUA_TNIL) { + lua_createtable(L, 0, 2); /* create a hook table */ + lua_pushvalue(L, -1); + lua_rawsetp(L, LUA_REGISTRYINDEX, &HOOKKEY); /* set it in position */ + lua_pushstring(L, "k"); + lua_setfield(L, -2, "__mode"); /** hooktable.__mode = "k" */ + lua_pushvalue(L, -1); + lua_setmetatable(L, -2); /* setmetatable(hooktable) = hooktable */ + } + checkstack(L, L1, 1); + lua_pushthread(L1); lua_xmove(L1, L, 1); /* key (thread) */ + lua_pushvalue(L, arg + 1); /* value (hook function) */ + lua_rawset(L, -3); /* hooktable[L1] = new Lua hook */ + lua_sethook(L1, func, mask, count); + return 0; +} + + +static int db_gethook (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + char buff[5]; + int mask = lua_gethookmask(L1); + lua_Hook hook = lua_gethook(L1); + if (hook == NULL) /* no hook? */ + lua_pushnil(L); + else if (hook != hookf) /* external hook? */ + lua_pushliteral(L, "external hook"); + else { /* hook table must exist */ + lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY); + checkstack(L, L1, 1); + lua_pushthread(L1); lua_xmove(L1, L, 1); + lua_rawget(L, -2); /* 1st result = hooktable[L1] */ + lua_remove(L, -2); /* remove hook table */ + } + lua_pushstring(L, unmakemask(mask, buff)); /* 2nd result = mask */ + lua_pushinteger(L, lua_gethookcount(L1)); /* 3rd result = count */ + return 3; +} + + +static int db_debug (lua_State *L) { + for (;;) { + char buffer[250]; + lua_writestringerror("%s", "lua_debug> "); + if (fgets(buffer, sizeof(buffer), stdin) == 0 || + strcmp(buffer, "cont\n") == 0) + return 0; + if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") || + lua_pcall(L, 0, 0, 0)) + lua_writestringerror("%s\n", lua_tostring(L, -1)); + lua_settop(L, 0); /* remove eventual returns */ + } +} + + +static int db_traceback (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + const char *msg = lua_tostring(L, arg + 1); + if (msg == NULL && !lua_isnoneornil(L, arg + 1)) /* non-string 'msg'? */ + lua_pushvalue(L, arg + 1); /* return it untouched */ + else { + int level = (int)luaL_optinteger(L, arg + 2, (L == L1) ? 1 : 0); + luaL_traceback(L, L1, msg, level); + } + return 1; +} + + +static const luaL_Reg dblib[] = { + {"debug", db_debug}, + {"getuservalue", db_getuservalue}, + {"gethook", db_gethook}, + {"getinfo", db_getinfo}, + {"getlocal", db_getlocal}, + {"getregistry", db_getregistry}, + {"getmetatable", db_getmetatable}, + {"getupvalue", db_getupvalue}, + {"upvaluejoin", db_upvaluejoin}, + {"upvalueid", db_upvalueid}, + {"setuservalue", db_setuservalue}, + {"sethook", db_sethook}, + {"setlocal", db_setlocal}, + {"setmetatable", db_setmetatable}, + {"setupvalue", db_setupvalue}, + {"traceback", db_traceback}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_debug (lua_State *L) { + luaL_newlib(L, dblib); + return 1; +} + diff --git a/source/lua/ldblib.o b/source/lua/ldblib.o new file mode 100644 index 0000000000000000000000000000000000000000..5630a14575cb57697c7d5afcf971a2b2bb551d1d GIT binary patch literal 17792 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 Ww|(3u9IyS?u7CnaIZyw+?f)lDKink% literal 0 HcmV?d00001 diff --git a/source/lua/ldebug.c b/source/lua/ldebug.c new file mode 100644 index 0000000..bd471e0 --- /dev/null +++ b/source/lua/ldebug.c @@ -0,0 +1,844 @@ +/* +** $Id: ldebug.c $ +** Debug Interface +** See Copyright Notice in lua.h +*/ + +#define ldebug_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lapi.h" +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + + +#define noLuaClosure(f) ((f) == NULL || (f)->c.tt == LUA_TCCL) + + +/* Active Lua function (given call info) */ +#define ci_func(ci) (clLvalue(s2v((ci)->func))) + + +static const char *funcnamefromcode (lua_State *L, CallInfo *ci, + const char **name); + + +static int currentpc (CallInfo *ci) { + lua_assert(isLua(ci)); + return pcRel(ci->u.l.savedpc, ci_func(ci)->p); +} + + +/* +** Get a "base line" to find the line corresponding to an instruction. +** For that, search the array of absolute line info for the largest saved +** instruction smaller or equal to the wanted instruction. A special +** case is when there is no absolute info or the instruction is before +** the first absolute one. +*/ +static int getbaseline (const Proto *f, int pc, int *basepc) { + if (f->sizeabslineinfo == 0 || pc < f->abslineinfo[0].pc) { + *basepc = -1; /* start from the beginning */ + return f->linedefined; + } + else { + unsigned int i; + if (pc >= f->abslineinfo[f->sizeabslineinfo - 1].pc) + i = f->sizeabslineinfo - 1; /* instruction is after last saved one */ + else { /* binary search */ + unsigned int j = f->sizeabslineinfo - 1; /* pc < anchorlines[j] */ + i = 0; /* abslineinfo[i] <= pc */ + while (i < j - 1) { + unsigned int m = (j + i) / 2; + if (pc >= f->abslineinfo[m].pc) + i = m; + else + j = m; + } + } + *basepc = f->abslineinfo[i].pc; + return f->abslineinfo[i].line; + } +} + + +/* +** Get the line corresponding to instruction 'pc' in function 'f'; +** first gets a base line and from there does the increments until +** the desired instruction. +*/ +int luaG_getfuncline (const Proto *f, int pc) { + if (f->lineinfo == NULL) /* no debug information? */ + return -1; + else { + int basepc; + int baseline = getbaseline(f, pc, &basepc); + while (basepc++ < pc) { /* walk until given instruction */ + lua_assert(f->lineinfo[basepc] != ABSLINEINFO); + baseline += f->lineinfo[basepc]; /* correct line */ + } + return baseline; + } +} + + +static int currentline (CallInfo *ci) { + return luaG_getfuncline(ci_func(ci)->p, currentpc(ci)); +} + + +/* +** This function can be called asynchronously (e.g. during a signal), +** under "reasonable" assumptions. A new 'ci' is completely linked +** in the list before it becomes part of the "active" list, and +** we assume that pointers are atomic (see comment in next function). +** (If we traverse one more item, there is no problem. If we traverse +** one less item, the worst that can happen is that the signal will +** not interrupt the script.) +*/ +static void settraps (CallInfo *ci) { + for (; ci != NULL; ci = ci->previous) + if (isLua(ci)) + ci->u.l.trap = 1; +} + + +/* +** This function can be called asynchronously (e.g. during a signal), +** under "reasonable" assumptions. +** Fields 'oldpc', 'basehookcount', and 'hookcount' (set by +** 'resethookcount') are for debug only, and it is no problem if they +** get arbitrary values (causes at most one wrong hook call). 'hookmask' +** is an atomic value. We assume that pointers are atomic too (e.g., gcc +** ensures that for all platforms where it runs). Moreover, 'hook' is +** always checked before being called (see 'luaD_hook'). +*/ +LUA_API void lua_sethook (lua_State *L, lua_Hook func, int mask, int count) { + if (func == NULL || mask == 0) { /* turn off hooks? */ + mask = 0; + func = NULL; + } + if (isLua(L->ci)) + L->oldpc = L->ci->u.l.savedpc; + L->hook = func; + L->basehookcount = count; + resethookcount(L); + L->hookmask = cast_byte(mask); + if (mask) + settraps(L->ci); /* to trace inside 'luaV_execute' */ +} + + +LUA_API lua_Hook lua_gethook (lua_State *L) { + return L->hook; +} + + +LUA_API int lua_gethookmask (lua_State *L) { + return L->hookmask; +} + + +LUA_API int lua_gethookcount (lua_State *L) { + return L->basehookcount; +} + + +LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { + int status; + CallInfo *ci; + if (level < 0) return 0; /* invalid (negative) level */ + lua_lock(L); + for (ci = L->ci; level > 0 && ci != &L->base_ci; ci = ci->previous) + level--; + if (level == 0 && ci != &L->base_ci) { /* level found? */ + status = 1; + ar->i_ci = ci; + } + else status = 0; /* no such level */ + lua_unlock(L); + return status; +} + + +static const char *upvalname (const Proto *p, int uv) { + TString *s = check_exp(uv < p->sizeupvalues, p->upvalues[uv].name); + if (s == NULL) return "?"; + else return getstr(s); +} + + +static const char *findvararg (CallInfo *ci, int n, StkId *pos) { + if (clLvalue(s2v(ci->func))->p->is_vararg) { + int nextra = ci->u.l.nextraargs; + if (n <= nextra) { + *pos = ci->func - nextra + (n - 1); + return "(vararg)"; /* generic name for any vararg */ + } + } + return NULL; /* no such vararg */ +} + + +const char *luaG_findlocal (lua_State *L, CallInfo *ci, int n, StkId *pos) { + StkId base = ci->func + 1; + const char *name = NULL; + if (isLua(ci)) { + if (n < 0) /* access to vararg values? */ + return findvararg(ci, -n, pos); + else + name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci)); + } + if (name == NULL) { /* no 'standard' name? */ + StkId limit = (ci == L->ci) ? L->top : ci->next->func; + if (limit - base >= n && n > 0) { /* is 'n' inside 'ci' stack? */ + /* generic name for any valid slot */ + name = isLua(ci) ? "(temporary)" : "(C temporary)"; + } + else + return NULL; /* no name */ + } + if (pos) + *pos = base + (n - 1); + return name; +} + + +LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { + const char *name; + lua_lock(L); + if (ar == NULL) { /* information about non-active function? */ + if (!isLfunction(s2v(L->top - 1))) /* not a Lua function? */ + name = NULL; + else /* consider live variables at function start (parameters) */ + name = luaF_getlocalname(clLvalue(s2v(L->top - 1))->p, n, 0); + } + else { /* active function; get information through 'ar' */ + StkId pos = NULL; /* to avoid warnings */ + name = luaG_findlocal(L, ar->i_ci, n, &pos); + if (name) { + setobjs2s(L, L->top, pos); + api_incr_top(L); + } + } + lua_unlock(L); + return name; +} + + +LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { + StkId pos = NULL; /* to avoid warnings */ + const char *name; + lua_lock(L); + name = luaG_findlocal(L, ar->i_ci, n, &pos); + if (name) { + setobjs2s(L, pos, L->top - 1); + L->top--; /* pop value */ + } + lua_unlock(L); + return name; +} + + +static void funcinfo (lua_Debug *ar, Closure *cl) { + if (noLuaClosure(cl)) { + ar->source = "=[C]"; + ar->linedefined = -1; + ar->lastlinedefined = -1; + ar->what = "C"; + } + else { + const Proto *p = cl->l.p; + ar->source = p->source ? getstr(p->source) : "=?"; + ar->linedefined = p->linedefined; + ar->lastlinedefined = p->lastlinedefined; + ar->what = (ar->linedefined == 0) ? "main" : "Lua"; + } + luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); +} + + +static int nextline (const Proto *p, int currentline, int pc) { + if (p->lineinfo[pc] != ABSLINEINFO) + return currentline + p->lineinfo[pc]; + else + return luaG_getfuncline(p, pc); +} + + +static void collectvalidlines (lua_State *L, Closure *f) { + if (noLuaClosure(f)) { + setnilvalue(s2v(L->top)); + api_incr_top(L); + } + else { + int i; + TValue v; + const Proto *p = f->l.p; + int currentline = p->linedefined; + Table *t = luaH_new(L); /* new table to store active lines */ + sethvalue2s(L, L->top, t); /* push it on stack */ + api_incr_top(L); + setbvalue(&v, 1); /* boolean 'true' to be the value of all indices */ + for (i = 0; i < p->sizelineinfo; i++) { /* for all lines with code */ + currentline = nextline(p, currentline, i); + luaH_setint(L, t, currentline, &v); /* table[line] = true */ + } + } +} + + +static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) { + if (ci == NULL) /* no 'ci'? */ + return NULL; /* no info */ + else if (ci->callstatus & CIST_FIN) { /* is this a finalizer? */ + *name = "__gc"; + return "metamethod"; /* report it as such */ + } + /* calling function is a known Lua function? */ + else if (!(ci->callstatus & CIST_TAIL) && isLua(ci->previous)) + return funcnamefromcode(L, ci->previous, name); + else return NULL; /* no way to find a name */ +} + + +static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, + Closure *f, CallInfo *ci) { + int status = 1; + for (; *what; what++) { + switch (*what) { + case 'S': { + funcinfo(ar, f); + break; + } + case 'l': { + ar->currentline = (ci && isLua(ci)) ? currentline(ci) : -1; + break; + } + case 'u': { + ar->nups = (f == NULL) ? 0 : f->c.nupvalues; + if (noLuaClosure(f)) { + ar->isvararg = 1; + ar->nparams = 0; + } + else { + ar->isvararg = f->l.p->is_vararg; + ar->nparams = f->l.p->numparams; + } + break; + } + case 't': { + ar->istailcall = (ci) ? ci->callstatus & CIST_TAIL : 0; + break; + } + case 'n': { + ar->namewhat = getfuncname(L, ci, &ar->name); + if (ar->namewhat == NULL) { + ar->namewhat = ""; /* not found */ + ar->name = NULL; + } + break; + } + case 'r': { + if (ci == NULL || !(ci->callstatus & CIST_TRAN)) + ar->ftransfer = ar->ntransfer = 0; + else { + ar->ftransfer = ci->u2.transferinfo.ftransfer; + ar->ntransfer = ci->u2.transferinfo.ntransfer; + } + } + case 'L': + case 'f': /* handled by lua_getinfo */ + break; + default: status = 0; /* invalid option */ + } + } + return status; +} + + +LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { + int status; + Closure *cl; + CallInfo *ci; + TValue *func; + lua_lock(L); + if (*what == '>') { + ci = NULL; + func = s2v(L->top - 1); + api_check(L, ttisfunction(func), "function expected"); + what++; /* skip the '>' */ + L->top--; /* pop function */ + } + else { + ci = ar->i_ci; + func = s2v(ci->func); + lua_assert(ttisfunction(func)); + } + cl = ttisclosure(func) ? clvalue(func) : NULL; + status = auxgetinfo(L, what, ar, cl, ci); + if (strchr(what, 'f')) { + setobj2s(L, L->top, func); + api_incr_top(L); + } + if (strchr(what, 'L')) + collectvalidlines(L, cl); + lua_unlock(L); + return status; +} + + +/* +** {====================================================== +** Symbolic Execution +** ======================================================= +*/ + +static const char *getobjname (const Proto *p, int lastpc, int reg, + const char **name); + + +/* +** Find a "name" for the constant 'c'. +*/ +static void kname (const Proto *p, int c, const char **name) { + TValue *kvalue = &p->k[c]; + *name = (ttisstring(kvalue)) ? svalue(kvalue) : "?"; +} + + +/* +** Find a "name" for the register 'c'. +*/ +static void rname (const Proto *p, int pc, int c, const char **name) { + const char *what = getobjname(p, pc, c, name); /* search for 'c' */ + if (!(what && *what == 'c')) /* did not find a constant name? */ + *name = "?"; +} + + +/* +** Find a "name" for a 'C' value in an RK instruction. +*/ +static void rkname (const Proto *p, int pc, Instruction i, const char **name) { + int c = GETARG_C(i); /* key index */ + if (GETARG_k(i)) /* is 'c' a constant? */ + kname(p, c, name); + else /* 'c' is a register */ + rname(p, pc, c, name); +} + + +static int filterpc (int pc, int jmptarget) { + if (pc < jmptarget) /* is code conditional (inside a jump)? */ + return -1; /* cannot know who sets that register */ + else return pc; /* current position sets that register */ +} + + +/* +** try to find last instruction before 'lastpc' that modified register 'reg' +*/ +static int findsetreg (const Proto *p, int lastpc, int reg) { + int pc; + int setreg = -1; /* keep last instruction that changed 'reg' */ + int jmptarget = 0; /* any code before this address is conditional */ + for (pc = 0; pc < lastpc; pc++) { + Instruction i = p->code[pc]; + OpCode op = GET_OPCODE(i); + int a = GETARG_A(i); + int change; /* true if current instruction changed 'reg' */ + switch (op) { + case OP_LOADNIL: { /* set registers from 'a' to 'a+b' */ + int b = GETARG_B(i); + change = (a <= reg && reg <= a + b); + break; + } + case OP_TFORCALL: { /* affect all regs above its base */ + change = (reg >= a + 2); + break; + } + case OP_CALL: + case OP_TAILCALL: { /* affect all registers above base */ + change = (reg >= a); + break; + } + case OP_JMP: { /* doesn't change registers, but changes 'jmptarget' */ + int b = GETARG_sJ(i); + int dest = pc + 1 + b; + /* jump does not skip 'lastpc' and is larger than current one? */ + if (dest <= lastpc && dest > jmptarget) + jmptarget = dest; /* update 'jmptarget' */ + change = 0; + break; + } + default: /* any instruction that sets A */ + change = (testAMode(op) && reg == a); + break; + } + if (change) + setreg = filterpc(pc, jmptarget); + } + return setreg; +} + + +/* +** Check whether table being indexed by instruction 'i' is the +** environment '_ENV' +*/ +static const char *gxf (const Proto *p, int pc, Instruction i, int isup) { + int t = GETARG_B(i); /* table index */ + const char *name; /* name of indexed variable */ + if (isup) /* is an upvalue? */ + name = upvalname(p, t); + else + getobjname(p, pc, t, &name); + return (name && strcmp(name, LUA_ENV) == 0) ? "global" : "field"; +} + + + const char *getobjname (const Proto *p, int lastpc, int reg, + const char **name) { + int pc; + *name = luaF_getlocalname(p, reg + 1, lastpc); + if (*name) /* is a local? */ + return "local"; + /* else try symbolic execution */ + pc = findsetreg(p, lastpc, reg); + if (pc != -1) { /* could find instruction? */ + Instruction i = p->code[pc]; + OpCode op = GET_OPCODE(i); + switch (op) { + case OP_MOVE: { + int b = GETARG_B(i); /* move from 'b' to 'a' */ + if (b < GETARG_A(i)) + return getobjname(p, pc, b, name); /* get name for 'b' */ + break; + } + case OP_GETTABUP: { + int k = GETARG_C(i); /* key index */ + kname(p, k, name); + return gxf(p, pc, i, 1); + } + case OP_GETTABLE: { + int k = GETARG_C(i); /* key index */ + rname(p, pc, k, name); + return gxf(p, pc, i, 0); + } + case OP_GETI: { + *name = "integer index"; + return "field"; + } + case OP_GETFIELD: { + int k = GETARG_C(i); /* key index */ + kname(p, k, name); + return gxf(p, pc, i, 0); + } + case OP_GETUPVAL: { + *name = upvalname(p, GETARG_B(i)); + return "upvalue"; + } + case OP_LOADK: + case OP_LOADKX: { + int b = (op == OP_LOADK) ? GETARG_Bx(i) + : GETARG_Ax(p->code[pc + 1]); + if (ttisstring(&p->k[b])) { + *name = svalue(&p->k[b]); + return "constant"; + } + break; + } + case OP_SELF: { + rkname(p, pc, i, name); + return "method"; + } + default: break; /* go through to return NULL */ + } + } + return NULL; /* could not find reasonable name */ +} + + +/* +** Try to find a name for a function based on the code that called it. +** (Only works when function was called by a Lua function.) +** Returns what the name is (e.g., "for iterator", "method", +** "metamethod") and sets '*name' to point to the name. +*/ +static const char *funcnamefromcode (lua_State *L, CallInfo *ci, + const char **name) { + TMS tm = (TMS)0; /* (initial value avoids warnings) */ + const Proto *p = ci_func(ci)->p; /* calling function */ + int pc = currentpc(ci); /* calling instruction index */ + Instruction i = p->code[pc]; /* calling instruction */ + if (ci->callstatus & CIST_HOOKED) { /* was it called inside a hook? */ + *name = "?"; + return "hook"; + } + switch (GET_OPCODE(i)) { + case OP_CALL: + case OP_TAILCALL: + return getobjname(p, pc, GETARG_A(i), name); /* get function name */ + case OP_TFORCALL: { /* for iterator */ + *name = "for iterator"; + return "for iterator"; + } + /* other instructions can do calls through metamethods */ + case OP_SELF: case OP_GETTABUP: case OP_GETTABLE: + case OP_GETI: case OP_GETFIELD: + tm = TM_INDEX; + break; + case OP_SETTABUP: case OP_SETTABLE: case OP_SETI: case OP_SETFIELD: + tm = TM_NEWINDEX; + break; + case OP_ADDI: case OP_SUBI: case OP_MULI: case OP_MODI: + case OP_POWI: case OP_DIVI: case OP_IDIVI: { + int offset = GET_OPCODE(i) - OP_ADDI; /* ORDER OP */ + tm = cast(TMS, offset + TM_ADD); /* ORDER TM */ + break; + } + case OP_ADDK: case OP_SUBK: case OP_MULK: case OP_MODK: + case OP_POWK: case OP_DIVK: case OP_IDIVK: + case OP_BANDK: case OP_BORK: case OP_BXORK: { + int offset = GET_OPCODE(i) - OP_ADDK; /* ORDER OP */ + tm = cast(TMS, offset + TM_ADD); /* ORDER TM */ + break; + } + case OP_ADD: case OP_SUB: case OP_MUL: case OP_MOD: + case OP_POW: case OP_DIV: case OP_IDIV: case OP_BAND: + case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR: { + int offset = GET_OPCODE(i) - OP_ADD; /* ORDER OP */ + tm = cast(TMS, offset + TM_ADD); /* ORDER TM */ + break; + } + case OP_UNM: tm = TM_UNM; break; + case OP_BNOT: tm = TM_BNOT; break; + case OP_LEN: tm = TM_LEN; break; + case OP_CONCAT: tm = TM_CONCAT; break; + case OP_EQ: tm = TM_EQ; break; + case OP_LT: case OP_LE: case OP_LTI: case OP_LEI: + *name = "order"; /* '<=' can call '__lt', etc. */ + return "metamethod"; + case OP_SHRI: case OP_SHLI: + *name = "shift"; + return "metamethod"; + default: + return NULL; /* cannot find a reasonable name */ + } + *name = getstr(G(L)->tmname[tm]) + 2; + return "metamethod"; +} + +/* }====================================================== */ + + + +/* +** The subtraction of two potentially unrelated pointers is +** not ISO C, but it should not crash a program; the subsequent +** checks are ISO C and ensure a correct result. +*/ +static int isinstack (CallInfo *ci, const TValue *o) { + StkId base = ci->func + 1; + ptrdiff_t i = cast(StkId, o) - base; + return (0 <= i && i < (ci->top - base) && s2v(base + i) == o); +} + + +/* +** Checks whether value 'o' came from an upvalue. (That can only happen +** with instructions OP_GETTABUP/OP_SETTABUP, which operate directly on +** upvalues.) +*/ +static const char *getupvalname (CallInfo *ci, const TValue *o, + const char **name) { + LClosure *c = ci_func(ci); + int i; + for (i = 0; i < c->nupvalues; i++) { + if (c->upvals[i]->v == o) { + *name = upvalname(c->p, i); + return "upvalue"; + } + } + return NULL; +} + + +static const char *varinfo (lua_State *L, const TValue *o) { + const char *name = NULL; /* to avoid warnings */ + CallInfo *ci = L->ci; + const char *kind = NULL; + if (isLua(ci)) { + kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */ + if (!kind && isinstack(ci, o)) /* no? try a register */ + kind = getobjname(ci_func(ci)->p, currentpc(ci), + cast_int(cast(StkId, o) - (ci->func + 1)), &name); + } + return (kind) ? luaO_pushfstring(L, " (%s '%s')", kind, name) : ""; +} + + +l_noret luaG_typeerror (lua_State *L, const TValue *o, const char *op) { + const char *t = luaT_objtypename(L, o); + luaG_runerror(L, "attempt to %s a %s value%s", op, t, varinfo(L, o)); +} + + +l_noret luaG_forerror (lua_State *L, const TValue *o, const char *what) { + luaG_runerror(L, "bad 'for' %s (number expected, got %s)", + what, luaT_objtypename(L, o)); +} + + +l_noret luaG_concaterror (lua_State *L, const TValue *p1, const TValue *p2) { + if (ttisstring(p1) || cvt2str(p1)) p1 = p2; + luaG_typeerror(L, p1, "concatenate"); +} + + +l_noret luaG_opinterror (lua_State *L, const TValue *p1, + const TValue *p2, const char *msg) { + if (!ttisnumber(p1)) /* first operand is wrong? */ + p2 = p1; /* now second is wrong */ + luaG_typeerror(L, p2, msg); +} + + +/* +** Error when both values are convertible to numbers, but not to integers +*/ +l_noret luaG_tointerror (lua_State *L, const TValue *p1, const TValue *p2) { + lua_Integer temp; + if (!tointegerns(p1, &temp)) + p2 = p1; + luaG_runerror(L, "number%s has no integer representation", varinfo(L, p2)); +} + + +l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) { + const char *t1 = luaT_objtypename(L, p1); + const char *t2 = luaT_objtypename(L, p2); + if (strcmp(t1, t2) == 0) + luaG_runerror(L, "attempt to compare two %s values", t1); + else + luaG_runerror(L, "attempt to compare %s with %s", t1, t2); +} + + +/* add src:line information to 'msg' */ +const char *luaG_addinfo (lua_State *L, const char *msg, TString *src, + int line) { + char buff[LUA_IDSIZE]; + if (src) + luaO_chunkid(buff, getstr(src), LUA_IDSIZE); + else { /* no source available; use "?" instead */ + buff[0] = '?'; buff[1] = '\0'; + } + return luaO_pushfstring(L, "%s:%d: %s", buff, line, msg); +} + + +l_noret luaG_errormsg (lua_State *L) { + if (L->errfunc != 0) { /* is there an error handling function? */ + StkId errfunc = restorestack(L, L->errfunc); + lua_assert(ttisfunction(s2v(errfunc))); + setobjs2s(L, L->top, L->top - 1); /* move argument */ + setobjs2s(L, L->top - 1, errfunc); /* push function */ + L->top++; /* assume EXTRA_STACK */ + luaD_callnoyield(L, L->top - 2, 1); /* call it */ + } + luaD_throw(L, LUA_ERRRUN); +} + + +l_noret luaG_runerror (lua_State *L, const char *fmt, ...) { + CallInfo *ci = L->ci; + const char *msg; + va_list argp; + luaC_checkGC(L); /* error message uses memory */ + va_start(argp, fmt); + msg = luaO_pushvfstring(L, fmt, argp); /* format message */ + va_end(argp); + if (isLua(ci)) /* if Lua function, add source:line information */ + luaG_addinfo(L, msg, ci_func(ci)->p->source, currentline(ci)); + luaG_errormsg(L); +} + + +/* +** Check whether new instruction 'newpc' is in a different line from +** previous instruction 'oldpc'. +*/ +static int changedline (const Proto *p, int oldpc, int newpc) { + while (oldpc++ < newpc) { + if (p->lineinfo[oldpc] != 0) + return (luaG_getfuncline(p, oldpc - 1) != luaG_getfuncline(p, newpc)); + } + return 0; /* no line changes in the way */ +} + + +int luaG_traceexec (lua_State *L, const Instruction *pc) { + CallInfo *ci = L->ci; + lu_byte mask = L->hookmask; + int counthook; + if (!(mask & (LUA_MASKLINE | LUA_MASKCOUNT))) { /* no hooks? */ + ci->u.l.trap = 0; /* don't need to stop again */ + return 0; /* turn off 'trap' */ + } + pc++; /* reference is always next instruction */ + ci->u.l.savedpc = pc; /* save 'pc' */ + counthook = (--L->hookcount == 0 && (mask & LUA_MASKCOUNT)); + if (counthook) + resethookcount(L); /* reset count */ + else if (!(mask & LUA_MASKLINE)) + return 1; /* no line hook and count != 0; nothing to be done now */ + if (ci->callstatus & CIST_HOOKYIELD) { /* called hook last time? */ + ci->callstatus &= ~CIST_HOOKYIELD; /* erase mark */ + return 1; /* do not call hook again (VM yielded, so it did not move) */ + } + if (!isIT(*(ci->u.l.savedpc - 1))) + L->top = ci->top; /* prepare top */ + if (counthook) + luaD_hook(L, LUA_HOOKCOUNT, -1, 0, 0); /* call count hook */ + if (mask & LUA_MASKLINE) { + const Proto *p = ci_func(ci)->p; + int npci = pcRel(pc, p); + if (npci == 0 || /* call linehook when enter a new function, */ + pc <= L->oldpc || /* when jump back (loop), or when */ + changedline(p, pcRel(L->oldpc, p), npci)) { /* enter new line */ + int newline = luaG_getfuncline(p, npci); + luaD_hook(L, LUA_HOOKLINE, newline, 0, 0); /* call line hook */ + } + L->oldpc = pc; /* 'pc' of last call to line hook */ + } + if (L->status == LUA_YIELD) { /* did hook yield? */ + if (counthook) + L->hookcount = 1; /* undo decrement to zero */ + ci->u.l.savedpc--; /* undo increment (resume will increment it again) */ + ci->callstatus |= CIST_HOOKYIELD; /* mark that it yielded */ + luaD_throw(L, LUA_YIELD); + } + return 1; /* keep 'trap' on */ +} + diff --git a/source/lua/ldebug.h b/source/lua/ldebug.h new file mode 100644 index 0000000..1fe0efa --- /dev/null +++ b/source/lua/ldebug.h @@ -0,0 +1,47 @@ +/* +** $Id: ldebug.h $ +** Auxiliary functions from Debug Interface module +** See Copyright Notice in lua.h +*/ + +#ifndef ldebug_h +#define ldebug_h + + +#include "lstate.h" + + +#define pcRel(pc, p) (cast_int((pc) - (p)->code) - 1) + +#define resethookcount(L) (L->hookcount = L->basehookcount) + +/* +** mark for entries in 'lineinfo' array that has absolute information in +** 'abslineinfo' array +*/ +#define ABSLINEINFO (-0x80) + +LUAI_FUNC int luaG_getfuncline (const Proto *f, int pc); +LUAI_FUNC const char *luaG_findlocal (lua_State *L, CallInfo *ci, int n, + StkId *pos); +LUAI_FUNC l_noret luaG_typeerror (lua_State *L, const TValue *o, + const char *opname); +LUAI_FUNC l_noret luaG_forerror (lua_State *L, const TValue *o, + const char *what); +LUAI_FUNC l_noret luaG_concaterror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC l_noret luaG_opinterror (lua_State *L, const TValue *p1, + const TValue *p2, + const char *msg); +LUAI_FUNC l_noret luaG_tointerror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC l_noret luaG_ordererror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC l_noret luaG_runerror (lua_State *L, const char *fmt, ...); +LUAI_FUNC const char *luaG_addinfo (lua_State *L, const char *msg, + TString *src, int line); +LUAI_FUNC l_noret luaG_errormsg (lua_State *L); +LUAI_FUNC int luaG_traceexec (lua_State *L, const Instruction *pc); + + +#endif diff --git a/source/lua/ldebug.o b/source/lua/ldebug.o new file mode 100644 index 0000000000000000000000000000000000000000..0d163b6570e1e8c40cd0ac1ea8e3a06a4fee4aa8 GIT binary patch literal 16696 zcmeI2e|Q_kna5YQNkkH~0#d5BX(Ji|P8)m{mj)YXkZj3bjqVuP5H#bNAez%=1_~`6JGa9ceak&(cT*`7~>P}Ea8NY5SA7a^% za-rf;!Z(F)46hBZi5VZRU2PmU-qEtJ`7|RQaOcvlxbdcOVvM9Ub4S3f_2o5Vw%T`T zsiO3~px%888Vdhn0;$2gH55KT?FJ{J!DCV5m11qHx-g`E1b={s-L-C3!C%)!}!SfRoM7#_TVK{AuTbaQ1@< zwf84zGuHf@u(`lAPC#Gw>_zIXJ%Gk@6M=VeRn&#bnQv0Yt)CaEeoFr-)DV~HKX<>pwt+7j0p~oLSYmN8{OHHYUXTNdbVal*Pu@`BT#C%nZn{v`cc0) zd+?OE>KS$5)Yb<6^KZ4<+f5!7nk*_$Cb*}=jn3hja<#_YB^;eTac@!o#pdFIx^ zF$`6ncd1b`y;`our}Z5>NCs(YWC%W=sX5jybc%ZP^ar*ceZg)hGqTVCKModE<3z!S zoW-gqbAN>#<^x<$E3EIRI&e&1K{G)sy{VDb1-gC_w@Oo^r?tK_nxO~Wdi5`<@Uipo z!>oPhhfFmy8V)*aturkL|BqFWi6&~Hc6!*7V=|NTcQsn~#?6&}Z5R`SG>6ZGmzSi! z+F)L&8GnwM*Qf(G&B1Cy2kZUXwVhu51}(R;JeV(DNaGwgU6@wx7!_Pi%XB3DS}Z%{ zjW2#q8~mt@S^aj8H)e+2@x>$B;CPu%-RuchqXlgW+rS!STP_6v>4rf=8pd#);x5*gC7pmARfC zGls+0E`5K;24fJ>sjC>vl^r#!%urcwrK_kiIkSFA@aQkG^e43Dr{k^@)gRqnO@2}j zU6UPztA<>z@!a-_>W_B5{ti~Kk}bHVX*sGc%&<`~^2N+MhYygZ!~Ik7Ml-RJxA`>_ z(<9{5zStSkjA7o@!a@i$D{S(ZHW)bllNiE_&xDqjsD0mn{)js8tD=|U8&G;hG~|5Haqd0W$9S1&JH?6kC5xrXSRbza~>mO2s`{J$2uA zrsva^1F#3IFP@JXLDuT3Rz046JD5LA7=F;IhxNBKqo#-LT2u8W_d?BhS8F~&YxPXs za>V9Y@!Wc^9*SMN#jo}rp}v?=L{}xgcvNeC#+v9O>RtDvg!aaJaXk}VUc#obwGh?l zP_eS_g`PMY%p3j2AJ{&tnLQZSn=pURmSj)4tSOG2mS(=*uVKQ@(*|EIi{;iVIIS5M zQk1gdA@dZ4GINzLbK6`+U!*nPxa7STs-M~UDXsYhZ85BRxlGGNe5mJQHWUY`dN4n! zK#7@AZ=s6KqYO+|R)>ud!~u#DSj&1yGq?6wOH9NIVW9pQYjK*ZVL?zcu2KhL?%gY} z>(qJ?<7kbNpUs=R!F=Yn@f*`c&8#^cF^&X}QI~B?xz#q`SBu7-+g+fUe}g91P;~ej zx<(C;vxYZ|hNtGw)cNN4TIl{TX8Z|#!%jKty5(x`4P}_*=8B#MGZtL4)yI8bKe5uVX_=>w7GI-C}ju zQzbY}4CE&QPmoi=8~XmJ_TGboQ#gZ@)H1ag2e6GG<pc{oE~xe{MK2oqaCG_{GU3clvio9Uh`pNeX7Gim zxorv48#5j!m2ty=B;<~U&H4pQC7k6aXB~+I%3Xc=ot1@`a7!yZ?0Sx-l|R<}T-Ek{Tt&CabtqXg^eS{Jc~=rukS$;U5Nzd zgm*`m3J=q%i+Pw-sso|9C|t$>Zb-}jAaz$As9&BP#Y~1hyQ5cg z*##u~5R=WIW0rfap!UzyFUP5D0W;;%`YNi|iXp2CtB=-SLpkiMY;b;ulTqQTOhw45 zKby7pX#MhiA+>K6H0<-LeQz`K>%HoujmysrA&!&lvM0;bzEQNx)_td+&J5;lm(pI8KwUl=t@8r<$@Ut3E*V~e`3?!zS0h@^4Xq?Y ze~uqo$IOSNH2bOBG|4Wc;`>-}2=+w17<$NICSh8aAp%s{&TS%IW81;;kGWCDqaC8Y4%>+AW;HHvpQ0Sw=!ndHtvWsS5+c-3j@cCjcFC52- zL-Y@Ok2jWm+=U%Bp6fgvH@3m*I#=NV$P5-{s{>C{)bx$@zRgZ4tXF+C%*qTkMZQ6^ zUdjubd50c?io)egG^7Ocg$?k4h(?7=z=b^XSz#CkQmCak(L3U0!<+v!8nm7T3O_>m zK~SamLiW@J#pkl8<`;e0G)>e9$VJ%%)AC;R5MN>AV^2P zMw(2A`w>aJ*W>3xg{diyu+g20_p3E?*FG3T+Xzl57aYRU!i}Y$HY2SRYtvkTePa%u zzu3M(6i-XWiqi-T?%g%xIB|KIYqVS)0>B#xmGxd`Vew(9J@k)lS>JeV6b<#}HDgU6 zM4N#Y$N9A}j@&xE=85sek-&QV#si)By*H47Ff#WC`mN0O1ADE^j|2Oy%p-xkmH9E8rMYt}gBn2=Bhvi71 zl5*v&A{|f=xpg{WTbdAu?|he@A=WC!APdYdvJkThjj!soTyV_3Ut8y;XUPfgT3ff9 zYkDJQJVAQzd}m@JZWLlhK5m?}9(0Ts`BA>LAG5-Z1>(+*s@bv9?6^x)>)vLECZ>j! z34mNUGhT`(q$8SfgvlT}O^rVpa(ucWr!-?wZg=u|h|SLrtV;Cm!<)I? zy-2@G%i$pktB3mq$1ych)QmT1AAJl^aurf?nOte$NR4)IL4NZD&s=wlVgMQ^1S3)JjndQUpVhwC0ki*ArZ>dQvOwH;oesn}+{M^_bX*(!uq6AsOTPfKw>(z; zgu3hZkS8x%+jumX4<0p!rmfMqvAI0+^*OL|9?fPPSJ?@D+E#+N0^8kc@6`y><}QkN z;X{yCj9t{j$=>u{h4Sp^i`Zw-y_t0Nhp|4&QHQlOt&v`$3SJ!0DR3SX6+S{xV0MJ^u0Mn(8NvBkJ7?Q7>lhT!#l|b>O;BQhBI% zLO&@S!dwGe=dr=BMn>(UgGu2PY8vP9Im1~thG;34#gLY@hO_a&azE?6n61|^yLy|N{-sY8jU6UvuwuDw-h zO+l-k>`LgVE;1s)4QWfIHY>GCQ`5#~CDqlE>{7bhHnr-?W!=|Y)^d&ivTh}zQvPwHELIe&1Tt-jZhuD#(b9^VUCGX_WOuSdPw1Oc z9m-50N#Dkz7z<#CO7*q1*Z9lVZb*0NY5$ihmR3|=xh&1@g0}~kRa7pm2nH8h1^%ll zgUc$HRaPs?eBKM!ZL1VlkJt5?d9&U9*y`y0(gI$#g?6GEkN2LE8jtVp(i)FHS61UG zzw5k+r}Bh@wi3$6YtKU7MCi7 z=aw`%6j(Mr!tL5h*Lsh?WW^khyMFGi9=D<_0eY5~pQdZrtAhdOk$6M!dLwgjt zFy&B8M_Bg01=pYBj}kE-ZTCo*S{KHaa5iLPAFG+`(mNG7 zUGKmtcFZJyEBHk&momy-En*zD6y+lLZG`u02=|n3!yoaz+|?qk-NE^O&V^_1<2*0% zA8|gyxrlL(5QjZpu7Jfku)|#5%Nx{jPiX{yWKTcmb&M(sJ?If1<($PNumb*O^1~V8 z_>phmH1Xs9_^AU+(>7a-HGhrtEF|H@1T8ddrL-r;I`Gf=S z7J7K6S=@u3Z#u|-o6BdoJd1yj|32q?IbUR%r98s<2YzwN-oqO!54 zRl(EcrjFK>(wy$t@IswLS?#VeaS)7@>Y-8w37 zBv4QCt?7`&I?&{1#?deUsjmXig@3lFige zq=^j%n@?gM)7DD!46nCYIv?|k5=C$k`{aqJhoKpm+Q2JR$@m@#b94iHh zi#F)97bT&`x>J-C=hUu!SKK3UvHl*C^zbmE{7m9Pzu21PcEveJaN0L1h57y{+f&E6 zkQe>>ip04YN{hsW{4R-Gts)Ld{90b{Q;9F-{O1xEe)zouZ|D1?us_80JC@|>j3e5; z&BpC|{>{ei@(F&_5$j?P*PrEF*q`G30f}$pe80rII3MPm?4&g$>@3>&=WKjFHHbv= zc3x}aw1){jciOn$#{b>MFShYFsG~@tzhive-p`M4^89~@b5cj^RQTsLN&Z1niu9Hw zpR=%1c7c@<`oGTkg`5lhf?q1hKfvYpNIb;(h{Q9TAD8qC{;tGxT>fHy&JlM0E9XAW zg`GmaL6ZMImtW-|Z*VTphwn=A`?;R)+2rl(t6<}cAS>p>7kNM+{Q(=#+c?EkA^*OO zUt!~OXz?JCp3mb?$XD3-r8d6C#uwXoC+EU%>=PBrZ?nl?W|O~9l0S|zO5e4~m*Za8 z^GgT*dmFdgGiKAzrz+F`woTq{&*%B3NPeiWwOhqG^^5e7O_ZWGdApv?Hg30Py93{4 z`)`x2Mm?;yX3CK(dVe=frAw{uQ@u*Z{}jbDW_ zVP}YhkVxLn@3e8do;?nH#K!IOoGHf-g)eI3G>>CE%un+BIp@QB4)<|ILeF|G?|0y0 zoQ1s5Ph&($=2aG+m>Pp&euzPKj&={7xs5L@E!-A zap1chc)!H=b3gBq_^a65s9~PJD-=huyfRbk2&zu z4t(5!vk8SVF&{*`Ztho^i)Togi}%4Y_dDoe|HnE*yOj>|^ge)+tUu(yH3#14z}GqO z^$xsE;$psaN?iD}$AM=Y_-+T@@4)v+e4GL=(q4%Rd-h2@!{zr&T*x1A;CToBq{Ks9 z|A@qe{^up`Xp#C2h(kZ*L5U+2KrJMcCK-YM}p+|C{co^jy29eBS3 z-{ZjdI`DlCe7^%f;K1_|S9yP*bl@Wrzm&^A@4!bL_?QDf?ZC$!xOl%I=83S!&EEsa zT)g*?xz9n~@4(9)c%{TI=l&7jlSI2$avqZ8#X8a?zLd*1O8i>R#rG(oU+7sc$qU}* zz&j;g!}a$_JjQv(f$x^MXt&>i?~%CBzt@59leo~o-+>=+;CToBq{Q2Kd>e7#&r4j` zGwQ&{9QbJmKJLKrv5qBq+}#e`>%e^y{|)c2-%_v8^5aX85pkXryp!7}&Vho9{+jm65pkj&-lZ#doYf%G_<)>E%ul z{Sx1?DkUzyW9^W*_|CLn;^I4#h{Hm^_-^!?Bp>ox_RQzwAmlTgmrHyv=hsPGeDAqM z;^HA#taqV*J%2bB>s0W(cxbNZ-o8aoY)~rj+TOahiCkB*JyD@2dvv9uC7~yjiVfY} zN<~+SZb&>>5mZ=tMY^MX)8=IRc9c>bOJurel~RHK<=cW!JxWDKN>5hQ->~*d>wAk; zDcRQ4+C^W7{$G+GT4+kllC*{R{j>aeT@-V7i(BP0$kCDuO%f~fe89Sn@%crsrKlZ# ztN5&9h2C8e=flJ){*Pk*WOiDHPv1$l1Ub_Af2|)xUD8SKH0(*VKVgT+i}uAe#F^~B zi^Yp}hx!83cSO=f^Ua=oyuP2uGf^h|C+=4wGn4=GS6UM5`Exe;pI*I-`ojOWfX&qZ zDtf7o^fl`;`77#+{%=MJWQn4a*?--zR2s_8RcbJgEQHGqrAS@ z4}>0Jzqs#3W+wmnudyUTTrv5NTq)`c|5135=N{Eue;xfQ%D1h{ +#include +#include + +#include "lua.h" + +#include "lapi.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lundump.h" +#include "lvm.h" +#include "lzio.h" + + + +#define errorstatus(s) ((s) > LUA_YIELD) + + +/* +** {====================================================== +** Error-recovery functions +** ======================================================= +*/ + +/* +** LUAI_THROW/LUAI_TRY define how Lua does exception handling. By +** default, Lua handles errors with exceptions when compiling as +** C++ code, with _longjmp/_setjmp when asked to use them, and with +** longjmp/setjmp otherwise. +*/ +#if !defined(LUAI_THROW) /* { */ + +#if defined(__cplusplus) && !defined(LUA_USE_LONGJMP) /* { */ + +/* C++ exceptions */ +#define LUAI_THROW(L,c) throw(c) +#define LUAI_TRY(L,c,a) \ + try { a } catch(...) { if ((c)->status == 0) (c)->status = -1; } +#define luai_jmpbuf int /* dummy variable */ + +#elif defined(LUA_USE_POSIX) /* }{ */ + +/* in POSIX, try _longjmp/_setjmp (more efficient) */ +#define LUAI_THROW(L,c) _longjmp((c)->b, 1) +#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a } +#define luai_jmpbuf jmp_buf + +#else /* }{ */ + +/* ISO C handling with long jumps */ +#define LUAI_THROW(L,c) longjmp((c)->b, 1) +#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } +#define luai_jmpbuf jmp_buf + +#endif /* } */ + +#endif /* } */ + + + +/* chain list of long jump buffers */ +struct lua_longjmp { + struct lua_longjmp *previous; + luai_jmpbuf b; + volatile int status; /* error code */ +}; + + +void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) { + switch (errcode) { + case LUA_ERRMEM: { /* memory error? */ + setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */ + break; + } + case LUA_ERRERR: { + setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling")); + break; + } + case CLOSEPROTECT: { + setnilvalue(s2v(oldtop)); /* no error message */ + break; + } + default: { + setobjs2s(L, oldtop, L->top - 1); /* error message on current top */ + break; + } + } + L->top = oldtop + 1; +} + + +l_noret luaD_throw (lua_State *L, int errcode) { + if (L->errorJmp) { /* thread has an error handler? */ + L->errorJmp->status = errcode; /* set status */ + LUAI_THROW(L, L->errorJmp); /* jump to it */ + } + else { /* thread has no error handler */ + global_State *g = G(L); + errcode = luaF_close(L, L->stack, errcode); /* close all upvalues */ + L->status = cast_byte(errcode); /* mark it as dead */ + if (g->mainthread->errorJmp) { /* main thread has a handler? */ + setobjs2s(L, g->mainthread->top++, L->top - 1); /* copy error obj. */ + luaD_throw(g->mainthread, errcode); /* re-throw in main thread */ + } + else { /* no handler at all; abort */ + if (g->panic) { /* panic function? */ + luaD_seterrorobj(L, errcode, L->top); /* assume EXTRA_STACK */ + if (L->ci->top < L->top) + L->ci->top = L->top; /* pushing msg. can break this invariant */ + lua_unlock(L); + g->panic(L); /* call panic function (last chance to jump out) */ + } + abort(); + } + } +} + + +int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { + l_uint32 oldnCcalls = L->nCcalls - L->nci; + struct lua_longjmp lj; + lua_assert(L->nCcalls >= L->nci); + lj.status = LUA_OK; + lj.previous = L->errorJmp; /* chain new error handler */ + L->errorJmp = &lj; + LUAI_TRY(L, &lj, + (*f)(L, ud); + ); + L->errorJmp = lj.previous; /* restore old error handler */ + L->nCcalls = oldnCcalls + L->nci; + return lj.status; +} + +/* }====================================================== */ + + +/* +** {================================================================== +** Stack reallocation +** =================================================================== +*/ +static void correctstack (lua_State *L, StkId oldstack, StkId newstack) { + CallInfo *ci; + UpVal *up; + if (oldstack == newstack) + return; /* stack address did not change */ + L->top = (L->top - oldstack) + newstack; + for (up = L->openupval; up != NULL; up = up->u.open.next) + up->v = s2v((uplevel(up) - oldstack) + newstack); + for (ci = L->ci; ci != NULL; ci = ci->previous) { + ci->top = (ci->top - oldstack) + newstack; + ci->func = (ci->func - oldstack) + newstack; + if (isLua(ci)) + ci->u.l.trap = 1; /* signal to update 'trap' in 'luaV_execute' */ + } +} + + +/* some space for error handling */ +#define ERRORSTACKSIZE (LUAI_MAXSTACK + 200) + + +int luaD_reallocstack (lua_State *L, int newsize, int raiseerror) { + int lim = L->stacksize; + StkId newstack = luaM_reallocvector(L, L->stack, lim, newsize, StackValue); + lua_assert(newsize <= LUAI_MAXSTACK || newsize == ERRORSTACKSIZE); + lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK); + if (unlikely(newstack == NULL)) { /* reallocation failed? */ + if (raiseerror) + luaM_error(L); + else return 0; /* do not raise an error */ + } + for (; lim < newsize; lim++) + setnilvalue(s2v(newstack + lim)); /* erase new segment */ + correctstack(L, L->stack, newstack); + L->stack = newstack; + L->stacksize = newsize; + L->stack_last = L->stack + newsize - EXTRA_STACK; + return 1; +} + + +/* +** Try to grow the stack by at least 'n' elements. when 'raiseerror' +** is true, raises any error; otherwise, return 0 in case of errors. +*/ +int luaD_growstack (lua_State *L, int n, int raiseerror) { + int size = L->stacksize; + int newsize = 2 * size; /* tentative new size */ + if (unlikely(size > LUAI_MAXSTACK)) { /* need more space after extra size? */ + if (raiseerror) + luaD_throw(L, LUA_ERRERR); /* error inside message handler */ + else return 0; + } + else { + int needed = cast_int(L->top - L->stack) + n + EXTRA_STACK; + if (newsize > LUAI_MAXSTACK) /* cannot cross the limit */ + newsize = LUAI_MAXSTACK; + if (newsize < needed) /* but must respect what was asked for */ + newsize = needed; + if (unlikely(newsize > LUAI_MAXSTACK)) { /* stack overflow? */ + /* add extra size to be able to handle the error message */ + luaD_reallocstack(L, ERRORSTACKSIZE, raiseerror); + if (raiseerror) + luaG_runerror(L, "stack overflow"); + else return 0; + } + } /* else no errors */ + return luaD_reallocstack(L, newsize, raiseerror); +} + + +static int stackinuse (lua_State *L) { + CallInfo *ci; + StkId lim = L->top; + for (ci = L->ci; ci != NULL; ci = ci->previous) { + if (lim < ci->top) lim = ci->top; + } + lua_assert(lim <= L->stack_last); + return cast_int(lim - L->stack) + 1; /* part of stack in use */ +} + + +void luaD_shrinkstack (lua_State *L) { + int inuse = stackinuse(L); + int goodsize = inuse + (inuse / 8) + 2*EXTRA_STACK; + if (goodsize > LUAI_MAXSTACK) + goodsize = LUAI_MAXSTACK; /* respect stack limit */ + /* if thread is currently not handling a stack overflow and its + good size is smaller than current size, shrink its stack */ + if (inuse <= (LUAI_MAXSTACK - EXTRA_STACK) && + goodsize < L->stacksize) + luaD_reallocstack(L, goodsize, 0); /* ok if that fails */ + else /* don't change stack */ + condmovestack(L,{},{}); /* (change only for debugging) */ + luaE_shrinkCI(L); /* shrink CI list */ +} + + +void luaD_inctop (lua_State *L) { + luaD_checkstack(L, 1); + L->top++; +} + +/* }================================================================== */ + + +/* +** Call a hook for the given event. Make sure there is a hook to be +** called. (Both 'L->hook' and 'L->hookmask', which trigger this +** function, can be changed asynchronously by signals.) +*/ +void luaD_hook (lua_State *L, int event, int line, + int ftransfer, int ntransfer) { + lua_Hook hook = L->hook; + if (hook && L->allowhook) { /* make sure there is a hook */ + int mask = CIST_HOOKED; + CallInfo *ci = L->ci; + ptrdiff_t top = savestack(L, L->top); + ptrdiff_t ci_top = savestack(L, ci->top); + lua_Debug ar; + ar.event = event; + ar.currentline = line; + ar.i_ci = ci; + if (ntransfer != 0) { + mask |= CIST_TRAN; /* 'ci' has transfer information */ + ci->u2.transferinfo.ftransfer = ftransfer; + ci->u2.transferinfo.ntransfer = ntransfer; + } + luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ + if (L->top + LUA_MINSTACK > ci->top) + ci->top = L->top + LUA_MINSTACK; + L->allowhook = 0; /* cannot call hooks inside a hook */ + ci->callstatus |= mask; + lua_unlock(L); + (*hook)(L, &ar); + lua_lock(L); + lua_assert(!L->allowhook); + L->allowhook = 1; + ci->top = restorestack(L, ci_top); + L->top = restorestack(L, top); + ci->callstatus &= ~mask; + } +} + + +/* +** Executes a call hook for Lua functions. This function is called +** whenever 'hookmask' is not zero, so it checks whether call hooks are +** active. +*/ +void luaD_hookcall (lua_State *L, CallInfo *ci) { + int hook = (ci->callstatus & CIST_TAIL) ? LUA_HOOKTAILCALL : LUA_HOOKCALL; + Proto *p; + if (!(L->hookmask & LUA_MASKCALL)) /* some other hook? */ + return; /* don't call hook */ + p = clLvalue(s2v(ci->func))->p; + L->top = ci->top; /* prepare top */ + ci->u.l.savedpc++; /* hooks assume 'pc' is already incremented */ + luaD_hook(L, hook, -1, 1, p->numparams); + ci->u.l.savedpc--; /* correct 'pc' */ +} + + +static StkId rethook (lua_State *L, CallInfo *ci, StkId firstres, int nres) { + ptrdiff_t oldtop = savestack(L, L->top); /* hook may change top */ + int delta = 0; + if (isLuacode(ci)) { + Proto *p = clLvalue(s2v(ci->func))->p; + if (p->is_vararg) + delta = ci->u.l.nextraargs + p->numparams + 1; + if (L->top < ci->top) + L->top = ci->top; /* correct top to run hook */ + } + if (L->hookmask & LUA_MASKRET) { /* is return hook on? */ + int ftransfer; + ci->func += delta; /* if vararg, back to virtual 'func' */ + ftransfer = cast(unsigned short, firstres - ci->func); + luaD_hook(L, LUA_HOOKRET, -1, ftransfer, nres); /* call it */ + ci->func -= delta; + } + if (isLua(ci->previous)) + L->oldpc = ci->previous->u.l.savedpc; /* update 'oldpc' */ + return restorestack(L, oldtop); +} + + +/* +** Check whether __call metafield of 'func' is a function. If so, put +** it in stack below original 'func' so that 'luaD_call' can call +** it. Raise an error if __call metafield is not a function. +*/ +void luaD_tryfuncTM (lua_State *L, StkId func) { + const TValue *tm = luaT_gettmbyobj(L, s2v(func), TM_CALL); + StkId p; + if (unlikely(!ttisfunction(tm))) + luaG_typeerror(L, s2v(func), "call"); + for (p = L->top; p > func; p--) + setobjs2s(L, p, p-1); + L->top++; /* assume EXTRA_STACK */ + setobj2s(L, func, tm); /* metamethod is the new function to be called */ +} + + +/* +** Given 'nres' results at 'firstResult', move 'wanted' of them to 'res'. +** Handle most typical cases (zero results for commands, one result for +** expressions, multiple results for tail calls/single parameters) +** separated. +*/ +static void moveresults (lua_State *L, StkId res, int nres, int wanted) { + StkId firstresult; + int i; + switch (wanted) { /* handle typical cases separately */ + case 0: /* no values needed */ + L->top = res; + return; + case 1: /* one value needed */ + if (nres == 0) /* no results? */ + setnilvalue(s2v(res)); /* adjust with nil */ + else + setobjs2s(L, res, L->top - nres); /* move it to proper place */ + L->top = res + 1; + return; + case LUA_MULTRET: + wanted = nres; /* we want all results */ + break; + default: /* multiple results (or to-be-closed variables) */ + if (hastocloseCfunc(wanted)) { /* to-be-closed variables? */ + ptrdiff_t savedres = savestack(L, res); + luaF_close(L, res, LUA_OK); /* may change the stack */ + res = restorestack(L, savedres); + wanted = codeNresults(wanted); /* correct value */ + if (wanted == LUA_MULTRET) + wanted = nres; + } + break; + } + firstresult = L->top - nres; /* index of first result */ + /* move all results to correct place */ + for (i = 0; i < nres && i < wanted; i++) + setobjs2s(L, res + i, firstresult + i); + for (; i < wanted; i++) /* complete wanted number of results */ + setnilvalue(s2v(res + i)); + L->top = res + wanted; /* top points after the last result */ +} + + +/* +** Finishes a function call: calls hook if necessary, removes CallInfo, +** moves current number of results to proper place. +*/ +void luaD_poscall (lua_State *L, CallInfo *ci, int nres) { + if (L->hookmask) + L->top = rethook(L, ci, L->top - nres, nres); + L->ci = ci->previous; /* back to caller */ + /* move results to proper place */ + moveresults(L, ci->func, nres, ci->nresults); +} + + + +#define next_ci(L) (L->ci = (L->ci->next ? L->ci->next : luaE_extendCI(L))) + + +/* +** Prepare a function for a tail call, building its call info on top +** of the current call info. 'narg1' is the number of arguments plus 1 +** (so that it includes the function itself). +*/ +void luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, int narg1) { + Proto *p = clLvalue(s2v(func))->p; + int fsize = p->maxstacksize; /* frame size */ + int nfixparams = p->numparams; + int i; + for (i = 0; i < narg1; i++) /* move down function and arguments */ + setobjs2s(L, ci->func + i, func + i); + checkstackGC(L, fsize); + func = ci->func; /* moved-down function */ + for (; narg1 <= nfixparams; narg1++) + setnilvalue(s2v(func + narg1)); /* complete missing arguments */ + ci->top = func + 1 + fsize; /* top for new function */ + lua_assert(ci->top <= L->stack_last); + ci->u.l.savedpc = p->code; /* starting point */ + ci->callstatus |= CIST_TAIL; + L->top = func + narg1; /* set top */ +} + + +/* +** Call a function (C or Lua). The function to be called is at *func. +** The arguments are on the stack, right after the function. +** When returns, all the results are on the stack, starting at the original +** function position. +*/ +void luaD_call (lua_State *L, StkId func, int nresults) { + lua_CFunction f; + TValue *funcv = s2v(func); + switch (ttypetag(funcv)) { + case LUA_TCCL: /* C closure */ + f = clCvalue(funcv)->f; + goto Cfunc; + case LUA_TLCF: /* light C function */ + f = fvalue(funcv); + Cfunc: { + int n; /* number of returns */ + CallInfo *ci; + checkstackp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ + ci = next_ci(L); + ci->nresults = nresults; + ci->callstatus = CIST_C; + ci->top = L->top + LUA_MINSTACK; + ci->func = func; + lua_assert(ci->top <= L->stack_last); + if (L->hookmask & LUA_MASKCALL) { + int narg = cast_int(L->top - func) - 1; + luaD_hook(L, LUA_HOOKCALL, -1, 1, narg); + } + lua_unlock(L); + n = (*f)(L); /* do the actual call */ + lua_lock(L); + api_checknelems(L, n); + luaD_poscall(L, ci, n); + break; + } + case LUA_TLCL: { /* Lua function */ + CallInfo *ci; + Proto *p = clLvalue(funcv)->p; + int narg = cast_int(L->top - func) - 1; /* number of real arguments */ + int nfixparams = p->numparams; + int fsize = p->maxstacksize; /* frame size */ + checkstackp(L, fsize, func); + ci = next_ci(L); + ci->nresults = nresults; + ci->u.l.savedpc = p->code; /* starting point */ + ci->callstatus = 0; + ci->top = func + 1 + fsize; + ci->func = func; + for (; narg < nfixparams; narg++) + setnilvalue(s2v(L->top++)); /* complete missing arguments */ + lua_assert(ci->top <= L->stack_last); + luaV_execute(L, ci); /* run the function */ + break; + } + default: { /* not a function */ + luaD_tryfuncTM(L, func); /* try to get '__call' metamethod */ + luaD_call(L, func, nresults); /* now it must be a function */ + break; + } + } +} + + +/* +** Similar to 'luaD_call', but does not allow yields during the call. +** If there is a stack overflow, freeing all CI structures will +** force the subsequent call to invoke 'luaE_extendCI', which then +** will raise any errors. +*/ +void luaD_callnoyield (lua_State *L, StkId func, int nResults) { + incXCcalls(L); + if (getCcalls(L) >= LUAI_MAXCCALLS) /* possible stack overflow? */ + luaE_freeCI(L); + luaD_call(L, func, nResults); + decXCcalls(L); +} + + +/* +** Completes the execution of an interrupted C function, calling its +** continuation function. +*/ +static void finishCcall (lua_State *L, int status) { + CallInfo *ci = L->ci; + int n; + /* must have a continuation and must be able to call it */ + lua_assert(ci->u.c.k != NULL && yieldable(L)); + /* error status can only happen in a protected call */ + lua_assert((ci->callstatus & CIST_YPCALL) || status == LUA_YIELD); + if (ci->callstatus & CIST_YPCALL) { /* was inside a pcall? */ + ci->callstatus &= ~CIST_YPCALL; /* continuation is also inside it */ + L->errfunc = ci->u.c.old_errfunc; /* with the same error function */ + } + /* finish 'lua_callk'/'lua_pcall'; CIST_YPCALL and 'errfunc' already + handled */ + adjustresults(L, ci->nresults); + lua_unlock(L); + n = (*ci->u.c.k)(L, status, ci->u.c.ctx); /* call continuation function */ + lua_lock(L); + api_checknelems(L, n); + luaD_poscall(L, ci, n); /* finish 'luaD_call' */ +} + + +/* +** Executes "full continuation" (everything in the stack) of a +** previously interrupted coroutine until the stack is empty (or another +** interruption long-jumps out of the loop). If the coroutine is +** recovering from an error, 'ud' points to the error status, which must +** be passed to the first continuation function (otherwise the default +** status is LUA_YIELD). +*/ +static void unroll (lua_State *L, void *ud) { + CallInfo *ci; + if (ud != NULL) /* error status? */ + finishCcall(L, *(int *)ud); /* finish 'lua_pcallk' callee */ + while ((ci = L->ci) != &L->base_ci) { /* something in the stack */ + if (!isLua(ci)) /* C function? */ + finishCcall(L, LUA_YIELD); /* complete its execution */ + else { /* Lua function */ + luaV_finishOp(L); /* finish interrupted instruction */ + luaV_execute(L, ci); /* execute down to higher C 'boundary' */ + } + } +} + + +/* +** Try to find a suspended protected call (a "recover point") for the +** given thread. +*/ +static CallInfo *findpcall (lua_State *L) { + CallInfo *ci; + for (ci = L->ci; ci != NULL; ci = ci->previous) { /* search for a pcall */ + if (ci->callstatus & CIST_YPCALL) + return ci; + } + return NULL; /* no pending pcall */ +} + + +/* +** Recovers from an error in a coroutine. Finds a recover point (if +** there is one) and completes the execution of the interrupted +** 'luaD_pcall'. If there is no recover point, returns zero. +*/ +static int recover (lua_State *L, int status) { + StkId oldtop; + CallInfo *ci = findpcall(L); + if (ci == NULL) return 0; /* no recovery point */ + /* "finish" luaD_pcall */ + oldtop = restorestack(L, ci->u2.funcidx); + luaF_close(L, oldtop, status); /* may change the stack */ + oldtop = restorestack(L, ci->u2.funcidx); + luaD_seterrorobj(L, status, oldtop); + L->ci = ci; + L->allowhook = getoah(ci->callstatus); /* restore original 'allowhook' */ + luaD_shrinkstack(L); + L->errfunc = ci->u.c.old_errfunc; + return 1; /* continue running the coroutine */ +} + + +/* +** Signal an error in the call to 'lua_resume', not in the execution +** of the coroutine itself. (Such errors should not be handled by any +** coroutine error handler and should not kill the coroutine.) +*/ +static int resume_error (lua_State *L, const char *msg, int narg) { + L->top -= narg; /* remove args from the stack */ + setsvalue2s(L, L->top, luaS_new(L, msg)); /* push error message */ + api_incr_top(L); + lua_unlock(L); + return LUA_ERRRUN; +} + + +/* +** Do the work for 'lua_resume' in protected mode. Most of the work +** depends on the status of the coroutine: initial state, suspended +** inside a hook, or regularly suspended (optionally with a continuation +** function), plus erroneous cases: non-suspended coroutine or dead +** coroutine. +*/ +static void resume (lua_State *L, void *ud) { + int n = *(cast(int*, ud)); /* number of arguments */ + StkId firstArg = L->top - n; /* first argument */ + CallInfo *ci = L->ci; + if (L->status == LUA_OK) { /* starting a coroutine? */ + luaD_call(L, firstArg - 1, LUA_MULTRET); + } + else { /* resuming from previous yield */ + lua_assert(L->status == LUA_YIELD); + L->status = LUA_OK; /* mark that it is running (again) */ + if (isLua(ci)) /* yielded inside a hook? */ + luaV_execute(L, ci); /* just continue running Lua code */ + else { /* 'common' yield */ + if (ci->u.c.k != NULL) { /* does it have a continuation function? */ + lua_unlock(L); + n = (*ci->u.c.k)(L, LUA_YIELD, ci->u.c.ctx); /* call continuation */ + lua_lock(L); + api_checknelems(L, n); + } + luaD_poscall(L, ci, n); /* finish 'luaD_call' */ + } + unroll(L, NULL); /* run continuation */ + } +} + +LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs, + int *nresults) { + int status; + lua_lock(L); + if (L->status == LUA_OK) { /* may be starting a coroutine */ + if (L->ci != &L->base_ci) /* not in base level? */ + return resume_error(L, "cannot resume non-suspended coroutine", nargs); + } + else if (L->status != LUA_YIELD) + return resume_error(L, "cannot resume dead coroutine", nargs); + if (from == NULL) + L->nCcalls = 1; + else /* correct 'nCcalls' for this thread */ + L->nCcalls = getCcalls(from) - from->nci + L->nci + CSTACKCF; + if (L->nCcalls >= LUAI_MAXCCALLS) + return resume_error(L, "C stack overflow", nargs); + luai_userstateresume(L, nargs); + api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs); + status = luaD_rawrunprotected(L, resume, &nargs); + /* continue running after recoverable errors */ + while (errorstatus(status) && recover(L, status)) { + /* unroll continuation */ + status = luaD_rawrunprotected(L, unroll, &status); + } + if (likely(!errorstatus(status))) + lua_assert(status == L->status); /* normal end or yield */ + else { /* unrecoverable error */ + status = luaF_close(L, L->stack, status); /* close all upvalues */ + L->status = cast_byte(status); /* mark thread as 'dead' */ + luaD_seterrorobj(L, status, L->stack + 1); /* push error message */ + L->ci = &L->base_ci; /* back to the original C level */ + L->ci->top = L->top; + } + *nresults = (status == LUA_YIELD) ? L->ci->u2.nyield + : cast_int(L->top - (L->ci->func + 1)); + lua_unlock(L); + return status; +} + + +LUA_API int lua_isyieldable (lua_State *L) { + return yieldable(L); +} + + +LUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx, + lua_KFunction k) { + CallInfo *ci = L->ci; + luai_userstateyield(L, nresults); + lua_lock(L); + api_checknelems(L, nresults); + if (unlikely(!yieldable(L))) { + if (L != G(L)->mainthread) + luaG_runerror(L, "attempt to yield across a C-call boundary"); + else + luaG_runerror(L, "attempt to yield from outside a coroutine"); + } + L->status = LUA_YIELD; + if (isLua(ci)) { /* inside a hook? */ + lua_assert(!isLuacode(ci)); + api_check(L, k == NULL, "hooks cannot continue after yielding"); + ci->u2.nyield = 0; /* no results */ + } + else { + if ((ci->u.c.k = k) != NULL) /* is there a continuation? */ + ci->u.c.ctx = ctx; /* save context */ + ci->u2.nyield = nresults; /* save number of results */ + luaD_throw(L, LUA_YIELD); + } + lua_assert(ci->callstatus & CIST_HOOKED); /* must be inside a hook */ + lua_unlock(L); + return 0; /* return to 'luaD_hook' */ +} + + +/* +** Call the C function 'func' in protected mode, restoring basic +** thread information ('allowhook', etc.) and in particular +** its stack level in case of errors. +*/ +int luaD_pcall (lua_State *L, Pfunc func, void *u, + ptrdiff_t old_top, ptrdiff_t ef) { + int status; + CallInfo *old_ci = L->ci; + lu_byte old_allowhooks = L->allowhook; + ptrdiff_t old_errfunc = L->errfunc; + L->errfunc = ef; + status = luaD_rawrunprotected(L, func, u); + if (unlikely(status != LUA_OK)) { /* an error occurred? */ + StkId oldtop = restorestack(L, old_top); + L->ci = old_ci; + L->allowhook = old_allowhooks; + status = luaF_close(L, oldtop, status); + oldtop = restorestack(L, old_top); /* previous call may change stack */ + luaD_seterrorobj(L, status, oldtop); + luaD_shrinkstack(L); + } + L->errfunc = old_errfunc; + return status; +} + + + +/* +** Execute a protected parser. +*/ +struct SParser { /* data to 'f_parser' */ + ZIO *z; + Mbuffer buff; /* dynamic structure used by the scanner */ + Dyndata dyd; /* dynamic structures used by the parser */ + const char *mode; + const char *name; +}; + + +static void checkmode (lua_State *L, const char *mode, const char *x) { + if (mode && strchr(mode, x[0]) == NULL) { + luaO_pushfstring(L, + "attempt to load a %s chunk (mode is '%s')", x, mode); + luaD_throw(L, LUA_ERRSYNTAX); + } +} + + +static void f_parser (lua_State *L, void *ud) { + LClosure *cl; + struct SParser *p = cast(struct SParser *, ud); + int c = zgetc(p->z); /* read first character */ + if (c == LUA_SIGNATURE[0]) { + checkmode(L, p->mode, "binary"); + cl = luaU_undump(L, p->z, p->name); + } + else { + checkmode(L, p->mode, "text"); + cl = luaY_parser(L, p->z, &p->buff, &p->dyd, p->name, c); + } + lua_assert(cl->nupvalues == cl->p->sizeupvalues); + luaF_initupvals(L, cl); +} + + +int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, + const char *mode) { + struct SParser p; + int status; + incnny(L); /* cannot yield during parsing */ + p.z = z; p.name = name; p.mode = mode; + p.dyd.actvar.arr = NULL; p.dyd.actvar.size = 0; + p.dyd.gt.arr = NULL; p.dyd.gt.size = 0; + p.dyd.label.arr = NULL; p.dyd.label.size = 0; + luaZ_initbuffer(L, &p.buff); + status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc); + luaZ_freebuffer(L, &p.buff); + luaM_freearray(L, p.dyd.actvar.arr, p.dyd.actvar.size); + luaM_freearray(L, p.dyd.gt.arr, p.dyd.gt.size); + luaM_freearray(L, p.dyd.label.arr, p.dyd.label.size); + decnny(L); + return status; +} + + diff --git a/source/lua/ldo.h b/source/lua/ldo.h new file mode 100644 index 0000000..7760f85 --- /dev/null +++ b/source/lua/ldo.h @@ -0,0 +1,75 @@ +/* +** $Id: ldo.h $ +** Stack and Call structure of Lua +** See Copyright Notice in lua.h +*/ + +#ifndef ldo_h +#define ldo_h + + +#include "lobject.h" +#include "lstate.h" +#include "lzio.h" + + +/* +** Macro to check stack size and grow stack if needed. Parameters +** 'pre'/'pos' allow the macro to preserve a pointer into the +** stack across reallocations, doing the work only when needed. +** 'condmovestack' is used in heavy tests to force a stack reallocation +** at every check. +*/ +#define luaD_checkstackaux(L,n,pre,pos) \ + if (L->stack_last - L->top <= (n)) \ + { pre; luaD_growstack(L, n, 1); pos; } \ + else { condmovestack(L,pre,pos); } + +/* In general, 'pre'/'pos' are empty (nothing to save) */ +#define luaD_checkstack(L,n) luaD_checkstackaux(L,n,(void)0,(void)0) + + + +#define savestack(L,p) ((char *)(p) - (char *)L->stack) +#define restorestack(L,n) ((StkId)((char *)L->stack + (n))) + + +/* macro to check stack size, preserving 'p' */ +#define checkstackp(L,n,p) \ + luaD_checkstackaux(L, n, \ + ptrdiff_t t__ = savestack(L, p); /* save 'p' */ \ + luaC_checkGC(L), /* stack grow uses memory */ \ + p = restorestack(L, t__)) /* 'pos' part: restore 'p' */ + + +/* macro to check stack size and GC */ +#define checkstackGC(L,fsize) \ + luaD_checkstackaux(L, (fsize), (void)0, luaC_checkGC(L)) + + +/* type of protected functions, to be ran by 'runprotected' */ +typedef void (*Pfunc) (lua_State *L, void *ud); + +LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop); +LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, + const char *mode); +LUAI_FUNC void luaD_hook (lua_State *L, int event, int line, + int fTransfer, int nTransfer); +LUAI_FUNC void luaD_hookcall (lua_State *L, CallInfo *ci); +LUAI_FUNC void luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, int n); +LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults); +LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults); +LUAI_FUNC void luaD_tryfuncTM (lua_State *L, StkId func); +LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, + ptrdiff_t oldtop, ptrdiff_t ef); +LUAI_FUNC void luaD_poscall (lua_State *L, CallInfo *ci, int nres); +LUAI_FUNC int luaD_reallocstack (lua_State *L, int newsize, int raiseerror); +LUAI_FUNC int luaD_growstack (lua_State *L, int n, int raiseerror); +LUAI_FUNC void luaD_shrinkstack (lua_State *L); +LUAI_FUNC void luaD_inctop (lua_State *L); + +LUAI_FUNC l_noret luaD_throw (lua_State *L, int errcode); +LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); + +#endif + diff --git a/source/lua/ldo.o b/source/lua/ldo.o new file mode 100644 index 0000000000000000000000000000000000000000..6d99014eb3e270c9078cddaea75a2b752fce5f01 GIT binary patch literal 12416 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 literal 0 HcmV?d00001 diff --git a/source/lua/ldump.c b/source/lua/ldump.c new file mode 100644 index 0000000..aca6245 --- /dev/null +++ b/source/lua/ldump.c @@ -0,0 +1,230 @@ +/* +** $Id: ldump.c $ +** save precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#define ldump_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "lobject.h" +#include "lstate.h" +#include "lundump.h" + + +typedef struct { + lua_State *L; + lua_Writer writer; + void *data; + int strip; + int status; +} DumpState; + + +/* +** All high-level dumps go through DumpVector; you can change it to +** change the endianness of the result +*/ +#define DumpVector(v,n,D) DumpBlock(v,(n)*sizeof((v)[0]),D) + +#define DumpLiteral(s,D) DumpBlock(s, sizeof(s) - sizeof(char), D) + + +static void DumpBlock (const void *b, size_t size, DumpState *D) { + if (D->status == 0 && size > 0) { + lua_unlock(D->L); + D->status = (*D->writer)(D->L, b, size, D->data); + lua_lock(D->L); + } +} + + +#define DumpVar(x,D) DumpVector(&x,1,D) + + +static void DumpByte (int y, DumpState *D) { + lu_byte x = (lu_byte)y; + DumpVar(x, D); +} + + +/* DumpInt Buff Size */ +#define DIBS ((sizeof(size_t) * 8 / 7) + 1) + +static void DumpSize (size_t x, DumpState *D) { + lu_byte buff[DIBS]; + int n = 0; + do { + buff[DIBS - (++n)] = x & 0x7f; /* fill buffer in reverse order */ + x >>= 7; + } while (x != 0); + buff[DIBS - 1] |= 0x80; /* mark last byte */ + DumpVector(buff + DIBS - n, n, D); +} + + +static void DumpInt (int x, DumpState *D) { + DumpSize(x, D); +} + + +static void DumpNumber (lua_Number x, DumpState *D) { + DumpVar(x, D); +} + + +static void DumpInteger (lua_Integer x, DumpState *D) { + DumpVar(x, D); +} + + +static void DumpString (const TString *s, DumpState *D) { + if (s == NULL) + DumpSize(0, D); + else { + size_t size = tsslen(s); + const char *str = getstr(s); + DumpSize(size + 1, D); + DumpVector(str, size, D); + } +} + + +static void DumpCode (const Proto *f, DumpState *D) { + DumpInt(f->sizecode, D); + DumpVector(f->code, f->sizecode, D); +} + + +static void DumpFunction(const Proto *f, TString *psource, DumpState *D); + +static void DumpConstants (const Proto *f, DumpState *D) { + int i; + int n = f->sizek; + DumpInt(n, D); + for (i = 0; i < n; i++) { + const TValue *o = &f->k[i]; + DumpByte(ttypetag(o), D); + switch (ttypetag(o)) { + case LUA_TNIL: + break; + case LUA_TBOOLEAN: + DumpByte(bvalue(o), D); + break; + case LUA_TNUMFLT: + DumpNumber(fltvalue(o), D); + break; + case LUA_TNUMINT: + DumpInteger(ivalue(o), D); + break; + case LUA_TSHRSTR: + case LUA_TLNGSTR: + DumpString(tsvalue(o), D); + break; + default: lua_assert(0); + } + } +} + + +static void DumpProtos (const Proto *f, DumpState *D) { + int i; + int n = f->sizep; + DumpInt(n, D); + for (i = 0; i < n; i++) + DumpFunction(f->p[i], f->source, D); +} + + +static void DumpUpvalues (const Proto *f, DumpState *D) { + int i, n = f->sizeupvalues; + DumpInt(n, D); + for (i = 0; i < n; i++) { + DumpByte(f->upvalues[i].instack, D); + DumpByte(f->upvalues[i].idx, D); + } +} + + +static void DumpDebug (const Proto *f, DumpState *D) { + int i, n; + n = (D->strip) ? 0 : f->sizelineinfo; + DumpInt(n, D); + DumpVector(f->lineinfo, n, D); + n = (D->strip) ? 0 : f->sizeabslineinfo; + DumpInt(n, D); + for (i = 0; i < n; i++) { + DumpInt(f->abslineinfo[i].pc, D); + DumpInt(f->abslineinfo[i].line, D); + } + n = (D->strip) ? 0 : f->sizelocvars; + DumpInt(n, D); + for (i = 0; i < n; i++) { + DumpString(f->locvars[i].varname, D); + DumpInt(f->locvars[i].startpc, D); + DumpInt(f->locvars[i].endpc, D); + } + n = (D->strip) ? 0 : f->sizeupvalues; + DumpInt(n, D); + for (i = 0; i < n; i++) + DumpString(f->upvalues[i].name, D); +} + + +static void DumpFunction (const Proto *f, TString *psource, DumpState *D) { + if (D->strip || f->source == psource) + DumpString(NULL, D); /* no debug info or same source as its parent */ + else + DumpString(f->source, D); + DumpInt(f->linedefined, D); + DumpInt(f->lastlinedefined, D); + DumpByte(f->numparams, D); + DumpByte(f->is_vararg, D); + DumpByte(f->maxstacksize, D); + DumpCode(f, D); + DumpConstants(f, D); + DumpUpvalues(f, D); + DumpProtos(f, D); + DumpDebug(f, D); +} + + +static void DumpHeader (DumpState *D) { + DumpLiteral(LUA_SIGNATURE, D); + DumpByte(LUAC_VERSION, D); + DumpByte(LUAC_FORMAT, D); + DumpLiteral(LUAC_DATA, D); + DumpByte(sizeof(int), D); + DumpByte(sizeof(size_t), D); + DumpByte(sizeof(Instruction), D); + DumpByte(sizeof(lua_Integer), D); + DumpByte(sizeof(lua_Number), D); + DumpInteger(LUAC_INT, D); + DumpNumber(LUAC_NUM, D); +} + + +/* +** dump Lua function as precompiled chunk +*/ +int luaU_dump(lua_State *L, const Proto *f, lua_Writer w, void *data, + int strip) { + DumpState D; + D.L = L; + D.writer = w; + D.data = data; + D.strip = strip; + D.status = 0; + DumpHeader(&D); + DumpByte(f->sizeupvalues, &D); + DumpFunction(f, NULL, &D); + return D.status; +} + diff --git a/source/lua/ldump.o b/source/lua/ldump.o new file mode 100644 index 0000000000000000000000000000000000000000..42bf22c44c97ae75b580495a3c5e22a071cf09dd GIT binary patch literal 5616 zcmeHLZEO_B86Nu_IE>jnBGMjkDl7F;IT9>)X=<6;B6s#3tj$rm*e0luf;nuU7@OLA zjRPiFJ(jTDxOLQ4p{iQZAC+3QQuz~?AJnl0ra?`sh*nV)BtjBC&H<@3ZJiI2T%UJ# z2A|hnDQf@rwbnE9%=3QCJMYY{eJq{XP+nHXq?EDsY-S`;#?CCA=_hzM!ImC zJ!GtV-&73ywL%w^ZY%1l1T*Zb@nT{6Qv{wpx*DUxyKX;5{j2D!qv=YgKVnUvOhv=$ z@hbr=Dti=BUM;-DskyMTDPm0AEVnM@mKxTySp{DS!+xW1%r&(P+$Q_u!U%?G>-sZK zq=&ns#dQ37Q+~3nY2ro&*0tHbnF-`-oz_TF9o-PjUwhoT42PZ4CBS4YQ- z(MifF#ogqrrwD!qlTG;xq0Q^=} z6|Q}Zs*vMBt%3*lCx8^(Yffv}x~y71MSkERDm?ra)8t``H}UdZIq7|5A8VEN`8YeM z1q;2dLkU#zbbdoPoOBw)NW4|)I+QzICmgQzI&|}Z_*;ZOZmpYJyOFzvbE?syN>|f#4Z9OiyGo{u{+-hzf=YCds6?DwW^D%V`OBuo1 zaDHom&t8zcAKdxRkBeld2@?3dJ+al1Uye0Oq&Z%zcGh>Yrm3bP)1)aA&kdtBv8dD2~lwRC@_9Gwe(> zmcm}t{xKD;C!|nK4l%fhgtuAa=9djjg$A}VHhC}f08!k{5SHGIPZw?o6(lJ^cR%t< zUMNKOfdB2o8JmpC%%n2&kbVbJ%GnXE$M)sE$7jbDz#R{?@I0SwbK|Pum9TamBj4h* zj7tlm&{V4)*Rj`EBd3W~!Wu$)3$EO(Qe1A_5zw4LVT>+|yVzB)t@l3w$&{pN)p~(j znw^2mL_%2ilSz^Nrqo(U)ISliOeA{=>`<~ZQGORVrR=cFK0@rq5LG+v8LeYaDNS|P z(FWSoCQQKULuB=S7%-2*n_7!G!v8OyDFZ7rxem7chf69~&}WU1>ZcNHV`Jl2wd(fW zxgIm8eMNsvkFBZ6@lpJlc#R%=OpnJOaVNA#WAU0;O>7<1mkASPhqth@fl%4Xs)fN3 zRCgG7M9eLxHmQX2amo0!c;7 zSA4tjyb?}cR6-4}D8WsOlcmGd;ua-%{^Bd!p!Oruh5UlI~J z#2-RS!uJ8Kj)!o$ex6$*Kmv>|ySWlzwA*tfz$mJ@5@7S^FTkqikn1?&XQ!mLg=PZn zgZO*lv`7)(Kbq^_lRJ1w&$1MnhVI_%0sT-%pQ*<<(7OL{r`s|6_V?`N-3_^(thv9p zhv}Kd8rGfbXx~XD$QI;P+Gq%^q%?{@2)~4tuJS#BQ#q-4@D}CLB~mK+g2r|(1PS8h zzvzRzY{n~qblws1$(^Ag;Ul7?LP9~}l27NE#EWYjor_od;4vRu-UnX$2_L@UgSYtL zbT5#2?eF5~TzsDoF8A4MXTXO)=a@C&y5BPlxpvrCIO7(&*J`bM~sDJN3<)^(v~H}ST?7` zt7Sw0bO)24pcscm`z3*U-^fcOQSf9V%0dp=YV?Tu-|EMqJKy?0tN*mnr#dQ?kchw9 z6R>w#2`J5%ziR%e&)9%i80C-lNb1Y{Z3adz9>r5Cwc-`-eZ$LeWV-`O)PJy48GS?O zOMh}&j%B+a6Qm!L1ktt#{TdH0{mQlv^Riz`Jt6c + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + + +CClosure *luaF_newCclosure (lua_State *L, int n) { + GCObject *o = luaC_newobj(L, LUA_TCCL, sizeCclosure(n)); + CClosure *c = gco2ccl(o); + c->nupvalues = cast_byte(n); + return c; +} + + +LClosure *luaF_newLclosure (lua_State *L, int n) { + GCObject *o = luaC_newobj(L, LUA_TLCL, sizeLclosure(n)); + LClosure *c = gco2lcl(o); + c->p = NULL; + c->nupvalues = cast_byte(n); + while (n--) c->upvals[n] = NULL; + return c; +} + + +/* +** fill a closure with new closed upvalues +*/ +void luaF_initupvals (lua_State *L, LClosure *cl) { + int i; + for (i = 0; i < cl->nupvalues; i++) { + GCObject *o = luaC_newobj(L, LUA_TUPVAL, sizeof(UpVal)); + UpVal *uv = gco2upv(o); + uv->v = &uv->u.value; /* make it closed */ + setnilvalue(uv->v); + cl->upvals[i] = uv; + luaC_objbarrier(L, cl, o); + } +} + + +/* +** Create a new upvalue with the given tag at the given level, +** and link it to the list of open upvalues of 'L' after entry 'prev'. +**/ +static UpVal *newupval (lua_State *L, int tag, StkId level, UpVal **prev) { + GCObject *o = luaC_newobj(L, tag, sizeof(UpVal)); + UpVal *uv = gco2upv(o); + UpVal *next = *prev; + uv->v = s2v(level); /* current value lives in the stack */ + uv->u.open.next = next; /* link it to list of open upvalues */ + uv->u.open.previous = prev; + if (next) + next->u.open.previous = &uv->u.open.next; + *prev = uv; + if (!isintwups(L)) { /* thread not in list of threads with upvalues? */ + L->twups = G(L)->twups; /* link it to the list */ + G(L)->twups = L; + } + return uv; +} + + +/* +** Find and reuse, or create if it does not exist, a regular upvalue +** at the given level. +*/ +UpVal *luaF_findupval (lua_State *L, StkId level) { + UpVal **pp = &L->openupval; + UpVal *p; + lua_assert(isintwups(L) || L->openupval == NULL); + while ((p = *pp) != NULL && uplevel(p) >= level) { /* search for it */ + if (uplevel(p) == level && !isdead(G(L), p)) /* corresponding upvalue? */ + return p; /* return it */ + pp = &p->u.open.next; + } + /* not found: create a new upvalue after 'pp' */ + return newupval(L, LUA_TUPVAL, level, pp); +} + + +static void callclose (lua_State *L, void *ud) { + UNUSED(ud); + luaD_callnoyield(L, L->top - 3, 0); +} + + +/* +** Prepare closing method plus its arguments for object 'obj' with +** error message 'err'. (This function assumes EXTRA_STACK.) +*/ +static int prepclosingmethod (lua_State *L, TValue *obj, TValue *err) { + StkId top = L->top; + const TValue *tm = luaT_gettmbyobj(L, obj, TM_CLOSE); + if (ttisnil(tm)) /* no metamethod? */ + return 0; /* nothing to call */ + setobj2s(L, top, tm); /* will call metamethod... */ + setobj2s(L, top + 1, obj); /* with 'self' as the 1st argument */ + setobj2s(L, top + 2, err); /* and error msg. as 2nd argument */ + L->top = top + 3; /* add function and arguments */ + return 1; +} + + +/* +** Prepare and call a closing method. If status is OK, code is still +** inside the original protected call, and so any error will be handled +** there. Otherwise, a previous error already activated original +** protected call, and so the call to the closing method must be +** protected here. (A status = CLOSEPROTECT behaves like a previous +** error, to also run the closing method in protected mode). +** If status is OK, the call to the closing method will be pushed +** at the top of the stack. Otherwise, values are pushed after +** the 'level' of the upvalue being closed, as everything after +** that won't be used again. +*/ +static int callclosemth (lua_State *L, TValue *uv, StkId level, int status) { + if (likely(status == LUA_OK)) { + if (prepclosingmethod(L, uv, &G(L)->nilvalue)) /* something to call? */ + callclose(L, NULL); /* call closing method */ + else if (!ttisnil(uv)) { /* non-closable non-nil value? */ + int idx = cast_int(level - L->ci->func); + const char *vname = luaG_findlocal(L, L->ci, idx, NULL); + if (vname == NULL) vname = "?"; + luaG_runerror(L, "attempt to close non-closable variable '%s'", vname); + } + } + else { /* there was an error */ + /* save error message and set stack top to 'level + 1' */ + luaD_seterrorobj(L, status, level); + if (prepclosingmethod(L, uv, s2v(level))) { /* something to call? */ + int newstatus = luaD_pcall(L, callclose, NULL, savestack(L, level), 0); + if (newstatus != LUA_OK) /* another error when closing? */ + status = newstatus; /* this will be the new error */ + } + /* else no metamethod; ignore this case and keep original error */ + } + return status; +} + + +/* +** Try to create a to-be-closed upvalue +** (can raise a memory-allocation error) +*/ +static void trynewtbcupval (lua_State *L, void *ud) { + StkId level = cast(StkId, ud); + lua_assert(L->openupval == NULL || uplevel(L->openupval) < level); + newupval(L, LUA_TUPVALTBC, level, &L->openupval); +} + + +/* +** Create a to-be-closed upvalue. If there is a memory error +** when creating the upvalue, the closing method must be called here, +** as there is no upvalue to call it later. +*/ +void luaF_newtbcupval (lua_State *L, StkId level) { + int status = luaD_rawrunprotected(L, trynewtbcupval, level); + if (unlikely(status != LUA_OK)) { /* memory error creating upvalue? */ + lua_assert(status == LUA_ERRMEM); + luaD_seterrorobj(L, LUA_ERRMEM, level + 1); /* save error message */ + if (prepclosingmethod(L, s2v(level), s2v(level + 1))) + callclose(L, NULL); /* call closing method */ + luaD_throw(L, LUA_ERRMEM); /* throw memory error */ + } +} + + +void luaF_unlinkupval (UpVal *uv) { + lua_assert(upisopen(uv)); + *uv->u.open.previous = uv->u.open.next; + if (uv->u.open.next) + uv->u.open.next->u.open.previous = uv->u.open.previous; +} + + +int luaF_close (lua_State *L, StkId level, int status) { + UpVal *uv; + while ((uv = L->openupval) != NULL && uplevel(uv) >= level) { + StkId upl = uplevel(uv); + TValue *slot = &uv->u.value; /* new position for value */ + luaF_unlinkupval(uv); + setobj(L, slot, uv->v); /* move value to upvalue slot */ + uv->v = slot; /* now current value lives here */ + if (!iswhite(uv)) + gray2black(uv); /* closed upvalues cannot be gray */ + luaC_barrier(L, uv, slot); + if (uv->tt == LUA_TUPVALTBC && status != NOCLOSINGMETH) { + /* must run closing method */ + ptrdiff_t levelrel = savestack(L, level); + status = callclosemth(L, uv->v, upl, status); /* may change the stack */ + level = restorestack(L, levelrel); + } + } + return status; +} + + +Proto *luaF_newproto (lua_State *L) { + GCObject *o = luaC_newobj(L, LUA_TPROTO, sizeof(Proto)); + Proto *f = gco2p(o); + f->k = NULL; + f->sizek = 0; + f->p = NULL; + f->sizep = 0; + f->code = NULL; + f->sizecode = 0; + f->lineinfo = NULL; + f->sizelineinfo = 0; + f->abslineinfo = NULL; + f->sizeabslineinfo = 0; + f->upvalues = NULL; + f->sizeupvalues = 0; + f->numparams = 0; + f->is_vararg = 0; + f->maxstacksize = 0; + f->locvars = NULL; + f->sizelocvars = 0; + f->linedefined = 0; + f->lastlinedefined = 0; + f->source = NULL; + return f; +} + + +void luaF_freeproto (lua_State *L, Proto *f) { + luaM_freearray(L, f->code, f->sizecode); + luaM_freearray(L, f->p, f->sizep); + luaM_freearray(L, f->k, f->sizek); + luaM_freearray(L, f->lineinfo, f->sizelineinfo); + luaM_freearray(L, f->abslineinfo, f->sizeabslineinfo); + luaM_freearray(L, f->locvars, f->sizelocvars); + luaM_freearray(L, f->upvalues, f->sizeupvalues); + luaM_free(L, f); +} + + +/* +** Look for n-th local variable at line 'line' in function 'func'. +** Returns NULL if not found. +*/ +const char *luaF_getlocalname (const Proto *f, int local_number, int pc) { + int i; + for (i = 0; isizelocvars && f->locvars[i].startpc <= pc; i++) { + if (pc < f->locvars[i].endpc) { /* is variable active? */ + local_number--; + if (local_number == 0) + return getstr(f->locvars[i].varname); + } + } + return NULL; /* not found */ +} + diff --git a/source/lua/lfunc.h b/source/lua/lfunc.h new file mode 100644 index 0000000..0ed79c4 --- /dev/null +++ b/source/lua/lfunc.h @@ -0,0 +1,69 @@ +/* +** $Id: lfunc.h $ +** Auxiliary functions to manipulate prototypes and closures +** See Copyright Notice in lua.h +*/ + +#ifndef lfunc_h +#define lfunc_h + + +#include "lobject.h" + + +#define sizeCclosure(n) (cast_int(offsetof(CClosure, upvalue)) + \ + cast_int(sizeof(TValue)) * (n)) + +#define sizeLclosure(n) (cast_int(offsetof(LClosure, upvals)) + \ + cast_int(sizeof(TValue *)) * (n)) + + +/* test whether thread is in 'twups' list */ +#define isintwups(L) (L->twups != L) + + +/* +** maximum number of upvalues in a closure (both C and Lua). (Value +** must fit in a VM register.) +*/ +#define MAXUPVAL 255 + + +#define upisopen(up) ((up)->v != &(up)->u.value) + + +#define uplevel(up) check_exp(upisopen(up), cast(StkId, (up)->v)) + + +/* +** maximum number of misses before giving up the cache of closures +** in prototypes +*/ +#define MAXMISS 10 + + +/* +** Special "status" for 'luaF_close' +*/ + +/* close upvalues without running their closing methods */ +#define NOCLOSINGMETH (-1) + +/* close upvalues running all closing methods in protected mode */ +#define CLOSEPROTECT (-2) + + +LUAI_FUNC Proto *luaF_newproto (lua_State *L); +LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nelems); +LUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nelems); +LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl); +LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); +LUAI_FUNC void luaF_newtbcupval (lua_State *L, StkId level); +LUAI_FUNC int luaF_close (lua_State *L, StkId level, int status); +LUAI_FUNC void luaF_unlinkupval (UpVal *uv); +LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); +LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, + int pc); + + +#endif diff --git a/source/lua/lfunc.o b/source/lua/lfunc.o new file mode 100644 index 0000000000000000000000000000000000000000..4d4c5042d9e101bb1ff11879b2116f36f96be074 GIT binary patch literal 5680 zcmbVQeQaA-6~DIA&Pmf}QAUjxoL~iG;y4lkJhn+ z{oFQeYs1`RdAu4Ku|Fn+00|HXAu*&8u^^(PLH(FEsVXZ%6j3NbOWIOGyGCejG3VTO zuk-pEqiLslzW4mj=RNn_`(Apixox}MW+Q@Z)^AJd{zS>{N@3u#^n=|#m&Rwpc@$)SF z^e&k&k#z1!SmB z#7*PBr&{=eyxd$Vt7n%3l^%7TYA307U1*nF9s5;(0V{CR6d&pzpjdO zs)w*|v`g4J48Hm&tQ)LH#>A-RhAB%MdU=lwrIKOYh2ZWWG}tn0vpdnCc7g9xtG=%m zig3|&{I{5leh?OV-Syg=j0u5DXs7%R!)-{ojWV~G3e}-Cqfm~B(=`>Uq}mSmWK{mC zC%ZOxMxG2+<}L@+jmsg}A_-kBH&uGFeVFgqOU{R~uLg5>i>~8Gip664X0^7VdHkPL z?{sGmwCdqni1`=TN}7*E7GAi+>ha8S$mw#8=OH!sLT83&@xZ$5~V?^~0sx7u|ZiCePv;OmJD@A*a&xT#i z3yT?u+^Va!P?9VDv*>^GgLLkr3Kn`AG9}PLMi02cCsD4Q^v^PBe_`c3;N3Gl2HG=K z@WaG#vKnAcP6syP04z0FnX>_dWycSsdkuCIm-ZNJ9cLp3>&D?!pbDOK@KmGQK|@q) z3{M$@4+jvAun}%D?DCa-JD|01!nMin%=m6ND~AGf?y}v;JPsYAXDHSF1(-u%8v$!D zFrz#)9^C}kUciJ-9q>ICyIQ~oEq2g(8MxihKlcSG!rlSY*~JRU?$v&Ap7ouz<7bch z;cN_Ui#T7d%PrdI+}|pwZSLxNc7AfR?#77om}^_4`js`g>o#>gZJf(4_-DnvN@#A@ zGyfcx11P4d%J7IPt0_62NM#f`nM!WKS*$mq$cJL-AvSsPiOiFPw1h&>$aNjP*`%74 zzv$iS^=+xoGR}Y0U+?v8_4@svHw5z2K7YNh-q&b^A#CemZu{Dc#CF7Od!+gSX93+S3Ih$*O{uOGmJBpCz2W_*j!AHgv!xpVg2k`tyV zJBJw1cKo3zdxgoc>#iXNbO?VycETPm=B^ zb##>05nPA%`?&6-s0;KZct$w(I*wrfO{{6&(JaX)u%;7h!jdny*8YbosSaubGNY_b z>p&g%>P>F{Lzv^*?cbA}c(BfJ{3nP*F(pj45uMr=E5lQsc6EH`-z);>_F!yp? zxDx$?Y7Vj%hx^Du9=H!fz(Fvp`^iD@F1?=|1iSHG`ZBO?UVF2oy$rs;41NIc4e(tm ze6ceC*h?Ju@ffWC0XxC*F^;p|2kg7>2p=#l(a&Ip{-LOhMDM@N@g9z|{s-(Gcvkas zsSLhU2EPqB#y!XVi!)OVsUW_@advJ%_cMU67Wc6-xW5ek9QR+~Ey~Un_;2TUfVU_+ zSAgT0UM=nb*I(lLrSp~O&nDyEI2lPRBY1xgB?pETbuiUO;;}@6-R&f)9L|m$iY17e z9)-Eu8#mZQHnyvKKvC7<-qBR=0Rnuu8_klb(IF+#hd`(sEVytx&O_)kn^sWBfVO*p zq2!Rtyk`vS-dH+4q@=qI_5Pt`Unw@THYXGAPR9$>j!V(B~XB1UQr&H-t zit1oGb=Yv2O(uqt2Td-G6|Hjw4#*Q_HJZ( z@=z(}BN-c3V5=B?mXFvzcxS+e9wV{Oh=0n2WB(vo@lYB3mu2uvCj8UjPsBaQ`xtKy zHsyL5j^lvuF`-{D;rO?dz<*)FA2#8qOgO%Sg#HKoYDTd+pP~sj>u=!a0rkys>p3p+ z9|JkkvnGA4xrp0q!tqQCe8A)feF;jLaD3+p8Z-H+0Z{n)z6m$)<5&1O#QYyK=?|B| zzg`CaRvG-qW$?Gl;O~{eb-qB%(_H_*m(iC^`e-AFeVhY>7(Qe0Ac=cg-~|IFKjNdn z#e4GC7F^tQ?^|#m@7pB{F5WY;ssAyC(d_VDX~BD#kdPh=F5UyG1sCsuw=B50zu&ds z;{N{7f{S~acr&BJYOEJVHEoQ8VwP4CF|Vo|QHi%NrpAc3HYv48rwgx~zCDKgl425iZgCWfK4l zslg(^UNaMZN8nKkm_eAIS#JPhKaj;Z;tL1wDx}ZBgE+rV5Mp%15?A1SI|NIff*Jb! zr1pNWU2XjzH-3QIKMkXqggtN5l1St)#+@L+xz&D*uOHWECQ(0OkKcPZ_nDPo{&Q}R z|8Zs}VJF4`5Q@23@AAj2|I6Ioy3Pe*ZxM+6MXbXxS*?HG;EfjH$zlKCeJ|`q|KQzi y-Ftw@0t$d8jG^>vT`TgI6q)V<57fh* +#include + + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + +/* +** Maximum number of elements to sweep in each single step. +** (Large enough to dissipate fixed overheads but small enough +** to allow small steps for the collector.) +*/ +#define GCSWEEPMAX 100 + +/* +** Maximum number of finalizers to call in each single step. +*/ +#define GCFINMAX 10 + + +/* +** Cost of calling one finalizer. +*/ +#define GCFINALIZECOST 50 + + +/* +** The equivalent, in bytes, of one unit of "work" (visiting a slot, +** sweeping an object, etc.) +*/ +#define WORK2MEM sizeof(TValue) + + +/* +** macro to adjust 'pause': 'pause' is actually used like +** 'pause / PAUSEADJ' (value chosen by tests) +*/ +#define PAUSEADJ 100 + + +/* mask to erase all color bits (plus gen. related stuff) */ +#define maskcolors (~(bitmask(BLACKBIT) | WHITEBITS | AGEBITS)) + + +/* macro to erase all color bits then sets only the current white bit */ +#define makewhite(g,x) \ + (x->marked = cast_byte((x->marked & maskcolors) | luaC_white(g))) + +#define white2gray(x) resetbits(x->marked, WHITEBITS) +#define black2gray(x) resetbit(x->marked, BLACKBIT) + + +#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) + +#define keyiswhite(n) (keyiscollectable(n) && iswhite(gckey(n))) + + +#define checkconsistency(obj) \ + lua_longassert(!iscollectable(obj) || righttt(obj)) + +/* +** Protected access to objects in values +*/ +#define gcvalueN(o) (iscollectable(o) ? gcvalue(o) : NULL) + + +#define markvalue(g,o) { checkconsistency(o); \ + if (valiswhite(o)) reallymarkobject(g,gcvalue(o)); } + +#define markkey(g, n) { if keyiswhite(n) reallymarkobject(g,gckey(n)); } + +#define markobject(g,t) { if (iswhite(t)) reallymarkobject(g, obj2gco(t)); } + +/* +** mark an object that can be NULL (either because it is really optional, +** or it was stripped as debug info, or inside an uncompleted structure) +*/ +#define markobjectN(g,t) { if (t) markobject(g,t); } + +static void reallymarkobject (global_State *g, GCObject *o); +static lu_mem atomic (lua_State *L); +static void entersweep (lua_State *L); + + +/* +** {====================================================== +** Generic functions +** ======================================================= +*/ + + +/* +** one after last element in a hash array +*/ +#define gnodelast(h) gnode(h, cast_sizet(sizenode(h))) + + +static GCObject **getgclist (GCObject *o) { + switch (o->tt) { + case LUA_TTABLE: return &gco2t(o)->gclist; + case LUA_TLCL: return &gco2lcl(o)->gclist; + case LUA_TCCL: return &gco2ccl(o)->gclist; + case LUA_TTHREAD: return &gco2th(o)->gclist; + case LUA_TPROTO: return &gco2p(o)->gclist; + case LUA_TUSERDATA: { + Udata *u = gco2u(o); + lua_assert(u->nuvalue > 0); + return &u->gclist; + } + default: lua_assert(0); return 0; + } +} + + +/* +** Link a collectable object 'o' with a known type into list pointed by 'p'. +*/ +#define linkgclist(o,p) ((o)->gclist = (p), (p) = obj2gco(o)) + + +/* +** Link a generic collectable object 'o' into list pointed by 'p'. +*/ +#define linkobjgclist(o,p) (*getgclist(o) = (p), (p) = obj2gco(o)) + + + +/* +** Clear keys for empty entries in tables. If entry is empty +** and its key is not marked, mark its entry as dead. This allows the +** collection of the key, but keeps its entry in the table (its removal +** could break a chain). The main feature of a dead key is that it must +** be different from any other value, to do not disturb searches. +** Other places never manipulate dead keys, because its associated empty +** value is enough to signal that the entry is logically empty. +*/ +static void clearkey (Node *n) { + lua_assert(isempty(gval(n))); + if (keyiswhite(n)) + setdeadkey(n); /* unused and unmarked key; remove it */ +} + + +/* +** tells whether a key or value can be cleared from a weak +** table. Non-collectable objects are never removed from weak +** tables. Strings behave as 'values', so are never removed too. for +** other objects: if really collected, cannot keep them; for objects +** being finalized, keep them in keys, but not in values +*/ +static int iscleared (global_State *g, const GCObject *o) { + if (o == NULL) return 0; /* non-collectable value */ + else if (novariant(o->tt) == LUA_TSTRING) { + markobject(g, o); /* strings are 'values', so are never weak */ + return 0; + } + else return iswhite(o); +} + + +/* +** barrier that moves collector forward, that is, mark the white object +** 'v' being pointed by the black object 'o'. (If in sweep phase, clear +** the black object to white [sweep it] to avoid other barrier calls for +** this same object.) In the generational mode, 'v' must also become +** old, if 'o' is old; however, it cannot be changed directly to OLD, +** because it may still point to non-old objects. So, it is marked as +** OLD0. In the next cycle it will become OLD1, and in the next it +** will finally become OLD (regular old). +*/ +void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) { + global_State *g = G(L); + lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); + if (keepinvariant(g)) { /* must keep invariant? */ + reallymarkobject(g, v); /* restore invariant */ + if (isold(o)) { + lua_assert(!isold(v)); /* white object could not be old */ + setage(v, G_OLD0); /* restore generational invariant */ + } + } + else { /* sweep phase */ + lua_assert(issweepphase(g)); + makewhite(g, o); /* mark main obj. as white to avoid other barriers */ + } +} + + +/* +** barrier that moves collector backward, that is, mark the black object +** pointing to a white object as gray again. +*/ +void luaC_barrierback_ (lua_State *L, GCObject *o) { + global_State *g = G(L); + lua_assert(isblack(o) && !isdead(g, o)); + lua_assert(g->gckind != KGC_GEN || (isold(o) && getage(o) != G_TOUCHED1)); + if (getage(o) != G_TOUCHED2) /* not already in gray list? */ + linkobjgclist(o, g->grayagain); /* link it in 'grayagain' */ + black2gray(o); /* make object gray (again) */ + setage(o, G_TOUCHED1); /* touched in current cycle */ +} + + +void luaC_fix (lua_State *L, GCObject *o) { + global_State *g = G(L); + lua_assert(g->allgc == o); /* object must be 1st in 'allgc' list! */ + white2gray(o); /* they will be gray forever */ + setage(o, G_OLD); /* and old forever */ + g->allgc = o->next; /* remove object from 'allgc' list */ + o->next = g->fixedgc; /* link it to 'fixedgc' list */ + g->fixedgc = o; +} + + +/* +** create a new collectable object (with given type and size) and link +** it to 'allgc' list. +*/ +GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { + global_State *g = G(L); + GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz)); + o->marked = luaC_white(g); + o->tt = tt; + o->next = g->allgc; + g->allgc = o; + return o; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** Mark functions +** ======================================================= +*/ + + +/* +** Mark an object. Userdata, strings, and closed upvalues are visited +** and turned black here. Other objects are marked gray and added +** to appropriate list to be visited (and turned black) later. (Open +** upvalues are already linked in 'headuv' list. They are kept gray +** to avoid barriers, as their values will be revisited by the thread.) +*/ +static void reallymarkobject (global_State *g, GCObject *o) { + white2gray(o); + switch (o->tt) { + case LUA_TSHRSTR: + case LUA_TLNGSTR: { + gray2black(o); + break; + } + case LUA_TUPVAL: + case LUA_TUPVALTBC: { + UpVal *uv = gco2upv(o); + if (!upisopen(uv)) /* open upvalues are kept gray */ + gray2black(o); + markvalue(g, uv->v); /* mark its content */ + break; + } + case LUA_TUSERDATA: { + Udata *u = gco2u(o); + if (u->nuvalue == 0) { /* no user values? */ + markobjectN(g, u->metatable); /* mark its metatable */ + gray2black(o); /* nothing else to mark */ + break; + } + /* else... */ + } /* FALLTHROUGH */ + case LUA_TLCL: case LUA_TCCL: case LUA_TTABLE: + case LUA_TTHREAD: case LUA_TPROTO: { + linkobjgclist(o, g->gray); + break; + } + default: lua_assert(0); break; + } +} + + +/* +** mark metamethods for basic types +*/ +static void markmt (global_State *g) { + int i; + for (i=0; i < LUA_NUMTAGS; i++) + markobjectN(g, g->mt[i]); +} + + +/* +** mark all objects in list of being-finalized +*/ +static lu_mem markbeingfnz (global_State *g) { + GCObject *o; + lu_mem count = 0; + for (o = g->tobefnz; o != NULL; o = o->next) { + count++; + markobject(g, o); + } + return count; +} + + +/* +** Mark all values stored in marked open upvalues from non-marked threads. +** (Values from marked threads were already marked when traversing the +** thread.) Remove from the list threads that no longer have upvalues and +** not-marked threads. +*/ +static int remarkupvals (global_State *g) { + lua_State *thread; + lua_State **p = &g->twups; + int work = 0; + while ((thread = *p) != NULL) { + work++; + lua_assert(!isblack(thread)); /* threads are never black */ + if (isgray(thread) && thread->openupval != NULL) + p = &thread->twups; /* keep marked thread with upvalues in the list */ + else { /* thread is not marked or without upvalues */ + UpVal *uv; + *p = thread->twups; /* remove thread from the list */ + thread->twups = thread; /* mark that it is out of list */ + for (uv = thread->openupval; uv != NULL; uv = uv->u.open.next) { + work++; + if (!iswhite(uv)) /* upvalue already visited? */ + markvalue(g, uv->v); /* mark its value */ + } + } + } + return work; +} + + +/* +** mark root set and reset all gray lists, to start a new collection +*/ +static void restartcollection (global_State *g) { + g->gray = g->grayagain = NULL; + g->weak = g->allweak = g->ephemeron = NULL; + markobject(g, g->mainthread); + markvalue(g, &g->l_registry); + markmt(g); + markbeingfnz(g); /* mark any finalizing object left from previous cycle */ +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Traverse functions +** ======================================================= +*/ + +/* +** Traverse a table with weak values and link it to proper list. During +** propagate phase, keep it in 'grayagain' list, to be revisited in the +** atomic phase. In the atomic phase, if table has any white value, +** put it in 'weak' list, to be cleared. +*/ +static void traverseweakvalue (global_State *g, Table *h) { + Node *n, *limit = gnodelast(h); + /* if there is array part, assume it may have white values (it is not + worth traversing it now just to check) */ + int hasclears = (h->alimit > 0); + for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ + if (isempty(gval(n))) /* entry is empty? */ + clearkey(n); /* clear its key */ + else { + lua_assert(!keyisnil(n)); + markkey(g, n); + if (!hasclears && iscleared(g, gcvalueN(gval(n)))) /* a white value? */ + hasclears = 1; /* table will have to be cleared */ + } + } + if (g->gcstate == GCSatomic && hasclears) + linkgclist(h, g->weak); /* has to be cleared later */ + else + linkgclist(h, g->grayagain); /* must retraverse it in atomic phase */ +} + + +/* +** Traverse an ephemeron table and link it to proper list. Returns true +** iff any object was marked during this traversal (which implies that +** convergence has to continue). During propagation phase, keep table +** in 'grayagain' list, to be visited again in the atomic phase. In +** the atomic phase, if table has any white->white entry, it has to +** be revisited during ephemeron convergence (as that key may turn +** black). Otherwise, if it has any white key, table has to be cleared +** (in the atomic phase). In generational mode, it (like all visited +** tables) must be kept in some gray list for post-processing. +*/ +static int traverseephemeron (global_State *g, Table *h) { + int marked = 0; /* true if an object is marked in this traversal */ + int hasclears = 0; /* true if table has white keys */ + int hasww = 0; /* true if table has entry "white-key -> white-value" */ + Node *n, *limit = gnodelast(h); + unsigned int i; + unsigned int asize = luaH_realasize(h); + /* traverse array part */ + for (i = 0; i < asize; i++) { + if (valiswhite(&h->array[i])) { + marked = 1; + reallymarkobject(g, gcvalue(&h->array[i])); + } + } + /* traverse hash part */ + for (n = gnode(h, 0); n < limit; n++) { + if (isempty(gval(n))) /* entry is empty? */ + clearkey(n); /* clear its key */ + else if (iscleared(g, gckeyN(n))) { /* key is not marked (yet)? */ + hasclears = 1; /* table must be cleared */ + if (valiswhite(gval(n))) /* value not marked yet? */ + hasww = 1; /* white-white entry */ + } + else if (valiswhite(gval(n))) { /* value not marked yet? */ + marked = 1; + reallymarkobject(g, gcvalue(gval(n))); /* mark it now */ + } + } + /* link table into proper list */ + if (g->gcstate == GCSpropagate) + linkgclist(h, g->grayagain); /* must retraverse it in atomic phase */ + else if (hasww) /* table has white->white entries? */ + linkgclist(h, g->ephemeron); /* have to propagate again */ + else if (hasclears) /* table has white keys? */ + linkgclist(h, g->allweak); /* may have to clean white keys */ + else if (g->gckind == KGC_GEN) + linkgclist(h, g->grayagain); /* keep it in some list */ + else + gray2black(h); + return marked; +} + + +static void traversestrongtable (global_State *g, Table *h) { + Node *n, *limit = gnodelast(h); + unsigned int i; + unsigned int asize = luaH_realasize(h); + for (i = 0; i < asize; i++) /* traverse array part */ + markvalue(g, &h->array[i]); + for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ + if (isempty(gval(n))) /* entry is empty? */ + clearkey(n); /* clear its key */ + else { + lua_assert(!keyisnil(n)); + markkey(g, n); + markvalue(g, gval(n)); + } + } + if (g->gckind == KGC_GEN) { + linkgclist(h, g->grayagain); /* keep it in some gray list */ + black2gray(h); + } +} + + +static lu_mem traversetable (global_State *g, Table *h) { + const char *weakkey, *weakvalue; + const TValue *mode = gfasttm(g, h->metatable, TM_MODE); + markobjectN(g, h->metatable); + if (mode && ttisstring(mode) && /* is there a weak mode? */ + ((weakkey = strchr(svalue(mode), 'k')), + (weakvalue = strchr(svalue(mode), 'v')), + (weakkey || weakvalue))) { /* is really weak? */ + black2gray(h); /* keep table gray */ + if (!weakkey) /* strong keys? */ + traverseweakvalue(g, h); + else if (!weakvalue) /* strong values? */ + traverseephemeron(g, h); + else /* all weak */ + linkgclist(h, g->allweak); /* nothing to traverse now */ + } + else /* not weak */ + traversestrongtable(g, h); + return 1 + h->alimit + 2 * allocsizenode(h); +} + + +static int traverseudata (global_State *g, Udata *u) { + int i; + markobjectN(g, u->metatable); /* mark its metatable */ + for (i = 0; i < u->nuvalue; i++) + markvalue(g, &u->uv[i].uv); + if (g->gckind == KGC_GEN) { + linkgclist(u, g->grayagain); /* keep it in some gray list */ + black2gray(u); + } + return 1 + u->nuvalue; +} + + +/* +** Traverse a prototype. (While a prototype is being build, its +** arrays can be larger than needed; the extra slots are filled with +** NULL, so the use of 'markobjectN') +*/ +static int traverseproto (global_State *g, Proto *f) { + int i; + markobjectN(g, f->source); + for (i = 0; i < f->sizek; i++) /* mark literals */ + markvalue(g, &f->k[i]); + for (i = 0; i < f->sizeupvalues; i++) /* mark upvalue names */ + markobjectN(g, f->upvalues[i].name); + for (i = 0; i < f->sizep; i++) /* mark nested protos */ + markobjectN(g, f->p[i]); + for (i = 0; i < f->sizelocvars; i++) /* mark local-variable names */ + markobjectN(g, f->locvars[i].varname); + return 1 + f->sizek + f->sizeupvalues + f->sizep + f->sizelocvars; +} + + +static int traverseCclosure (global_State *g, CClosure *cl) { + int i; + for (i = 0; i < cl->nupvalues; i++) /* mark its upvalues */ + markvalue(g, &cl->upvalue[i]); + return 1 + cl->nupvalues; +} + +/* +** Traverse a Lua closure, marking its prototype and its upvalues. +** (Both can be NULL while closure is being created.) +*/ +static int traverseLclosure (global_State *g, LClosure *cl) { + int i; + markobjectN(g, cl->p); /* mark its prototype */ + for (i = 0; i < cl->nupvalues; i++) { /* visit its upvalues */ + UpVal *uv = cl->upvals[i]; + markobjectN(g, uv); /* mark upvalue */ + } + return 1 + cl->nupvalues; +} + + +/* +** Traverse a thread, marking the elements in the stack up to its top +** and cleaning the rest of the stack in the final traversal. +** That ensures that the entire stack have valid (non-dead) objects. +*/ +static int traversethread (global_State *g, lua_State *th) { + UpVal *uv; + StkId o = th->stack; + if (o == NULL) + return 1; /* stack not completely built yet */ + lua_assert(g->gcstate == GCSatomic || + th->openupval == NULL || isintwups(th)); + for (; o < th->top; o++) /* mark live elements in the stack */ + markvalue(g, s2v(o)); + for (uv = th->openupval; uv != NULL; uv = uv->u.open.next) { + if (uv->tt == LUA_TUPVALTBC) /* to be closed? */ + markobject(g, uv); /* cannot be collected */ + } + if (g->gcstate == GCSatomic) { /* final traversal? */ + StkId lim = th->stack + th->stacksize; /* real end of stack */ + for (; o < lim; o++) /* clear not-marked stack slice */ + setnilvalue(s2v(o)); + /* 'remarkupvals' may have removed thread from 'twups' list */ + if (!isintwups(th) && th->openupval != NULL) { + th->twups = g->twups; /* link it back to the list */ + g->twups = th; + } + } + else if (!g->gcemergency) + luaD_shrinkstack(th); /* do not change stack in emergency cycle */ + return 1 + th->stacksize; +} + + +/* +** traverse one gray object, turning it to black (except for threads, +** which are always gray). +*/ +static lu_mem propagatemark (global_State *g) { + GCObject *o = g->gray; + gray2black(o); + g->gray = *getgclist(o); /* remove from 'gray' list */ + switch (o->tt) { + case LUA_TTABLE: return traversetable(g, gco2t(o)); + case LUA_TUSERDATA: return traverseudata(g, gco2u(o)); + case LUA_TLCL: return traverseLclosure(g, gco2lcl(o)); + case LUA_TCCL: return traverseCclosure(g, gco2ccl(o)); + case LUA_TPROTO: return traverseproto(g, gco2p(o)); + case LUA_TTHREAD: { + lua_State *th = gco2th(o); + linkgclist(th, g->grayagain); /* insert into 'grayagain' list */ + black2gray(o); + return traversethread(g, th); + } + default: lua_assert(0); return 0; + } +} + + +static lu_mem propagateall (global_State *g) { + lu_mem tot = 0; + while (g->gray) + tot += propagatemark(g); + return tot; +} + + +static void convergeephemerons (global_State *g) { + int changed; + do { + GCObject *w; + GCObject *next = g->ephemeron; /* get ephemeron list */ + g->ephemeron = NULL; /* tables may return to this list when traversed */ + changed = 0; + while ((w = next) != NULL) { + next = gco2t(w)->gclist; + if (traverseephemeron(g, gco2t(w))) { /* traverse marked some value? */ + propagateall(g); /* propagate changes */ + changed = 1; /* will have to revisit all ephemeron tables */ + } + } + } while (changed); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Sweep Functions +** ======================================================= +*/ + + +/* +** clear entries with unmarked keys from all weaktables in list 'l' +*/ +static void clearbykeys (global_State *g, GCObject *l) { + for (; l; l = gco2t(l)->gclist) { + Table *h = gco2t(l); + Node *limit = gnodelast(h); + Node *n; + for (n = gnode(h, 0); n < limit; n++) { + if (iscleared(g, gckeyN(n))) /* unmarked key? */ + setempty(gval(n)); /* remove entry */ + if (isempty(gval(n))) /* is entry empty? */ + clearkey(n); /* clear its key */ + } + } +} + + +/* +** clear entries with unmarked values from all weaktables in list 'l' up +** to element 'f' +*/ +static void clearbyvalues (global_State *g, GCObject *l, GCObject *f) { + for (; l != f; l = gco2t(l)->gclist) { + Table *h = gco2t(l); + Node *n, *limit = gnodelast(h); + unsigned int i; + unsigned int asize = luaH_realasize(h); + for (i = 0; i < asize; i++) { + TValue *o = &h->array[i]; + if (iscleared(g, gcvalueN(o))) /* value was collected? */ + setempty(o); /* remove entry */ + } + for (n = gnode(h, 0); n < limit; n++) { + if (iscleared(g, gcvalueN(gval(n)))) /* unmarked value? */ + setempty(gval(n)); /* remove entry */ + if (isempty(gval(n))) /* is entry empty? */ + clearkey(n); /* clear its key */ + } + } +} + + +static void freeupval (lua_State *L, UpVal *uv) { + if (upisopen(uv)) + luaF_unlinkupval(uv); + luaM_free(L, uv); +} + + +static void freeobj (lua_State *L, GCObject *o) { + switch (o->tt) { + case LUA_TPROTO: + luaF_freeproto(L, gco2p(o)); + break; + case LUA_TUPVAL: + case LUA_TUPVALTBC: + freeupval(L, gco2upv(o)); + break; + case LUA_TLCL: + luaM_freemem(L, o, sizeLclosure(gco2lcl(o)->nupvalues)); + break; + case LUA_TCCL: + luaM_freemem(L, o, sizeCclosure(gco2ccl(o)->nupvalues)); + break; + case LUA_TTABLE: + luaH_free(L, gco2t(o)); + break; + case LUA_TTHREAD: + luaE_freethread(L, gco2th(o)); + break; + case LUA_TUSERDATA: { + Udata *u = gco2u(o); + luaM_freemem(L, o, sizeudata(u->nuvalue, u->len)); + break; + } + case LUA_TSHRSTR: + luaS_remove(L, gco2ts(o)); /* remove it from hash table */ + luaM_freemem(L, o, sizelstring(gco2ts(o)->shrlen)); + break; + case LUA_TLNGSTR: + luaM_freemem(L, o, sizelstring(gco2ts(o)->u.lnglen)); + break; + default: lua_assert(0); + } +} + + +/* +** sweep at most 'countin' elements from a list of GCObjects erasing dead +** objects, where a dead object is one marked with the old (non current) +** white; change all non-dead objects back to white, preparing for next +** collection cycle. Return where to continue the traversal or NULL if +** list is finished. ('*countout' gets the number of elements traversed.) +*/ +static GCObject **sweeplist (lua_State *L, GCObject **p, int countin, + int *countout) { + global_State *g = G(L); + int ow = otherwhite(g); + int i; + int white = luaC_white(g); /* current white */ + for (i = 0; *p != NULL && i < countin; i++) { + GCObject *curr = *p; + int marked = curr->marked; + if (isdeadm(ow, marked)) { /* is 'curr' dead? */ + *p = curr->next; /* remove 'curr' from list */ + freeobj(L, curr); /* erase 'curr' */ + } + else { /* change mark to 'white' */ + curr->marked = cast_byte((marked & maskcolors) | white); + p = &curr->next; /* go to next element */ + } + } + if (countout) + *countout = i; /* number of elements traversed */ + return (*p == NULL) ? NULL : p; +} + + +/* +** sweep a list until a live object (or end of list) +*/ +static GCObject **sweeptolive (lua_State *L, GCObject **p) { + GCObject **old = p; + do { + p = sweeplist(L, p, 1, NULL); + } while (p == old); + return p; +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Finalization +** ======================================================= +*/ + +/* +** If possible, shrink string table. +*/ +static void checkSizes (lua_State *L, global_State *g) { + if (!g->gcemergency) { + l_mem olddebt = g->GCdebt; + if (g->strt.nuse < g->strt.size / 4) /* string table too big? */ + luaS_resize(L, g->strt.size / 2); + g->GCestimate += g->GCdebt - olddebt; /* correct estimate */ + } +} + + +/* +** Get the next udata to be finalized from the 'tobefnz' list, and +** link it back into the 'allgc' list. +*/ +static GCObject *udata2finalize (global_State *g) { + GCObject *o = g->tobefnz; /* get first element */ + lua_assert(tofinalize(o)); + g->tobefnz = o->next; /* remove it from 'tobefnz' list */ + o->next = g->allgc; /* return it to 'allgc' list */ + g->allgc = o; + resetbit(o->marked, FINALIZEDBIT); /* object is "normal" again */ + if (issweepphase(g)) + makewhite(g, o); /* "sweep" object */ + return o; +} + + +static void dothecall (lua_State *L, void *ud) { + UNUSED(ud); + luaD_callnoyield(L, L->top - 2, 0); +} + + +static void GCTM (lua_State *L) { + global_State *g = G(L); + const TValue *tm; + TValue v; + lua_assert(!g->gcemergency); + setgcovalue(L, &v, udata2finalize(g)); + tm = luaT_gettmbyobj(L, &v, TM_GC); + if (!notm(tm)) { /* is there a finalizer? */ + int status; + lu_byte oldah = L->allowhook; + int running = g->gcrunning; + L->allowhook = 0; /* stop debug hooks during GC metamethod */ + g->gcrunning = 0; /* avoid GC steps */ + setobj2s(L, L->top, tm); /* push finalizer... */ + setobj2s(L, L->top + 1, &v); /* ... and its argument */ + L->top += 2; /* and (next line) call the finalizer */ + L->ci->callstatus |= CIST_FIN; /* will run a finalizer */ + status = luaD_pcall(L, dothecall, NULL, savestack(L, L->top - 2), 0); + L->ci->callstatus &= ~CIST_FIN; /* not running a finalizer anymore */ + L->allowhook = oldah; /* restore hooks */ + g->gcrunning = running; /* restore state */ + if (status != LUA_OK) { /* error while running __gc? */ + const char *msg = (ttisstring(s2v(L->top - 1))) + ? svalue(s2v(L->top - 1)) + : "error object is not a string"; + luaE_warning(L, "error in __gc metamethod (", 1); + luaE_warning(L, msg, 1); + luaE_warning(L, ")", 0); + } + } +} + + +/* +** Call a few finalizers +*/ +static int runafewfinalizers (lua_State *L, int n) { + global_State *g = G(L); + int i; + for (i = 0; i < n && g->tobefnz; i++) + GCTM(L); /* call one finalizer */ + return i; +} + + +/* +** call all pending finalizers +*/ +static void callallpendingfinalizers (lua_State *L) { + global_State *g = G(L); + while (g->tobefnz) + GCTM(L); +} + + +/* +** find last 'next' field in list 'p' list (to add elements in its end) +*/ +static GCObject **findlast (GCObject **p) { + while (*p != NULL) + p = &(*p)->next; + return p; +} + + +/* +** Move all unreachable objects (or 'all' objects) that need +** finalization from list 'finobj' to list 'tobefnz' (to be finalized). +** (Note that objects after 'finobjold' cannot be white, so they +** don't need to be traversed. In incremental mode, 'finobjold' is NULL, +** so the whole list is traversed.) +*/ +static void separatetobefnz (global_State *g, int all) { + GCObject *curr; + GCObject **p = &g->finobj; + GCObject **lastnext = findlast(&g->tobefnz); + while ((curr = *p) != g->finobjold) { /* traverse all finalizable objects */ + lua_assert(tofinalize(curr)); + if (!(iswhite(curr) || all)) /* not being collected? */ + p = &curr->next; /* don't bother with it */ + else { + if (curr == g->finobjsur) /* removing 'finobjsur'? */ + g->finobjsur = curr->next; /* correct it */ + *p = curr->next; /* remove 'curr' from 'finobj' list */ + curr->next = *lastnext; /* link at the end of 'tobefnz' list */ + *lastnext = curr; + lastnext = &curr->next; + } + } +} + + +/* +** if object 'o' has a finalizer, remove it from 'allgc' list (must +** search the list to find it) and link it in 'finobj' list. +*/ +void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) { + global_State *g = G(L); + if (tofinalize(o) || /* obj. is already marked... */ + gfasttm(g, mt, TM_GC) == NULL) /* or has no finalizer? */ + return; /* nothing to be done */ + else { /* move 'o' to 'finobj' list */ + GCObject **p; + if (issweepphase(g)) { + makewhite(g, o); /* "sweep" object 'o' */ + if (g->sweepgc == &o->next) /* should not remove 'sweepgc' object */ + g->sweepgc = sweeptolive(L, g->sweepgc); /* change 'sweepgc' */ + } + else { /* correct pointers into 'allgc' list, if needed */ + if (o == g->survival) + g->survival = o->next; + if (o == g->old) + g->old = o->next; + if (o == g->reallyold) + g->reallyold = o->next; + } + /* search for pointer pointing to 'o' */ + for (p = &g->allgc; *p != o; p = &(*p)->next) { /* empty */ } + *p = o->next; /* remove 'o' from 'allgc' list */ + o->next = g->finobj; /* link it in 'finobj' list */ + g->finobj = o; + l_setbit(o->marked, FINALIZEDBIT); /* mark it as such */ + } +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Generational Collector +** ======================================================= +*/ + +static void setpause (global_State *g); + + +/* mask to erase all color bits, not changing gen-related stuff */ +#define maskgencolors (~(bitmask(BLACKBIT) | WHITEBITS)) + + +/* +** Sweep a list of objects, deleting dead ones and turning +** the non dead to old (without changing their colors). +*/ +static void sweep2old (lua_State *L, GCObject **p) { + GCObject *curr; + while ((curr = *p) != NULL) { + if (iswhite(curr)) { /* is 'curr' dead? */ + lua_assert(isdead(G(L), curr)); + *p = curr->next; /* remove 'curr' from list */ + freeobj(L, curr); /* erase 'curr' */ + } + else { /* all surviving objects become old */ + setage(curr, G_OLD); + p = &curr->next; /* go to next element */ + } + } +} + + +/* +** Sweep for generational mode. Delete dead objects. (Because the +** collection is not incremental, there are no "new white" objects +** during the sweep. So, any white object must be dead.) For +** non-dead objects, advance their ages and clear the color of +** new objects. (Old objects keep their colors.) +*/ +static GCObject **sweepgen (lua_State *L, global_State *g, GCObject **p, + GCObject *limit) { + static lu_byte nextage[] = { + G_SURVIVAL, /* from G_NEW */ + G_OLD1, /* from G_SURVIVAL */ + G_OLD1, /* from G_OLD0 */ + G_OLD, /* from G_OLD1 */ + G_OLD, /* from G_OLD (do not change) */ + G_TOUCHED1, /* from G_TOUCHED1 (do not change) */ + G_TOUCHED2 /* from G_TOUCHED2 (do not change) */ + }; + int white = luaC_white(g); + GCObject *curr; + while ((curr = *p) != limit) { + if (iswhite(curr)) { /* is 'curr' dead? */ + lua_assert(!isold(curr) && isdead(g, curr)); + *p = curr->next; /* remove 'curr' from list */ + freeobj(L, curr); /* erase 'curr' */ + } + else { /* correct mark and age */ + if (getage(curr) == G_NEW) + curr->marked = cast_byte((curr->marked & maskgencolors) | white); + setage(curr, nextage[getage(curr)]); + p = &curr->next; /* go to next element */ + } + } + return p; +} + + +/* +** Traverse a list making all its elements white and clearing their +** age. +*/ +static void whitelist (global_State *g, GCObject *p) { + int white = luaC_white(g); + for (; p != NULL; p = p->next) + p->marked = cast_byte((p->marked & maskcolors) | white); +} + + +/* +** Correct a list of gray objects. +** Because this correction is done after sweeping, young objects might +** be turned white and still be in the list. They are only removed. +** For tables and userdata, advance 'touched1' to 'touched2'; 'touched2' +** objects become regular old and are removed from the list. +** For threads, just remove white ones from the list. +*/ +static GCObject **correctgraylist (GCObject **p) { + GCObject *curr; + while ((curr = *p) != NULL) { + switch (curr->tt) { + case LUA_TTABLE: case LUA_TUSERDATA: { + GCObject **next = getgclist(curr); + if (getage(curr) == G_TOUCHED1) { /* touched in this cycle? */ + lua_assert(isgray(curr)); + gray2black(curr); /* make it black, for next barrier */ + changeage(curr, G_TOUCHED1, G_TOUCHED2); + p = next; /* go to next element */ + } + else { /* not touched in this cycle */ + if (!iswhite(curr)) { /* not white? */ + lua_assert(isold(curr)); + if (getage(curr) == G_TOUCHED2) /* advance from G_TOUCHED2... */ + changeage(curr, G_TOUCHED2, G_OLD); /* ... to G_OLD */ + gray2black(curr); /* make it black */ + } + /* else, object is white: just remove it from this list */ + *p = *next; /* remove 'curr' from gray list */ + } + break; + } + case LUA_TTHREAD: { + lua_State *th = gco2th(curr); + lua_assert(!isblack(th)); + if (iswhite(th)) /* new object? */ + *p = th->gclist; /* remove from gray list */ + else /* old threads remain gray */ + p = &th->gclist; /* go to next element */ + break; + } + default: lua_assert(0); /* nothing more could be gray here */ + } + } + return p; +} + + +/* +** Correct all gray lists, coalescing them into 'grayagain'. +*/ +static void correctgraylists (global_State *g) { + GCObject **list = correctgraylist(&g->grayagain); + *list = g->weak; g->weak = NULL; + list = correctgraylist(list); + *list = g->allweak; g->allweak = NULL; + list = correctgraylist(list); + *list = g->ephemeron; g->ephemeron = NULL; + correctgraylist(list); +} + + +/* +** Mark 'OLD1' objects when starting a new young collection. +** Gray objects are already in some gray list, and so will be visited +** in the atomic step. +*/ +static void markold (global_State *g, GCObject *from, GCObject *to) { + GCObject *p; + for (p = from; p != to; p = p->next) { + if (getage(p) == G_OLD1) { + lua_assert(!iswhite(p)); + if (isblack(p)) { + black2gray(p); /* should be '2white', but gray works too */ + reallymarkobject(g, p); + } + } + } +} + + +/* +** Finish a young-generation collection. +*/ +static void finishgencycle (lua_State *L, global_State *g) { + correctgraylists(g); + checkSizes(L, g); + g->gcstate = GCSpropagate; /* skip restart */ + if (!g->gcemergency) + callallpendingfinalizers(L); +} + + +/* +** Does a young collection. First, mark 'OLD1' objects. (Only survival +** and "recent old" lists can contain 'OLD1' objects. New lists cannot +** contain 'OLD1' objects, at most 'OLD0' objects that were already +** visited when marked old.) Then does the atomic step. Then, +** sweep all lists and advance pointers. Finally, finish the collection. +*/ +static void youngcollection (lua_State *L, global_State *g) { + GCObject **psurvival; /* to point to first non-dead survival object */ + lua_assert(g->gcstate == GCSpropagate); + markold(g, g->survival, g->reallyold); + markold(g, g->finobj, g->finobjrold); + atomic(L); + + /* sweep nursery and get a pointer to its last live element */ + psurvival = sweepgen(L, g, &g->allgc, g->survival); + /* sweep 'survival' and 'old' */ + sweepgen(L, g, psurvival, g->reallyold); + g->reallyold = g->old; + g->old = *psurvival; /* 'survival' survivals are old now */ + g->survival = g->allgc; /* all news are survivals */ + + /* repeat for 'finobj' lists */ + psurvival = sweepgen(L, g, &g->finobj, g->finobjsur); + /* sweep 'survival' and 'old' */ + sweepgen(L, g, psurvival, g->finobjrold); + g->finobjrold = g->finobjold; + g->finobjold = *psurvival; /* 'survival' survivals are old now */ + g->finobjsur = g->finobj; /* all news are survivals */ + + sweepgen(L, g, &g->tobefnz, NULL); + + finishgencycle(L, g); +} + + +static void atomic2gen (lua_State *L, global_State *g) { + /* sweep all elements making them old */ + sweep2old(L, &g->allgc); + /* everything alive now is old */ + g->reallyold = g->old = g->survival = g->allgc; + + /* repeat for 'finobj' lists */ + sweep2old(L, &g->finobj); + g->finobjrold = g->finobjold = g->finobjsur = g->finobj; + + sweep2old(L, &g->tobefnz); + + g->gckind = KGC_GEN; + g->lastatomic = 0; + g->GCestimate = gettotalbytes(g); /* base for memory control */ + finishgencycle(L, g); +} + + +/* +** Enter generational mode. Must go until the end of an atomic cycle +** to ensure that all threads and weak tables are in the gray lists. +** Then, turn all objects into old and finishes the collection. +*/ +static lu_mem entergen (lua_State *L, global_State *g) { + lu_mem numobjs; + luaC_runtilstate(L, bitmask(GCSpause)); /* prepare to start a new cycle */ + luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */ + numobjs = atomic(L); /* propagates all and then do the atomic stuff */ + atomic2gen(L, g); + return numobjs; +} + + +/* +** Enter incremental mode. Turn all objects white, make all +** intermediate lists point to NULL (to avoid invalid pointers), +** and go to the pause state. +*/ +static void enterinc (global_State *g) { + whitelist(g, g->allgc); + g->reallyold = g->old = g->survival = NULL; + whitelist(g, g->finobj); + whitelist(g, g->tobefnz); + g->finobjrold = g->finobjold = g->finobjsur = NULL; + g->gcstate = GCSpause; + g->gckind = KGC_INC; + g->lastatomic = 0; +} + + +/* +** Change collector mode to 'newmode'. +*/ +void luaC_changemode (lua_State *L, int newmode) { + global_State *g = G(L); + if (newmode != g->gckind) { + if (newmode == KGC_GEN) /* entering generational mode? */ + entergen(L, g); + else + enterinc(g); /* entering incremental mode */ + } + g->lastatomic = 0; +} + + +/* +** Does a full collection in generational mode. +*/ +static lu_mem fullgen (lua_State *L, global_State *g) { + enterinc(g); + return entergen(L, g); +} + + +/* +** Set debt for the next minor collection, which will happen when +** memory grows 'genminormul'%. +*/ +static void setminordebt (global_State *g) { + luaE_setdebt(g, -(cast(l_mem, (gettotalbytes(g) / 100)) * g->genminormul)); +} + + +/* +** Does a major collection after last collection was a "bad collection". +** +** When the program is building a big struture, it allocates lots of +** memory but generates very little garbage. In those scenarios, +** the generational mode just wastes time doing small collections, and +** major collections are frequently what we call a "bad collection", a +** collection that frees too few objects. To avoid the cost of switching +** between generational mode and the incremental mode needed for full +** (major) collections, the collector tries to stay in incremental mode +** after a bad collection, and to switch back to generational mode only +** after a "good" collection (one that traverses less than 9/8 objects +** of the previous one). +** The collector must choose whether to stay in incremental mode or to +** switch back to generational mode before sweeping. At this point, it +** does not know the real memory in use, so it cannot use memory to +** decide whether to return to generational mode. Instead, it uses the +** number of objects traversed (returned by 'atomic') as a proxy. The +** field 'g->lastatomic' keeps this count from the last collection. +** ('g->lastatomic != 0' also means that the last collection was bad.) +*/ +static void stepgenfull (lua_State *L, global_State *g) { + lu_mem newatomic; /* count of traversed objects */ + lu_mem lastatomic = g->lastatomic; /* count from last collection */ + if (g->gckind == KGC_GEN) /* still in generational mode? */ + enterinc(g); /* enter incremental mode */ + luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */ + newatomic = atomic(L); /* mark everybody */ + if (newatomic < lastatomic + (lastatomic >> 3)) { /* good collection? */ + atomic2gen(L, g); /* return to generational mode */ + setminordebt(g); + } + else { /* another bad collection; stay in incremental mode */ + g->GCestimate = gettotalbytes(g); /* first estimate */; + entersweep(L); + luaC_runtilstate(L, bitmask(GCSpause)); /* finish collection */ + setpause(g); + g->lastatomic = newatomic; + } +} + + +/* +** Does a generational "step". +** Usually, this means doing a minor collection and setting the debt to +** make another collection when memory grows 'genminormul'% larger. +** +** However, there are exceptions. If memory grows 'genmajormul'% +** larger than it was at the end of the last major collection (kept +** in 'g->GCestimate'), the function does a major collection. At the +** end, it checks whether the major collection was able to free a +** decent amount of memory (at least half the growth in memory since +** previous major collection). If so, the collector keeps its state, +** and the next collection will probably be minor again. Otherwise, +** we have what we call a "bad collection". In that case, set the field +** 'g->lastatomic' to signal that fact, so that the next collection will +** go to 'stepgenfull'. +** +** 'GCdebt <= 0' means an explicit call to GC step with "size" zero; +** in that case, do a minor collection. +*/ +static void genstep (lua_State *L, global_State *g) { + if (g->lastatomic != 0) /* last collection was a bad one? */ + stepgenfull(L, g); /* do a full step */ + else { + lu_mem majorbase = g->GCestimate; /* memory after last major collection */ + lu_mem majorinc = (majorbase / 100) * getgcparam(g->genmajormul); + if (g->GCdebt > 0 && gettotalbytes(g) > majorbase + majorinc) { + lu_mem numobjs = fullgen(L, g); /* do a major collection */ + if (gettotalbytes(g) < majorbase + (majorinc / 2)) { + /* collected at least half of memory growth since last major + collection; keep doing minor collections */ + setminordebt(g); + } + else { /* bad collection */ + g->lastatomic = numobjs; /* signal that last collection was bad */ + setpause(g); /* do a long wait for next (major) collection */ + } + } + else { /* regular case; do a minor collection */ + youngcollection(L, g); + setminordebt(g); + g->GCestimate = majorbase; /* preserve base value */ + } + } + lua_assert(isdecGCmodegen(g)); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** GC control +** ======================================================= +*/ + + +/* +** Set the "time" to wait before starting a new GC cycle; cycle will +** start when memory use hits the threshold of ('estimate' * pause / +** PAUSEADJ). (Division by 'estimate' should be OK: it cannot be zero, +** because Lua cannot even start with less than PAUSEADJ bytes). +*/ +static void setpause (global_State *g) { + l_mem threshold, debt; + int pause = getgcparam(g->gcpause); + l_mem estimate = g->GCestimate / PAUSEADJ; /* adjust 'estimate' */ + lua_assert(estimate > 0); + threshold = (pause < MAX_LMEM / estimate) /* overflow? */ + ? estimate * pause /* no overflow */ + : MAX_LMEM; /* overflow; truncate to maximum */ + debt = gettotalbytes(g) - threshold; + if (debt > 0) debt = 0; + luaE_setdebt(g, debt); +} + + +/* +** Enter first sweep phase. +** The call to 'sweeptolive' makes the pointer point to an object +** inside the list (instead of to the header), so that the real sweep do +** not need to skip objects created between "now" and the start of the +** real sweep. +*/ +static void entersweep (lua_State *L) { + global_State *g = G(L); + g->gcstate = GCSswpallgc; + lua_assert(g->sweepgc == NULL); + g->sweepgc = sweeptolive(L, &g->allgc); +} + + +/* +** Delete all objects in list 'p' until (but not including) object +** 'limit'. +*/ +static void deletelist (lua_State *L, GCObject *p, GCObject *limit) { + while (p != limit) { + GCObject *next = p->next; + freeobj(L, p); + p = next; + } +} + + +/* +** Call all finalizers of the objects in the given Lua state, and +** then free all objects, except for the main thread. +*/ +void luaC_freeallobjects (lua_State *L) { + global_State *g = G(L); + luaC_changemode(L, KGC_INC); + separatetobefnz(g, 1); /* separate all objects with finalizers */ + lua_assert(g->finobj == NULL); + callallpendingfinalizers(L); + deletelist(L, g->allgc, obj2gco(g->mainthread)); + deletelist(L, g->finobj, NULL); + deletelist(L, g->fixedgc, NULL); /* collect fixed objects */ + lua_assert(g->strt.nuse == 0); +} + + +static lu_mem atomic (lua_State *L) { + global_State *g = G(L); + lu_mem work = 0; + GCObject *origweak, *origall; + GCObject *grayagain = g->grayagain; /* save original list */ + g->grayagain = NULL; + lua_assert(g->ephemeron == NULL && g->weak == NULL); + lua_assert(!iswhite(g->mainthread)); + g->gcstate = GCSatomic; + markobject(g, L); /* mark running thread */ + /* registry and global metatables may be changed by API */ + markvalue(g, &g->l_registry); + markmt(g); /* mark global metatables */ + /* remark occasional upvalues of (maybe) dead threads */ + work += remarkupvals(g); + work += propagateall(g); /* propagate changes */ + g->gray = grayagain; + work += propagateall(g); /* traverse 'grayagain' list */ + convergeephemerons(g); + /* at this point, all strongly accessible objects are marked. */ + /* Clear values from weak tables, before checking finalizers */ + clearbyvalues(g, g->weak, NULL); + clearbyvalues(g, g->allweak, NULL); + origweak = g->weak; origall = g->allweak; + separatetobefnz(g, 0); /* separate objects to be finalized */ + work += markbeingfnz(g); /* mark objects that will be finalized */ + work += propagateall(g); /* remark, to propagate 'resurrection' */ + convergeephemerons(g); + /* at this point, all resurrected objects are marked. */ + /* remove dead objects from weak tables */ + clearbykeys(g, g->ephemeron); /* clear keys from all ephemeron tables */ + clearbykeys(g, g->allweak); /* clear keys from all 'allweak' tables */ + /* clear values from resurrected weak tables */ + clearbyvalues(g, g->weak, origweak); + clearbyvalues(g, g->allweak, origall); + luaS_clearcache(g); + g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */ + lua_assert(g->gray == NULL); + return work; /* estimate of slots marked by 'atomic' */ +} + + +static int sweepstep (lua_State *L, global_State *g, + int nextstate, GCObject **nextlist) { + if (g->sweepgc) { + l_mem olddebt = g->GCdebt; + int count; + g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX, &count); + g->GCestimate += g->GCdebt - olddebt; /* update estimate */ + return count; + } + else { /* enter next state */ + g->gcstate = nextstate; + g->sweepgc = nextlist; + return 0; /* no work done */ + } +} + + +static lu_mem singlestep (lua_State *L) { + global_State *g = G(L); + switch (g->gcstate) { + case GCSpause: { + restartcollection(g); + g->gcstate = GCSpropagate; + return 1; + } + case GCSpropagate: { + if (g->gray == NULL) { /* no more gray objects? */ + g->gcstate = GCSenteratomic; /* finish propagate phase */ + return 0; + } + else + return propagatemark(g); /* traverse one gray object */ + } + case GCSenteratomic: { + lu_mem work = propagateall(g); /* make sure gray list is empty */ + work += atomic(L); /* work is what was traversed by 'atomic' */ + entersweep(L); + g->GCestimate = gettotalbytes(g); /* first estimate */; + return work; + } + case GCSswpallgc: { /* sweep "regular" objects */ + return sweepstep(L, g, GCSswpfinobj, &g->finobj); + } + case GCSswpfinobj: { /* sweep objects with finalizers */ + return sweepstep(L, g, GCSswptobefnz, &g->tobefnz); + } + case GCSswptobefnz: { /* sweep objects to be finalized */ + return sweepstep(L, g, GCSswpend, NULL); + } + case GCSswpend: { /* finish sweeps */ + checkSizes(L, g); + g->gcstate = GCScallfin; + return 0; + } + case GCScallfin: { /* call remaining finalizers */ + if (g->tobefnz && !g->gcemergency) { + int n = runafewfinalizers(L, GCFINMAX); + return n * GCFINALIZECOST; + } + else { /* emergency mode or no more finalizers */ + g->gcstate = GCSpause; /* finish collection */ + return 0; + } + } + default: lua_assert(0); return 0; + } +} + + +/* +** advances the garbage collector until it reaches a state allowed +** by 'statemask' +*/ +void luaC_runtilstate (lua_State *L, int statesmask) { + global_State *g = G(L); + while (!testbit(statesmask, g->gcstate)) + singlestep(L); +} + + +/* +** Performs a basic incremental step. The debt and step size are +** converted from bytes to "units of work"; then the function loops +** running single steps until adding that many units of work or +** finishing a cycle (pause state). Finally, it sets the debt that +** controls when next step will be performed. +*/ +static void incstep (lua_State *L, global_State *g) { + int stepmul = (getgcparam(g->gcstepmul) | 1); /* avoid division by 0 */ + l_mem debt = (g->GCdebt / WORK2MEM) * stepmul; + l_mem stepsize = (g->gcstepsize <= log2maxs(l_mem)) + ? ((cast(l_mem, 1) << g->gcstepsize) / WORK2MEM) * stepmul + : MAX_LMEM; /* overflow; keep maximum value */ + do { /* repeat until pause or enough "credit" (negative debt) */ + lu_mem work = singlestep(L); /* perform one single step */ + debt -= work; + } while (debt > -stepsize && g->gcstate != GCSpause); + if (g->gcstate == GCSpause) + setpause(g); /* pause until next cycle */ + else { + debt = (debt / stepmul) * WORK2MEM; /* convert 'work units' to bytes */ + luaE_setdebt(g, debt); + } +} + +/* +** performs a basic GC step if collector is running +*/ +void luaC_step (lua_State *L) { + global_State *g = G(L); + if (g->gcrunning) { /* running? */ + if(isdecGCmodegen(g)) + genstep(L, g); + else + incstep(L, g); + } +} + + +/* +** Perform a full collection in incremental mode. +** Before running the collection, check 'keepinvariant'; if it is true, +** there may be some objects marked as black, so the collector has +** to sweep all objects to turn them back to white (as white has not +** changed, nothing will be collected). +*/ +static void fullinc (lua_State *L, global_State *g) { + if (keepinvariant(g)) /* black objects? */ + entersweep(L); /* sweep everything to turn them back to white */ + /* finish any pending sweep phase to start a new cycle */ + luaC_runtilstate(L, bitmask(GCSpause)); + luaC_runtilstate(L, bitmask(GCScallfin)); /* run up to finalizers */ + /* estimate must be correct after a full GC cycle */ + lua_assert(g->GCestimate == gettotalbytes(g)); + luaC_runtilstate(L, bitmask(GCSpause)); /* finish collection */ + setpause(g); +} + + +/* +** Performs a full GC cycle; if 'isemergency', set a flag to avoid +** some operations which could change the interpreter state in some +** unexpected ways (running finalizers and shrinking some structures). +*/ +void luaC_fullgc (lua_State *L, int isemergency) { + global_State *g = G(L); + lua_assert(!g->gcemergency); + g->gcemergency = isemergency; /* set flag */ + if (g->gckind == KGC_INC) + fullinc(L, g); + else + fullgen(L, g); + g->gcemergency = 0; +} + +/* }====================================================== */ + + diff --git a/source/lua/lgc.h b/source/lua/lgc.h new file mode 100644 index 0000000..9ba7ecb --- /dev/null +++ b/source/lua/lgc.h @@ -0,0 +1,186 @@ +/* +** $Id: lgc.h $ +** Garbage Collector +** See Copyright Notice in lua.h +*/ + +#ifndef lgc_h +#define lgc_h + + +#include "lobject.h" +#include "lstate.h" + +/* +** Collectable objects may have one of three colors: white, which +** means the object is not marked; gray, which means the +** object is marked, but its references may be not marked; and +** black, which means that the object and all its references are marked. +** The main invariant of the garbage collector, while marking objects, +** is that a black object can never point to a white one. Moreover, +** any gray object must be in a "gray list" (gray, grayagain, weak, +** allweak, ephemeron) so that it can be visited again before finishing +** the collection cycle. These lists have no meaning when the invariant +** is not being enforced (e.g., sweep phase). +*/ + + +/* +** Possible states of the Garbage Collector +*/ +#define GCSpropagate 0 +#define GCSenteratomic 1 +#define GCSatomic 2 +#define GCSswpallgc 3 +#define GCSswpfinobj 4 +#define GCSswptobefnz 5 +#define GCSswpend 6 +#define GCScallfin 7 +#define GCSpause 8 + + +#define issweepphase(g) \ + (GCSswpallgc <= (g)->gcstate && (g)->gcstate <= GCSswpend) + + +/* +** macro to tell when main invariant (white objects cannot point to black +** ones) must be kept. During a collection, the sweep +** phase may break the invariant, as objects turned white may point to +** still-black objects. The invariant is restored when sweep ends and +** all objects are white again. +*/ + +#define keepinvariant(g) ((g)->gcstate <= GCSatomic) + + +/* +** some useful bit tricks +*/ +#define resetbits(x,m) ((x) &= cast_byte(~(m))) +#define setbits(x,m) ((x) |= (m)) +#define testbits(x,m) ((x) & (m)) +#define bitmask(b) (1<<(b)) +#define bit2mask(b1,b2) (bitmask(b1) | bitmask(b2)) +#define l_setbit(x,b) setbits(x, bitmask(b)) +#define resetbit(x,b) resetbits(x, bitmask(b)) +#define testbit(x,b) testbits(x, bitmask(b)) + + +/* +** Layout for bit use in 'marked' field. First three bits are +** used for object "age" in generational mode. Last bit is free +** to be used by respective objects. +*/ +#define WHITE0BIT 3 /* object is white (type 0) */ +#define WHITE1BIT 4 /* object is white (type 1) */ +#define BLACKBIT 5 /* object is black */ +#define FINALIZEDBIT 6 /* object has been marked for finalization */ + + + +#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) + + +#define iswhite(x) testbits((x)->marked, WHITEBITS) +#define isblack(x) testbit((x)->marked, BLACKBIT) +#define isgray(x) /* neither white nor black */ \ + (!testbits((x)->marked, WHITEBITS | bitmask(BLACKBIT))) + +#define tofinalize(x) testbit((x)->marked, FINALIZEDBIT) + +#define otherwhite(g) ((g)->currentwhite ^ WHITEBITS) +#define isdeadm(ow,m) ((m) & (ow)) +#define isdead(g,v) isdeadm(otherwhite(g), (v)->marked) + +#define changewhite(x) ((x)->marked ^= WHITEBITS) +#define gray2black(x) l_setbit((x)->marked, BLACKBIT) + +#define luaC_white(g) cast_byte((g)->currentwhite & WHITEBITS) + + +/* object age in generational mode */ +#define G_NEW 0 /* created in current cycle */ +#define G_SURVIVAL 1 /* created in previous cycle */ +#define G_OLD0 2 /* marked old by frw. barrier in this cycle */ +#define G_OLD1 3 /* first full cycle as old */ +#define G_OLD 4 /* really old object (not to be visited) */ +#define G_TOUCHED1 5 /* old object touched this cycle */ +#define G_TOUCHED2 6 /* old object touched in previous cycle */ + +#define AGEBITS 7 /* all age bits (111) */ + +#define getage(o) ((o)->marked & AGEBITS) +#define setage(o,a) ((o)->marked = cast_byte(((o)->marked & (~AGEBITS)) | a)) +#define isold(o) (getage(o) > G_SURVIVAL) + +#define changeage(o,f,t) \ + check_exp(getage(o) == (f), (o)->marked ^= ((f)^(t))) + + +/* Default Values for GC parameters */ +#define LUAI_GENMAJORMUL 100 +#define LUAI_GENMINORMUL 20 + +/* wait memory to double before starting new cycle */ +#define LUAI_GCPAUSE 200 + +/* +** some gc parameters are stored divided by 4 to allow a maximum value +** larger than 1000 in a 'lu_byte'. +*/ +#define getgcparam(p) ((p) * 4) +#define setgcparam(p,v) ((p) = (v) / 4) + +#define LUAI_GCMUL 100 + +/* how much to allocate before next GC step (log2) */ +#define LUAI_GCSTEPSIZE 13 /* 8 KB */ + + +/* +** Check whether the declared GC mode is generational. While in +** generational mode, the collector can go temporarily to incremental +** mode to improve performance. This is signaled by 'g->lastatomic != 0'. +*/ +#define isdecGCmodegen(g) (g->gckind == KGC_GEN || g->lastatomic != 0) + +/* +** Does one step of collection when debt becomes positive. 'pre'/'pos' +** allows some adjustments to be done only when needed. macro +** 'condchangemem' is used only for heavy tests (forcing a full +** GC cycle on every opportunity) +*/ +#define luaC_condGC(L,pre,pos) \ + { if (G(L)->GCdebt > 0) { pre; luaC_step(L); pos;}; \ + condchangemem(L,pre,pos); } + +/* more often than not, 'pre'/'pos' are empty */ +#define luaC_checkGC(L) luaC_condGC(L,(void)0,(void)0) + + +#define luaC_barrier(L,p,v) ( \ + (iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) ? \ + luaC_barrier_(L,obj2gco(p),gcvalue(v)) : cast_void(0)) + +#define luaC_barrierback(L,p,v) ( \ + (iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) ? \ + luaC_barrierback_(L,p) : cast_void(0)) + +#define luaC_objbarrier(L,p,o) ( \ + (isblack(p) && iswhite(o)) ? \ + luaC_barrier_(L,obj2gco(p),obj2gco(o)) : cast_void(0)) + +LUAI_FUNC void luaC_fix (lua_State *L, GCObject *o); +LUAI_FUNC void luaC_freeallobjects (lua_State *L); +LUAI_FUNC void luaC_step (lua_State *L); +LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask); +LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency); +LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz); +LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v); +LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o); +LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt); +LUAI_FUNC void luaC_changemode (lua_State *L, int newmode); + + +#endif diff --git a/source/lua/lgc.o b/source/lua/lgc.o new file mode 100644 index 0000000000000000000000000000000000000000..28ca92fe972876a878142e76780ef4650fb565cc GIT binary patch literal 27488 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�{Fn}W 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

s(v0hxm|n+Gr3-v|eGXJy%dN-dKE1~4aj8$Q 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 X7~|e;;@&OlnJI+r{*e72rvHBc@`>jn literal 0 HcmV?d00001 diff --git a/source/lua/linit.c b/source/lua/linit.c new file mode 100644 index 0000000..69808f8 --- /dev/null +++ b/source/lua/linit.c @@ -0,0 +1,65 @@ +/* +** $Id: linit.c $ +** Initialization of libraries for lua.c and other clients +** See Copyright Notice in lua.h +*/ + + +#define linit_c +#define LUA_LIB + +/* +** If you embed Lua in your program and need to open the standard +** libraries, call luaL_openlibs in your program. If you need a +** different set of libraries, copy this file to your project and edit +** it to suit your needs. +** +** You can also *preload* libraries, so that a later 'require' can +** open the library, which is already linked to the application. +** For that, do the following code: +** +** luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); +** lua_pushcfunction(L, luaopen_modname); +** lua_setfield(L, -2, modname); +** lua_pop(L, 1); // remove PRELOAD table +*/ + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "lualib.h" +#include "lauxlib.h" + + +/* +** these libs are loaded by lua.c and are readily available to any Lua +** program +*/ +static const luaL_Reg loadedlibs[] = { + {LUA_GNAME, luaopen_base}, + {LUA_LOADLIBNAME, luaopen_package}, + {LUA_COLIBNAME, luaopen_coroutine}, + {LUA_TABLIBNAME, luaopen_table}, + {LUA_IOLIBNAME, luaopen_io}, + {LUA_OSLIBNAME, luaopen_os}, + {LUA_STRLIBNAME, luaopen_string}, + {LUA_MATHLIBNAME, luaopen_math}, + {LUA_UTF8LIBNAME, luaopen_utf8}, + {LUA_DBLIBNAME, luaopen_debug}, + {NULL, NULL} +}; + + +LUALIB_API void luaL_openlibs (lua_State *L) { + const luaL_Reg *lib; + /* "require" functions from 'loadedlibs' and set results to global table */ + for (lib = loadedlibs; lib->func; lib++) { + luaL_requiref(L, lib->name, lib->func, 1); + lua_pop(L, 1); /* remove lib */ + } +} + diff --git a/source/lua/linit.o b/source/lua/linit.o new file mode 100644 index 0000000000000000000000000000000000000000..9abc5530d5ca5f2a24f0b5b76ba73c85b31d9bae GIT binary patch literal 3104 zcmds(PmB~r6vp4|s0<3jfPdHoqpdM!N!)e@ak7|bW`nwOAb{c$5+Fm*Ztd>K%=9|l zZ59qnGHN6w25($UJbU6s(1Z(M@XCQRM-xemcXfSV_j|pyZTAIkyh+#l-mhL&b=6eW z%$FY=`f#FDBDE5|M;nn+BB!#UTd{0WjkeSLvG&D(ZUFp@;ujR{@q@}ATbFjc{66bT zZ(T=!?Tdf5$2V)gqyEOf>+9e5-Qu^v%v3t$GV*y=6lS{>YEQ z-q29!b^C^TKKTI!;ixxUrhyl(P!ulB(4y%^%joy9u(^W=-*KkqyU{R=oVVTmZhg8L z#ZlvnM$@hDcN>kpNrkho-e}gF^#eTd=VbDw^B+@btybEzZA;}cFZ^rFUzEC!;Ag9~ zZzg7|ljHL7s`GhulH=K`_2o*gI(&Ce&|m8s+rFH;Q;5p^$+I%|lxJmnG7obvPyLT? zWm2LoDZiR3jJv@t%=~FPOm&%_NwqD?gi$sd)_0dR-*_#Vy~c}aQgn5|Gd=AhzH*#8m=W;^Y=)M{SE_vHdaY-RJ7*5Br(nb z3|#Lz#Ai^jY5proNGsyO^&Np$EspindE(r_kpDuglH!7B?SES0Z!NxCG~8v2qyK#p zU$OY4XgEhSzIQySxxu*sZ)I|MuO@y))yVWcH#BP@xr<)tk=qRdaz{P_q&M6K#r1B) zN9?TWpW|AzNm9sN@CO4k6AYR8;-(n7(UBBNXKkKxe@=sWRZQ5HL-{%K*HF0U_q$&|d*yXMNkFx&v zWk9Syetom+e~KAW>ipP-|0b|z;?h!Z+y)T4P+6M9;@3QwlY3rRcK&yyeT(aD)Av^v zvB;bM1^KI?`wa8P-Kp)B?_`$UJB;XxwEqf$W!Y&V&b~X+D*{i5$8W|qa8$DC`1mK2 QH~tw+itTpd(lR^#e{ieu!vFvP literal 0 HcmV?d00001 diff --git a/source/lua/liolib.c b/source/lua/liolib.c new file mode 100644 index 0000000..7d6d51e --- /dev/null +++ b/source/lua/liolib.c @@ -0,0 +1,803 @@ +/* +** $Id: liolib.c $ +** Standard I/O (and system) library +** See Copyright Notice in lua.h +*/ + +#define liolib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + + + +/* +** Change this macro to accept other modes for 'fopen' besides +** the standard ones. +*/ +#if !defined(l_checkmode) + +/* accepted extensions to 'mode' in 'fopen' */ +#if !defined(L_MODEEXT) +#define L_MODEEXT "b" +#endif + +/* Check whether 'mode' matches '[rwa]%+?[L_MODEEXT]*' */ +static int l_checkmode (const char *mode) { + return (*mode != '\0' && strchr("rwa", *(mode++)) != NULL && + (*mode != '+' || (++mode, 1)) && /* skip if char is '+' */ + (strspn(mode, L_MODEEXT) == strlen(mode))); /* check extensions */ +} + +#endif + +/* +** {====================================================== +** l_popen spawns a new process connected to the current +** one through the file streams. +** ======================================================= +*/ + +#if !defined(l_popen) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#define l_popen(L,c,m) (fflush(NULL), popen(c,m)) +#define l_pclose(L,file) (pclose(file)) + +#elif defined(LUA_USE_WINDOWS) /* }{ */ + +#define l_popen(L,c,m) (_popen(c,m)) +#define l_pclose(L,file) (_pclose(file)) + +#else /* }{ */ + +/* ISO C definitions */ +#define l_popen(L,c,m) \ + ((void)c, (void)m, \ + luaL_error(L, "'popen' not supported"), \ + (FILE*)0) +#define l_pclose(L,file) ((void)L, (void)file, -1) + +#endif /* } */ + +#endif /* } */ + +/* }====================================================== */ + + +#if !defined(l_getc) /* { */ + +#if defined(LUA_USE_POSIX) +#define l_getc(f) getc_unlocked(f) +#define l_lockfile(f) flockfile(f) +#define l_unlockfile(f) funlockfile(f) +#else +#define l_getc(f) getc(f) +#define l_lockfile(f) ((void)0) +#define l_unlockfile(f) ((void)0) +#endif + +#endif /* } */ + + +/* +** {====================================================== +** l_fseek: configuration for longer offsets +** ======================================================= +*/ + +#if !defined(l_fseek) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#include + +#define l_fseek(f,o,w) fseeko(f,o,w) +#define l_ftell(f) ftello(f) +#define l_seeknum off_t + +#elif defined(LUA_USE_WINDOWS) && !defined(_CRTIMP_TYPEINFO) \ + && defined(_MSC_VER) && (_MSC_VER >= 1400) /* }{ */ + +/* Windows (but not DDK) and Visual C++ 2005 or higher */ +#define l_fseek(f,o,w) _fseeki64(f,o,w) +#define l_ftell(f) _ftelli64(f) +#define l_seeknum __int64 + +#else /* }{ */ + +/* ISO C definitions */ +#define l_fseek(f,o,w) fseek(f,o,w) +#define l_ftell(f) ftell(f) +#define l_seeknum long + +#endif /* } */ + +#endif /* } */ + +/* }====================================================== */ + + + +#define IO_PREFIX "_IO_" +#define IOPREF_LEN (sizeof(IO_PREFIX)/sizeof(char) - 1) +#define IO_INPUT (IO_PREFIX "input") +#define IO_OUTPUT (IO_PREFIX "output") + + +typedef luaL_Stream LStream; + + +#define tolstream(L) ((LStream *)luaL_checkudata(L, 1, LUA_FILEHANDLE)) + +#define isclosed(p) ((p)->closef == NULL) + + +static int io_type (lua_State *L) { + LStream *p; + luaL_checkany(L, 1); + p = (LStream *)luaL_testudata(L, 1, LUA_FILEHANDLE); + if (p == NULL) + lua_pushnil(L); /* not a file */ + else if (isclosed(p)) + lua_pushliteral(L, "closed file"); + else + lua_pushliteral(L, "file"); + return 1; +} + + +static int f_tostring (lua_State *L) { + LStream *p = tolstream(L); + if (isclosed(p)) + lua_pushliteral(L, "file (closed)"); + else + lua_pushfstring(L, "file (%p)", p->f); + return 1; +} + + +static FILE *tofile (lua_State *L) { + LStream *p = tolstream(L); + if (isclosed(p)) + luaL_error(L, "attempt to use a closed file"); + lua_assert(p->f); + return p->f; +} + + +/* +** When creating file handles, always creates a 'closed' file handle +** before opening the actual file; so, if there is a memory error, the +** handle is in a consistent state. +*/ +static LStream *newprefile (lua_State *L) { + LStream *p = (LStream *)lua_newuserdatauv(L, sizeof(LStream), 0); + p->closef = NULL; /* mark file handle as 'closed' */ + luaL_setmetatable(L, LUA_FILEHANDLE); + return p; +} + + +/* +** Calls the 'close' function from a file handle. The 'volatile' avoids +** a bug in some versions of the Clang compiler (e.g., clang 3.0 for +** 32 bits). +*/ +static int aux_close (lua_State *L) { + LStream *p = tolstream(L); + volatile lua_CFunction cf = p->closef; + p->closef = NULL; /* mark stream as closed */ + return (*cf)(L); /* close it */ +} + + +static int f_close (lua_State *L) { + tofile(L); /* make sure argument is an open stream */ + return aux_close(L); +} + + +static int io_close (lua_State *L) { + if (lua_isnone(L, 1)) /* no argument? */ + lua_getfield(L, LUA_REGISTRYINDEX, IO_OUTPUT); /* use standard output */ + return f_close(L); +} + + +static int f_gc (lua_State *L) { + LStream *p = tolstream(L); + if (!isclosed(p) && p->f != NULL) + aux_close(L); /* ignore closed and incompletely open files */ + return 0; +} + + +/* +** function to close regular files +*/ +static int io_fclose (lua_State *L) { + LStream *p = tolstream(L); + int res = fclose(p->f); + return luaL_fileresult(L, (res == 0), NULL); +} + + +static LStream *newfile (lua_State *L) { + LStream *p = newprefile(L); + p->f = NULL; + p->closef = &io_fclose; + return p; +} + + +static void opencheck (lua_State *L, const char *fname, const char *mode) { + LStream *p = newfile(L); + p->f = fopen(fname, mode); + if (p->f == NULL) + luaL_error(L, "cannot open file '%s' (%s)", fname, strerror(errno)); +} + + +static int io_open (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + const char *mode = luaL_optstring(L, 2, "r"); + LStream *p = newfile(L); + const char *md = mode; /* to traverse/check mode */ + luaL_argcheck(L, l_checkmode(md), 2, "invalid mode"); + p->f = fopen(filename, mode); + return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1; +} + + +/* +** function to close 'popen' files +*/ +static int io_pclose (lua_State *L) { + LStream *p = tolstream(L); + return luaL_execresult(L, l_pclose(L, p->f)); +} + + +static int io_popen (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + const char *mode = luaL_optstring(L, 2, "r"); + LStream *p = newprefile(L); + p->f = l_popen(L, filename, mode); + p->closef = &io_pclose; + return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1; +} + + +static int io_tmpfile (lua_State *L) { + LStream *p = newfile(L); + p->f = tmpfile(); + return (p->f == NULL) ? luaL_fileresult(L, 0, NULL) : 1; +} + + +static FILE *getiofile (lua_State *L, const char *findex) { + LStream *p; + lua_getfield(L, LUA_REGISTRYINDEX, findex); + p = (LStream *)lua_touserdata(L, -1); + if (isclosed(p)) + luaL_error(L, "standard %s file is closed", findex + IOPREF_LEN); + return p->f; +} + + +static int g_iofile (lua_State *L, const char *f, const char *mode) { + if (!lua_isnoneornil(L, 1)) { + const char *filename = lua_tostring(L, 1); + if (filename) + opencheck(L, filename, mode); + else { + tofile(L); /* check that it's a valid file handle */ + lua_pushvalue(L, 1); + } + lua_setfield(L, LUA_REGISTRYINDEX, f); + } + /* return current value */ + lua_getfield(L, LUA_REGISTRYINDEX, f); + return 1; +} + + +static int io_input (lua_State *L) { + return g_iofile(L, IO_INPUT, "r"); +} + + +static int io_output (lua_State *L) { + return g_iofile(L, IO_OUTPUT, "w"); +} + + +static int io_readline (lua_State *L); + + +/* +** maximum number of arguments to 'f:lines'/'io.lines' (it + 3 must fit +** in the limit for upvalues of a closure) +*/ +#define MAXARGLINE 250 + +/* +** Auxiliar function to create the iteration function for 'lines'. +** The iteration function is a closure over 'io_readline', with +** the following upvalues: +** 1) The file being read (first value in the stack) +** 2) the number of arguments to read +** 3) a boolean, true iff file has to be closed when finished ('toclose') +** *) a variable number of format arguments (rest of the stack) +*/ +static void aux_lines (lua_State *L, int toclose) { + int n = lua_gettop(L) - 1; /* number of arguments to read */ + luaL_argcheck(L, n <= MAXARGLINE, MAXARGLINE + 2, "too many arguments"); + lua_pushvalue(L, 1); /* file */ + lua_pushinteger(L, n); /* number of arguments to read */ + lua_pushboolean(L, toclose); /* close/not close file when finished */ + lua_rotate(L, 2, 3); /* move the three values to their positions */ + lua_pushcclosure(L, io_readline, 3 + n); +} + + +static int f_lines (lua_State *L) { + tofile(L); /* check that it's a valid file handle */ + aux_lines(L, 0); + return 1; +} + + +/* +** Return an iteration function for 'io.lines'. If file has to be +** closed, also returns the file itself as a second result (to be +** closed as the state at the exit of a generic for). +*/ +static int io_lines (lua_State *L) { + int toclose; + if (lua_isnone(L, 1)) lua_pushnil(L); /* at least one argument */ + if (lua_isnil(L, 1)) { /* no file name? */ + lua_getfield(L, LUA_REGISTRYINDEX, IO_INPUT); /* get default input */ + lua_replace(L, 1); /* put it at index 1 */ + tofile(L); /* check that it's a valid file handle */ + toclose = 0; /* do not close it after iteration */ + } + else { /* open a new file */ + const char *filename = luaL_checkstring(L, 1); + opencheck(L, filename, "r"); + lua_replace(L, 1); /* put file at index 1 */ + toclose = 1; /* close it after iteration */ + } + aux_lines(L, toclose); /* push iteration function */ + if (toclose) { + lua_pushnil(L); /* state */ + lua_pushnil(L); /* control */ + lua_pushvalue(L, 1); /* file is the to-be-closed variable (4th result) */ + return 4; + } + else + return 1; +} + + +/* +** {====================================================== +** READ +** ======================================================= +*/ + + +/* maximum length of a numeral */ +#if !defined (L_MAXLENNUM) +#define L_MAXLENNUM 200 +#endif + + +/* auxiliary structure used by 'read_number' */ +typedef struct { + FILE *f; /* file being read */ + int c; /* current character (look ahead) */ + int n; /* number of elements in buffer 'buff' */ + char buff[L_MAXLENNUM + 1]; /* +1 for ending '\0' */ +} RN; + + +/* +** Add current char to buffer (if not out of space) and read next one +*/ +static int nextc (RN *rn) { + if (rn->n >= L_MAXLENNUM) { /* buffer overflow? */ + rn->buff[0] = '\0'; /* invalidate result */ + return 0; /* fail */ + } + else { + rn->buff[rn->n++] = rn->c; /* save current char */ + rn->c = l_getc(rn->f); /* read next one */ + return 1; + } +} + + +/* +** Accept current char if it is in 'set' (of size 2) +*/ +static int test2 (RN *rn, const char *set) { + if (rn->c == set[0] || rn->c == set[1]) + return nextc(rn); + else return 0; +} + + +/* +** Read a sequence of (hex)digits +*/ +static int readdigits (RN *rn, int hex) { + int count = 0; + while ((hex ? isxdigit(rn->c) : isdigit(rn->c)) && nextc(rn)) + count++; + return count; +} + + +/* +** Read a number: first reads a valid prefix of a numeral into a buffer. +** Then it calls 'lua_stringtonumber' to check whether the format is +** correct and to convert it to a Lua number. +*/ +static int read_number (lua_State *L, FILE *f) { + RN rn; + int count = 0; + int hex = 0; + char decp[2]; + rn.f = f; rn.n = 0; + decp[0] = lua_getlocaledecpoint(); /* get decimal point from locale */ + decp[1] = '.'; /* always accept a dot */ + l_lockfile(rn.f); + do { rn.c = l_getc(rn.f); } while (isspace(rn.c)); /* skip spaces */ + test2(&rn, "-+"); /* optional sign */ + if (test2(&rn, "00")) { + if (test2(&rn, "xX")) hex = 1; /* numeral is hexadecimal */ + else count = 1; /* count initial '0' as a valid digit */ + } + count += readdigits(&rn, hex); /* integral part */ + if (test2(&rn, decp)) /* decimal point? */ + count += readdigits(&rn, hex); /* fractional part */ + if (count > 0 && test2(&rn, (hex ? "pP" : "eE"))) { /* exponent mark? */ + test2(&rn, "-+"); /* exponent sign */ + readdigits(&rn, 0); /* exponent digits */ + } + ungetc(rn.c, rn.f); /* unread look-ahead char */ + l_unlockfile(rn.f); + rn.buff[rn.n] = '\0'; /* finish string */ + if (lua_stringtonumber(L, rn.buff)) /* is this a valid number? */ + return 1; /* ok */ + else { /* invalid format */ + lua_pushnil(L); /* "result" to be removed */ + return 0; /* read fails */ + } +} + + +static int test_eof (lua_State *L, FILE *f) { + int c = getc(f); + ungetc(c, f); /* no-op when c == EOF */ + lua_pushliteral(L, ""); + return (c != EOF); +} + + +static int read_line (lua_State *L, FILE *f, int chop) { + luaL_Buffer b; + int c = '\0'; + luaL_buffinit(L, &b); + while (c != EOF && c != '\n') { /* repeat until end of line */ + char *buff = luaL_prepbuffer(&b); /* preallocate buffer */ + int i = 0; + l_lockfile(f); /* no memory errors can happen inside the lock */ + while (i < LUAL_BUFFERSIZE && (c = l_getc(f)) != EOF && c != '\n') + buff[i++] = c; + l_unlockfile(f); + luaL_addsize(&b, i); + } + if (!chop && c == '\n') /* want a newline and have one? */ + luaL_addchar(&b, c); /* add ending newline to result */ + luaL_pushresult(&b); /* close buffer */ + /* return ok if read something (either a newline or something else) */ + return (c == '\n' || lua_rawlen(L, -1) > 0); +} + + +static void read_all (lua_State *L, FILE *f) { + size_t nr; + luaL_Buffer b; + luaL_buffinit(L, &b); + do { /* read file in chunks of LUAL_BUFFERSIZE bytes */ + char *p = luaL_prepbuffer(&b); + nr = fread(p, sizeof(char), LUAL_BUFFERSIZE, f); + luaL_addsize(&b, nr); + } while (nr == LUAL_BUFFERSIZE); + luaL_pushresult(&b); /* close buffer */ +} + + +static int read_chars (lua_State *L, FILE *f, size_t n) { + size_t nr; /* number of chars actually read */ + char *p; + luaL_Buffer b; + luaL_buffinit(L, &b); + p = luaL_prepbuffsize(&b, n); /* prepare buffer to read whole block */ + nr = fread(p, sizeof(char), n, f); /* try to read 'n' chars */ + luaL_addsize(&b, nr); + luaL_pushresult(&b); /* close buffer */ + return (nr > 0); /* true iff read something */ +} + + +static int g_read (lua_State *L, FILE *f, int first) { + int nargs = lua_gettop(L) - 1; + int n, success; + clearerr(f); + if (nargs == 0) { /* no arguments? */ + success = read_line(L, f, 1); + n = first + 1; /* to return 1 result */ + } + else { + /* ensure stack space for all results and for auxlib's buffer */ + luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments"); + success = 1; + for (n = first; nargs-- && success; n++) { + if (lua_type(L, n) == LUA_TNUMBER) { + size_t l = (size_t)luaL_checkinteger(L, n); + success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l); + } + else { + const char *p = luaL_checkstring(L, n); + if (*p == '*') p++; /* skip optional '*' (for compatibility) */ + switch (*p) { + case 'n': /* number */ + success = read_number(L, f); + break; + case 'l': /* line */ + success = read_line(L, f, 1); + break; + case 'L': /* line with end-of-line */ + success = read_line(L, f, 0); + break; + case 'a': /* file */ + read_all(L, f); /* read entire file */ + success = 1; /* always success */ + break; + default: + return luaL_argerror(L, n, "invalid format"); + } + } + } + } + if (ferror(f)) + return luaL_fileresult(L, 0, NULL); + if (!success) { + lua_pop(L, 1); /* remove last result */ + lua_pushnil(L); /* push nil instead */ + } + return n - first; +} + + +static int io_read (lua_State *L) { + return g_read(L, getiofile(L, IO_INPUT), 1); +} + + +static int f_read (lua_State *L) { + return g_read(L, tofile(L), 2); +} + + +/* +** Iteration function for 'lines'. +*/ +static int io_readline (lua_State *L) { + LStream *p = (LStream *)lua_touserdata(L, lua_upvalueindex(1)); + int i; + int n = (int)lua_tointeger(L, lua_upvalueindex(2)); + if (isclosed(p)) /* file is already closed? */ + return luaL_error(L, "file is already closed"); + lua_settop(L , 1); + luaL_checkstack(L, n, "too many arguments"); + for (i = 1; i <= n; i++) /* push arguments to 'g_read' */ + lua_pushvalue(L, lua_upvalueindex(3 + i)); + n = g_read(L, p->f, 2); /* 'n' is number of results */ + lua_assert(n > 0); /* should return at least a nil */ + if (lua_toboolean(L, -n)) /* read at least one value? */ + return n; /* return them */ + else { /* first result is nil: EOF or error */ + if (n > 1) { /* is there error information? */ + /* 2nd result is error message */ + return luaL_error(L, "%s", lua_tostring(L, -n + 1)); + } + if (lua_toboolean(L, lua_upvalueindex(3))) { /* generator created file? */ + lua_settop(L, 0); /* clear stack */ + lua_pushvalue(L, lua_upvalueindex(1)); /* push file at index 1 */ + aux_close(L); /* close it */ + } + return 0; + } +} + +/* }====================================================== */ + + +static int g_write (lua_State *L, FILE *f, int arg) { + int nargs = lua_gettop(L) - arg; + int status = 1; + for (; nargs--; arg++) { + if (lua_type(L, arg) == LUA_TNUMBER) { + /* optimization: could be done exactly as for strings */ + int len = lua_isinteger(L, arg) + ? fprintf(f, LUA_INTEGER_FMT, + (LUAI_UACINT)lua_tointeger(L, arg)) + : fprintf(f, LUA_NUMBER_FMT, + (LUAI_UACNUMBER)lua_tonumber(L, arg)); + status = status && (len > 0); + } + else { + size_t l; + const char *s = luaL_checklstring(L, arg, &l); + status = status && (fwrite(s, sizeof(char), l, f) == l); + } + } + if (status) return 1; /* file handle already on stack top */ + else return luaL_fileresult(L, status, NULL); +} + + +static int io_write (lua_State *L) { + return g_write(L, getiofile(L, IO_OUTPUT), 1); +} + + +static int f_write (lua_State *L) { + FILE *f = tofile(L); + lua_pushvalue(L, 1); /* push file at the stack top (to be returned) */ + return g_write(L, f, 2); +} + + +static int f_seek (lua_State *L) { + static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; + static const char *const modenames[] = {"set", "cur", "end", NULL}; + FILE *f = tofile(L); + int op = luaL_checkoption(L, 2, "cur", modenames); + lua_Integer p3 = luaL_optinteger(L, 3, 0); + l_seeknum offset = (l_seeknum)p3; + luaL_argcheck(L, (lua_Integer)offset == p3, 3, + "not an integer in proper range"); + op = l_fseek(f, offset, mode[op]); + if (op) + return luaL_fileresult(L, 0, NULL); /* error */ + else { + lua_pushinteger(L, (lua_Integer)l_ftell(f)); + return 1; + } +} + + +static int f_setvbuf (lua_State *L) { + static const int mode[] = {_IONBF, _IOFBF, _IOLBF}; + static const char *const modenames[] = {"no", "full", "line", NULL}; + FILE *f = tofile(L); + int op = luaL_checkoption(L, 2, NULL, modenames); + lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE); + int res = setvbuf(f, NULL, mode[op], (size_t)sz); + return luaL_fileresult(L, res == 0, NULL); +} + + + +static int io_flush (lua_State *L) { + return luaL_fileresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL); +} + + +static int f_flush (lua_State *L) { + return luaL_fileresult(L, fflush(tofile(L)) == 0, NULL); +} + + +/* +** functions for 'io' library +*/ +static const luaL_Reg iolib[] = { + {"close", io_close}, + {"flush", io_flush}, + {"input", io_input}, + {"lines", io_lines}, + {"open", io_open}, + {"output", io_output}, + {"popen", io_popen}, + {"read", io_read}, + {"tmpfile", io_tmpfile}, + {"type", io_type}, + {"write", io_write}, + {NULL, NULL} +}; + + +/* +** methods for file handles +*/ +static const luaL_Reg flib[] = { + {"close", f_close}, + {"flush", f_flush}, + {"lines", f_lines}, + {"read", f_read}, + {"seek", f_seek}, + {"setvbuf", f_setvbuf}, + {"write", f_write}, + {"__gc", f_gc}, + {"__close", f_gc}, + {"__tostring", f_tostring}, + {NULL, NULL} +}; + + +static void createmeta (lua_State *L) { + luaL_newmetatable(L, LUA_FILEHANDLE); /* create metatable for file handles */ + lua_pushvalue(L, -1); /* push metatable */ + lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */ + luaL_setfuncs(L, flib, 0); /* add file methods to new metatable */ + lua_pop(L, 1); /* pop new metatable */ +} + + +/* +** function to (not) close the standard files stdin, stdout, and stderr +*/ +static int io_noclose (lua_State *L) { + LStream *p = tolstream(L); + p->closef = &io_noclose; /* keep file opened */ + lua_pushnil(L); + lua_pushliteral(L, "cannot close standard file"); + return 2; +} + + +static void createstdfile (lua_State *L, FILE *f, const char *k, + const char *fname) { + LStream *p = newprefile(L); + p->f = f; + p->closef = &io_noclose; + if (k != NULL) { + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, k); /* add file to registry */ + } + lua_setfield(L, -2, fname); /* add file to module */ +} + + +LUAMOD_API int luaopen_io (lua_State *L) { + luaL_newlib(L, iolib); /* new module */ + createmeta(L); + /* create (and set) default files */ + createstdfile(L, stdin, IO_INPUT, "stdin"); + createstdfile(L, stdout, IO_OUTPUT, "stdout"); + createstdfile(L, stderr, NULL, "stderr"); + return 1; +} + diff --git a/source/lua/liolib.o b/source/lua/liolib.o new file mode 100644 index 0000000000000000000000000000000000000000..1a2575c4f62983b4168e660cefb1eb3f59648162 GIT binary patch literal 21528 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 literal 0 HcmV?d00001 diff --git a/source/lua/ljumptab.h b/source/lua/ljumptab.h new file mode 100644 index 0000000..9fa72a7 --- /dev/null +++ b/source/lua/ljumptab.h @@ -0,0 +1,115 @@ +/* +** $Id: ljumptab.h $ +** Jump Table for the Lua interpreter +** See Copyright Notice in lua.h +*/ + + +#undef vmdispatch +#undef vmcase +#undef vmbreak + +#define vmdispatch(x) goto *disptab[x]; + +#define vmcase(l) L_##l: + +#define vmbreak vmfetch(); vmdispatch(GET_OPCODE(i)); + + +static void *disptab[NUM_OPCODES] = { + +#if 0 +** you can update the following list with this command: +** +** sed -n '/^OP_/\!d; s/OP_/\&\&L_OP_/ ; s/,.*/,/ ; s/\/.*// ; p' lopcodes.h +** +#endif + +&&L_OP_MOVE, +&&L_OP_LOADI, +&&L_OP_LOADF, +&&L_OP_LOADK, +&&L_OP_LOADKX, +&&L_OP_LOADBOOL, +&&L_OP_LOADNIL, +&&L_OP_GETUPVAL, +&&L_OP_SETUPVAL, +&&L_OP_GETTABUP, +&&L_OP_GETTABLE, +&&L_OP_GETI, +&&L_OP_GETFIELD, +&&L_OP_SETTABUP, +&&L_OP_SETTABLE, +&&L_OP_SETI, +&&L_OP_SETFIELD, +&&L_OP_NEWTABLE, +&&L_OP_SELF, +&&L_OP_ADDI, +&&L_OP_SUBI, +&&L_OP_MULI, +&&L_OP_MODI, +&&L_OP_POWI, +&&L_OP_DIVI, +&&L_OP_IDIVI, +&&L_OP_ADDK, +&&L_OP_SUBK, +&&L_OP_MULK, +&&L_OP_MODK, +&&L_OP_POWK, +&&L_OP_DIVK, +&&L_OP_IDIVK, +&&L_OP_BANDK, +&&L_OP_BORK, +&&L_OP_BXORK, +&&L_OP_SHRI, +&&L_OP_SHLI, +&&L_OP_ADD, +&&L_OP_SUB, +&&L_OP_MUL, +&&L_OP_MOD, +&&L_OP_POW, +&&L_OP_DIV, +&&L_OP_IDIV, +&&L_OP_BAND, +&&L_OP_BOR, +&&L_OP_BXOR, +&&L_OP_SHL, +&&L_OP_SHR, +&&L_OP_UNM, +&&L_OP_BNOT, +&&L_OP_NOT, +&&L_OP_LEN, +&&L_OP_CONCAT, +&&L_OP_CLOSE, +&&L_OP_TBC, +&&L_OP_JMP, +&&L_OP_EQ, +&&L_OP_LT, +&&L_OP_LE, +&&L_OP_EQK, +&&L_OP_EQI, +&&L_OP_LTI, +&&L_OP_LEI, +&&L_OP_GTI, +&&L_OP_GEI, +&&L_OP_TEST, +&&L_OP_TESTSET, +&&L_OP_CALL, +&&L_OP_TAILCALL, +&&L_OP_RETURN, +&&L_OP_RETURN0, +&&L_OP_RETURN1, +&&L_OP_FORLOOP1, +&&L_OP_FORPREP1, +&&L_OP_FORLOOP, +&&L_OP_FORPREP, +&&L_OP_TFORPREP, +&&L_OP_TFORCALL, +&&L_OP_TFORLOOP, +&&L_OP_SETLIST, +&&L_OP_CLOSURE, +&&L_OP_VARARG, +&&L_OP_PREPVARARG, +&&L_OP_EXTRAARG + +}; diff --git a/source/lua/llex.c b/source/lua/llex.c new file mode 100644 index 0000000..1539f52 --- /dev/null +++ b/source/lua/llex.c @@ -0,0 +1,567 @@ +/* +** $Id: llex.c $ +** Lexical Analyzer +** See Copyright Notice in lua.h +*/ + +#define llex_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include + +#include "lua.h" + +#include "lctype.h" +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "llex.h" +#include "lobject.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "lzio.h" + + + +#define next(ls) (ls->current = zgetc(ls->z)) + + + +#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') + + +/* ORDER RESERVED */ +static const char *const luaX_tokens [] = { + "and", "break", "do", "else", "elseif", + "end", "false", "for", "function", "goto", "if", + "in", "local", "nil", "not", "or", "repeat", + "return", "then", "true", "until", "while", + "//", "..", "...", "==", ">=", "<=", "~=", + "<<", ">>", "::", "", + "", "", "", "" +}; + + +#define save_and_next(ls) (save(ls, ls->current), next(ls)) + + +static l_noret lexerror (LexState *ls, const char *msg, int token); + + +static void save (LexState *ls, int c) { + Mbuffer *b = ls->buff; + if (luaZ_bufflen(b) + 1 > luaZ_sizebuffer(b)) { + size_t newsize; + if (luaZ_sizebuffer(b) >= MAX_SIZE/2) + lexerror(ls, "lexical element too long", 0); + newsize = luaZ_sizebuffer(b) * 2; + luaZ_resizebuffer(ls->L, b, newsize); + } + b->buffer[luaZ_bufflen(b)++] = cast_char(c); +} + + +void luaX_init (lua_State *L) { + int i; + TString *e = luaS_newliteral(L, LUA_ENV); /* create env name */ + luaC_fix(L, obj2gco(e)); /* never collect this name */ + for (i=0; iextra = cast_byte(i+1); /* reserved word */ + } +} + + +const char *luaX_token2str (LexState *ls, int token) { + if (token < FIRST_RESERVED) { /* single-byte symbols? */ + lua_assert(token == cast_uchar(token)); + return luaO_pushfstring(ls->L, "'%c'", token); + } + else { + const char *s = luaX_tokens[token - FIRST_RESERVED]; + if (token < TK_EOS) /* fixed format (symbols and reserved words)? */ + return luaO_pushfstring(ls->L, "'%s'", s); + else /* names, strings, and numerals */ + return s; + } +} + + +static const char *txtToken (LexState *ls, int token) { + switch (token) { + case TK_NAME: case TK_STRING: + case TK_FLT: case TK_INT: + save(ls, '\0'); + return luaO_pushfstring(ls->L, "'%s'", luaZ_buffer(ls->buff)); + default: + return luaX_token2str(ls, token); + } +} + + +static l_noret lexerror (LexState *ls, const char *msg, int token) { + msg = luaG_addinfo(ls->L, msg, ls->source, ls->linenumber); + if (token) + luaO_pushfstring(ls->L, "%s near %s", msg, txtToken(ls, token)); + luaD_throw(ls->L, LUA_ERRSYNTAX); +} + + +l_noret luaX_syntaxerror (LexState *ls, const char *msg) { + lexerror(ls, msg, ls->t.token); +} + + +/* +** creates a new string and anchors it in scanner's table so that +** it will not be collected until the end of the compilation +** (by that time it should be anchored somewhere) +*/ +TString *luaX_newstring (LexState *ls, const char *str, size_t l) { + lua_State *L = ls->L; + TValue *o; /* entry for 'str' */ + TString *ts = luaS_newlstr(L, str, l); /* create new string */ + setsvalue2s(L, L->top++, ts); /* temporarily anchor it in stack */ + o = luaH_set(L, ls->h, s2v(L->top - 1)); + if (isempty(o)) { /* not in use yet? */ + /* boolean value does not need GC barrier; + table is not a metatable, so it does not need to invalidate cache */ + setbvalue(o, 1); /* t[string] = true */ + luaC_checkGC(L); + } + else { /* string already present */ + ts = keystrval(nodefromval(o)); /* re-use value previously stored */ + } + L->top--; /* remove string from stack */ + return ts; +} + + +/* +** increment line number and skips newline sequence (any of +** \n, \r, \n\r, or \r\n) +*/ +static void inclinenumber (LexState *ls) { + int old = ls->current; + lua_assert(currIsNewline(ls)); + next(ls); /* skip '\n' or '\r' */ + if (currIsNewline(ls) && ls->current != old) + next(ls); /* skip '\n\r' or '\r\n' */ + if (++ls->linenumber >= MAX_INT) + lexerror(ls, "chunk has too many lines", 0); +} + + +void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source, + int firstchar) { + ls->t.token = 0; + ls->L = L; + ls->current = firstchar; + ls->lookahead.token = TK_EOS; /* no look-ahead token */ + ls->z = z; + ls->fs = NULL; + ls->linenumber = 1; + ls->lastline = 1; + ls->source = source; + ls->envn = luaS_newliteral(L, LUA_ENV); /* get env name */ + luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ +} + + + +/* +** ======================================================= +** LEXICAL ANALYZER +** ======================================================= +*/ + + +static int check_next1 (LexState *ls, int c) { + if (ls->current == c) { + next(ls); + return 1; + } + else return 0; +} + + +/* +** Check whether current char is in set 'set' (with two chars) and +** saves it +*/ +static int check_next2 (LexState *ls, const char *set) { + lua_assert(set[2] == '\0'); + if (ls->current == set[0] || ls->current == set[1]) { + save_and_next(ls); + return 1; + } + else return 0; +} + + +/* LUA_NUMBER */ +/* +** this function is quite liberal in what it accepts, as 'luaO_str2num' +** will reject ill-formed numerals. +*/ +static int read_numeral (LexState *ls, SemInfo *seminfo) { + TValue obj; + const char *expo = "Ee"; + int first = ls->current; + lua_assert(lisdigit(ls->current)); + save_and_next(ls); + if (first == '0' && check_next2(ls, "xX")) /* hexadecimal? */ + expo = "Pp"; + for (;;) { + if (check_next2(ls, expo)) /* exponent part? */ + check_next2(ls, "-+"); /* optional exponent sign */ + if (lisxdigit(ls->current)) + save_and_next(ls); + else if (ls->current == '.') + save_and_next(ls); + else break; + } + save(ls, '\0'); + if (luaO_str2num(luaZ_buffer(ls->buff), &obj) == 0) /* format error? */ + lexerror(ls, "malformed number", TK_FLT); + if (ttisinteger(&obj)) { + seminfo->i = ivalue(&obj); + return TK_INT; + } + else { + lua_assert(ttisfloat(&obj)); + seminfo->r = fltvalue(&obj); + return TK_FLT; + } +} + + +/* +** reads a sequence '[=*[' or ']=*]', leaving the last bracket. +** If sequence is well formed, return its number of '='s + 2; otherwise, +** return 1 if there is no '='s or 0 otherwise (an unfinished '[==...'). +*/ +static size_t skip_sep (LexState *ls) { + size_t count = 0; + int s = ls->current; + lua_assert(s == '[' || s == ']'); + save_and_next(ls); + while (ls->current == '=') { + save_and_next(ls); + count++; + } + return (ls->current == s) ? count + 2 + : (count == 0) ? 1 + : 0; +} + + +static void read_long_string (LexState *ls, SemInfo *seminfo, size_t sep) { + int line = ls->linenumber; /* initial line (for error message) */ + save_and_next(ls); /* skip 2nd '[' */ + if (currIsNewline(ls)) /* string starts with a newline? */ + inclinenumber(ls); /* skip it */ + for (;;) { + switch (ls->current) { + case EOZ: { /* error */ + const char *what = (seminfo ? "string" : "comment"); + const char *msg = luaO_pushfstring(ls->L, + "unfinished long %s (starting at line %d)", what, line); + lexerror(ls, msg, TK_EOS); + break; /* to avoid warnings */ + } + case ']': { + if (skip_sep(ls) == sep) { + save_and_next(ls); /* skip 2nd ']' */ + goto endloop; + } + break; + } + case '\n': case '\r': { + save(ls, '\n'); + inclinenumber(ls); + if (!seminfo) luaZ_resetbuffer(ls->buff); /* avoid wasting space */ + break; + } + default: { + if (seminfo) save_and_next(ls); + else next(ls); + } + } + } endloop: + if (seminfo) + seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + sep, + luaZ_bufflen(ls->buff) - 2 * sep); +} + + +static void esccheck (LexState *ls, int c, const char *msg) { + if (!c) { + if (ls->current != EOZ) + save_and_next(ls); /* add current to buffer for error message */ + lexerror(ls, msg, TK_STRING); + } +} + + +static int gethexa (LexState *ls) { + save_and_next(ls); + esccheck (ls, lisxdigit(ls->current), "hexadecimal digit expected"); + return luaO_hexavalue(ls->current); +} + + +static int readhexaesc (LexState *ls) { + int r = gethexa(ls); + r = (r << 4) + gethexa(ls); + luaZ_buffremove(ls->buff, 2); /* remove saved chars from buffer */ + return r; +} + + +static unsigned long readutf8esc (LexState *ls) { + unsigned long r; + int i = 4; /* chars to be removed: '\', 'u', '{', and first digit */ + save_and_next(ls); /* skip 'u' */ + esccheck(ls, ls->current == '{', "missing '{'"); + r = gethexa(ls); /* must have at least one digit */ + while ((save_and_next(ls), lisxdigit(ls->current))) { + i++; + r = (r << 4) + luaO_hexavalue(ls->current); + esccheck(ls, r <= 0x7FFFFFFFu, "UTF-8 value too large"); + } + esccheck(ls, ls->current == '}', "missing '}'"); + next(ls); /* skip '}' */ + luaZ_buffremove(ls->buff, i); /* remove saved chars from buffer */ + return r; +} + + +static void utf8esc (LexState *ls) { + char buff[UTF8BUFFSZ]; + int n = luaO_utf8esc(buff, readutf8esc(ls)); + for (; n > 0; n--) /* add 'buff' to string */ + save(ls, buff[UTF8BUFFSZ - n]); +} + + +static int readdecesc (LexState *ls) { + int i; + int r = 0; /* result accumulator */ + for (i = 0; i < 3 && lisdigit(ls->current); i++) { /* read up to 3 digits */ + r = 10*r + ls->current - '0'; + save_and_next(ls); + } + esccheck(ls, r <= UCHAR_MAX, "decimal escape too large"); + luaZ_buffremove(ls->buff, i); /* remove read digits from buffer */ + return r; +} + + +static void read_string (LexState *ls, int del, SemInfo *seminfo) { + save_and_next(ls); /* keep delimiter (for error messages) */ + while (ls->current != del) { + switch (ls->current) { + case EOZ: + lexerror(ls, "unfinished string", TK_EOS); + break; /* to avoid warnings */ + case '\n': + case '\r': + lexerror(ls, "unfinished string", TK_STRING); + break; /* to avoid warnings */ + case '\\': { /* escape sequences */ + int c; /* final character to be saved */ + save_and_next(ls); /* keep '\\' for error messages */ + switch (ls->current) { + case 'a': c = '\a'; goto read_save; + case 'b': c = '\b'; goto read_save; + case 'f': c = '\f'; goto read_save; + case 'n': c = '\n'; goto read_save; + case 'r': c = '\r'; goto read_save; + case 't': c = '\t'; goto read_save; + case 'v': c = '\v'; goto read_save; + case 'x': c = readhexaesc(ls); goto read_save; + case 'u': utf8esc(ls); goto no_save; + case '\n': case '\r': + inclinenumber(ls); c = '\n'; goto only_save; + case '\\': case '\"': case '\'': + c = ls->current; goto read_save; + case EOZ: goto no_save; /* will raise an error next loop */ + case 'z': { /* zap following span of spaces */ + luaZ_buffremove(ls->buff, 1); /* remove '\\' */ + next(ls); /* skip the 'z' */ + while (lisspace(ls->current)) { + if (currIsNewline(ls)) inclinenumber(ls); + else next(ls); + } + goto no_save; + } + default: { + esccheck(ls, lisdigit(ls->current), "invalid escape sequence"); + c = readdecesc(ls); /* digital escape '\ddd' */ + goto only_save; + } + } + read_save: + next(ls); + /* go through */ + only_save: + luaZ_buffremove(ls->buff, 1); /* remove '\\' */ + save(ls, c); + /* go through */ + no_save: break; + } + default: + save_and_next(ls); + } + } + save_and_next(ls); /* skip delimiter */ + seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1, + luaZ_bufflen(ls->buff) - 2); +} + + +static int llex (LexState *ls, SemInfo *seminfo) { + luaZ_resetbuffer(ls->buff); + for (;;) { + switch (ls->current) { + case '\n': case '\r': { /* line breaks */ + inclinenumber(ls); + break; + } + case ' ': case '\f': case '\t': case '\v': { /* spaces */ + next(ls); + break; + } + case '-': { /* '-' or '--' (comment) */ + next(ls); + if (ls->current != '-') return '-'; + /* else is a comment */ + next(ls); + if (ls->current == '[') { /* long comment? */ + size_t sep = skip_sep(ls); + luaZ_resetbuffer(ls->buff); /* 'skip_sep' may dirty the buffer */ + if (sep >= 2) { + read_long_string(ls, NULL, sep); /* skip long comment */ + luaZ_resetbuffer(ls->buff); /* previous call may dirty the buff. */ + break; + } + } + /* else short comment */ + while (!currIsNewline(ls) && ls->current != EOZ) + next(ls); /* skip until end of line (or end of file) */ + break; + } + case '[': { /* long string or simply '[' */ + size_t sep = skip_sep(ls); + if (sep >= 2) { + read_long_string(ls, seminfo, sep); + return TK_STRING; + } + else if (sep == 0) /* '[=...' missing second bracket? */ + lexerror(ls, "invalid long string delimiter", TK_STRING); + return '['; + } + case '=': { + next(ls); + if (check_next1(ls, '=')) return TK_EQ; + else return '='; + } + case '<': { + next(ls); + if (check_next1(ls, '=')) return TK_LE; + else if (check_next1(ls, '<')) return TK_SHL; + else return '<'; + } + case '>': { + next(ls); + if (check_next1(ls, '=')) return TK_GE; + else if (check_next1(ls, '>')) return TK_SHR; + else return '>'; + } + case '/': { + next(ls); + if (check_next1(ls, '/')) return TK_IDIV; + else return '/'; + } + case '~': { + next(ls); + if (check_next1(ls, '=')) return TK_NE; + else return '~'; + } + case ':': { + next(ls); + if (check_next1(ls, ':')) return TK_DBCOLON; + else return ':'; + } + case '"': case '\'': { /* short literal strings */ + read_string(ls, ls->current, seminfo); + return TK_STRING; + } + case '.': { /* '.', '..', '...', or number */ + save_and_next(ls); + if (check_next1(ls, '.')) { + if (check_next1(ls, '.')) + return TK_DOTS; /* '...' */ + else return TK_CONCAT; /* '..' */ + } + else if (!lisdigit(ls->current)) return '.'; + else return read_numeral(ls, seminfo); + } + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': { + return read_numeral(ls, seminfo); + } + case EOZ: { + return TK_EOS; + } + default: { + if (lislalpha(ls->current)) { /* identifier or reserved word? */ + TString *ts; + do { + save_and_next(ls); + } while (lislalnum(ls->current)); + ts = luaX_newstring(ls, luaZ_buffer(ls->buff), + luaZ_bufflen(ls->buff)); + seminfo->ts = ts; + if (isreserved(ts)) /* reserved word? */ + return ts->extra - 1 + FIRST_RESERVED; + else { + return TK_NAME; + } + } + else { /* single-char tokens (+ - / ...) */ + int c = ls->current; + next(ls); + return c; + } + } + } + } +} + + +void luaX_next (LexState *ls) { + ls->lastline = ls->linenumber; + if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ + ls->t = ls->lookahead; /* use this one */ + ls->lookahead.token = TK_EOS; /* and discharge it */ + } + else + ls->t.token = llex(ls, &ls->t.seminfo); /* read next token */ +} + + +int luaX_lookahead (LexState *ls) { + lua_assert(ls->lookahead.token == TK_EOS); + ls->lookahead.token = llex(ls, &ls->lookahead.seminfo); + return ls->lookahead.token; +} + diff --git a/source/lua/llex.h b/source/lua/llex.h new file mode 100644 index 0000000..d1a4cba --- /dev/null +++ b/source/lua/llex.h @@ -0,0 +1,85 @@ +/* +** $Id: llex.h $ +** Lexical Analyzer +** See Copyright Notice in lua.h +*/ + +#ifndef llex_h +#define llex_h + +#include "lobject.h" +#include "lzio.h" + + +#define FIRST_RESERVED 257 + + +#if !defined(LUA_ENV) +#define LUA_ENV "_ENV" +#endif + + +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER RESERVED" +*/ +enum RESERVED { + /* terminal symbols denoted by reserved words */ + TK_AND = FIRST_RESERVED, TK_BREAK, + TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION, + TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT, + TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, + /* other terminal symbols */ + TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, + TK_SHL, TK_SHR, + TK_DBCOLON, TK_EOS, + TK_FLT, TK_INT, TK_NAME, TK_STRING +}; + +/* number of reserved words */ +#define NUM_RESERVED (cast_int(TK_WHILE-FIRST_RESERVED + 1)) + + +typedef union { + lua_Number r; + lua_Integer i; + TString *ts; +} SemInfo; /* semantics information */ + + +typedef struct Token { + int token; + SemInfo seminfo; +} Token; + + +/* state of the lexer plus state of the parser when shared by all + functions */ +typedef struct LexState { + int current; /* current character (charint) */ + int linenumber; /* input line counter */ + int lastline; /* line of last token 'consumed' */ + Token t; /* current token */ + Token lookahead; /* look ahead token */ + struct FuncState *fs; /* current function (parser) */ + struct lua_State *L; + ZIO *z; /* input stream */ + Mbuffer *buff; /* buffer for tokens */ + Table *h; /* to avoid collection/reuse strings */ + struct Dyndata *dyd; /* dynamic structures used by the parser */ + TString *source; /* current source name */ + TString *envn; /* environment variable name */ +} LexState; + + +LUAI_FUNC void luaX_init (lua_State *L); +LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, + TString *source, int firstchar); +LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l); +LUAI_FUNC void luaX_next (LexState *ls); +LUAI_FUNC int luaX_lookahead (LexState *ls); +LUAI_FUNC l_noret luaX_syntaxerror (LexState *ls, const char *s); +LUAI_FUNC const char *luaX_token2str (LexState *ls, int token); + + +#endif diff --git a/source/lua/llex.o b/source/lua/llex.o new file mode 100644 index 0000000000000000000000000000000000000000..2dc8e86cbd4b7222b83de4feaa0ebfa30a6479f6 GIT binary patch literal 21584 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 JRH!^^{|%QN<(B{e literal 0 HcmV?d00001 diff --git a/source/lua/llimits.h b/source/lua/llimits.h new file mode 100644 index 0000000..9d35d1c --- /dev/null +++ b/source/lua/llimits.h @@ -0,0 +1,353 @@ +/* +** $Id: llimits.h $ +** Limits, basic types, and some other 'installation-dependent' definitions +** See Copyright Notice in lua.h +*/ + +#ifndef llimits_h +#define llimits_h + + +#include +#include + + +#include "lua.h" + +/* +** 'lu_mem' and 'l_mem' are unsigned/signed integers big enough to count +** the total memory used by Lua (in bytes). Usually, 'size_t' and +** 'ptrdiff_t' should work, but we use 'long' for 16-bit machines. +*/ +#if defined(LUAI_MEM) /* { external definitions? */ +typedef LUAI_UMEM lu_mem; +typedef LUAI_MEM l_mem; +#elif LUAI_BITSINT >= 32 /* }{ */ +typedef size_t lu_mem; +typedef ptrdiff_t l_mem; +#else /* 16-bit ints */ /* }{ */ +typedef unsigned long lu_mem; +typedef long l_mem; +#endif /* } */ + + +/* chars used as small naturals (so that 'char' is reserved for characters) */ +typedef unsigned char lu_byte; +typedef signed char ls_byte; + + +/* maximum value for size_t */ +#define MAX_SIZET ((size_t)(~(size_t)0)) + +/* maximum size visible for Lua (must be representable in a lua_Integer */ +#define MAX_SIZE (sizeof(size_t) < sizeof(lua_Integer) ? MAX_SIZET \ + : (size_t)(LUA_MAXINTEGER)) + + +#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)) + +#define MAX_LMEM ((l_mem)(MAX_LUMEM >> 1)) + + +#define MAX_INT INT_MAX /* maximum value of an int */ + + +/* +** floor of the log2 of the maximum signed value for integral type 't'. +** (That is, maximum 'n' such that '2^n' fits in the given signed type.) +*/ +#define log2maxs(t) (sizeof(t) * 8 - 2) + + +/* +** test whether an unsigned value is a power of 2 (or zero) +*/ +#define ispow2(x) (((x) & ((x) - 1)) == 0) + + +/* +** conversion of pointer to unsigned integer: +** this is for hashing only; there is no problem if the integer +** cannot hold the whole pointer value +*/ +#define point2uint(p) ((unsigned int)((size_t)(p) & UINT_MAX)) + + + +/* types of 'usual argument conversions' for lua_Number and lua_Integer */ +typedef LUAI_UACNUMBER l_uacNumber; +typedef LUAI_UACINT l_uacInt; + + +/* internal assertions for in-house debugging */ +#if defined(lua_assert) +#define check_exp(c,e) (lua_assert(c), (e)) +/* to avoid problems with conditions too long */ +#define lua_longassert(c) ((c) ? (void)0 : lua_assert(0)) +#else +#define lua_assert(c) ((void)0) +#define check_exp(c,e) (e) +#define lua_longassert(c) ((void)0) +#endif + +/* +** assertion for checking API calls +*/ +#if !defined(luai_apicheck) +#define luai_apicheck(l,e) lua_assert(e) +#endif + +#define api_check(l,e,msg) luai_apicheck(l,(e) && msg) + + +/* macro to avoid warnings about unused variables */ +#if !defined(UNUSED) +#define UNUSED(x) ((void)(x)) +#endif + + +/* type casts (a macro highlights casts in the code) */ +#define cast(t, exp) ((t)(exp)) + +#define cast_void(i) cast(void, (i)) +#define cast_voidp(i) cast(void *, (i)) +#define cast_num(i) cast(lua_Number, (i)) +#define cast_int(i) cast(int, (i)) +#define cast_uint(i) cast(unsigned int, (i)) +#define cast_byte(i) cast(lu_byte, (i)) +#define cast_uchar(i) cast(unsigned char, (i)) +#define cast_char(i) cast(char, (i)) +#define cast_charp(i) cast(char *, (i)) +#define cast_sizet(i) cast(size_t, (i)) + + +/* cast a signed lua_Integer to lua_Unsigned */ +#if !defined(l_castS2U) +#define l_castS2U(i) ((lua_Unsigned)(i)) +#endif + +/* +** cast a lua_Unsigned to a signed lua_Integer; this cast is +** not strict ISO C, but two-complement architectures should +** work fine. +*/ +#if !defined(l_castU2S) +#define l_castU2S(i) ((lua_Integer)(i)) +#endif + + +/* +** macros to improve jump prediction (used mainly for error handling) +*/ +#if !defined(likely) + +#if defined(__GNUC__) +#define likely(x) (__builtin_expect(((x) != 0), 1)) +#define unlikely(x) (__builtin_expect(((x) != 0), 0)) +#else +#define likely(x) (x) +#define unlikely(x) (x) +#endif + +#endif + + +/* +** non-return type +*/ +#if !defined(l_noret) + +#if defined(__GNUC__) +#define l_noret void __attribute__((noreturn)) +#elif defined(_MSC_VER) && _MSC_VER >= 1200 +#define l_noret void __declspec(noreturn) +#else +#define l_noret void +#endif + +#endif + + +/* +** maximum depth for nested C calls and syntactical nested non-terminals +** in a program. (Value must fit in an unsigned short int. It must also +** be compatible with the size of the C stack.) +*/ +#if !defined(LUAI_MAXCCALLS) +#define LUAI_MAXCCALLS 2200 +#endif + + + +/* +** type for virtual-machine instructions; +** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) +*/ +#if LUAI_BITSINT >= 32 +typedef unsigned int l_uint32; +#else +typedef unsigned long l_uint32; +#endif + +typedef l_uint32 Instruction; + + + +/* +** Maximum length for short strings, that is, strings that are +** internalized. (Cannot be smaller than reserved words or tags for +** metamethods, as these strings must be internalized; +** #("function") = 8, #("__newindex") = 10.) +*/ +#if !defined(LUAI_MAXSHORTLEN) +#define LUAI_MAXSHORTLEN 40 +#endif + + +/* +** Initial size for the string table (must be power of 2). +** The Lua core alone registers ~50 strings (reserved words + +** metaevent keys + a few others). Libraries would typically add +** a few dozens more. +*/ +#if !defined(MINSTRTABSIZE) +#define MINSTRTABSIZE 128 +#endif + + +/* +** Size of cache for strings in the API. 'N' is the number of +** sets (better be a prime) and "M" is the size of each set (M == 1 +** makes a direct cache.) +*/ +#if !defined(STRCACHE_N) +#define STRCACHE_N 53 +#define STRCACHE_M 2 +#endif + + +/* minimum size for string buffer */ +#if !defined(LUA_MINBUFFER) +#define LUA_MINBUFFER 32 +#endif + + +/* +** macros that are executed whenever program enters the Lua core +** ('lua_lock') and leaves the core ('lua_unlock') +*/ +#if !defined(lua_lock) +#define lua_lock(L) ((void) 0) +#define lua_unlock(L) ((void) 0) +#endif + +/* +** macro executed during Lua functions at points where the +** function can yield. +*/ +#if !defined(luai_threadyield) +#define luai_threadyield(L) {lua_unlock(L); lua_lock(L);} +#endif + + +/* +** these macros allow user-specific actions when a thread is +** created/deleted/resumed/yielded. +*/ +#if !defined(luai_userstateopen) +#define luai_userstateopen(L) ((void)L) +#endif + +#if !defined(luai_userstateclose) +#define luai_userstateclose(L) ((void)L) +#endif + +#if !defined(luai_userstatethread) +#define luai_userstatethread(L,L1) ((void)L) +#endif + +#if !defined(luai_userstatefree) +#define luai_userstatefree(L,L1) ((void)L) +#endif + +#if !defined(luai_userstateresume) +#define luai_userstateresume(L,n) ((void)L) +#endif + +#if !defined(luai_userstateyield) +#define luai_userstateyield(L,n) ((void)L) +#endif + + + +/* +** The luai_num* macros define the primitive operations over numbers. +*/ + +/* floor division (defined as 'floor(a/b)') */ +#if !defined(luai_numidiv) +#define luai_numidiv(L,a,b) ((void)L, l_floor(luai_numdiv(L,a,b))) +#endif + +/* float division */ +#if !defined(luai_numdiv) +#define luai_numdiv(L,a,b) ((a)/(b)) +#endif + +/* +** modulo: defined as 'a - floor(a/b)*b'; the direct computation +** using this definition has several problems with rounding errors, +** so it is better to use 'fmod'. 'fmod' gives the result of +** 'a - trunc(a/b)*b', and therefore must be corrected when +** 'trunc(a/b) ~= floor(a/b)'. That happens when the division has a +** non-integer negative result: non-integer result is equivalent to +** a non-zero remainder 'm'; negative result is equivalent to 'a' and +** 'b' with different signs, or 'm' and 'b' with different signs +** (as the result 'm' of 'fmod' has the same sign of 'a'). +*/ +#if !defined(luai_nummod) +#define luai_nummod(L,a,b,m) \ + { (void)L; (m) = l_mathop(fmod)(a,b); \ + if (((m) > 0) ? (b) < 0 : ((m) < 0 && (b) > 0)) (m) += (b); } +#endif + +/* exponentiation */ +#if !defined(luai_numpow) +#define luai_numpow(L,a,b) ((void)L, l_mathop(pow)(a,b)) +#endif + +/* the others are quite standard operations */ +#if !defined(luai_numadd) +#define luai_numadd(L,a,b) ((a)+(b)) +#define luai_numsub(L,a,b) ((a)-(b)) +#define luai_nummul(L,a,b) ((a)*(b)) +#define luai_numunm(L,a) (-(a)) +#define luai_numeq(a,b) ((a)==(b)) +#define luai_numlt(a,b) ((a)<(b)) +#define luai_numle(a,b) ((a)<=(b)) +#define luai_numisnan(a) (!luai_numeq((a), (a))) +#endif + + + + + +/* +** macro to control inclusion of some hard tests on stack reallocation +*/ +#if !defined(HARDSTACKTESTS) +#define condmovestack(L,pre,pos) ((void)0) +#else +/* realloc stack keeping its size */ +#define condmovestack(L,pre,pos) \ + { int sz_ = (L)->stacksize; pre; luaD_reallocstack((L), sz_, 0); pos; } +#endif + +#if !defined(HARDMEMTESTS) +#define condchangemem(L,pre,pos) ((void)0) +#else +#define condchangemem(L,pre,pos) \ + { if (G(L)->gcrunning) { pre; luaC_fullgc(L, 0); pos; } } +#endif + +#endif diff --git a/source/lua/lmathlib.c b/source/lua/lmathlib.c new file mode 100644 index 0000000..e3ccc3e --- /dev/null +++ b/source/lua/lmathlib.c @@ -0,0 +1,756 @@ +/* +** $Id: lmathlib.c $ +** Standard mathematical library +** See Copyright Notice in lua.h +*/ + +#define lmathlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#undef PI +#define PI (l_mathop(3.141592653589793238462643383279502884)) + + +static int math_abs (lua_State *L) { + if (lua_isinteger(L, 1)) { + lua_Integer n = lua_tointeger(L, 1); + if (n < 0) n = (lua_Integer)(0u - (lua_Unsigned)n); + lua_pushinteger(L, n); + } + else + lua_pushnumber(L, l_mathop(fabs)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_sin (lua_State *L) { + lua_pushnumber(L, l_mathop(sin)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_cos (lua_State *L) { + lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_tan (lua_State *L) { + lua_pushnumber(L, l_mathop(tan)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_asin (lua_State *L) { + lua_pushnumber(L, l_mathop(asin)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_acos (lua_State *L) { + lua_pushnumber(L, l_mathop(acos)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_atan (lua_State *L) { + lua_Number y = luaL_checknumber(L, 1); + lua_Number x = luaL_optnumber(L, 2, 1); + lua_pushnumber(L, l_mathop(atan2)(y, x)); + return 1; +} + + +static int math_toint (lua_State *L) { + int valid; + lua_Integer n = lua_tointegerx(L, 1, &valid); + if (valid) + lua_pushinteger(L, n); + else { + luaL_checkany(L, 1); + lua_pushnil(L); /* value is not convertible to integer */ + } + return 1; +} + + +static void pushnumint (lua_State *L, lua_Number d) { + lua_Integer n; + if (lua_numbertointeger(d, &n)) /* does 'd' fit in an integer? */ + lua_pushinteger(L, n); /* result is integer */ + else + lua_pushnumber(L, d); /* result is float */ +} + + +static int math_floor (lua_State *L) { + if (lua_isinteger(L, 1)) + lua_settop(L, 1); /* integer is its own floor */ + else { + lua_Number d = l_mathop(floor)(luaL_checknumber(L, 1)); + pushnumint(L, d); + } + return 1; +} + + +static int math_ceil (lua_State *L) { + if (lua_isinteger(L, 1)) + lua_settop(L, 1); /* integer is its own ceil */ + else { + lua_Number d = l_mathop(ceil)(luaL_checknumber(L, 1)); + pushnumint(L, d); + } + return 1; +} + + +static int math_fmod (lua_State *L) { + if (lua_isinteger(L, 1) && lua_isinteger(L, 2)) { + lua_Integer d = lua_tointeger(L, 2); + if ((lua_Unsigned)d + 1u <= 1u) { /* special cases: -1 or 0 */ + luaL_argcheck(L, d != 0, 2, "zero"); + lua_pushinteger(L, 0); /* avoid overflow with 0x80000... / -1 */ + } + else + lua_pushinteger(L, lua_tointeger(L, 1) % d); + } + else + lua_pushnumber(L, l_mathop(fmod)(luaL_checknumber(L, 1), + luaL_checknumber(L, 2))); + return 1; +} + + +/* +** next function does not use 'modf', avoiding problems with 'double*' +** (which is not compatible with 'float*') when lua_Number is not +** 'double'. +*/ +static int math_modf (lua_State *L) { + if (lua_isinteger(L ,1)) { + lua_settop(L, 1); /* number is its own integer part */ + lua_pushnumber(L, 0); /* no fractional part */ + } + else { + lua_Number n = luaL_checknumber(L, 1); + /* integer part (rounds toward zero) */ + lua_Number ip = (n < 0) ? l_mathop(ceil)(n) : l_mathop(floor)(n); + pushnumint(L, ip); + /* fractional part (test needed for inf/-inf) */ + lua_pushnumber(L, (n == ip) ? l_mathop(0.0) : (n - ip)); + } + return 2; +} + + +static int math_sqrt (lua_State *L) { + lua_pushnumber(L, l_mathop(sqrt)(luaL_checknumber(L, 1))); + return 1; +} + + +static int math_ult (lua_State *L) { + lua_Integer a = luaL_checkinteger(L, 1); + lua_Integer b = luaL_checkinteger(L, 2); + lua_pushboolean(L, (lua_Unsigned)a < (lua_Unsigned)b); + return 1; +} + +static int math_log (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + lua_Number res; + if (lua_isnoneornil(L, 2)) + res = l_mathop(log)(x); + else { + lua_Number base = luaL_checknumber(L, 2); +#if !defined(LUA_USE_C89) + if (base == l_mathop(2.0)) + res = l_mathop(log2)(x); else +#endif + if (base == l_mathop(10.0)) + res = l_mathop(log10)(x); + else + res = l_mathop(log)(x)/l_mathop(log)(base); + } + lua_pushnumber(L, res); + return 1; +} + +static int math_exp (lua_State *L) { + lua_pushnumber(L, l_mathop(exp)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_deg (lua_State *L) { + lua_pushnumber(L, luaL_checknumber(L, 1) * (l_mathop(180.0) / PI)); + return 1; +} + +static int math_rad (lua_State *L) { + lua_pushnumber(L, luaL_checknumber(L, 1) * (PI / l_mathop(180.0))); + return 1; +} + + +static int math_min (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int imin = 1; /* index of current minimum value */ + int i; + luaL_argcheck(L, n >= 1, 1, "value expected"); + for (i = 2; i <= n; i++) { + if (lua_compare(L, i, imin, LUA_OPLT)) + imin = i; + } + lua_pushvalue(L, imin); + return 1; +} + + +static int math_max (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int imax = 1; /* index of current maximum value */ + int i; + luaL_argcheck(L, n >= 1, 1, "value expected"); + for (i = 2; i <= n; i++) { + if (lua_compare(L, imax, i, LUA_OPLT)) + imax = i; + } + lua_pushvalue(L, imax); + return 1; +} + + +static int math_type (lua_State *L) { + if (lua_type(L, 1) == LUA_TNUMBER) + lua_pushstring(L, (lua_isinteger(L, 1)) ? "integer" : "float"); + else { + luaL_checkany(L, 1); + lua_pushnil(L); + } + return 1; +} + + + +/* +** {================================================================== +** Pseudo-Random Number Generator based on 'xoshiro256**'. +** =================================================================== +*/ + +/* number of binary digits in the mantissa of a float */ +#define FIGS l_mathlim(MANT_DIG) + +#if FIGS > 64 +/* there are only 64 random bits; use them all */ +#undef FIGS +#define FIGS 64 +#endif + + +/* +** LUA_RAND32 forces the use of 32-bit integers in the implementation +** of the PRN generator (mainly for testing). +*/ +#if !defined(LUA_RAND32) && !defined(Rand64) + +/* try to find an integer type with at least 64 bits */ + +#if (LONG_MAX >> 31 >> 31) >= 1 + +/* 'long' has at least 64 bits */ +#define Rand64 unsigned long + +#elif !defined(LUA_USE_C89) && defined(LLONG_MAX) + +/* there is a 'long long' type (which must have at least 64 bits) */ +#define Rand64 unsigned long long + +#elif (LUA_MAXINTEGER >> 31 >> 31) >= 1 + +/* 'lua_Integer' has at least 64 bits */ +#define Rand64 lua_Unsigned + +#endif + +#endif + + +#if defined(Rand64) /* { */ + +/* +** Standard implementation, using 64-bit integers. +** If 'Rand64' has more than 64 bits, the extra bits do not interfere +** with the 64 initial bits, except in a right shift. Moreover, the +** final result has to discard the extra bits. +*/ + +/* avoid using extra bits when needed */ +#define trim64(x) ((x) & 0xffffffffffffffffu) + + +/* rotate left 'x' by 'n' bits */ +static Rand64 rotl (Rand64 x, int n) { + return (x << n) | (trim64(x) >> (64 - n)); +} + +static Rand64 nextrand (Rand64 *state) { + Rand64 state0 = state[0]; + Rand64 state1 = state[1]; + Rand64 state2 = state[2] ^ state0; + Rand64 state3 = state[3] ^ state1; + Rand64 res = rotl(state1 * 5, 7) * 9; + state[0] = state0 ^ state3; + state[1] = state1 ^ state2; + state[2] = state2 ^ (state1 << 17); + state[3] = rotl(state3, 45); + return res; +} + + +/* must take care to not shift stuff by more than 63 slots */ + + +/* +** Convert bits from a random integer into a float in the +** interval [0,1), getting the higher FIG bits from the +** random unsigned integer and converting that to a float. +*/ + +/* must throw out the extra (64 - FIGS) bits */ +#define shift64_FIG (64 - FIGS) + +/* to scale to [0, 1), multiply by scaleFIG = 2^(-FIGS) */ +#define scaleFIG (l_mathop(0.5) / ((Rand64)1 << (FIGS - 1))) + +static lua_Number I2d (Rand64 x) { + return (lua_Number)(trim64(x) >> shift64_FIG) * scaleFIG; +} + +/* convert a 'Rand64' to a 'lua_Unsigned' */ +#define I2UInt(x) ((lua_Unsigned)trim64(x)) + +/* convert a 'lua_Unsigned' to a 'Rand64' */ +#define Int2I(x) ((Rand64)(x)) + + +#else /* no 'Rand64' }{ */ + +/* get an integer with at least 32 bits */ +#if (INT_MAX >> 30) >= 1 +typedef unsigned int lu_int32; +#else +typedef unsigned long lu_int32; +#endif + + +/* +** Use two 32-bit integers to represent a 64-bit quantity. +*/ +typedef struct Rand64 { + lu_int32 h; /* higher half */ + lu_int32 l; /* lower half */ +} Rand64; + + +/* +** If 'lu_int32' has more than 32 bits, the extra bits do not interfere +** with the 32 initial bits, except in a right shift and comparisons. +** Moreover, the final result has to discard the extra bits. +*/ + +/* avoid using extra bits when needed */ +#define trim32(x) ((x) & 0xffffffffu) + + +/* +** basic operations on 'Rand64' values +*/ + +/* build a new Rand64 value */ +static Rand64 packI (lu_int32 h, lu_int32 l) { + Rand64 result; + result.h = h; + result.l = l; + return result; +} + +/* return i << n */ +static Rand64 Ishl (Rand64 i, int n) { + lua_assert(n > 0 && n < 32); + return packI((i.h << n) | (trim32(i.l) >> (32 - n)), i.l << n); +} + +/* i1 ^= i2 */ +static void Ixor (Rand64 *i1, Rand64 i2) { + i1->h ^= i2.h; + i1->l ^= i2.l; +} + +/* return i1 + i2 */ +static Rand64 Iadd (Rand64 i1, Rand64 i2) { + Rand64 result = packI(i1.h + i2.h, i1.l + i2.l); + if (trim32(result.l) < trim32(i1.l)) /* carry? */ + result.h++; + return result; +} + +/* return i * 5 */ +static Rand64 times5 (Rand64 i) { + return Iadd(Ishl(i, 2), i); /* i * 5 == (i << 2) + i */ +} + +/* return i * 9 */ +static Rand64 times9 (Rand64 i) { + return Iadd(Ishl(i, 3), i); /* i * 9 == (i << 3) + i */ +} + +/* return 'i' rotated left 'n' bits */ +static Rand64 rotl (Rand64 i, int n) { + lua_assert(n > 0 && n < 32); + return packI((i.h << n) | (trim32(i.l) >> (32 - n)), + (trim32(i.h) >> (32 - n)) | (i.l << n)); +} + +/* for offsets larger than 32, rotate right by 64 - offset */ +static Rand64 rotl1 (Rand64 i, int n) { + lua_assert(n > 32 && n < 64); + n = 64 - n; + return packI((trim32(i.h) >> n) | (i.l << (32 - n)), + (i.h << (32 - n)) | (trim32(i.l) >> n)); +} + +/* +** implementation of 'xoshiro256**' algorithm on 'Rand64' values +*/ +static Rand64 nextrand (Rand64 *state) { + Rand64 res = times9(rotl(times5(state[1]), 7)); + Rand64 t = Ishl(state[1], 17); + Ixor(&state[2], state[0]); + Ixor(&state[3], state[1]); + Ixor(&state[1], state[2]); + Ixor(&state[0], state[3]); + Ixor(&state[2], t); + state[3] = rotl1(state[3], 45); + return res; +} + + +/* +** Converts a 'Rand64' into a float. +*/ + +/* an unsigned 1 with proper type */ +#define UONE ((lu_int32)1) + + +#if FIGS <= 32 + +/* 2^(-FIGS) */ +#define scaleFIG (l_mathop(0.5) / (UONE << (FIGS - 1))) + +/* +** get up to 32 bits from higher half, shifting right to +** throw out the extra bits. +*/ +static lua_Number I2d (Rand64 x) { + lua_Number h = (lua_Number)(trim32(x.h) >> (32 - FIGS)); + return h * scaleFIG; +} + +#else /* 32 < FIGS <= 64 */ + +/* must take care to not shift stuff by more than 31 slots */ + +/* 2^(-FIGS) = 1.0 / 2^30 / 2^3 / 2^(FIGS-33) */ +#define scaleFIG \ + ((lua_Number)1.0 / (UONE << 30) / 8.0 / (UONE << (FIGS - 33))) + +/* +** use FIGS - 32 bits from lower half, throwing out the other +** (32 - (FIGS - 32)) = (64 - FIGS) bits +*/ +#define shiftLOW (64 - FIGS) + +/* +** higher 32 bits go after those (FIGS - 32) bits: shiftHI = 2^(FIGS - 32) +*/ +#define shiftHI ((lua_Number)(UONE << (FIGS - 33)) * 2.0) + + +static lua_Number I2d (Rand64 x) { + lua_Number h = (lua_Number)trim32(x.h) * shiftHI; + lua_Number l = (lua_Number)(trim32(x.l) >> shiftLOW); + return (h + l) * scaleFIG; +} + +#endif + + +/* convert a 'Rand64' to a 'lua_Unsigned' */ +static lua_Unsigned I2UInt (Rand64 x) { + return ((lua_Unsigned)trim32(x.h) << 31 << 1) | (lua_Unsigned)trim32(x.l); +} + +/* convert a 'lua_Unsigned' to a 'Rand64' */ +static Rand64 Int2I (lua_Unsigned n) { + return packI((lu_int32)(n >> 31 >> 1), (lu_int32)n); +} + +#endif /* } */ + + +/* +** A state uses four 'Rand64' values. +*/ +typedef struct { + Rand64 s[4]; +} RanState; + + +/* +** Project the random integer 'ran' into the interval [0, n]. +** Because 'ran' has 2^B possible values, the projection can only be +** uniform when the size of the interval is a power of 2 (exact +** division). To get a uniform projection into [0, n], we first compute +** 'lim', the smallest Mersenne number not smaller than 'n'. We then +** project 'ran' into the interval [0, lim]. If the result is inside +** [0, n], we are done. Otherwise, we try with another 'ran', until we +** have a result inside the interval. +*/ +static lua_Unsigned project (lua_Unsigned ran, lua_Unsigned n, + RanState *state) { + lua_Unsigned lim = n; + if ((lim & (lim + 1)) > 0) { /* 'lim + 1' is not a power of 2? */ + /* compute the smallest (2^b - 1) not smaller than 'n' */ + lim |= (lim >> 1); + lim |= (lim >> 2); + lim |= (lim >> 4); + lim |= (lim >> 8); + lim |= (lim >> 16); +#if (LUA_MAXINTEGER >> 30 >> 1) > 0 + lim |= (lim >> 32); /* integer type has more than 32 bits */ +#endif + } + lua_assert((lim & (lim + 1)) == 0 /* 'lim + 1' is a power of 2, */ + && lim >= n /* not smaller than 'n', */ + && (lim == 0 || (lim >> 1) < n)); /* and it is the smallest one */ + while ((ran &= lim) > n) /* project 'ran' into [0..lim] */ + ran = I2UInt(nextrand(state->s)); /* not inside [0..n]? try again */ + return ran; +} + + +static int math_random (lua_State *L) { + lua_Integer low, up; + lua_Unsigned p; + RanState *state = (RanState *)lua_touserdata(L, lua_upvalueindex(1)); + Rand64 rv = nextrand(state->s); /* next pseudo-random value */ + switch (lua_gettop(L)) { /* check number of arguments */ + case 0: { /* no arguments */ + lua_pushnumber(L, I2d(rv)); /* float between 0 and 1 */ + return 1; + } + case 1: { /* only upper limit */ + low = 1; + up = luaL_checkinteger(L, 1); + if (up == 0) { /* single 0 as argument? */ + lua_pushinteger(L, I2UInt(rv)); /* full random integer */ + return 1; + } + break; + } + case 2: { /* lower and upper limits */ + low = luaL_checkinteger(L, 1); + up = luaL_checkinteger(L, 2); + break; + } + default: return luaL_error(L, "wrong number of arguments"); + } + /* random integer in the interval [low, up] */ + luaL_argcheck(L, low <= up, 1, "interval is empty"); + /* project random integer into the interval [0, up - low] */ + p = project(I2UInt(rv), (lua_Unsigned)up - (lua_Unsigned)low, state); + lua_pushinteger(L, p + (lua_Unsigned)low); + return 1; +} + + +static void setseed (Rand64 *state, lua_Unsigned n1, lua_Unsigned n2) { + int i; + state[0] = Int2I(n1); + state[1] = Int2I(0xff); /* avoid a zero state */ + state[2] = Int2I(n2); + state[3] = Int2I(0); + for (i = 0; i < 16; i++) + nextrand(state); /* discard initial values to "spread" seed */ +} + + +/* +** Set a "random" seed. To get some randomness, use the current time +** and the address of 'L' (in case the machine does address space layout +** randomization). +*/ +static void randseed (lua_State *L, RanState *state) { + lua_Unsigned seed1 = (lua_Unsigned)time(NULL); + lua_Unsigned seed2 = (lua_Unsigned)(size_t)L; + setseed(state->s, seed1, seed2); +} + + +static int math_randomseed (lua_State *L) { + RanState *state = (RanState *)lua_touserdata(L, lua_upvalueindex(1)); + if (lua_isnone(L, 1)) + randseed(L, state); + else { + lua_Integer n1 = luaL_checkinteger(L, 1); + lua_Integer n2 = luaL_optinteger(L, 2, 0); + setseed(state->s, n1, n2); + } + return 0; +} + + +static const luaL_Reg randfuncs[] = { + {"random", math_random}, + {"randomseed", math_randomseed}, + {NULL, NULL} +}; + + +/* +** Register the random functions and initialize their state. +*/ +static void setrandfunc (lua_State *L) { + RanState *state = (RanState *)lua_newuserdatauv(L, sizeof(RanState), 0); + randseed(L, state); /* initialize with a "random" seed */ + luaL_setfuncs(L, randfuncs, 1); +} + +/* }================================================================== */ + + +/* +** {================================================================== +** Deprecated functions (for compatibility only) +** =================================================================== +*/ +#if defined(LUA_COMPAT_MATHLIB) + +static int math_cosh (lua_State *L) { + lua_pushnumber(L, l_mathop(cosh)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_sinh (lua_State *L) { + lua_pushnumber(L, l_mathop(sinh)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_tanh (lua_State *L) { + lua_pushnumber(L, l_mathop(tanh)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_pow (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + lua_Number y = luaL_checknumber(L, 2); + lua_pushnumber(L, l_mathop(pow)(x, y)); + return 1; +} + +static int math_frexp (lua_State *L) { + int e; + lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e)); + lua_pushinteger(L, e); + return 2; +} + +static int math_ldexp (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + int ep = (int)luaL_checkinteger(L, 2); + lua_pushnumber(L, l_mathop(ldexp)(x, ep)); + return 1; +} + +static int math_log10 (lua_State *L) { + lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1))); + return 1; +} + +#endif +/* }================================================================== */ + + + +static const luaL_Reg mathlib[] = { + {"abs", math_abs}, + {"acos", math_acos}, + {"asin", math_asin}, + {"atan", math_atan}, + {"ceil", math_ceil}, + {"cos", math_cos}, + {"deg", math_deg}, + {"exp", math_exp}, + {"tointeger", math_toint}, + {"floor", math_floor}, + {"fmod", math_fmod}, + {"ult", math_ult}, + {"log", math_log}, + {"max", math_max}, + {"min", math_min}, + {"modf", math_modf}, + {"rad", math_rad}, + {"sin", math_sin}, + {"sqrt", math_sqrt}, + {"tan", math_tan}, + {"type", math_type}, +#if defined(LUA_COMPAT_MATHLIB) + {"atan2", math_atan}, + {"cosh", math_cosh}, + {"sinh", math_sinh}, + {"tanh", math_tanh}, + {"pow", math_pow}, + {"frexp", math_frexp}, + {"ldexp", math_ldexp}, + {"log10", math_log10}, +#endif + /* placeholders */ + {"random", NULL}, + {"randomseed", NULL}, + {"pi", NULL}, + {"huge", NULL}, + {"maxinteger", NULL}, + {"mininteger", NULL}, + {NULL, NULL} +}; + + +/* +** Open math library +*/ +LUAMOD_API int luaopen_math (lua_State *L) { + luaL_newlib(L, mathlib); + lua_pushnumber(L, PI); + lua_setfield(L, -2, "pi"); + lua_pushnumber(L, (lua_Number)HUGE_VAL); + lua_setfield(L, -2, "huge"); + lua_pushinteger(L, LUA_MAXINTEGER); + lua_setfield(L, -2, "maxinteger"); + lua_pushinteger(L, LUA_MININTEGER); + lua_setfield(L, -2, "mininteger"); + setrandfunc(L); + return 1; +} + diff --git a/source/lua/lmathlib.o b/source/lua/lmathlib.o new file mode 100644 index 0000000000000000000000000000000000000000..aa4d487510accd162bf7abcc19d1870e6688cb42 GIT binary patch literal 14712 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 literal 0 HcmV?d00001 diff --git a/source/lua/lmem.c b/source/lua/lmem.c new file mode 100644 index 0000000..53f8dcb --- /dev/null +++ b/source/lua/lmem.c @@ -0,0 +1,179 @@ +/* +** $Id: lmem.c $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + +#define lmem_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + +#if defined(HARDMEMTESTS) +#define hardtest(L,os,s) /* force a GC whenever possible */ \ + if ((s) > (os) && (G(L))->gcrunning) luaC_fullgc(L, 1); +#else +#define hardtest(L,os,s) ((void)0) +#endif + + + +/* +** About the realloc function: +** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize); +** ('osize' is the old size, 'nsize' is the new size) +** +** * frealloc(ud, NULL, x, s) creates a new block of size 's' (no +** matter 'x'). +** +** * frealloc(ud, p, x, 0) frees the block 'p' +** (in this specific case, frealloc must return NULL); +** particularly, frealloc(ud, NULL, 0, 0) does nothing +** (which is equivalent to free(NULL) in ISO C) +** +** frealloc returns NULL if it cannot create or reallocate the area +** (any reallocation to an equal or smaller size cannot fail!) +*/ + + + +#define MINSIZEARRAY 4 + + +void *luaM_growaux_ (lua_State *L, void *block, int nelems, int *psize, + int size_elems, int limit, const char *what) { + void *newblock; + int size = *psize; + if (nelems + 1 <= size) /* does one extra element still fit? */ + return block; /* nothing to be done */ + if (size >= limit / 2) { /* cannot double it? */ + if (unlikely(size >= limit)) /* cannot grow even a little? */ + luaG_runerror(L, "too many %s (limit is %d)", what, limit); + size = limit; /* still have at least one free place */ + } + else { + size *= 2; + if (size < MINSIZEARRAY) + size = MINSIZEARRAY; /* minimum size */ + } + lua_assert(nelems + 1 <= size && size <= limit); + /* 'limit' ensures that multiplication will not overflow */ + newblock = luaM_realloc_(L, block, cast_sizet(*psize) * size_elems, + cast_sizet(size) * size_elems); + if (unlikely(newblock == NULL)) + luaM_error(L); + *psize = size; /* update only when everything else is OK */ + return newblock; +} + + +void *luaM_shrinkvector_ (lua_State *L, void *block, int *size, + int final_n, int size_elem) { + global_State *g = G(L); + void *newblock; + size_t oldsize = cast_sizet((*size) * size_elem); + size_t newsize = cast_sizet(final_n * size_elem); + lua_assert(newsize <= oldsize); + newblock = (*g->frealloc)(g->ud, block, oldsize, newsize); + if (unlikely(newblock == NULL && final_n > 0)) /* allocation failed? */ + luaM_error(L); + else { + g->GCdebt += newsize - oldsize; + *size = final_n; + return newblock; + } +} + + +l_noret luaM_toobig (lua_State *L) { + luaG_runerror(L, "memory allocation error: block too big"); +} + + +/* +** Free memory +*/ +void luaM_free_ (lua_State *L, void *block, size_t osize) { + global_State *g = G(L); + lua_assert((osize == 0) == (block == NULL)); + (*g->frealloc)(g->ud, block, osize, 0); + g->GCdebt -= osize; +} + + +/* +** In case of allocation fail, this function will call the GC to try +** to free some memory and then try the allocation again. +** (It should not be called when shrinking a block, because then the +** interpreter may be in the middle of a collection step.) +*/ +static void *tryagain (lua_State *L, void *block, + size_t osize, size_t nsize) { + global_State *g = G(L); + if (ttisnil(&g->nilvalue)) { /* is state fully build? */ + luaC_fullgc(L, 1); /* try to free some memory... */ + return (*g->frealloc)(g->ud, block, osize, nsize); /* try again */ + } + else return NULL; /* cannot free any memory without a full state */ +} + + +/* +** generic allocation routine. +*/ +void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { + void *newblock; + global_State *g = G(L); + lua_assert((osize == 0) == (block == NULL)); + hardtest(L, osize, nsize); + newblock = (*g->frealloc)(g->ud, block, osize, nsize); + if (unlikely(newblock == NULL && nsize > 0)) { + if (nsize > osize) /* not shrinking a block? */ + newblock = tryagain(L, block, osize, nsize); + if (newblock == NULL) /* still no memory? */ + return NULL; + } + lua_assert((nsize == 0) == (newblock == NULL)); + g->GCdebt = (g->GCdebt + nsize) - osize; + return newblock; +} + + +void *luaM_saferealloc_ (lua_State *L, void *block, size_t osize, + size_t nsize) { + void *newblock = luaM_realloc_(L, block, osize, nsize); + if (unlikely(newblock == NULL && nsize > 0)) /* allocation failed? */ + luaM_error(L); + return newblock; +} + + +void *luaM_malloc_ (lua_State *L, size_t size, int tag) { + hardtest(L, 0, size); + if (size == 0) + return NULL; /* that's all */ + else { + global_State *g = G(L); + void *newblock = (*g->frealloc)(g->ud, NULL, tag, size); + if (unlikely(newblock == NULL)) { + newblock = tryagain(L, NULL, tag, size); + if (newblock == NULL) + luaM_error(L); + } + g->GCdebt += size; + return newblock; + } +} diff --git a/source/lua/lmem.h b/source/lua/lmem.h new file mode 100644 index 0000000..8c75a44 --- /dev/null +++ b/source/lua/lmem.h @@ -0,0 +1,93 @@ +/* +** $Id: lmem.h $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + +#ifndef lmem_h +#define lmem_h + + +#include + +#include "llimits.h" +#include "lua.h" + + +#define luaM_error(L) luaD_throw(L, LUA_ERRMEM) + + +/* +** This macro tests whether it is safe to multiply 'n' by the size of +** type 't' without overflows. Because 'e' is always constant, it avoids +** the runtime division MAX_SIZET/(e). +** (The macro is somewhat complex to avoid warnings: The 'sizeof' +** comparison avoids a runtime comparison when overflow cannot occur. +** The compiler should be able to optimize the real test by itself, but +** when it does it, it may give a warning about "comparison is always +** false due to limited range of data type"; the +1 tricks the compiler, +** avoiding this warning but also this optimization.) +*/ +#define luaM_testsize(n,e) \ + (sizeof(n) >= sizeof(size_t) && cast_sizet((n)) + 1 > MAX_SIZET/(e)) + +#define luaM_checksize(L,n,e) \ + (luaM_testsize(n,e) ? luaM_toobig(L) : cast_void(0)) + + +/* +** Computes the minimum between 'n' and 'MAX_SIZET/sizeof(t)', so that +** the result is not larger than 'n' and cannot overflow a 'size_t' +** when multiplied by the size of type 't'. (Assumes that 'n' is an +** 'int' or 'unsigned int' and that 'int' is not larger than 'size_t'.) +*/ +#define luaM_limitN(n,t) \ + ((cast_sizet(n) <= MAX_SIZET/sizeof(t)) ? (n) : \ + cast_uint((MAX_SIZET/sizeof(t)))) + + +/* +** Arrays of chars do not need any test +*/ +#define luaM_reallocvchar(L,b,on,n) \ + cast_charp(luaM_saferealloc_(L, (b), (on)*sizeof(char), (n)*sizeof(char))) + +#define luaM_freemem(L, b, s) luaM_free_(L, (b), (s)) +#define luaM_free(L, b) luaM_free_(L, (b), sizeof(*(b))) +#define luaM_freearray(L, b, n) luaM_free_(L, (b), (n)*sizeof(*(b))) + +#define luaM_new(L,t) cast(t*, luaM_malloc_(L, sizeof(t), 0)) +#define luaM_newvector(L,n,t) cast(t*, luaM_malloc_(L, (n)*sizeof(t), 0)) +#define luaM_newvectorchecked(L,n,t) \ + (luaM_checksize(L,n,sizeof(t)), luaM_newvector(L,n,t)) + +#define luaM_newobject(L,tag,s) luaM_malloc_(L, (s), tag) + +#define luaM_growvector(L,v,nelems,size,t,limit,e) \ + ((v)=cast(t *, luaM_growaux_(L,v,nelems,&(size),sizeof(t), \ + luaM_limitN(limit,t),e))) + +#define luaM_reallocvector(L, v,oldn,n,t) \ + (cast(t *, luaM_realloc_(L, v, cast_sizet(oldn) * sizeof(t), \ + cast_sizet(n) * sizeof(t)))) + +#define luaM_shrinkvector(L,v,size,fs,t) \ + ((v)=cast(t *, luaM_shrinkvector_(L, v, &(size), fs, sizeof(t)))) + +LUAI_FUNC l_noret luaM_toobig (lua_State *L); + +/* not to be called directly */ +LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize, + size_t size); +LUAI_FUNC void *luaM_saferealloc_ (lua_State *L, void *block, size_t oldsize, + size_t size); +LUAI_FUNC void luaM_free_ (lua_State *L, void *block, size_t osize); +LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int nelems, + int *size, int size_elem, int limit, + const char *what); +LUAI_FUNC void *luaM_shrinkvector_ (lua_State *L, void *block, int *nelem, + int final_n, int size_elem); +LUAI_FUNC void *luaM_malloc_ (lua_State *L, size_t size, int tag); + +#endif + diff --git a/source/lua/lmem.o b/source/lua/lmem.o new file mode 100644 index 0000000000000000000000000000000000000000..9d346b8bb230cac23f072a27c3486d728c3b0c2a GIT binary patch literal 3632 zcmbtV?{5=j9Dlmopl8rT*A=KxJyf5+0bZj>*yUR5*bAeY+YBnt*$@F^(suk zk<>N0Yy)1J$p63_U#Kx;WQ4#NWEe3LeK9pA3j=|udtsRM`@MUf?RFGH;TJK{ z+48CBMSfR4s2UY?qZ;4Gx@6-zIvaa6IyT^wJ?H1uu@jB%u;=_mC3#Ox{-B`c+j3=7 zqcS>Ktm_=TH`1sIhZ}uL(}HTi*l9>+6s9M+M~+XK{x8&myQonyqqX@*XBRM%;H0?) zxf-{ES9!viSLIoyX~<_8ostjAG1XXvqNv7Fmok?3sm6DTaZMRJ>8`|x8I&^mWAQmf z==MdMepQTapOv-T1CbE5?I*1vIJvOk*>VcqLNZa~m#DEAHSW)!`KMAr3sXRt?zife zbhXWnq{GIve4x{qxp-$wOfi#Z90;>+;iAExq9tk5izQT&g-{5=U5;(KYLoprzF+|LIfjQF*#I1}SXcWW7 zRePq8wMRBLJ zLkcvv6wOuelVFP!*dYajP1c6EJrHaOv;^7+*<`sVu8;N;*Kx0F^SZU}v+!q90Dpn) z#c*t=-iexa>KhkiDwbMzxWX<)FP`T^KOeL!fZ?npzJ`a7s7a{yG))*#vdDdG#L zXVBJZp_7Uewe8eDj<(8cWZGI<8=;{Zxt_MlGyq=OsR&HV`0fVc1@$k`1_;hcn0gyw zxPo&K5nnR(mTMq_lAuy?KlQ;{rf$*-TMuv_C9V$7>?gR~8~vEY)V~r@+r;sKE?%?{4U&?y1W&3htDJ@ft$>pps$w zJ5hfn#ywQ*s^>vQ8mxMK#<&`CBg?f9FV}t_4fH_ir=ZlAp*}O<`8st2TB7oW^XZ;K-N6QM?fHJpMXE}1l;!V zurUOJ-dD>8SbABl?K>~RVk3N~dKqZ;EzAS(RO7!6IP&LUL@|34#t6=<*vGt)&-+n? zHA*i$h;tpYPXWs@{1mfg_8?#<7%sB&HhT-O(+uxrxYY2;fLuE9T5g%G&AIQYn+a zH?F13dyK6HKsix7&Q^s)e`@u9mXR?!vekTJj}Z9U6Y{8H$xRzhZTN2t#}l`A$z2;C z&w|_en$-{OZ?xeqRwo?n_BSvb?c2M@XXD%LH`{Q#{da7*-TsXy;3D`#!EHt{*BSG@ zg7>oZmkxZ6t!ErK@3%i4IPbTBtv=|N_uEkiF0!D`Iq+T{tW+4z>WMxg6?DxS2l-4( zWfGE}I<6DxNJ38#sjpBVCLk4aneQoi|emFqCh3zSeU2f6ta=GfePy3~_*sB5Ni$ ztKWLSamstl$9OL@+ltMs`ZbbeflOD5&Oq}NAdo_?_0G{=b3()>GQ!6PSx0vdz5|Jy(}@j Z)7HVm +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** LUA_IGMARK is a mark to ignore all before it when building the +** luaopen_ function name. +*/ +#if !defined (LUA_IGMARK) +#define LUA_IGMARK "-" +#endif + + +/* +** LUA_CSUBSEP is the character that replaces dots in submodule names +** when searching for a C loader. +** LUA_LSUBSEP is the character that replaces dots in submodule names +** when searching for a Lua loader. +*/ +#if !defined(LUA_CSUBSEP) +#define LUA_CSUBSEP LUA_DIRSEP +#endif + +#if !defined(LUA_LSUBSEP) +#define LUA_LSUBSEP LUA_DIRSEP +#endif + + +/* prefix for open functions in C libraries */ +#define LUA_POF "luaopen_" + +/* separator for open functions in C libraries */ +#define LUA_OFSEP "_" + + +/* +** unique key for table in the registry that keeps handles +** for all loaded C libraries +*/ +static const int CLIBS = 0; + +#define LIB_FAIL "open" + + +#define setprogdir(L) ((void)0) + + +/* +** system-dependent functions +*/ + +/* +** unload library 'lib' +*/ +static void lsys_unloadlib (void *lib); + +/* +** load C library in file 'path'. If 'seeglb', load with all names in +** the library global. +** Returns the library; in case of error, returns NULL plus an +** error string in the stack. +*/ +static void *lsys_load (lua_State *L, const char *path, int seeglb); + +/* +** Try to find a function named 'sym' in library 'lib'. +** Returns the function; in case of error, returns NULL plus an +** error string in the stack. +*/ +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym); + + + + +#if defined(LUA_USE_DLOPEN) /* { */ +/* +** {======================================================================== +** This is an implementation of loadlib based on the dlfcn interface. +** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD, +** NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least +** as an emulation layer on top of native functions. +** ========================================================================= +*/ + +#include + +/* +** Macro to convert pointer-to-void* to pointer-to-function. This cast +** is undefined according to ISO C, but POSIX assumes that it works. +** (The '__extension__' in gnu compilers is only to avoid warnings.) +*/ +#if defined(__GNUC__) +#define cast_func(p) (__extension__ (lua_CFunction)(p)) +#else +#define cast_func(p) ((lua_CFunction)(p)) +#endif + + +static void lsys_unloadlib (void *lib) { + dlclose(lib); +} + + +static void *lsys_load (lua_State *L, const char *path, int seeglb) { + void *lib = dlopen(path, RTLD_NOW | (seeglb ? RTLD_GLOBAL : RTLD_LOCAL)); + if (lib == NULL) lua_pushstring(L, dlerror()); + return lib; +} + + +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { + lua_CFunction f = cast_func(dlsym(lib, sym)); + if (f == NULL) lua_pushstring(L, dlerror()); + return f; +} + +/* }====================================================== */ + + + +#elif defined(LUA_DL_DLL) /* }{ */ +/* +** {====================================================================== +** This is an implementation of loadlib for Windows using native functions. +** ======================================================================= +*/ + +#include + + +/* +** optional flags for LoadLibraryEx +*/ +#if !defined(LUA_LLE_FLAGS) +#define LUA_LLE_FLAGS 0 +#endif + + +#undef setprogdir + + +/* +** Replace in the path (on the top of the stack) any occurrence +** of LUA_EXEC_DIR with the executable's path. +*/ +static void setprogdir (lua_State *L) { + char buff[MAX_PATH + 1]; + char *lb; + DWORD nsize = sizeof(buff)/sizeof(char); + DWORD n = GetModuleFileNameA(NULL, buff, nsize); /* get exec. name */ + if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL) + luaL_error(L, "unable to get ModuleFileName"); + else { + *lb = '\0'; /* cut name on the last '\\' to get the path */ + luaL_gsub(L, lua_tostring(L, -1), LUA_EXEC_DIR, buff); + lua_remove(L, -2); /* remove original string */ + } +} + + + + +static void pusherror (lua_State *L) { + int error = GetLastError(); + char buffer[128]; + if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, error, 0, buffer, sizeof(buffer)/sizeof(char), NULL)) + lua_pushstring(L, buffer); + else + lua_pushfstring(L, "system error %d\n", error); +} + +static void lsys_unloadlib (void *lib) { + FreeLibrary((HMODULE)lib); +} + + +static void *lsys_load (lua_State *L, const char *path, int seeglb) { + HMODULE lib = LoadLibraryExA(path, NULL, LUA_LLE_FLAGS); + (void)(seeglb); /* not used: symbols are 'global' by default */ + if (lib == NULL) pusherror(L); + return lib; +} + + +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { + lua_CFunction f = (lua_CFunction)GetProcAddress((HMODULE)lib, sym); + if (f == NULL) pusherror(L); + return f; +} + +/* }====================================================== */ + + +#else /* }{ */ +/* +** {====================================================== +** Fallback for other systems +** ======================================================= +*/ + +#undef LIB_FAIL +#define LIB_FAIL "absent" + + +#define DLMSG "dynamic libraries not enabled; check your Lua installation" + + +static void lsys_unloadlib (void *lib) { + (void)(lib); /* not used */ +} + + +static void *lsys_load (lua_State *L, const char *path, int seeglb) { + (void)(path); (void)(seeglb); /* not used */ + lua_pushliteral(L, DLMSG); + return NULL; +} + + +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { + (void)(lib); (void)(sym); /* not used */ + lua_pushliteral(L, DLMSG); + return NULL; +} + +/* }====================================================== */ +#endif /* } */ + + +/* +** {================================================================== +** Set Paths +** =================================================================== +*/ + +/* +** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment +** variables that Lua check to set its paths. +*/ +#if !defined(LUA_PATH_VAR) +#define LUA_PATH_VAR "LUA_PATH" +#endif + +#if !defined(LUA_CPATH_VAR) +#define LUA_CPATH_VAR "LUA_CPATH" +#endif + + +#define AUXMARK "\1" /* auxiliary mark */ + + +/* +** return registry.LUA_NOENV as a boolean +*/ +static int noenv (lua_State *L) { + int b; + lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); + b = lua_toboolean(L, -1); + lua_pop(L, 1); /* remove value */ + return b; +} + + +/* +** Set a path +*/ +static void setpath (lua_State *L, const char *fieldname, + const char *envname, + const char *dft) { + const char *nver = lua_pushfstring(L, "%s%s", envname, LUA_VERSUFFIX); + const char *path = getenv(nver); /* use versioned name */ + if (path == NULL) /* no environment variable? */ + path = getenv(envname); /* try unversioned name */ + if (path == NULL || noenv(L)) /* no environment variable? */ + lua_pushstring(L, dft); /* use default */ + else { + /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */ + path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP, + LUA_PATH_SEP AUXMARK LUA_PATH_SEP); + luaL_gsub(L, path, AUXMARK, dft); + lua_remove(L, -2); /* remove result from 1st 'gsub' */ + } + setprogdir(L); + lua_setfield(L, -3, fieldname); /* package[fieldname] = path value */ + lua_pop(L, 1); /* pop versioned variable name */ +} + +/* }================================================================== */ + + +/* +** return registry.CLIBS[path] +*/ +static void *checkclib (lua_State *L, const char *path) { + void *plib; + lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS); + lua_getfield(L, -1, path); + plib = lua_touserdata(L, -1); /* plib = CLIBS[path] */ + lua_pop(L, 2); /* pop CLIBS table and 'plib' */ + return plib; +} + + +/* +** registry.CLIBS[path] = plib -- for queries +** registry.CLIBS[#CLIBS + 1] = plib -- also keep a list of all libraries +*/ +static void addtoclib (lua_State *L, const char *path, void *plib) { + lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS); + lua_pushlightuserdata(L, plib); + lua_pushvalue(L, -1); + lua_setfield(L, -3, path); /* CLIBS[path] = plib */ + lua_rawseti(L, -2, luaL_len(L, -2) + 1); /* CLIBS[#CLIBS + 1] = plib */ + lua_pop(L, 1); /* pop CLIBS table */ +} + + +/* +** __gc tag method for CLIBS table: calls 'lsys_unloadlib' for all lib +** handles in list CLIBS +*/ +static int gctm (lua_State *L) { + lua_Integer n = luaL_len(L, 1); + for (; n >= 1; n--) { /* for each handle, in reverse order */ + lua_rawgeti(L, 1, n); /* get handle CLIBS[n] */ + lsys_unloadlib(lua_touserdata(L, -1)); + lua_pop(L, 1); /* pop handle */ + } + return 0; +} + + + +/* error codes for 'lookforfunc' */ +#define ERRLIB 1 +#define ERRFUNC 2 + +/* +** Look for a C function named 'sym' in a dynamically loaded library +** 'path'. +** First, check whether the library is already loaded; if not, try +** to load it. +** Then, if 'sym' is '*', return true (as library has been loaded). +** Otherwise, look for symbol 'sym' in the library and push a +** C function with that symbol. +** Return 0 and 'true' or a function in the stack; in case of +** errors, return an error code and an error message in the stack. +*/ +static int lookforfunc (lua_State *L, const char *path, const char *sym) { + void *reg = checkclib(L, path); /* check loaded C libraries */ + if (reg == NULL) { /* must load library? */ + reg = lsys_load(L, path, *sym == '*'); /* global symbols if 'sym'=='*' */ + if (reg == NULL) return ERRLIB; /* unable to load library */ + addtoclib(L, path, reg); + } + if (*sym == '*') { /* loading only library (no function)? */ + lua_pushboolean(L, 1); /* return 'true' */ + return 0; /* no errors */ + } + else { + lua_CFunction f = lsys_sym(L, reg, sym); + if (f == NULL) + return ERRFUNC; /* unable to find function */ + lua_pushcfunction(L, f); /* else create new function */ + return 0; /* no errors */ + } +} + + +static int ll_loadlib (lua_State *L) { + const char *path = luaL_checkstring(L, 1); + const char *init = luaL_checkstring(L, 2); + int stat = lookforfunc(L, path, init); + if (stat == 0) /* no errors? */ + return 1; /* return the loaded function */ + else { /* error; error message is on stack top */ + lua_pushnil(L); + lua_insert(L, -2); + lua_pushstring(L, (stat == ERRLIB) ? LIB_FAIL : "init"); + return 3; /* return nil, error message, and where */ + } +} + + + +/* +** {====================================================== +** 'require' function +** ======================================================= +*/ + + +static int readable (const char *filename) { + FILE *f = fopen(filename, "r"); /* try to open file */ + if (f == NULL) return 0; /* open failed */ + fclose(f); + return 1; +} + + +static const char *pushnextfilename (lua_State *L, const char *path) { + const char *l; + if (*path == *LUA_PATH_SEP) + path++; /* skip separator */ + if (*path == '\0') + return NULL; /* no more names */ + l = strchr(path, *LUA_PATH_SEP); /* find next separator */ + if (l == NULL) /* no more separators? */ + l = path + strlen(path); /* go until the end */ + lua_pushlstring(L, path, l - path); /* file name */ + return l; /* rest of the path */ +} + + +/* +** Given a path such as ";blabla.so;blublu.so", pushes the string +** +** no file 'blabla.so' +** no file 'blublu.so' +*/ +static void pusherrornotfound (lua_State *L, const char *path) { + if (*path == *LUA_PATH_SEP) + path++; /* skip separator */ + lua_pushstring(L, "\n\tno file '"); + luaL_gsub(L, path, LUA_PATH_SEP, "'\n\tno file '"); + lua_pushstring(L, "'"); + lua_concat(L, 3); +} + + +static const char *searchpath (lua_State *L, const char *name, + const char *path, + const char *sep, + const char *dirsep) { + /* separator is non-empty and appears in 'name'? */ + if (*sep != '\0' && strchr(name, *sep) != NULL) + name = luaL_gsub(L, name, sep, dirsep); /* replace it by 'dirsep' */ + /* replace marks ('?') in 'path' by the file name */ + path = luaL_gsub(L, path, LUA_PATH_MARK, name); + while ((path = pushnextfilename(L, path)) != NULL) { + const char *filename = lua_tostring(L, -1); + if (readable(filename)) /* does file exist and is readable? */ + return filename; /* return that file name */ + lua_pop(L, 1); /* else remove file name */ + } + pusherrornotfound(L, lua_tostring(L, -1)); /* create error message */ + return NULL; /* not found */ +} + + +static int ll_searchpath (lua_State *L) { + const char *f = searchpath(L, luaL_checkstring(L, 1), + luaL_checkstring(L, 2), + luaL_optstring(L, 3, "."), + luaL_optstring(L, 4, LUA_DIRSEP)); + if (f != NULL) return 1; + else { /* error message is on top of the stack */ + lua_pushnil(L); + lua_insert(L, -2); + return 2; /* return nil + error message */ + } +} + + +static const char *findfile (lua_State *L, const char *name, + const char *pname, + const char *dirsep) { + const char *path; + lua_getfield(L, lua_upvalueindex(1), pname); + path = lua_tostring(L, -1); + if (path == NULL) + luaL_error(L, "'package.%s' must be a string", pname); + return searchpath(L, name, path, ".", dirsep); +} + + +static int checkload (lua_State *L, int stat, const char *filename) { + if (stat) { /* module loaded successfully? */ + lua_pushstring(L, filename); /* will be 2nd argument to module */ + return 2; /* return open function and file name */ + } + else + return luaL_error(L, "error loading module '%s' from file '%s':\n\t%s", + lua_tostring(L, 1), filename, lua_tostring(L, -1)); +} + + +static int searcher_Lua (lua_State *L) { + const char *filename; + const char *name = luaL_checkstring(L, 1); + filename = findfile(L, name, "path", LUA_LSUBSEP); + if (filename == NULL) return 1; /* module not found in this path */ + return checkload(L, (luaL_loadfile(L, filename) == LUA_OK), filename); +} + + +/* +** Try to find a load function for module 'modname' at file 'filename'. +** First, change '.' to '_' in 'modname'; then, if 'modname' has +** the form X-Y (that is, it has an "ignore mark"), build a function +** name "luaopen_X" and look for it. (For compatibility, if that +** fails, it also tries "luaopen_Y".) If there is no ignore mark, +** look for a function named "luaopen_modname". +*/ +static int loadfunc (lua_State *L, const char *filename, const char *modname) { + const char *openfunc; + const char *mark; + modname = luaL_gsub(L, modname, ".", LUA_OFSEP); + mark = strchr(modname, *LUA_IGMARK); + if (mark) { + int stat; + openfunc = lua_pushlstring(L, modname, mark - modname); + openfunc = lua_pushfstring(L, LUA_POF"%s", openfunc); + stat = lookforfunc(L, filename, openfunc); + if (stat != ERRFUNC) return stat; + modname = mark + 1; /* else go ahead and try old-style name */ + } + openfunc = lua_pushfstring(L, LUA_POF"%s", modname); + return lookforfunc(L, filename, openfunc); +} + + +static int searcher_C (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + const char *filename = findfile(L, name, "cpath", LUA_CSUBSEP); + if (filename == NULL) return 1; /* module not found in this path */ + return checkload(L, (loadfunc(L, filename, name) == 0), filename); +} + + +static int searcher_Croot (lua_State *L) { + const char *filename; + const char *name = luaL_checkstring(L, 1); + const char *p = strchr(name, '.'); + int stat; + if (p == NULL) return 0; /* is root */ + lua_pushlstring(L, name, p - name); + filename = findfile(L, lua_tostring(L, -1), "cpath", LUA_CSUBSEP); + if (filename == NULL) return 1; /* root not found */ + if ((stat = loadfunc(L, filename, name)) != 0) { + if (stat != ERRFUNC) + return checkload(L, 0, filename); /* real error */ + else { /* open function not found */ + lua_pushfstring(L, "\n\tno module '%s' in file '%s'", name, filename); + return 1; + } + } + lua_pushstring(L, filename); /* will be 2nd argument to module */ + return 2; +} + + +static int searcher_preload (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + lua_getfield(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); + if (lua_getfield(L, -1, name) == LUA_TNIL) /* not found? */ + lua_pushfstring(L, "\n\tno field package.preload['%s']", name); + return 1; +} + + +static void findloader (lua_State *L, const char *name) { + int i; + luaL_Buffer msg; /* to build error message */ + /* push 'package.searchers' to index 3 in the stack */ + if (lua_getfield(L, lua_upvalueindex(1), "searchers") != LUA_TTABLE) + luaL_error(L, "'package.searchers' must be a table"); + luaL_buffinit(L, &msg); + /* iterate over available searchers to find a loader */ + for (i = 1; ; i++) { + if (lua_rawgeti(L, 3, i) == LUA_TNIL) { /* no more searchers? */ + lua_pop(L, 1); /* remove nil */ + luaL_pushresult(&msg); /* create error message */ + luaL_error(L, "module '%s' not found:%s", name, lua_tostring(L, -1)); + } + lua_pushstring(L, name); + lua_call(L, 1, 2); /* call it */ + if (lua_isfunction(L, -2)) /* did it find a loader? */ + return; /* module loader found */ + else if (lua_isstring(L, -2)) { /* searcher returned error message? */ + lua_pop(L, 1); /* remove extra return */ + luaL_addvalue(&msg); /* concatenate error message */ + } + else + lua_pop(L, 2); /* remove both returns */ + } +} + + +static int ll_require (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + lua_settop(L, 1); /* LOADED table will be at index 2 */ + lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + lua_getfield(L, 2, name); /* LOADED[name] */ + if (lua_toboolean(L, -1)) /* is it there? */ + return 1; /* package is already loaded */ + /* else must load package */ + lua_pop(L, 1); /* remove 'getfield' result */ + findloader(L, name); + lua_pushstring(L, name); /* pass name as argument to module loader */ + lua_insert(L, -2); /* name is 1st argument (before search data) */ + lua_call(L, 2, 1); /* run loader to load module */ + if (!lua_isnil(L, -1)) /* non-nil return? */ + lua_setfield(L, 2, name); /* LOADED[name] = returned value */ + if (lua_getfield(L, 2, name) == LUA_TNIL) { /* module set no value? */ + lua_pushboolean(L, 1); /* use true as result */ + lua_pushvalue(L, -1); /* extra copy to be returned */ + lua_setfield(L, 2, name); /* LOADED[name] = true */ + } + return 1; +} + +/* }====================================================== */ + + + + +static const luaL_Reg pk_funcs[] = { + {"loadlib", ll_loadlib}, + {"searchpath", ll_searchpath}, + /* placeholders */ + {"preload", NULL}, + {"cpath", NULL}, + {"path", NULL}, + {"searchers", NULL}, + {"loaded", NULL}, + {NULL, NULL} +}; + + +static const luaL_Reg ll_funcs[] = { + {"require", ll_require}, + {NULL, NULL} +}; + + +static void createsearcherstable (lua_State *L) { + static const lua_CFunction searchers[] = + {searcher_preload, searcher_Lua, searcher_C, searcher_Croot, NULL}; + int i; + /* create 'searchers' table */ + lua_createtable(L, sizeof(searchers)/sizeof(searchers[0]) - 1, 0); + /* fill it with predefined searchers */ + for (i=0; searchers[i] != NULL; i++) { + lua_pushvalue(L, -2); /* set 'package' as upvalue for all searchers */ + lua_pushcclosure(L, searchers[i], 1); + lua_rawseti(L, -2, i+1); + } + lua_setfield(L, -2, "searchers"); /* put it in field 'searchers' */ +} + + +/* +** create table CLIBS to keep track of loaded C libraries, +** setting a finalizer to close all libraries when closing state. +*/ +static void createclibstable (lua_State *L) { + lua_newtable(L); /* create CLIBS table */ + lua_createtable(L, 0, 1); /* create metatable for CLIBS */ + lua_pushcfunction(L, gctm); + lua_setfield(L, -2, "__gc"); /* set finalizer for CLIBS table */ + lua_setmetatable(L, -2); + lua_rawsetp(L, LUA_REGISTRYINDEX, &CLIBS); /* set CLIBS table in registry */ +} + + +LUAMOD_API int luaopen_package (lua_State *L) { + createclibstable(L); + luaL_newlib(L, pk_funcs); /* create 'package' table */ + createsearcherstable(L); + /* set paths */ + setpath(L, "path", LUA_PATH_VAR, LUA_PATH_DEFAULT); + setpath(L, "cpath", LUA_CPATH_VAR, LUA_CPATH_DEFAULT); + /* store config information */ + lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n" + LUA_EXEC_DIR "\n" LUA_IGMARK "\n"); + lua_setfield(L, -2, "config"); + /* set field 'loaded' */ + luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + lua_setfield(L, -2, "loaded"); + /* set field 'preload' */ + luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); + lua_setfield(L, -2, "preload"); + lua_pushglobaltable(L); + lua_pushvalue(L, -2); /* set 'package' as upvalue for next lib */ + luaL_setfuncs(L, ll_funcs, 1); /* open lib into global table */ + lua_pop(L, 1); /* pop global table */ + return 1; /* return 'package' table */ +} + diff --git a/source/lua/loadlib.o b/source/lua/loadlib.o new file mode 100644 index 0000000000000000000000000000000000000000..59b048c0fb0afee7dd97b6ac2d30dfa0f369c1ce GIT binary patch literal 15248 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 XrNcWuUi)Sn|CUQk|Fxb*@A&@%a)8BL literal 0 HcmV?d00001 diff --git a/source/lua/lobject.c b/source/lua/lobject.c new file mode 100644 index 0000000..5d340de --- /dev/null +++ b/source/lua/lobject.c @@ -0,0 +1,520 @@ +/* +** $Id: lobject.c $ +** Some generic functions over Lua objects +** See Copyright Notice in lua.h +*/ + +#define lobject_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lctype.h" +#include "ldebug.h" +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "lvm.h" + + +/* +** converts an integer to a "floating point byte", represented as +** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if +** eeeee != 0 and (xxx) otherwise. +*/ +int luaO_int2fb (unsigned int x) { + int e = 0; /* exponent */ + if (x < 8) return x; + while (x >= (8 << 4)) { /* coarse steps */ + x = (x + 0xf) >> 4; /* x = ceil(x / 16) */ + e += 4; + } + while (x >= (8 << 1)) { /* fine steps */ + x = (x + 1) >> 1; /* x = ceil(x / 2) */ + e++; + } + return ((e+1) << 3) | (cast_int(x) - 8); +} + + +/* converts back */ +int luaO_fb2int (int x) { + return (x < 8) ? x : ((x & 7) + 8) << ((x >> 3) - 1); +} + + +/* +** Computes ceil(log2(x)) +*/ +int luaO_ceillog2 (unsigned int x) { + static const lu_byte log_2[256] = { /* log_2[i] = ceil(log2(i - 1)) */ + 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 = 0; + x--; + while (x >= 256) { l += 8; x >>= 8; } + return l + log_2[x]; +} + + +static lua_Integer intarith (lua_State *L, int op, lua_Integer v1, + lua_Integer v2) { + switch (op) { + case LUA_OPADD: return intop(+, v1, v2); + case LUA_OPSUB:return intop(-, v1, v2); + case LUA_OPMUL:return intop(*, v1, v2); + case LUA_OPMOD: return luaV_mod(L, v1, v2); + case LUA_OPIDIV: return luaV_idiv(L, v1, v2); + case LUA_OPBAND: return intop(&, v1, v2); + case LUA_OPBOR: return intop(|, v1, v2); + case LUA_OPBXOR: return intop(^, v1, v2); + case LUA_OPSHL: return luaV_shiftl(v1, v2); + case LUA_OPSHR: return luaV_shiftl(v1, -v2); + case LUA_OPUNM: return intop(-, 0, v1); + case LUA_OPBNOT: return intop(^, ~l_castS2U(0), v1); + default: lua_assert(0); return 0; + } +} + + +static lua_Number numarith (lua_State *L, int op, lua_Number v1, + lua_Number v2) { + switch (op) { + case LUA_OPADD: return luai_numadd(L, v1, v2); + case LUA_OPSUB: return luai_numsub(L, v1, v2); + case LUA_OPMUL: return luai_nummul(L, v1, v2); + case LUA_OPDIV: return luai_numdiv(L, v1, v2); + case LUA_OPPOW: return luai_numpow(L, v1, v2); + case LUA_OPIDIV: return luai_numidiv(L, v1, v2); + case LUA_OPUNM: return luai_numunm(L, v1); + case LUA_OPMOD: return luaV_modf(L, v1, v2); + default: lua_assert(0); return 0; + } +} + + +int luaO_rawarith (lua_State *L, int op, const TValue *p1, const TValue *p2, + TValue *res) { + switch (op) { + case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR: + case LUA_OPSHL: case LUA_OPSHR: + case LUA_OPBNOT: { /* operate only on integers */ + lua_Integer i1; lua_Integer i2; + if (tointegerns(p1, &i1) && tointegerns(p2, &i2)) { + setivalue(res, intarith(L, op, i1, i2)); + return 1; + } + else return 0; /* fail */ + } + case LUA_OPDIV: case LUA_OPPOW: { /* operate only on floats */ + lua_Number n1; lua_Number n2; + if (tonumberns(p1, n1) && tonumberns(p2, n2)) { + setfltvalue(res, numarith(L, op, n1, n2)); + return 1; + } + else return 0; /* fail */ + } + default: { /* other operations */ + lua_Number n1; lua_Number n2; + if (ttisinteger(p1) && ttisinteger(p2)) { + setivalue(res, intarith(L, op, ivalue(p1), ivalue(p2))); + return 1; + } + else if (tonumberns(p1, n1) && tonumberns(p2, n2)) { + setfltvalue(res, numarith(L, op, n1, n2)); + return 1; + } + else return 0; /* fail */ + } + } +} + + +void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2, + StkId res) { + if (!luaO_rawarith(L, op, p1, p2, s2v(res))) { + /* could not perform raw operation; try metamethod */ + luaT_trybinTM(L, p1, p2, res, cast(TMS, (op - LUA_OPADD) + TM_ADD)); + } +} + + +int luaO_hexavalue (int c) { + if (lisdigit(c)) return c - '0'; + else return (ltolower(c) - 'a') + 10; +} + + +static int isneg (const char **s) { + if (**s == '-') { (*s)++; return 1; } + else if (**s == '+') (*s)++; + return 0; +} + + + +/* +** {================================================================== +** Lua's implementation for 'lua_strx2number' +** =================================================================== +*/ + +#if !defined(lua_strx2number) + +/* maximum number of significant digits to read (to avoid overflows + even with single floats) */ +#define MAXSIGDIG 30 + +/* +** convert a hexadecimal numeric string to a number, following +** C99 specification for 'strtod' +*/ +static lua_Number lua_strx2number (const char *s, char **endptr) { + int dot = lua_getlocaledecpoint(); + lua_Number r = 0.0; /* result (accumulator) */ + int sigdig = 0; /* number of significant digits */ + int nosigdig = 0; /* number of non-significant digits */ + int e = 0; /* exponent correction */ + int neg; /* 1 if number is negative */ + int hasdot = 0; /* true after seen a dot */ + *endptr = cast_charp(s); /* nothing is valid yet */ + while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */ + neg = isneg(&s); /* check sign */ + if (!(*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X'))) /* check '0x' */ + return 0.0; /* invalid format (no '0x') */ + for (s += 2; ; s++) { /* skip '0x' and read numeral */ + if (*s == dot) { + if (hasdot) break; /* second dot? stop loop */ + else hasdot = 1; + } + else if (lisxdigit(cast_uchar(*s))) { + if (sigdig == 0 && *s == '0') /* non-significant digit (zero)? */ + nosigdig++; + else if (++sigdig <= MAXSIGDIG) /* can read it without overflow? */ + r = (r * cast_num(16.0)) + luaO_hexavalue(*s); + else e++; /* too many digits; ignore, but still count for exponent */ + if (hasdot) e--; /* decimal digit? correct exponent */ + } + else break; /* neither a dot nor a digit */ + } + if (nosigdig + sigdig == 0) /* no digits? */ + return 0.0; /* invalid format */ + *endptr = cast_charp(s); /* valid up to here */ + e *= 4; /* each digit multiplies/divides value by 2^4 */ + if (*s == 'p' || *s == 'P') { /* exponent part? */ + int exp1 = 0; /* exponent value */ + int neg1; /* exponent sign */ + s++; /* skip 'p' */ + neg1 = isneg(&s); /* sign */ + if (!lisdigit(cast_uchar(*s))) + return 0.0; /* invalid; must have at least one digit */ + while (lisdigit(cast_uchar(*s))) /* read exponent */ + exp1 = exp1 * 10 + *(s++) - '0'; + if (neg1) exp1 = -exp1; + e += exp1; + *endptr = cast_charp(s); /* valid up to here */ + } + if (neg) r = -r; + return l_mathop(ldexp)(r, e); +} + +#endif +/* }====================================================== */ + + +/* maximum length of a numeral */ +#if !defined (L_MAXLENNUM) +#define L_MAXLENNUM 200 +#endif + +static const char *l_str2dloc (const char *s, lua_Number *result, int mode) { + char *endptr; + *result = (mode == 'x') ? lua_strx2number(s, &endptr) /* try to convert */ + : lua_str2number(s, &endptr); + if (endptr == s) return NULL; /* nothing recognized? */ + while (lisspace(cast_uchar(*endptr))) endptr++; /* skip trailing spaces */ + return (*endptr == '\0') ? endptr : NULL; /* OK if no trailing characters */ +} + + +/* +** Convert string 's' to a Lua number (put in 'result'). Return NULL +** on fail or the address of the ending '\0' on success. +** 'pmode' points to (and 'mode' contains) special things in the string: +** - 'x'/'X' means a hexadecimal numeral +** - 'n'/'N' means 'inf' or 'nan' (which should be rejected) +** - '.' just optimizes the search for the common case (nothing special) +** This function accepts both the current locale or a dot as the radix +** mark. If the conversion fails, it may mean number has a dot but +** locale accepts something else. In that case, the code copies 's' +** to a buffer (because 's' is read-only), changes the dot to the +** current locale radix mark, and tries to convert again. +*/ +static const char *l_str2d (const char *s, lua_Number *result) { + const char *endptr; + const char *pmode = strpbrk(s, ".xXnN"); + int mode = pmode ? ltolower(cast_uchar(*pmode)) : 0; + if (mode == 'n') /* reject 'inf' and 'nan' */ + return NULL; + endptr = l_str2dloc(s, result, mode); /* try to convert */ + if (endptr == NULL) { /* failed? may be a different locale */ + char buff[L_MAXLENNUM + 1]; + const char *pdot = strchr(s, '.'); + if (strlen(s) > L_MAXLENNUM || pdot == NULL) + return NULL; /* string too long or no dot; fail */ + strcpy(buff, s); /* copy string to buffer */ + buff[pdot - s] = lua_getlocaledecpoint(); /* correct decimal point */ + endptr = l_str2dloc(buff, result, mode); /* try again */ + if (endptr != NULL) + endptr = s + (endptr - buff); /* make relative to 's' */ + } + return endptr; +} + + +#define MAXBY10 cast(lua_Unsigned, LUA_MAXINTEGER / 10) +#define MAXLASTD cast_int(LUA_MAXINTEGER % 10) + +static const char *l_str2int (const char *s, lua_Integer *result) { + lua_Unsigned a = 0; + int empty = 1; + int neg; + while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */ + neg = isneg(&s); + if (s[0] == '0' && + (s[1] == 'x' || s[1] == 'X')) { /* hex? */ + s += 2; /* skip '0x' */ + for (; lisxdigit(cast_uchar(*s)); s++) { + a = a * 16 + luaO_hexavalue(*s); + empty = 0; + } + } + else { /* decimal */ + for (; lisdigit(cast_uchar(*s)); s++) { + int d = *s - '0'; + if (a >= MAXBY10 && (a > MAXBY10 || d > MAXLASTD + neg)) /* overflow? */ + return NULL; /* do not accept it (as integer) */ + a = a * 10 + d; + empty = 0; + } + } + while (lisspace(cast_uchar(*s))) s++; /* skip trailing spaces */ + if (empty || *s != '\0') return NULL; /* something wrong in the numeral */ + else { + *result = l_castU2S((neg) ? 0u - a : a); + return s; + } +} + + +size_t luaO_str2num (const char *s, TValue *o) { + lua_Integer i; lua_Number n; + const char *e; + if ((e = l_str2int(s, &i)) != NULL) { /* try as an integer */ + setivalue(o, i); + } + else if ((e = l_str2d(s, &n)) != NULL) { /* else try as a float */ + setfltvalue(o, n); + } + else + return 0; /* conversion failed */ + return (e - s) + 1; /* success; return string size */ +} + + +int luaO_utf8esc (char *buff, unsigned long x) { + int n = 1; /* number of bytes put in buffer (backwards) */ + lua_assert(x <= 0x7FFFFFFFu); + if (x < 0x80) /* ascii? */ + buff[UTF8BUFFSZ - 1] = cast_char(x); + else { /* need continuation bytes */ + unsigned int mfb = 0x3f; /* maximum that fits in first byte */ + do { /* add continuation bytes */ + buff[UTF8BUFFSZ - (n++)] = cast_char(0x80 | (x & 0x3f)); + x >>= 6; /* remove added bits */ + mfb >>= 1; /* now there is one less bit available in first byte */ + } while (x > mfb); /* still needs continuation byte? */ + buff[UTF8BUFFSZ - n] = cast_char((~mfb << 1) | x); /* add first byte */ + } + return n; +} + + +/* maximum length of the conversion of a number to a string */ +#define MAXNUMBER2STR 50 + + +/* +** Convert a number object to a string +*/ +void luaO_tostring (lua_State *L, TValue *obj) { + char buff[MAXNUMBER2STR]; + size_t len; + lua_assert(ttisnumber(obj)); + if (ttisinteger(obj)) + len = lua_integer2str(buff, sizeof(buff), ivalue(obj)); + else { + len = lua_number2str(buff, sizeof(buff), fltvalue(obj)); + if (buff[strspn(buff, "-0123456789")] == '\0') { /* looks like an int? */ + buff[len++] = lua_getlocaledecpoint(); + buff[len++] = '0'; /* adds '.0' to result */ + } + } + setsvalue(L, obj, luaS_newlstr(L, buff, len)); +} + + +static void pushstr (lua_State *L, const char *str, size_t l) { + setsvalue2s(L, L->top, luaS_newlstr(L, str, l)); + L->top++; +} + + +/* +** this function handles only '%d', '%c', '%f', '%p', and '%s' + conventional formats, plus Lua-specific '%I' and '%U' +*/ +const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { + int n = 0; /* number of strings in the stack to concatenate */ + const char *e; /* points to next conversion specifier */ + while ((e = strchr(fmt, '%')) != NULL) { + pushstr(L, fmt, e - fmt); /* string up to conversion specifier */ + switch (*(e+1)) { + case 's': { /* zero-terminated string */ + const char *s = va_arg(argp, char *); + if (s == NULL) s = "(null)"; + pushstr(L, s, strlen(s)); + break; + } + case 'c': { /* an 'int' as a character */ + char buff = cast_char(va_arg(argp, int)); + if (lisprint(cast_uchar(buff))) + pushstr(L, &buff, 1); + else /* non-printable character; print its code */ + luaO_pushfstring(L, "<\\%d>", cast_uchar(buff)); + break; + } + case 'd': { /* an 'int' */ + setivalue(s2v(L->top), va_arg(argp, int)); + goto top2str; + } + case 'I': { /* a 'lua_Integer' */ + setivalue(s2v(L->top), cast(lua_Integer, va_arg(argp, l_uacInt))); + goto top2str; + } + case 'f': { /* a 'lua_Number' */ + setfltvalue(s2v(L->top), cast_num(va_arg(argp, l_uacNumber))); + top2str: /* convert the top element to a string */ + L->top++; + luaO_tostring(L, s2v(L->top - 1)); + break; + } + case 'p': { /* a pointer */ + char buff[4*sizeof(void *) + 8]; /* should be enough space for a '%p' */ + void *p = va_arg(argp, void *); + int l = lua_pointer2str(buff, sizeof(buff), p); + pushstr(L, buff, l); + break; + } + case 'U': { /* a 'long' as a UTF-8 sequence */ + char buff[UTF8BUFFSZ]; + int l = luaO_utf8esc(buff, va_arg(argp, long)); + pushstr(L, buff + UTF8BUFFSZ - l, l); + break; + } + case '%': { + pushstr(L, "%", 1); + break; + } + default: { + luaG_runerror(L, "invalid option '%%%c' to 'lua_pushfstring'", + *(e + 1)); + } + } + n += 2; + if (L->top + 2 > L->stack_last) { /* no free stack space? */ + luaV_concat(L, n); + n = 1; + } + fmt = e + 2; + } + pushstr(L, fmt, strlen(fmt)); + if (n > 0) luaV_concat(L, n + 1); + return svalue(s2v(L->top - 1)); +} + + +const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) { + const char *msg; + va_list argp; + va_start(argp, fmt); + msg = luaO_pushvfstring(L, fmt, argp); + va_end(argp); + return msg; +} + + +/* number of chars of a literal string without the ending \0 */ +#define LL(x) (sizeof(x)/sizeof(char) - 1) + +#define RETS "..." +#define PRE "[string \"" +#define POS "\"]" + +#define addstr(a,b,l) ( memcpy(a,b,(l) * sizeof(char)), a += (l) ) + +void luaO_chunkid (char *out, const char *source, size_t bufflen) { + size_t l = strlen(source); + if (*source == '=') { /* 'literal' source */ + if (l <= bufflen) /* small enough? */ + memcpy(out, source + 1, l * sizeof(char)); + else { /* truncate it */ + addstr(out, source + 1, bufflen - 1); + *out = '\0'; + } + } + else if (*source == '@') { /* file name */ + if (l <= bufflen) /* small enough? */ + memcpy(out, source + 1, l * sizeof(char)); + else { /* add '...' before rest of name */ + addstr(out, RETS, LL(RETS)); + bufflen -= LL(RETS); + memcpy(out, source + 1 + l - bufflen, bufflen * sizeof(char)); + } + } + else { /* string; format as [string "source"] */ + const char *nl = strchr(source, '\n'); /* find first new line (if any) */ + addstr(out, PRE, LL(PRE)); /* add prefix */ + bufflen -= LL(PRE RETS POS) + 1; /* save space for prefix+suffix+'\0' */ + if (l < bufflen && nl == NULL) { /* small one-line source? */ + addstr(out, source, l); /* keep it */ + } + else { + if (nl != NULL) l = nl - source; /* stop at first newline */ + if (l > bufflen) l = bufflen; + addstr(out, source, l); + addstr(out, RETS, LL(RETS)); + } + memcpy(out, POS, (LL(POS) + 1) * sizeof(char)); + } +} + diff --git a/source/lua/lobject.h b/source/lua/lobject.h new file mode 100644 index 0000000..9e0f181 --- /dev/null +++ b/source/lua/lobject.h @@ -0,0 +1,757 @@ +/* +** $Id: lobject.h $ +** Type definitions for Lua objects +** See Copyright Notice in lua.h +*/ + + +#ifndef lobject_h +#define lobject_h + + +#include + + +#include "llimits.h" +#include "lua.h" + + +/* +** Extra tags for non-values +*/ +#define LUA_TUPVAL LUA_NUMTAGS /* upvalues */ +#define LUA_TPROTO (LUA_NUMTAGS+1) /* function prototypes */ + +/* +** number of all possible tags (including LUA_TNONE) +*/ +#define LUA_TOTALTAGS (LUA_TPROTO + 2) + + +/* +** tags for Tagged Values have the following use of bits: +** bits 0-3: actual tag (a LUA_T* value) +** bits 4-5: variant bits +** bit 6: whether value is collectable +*/ + + + +/* +** Union of all Lua values +*/ +typedef union Value { + struct GCObject *gc; /* collectable objects */ + void *p; /* light userdata */ + int b; /* booleans */ + lua_CFunction f; /* light C functions */ + lua_Integer i; /* integer numbers */ + lua_Number n; /* float numbers */ +} Value; + + +/* +** Tagged Values. This is the basic representation of values in Lua: +** an actual value plus a tag with its type. +*/ + +#define TValuefields Value value_; lu_byte tt_ + +typedef struct TValue { + //TValuefields; + uint32_t tt_; + uint32_t unk; + Value value_; +} TValue; + + +#define val_(o) ((o)->value_) +#define valraw(o) (&val_(o)) + + +/* raw type tag of a TValue */ +#define rawtt(o) ((o)->tt_) + +/* tag with no variants (bits 0-3) */ +#define novariant(t) ((t) & 0x0F) + +/* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */ +#define withvariant(t) ((t) & 0x3F) +#define ttypetag(o) withvariant(rawtt(o)) + +/* type of a TValue */ +#define ttype(o) (novariant(rawtt(o))) + + +/* Macros to test type */ +#define checktag(o,t) (rawtt(o) == (t)) +#define checktype(o,t) (ttype(o) == (t)) + + +/* Macros for internal tests */ +#define righttt(obj) (ttypetag(obj) == gcvalue(obj)->tt) + +#define checkliveness(L,obj) \ + lua_longassert(!iscollectable(obj) || \ + (righttt(obj) && (L == NULL || !isdead(G(L),gcvalue(obj))))) + + +/* Macros to set values */ +#define settt_(o,t) ((o)->tt_=(t)) + + +#define setobj(L,obj1,obj2) \ + { TValue *io1=(obj1); const TValue *io2=(obj2); \ + io1->value_ = io2->value_; io1->tt_ = io2->tt_; \ + (void)L; checkliveness(L,io1); lua_assert(!isreallyempty(io1)); } + +/* +** different types of assignments, according to destination +*/ + +/* from stack to stack */ +#define setobjs2s(L,o1,o2) setobj(L,s2v(o1),s2v(o2)) +/* to stack (not from same stack) */ +#define setobj2s(L,o1,o2) setobj(L,s2v(o1),o2) +/* from table to same table */ +#define setobjt2t setobj +/* to new object */ +#define setobj2n setobj +/* to table */ +#define setobj2t setobj + + + +typedef union StackValue { + TValue val; +} StackValue; + + +typedef StackValue *StkId; /* index to stack elements */ + +/* convert a 'StackValue' to a 'TValue' */ +#define s2v(o) (&(o)->val) + + + +/* +** {================================================================== +** Nil +** =================================================================== +*/ + +/* macro to test for (any kind of) nil */ +#define ttisnil(v) checktype((v), LUA_TNIL) + +/* macro to test for a "pure" nil */ +#define ttisstrictnil(o) checktag((o), LUA_TNIL) + + +#define setnilvalue(obj) settt_(obj, LUA_TNIL) + + +/* +** Variant tag, used only in tables to signal an empty slot +** (which might be different from a slot containing nil) +*/ +#define LUA_TEMPTY (LUA_TNIL | (1 << 4)) + +/* +** Variant used only in the value returned for a key not found in a +** table (absent key). +*/ +#define LUA_TABSTKEY (LUA_TNIL | (2 << 4)) + + +#define isabstkey(v) checktag((v), LUA_TABSTKEY) + + +/* +** macro to detect non-standard nils (used only in assertions) +*/ +#define isreallyempty(v) (ttisnil(v) && !ttisstrictnil(v)) + + +/* +** By default, entries with any kind of nil are considered empty. +** (In any definition, values associated with absent keys must also +** be accepted as empty.) +*/ +#define isempty(v) ttisnil(v) + + +/* macro defining a value corresponding to an absent key */ +#define ABSTKEYCONSTANT {NULL}, LUA_TABSTKEY + + +/* mark an entry as empty */ +#define setempty(v) settt_(v, LUA_TEMPTY) + + + +/* }================================================================== */ + + +/* +** {================================================================== +** Booleans +** =================================================================== +*/ + +#define ttisboolean(o) checktag((o), LUA_TBOOLEAN) + +#define bvalue(o) check_exp(ttisboolean(o), val_(o).b) + +#define bvalueraw(v) ((v).b) + +#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) + +#define setbvalue(obj,x) \ + { TValue *io=(obj); val_(io).b=(x); settt_(io, LUA_TBOOLEAN); } + +/* }================================================================== */ + + +/* +** {================================================================== +** Threads +** =================================================================== +*/ + +#define ttisthread(o) checktag((o), ctb(LUA_TTHREAD)) + +#define thvalue(o) check_exp(ttisthread(o), gco2th(val_(o).gc)) + +#define setthvalue(L,obj,x) \ + { TValue *io = (obj); lua_State *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTHREAD)); \ + checkliveness(L,io); } + +#define setthvalue2s(L,o,t) setthvalue(L,s2v(o),t) + +/* }================================================================== */ + + +/* +** {================================================================== +** Collectable Objects +** =================================================================== +*/ + +/* +** Common Header for all collectable objects (in macro form, to be +** included in other objects) +*/ +#define CommonHeader struct GCObject *next; lu_byte tt; lu_byte marked + + +/* Common type for all collectable objects */ +typedef struct GCObject { + CommonHeader; +} GCObject; + + +/* Bit mark for collectable types */ +#define BIT_ISCOLLECTABLE (1 << 6) + +#define iscollectable(o) (rawtt(o) & BIT_ISCOLLECTABLE) + +/* mark a tag as collectable */ +#define ctb(t) ((t) | BIT_ISCOLLECTABLE) + +#define gcvalue(o) check_exp(iscollectable(o), val_(o).gc) + +#define gcvalueraw(v) ((v).gc) + +#define setgcovalue(L,obj,x) \ + { TValue *io = (obj); GCObject *i_g=(x); \ + val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); } + +/* }================================================================== */ + + +/* +** {================================================================== +** Numbers +** =================================================================== +*/ + +/* Variant tags for numbers */ +#define LUA_TNUMFLT (LUA_TNUMBER | (1 << 4)) /* float numbers */ +#define LUA_TNUMINT (LUA_TNUMBER | (2 << 4)) /* integer numbers */ + +#define ttisnumber(o) checktype((o), LUA_TNUMBER) +#define ttisfloat(o) checktag((o), LUA_TNUMFLT) +#define ttisinteger(o) checktag((o), LUA_TNUMINT) + +#define nvalue(o) check_exp(ttisnumber(o), \ + (ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o))) +#define fltvalue(o) check_exp(ttisfloat(o), val_(o).n) +#define ivalue(o) check_exp(ttisinteger(o), val_(o).i) + +#define fltvalueraw(v) ((v).n) +#define ivalueraw(v) ((v).i) + +#define setfltvalue(obj,x) \ + { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_TNUMFLT); } + +#define chgfltvalue(obj,x) \ + { TValue *io=(obj); lua_assert(ttisfloat(io)); val_(io).n=(x); } + +#define setivalue(obj,x) \ + { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_TNUMINT); } + +#define chgivalue(obj,x) \ + { TValue *io=(obj); lua_assert(ttisinteger(io)); val_(io).i=(x); } + +/* }================================================================== */ + + +/* +** {================================================================== +** Strings +** =================================================================== +*/ + +/* Variant tags for strings */ +#define LUA_TSHRSTR (LUA_TSTRING | (1 << 4)) /* short strings */ +#define LUA_TLNGSTR (LUA_TSTRING | (2 << 4)) /* long strings */ + +#define ttisstring(o) checktype((o), LUA_TSTRING) +#define ttisshrstring(o) checktag((o), ctb(LUA_TSHRSTR)) +#define ttislngstring(o) checktag((o), ctb(LUA_TLNGSTR)) + +#define tsvalueraw(v) (gco2ts((v).gc)) + +#define tsvalue(o) check_exp(ttisstring(o), gco2ts(val_(o).gc)) + +#define setsvalue(L,obj,x) \ + { TValue *io = (obj); TString *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \ + checkliveness(L,io); } + +/* set a string to the stack */ +#define setsvalue2s(L,o,s) setsvalue(L,s2v(o),s) + +/* set a string to a new object */ +#define setsvalue2n setsvalue + + +/* +** Header for string value; string bytes follow the end of this structure +** (aligned according to 'UTString'; see next). +*/ +typedef struct TString { + CommonHeader; + lu_byte extra; /* reserved words for short strings; "has hash" for longs */ + lu_byte shrlen; /* length for short strings */ + unsigned int hash; + union { + size_t lnglen; /* length for long strings */ + struct TString *hnext; /* linked list for hash table */ + } u; +} TString; + + + +/* +** Get the actual string (array of bytes) from a 'TString'. +** (Access to 'extra' ensures that value is really a 'TString'.) +*/ +#define getstr(ts) \ + check_exp(sizeof((ts)->extra), cast_charp((ts)) + sizeof(TString)) + + +/* get the actual string (array of bytes) from a Lua value */ +#define svalue(o) getstr(tsvalue(o)) + +/* get string length from 'TString *s' */ +#define tsslen(s) ((s)->tt == LUA_TSHRSTR ? (s)->shrlen : (s)->u.lnglen) + +/* get string length from 'TValue *o' */ +#define vslen(o) tsslen(tsvalue(o)) + +/* }================================================================== */ + + +/* +** {================================================================== +** Userdata +** =================================================================== +*/ + +#define ttislightuserdata(o) checktag((o), LUA_TLIGHTUSERDATA) +#define ttisfulluserdata(o) checktype((o), LUA_TUSERDATA) + +#define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p) +#define uvalue(o) check_exp(ttisfulluserdata(o), gco2u(val_(o).gc)) + +#define pvalueraw(v) ((v).p) + +#define setpvalue(obj,x) \ + { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_TLIGHTUSERDATA); } + +#define setuvalue(L,obj,x) \ + { TValue *io = (obj); Udata *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TUSERDATA)); \ + checkliveness(L,io); } + + +/* Ensures that addresses after this type are always fully aligned. */ +typedef union UValue { + TValue uv; + LUAI_MAXALIGN; /* ensures maximum alignment for udata bytes */ +} UValue; + + +/* +** Header for userdata with user values; +** memory area follows the end of this structure. +*/ +typedef struct Udata { + CommonHeader; + unsigned short nuvalue; /* number of user values */ + size_t len; /* number of bytes */ + struct Table *metatable; + GCObject *gclist; + UValue uv[1]; /* user values */ +} Udata; + + +/* +** Header for userdata with no user values. These userdata do not need +** to be gray during GC, and therefore do not need a 'gclist' field. +** To simplify, the code always use 'Udata' for both kinds of userdata, +** making sure it never accesses 'gclist' on userdata with no user values. +** This structure here is used only to compute the correct size for +** this representation. (The 'bindata' field in its end ensures correct +** alignment for binary data following this header.) +*/ +typedef struct Udata0 { + CommonHeader; + unsigned short nuvalue; /* number of user values */ + size_t len; /* number of bytes */ + struct Table *metatable; + union {LUAI_MAXALIGN;} bindata; +} Udata0; + + +/* compute the offset of the memory area of a userdata */ +#define udatamemoffset(nuv) \ + ((nuv) == 0 ? offsetof(Udata0, bindata) \ + : offsetof(Udata, uv) + (sizeof(UValue) * (nuv))) + +/* get the address of the memory block inside 'Udata' */ +#define getudatamem(u) (cast_charp(u) + udatamemoffset((u)->nuvalue)) + +/* compute the size of a userdata */ +#define sizeudata(nuv,nb) (udatamemoffset(nuv) + (nb)) + +/* }================================================================== */ + + +/* +** {================================================================== +** Prototypes +** =================================================================== +*/ + +/* +** Description of an upvalue for function prototypes +*/ +typedef struct Upvaldesc { + TString *name; /* upvalue name (for debug information) */ + lu_byte instack; /* whether it is in stack (register) */ + lu_byte idx; /* index of upvalue (in stack or in outer function's list) */ +} Upvaldesc; + + +/* +** Description of a local variable for function prototypes +** (used for debug information) +*/ +typedef struct LocVar { + TString *varname; + int startpc; /* first point where variable is active */ + int endpc; /* first point where variable is dead */ +} LocVar; + + +/* +** Associates the absolute line source for a given instruction ('pc'). +** The array 'lineinfo' gives, for each instruction, the difference in +** lines from the previous instruction. When that difference does not +** fit into a byte, Lua saves the absolute line for that instruction. +** (Lua also saves the absolute line periodically, to speed up the +** computation of a line number: we can use binary search in the +** absolute-line array, but we must traverse the 'lineinfo' array +** linearly to compute a line.) +*/ +typedef struct AbsLineInfo { + int pc; + int line; +} AbsLineInfo; + +/* +** Function Prototypes +*/ +typedef struct Proto { + CommonHeader; + lu_byte numparams; /* number of fixed (named) parameters */ + lu_byte is_vararg; + lu_byte maxstacksize; /* number of registers needed by this function */ + int sizeupvalues; /* size of 'upvalues' */ + int sizek; /* size of 'k' */ + int sizecode; + int sizelineinfo; + int sizep; /* size of 'p' */ + int sizelocvars; + int sizeabslineinfo; /* size of 'abslineinfo' */ + int linedefined; /* debug information */ + int lastlinedefined; /* debug information */ + TValue *k; /* constants used by the function */ + Instruction *code; /* opcodes */ + struct Proto **p; /* functions defined inside the function */ + Upvaldesc *upvalues; /* upvalue information */ + ls_byte *lineinfo; /* information about source lines (debug information) */ + AbsLineInfo *abslineinfo; /* idem */ + LocVar *locvars; /* information about local variables (debug information) */ + TString *source; /* used for debug information */ + GCObject *gclist; +} Proto; + +/* }================================================================== */ + + +/* +** {================================================================== +** Closures +** =================================================================== +*/ + +/* Variant tags for functions */ +#define LUA_TLCL (LUA_TFUNCTION | (1 << 4)) /* Lua closure */ +#define LUA_TLCF (LUA_TFUNCTION | (2 << 4)) /* light C function */ +#define LUA_TCCL (LUA_TFUNCTION | (3 << 4)) /* C closure */ + +#define ttisfunction(o) checktype(o, LUA_TFUNCTION) +#define ttisclosure(o) ((rawtt(o) & 0x1F) == LUA_TLCL) +#define ttisLclosure(o) checktag((o), ctb(LUA_TLCL)) +#define ttislcf(o) checktag((o), LUA_TLCF) +#define ttisCclosure(o) checktag((o), ctb(LUA_TCCL)) + +#define isLfunction(o) ttisLclosure(o) + +#define clvalue(o) check_exp(ttisclosure(o), gco2cl(val_(o).gc)) +#define clLvalue(o) check_exp(ttisLclosure(o), gco2lcl(val_(o).gc)) +#define fvalue(o) check_exp(ttislcf(o), val_(o).f) +#define clCvalue(o) check_exp(ttisCclosure(o), gco2ccl(val_(o).gc)) + +#define fvalueraw(v) ((v).f) + +#define setclLvalue(L,obj,x) \ + { TValue *io = (obj); LClosure *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TLCL)); \ + checkliveness(L,io); } + +#define setclLvalue2s(L,o,cl) setclLvalue(L,s2v(o),cl) + +#define setfvalue(obj,x) \ + { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_TLCF); } + +#define setclCvalue(L,obj,x) \ + { TValue *io = (obj); CClosure *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TCCL)); \ + checkliveness(L,io); } + + +/* +** Upvalues for Lua closures +*/ +typedef struct UpVal { + CommonHeader; + TValue *v; /* points to stack or to its own value */ + union { + struct { /* (when open) */ + struct UpVal *next; /* linked list */ + struct UpVal **previous; + } open; + TValue value; /* the value (when closed) */ + } u; +} UpVal; + + +/* variant for "To Be Closed" upvalues */ +#define LUA_TUPVALTBC (LUA_TUPVAL | (1 << 4)) + + +#define ClosureHeader \ + CommonHeader; lu_byte nupvalues; GCObject *gclist + +typedef struct CClosure { + ClosureHeader; + lua_CFunction f; + TValue upvalue[1]; /* list of upvalues */ +} CClosure; + + +typedef struct LClosure { + ClosureHeader; + struct Proto *p; + UpVal *upvals[1]; /* list of upvalues */ +} LClosure; + + +typedef union Closure { + CClosure c; + LClosure l; +} Closure; + + +#define getproto(o) (clLvalue(o)->p) + +/* }================================================================== */ + + +/* +** {================================================================== +** Tables +** =================================================================== +*/ + +#define ttistable(o) checktag((o), ctb(LUA_TTABLE)) + +#define hvalue(o) check_exp(ttistable(o), gco2t(val_(o).gc)) + +#define sethvalue(L,obj,x) \ + { TValue *io = (obj); Table *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTABLE)); \ + checkliveness(L,io); } + +#define sethvalue2s(L,o,h) sethvalue(L,s2v(o),h) + + +/* +** Nodes for Hash tables: A pack of two TValue's (key-value pairs) +** plus a 'next' field to link colliding entries. The distribution +** of the key's fields ('key_tt' and 'key_val') not forming a proper +** 'TValue' allows for a smaller size for 'Node' both in 4-byte +** and 8-byte alignments. +*/ +typedef union Node { + struct NodeKey { + TValuefields; /* fields for value */ + lu_byte key_tt; /* key type */ + int next; /* for chaining */ + Value key_val; /* key value */ + } u; + TValue i_val; /* direct access to node's value as a proper 'TValue' */ +} Node; + + +/* copy a value into a key */ +#define setnodekey(L,node,obj) \ + { Node *n_=(node); const TValue *io_=(obj); \ + n_->u.key_val = io_->value_; n_->u.key_tt = io_->tt_; \ + (void)L; checkliveness(L,io_); } + + +/* copy a value from a key */ +#define getnodekey(L,obj,node) \ + { TValue *io_=(obj); const Node *n_=(node); \ + io_->value_ = n_->u.key_val; io_->tt_ = n_->u.key_tt; \ + (void)L; checkliveness(L,io_); } + + +/* +** About 'alimit': if 'isrealasize(t)' is true, then 'alimit' is the +** real size of 'array'. Otherwise, the real size of 'array' is the +** smallest power of two not smaller than 'alimit' (or zero iff 'alimit' +** is zero); 'alimit' is then used as a hint for #t. +*/ + +#define BITRAS (1 << 7) +#define isrealasize(t) (!((t)->marked & BITRAS)) +#define setrealasize(t) ((t)->marked &= cast_byte(~BITRAS)) +#define setnorealasize(t) ((t)->marked |= BITRAS) + + +typedef struct Table { + CommonHeader; + lu_byte flags; /* 1<

u.key_tt) +#define keyval(node) ((node)->u.key_val) + +#define keyisnil(node) (keytt(node) == LUA_TNIL) +#define keyisinteger(node) (keytt(node) == LUA_TNUMINT) +#define keyival(node) (keyval(node).i) +#define keyisshrstr(node) (keytt(node) == ctb(LUA_TSHRSTR)) +#define keystrval(node) (gco2ts(keyval(node).gc)) + +#define setnilkey(node) (keytt(node) = LUA_TNIL) + +#define keyiscollectable(n) (keytt(n) & BIT_ISCOLLECTABLE) + +#define gckey(n) (keyval(n).gc) +#define gckeyN(n) (keyiscollectable(n) ? gckey(n) : NULL) + + +/* +** Use a "nil table" to mark dead keys in a table. Those keys serve +** to keep space for removed entries, which may still be part of +** chains. Note that the 'keytt' does not have the BIT_ISCOLLECTABLE +** set, so these values are considered not collectable and are different +** from any valid value. +*/ +#define setdeadkey(n) (keytt(n) = LUA_TTABLE, gckey(n) = NULL) + +/* }================================================================== */ + + + +/* +** 'module' operation for hashing (size is always a power of 2) +*/ +#define lmod(s,size) \ + (check_exp((size&(size-1))==0, (cast_int((s) & ((size)-1))))) + + +#define twoto(x) (1<<(x)) +#define sizenode(t) (twoto((t)->lsizenode)) + + +/* size of buffer for 'luaO_utf8esc' function */ +#define UTF8BUFFSZ 8 + +LUAI_FUNC int luaO_int2fb (unsigned int x); +LUAI_FUNC int luaO_fb2int (int x); +LUAI_FUNC int luaO_utf8esc (char *buff, unsigned long x); +LUAI_FUNC int luaO_ceillog2 (unsigned int x); +LUAI_FUNC int luaO_rawarith (lua_State *L, int op, const TValue *p1, + const TValue *p2, TValue *res); +LUAI_FUNC void luaO_arith (lua_State *L, int op, const TValue *p1, + const TValue *p2, StkId res); +LUAI_FUNC size_t luaO_str2num (const char *s, TValue *o); +LUAI_FUNC int luaO_hexavalue (int c); +LUAI_FUNC void luaO_tostring (lua_State *L, TValue *obj); +LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, + va_list argp); +LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); +LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len); + + +#endif + diff --git a/source/lua/lobject.o b/source/lua/lobject.o new file mode 100644 index 0000000000000000000000000000000000000000..103a4a3fe86049b428e1af4c9c8486071249e934 GIT binary patch literal 13432 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�MC ziy=H(wz@LbynSO`!|F1lpfAlPlFvt8*gu;(iXi$+wo=IF+&Vt}oC|+2q!p!!4=l;kolWT9$+^%^eWP%|#9anr zzlTkF0w6-q>n2WruMzw={Awoj)4h^Hw}pERto)91vhyZ9LeHN~+&n&?o4C2%TlnH3 zJ!bj)P24;$zcTSfrgmrZ&XXQ9e^A2bLXHB-Uxi25Ur7*w_*d`<-bfIE_*d}={whHP z;#cDl{1ib1;`B}>IQxGwoPW*4kD2zjc_w~Q(%=p8ToF{lJct6hzdj&tqd8b8wfaiBx_#n^k zvGDUezt_UWfxS<{_e*$2!bSgt{X)O!pWvcB(LccxeBT+c=-J~0R$@-cW*1tlgN7{JYT};y=Ag?mq>U}!Zismm+-X`UM1nR65b@?+ax?8;q4OM zDdD>%e2;|hmGFHMzF)#K65c1_{Stms!UrULP{Pkk_^^d9;p>QP`jhy%lMaJPxcII> z>PSSayF7`!N5bdt65cN1of5uV z!uLq{UJ2hP;rk^#BjJ4(zL$?@zlCq({G^48aUQVnAeSGsa3OzQ!iOas9}`)y`mL#mozNq`%PGE=?OS5i8xiBv7mMlp8cQ`t z>#KdS=(d>R+f*H^R(u;2!j@QdWHZ+ot*xwSuHF(gdjGfodZ2=)M7)0sjX|E+ zYJMpNa|;0;(|w&@eS$nMqJ8`YG>MtTMV)}a*>GGQ^ zBi+gCFSc;eu84n#a*;NR9^v)PjM7$F`o2%hI)8n + +#include "lopcodes.h" + + +/* ORDER OP */ + +LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = { +/* OT IT T A mode opcode */ + opmode(0, 0, 0, 1, iABC) /* OP_MOVE */ + ,opmode(0, 0, 0, 1, iAsBx) /* OP_LOADI */ + ,opmode(0, 0, 0, 1, iAsBx) /* OP_LOADF */ + ,opmode(0, 0, 0, 1, iABx) /* OP_LOADK */ + ,opmode(0, 0, 0, 1, iABx) /* OP_LOADKX */ + ,opmode(0, 0, 0, 1, iABC) /* OP_LOADBOOL */ + ,opmode(0, 0, 0, 1, iABC) /* OP_LOADNIL */ + ,opmode(0, 0, 0, 1, iABC) /* OP_GETUPVAL */ + ,opmode(0, 0, 0, 0, iABC) /* OP_SETUPVAL */ + ,opmode(0, 0, 0, 1, iABC) /* OP_GETTABUP */ + ,opmode(0, 0, 0, 1, iABC) /* OP_GETTABLE */ + ,opmode(0, 0, 0, 1, iABC) /* OP_GETI */ + ,opmode(0, 0, 0, 1, iABC) /* OP_GETFIELD */ + ,opmode(0, 0, 0, 0, iABC) /* OP_SETTABUP */ + ,opmode(0, 0, 0, 0, iABC) /* OP_SETTABLE */ + ,opmode(0, 0, 0, 0, iABC) /* OP_SETI */ + ,opmode(0, 0, 0, 0, iABC) /* OP_SETFIELD */ + ,opmode(0, 0, 0, 1, iABC) /* OP_NEWTABLE */ + ,opmode(0, 0, 0, 1, iABC) /* OP_SELF */ + ,opmode(0, 0, 0, 1, iABC) /* OP_ADDI */ + ,opmode(0, 0, 0, 1, iABC) /* OP_SUBI */ + ,opmode(0, 0, 0, 1, iABC) /* OP_MULI */ + ,opmode(0, 0, 0, 1, iABC) /* OP_MODI */ + ,opmode(0, 0, 0, 1, iABC) /* OP_POWI */ + ,opmode(0, 0, 0, 1, iABC) /* OP_DIVI */ + ,opmode(0, 0, 0, 1, iABC) /* OP_IDIVI */ + ,opmode(0, 0, 0, 1, iABC) /* OP_ADDK */ + ,opmode(0, 0, 0, 1, iABC) /* OP_SUBK */ + ,opmode(0, 0, 0, 1, iABC) /* OP_MULK */ + ,opmode(0, 0, 0, 1, iABC) /* OP_MODK */ + ,opmode(0, 0, 0, 1, iABC) /* OP_POWK */ + ,opmode(0, 0, 0, 1, iABC) /* OP_DIVK */ + ,opmode(0, 0, 0, 1, iABC) /* OP_IDIVK */ + ,opmode(0, 0, 0, 1, iABC) /* OP_BANDK */ + ,opmode(0, 0, 0, 1, iABC) /* OP_BORK */ + ,opmode(0, 0, 0, 1, iABC) /* OP_BXORK */ + ,opmode(0, 0, 0, 1, iABC) /* OP_SHRI */ + ,opmode(0, 0, 0, 1, iABC) /* OP_SHLI */ + ,opmode(0, 0, 0, 1, iABC) /* OP_ADD */ + ,opmode(0, 0, 0, 1, iABC) /* OP_SUB */ + ,opmode(0, 0, 0, 1, iABC) /* OP_MUL */ + ,opmode(0, 0, 0, 1, iABC) /* OP_MOD */ + ,opmode(0, 0, 0, 1, iABC) /* OP_POW */ + ,opmode(0, 0, 0, 1, iABC) /* OP_DIV */ + ,opmode(0, 0, 0, 1, iABC) /* OP_IDIV */ + ,opmode(0, 0, 0, 1, iABC) /* OP_BAND */ + ,opmode(0, 0, 0, 1, iABC) /* OP_BOR */ + ,opmode(0, 0, 0, 1, iABC) /* OP_BXOR */ + ,opmode(0, 0, 0, 1, iABC) /* OP_SHL */ + ,opmode(0, 0, 0, 1, iABC) /* OP_SHR */ + ,opmode(0, 0, 0, 1, iABC) /* OP_UNM */ + ,opmode(0, 0, 0, 1, iABC) /* OP_BNOT */ + ,opmode(0, 0, 0, 1, iABC) /* OP_NOT */ + ,opmode(0, 0, 0, 1, iABC) /* OP_LEN */ + ,opmode(0, 0, 0, 1, iABC) /* OP_CONCAT */ + ,opmode(0, 0, 0, 0, iABC) /* OP_CLOSE */ + ,opmode(0, 0, 0, 0, iABC) /* OP_TBC */ + ,opmode(0, 0, 0, 0, isJ) /* OP_JMP */ + ,opmode(0, 0, 1, 0, iABC) /* OP_EQ */ + ,opmode(0, 0, 1, 0, iABC) /* OP_LT */ + ,opmode(0, 0, 1, 0, iABC) /* OP_LE */ + ,opmode(0, 0, 1, 0, iABC) /* OP_EQK */ + ,opmode(0, 0, 1, 0, iABC) /* OP_EQI */ + ,opmode(0, 0, 1, 0, iABC) /* OP_LTI */ + ,opmode(0, 0, 1, 0, iABC) /* OP_LEI */ + ,opmode(0, 0, 1, 0, iABC) /* OP_GTI */ + ,opmode(0, 0, 1, 0, iABC) /* OP_GEI */ + ,opmode(0, 0, 1, 0, iABC) /* OP_TEST */ + ,opmode(0, 0, 1, 1, iABC) /* OP_TESTSET */ + ,opmode(1, 1, 0, 1, iABC) /* OP_CALL */ + ,opmode(1, 1, 0, 1, iABC) /* OP_TAILCALL */ + ,opmode(0, 1, 0, 0, iABC) /* OP_RETURN */ + ,opmode(0, 0, 0, 0, iABC) /* OP_RETURN0 */ + ,opmode(0, 0, 0, 0, iABC) /* OP_RETURN1 */ + ,opmode(0, 0, 0, 1, iABx) /* OP_FORLOOP1 */ + ,opmode(0, 0, 0, 1, iABx) /* OP_FORPREP1 */ + ,opmode(0, 0, 0, 1, iABx) /* OP_FORLOOP */ + ,opmode(0, 0, 0, 1, iABx) /* OP_FORPREP */ + ,opmode(0, 0, 0, 0, iABx) /* OP_TFORPREP */ + ,opmode(0, 0, 0, 0, iABC) /* OP_TFORCALL */ + ,opmode(0, 0, 0, 1, iABx) /* OP_TFORLOOP */ + ,opmode(0, 1, 0, 0, iABC) /* OP_SETLIST */ + ,opmode(0, 0, 0, 1, iABx) /* OP_CLOSURE */ + ,opmode(1, 0, 0, 1, iABC) /* OP_VARARG */ + ,opmode(0, 0, 0, 1, iABC) /* OP_PREPVARARG */ + ,opmode(0, 0, 0, 0, iAx) /* OP_EXTRAARG */ +}; + diff --git a/source/lua/lopcodes.h b/source/lua/lopcodes.h new file mode 100644 index 0000000..3e10025 --- /dev/null +++ b/source/lua/lopcodes.h @@ -0,0 +1,373 @@ +/* +** $Id: lopcodes.h $ +** Opcodes for Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#ifndef lopcodes_h +#define lopcodes_h + +#include "llimits.h" + + +/*=========================================================================== + We assume that instructions are unsigned 32-bit integers. + All instructions have an opcode in the first 7 bits. + Instructions can have the following formats: + + 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 +iABC C(8) | B(8) |k| A(8) | Op(7) | +iABx Bx(17) | A(8) | Op(7) | +iAsB sBx (signed)(17) | A(8) | Op(7) | +iAx Ax(25) | Op(7) | +isJ sJ(25) | Op(7) | + + A signed argument is represented in excess K: the represented value is + the written unsigned value minus K, where K is half the maximum for the + corresponding unsigned argument. +===========================================================================*/ + + +enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ + + +/* +** size and position of opcode arguments. +*/ +#define SIZE_C 8 +#define SIZE_B 8 +#define SIZE_Bx (SIZE_C + SIZE_B + 1) +#define SIZE_A 8 +#define SIZE_Ax (SIZE_Bx + SIZE_A) +#define SIZE_sJ (SIZE_Bx + SIZE_A) + +#define SIZE_OP 7 + +#define POS_OP 0 + +#define POS_A (POS_OP + SIZE_OP) +#define POS_k (POS_A + SIZE_A) +#define POS_B (POS_k + 1) +#define POS_C (POS_B + SIZE_B) + +#define POS_Bx POS_k + +#define POS_Ax POS_A + +#define POS_sJ POS_A + +/* +** limits for opcode arguments. +** we use (signed) int to manipulate most arguments, +** so they must fit in LUAI_BITSINT-1 bits (-1 for sign) +*/ +#if SIZE_Bx < LUAI_BITSINT-1 +#define MAXARG_Bx ((1<>1) /* 'sBx' is signed */ + + +#if SIZE_Ax < LUAI_BITSINT-1 +#define MAXARG_Ax ((1<> 1) + + +#define MAXARG_A ((1<> 1) + + +/* creates a mask with 'n' 1 bits at position 'p' */ +#define MASK1(n,p) ((~((~(Instruction)0)<<(n)))<<(p)) + +/* creates a mask with 'n' 0 bits at position 'p' */ +#define MASK0(n,p) (~MASK1(n,p)) + +/* +** the following macros help to manipulate instructions +*/ + +#define GET_OPCODE(i) (cast(OpCode, ((i)>>POS_OP) & MASK1(SIZE_OP,0))) +#define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \ + ((cast(Instruction, o)<>(pos)) & MASK1(size,0))) +#define setarg(i,v,pos,size) ((i) = (((i)&MASK0(size,pos)) | \ + ((cast(Instruction, v)<> C */ +OP_SHLI,/* A B sC R(A) := C << R(B) */ + +OP_ADD,/* A B C R(A) := R(B) + R(C) */ +OP_SUB,/* A B C R(A) := R(B) - R(C) */ +OP_MUL,/* A B C R(A) := R(B) * R(C) */ +OP_MOD,/* A B C R(A) := R(B) % R(C) */ +OP_POW,/* A B C R(A) := R(B) ^ R(C) */ +OP_DIV,/* A B C R(A) := R(B) / R(C) */ +OP_IDIV,/* A B C R(A) := R(B) // R(C) */ + +OP_BAND,/* A B C R(A) := R(B) & R(C) */ +OP_BOR,/* A B C R(A) := R(B) | R(C) */ +OP_BXOR,/* A B C R(A) := R(B) ~ R(C) */ +OP_SHL,/* A B C R(A) := R(B) << R(C) */ +OP_SHR,/* A B C R(A) := R(B) >> R(C) */ + +OP_UNM,/* A B R(A) := -R(B) */ +OP_BNOT,/* A B R(A) := ~R(B) */ +OP_NOT,/* A B R(A) := not R(B) */ +OP_LEN,/* A B R(A) := length of R(B) */ + +OP_CONCAT,/* A B R(A) := R(A).. ... ..R(A + B - 1) */ + +OP_CLOSE,/* A close all upvalues >= R(A) */ +OP_TBC,/* A mark variable A "to be closed" */ +OP_JMP,/* k sJ pc += sJ (k is used in code generation) */ +OP_EQ,/* A B if ((R(A) == R(B)) ~= k) then pc++ */ +OP_LT,/* A B if ((R(A) < R(B)) ~= k) then pc++ */ +OP_LE,/* A B if ((R(A) <= R(B)) ~= k) then pc++ */ + +OP_EQK,/* A B if ((R(A) == K(B)) ~= k) then pc++ */ +OP_EQI,/* A sB if ((R(A) == sB) ~= k) then pc++ */ +OP_LTI,/* A sB if ((R(A) < sB) ~= k) then pc++ */ +OP_LEI,/* A sB if ((R(A) <= sB) ~= k) then pc++ */ +OP_GTI,/* A sB if ((R(A) > sB) ~= k) then pc++ */ +OP_GEI,/* A sB if ((R(A) >= sB) ~= k) then pc++ */ + +OP_TEST,/* A if (not R(A) == k) then pc++ */ +OP_TESTSET,/* A B if (not R(B) == k) then pc++ else R(A) := R(B) */ + +OP_CALL,/* A B C R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */ +OP_TAILCALL,/* A B C return R(A)(R(A+1), ... ,R(A+B-1)) */ + +OP_RETURN,/* A B C return R(A), ... ,R(A+B-2) (see note) */ +OP_RETURN0,/* return */ +OP_RETURN1,/* A return R(A) */ + +OP_FORLOOP1,/* A Bx R(A)++; + if R(A) <= R(A+1) then { pc-=Bx; R(A+3)=R(A) } */ +OP_FORPREP1,/* A Bx R(A)--; pc+=Bx */ + +OP_FORLOOP,/* A Bx R(A)+=R(A+2); + if R(A) 0 means the function is vararg and (C - 1) is its number of + fixed parameters. + +===========================================================================*/ + + +/* +** masks for instruction properties. The format is: +** bits 0-2: op mode +** bit 3: instruction set register A +** bit 4: operator is a test (next instruction must be a jump) +** bit 5: instruction uses 'L->top' set by previous instruction (when B == 0) +** bit 6: instruction sets 'L->top' for next instruction (when C == 0) +*/ + +LUAI_DDEC(const lu_byte luaP_opmodes[NUM_OPCODES];) + +#define getOpMode(m) (cast(enum OpMode, luaP_opmodes[m] & 7)) +#define testAMode(m) (luaP_opmodes[m] & (1 << 3)) +#define testTMode(m) (luaP_opmodes[m] & (1 << 4)) +#define testITMode(m) (luaP_opmodes[m] & (1 << 5)) +#define testOTMode(m) (luaP_opmodes[m] & (1 << 6)) + +/* "out top" (set top for next instruction) */ +#define isOT(i) \ + ((testOTMode(GET_OPCODE(i)) && GETARG_C(i) == 0) || \ + GET_OPCODE(i) == OP_TAILCALL) + +/* "in top" (uses top from previous instruction) */ +#define isIT(i) (testITMode(GET_OPCODE(i)) && GETARG_B(i) == 0) + +#define opmode(ot,it,t,a,m) (((ot)<<6) | ((it)<<5) | ((t)<<4) | ((a)<<3) | (m)) + + +/* number of list items to accumulate before a SETLIST instruction */ +#define LFIELDS_PER_FLUSH 50 + + +#endif diff --git a/source/lua/lopcodes.o b/source/lua/lopcodes.o new file mode 100644 index 0000000000000000000000000000000000000000..98495bd7afbe1aad5e829d9aec7e0f00aff0ea6c GIT binary patch literal 1168 zcmbtT%}T>S5S}zulj5PhRlLNL3U*1P1{9P+(RxtvQm>Mxfr3p_nhn&8zJ<@=Yk2qI z(bw<^bSB9*%bKF-K=zxzZztbw@_2f2R?##Nrojmmk;nqnD}~=l-44`X4UAgNG!4T5 zd<@DH{%io%`ofx{kp*C)X<%CBxuHX^+dZ;&`h#S`6YGGrncZ@eG;$ssm)ULRIJ;TF z+P59ocJ0ITt(GmMsR|#TWp%w&F@O$|Xo;v}rOb4kP-Z%;mZfo*m2dfV%rvxOpBvFJ zj;4Mz3}WWPIPtD;qiIMX0E_QK?hO$6EW?rTcrfR{h938T4dNKsEXo2u3d3N6wMoPS z*1PJrV($5OV%9%!6S;KOs^ZR)J=Je*E9a{x{9FDu^65MLD}OJauim_vzqk+VBeT-A zSlZ~4Cc8+b-cugCN?zy}c#L)7%dM|+Ao*%<18b^wYJbTaFC{LyDxYFiJN3QMg7%&P Zn22=F=|7Lyl=5ZspYuT*d7l7v{uek!KqvqJ literal 0 HcmV?d00001 diff --git a/source/lua/lopnames.h b/source/lua/lopnames.h new file mode 100644 index 0000000..96d901a --- /dev/null +++ b/source/lua/lopnames.h @@ -0,0 +1,103 @@ +/* +** $Id: lopnames.h $ +** Opcode names +** See Copyright Notice in lua.h +*/ + +#if !defined(lopnames_h) +#define lopnames_h + +/* ORDER OP */ + +static const char *const opnames[] = { + "MOVE", + "LOADI", + "LOADF", + "LOADK", + "LOADKX", + "LOADBOOL", + "LOADNIL", + "GETUPVAL", + "SETUPVAL", + "GETTABUP", + "GETTABLE", + "GETI", + "GETFIELD", + "SETTABUP", + "SETTABLE", + "SETI", + "SETFIELD", + "NEWTABLE", + "SELF", + "ADDI", + "SUBI", + "MULI", + "MODI", + "POWI", + "DIVI", + "IDIVI", + "ADDK", + "SUBK", + "MULK", + "MODK", + "POWK", + "DIVK", + "IDIVK", + "BANDK", + "BORK", + "BXORK", + "SHRI", + "SHLI", + "ADD", + "SUB", + "MUL", + "MOD", + "POW", + "DIV", + "IDIV", + "BAND", + "BOR", + "BXOR", + "SHL", + "SHR", + "UNM", + "BNOT", + "NOT", + "LEN", + "CONCAT", + "CLOSE", + "TBC", + "JMP", + "EQ", + "LT", + "LE", + "EQK", + "EQI", + "LTI", + "LEI", + "GTI", + "GEI", + "TEST", + "TESTSET", + "CALL", + "TAILCALL", + "RETURN", + "RETURN0", + "RETURN1", + "FORLOOP1", + "FORPREP1", + "FORLOOP", + "FORPREP", + "TFORPREP", + "TFORCALL", + "TFORLOOP", + "SETLIST", + "CLOSURE", + "VARARG", + "PREPVARARG", + "EXTRAARG", + NULL +}; + +#endif + diff --git a/source/lua/loslib.c b/source/lua/loslib.c new file mode 100644 index 0000000..8809e5e --- /dev/null +++ b/source/lua/loslib.c @@ -0,0 +1,408 @@ +/* +** $Id: loslib.c $ +** Standard Operating System library +** See Copyright Notice in lua.h +*/ + +#define loslib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** {================================================================== +** List of valid conversion specifiers for the 'strftime' function; +** options are grouped by length; group of length 2 start with '||'. +** =================================================================== +*/ +#if !defined(LUA_STRFTIMEOPTIONS) /* { */ + +/* options for ANSI C 89 (only 1-char options) */ +#define L_STRFTIMEC89 "aAbBcdHIjmMpSUwWxXyYZ%" + +/* options for ISO C 99 and POSIX */ +#define L_STRFTIMEC99 "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%" \ + "||" "EcECExEXEyEY" "OdOeOHOIOmOMOSOuOUOVOwOWOy" /* two-char options */ + +/* options for Windows */ +#define L_STRFTIMEWIN "aAbBcdHIjmMpSUwWxXyYzZ%" \ + "||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y" /* two-char options */ + +#if defined(LUA_USE_WINDOWS) +#define LUA_STRFTIMEOPTIONS L_STRFTIMEWIN +#elif defined(LUA_USE_C89) +#define LUA_STRFTIMEOPTIONS L_STRFTIMEC89 +#else /* C99 specification */ +#define LUA_STRFTIMEOPTIONS L_STRFTIMEC99 +#endif + +#endif /* } */ +/* }================================================================== */ + + +/* +** {================================================================== +** Configuration for time-related stuff +** =================================================================== +*/ + +#if !defined(l_time_t) /* { */ +/* +** type to represent time_t in Lua +*/ +#define l_timet lua_Integer +#define l_pushtime(L,t) lua_pushinteger(L,(lua_Integer)(t)) + +static time_t l_checktime (lua_State *L, int arg) { + lua_Integer t = luaL_checkinteger(L, arg); + luaL_argcheck(L, (time_t)t == t, arg, "time out-of-bounds"); + return (time_t)t; +} + +#endif /* } */ + + +#if !defined(l_gmtime) /* { */ +/* +** By default, Lua uses gmtime/localtime, except when POSIX is available, +** where it uses gmtime_r/localtime_r +*/ + +#if defined(LUA_USE_POSIX) /* { */ + +#define l_gmtime(t,r) gmtime_r(t,r) +#define l_localtime(t,r) localtime_r(t,r) + +#else /* }{ */ + +/* ISO C definitions */ +#define l_gmtime(t,r) ((void)(r)->tm_sec, gmtime(t)) +#define l_localtime(t,r) ((void)(r)->tm_sec, localtime(t)) + +#endif /* } */ + +#endif /* } */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Configuration for 'tmpnam': +** By default, Lua uses tmpnam except when POSIX is available, where +** it uses mkstemp. +** =================================================================== +*/ +#if !defined(lua_tmpnam) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#include + +#define LUA_TMPNAMBUFSIZE 32 + +#if !defined(LUA_TMPNAMTEMPLATE) +#define LUA_TMPNAMTEMPLATE "/tmp/lua_XXXXXX" +#endif + +#define lua_tmpnam(b,e) { \ + strcpy(b, LUA_TMPNAMTEMPLATE); \ + e = mkstemp(b); \ + if (e != -1) close(e); \ + e = (e == -1); } + +#else /* }{ */ + +/* ISO C definitions */ +#define LUA_TMPNAMBUFSIZE L_tmpnam +#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); } + +#endif /* } */ + +#endif /* } */ +/* }================================================================== */ + + + + +static int os_execute (lua_State *L) { + const char *cmd = luaL_optstring(L, 1, NULL); + int stat = system(cmd); + if (cmd != NULL) + return luaL_execresult(L, stat); + else { + lua_pushboolean(L, stat); /* true if there is a shell */ + return 1; + } +} + + +static int os_remove (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + return luaL_fileresult(L, remove(filename) == 0, filename); +} + + +static int os_rename (lua_State *L) { + const char *fromname = luaL_checkstring(L, 1); + const char *toname = luaL_checkstring(L, 2); + return luaL_fileresult(L, rename(fromname, toname) == 0, NULL); +} + + +static int os_tmpname (lua_State *L) { + char buff[LUA_TMPNAMBUFSIZE]; + int err; + lua_tmpnam(buff, err); + if (err) + return luaL_error(L, "unable to generate a unique filename"); + lua_pushstring(L, buff); + return 1; +} + + +static int os_getenv (lua_State *L) { + lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */ + return 1; +} + + +static int os_clock (lua_State *L) { + lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC); + return 1; +} + + +/* +** {====================================================== +** Time/Date operations +** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S, +** wday=%w+1, yday=%j, isdst=? } +** ======================================================= +*/ + +static void setfield (lua_State *L, const char *key, int value) { + lua_pushinteger(L, value); + lua_setfield(L, -2, key); +} + +static void setboolfield (lua_State *L, const char *key, int value) { + if (value < 0) /* undefined? */ + return; /* does not set field */ + lua_pushboolean(L, value); + lua_setfield(L, -2, key); +} + + +/* +** Set all fields from structure 'tm' in the table on top of the stack +*/ +static void setallfields (lua_State *L, struct tm *stm) { + setfield(L, "sec", stm->tm_sec); + setfield(L, "min", stm->tm_min); + setfield(L, "hour", stm->tm_hour); + setfield(L, "day", stm->tm_mday); + setfield(L, "month", stm->tm_mon + 1); + setfield(L, "year", stm->tm_year + 1900); + setfield(L, "wday", stm->tm_wday + 1); + setfield(L, "yday", stm->tm_yday + 1); + setboolfield(L, "isdst", stm->tm_isdst); +} + + +static int getboolfield (lua_State *L, const char *key) { + int res; + res = (lua_getfield(L, -1, key) == LUA_TNIL) ? -1 : lua_toboolean(L, -1); + lua_pop(L, 1); + return res; +} + + +/* maximum value for date fields (to avoid arithmetic overflows with 'int') */ +#if !defined(L_MAXDATEFIELD) +#define L_MAXDATEFIELD (INT_MAX / 2) +#endif + +static int getfield (lua_State *L, const char *key, int d, int delta) { + int isnum; + int t = lua_getfield(L, -1, key); /* get field and its type */ + lua_Integer res = lua_tointegerx(L, -1, &isnum); + if (!isnum) { /* field is not an integer? */ + if (t != LUA_TNIL) /* some other value? */ + return luaL_error(L, "field '%s' is not an integer", key); + else if (d < 0) /* absent field; no default? */ + return luaL_error(L, "field '%s' missing in date table", key); + res = d; + } + else { + if (!(-L_MAXDATEFIELD <= res && res <= L_MAXDATEFIELD)) + return luaL_error(L, "field '%s' is out-of-bound", key); + res -= delta; + } + lua_pop(L, 1); + return (int)res; +} + + +static const char *checkoption (lua_State *L, const char *conv, + ptrdiff_t convlen, char *buff) { + const char *option = LUA_STRFTIMEOPTIONS; + int oplen = 1; /* length of options being checked */ + for (; *option != '\0' && oplen <= convlen; option += oplen) { + if (*option == '|') /* next block? */ + oplen++; /* will check options with next length (+1) */ + else if (memcmp(conv, option, oplen) == 0) { /* match? */ + memcpy(buff, conv, oplen); /* copy valid option to buffer */ + buff[oplen] = '\0'; + return conv + oplen; /* return next item */ + } + } + luaL_argerror(L, 1, + lua_pushfstring(L, "invalid conversion specifier '%%%s'", conv)); + return conv; /* to avoid warnings */ +} + + +/* maximum size for an individual 'strftime' item */ +#define SIZETIMEFMT 250 + + +static int os_date (lua_State *L) { + size_t slen; + const char *s = luaL_optlstring(L, 1, "%c", &slen); + time_t t = luaL_opt(L, l_checktime, 2, time(NULL)); + const char *se = s + slen; /* 's' end */ + struct tm tmr, *stm; + if (*s == '!') { /* UTC? */ + stm = l_gmtime(&t, &tmr); + s++; /* skip '!' */ + } + else + stm = l_localtime(&t, &tmr); + if (stm == NULL) /* invalid date? */ + return luaL_error(L, + "time result cannot be represented in this installation"); + if (strcmp(s, "*t") == 0) { + lua_createtable(L, 0, 9); /* 9 = number of fields */ + setallfields(L, stm); + } + else { + char cc[4]; /* buffer for individual conversion specifiers */ + luaL_Buffer b; + cc[0] = '%'; + luaL_buffinit(L, &b); + while (s < se) { + if (*s != '%') /* not a conversion specifier? */ + luaL_addchar(&b, *s++); + else { + size_t reslen; + char *buff = luaL_prepbuffsize(&b, SIZETIMEFMT); + s++; /* skip '%' */ + s = checkoption(L, s, se - s, cc + 1); /* copy specifier to 'cc' */ + reslen = strftime(buff, SIZETIMEFMT, cc, stm); + luaL_addsize(&b, reslen); + } + } + luaL_pushresult(&b); + } + return 1; +} + + +static int os_time (lua_State *L) { + time_t t; + if (lua_isnoneornil(L, 1)) /* called without args? */ + t = time(NULL); /* get current time */ + else { + struct tm ts; + luaL_checktype(L, 1, LUA_TTABLE); + lua_settop(L, 1); /* make sure table is at the top */ + ts.tm_sec = getfield(L, "sec", 0, 0); + ts.tm_min = getfield(L, "min", 0, 0); + ts.tm_hour = getfield(L, "hour", 12, 0); + ts.tm_mday = getfield(L, "day", -1, 0); + ts.tm_mon = getfield(L, "month", -1, 1); + ts.tm_year = getfield(L, "year", -1, 1900); + ts.tm_isdst = getboolfield(L, "isdst"); + t = mktime(&ts); + setallfields(L, &ts); /* update fields with normalized values */ + } + if (t != (time_t)(l_timet)t || t == (time_t)(-1)) + return luaL_error(L, + "time result cannot be represented in this installation"); + l_pushtime(L, t); + return 1; +} + + +static int os_difftime (lua_State *L) { + time_t t1 = l_checktime(L, 1); + time_t t2 = l_checktime(L, 2); + lua_pushnumber(L, (lua_Number)difftime(t1, t2)); + return 1; +} + +/* }====================================================== */ + + +static int os_setlocale (lua_State *L) { + static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, + LC_NUMERIC, LC_TIME}; + static const char *const catnames[] = {"all", "collate", "ctype", "monetary", + "numeric", "time", NULL}; + const char *l = luaL_optstring(L, 1, NULL); + int op = luaL_checkoption(L, 2, "all", catnames); + lua_pushstring(L, setlocale(cat[op], l)); + return 1; +} + + +static int os_exit (lua_State *L) { + int status; + if (lua_isboolean(L, 1)) + status = (lua_toboolean(L, 1) ? EXIT_SUCCESS : EXIT_FAILURE); + else + status = (int)luaL_optinteger(L, 1, EXIT_SUCCESS); + if (lua_toboolean(L, 2)) + lua_close(L); + if (L) exit(status); /* 'if' to avoid warnings for unreachable 'return' */ + return 0; +} + + +static const luaL_Reg syslib[] = { + {"clock", os_clock}, + {"date", os_date}, + {"difftime", os_difftime}, + {"execute", os_execute}, + {"exit", os_exit}, + {"getenv", os_getenv}, + {"remove", os_remove}, + {"rename", os_rename}, + {"setlocale", os_setlocale}, + {"time", os_time}, + {"tmpname", os_tmpname}, + {NULL, NULL} +}; + +/* }====================================================== */ + + + +LUAMOD_API int luaopen_os (lua_State *L) { + luaL_newlib(L, syslib); + return 1; +} + diff --git a/source/lua/loslib.o b/source/lua/loslib.o new file mode 100644 index 0000000000000000000000000000000000000000..72a0daeb2153951a4ea0c4215f79de2d0e042b09 GIT binary patch literal 11744 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 XY-jtp%&N67|6mGrf9w!<#_xXswx2J* literal 0 HcmV?d00001 diff --git a/source/lua/lparser.c b/source/lua/lparser.c new file mode 100644 index 0000000..3887958 --- /dev/null +++ b/source/lua/lparser.c @@ -0,0 +1,1846 @@ +/* +** $Id: lparser.c $ +** Lua Parser +** See Copyright Notice in lua.h +*/ + +#define lparser_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include + +#include "lua.h" + +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "llex.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" + + + +/* maximum number of local variables per function (must be smaller + than 250, due to the bytecode format) */ +#define MAXVARS 200 + + +#define hasmultret(k) ((k) == VCALL || (k) == VVARARG) + + +/* because all strings are unified by the scanner, the parser + can use pointer equality for string equality */ +#define eqstr(a,b) ((a) == (b)) + + +/* +** nodes for block list (list of active blocks) +*/ +typedef struct BlockCnt { + struct BlockCnt *previous; /* chain */ + int firstlabel; /* index of first label in this block */ + int firstgoto; /* index of first pending goto in this block */ + lu_byte nactvar; /* # active locals outside the block */ + lu_byte upval; /* true if some variable in the block is an upvalue */ + lu_byte isloop; /* true if 'block' is a loop */ + lu_byte insidetbc; /* true if inside the scope of a to-be-closed var. */ +} BlockCnt; + + + +/* +** prototypes for recursive non-terminal functions +*/ +static void statement (LexState *ls); +static void expr (LexState *ls, expdesc *v); + + +static l_noret error_expected (LexState *ls, int token) { + luaX_syntaxerror(ls, + luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token))); +} + + +static l_noret errorlimit (FuncState *fs, int limit, const char *what) { + lua_State *L = fs->ls->L; + const char *msg; + int line = fs->f->linedefined; + const char *where = (line == 0) + ? "main function" + : luaO_pushfstring(L, "function at line %d", line); + msg = luaO_pushfstring(L, "too many %s (limit is %d) in %s", + what, limit, where); + luaX_syntaxerror(fs->ls, msg); +} + + +static void checklimit (FuncState *fs, int v, int l, const char *what) { + if (v > l) errorlimit(fs, l, what); +} + + +/* +** Test whether next token is 'c'; if so, skip it. +*/ +static int testnext (LexState *ls, int c) { + if (ls->t.token == c) { + luaX_next(ls); + return 1; + } + else return 0; +} + + +/* +** Check that next token is 'c'. +*/ +static void check (LexState *ls, int c) { + if (ls->t.token != c) + error_expected(ls, c); +} + + +/* +** Check that next token is 'c' and skip it. +*/ +static void checknext (LexState *ls, int c) { + check(ls, c); + luaX_next(ls); +} + + +#define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } + + +/* +** Check that next token is 'what' and skip it. In case of error, +** raise an error that the expected 'what' should match a 'who' +** in line 'where' (if that is not the current line). +*/ +static void check_match (LexState *ls, int what, int who, int where) { + if (unlikely(!testnext(ls, what))) { + if (where == ls->linenumber) /* all in the same line? */ + error_expected(ls, what); /* do not need a complex message */ + else { + luaX_syntaxerror(ls, luaO_pushfstring(ls->L, + "%s expected (to close %s at line %d)", + luaX_token2str(ls, what), luaX_token2str(ls, who), where)); + } + } +} + + +static TString *str_checkname (LexState *ls) { + TString *ts; + check(ls, TK_NAME); + ts = ls->t.seminfo.ts; + luaX_next(ls); + return ts; +} + + +static void init_exp (expdesc *e, expkind k, int i) { + e->f = e->t = NO_JUMP; + e->k = k; + e->u.info = i; +} + + +static void codestring (LexState *ls, expdesc *e, TString *s) { + init_exp(e, VK, luaK_stringK(ls->fs, s)); +} + + +static void codename (LexState *ls, expdesc *e) { + codestring(ls, e, str_checkname(ls)); +} + + +/* +** Register a new local variable in the active 'Proto' (for debug +** information). +*/ +static int registerlocalvar (LexState *ls, TString *varname) { + FuncState *fs = ls->fs; + Proto *f = fs->f; + int oldsize = f->sizelocvars; + luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, + LocVar, SHRT_MAX, "local variables"); + while (oldsize < f->sizelocvars) + f->locvars[oldsize++].varname = NULL; + f->locvars[fs->nlocvars].varname = varname; + luaC_objbarrier(ls->L, f, varname); + return fs->nlocvars++; +} + + +/* +** Create a new local variable with the given 'name'. +*/ +static void new_localvar (LexState *ls, TString *name) { + FuncState *fs = ls->fs; + Dyndata *dyd = ls->dyd; + int reg = registerlocalvar(ls, name); + checklimit(fs, dyd->actvar.n + 1 - fs->firstlocal, + MAXVARS, "local variables"); + luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1, + dyd->actvar.size, Vardesc, MAX_INT, "local variables"); + dyd->actvar.arr[dyd->actvar.n++].idx = cast(short, reg); +} + +#define new_localvarliteral(ls,v) \ + new_localvar(ls, luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char)) - 1)); + + +/* +** Get the debug-information entry for current variable 'i'. +*/ +static LocVar *getlocvar (FuncState *fs, int i) { + int idx = fs->ls->dyd->actvar.arr[fs->firstlocal + i].idx; + lua_assert(idx < fs->nlocvars); + return &fs->f->locvars[idx]; +} + + +/* +** Start the scope for the last 'nvars' created variables. +** (debug info.) +*/ +static void adjustlocalvars (LexState *ls, int nvars) { + FuncState *fs = ls->fs; + fs->nactvar = cast_byte(fs->nactvar + nvars); + for (; nvars; nvars--) { + getlocvar(fs, fs->nactvar - nvars)->startpc = fs->pc; + } +} + + +/* +** Close the scope for all variables up to level 'tolevel'. +** (debug info.) +*/ +static void removevars (FuncState *fs, int tolevel) { + fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel); + while (fs->nactvar > tolevel) + getlocvar(fs, --fs->nactvar)->endpc = fs->pc; +} + + +/* +** Search the upvalues of the function 'fs' for one +** with the given 'name'. +*/ +static int searchupvalue (FuncState *fs, TString *name) { + int i; + Upvaldesc *up = fs->f->upvalues; + for (i = 0; i < fs->nups; i++) { + if (eqstr(up[i].name, name)) return i; + } + return -1; /* not found */ +} + + +static int newupvalue (FuncState *fs, TString *name, expdesc *v) { + Proto *f = fs->f; + int oldsize = f->sizeupvalues; + checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues"); + luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues, + Upvaldesc, MAXUPVAL, "upvalues"); + while (oldsize < f->sizeupvalues) + f->upvalues[oldsize++].name = NULL; + f->upvalues[fs->nups].instack = (v->k == VLOCAL); + f->upvalues[fs->nups].idx = cast_byte(v->u.info); + f->upvalues[fs->nups].name = name; + luaC_objbarrier(fs->ls->L, f, name); + return fs->nups++; +} + + +/* +** Look for an active local variable with the name 'n' in the +** function 'fs'. +*/ +static int searchvar (FuncState *fs, TString *n) { + int i; + for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) { + if (eqstr(n, getlocvar(fs, i)->varname)) + return i; + } + return -1; /* not found */ +} + + +/* +** Mark block where variable at given level was defined +** (to emit close instructions later). +*/ +static void markupval (FuncState *fs, int level) { + BlockCnt *bl = fs->bl; + while (bl->nactvar > level) + bl = bl->previous; + bl->upval = 1; + fs->needclose = 1; +} + + +/* +** Find a variable with the given name 'n'. If it is an upvalue, add +** this upvalue into all intermediate functions. If it is a global, set +** 'var' as 'void' as a flag. +*/ +static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { + if (fs == NULL) /* no more levels? */ + init_exp(var, VVOID, 0); /* default is global */ + else { + int v = searchvar(fs, n); /* look up locals at current level */ + if (v >= 0) { /* found? */ + init_exp(var, VLOCAL, v); /* variable is local */ + if (!base) + markupval(fs, v); /* local will be used as an upval */ + } + else { /* not found as local at current level; try upvalues */ + int idx = searchupvalue(fs, n); /* try existing upvalues */ + if (idx < 0) { /* not found? */ + singlevaraux(fs->prev, n, var, 0); /* try upper levels */ + if (var->k == VVOID) /* not found? */ + return; /* it is a global */ + /* else was LOCAL or UPVAL */ + idx = newupvalue(fs, n, var); /* will be a new upvalue */ + } + init_exp(var, VUPVAL, idx); /* new or old upvalue */ + } + } +} + + +/* +** Find a variable with the given name 'n', handling global variables +** too. +*/ +static void singlevar (LexState *ls, expdesc *var) { + TString *varname = str_checkname(ls); + FuncState *fs = ls->fs; + singlevaraux(fs, varname, var, 1); + if (var->k == VVOID) { /* global name? */ + expdesc key; + singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ + lua_assert(var->k != VVOID); /* this one must exist */ + codestring(ls, &key, varname); /* key is variable name */ + luaK_indexed(fs, var, &key); /* env[varname] */ + } +} + + +/* +** Adjust the number of results from an expression list 'e' with 'nexps' +** expressions to 'nvars' values. +*/ +static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { + FuncState *fs = ls->fs; + int needed = nvars - nexps; /* extra values needed */ + if (hasmultret(e->k)) { /* last expression has multiple returns? */ + int extra = needed + 1; /* discount last expression itself */ + if (extra < 0) + extra = 0; + luaK_setreturns(fs, e, extra); /* last exp. provides the difference */ + } + else { + if (e->k != VVOID) /* at least one expression? */ + luaK_exp2nextreg(fs, e); /* close last expression */ + if (needed > 0) /* missing values? */ + luaK_nil(fs, fs->freereg, needed); /* complete with nils */ + } + if (needed > 0) + luaK_reserveregs(fs, needed); /* registers for extra values */ + else /* adding 'needed' is actually a subtraction */ + fs->freereg += needed; /* remove extra values */ +} + + +/* +** Macros to limit the maximum recursion depth while parsing +*/ +#define enterlevel(ls) luaE_enterCcall((ls)->L) + +#define leavelevel(ls) luaE_exitCcall((ls)->L) + + +/* +** Generates an error that a goto jumps into the scope of some +** local variable. +*/ +static l_noret jumpscopeerror (LexState *ls, Labeldesc *gt) { + const char *varname = getstr(getlocvar(ls->fs, gt->nactvar)->varname); + const char *msg = " at line %d jumps into the scope of local '%s'"; + msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line, varname); + luaK_semerror(ls, msg); /* raise the error */ +} + + +/* +** Solves the goto at index 'g' to given 'label' and removes it +** from the list of pending goto's. +** If it jumps into the scope of some variable, raises an error. +*/ +static void solvegoto (LexState *ls, int g, Labeldesc *label) { + int i; + Labellist *gl = &ls->dyd->gt; /* list of goto's */ + Labeldesc *gt = &gl->arr[g]; /* goto to be resolved */ + lua_assert(eqstr(gt->name, label->name)); + if (unlikely(gt->nactvar < label->nactvar)) /* enter some scope? */ + jumpscopeerror(ls, gt); + luaK_patchlist(ls->fs, gt->pc, label->pc); + for (i = g; i < gl->n - 1; i++) /* remove goto from pending list */ + gl->arr[i] = gl->arr[i + 1]; + gl->n--; +} + + +/* +** Search for an active label with the given name. +*/ +static Labeldesc *findlabel (LexState *ls, TString *name) { + int i; + Dyndata *dyd = ls->dyd; + /* check labels in current function for a match */ + for (i = ls->fs->firstlabel; i < dyd->label.n; i++) { + Labeldesc *lb = &dyd->label.arr[i]; + if (eqstr(lb->name, name)) /* correct label? */ + return lb; + } + return NULL; /* label not found */ +} + + +/* +** Adds a new label/goto in the corresponding list. +*/ +static int newlabelentry (LexState *ls, Labellist *l, TString *name, + int line, int pc) { + int n = l->n; + luaM_growvector(ls->L, l->arr, n, l->size, + Labeldesc, SHRT_MAX, "labels/gotos"); + l->arr[n].name = name; + l->arr[n].line = line; + l->arr[n].nactvar = ls->fs->nactvar; + l->arr[n].close = 0; + l->arr[n].pc = pc; + l->n = n + 1; + return n; +} + + +static int newgotoentry (LexState *ls, TString *name, int line, int pc) { + return newlabelentry(ls, &ls->dyd->gt, name, line, pc); +} + + +/* +** Solves forward jumps. Check whether new label 'lb' matches any +** pending gotos in current block and solves them. Return true +** if any of the goto's need to close upvalues. +*/ +static int solvegotos (LexState *ls, Labeldesc *lb) { + Labellist *gl = &ls->dyd->gt; + int i = ls->fs->bl->firstgoto; + int needsclose = 0; + while (i < gl->n) { + if (eqstr(gl->arr[i].name, lb->name)) { + needsclose |= gl->arr[i].close; + solvegoto(ls, i, lb); /* will remove 'i' from the list */ + } + else + i++; + } + return needsclose; +} + + +/* +** Create a new label with the given 'name' at the given 'line'. +** 'last' tells whether label is the last non-op statement in its +** block. Solves all pending goto's to this new label and adds +** a close instruction if necessary. +** Returns true iff it added a close instruction. +*/ +static int createlabel (LexState *ls, TString *name, int line, + int last) { + FuncState *fs = ls->fs; + Labellist *ll = &ls->dyd->label; + int l = newlabelentry(ls, ll, name, line, luaK_getlabel(fs)); + if (last) { /* label is last no-op statement in the block? */ + /* assume that locals are already out of scope */ + ll->arr[l].nactvar = fs->bl->nactvar; + } + if (solvegotos(ls, &ll->arr[l])) { /* need close? */ + luaK_codeABC(fs, OP_CLOSE, fs->nactvar, 0, 0); + return 1; + } + return 0; +} + + +/* +** Adjust pending gotos to outer level of a block. +*/ +static void movegotosout (FuncState *fs, BlockCnt *bl) { + int i; + Labellist *gl = &fs->ls->dyd->gt; + /* correct pending gotos to current block */ + for (i = bl->firstgoto; i < gl->n; i++) { /* for each pending goto */ + Labeldesc *gt = &gl->arr[i]; + if (gt->nactvar > bl->nactvar) { /* leaving a variable scope? */ + gt->nactvar = bl->nactvar; /* update goto level */ + gt->close |= bl->upval; /* jump may need a close */ + } + } +} + + +static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) { + bl->isloop = isloop; + bl->nactvar = fs->nactvar; + bl->firstlabel = fs->ls->dyd->label.n; + bl->firstgoto = fs->ls->dyd->gt.n; + bl->upval = 0; + bl->insidetbc = (fs->bl != NULL && fs->bl->insidetbc); + bl->previous = fs->bl; + fs->bl = bl; + lua_assert(fs->freereg == fs->nactvar); +} + + +/* +** generates an error for an undefined 'goto'. +*/ +static l_noret undefgoto (LexState *ls, Labeldesc *gt) { + const char *msg; + if (eqstr(gt->name, luaS_newliteral(ls->L, "break"))) { + msg = "break outside loop at line %d"; + msg = luaO_pushfstring(ls->L, msg, gt->line); + } + else { + msg = "no visible label '%s' for at line %d"; + msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); + } + luaK_semerror(ls, msg); +} + + +static void leaveblock (FuncState *fs) { + BlockCnt *bl = fs->bl; + LexState *ls = fs->ls; + int hasclose = 0; + if (bl->isloop) /* fix pending breaks? */ + hasclose = createlabel(ls, luaS_newliteral(ls->L, "break"), 0, 0); + if (!hasclose && bl->previous && bl->upval) + luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0); + fs->bl = bl->previous; + removevars(fs, bl->nactvar); + lua_assert(bl->nactvar == fs->nactvar); + fs->freereg = fs->nactvar; /* free registers */ + ls->dyd->label.n = bl->firstlabel; /* remove local labels */ + if (bl->previous) /* inner block? */ + movegotosout(fs, bl); /* update pending gotos to outer block */ + else { + if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */ + undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ + } +} + + +/* +** adds a new prototype into list of prototypes +*/ +static Proto *addprototype (LexState *ls) { + Proto *clp; + lua_State *L = ls->L; + FuncState *fs = ls->fs; + Proto *f = fs->f; /* prototype of current function */ + if (fs->np >= f->sizep) { + int oldsize = f->sizep; + luaM_growvector(L, f->p, fs->np, f->sizep, Proto *, MAXARG_Bx, "functions"); + while (oldsize < f->sizep) + f->p[oldsize++] = NULL; + } + f->p[fs->np++] = clp = luaF_newproto(L); + luaC_objbarrier(L, f, clp); + return clp; +} + + +/* +** codes instruction to create new closure in parent function. +** The OP_CLOSURE instruction must use the last available register, +** so that, if it invokes the GC, the GC knows which registers +** are in use at that time. +*/ +static void codeclosure (LexState *ls, expdesc *v) { + FuncState *fs = ls->fs->prev; + init_exp(v, VRELOC, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np - 1)); + luaK_exp2nextreg(fs, v); /* fix it at the last register */ +} + + +static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { + Proto *f = fs->f; + fs->prev = ls->fs; /* linked list of funcstates */ + fs->ls = ls; + ls->fs = fs; + fs->pc = 0; + fs->previousline = f->linedefined; + fs->iwthabs = 0; + fs->lasttarget = 0; + fs->freereg = 0; + fs->nk = 0; + fs->nabslineinfo = 0; + fs->np = 0; + fs->nups = 0; + fs->nlocvars = 0; + fs->nactvar = 0; + fs->needclose = 0; + fs->firstlocal = ls->dyd->actvar.n; + fs->firstlabel = ls->dyd->label.n; + fs->bl = NULL; + f->source = ls->source; + f->maxstacksize = 2; /* registers 0/1 are always valid */ + enterblock(fs, bl, 0); +} + + +static void close_func (LexState *ls) { + lua_State *L = ls->L; + FuncState *fs = ls->fs; + Proto *f = fs->f; + luaK_ret(fs, fs->nactvar, 0); /* final return */ + leaveblock(fs); + lua_assert(fs->bl == NULL); + luaK_finish(fs); + luaM_shrinkvector(L, f->code, f->sizecode, fs->pc, Instruction); + luaM_shrinkvector(L, f->lineinfo, f->sizelineinfo, fs->pc, ls_byte); + luaM_shrinkvector(L, f->abslineinfo, f->sizeabslineinfo, + fs->nabslineinfo, AbsLineInfo); + luaM_shrinkvector(L, f->k, f->sizek, fs->nk, TValue); + luaM_shrinkvector(L, f->p, f->sizep, fs->np, Proto *); + luaM_shrinkvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); + luaM_shrinkvector(L, f->upvalues, f->sizeupvalues, fs->nups, Upvaldesc); + ls->fs = fs->prev; + luaC_checkGC(L); +} + + + +/*============================================================*/ +/* GRAMMAR RULES */ +/*============================================================*/ + + +/* +** check whether current token is in the follow set of a block. +** 'until' closes syntactical blocks, but do not close scope, +** so it is handled in separate. +*/ +static int block_follow (LexState *ls, int withuntil) { + switch (ls->t.token) { + case TK_ELSE: case TK_ELSEIF: + case TK_END: case TK_EOS: + return 1; + case TK_UNTIL: return withuntil; + default: return 0; + } +} + + +static void statlist (LexState *ls) { + /* statlist -> { stat [';'] } */ + while (!block_follow(ls, 1)) { + if (ls->t.token == TK_RETURN) { + statement(ls); + return; /* 'return' must be last statement */ + } + statement(ls); + } +} + + +static void fieldsel (LexState *ls, expdesc *v) { + /* fieldsel -> ['.' | ':'] NAME */ + FuncState *fs = ls->fs; + expdesc key; + luaK_exp2anyregup(fs, v); + luaX_next(ls); /* skip the dot or colon */ + codename(ls, &key); + luaK_indexed(fs, v, &key); +} + + +static void yindex (LexState *ls, expdesc *v) { + /* index -> '[' expr ']' */ + luaX_next(ls); /* skip the '[' */ + expr(ls, v); + luaK_exp2val(ls->fs, v); + checknext(ls, ']'); +} + + +/* +** {====================================================================== +** Rules for Constructors +** ======================================================================= +*/ + + +struct ConsControl { + expdesc v; /* last list item read */ + expdesc *t; /* table descriptor */ + int nh; /* total number of 'record' elements */ + int na; /* total number of array elements */ + int tostore; /* number of array elements pending to be stored */ +}; + + +static void recfield (LexState *ls, struct ConsControl *cc) { + /* recfield -> (NAME | '['exp']') = exp */ + FuncState *fs = ls->fs; + int reg = ls->fs->freereg; + expdesc tab, key, val; + if (ls->t.token == TK_NAME) { + checklimit(fs, cc->nh, MAX_INT, "items in a constructor"); + codename(ls, &key); + } + else /* ls->t.token == '[' */ + yindex(ls, &key); + cc->nh++; + checknext(ls, '='); + tab = *cc->t; + luaK_indexed(fs, &tab, &key); + expr(ls, &val); + luaK_storevar(fs, &tab, &val); + fs->freereg = reg; /* free registers */ +} + + +static void closelistfield (FuncState *fs, struct ConsControl *cc) { + if (cc->v.k == VVOID) return; /* there is no list item */ + luaK_exp2nextreg(fs, &cc->v); + cc->v.k = VVOID; + if (cc->tostore == LFIELDS_PER_FLUSH) { + luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore); /* flush */ + cc->tostore = 0; /* no more items pending */ + } +} + + +static void lastlistfield (FuncState *fs, struct ConsControl *cc) { + if (cc->tostore == 0) return; + if (hasmultret(cc->v.k)) { + luaK_setmultret(fs, &cc->v); + luaK_setlist(fs, cc->t->u.info, cc->na, LUA_MULTRET); + cc->na--; /* do not count last expression (unknown number of elements) */ + } + else { + if (cc->v.k != VVOID) + luaK_exp2nextreg(fs, &cc->v); + luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore); + } +} + + +static void listfield (LexState *ls, struct ConsControl *cc) { + /* listfield -> exp */ + expr(ls, &cc->v); + checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); + cc->na++; + cc->tostore++; +} + + +static void field (LexState *ls, struct ConsControl *cc) { + /* field -> listfield | recfield */ + switch(ls->t.token) { + case TK_NAME: { /* may be 'listfield' or 'recfield' */ + if (luaX_lookahead(ls) != '=') /* expression? */ + listfield(ls, cc); + else + recfield(ls, cc); + break; + } + case '[': { + recfield(ls, cc); + break; + } + default: { + listfield(ls, cc); + break; + } + } +} + + +static void constructor (LexState *ls, expdesc *t) { + /* constructor -> '{' [ field { sep field } [sep] ] '}' + sep -> ',' | ';' */ + FuncState *fs = ls->fs; + int line = ls->linenumber; + int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); + struct ConsControl cc; + cc.na = cc.nh = cc.tostore = 0; + cc.t = t; + init_exp(t, VRELOC, pc); + init_exp(&cc.v, VVOID, 0); /* no value (yet) */ + luaK_exp2nextreg(ls->fs, t); /* fix it at stack top */ + checknext(ls, '{'); + do { + lua_assert(cc.v.k == VVOID || cc.tostore > 0); + if (ls->t.token == '}') break; + closelistfield(fs, &cc); + field(ls, &cc); + } while (testnext(ls, ',') || testnext(ls, ';')); + check_match(ls, '}', '{', line); + lastlistfield(fs, &cc); + SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */ + SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh)); /* set initial table size */ +} + +/* }====================================================================== */ + + +static void setvararg (FuncState *fs, int nparams) { + fs->f->is_vararg = 1; + luaK_codeABC(fs, OP_PREPVARARG, nparams, 0, 0); +} + + +static void parlist (LexState *ls) { + /* parlist -> [ param { ',' param } ] */ + FuncState *fs = ls->fs; + Proto *f = fs->f; + int nparams = 0; + int isvararg = 0; + if (ls->t.token != ')') { /* is 'parlist' not empty? */ + do { + switch (ls->t.token) { + case TK_NAME: { /* param -> NAME */ + new_localvar(ls, str_checkname(ls)); + nparams++; + break; + } + case TK_DOTS: { /* param -> '...' */ + luaX_next(ls); + isvararg = 1; + break; + } + default: luaX_syntaxerror(ls, " or '...' expected"); + } + } while (!isvararg && testnext(ls, ',')); + } + adjustlocalvars(ls, nparams); + f->numparams = cast_byte(fs->nactvar); + if (isvararg) + setvararg(fs, f->numparams); /* declared vararg */ + luaK_reserveregs(fs, fs->nactvar); /* reserve registers for parameters */ +} + + +static void body (LexState *ls, expdesc *e, int ismethod, int line) { + /* body -> '(' parlist ')' block END */ + FuncState new_fs; + BlockCnt bl; + new_fs.f = addprototype(ls); + new_fs.f->linedefined = line; + open_func(ls, &new_fs, &bl); + checknext(ls, '('); + if (ismethod) { + new_localvarliteral(ls, "self"); /* create 'self' parameter */ + adjustlocalvars(ls, 1); + } + parlist(ls); + checknext(ls, ')'); + statlist(ls); + new_fs.f->lastlinedefined = ls->linenumber; + check_match(ls, TK_END, TK_FUNCTION, line); + codeclosure(ls, e); + close_func(ls); +} + + +static int explist (LexState *ls, expdesc *v) { + /* explist -> expr { ',' expr } */ + int n = 1; /* at least one expression */ + expr(ls, v); + while (testnext(ls, ',')) { + luaK_exp2nextreg(ls->fs, v); + expr(ls, v); + n++; + } + return n; +} + + +static void funcargs (LexState *ls, expdesc *f, int line) { + FuncState *fs = ls->fs; + expdesc args; + int base, nparams; + switch (ls->t.token) { + case '(': { /* funcargs -> '(' [ explist ] ')' */ + luaX_next(ls); + if (ls->t.token == ')') /* arg list is empty? */ + args.k = VVOID; + else { + explist(ls, &args); + luaK_setmultret(fs, &args); + } + check_match(ls, ')', '(', line); + break; + } + case '{': { /* funcargs -> constructor */ + constructor(ls, &args); + break; + } + case TK_STRING: { /* funcargs -> STRING */ + codestring(ls, &args, ls->t.seminfo.ts); + luaX_next(ls); /* must use 'seminfo' before 'next' */ + break; + } + default: { + luaX_syntaxerror(ls, "function arguments expected"); + } + } + lua_assert(f->k == VNONRELOC); + base = f->u.info; /* base register for call */ + if (hasmultret(args.k)) + nparams = LUA_MULTRET; /* open call */ + else { + if (args.k != VVOID) + luaK_exp2nextreg(fs, &args); /* close last argument */ + nparams = fs->freereg - (base+1); + } + init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2)); + luaK_fixline(fs, line); + fs->freereg = base+1; /* call remove function and arguments and leaves + (unless changed) one result */ +} + + + + +/* +** {====================================================================== +** Expression parsing +** ======================================================================= +*/ + + +static void primaryexp (LexState *ls, expdesc *v) { + /* primaryexp -> NAME | '(' expr ')' */ + switch (ls->t.token) { + case '(': { + int line = ls->linenumber; + luaX_next(ls); + expr(ls, v); + check_match(ls, ')', '(', line); + luaK_dischargevars(ls->fs, v); + return; + } + case TK_NAME: { + singlevar(ls, v); + return; + } + default: { + luaX_syntaxerror(ls, "unexpected symbol"); + } + } +} + + +static void suffixedexp (LexState *ls, expdesc *v) { + /* suffixedexp -> + primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */ + FuncState *fs = ls->fs; + int line = ls->linenumber; + primaryexp(ls, v); + for (;;) { + switch (ls->t.token) { + case '.': { /* fieldsel */ + fieldsel(ls, v); + break; + } + case '[': { /* '[' exp ']' */ + expdesc key; + luaK_exp2anyregup(fs, v); + yindex(ls, &key); + luaK_indexed(fs, v, &key); + break; + } + case ':': { /* ':' NAME funcargs */ + expdesc key; + luaX_next(ls); + codename(ls, &key); + luaK_self(fs, v, &key); + funcargs(ls, v, line); + break; + } + case '(': case TK_STRING: case '{': { /* funcargs */ + luaK_exp2nextreg(fs, v); + funcargs(ls, v, line); + break; + } + default: return; + } + } +} + + +static void simpleexp (LexState *ls, expdesc *v) { + /* simpleexp -> FLT | INT | STRING | NIL | TRUE | FALSE | ... | + constructor | FUNCTION body | suffixedexp */ + switch (ls->t.token) { + case TK_FLT: { + init_exp(v, VKFLT, 0); + v->u.nval = ls->t.seminfo.r; + break; + } + case TK_INT: { + init_exp(v, VKINT, 0); + v->u.ival = ls->t.seminfo.i; + break; + } + case TK_STRING: { + codestring(ls, v, ls->t.seminfo.ts); + break; + } + case TK_NIL: { + init_exp(v, VNIL, 0); + break; + } + case TK_TRUE: { + init_exp(v, VTRUE, 0); + break; + } + case TK_FALSE: { + init_exp(v, VFALSE, 0); + break; + } + case TK_DOTS: { /* vararg */ + FuncState *fs = ls->fs; + check_condition(ls, fs->f->is_vararg, + "cannot use '...' outside a vararg function"); + init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 0, 1)); + break; + } + case '{': { /* constructor */ + constructor(ls, v); + return; + } + case TK_FUNCTION: { + luaX_next(ls); + body(ls, v, 0, ls->linenumber); + return; + } + default: { + suffixedexp(ls, v); + return; + } + } + luaX_next(ls); +} + + +static UnOpr getunopr (int op) { + switch (op) { + case TK_NOT: return OPR_NOT; + case '-': return OPR_MINUS; + case '~': return OPR_BNOT; + case '#': return OPR_LEN; + default: return OPR_NOUNOPR; + } +} + + +static BinOpr getbinopr (int op) { + switch (op) { + case '+': return OPR_ADD; + case '-': return OPR_SUB; + case '*': return OPR_MUL; + case '%': return OPR_MOD; + case '^': return OPR_POW; + case '/': return OPR_DIV; + case TK_IDIV: return OPR_IDIV; + case '&': return OPR_BAND; + case '|': return OPR_BOR; + case '~': return OPR_BXOR; + case TK_SHL: return OPR_SHL; + case TK_SHR: return OPR_SHR; + case TK_CONCAT: return OPR_CONCAT; + case TK_NE: return OPR_NE; + case TK_EQ: return OPR_EQ; + case '<': return OPR_LT; + case TK_LE: return OPR_LE; + case '>': return OPR_GT; + case TK_GE: return OPR_GE; + case TK_AND: return OPR_AND; + case TK_OR: return OPR_OR; + default: return OPR_NOBINOPR; + } +} + + +/* +** Priority table for binary operators. +*/ +static const struct { + lu_byte left; /* left priority for each binary operator */ + lu_byte right; /* right priority */ +} priority[] = { /* ORDER OPR */ + {10, 10}, {10, 10}, /* '+' '-' */ + {11, 11}, {11, 11}, /* '*' '%' */ + {14, 13}, /* '^' (right associative) */ + {11, 11}, {11, 11}, /* '/' '//' */ + {6, 6}, {4, 4}, {5, 5}, /* '&' '|' '~' */ + {7, 7}, {7, 7}, /* '<<' '>>' */ + {9, 8}, /* '..' (right associative) */ + {3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */ + {3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */ + {2, 2}, {1, 1} /* and, or */ +}; + +#define UNARY_PRIORITY 12 /* priority for unary operators */ + + +/* +** subexpr -> (simpleexp | unop subexpr) { binop subexpr } +** where 'binop' is any binary operator with a priority higher than 'limit' +*/ +static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { + BinOpr op; + UnOpr uop; + enterlevel(ls); + uop = getunopr(ls->t.token); + if (uop != OPR_NOUNOPR) { /* prefix (unary) operator? */ + int line = ls->linenumber; + luaX_next(ls); /* skip operator */ + subexpr(ls, v, UNARY_PRIORITY); + luaK_prefix(ls->fs, uop, v, line); + } + else simpleexp(ls, v); + /* expand while operators have priorities higher than 'limit' */ + op = getbinopr(ls->t.token); + while (op != OPR_NOBINOPR && priority[op].left > limit) { + expdesc v2; + BinOpr nextop; + int line = ls->linenumber; + luaX_next(ls); /* skip operator */ + luaK_infix(ls->fs, op, v); + /* read sub-expression with higher priority */ + nextop = subexpr(ls, &v2, priority[op].right); + luaK_posfix(ls->fs, op, v, &v2, line); + op = nextop; + } + leavelevel(ls); + return op; /* return first untreated operator */ +} + + +static void expr (LexState *ls, expdesc *v) { + subexpr(ls, v, 0); +} + +/* }==================================================================== */ + + + +/* +** {====================================================================== +** Rules for Statements +** ======================================================================= +*/ + + +static void block (LexState *ls) { + /* block -> statlist */ + FuncState *fs = ls->fs; + BlockCnt bl; + enterblock(fs, &bl, 0); + statlist(ls); + leaveblock(fs); +} + + +/* +** structure to chain all variables in the left-hand side of an +** assignment +*/ +struct LHS_assign { + struct LHS_assign *prev; + expdesc v; /* variable (global, local, upvalue, or indexed) */ +}; + + +/* +** check whether, in an assignment to an upvalue/local variable, the +** upvalue/local variable is begin used in a previous assignment to a +** table. If so, save original upvalue/local value in a safe place and +** use this safe copy in the previous assignment. +*/ +static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { + FuncState *fs = ls->fs; + int extra = fs->freereg; /* eventual position to save local variable */ + int conflict = 0; + for (; lh; lh = lh->prev) { /* check all previous assignments */ + if (vkisindexed(lh->v.k)) { /* assignment to table field? */ + if (lh->v.k == VINDEXUP) { /* is table an upvalue? */ + if (v->k == VUPVAL && lh->v.u.ind.t == v->u.info) { + conflict = 1; /* table is the upvalue being assigned now */ + lh->v.k = VINDEXSTR; + lh->v.u.ind.t = extra; /* assignment will use safe copy */ + } + } + else { /* table is a register */ + if (v->k == VLOCAL && lh->v.u.ind.t == v->u.info) { + conflict = 1; /* table is the local being assigned now */ + lh->v.u.ind.t = extra; /* assignment will use safe copy */ + } + /* is index the local being assigned? */ + if (lh->v.k == VINDEXED && v->k == VLOCAL && + lh->v.u.ind.idx == v->u.info) { + conflict = 1; + lh->v.u.ind.idx = extra; /* previous assignment will use safe copy */ + } + } + } + } + if (conflict) { + /* copy upvalue/local value to a temporary (in position 'extra') */ + OpCode op = (v->k == VLOCAL) ? OP_MOVE : OP_GETUPVAL; + luaK_codeABC(fs, op, extra, v->u.info, 0); + luaK_reserveregs(fs, 1); + } +} + +/* +** Parse and compile a mulitple assignment. The first "variable" +** (a 'suffixedexp') was already read by the caller. +** +** assignment -> suffixedexp restassign +** restassign -> ',' suffixedexp restassign | '=' explist +*/ +static void restassign (LexState *ls, struct LHS_assign *lh, int nvars) { + expdesc e; + check_condition(ls, vkisvar(lh->v.k), "syntax error"); + if (testnext(ls, ',')) { /* restassign -> ',' suffixedexp restassign */ + struct LHS_assign nv; + nv.prev = lh; + suffixedexp(ls, &nv.v); + if (!vkisindexed(nv.v.k)) + check_conflict(ls, lh, &nv.v); + enterlevel(ls); /* control recursion depth */ + restassign(ls, &nv, nvars+1); + leavelevel(ls); + } + else { /* restassign -> '=' explist */ + int nexps; + checknext(ls, '='); + nexps = explist(ls, &e); + if (nexps != nvars) + adjust_assign(ls, nvars, nexps, &e); + else { + luaK_setoneret(ls->fs, &e); /* close last expression */ + luaK_storevar(ls->fs, &lh->v, &e); + return; /* avoid default */ + } + } + init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ + luaK_storevar(ls->fs, &lh->v, &e); +} + + +static int cond (LexState *ls) { + /* cond -> exp */ + expdesc v; + expr(ls, &v); /* read condition */ + if (v.k == VNIL) v.k = VFALSE; /* 'falses' are all equal here */ + luaK_goiftrue(ls->fs, &v); + return v.f; +} + + +static void gotostat (LexState *ls) { + FuncState *fs = ls->fs; + int line = ls->linenumber; + TString *name = str_checkname(ls); /* label's name */ + Labeldesc *lb = findlabel(ls, name); + if (lb == NULL) /* no label? */ + /* forward jump; will be resolved when the label is declared */ + newgotoentry(ls, name, line, luaK_jump(fs)); + else { /* found a label */ + /* backward jump; will be resolved here */ + if (fs->nactvar > lb->nactvar) /* leaving the scope of some variable? */ + luaK_codeABC(fs, OP_CLOSE, lb->nactvar, 0, 0); + /* create jump and link it to the label */ + luaK_patchlist(fs, luaK_jump(fs), lb->pc); + } +} + + +/* +** Break statement. Semantically equivalent to "goto break". +*/ +static void breakstat (LexState *ls) { + int line = ls->linenumber; + luaX_next(ls); /* skip break */ + newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, luaK_jump(ls->fs)); +} + + +/* +** Check whether there is already a label with the given 'name'. +*/ +static void checkrepeated (LexState *ls, TString *name) { + Labeldesc *lb = findlabel(ls, name); + if (unlikely(lb != NULL)) { /* already defined? */ + const char *msg = "label '%s' already defined on line %d"; + msg = luaO_pushfstring(ls->L, msg, getstr(name), lb->line); + luaK_semerror(ls, msg); /* error */ + } +} + + +static void labelstat (LexState *ls, TString *name, int line) { + /* label -> '::' NAME '::' */ + checknext(ls, TK_DBCOLON); /* skip double colon */ + while (ls->t.token == ';' || ls->t.token == TK_DBCOLON) + statement(ls); /* skip other no-op statements */ + checkrepeated(ls, name); /* check for repeated labels */ + createlabel(ls, name, line, block_follow(ls, 0)); +} + + +static void whilestat (LexState *ls, int line) { + /* whilestat -> WHILE cond DO block END */ + FuncState *fs = ls->fs; + int whileinit; + int condexit; + BlockCnt bl; + luaX_next(ls); /* skip WHILE */ + whileinit = luaK_getlabel(fs); + condexit = cond(ls); + enterblock(fs, &bl, 1); + checknext(ls, TK_DO); + block(ls); + luaK_jumpto(fs, whileinit); + check_match(ls, TK_END, TK_WHILE, line); + leaveblock(fs); + luaK_patchtohere(fs, condexit); /* false conditions finish the loop */ +} + + +static void repeatstat (LexState *ls, int line) { + /* repeatstat -> REPEAT block UNTIL cond */ + int condexit; + FuncState *fs = ls->fs; + int repeat_init = luaK_getlabel(fs); + BlockCnt bl1, bl2; + enterblock(fs, &bl1, 1); /* loop block */ + enterblock(fs, &bl2, 0); /* scope block */ + luaX_next(ls); /* skip REPEAT */ + statlist(ls); + check_match(ls, TK_UNTIL, TK_REPEAT, line); + condexit = cond(ls); /* read condition (inside scope block) */ + leaveblock(fs); /* finish scope */ + if (bl2.upval) { /* upvalues? */ + int exit = luaK_jump(fs); /* normal exit must jump over fix */ + luaK_patchtohere(fs, condexit); /* repetition must close upvalues */ + luaK_codeABC(fs, OP_CLOSE, bl2.nactvar, 0, 0); + condexit = luaK_jump(fs); /* repeat after closing upvalues */ + luaK_patchtohere(fs, exit); /* normal exit comes to here */ + } + luaK_patchlist(fs, condexit, repeat_init); /* close the loop */ + leaveblock(fs); /* finish loop */ +} + + +/* +** Read an expression and generate code to put its results in next +** stack slot. Return true if expression is a constant integer and, +** if 'i' is not-zero, its value is equal to 'i'. +** +*/ +static int exp1 (LexState *ls, int i) { + expdesc e; + int res; + expr(ls, &e); + res = luaK_isKint(&e) && (i == 0 || i == e.u.ival); + luaK_exp2nextreg(ls->fs, &e); + lua_assert(e.k == VNONRELOC); + return res; +} + + +/* +** Fix for instruction at position 'pc' to jump to 'dest'. +** (Jump addresses are relative in Lua). 'back' true means +** a back jump. +*/ +static void fixforjump (FuncState *fs, int pc, int dest, int back) { + Instruction *jmp = &fs->f->code[pc]; + int offset = dest - (pc + 1); + if (back) + offset = -offset; + if (unlikely(offset > MAXARG_Bx)) + luaX_syntaxerror(fs->ls, "control structure too long"); + SETARG_Bx(*jmp, offset); +} + + +/* +** Generate code for a 'for' loop. 'kind' can be zero (a common for +** loop), one (a basic for loop, with integer values and increment of +** 1), or two (a generic for loop). +*/ +static void forbody (LexState *ls, int base, int line, int nvars, int kind) { + /* forbody -> DO block */ + static OpCode forprep[3] = {OP_FORPREP, OP_FORPREP1, OP_TFORPREP}; + static OpCode forloop[3] = {OP_FORLOOP, OP_FORLOOP1, OP_TFORLOOP}; + BlockCnt bl; + FuncState *fs = ls->fs; + int prep, endfor; + checknext(ls, TK_DO); + prep = luaK_codeABx(fs, forprep[kind], base, 0); + enterblock(fs, &bl, 0); /* scope for declared variables */ + adjustlocalvars(ls, nvars); + luaK_reserveregs(fs, nvars); + block(ls); + leaveblock(fs); /* end of scope for declared variables */ + fixforjump(fs, prep, luaK_getlabel(fs), 0); + if (kind == 2) { /* generic for? */ + luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars); + luaK_fixline(fs, line); + base += 2; /* base for 'OP_TFORLOOP' (skips function and state) */ + } + endfor = luaK_codeABx(fs, forloop[kind], base, 0); + fixforjump(fs, endfor, prep + 1, 1); + luaK_fixline(fs, line); +} + + +static void fornum (LexState *ls, TString *varname, int line) { + /* fornum -> NAME = exp,exp[,exp] forbody */ + FuncState *fs = ls->fs; + int base = fs->freereg; + int basicfor = 1; /* true if it is a "basic" 'for' (integer + 1) */ + new_localvarliteral(ls, "(for index)"); + new_localvarliteral(ls, "(for limit)"); + new_localvarliteral(ls, "(for step)"); + new_localvar(ls, varname); + checknext(ls, '='); + if (!exp1(ls, 0)) /* initial value not an integer? */ + basicfor = 0; /* not a basic 'for' */ + checknext(ls, ','); + exp1(ls, 0); /* limit */ + if (testnext(ls, ',')) { + if (!exp1(ls, 1)) /* optional step not 1? */ + basicfor = 0; /* not a basic 'for' */ + } + else { /* default step = 1 */ + luaK_int(fs, fs->freereg, 1); + luaK_reserveregs(fs, 1); + } + adjustlocalvars(ls, 3); /* control variables */ + forbody(ls, base, line, 1, basicfor); +} + + +static void forlist (LexState *ls, TString *indexname) { + /* forlist -> NAME {,NAME} IN explist forbody */ + FuncState *fs = ls->fs; + expdesc e; + int nvars = 5; /* gen, state, control, toclose, 'indexname' */ + int line; + int base = fs->freereg; + /* create control variables */ + new_localvarliteral(ls, "(for generator)"); + new_localvarliteral(ls, "(for state)"); + markupval(fs, fs->nactvar); /* state may create an upvalue */ + new_localvarliteral(ls, "(for control)"); + new_localvarliteral(ls, "(for toclose)"); + /* create declared variables */ + new_localvar(ls, indexname); + while (testnext(ls, ',')) { + new_localvar(ls, str_checkname(ls)); + nvars++; + } + checknext(ls, TK_IN); + line = ls->linenumber; + adjust_assign(ls, 4, explist(ls, &e), &e); + adjustlocalvars(ls, 4); /* control variables */ + luaK_checkstack(fs, 3); /* extra space to call generator */ + forbody(ls, base, line, nvars - 4, 2); +} + + +static void forstat (LexState *ls, int line) { + /* forstat -> FOR (fornum | forlist) END */ + FuncState *fs = ls->fs; + TString *varname; + BlockCnt bl; + enterblock(fs, &bl, 1); /* scope for loop and control variables */ + luaX_next(ls); /* skip 'for' */ + varname = str_checkname(ls); /* first variable name */ + switch (ls->t.token) { + case '=': fornum(ls, varname, line); break; + case ',': case TK_IN: forlist(ls, varname); break; + default: luaX_syntaxerror(ls, "'=' or 'in' expected"); + } + check_match(ls, TK_END, TK_FOR, line); + leaveblock(fs); /* loop scope ('break' jumps to this point) */ +} + + +/* +** Check whether next instruction is a single jump (a 'break', a 'goto' +** to a forward label, or a 'goto' to a backward label with no variable +** to close). If so, set the name of the 'label' it is jumping to +** ("break" for a 'break') or to where it is jumping to ('target') and +** return true. If not a single jump, leave input unchanged, to be +** handled as a regular statement. +*/ +static int issinglejump (LexState *ls, TString **label, int *target) { + if (testnext(ls, TK_BREAK)) { /* a break? */ + *label = luaS_newliteral(ls->L, "break"); + return 1; + } + else if (ls->t.token != TK_GOTO || luaX_lookahead(ls) != TK_NAME) + return 0; /* not a valid goto */ + else { + TString *lname = ls->lookahead.seminfo.ts; /* label's id */ + Labeldesc *lb = findlabel(ls, lname); + if (lb) { /* a backward jump? */ + if (ls->fs->nactvar > lb->nactvar) /* needs to close variables? */ + return 0; /* not a single jump; cannot optimize */ + *target = lb->pc; + } + else /* jump forward */ + *label = lname; + luaX_next(ls); /* skip goto */ + luaX_next(ls); /* skip name */ + return 1; + } +} + + +static void test_then_block (LexState *ls, int *escapelist) { + /* test_then_block -> [IF | ELSEIF] cond THEN block */ + BlockCnt bl; + int line; + FuncState *fs = ls->fs; + TString *jlb = NULL; + int target = NO_JUMP; + expdesc v; + int jf; /* instruction to skip 'then' code (if condition is false) */ + luaX_next(ls); /* skip IF or ELSEIF */ + expr(ls, &v); /* read condition */ + checknext(ls, TK_THEN); + line = ls->linenumber; + if (issinglejump(ls, &jlb, &target)) { /* 'if x then goto' ? */ + luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */ + enterblock(fs, &bl, 0); /* must enter block before 'goto' */ + if (jlb != NULL) /* forward jump? */ + newgotoentry(ls, jlb, line, v.t); /* will be resolved later */ + else /* backward jump */ + luaK_patchlist(fs, v.t, target); /* jump directly to 'target' */ + while (testnext(ls, ';')) {} /* skip semicolons */ + if (block_follow(ls, 0)) { /* jump is the entire block? */ + leaveblock(fs); + return; /* and that is it */ + } + else /* must skip over 'then' part if condition is false */ + jf = luaK_jump(fs); + } + else { /* regular case (not a jump) */ + luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ + enterblock(fs, &bl, 0); + jf = v.f; + } + statlist(ls); /* 'then' part */ + leaveblock(fs); + if (ls->t.token == TK_ELSE || + ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ + luaK_concat(fs, escapelist, luaK_jump(fs)); /* must jump over it */ + luaK_patchtohere(fs, jf); +} + + +static void ifstat (LexState *ls, int line) { + /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ + FuncState *fs = ls->fs; + int escapelist = NO_JUMP; /* exit list for finished parts */ + test_then_block(ls, &escapelist); /* IF cond THEN block */ + while (ls->t.token == TK_ELSEIF) + test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */ + if (testnext(ls, TK_ELSE)) + block(ls); /* 'else' part */ + check_match(ls, TK_END, TK_IF, line); + luaK_patchtohere(fs, escapelist); /* patch escape list to 'if' end */ +} + + +static void localfunc (LexState *ls) { + expdesc b; + FuncState *fs = ls->fs; + new_localvar(ls, str_checkname(ls)); /* new local variable */ + adjustlocalvars(ls, 1); /* enter its scope */ + body(ls, &b, 0, ls->linenumber); /* function created in next register */ + /* debug information will only see the variable after this point! */ + getlocvar(fs, b.u.info)->startpc = fs->pc; +} + + +static void commonlocalstat (LexState *ls) { + /* stat -> LOCAL NAME {',' NAME} ['=' explist] */ + int nvars = 0; + int nexps; + expdesc e; + do { + new_localvar(ls, str_checkname(ls)); + nvars++; + } while (testnext(ls, ',')); + if (testnext(ls, '=')) + nexps = explist(ls, &e); + else { + e.k = VVOID; + nexps = 0; + } + adjust_assign(ls, nvars, nexps, &e); + adjustlocalvars(ls, nvars); +} + + +static void tocloselocalstat (LexState *ls) { + FuncState *fs = ls->fs; + TString *attr = str_checkname(ls); + if (strcmp(getstr(attr), "toclose") != 0) + luaK_semerror(ls, + luaO_pushfstring(ls->L, "unknown attribute '%s'", getstr(attr))); + new_localvar(ls, str_checkname(ls)); + checknext(ls, '='); + exp1(ls, 0); + markupval(fs, fs->nactvar); + fs->bl->insidetbc = 1; /* in the scope of a to-be-closed variable */ + adjustlocalvars(ls, 1); + luaK_codeABC(fs, OP_TBC, fs->nactvar - 1, 0, 0); +} + + +static void localstat (LexState *ls) { + /* stat -> LOCAL NAME {',' NAME} ['=' explist] + | LOCAL *toclose NAME '=' exp */ + if (testnext(ls, '*')) + tocloselocalstat(ls); + else + commonlocalstat(ls); +} + + +static int funcname (LexState *ls, expdesc *v) { + /* funcname -> NAME {fieldsel} [':' NAME] */ + int ismethod = 0; + singlevar(ls, v); + while (ls->t.token == '.') + fieldsel(ls, v); + if (ls->t.token == ':') { + ismethod = 1; + fieldsel(ls, v); + } + return ismethod; +} + + +static void funcstat (LexState *ls, int line) { + /* funcstat -> FUNCTION funcname body */ + int ismethod; + expdesc v, b; + luaX_next(ls); /* skip FUNCTION */ + ismethod = funcname(ls, &v); + body(ls, &b, ismethod, line); + luaK_storevar(ls->fs, &v, &b); + luaK_fixline(ls->fs, line); /* definition "happens" in the first line */ +} + + +static void exprstat (LexState *ls) { + /* stat -> func | assignment */ + FuncState *fs = ls->fs; + struct LHS_assign v; + suffixedexp(ls, &v.v); + if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */ + v.prev = NULL; + restassign(ls, &v, 1); + } + else { /* stat -> func */ + Instruction *inst = &getinstruction(fs, &v.v); + check_condition(ls, v.v.k == VCALL, "syntax error"); + SETARG_C(*inst, 1); /* call statement uses no results */ + } +} + + +static void retstat (LexState *ls) { + /* stat -> RETURN [explist] [';'] */ + FuncState *fs = ls->fs; + expdesc e; + int nret; /* number of values being returned */ + int first = fs->nactvar; /* first slot to be returned */ + if (block_follow(ls, 1) || ls->t.token == ';') + nret = 0; /* return no values */ + else { + nret = explist(ls, &e); /* optional return values */ + if (hasmultret(e.k)) { + luaK_setmultret(fs, &e); + if (e.k == VCALL && nret == 1 && !fs->bl->insidetbc) { /* tail call? */ + SET_OPCODE(getinstruction(fs,&e), OP_TAILCALL); + lua_assert(GETARG_A(getinstruction(fs,&e)) == fs->nactvar); + } + nret = LUA_MULTRET; /* return all values */ + } + else { + if (nret == 1) /* only one single value? */ + first = luaK_exp2anyreg(fs, &e); /* can use original slot */ + else { /* values must go to the top of the stack */ + luaK_exp2nextreg(fs, &e); + lua_assert(nret == fs->freereg - first); + } + } + } + luaK_ret(fs, first, nret); + testnext(ls, ';'); /* skip optional semicolon */ +} + + +static void statement (LexState *ls) { + int line = ls->linenumber; /* may be needed for error messages */ + enterlevel(ls); + switch (ls->t.token) { + case ';': { /* stat -> ';' (empty statement) */ + luaX_next(ls); /* skip ';' */ + break; + } + case TK_IF: { /* stat -> ifstat */ + ifstat(ls, line); + break; + } + case TK_WHILE: { /* stat -> whilestat */ + whilestat(ls, line); + break; + } + case TK_DO: { /* stat -> DO block END */ + luaX_next(ls); /* skip DO */ + block(ls); + check_match(ls, TK_END, TK_DO, line); + break; + } + case TK_FOR: { /* stat -> forstat */ + forstat(ls, line); + break; + } + case TK_REPEAT: { /* stat -> repeatstat */ + repeatstat(ls, line); + break; + } + case TK_FUNCTION: { /* stat -> funcstat */ + funcstat(ls, line); + break; + } + case TK_LOCAL: { /* stat -> localstat */ + luaX_next(ls); /* skip LOCAL */ + if (testnext(ls, TK_FUNCTION)) /* local function? */ + localfunc(ls); + else + localstat(ls); + break; + } + case TK_DBCOLON: { /* stat -> label */ + luaX_next(ls); /* skip double colon */ + labelstat(ls, str_checkname(ls), line); + break; + } + case TK_RETURN: { /* stat -> retstat */ + luaX_next(ls); /* skip RETURN */ + retstat(ls); + break; + } + case TK_BREAK: { /* stat -> breakstat */ + breakstat(ls); + break; + } + case TK_GOTO: { /* stat -> 'goto' NAME */ + luaX_next(ls); /* skip 'goto' */ + gotostat(ls); + break; + } + default: { /* stat -> func | assignment */ + exprstat(ls); + break; + } + } + lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && + ls->fs->freereg >= ls->fs->nactvar); + ls->fs->freereg = ls->fs->nactvar; /* free registers */ + leavelevel(ls); +} + +/* }====================================================================== */ + + +/* +** compiles the main function, which is a regular vararg function with an +** upvalue named LUA_ENV +*/ +static void mainfunc (LexState *ls, FuncState *fs) { + BlockCnt bl; + expdesc v; + open_func(ls, fs, &bl); + setvararg(fs, 0); /* main function is always declared vararg */ + init_exp(&v, VLOCAL, 0); /* create and... */ + newupvalue(fs, ls->envn, &v); /* ...set environment upvalue */ + luaX_next(ls); /* read first token */ + statlist(ls); /* parse main body */ + check(ls, TK_EOS); + close_func(ls); +} + + +LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, + Dyndata *dyd, const char *name, int firstchar) { + LexState lexstate; + FuncState funcstate; + LClosure *cl = luaF_newLclosure(L, 1); /* create main closure */ + setclLvalue2s(L, L->top, cl); /* anchor it (to avoid being collected) */ + luaD_inctop(L); + lexstate.h = luaH_new(L); /* create table for scanner */ + sethvalue2s(L, L->top, lexstate.h); /* anchor it */ + luaD_inctop(L); + funcstate.f = cl->p = luaF_newproto(L); + funcstate.f->source = luaS_new(L, name); /* create and anchor TString */ + luaC_objbarrier(L, funcstate.f, funcstate.f->source); + lexstate.buff = buff; + lexstate.dyd = dyd; + dyd->actvar.n = dyd->gt.n = dyd->label.n = 0; + luaX_setinput(L, &lexstate, z, funcstate.f->source, firstchar); + mainfunc(&lexstate, &funcstate); + lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs); + /* all scopes should be correctly finished */ + lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0); + L->top--; /* remove scanner's table */ + return cl; /* closure is on the stack, too */ +} + diff --git a/source/lua/lparser.h b/source/lua/lparser.h new file mode 100644 index 0000000..3d6bd97 --- /dev/null +++ b/source/lua/lparser.h @@ -0,0 +1,146 @@ +/* +** $Id: lparser.h $ +** Lua Parser +** See Copyright Notice in lua.h +*/ + +#ifndef lparser_h +#define lparser_h + +#include "llimits.h" +#include "lobject.h" +#include "lzio.h" + + +/* +** Expression and variable descriptor. +** Code generation for variables and expressions can be delayed to allow +** optimizations; An 'expdesc' structure describes a potentially-delayed +** variable/expression. It has a description of its "main" value plus a +** list of conditional jumps that can also produce its value (generated +** by short-circuit operators 'and'/'or'). +*/ + +/* kinds of variables/expressions */ +typedef enum { + VVOID, /* when 'expdesc' describes the last expression a list, + this kind means an empty list (so, no expression) */ + VNIL, /* constant nil */ + VTRUE, /* constant true */ + VFALSE, /* constant false */ + VK, /* constant in 'k'; info = index of constant in 'k' */ + VKFLT, /* floating constant; nval = numerical float value */ + VKINT, /* integer constant; nval = numerical integer value */ + VNONRELOC, /* expression has its value in a fixed register; + info = result register */ + VLOCAL, /* local variable; info = local register */ + VUPVAL, /* upvalue variable; info = index of upvalue in 'upvalues' */ + VINDEXED, /* indexed variable; + ind.t = table register; + ind.idx = key's R index */ + VINDEXUP, /* indexed upvalue; + ind.t = table upvalue; + ind.idx = key's K index */ + VINDEXI, /* indexed variable with constant integer; + ind.t = table register; + ind.idx = key's value */ + VINDEXSTR, /* indexed variable with literal string; + ind.t = table register; + ind.idx = key's K index */ + VJMP, /* expression is a test/comparison; + info = pc of corresponding jump instruction */ + VRELOC, /* expression can put result in any register; + info = instruction pc */ + VCALL, /* expression is a function call; info = instruction pc */ + VVARARG /* vararg expression; info = instruction pc */ +} expkind; + + +#define vkisvar(k) (VLOCAL <= (k) && (k) <= VINDEXSTR) +#define vkisindexed(k) (VINDEXED <= (k) && (k) <= VINDEXSTR) +#define vkisinreg(k) ((k) == VNONRELOC || (k) == VLOCAL) + +typedef struct expdesc { + expkind k; + union { + lua_Integer ival; /* for VKINT */ + lua_Number nval; /* for VKFLT */ + int info; /* for generic use */ + struct { /* for indexed variables */ + short idx; /* index (R or "long" K) */ + lu_byte t; /* table (register or upvalue) */ + } ind; + } u; + int t; /* patch list of 'exit when true' */ + int f; /* patch list of 'exit when false' */ +} expdesc; + + +/* description of active local variable */ +typedef struct Vardesc { + short idx; /* index of the variable in the Proto's 'locvars' array */ +} Vardesc; + + +/* description of pending goto statements and label statements */ +typedef struct Labeldesc { + TString *name; /* label identifier */ + int pc; /* position in code */ + int line; /* line where it appeared */ + lu_byte nactvar; /* local level where it appears in current block */ + lu_byte close; /* goto that escapes upvalues */ +} Labeldesc; + + +/* list of labels or gotos */ +typedef struct Labellist { + Labeldesc *arr; /* array */ + int n; /* number of entries in use */ + int size; /* array size */ +} Labellist; + + +/* dynamic structures used by the parser */ +typedef struct Dyndata { + struct { /* list of active local variables */ + Vardesc *arr; + int n; + int size; + } actvar; + Labellist gt; /* list of pending gotos */ + Labellist label; /* list of active labels */ +} Dyndata; + + +/* control of blocks */ +struct BlockCnt; /* defined in lparser.c */ + + +/* state needed to generate code for a given function */ +typedef struct FuncState { + Proto *f; /* current function header */ + struct FuncState *prev; /* enclosing function */ + struct LexState *ls; /* lexical state */ + struct BlockCnt *bl; /* chain of current blocks */ + int pc; /* next position to code (equivalent to 'ncode') */ + int lasttarget; /* 'label' of last 'jump label' */ + int previousline; /* last line that was saved in 'lineinfo' */ + int nk; /* number of elements in 'k' */ + int np; /* number of elements in 'p' */ + int nabslineinfo; /* number of elements in 'abslineinfo' */ + int firstlocal; /* index of first local var (in Dyndata array) */ + int firstlabel; /* index of first label (in 'dyd->label->arr') */ + short nlocvars; /* number of elements in 'f->locvars' */ + lu_byte nactvar; /* number of active local variables */ + lu_byte nups; /* number of upvalues */ + lu_byte freereg; /* first free register */ + lu_byte iwthabs; /* instructions issued since last absolute line info */ + lu_byte needclose; /* function needs to close upvalues when returning */ +} FuncState; + + +LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, + Dyndata *dyd, const char *name, int firstchar); + + +#endif diff --git a/source/lua/lparser.o b/source/lua/lparser.o new file mode 100644 index 0000000000000000000000000000000000000000..233689edd70070879fb03cd1cea209ece0750d99 GIT binary patch literal 27984 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 S1=Dy^!cX%rt}B_Q_x}YOTaRr3 literal 0 HcmV?d00001 diff --git a/source/lua/lprefix.h b/source/lua/lprefix.h new file mode 100644 index 0000000..dd14767 --- /dev/null +++ b/source/lua/lprefix.h @@ -0,0 +1,45 @@ +/* +** $Id: lprefix.h $ +** Definitions for Lua code that must come before any other header file +** See Copyright Notice in lua.h +*/ + +#ifndef lprefix_h +#define lprefix_h + + +/* +** Allows POSIX/XSI stuff +*/ +#if !defined(LUA_USE_C89) /* { */ + +#if !defined(_XOPEN_SOURCE) +#define _XOPEN_SOURCE 600 +#elif _XOPEN_SOURCE == 0 +#undef _XOPEN_SOURCE /* use -D_XOPEN_SOURCE=0 to undefine it */ +#endif + +/* +** Allows manipulation of large files in gcc and some other compilers +*/ +#if !defined(LUA_32BITS) && !defined(_FILE_OFFSET_BITS) +#define _LARGEFILE_SOURCE 1 +#define _FILE_OFFSET_BITS 64 +#endif + +#endif /* } */ + + +/* +** Windows stuff +*/ +#if defined(_WIN32) /* { */ + +#if !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS /* avoid warnings about ISO C functions */ +#endif + +#endif /* } */ + +#endif + diff --git a/source/lua/lstate.c b/source/lua/lstate.c new file mode 100644 index 0000000..f5579a6 --- /dev/null +++ b/source/lua/lstate.c @@ -0,0 +1,420 @@ +/* +** $Id: lstate.c $ +** Global State +** See Copyright Notice in lua.h +*/ + +#define lstate_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include + +#include "lua.h" + +#include "lapi.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "llex.h" +#include "lmem.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + + +/* +** thread state + extra space +*/ +typedef struct LX { + lu_byte extra_[LUA_EXTRASPACE]; + lua_State l; +} LX; + + +/* +** Main thread combines a thread state and the global state +*/ +typedef struct LG { + LX l; + global_State g; +} LG; + + + +#define fromstate(L) (cast(LX *, cast(lu_byte *, (L)) - offsetof(LX, l))) + + +/* +** A macro to create a "random" seed when a state is created; +** the seed is used to randomize string hashes. +*/ +#if !defined(luai_makeseed) + +#include + +/* +** Compute an initial seed with some level of randomness. +** Rely on Address Space Layout Randomization (if present) and +** current time. +*/ +#define addbuff(b,p,e) \ + { size_t t = cast_sizet(e); \ + memcpy(b + p, &t, sizeof(t)); p += sizeof(t); } + +static unsigned int luai_makeseed (lua_State *L) { + char buff[3 * sizeof(size_t)]; + unsigned int h = cast_uint(time(NULL)); + int p = 0; + addbuff(buff, p, L); /* heap variable */ + addbuff(buff, p, &h); /* local variable */ + addbuff(buff, p, &lua_newstate); /* public function */ + lua_assert(p == sizeof(buff)); + return luaS_hash(buff, p, h); +} + +#endif + + +/* +** set GCdebt to a new value keeping the value (totalbytes + GCdebt) +** invariant (and avoiding underflows in 'totalbytes') +*/ +void luaE_setdebt (global_State *g, l_mem debt) { + l_mem tb = gettotalbytes(g); + lua_assert(tb > 0); + if (debt < tb - MAX_LMEM) + debt = tb - MAX_LMEM; /* will make 'totalbytes == MAX_LMEM' */ + g->totalbytes = tb - debt; + g->GCdebt = debt; +} + + +/* +** Increment count of "C calls" and check for overflows. In case of +** a stack overflow, check appropriate error ("regular" overflow or +** overflow while handling stack overflow). +** If 'nCcalls' is larger than LUAI_MAXCCALLS but smaller than +** LUAI_MAXCCALLS + CSTACKCF (plus 2 to avoid by-one errors), it means +** it has just entered the "overflow zone", so the function raises an +** overflow error. +** If 'nCcalls' is larger than LUAI_MAXCCALLS + CSTACKCF + 2 +** (which means it is already handling an overflow) but smaller than +** 9/8 of LUAI_MAXCCALLS, does not report an error (to allow message +** handling to work). +** Otherwise, report a stack overflow while handling a stack overflow +** (probably caused by a repeating error in the message handling +** function). +*/ +void luaE_enterCcall (lua_State *L) { + int ncalls = getCcalls(L); + L->nCcalls++; + if (ncalls >= LUAI_MAXCCALLS) { /* possible overflow? */ + luaE_freeCI(L); /* release unused CIs */ + ncalls = getCcalls(L); /* update call count */ + if (ncalls >= LUAI_MAXCCALLS) { /* still overflow? */ + if (ncalls <= LUAI_MAXCCALLS + CSTACKCF + 2) { + /* no error before increments; raise the error now */ + L->nCcalls += (CSTACKCF + 4); /* avoid raising it again */ + luaG_runerror(L, "C stack overflow"); + } + else if (ncalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS >> 3))) + luaD_throw(L, LUA_ERRERR); /* error while handling stack error */ + } + } +} + + +CallInfo *luaE_extendCI (lua_State *L) { + CallInfo *ci; + lua_assert(L->ci->next == NULL); + luaE_enterCcall(L); + ci = luaM_new(L, CallInfo); + lua_assert(L->ci->next == NULL); + L->ci->next = ci; + ci->previous = L->ci; + ci->next = NULL; + ci->u.l.trap = 0; + L->nci++; + return ci; +} + + +/* +** free all CallInfo structures not in use by a thread +*/ +void luaE_freeCI (lua_State *L) { + CallInfo *ci = L->ci; + CallInfo *next = ci->next; + ci->next = NULL; + L->nCcalls -= L->nci; /* subtract removed elements from 'nCcalls' */ + while ((ci = next) != NULL) { + next = ci->next; + luaM_free(L, ci); + L->nci--; + } + L->nCcalls += L->nci; /* adjust result */ +} + + +/* +** free half of the CallInfo structures not in use by a thread +*/ +void luaE_shrinkCI (lua_State *L) { + CallInfo *ci = L->ci; + CallInfo *next2; /* next's next */ + L->nCcalls -= L->nci; /* subtract removed elements from 'nCcalls' */ + /* while there are two nexts */ + while (ci->next != NULL && (next2 = ci->next->next) != NULL) { + luaM_free(L, ci->next); /* free next */ + L->nci--; + ci->next = next2; /* remove 'next' from the list */ + next2->previous = ci; + ci = next2; /* keep next's next */ + } + L->nCcalls += L->nci; /* adjust result */ +} + + +static void stack_init (lua_State *L1, lua_State *L) { + int i; CallInfo *ci; + /* initialize stack array */ + L1->stack = luaM_newvector(L, BASIC_STACK_SIZE, StackValue); + L1->stacksize = BASIC_STACK_SIZE; + for (i = 0; i < BASIC_STACK_SIZE; i++) + setnilvalue(s2v(L1->stack + i)); /* erase new stack */ + L1->top = L1->stack; + L1->stack_last = L1->stack + L1->stacksize - EXTRA_STACK; + /* initialize first ci */ + ci = &L1->base_ci; + ci->next = ci->previous = NULL; + ci->callstatus = CIST_C; + ci->func = L1->top; + setnilvalue(s2v(L1->top)); /* 'function' entry for this 'ci' */ + L1->top++; + ci->top = L1->top + LUA_MINSTACK; + L1->ci = ci; +} + + +static void freestack (lua_State *L) { + if (L->stack == NULL) + return; /* stack not completely built yet */ + L->ci = &L->base_ci; /* free the entire 'ci' list */ + luaE_freeCI(L); + lua_assert(L->nci == 0); + luaM_freearray(L, L->stack, L->stacksize); /* free stack array */ +} + + +/* +** Create registry table and its predefined values +*/ +static void init_registry (lua_State *L, global_State *g) { + TValue temp; + /* create registry */ + Table *registry = luaH_new(L); + sethvalue(L, &g->l_registry, registry); + luaH_resize(L, registry, LUA_RIDX_LAST, 0); + /* registry[LUA_RIDX_MAINTHREAD] = L */ + setthvalue(L, &temp, L); /* temp = L */ + luaH_setint(L, registry, LUA_RIDX_MAINTHREAD, &temp); + /* registry[LUA_RIDX_GLOBALS] = table of globals */ + sethvalue(L, &temp, luaH_new(L)); /* temp = new table (global table) */ + luaH_setint(L, registry, LUA_RIDX_GLOBALS, &temp); +} + + +/* +** open parts of the state that may cause memory-allocation errors. +** ('g->nilvalue' being a nil value flags that the state was completely +** build.) +*/ +static void f_luaopen (lua_State *L, void *ud) { + global_State *g = G(L); + UNUSED(ud); + stack_init(L, L); /* init stack */ + init_registry(L, g); + luaS_init(L); + luaT_init(L); + luaX_init(L); + g->gcrunning = 1; /* allow gc */ + setnilvalue(&g->nilvalue); + luai_userstateopen(L); +} + + +/* +** preinitialize a thread with consistent values without allocating +** any memory (to avoid errors) +*/ +static void preinit_thread (lua_State *L, global_State *g) { + G(L) = g; + L->stack = NULL; + L->ci = NULL; + L->nci = 0; + L->stacksize = 0; + L->twups = L; /* thread has no upvalues */ + L->errorJmp = NULL; + L->nCcalls = 0; + L->hook = NULL; + L->hookmask = 0; + L->basehookcount = 0; + L->allowhook = 1; + resethookcount(L); + L->openupval = NULL; + L->status = LUA_OK; + L->errfunc = 0; +} + + +static void close_state (lua_State *L) { + global_State *g = G(L); + luaF_close(L, L->stack, CLOSEPROTECT); /* close all upvalues */ + luaC_freeallobjects(L); /* collect all objects */ + if (ttisnil(&g->nilvalue)) /* closing a fully built state? */ + luai_userstateclose(L); + luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size); + freestack(L); + lua_assert(gettotalbytes(g) == sizeof(LG)); + (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); /* free main block */ +} + + +LUA_API lua_State *lua_newthread (lua_State *L) { + global_State *g = G(L); + lua_State *L1; + lua_lock(L); + luaC_checkGC(L); + /* create new thread */ + L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l; + L1->marked = luaC_white(g); + L1->tt = LUA_TTHREAD; + /* link it on list 'allgc' */ + L1->next = g->allgc; + g->allgc = obj2gco(L1); + /* anchor it on L stack */ + setthvalue2s(L, L->top, L1); + api_incr_top(L); + preinit_thread(L1, g); + L1->hookmask = L->hookmask; + L1->basehookcount = L->basehookcount; + L1->hook = L->hook; + resethookcount(L1); + /* initialize L1 extra space */ + memcpy(lua_getextraspace(L1), lua_getextraspace(g->mainthread), + LUA_EXTRASPACE); + luai_userstatethread(L, L1); + stack_init(L1, L); /* init stack */ + lua_unlock(L); + return L1; +} + + +void luaE_freethread (lua_State *L, lua_State *L1) { + LX *l = fromstate(L1); + luaF_close(L1, L1->stack, NOCLOSINGMETH); /* close all upvalues */ + lua_assert(L1->openupval == NULL); + luai_userstatefree(L, L1); + freestack(L1); + luaM_free(L, l); +} + + +int lua_resetthread (lua_State *L) { + CallInfo *ci; + int status; + lua_lock(L); + ci = &L->base_ci; + status = luaF_close(L, L->stack, CLOSEPROTECT); + setnilvalue(s2v(L->stack)); /* 'function' entry for basic 'ci' */ + if (status != CLOSEPROTECT) /* real errors? */ + luaD_seterrorobj(L, status, L->stack + 1); + else { + status = LUA_OK; + L->top = L->stack + 1; + } + ci->callstatus = CIST_C; + ci->func = L->stack; + ci->top = L->top + LUA_MINSTACK; + L->ci = ci; + L->status = status; + lua_unlock(L); + return status; +} + + +LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { + int i; + lua_State *L; + global_State *g; + LG *l = cast(LG *, (*f)(ud, NULL, LUA_TTHREAD, sizeof(LG))); + if (l == NULL) return NULL; + L = &l->l.l; + g = &l->g; + L->tt = LUA_TTHREAD; + g->currentwhite = bitmask(WHITE0BIT); + L->marked = luaC_white(g); + preinit_thread(L, g); + g->allgc = obj2gco(L); /* by now, only object is the main thread */ + L->next = NULL; + g->frealloc = f; + g->ud = ud; + g->warnf = NULL; + g->ud_warn = NULL; + g->mainthread = L; + g->seed = luai_makeseed(L); + g->gcrunning = 0; /* no GC while building state */ + g->strt.size = g->strt.nuse = 0; + g->strt.hash = NULL; + setnilvalue(&g->l_registry); + g->panic = NULL; + g->gcstate = GCSpause; + g->gckind = KGC_INC; + g->gcemergency = 0; + g->finobj = g->tobefnz = g->fixedgc = NULL; + g->survival = g->old = g->reallyold = NULL; + g->finobjsur = g->finobjold = g->finobjrold = NULL; + g->sweepgc = NULL; + g->gray = g->grayagain = NULL; + g->weak = g->ephemeron = g->allweak = NULL; + g->twups = NULL; + g->totalbytes = sizeof(LG); + g->GCdebt = 0; + g->lastatomic = 0; + setivalue(&g->nilvalue, 0); /* to signal that state is not yet built */ + setgcparam(g->gcpause, LUAI_GCPAUSE); + setgcparam(g->gcstepmul, LUAI_GCMUL); + g->gcstepsize = LUAI_GCSTEPSIZE; + setgcparam(g->genmajormul, LUAI_GENMAJORMUL); + g->genminormul = LUAI_GENMINORMUL; + for (i=0; i < LUA_NUMTAGS; i++) g->mt[i] = NULL; + if (luaD_rawrunprotected(L, f_luaopen, NULL) != LUA_OK) { + /* memory allocation error: free partial state */ + close_state(L); + L = NULL; + } + return L; +} + + +LUA_API void lua_close (lua_State *L) { + L = G(L)->mainthread; /* only the main thread can be closed */ + lua_lock(L); + close_state(L); +} + + +void luaE_warning (lua_State *L, const char *msg, int tocont) { + lua_WarnFunction wf = G(L)->warnf; + if (wf != NULL) + wf(G(L)->ud_warn, msg, tocont); +} + + diff --git a/source/lua/lstate.h b/source/lua/lstate.h new file mode 100644 index 0000000..e35f896 --- /dev/null +++ b/source/lua/lstate.h @@ -0,0 +1,326 @@ +/* +** $Id: lstate.h $ +** Global State +** See Copyright Notice in lua.h +*/ + +#ifndef lstate_h +#define lstate_h + +#include "lua.h" + +#include "lobject.h" +#include "ltm.h" +#include "lzio.h" + + +/* +** Some notes about garbage-collected objects: All objects in Lua must +** be kept somehow accessible until being freed, so all objects always +** belong to one (and only one) of these lists, using field 'next' of +** the 'CommonHeader' for the link: +** +** 'allgc': all objects not marked for finalization; +** 'finobj': all objects marked for finalization; +** 'tobefnz': all objects ready to be finalized; +** 'fixedgc': all objects that are not to be collected (currently +** only small strings, such as reserved words). +** +** Moreover, there is another set of lists that control gray objects. +** These lists are linked by fields 'gclist'. (All objects that +** can become gray have such a field. The field is not the same +** in all objects, but it always has this name.) Any gray object +** must belong to one of these lists, and all objects in these lists +** must be gray: +** +** 'gray': regular gray objects, still waiting to be visited. +** 'grayagain': objects that must be revisited at the atomic phase. +** That includes +** - black objects got in a write barrier; +** - all kinds of weak tables during propagation phase; +** - all threads. +** 'weak': tables with weak values to be cleared; +** 'ephemeron': ephemeron tables with white->white entries; +** 'allweak': tables with weak keys and/or weak values to be cleared. +*/ + + + +/* +** About 'nCcalls': each thread in Lua (a lua_State) keeps a count of +** how many "C calls" it can do in the C stack, to avoid C-stack overflow. +** This count is very rough approximation; it considers only recursive +** functions inside the interpreter, as non-recursive calls can be +** considered using a fixed (although unknown) amount of stack space. +** +** The count itself has two parts: the lower part is the count itself; +** the higher part counts the number of non-yieldable calls in the stack. +** +** Because calls to external C functions can use of unkown amount +** of space (e.g., functions using an auxiliary buffer), calls +** to these functions add more than one to the count. +** +** The proper count also includes the number of CallInfo structures +** allocated by Lua, as a kind of "potential" calls. So, when Lua +** calls a function (and "consumes" one CallInfo), it needs neither to +** increment nor to check 'nCcalls', as its use of C stack is already +** accounted for. +*/ + +/* number of "C stack slots" used by an external C function */ +#define CSTACKCF 10 + +/* true if this thread does not have non-yieldable calls in the stack */ +#define yieldable(L) (((L)->nCcalls & 0xffff0000) == 0) + +/* real number of C calls */ +#define getCcalls(L) ((L)->nCcalls & 0xffff) + + +/* Increment the number of non-yieldable calls */ +#define incnny(L) ((L)->nCcalls += 0x10000) + +/* Decrement the number of non-yieldable calls */ +#define decnny(L) ((L)->nCcalls -= 0x10000) + +/* Increment the number of non-yieldable calls and nCcalls */ +#define incXCcalls(L) ((L)->nCcalls += 0x10000 + CSTACKCF) + +/* Decrement the number of non-yieldable calls and nCcalls */ +#define decXCcalls(L) ((L)->nCcalls -= 0x10000 + CSTACKCF) + + + + + + +struct lua_longjmp; /* defined in ldo.c */ + + +/* +** Atomic type (relative to signals) to better ensure that 'lua_sethook' +** is thread safe +*/ +#if !defined(l_signalT) +#include +#define l_signalT sig_atomic_t +#endif + + +/* extra stack space to handle TM calls and some other extras */ +#define EXTRA_STACK 5 + + +#define BASIC_STACK_SIZE (2*LUA_MINSTACK) + + +/* kinds of Garbage Collection */ +#define KGC_INC 0 /* incremental gc */ +#define KGC_GEN 1 /* generational gc */ + + +typedef struct stringtable { + TString **hash; + int nuse; /* number of elements */ + int size; +} stringtable; + + +/* +** Information about a call. +*/ +typedef struct CallInfo { + StkId func; /* function index in the stack */ + StkId top; /* top for this function */ + struct CallInfo *previous, *next; /* dynamic call link */ + union { + struct { /* only for Lua functions */ + const Instruction *savedpc; + l_signalT trap; + int nextraargs; /* # of extra arguments in vararg functions */ + } l; + struct { /* only for C functions */ + lua_KFunction k; /* continuation in case of yields */ + ptrdiff_t old_errfunc; + lua_KContext ctx; /* context info. in case of yields */ + } c; + } u; + union { + int funcidx; /* called-function index */ + int nyield; /* number of values yielded */ + struct { /* info about transfered values (for call/return hooks) */ + unsigned short ftransfer; /* offset of first value transfered */ + unsigned short ntransfer; /* number of values transfered */ + } transferinfo; + } u2; + short nresults; /* expected number of results from this function */ + unsigned short callstatus; +} CallInfo; + + +/* +** Bits in CallInfo status +*/ +#define CIST_OAH (1<<0) /* original value of 'allowhook' */ +#define CIST_C (1<<1) /* call is running a C function */ +#define CIST_HOOKED (1<<2) /* call is running a debug hook */ +#define CIST_YPCALL (1<<3) /* call is a yieldable protected call */ +#define CIST_TAIL (1<<4) /* call was tail called */ +#define CIST_HOOKYIELD (1<<5) /* last hook called yielded */ +#define CIST_FIN (1<<6) /* call is running a finalizer */ +#define CIST_TRAN (1<<7) /* 'ci' has transfer information */ +#if defined(LUA_COMPAT_LT_LE) +#define CIST_LEQ (1<<8) /* using __lt for __le */ +#endif + +/* active function is a Lua function */ +#define isLua(ci) (!((ci)->callstatus & CIST_C)) + +/* call is running Lua code (not a hook) */ +#define isLuacode(ci) (!((ci)->callstatus & (CIST_C | CIST_HOOKED))) + +/* assume that CIST_OAH has offset 0 and that 'v' is strictly 0/1 */ +#define setoah(st,v) ((st) = ((st) & ~CIST_OAH) | (v)) +#define getoah(st) ((st) & CIST_OAH) + + +/* +** 'global state', shared by all threads of this state +*/ +typedef struct global_State { + lua_Alloc frealloc; /* function to reallocate memory */ + void *ud; /* auxiliary data to 'frealloc' */ + l_mem totalbytes; /* number of bytes currently allocated - GCdebt */ + l_mem GCdebt; /* bytes allocated not yet compensated by the collector */ + lu_mem GCestimate; /* an estimate of the non-garbage memory in use */ + lu_mem lastatomic; /* see function 'genstep' in file 'lgc.c' */ + stringtable strt; /* hash table for strings */ + TValue l_registry; + TValue nilvalue; /* a nil value */ + unsigned int seed; /* randomized seed for hashes */ + lu_byte currentwhite; + lu_byte gcstate; /* state of garbage collector */ + lu_byte gckind; /* kind of GC running */ + lu_byte genminormul; /* control for minor generational collections */ + lu_byte genmajormul; /* control for major generational collections */ + lu_byte gcrunning; /* true if GC is running */ + lu_byte gcemergency; /* true if this is an emergency collection */ + lu_byte gcpause; /* size of pause between successive GCs */ + lu_byte gcstepmul; /* GC "speed" */ + lu_byte gcstepsize; /* (log2 of) GC granularity */ + GCObject *allgc; /* list of all collectable objects */ + GCObject **sweepgc; /* current position of sweep in list */ + GCObject *finobj; /* list of collectable objects with finalizers */ + GCObject *gray; /* list of gray objects */ + GCObject *grayagain; /* list of objects to be traversed atomically */ + GCObject *weak; /* list of tables with weak values */ + GCObject *ephemeron; /* list of ephemeron tables (weak keys) */ + GCObject *allweak; /* list of all-weak tables */ + GCObject *tobefnz; /* list of userdata to be GC */ + GCObject *fixedgc; /* list of objects not to be collected */ + /* fields for generational collector */ + GCObject *survival; /* start of objects that survived one GC cycle */ + GCObject *old; /* start of old objects */ + GCObject *reallyold; /* old objects with more than one cycle */ + GCObject *finobjsur; /* list of survival objects with finalizers */ + GCObject *finobjold; /* list of old objects with finalizers */ + GCObject *finobjrold; /* list of really old objects with finalizers */ + struct lua_State *twups; /* list of threads with open upvalues */ + lua_CFunction panic; /* to be called in unprotected errors */ + struct lua_State *mainthread; + TString *memerrmsg; /* message for memory-allocation errors */ + TString *tmname[TM_N]; /* array with tag-method names */ + struct Table *mt[LUA_NUMTAGS]; /* metatables for basic types */ + TString *strcache[STRCACHE_N][STRCACHE_M]; /* cache for strings in API */ + lua_WarnFunction warnf; /* warning function */ + void *ud_warn; /* auxiliary data to 'warnf' */ +} global_State; + + +/* +** 'per thread' state +*/ +struct lua_State { + CommonHeader; + lu_byte status; + lu_byte allowhook; + unsigned short nci; /* number of items in 'ci' list */ + StkId top; /* first free slot in the stack */ + global_State *l_G; + CallInfo *ci; /* call info for current function */ + const Instruction *oldpc; /* last pc traced */ + StkId stack_last; /* last free slot in the stack */ + StkId stack; /* stack base */ + UpVal *openupval; /* list of open upvalues in this stack */ + GCObject *gclist; + struct lua_State *twups; /* list of threads with open upvalues */ + struct lua_longjmp *errorJmp; /* current error recover point */ + CallInfo base_ci; /* CallInfo for first level (C calling Lua) */ + volatile lua_Hook hook; + ptrdiff_t errfunc; /* current error handling function (stack index) */ + l_uint32 nCcalls; /* number of allowed nested C calls - 'nci' */ + int stacksize; + int basehookcount; + int hookcount; + l_signalT hookmask; +}; + + +#define G(L) (L->l_G) + + +/* +** Union of all collectable objects (only for conversions) +*/ +union GCUnion { + GCObject gc; /* common header */ + struct TString ts; + struct Udata u; + union Closure cl; + struct Table h; + struct Proto p; + struct lua_State th; /* thread */ + struct UpVal upv; +}; + + +#define cast_u(o) cast(union GCUnion *, (o)) + +/* macros to convert a GCObject into a specific value */ +#define gco2ts(o) \ + check_exp(novariant((o)->tt) == LUA_TSTRING, &((cast_u(o))->ts)) +#define gco2u(o) check_exp((o)->tt == LUA_TUSERDATA, &((cast_u(o))->u)) +#define gco2lcl(o) check_exp((o)->tt == LUA_TLCL, &((cast_u(o))->cl.l)) +#define gco2ccl(o) check_exp((o)->tt == LUA_TCCL, &((cast_u(o))->cl.c)) +#define gco2cl(o) \ + check_exp(novariant((o)->tt) == LUA_TFUNCTION, &((cast_u(o))->cl)) +#define gco2t(o) check_exp((o)->tt == LUA_TTABLE, &((cast_u(o))->h)) +#define gco2p(o) check_exp((o)->tt == LUA_TPROTO, &((cast_u(o))->p)) +#define gco2th(o) check_exp((o)->tt == LUA_TTHREAD, &((cast_u(o))->th)) +#define gco2upv(o) \ + check_exp(novariant((o)->tt) == LUA_TUPVAL, &((cast_u(o))->upv)) + + +/* +** macro to convert a Lua object into a GCObject +** (The access to 'tt' tries to ensure that 'v' is actually a Lua object.) +*/ +#define obj2gco(v) check_exp((v)->tt >= LUA_TSTRING, &(cast_u(v)->gc)) + + +/* actual number of total bytes allocated */ +#define gettotalbytes(g) cast(lu_mem, (g)->totalbytes + (g)->GCdebt) + +LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt); +LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); +LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L); +LUAI_FUNC void luaE_freeCI (lua_State *L); +LUAI_FUNC void luaE_shrinkCI (lua_State *L); +LUAI_FUNC void luaE_enterCcall (lua_State *L); +LUAI_FUNC void luaE_warning (lua_State *L, const char *msg, int tocont); + + +#define luaE_exitCcall(L) ((L)->nCcalls--) + +#endif + diff --git a/source/lua/lstate.o b/source/lua/lstate.o new file mode 100644 index 0000000000000000000000000000000000000000..1b95874b2f6ced7c42e6c3cc0ccdc69b4fa8bd7a GIT binary patch literal 6680 zcmbtZe{9>u6+heU@Y>**w163G^}39u+v?e?|YxLNB_oU=4U_2*j{(f?1|-eAgOH3_)cI*frWG)nU;9=fcYo| zD0jIKPI|Hv-Fw;F2#2~k|0G4N?oY}#Ko%ddd1(3E-8fn*$g?M+@G3)aGZo~b4ZDU? zQM*!!wqTlNjd+8r2XP$!xv{sEmDcfcN3Yyj(Gj%Ws7f`9t#IGNQJJrk4@%RSUw3Ni zlB_SPHyp}XtE@Rvg`LVMj%?2Ifv%glnGeI2$Hp=LAlaG^!Z1PQ;pOGx1(amhCm8G5 zzHlykAl4n*+9}@YPIZclk#}F9i778RH{NJXioeAcUgi_ijSv4A1_q@eL>? zuNA!l-Ujg-KTZ0Tcod9y3-Ji9L_8Rot{6Y3Aqcgwnu}fApwUa?igBD6h*yjwwgm9h zqBN}}E56EAF;1!x%sGixyon6yw28QQE{e1;>!o2*JV#k2#ShQWWW|VLVMGwQ7NG-^ zISH4yHaGC{1I_*uROg}{BQe~JtG~55AZB=_y*WsFQrR*#!Hx+dOcBcmk6?2uhLHu3U?<=oRE2K{E<(vL6I#0LpEqV9lQA|u@INF5L#x=S? z%`dinHnMR3&AHhRaCH~Xzb3s@@4M{Z7gI@dXOMcC-QhaTQgguB)>7QOJHRLYIC}MY zZufm|ek0H+Uf~ljmDY3dJJt5yl1VfkOEjS0WksT)Q{2@Y;ASz96a#*=$8vJT#Lnyp{iaFmb3pLOu*nhcD>vm9{aTm-0BQ^lnpn zhI{7hhC$Ugqo&+S}`7t7TFqb;805)B8<$J)$tn*gs|CubuZ$wbvmJ^VC5Z&}B>DxEVFH z0%NzszpPzgS1NoGoJiKKEyBP00#IXOYw#mKdcS1t0o$nX(`p}N9RZ6f+^?1(YX}&T zhoQjgkcZ)0whnpNWgkJ4K>T&K?VC&B{Y&7vCGh)~z#m=$r~0Xv&mrJV_Hd2%1EnHil()U4($H?1bt*mBR~)3d z_H?0d43YAMkrMPXJ8bX8!NO2(m+hU*kyfTp&c(4inY^t`>2fhk(I&O;tr*9UGhaEWec#Z$Ufz!LM@qat;s~z}S)gOpmNuA+J($xqOs|BS*{0;4xg z)1*WHvjBDe*Q-8bzoU#zDuXX6ocynK=pS|9&U`%T2_yZ_JM^z~;LiP7r#6@Lo%^tJ z3H&z>yv5=F19AW&=FEpX^qqK+ltHAgOyyYjO^r`VlrjBoX}n9-)3}<~__)H4)Zp_9 zKUsrERq!)4xPG^s_ls2Z_lJICbX@)Y(W>HTT)$hT8eG3OlQp=0Z+=^Y>v!dy8eG3C zLA4GYSHB+{YH7-KD;M@KV9%gIX$NhWkRL%$^bp?dU7@u~2`p$RrRN%?%Ij z$_(GfLWL2UBkM>g!a@ThyLaQAVWAw_YN+G3?)CQj5|Yj`gXq$IXvP0G1>u3VK$ZWZ zzo?R$YCi4s`>7SLg+Ny@ssY6(si_jFd)@$%;;8bKHBHmkD_p4&Be4r>L)2h{rMJKagzPV;S;)Us3W zyB~A^b}M^T){8DCmA$^tdP1L{9uGpOd;avefyPyGbpGU0+f(l%qW!5oJHmtN|D)ia r1wKTzYo&2*?qqO|9tx0Gy$_c|raoO8pK_`fe~y$v&({R38M6NZ`R;gY literal 0 HcmV?d00001 diff --git a/source/lua/lstring.c b/source/lua/lstring.c new file mode 100644 index 0000000..c52539a --- /dev/null +++ b/source/lua/lstring.c @@ -0,0 +1,283 @@ +/* +** $Id: lstring.c $ +** String table (keeps all strings handled by Lua) +** See Copyright Notice in lua.h +*/ + +#define lstring_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" + + +/* +** Lua will use at most ~(2^LUAI_HASHLIMIT) bytes from a string to +** compute its hash +*/ +#if !defined(LUAI_HASHLIMIT) +#define LUAI_HASHLIMIT 5 +#endif + + + +/* +** Maximum size for string table. +*/ +#define MAXSTRTB cast_int(luaM_limitN(MAX_INT, TString*)) + + +/* +** equality for long strings +*/ +int luaS_eqlngstr (TString *a, TString *b) { + size_t len = a->u.lnglen; + lua_assert(a->tt == LUA_TLNGSTR && b->tt == LUA_TLNGSTR); + return (a == b) || /* same instance or... */ + ((len == b->u.lnglen) && /* equal length and ... */ + (memcmp(getstr(a), getstr(b), len) == 0)); /* equal contents */ +} + + +unsigned int luaS_hash (const char *str, size_t l, unsigned int seed) { + unsigned int h = seed ^ cast_uint(l); + size_t step = (l >> LUAI_HASHLIMIT) + 1; + for (; l >= step; l -= step) + h ^= ((h<<5) + (h>>2) + cast_byte(str[l - 1])); + return h; +} + + +unsigned int luaS_hashlongstr (TString *ts) { + lua_assert(ts->tt == LUA_TLNGSTR); + if (ts->extra == 0) { /* no hash? */ + ts->hash = luaS_hash(getstr(ts), ts->u.lnglen, ts->hash); + ts->extra = 1; /* now it has its hash */ + } + return ts->hash; +} + + +static void tablerehash (TString **vect, int osize, int nsize) { + int i; + for (i = osize; i < nsize; i++) /* clear new elements */ + vect[i] = NULL; + for (i = 0; i < osize; i++) { /* rehash old part of the array */ + TString *p = vect[i]; + vect[i] = NULL; + while (p) { /* for each string in the list */ + TString *hnext = p->u.hnext; /* save next */ + unsigned int h = lmod(p->hash, nsize); /* new position */ + p->u.hnext = vect[h]; /* chain it into array */ + vect[h] = p; + p = hnext; + } + } +} + + +/* +** Resize the string table. If allocation fails, keep the current size. +** (This can degrade performance, but any non-zero size should work +** correctly.) +*/ +void luaS_resize (lua_State *L, int nsize) { + stringtable *tb = &G(L)->strt; + int osize = tb->size; + TString **newvect; + if (nsize < osize) /* shrinking table? */ + tablerehash(tb->hash, osize, nsize); /* depopulate shrinking part */ + newvect = luaM_reallocvector(L, tb->hash, osize, nsize, TString*); + if (unlikely(newvect == NULL)) { /* reallocation failed? */ + if (nsize < osize) /* was it shrinking table? */ + tablerehash(tb->hash, nsize, osize); /* restore to original size */ + /* leave table as it was */ + } + else { /* allocation succeeded */ + tb->hash = newvect; + tb->size = nsize; + if (nsize > osize) + tablerehash(newvect, osize, nsize); /* rehash for new size */ + } +} + + +/* +** Clear API string cache. (Entries cannot be empty, so fill them with +** a non-collectable string.) +*/ +void luaS_clearcache (global_State *g) { + int i, j; + for (i = 0; i < STRCACHE_N; i++) + for (j = 0; j < STRCACHE_M; j++) { + if (iswhite(g->strcache[i][j])) /* will entry be collected? */ + g->strcache[i][j] = g->memerrmsg; /* replace it with something fixed */ + } +} + + +/* +** Initialize the string table and the string cache +*/ +void luaS_init (lua_State *L) { + global_State *g = G(L); + int i, j; + stringtable *tb = &G(L)->strt; + tb->hash = luaM_newvector(L, MINSTRTABSIZE, TString*); + tablerehash(tb->hash, 0, MINSTRTABSIZE); /* clear array */ + tb->size = MINSTRTABSIZE; + /* pre-create memory-error message */ + g->memerrmsg = luaS_newliteral(L, MEMERRMSG); + luaC_fix(L, obj2gco(g->memerrmsg)); /* it should never be collected */ + for (i = 0; i < STRCACHE_N; i++) /* fill cache with valid strings */ + for (j = 0; j < STRCACHE_M; j++) + g->strcache[i][j] = g->memerrmsg; +} + + + +/* +** creates a new string object +*/ +static TString *createstrobj (lua_State *L, size_t l, int tag, unsigned int h) { + TString *ts; + GCObject *o; + size_t totalsize; /* total size of TString object */ + totalsize = sizelstring(l); + o = luaC_newobj(L, tag, totalsize); + ts = gco2ts(o); + ts->hash = h; + ts->extra = 0; + getstr(ts)[l] = '\0'; /* ending 0 */ + return ts; +} + + +TString *luaS_createlngstrobj (lua_State *L, size_t l) { + TString *ts = createstrobj(L, l, LUA_TLNGSTR, G(L)->seed); + ts->u.lnglen = l; + return ts; +} + + +void luaS_remove (lua_State *L, TString *ts) { + stringtable *tb = &G(L)->strt; + TString **p = &tb->hash[lmod(ts->hash, tb->size)]; + while (*p != ts) /* find previous element */ + p = &(*p)->u.hnext; + *p = (*p)->u.hnext; /* remove element from its list */ + tb->nuse--; +} + + +static void growstrtab (lua_State *L, stringtable *tb) { + if (unlikely(tb->nuse == MAX_INT)) { /* too many strings? */ + luaC_fullgc(L, 1); /* try to free some... */ + if (tb->nuse == MAX_INT) /* still too many? */ + luaM_error(L); /* cannot even create a message... */ + } + if (tb->size <= MAXSTRTB / 2) /* can grow string table? */ + luaS_resize(L, tb->size * 2); +} + + +/* +** Checks whether short string exists and reuses it or creates a new one. +*/ +static TString *internshrstr (lua_State *L, const char *str, size_t l) { + TString *ts; + global_State *g = G(L); + stringtable *tb = &g->strt; + unsigned int h = luaS_hash(str, l, g->seed); + TString **list = &tb->hash[lmod(h, tb->size)]; + lua_assert(str != NULL); /* otherwise 'memcmp'/'memcpy' are undefined */ + for (ts = *list; ts != NULL; ts = ts->u.hnext) { + if (l == ts->shrlen && (memcmp(str, getstr(ts), l * sizeof(char)) == 0)) { + /* found! */ + if (isdead(g, ts)) /* dead (but not collected yet)? */ + changewhite(ts); /* resurrect it */ + return ts; + } + } + /* else must create a new string */ + if (tb->nuse >= tb->size) { /* need to grow string table? */ + growstrtab(L, tb); + list = &tb->hash[lmod(h, tb->size)]; /* rehash with new size */ + } + ts = createstrobj(L, l, LUA_TSHRSTR, h); + memcpy(getstr(ts), str, l * sizeof(char)); + ts->shrlen = cast_byte(l); + ts->u.hnext = *list; + *list = ts; + tb->nuse++; + return ts; +} + + +/* +** new string (with explicit length) +*/ +TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { + if (l <= LUAI_MAXSHORTLEN) /* short string? */ + return internshrstr(L, str, l); + else { + TString *ts; + if (unlikely(l >= (MAX_SIZE - sizeof(TString))/sizeof(char))) + luaM_toobig(L); + ts = luaS_createlngstrobj(L, l); + memcpy(getstr(ts), str, l * sizeof(char)); + return ts; + } +} + + +/* +** Create or reuse a zero-terminated string, first checking in the +** cache (using the string address as a key). The cache can contain +** only zero-terminated strings, so it is safe to use 'strcmp' to +** check hits. +*/ +TString *luaS_new (lua_State *L, const char *str) { + unsigned int i = point2uint(str) % STRCACHE_N; /* hash */ + int j; + TString **p = G(L)->strcache[i]; + for (j = 0; j < STRCACHE_M; j++) { + if (strcmp(str, getstr(p[j])) == 0) /* hit? */ + return p[j]; /* that is it */ + } + /* normal route */ + for (j = STRCACHE_M - 1; j > 0; j--) + p[j] = p[j - 1]; /* move out last element */ + /* new element is first in the list */ + p[0] = luaS_newlstr(L, str, strlen(str)); + return p[0]; +} + + +Udata *luaS_newudata (lua_State *L, size_t s, int nuvalue) { + Udata *u; + int i; + GCObject *o; + if (unlikely(s > MAX_SIZE - udatamemoffset(nuvalue))) + luaM_toobig(L); + o = luaC_newobj(L, LUA_TUSERDATA, sizeudata(nuvalue, s)); + u = gco2u(o); + u->len = s; + u->nuvalue = nuvalue; + u->metatable = NULL; + for (i = 0; i < nuvalue; i++) + setnilvalue(&u->uv[i].uv); + return u; +} + diff --git a/source/lua/lstring.h b/source/lua/lstring.h new file mode 100644 index 0000000..b255021 --- /dev/null +++ b/source/lua/lstring.h @@ -0,0 +1,53 @@ +/* +** $Id: lstring.h $ +** String table (keep all strings handled by Lua) +** See Copyright Notice in lua.h +*/ + +#ifndef lstring_h +#define lstring_h + +#include "lgc.h" +#include "lobject.h" +#include "lstate.h" + + +/* +** Memory-allocation error message must be preallocated (it cannot +** be created after memory is exhausted) +*/ +#define MEMERRMSG "not enough memory" + + +#define sizelstring(l) (sizeof(TString) + ((l) + 1) * sizeof(char)) + +#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \ + (sizeof(s)/sizeof(char))-1)) + + +/* +** test whether a string is a reserved word +*/ +#define isreserved(s) ((s)->tt == LUA_TSHRSTR && (s)->extra > 0) + + +/* +** equality for short strings, which are always internalized +*/ +#define eqshrstr(a,b) check_exp((a)->tt == LUA_TSHRSTR, (a) == (b)) + + +LUAI_FUNC unsigned int luaS_hash (const char *str, size_t l, unsigned int seed); +LUAI_FUNC unsigned int luaS_hashlongstr (TString *ts); +LUAI_FUNC int luaS_eqlngstr (TString *a, TString *b); +LUAI_FUNC void luaS_resize (lua_State *L, int newsize); +LUAI_FUNC void luaS_clearcache (global_State *g); +LUAI_FUNC void luaS_init (lua_State *L); +LUAI_FUNC void luaS_remove (lua_State *L, TString *ts); +LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, int nuvalue); +LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); +LUAI_FUNC TString *luaS_new (lua_State *L, const char *str); +LUAI_FUNC TString *luaS_createlngstrobj (lua_State *L, size_t l); + + +#endif diff --git a/source/lua/lstring.o b/source/lua/lstring.o new file mode 100644 index 0000000000000000000000000000000000000000..6925835372732dd00b9a95748772d37899c48b1d GIT binary patch literal 5536 zcmbtXeQ*=k5kGwxgzcVHk`5wCK{Re_w?rc`K&;eFb+)kIfe3DF6J`jNjUs;(S#qTl zU&B|bnB>iI2{R#+bUN)H{VV@;rk|AI4`SItrj!W|X-FqD4S^0Z&swCg#&eZRMFci+CtY)F!&8Yy^o_flhZ zF%m1RHk=cU*Ht6pvJs>9blu{8C`KljFv*R&Nbp2DYrEwL~XwGV*6)-1`pEmk~PbCe%*oiR^hbmv^lV zp3J^>bNuFb-C~IZ?-2b7xAt&glzeZ!Tbnx$sz5)<{mVsi1rNzhc&1SE$Y|Z6QIdPz zRd;xFyw4}>9YG%~bCpihNi{!J6_{3Yqqaz}kX}-^I3&?L9m`*_=Rc^jy;*m->)~Rg zv0ytHm{fz)TQA;3qo)7+_Et;T7IaB(uT|+JNPsd^)mVDbL0X{s{AGLoQkCtEy2FtL z3nGnUw(EftYH)JvMcQ6lXs@>6xnMU8AxY`#R_SM*L{E9>&9EMCR)V+oK0;z|5IyTx zV}B+24;&{%kE!}1GIB0E|7x`4=SIk&bK1JP!>u)H z@ObtkVq`oKdL=@OJRh>>&_MlDb%)o?BlK^%8=hxQYMI=1&vP)(z3#yiDw~uaDN##) zpa)GsFurFK(cws{(Y^54y$~2PYQ}ar={OyzErhBiu+~xtH+X>gf-Q%i+ft+Ia|ms9 zt8@|ARC1urR%VRl@Ar$v;$H31r+3vmf&0Opg<#joPHs8%{lXM-3L$2F=01t>tk(|LZoDvDB}sjdKknNt^E_HL(O-6f zWhXt-;Pn^T)X16M>gX+ICi+Kb+?mD>uyNB& zy+Vc>>lYGw^H@FF!LFgVd-Q=GrWS7zFEi}%fTj&@zWdTOv*vkOq8%sn-3XL2cnM& zMu(r|@=oZKPGZaRI2Y`2*<)}YC*eNKoG{-TN8T6Kf(3}TvEDmlA#esQ2 z>3zaHNv1S!JekV&4|s>-L#gx*NosFxeZpBQ^=LYNnwjxOeA5qrN`8FJ%l-=uP z7n3C%f0&QB|4GhA_!xq5nDf8Fu|;+tuq(1>zauPrb547xTJ|WiyG3@j)nrRNsaY*x zN$P=Zf55#!dF(u(;{|(*?0Md?O7UxfOTI zb;#ZxA;x01i_57f2ecd>j6G5}{ydKHX~*~|7@ycUY%hTKr(_o>%Q^Qu4nXgen&COY z_q~MsRN4K!y-oHQ4mj}vC!Bmg#w0h#-d`;@K&(qqP-{TE2_6?J0y>UAGiPguv!%?N zfWx)bWJ>%R+&Md;J5K3(v66(N;uoPLIpD7nIk2BsAcq7^xQx&%yG6gq-31)S_Kn1H z$7I3k9M0W6I3(BIKuLbyEI9Uxy9x7QK70=!3C*vXB@@WM$_@$L?RW7;;c2AjBiVA{xQ=t zyu*b0vWY~04Eb^CE~s5SZ{2A>FJCPCI>ZKSsNX)D(oBF&gH?77B~Gw z6HG}O-bh=y0x*r|HFapI)aJo{QwSC$Sipn9kccNsaQ3NQtyhx%$is!@`W1NKYlG3x zAg)M=$!ew!M|>i7cCL>EVkhH z@_a7G>n*s~BEQUnh4>i;LR;7fRGMY~o%(H0Wo_z1#xDU!esno~*iO@W{1 zcn=>1F8Zuih7a>RJ5q*wx$y@qd5DncgZ?sH^uY~fxae#9%5c%w4wd1eubnExMgOYh zeu;C5ekA!aJBFYG!KkIpaX@hCc%s**#kXscj}@bDb0#A(z?V%X2Dii$J0xE^g=@Gw z;0s8;SZZh}o`fCnZ5sErKi2(FM(d4j0Xb9_ABgs)dxzpYX#dCHg}r!Go+c$tA=j(zv+oBvEFB@ww@E}cxdtAuT9~38QHxlsNZ*17abDgCF^ZSj6*#{ZF_o4AhdTe) z{Q=lp>HJ^Teu(d12BVe4eyl|+3ID~o4i=I3TZMq%#?Qa93>W*vxB=D$Zx#LZmyF*K z-_Nh9q~bSxf2eFh+@BB}0H)IY5A#H6;?Cjy<5!;8FYX`TIpuc;kn}1p0Btje(r@`$ kabD&klbz +#include +#include +#include +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** maximum number of captures that a pattern can do during +** pattern-matching. This limit is arbitrary, but must fit in +** an unsigned char. +*/ +#if !defined(LUA_MAXCAPTURES) +#define LUA_MAXCAPTURES 32 +#endif + + +/* macro to 'unsign' a character */ +#define uchar(c) ((unsigned char)(c)) + + +/* +** Some sizes are better limited to fit in 'int', but must also fit in +** 'size_t'. (We assume that 'lua_Integer' cannot be smaller than 'int'.) +*/ +#define MAX_SIZET ((size_t)(~(size_t)0)) + +#define MAXSIZE \ + (sizeof(size_t) < sizeof(int) ? MAX_SIZET : (size_t)(INT_MAX)) + + + + +static int str_len (lua_State *L) { + size_t l; + luaL_checklstring(L, 1, &l); + lua_pushinteger(L, (lua_Integer)l); + return 1; +} + + +/* +** translate a relative initial string position +** (negative means back from end): clip result to [1, inf). +** The length of any string in Lua must fit in a lua_Integer, +** so there are no overflows in the casts. +** The inverted comparison avoids a possible overflow +** computing '-pos'. +*/ +static size_t posrelatI (lua_Integer pos, size_t len) { + if (pos > 0) + return (size_t)pos; + else if (pos == 0) + return 1; + else if (pos < -(lua_Integer)len) /* inverted comparison */ + return 1; /* clip to 1 */ + else return len + (size_t)pos + 1; +} + + +/* +** Gets an optional ending string position from argument 'arg', +** with default value 'def'. +** Negative means back from end: clip result to [0, len] +*/ +static size_t getendpos (lua_State *L, int arg, lua_Integer def, + size_t len) { + lua_Integer pos = luaL_optinteger(L, arg, def); + if (pos > (lua_Integer)len) + return len; + else if (pos >= 0) + return (size_t)pos; + else if (pos < -(lua_Integer)len) + return 0; + else return len + (size_t)pos + 1; +} + + +static int str_sub (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + size_t start = posrelatI(luaL_checkinteger(L, 2), l); + size_t end = getendpos(L, 3, -1, l); + if (start <= end) + lua_pushlstring(L, s + start - 1, (end - start) + 1); + else lua_pushliteral(L, ""); + return 1; +} + + +static int str_reverse (lua_State *L) { + size_t l, i; + luaL_Buffer b; + const char *s = luaL_checklstring(L, 1, &l); + char *p = luaL_buffinitsize(L, &b, l); + for (i = 0; i < l; i++) + p[i] = s[l - i - 1]; + luaL_pushresultsize(&b, l); + return 1; +} + + +static int str_lower (lua_State *L) { + size_t l; + size_t i; + luaL_Buffer b; + const char *s = luaL_checklstring(L, 1, &l); + char *p = luaL_buffinitsize(L, &b, l); + for (i=0; i MAXSIZE / n) /* may overflow? */ + return luaL_error(L, "resulting string too large"); + else { + size_t totallen = (size_t)n * l + (size_t)(n - 1) * lsep; + luaL_Buffer b; + char *p = luaL_buffinitsize(L, &b, totallen); + while (n-- > 1) { /* first n-1 copies (followed by separator) */ + memcpy(p, s, l * sizeof(char)); p += l; + if (lsep > 0) { /* empty 'memcpy' is not that cheap */ + memcpy(p, sep, lsep * sizeof(char)); + p += lsep; + } + } + memcpy(p, s, l * sizeof(char)); /* last copy (not followed by separator) */ + luaL_pushresultsize(&b, totallen); + } + return 1; +} + + +static int str_byte (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + lua_Integer pi = luaL_optinteger(L, 2, 1); + size_t posi = posrelatI(pi, l); + size_t pose = getendpos(L, 3, pi, l); + int n, i; + if (posi > pose) return 0; /* empty interval; return no values */ + if (pose - posi >= (size_t)INT_MAX) /* arithmetic overflow? */ + return luaL_error(L, "string slice too long"); + n = (int)(pose - posi) + 1; + luaL_checkstack(L, n, "string slice too long"); + for (i=0; i= ms->level || ms->capture[l].len == CAP_UNFINISHED) + return luaL_error(ms->L, "invalid capture index %%%d", l + 1); + return l; +} + + +static int capture_to_close (MatchState *ms) { + int level = ms->level; + for (level--; level>=0; level--) + if (ms->capture[level].len == CAP_UNFINISHED) return level; + return luaL_error(ms->L, "invalid pattern capture"); +} + + +static const char *classend (MatchState *ms, const char *p) { + switch (*p++) { + case L_ESC: { + if (p == ms->p_end) + luaL_error(ms->L, "malformed pattern (ends with '%%')"); + return p+1; + } + case '[': { + if (*p == '^') p++; + do { /* look for a ']' */ + if (p == ms->p_end) + luaL_error(ms->L, "malformed pattern (missing ']')"); + if (*(p++) == L_ESC && p < ms->p_end) + p++; /* skip escapes (e.g. '%]') */ + } while (*p != ']'); + return p+1; + } + default: { + return p; + } + } +} + + +static int match_class (int c, int cl) { + int res; + switch (tolower(cl)) { + case 'a' : res = isalpha(c); break; + case 'c' : res = iscntrl(c); break; + case 'd' : res = isdigit(c); break; + case 'g' : res = isgraph(c); break; + case 'l' : res = islower(c); break; + case 'p' : res = ispunct(c); break; + case 's' : res = isspace(c); break; + case 'u' : res = isupper(c); break; + case 'w' : res = isalnum(c); break; + case 'x' : res = isxdigit(c); break; + case 'z' : res = (c == 0); break; /* deprecated option */ + default: return (cl == c); + } + return (islower(cl) ? res : !res); +} + + +static int matchbracketclass (int c, const char *p, const char *ec) { + int sig = 1; + if (*(p+1) == '^') { + sig = 0; + p++; /* skip the '^' */ + } + while (++p < ec) { + if (*p == L_ESC) { + p++; + if (match_class(c, uchar(*p))) + return sig; + } + else if ((*(p+1) == '-') && (p+2 < ec)) { + p+=2; + if (uchar(*(p-2)) <= c && c <= uchar(*p)) + return sig; + } + else if (uchar(*p) == c) return sig; + } + return !sig; +} + + +static int singlematch (MatchState *ms, const char *s, const char *p, + const char *ep) { + if (s >= ms->src_end) + return 0; + else { + int c = uchar(*s); + switch (*p) { + case '.': return 1; /* matches any char */ + case L_ESC: return match_class(c, uchar(*(p+1))); + case '[': return matchbracketclass(c, p, ep-1); + default: return (uchar(*p) == c); + } + } +} + + +static const char *matchbalance (MatchState *ms, const char *s, + const char *p) { + if (p >= ms->p_end - 1) + luaL_error(ms->L, "malformed pattern (missing arguments to '%%b')"); + if (*s != *p) return NULL; + else { + int b = *p; + int e = *(p+1); + int cont = 1; + while (++s < ms->src_end) { + if (*s == e) { + if (--cont == 0) return s+1; + } + else if (*s == b) cont++; + } + } + return NULL; /* string ends out of balance */ +} + + +static const char *max_expand (MatchState *ms, const char *s, + const char *p, const char *ep) { + ptrdiff_t i = 0; /* counts maximum expand for item */ + while (singlematch(ms, s + i, p, ep)) + i++; + /* keeps trying to match with the maximum repetitions */ + while (i>=0) { + const char *res = match(ms, (s+i), ep+1); + if (res) return res; + i--; /* else didn't match; reduce 1 repetition to try again */ + } + return NULL; +} + + +static const char *min_expand (MatchState *ms, const char *s, + const char *p, const char *ep) { + for (;;) { + const char *res = match(ms, s, ep+1); + if (res != NULL) + return res; + else if (singlematch(ms, s, p, ep)) + s++; /* try with one more repetition */ + else return NULL; + } +} + + +static const char *start_capture (MatchState *ms, const char *s, + const char *p, int what) { + const char *res; + int level = ms->level; + if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, "too many captures"); + ms->capture[level].init = s; + ms->capture[level].len = what; + ms->level = level+1; + if ((res=match(ms, s, p)) == NULL) /* match failed? */ + ms->level--; /* undo capture */ + return res; +} + + +static const char *end_capture (MatchState *ms, const char *s, + const char *p) { + int l = capture_to_close(ms); + const char *res; + ms->capture[l].len = s - ms->capture[l].init; /* close capture */ + if ((res = match(ms, s, p)) == NULL) /* match failed? */ + ms->capture[l].len = CAP_UNFINISHED; /* undo capture */ + return res; +} + + +static const char *match_capture (MatchState *ms, const char *s, int l) { + size_t len; + l = check_capture(ms, l); + len = ms->capture[l].len; + if ((size_t)(ms->src_end-s) >= len && + memcmp(ms->capture[l].init, s, len) == 0) + return s+len; + else return NULL; +} + + +static const char *match (MatchState *ms, const char *s, const char *p) { + if (ms->matchdepth-- == 0) + luaL_error(ms->L, "pattern too complex"); + init: /* using goto's to optimize tail recursion */ + if (p != ms->p_end) { /* end of pattern? */ + switch (*p) { + case '(': { /* start capture */ + if (*(p + 1) == ')') /* position capture? */ + s = start_capture(ms, s, p + 2, CAP_POSITION); + else + s = start_capture(ms, s, p + 1, CAP_UNFINISHED); + break; + } + case ')': { /* end capture */ + s = end_capture(ms, s, p + 1); + break; + } + case '$': { + if ((p + 1) != ms->p_end) /* is the '$' the last char in pattern? */ + goto dflt; /* no; go to default */ + s = (s == ms->src_end) ? s : NULL; /* check end of string */ + break; + } + case L_ESC: { /* escaped sequences not in the format class[*+?-]? */ + switch (*(p + 1)) { + case 'b': { /* balanced string? */ + s = matchbalance(ms, s, p + 2); + if (s != NULL) { + p += 4; goto init; /* return match(ms, s, p + 4); */ + } /* else fail (s == NULL) */ + break; + } + case 'f': { /* frontier? */ + const char *ep; char previous; + p += 2; + if (*p != '[') + luaL_error(ms->L, "missing '[' after '%%f' in pattern"); + ep = classend(ms, p); /* points to what is next */ + previous = (s == ms->src_init) ? '\0' : *(s - 1); + if (!matchbracketclass(uchar(previous), p, ep - 1) && + matchbracketclass(uchar(*s), p, ep - 1)) { + p = ep; goto init; /* return match(ms, s, ep); */ + } + s = NULL; /* match failed */ + break; + } + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + case '8': case '9': { /* capture results (%0-%9)? */ + s = match_capture(ms, s, uchar(*(p + 1))); + if (s != NULL) { + p += 2; goto init; /* return match(ms, s, p + 2) */ + } + break; + } + default: goto dflt; + } + break; + } + default: dflt: { /* pattern class plus optional suffix */ + const char *ep = classend(ms, p); /* points to optional suffix */ + /* does not match at least once? */ + if (!singlematch(ms, s, p, ep)) { + if (*ep == '*' || *ep == '?' || *ep == '-') { /* accept empty? */ + p = ep + 1; goto init; /* return match(ms, s, ep + 1); */ + } + else /* '+' or no suffix */ + s = NULL; /* fail */ + } + else { /* matched once */ + switch (*ep) { /* handle optional suffix */ + case '?': { /* optional */ + const char *res; + if ((res = match(ms, s + 1, ep + 1)) != NULL) + s = res; + else { + p = ep + 1; goto init; /* else return match(ms, s, ep + 1); */ + } + break; + } + case '+': /* 1 or more repetitions */ + s++; /* 1 match already done */ + /* FALLTHROUGH */ + case '*': /* 0 or more repetitions */ + s = max_expand(ms, s, p, ep); + break; + case '-': /* 0 or more repetitions (minimum) */ + s = min_expand(ms, s, p, ep); + break; + default: /* no suffix */ + s++; p = ep; goto init; /* return match(ms, s + 1, ep); */ + } + } + break; + } + } + } + ms->matchdepth++; + return s; +} + + + +static const char *lmemfind (const char *s1, size_t l1, + const char *s2, size_t l2) { + if (l2 == 0) return s1; /* empty strings are everywhere */ + else if (l2 > l1) return NULL; /* avoids a negative 'l1' */ + else { + const char *init; /* to search for a '*s2' inside 's1' */ + l2--; /* 1st char will be checked by 'memchr' */ + l1 = l1-l2; /* 's2' cannot be found after that */ + while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) { + init++; /* 1st char is already checked */ + if (memcmp(init, s2+1, l2) == 0) + return init-1; + else { /* correct 'l1' and 's1' to try again */ + l1 -= init-s1; + s1 = init; + } + } + return NULL; /* not found */ + } +} + + +static void push_onecapture (MatchState *ms, int i, const char *s, + const char *e) { + if (i >= ms->level) { + if (i == 0) /* ms->level == 0, too */ + lua_pushlstring(ms->L, s, e - s); /* add whole match */ + else + luaL_error(ms->L, "invalid capture index %%%d", i + 1); + } + else { + ptrdiff_t l = ms->capture[i].len; + if (l == CAP_UNFINISHED) luaL_error(ms->L, "unfinished capture"); + if (l == CAP_POSITION) + lua_pushinteger(ms->L, (ms->capture[i].init - ms->src_init) + 1); + else + lua_pushlstring(ms->L, ms->capture[i].init, l); + } +} + + +static int push_captures (MatchState *ms, const char *s, const char *e) { + int i; + int nlevels = (ms->level == 0 && s) ? 1 : ms->level; + luaL_checkstack(ms->L, nlevels, "too many captures"); + for (i = 0; i < nlevels; i++) + push_onecapture(ms, i, s, e); + return nlevels; /* number of strings pushed */ +} + + +/* check whether pattern has no special characters */ +static int nospecials (const char *p, size_t l) { + size_t upto = 0; + do { + if (strpbrk(p + upto, SPECIALS)) + return 0; /* pattern has a special character */ + upto += strlen(p + upto) + 1; /* may have more after \0 */ + } while (upto <= l); + return 1; /* no special chars found */ +} + + +static void prepstate (MatchState *ms, lua_State *L, + const char *s, size_t ls, const char *p, size_t lp) { + ms->L = L; + ms->matchdepth = MAXCCALLS; + ms->src_init = s; + ms->src_end = s + ls; + ms->p_end = p + lp; +} + + +static void reprepstate (MatchState *ms) { + ms->level = 0; + lua_assert(ms->matchdepth == MAXCCALLS); +} + + +static int str_find_aux (lua_State *L, int find) { + size_t ls, lp; + const char *s = luaL_checklstring(L, 1, &ls); + const char *p = luaL_checklstring(L, 2, &lp); + size_t init = posrelatI(luaL_optinteger(L, 3, 1), ls) - 1; + if (init > ls) { /* start after string's end? */ + lua_pushnil(L); /* cannot find anything */ + return 1; + } + /* explicit request or no special characters? */ + if (find && (lua_toboolean(L, 4) || nospecials(p, lp))) { + /* do a plain search */ + const char *s2 = lmemfind(s + init, ls - init, p, lp); + if (s2) { + lua_pushinteger(L, (s2 - s) + 1); + lua_pushinteger(L, (s2 - s) + lp); + return 2; + } + } + else { + MatchState ms; + const char *s1 = s + init; + int anchor = (*p == '^'); + if (anchor) { + p++; lp--; /* skip anchor character */ + } + prepstate(&ms, L, s, ls, p, lp); + do { + const char *res; + reprepstate(&ms); + if ((res=match(&ms, s1, p)) != NULL) { + if (find) { + lua_pushinteger(L, (s1 - s) + 1); /* start */ + lua_pushinteger(L, res - s); /* end */ + return push_captures(&ms, NULL, 0) + 2; + } + else + return push_captures(&ms, s1, res); + } + } while (s1++ < ms.src_end && !anchor); + } + lua_pushnil(L); /* not found */ + return 1; +} + + +static int str_find (lua_State *L) { + return str_find_aux(L, 1); +} + + +static int str_match (lua_State *L) { + return str_find_aux(L, 0); +} + + +/* state for 'gmatch' */ +typedef struct GMatchState { + const char *src; /* current position */ + const char *p; /* pattern */ + const char *lastmatch; /* end of last match */ + MatchState ms; /* match state */ +} GMatchState; + + +static int gmatch_aux (lua_State *L) { + GMatchState *gm = (GMatchState *)lua_touserdata(L, lua_upvalueindex(3)); + const char *src; + gm->ms.L = L; + for (src = gm->src; src <= gm->ms.src_end; src++) { + const char *e; + reprepstate(&gm->ms); + if ((e = match(&gm->ms, src, gm->p)) != NULL && e != gm->lastmatch) { + gm->src = gm->lastmatch = e; + return push_captures(&gm->ms, src, e); + } + } + return 0; /* not found */ +} + + +static int gmatch (lua_State *L) { + size_t ls, lp; + const char *s = luaL_checklstring(L, 1, &ls); + const char *p = luaL_checklstring(L, 2, &lp); + size_t init = posrelatI(luaL_optinteger(L, 3, 1), ls) - 1; + GMatchState *gm; + lua_settop(L, 2); /* keep strings on closure to avoid being collected */ + gm = (GMatchState *)lua_newuserdatauv(L, sizeof(GMatchState), 0); + if (init > ls) /* start after string's end? */ + init = ls + 1; /* avoid overflows in 's + init' */ + prepstate(&gm->ms, L, s, ls, p, lp); + gm->src = s + init; gm->p = p; gm->lastmatch = NULL; + lua_pushcclosure(L, gmatch_aux, 3); + return 1; +} + + +static void add_s (MatchState *ms, luaL_Buffer *b, const char *s, + const char *e) { + size_t l, i; + lua_State *L = ms->L; + const char *news = lua_tolstring(L, 3, &l); + for (i = 0; i < l; i++) { + if (news[i] != L_ESC) + luaL_addchar(b, news[i]); + else { + i++; /* skip ESC */ + if (!isdigit(uchar(news[i]))) { + if (news[i] != L_ESC) + luaL_error(L, "invalid use of '%c' in replacement string", L_ESC); + luaL_addchar(b, news[i]); + } + else if (news[i] == '0') + luaL_addlstring(b, s, e - s); + else { + push_onecapture(ms, news[i] - '1', s, e); + luaL_tolstring(L, -1, NULL); /* if number, convert it to string */ + lua_remove(L, -2); /* remove original value */ + luaL_addvalue(b); /* add capture to accumulated result */ + } + } + } +} + + +static void add_value (MatchState *ms, luaL_Buffer *b, const char *s, + const char *e, int tr) { + lua_State *L = ms->L; + switch (tr) { + case LUA_TFUNCTION: { + int n; + lua_pushvalue(L, 3); + n = push_captures(ms, s, e); + lua_call(L, n, 1); + break; + } + case LUA_TTABLE: { + push_onecapture(ms, 0, s, e); + lua_gettable(L, 3); + break; + } + default: { /* LUA_TNUMBER or LUA_TSTRING */ + add_s(ms, b, s, e); + return; + } + } + if (!lua_toboolean(L, -1)) { /* nil or false? */ + lua_pop(L, 1); + lua_pushlstring(L, s, e - s); /* keep original text */ + } + else if (!lua_isstring(L, -1)) + luaL_error(L, "invalid replacement value (a %s)", luaL_typename(L, -1)); + luaL_addvalue(b); /* add result to accumulator */ +} + + +static int str_gsub (lua_State *L) { + size_t srcl, lp; + const char *src = luaL_checklstring(L, 1, &srcl); /* subject */ + const char *p = luaL_checklstring(L, 2, &lp); /* pattern */ + const char *lastmatch = NULL; /* end of last match */ + int tr = lua_type(L, 3); /* replacement type */ + lua_Integer max_s = luaL_optinteger(L, 4, srcl + 1); /* max replacements */ + int anchor = (*p == '^'); + lua_Integer n = 0; /* replacement count */ + MatchState ms; + luaL_Buffer b; + luaL_argexpected(L, tr == LUA_TNUMBER || tr == LUA_TSTRING || + tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3, + "string/function/table"); + luaL_buffinit(L, &b); + if (anchor) { + p++; lp--; /* skip anchor character */ + } + prepstate(&ms, L, src, srcl, p, lp); + while (n < max_s) { + const char *e; + reprepstate(&ms); /* (re)prepare state for new match */ + if ((e = match(&ms, src, p)) != NULL && e != lastmatch) { /* match? */ + n++; + add_value(&ms, &b, src, e, tr); /* add replacement to buffer */ + src = lastmatch = e; + } + else if (src < ms.src_end) /* otherwise, skip one character */ + luaL_addchar(&b, *src++); + else break; /* end of subject */ + if (anchor) break; + } + luaL_addlstring(&b, src, ms.src_end-src); + luaL_pushresult(&b); + lua_pushinteger(L, n); /* number of substitutions */ + return 2; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** STRING FORMAT +** ======================================================= +*/ + +#if !defined(lua_number2strx) /* { */ + +/* +** Hexadecimal floating-point formatter +*/ + +#define SIZELENMOD (sizeof(LUA_NUMBER_FRMLEN)/sizeof(char)) + + +/* +** Number of bits that goes into the first digit. It can be any value +** between 1 and 4; the following definition tries to align the number +** to nibble boundaries by making what is left after that first digit a +** multiple of 4. +*/ +#define L_NBFD ((l_mathlim(MANT_DIG) - 1)%4 + 1) + + +/* +** Add integer part of 'x' to buffer and return new 'x' +*/ +static lua_Number adddigit (char *buff, int n, lua_Number x) { + lua_Number dd = l_mathop(floor)(x); /* get integer part from 'x' */ + int d = (int)dd; + buff[n] = (d < 10 ? d + '0' : d - 10 + 'a'); /* add to buffer */ + return x - dd; /* return what is left */ +} + + +static int num2straux (char *buff, int sz, lua_Number x) { + /* if 'inf' or 'NaN', format it like '%g' */ + if (x != x || x == (lua_Number)HUGE_VAL || x == -(lua_Number)HUGE_VAL) + return l_sprintf(buff, sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)x); + else if (x == 0) { /* can be -0... */ + /* create "0" or "-0" followed by exponent */ + return l_sprintf(buff, sz, LUA_NUMBER_FMT "x0p+0", (LUAI_UACNUMBER)x); + } + else { + int e; + lua_Number m = l_mathop(frexp)(x, &e); /* 'x' fraction and exponent */ + int n = 0; /* character count */ + if (m < 0) { /* is number negative? */ + buff[n++] = '-'; /* add sign */ + m = -m; /* make it positive */ + } + buff[n++] = '0'; buff[n++] = 'x'; /* add "0x" */ + m = adddigit(buff, n++, m * (1 << L_NBFD)); /* add first digit */ + e -= L_NBFD; /* this digit goes before the radix point */ + if (m > 0) { /* more digits? */ + buff[n++] = lua_getlocaledecpoint(); /* add radix point */ + do { /* add as many digits as needed */ + m = adddigit(buff, n++, m * 16); + } while (m > 0); + } + n += l_sprintf(buff + n, sz - n, "p%+d", e); /* add exponent */ + lua_assert(n < sz); + return n; + } +} + + +static int lua_number2strx (lua_State *L, char *buff, int sz, + const char *fmt, lua_Number x) { + int n = num2straux(buff, sz, x); + if (fmt[SIZELENMOD] == 'A') { + int i; + for (i = 0; i < n; i++) + buff[i] = toupper(uchar(buff[i])); + } + else if (fmt[SIZELENMOD] != 'a') + return luaL_error(L, "modifiers for format '%%a'/'%%A' not implemented"); + return n; +} + +#endif /* } */ + + +/* +** Maximum size of each formatted item. This maximum size is produced +** by format('%.99f', -maxfloat), and is equal to 99 + 3 ('-', '.', +** and '\0') + number of decimal digits to represent maxfloat (which +** is maximum exponent + 1). (99+3+1 then rounded to 120 for "extra +** expenses", such as locale-dependent stuff) +*/ +#define MAX_ITEM (120 + l_mathlim(MAX_10_EXP)) + + +/* valid flags in a format specification */ +#define FLAGS "-+ #0" + +/* +** maximum size of each format specification (such as "%-099.99d") +*/ +#define MAX_FORMAT 32 + + +static void addquoted (luaL_Buffer *b, const char *s, size_t len) { + luaL_addchar(b, '"'); + while (len--) { + if (*s == '"' || *s == '\\' || *s == '\n') { + luaL_addchar(b, '\\'); + luaL_addchar(b, *s); + } + else if (iscntrl(uchar(*s))) { + char buff[10]; + if (!isdigit(uchar(*(s+1)))) + l_sprintf(buff, sizeof(buff), "\\%d", (int)uchar(*s)); + else + l_sprintf(buff, sizeof(buff), "\\%03d", (int)uchar(*s)); + luaL_addstring(b, buff); + } + else + luaL_addchar(b, *s); + s++; + } + luaL_addchar(b, '"'); +} + + +/* +** Serialize a floating-point number in such a way that it can be +** scanned back by Lua. Use hexadecimal format for "common" numbers +** (to preserve precision); inf, -inf, and NaN are handled separately. +** (NaN cannot be expressed as a numeral, so we write '(0/0)' for it.) +*/ +static int quotefloat (lua_State *L, char *buff, lua_Number n) { + const char *s; /* for the fixed representations */ + if (n == (lua_Number)HUGE_VAL) /* inf? */ + s = "1e9999"; + else if (n == -(lua_Number)HUGE_VAL) /* -inf? */ + s = "-1e9999"; + else if (n != n) /* NaN? */ + s = "(0/0)"; + else { /* format number as hexadecimal */ + int nb = lua_number2strx(L, buff, MAX_ITEM, + "%" LUA_NUMBER_FRMLEN "a", n); + /* ensures that 'buff' string uses a dot as the radix character */ + if (memchr(buff, '.', nb) == NULL) { /* no dot? */ + char point = lua_getlocaledecpoint(); /* try locale point */ + char *ppoint = (char *)memchr(buff, point, nb); + if (ppoint) *ppoint = '.'; /* change it to a dot */ + } + return nb; + } + /* for the fixed representations */ + return l_sprintf(buff, MAX_ITEM, "%s", s); +} + + +static void addliteral (lua_State *L, luaL_Buffer *b, int arg) { + switch (lua_type(L, arg)) { + case LUA_TSTRING: { + size_t len; + const char *s = lua_tolstring(L, arg, &len); + addquoted(b, s, len); + break; + } + case LUA_TNUMBER: { + char *buff = luaL_prepbuffsize(b, MAX_ITEM); + int nb; + if (!lua_isinteger(L, arg)) /* float? */ + nb = quotefloat(L, buff, lua_tonumber(L, arg)); + else { /* integers */ + lua_Integer n = lua_tointeger(L, arg); + const char *format = (n == LUA_MININTEGER) /* corner case? */ + ? "0x%" LUA_INTEGER_FRMLEN "x" /* use hex */ + : LUA_INTEGER_FMT; /* else use default format */ + nb = l_sprintf(buff, MAX_ITEM, format, (LUAI_UACINT)n); + } + luaL_addsize(b, nb); + break; + } + case LUA_TNIL: case LUA_TBOOLEAN: { + luaL_tolstring(L, arg, NULL); + luaL_addvalue(b); + break; + } + default: { + luaL_argerror(L, arg, "value has no literal form"); + } + } +} + + +static const char *scanformat (lua_State *L, const char *strfrmt, char *form) { + const char *p = strfrmt; + while (*p != '\0' && strchr(FLAGS, *p) != NULL) p++; /* skip flags */ + if ((size_t)(p - strfrmt) >= sizeof(FLAGS)/sizeof(char)) + luaL_error(L, "invalid format (repeated flags)"); + if (isdigit(uchar(*p))) p++; /* skip width */ + if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ + if (*p == '.') { + p++; + if (isdigit(uchar(*p))) p++; /* skip precision */ + if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ + } + if (isdigit(uchar(*p))) + luaL_error(L, "invalid format (width or precision too long)"); + *(form++) = '%'; + memcpy(form, strfrmt, ((p - strfrmt) + 1) * sizeof(char)); + form += (p - strfrmt) + 1; + *form = '\0'; + return p; +} + + +/* +** add length modifier into formats +*/ +static void addlenmod (char *form, const char *lenmod) { + size_t l = strlen(form); + size_t lm = strlen(lenmod); + char spec = form[l - 1]; + strcpy(form + l - 1, lenmod); + form[l + lm - 1] = spec; + form[l + lm] = '\0'; +} + + +static int str_format (lua_State *L) { + int top = lua_gettop(L); + int arg = 1; + size_t sfl; + const char *strfrmt = luaL_checklstring(L, arg, &sfl); + const char *strfrmt_end = strfrmt+sfl; + luaL_Buffer b; + luaL_buffinit(L, &b); + while (strfrmt < strfrmt_end) { + if (*strfrmt != L_ESC) + luaL_addchar(&b, *strfrmt++); + else if (*++strfrmt == L_ESC) + luaL_addchar(&b, *strfrmt++); /* %% */ + else { /* format item */ + char form[MAX_FORMAT]; /* to store the format ('%...') */ + char *buff = luaL_prepbuffsize(&b, MAX_ITEM); /* to put formatted item */ + int nb = 0; /* number of bytes in added item */ + if (++arg > top) + return luaL_argerror(L, arg, "no value"); + strfrmt = scanformat(L, strfrmt, form); + switch (*strfrmt++) { + case 'c': { + nb = l_sprintf(buff, MAX_ITEM, form, (int)luaL_checkinteger(L, arg)); + break; + } + case 'd': case 'i': + case 'o': case 'u': case 'x': case 'X': { + lua_Integer n = luaL_checkinteger(L, arg); + addlenmod(form, LUA_INTEGER_FRMLEN); + nb = l_sprintf(buff, MAX_ITEM, form, (LUAI_UACINT)n); + break; + } + case 'a': case 'A': + addlenmod(form, LUA_NUMBER_FRMLEN); + nb = lua_number2strx(L, buff, MAX_ITEM, form, + luaL_checknumber(L, arg)); + break; + case 'e': case 'E': case 'f': + case 'g': case 'G': { + lua_Number n = luaL_checknumber(L, arg); + addlenmod(form, LUA_NUMBER_FRMLEN); + nb = l_sprintf(buff, MAX_ITEM, form, (LUAI_UACNUMBER)n); + break; + } + case 'p': { + const void *p = lua_topointer(L, arg); + nb = l_sprintf(buff, MAX_ITEM, form, p); + break; + } + case 'q': { + if (form[2] != '\0') /* modifiers? */ + return luaL_error(L, "specifier '%%q' cannot have modifiers"); + addliteral(L, &b, arg); + break; + } + case 's': { + size_t l; + const char *s = luaL_tolstring(L, arg, &l); + if (form[2] == '\0') /* no modifiers? */ + luaL_addvalue(&b); /* keep entire string */ + else { + luaL_argcheck(L, l == strlen(s), arg, "string contains zeros"); + if (!strchr(form, '.') && l >= 100) { + /* no precision and string is too long to be formatted */ + luaL_addvalue(&b); /* keep entire string */ + } + else { /* format the string into 'buff' */ + nb = l_sprintf(buff, MAX_ITEM, form, s); + lua_pop(L, 1); /* remove result from 'luaL_tolstring' */ + } + } + break; + } + default: { /* also treat cases 'pnLlh' */ + return luaL_error(L, "invalid conversion '%s' to 'format'", form); + } + } + lua_assert(nb < MAX_ITEM); + luaL_addsize(&b, nb); + } + } + luaL_pushresult(&b); + return 1; +} + +/* }====================================================== */ + + +/* +** {====================================================== +** PACK/UNPACK +** ======================================================= +*/ + + +/* value used for padding */ +#if !defined(LUAL_PACKPADBYTE) +#define LUAL_PACKPADBYTE 0x00 +#endif + +/* maximum size for the binary representation of an integer */ +#define MAXINTSIZE 16 + +/* number of bits in a character */ +#define NB CHAR_BIT + +/* mask for one character (NB 1's) */ +#define MC ((1 << NB) - 1) + +/* size of a lua_Integer */ +#define SZINT ((int)sizeof(lua_Integer)) + + +/* dummy union to get native endianness */ +static const union { + int dummy; + char little; /* true iff machine is little endian */ +} nativeendian = {1}; + + +/* dummy structure to get native alignment requirements */ +struct cD { + char c; + union { double d; void *p; lua_Integer i; lua_Number n; } u; +}; + +#define MAXALIGN (offsetof(struct cD, u)) + + +/* +** Union for serializing floats +*/ +typedef union Ftypes { + float f; + double d; + lua_Number n; + char buff[5 * sizeof(lua_Number)]; /* enough for any float type */ +} Ftypes; + + +/* +** information to pack/unpack stuff +*/ +typedef struct Header { + lua_State *L; + int islittle; + int maxalign; +} Header; + + +/* +** options for pack/unpack +*/ +typedef enum KOption { + Kint, /* signed integers */ + Kuint, /* unsigned integers */ + Kfloat, /* floating-point numbers */ + Kchar, /* fixed-length strings */ + Kstring, /* strings with prefixed length */ + Kzstr, /* zero-terminated strings */ + Kpadding, /* padding */ + Kpaddalign, /* padding for alignment */ + Knop /* no-op (configuration or spaces) */ +} KOption; + + +/* +** Read an integer numeral from string 'fmt' or return 'df' if +** there is no numeral +*/ +static int digit (int c) { return '0' <= c && c <= '9'; } + +static int getnum (const char **fmt, int df) { + if (!digit(**fmt)) /* no number? */ + return df; /* return default value */ + else { + int a = 0; + do { + a = a*10 + (*((*fmt)++) - '0'); + } while (digit(**fmt) && a <= ((int)MAXSIZE - 9)/10); + return a; + } +} + + +/* +** Read an integer numeral and raises an error if it is larger +** than the maximum size for integers. +*/ +static int getnumlimit (Header *h, const char **fmt, int df) { + int sz = getnum(fmt, df); + if (sz > MAXINTSIZE || sz <= 0) + return luaL_error(h->L, "integral size (%d) out of limits [1,%d]", + sz, MAXINTSIZE); + return sz; +} + + +/* +** Initialize Header +*/ +static void initheader (lua_State *L, Header *h) { + h->L = L; + h->islittle = nativeendian.little; + h->maxalign = 1; +} + + +/* +** Read and classify next option. 'size' is filled with option's size. +*/ +static KOption getoption (Header *h, const char **fmt, int *size) { + int opt = *((*fmt)++); + *size = 0; /* default */ + switch (opt) { + case 'b': *size = sizeof(char); return Kint; + case 'B': *size = sizeof(char); return Kuint; + case 'h': *size = sizeof(short); return Kint; + case 'H': *size = sizeof(short); return Kuint; + case 'l': *size = sizeof(long); return Kint; + case 'L': *size = sizeof(long); return Kuint; + case 'j': *size = sizeof(lua_Integer); return Kint; + case 'J': *size = sizeof(lua_Integer); return Kuint; + case 'T': *size = sizeof(size_t); return Kuint; + case 'f': *size = sizeof(float); return Kfloat; + case 'd': *size = sizeof(double); return Kfloat; + case 'n': *size = sizeof(lua_Number); return Kfloat; + case 'i': *size = getnumlimit(h, fmt, sizeof(int)); return Kint; + case 'I': *size = getnumlimit(h, fmt, sizeof(int)); return Kuint; + case 's': *size = getnumlimit(h, fmt, sizeof(size_t)); return Kstring; + case 'c': + *size = getnum(fmt, -1); + if (*size == -1) + luaL_error(h->L, "missing size for format option 'c'"); + return Kchar; + case 'z': return Kzstr; + case 'x': *size = 1; return Kpadding; + case 'X': return Kpaddalign; + case ' ': break; + case '<': h->islittle = 1; break; + case '>': h->islittle = 0; break; + case '=': h->islittle = nativeendian.little; break; + case '!': h->maxalign = getnumlimit(h, fmt, MAXALIGN); break; + default: luaL_error(h->L, "invalid format option '%c'", opt); + } + return Knop; +} + + +/* +** Read, classify, and fill other details about the next option. +** 'psize' is filled with option's size, 'notoalign' with its +** alignment requirements. +** Local variable 'size' gets the size to be aligned. (Kpadal option +** always gets its full alignment, other options are limited by +** the maximum alignment ('maxalign'). Kchar option needs no alignment +** despite its size. +*/ +static KOption getdetails (Header *h, size_t totalsize, + const char **fmt, int *psize, int *ntoalign) { + KOption opt = getoption(h, fmt, psize); + int align = *psize; /* usually, alignment follows size */ + if (opt == Kpaddalign) { /* 'X' gets alignment from following option */ + if (**fmt == '\0' || getoption(h, fmt, &align) == Kchar || align == 0) + luaL_argerror(h->L, 1, "invalid next option for option 'X'"); + } + if (align <= 1 || opt == Kchar) /* need no alignment? */ + *ntoalign = 0; + else { + if (align > h->maxalign) /* enforce maximum alignment */ + align = h->maxalign; + if ((align & (align - 1)) != 0) /* is 'align' not a power of 2? */ + luaL_argerror(h->L, 1, "format asks for alignment not power of 2"); + *ntoalign = (align - (int)(totalsize & (align - 1))) & (align - 1); + } + return opt; +} + + +/* +** Pack integer 'n' with 'size' bytes and 'islittle' endianness. +** The final 'if' handles the case when 'size' is larger than +** the size of a Lua integer, correcting the extra sign-extension +** bytes if necessary (by default they would be zeros). +*/ +static void packint (luaL_Buffer *b, lua_Unsigned n, + int islittle, int size, int neg) { + char *buff = luaL_prepbuffsize(b, size); + int i; + buff[islittle ? 0 : size - 1] = (char)(n & MC); /* first byte */ + for (i = 1; i < size; i++) { + n >>= NB; + buff[islittle ? i : size - 1 - i] = (char)(n & MC); + } + if (neg && size > SZINT) { /* negative number need sign extension? */ + for (i = SZINT; i < size; i++) /* correct extra bytes */ + buff[islittle ? i : size - 1 - i] = (char)MC; + } + luaL_addsize(b, size); /* add result to buffer */ +} + + +/* +** Copy 'size' bytes from 'src' to 'dest', correcting endianness if +** given 'islittle' is different from native endianness. +*/ +static void copywithendian (volatile char *dest, volatile const char *src, + int size, int islittle) { + if (islittle == nativeendian.little) { + while (size-- != 0) + *(dest++) = *(src++); + } + else { + dest += size - 1; + while (size-- != 0) + *(dest--) = *(src++); + } +} + + +static int str_pack (lua_State *L) { + luaL_Buffer b; + Header h; + const char *fmt = luaL_checkstring(L, 1); /* format string */ + int arg = 1; /* current argument to pack */ + size_t totalsize = 0; /* accumulate total size of result */ + initheader(L, &h); + lua_pushnil(L); /* mark to separate arguments from string buffer */ + luaL_buffinit(L, &b); + while (*fmt != '\0') { + int size, ntoalign; + KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); + totalsize += ntoalign + size; + while (ntoalign-- > 0) + luaL_addchar(&b, LUAL_PACKPADBYTE); /* fill alignment */ + arg++; + switch (opt) { + case Kint: { /* signed integers */ + lua_Integer n = luaL_checkinteger(L, arg); + if (size < SZINT) { /* need overflow check? */ + lua_Integer lim = (lua_Integer)1 << ((size * NB) - 1); + luaL_argcheck(L, -lim <= n && n < lim, arg, "integer overflow"); + } + packint(&b, (lua_Unsigned)n, h.islittle, size, (n < 0)); + break; + } + case Kuint: { /* unsigned integers */ + lua_Integer n = luaL_checkinteger(L, arg); + if (size < SZINT) /* need overflow check? */ + luaL_argcheck(L, (lua_Unsigned)n < ((lua_Unsigned)1 << (size * NB)), + arg, "unsigned overflow"); + packint(&b, (lua_Unsigned)n, h.islittle, size, 0); + break; + } + case Kfloat: { /* floating-point options */ + volatile Ftypes u; + char *buff = luaL_prepbuffsize(&b, size); + lua_Number n = luaL_checknumber(L, arg); /* get argument */ + if (size == sizeof(u.f)) u.f = (float)n; /* copy it into 'u' */ + else if (size == sizeof(u.d)) u.d = (double)n; + else u.n = n; + /* move 'u' to final result, correcting endianness if needed */ + copywithendian(buff, u.buff, size, h.islittle); + luaL_addsize(&b, size); + break; + } + case Kchar: { /* fixed-size string */ + size_t len; + const char *s = luaL_checklstring(L, arg, &len); + luaL_argcheck(L, len <= (size_t)size, arg, + "string longer than given size"); + luaL_addlstring(&b, s, len); /* add string */ + while (len++ < (size_t)size) /* pad extra space */ + luaL_addchar(&b, LUAL_PACKPADBYTE); + break; + } + case Kstring: { /* strings with length count */ + size_t len; + const char *s = luaL_checklstring(L, arg, &len); + luaL_argcheck(L, size >= (int)sizeof(size_t) || + len < ((size_t)1 << (size * NB)), + arg, "string length does not fit in given size"); + packint(&b, (lua_Unsigned)len, h.islittle, size, 0); /* pack length */ + luaL_addlstring(&b, s, len); + totalsize += len; + break; + } + case Kzstr: { /* zero-terminated string */ + size_t len; + const char *s = luaL_checklstring(L, arg, &len); + luaL_argcheck(L, strlen(s) == len, arg, "string contains zeros"); + luaL_addlstring(&b, s, len); + luaL_addchar(&b, '\0'); /* add zero at the end */ + totalsize += len + 1; + break; + } + case Kpadding: luaL_addchar(&b, LUAL_PACKPADBYTE); /* FALLTHROUGH */ + case Kpaddalign: case Knop: + arg--; /* undo increment */ + break; + } + } + luaL_pushresult(&b); + return 1; +} + + +static int str_packsize (lua_State *L) { + Header h; + const char *fmt = luaL_checkstring(L, 1); /* format string */ + size_t totalsize = 0; /* accumulate total size of result */ + initheader(L, &h); + while (*fmt != '\0') { + int size, ntoalign; + KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); + luaL_argcheck(L, opt != Kstring && opt != Kzstr, 1, + "variable-length format"); + size += ntoalign; /* total space used by option */ + luaL_argcheck(L, totalsize <= MAXSIZE - size, 1, + "format result too large"); + totalsize += size; + } + lua_pushinteger(L, (lua_Integer)totalsize); + return 1; +} + + +/* +** Unpack an integer with 'size' bytes and 'islittle' endianness. +** If size is smaller than the size of a Lua integer and integer +** is signed, must do sign extension (propagating the sign to the +** higher bits); if size is larger than the size of a Lua integer, +** it must check the unread bytes to see whether they do not cause an +** overflow. +*/ +static lua_Integer unpackint (lua_State *L, const char *str, + int islittle, int size, int issigned) { + lua_Unsigned res = 0; + int i; + int limit = (size <= SZINT) ? size : SZINT; + for (i = limit - 1; i >= 0; i--) { + res <<= NB; + res |= (lua_Unsigned)(unsigned char)str[islittle ? i : size - 1 - i]; + } + if (size < SZINT) { /* real size smaller than lua_Integer? */ + if (issigned) { /* needs sign extension? */ + lua_Unsigned mask = (lua_Unsigned)1 << (size*NB - 1); + res = ((res ^ mask) - mask); /* do sign extension */ + } + } + else if (size > SZINT) { /* must check unread bytes */ + int mask = (!issigned || (lua_Integer)res >= 0) ? 0 : MC; + for (i = limit; i < size; i++) { + if ((unsigned char)str[islittle ? i : size - 1 - i] != mask) + luaL_error(L, "%d-byte integer does not fit into Lua Integer", size); + } + } + return (lua_Integer)res; +} + + +static int str_unpack (lua_State *L) { + Header h; + const char *fmt = luaL_checkstring(L, 1); + size_t ld; + const char *data = luaL_checklstring(L, 2, &ld); + size_t pos = posrelatI(luaL_optinteger(L, 3, 1), ld) - 1; + int n = 0; /* number of results */ + luaL_argcheck(L, pos <= ld, 3, "initial position out of string"); + initheader(L, &h); + while (*fmt != '\0') { + int size, ntoalign; + KOption opt = getdetails(&h, pos, &fmt, &size, &ntoalign); + luaL_argcheck(L, (size_t)ntoalign + size <= ld - pos, 2, + "data string too short"); + pos += ntoalign; /* skip alignment */ + /* stack space for item + next position */ + luaL_checkstack(L, 2, "too many results"); + n++; + switch (opt) { + case Kint: + case Kuint: { + lua_Integer res = unpackint(L, data + pos, h.islittle, size, + (opt == Kint)); + lua_pushinteger(L, res); + break; + } + case Kfloat: { + volatile Ftypes u; + lua_Number num; + copywithendian(u.buff, data + pos, size, h.islittle); + if (size == sizeof(u.f)) num = (lua_Number)u.f; + else if (size == sizeof(u.d)) num = (lua_Number)u.d; + else num = u.n; + lua_pushnumber(L, num); + break; + } + case Kchar: { + lua_pushlstring(L, data + pos, size); + break; + } + case Kstring: { + size_t len = (size_t)unpackint(L, data + pos, h.islittle, size, 0); + luaL_argcheck(L, len <= ld - pos - size, 2, "data string too short"); + lua_pushlstring(L, data + pos + size, len); + pos += len; /* skip string */ + break; + } + case Kzstr: { + size_t len = (int)strlen(data + pos); + luaL_argcheck(L, pos + len < ld, 2, + "unfinished string for format 'z'"); + lua_pushlstring(L, data + pos, len); + pos += len + 1; /* skip string plus final '\0' */ + break; + } + case Kpaddalign: case Kpadding: case Knop: + n--; /* undo increment */ + break; + } + pos += size; + } + lua_pushinteger(L, pos + 1); /* next position */ + return n + 1; +} + +/* }====================================================== */ + + +static const luaL_Reg strlib[] = { + {"byte", str_byte}, + {"char", str_char}, + {"dump", str_dump}, + {"find", str_find}, + {"format", str_format}, + {"gmatch", gmatch}, + {"gsub", str_gsub}, + {"len", str_len}, + {"lower", str_lower}, + {"match", str_match}, + {"rep", str_rep}, + {"reverse", str_reverse}, + {"sub", str_sub}, + {"upper", str_upper}, + {"pack", str_pack}, + {"packsize", str_packsize}, + {"unpack", str_unpack}, + {NULL, NULL} +}; + + +static void createmetatable (lua_State *L) { + /* table to be metatable for strings */ + luaL_newlibtable(L, stringmetamethods); + luaL_setfuncs(L, stringmetamethods, 0); + lua_pushliteral(L, ""); /* dummy string */ + lua_pushvalue(L, -2); /* copy table */ + lua_setmetatable(L, -2); /* set table as metatable for strings */ + lua_pop(L, 1); /* pop dummy string */ + lua_pushvalue(L, -2); /* get string library */ + lua_setfield(L, -2, "__index"); /* metatable.__index = string */ + lua_pop(L, 1); /* pop metatable */ +} + + +/* +** Open string library +*/ +LUAMOD_API int luaopen_string (lua_State *L) { + luaL_newlib(L, strlib); + createmetatable(L); + return 1; +} + diff --git a/source/lua/lstrlib.o b/source/lua/lstrlib.o new file mode 100644 index 0000000000000000000000000000000000000000..a4610b6010a653afd298ae65510b9353b217967f GIT binary patch literal 40504 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 literal 0 HcmV?d00001 diff --git a/source/lua/ltable.c b/source/lua/ltable.c new file mode 100644 index 0000000..e12381b --- /dev/null +++ b/source/lua/ltable.c @@ -0,0 +1,917 @@ +/* +** $Id: ltable.c $ +** Lua tables (hash) +** See Copyright Notice in lua.h +*/ + +#define ltable_c +#define LUA_CORE + +#include "lprefix.h" + + +/* +** Implementation of tables (aka arrays, objects, or hash tables). +** Tables keep its elements in two parts: an array part and a hash part. +** Non-negative integer keys are all candidates to be kept in the array +** part. The actual size of the array is the largest 'n' such that +** more than half the slots between 1 and n are in use. +** Hash uses a mix of chained scatter table with Brent's variation. +** A main invariant of these tables is that, if an element is not +** in its main position (i.e. the 'original' position that its hash gives +** to it), then the colliding element is in its own main position. +** Hence even when the load factor reaches 100%, performance remains good. +*/ + +#include +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "lvm.h" + + +/* +** MAXABITS is the largest integer such that MAXASIZE fits in an +** unsigned int. +*/ +#define MAXABITS cast_int(sizeof(int) * CHAR_BIT - 1) + + +/* +** MAXASIZE is the maximum size of the array part. It is the minimum +** between 2^MAXABITS and the maximum size such that, measured in bytes, +** it fits in a 'size_t'. +*/ +#define MAXASIZE luaM_limitN(1u << MAXABITS, TValue) + +/* +** MAXHBITS is the largest integer such that 2^MAXHBITS fits in a +** signed int. +*/ +#define MAXHBITS (MAXABITS - 1) + + +/* +** MAXHSIZE is the maximum size of the hash part. It is the minimum +** between 2^MAXHBITS and the maximum size such that, measured in bytes, +** it fits in a 'size_t'. +*/ +#define MAXHSIZE luaM_limitN(1u << MAXHBITS, Node) + + +#define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) + +#define hashstr(t,str) hashpow2(t, (str)->hash) +#define hashboolean(t,p) hashpow2(t, p) +#define hashint(t,i) hashpow2(t, i) + + +/* +** for some types, it is better to avoid modulus by power of 2, as +** they tend to have many 2 factors. +*/ +#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1)))) + + +#define hashpointer(t,p) hashmod(t, point2uint(p)) + + +#define dummynode (&dummynode_) + +static const Node dummynode_ = { + {{NULL}, LUA_TEMPTY, /* value's value and type */ + LUA_TNIL, 0, {NULL}} /* key type, next, and key value */ +}; + + +static const TValue absentkey = {ABSTKEYCONSTANT}; + + + +/* +** Hash for floating-point numbers. +** The main computation should be just +** n = frexp(n, &i); return (n * INT_MAX) + i +** but there are some numerical subtleties. +** In a two-complement representation, INT_MAX does not has an exact +** representation as a float, but INT_MIN does; because the absolute +** value of 'frexp' is smaller than 1 (unless 'n' is inf/NaN), the +** absolute value of the product 'frexp * -INT_MIN' is smaller or equal +** to INT_MAX. Next, the use of 'unsigned int' avoids overflows when +** adding 'i'; the use of '~u' (instead of '-u') avoids problems with +** INT_MIN. +*/ +#if !defined(l_hashfloat) +static int l_hashfloat (lua_Number n) { + int i; + lua_Integer ni; + n = l_mathop(frexp)(n, &i) * -cast_num(INT_MIN); + if (!lua_numbertointeger(n, &ni)) { /* is 'n' inf/-inf/NaN? */ + lua_assert(luai_numisnan(n) || l_mathop(fabs)(n) == cast_num(HUGE_VAL)); + return 0; + } + else { /* normal case */ + unsigned int u = cast_uint(i) + cast_uint(ni); + return cast_int(u <= cast_uint(INT_MAX) ? u : ~u); + } +} +#endif + + +/* +** returns the 'main' position of an element in a table (that is, +** the index of its hash value). The key comes broken (tag in 'ktt' +** and value in 'vkl') so that we can call it on keys inserted into +** nodes. +*/ +static Node *mainposition (const Table *t, int ktt, const Value *kvl) { + switch (withvariant(ktt)) { + case LUA_TNUMINT: + return hashint(t, ivalueraw(*kvl)); + case LUA_TNUMFLT: + return hashmod(t, l_hashfloat(fltvalueraw(*kvl))); + case LUA_TSHRSTR: + return hashstr(t, tsvalueraw(*kvl)); + case LUA_TLNGSTR: + return hashpow2(t, luaS_hashlongstr(tsvalueraw(*kvl))); + case LUA_TBOOLEAN: + return hashboolean(t, bvalueraw(*kvl)); + case LUA_TLIGHTUSERDATA: + return hashpointer(t, pvalueraw(*kvl)); + case LUA_TLCF: + return hashpointer(t, fvalueraw(*kvl)); + default: + return hashpointer(t, gcvalueraw(*kvl)); + } +} + + +static Node *mainpositionTV (const Table *t, const TValue *key) { + return mainposition(t, rawtt(key), valraw(key)); +} + + +/* +** Check whether key 'k1' is equal to the key in node 'n2'. +** This equality is raw, so there are no metamethods. Floats +** with integer values have been normalized, so integers cannot +** be equal to floats. It is assumed that 'eqshrstr' is simply +** pointer equality, so that short strings are handled in the +** default case. +*/ +static int equalkey (const TValue *k1, const Node *n2) { + if (rawtt(k1) != keytt(n2)) /* not the same variants? */ + return 0; /* cannot be same key */ + switch (ttypetag(k1)) { + case LUA_TNIL: + return 1; + case LUA_TNUMINT: + return (ivalue(k1) == keyival(n2)); + case LUA_TNUMFLT: + return luai_numeq(fltvalue(k1), fltvalueraw(keyval(n2))); + case LUA_TBOOLEAN: + return bvalue(k1) == bvalueraw(keyval(n2)); + case LUA_TLIGHTUSERDATA: + return pvalue(k1) == pvalueraw(keyval(n2)); + case LUA_TLCF: + return fvalue(k1) == fvalueraw(keyval(n2)); + case LUA_TLNGSTR: + return luaS_eqlngstr(tsvalue(k1), keystrval(n2)); + default: + return gcvalue(k1) == gcvalueraw(keyval(n2)); + } +} + + +/* +** True if value of 'alimit' is equal to the real size of the array +** part of table 't'. (Otherwise, the array part must be larger than +** 'alimit'.) +*/ +#define limitequalsasize(t) (isrealasize(t) || ispow2((t)->alimit)) + + +/* +** Returns the real size of the 'array' array +*/ +LUAI_FUNC unsigned int luaH_realasize (const Table *t) { + if (limitequalsasize(t)) + return t->alimit; /* this is the size */ + else { + unsigned int size = t->alimit; + /* compute the smallest power of 2 not smaller than 'n' */ + size |= (size >> 1); + size |= (size >> 2); + size |= (size >> 4); + size |= (size >> 8); + size |= (size >> 16); +#if (INT_MAX >> 30 >> 1) > 0 + size |= (size >> 32); /* int has more than 32 bits */ +#endif + size++; + lua_assert(ispow2(size) && size/2 < t->alimit && t->alimit < size); + return size; + } +} + + +/* +** Check whether real size of the array is a power of 2. +** (If it is not, 'alimit' cannot be changed to any other value +** without changing the real size.) +*/ +static int ispow2realasize (const Table *t) { + return (!isrealasize(t) || ispow2(t->alimit)); +} + + +static unsigned int setlimittosize (Table *t) { + t->alimit = luaH_realasize(t); + setrealasize(t); + return t->alimit; +} + + +#define limitasasize(t) check_exp(isrealasize(t), t->alimit) + + + +/* +** "Generic" get version. (Not that generic: not valid for integers, +** which may be in array part, nor for floats with integral values.) +*/ +static const TValue *getgeneric (Table *t, const TValue *key) { + Node *n = mainpositionTV(t, key); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (equalkey(key, n)) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) + return &absentkey; /* not found */ + n += nx; + } + } +} + + +/* +** returns the index for 'k' if 'k' is an appropriate key to live in +** the array part of a table, 0 otherwise. +*/ +static unsigned int arrayindex (lua_Integer k) { + if (0 < k && l_castS2U(k) <= MAXASIZE) + return cast_uint(k); /* 'key' is an appropriate array index */ + else + return 0; +} + + +/* +** returns the index of a 'key' for table traversals. First goes all +** elements in the array part, then elements in the hash part. The +** beginning of a traversal is signaled by 0. +*/ +static unsigned int findindex (lua_State *L, Table *t, TValue *key, + unsigned int asize) { + unsigned int i; + if (ttisnil(key)) return 0; /* first iteration */ + i = ttisinteger(key) ? arrayindex(ivalue(key)) : 0; + if (i != 0 && i <= asize) /* is 'key' inside array part? */ + return i; /* yes; that's the index */ + else { + const TValue *n = getgeneric(t, key); + if (unlikely(isabstkey(n))) + luaG_runerror(L, "invalid key to 'next'"); /* key not found */ + i = cast_int(nodefromval(n) - gnode(t, 0)); /* key index in hash table */ + /* hash elements are numbered after array ones */ + return (i + 1) + asize; + } +} + + +int luaH_next (lua_State *L, Table *t, StkId key) { + unsigned int asize = luaH_realasize(t); + unsigned int i = findindex(L, t, s2v(key), asize); /* find original key */ + for (; i < asize; i++) { /* try first array part */ + if (!isempty(&t->array[i])) { /* a non-empty entry? */ + setivalue(s2v(key), i + 1); + setobj2s(L, key + 1, &t->array[i]); + return 1; + } + } + for (i -= asize; cast_int(i) < sizenode(t); i++) { /* hash part */ + if (!isempty(gval(gnode(t, i)))) { /* a non-empty entry? */ + Node *n = gnode(t, i); + getnodekey(L, s2v(key), n); + setobj2s(L, key + 1, gval(n)); + return 1; + } + } + return 0; /* no more elements */ +} + + +static void freehash (lua_State *L, Table *t) { + if (!isdummy(t)) + luaM_freearray(L, t->node, cast_sizet(sizenode(t))); +} + + +/* +** {============================================================= +** Rehash +** ============================================================== +*/ + +/* +** Compute the optimal size for the array part of table 't'. 'nums' is a +** "count array" where 'nums[i]' is the number of integers in the table +** between 2^(i - 1) + 1 and 2^i. 'pna' enters with the total number of +** integer keys in the table and leaves with the number of keys that +** will go to the array part; return the optimal size. (The condition +** 'twotoi > 0' in the for loop stops the loop if 'twotoi' overflows.) +*/ +static unsigned int computesizes (unsigned int nums[], unsigned int *pna) { + int i; + unsigned int twotoi; /* 2^i (candidate for optimal size) */ + unsigned int a = 0; /* number of elements smaller than 2^i */ + unsigned int na = 0; /* number of elements to go to array part */ + unsigned int optimal = 0; /* optimal size for array part */ + /* loop while keys can fill more than half of total size */ + for (i = 0, twotoi = 1; + twotoi > 0 && *pna > twotoi / 2; + i++, twotoi *= 2) { + a += nums[i]; + if (a > twotoi/2) { /* more than half elements present? */ + optimal = twotoi; /* optimal size (till now) */ + na = a; /* all elements up to 'optimal' will go to array part */ + } + } + lua_assert((optimal == 0 || optimal / 2 < na) && na <= optimal); + *pna = na; + return optimal; +} + + +static int countint (lua_Integer key, unsigned int *nums) { + unsigned int k = arrayindex(key); + if (k != 0) { /* is 'key' an appropriate array index? */ + nums[luaO_ceillog2(k)]++; /* count as such */ + return 1; + } + else + return 0; +} + + +/* +** Count keys in array part of table 't': Fill 'nums[i]' with +** number of keys that will go into corresponding slice and return +** total number of non-nil keys. +*/ +static unsigned int numusearray (const Table *t, unsigned int *nums) { + int lg; + unsigned int ttlg; /* 2^lg */ + unsigned int ause = 0; /* summation of 'nums' */ + unsigned int i = 1; /* count to traverse all array keys */ + unsigned int asize = limitasasize(t); /* real array size */ + /* traverse each slice */ + for (lg = 0, ttlg = 1; lg <= MAXABITS; lg++, ttlg *= 2) { + unsigned int lc = 0; /* counter */ + unsigned int lim = ttlg; + if (lim > asize) { + lim = asize; /* adjust upper limit */ + if (i > lim) + break; /* no more elements to count */ + } + /* count elements in range (2^(lg - 1), 2^lg] */ + for (; i <= lim; i++) { + if (!isempty(&t->array[i-1])) + lc++; + } + nums[lg] += lc; + ause += lc; + } + return ause; +} + + +static int numusehash (const Table *t, unsigned int *nums, unsigned int *pna) { + int totaluse = 0; /* total number of elements */ + int ause = 0; /* elements added to 'nums' (can go to array part) */ + int i = sizenode(t); + while (i--) { + Node *n = &t->node[i]; + if (!isempty(gval(n))) { + if (keyisinteger(n)) + ause += countint(keyival(n), nums); + totaluse++; + } + } + *pna += ause; + return totaluse; +} + + +/* +** Creates an array for the hash part of a table with the given +** size, or reuses the dummy node if size is zero. +** The computation for size overflow is in two steps: the first +** comparison ensures that the shift in the second one does not +** overflow. +*/ +static void setnodevector (lua_State *L, Table *t, unsigned int size) { + if (size == 0) { /* no elements to hash part? */ + t->node = cast(Node *, dummynode); /* use common 'dummynode' */ + t->lsizenode = 0; + t->lastfree = NULL; /* signal that it is using dummy node */ + } + else { + int i; + int lsize = luaO_ceillog2(size); + if (lsize > MAXHBITS || (1u << lsize) > MAXHSIZE) + luaG_runerror(L, "table overflow"); + size = twoto(lsize); + t->node = luaM_newvector(L, size, Node); + for (i = 0; i < (int)size; i++) { + Node *n = gnode(t, i); + gnext(n) = 0; + setnilkey(n); + setempty(gval(n)); + } + t->lsizenode = cast_byte(lsize); + t->lastfree = gnode(t, size); /* all positions are free */ + } +} + + +/* +** (Re)insert all elements from the hash part of 'ot' into table 't'. +*/ +static void reinsert (lua_State *L, Table *ot, Table *t) { + int j; + int size = sizenode(ot); + for (j = 0; j < size; j++) { + Node *old = gnode(ot, j); + if (!isempty(gval(old))) { + /* doesn't need barrier/invalidate cache, as entry was + already present in the table */ + TValue k; + getnodekey(L, &k, old); + setobjt2t(L, luaH_set(L, t, &k), gval(old)); + } + } +} + + +/* +** Exchange the hash part of 't1' and 't2'. +*/ +static void exchangehashpart (Table *t1, Table *t2) { + lu_byte lsizenode = t1->lsizenode; + Node *node = t1->node; + Node *lastfree = t1->lastfree; + t1->lsizenode = t2->lsizenode; + t1->node = t2->node; + t1->lastfree = t2->lastfree; + t2->lsizenode = lsizenode; + t2->node = node; + t2->lastfree = lastfree; +} + + +/* +** Resize table 't' for the new given sizes. Both allocations (for +** the hash part and for the array part) can fail, which creates some +** subtleties. If the first allocation, for the hash part, fails, an +** error is raised and that is it. Otherwise, it copies the elements from +** the shrinking part of the array (if it is shrinking) into the new +** hash. Then it reallocates the array part. If that fails, the table +** is in its original state; the function frees the new hash part and then +** raises the allocation error. Otherwise, it sets the new hash part +** into the table, initializes the new part of the array (if any) with +** nils and reinserts the elements of the old hash back into the new +** parts of the table. +*/ +void luaH_resize (lua_State *L, Table *t, unsigned int newasize, + unsigned int nhsize) { + unsigned int i; + Table newt; /* to keep the new hash part */ + unsigned int oldasize = setlimittosize(t); + TValue *newarray; + /* create new hash part with appropriate size into 'newt' */ + setnodevector(L, &newt, nhsize); + if (newasize < oldasize) { /* will array shrink? */ + t->alimit = newasize; /* pretend array has new size... */ + exchangehashpart(t, &newt); /* and new hash */ + /* re-insert into the new hash the elements from vanishing slice */ + for (i = newasize; i < oldasize; i++) { + if (!isempty(&t->array[i])) + luaH_setint(L, t, i + 1, &t->array[i]); + } + t->alimit = oldasize; /* restore current size... */ + exchangehashpart(t, &newt); /* and hash (in case of errors) */ + } + /* allocate new array */ + newarray = luaM_reallocvector(L, t->array, oldasize, newasize, TValue); + if (unlikely(newarray == NULL && newasize > 0)) { /* allocation failed? */ + freehash(L, &newt); /* release new hash part */ + luaM_error(L); /* raise error (with array unchanged) */ + } + /* allocation ok; initialize new part of the array */ + exchangehashpart(t, &newt); /* 't' has the new hash ('newt' has the old) */ + t->array = newarray; /* set new array part */ + t->alimit = newasize; + for (i = oldasize; i < newasize; i++) /* clear new slice of the array */ + setempty(&t->array[i]); + /* re-insert elements from old hash part into new parts */ + reinsert(L, &newt, t); /* 'newt' now has the old hash */ + freehash(L, &newt); /* free old hash part */ +} + + +void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize) { + int nsize = allocsizenode(t); + luaH_resize(L, t, nasize, nsize); +} + +/* +** nums[i] = number of keys 'k' where 2^(i - 1) < k <= 2^i +*/ +static void rehash (lua_State *L, Table *t, const TValue *ek) { + unsigned int asize; /* optimal size for array part */ + unsigned int na; /* number of keys in the array part */ + unsigned int nums[MAXABITS + 1]; + int i; + int totaluse; + for (i = 0; i <= MAXABITS; i++) nums[i] = 0; /* reset counts */ + setlimittosize(t); + na = numusearray(t, nums); /* count keys in array part */ + totaluse = na; /* all those keys are integer keys */ + totaluse += numusehash(t, nums, &na); /* count keys in hash part */ + /* count extra key */ + if (ttisinteger(ek)) + na += countint(ivalue(ek), nums); + totaluse++; + /* compute new size for array part */ + asize = computesizes(nums, &na); + /* resize the table to new computed sizes */ + luaH_resize(L, t, asize, totaluse - na); +} + + + +/* +** }============================================================= +*/ + + +Table *luaH_new (lua_State *L) { + GCObject *o = luaC_newobj(L, LUA_TTABLE, sizeof(Table)); + Table *t = gco2t(o); + t->metatable = NULL; + t->flags = cast_byte(~0); + t->array = NULL; + t->alimit = 0; + setnodevector(L, t, 0); + return t; +} + + +void luaH_free (lua_State *L, Table *t) { + freehash(L, t); + luaM_freearray(L, t->array, luaH_realasize(t)); + luaM_free(L, t); +} + + +static Node *getfreepos (Table *t) { + if (!isdummy(t)) { + while (t->lastfree > t->node) { + t->lastfree--; + if (keyisnil(t->lastfree)) + return t->lastfree; + } + } + return NULL; /* could not find a free place */ +} + + + +/* +** inserts a new key into a hash table; first, check whether key's main +** position is free. If not, check whether colliding node is in its main +** position or not: if it is not, move colliding node to an empty place and +** put new key in its main position; otherwise (colliding node is in its main +** position), new key goes to an empty position. +*/ +TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) { + Node *mp; + TValue aux; + if (unlikely(ttisnil(key))) + luaG_runerror(L, "table index is nil"); + else if (ttisfloat(key)) { + lua_Number f = fltvalue(key); + lua_Integer k; + if (luaV_flttointeger(f, &k, 0)) { /* does key fit in an integer? */ + setivalue(&aux, k); + key = &aux; /* insert it as an integer */ + } + else if (unlikely(luai_numisnan(f))) + luaG_runerror(L, "table index is NaN"); + } + mp = mainpositionTV(t, key); + if (!isempty(gval(mp)) || isdummy(t)) { /* main position is taken? */ + Node *othern; + Node *f = getfreepos(t); /* get a free place */ + if (f == NULL) { /* cannot find a free place? */ + rehash(L, t, key); /* grow table */ + /* whatever called 'newkey' takes care of TM cache */ + return luaH_set(L, t, key); /* insert key into grown table */ + } + lua_assert(!isdummy(t)); + othern = mainposition(t, keytt(mp), &keyval(mp)); + if (othern != mp) { /* is colliding node out of its main position? */ + /* yes; move colliding node into free position */ + while (othern + gnext(othern) != mp) /* find previous */ + othern += gnext(othern); + gnext(othern) = cast_int(f - othern); /* rechain to point to 'f' */ + *f = *mp; /* copy colliding node into free pos. (mp->next also goes) */ + if (gnext(mp) != 0) { + gnext(f) += cast_int(mp - f); /* correct 'next' */ + gnext(mp) = 0; /* now 'mp' is free */ + } + setempty(gval(mp)); + } + else { /* colliding node is in its own main position */ + /* new node will go into free position */ + if (gnext(mp) != 0) + gnext(f) = cast_int((mp + gnext(mp)) - f); /* chain new position */ + else lua_assert(gnext(f) == 0); + gnext(mp) = cast_int(f - mp); + mp = f; + } + } + setnodekey(L, mp, key); + luaC_barrierback(L, obj2gco(t), key); + lua_assert(isempty(gval(mp))); + return gval(mp); +} + + +/* +** Search function for integers. If integer is inside 'alimit', get it +** directly from the array part. Otherwise, if 'alimit' is not equal to +** the real size of the array, key still can be in the array part. In +** this case, try to avoid a call to 'luaH_realasize' when key is just +** one more than the limit (so that it can be incremented without +** changing the real size of the array). +*/ +const TValue *luaH_getint (Table *t, lua_Integer key) { + if (l_castS2U(key) - 1u < t->alimit) /* (1 <= key && key <= t->alimit)? */ + return &t->array[key - 1]; + else if (!limitequalsasize(t) && /* key still may be in the array part? */ + (l_castS2U(key) == t->alimit + 1 || + l_castS2U(key) - 1u < luaH_realasize(t))) { + t->alimit = cast_uint(key); /* probably '#t' is here now */ + return &t->array[key - 1]; + } + else { + Node *n = hashint(t, key); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (keyisinteger(n) && keyival(n) == key) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) break; + n += nx; + } + } + return &absentkey; + } +} + + +/* +** search function for short strings +*/ +const TValue *luaH_getshortstr (Table *t, TString *key) { + Node *n = hashstr(t, key); + lua_assert(key->tt == LUA_TSHRSTR); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (keyisshrstr(n) && eqshrstr(keystrval(n), key)) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) + return &absentkey; /* not found */ + n += nx; + } + } +} + + +const TValue *luaH_getstr (Table *t, TString *key) { + if (key->tt == LUA_TSHRSTR) + return luaH_getshortstr(t, key); + else { /* for long strings, use generic case */ + TValue ko; + setsvalue(cast(lua_State *, NULL), &ko, key); + return getgeneric(t, &ko); + } +} + + +/* +** main search function +*/ +const TValue *luaH_get (Table *t, const TValue *key) { + switch (ttypetag(key)) { + case LUA_TSHRSTR: return luaH_getshortstr(t, tsvalue(key)); + case LUA_TNUMINT: return luaH_getint(t, ivalue(key)); + case LUA_TNIL: return &absentkey; + case LUA_TNUMFLT: { + lua_Integer k; + if (luaV_flttointeger(fltvalue(key), &k, 0)) /* index is an integral? */ + return luaH_getint(t, k); /* use specialized version */ + /* else... */ + } /* FALLTHROUGH */ + default: + return getgeneric(t, key); + } +} + + +/* +** beware: when using this function you probably need to check a GC +** barrier and invalidate the TM cache. +*/ +TValue *luaH_set (lua_State *L, Table *t, const TValue *key) { + const TValue *p = luaH_get(t, key); + if (!isabstkey(p)) + return cast(TValue *, p); + else return luaH_newkey(L, t, key); +} + + +void luaH_setint (lua_State *L, Table *t, lua_Integer key, TValue *value) { + const TValue *p = luaH_getint(t, key); + TValue *cell; + if (!isabstkey(p)) + cell = cast(TValue *, p); + else { + TValue k; + setivalue(&k, key); + cell = luaH_newkey(L, t, &k); + } + setobj2t(L, cell, value); +} + + +/* +** Try to find a boundary in the hash part of table 't'. From the +** caller, we know that 'j' is zero or present and that 'j + 1' is +** present. We want to find a larger key that is absent from the +** table, so that we can do a binary search between the two keys to +** find a boundary. We keep doubling 'j' until we get an absent index. +** If the doubling would overflow, we try LUA_MAXINTEGER. If it is +** absent, we are ready for the binary search. ('j', being max integer, +** is larger or equal to 'i', but it cannot be equal because it is +** absent while 'i' is present; so 'j > i'.) Otherwise, 'j' is a +** boundary. ('j + 1' cannot be a present integer key because it is +** not a valid integer in Lua.) +*/ +static lua_Unsigned hash_search (Table *t, lua_Unsigned j) { + lua_Unsigned i; + if (j == 0) j++; /* the caller ensures 'j + 1' is present */ + do { + i = j; /* 'i' is a present index */ + if (j <= l_castS2U(LUA_MAXINTEGER) / 2) + j *= 2; + else { + j = LUA_MAXINTEGER; + if (isempty(luaH_getint(t, j))) /* t[j] not present? */ + break; /* 'j' now is an absent index */ + else /* weird case */ + return j; /* well, max integer is a boundary... */ + } + } while (!isempty(luaH_getint(t, j))); /* repeat until an absent t[j] */ + /* i < j && t[i] present && t[j] absent */ + while (j - i > 1u) { /* do a binary search between them */ + lua_Unsigned m = (i + j) / 2; + if (isempty(luaH_getint(t, m))) j = m; + else i = m; + } + return i; +} + + +static unsigned int binsearch (const TValue *array, unsigned int i, + unsigned int j) { + while (j - i > 1u) { /* binary search */ + unsigned int m = (i + j) / 2; + if (isempty(&array[m - 1])) j = m; + else i = m; + } + return i; +} + + +/* +** Try to find a boundary in table 't'. (A 'boundary' is an integer index +** such that t[i] is present and t[i+1] is absent, or 0 if t[1] is absent +** and 'maxinteger' if t[maxinteger] is present.) +** (In the next explanation, we use Lua indices, that is, with base 1. +** The code itself uses base 0 when indexing the array part of the table.) +** The code starts with 'limit', a position in the array part that may +** be a boundary. +** (1) If 't[limit]' is empty, there must be a boundary before it. +** As a common case (e.g., after 't[#t]=nil'), check whether 'hint-1' +** is present. If so, it is a boundary. Otherwise, do a binary search +** between 0 and limit to find a boundary. In both cases, try to +** use this boundary as the new 'limit', as a hint for the next call. +** (2) If 't[limit]' is not empty and the array has more elements +** after 'limit', try to find a boundary there. Again, try first +** the special case (which should be quite frequent) where 'limit+1' +** is empty, so that 'limit' is a boundary. Otherwise, check the +** last element of the array part (set it as a new limit). If it is empty, +** there must be a boundary between the old limit (present) and the new +** limit (absent), which is found with a binary search. (This boundary +** always can be a new limit.) +** (3) The last case is when there are no elements in the array part +** (limit == 0) or its last element (the new limit) is present. +** In this case, must check the hash part. If there is no hash part, +** the boundary is 0. Otherwise, if 'limit+1' is absent, 'limit' is +** a boundary. Finally, if 'limit+1' is present, call 'hash_search' +** to find a boundary in the hash part of the table. (In those +** cases, the boundary is not inside the array part, and therefore +** cannot be used as a new limit.) +*/ +lua_Unsigned luaH_getn (Table *t) { + unsigned int limit = t->alimit; + if (limit > 0 && isempty(&t->array[limit - 1])) { + /* (1) there must be a boundary before 'limit' */ + if (limit >= 2 && !isempty(&t->array[limit - 2])) { + /* 'limit - 1' is a boundary; can it be a new limit? */ + if (ispow2realasize(t) && !ispow2(limit - 1)) { + t->alimit = limit - 1; + setnorealasize(t); + } + return limit - 1; + } + else { /* must search for a boundary in [0, limit] */ + unsigned int boundary = binsearch(t->array, 0, limit); + /* can this boundary represent the real size of the array? */ + if (ispow2realasize(t) && boundary > luaH_realasize(t) / 2) { + t->alimit = boundary; /* use it as the new limit */ + setnorealasize(t); + } + return boundary; + } + } + /* 'limit' is zero or present in table */ + if (!limitequalsasize(t)) { + /* (2) 'limit' > 0 and array has more elements after 'limit' */ + if (isempty(&t->array[limit])) /* 'limit + 1' is empty? */ + return limit; /* this is the boundary */ + /* else, try last element in the array */ + limit = luaH_realasize(t); + if (isempty(&t->array[limit - 1])) { /* empty? */ + /* there must be a boundary in the array after old limit, + and it must be a valid new limit */ + unsigned int boundary = binsearch(t->array, t->alimit, limit); + t->alimit = boundary; + return boundary; + } + /* else, new limit is present in the table; check the hash part */ + } + /* (3) 'limit' is the last element and either is zero or present in table */ + lua_assert(limit == luaH_realasize(t) && + (limit == 0 || !isempty(&t->array[limit - 1]))); + if (isdummy(t) || isempty(luaH_getint(t, cast(lua_Integer, limit + 1)))) + return limit; /* 'limit + 1' is absent... */ + else /* 'limit + 1' is also present */ + return hash_search(t, limit); +} + + + +#if defined(LUA_DEBUG) + +Node *luaH_mainposition (const Table *t, const TValue *key) { + return mainpositionTV(t, key); +} + +int luaH_isdummy (const Table *t) { return isdummy(t); } + +#endif diff --git a/source/lua/ltable.h b/source/lua/ltable.h new file mode 100644 index 0000000..9565833 --- /dev/null +++ b/source/lua/ltable.h @@ -0,0 +1,57 @@ +/* +** $Id: ltable.h $ +** Lua tables (hash) +** See Copyright Notice in lua.h +*/ + +#ifndef ltable_h +#define ltable_h + +#include "lobject.h" + + +#define gnode(t,i) (&(t)->node[i]) +#define gval(n) (&(n)->i_val) +#define gnext(n) ((n)->u.next) + + +#define invalidateTMcache(t) ((t)->flags = 0) + + +/* true when 't' is using 'dummynode' as its hash part */ +#define isdummy(t) ((t)->lastfree == NULL) + + +/* allocated size for hash nodes */ +#define allocsizenode(t) (isdummy(t) ? 0 : sizenode(t)) + + +/* returns the Node, given the value of a table entry */ +#define nodefromval(v) cast(Node *, (v)) + + +LUAI_FUNC const TValue *luaH_getint (Table *t, lua_Integer key); +LUAI_FUNC void luaH_setint (lua_State *L, Table *t, lua_Integer key, + TValue *value); +LUAI_FUNC const TValue *luaH_getshortstr (Table *t, TString *key); +LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key); +LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key); +LUAI_FUNC TValue *luaH_newkey (lua_State *L, Table *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); +LUAI_FUNC void luaH_resize (lua_State *L, Table *t, unsigned int nasize, + unsigned int nhsize); +LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, unsigned 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 lua_Unsigned luaH_getn (Table *t); +LUAI_FUNC unsigned int luaH_realasize (const Table *t); + + +#if defined(LUA_DEBUG) +LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key); +LUAI_FUNC int luaH_isdummy (const Table *t); +#endif + + +#endif diff --git a/source/lua/ltable.o b/source/lua/ltable.o new file mode 100644 index 0000000000000000000000000000000000000000..ee031b043841875ff4b7ebaa90290568107b268e GIT binary patch literal 12696 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 literal 0 HcmV?d00001 diff --git a/source/lua/ltablib.c b/source/lua/ltablib.c new file mode 100644 index 0000000..29c53e9 --- /dev/null +++ b/source/lua/ltablib.c @@ -0,0 +1,424 @@ +/* +** $Id: ltablib.c $ +** Library for Table Manipulation +** See Copyright Notice in lua.h +*/ + +#define ltablib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** Operations that an object must define to mimic a table +** (some functions only need some of them) +*/ +#define TAB_R 1 /* read */ +#define TAB_W 2 /* write */ +#define TAB_L 4 /* length */ +#define TAB_RW (TAB_R | TAB_W) /* read/write */ + + +#define aux_getn(L,n,w) (checktab(L, n, (w) | TAB_L), luaL_len(L, n)) + + +static int checkfield (lua_State *L, const char *key, int n) { + lua_pushstring(L, key); + return (lua_rawget(L, -n) != LUA_TNIL); +} + + +/* +** Check that 'arg' either is a table or can behave like one (that is, +** has a metatable with the required metamethods) +*/ +static void checktab (lua_State *L, int arg, int what) { + if (lua_type(L, arg) != LUA_TTABLE) { /* is it not a table? */ + int n = 1; /* number of elements to pop */ + if (lua_getmetatable(L, arg) && /* must have metatable */ + (!(what & TAB_R) || checkfield(L, "__index", ++n)) && + (!(what & TAB_W) || checkfield(L, "__newindex", ++n)) && + (!(what & TAB_L) || checkfield(L, "__len", ++n))) { + lua_pop(L, n); /* pop metatable and tested metamethods */ + } + else + luaL_checktype(L, arg, LUA_TTABLE); /* force an error */ + } +} + + +static int tinsert (lua_State *L) { + lua_Integer e = aux_getn(L, 1, TAB_RW) + 1; /* first empty element */ + lua_Integer pos; /* where to insert new element */ + switch (lua_gettop(L)) { + case 2: { /* called with only 2 arguments */ + pos = e; /* insert new element at the end */ + break; + } + case 3: { + lua_Integer i; + pos = luaL_checkinteger(L, 2); /* 2nd argument is the position */ + luaL_argcheck(L, 1 <= pos && pos <= e, 2, "position out of bounds"); + for (i = e; i > pos; i--) { /* move up elements */ + lua_geti(L, 1, i - 1); + lua_seti(L, 1, i); /* t[i] = t[i - 1] */ + } + break; + } + default: { + return luaL_error(L, "wrong number of arguments to 'insert'"); + } + } + lua_seti(L, 1, pos); /* t[pos] = v */ + return 0; +} + + +static int tremove (lua_State *L) { + lua_Integer size = aux_getn(L, 1, TAB_RW); + lua_Integer pos = luaL_optinteger(L, 2, size); + if (pos != size) /* validate 'pos' if given */ + luaL_argcheck(L, 1 <= pos && pos <= size + 1, 1, "position out of bounds"); + lua_geti(L, 1, pos); /* result = t[pos] */ + for ( ; pos < size; pos++) { + lua_geti(L, 1, pos + 1); + lua_seti(L, 1, pos); /* t[pos] = t[pos + 1] */ + } + lua_pushnil(L); + lua_seti(L, 1, pos); /* remove entry t[pos] */ + return 1; +} + + +/* +** Copy elements (1[f], ..., 1[e]) into (tt[t], tt[t+1], ...). Whenever +** possible, copy in increasing order, which is better for rehashing. +** "possible" means destination after original range, or smaller +** than origin, or copying to another table. +*/ +static int tmove (lua_State *L) { + lua_Integer f = luaL_checkinteger(L, 2); + lua_Integer e = luaL_checkinteger(L, 3); + lua_Integer t = luaL_checkinteger(L, 4); + int tt = !lua_isnoneornil(L, 5) ? 5 : 1; /* destination table */ + checktab(L, 1, TAB_R); + checktab(L, tt, TAB_W); + if (e >= f) { /* otherwise, nothing to move */ + lua_Integer n, i; + luaL_argcheck(L, f > 0 || e < LUA_MAXINTEGER + f, 3, + "too many elements to move"); + n = e - f + 1; /* number of elements to move */ + luaL_argcheck(L, t <= LUA_MAXINTEGER - n + 1, 4, + "destination wrap around"); + if (t > e || t <= f || (tt != 1 && !lua_compare(L, 1, tt, LUA_OPEQ))) { + for (i = 0; i < n; i++) { + lua_geti(L, 1, f + i); + lua_seti(L, tt, t + i); + } + } + else { + for (i = n - 1; i >= 0; i--) { + lua_geti(L, 1, f + i); + lua_seti(L, tt, t + i); + } + } + } + lua_pushvalue(L, tt); /* return destination table */ + return 1; +} + + +static void addfield (lua_State *L, luaL_Buffer *b, lua_Integer i) { + lua_geti(L, 1, i); + if (!lua_isstring(L, -1)) + luaL_error(L, "invalid value (%s) at index %d in table for 'concat'", + luaL_typename(L, -1), i); + luaL_addvalue(b); +} + + +static int tconcat (lua_State *L) { + luaL_Buffer b; + lua_Integer last = aux_getn(L, 1, TAB_R); + size_t lsep; + const char *sep = luaL_optlstring(L, 2, "", &lsep); + lua_Integer i = luaL_optinteger(L, 3, 1); + last = luaL_optinteger(L, 4, last); + luaL_buffinit(L, &b); + for (; i < last; i++) { + addfield(L, &b, i); + luaL_addlstring(&b, sep, lsep); + } + if (i == last) /* add last value (if interval was not empty) */ + addfield(L, &b, i); + luaL_pushresult(&b); + return 1; +} + + +/* +** {====================================================== +** Pack/unpack +** ======================================================= +*/ + +static int tpack (lua_State *L) { + int i; + int n = lua_gettop(L); /* number of elements to pack */ + lua_createtable(L, n, 1); /* create result table */ + lua_insert(L, 1); /* put it at index 1 */ + for (i = n; i >= 1; i--) /* assign elements */ + lua_seti(L, 1, i); + lua_pushinteger(L, n); + lua_setfield(L, 1, "n"); /* t.n = number of elements */ + return 1; /* return table */ +} + + +static int tunpack (lua_State *L) { + lua_Unsigned n; + lua_Integer i = luaL_optinteger(L, 2, 1); + lua_Integer e = luaL_opt(L, luaL_checkinteger, 3, luaL_len(L, 1)); + if (i > e) return 0; /* empty range */ + n = (lua_Unsigned)e - i; /* number of elements minus 1 (avoid overflows) */ + if (n >= (unsigned int)INT_MAX || !lua_checkstack(L, (int)(++n))) + return luaL_error(L, "too many results to unpack"); + for (; i < e; i++) { /* push arg[i..e - 1] (to avoid overflows) */ + lua_geti(L, 1, i); + } + lua_geti(L, 1, e); /* push last element */ + return (int)n; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** Quicksort +** (based on 'Algorithms in MODULA-3', Robert Sedgewick; +** Addison-Wesley, 1993.) +** ======================================================= +*/ + + +/* type for array indices */ +typedef unsigned int IdxT; + + +/* +** Produce a "random" 'unsigned int' to randomize pivot choice. This +** macro is used only when 'sort' detects a big imbalance in the result +** of a partition. (If you don't want/need this "randomness", ~0 is a +** good choice.) +*/ +#if !defined(l_randomizePivot) /* { */ + +#include + +/* size of 'e' measured in number of 'unsigned int's */ +#define sof(e) (sizeof(e) / sizeof(unsigned int)) + +/* +** Use 'time' and 'clock' as sources of "randomness". Because we don't +** know the types 'clock_t' and 'time_t', we cannot cast them to +** anything without risking overflows. A safe way to use their values +** is to copy them to an array of a known type and use the array values. +*/ +static unsigned int l_randomizePivot (void) { + clock_t c = clock(); + time_t t = time(NULL); + unsigned int buff[sof(c) + sof(t)]; + unsigned int i, rnd = 0; + memcpy(buff, &c, sof(c) * sizeof(unsigned int)); + memcpy(buff + sof(c), &t, sof(t) * sizeof(unsigned int)); + for (i = 0; i < sof(buff); i++) + rnd += buff[i]; + return rnd; +} + +#endif /* } */ + + +/* arrays larger than 'RANLIMIT' may use randomized pivots */ +#define RANLIMIT 100u + + +static void set2 (lua_State *L, IdxT i, IdxT j) { + lua_seti(L, 1, i); + lua_seti(L, 1, j); +} + + +/* +** Return true iff value at stack index 'a' is less than the value at +** index 'b' (according to the order of the sort). +*/ +static int sort_comp (lua_State *L, int a, int b) { + if (lua_isnil(L, 2)) /* no function? */ + return lua_compare(L, a, b, LUA_OPLT); /* a < b */ + else { /* function */ + int res; + lua_pushvalue(L, 2); /* push function */ + lua_pushvalue(L, a-1); /* -1 to compensate function */ + lua_pushvalue(L, b-2); /* -2 to compensate function and 'a' */ + lua_call(L, 2, 1); /* call function */ + res = lua_toboolean(L, -1); /* get result */ + lua_pop(L, 1); /* pop result */ + return res; + } +} + + +/* +** Does the partition: Pivot P is at the top of the stack. +** precondition: a[lo] <= P == a[up-1] <= a[up], +** so it only needs to do the partition from lo + 1 to up - 2. +** Pos-condition: a[lo .. i - 1] <= a[i] == P <= a[i + 1 .. up] +** returns 'i'. +*/ +static IdxT partition (lua_State *L, IdxT lo, IdxT up) { + IdxT i = lo; /* will be incremented before first use */ + IdxT j = up - 1; /* will be decremented before first use */ + /* loop invariant: a[lo .. i] <= P <= a[j .. up] */ + for (;;) { + /* next loop: repeat ++i while a[i] < P */ + while (lua_geti(L, 1, ++i), sort_comp(L, -1, -2)) { + if (i == up - 1) /* a[i] < P but a[up - 1] == P ?? */ + luaL_error(L, "invalid order function for sorting"); + lua_pop(L, 1); /* remove a[i] */ + } + /* after the loop, a[i] >= P and a[lo .. i - 1] < P */ + /* next loop: repeat --j while P < a[j] */ + while (lua_geti(L, 1, --j), sort_comp(L, -3, -1)) { + if (j < i) /* j < i but a[j] > P ?? */ + luaL_error(L, "invalid order function for sorting"); + lua_pop(L, 1); /* remove a[j] */ + } + /* after the loop, a[j] <= P and a[j + 1 .. up] >= P */ + if (j < i) { /* no elements out of place? */ + /* a[lo .. i - 1] <= P <= a[j + 1 .. i .. up] */ + lua_pop(L, 1); /* pop a[j] */ + /* swap pivot (a[up - 1]) with a[i] to satisfy pos-condition */ + set2(L, up - 1, i); + return i; + } + /* otherwise, swap a[i] - a[j] to restore invariant and repeat */ + set2(L, i, j); + } +} + + +/* +** Choose an element in the middle (2nd-3th quarters) of [lo,up] +** "randomized" by 'rnd' +*/ +static IdxT choosePivot (IdxT lo, IdxT up, unsigned int rnd) { + IdxT r4 = (up - lo) / 4; /* range/4 */ + IdxT p = rnd % (r4 * 2) + (lo + r4); + lua_assert(lo + r4 <= p && p <= up - r4); + return p; +} + + +/* +** QuickSort algorithm (recursive function) +*/ +static void auxsort (lua_State *L, IdxT lo, IdxT up, + unsigned int rnd) { + while (lo < up) { /* loop for tail recursion */ + IdxT p; /* Pivot index */ + IdxT n; /* to be used later */ + /* sort elements 'lo', 'p', and 'up' */ + lua_geti(L, 1, lo); + lua_geti(L, 1, up); + if (sort_comp(L, -1, -2)) /* a[up] < a[lo]? */ + set2(L, lo, up); /* swap a[lo] - a[up] */ + else + lua_pop(L, 2); /* remove both values */ + if (up - lo == 1) /* only 2 elements? */ + return; /* already sorted */ + if (up - lo < RANLIMIT || rnd == 0) /* small interval or no randomize? */ + p = (lo + up)/2; /* middle element is a good pivot */ + else /* for larger intervals, it is worth a random pivot */ + p = choosePivot(lo, up, rnd); + lua_geti(L, 1, p); + lua_geti(L, 1, lo); + if (sort_comp(L, -2, -1)) /* a[p] < a[lo]? */ + set2(L, p, lo); /* swap a[p] - a[lo] */ + else { + lua_pop(L, 1); /* remove a[lo] */ + lua_geti(L, 1, up); + if (sort_comp(L, -1, -2)) /* a[up] < a[p]? */ + set2(L, p, up); /* swap a[up] - a[p] */ + else + lua_pop(L, 2); + } + if (up - lo == 2) /* only 3 elements? */ + return; /* already sorted */ + lua_geti(L, 1, p); /* get middle element (Pivot) */ + lua_pushvalue(L, -1); /* push Pivot */ + lua_geti(L, 1, up - 1); /* push a[up - 1] */ + set2(L, p, up - 1); /* swap Pivot (a[p]) with a[up - 1] */ + p = partition(L, lo, up); + /* a[lo .. p - 1] <= a[p] == P <= a[p + 1 .. up] */ + if (p - lo < up - p) { /* lower interval is smaller? */ + auxsort(L, lo, p - 1, rnd); /* call recursively for lower interval */ + n = p - lo; /* size of smaller interval */ + lo = p + 1; /* tail call for [p + 1 .. up] (upper interval) */ + } + else { + auxsort(L, p + 1, up, rnd); /* call recursively for upper interval */ + n = up - p; /* size of smaller interval */ + up = p - 1; /* tail call for [lo .. p - 1] (lower interval) */ + } + if ((up - lo) / 128 > n) /* partition too imbalanced? */ + rnd = l_randomizePivot(); /* try a new randomization */ + } /* tail call auxsort(L, lo, up, rnd) */ +} + + +static int sort (lua_State *L) { + lua_Integer n = aux_getn(L, 1, TAB_RW); + if (n > 1) { /* non-trivial interval? */ + luaL_argcheck(L, n < INT_MAX, 1, "array too big"); + if (!lua_isnoneornil(L, 2)) /* is there a 2nd argument? */ + luaL_checktype(L, 2, LUA_TFUNCTION); /* must be a function */ + lua_settop(L, 2); /* make sure there are two arguments */ + auxsort(L, 1, (IdxT)n, 0); + } + return 0; +} + +/* }====================================================== */ + + +static const luaL_Reg tab_funcs[] = { + {"concat", tconcat}, + {"insert", tinsert}, + {"pack", tpack}, + {"unpack", tunpack}, + {"remove", tremove}, + {"move", tmove}, + {"sort", sort}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_table (lua_State *L) { + luaL_newlib(L, tab_funcs); + return 1; +} + diff --git a/source/lua/ltablib.o b/source/lua/ltablib.o new file mode 100644 index 0000000000000000000000000000000000000000..c3e048d9418c2386c76708880213667f08c42022 GIT binary patch literal 11912 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 +#include +#include +#include +#include + +#include "lua.h" + +#include "lapi.h" +#include "lauxlib.h" +#include "lcode.h" +#include "lctype.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lmem.h" +#include "lopcodes.h" +#include "lopnames.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "lualib.h" + + + +/* +** The whole module only makes sense with LUA_DEBUG on +*/ +#if defined(LUA_DEBUG) + + +void *l_Trick = 0; + + +#define obj_at(L,k) s2v(L->ci->func + (k)) + + +static int runC (lua_State *L, lua_State *L1, const char *pc); + + +static void setnameval (lua_State *L, const char *name, int val) { + lua_pushstring(L, name); + lua_pushinteger(L, val); + lua_settable(L, -3); +} + + +static void pushobject (lua_State *L, const TValue *o) { + setobj2s(L, L->top, o); + api_incr_top(L); +} + + +static void badexit (const char *fmt, const char *s) { + fprintf(stderr, fmt, s); + /* avoid assertion failures when exiting */ + l_memcontrol.numblocks = l_memcontrol.total = 0; + exit(EXIT_FAILURE); +} + + +static int tpanic (lua_State *L) { + return (badexit("PANIC: unprotected error in call to Lua API (%s)\n", + lua_tostring(L, -1)), + 0); /* do not return to Lua */ +} + + +/* +** Warning function for tests. Fist, it concatenates all parts of +** a warning in buffer 'buff'. Then: +** - messages starting with '#' are shown on standard output (used to +** test explicit warnings); +** - messages containing '@' are stored in global '_WARN' (used to test +** errors that generate warnings); +** - other messages abort the tests (they represent real warning +** conditions; the standard tests should not generate these conditions +** unexpectedly). +*/ +static void warnf (void *ud, const char *msg, int tocont) { + static char buff[200] = ""; /* should be enough for tests... */ + if (strlen(msg) >= sizeof(buff) - strlen(buff)) + badexit("%s", "warnf-buffer overflow"); + strcat(buff, msg); /* add new message to current warning */ + if (!tocont) { /* message finished? */ + if (buff[0] == '#') /* expected warning? */ + printf("Expected Lua warning: %s\n", buff); /* print it */ + else if (strchr(buff, '@') != NULL) { /* warning for test purposes? */ + lua_State *L = cast(lua_State *, ud); + lua_unlock(L); + lua_pushstring(L, buff); + lua_setglobal(L, "_WARN"); /* assign message to global '_WARN' */ + lua_lock(L); + } + else /* a real warning; should not happen during tests */ + badexit("Unexpected warning in test mode: %s\naborting...\n", buff); + buff[0] = '\0'; /* prepare buffer for next warning */ + } +} + + +/* +** {====================================================================== +** Controlled version for realloc. +** ======================================================================= +*/ + +#define MARK 0x55 /* 01010101 (a nice pattern) */ + +typedef union Header { + LUAI_MAXALIGN; + struct { + size_t size; + int type; + } d; +} Header; + + +#if !defined(EXTERNMEMCHECK) + +/* full memory check */ +#define MARKSIZE 16 /* size of marks after each block */ +#define fillmem(mem,size) memset(mem, -MARK, size) + +#else + +/* external memory check: don't do it twice */ +#define MARKSIZE 0 +#define fillmem(mem,size) /* empty */ + +#endif + + +Memcontrol l_memcontrol = + {0UL, 0UL, 0UL, 0UL, (~0UL), {0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL}}; + + +static void freeblock (Memcontrol *mc, Header *block) { + if (block) { + size_t size = block->d.size; + int i; + for (i = 0; i < MARKSIZE; i++) /* check marks after block */ + lua_assert(*(cast_charp(block + 1) + size + i) == MARK); + mc->objcount[block->d.type]--; + fillmem(block, sizeof(Header) + size + MARKSIZE); /* erase block */ + free(block); /* actually free block */ + mc->numblocks--; /* update counts */ + mc->total -= size; + } +} + + +void *debug_realloc (void *ud, void *b, size_t oldsize, size_t size) { + Memcontrol *mc = cast(Memcontrol *, ud); + Header *block = cast(Header *, b); + int type; + if (mc->memlimit == 0) { /* first time? */ + char *limit = getenv("MEMLIMIT"); /* initialize memory limit */ + mc->memlimit = limit ? strtoul(limit, NULL, 10) : ULONG_MAX; + } + if (block == NULL) { + type = (oldsize < LUA_NUMTAGS) ? oldsize : 0; + oldsize = 0; + } + else { + block--; /* go to real header */ + type = block->d.type; + lua_assert(oldsize == block->d.size); + } + if (size == 0) { + freeblock(mc, block); + return NULL; + } + if (mc->countlimit != ~0UL && size != oldsize) { /* count limit in use? */ + if (mc->countlimit == 0) + return NULL; /* fake a memory allocation error */ + mc->countlimit--; + } + if (size > oldsize && mc->total+size-oldsize > mc->memlimit) + return NULL; /* fake a memory allocation error */ + else { + Header *newblock; + int i; + size_t commonsize = (oldsize < size) ? oldsize : size; + size_t realsize = sizeof(Header) + size + MARKSIZE; + if (realsize < size) return NULL; /* arithmetic overflow! */ + newblock = cast(Header *, malloc(realsize)); /* alloc a new block */ + if (newblock == NULL) + return NULL; /* really out of memory? */ + if (block) { + memcpy(newblock + 1, block + 1, commonsize); /* copy old contents */ + freeblock(mc, block); /* erase (and check) old copy */ + } + /* initialize new part of the block with something weird */ + fillmem(cast_charp(newblock + 1) + commonsize, size - commonsize); + /* initialize marks after block */ + for (i = 0; i < MARKSIZE; i++) + *(cast_charp(newblock + 1) + size + i) = MARK; + newblock->d.size = size; + newblock->d.type = type; + mc->total += size; + if (mc->total > mc->maxmem) + mc->maxmem = mc->total; + mc->numblocks++; + mc->objcount[type]++; + return newblock + 1; + } +} + + +/* }====================================================================== */ + + + +/* +** {====================================================== +** Functions to check memory consistency +** ======================================================= +*/ + + +/* +** Check GC invariants. For incremental mode, a black object cannot +** point to a white one. For generational mode, really old objects +** cannot point to young objects. Both old1 and touched2 objects +** cannot point to new objects (but can point to survivals). +** (Threads and open upvalues, despite being marked "really old", +** continue to be visited in all collections, and therefore can point to +** new objects. They, and only they, are old but gray.) +*/ +static int testobjref1 (global_State *g, GCObject *f, GCObject *t) { + if (isdead(g,t)) return 0; + if (issweepphase(g)) + return 1; /* no invariants */ + else if (g->gckind == KGC_INC) + return !(isblack(f) && iswhite(t)); /* basic incremental invariant */ + else { /* generational mode */ + if ((getage(f) == G_OLD && isblack(f)) && !isold(t)) + return 0; + if (((getage(f) == G_OLD1 || getage(f) == G_TOUCHED2) && isblack(f)) && + getage(t) == G_NEW) + return 0; + return 1; + } +} + + +static void printobj (global_State *g, GCObject *o) { + printf("||%s(%p)-%c%c(%02X)||", + ttypename(novariant(o->tt)), (void *)o, + isdead(g,o) ? 'd' : isblack(o) ? 'b' : iswhite(o) ? 'w' : 'g', + "ns01oTt"[getage(o)], o->marked); + if (o->tt == LUA_TSHRSTR || o->tt == LUA_TLNGSTR) + printf(" '%s'", getstr(gco2ts(o))); +} + + +static int testobjref (global_State *g, GCObject *f, GCObject *t) { + int r1 = testobjref1(g, f, t); + if (!r1) { + printf("%d(%02X) - ", g->gcstate, g->currentwhite); + printobj(g, f); + printf(" -> "); + printobj(g, t); + printf("\n"); + } + return r1; +} + +#define checkobjref(g,f,t) \ + { if (t) lua_longassert(testobjref(g,f,obj2gco(t))); } + + +static void checkvalref (global_State *g, GCObject *f, const TValue *t) { + lua_assert(!iscollectable(t) || + (righttt(t) && testobjref(g, f, gcvalue(t)))); +} + + +static void checktable (global_State *g, Table *h) { + unsigned int i; + unsigned int asize = luaH_realasize(h); + Node *n, *limit = gnode(h, sizenode(h)); + GCObject *hgc = obj2gco(h); + checkobjref(g, hgc, h->metatable); + for (i = 0; i < asize; i++) + checkvalref(g, hgc, &h->array[i]); + for (n = gnode(h, 0); n < limit; n++) { + if (!isempty(gval(n))) { + TValue k; + getnodekey(g->mainthread, &k, n); + lua_assert(!keyisnil(n)); + checkvalref(g, hgc, &k); + checkvalref(g, hgc, gval(n)); + } + } +} + + +static void checkudata (global_State *g, Udata *u) { + int i; + GCObject *hgc = obj2gco(u); + checkobjref(g, hgc, u->metatable); + for (i = 0; i < u->nuvalue; i++) + checkvalref(g, hgc, &u->uv[i].uv); +} + + +/* +** All marks are conditional because a GC may happen while the +** prototype is still being created +*/ +static void checkproto (global_State *g, Proto *f) { + int i; + GCObject *fgc = obj2gco(f); + checkobjref(g, fgc, f->source); + for (i=0; isizek; i++) { + if (ttisstring(f->k + i)) + checkobjref(g, fgc, tsvalue(f->k + i)); + } + for (i=0; isizeupvalues; i++) + checkobjref(g, fgc, f->upvalues[i].name); + for (i=0; isizep; i++) + checkobjref(g, fgc, f->p[i]); + for (i=0; isizelocvars; i++) + checkobjref(g, fgc, f->locvars[i].varname); +} + + +static void checkCclosure (global_State *g, CClosure *cl) { + GCObject *clgc = obj2gco(cl); + int i; + for (i = 0; i < cl->nupvalues; i++) + checkvalref(g, clgc, &cl->upvalue[i]); +} + + +static void checkLclosure (global_State *g, LClosure *cl) { + GCObject *clgc = obj2gco(cl); + int i; + checkobjref(g, clgc, cl->p); + for (i=0; inupvalues; i++) { + UpVal *uv = cl->upvals[i]; + if (uv) { + checkobjref(g, clgc, uv); + if (!upisopen(uv)) + checkvalref(g, obj2gco(uv), uv->v); + } + } +} + + +static int lua_checkpc (CallInfo *ci) { + if (!isLua(ci)) return 1; + else { + StkId f = ci->func; + Proto *p = clLvalue(s2v(f))->p; + return p->code <= ci->u.l.savedpc && + ci->u.l.savedpc <= p->code + p->sizecode; + } +} + + +static void checkstack (global_State *g, lua_State *L1) { + StkId o; + CallInfo *ci; + UpVal *uv; + lua_assert(!isdead(g, L1)); + for (uv = L1->openupval; uv != NULL; uv = uv->u.open.next) + lua_assert(upisopen(uv)); /* must be open */ + for (ci = L1->ci; ci != NULL; ci = ci->previous) { + lua_assert(ci->top <= L1->stack_last); + lua_assert(lua_checkpc(ci)); + } + if (L1->stack) { /* complete thread? */ + for (o = L1->stack; o < L1->stack_last + EXTRA_STACK; o++) + checkliveness(L1, s2v(o)); /* entire stack must have valid values */ + } + else lua_assert(L1->stacksize == 0); +} + + +static void checkrefs (global_State *g, GCObject *o) { + switch (o->tt) { + case LUA_TUSERDATA: { + checkudata(g, gco2u(o)); + break; + } + case LUA_TUPVAL: + case LUA_TUPVALTBC: { + checkvalref(g, o, gco2upv(o)->v); + break; + } + case LUA_TTABLE: { + checktable(g, gco2t(o)); + break; + } + case LUA_TTHREAD: { + checkstack(g, gco2th(o)); + break; + } + case LUA_TLCL: { + checkLclosure(g, gco2lcl(o)); + break; + } + case LUA_TCCL: { + checkCclosure(g, gco2ccl(o)); + break; + } + case LUA_TPROTO: { + checkproto(g, gco2p(o)); + break; + } + case LUA_TSHRSTR: + case LUA_TLNGSTR: { + lua_assert(!isgray(o)); /* strings are never gray */ + break; + } + default: lua_assert(0); + } +} + + +/* +** Check consistency of an object: +** - Dead objects can only happen in the 'allgc' list during a sweep +** phase (controled by the caller through 'maybedead'). +** - During pause, all objects must be white. +** - In generational mode: +** * objects must be old enough for their lists ('listage'). +** * old objects cannot be white. +** * old objects must be black, except for 'touched1', 'old0', +** threads, and open upvalues. +*/ +static void checkobject (global_State *g, GCObject *o, int maybedead, + int listage) { + if (isdead(g, o)) + lua_assert(maybedead); + else { + lua_assert(g->gcstate != GCSpause || iswhite(o)); + if (g->gckind == KGC_GEN) { /* generational mode? */ + lua_assert(getage(o) >= listage); + lua_assert(!iswhite(o) || !isold(o)); + if (isold(o)) { + lua_assert(isblack(o) || + getage(o) == G_TOUCHED1 || + getage(o) == G_OLD0 || + o->tt == LUA_TTHREAD || + (o->tt == LUA_TUPVAL && upisopen(gco2upv(o)))); + } + } + checkrefs(g, o); + } +} + + +static void checkgraylist (global_State *g, GCObject *o) { + ((void)g); /* better to keep it available if we need to print an object */ + while (o) { + lua_assert(isgray(o) || getage(o) == G_TOUCHED2); + switch (o->tt) { + case LUA_TTABLE: o = gco2t(o)->gclist; break; + case LUA_TLCL: o = gco2lcl(o)->gclist; break; + case LUA_TCCL: o = gco2ccl(o)->gclist; break; + case LUA_TTHREAD: o = gco2th(o)->gclist; break; + case LUA_TPROTO: o = gco2p(o)->gclist; break; + default: lua_assert(0); /* other objects cannot be in a gray list */ + } + } +} + + +/* +** Check objects in gray lists. +*/ +static void checkgrays (global_State *g) { + if (!keepinvariant(g)) return; + checkgraylist(g, g->gray); + checkgraylist(g, g->grayagain); + checkgraylist(g, g->weak); + checkgraylist(g, g->ephemeron); +} + + +static void checklist (global_State *g, int maybedead, int tof, + GCObject *newl, GCObject *survival, GCObject *old, GCObject *reallyold) { + GCObject *o; + for (o = newl; o != survival; o = o->next) { + checkobject(g, o, maybedead, G_NEW); + lua_assert(!tof == !tofinalize(o)); + } + for (o = survival; o != old; o = o->next) { + checkobject(g, o, 0, G_SURVIVAL); + lua_assert(!tof == !tofinalize(o)); + } + for (o = old; o != reallyold; o = o->next) { + checkobject(g, o, 0, G_OLD1); + lua_assert(!tof == !tofinalize(o)); + } + for (o = reallyold; o != NULL; o = o->next) { + checkobject(g, o, 0, G_OLD); + lua_assert(!tof == !tofinalize(o)); + } +} + + +int lua_checkmemory (lua_State *L) { + global_State *g = G(L); + GCObject *o; + int maybedead; + if (keepinvariant(g)) { + lua_assert(!iswhite(g->mainthread)); + lua_assert(!iswhite(gcvalue(&g->l_registry))); + } + lua_assert(!isdead(g, gcvalue(&g->l_registry))); + lua_assert(g->sweepgc == NULL || issweepphase(g)); + checkgrays(g); + + /* check 'fixedgc' list */ + for (o = g->fixedgc; o != NULL; o = o->next) { + lua_assert(o->tt == LUA_TSHRSTR && isgray(o) && getage(o) == G_OLD); + } + + /* check 'allgc' list */ + maybedead = (GCSatomic < g->gcstate && g->gcstate <= GCSswpallgc); + checklist(g, maybedead, 0, g->allgc, g->survival, g->old, g->reallyold); + + /* check 'finobj' list */ + checklist(g, 0, 1, g->finobj, g->finobjsur, g->finobjold, g->finobjrold); + + /* check 'tobefnz' list */ + for (o = g->tobefnz; o != NULL; o = o->next) { + checkobject(g, o, 0, G_NEW); + lua_assert(tofinalize(o)); + lua_assert(o->tt == LUA_TUSERDATA || o->tt == LUA_TTABLE); + } + return 0; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** Disassembler +** ======================================================= +*/ + + +static char *buildop (Proto *p, int pc, char *buff) { + char *obuff = buff; + Instruction i = p->code[pc]; + OpCode o = GET_OPCODE(i); + const char *name = opnames[o]; + int line = luaG_getfuncline(p, pc); + int lineinfo = (p->lineinfo != NULL) ? p->lineinfo[pc] : 0; + if (lineinfo == ABSLINEINFO) + buff += sprintf(buff, "(__"); + else + buff += sprintf(buff, "(%2d", lineinfo); + buff += sprintf(buff, " - %4d) %4d - ", line, pc); + switch (getOpMode(o)) { + case iABC: + sprintf(buff, "%-12s%4d %4d %4d%s", name, + GETARG_A(i), GETARG_B(i), GETARG_C(i), + GETARG_k(i) ? " (k)" : ""); + break; + case iABx: + sprintf(buff, "%-12s%4d %4d", name, GETARG_A(i), GETARG_Bx(i)); + break; + case iAsBx: + sprintf(buff, "%-12s%4d %4d", name, GETARG_A(i), GETARG_sBx(i)); + break; + case iAx: + sprintf(buff, "%-12s%4d", name, GETARG_Ax(i)); + break; + case isJ: + sprintf(buff, "%-12s%4d", name, GETARG_sJ(i)); + break; + } + return obuff; +} + + +#if 0 +void luaI_printcode (Proto *pt, int size) { + int pc; + for (pc=0; pcmaxstacksize); + setnameval(L, "numparams", p->numparams); + for (pc=0; pcsizecode; pc++) { + char buff[100]; + lua_pushinteger(L, pc+1); + lua_pushstring(L, buildop(p, pc, buff)); + lua_settable(L, -3); + } + return 1; +} + + +static int printcode (lua_State *L) { + int pc; + Proto *p; + luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), + 1, "Lua function expected"); + p = getproto(obj_at(L, 1)); + printf("maxstack: %d\n", p->maxstacksize); + printf("numparams: %d\n", p->numparams); + for (pc=0; pcsizecode; pc++) { + char buff[100]; + printf("%s\n", buildop(p, pc, buff)); + } + return 0; +} + + +static int listk (lua_State *L) { + Proto *p; + int i; + luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), + 1, "Lua function expected"); + p = getproto(obj_at(L, 1)); + lua_createtable(L, p->sizek, 0); + for (i=0; isizek; i++) { + pushobject(L, p->k+i); + lua_rawseti(L, -2, i+1); + } + return 1; +} + + +static int listabslineinfo (lua_State *L) { + Proto *p; + int i; + luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), + 1, "Lua function expected"); + p = getproto(obj_at(L, 1)); + luaL_argcheck(L, p->abslineinfo != NULL, 1, "function has no debug info"); + lua_createtable(L, 2 * p->sizeabslineinfo, 0); + for (i=0; i < p->sizeabslineinfo; i++) { + lua_pushinteger(L, p->abslineinfo[i].pc); + lua_rawseti(L, -2, 2 * i + 1); + lua_pushinteger(L, p->abslineinfo[i].line); + lua_rawseti(L, -2, 2 * i + 2); + } + return 1; +} + + +static int listlocals (lua_State *L) { + Proto *p; + int pc = cast_int(luaL_checkinteger(L, 2)) - 1; + int i = 0; + const char *name; + luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), + 1, "Lua function expected"); + p = getproto(obj_at(L, 1)); + while ((name = luaF_getlocalname(p, ++i, pc)) != NULL) + lua_pushstring(L, name); + return i-1; +} + +/* }====================================================== */ + + + +static void printstack (lua_State *L) { + int i; + int n = lua_gettop(L); + for (i = 1; i <= n; i++) { + printf("%3d: %s\n", i, luaL_tolstring(L, i, NULL)); + lua_pop(L, 1); + } + printf("\n"); +} + + +static int get_limits (lua_State *L) { + lua_createtable(L, 0, 5); + setnameval(L, "BITS_INT", LUAI_BITSINT); + setnameval(L, "MAXARG_Ax", MAXARG_Ax); + setnameval(L, "MAXARG_Bx", MAXARG_Bx); + setnameval(L, "OFFSET_sBx", OFFSET_sBx); + setnameval(L, "BITS_INT", LUAI_BITSINT); + setnameval(L, "LFPF", LFIELDS_PER_FLUSH); + setnameval(L, "NUM_OPCODES", NUM_OPCODES); + return 1; +} + + +static int mem_query (lua_State *L) { + if (lua_isnone(L, 1)) { + lua_pushinteger(L, l_memcontrol.total); + lua_pushinteger(L, l_memcontrol.numblocks); + lua_pushinteger(L, l_memcontrol.maxmem); + return 3; + } + else if (lua_isnumber(L, 1)) { + unsigned long limit = cast(unsigned long, luaL_checkinteger(L, 1)); + if (limit == 0) limit = ULONG_MAX; + l_memcontrol.memlimit = limit; + return 0; + } + else { + const char *t = luaL_checkstring(L, 1); + int i; + for (i = LUA_NUMTAGS - 1; i >= 0; i--) { + if (strcmp(t, ttypename(i)) == 0) { + lua_pushinteger(L, l_memcontrol.objcount[i]); + return 1; + } + } + return luaL_error(L, "unkown type '%s'", t); + } +} + + +static int alloc_count (lua_State *L) { + if (lua_isnone(L, 1)) + l_memcontrol.countlimit = ~0L; + else + l_memcontrol.countlimit = luaL_checkinteger(L, 1); + return 0; +} + + +static int settrick (lua_State *L) { + if (ttisnil(obj_at(L, 1))) + l_Trick = NULL; + else + l_Trick = gcvalue(obj_at(L, 1)); + return 0; +} + + +static int gc_color (lua_State *L) { + TValue *o; + luaL_checkany(L, 1); + o = obj_at(L, 1); + if (!iscollectable(o)) + lua_pushstring(L, "no collectable"); + else { + GCObject *obj = gcvalue(o); + lua_pushstring(L, isdead(G(L), obj) ? "dead" : + iswhite(obj) ? "white" : + isblack(obj) ? "black" : "gray"); + } + return 1; +} + + +static int gc_age (lua_State *L) { + TValue *o; + luaL_checkany(L, 1); + o = obj_at(L, 1); + if (!iscollectable(o)) + lua_pushstring(L, "no collectable"); + else { + static const char *gennames[] = {"new", "survival", "old0", "old1", + "old", "touched1", "touched2"}; + GCObject *obj = gcvalue(o); + lua_pushstring(L, gennames[getage(obj)]); + } + return 1; +} + + +static int gc_printobj (lua_State *L) { + TValue *o; + luaL_checkany(L, 1); + o = obj_at(L, 1); + if (!iscollectable(o)) + printf("no collectable\n"); + else { + GCObject *obj = gcvalue(o); + printobj(G(L), obj); + printf("\n"); + } + return 0; +} + + +static int gc_state (lua_State *L) { + static const char *statenames[] = { + "propagate", "atomic", "enteratomic", "sweepallgc", "sweepfinobj", + "sweeptobefnz", "sweepend", "callfin", "pause", ""}; + static const int states[] = { + GCSpropagate, GCSenteratomic, GCSatomic, GCSswpallgc, GCSswpfinobj, + GCSswptobefnz, GCSswpend, GCScallfin, GCSpause, -1}; + int option = states[luaL_checkoption(L, 1, "", statenames)]; + if (option == -1) { + lua_pushstring(L, statenames[G(L)->gcstate]); + return 1; + } + else { + global_State *g = G(L); + if (G(L)->gckind == KGC_GEN) + luaL_error(L, "cannot change states in generational mode"); + lua_lock(L); + if (option < g->gcstate) { /* must cross 'pause'? */ + luaC_runtilstate(L, bitmask(GCSpause)); /* run until pause */ + } + luaC_runtilstate(L, bitmask(option)); + lua_assert(G(L)->gcstate == option); + lua_unlock(L); + return 0; + } +} + + +static int hash_query (lua_State *L) { + if (lua_isnone(L, 2)) { + luaL_argcheck(L, lua_type(L, 1) == LUA_TSTRING, 1, "string expected"); + lua_pushinteger(L, tsvalue(obj_at(L, 1))->hash); + } + else { + TValue *o = obj_at(L, 1); + Table *t; + luaL_checktype(L, 2, LUA_TTABLE); + t = hvalue(obj_at(L, 2)); + lua_pushinteger(L, luaH_mainposition(t, o) - t->node); + } + return 1; +} + + +static int stacklevel (lua_State *L) { + unsigned long a = 0; + lua_pushinteger(L, (L->top - L->stack)); + lua_pushinteger(L, (L->stack_last - L->stack)); + lua_pushinteger(L, L->nCcalls); + lua_pushinteger(L, L->nci); + lua_pushinteger(L, (unsigned long)&a); + return 5; +} + + +static int table_query (lua_State *L) { + const Table *t; + int i = cast_int(luaL_optinteger(L, 2, -1)); + unsigned int asize; + luaL_checktype(L, 1, LUA_TTABLE); + t = hvalue(obj_at(L, 1)); + asize = luaH_realasize(t); + if (i == -1) { + lua_pushinteger(L, asize); + lua_pushinteger(L, allocsizenode(t)); + lua_pushinteger(L, isdummy(t) ? 0 : t->lastfree - t->node); + lua_pushinteger(L, t->alimit); + return 4; + } + else if ((unsigned int)i < asize) { + lua_pushinteger(L, i); + pushobject(L, &t->array[i]); + lua_pushnil(L); + } + else if ((i -= asize) < sizenode(t)) { + TValue k; + getnodekey(L, &k, gnode(t, i)); + if (!isempty(gval(gnode(t, i))) || + ttisnil(&k) || + ttisnumber(&k)) { + pushobject(L, &k); + } + else + lua_pushliteral(L, ""); + pushobject(L, gval(gnode(t, i))); + if (gnext(&t->node[i]) != 0) + lua_pushinteger(L, gnext(&t->node[i])); + else + lua_pushnil(L); + } + return 3; +} + + +static int string_query (lua_State *L) { + stringtable *tb = &G(L)->strt; + int s = cast_int(luaL_optinteger(L, 1, 0)) - 1; + if (s == -1) { + lua_pushinteger(L ,tb->size); + lua_pushinteger(L ,tb->nuse); + return 2; + } + else if (s < tb->size) { + TString *ts; + int n = 0; + for (ts = tb->hash[s]; ts != NULL; ts = ts->u.hnext) { + setsvalue2s(L, L->top, ts); + api_incr_top(L); + n++; + } + return n; + } + else return 0; +} + + +static int tref (lua_State *L) { + int level = lua_gettop(L); + luaL_checkany(L, 1); + lua_pushvalue(L, 1); + lua_pushinteger(L, luaL_ref(L, LUA_REGISTRYINDEX)); + lua_assert(lua_gettop(L) == level+1); /* +1 for result */ + return 1; +} + +static int getref (lua_State *L) { + int level = lua_gettop(L); + lua_rawgeti(L, LUA_REGISTRYINDEX, luaL_checkinteger(L, 1)); + lua_assert(lua_gettop(L) == level+1); + return 1; +} + +static int unref (lua_State *L) { + int level = lua_gettop(L); + luaL_unref(L, LUA_REGISTRYINDEX, cast_int(luaL_checkinteger(L, 1))); + lua_assert(lua_gettop(L) == level); + return 0; +} + + +static int upvalue (lua_State *L) { + int n = cast_int(luaL_checkinteger(L, 2)); + luaL_checktype(L, 1, LUA_TFUNCTION); + if (lua_isnone(L, 3)) { + const char *name = lua_getupvalue(L, 1, n); + if (name == NULL) return 0; + lua_pushstring(L, name); + return 2; + } + else { + const char *name = lua_setupvalue(L, 1, n); + lua_pushstring(L, name); + return 1; + } +} + + +static int newuserdata (lua_State *L) { + size_t size = cast_sizet(luaL_optinteger(L, 1, 0)); + int nuv = luaL_optinteger(L, 2, 0); + char *p = cast_charp(lua_newuserdatauv(L, size, nuv)); + while (size--) *p++ = '\0'; + return 1; +} + + +static int pushuserdata (lua_State *L) { + lua_Integer u = luaL_checkinteger(L, 1); + lua_pushlightuserdata(L, cast_voidp(cast_sizet(u))); + return 1; +} + + +static int udataval (lua_State *L) { + lua_pushinteger(L, cast(long, lua_touserdata(L, 1))); + return 1; +} + + +static int doonnewstack (lua_State *L) { + lua_State *L1 = lua_newthread(L); + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + int status = luaL_loadbuffer(L1, s, l, s); + if (status == LUA_OK) + status = lua_pcall(L1, 0, 0, 0); + lua_pushinteger(L, status); + return 1; +} + + +static int s2d (lua_State *L) { + lua_pushnumber(L, cast_num(*cast(const double *, luaL_checkstring(L, 1)))); + return 1; +} + + +static int d2s (lua_State *L) { + double d = cast(double, luaL_checknumber(L, 1)); + lua_pushlstring(L, cast_charp(&d), sizeof(d)); + return 1; +} + + +static int num2int (lua_State *L) { + lua_pushinteger(L, lua_tointeger(L, 1)); + return 1; +} + + +static int newstate (lua_State *L) { + void *ud; + lua_Alloc f = lua_getallocf(L, &ud); + lua_State *L1 = lua_newstate(f, ud); + if (L1) { + lua_atpanic(L1, tpanic); + lua_pushlightuserdata(L, L1); + } + else + lua_pushnil(L); + return 1; +} + + +static lua_State *getstate (lua_State *L) { + lua_State *L1 = cast(lua_State *, lua_touserdata(L, 1)); + luaL_argcheck(L, L1 != NULL, 1, "state expected"); + return L1; +} + + +static int loadlib (lua_State *L) { + static const luaL_Reg libs[] = { + {LUA_GNAME, luaopen_base}, + {"coroutine", luaopen_coroutine}, + {"debug", luaopen_debug}, + {"io", luaopen_io}, + {"os", luaopen_os}, + {"math", luaopen_math}, + {"string", luaopen_string}, + {"table", luaopen_table}, + {"T", luaB_opentests}, + {NULL, NULL} + }; + lua_State *L1 = getstate(L); + int i; + luaL_requiref(L1, "package", luaopen_package, 0); + lua_assert(lua_type(L1, -1) == LUA_TTABLE); + /* 'requiref' should not reload module already loaded... */ + luaL_requiref(L1, "package", NULL, 1); /* seg. fault if it reloads */ + /* ...but should return the same module */ + lua_assert(lua_compare(L1, -1, -2, LUA_OPEQ)); + luaL_getsubtable(L1, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); + for (i = 0; libs[i].name; i++) { + lua_pushcfunction(L1, libs[i].func); + lua_setfield(L1, -2, libs[i].name); + } + return 0; +} + +static int closestate (lua_State *L) { + lua_State *L1 = getstate(L); + lua_close(L1); + return 0; +} + +static int doremote (lua_State *L) { + lua_State *L1 = getstate(L); + size_t lcode; + const char *code = luaL_checklstring(L, 2, &lcode); + int status; + lua_settop(L1, 0); + status = luaL_loadbuffer(L1, code, lcode, code); + if (status == LUA_OK) + status = lua_pcall(L1, 0, LUA_MULTRET, 0); + if (status != LUA_OK) { + lua_pushnil(L); + lua_pushstring(L, lua_tostring(L1, -1)); + lua_pushinteger(L, status); + return 3; + } + else { + int i = 0; + while (!lua_isnone(L1, ++i)) + lua_pushstring(L, lua_tostring(L1, i)); + lua_pop(L1, i-1); + return i-1; + } +} + + +static int int2fb_aux (lua_State *L) { + int b = luaO_int2fb((unsigned int)luaL_checkinteger(L, 1)); + lua_pushinteger(L, b); + lua_pushinteger(L, (unsigned int)luaO_fb2int(b)); + return 2; +} + + +static int log2_aux (lua_State *L) { + unsigned int x = (unsigned int)luaL_checkinteger(L, 1); + lua_pushinteger(L, luaO_ceillog2(x)); + return 1; +} + + +struct Aux { jmp_buf jb; const char *paniccode; lua_State *L; }; + +/* +** does a long-jump back to "main program". +*/ +static int panicback (lua_State *L) { + struct Aux *b; + lua_checkstack(L, 1); /* open space for 'Aux' struct */ + lua_getfield(L, LUA_REGISTRYINDEX, "_jmpbuf"); /* get 'Aux' struct */ + b = (struct Aux *)lua_touserdata(L, -1); + lua_pop(L, 1); /* remove 'Aux' struct */ + runC(b->L, L, b->paniccode); /* run optional panic code */ + longjmp(b->jb, 1); + return 1; /* to avoid warnings */ +} + +static int checkpanic (lua_State *L) { + struct Aux b; + void *ud; + lua_State *L1; + const char *code = luaL_checkstring(L, 1); + lua_Alloc f = lua_getallocf(L, &ud); + b.paniccode = luaL_optstring(L, 2, ""); + b.L = L; + L1 = lua_newstate(f, ud); /* create new state */ + if (L1 == NULL) { /* error? */ + lua_pushnil(L); + return 1; + } + lua_atpanic(L1, panicback); /* set its panic function */ + lua_pushlightuserdata(L1, &b); + lua_setfield(L1, LUA_REGISTRYINDEX, "_jmpbuf"); /* store 'Aux' struct */ + if (setjmp(b.jb) == 0) { /* set jump buffer */ + runC(L, L1, code); /* run code unprotected */ + lua_pushliteral(L, "no errors"); + } + else { /* error handling */ + /* move error message to original state */ + lua_pushstring(L, lua_tostring(L1, -1)); + } + lua_close(L1); + return 1; +} + + + +/* +** {==================================================================== +** function to test the API with C. It interprets a kind of assembler +** language with calls to the API, so the test can be driven by Lua code +** ===================================================================== +*/ + + +static void sethookaux (lua_State *L, int mask, int count, const char *code); + +static const char *const delimits = " \t\n,;"; + +static void skip (const char **pc) { + for (;;) { + if (**pc != '\0' && strchr(delimits, **pc)) (*pc)++; + else if (**pc == '#') { /* comment? */ + while (**pc != '\n' && **pc != '\0') (*pc)++; /* until end-of-line */ + } + else break; + } +} + +static int getnum_aux (lua_State *L, lua_State *L1, const char **pc) { + int res = 0; + int sig = 1; + skip(pc); + if (**pc == '.') { + res = cast_int(lua_tointeger(L1, -1)); + lua_pop(L1, 1); + (*pc)++; + return res; + } + else if (**pc == '*') { + res = lua_gettop(L1); + (*pc)++; + return res; + } + else if (**pc == '-') { + sig = -1; + (*pc)++; + } + if (!lisdigit(cast_uchar(**pc))) + luaL_error(L, "number expected (%s)", *pc); + while (lisdigit(cast_uchar(**pc))) res = res*10 + (*(*pc)++) - '0'; + return sig*res; +} + +static const char *getstring_aux (lua_State *L, char *buff, const char **pc) { + int i = 0; + skip(pc); + if (**pc == '"' || **pc == '\'') { /* quoted string? */ + int quote = *(*pc)++; + while (**pc != quote) { + if (**pc == '\0') luaL_error(L, "unfinished string in C script"); + buff[i++] = *(*pc)++; + } + (*pc)++; + } + else { + while (**pc != '\0' && !strchr(delimits, **pc)) + buff[i++] = *(*pc)++; + } + buff[i] = '\0'; + return buff; +} + + +static int getindex_aux (lua_State *L, lua_State *L1, const char **pc) { + skip(pc); + switch (*(*pc)++) { + case 'R': return LUA_REGISTRYINDEX; + case 'G': return luaL_error(L, "deprecated index 'G'"); + case 'U': return lua_upvalueindex(getnum_aux(L, L1, pc)); + default: (*pc)--; return getnum_aux(L, L1, pc); + } +} + + +static void pushcode (lua_State *L, int code) { + static const char *const codes[] = {"OK", "YIELD", "ERRRUN", + "ERRSYNTAX", MEMERRMSG, "ERRGCMM", "ERRERR"}; + lua_pushstring(L, codes[code]); +} + + +#define EQ(s1) (strcmp(s1, inst) == 0) + +#define getnum (getnum_aux(L, L1, &pc)) +#define getstring (getstring_aux(L, buff, &pc)) +#define getindex (getindex_aux(L, L1, &pc)) + + +static int testC (lua_State *L); +static int Cfunck (lua_State *L, int status, lua_KContext ctx); + +/* +** arithmetic operation encoding for 'arith' instruction +** LUA_OPIDIV -> \ +** LUA_OPSHL -> < +** LUA_OPSHR -> > +** LUA_OPUNM -> _ +** LUA_OPBNOT -> ! +*/ +static const char ops[] = "+-*%^/\\&|~<>_!"; + +static int runC (lua_State *L, lua_State *L1, const char *pc) { + char buff[300]; + int status = 0; + if (pc == NULL) return luaL_error(L, "attempt to runC null script"); + for (;;) { + const char *inst = getstring; + if EQ("") return 0; + else if EQ("absindex") { + lua_pushnumber(L1, lua_absindex(L1, getindex)); + } + else if EQ("append") { + int t = getindex; + int i = lua_rawlen(L1, t); + lua_rawseti(L1, t, i + 1); + } + else if EQ("arith") { + int op; + skip(&pc); + op = strchr(ops, *pc++) - ops; + lua_arith(L1, op); + } + else if EQ("call") { + int narg = getnum; + int nres = getnum; + lua_call(L1, narg, nres); + } + else if EQ("callk") { + int narg = getnum; + int nres = getnum; + int i = getindex; + lua_callk(L1, narg, nres, i, Cfunck); + } + else if EQ("checkstack") { + int sz = getnum; + const char *msg = getstring; + if (*msg == '\0') + msg = NULL; /* to test 'luaL_checkstack' with no message */ + luaL_checkstack(L1, sz, msg); + } + else if EQ("rawcheckstack") { + int sz = getnum; + lua_pushboolean(L1, lua_checkstack(L1, sz)); + } + else if EQ("compare") { + const char *opt = getstring; /* EQ, LT, or LE */ + int op = (opt[0] == 'E') ? LUA_OPEQ + : (opt[1] == 'T') ? LUA_OPLT : LUA_OPLE; + int a = getindex; + int b = getindex; + lua_pushboolean(L1, lua_compare(L1, a, b, op)); + } + else if EQ("concat") { + lua_concat(L1, getnum); + } + else if EQ("copy") { + int f = getindex; + lua_copy(L1, f, getindex); + } + else if EQ("func2num") { + lua_CFunction func = lua_tocfunction(L1, getindex); + lua_pushnumber(L1, cast_sizet(func)); + } + else if EQ("getfield") { + int t = getindex; + lua_getfield(L1, t, getstring); + } + else if EQ("getglobal") { + lua_getglobal(L1, getstring); + } + else if EQ("getmetatable") { + if (lua_getmetatable(L1, getindex) == 0) + lua_pushnil(L1); + } + else if EQ("gettable") { + lua_gettable(L1, getindex); + } + else if EQ("gettop") { + lua_pushinteger(L1, lua_gettop(L1)); + } + else if EQ("gsub") { + int a = getnum; int b = getnum; int c = getnum; + luaL_gsub(L1, lua_tostring(L1, a), + lua_tostring(L1, b), + lua_tostring(L1, c)); + } + else if EQ("insert") { + lua_insert(L1, getnum); + } + else if EQ("iscfunction") { + lua_pushboolean(L1, lua_iscfunction(L1, getindex)); + } + else if EQ("isfunction") { + lua_pushboolean(L1, lua_isfunction(L1, getindex)); + } + else if EQ("isnil") { + lua_pushboolean(L1, lua_isnil(L1, getindex)); + } + else if EQ("isnull") { + lua_pushboolean(L1, lua_isnone(L1, getindex)); + } + else if EQ("isnumber") { + lua_pushboolean(L1, lua_isnumber(L1, getindex)); + } + else if EQ("isstring") { + lua_pushboolean(L1, lua_isstring(L1, getindex)); + } + else if EQ("istable") { + lua_pushboolean(L1, lua_istable(L1, getindex)); + } + else if EQ("isudataval") { + lua_pushboolean(L1, lua_islightuserdata(L1, getindex)); + } + else if EQ("isuserdata") { + lua_pushboolean(L1, lua_isuserdata(L1, getindex)); + } + else if EQ("len") { + lua_len(L1, getindex); + } + else if EQ("Llen") { + lua_pushinteger(L1, luaL_len(L1, getindex)); + } + else if EQ("loadfile") { + luaL_loadfile(L1, luaL_checkstring(L1, getnum)); + } + else if EQ("loadstring") { + const char *s = luaL_checkstring(L1, getnum); + luaL_loadstring(L1, s); + } + else if EQ("newmetatable") { + lua_pushboolean(L1, luaL_newmetatable(L1, getstring)); + } + else if EQ("newtable") { + lua_newtable(L1); + } + else if EQ("newthread") { + lua_newthread(L1); + } + else if EQ("resetthread") { + lua_pushinteger(L1, lua_resetthread(L1)); + } + else if EQ("newuserdata") { + lua_newuserdata(L1, getnum); + } + else if EQ("next") { + lua_next(L1, -2); + } + else if EQ("objsize") { + lua_pushinteger(L1, lua_rawlen(L1, getindex)); + } + else if EQ("pcall") { + int narg = getnum; + int nres = getnum; + status = lua_pcall(L1, narg, nres, getnum); + } + else if EQ("pcallk") { + int narg = getnum; + int nres = getnum; + int i = getindex; + status = lua_pcallk(L1, narg, nres, 0, i, Cfunck); + } + else if EQ("pop") { + lua_pop(L1, getnum); + } + else if EQ("printstack") { + int n = getnum; + if (n != 0) { + printf("%s\n", luaL_tolstring(L1, n, NULL)); + lua_pop(L1, 1); + } + else printstack(L1); + } + else if EQ("print") { + const char *msg = getstring; + printf("%s\n", msg); + } + else if EQ("warningC") { + const char *msg = getstring; + lua_warning(L1, msg, 1); + } + else if EQ("warning") { + const char *msg = getstring; + lua_warning(L1, msg, 0); + } + else if EQ("pushbool") { + lua_pushboolean(L1, getnum); + } + else if EQ("pushcclosure") { + lua_pushcclosure(L1, testC, getnum); + } + else if EQ("pushint") { + lua_pushinteger(L1, getnum); + } + else if EQ("pushnil") { + lua_pushnil(L1); + } + else if EQ("pushnum") { + lua_pushnumber(L1, (lua_Number)getnum); + } + else if EQ("pushstatus") { + pushcode(L1, status); + } + else if EQ("pushstring") { + lua_pushstring(L1, getstring); + } + else if EQ("pushupvalueindex") { + lua_pushinteger(L1, lua_upvalueindex(getnum)); + } + else if EQ("pushvalue") { + lua_pushvalue(L1, getindex); + } + else if EQ("rawgeti") { + int t = getindex; + lua_rawgeti(L1, t, getnum); + } + else if EQ("rawgetp") { + int t = getindex; + lua_rawgetp(L1, t, cast_voidp(cast_sizet(getnum))); + } + else if EQ("rawsetp") { + int t = getindex; + lua_rawsetp(L1, t, cast_voidp(cast_sizet(getnum))); + } + else if EQ("remove") { + lua_remove(L1, getnum); + } + else if EQ("replace") { + lua_replace(L1, getindex); + } + else if EQ("resume") { + int i = getindex; + int nres; + status = lua_resume(lua_tothread(L1, i), L, getnum, &nres); + } + else if EQ("return") { + int n = getnum; + if (L1 != L) { + int i; + for (i = 0; i < n; i++) { + int idx = -(n - i); + switch (lua_type(L1, idx)) { + case LUA_TBOOLEAN: + lua_pushboolean(L, lua_toboolean(L1, idx)); + break; + default: + lua_pushstring(L, lua_tostring(L1, idx)); + break; + } + } + } + return n; + } + else if EQ("rotate") { + int i = getindex; + lua_rotate(L1, i, getnum); + } + else if EQ("setfield") { + int t = getindex; + const char *s = getstring; + lua_setfield(L1, t, s); + } + else if EQ("setglobal") { + const char *s = getstring; + lua_setglobal(L1, s); + } + else if EQ("sethook") { + int mask = getnum; + int count = getnum; + const char *s = getstring; + sethookaux(L1, mask, count, s); + } + else if EQ("setmetatable") { + int idx = getindex; + lua_setmetatable(L1, idx); + } + else if EQ("settable") { + lua_settable(L1, getindex); + } + else if EQ("settop") { + lua_settop(L1, getnum); + } + else if EQ("testudata") { + int i = getindex; + lua_pushboolean(L1, luaL_testudata(L1, i, getstring) != NULL); + } + else if EQ("error") { + lua_error(L1); + } + else if EQ("throw") { +#if defined(__cplusplus) +static struct X { int x; } x; + throw x; +#else + luaL_error(L1, "C++"); +#endif + break; + } + else if EQ("tobool") { + lua_pushboolean(L1, lua_toboolean(L1, getindex)); + } + else if EQ("tocfunction") { + lua_pushcfunction(L1, lua_tocfunction(L1, getindex)); + } + else if EQ("tointeger") { + lua_pushinteger(L1, lua_tointeger(L1, getindex)); + } + else if EQ("tonumber") { + lua_pushnumber(L1, lua_tonumber(L1, getindex)); + } + else if EQ("topointer") { + lua_pushlightuserdata(L1, cast_voidp(lua_topointer(L1, getindex))); + } + else if EQ("touserdata") { + lua_pushlightuserdata(L1, lua_touserdata(L1, getindex)); + } + else if EQ("tostring") { + const char *s = lua_tostring(L1, getindex); + const char *s1 = lua_pushstring(L1, s); + lua_longassert((s == NULL && s1 == NULL) || strcmp(s, s1) == 0); + } + else if EQ("type") { + lua_pushstring(L1, luaL_typename(L1, getnum)); + } + else if EQ("xmove") { + int f = getindex; + int t = getindex; + lua_State *fs = (f == 0) ? L1 : lua_tothread(L1, f); + lua_State *ts = (t == 0) ? L1 : lua_tothread(L1, t); + int n = getnum; + if (n == 0) n = lua_gettop(fs); + lua_xmove(fs, ts, n); + } + else if EQ("yield") { + return lua_yield(L1, getnum); + } + else if EQ("yieldk") { + int nres = getnum; + int i = getindex; + return lua_yieldk(L1, nres, i, Cfunck); + } + else if EQ("toclose") { + lua_toclose(L1, getnum); + } + else luaL_error(L, "unknown instruction %s", buff); + } + return 0; +} + + +static int testC (lua_State *L) { + lua_State *L1; + const char *pc; + if (lua_isuserdata(L, 1)) { + L1 = getstate(L); + pc = luaL_checkstring(L, 2); + } + else if (lua_isthread(L, 1)) { + L1 = lua_tothread(L, 1); + pc = luaL_checkstring(L, 2); + } + else { + L1 = L; + pc = luaL_checkstring(L, 1); + } + return runC(L, L1, pc); +} + + +static int Cfunc (lua_State *L) { + return runC(L, L, lua_tostring(L, lua_upvalueindex(1))); +} + + +static int Cfunck (lua_State *L, int status, lua_KContext ctx) { + pushcode(L, status); + lua_setglobal(L, "status"); + lua_pushinteger(L, ctx); + lua_setglobal(L, "ctx"); + return runC(L, L, lua_tostring(L, ctx)); +} + + +static int makeCfunc (lua_State *L) { + luaL_checkstring(L, 1); + lua_pushcclosure(L, Cfunc, lua_gettop(L)); + return 1; +} + + +/* }====================================================== */ + + +/* +** {====================================================== +** tests for C hooks +** ======================================================= +*/ + +/* +** C hook that runs the C script stored in registry.C_HOOK[L] +*/ +static void Chook (lua_State *L, lua_Debug *ar) { + const char *scpt; + const char *const events [] = {"call", "ret", "line", "count", "tailcall"}; + lua_getfield(L, LUA_REGISTRYINDEX, "C_HOOK"); + lua_pushlightuserdata(L, L); + lua_gettable(L, -2); /* get C_HOOK[L] (script saved by sethookaux) */ + scpt = lua_tostring(L, -1); /* not very religious (string will be popped) */ + lua_pop(L, 2); /* remove C_HOOK and script */ + lua_pushstring(L, events[ar->event]); /* may be used by script */ + lua_pushinteger(L, ar->currentline); /* may be used by script */ + runC(L, L, scpt); /* run script from C_HOOK[L] */ +} + + +/* +** sets 'registry.C_HOOK[L] = scpt' and sets 'Chook' as a hook +*/ +static void sethookaux (lua_State *L, int mask, int count, const char *scpt) { + if (*scpt == '\0') { /* no script? */ + lua_sethook(L, NULL, 0, 0); /* turn off hooks */ + return; + } + lua_getfield(L, LUA_REGISTRYINDEX, "C_HOOK"); /* get C_HOOK table */ + if (!lua_istable(L, -1)) { /* no hook table? */ + lua_pop(L, 1); /* remove previous value */ + lua_newtable(L); /* create new C_HOOK table */ + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, "C_HOOK"); /* register it */ + } + lua_pushlightuserdata(L, L); + lua_pushstring(L, scpt); + lua_settable(L, -3); /* C_HOOK[L] = script */ + lua_sethook(L, Chook, mask, count); +} + + +static int sethook (lua_State *L) { + if (lua_isnoneornil(L, 1)) + lua_sethook(L, NULL, 0, 0); /* turn off hooks */ + else { + const char *scpt = luaL_checkstring(L, 1); + const char *smask = luaL_checkstring(L, 2); + int count = cast_int(luaL_optinteger(L, 3, 0)); + int mask = 0; + if (strchr(smask, 'c')) mask |= LUA_MASKCALL; + if (strchr(smask, 'r')) mask |= LUA_MASKRET; + if (strchr(smask, 'l')) mask |= LUA_MASKLINE; + if (count > 0) mask |= LUA_MASKCOUNT; + sethookaux(L, mask, count, scpt); + } + return 0; +} + + +static int coresume (lua_State *L) { + int status, nres; + lua_State *co = lua_tothread(L, 1); + luaL_argcheck(L, co, 1, "coroutine expected"); + status = lua_resume(co, L, 0, &nres); + if (status != LUA_OK && status != LUA_YIELD) { + lua_pushboolean(L, 0); + lua_insert(L, -2); + return 2; /* return false + error message */ + } + else { + lua_pushboolean(L, 1); + return 1; + } +} + +/* }====================================================== */ + + + +static const struct luaL_Reg tests_funcs[] = { + {"checkmemory", lua_checkmemory}, + {"closestate", closestate}, + {"d2s", d2s}, + {"doonnewstack", doonnewstack}, + {"doremote", doremote}, + {"gccolor", gc_color}, + {"gcage", gc_age}, + {"gcstate", gc_state}, + {"pobj", gc_printobj}, + {"getref", getref}, + {"hash", hash_query}, + {"int2fb", int2fb_aux}, + {"log2", log2_aux}, + {"limits", get_limits}, + {"listcode", listcode}, + {"printcode", printcode}, + {"listk", listk}, + {"listabslineinfo", listabslineinfo}, + {"listlocals", listlocals}, + {"loadlib", loadlib}, + {"checkpanic", checkpanic}, + {"newstate", newstate}, + {"newuserdata", newuserdata}, + {"num2int", num2int}, + {"pushuserdata", pushuserdata}, + {"querystr", string_query}, + {"querytab", table_query}, + {"ref", tref}, + {"resume", coresume}, + {"s2d", s2d}, + {"sethook", sethook}, + {"stacklevel", stacklevel}, + {"testC", testC}, + {"makeCfunc", makeCfunc}, + {"totalmem", mem_query}, + {"alloccount", alloc_count}, + {"trick", settrick}, + {"udataval", udataval}, + {"unref", unref}, + {"upvalue", upvalue}, + {NULL, NULL} +}; + + +static void checkfinalmem (void) { + lua_assert(l_memcontrol.numblocks == 0); + lua_assert(l_memcontrol.total == 0); +} + + +int luaB_opentests (lua_State *L) { + void *ud; + lua_atpanic(L, &tpanic); + lua_setwarnf(L, &warnf, L); + atexit(checkfinalmem); + lua_assert(lua_getallocf(L, &ud) == debug_realloc); + lua_assert(ud == cast_voidp(&l_memcontrol)); + lua_setallocf(L, lua_getallocf(L, NULL), ud); + luaL_newlib(L, tests_funcs); + return 1; +} + +#endif + diff --git a/source/lua/ltests.h b/source/lua/ltests.h new file mode 100644 index 0000000..997e1c4 --- /dev/null +++ b/source/lua/ltests.h @@ -0,0 +1,138 @@ +/* +** $Id: ltests.h $ +** Internal Header for Debugging of the Lua Implementation +** See Copyright Notice in lua.h +*/ + +#ifndef ltests_h +#define ltests_h + + +#include +#include + +/* test Lua with compatibility code */ +#define LUA_COMPAT_MATHLIB +#define LUA_COMPAT_LT_LE + + +#define LUA_DEBUG + + +/* turn on assertions */ +#undef NDEBUG +#include +#define lua_assert(c) assert(c) + + +/* include opcode names */ +#define LUAI_DEFOPNAMES + + +/* compiled with -O0, Lua uses a lot of C stack space... */ +#undef LUAI_MAXCCALLS +#define LUAI_MAXCCALLS 400 + +/* to avoid warnings, and to make sure value is really unused */ +#define UNUSED(x) (x=0, (void)(x)) + + +/* test for sizes in 'l_sprintf' (make sure whole buffer is available) */ +#undef l_sprintf +#if !defined(LUA_USE_C89) +#define l_sprintf(s,sz,f,i) (memset(s,0xAB,sz), snprintf(s,sz,f,i)) +#else +#define l_sprintf(s,sz,f,i) (memset(s,0xAB,sz), sprintf(s,f,i)) +#endif + + +/* get a chance to test code without jump tables */ +#define LUA_USE_JUMPTABLE 0 + + +/* use 32-bit integers in random generator */ +#define LUA_RAND32 + + +/* memory-allocator control variables */ +typedef struct Memcontrol { + unsigned long numblocks; + unsigned long total; + unsigned long maxmem; + unsigned long memlimit; + unsigned long countlimit; + unsigned long objcount[LUA_NUMTAGS]; +} Memcontrol; + +LUA_API Memcontrol l_memcontrol; + + +/* +** generic variable for debug tricks +*/ +extern void *l_Trick; + + + +/* +** Function to traverse and check all memory used by Lua +*/ +int lua_checkmemory (lua_State *L); + + +/* test for lock/unlock */ + +struct L_EXTRA { int lock; int *plock; }; +#undef LUA_EXTRASPACE +#define LUA_EXTRASPACE sizeof(struct L_EXTRA) +#define getlock(l) cast(struct L_EXTRA*, lua_getextraspace(l)) +#define luai_userstateopen(l) \ + (getlock(l)->lock = 0, getlock(l)->plock = &(getlock(l)->lock)) +#define luai_userstateclose(l) \ + lua_assert(getlock(l)->lock == 1 && getlock(l)->plock == &(getlock(l)->lock)) +#define luai_userstatethread(l,l1) \ + lua_assert(getlock(l1)->plock == getlock(l)->plock) +#define luai_userstatefree(l,l1) \ + lua_assert(getlock(l)->plock == getlock(l1)->plock) +#define lua_lock(l) lua_assert((*getlock(l)->plock)++ == 0) +#define lua_unlock(l) lua_assert(--(*getlock(l)->plock) == 0) + + + +LUA_API int luaB_opentests (lua_State *L); + +LUA_API void *debug_realloc (void *ud, void *block, + size_t osize, size_t nsize); + +#if defined(lua_c) +#define luaL_newstate() lua_newstate(debug_realloc, &l_memcontrol) +#define luaL_openlibs(L) \ + { (luaL_openlibs)(L); \ + luaL_requiref(L, "T", luaB_opentests, 1); \ + lua_pop(L, 1); } +#endif + + + +/* change some sizes to give some bugs a chance */ + +#undef LUAL_BUFFERSIZE +#define LUAL_BUFFERSIZE 23 +#define MINSTRTABSIZE 2 +#define MAXIWTHABS 3 + + +/* make stack-overflow tests run faster */ +#undef LUAI_MAXSTACK +#define LUAI_MAXSTACK 50000 + + +#undef LUAI_USER_ALIGNMENT_T +#define LUAI_USER_ALIGNMENT_T union { char b[sizeof(void*) * 8]; } + + +#define STRCACHE_N 23 +#define STRCACHE_M 5 + +#endif + diff --git a/source/lua/ltests.o b/source/lua/ltests.o new file mode 100644 index 0000000000000000000000000000000000000000..334a57ce03c729948aac40a2835933ae9e6f3ba0 GIT binary patch literal 944 zcmbW0%}&EG49DGVeBQVraVaMTVo`#&NN_-rrm+j+wg+fSB_wEvNQ%YB#$A_|6tS2>FZ3rII8A zAo8P7Ns6l88hx^s%2x`=W1oi{oBHlLj&18K xIzq$0yN+F$#Fep+(>uXz?{BNUrMtium>UG=*{xjYEW7Fu+ + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + +static const char udatatypename[] = "userdata"; + +LUAI_DDEF const char *const luaT_typenames_[LUA_TOTALTAGS] = { + "no value", + "nil", "boolean", udatatypename, "number", + "string", "table", "function", udatatypename, "thread", + "upvalue", "proto" /* these last cases are used for tests only */ +}; + + +void luaT_init (lua_State *L) { + static const char *const luaT_eventname[] = { /* ORDER TM */ + "__index", "__newindex", + "__gc", "__mode", "__len", "__eq", + "__add", "__sub", "__mul", "__mod", "__pow", + "__div", "__idiv", + "__band", "__bor", "__bxor", "__shl", "__shr", + "__unm", "__bnot", "__lt", "__le", + "__concat", "__call", "__close" + }; + int i; + for (i=0; itmname[i] = luaS_new(L, luaT_eventname[i]); + luaC_fix(L, obj2gco(G(L)->tmname[i])); /* never collect these names */ + } +} + + +/* +** function to be used with macro "fasttm": optimized for absence of +** tag methods +*/ +const TValue *luaT_gettm (Table *events, TMS event, TString *ename) { + const TValue *tm = luaH_getshortstr(events, ename); + lua_assert(event <= TM_EQ); + if (notm(tm)) { /* no tag method? */ + events->flags |= cast_byte(1u<metatable; + break; + case LUA_TUSERDATA: + mt = uvalue(o)->metatable; + break; + default: + mt = G(L)->mt[ttype(o)]; + } + return (mt ? luaH_getshortstr(mt, G(L)->tmname[event]) : &G(L)->nilvalue); +} + + +/* +** Return the name of the type of an object. For tables and userdata +** with metatable, use their '__name' metafield, if present. +*/ +const char *luaT_objtypename (lua_State *L, const TValue *o) { + Table *mt; + if ((ttistable(o) && (mt = hvalue(o)->metatable) != NULL) || + (ttisfulluserdata(o) && (mt = uvalue(o)->metatable) != NULL)) { + const TValue *name = luaH_getshortstr(mt, luaS_new(L, "__name")); + if (ttisstring(name)) /* is '__name' a string? */ + return getstr(tsvalue(name)); /* use it as type name */ + } + return ttypename(ttype(o)); /* else use standard type name */ +} + + +void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, const TValue *p3) { + StkId func = L->top; + setobj2s(L, func, f); /* push function (assume EXTRA_STACK) */ + setobj2s(L, func + 1, p1); /* 1st argument */ + setobj2s(L, func + 2, p2); /* 2nd argument */ + setobj2s(L, func + 3, p3); /* 3rd argument */ + L->top = func + 4; + /* metamethod may yield only when called from Lua code */ + if (isLuacode(L->ci)) + luaD_call(L, func, 0); + else + luaD_callnoyield(L, func, 0); +} + + +void luaT_callTMres (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, StkId res) { + ptrdiff_t result = savestack(L, res); + StkId func = L->top; + setobj2s(L, func, f); /* push function (assume EXTRA_STACK) */ + setobj2s(L, func + 1, p1); /* 1st argument */ + setobj2s(L, func + 2, p2); /* 2nd argument */ + L->top += 3; + /* metamethod may yield only when called from Lua code */ + if (isLuacode(L->ci)) + luaD_call(L, func, 1); + else + luaD_callnoyield(L, func, 1); + res = restorestack(L, result); + setobjs2s(L, res, --L->top); /* move result to its place */ +} + + +static int callbinTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event) { + const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ + if (notm(tm)) + tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ + if (notm(tm)) return 0; + luaT_callTMres(L, tm, p1, p2, res); + return 1; +} + + +void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event) { + if (!callbinTM(L, p1, p2, res, event)) { + switch (event) { + case TM_CONCAT: + luaG_concaterror(L, p1, p2); + /* call never returns, but to avoid warnings: *//* FALLTHROUGH */ + case TM_BAND: case TM_BOR: case TM_BXOR: + case TM_SHL: case TM_SHR: case TM_BNOT: { + if (ttisnumber(p1) && ttisnumber(p2)) + luaG_tointerror(L, p1, p2); + else + luaG_opinterror(L, p1, p2, "perform bitwise operation on"); + } + /* calls never return, but to avoid warnings: *//* FALLTHROUGH */ + default: + luaG_opinterror(L, p1, p2, "perform arithmetic on"); + } + } +} + + +void luaT_trybinassocTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, int inv, TMS event) { + if (inv) + luaT_trybinTM(L, p2, p1, res, event); + else + luaT_trybinTM(L, p1, p2, res, event); +} + + +void luaT_trybiniTM (lua_State *L, const TValue *p1, lua_Integer i2, + int inv, StkId res, TMS event) { + TValue aux; + setivalue(&aux, i2); + luaT_trybinassocTM(L, p1, &aux, res, inv, event); +} + + +int luaT_callorderTM (lua_State *L, const TValue *p1, const TValue *p2, + TMS event) { + if (callbinTM(L, p1, p2, L->top, event)) /* try original event */ + return !l_isfalse(s2v(L->top)); +#if defined(LUA_COMPAT_LT_LE) + else if (event == TM_LE) { + /* try '!(p2 < p1)' for '(p1 <= p2)' */ + L->ci->callstatus |= CIST_LEQ; /* mark it is doing 'lt' for 'le' */ + if (callbinTM(L, p2, p1, L->top, TM_LT)) { + L->ci->callstatus ^= CIST_LEQ; /* clear mark */ + return l_isfalse(s2v(L->top)); + } + /* else error will remove this 'ci'; no need to clear mark */ + } +#endif + luaG_ordererror(L, p1, p2); /* no metamethod found */ + return 0; /* to avoid warnings */ +} + + +int luaT_callorderiTM (lua_State *L, const TValue *p1, int v2, + int inv, TMS event) { + TValue aux; const TValue *p2; + setivalue(&aux, v2); + if (inv) { /* arguments were exchanged? */ + p2 = p1; p1 = &aux; /* correct them */ + } + else + p2 = &aux; + return luaT_callorderTM(L, p1, p2, event); +} + + +void luaT_adjustvarargs (lua_State *L, int nfixparams, CallInfo *ci, + const Proto *p) { + int i; + int actual = cast_int(L->top - ci->func) - 1; /* number of arguments */ + int nextra = actual - nfixparams; /* number of extra arguments */ + ci->u.l.nextraargs = nextra; + checkstackGC(L, p->maxstacksize + 1); + /* copy function to the top of the stack */ + setobjs2s(L, L->top++, ci->func); + /* move fixed parameters to the top of the stack */ + for (i = 1; i <= nfixparams; i++) { + setobjs2s(L, L->top++, ci->func + i); + setnilvalue(s2v(ci->func + i)); /* erase original parameter (for GC) */ + } + ci->func += actual + 1; + ci->top += actual + 1; + lua_assert(L->top <= ci->top && ci->top <= L->stack_last); +} + + +void luaT_getvarargs (lua_State *L, CallInfo *ci, StkId where, int wanted) { + int i; + int nextra = ci->u.l.nextraargs; + if (wanted < 0) { + wanted = nextra; /* get all extra arguments available */ + checkstackp(L, nextra, where); /* ensure stack space */ + L->top = where + nextra; /* next instruction will need top */ + } + for (i = 0; i < wanted && i < nextra; i++) + setobjs2s(L, where + i, ci->func - nextra + i); + for (; i < wanted; i++) /* complete required results with nil */ + setnilvalue(s2v(where + i)); +} + diff --git a/source/lua/ltm.h b/source/lua/ltm.h new file mode 100644 index 0000000..fad4784 --- /dev/null +++ b/source/lua/ltm.h @@ -0,0 +1,93 @@ +/* +** $Id: ltm.h $ +** Tag methods +** See Copyright Notice in lua.h +*/ + +#ifndef ltm_h +#define ltm_h + + +#include "lobject.h" + + +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER TM" and "ORDER OP" +*/ +typedef enum { + TM_INDEX, + TM_NEWINDEX, + TM_GC, + TM_MODE, + TM_LEN, + TM_EQ, /* last tag method with fast access */ + TM_ADD, + TM_SUB, + TM_MUL, + TM_MOD, + TM_POW, + TM_DIV, + TM_IDIV, + TM_BAND, + TM_BOR, + TM_BXOR, + TM_SHL, + TM_SHR, + TM_UNM, + TM_BNOT, + TM_LT, + TM_LE, + TM_CONCAT, + TM_CALL, + TM_CLOSE, + TM_N /* number of elements in the enum */ +} TMS; + + +/* +** Test whether there is no tagmethod. +** (Because tagmethods use raw accesses, the result may be an "empty" nil.) +*/ +#define notm(tm) ttisnil(tm) + + +#define gfasttm(g,et,e) ((et) == NULL ? NULL : \ + ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e])) + +#define fasttm(l,et,e) gfasttm(G(l), et, e) + +#define ttypename(x) luaT_typenames_[(x) + 1] + +LUAI_DDEC(const char *const luaT_typenames_[LUA_TOTALTAGS];) + + +LUAI_FUNC const char *luaT_objtypename (lua_State *L, const TValue *o); + +LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename); +LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, + TMS event); +LUAI_FUNC void luaT_init (lua_State *L); + +LUAI_FUNC void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, const TValue *p3); +LUAI_FUNC void luaT_callTMres (lua_State *L, const TValue *f, + const TValue *p1, const TValue *p2, StkId p3); +LUAI_FUNC void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event); +LUAI_FUNC void luaT_trybinassocTM (lua_State *L, const TValue *p1, + const TValue *p2, StkId res, int inv, TMS event); +LUAI_FUNC void luaT_trybiniTM (lua_State *L, const TValue *p1, lua_Integer i2, + int inv, StkId res, TMS event); +LUAI_FUNC int luaT_callorderTM (lua_State *L, const TValue *p1, + const TValue *p2, TMS event); +LUAI_FUNC int luaT_callorderiTM (lua_State *L, const TValue *p1, int v2, + int inv, TMS event); + +LUAI_FUNC void luaT_adjustvarargs (lua_State *L, int nfixparams, + struct CallInfo *ci, const Proto *p); +LUAI_FUNC void luaT_getvarargs (lua_State *L, struct CallInfo *ci, + StkId where, int wanted); + + +#endif diff --git a/source/lua/ltm.o b/source/lua/ltm.o new file mode 100644 index 0000000000000000000000000000000000000000..e2cc892a1a01e22c7e6dcf4cd58153147a057c48 GIT binary patch literal 7560 zcmeHLe{5UD9Y4ozW0GRKz`zK$8d|25f@hb|C9FesVkhU~(9k4ftQ6xoFO6Hr4)$}J zFjm4|Q|08O1hfsNA+6f}fc>)}jYS=xDIslWH3_oPq5&EU6~uoMQgOl)XvWJk`$F`RJzsyHhQt+F|?l9pi^ExWlLJ`D{91-(7~Fe-z+$=bC-! zia1B^wrlS>`_8XWqkZQ~)o;*3y&C{p7(DuC(53yy)D7%7Wv|o13zIHDW>BrDPYWw) zfkJHcZV=6%q}piXxN{BB@e0IeUm9-rN`Ea)7^icj&b~RU-l$DEHWP3fu?bE(M;h(gDQDjWn|hsdq}C3mXP<2! zriH6%VHd>qLH@|>Q^4|j))isXQEM&6HAh(! zm~WhmFqlo?TyP*@7pYxb53V;mQC!d9cY-Yub~4!95@N43Q7o?c2zxEe4s%IfTN@hK zT$IgF_76x9gv>{_^Gbt~4DJX%uvlLqb}Gs~ltQSUAKUI9m2$(umSA&)eGX;8K8dgs zAvVtIIKQy4&_9~LL7Tr)t?a&8o4-20Bg#%u_F+_P61jf7%+V`U9n_09d$~4m+v9VN zgs}uRTl1I0Qiay(jOzP6u8-Lg=q-m|D%w6A?jNOWGR%(VSIh(;NXkBfB+T3nq+YMu z8F!S82H8={u3AUg7-gp>!2Mc%fwaSJ+#QSg4>p4+%)YP{%4%Lu!t|bh$_m#Nmk4F*602Tt8qW~A9wzE6ix#@TA6LEKggz=CXV+X!*F;Y5Rkf( zhyC{u8(RzuN&xbJ>k(w1;Cg&c*&DbRv~UNUPOixMi;=O5wxD*#5@J*9=UB}x&XI>! z(LxIpS=gsdSm^pmI(E)R6R*+gqs{}5L8j?YjVs*$0cBwjDy6K%IZ|&QsIl*@4-Wlc z;gAbOv{y^$*lC;YpPL)n0?BBAXN+3QX~9p~M(0SxKClI1xpE>@V#ht~qSdeFCmRy) zN3_G1$k_X~sAX-`k`N^>DuTR-+oO1};wh^2xXE7F+TyI`;eTtUi7#M)^dG|=0Ob!$ z(NuWg7U#f|V4(jU=Ydn$A9Egf8~SMCk5C2vg~(@bMaJHPqbZp8-!4w^W>CvI) zGPiDT0uzLDoy`9WSDo)Je!kZG=mt2u60;F@5z`*6o_^HJ&*2UCR`FRz*qeJ-@CD{s zVDCoRY0gI3M-glDx~j<7-)!uyh~;DhORaOwTn#z!FU-WCi^Y=ZHl>HeV(ECNLb{Y} zdnViIX-%qok~zhb0U)j>GigsIT^x*OlWIq&q9zlFf~K-Z8rhiuzBALNK$lW*PTj^{zFZ#*x-c7T-O*%XOeit^=Wbx)TS|85Oz| zf1$HPCY^{Qmx!lOIFZWa6q3$(y5p%l5Xls2&16zaJWbO1&Q>K$a%wi2-bvJWYf2&Q z`E&xONz{(45^p286F z>!v*C{CoYIyuM1W-@jfT@ND$?H~BXCstLJD1Y~)58?p4bEZ40nwGYD?PyzV$VyqGS z8i#AJq|V{qZw)y-nyn<@a0eZ(8i$<_9}H6=`%Ua&V1G%_;nu8Chi7XUmkc`W!SZbm zcdf$(B;4%?c|_hiS_43;zz)T8 z6WXuw1%g9pYY=m_A8lzX8XUefSPD8kkQm*PoX0+)dmZXR!!>zYU~3ToD-S@6vl`@uIJpT3v=b2PaG4x{-b%_0+#+cu zOJ~YTjM}>VZO~m|_?^`#%zPVq{1swub<5ye0Y^JhpYLbDzPF70ZXqxCt=x;>7dT9s zH@=^N8iZ%HrIbu@l#mBS{|xl#7tbDS(#~^0FBL!DKbOMC0q1!T>%z|gz>W*tB}#?w zQ^2O+S<24YWpGUKQu3<-N57-OzTC^}1U@D3wO|+9Z31_R66O0D@X#{$n}vLrkmvgt z2#@drTx}BYhs&*ntV?gFQGFcUF5r(nW-c0K* zod@Dl!;;IzbODS4LI7(aerZW(dXq}3Z4oevWtE)Hs@YyWbkM68w;m;%g=-QAGF{2E zYT(t3k#COa>hWAIlhA!jC@EPCE0b+gvN}*7<4nC^!OofQVThCyDXY@bFRn_;&(*5iYUV zf(G1Wz+(pd3Ipzey1|C_zrrc~6&ARR$1cXU2pqSk(Qk_ZH`>2X>|^Y%fk(#qgaLOO z@Rtnul?MEz0l(IOUohZC`LIYR4&z>yejgLKoEOdk+v5iL>w%Z@KQ+nU!lem$b{Y8> z4ft0Lb}kt3uNm+TvF|a?8w~gp2Ha!7dqr`e{5k_ZXuxkW;92oWM0q3rm;pE183#FR zC~sUxdH+D%xQ=HH>uy{}w1EwWMQEItbtLf`j>4HNdWkm(9&KWi_%@v-9??tuKEYR* za9Q_06W%6xeun~D+Sw)WfaoROC3tGWy9M89!XFX*cTM;Y1^=K49}s+p34dJh(!Y%7 zCj##=$v-3bJ`?^+!An2V&aVVMY?A+t;GZ_(zZ3jH6aKQ`pEKcOf`8tGPYC{y34dMi zqbB@K!B3g+cLhIf!cPl+&VpmS)rPw|m0DhP=;3ck;T%R2ax372^pHQ~d; z?+FuLbS}oF--9Bks0o+%I=tUtlk)OD_KXRa_pujDxV(>@G2!ywWfT6TeR=N+m~nY% zd2_v;@XrzAg)5HUcStI$q~cyx=~0Q7|AhCp=5oZF%^-u~ey^YKac@4IO72!ty)cS8 zx(M+mGM$}pB_m$=H;&@1zq{pD{j#7-DIKx)EdDp@%V-`jf+-Qle$iw=P|unMTtx|; zz;7sik^(wge0QwY$w`qv2e9bJE+pKd|GL1%XHcMooHqHD17i6kOYpmkHvd5NH{W?6C?ZZ4~{v&^Ka8n`Ivsn0fvOg?^7| zK*lfa=7Csh{?FrO1X`nTi1Ww0tkjqD$1*k74nTz9WfIyxy(_-W@gr{vk;}SQ=_=0& Z<4#~P2D5*h=2HGgQ32X7Ob$&f`414JC6fRE literal 0 HcmV?d00001 diff --git a/source/lua/lua.c b/source/lua/lua.c new file mode 100644 index 0000000..7a261a0 --- /dev/null +++ b/source/lua/lua.c @@ -0,0 +1,622 @@ +/* +** $Id: lua.c $ +** Lua stand-alone interpreter +** See Copyright Notice in lua.h +*/ + +#define lua_c + +#include "lprefix.h" + + +#include +#include +#include + +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#if !defined(LUA_PROGNAME) +#define LUA_PROGNAME "lua" +#endif + +#if !defined(LUA_INIT_VAR) +#define LUA_INIT_VAR "LUA_INIT" +#endif + +#define LUA_INITVARVERSION LUA_INIT_VAR LUA_VERSUFFIX + + +static lua_State *globalL = NULL; + +static const char *progname = LUA_PROGNAME; + + +/* +** Hook set by signal function to stop the interpreter. +*/ +static void lstop (lua_State *L, lua_Debug *ar) { + (void)ar; /* unused arg. */ + lua_sethook(L, NULL, 0, 0); /* reset hook */ + luaL_error(L, "interrupted!"); +} + + +/* +** Function to be called at a C signal. Because a C signal cannot +** just change a Lua state (as there is no proper synchronization), +** this function only sets a hook that, when called, will stop the +** interpreter. +*/ +static void laction (int i) { + signal(i, SIG_DFL); /* if another SIGINT happens, terminate process */ + lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); +} + + +static void print_usage (const char *badoption) { + lua_writestringerror("%s: ", progname); + if (badoption[1] == 'e' || badoption[1] == 'l') + lua_writestringerror("'%s' needs argument\n", badoption); + else + lua_writestringerror("unrecognized option '%s'\n", badoption); + lua_writestringerror( + "usage: %s [options] [script [args]]\n" + "Available options are:\n" + " -e stat execute string 'stat'\n" + " -i enter interactive mode after executing 'script'\n" + " -l name require library 'name' into global 'name'\n" + " -v show version information\n" + " -E ignore environment variables\n" + " -- stop handling options\n" + " - stop handling options and execute stdin\n" + , + progname); +} + + +/* +** Prints an error message, adding the program name in front of it +** (if present) +*/ +static void l_message (const char *pname, const char *msg) { + if (pname) lua_writestringerror("%s: ", pname); + lua_writestringerror("%s\n", msg); +} + + +/* +** Check whether 'status' is not OK and, if so, prints the error +** message on the top of the stack. It assumes that the error object +** is a string, as it was either generated by Lua or by 'msghandler'. +*/ +static int report (lua_State *L, int status) { + if (status != LUA_OK) { + const char *msg = lua_tostring(L, -1); + l_message(progname, msg); + lua_pop(L, 1); /* remove message */ + } + return status; +} + + +/* +** Message handler used to run all chunks +*/ +static int msghandler (lua_State *L) { + const char *msg = lua_tostring(L, 1); + if (msg == NULL) { /* is error object not a string? */ + if (luaL_callmeta(L, 1, "__tostring") && /* does it have a metamethod */ + lua_type(L, -1) == LUA_TSTRING) /* that produces a string? */ + return 1; /* that is the message */ + else + msg = lua_pushfstring(L, "(error object is a %s value)", + luaL_typename(L, 1)); + } + luaL_traceback(L, L, msg, 1); /* append a standard traceback */ + return 1; /* return the traceback */ +} + + +/* +** Interface to 'lua_pcall', which sets appropriate message function +** and C-signal handler. Used to run all chunks. +*/ +static int docall (lua_State *L, int narg, int nres) { + int status; + int base = lua_gettop(L) - narg; /* function index */ + lua_pushcfunction(L, msghandler); /* push message handler */ + lua_insert(L, base); /* put it under function and args */ + globalL = L; /* to be available to 'laction' */ + signal(SIGINT, laction); /* set C-signal handler */ + status = lua_pcall(L, narg, nres, base); + signal(SIGINT, SIG_DFL); /* reset C-signal handler */ + lua_remove(L, base); /* remove message handler from the stack */ + return status; +} + + +static void print_version (void) { + lua_writestring(LUA_COPYRIGHT, strlen(LUA_COPYRIGHT)); + lua_writeline(); +} + + +/* +** Create the 'arg' table, which stores all arguments from the +** command line ('argv'). It should be aligned so that, at index 0, +** it has 'argv[script]', which is the script name. The arguments +** to the script (everything after 'script') go to positive indices; +** other arguments (before the script name) go to negative indices. +** If there is no script name, assume interpreter's name as base. +*/ +static void createargtable (lua_State *L, char **argv, int argc, int script) { + int i, narg; + if (script == argc) script = 0; /* no script name? */ + narg = argc - (script + 1); /* number of positive indices */ + lua_createtable(L, narg, script + 1); + for (i = 0; i < argc; i++) { + lua_pushstring(L, argv[i]); + lua_rawseti(L, -2, i - script); + } + lua_setglobal(L, "arg"); +} + + +static int dochunk (lua_State *L, int status) { + if (status == LUA_OK) status = docall(L, 0, 0); + return report(L, status); +} + + +static int dofile (lua_State *L, const char *name) { + return dochunk(L, luaL_loadfile(L, name)); +} + + +static int dostring (lua_State *L, const char *s, const char *name) { + return dochunk(L, luaL_loadbuffer(L, s, strlen(s), name)); +} + + +/* +** Calls 'require(name)' and stores the result in a global variable +** with the given name. +*/ +static int dolibrary (lua_State *L, const char *name) { + int status; + lua_getglobal(L, "require"); + lua_pushstring(L, name); + status = docall(L, 1, 1); /* call 'require(name)' */ + if (status == LUA_OK) + lua_setglobal(L, name); /* global[name] = require return */ + return report(L, status); +} + + +/* +** Push on the stack the contents of table 'arg' from 1 to #arg +*/ +static int pushargs (lua_State *L) { + int i, n; + if (lua_getglobal(L, "arg") != LUA_TTABLE) + luaL_error(L, "'arg' is not a table"); + n = (int)luaL_len(L, -1); + luaL_checkstack(L, n + 3, "too many arguments to script"); + for (i = 1; i <= n; i++) + lua_rawgeti(L, -i, i); + lua_remove(L, -i); /* remove table from the stack */ + return n; +} + + +static int handle_script (lua_State *L, char **argv) { + int status; + const char *fname = argv[0]; + if (strcmp(fname, "-") == 0 && strcmp(argv[-1], "--") != 0) + fname = NULL; /* stdin */ + status = luaL_loadfile(L, fname); + if (status == LUA_OK) { + int n = pushargs(L); /* push arguments to script */ + status = docall(L, n, LUA_MULTRET); + } + return report(L, status); +} + + +/* bits of various argument indicators in 'args' */ +#define has_error 1 /* bad option */ +#define has_i 2 /* -i */ +#define has_v 4 /* -v */ +#define has_e 8 /* -e */ +#define has_E 16 /* -E */ + + +/* +** Traverses all arguments from 'argv', returning a mask with those +** needed before running any Lua code (or an error code if it finds +** any invalid argument). 'first' returns the first not-handled argument +** (either the script name or a bad argument in case of error). +*/ +static int collectargs (char **argv, int *first) { + int args = 0; + int i; + for (i = 1; argv[i] != NULL; i++) { + *first = i; + if (argv[i][0] != '-') /* not an option? */ + return args; /* stop handling options */ + switch (argv[i][1]) { /* else check option */ + case '-': /* '--' */ + if (argv[i][2] != '\0') /* extra characters after '--'? */ + return has_error; /* invalid option */ + *first = i + 1; + return args; + case '\0': /* '-' */ + return args; /* script "name" is '-' */ + case 'E': + if (argv[i][2] != '\0') /* extra characters after 1st? */ + return has_error; /* invalid option */ + args |= has_E; + break; + case 'i': + args |= has_i; /* (-i implies -v) *//* FALLTHROUGH */ + case 'v': + if (argv[i][2] != '\0') /* extra characters after 1st? */ + return has_error; /* invalid option */ + args |= has_v; + break; + case 'e': + args |= has_e; /* FALLTHROUGH */ + case 'l': /* both options need an argument */ + if (argv[i][2] == '\0') { /* no concatenated argument? */ + i++; /* try next 'argv' */ + if (argv[i] == NULL || argv[i][0] == '-') + return has_error; /* no next argument or it is another option */ + } + break; + default: /* invalid option */ + return has_error; + } + } + *first = i; /* no script name */ + return args; +} + + +/* +** Processes options 'e' and 'l', which involve running Lua code. +** Returns 0 if some code raises an error. +*/ +static int runargs (lua_State *L, char **argv, int n) { + int i; + for (i = 1; i < n; i++) { + int option = argv[i][1]; + lua_assert(argv[i][0] == '-'); /* already checked */ + if (option == 'e' || option == 'l') { + int status; + const char *extra = argv[i] + 2; /* both options need an argument */ + if (*extra == '\0') extra = argv[++i]; + lua_assert(extra != NULL); + status = (option == 'e') + ? dostring(L, extra, "=(command line)") + : dolibrary(L, extra); + if (status != LUA_OK) return 0; + } + } + return 1; +} + + +static int handle_luainit (lua_State *L) { + const char *name = "=" LUA_INITVARVERSION; + const char *init = getenv(name + 1); + if (init == NULL) { + name = "=" LUA_INIT_VAR; + init = getenv(name + 1); /* try alternative name */ + } + if (init == NULL) return LUA_OK; + else if (init[0] == '@') + return dofile(L, init+1); + else + return dostring(L, init, name); +} + + +/* +** {================================================================== +** Read-Eval-Print Loop (REPL) +** =================================================================== +*/ + +#if !defined(LUA_PROMPT) +#define LUA_PROMPT "> " +#define LUA_PROMPT2 ">> " +#endif + +#if !defined(LUA_MAXINPUT) +#define LUA_MAXINPUT 512 +#endif + + +/* +** lua_stdin_is_tty detects whether the standard input is a 'tty' (that +** is, whether we're running lua interactively). +*/ +#if !defined(lua_stdin_is_tty) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#include +#define lua_stdin_is_tty() isatty(0) + +#elif defined(LUA_USE_WINDOWS) /* }{ */ + +#include +#include + +#define lua_stdin_is_tty() _isatty(_fileno(stdin)) + +#else /* }{ */ + +/* ISO C definition */ +#define lua_stdin_is_tty() 1 /* assume stdin is a tty */ + +#endif /* } */ + +#endif /* } */ + + +/* +** lua_readline defines how to show a prompt and then read a line from +** the standard input. +** lua_saveline defines how to "save" a read line in a "history". +** lua_freeline defines how to free a line read by lua_readline. +*/ +#if !defined(lua_readline) /* { */ + +#if defined(LUA_USE_READLINE) /* { */ + +#include +#include +#define lua_initreadline(L) ((void)L, rl_readline_name="lua") +#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL) +#define lua_saveline(L,line) ((void)L, add_history(line)) +#define lua_freeline(L,b) ((void)L, free(b)) + +#else /* }{ */ + +#define lua_initreadline(L) ((void)L) +#define lua_readline(L,b,p) \ + ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ + fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ +#define lua_saveline(L,line) { (void)L; (void)line; } +#define lua_freeline(L,b) { (void)L; (void)b; } + +#endif /* } */ + +#endif /* } */ + + +/* +** Returns the string to be used as a prompt by the interpreter. +*/ +static const char *get_prompt (lua_State *L, int firstline) { + const char *p; + lua_getglobal(L, firstline ? "_PROMPT" : "_PROMPT2"); + p = lua_tostring(L, -1); + if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2); + return p; +} + +/* mark in error messages for incomplete statements */ +#define EOFMARK "" +#define marklen (sizeof(EOFMARK)/sizeof(char) - 1) + + +/* +** Check whether 'status' signals a syntax error and the error +** message at the top of the stack ends with the above mark for +** incomplete statements. +*/ +static int incomplete (lua_State *L, int status) { + if (status == LUA_ERRSYNTAX) { + size_t lmsg; + const char *msg = lua_tolstring(L, -1, &lmsg); + if (lmsg >= marklen && strcmp(msg + lmsg - marklen, EOFMARK) == 0) { + lua_pop(L, 1); + return 1; + } + } + return 0; /* else... */ +} + + +/* +** Prompt the user, read a line, and push it into the Lua stack. +*/ +static int pushline (lua_State *L, int firstline) { + char buffer[LUA_MAXINPUT]; + char *b = buffer; + size_t l; + const char *prmt = get_prompt(L, firstline); + int readstatus = lua_readline(L, b, prmt); + if (readstatus == 0) + return 0; /* no input (prompt will be popped by caller) */ + lua_pop(L, 1); /* remove prompt */ + l = strlen(b); + if (l > 0 && b[l-1] == '\n') /* line ends with newline? */ + b[--l] = '\0'; /* remove it */ + if (firstline && b[0] == '=') /* for compatibility with 5.2, ... */ + lua_pushfstring(L, "return %s", b + 1); /* change '=' to 'return' */ + else + lua_pushlstring(L, b, l); + lua_freeline(L, b); + return 1; +} + + +/* +** Try to compile line on the stack as 'return ;'; on return, stack +** has either compiled chunk or original line (if compilation failed). +*/ +static int addreturn (lua_State *L) { + const char *line = lua_tostring(L, -1); /* original line */ + const char *retline = lua_pushfstring(L, "return %s;", line); + int status = luaL_loadbuffer(L, retline, strlen(retline), "=stdin"); + if (status == LUA_OK) { + lua_remove(L, -2); /* remove modified line */ + if (line[0] != '\0') /* non empty? */ + lua_saveline(L, line); /* keep history */ + } + else + lua_pop(L, 2); /* pop result from 'luaL_loadbuffer' and modified line */ + return status; +} + + +/* +** Read multiple lines until a complete Lua statement +*/ +static int multiline (lua_State *L) { + for (;;) { /* repeat until gets a complete statement */ + size_t len; + const char *line = lua_tolstring(L, 1, &len); /* get what it has */ + int status = luaL_loadbuffer(L, line, len, "=stdin"); /* try it */ + if (!incomplete(L, status) || !pushline(L, 0)) { + lua_saveline(L, line); /* keep history */ + return status; /* cannot or should not try to add continuation line */ + } + lua_pushliteral(L, "\n"); /* add newline... */ + lua_insert(L, -2); /* ...between the two lines */ + lua_concat(L, 3); /* join them */ + } +} + + +/* +** Read a line and try to load (compile) it first as an expression (by +** adding "return " in front of it) and second as a statement. Return +** the final status of load/call with the resulting function (if any) +** in the top of the stack. +*/ +static int loadline (lua_State *L) { + int status; + lua_settop(L, 0); + if (!pushline(L, 1)) + return -1; /* no input */ + if ((status = addreturn(L)) != LUA_OK) /* 'return ...' did not work? */ + status = multiline(L); /* try as command, maybe with continuation lines */ + lua_remove(L, 1); /* remove line from the stack */ + lua_assert(lua_gettop(L) == 1); + return status; +} + + +/* +** Prints (calling the Lua 'print' function) any values on the stack +*/ +static void l_print (lua_State *L) { + int n = lua_gettop(L); + if (n > 0) { /* any result to be printed? */ + luaL_checkstack(L, LUA_MINSTACK, "too many results to print"); + lua_getglobal(L, "print"); + lua_insert(L, 1); + if (lua_pcall(L, n, 0, 0) != LUA_OK) + l_message(progname, lua_pushfstring(L, "error calling 'print' (%s)", + lua_tostring(L, -1))); + } +} + + +/* +** Do the REPL: repeatedly read (load) a line, evaluate (call) it, and +** print any results. +*/ +static void doREPL (lua_State *L) { + int status; + const char *oldprogname = progname; + progname = NULL; /* no 'progname' on errors in interactive mode */ + lua_initreadline(L); + while ((status = loadline(L)) != -1) { + if (status == LUA_OK) + status = docall(L, 0, LUA_MULTRET); + if (status == LUA_OK) l_print(L); + else report(L, status); + } + lua_settop(L, 0); /* clear stack */ + lua_writeline(); + progname = oldprogname; +} + +/* }================================================================== */ + + +/* +** Main body of stand-alone interpreter (to be called in protected mode). +** Reads the options and handles them all. +*/ +static int pmain (lua_State *L) { + int argc = (int)lua_tointeger(L, 1); + char **argv = (char **)lua_touserdata(L, 2); + int script; + int args = collectargs(argv, &script); + luaL_checkversion(L); /* check that interpreter has correct version */ + if (argv[0] && argv[0][0]) progname = argv[0]; + if (args == has_error) { /* bad arg? */ + print_usage(argv[script]); /* 'script' has index of bad arg. */ + return 0; + } + if (args & has_v) /* option '-v'? */ + print_version(); + if (args & has_E) { /* option '-E'? */ + lua_pushboolean(L, 1); /* signal for libraries to ignore env. vars. */ + lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); + } + luaL_openlibs(L); /* open standard libraries */ + createargtable(L, argv, argc, script); /* create table 'arg' */ + lua_gc(L, LUA_GCGEN, 0, 0); /* GC in generational mode */ + if (!(args & has_E)) { /* no option '-E'? */ + if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */ + return 0; /* error running LUA_INIT */ + } + if (!runargs(L, argv, script)) /* execute arguments -e and -l */ + return 0; /* something failed */ + if (script < argc && /* execute main script (if there is one) */ + handle_script(L, argv + script) != LUA_OK) + return 0; + if (args & has_i) /* -i option? */ + doREPL(L); /* do read-eval-print loop */ + else if (script == argc && !(args & (has_e | has_v))) { /* no arguments? */ + if (lua_stdin_is_tty()) { /* running in interactive mode? */ + print_version(); + doREPL(L); /* do read-eval-print loop */ + } + else dofile(L, NULL); /* executes stdin as a file */ + } + lua_pushboolean(L, 1); /* signal no errors */ + return 1; +} + + +// int main (int argc, char **argv) { + // int status, result; + // lua_State *L = luaL_newstate(); /* create state */ + // if (L == NULL) { + // l_message(argv[0], "cannot create state: not enough memory"); + // return EXIT_FAILURE; + // } + // lua_pushcfunction(L, &pmain); /* to call 'pmain' in protected mode */ + // lua_pushinteger(L, argc); /* 1st argument */ + // lua_pushlightuserdata(L, argv); /* 2nd argument */ + // status = lua_pcall(L, 2, 1, 0); /* do the call */ + // result = lua_toboolean(L, -1); /* get result */ + // report(L, status); + // lua_close(L); + // return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE; +// } + diff --git a/source/lua/lua.h b/source/lua/lua.h new file mode 100644 index 0000000..52bda88 --- /dev/null +++ b/source/lua/lua.h @@ -0,0 +1,514 @@ +/* +** $Id: lua.h $ +** Lua - A Scripting Language +** Lua.org, PUC-Rio, Brazil (http://www.lua.org) +** See Copyright Notice at the end of this file +*/ + + +#ifndef lua_h +#define lua_h + +#include +#include + + +#include "luaconf.h" + + +#define LUA_VERSION_MAJOR "5" +#define LUA_VERSION_MINOR "4" +#define LUA_VERSION_RELEASE "0" + +#define LUA_VERSION_NUM 504 +#define LUA_VERSION_RELEASE_NUM (LUA_VERSION_NUM * 100 + 0) + +#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR +#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE +#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2018 Lua.org, PUC-Rio" +#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes" + + +/* mark for precompiled code ('Lua') */ +#define LUA_SIGNATURE "\x1bLua" + +/* option for multiple returns in 'lua_pcall' and 'lua_call' */ +#define LUA_MULTRET (-1) + + +/* +** Pseudo-indices +** (-LUAI_MAXSTACK is the minimum valid index; we keep some free empty +** space after that to help overflow detection) +*/ +#define LUA_REGISTRYINDEX (-LUAI_MAXSTACK - 1000) +#define lua_upvalueindex(i) (LUA_REGISTRYINDEX - (i)) + + +/* thread status */ +#define LUA_OK 0 +#define LUA_YIELD 1 +#define LUA_ERRRUN 2 +#define LUA_ERRSYNTAX 3 +#define LUA_ERRMEM 4 +#define LUA_ERRERR 5 + + +typedef struct lua_State lua_State; + + +/* +** basic types +*/ +#define LUA_TNONE (-1) + +#define LUA_TNIL 0 +#define LUA_TBOOLEAN 1 +#define LUA_TLIGHTUSERDATA 2 +#define LUA_TNUMBER 3 +#define LUA_TSTRING 4 +#define LUA_TTABLE 5 +#define LUA_TFUNCTION 6 +#define LUA_TUSERDATA 7 +#define LUA_TTHREAD 8 + +#define LUA_NUMTAGS 9 + + + +/* minimum Lua stack available to a C function */ +#define LUA_MINSTACK 20 + + +/* predefined values in the registry */ +#define LUA_RIDX_MAINTHREAD 1 +#define LUA_RIDX_GLOBALS 2 +#define LUA_RIDX_LAST LUA_RIDX_GLOBALS + + +/* type of numbers in Lua */ +typedef LUA_NUMBER lua_Number; + + +/* type for integer functions */ +typedef LUA_INTEGER lua_Integer; + +/* unsigned integer type */ +typedef LUA_UNSIGNED lua_Unsigned; + +/* type for continuation-function contexts */ +typedef LUA_KCONTEXT lua_KContext; + + +/* +** Type for C functions registered with Lua +*/ +typedef int (*lua_CFunction) (lua_State *L); + +/* +** Type for continuation functions +*/ +typedef int (*lua_KFunction) (lua_State *L, int status, lua_KContext ctx); + + +/* +** Type for functions that read/write blocks when loading/dumping Lua chunks +*/ +typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); + +typedef int (*lua_Writer) (lua_State *L, const void *p, size_t sz, void *ud); + + +/* +** Type for memory-allocation functions +*/ +typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); + + +/* +** Type for warning functions +*/ +typedef void (*lua_WarnFunction) (void *ud, const char *msg, int tocont); + + + + +/* +** generic extra include file +*/ +#if defined(LUA_USER_H) +#include LUA_USER_H +#endif + + +/* +** RCS ident string +*/ +extern const char lua_ident[]; + + +/* +** state manipulation +*/ +LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); +LUA_API void (lua_close) (lua_State *L); +LUA_API lua_State *(lua_newthread) (lua_State *L); +LUA_API int (lua_resetthread) (lua_State *L); + +LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); + + +LUA_API lua_Number (lua_version) (lua_State *L); + + +/* +** basic stack manipulation +*/ +LUA_API int (lua_absindex) (lua_State *L, int idx); +LUA_API int (lua_gettop) (lua_State *L); +LUA_API void (lua_settop) (lua_State *L, int idx); +LUA_API void (lua_pushvalue) (lua_State *L, int idx); +LUA_API void (lua_rotate) (lua_State *L, int idx, int n); +LUA_API void (lua_copy) (lua_State *L, int fromidx, int toidx); +LUA_API int (lua_checkstack) (lua_State *L, int n); + +LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); +LUA_API char *(index2value) (lua_State *L, int idx); + + +/* +** access functions (stack -> C) +*/ + +LUA_API int (lua_isnumber) (lua_State *L, int idx); +LUA_API int (lua_isstring) (lua_State *L, int idx); +LUA_API int (lua_iscfunction) (lua_State *L, int idx); +LUA_API int (lua_isinteger) (lua_State *L, int idx); +LUA_API int (lua_isuserdata) (lua_State *L, int idx); +LUA_API int (lua_type) (lua_State *L, int idx); +LUA_API const char *(lua_typename) (lua_State *L, int tp); + +LUA_API lua_Number (lua_tonumberx) (lua_State *L, int idx, int *isnum); +LUA_API lua_Integer (lua_tointegerx) (lua_State *L, int idx, int *isnum); +LUA_API int (lua_toboolean) (lua_State *L, int idx); +LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); +LUA_API lua_Unsigned (lua_rawlen) (lua_State *L, int idx); +LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); +LUA_API void *(lua_touserdata) (lua_State *L, int idx); +LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); +LUA_API const void *(lua_topointer) (lua_State *L, int idx); + + +/* +** Comparison and arithmetic functions +*/ + +#define LUA_OPADD 0 /* ORDER TM, ORDER OP */ +#define LUA_OPSUB 1 +#define LUA_OPMUL 2 +#define LUA_OPMOD 3 +#define LUA_OPPOW 4 +#define LUA_OPDIV 5 +#define LUA_OPIDIV 6 +#define LUA_OPBAND 7 +#define LUA_OPBOR 8 +#define LUA_OPBXOR 9 +#define LUA_OPSHL 10 +#define LUA_OPSHR 11 +#define LUA_OPUNM 12 +#define LUA_OPBNOT 13 + +LUA_API void (lua_arith) (lua_State *L, int op); + +#define LUA_OPEQ 0 +#define LUA_OPLT 1 +#define LUA_OPLE 2 + +LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); +LUA_API int (lua_compare) (lua_State *L, int idx1, int idx2, int op); + + +/* +** push functions (C -> stack) +*/ +LUA_API void (lua_pushnil) (lua_State *L); +LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n); +LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n); +LUA_API const char *(lua_pushlstring) (lua_State *L, const char *s, size_t len); +LUA_API const char *(lua_pushstring) (lua_State *L, const char *s); +LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, + va_list argp); +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_pushboolean) (lua_State *L, int b); +LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); +LUA_API int (lua_pushthread) (lua_State *L); + + +/* +** get functions (Lua -> stack) +*/ +LUA_API int (lua_getglobal) (lua_State *L, const char *name); +LUA_API int (lua_gettable) (lua_State *L, int idx); +LUA_API int (lua_getfield) (lua_State *L, int idx, const char *k); +LUA_API int (lua_geti) (lua_State *L, int idx, lua_Integer n); +LUA_API int (lua_rawget) (lua_State *L, int idx); +LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n); +LUA_API int (lua_rawgetp) (lua_State *L, int idx, const void *p); + +LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); +LUA_API void *(lua_newuserdatauv) (lua_State *L, size_t sz, int nuvalue); +LUA_API int (lua_getmetatable) (lua_State *L, int objindex); +LUA_API int (lua_getiuservalue) (lua_State *L, int idx, int n); + + +/* +** set functions (stack -> Lua) +*/ +LUA_API void (lua_setglobal) (lua_State *L, const char *name); +LUA_API void (lua_settable) (lua_State *L, int idx); +LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); +LUA_API void (lua_seti) (lua_State *L, int idx, lua_Integer n); +LUA_API void (lua_rawset) (lua_State *L, int idx); +LUA_API void (lua_rawseti) (lua_State *L, int idx, lua_Integer n); +LUA_API void (lua_rawsetp) (lua_State *L, int idx, const void *p); +LUA_API int (lua_setmetatable) (lua_State *L, int objindex); +LUA_API int (lua_setiuservalue) (lua_State *L, int idx, int n); + + +/* +** 'load' and 'call' functions (load and run Lua code) +*/ +LUA_API void (lua_callk) (lua_State *L, int nargs, int nresults, + lua_KContext ctx, lua_KFunction k); +#define lua_call(L,n,r) lua_callk(L, (n), (r), 0, NULL) + +LUA_API int (lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc, + lua_KContext ctx, lua_KFunction k); +#define lua_pcall(L,n,r,f) lua_pcallk(L, (n), (r), (f), 0, NULL) + +LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, + const char *chunkname, const char *mode); + +LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data, int strip); + + +/* +** coroutine functions +*/ +LUA_API int (lua_yieldk) (lua_State *L, int nresults, lua_KContext ctx, + lua_KFunction k); +LUA_API int (lua_resume) (lua_State *L, lua_State *from, int narg, + int *nres); +LUA_API int (lua_status) (lua_State *L); +LUA_API int (lua_isyieldable) (lua_State *L); + +#define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL) + + +/* +** Warning-related functions +*/ +LUA_API void (lua_setwarnf) (lua_State *L, lua_WarnFunction f, void *ud); +LUA_API void (lua_warning) (lua_State *L, const char *msg, int tocont); + + +/* +** garbage-collection function and options +*/ + +#define LUA_GCSTOP 0 +#define LUA_GCRESTART 1 +#define LUA_GCCOLLECT 2 +#define LUA_GCCOUNT 3 +#define LUA_GCCOUNTB 4 +#define LUA_GCSTEP 5 +#define LUA_GCSETPAUSE 6 +#define LUA_GCSETSTEPMUL 7 +#define LUA_GCISRUNNING 9 +#define LUA_GCGEN 10 +#define LUA_GCINC 11 + +LUA_API int (lua_gc) (lua_State *L, int what, ...); + + +/* +** miscellaneous functions +*/ + +LUA_API int (lua_error) (lua_State *L); + +LUA_API int (lua_next) (lua_State *L, int idx); + +LUA_API void (lua_concat) (lua_State *L, int n); +LUA_API void (lua_len) (lua_State *L, int idx); + +LUA_API size_t (lua_stringtonumber) (lua_State *L, const char *s); + +LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); +LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); + +LUA_API void (lua_toclose) (lua_State *L, int idx); + + +/* +** {============================================================== +** some useful macros +** =============================================================== +*/ + +#define lua_getextraspace(L) ((void *)((char *)(L) - LUA_EXTRASPACE)) + +#define lua_tonumber(L,i) lua_tonumberx(L,(i),NULL) +#define lua_tointeger(L,i) lua_tointegerx(L,(i),NULL) + +#define lua_pop(L,n) lua_settop(L, -(n)-1) + +#define lua_newtable(L) lua_createtable(L, 0, 0) + +#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) + +#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) + +#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) +#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) +#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) +#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) +#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) +#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) +#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) +#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) + +#define lua_pushliteral(L, s) lua_pushstring(L, "" s) + +#define lua_pushglobaltable(L) \ + ((void)lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS)) + +#define lua_tostring(L,i) lua_tolstring(L, (i), NULL) + + +#define lua_insert(L,idx) lua_rotate(L, (idx), 1) + +#define lua_remove(L,idx) (lua_rotate(L, (idx), -1), lua_pop(L, 1)) + +#define lua_replace(L,idx) (lua_copy(L, -1, (idx)), lua_pop(L, 1)) + +/* }============================================================== */ + + +/* +** {============================================================== +** compatibility macros +** =============================================================== +*/ +#if defined(LUA_COMPAT_APIINTCASTS) + +#define lua_pushunsigned(L,n) lua_pushinteger(L, (lua_Integer)(n)) +#define lua_tounsignedx(L,i,is) ((lua_Unsigned)lua_tointegerx(L,i,is)) +#define lua_tounsigned(L,i) lua_tounsignedx(L,(i),NULL) + +#endif + +#define lua_newuserdata(L,s) lua_newuserdatauv(L,s,1) +#define lua_getuservalue(L,idx) lua_getiuservalue(L,idx,1) +#define lua_setuservalue(L,idx) lua_setiuservalue(L,idx,1) + +/* }============================================================== */ + +/* +** {====================================================================== +** Debug API +** ======================================================================= +*/ + + +/* +** Event codes +*/ +#define LUA_HOOKCALL 0 +#define LUA_HOOKRET 1 +#define LUA_HOOKLINE 2 +#define LUA_HOOKCOUNT 3 +#define LUA_HOOKTAILCALL 4 + + +/* +** Event masks +*/ +#define LUA_MASKCALL (1 << LUA_HOOKCALL) +#define LUA_MASKRET (1 << LUA_HOOKRET) +#define LUA_MASKLINE (1 << LUA_HOOKLINE) +#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) + +typedef struct lua_Debug lua_Debug; /* activation record */ + + +/* Functions to be called by the debugger in specific events */ +typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); + + +LUA_API int (lua_getstack) (lua_State *L, int level, lua_Debug *ar); +LUA_API int (lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar); +LUA_API const char *(lua_getlocal) (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *(lua_setlocal) (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *(lua_getupvalue) (lua_State *L, int funcindex, int n); +LUA_API const char *(lua_setupvalue) (lua_State *L, int funcindex, int n); + +LUA_API void *(lua_upvalueid) (lua_State *L, int fidx, int n); +LUA_API void (lua_upvaluejoin) (lua_State *L, int fidx1, int n1, + int fidx2, int n2); + +LUA_API void (lua_sethook) (lua_State *L, lua_Hook func, int mask, int count); +LUA_API lua_Hook (lua_gethook) (lua_State *L); +LUA_API int (lua_gethookmask) (lua_State *L); +LUA_API int (lua_gethookcount) (lua_State *L); + + +struct lua_Debug { + int event; + const char *name; /* (n) */ + const char *namewhat; /* (n) 'global', 'local', 'field', 'method' */ + const char *what; /* (S) 'Lua', 'C', 'main', 'tail' */ + const char *source; /* (S) */ + int currentline; /* (l) */ + int linedefined; /* (S) */ + int lastlinedefined; /* (S) */ + unsigned char nups; /* (u) number of upvalues */ + unsigned char nparams;/* (u) number of parameters */ + char isvararg; /* (u) */ + char istailcall; /* (t) */ + unsigned short ftransfer; /* (r) index of first value transferred */ + unsigned short ntransfer; /* (r) number of transferred values */ + char short_src[LUA_IDSIZE]; /* (S) */ + /* private part */ + struct CallInfo *i_ci; /* active function */ +}; + +/* }====================================================================== */ + + +/****************************************************************************** +* Copyright (C) 1994-2018 Lua.org, PUC-Rio. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +******************************************************************************/ + + +#endif diff --git a/source/lua/lua.o b/source/lua/lua.o new file mode 100644 index 0000000000000000000000000000000000000000..40c50c633908339f3a2b4575042f9a989ab1419f GIT binary patch literal 944 zcmbW0%}&EG41nEj{2jR=aVe)UX|qzaRe}SGG;O;eZhL^XR6>Gwh^A;<;B|OCo&fAN zQM0tW%u-_evmHln`n`Bq_B;=acyJGmXDGm%1!aXLoWU``YCga7uh(&ztJ0t06vZSg zD=+v8LKIUBf>9mtZ$uD^P~0}hwk&QlfZxAXfIz?VX3TqC>BRec_|YCdX!F-H!UO<| z&rC%zY4u*~XJe^!s{o%O6#>RY0hnyEEX|4K8-X6|HU6>V>B{g6^lX&qWWrdmEz(6U8pC$u5iroYiMi`l6kwqx0*&Y*KL t+`DsZs1p|^QERuJ{jS%x)%ibK^Ndbtv1Ylb75y{a{e9htYix1*{{unGF9`qu literal 0 HcmV?d00001 diff --git a/source/lua/luaconf.h b/source/lua/luaconf.h new file mode 100644 index 0000000..f81d007 --- /dev/null +++ b/source/lua/luaconf.h @@ -0,0 +1,734 @@ +/* +** $Id: luaconf.h $ +** Configuration file for Lua +** See Copyright Notice in lua.h +*/ + + +#ifndef luaconf_h +#define luaconf_h + +#include +#include + + +/* +** =================================================================== +** Search for "@@" to find all configurable definitions. +** =================================================================== +*/ + + +/* +** {==================================================================== +** System Configuration: macros to adapt (if needed) Lua to some +** particular platform, for instance compiling it with 32-bit numbers or +** restricting it to C89. +** ===================================================================== +*/ + +/* +@@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. You +** can also define LUA_32BITS in the make file, but changing here you +** ensure that all software connected to Lua will be compiled with the +** same configuration. +*/ +/* #define LUA_32BITS */ + + +/* +@@ LUA_USE_C89 controls the use of non-ISO-C89 features. +** Define it if you want Lua to avoid the use of a few C99 features +** or Windows-specific features on Windows. +*/ +/* #define LUA_USE_C89 */ + + +/* +** By default, Lua on Windows use (some) specific Windows features +*/ +#if !defined(LUA_USE_C89) && defined(_WIN32) && !defined(_WIN32_WCE) +#define LUA_USE_WINDOWS /* enable goodies for regular Windows */ +#endif + + +#if defined(LUA_USE_WINDOWS) +#define LUA_DL_DLL /* enable support for DLL */ +#define LUA_USE_C89 /* broadly, Windows is C89 */ +#endif + + +#if defined(LUA_USE_LINUX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ +#endif + + +#if defined(LUA_USE_MACOSX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* MacOS does not need -ldl */ +#endif + + +/* +@@ LUA_C89_NUMBERS ensures that Lua uses the largest types available for +** C89 ('long' and 'double'); Windows always has '__int64', so it does +** not need to use this case. +*/ +#if defined(LUA_USE_C89) && !defined(LUA_USE_WINDOWS) +#define LUA_C89_NUMBERS +#endif + + + +/* +@@ LUAI_BITSINT defines the (minimum) number of bits in an 'int'. +*/ +/* avoid undefined shifts */ +#if ((INT_MAX >> 15) >> 15) >= 1 +#define LUAI_BITSINT 32 +#else +/* 'int' always must have at least 16 bits */ +#define LUAI_BITSINT 16 +#endif + + +/* +@@ LUA_INT_TYPE defines the type for Lua integers. +@@ LUA_FLOAT_TYPE defines the type for Lua floats. +** Lua should work fine with any mix of these options (if supported +** by your C compiler). The usual configurations are 64-bit integers +** and 'double' (the default), 32-bit integers and 'float' (for +** restricted platforms), and 'long'/'double' (for C compilers not +** compliant with C99, which may not have support for 'long long'). +*/ + +/* predefined options for LUA_INT_TYPE */ +#define LUA_INT_INT 1 +#define LUA_INT_LONG 2 +#define LUA_INT_LONGLONG 3 + +/* predefined options for LUA_FLOAT_TYPE */ +#define LUA_FLOAT_FLOAT 1 +#define LUA_FLOAT_DOUBLE 2 +#define LUA_FLOAT_LONGDOUBLE 3 + +#if defined(LUA_32BITS) /* { */ +/* +** 32-bit integers and 'float' +*/ +#if LUAI_BITSINT >= 32 /* use 'int' if big enough */ +#define LUA_INT_TYPE LUA_INT_INT +#else /* otherwise use 'long' */ +#define LUA_INT_TYPE LUA_INT_LONGLONG +#endif +#define LUA_FLOAT_TYPE LUA_FLOAT_FLOAT + +#elif defined(LUA_C89_NUMBERS) /* }{ */ +/* +** largest types available for C89 ('long' and 'double') +*/ +//#define LUA_INT_TYPE LUA_INT_INT +#define LUA_INT_TYPE LUA_INT_LONGLONG +#define LUA_FLOAT_TYPE LUA_FLOAT_FLOAT + +#endif /* } */ + + +/* +** default configuration for 64-bit Lua ('long long' and 'double') +*/ +#if !defined(LUA_INT_TYPE) +//#define LUA_INT_TYPE LUA_INT_INT +#define LUA_INT_TYPE LUA_INT_LONGLONG +#endif + +#if !defined(LUA_FLOAT_TYPE) +#define LUA_FLOAT_TYPE LUA_FLOAT_FLOAT +#endif + +/* }================================================================== */ + + + + +/* +** {================================================================== +** Configuration for Paths. +** =================================================================== +*/ + +/* +** LUA_PATH_SEP is the character that separates templates in a path. +** LUA_PATH_MARK is the string that marks the substitution points in a +** template. +** LUA_EXEC_DIR in a Windows path is replaced by the executable's +** directory. +*/ +#define LUA_PATH_SEP ";" +#define LUA_PATH_MARK "?" +#define LUA_EXEC_DIR "!" + + +/* +@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for +** Lua libraries. +@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for +** C libraries. +** CHANGE them if your machine has a non-conventional directory +** hierarchy or if you want to install your libraries in +** non-conventional directories. +*/ +#define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR +#if defined(_WIN32) /* { */ +/* +** In Windows, any exclamation mark ('!') in the path is replaced by the +** path of the directory of the executable file of the current process. +*/ +#define LUA_LDIR "!\\lua\\" +#define LUA_CDIR "!\\" +#define LUA_SHRDIR "!\\..\\share\\lua\\" LUA_VDIR "\\" +#define LUA_PATH_DEFAULT \ + LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" \ + LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \ + ".\\?.lua;" ".\\?\\init.lua" +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.dll;" \ + LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \ + LUA_CDIR"loadall.dll;" ".\\?.dll" + +#else /* }{ */ + +#define LUA_ROOT "/usr/local/" +#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR "/" +#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR "/" +#define LUA_PATH_DEFAULT \ + LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \ + "./?.lua;" "./?/init.lua" +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so" +#endif /* } */ + + +/* +@@ LUA_DIRSEP is the directory separator (for submodules). +** CHANGE it if your machine does not use "/" as the directory separator +** and is not Windows. (On Windows Lua automatically uses "\".) +*/ +#if defined(_WIN32) +#define LUA_DIRSEP "\\" +#else +#define LUA_DIRSEP "/" +#endif + +/* }================================================================== */ + + +/* +** {================================================================== +** Marks for exported symbols in the C code +** =================================================================== +*/ + +/* +@@ LUA_API is a mark for all core API functions. +@@ LUALIB_API is a mark for all auxiliary library functions. +@@ LUAMOD_API is a mark for all standard library opening functions. +** CHANGE them if you need to define those functions in some special way. +** For instance, if you want to create one Windows DLL with the core and +** the libraries, you may want to use the following definition (define +** LUA_BUILD_AS_DLL to get it). +*/ +#if defined(LUA_BUILD_AS_DLL) /* { */ + +#if defined(LUA_CORE) || defined(LUA_LIB) /* { */ +#define LUA_API __declspec(dllexport) +#else /* }{ */ +#define LUA_API __declspec(dllimport) +#endif /* } */ + +#else /* }{ */ + +#define LUA_API extern + +#endif /* } */ + + +/* +** More often than not the libs go together with the core. +*/ +#define LUALIB_API LUA_API +#define LUAMOD_API LUA_API + + +/* +@@ LUAI_FUNC is a mark for all extern functions that are not to be +** exported to outside modules. +@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables, +** none of which to be exported to outside modules (LUAI_DDEF for +** definitions and LUAI_DDEC for declarations). +** CHANGE them if you need to mark them in some special way. Elf/gcc +** (versions 3.2 and later) mark them as "hidden" to optimize access +** when Lua is compiled as a shared library. Not all elf targets support +** this attribute. Unfortunately, gcc does not offer a way to check +** whether the target offers that support, and those without support +** give a warning about it. To avoid these warnings, change to the +** default definition. +*/ +#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ + defined(__ELF__) /* { */ +#define LUAI_FUNC __attribute__((visibility("internal"))) extern +#else /* }{ */ +#define LUAI_FUNC extern +#endif /* } */ + +#define LUAI_DDEC(dec) LUAI_FUNC dec +#define LUAI_DDEF /* empty */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Compatibility with previous versions +** =================================================================== +*/ + +/* +@@ LUA_COMPAT_5_3 controls other macros for compatibility with Lua 5.3. +** You can define it to get all options, or change specific options +** to fit your specific needs. +*/ +#if defined(LUA_COMPAT_5_3) /* { */ + +/* +@@ LUA_COMPAT_MATHLIB controls the presence of several deprecated +** functions in the mathematical library. +** (These functions were already officially removed in 5.3, but +** nevertheless they are available by default there.) +*/ +#define LUA_COMPAT_MATHLIB + +/* +@@ LUA_COMPAT_APIINTCASTS controls the presence of macros for +** manipulating other integer types (lua_pushunsigned, lua_tounsigned, +** luaL_checkint, luaL_checklong, etc.) +*/ +#define LUA_COMPAT_APIINTCASTS + +/* +@@ LUA_COMPAT_LT_LE controls the emulation of the '__le' metamethod +** using '__lt'. +*/ +#define LUA_COMPAT_LT_LE + +#endif /* } */ + + + +/* +@@ The following macros supply trivial compatibility for some +** changes in the API. The macros themselves document how to +** change your code to avoid using them. +*/ +#define lua_strlen(L,i) lua_rawlen(L, (i)) + +#define lua_objlen(L,i) lua_rawlen(L, (i)) + +#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) +#define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT) + +/* }================================================================== */ + + + +/* +** {================================================================== +** Configuration for Numbers. +** Change these definitions if no predefined LUA_FLOAT_* / LUA_INT_* +** satisfy your needs. +** =================================================================== +*/ + +/* +@@ LUA_NUMBER is the floating-point type used by Lua. +@@ LUAI_UACNUMBER is the result of a 'default argument promotion' +@@ over a floating number. +@@ l_mathlim(x) corrects limit name 'x' to the proper float type +** by prefixing it with one of FLT/DBL/LDBL. +@@ LUA_NUMBER_FRMLEN is the length modifier for writing floats. +@@ LUA_NUMBER_FMT is the format for writing floats. +@@ lua_number2str converts a float to a string. +@@ l_mathop allows the addition of an 'l' or 'f' to all math operations. +@@ l_floor takes the floor of a float. +@@ lua_str2number converts a decimal numeric string to a number. +*/ + + +/* The following definitions are good for most cases here */ + +#define l_floor(x) (l_mathop(floor)(x)) + +#define lua_number2str(s,sz,n) \ + l_sprintf((s), sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)(n)) + +/* +@@ lua_numbertointeger converts a float number with an integral value +** to an integer, or returns 0 if float is not within the range of +** a lua_Integer. (The range comparisons are tricky because of +** rounding. The tests here assume a two-complement representation, +** where MININTEGER always has an exact representation as a float; +** MAXINTEGER may not have one, and therefore its conversion to float +** may have an ill-defined value.) +*/ +#define lua_numbertointeger(n,p) \ + ((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \ + (n) < -(LUA_NUMBER)(LUA_MININTEGER) && \ + (*(p) = (LUA_INTEGER)(n), 1)) + + +/* now the variable definitions */ + +#if LUA_FLOAT_TYPE == LUA_FLOAT_FLOAT /* { single float */ + +#define LUA_NUMBER float + +#define l_mathlim(n) (FLT_##n) + +#define LUAI_UACNUMBER double + +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.7g" + +#define l_mathop(op) op##f + +#define lua_str2number(s,p) strtof((s), (p)) + + +#elif LUA_FLOAT_TYPE == LUA_FLOAT_LONGDOUBLE /* }{ long double */ + +#define LUA_NUMBER long double + +#define l_mathlim(n) (LDBL_##n) + +#define LUAI_UACNUMBER long double + +#define LUA_NUMBER_FRMLEN "L" +#define LUA_NUMBER_FMT "%.19Lg" + +#define l_mathop(op) op##l + +#define lua_str2number(s,p) strtold((s), (p)) + +#elif LUA_FLOAT_TYPE == LUA_FLOAT_DOUBLE /* }{ double */ + +#define LUA_NUMBER double + +#define l_mathlim(n) (DBL_##n) + +#define LUAI_UACNUMBER double + +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.14g" + +#define l_mathop(op) op + +#define lua_str2number(s,p) strtod((s), (p)) + +#else /* }{ */ + +#error "numeric float type not defined" + +#endif /* } */ + + + +/* +@@ LUA_INTEGER is the integer type used by Lua. +** +@@ LUA_UNSIGNED is the unsigned version of LUA_INTEGER. +** +@@ LUAI_UACINT is the result of a 'default argument promotion' +@@ over a lUA_INTEGER. +@@ LUA_INTEGER_FRMLEN is the length modifier for reading/writing integers. +@@ LUA_INTEGER_FMT is the format for writing integers. +@@ LUA_MAXINTEGER is the maximum value for a LUA_INTEGER. +@@ LUA_MININTEGER is the minimum value for a LUA_INTEGER. +@@ LUA_MAXUNSIGNED is the maximum value for a LUA_UNSIGNED. +@@ LUA_UNSIGNEDBITS is the number of bits in a LUA_UNSIGNED. +@@ lua_integer2str converts an integer to a string. +*/ + + +/* The following definitions are good for most cases here */ + +#define LUA_INTEGER_FMT "%" LUA_INTEGER_FRMLEN "d" + +#define LUAI_UACINT LUA_INTEGER + +#define lua_integer2str(s,sz,n) \ + l_sprintf((s), sz, LUA_INTEGER_FMT, (LUAI_UACINT)(n)) + +/* +** use LUAI_UACINT here to avoid problems with promotions (which +** can turn a comparison between unsigneds into a signed comparison) +*/ +#define LUA_UNSIGNED unsigned LUAI_UACINT + +#define LUA_MAXUNSIGNED (~(lua_Unsigned)0) + +#define LUA_UNSIGNEDBITS (sizeof(LUA_UNSIGNED) * CHAR_BIT) + + +/* now the variable definitions */ + +#if LUA_INT_TYPE == LUA_INT_INT /* { int */ + +#define LUA_INTEGER int +#define LUA_INTEGER_FRMLEN "" + +#define LUA_MAXINTEGER INT_MAX +#define LUA_MININTEGER INT_MIN + +#elif LUA_INT_TYPE == LUA_INT_LONG /* }{ long */ + +#define LUA_INTEGER long +#define LUA_INTEGER_FRMLEN "l" + +#define LUA_MAXINTEGER LONG_MAX +#define LUA_MININTEGER LONG_MIN + +#elif LUA_INT_TYPE == LUA_INT_LONGLONG /* }{ long long */ + +/* use presence of macro LLONG_MAX as proxy for C99 compliance */ +#if defined(LLONG_MAX) /* { */ +/* use ISO C99 stuff */ + +#define LUA_INTEGER long long +#define LUA_INTEGER_FRMLEN "ll" + +#define LUA_MAXINTEGER LLONG_MAX +#define LUA_MININTEGER LLONG_MIN + +#elif defined(LUA_USE_WINDOWS) /* }{ */ +/* in Windows, can use specific Windows types */ + +#define LUA_INTEGER __int64 +#define LUA_INTEGER_FRMLEN "I64" + +#define LUA_MAXINTEGER _I64_MAX +#define LUA_MININTEGER _I64_MIN + +#else /* }{ */ + +#error "Compiler does not support 'long long'. Use option '-DLUA_32BITS' \ + or '-DLUA_C89_NUMBERS' (see file 'luaconf.h' for details)" + +#endif /* } */ + +#else /* }{ */ + +#error "numeric integer type not defined" + +#endif /* } */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Dependencies with C99 and other C details +** =================================================================== +*/ + +/* +@@ l_sprintf is equivalent to 'snprintf' or 'sprintf' in C89. +** (All uses in Lua have only one format item.) +*/ +#if !defined(LUA_USE_C89) +#define l_sprintf(s,sz,f,i) snprintf(s,sz,f,i) +#else +#define l_sprintf(s,sz,f,i) ((void)(sz), sprintf(s,f,i)) +#endif + + +/* +@@ lua_strx2number converts a hexadecimal numeric string to a number. +** In C99, 'strtod' does that conversion. Otherwise, you can +** leave 'lua_strx2number' undefined and Lua will provide its own +** implementation. +*/ +#if !defined(LUA_USE_C89) +#define lua_strx2number(s,p) lua_str2number(s,p) +#endif + + +/* +@@ lua_pointer2str converts a pointer to a readable string in a +** non-specified way. +*/ +#define lua_pointer2str(buff,sz,p) l_sprintf(buff,sz,"%p",p) + + +/* +@@ lua_number2strx converts a float to a hexadecimal numeric string. +** In C99, 'sprintf' (with format specifiers '%a'/'%A') does that. +** Otherwise, you can leave 'lua_number2strx' undefined and Lua will +** provide its own implementation. +*/ +#if !defined(LUA_USE_C89) +#define lua_number2strx(L,b,sz,f,n) \ + ((void)L, l_sprintf(b,sz,f,(LUAI_UACNUMBER)(n))) +#endif + + +/* +** 'strtof' and 'opf' variants for math functions are not valid in +** C89. Otherwise, the macro 'HUGE_VALF' is a good proxy for testing the +** availability of these variants. ('math.h' is already included in +** all files that use these macros.) +*/ +#if defined(LUA_USE_C89) || (defined(HUGE_VAL) && !defined(HUGE_VALF)) +#undef l_mathop /* variants not available */ +#undef lua_str2number +#define l_mathop(op) (lua_Number)op /* no variant */ +#define lua_str2number(s,p) ((lua_Number)strtod((s), (p))) +#endif + + +/* +@@ LUA_KCONTEXT is the type of the context ('ctx') for continuation +** functions. It must be a numerical type; Lua will use 'intptr_t' if +** available, otherwise it will use 'ptrdiff_t' (the nearest thing to +** 'intptr_t' in C89) +*/ +#define LUA_KCONTEXT ptrdiff_t + +#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \ + __STDC_VERSION__ >= 199901L +#include +#if defined(INTPTR_MAX) /* even in C99 this type is optional */ +#undef LUA_KCONTEXT +#define LUA_KCONTEXT intptr_t +#endif +#endif + + +/* +@@ lua_getlocaledecpoint gets the locale "radix character" (decimal point). +** Change that if you do not want to use C locales. (Code using this +** macro must include header 'locale.h'.) +*/ +#if !defined(lua_getlocaledecpoint) +#define lua_getlocaledecpoint() (localeconv()->decimal_point[0]) +#endif + +/* }================================================================== */ + + +/* +** {================================================================== +** Language Variations +** ===================================================================== +*/ + +/* +@@ LUA_NOCVTN2S/LUA_NOCVTS2N control how Lua performs some +** coercions. Define LUA_NOCVTN2S to turn off automatic coercion from +** numbers to strings. Define LUA_NOCVTS2N to turn off automatic +** coercion from strings to numbers. +*/ +/* #define LUA_NOCVTN2S */ +/* #define LUA_NOCVTS2N */ + + +/* +@@ LUA_USE_APICHECK turns on several consistency checks on the C API. +** Define it as a help when debugging C code. +*/ +#if defined(LUA_USE_APICHECK) +#include +#define luai_apicheck(l,e) assert(e) +#endif + +/* }================================================================== */ + + +/* +** {================================================================== +** Macros that affect the API and must be stable (that is, must be the +** same when you compile Lua and when you compile code that links to +** Lua). You probably do not want/need to change them. +** ===================================================================== +*/ + +/* +@@ LUAI_MAXSTACK limits the size of the Lua stack. +** CHANGE it if you need a different limit. This limit is arbitrary; +** its only purpose is to stop Lua from consuming unlimited stack +** space (and to reserve some numbers for pseudo-indices). +** (It must fit into max(size_t)/32.) +*/ +#if LUAI_BITSINT >= 32 +#define LUAI_MAXSTACK 1000000 +#else +#define LUAI_MAXSTACK 15000 +#endif + + +/* +@@ LUA_EXTRASPACE defines the size of a raw memory area associated with +** a Lua state with very fast access. +** CHANGE it if you need a different size. +*/ +#define LUA_EXTRASPACE (sizeof(void *)) + + +/* +@@ LUA_IDSIZE gives the maximum size for the description of the source +@@ of a function in debug information. +** CHANGE it if you want a different size. +*/ +#define LUA_IDSIZE 60 + + +/* +@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. +** CHANGE it if it uses too much C-stack space. (For long double, +** 'string.format("%.99f", -1e4932)' needs 5052 bytes, so a +** smaller buffer would force a memory allocation for each call to +** 'string.format'.) +*/ +#if LUA_FLOAT_TYPE == LUA_FLOAT_LONGDOUBLE +#define LUAL_BUFFERSIZE 8192 +#else +#define LUAL_BUFFERSIZE ((int)(16 * sizeof(void*) * sizeof(lua_Number))) +#endif + +/* +@@ LUAI_MAXALIGN defines fields that, when used in a union, ensure +** maximum alignment for the other items in that union. +*/ +#define LUAI_MAXALIGN lua_Number n; double u; void *s; lua_Integer i; long l + +/* }================================================================== */ + + + + + +/* =================================================================== */ + +/* +** Local configuration. You can use this space to add your redefinitions +** without modifying the main part of the file. +*/ + + + + + +#endif + diff --git a/source/lua/lualib.h b/source/lua/lualib.h new file mode 100644 index 0000000..eb08b53 --- /dev/null +++ b/source/lua/lualib.h @@ -0,0 +1,58 @@ +/* +** $Id: lualib.h $ +** Lua standard libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lualib_h +#define lualib_h + +#include "lua.h" + + +/* version suffix for environment variable names */ +#define LUA_VERSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR + + +LUAMOD_API int (luaopen_base) (lua_State *L); + +#define LUA_COLIBNAME "coroutine" +LUAMOD_API int (luaopen_coroutine) (lua_State *L); + +#define LUA_TABLIBNAME "table" +LUAMOD_API int (luaopen_table) (lua_State *L); + +#define LUA_IOLIBNAME "io" +LUAMOD_API int (luaopen_io) (lua_State *L); + +#define LUA_OSLIBNAME "os" +LUAMOD_API int (luaopen_os) (lua_State *L); + +#define LUA_STRLIBNAME "string" +LUAMOD_API int (luaopen_string) (lua_State *L); + +#define LUA_UTF8LIBNAME "utf8" +LUAMOD_API int (luaopen_utf8) (lua_State *L); + +#define LUA_MATHLIBNAME "math" +LUAMOD_API int (luaopen_math) (lua_State *L); + +#define LUA_DBLIBNAME "debug" +LUAMOD_API int (luaopen_debug) (lua_State *L); + +#define LUA_LOADLIBNAME "package" +LUAMOD_API int (luaopen_package) (lua_State *L); + + +/* open all previous libraries */ +LUALIB_API void (luaL_openlibs) (lua_State *L); + + + +#if !defined(lua_assert) +#define lua_assert(x) ((void)0) +#endif + + +#endif diff --git a/source/lua/lundump.c b/source/lua/lundump.c new file mode 100644 index 0000000..00ff6de --- /dev/null +++ b/source/lua/lundump.c @@ -0,0 +1,307 @@ +/* +** $Id: lundump.c $ +** load precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#define lundump_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstring.h" +#include "lundump.h" +#include "lzio.h" + + +#if !defined(luai_verifycode) +#define luai_verifycode(L,b,f) /* empty */ +#endif + + +typedef struct { + lua_State *L; + ZIO *Z; + const char *name; +} LoadState; + + +static l_noret error (LoadState *S, const char *why) { + luaO_pushfstring(S->L, "%s: %s precompiled chunk", S->name, why); + luaD_throw(S->L, LUA_ERRSYNTAX); +} + + +/* +** All high-level loads go through LoadVector; you can change it to +** adapt to the endianness of the input +*/ +#define LoadVector(S,b,n) LoadBlock(S,b,(n)*sizeof((b)[0])) + +static void LoadBlock (LoadState *S, void *b, size_t size) { + if (luaZ_read(S->Z, b, size) != 0) + error(S, "truncated"); +} + + +#define LoadVar(S,x) LoadVector(S,&x,1) + + +static lu_byte LoadByte (LoadState *S) { + int b = zgetc(S->Z); + if (b == EOZ) + error(S, "truncated"); + return cast_byte(b); +} + + +static size_t LoadSize (LoadState *S) { + size_t x = 0; + int b; + do { + b = LoadByte(S); + x = (x << 7) | (b & 0x7f); + } while ((b & 0x80) == 0); + return x; +} + + +static int LoadInt (LoadState *S) { + return cast_int(LoadSize(S)); +} + + +static lua_Number LoadNumber (LoadState *S) { + lua_Number x; + LoadVar(S, x); + return x; +} + + +static lua_Integer LoadInteger (LoadState *S) { + lua_Integer x; + LoadVar(S, x); + return x; +} + + +/* +** Load a nullable string +*/ +static TString *LoadStringN (LoadState *S) { + size_t size = LoadSize(S); + if (size == 0) + return NULL; + else if (--size <= LUAI_MAXSHORTLEN) { /* short string? */ + char buff[LUAI_MAXSHORTLEN]; + LoadVector(S, buff, size); + return luaS_newlstr(S->L, buff, size); + } + else { /* long string */ + TString *ts = luaS_createlngstrobj(S->L, size); + LoadVector(S, getstr(ts), size); /* load directly in final place */ + return ts; + } +} + + +/* +** Load a non-nullable string. +*/ +static TString *LoadString (LoadState *S) { + TString *st = LoadStringN(S); + if (st == NULL) + error(S, "bad format for constant string"); + return st; +} + + +static void LoadCode (LoadState *S, Proto *f) { + int n = LoadInt(S); + f->code = luaM_newvectorchecked(S->L, n, Instruction); + f->sizecode = n; + LoadVector(S, f->code, n); +} + + +static void LoadFunction(LoadState *S, Proto *f, TString *psource); + + +static void LoadConstants (LoadState *S, Proto *f) { + int i; + int n = LoadInt(S); + f->k = luaM_newvectorchecked(S->L, n, TValue); + f->sizek = n; + for (i = 0; i < n; i++) + setnilvalue(&f->k[i]); + for (i = 0; i < n; i++) { + TValue *o = &f->k[i]; + int t = LoadByte(S); + switch (t) { + case LUA_TNIL: + setnilvalue(o); + break; + case LUA_TBOOLEAN: + setbvalue(o, LoadByte(S)); + break; + case LUA_TNUMFLT: + setfltvalue(o, LoadNumber(S)); + break; + case LUA_TNUMINT: + setivalue(o, LoadInteger(S)); + break; + case LUA_TSHRSTR: + case LUA_TLNGSTR: + setsvalue2n(S->L, o, LoadString(S)); + break; + default: lua_assert(0); + } + } +} + + +static void LoadProtos (LoadState *S, Proto *f) { + int i; + int n = LoadInt(S); + f->p = luaM_newvectorchecked(S->L, n, Proto *); + f->sizep = n; + for (i = 0; i < n; i++) + f->p[i] = NULL; + for (i = 0; i < n; i++) { + f->p[i] = luaF_newproto(S->L); + LoadFunction(S, f->p[i], f->source); + } +} + + +static void LoadUpvalues (LoadState *S, Proto *f) { + int i, n; + n = LoadInt(S); + f->upvalues = luaM_newvectorchecked(S->L, n, Upvaldesc); + f->sizeupvalues = n; + for (i = 0; i < n; i++) + f->upvalues[i].name = NULL; + for (i = 0; i < n; i++) { + f->upvalues[i].instack = LoadByte(S); + f->upvalues[i].idx = LoadByte(S); + } +} + + +static void LoadDebug (LoadState *S, Proto *f) { + int i, n; + n = LoadInt(S); + f->lineinfo = luaM_newvectorchecked(S->L, n, ls_byte); + f->sizelineinfo = n; + LoadVector(S, f->lineinfo, n); + n = LoadInt(S); + f->abslineinfo = luaM_newvectorchecked(S->L, n, AbsLineInfo); + f->sizeabslineinfo = n; + for (i = 0; i < n; i++) { + f->abslineinfo[i].pc = LoadInt(S); + f->abslineinfo[i].line = LoadInt(S); + } + n = LoadInt(S); + f->locvars = luaM_newvectorchecked(S->L, n, LocVar); + f->sizelocvars = n; + for (i = 0; i < n; i++) + f->locvars[i].varname = NULL; + for (i = 0; i < n; i++) { + f->locvars[i].varname = LoadStringN(S); + f->locvars[i].startpc = LoadInt(S); + f->locvars[i].endpc = LoadInt(S); + } + n = LoadInt(S); + for (i = 0; i < n; i++) + f->upvalues[i].name = LoadStringN(S); +} + + +static void LoadFunction (LoadState *S, Proto *f, TString *psource) { + f->source = LoadStringN(S); + if (f->source == NULL) /* no source in dump? */ + f->source = psource; /* reuse parent's source */ + f->linedefined = LoadInt(S); + f->lastlinedefined = LoadInt(S); + f->numparams = LoadByte(S); + f->is_vararg = LoadByte(S); + f->maxstacksize = LoadByte(S); + LoadCode(S, f); + LoadConstants(S, f); + LoadUpvalues(S, f); + LoadProtos(S, f); + LoadDebug(S, f); +} + + +static void checkliteral (LoadState *S, const char *s, const char *msg) { + char buff[sizeof(LUA_SIGNATURE) + sizeof(LUAC_DATA)]; /* larger than both */ + size_t len = strlen(s); + LoadVector(S, buff, len); + if (memcmp(s, buff, len) != 0) + error(S, msg); +} + + +static void fchecksize (LoadState *S, size_t size, const char *tname) { + if (LoadByte(S) != size) + error(S, luaO_pushfstring(S->L, "%s size mismatch in", tname)); +} + + +#define checksize(S,t) fchecksize(S,sizeof(t),#t) + +static void checkHeader (LoadState *S) { + checkliteral(S, LUA_SIGNATURE + 1, "not a"); /* 1st char already checked */ + if (LoadByte(S) != LUAC_VERSION) + error(S, "version mismatch in"); + if (LoadByte(S) != LUAC_FORMAT) + error(S, "format mismatch in"); + checkliteral(S, LUAC_DATA, "corrupted"); + checksize(S, int); + checksize(S, size_t); + checksize(S, Instruction); + checksize(S, lua_Integer); + checksize(S, lua_Number); + if (LoadInteger(S) != LUAC_INT) + error(S, "endianness mismatch in"); + if (LoadNumber(S) != LUAC_NUM) + error(S, "float format mismatch in"); +} + + +/* +** load precompiled chunk +*/ +LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) { + LoadState S; + LClosure *cl; + if (*name == '@' || *name == '=') + S.name = name + 1; + else if (*name == LUA_SIGNATURE[0]) + S.name = "binary string"; + else + S.name = name; + S.L = L; + S.Z = Z; + checkHeader(&S); + cl = luaF_newLclosure(L, LoadByte(&S)); + setclLvalue2s(L, L->top, cl); + luaD_inctop(L); + cl->p = luaF_newproto(L); + LoadFunction(&S, cl->p, NULL); + lua_assert(cl->nupvalues == cl->p->sizeupvalues); + luai_verifycode(L, buff, cl->p); + return cl; +} + diff --git a/source/lua/lundump.h b/source/lua/lundump.h new file mode 100644 index 0000000..739c7fc --- /dev/null +++ b/source/lua/lundump.h @@ -0,0 +1,32 @@ +/* +** $Id: lundump.h $ +** load precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#ifndef lundump_h +#define lundump_h + +#include "llimits.h" +#include "lobject.h" +#include "lzio.h" + + +/* data to catch conversion errors */ +#define LUAC_DATA "\x19\x93\r\n\x1a\n" + +#define LUAC_INT 0x5678 +#define LUAC_NUM cast_num(370.5) + +#define MYINT(s) (s[0]-'0') +#define LUAC_VERSION (MYINT(LUA_VERSION_MAJOR)*16+MYINT(LUA_VERSION_MINOR)) +#define LUAC_FORMAT 0 /* this is the official format */ + +/* load one chunk; from lundump.c */ +LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name); + +/* dump one chunk; from ldump.c */ +LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, + void* data, int strip); + +#endif diff --git a/source/lua/lundump.o b/source/lua/lundump.o new file mode 100644 index 0000000000000000000000000000000000000000..9399831199b9b70f231394c3715fcbab202227f8 GIT binary patch literal 8472 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 literal 0 HcmV?d00001 diff --git a/source/lua/lutf8lib.c b/source/lua/lutf8lib.c new file mode 100644 index 0000000..ec711c9 --- /dev/null +++ b/source/lua/lutf8lib.c @@ -0,0 +1,289 @@ +/* +** $Id: lutf8lib.c $ +** Standard library for UTF-8 manipulation +** See Copyright Notice in lua.h +*/ + +#define lutf8lib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#define MAXUNICODE 0x10FFFFu + +#define MAXUTF 0x7FFFFFFFu + +/* +** Integer type for decoded UTF-8 values; MAXUTF needs 31 bits. +*/ +#if LUAI_BITSINT >= 31 +typedef unsigned int utfint; +#else +typedef unsigned long utfint; +#endif + + +#define iscont(p) ((*(p) & 0xC0) == 0x80) + + +/* from strlib */ +/* translate a relative string position: negative means back from end */ +static lua_Integer u_posrelat (lua_Integer pos, size_t len) { + if (pos >= 0) return pos; + else if (0u - (size_t)pos > len) return 0; + else return (lua_Integer)len + pos + 1; +} + + +/* +** Decode one UTF-8 sequence, returning NULL if byte sequence is +** invalid. The array 'limits' stores the minimum value for each +** sequence length, to check for overlong representations. Its first +** entry forces an error for non-ascii bytes with no continuation +** bytes (count == 0). +*/ +static const char *utf8_decode (const char *s, utfint *val, int strict) { + static const utfint limits[] = + {~(utfint)0, 0x80, 0x800, 0x10000u, 0x200000u, 0x4000000u}; + unsigned int c = (unsigned char)s[0]; + utfint res = 0; /* final result */ + if (c < 0x80) /* ascii? */ + res = c; + else { + int count = 0; /* to count number of continuation bytes */ + for (; c & 0x40; c <<= 1) { /* while it needs continuation bytes... */ + unsigned int cc = (unsigned char)s[++count]; /* read next byte */ + if ((cc & 0xC0) != 0x80) /* not a continuation byte? */ + return NULL; /* invalid byte sequence */ + res = (res << 6) | (cc & 0x3F); /* add lower 6 bits from cont. byte */ + } + res |= ((utfint)(c & 0x7F) << (count * 5)); /* add first byte */ + if (count > 5 || res > MAXUTF || res < limits[count]) + return NULL; /* invalid byte sequence */ + s += count; /* skip continuation bytes read */ + } + if (strict) { + /* check for invalid code points; too large or surrogates */ + if (res > MAXUNICODE || (0xD800u <= res && res <= 0xDFFFu)) + return NULL; + } + if (val) *val = res; + return s + 1; /* +1 to include first byte */ +} + + +/* +** utf8len(s [, i [, j [, nonstrict]]]) --> number of characters that +** start in the range [i,j], or nil + current position if 's' is not +** well formed in that interval +*/ +static int utflen (lua_State *L) { + lua_Integer n = 0; /* counter for the number of characters */ + size_t len; /* string length in bytes */ + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len); + lua_Integer posj = u_posrelat(luaL_optinteger(L, 3, -1), len); + int nonstrict = lua_toboolean(L, 4); + luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 2, + "initial position out of string"); + luaL_argcheck(L, --posj < (lua_Integer)len, 3, + "final position out of string"); + while (posi <= posj) { + const char *s1 = utf8_decode(s + posi, NULL, !nonstrict); + if (s1 == NULL) { /* conversion error? */ + lua_pushnil(L); /* return nil ... */ + lua_pushinteger(L, posi + 1); /* ... and current position */ + return 2; + } + posi = s1 - s; + n++; + } + lua_pushinteger(L, n); + return 1; +} + + +/* +** codepoint(s, [i, [j [, nonstrict]]]) -> returns codepoints for all +** characters that start in the range [i,j] +*/ +static int codepoint (lua_State *L) { + size_t len; + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len); + lua_Integer pose = u_posrelat(luaL_optinteger(L, 3, posi), len); + int nonstrict = lua_toboolean(L, 4); + int n; + const char *se; + luaL_argcheck(L, posi >= 1, 2, "out of range"); + luaL_argcheck(L, pose <= (lua_Integer)len, 3, "out of range"); + if (posi > pose) return 0; /* empty interval; return no values */ + if (pose - posi >= INT_MAX) /* (lua_Integer -> int) overflow? */ + return luaL_error(L, "string slice too long"); + n = (int)(pose - posi) + 1; /* upper bound for number of returns */ + luaL_checkstack(L, n, "string slice too long"); + n = 0; /* count the number of returns */ + se = s + pose; /* string end */ + for (s += posi - 1; s < se;) { + utfint code; + s = utf8_decode(s, &code, !nonstrict); + if (s == NULL) + return luaL_error(L, "invalid UTF-8 code"); + lua_pushinteger(L, code); + n++; + } + return n; +} + + +static void pushutfchar (lua_State *L, int arg) { + lua_Unsigned code = (lua_Unsigned)luaL_checkinteger(L, arg); + luaL_argcheck(L, code <= MAXUTF, arg, "value out of range"); + lua_pushfstring(L, "%U", (long)code); +} + + +/* +** utfchar(n1, n2, ...) -> char(n1)..char(n2)... +*/ +static int utfchar (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + if (n == 1) /* optimize common case of single char */ + pushutfchar(L, 1); + else { + int i; + luaL_Buffer b; + luaL_buffinit(L, &b); + for (i = 1; i <= n; i++) { + pushutfchar(L, i); + luaL_addvalue(&b); + } + luaL_pushresult(&b); + } + return 1; +} + + +/* +** offset(s, n, [i]) -> index where n-th character counting from +** position 'i' starts; 0 means character at 'i'. +*/ +static int byteoffset (lua_State *L) { + size_t len; + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer n = luaL_checkinteger(L, 2); + lua_Integer posi = (n >= 0) ? 1 : len + 1; + posi = u_posrelat(luaL_optinteger(L, 3, posi), len); + luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 3, + "position out of range"); + if (n == 0) { + /* find beginning of current byte sequence */ + while (posi > 0 && iscont(s + posi)) posi--; + } + else { + if (iscont(s + posi)) + return luaL_error(L, "initial position is a continuation byte"); + if (n < 0) { + while (n < 0 && posi > 0) { /* move back */ + do { /* find beginning of previous character */ + posi--; + } while (posi > 0 && iscont(s + posi)); + n++; + } + } + else { + n--; /* do not move for 1st character */ + while (n > 0 && posi < (lua_Integer)len) { + do { /* find beginning of next character */ + posi++; + } while (iscont(s + posi)); /* (cannot pass final '\0') */ + n--; + } + } + } + if (n == 0) /* did it find given character? */ + lua_pushinteger(L, posi + 1); + else /* no such character */ + lua_pushnil(L); + return 1; +} + + +static int iter_aux (lua_State *L, int strict) { + size_t len; + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer n = lua_tointeger(L, 2) - 1; + if (n < 0) /* first iteration? */ + n = 0; /* start from here */ + else if (n < (lua_Integer)len) { + n++; /* skip current byte */ + while (iscont(s + n)) n++; /* and its continuations */ + } + if (n >= (lua_Integer)len) + return 0; /* no more codepoints */ + else { + utfint code; + const char *next = utf8_decode(s + n, &code, strict); + if (next == NULL) + return luaL_error(L, "invalid UTF-8 code"); + lua_pushinteger(L, n + 1); + lua_pushinteger(L, code); + return 2; + } +} + + +static int iter_auxstrict (lua_State *L) { + return iter_aux(L, 1); +} + +static int iter_auxnostrict (lua_State *L) { + return iter_aux(L, 0); +} + + +static int iter_codes (lua_State *L) { + int nonstrict = lua_toboolean(L, 2); + luaL_checkstring(L, 1); + lua_pushcfunction(L, nonstrict ? iter_auxnostrict : iter_auxstrict); + lua_pushvalue(L, 1); + lua_pushinteger(L, 0); + return 3; +} + + +/* pattern to match a single UTF-8 character */ +#define UTF8PATT "[\0-\x7F\xC2-\xFD][\x80-\xBF]*" + + +static const luaL_Reg funcs[] = { + {"offset", byteoffset}, + {"codepoint", codepoint}, + {"char", utfchar}, + {"len", utflen}, + {"codes", iter_codes}, + /* placeholders */ + {"charpattern", NULL}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_utf8 (lua_State *L) { + luaL_newlib(L, funcs); + lua_pushlstring(L, UTF8PATT, sizeof(UTF8PATT)/sizeof(char) - 1); + lua_setfield(L, -2, "charpattern"); + return 1; +} + diff --git a/source/lua/lutf8lib.o b/source/lua/lutf8lib.o new file mode 100644 index 0000000000000000000000000000000000000000..1fb8ff4128bfdc3202d14cb3fc77a71ba15f4edb GIT binary patch literal 9016 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 Db_9B> literal 0 HcmV?d00001 diff --git a/source/lua/lvm.c b/source/lua/lvm.c new file mode 100644 index 0000000..23e7ff7 --- /dev/null +++ b/source/lua/lvm.c @@ -0,0 +1,1809 @@ +/* +** $Id: lvm.c $ +** Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#define lvm_c +#define LUA_CORE + +#include "lprefix.h" + +#include +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + +/* +** By default, use jump tables in the main interpreter loop on gcc +** and compatible compilers. +*/ +#if !defined(LUA_USE_JUMPTABLE) +#if defined(__GNUC__) +#define LUA_USE_JUMPTABLE 1 +#else +#define LUA_USE_JUMPTABLE 0 +#endif +#endif + + + +/* limit for table tag-method chains (to avoid infinite loops) */ +#define MAXTAGLOOP 2000 + + +/* +** 'l_intfitsf' checks whether a given integer is in the range that +** can be converted to a float without rounding. Used in comparisons. +*/ + +/* number of bits in the mantissa of a float */ +#define NBM (l_mathlim(MANT_DIG)) + +/* +** Check whether some integers may not fit in a float, testing whether +** (maxinteger >> NBM) > 0. (That implies (1 << NBM) <= maxinteger.) +** (The shifts are done in parts, to avoid shifting by more than the size +** of an integer. In a worst case, NBM == 113 for long double and +** sizeof(long) == 32.) +*/ +#if ((((LUA_MAXINTEGER >> (NBM / 4)) >> (NBM / 4)) >> (NBM / 4)) \ + >> (NBM - (3 * (NBM / 4)))) > 0 + +/* limit for integers that fit in a float */ +#define MAXINTFITSF ((lua_Unsigned)1 << NBM) + +/* check whether 'i' is in the interval [-MAXINTFITSF, MAXINTFITSF] */ +#define l_intfitsf(i) ((MAXINTFITSF + l_castS2U(i)) <= (2 * MAXINTFITSF)) + +#else /* all integers fit in a float precisely */ + +#define l_intfitsf(i) 1 + +#endif + + + +/* +** Try to convert a value to a float. The float case is already handled +** by the macro 'tonumber'. +*/ +int luaV_tonumber_ (const TValue *obj, lua_Number *n) { + TValue v; + if (ttisinteger(obj)) { + *n = cast_num(ivalue(obj)); + return 1; + } + else if (cvt2num(obj) && /* string coercible to number? */ + luaO_str2num(svalue(obj), &v) == vslen(obj) + 1) { + *n = nvalue(&v); /* convert result of 'luaO_str2num' to a float */ + return 1; + } + else + return 0; /* conversion failed */ +} + + +/* +** try to convert a float to an integer, rounding according to 'mode': +** mode == 0: accepts only integral values +** mode == 1: takes the floor of the number +** mode == 2: takes the ceil of the number +*/ +int luaV_flttointeger (lua_Number n, lua_Integer *p, int mode) { + lua_Number f = l_floor(n); + if (n != f) { /* not an integral value? */ + if (mode == 0) return 0; /* fails if mode demands integral value */ + else if (mode > 1) /* needs ceil? */ + f += 1; /* convert floor to ceil (remember: n != f) */ + } + return lua_numbertointeger(f, p); +} + + +/* +** try to convert a value to an integer, rounding according to 'mode', +** without string coercion. +** ("Fast track" handled by macro 'tointegerns'.) +*/ +int luaV_tointegerns (const TValue *obj, lua_Integer *p, int mode) { + if (ttisfloat(obj)) + return luaV_flttointeger(fltvalue(obj), p, mode); + else if (ttisinteger(obj)) { + *p = ivalue(obj); + return 1; + } + else + return 0; +} + + +/* +** try to convert a value to an integer. +*/ +int luaV_tointeger (const TValue *obj, lua_Integer *p, int mode) { + TValue v; + if (cvt2num(obj) && luaO_str2num(svalue(obj), &v) == vslen(obj) + 1) + obj = &v; /* change string to its corresponding number */ + return luaV_tointegerns(obj, p, mode); +} + + +/* +** Try to convert a 'for' limit to an integer, preserving the semantics +** of the loop. (The following explanation assumes a non-negative step; +** it is valid for negative steps mutatis mutandis.) +** If the limit is an integer or can be converted to an integer, +** rounding down, that is it. +** Otherwise, check whether the limit can be converted to a float. If +** the number is too large, it is OK to set the limit as LUA_MAXINTEGER, +** which means no limit. If the number is too negative, the loop +** should not run, because any initial integer value is larger than the +** limit. So, it sets the limit to LUA_MININTEGER. 'stopnow' corrects +** the extreme case when the initial value is LUA_MININTEGER, in which +** case the LUA_MININTEGER limit would still run the loop once. +*/ +static int forlimit (const TValue *obj, lua_Integer *p, lua_Integer step, + int *stopnow) { + *stopnow = 0; /* usually, let loops run */ + if (ttisinteger(obj)) + *p = ivalue(obj); + else if (!luaV_tointeger(obj, p, (step < 0 ? 2 : 1))) { + /* not coercible to in integer */ + lua_Number n; /* try to convert to float */ + if (!tonumber(obj, &n)) /* cannot convert to float? */ + return 0; /* not a number */ + if (luai_numlt(0, n)) { /* if true, float is larger than max integer */ + *p = LUA_MAXINTEGER; + if (step < 0) *stopnow = 1; + } + else { /* float is less than min integer */ + *p = LUA_MININTEGER; + if (step >= 0) *stopnow = 1; + } + } + return 1; +} + + +/* +** Finish the table access 'val = t[key]'. +** if 'slot' is NULL, 't' is not a table; otherwise, 'slot' points to +** t[k] entry (which must be empty). +*/ +void luaV_finishget (lua_State *L, const TValue *t, TValue *key, StkId val, + const TValue *slot) { + int loop; /* counter to avoid infinite loops */ + const TValue *tm; /* metamethod */ + for (loop = 0; loop < MAXTAGLOOP; loop++) { + if (slot == NULL) { /* 't' is not a table? */ + lua_assert(!ttistable(t)); + tm = luaT_gettmbyobj(L, t, TM_INDEX); + if (unlikely(notm(tm))) + luaG_typeerror(L, t, "index"); /* no metamethod */ + /* else will try the metamethod */ + } + else { /* 't' is a table */ + lua_assert(isempty(slot)); + tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); /* table's metamethod */ + if (tm == NULL) { /* no metamethod? */ + setnilvalue(s2v(val)); /* result is nil */ + return; + } + /* else will try the metamethod */ + } + if (ttisfunction(tm)) { /* is metamethod a function? */ + luaT_callTMres(L, tm, t, key, val); /* call it */ + return; + } + t = tm; /* else try to access 'tm[key]' */ + if (luaV_fastget(L, t, key, slot, luaH_get)) { /* fast track? */ + setobj2s(L, val, slot); /* done */ + return; + } + /* else repeat (tail call 'luaV_finishget') */ + } + luaG_runerror(L, "'__index' chain too long; possible loop"); +} + + +/* +** Finish a table assignment 't[key] = val'. +** If 'slot' is NULL, 't' is not a table. Otherwise, 'slot' points +** to the entry 't[key]', or to a value with an absent key if there +** is no such entry. (The value at 'slot' must be empty, otherwise +** 'luaV_fastget' would have done the job.) +*/ +void luaV_finishset (lua_State *L, const TValue *t, TValue *key, + TValue *val, const TValue *slot) { + int loop; /* counter to avoid infinite loops */ + for (loop = 0; loop < MAXTAGLOOP; loop++) { + const TValue *tm; /* '__newindex' metamethod */ + if (slot != NULL) { /* is 't' a table? */ + Table *h = hvalue(t); /* save 't' table */ + lua_assert(isempty(slot)); /* slot must be empty */ + tm = fasttm(L, h->metatable, TM_NEWINDEX); /* get metamethod */ + if (tm == NULL) { /* no metamethod? */ + if (isabstkey(slot)) /* no previous entry? */ + slot = luaH_newkey(L, h, key); /* create one */ + /* no metamethod and (now) there is an entry with given key */ + setobj2t(L, cast(TValue *, slot), val); /* set its new value */ + invalidateTMcache(h); + luaC_barrierback(L, obj2gco(h), val); + return; + } + /* else will try the metamethod */ + } + else { /* not a table; check metamethod */ + tm = luaT_gettmbyobj(L, t, TM_NEWINDEX); + if (unlikely(notm(tm))) + luaG_typeerror(L, t, "index"); + } + /* try the metamethod */ + if (ttisfunction(tm)) { + luaT_callTM(L, tm, t, key, val); + return; + } + t = tm; /* else repeat assignment over 'tm' */ + if (luaV_fastget(L, t, key, slot, luaH_get)) { + luaV_finishfastset(L, t, slot, val); + return; /* done */ + } + /* else 'return luaV_finishset(L, t, key, val, slot)' (loop) */ + } + luaG_runerror(L, "'__newindex' chain too long; possible loop"); +} + + +/* +** Compare two strings 'ls' x 'rs', returning an integer less-equal- +** -greater than zero if 'ls' is less-equal-greater than 'rs'. +** The code is a little tricky because it allows '\0' in the strings +** and it uses 'strcoll' (to respect locales) for each segments +** of the strings. +*/ +static int l_strcmp (const TString *ls, const TString *rs) { + const char *l = getstr(ls); + size_t ll = tsslen(ls); + const char *r = getstr(rs); + size_t lr = tsslen(rs); + for (;;) { /* for each segment */ + int temp = strcoll(l, r); + if (temp != 0) /* not equal? */ + return temp; /* done */ + else { /* strings are equal up to a '\0' */ + size_t len = strlen(l); /* index of first '\0' in both strings */ + if (len == lr) /* 'rs' is finished? */ + return (len == ll) ? 0 : 1; /* check 'ls' */ + else if (len == ll) /* 'ls' is finished? */ + return -1; /* 'ls' is less than 'rs' ('rs' is not finished) */ + /* both strings longer than 'len'; go on comparing after the '\0' */ + len++; + l += len; ll -= len; r += len; lr -= len; + } + } +} + + +/* +** Check whether integer 'i' is less than float 'f'. If 'i' has an +** exact representation as a float ('l_intfitsf'), compare numbers as +** floats. Otherwise, use the equivalence 'i < f <=> i < ceil(f)'. +** If 'ceil(f)' is out of integer range, either 'f' is greater than +** all integers or less than all integers. +** (The test with 'l_intfitsf' is only for performance; the else +** case is correct for all values, but it is slow due to the conversion +** from float to int.) +** When 'f' is NaN, comparisons must result in false. +*/ +static int LTintfloat (lua_Integer i, lua_Number f) { + if (l_intfitsf(i)) + return luai_numlt(cast_num(i), f); /* compare them as floats */ + else { /* i < f <=> i < ceil(f) */ + lua_Integer fi; + if (luaV_flttointeger(f, &fi, 2)) /* fi = ceil(f) */ + return i < fi; /* compare them as integers */ + else /* 'f' is either greater or less than all integers */ + return f > 0; /* greater? */ + } +} + + +/* +** Check whether integer 'i' is less than or equal to float 'f'. +** See comments on previous function. +*/ +static int LEintfloat (lua_Integer i, lua_Number f) { + if (l_intfitsf(i)) + return luai_numle(cast_num(i), f); /* compare them as floats */ + else { /* i <= f <=> i <= floor(f) */ + lua_Integer fi; + if (luaV_flttointeger(f, &fi, 1)) /* fi = floor(f) */ + return i <= fi; /* compare them as integers */ + else /* 'f' is either greater or less than all integers */ + return f > 0; /* greater? */ + } +} + + +/* +** Check whether float 'f' is less than integer 'i'. +** See comments on previous function. +*/ +static int LTfloatint (lua_Number f, lua_Integer i) { + if (l_intfitsf(i)) + return luai_numlt(f, cast_num(i)); /* compare them as floats */ + else { /* f < i <=> floor(f) < i */ + lua_Integer fi; + if (luaV_flttointeger(f, &fi, 1)) /* fi = floor(f) */ + return fi < i; /* compare them as integers */ + else /* 'f' is either greater or less than all integers */ + return f < 0; /* less? */ + } +} + + +/* +** Check whether float 'f' is less than or equal to integer 'i'. +** See comments on previous function. +*/ +static int LEfloatint (lua_Number f, lua_Integer i) { + if (l_intfitsf(i)) + return luai_numle(f, cast_num(i)); /* compare them as floats */ + else { /* f <= i <=> ceil(f) <= i */ + lua_Integer fi; + if (luaV_flttointeger(f, &fi, 2)) /* fi = ceil(f) */ + return fi <= i; /* compare them as integers */ + else /* 'f' is either greater or less than all integers */ + return f < 0; /* less? */ + } +} + + +/* +** Return 'l < r', for numbers. +*/ +static int LTnum (const TValue *l, const TValue *r) { + lua_assert(ttisnumber(l) && ttisnumber(r)); + if (ttisinteger(l)) { + lua_Integer li = ivalue(l); + if (ttisinteger(r)) + return li < ivalue(r); /* both are integers */ + else /* 'l' is int and 'r' is float */ + return LTintfloat(li, fltvalue(r)); /* l < r ? */ + } + else { + lua_Number lf = fltvalue(l); /* 'l' must be float */ + if (ttisfloat(r)) + return luai_numlt(lf, fltvalue(r)); /* both are float */ + else /* 'l' is float and 'r' is int */ + return LTfloatint(lf, ivalue(r)); + } +} + + +/* +** Return 'l <= r', for numbers. +*/ +static int LEnum (const TValue *l, const TValue *r) { + lua_assert(ttisnumber(l) && ttisnumber(r)); + if (ttisinteger(l)) { + lua_Integer li = ivalue(l); + if (ttisinteger(r)) + return li <= ivalue(r); /* both are integers */ + else /* 'l' is int and 'r' is float */ + return LEintfloat(li, fltvalue(r)); /* l <= r ? */ + } + else { + lua_Number lf = fltvalue(l); /* 'l' must be float */ + if (ttisfloat(r)) + return luai_numle(lf, fltvalue(r)); /* both are float */ + else /* 'l' is float and 'r' is int */ + return LEfloatint(lf, ivalue(r)); + } +} + + +/* +** return 'l < r' for non-numbers. +*/ +static int lessthanothers (lua_State *L, const TValue *l, const TValue *r) { + lua_assert(!ttisnumber(l) || !ttisnumber(r)); + if (ttisstring(l) && ttisstring(r)) /* both are strings? */ + return l_strcmp(tsvalue(l), tsvalue(r)) < 0; + else + return luaT_callorderTM(L, l, r, TM_LT); +} + + +/* +** Main operation less than; return 'l < r'. +*/ +int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { + if (ttisnumber(l) && ttisnumber(r)) /* both operands are numbers? */ + return LTnum(l, r); + else return lessthanothers(L, l, r); +} + + +/* +** return 'l <= r' for non-numbers. +** If it needs a metamethod and there is no '__le', try '__lt', based +** on l <= r iff !(r < l) (assuming a total order). If the metamethod +** yields during this substitution, the continuation has to know about +** it (to negate the result of rmetatable, TM_EQ); + if (tm == NULL) + tm = fasttm(L, uvalue(t2)->metatable, TM_EQ); + break; /* will try TM */ + } + case LUA_TTABLE: { + if (hvalue(t1) == hvalue(t2)) return 1; + else if (L == NULL) return 0; + tm = fasttm(L, hvalue(t1)->metatable, TM_EQ); + if (tm == NULL) + tm = fasttm(L, hvalue(t2)->metatable, TM_EQ); + break; /* will try TM */ + } + default: + return gcvalue(t1) == gcvalue(t2); + } + if (tm == NULL) /* no TM? */ + return 0; /* objects are different */ + luaT_callTMres(L, tm, t1, t2, L->top); /* call TM */ + return !l_isfalse(s2v(L->top)); +} + + +/* macro used by 'luaV_concat' to ensure that element at 'o' is a string */ +#define tostring(L,o) \ + (ttisstring(o) || (cvt2str(o) && (luaO_tostring(L, o), 1))) + +#define isemptystr(o) (ttisshrstring(o) && tsvalue(o)->shrlen == 0) + +/* copy strings in stack from top - n up to top - 1 to buffer */ +static void copy2buff (StkId top, int n, char *buff) { + size_t tl = 0; /* size already copied */ + do { + size_t l = vslen(s2v(top - n)); /* length of string being copied */ + memcpy(buff + tl, svalue(s2v(top - n)), l * sizeof(char)); + tl += l; + } while (--n > 0); +} + + +/* +** Main operation for concatenation: concat 'total' values in the stack, +** from 'L->top - total' up to 'L->top - 1'. +*/ +void luaV_concat (lua_State *L, int total) { + lua_assert(total >= 2); + do { + StkId top = L->top; + int n = 2; /* number of elements handled in this pass (at least 2) */ + if (!(ttisstring(s2v(top - 2)) || cvt2str(s2v(top - 2))) || + !tostring(L, s2v(top - 1))) + luaT_trybinTM(L, s2v(top - 2), s2v(top - 1), top - 2, TM_CONCAT); + else if (isemptystr(s2v(top - 1))) /* second operand is empty? */ + cast_void(tostring(L, s2v(top - 2))); /* result is first operand */ + else if (isemptystr(s2v(top - 2))) { /* first operand is empty string? */ + setobjs2s(L, top - 2, top - 1); /* result is second op. */ + } + else { + /* at least two non-empty string values; get as many as possible */ + size_t tl = vslen(s2v(top - 1)); + TString *ts; + /* collect total length and number of strings */ + for (n = 1; n < total && tostring(L, s2v(top - n - 1)); n++) { + size_t l = vslen(s2v(top - n - 1)); + if (unlikely(l >= (MAX_SIZE/sizeof(char)) - tl)) + luaG_runerror(L, "string length overflow"); + tl += l; + } + if (tl <= LUAI_MAXSHORTLEN) { /* is result a short string? */ + char buff[LUAI_MAXSHORTLEN]; + copy2buff(top, n, buff); /* copy strings to buffer */ + ts = luaS_newlstr(L, buff, tl); + } + else { /* long string; copy strings directly to final result */ + ts = luaS_createlngstrobj(L, tl); + copy2buff(top, n, getstr(ts)); + } + setsvalue2s(L, top - n, ts); /* create result */ + } + total -= n-1; /* got 'n' strings to create 1 new */ + L->top -= n-1; /* popped 'n' strings and pushed one */ + } while (total > 1); /* repeat until only 1 result left */ +} + + +/* +** Main operation 'ra = #rb'. +*/ +void luaV_objlen (lua_State *L, StkId ra, const TValue *rb) { + const TValue *tm; + switch (ttypetag(rb)) { + case LUA_TTABLE: { + Table *h = hvalue(rb); + tm = fasttm(L, h->metatable, TM_LEN); + if (tm) break; /* metamethod? break switch to call it */ + setivalue(s2v(ra), luaH_getn(h)); /* else primitive len */ + return; + } + case LUA_TSHRSTR: { + setivalue(s2v(ra), tsvalue(rb)->shrlen); + return; + } + case LUA_TLNGSTR: { + setivalue(s2v(ra), tsvalue(rb)->u.lnglen); + return; + } + default: { /* try metamethod */ + tm = luaT_gettmbyobj(L, rb, TM_LEN); + if (unlikely(notm(tm))) /* no metamethod? */ + luaG_typeerror(L, rb, "get length of"); + break; + } + } + luaT_callTMres(L, tm, rb, rb, ra); +} + + +/* +** Integer division; return 'm // n', that is, floor(m/n). +** C division truncates its result (rounds towards zero). +** 'floor(q) == trunc(q)' when 'q >= 0' or when 'q' is integer, +** otherwise 'floor(q) == trunc(q) - 1'. +*/ +lua_Integer luaV_idiv (lua_State *L, lua_Integer m, lua_Integer n) { + if (unlikely(l_castS2U(n) + 1u <= 1u)) { /* special cases: -1 or 0 */ + if (n == 0) + luaG_runerror(L, "attempt to divide by zero"); + return intop(-, 0, m); /* n==-1; avoid overflow with 0x80000...//-1 */ + } + else { + lua_Integer q = m / n; /* perform C division */ + if ((m ^ n) < 0 && m % n != 0) /* 'm/n' would be negative non-integer? */ + q -= 1; /* correct result for different rounding */ + return q; + } +} + + +/* +** Integer modulus; return 'm % n'. (Assume that C '%' with +** negative operands follows C99 behavior. See previous comment +** about luaV_idiv.) +*/ +lua_Integer luaV_mod (lua_State *L, lua_Integer m, lua_Integer n) { + if (unlikely(l_castS2U(n) + 1u <= 1u)) { /* special cases: -1 or 0 */ + if (n == 0) + luaG_runerror(L, "attempt to perform 'n%%0'"); + return 0; /* m % -1 == 0; avoid overflow with 0x80000...%-1 */ + } + else { + lua_Integer r = m % n; + if (r != 0 && (r ^ n) < 0) /* 'm/n' would be non-integer negative? */ + r += n; /* correct result for different rounding */ + return r; + } +} + + +/* +** Float modulus +*/ +lua_Number luaV_modf (lua_State *L, lua_Number m, lua_Number n) { + lua_Number r; + luai_nummod(L, m, n, r); + return r; +} + + +/* number of bits in an integer */ +#define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT) + +/* +** Shift left operation. (Shift right just negates 'y'.) +*/ +lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) { + if (y < 0) { /* shift right? */ + if (y <= -NBITS) return 0; + else return intop(>>, x, -y); + } + else { /* shift left */ + if (y >= NBITS) return 0; + else return intop(<<, x, y); + } +} + + +/* +** create a new Lua closure, push it in the stack, and initialize +** its upvalues. +*/ +static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base, + StkId ra) { + int nup = p->sizeupvalues; + Upvaldesc *uv = p->upvalues; + int i; + LClosure *ncl = luaF_newLclosure(L, nup); + ncl->p = p; + setclLvalue2s(L, ra, ncl); /* anchor new closure in stack */ + for (i = 0; i < nup; i++) { /* fill in its upvalues */ + if (uv[i].instack) /* upvalue refers to local variable? */ + ncl->upvals[i] = luaF_findupval(L, base + uv[i].idx); + else /* get upvalue from enclosing function */ + ncl->upvals[i] = encup[uv[i].idx]; + luaC_objbarrier(L, ncl, ncl->upvals[i]); + } +} + + +/* +** finish execution of an opcode interrupted by a yield +*/ +void luaV_finishOp (lua_State *L) { + CallInfo *ci = L->ci; + StkId base = ci->func + 1; + Instruction inst = *(ci->u.l.savedpc - 1); /* interrupted instruction */ + OpCode op = GET_OPCODE(inst); + switch (op) { /* finish its execution */ + case OP_ADDI: case OP_SUBI: + case OP_MULI: case OP_DIVI: case OP_IDIVI: + case OP_MODI: case OP_POWI: + case OP_ADD: case OP_SUB: + case OP_MUL: case OP_DIV: case OP_IDIV: + case OP_BANDK: case OP_BORK: case OP_BXORK: + case OP_BAND: case OP_BOR: case OP_BXOR: + case OP_SHRI: case OP_SHL: case OP_SHR: + case OP_MOD: case OP_POW: + case OP_UNM: case OP_BNOT: case OP_LEN: + case OP_GETTABUP: case OP_GETTABLE: case OP_GETI: + case OP_GETFIELD: case OP_SELF: { + setobjs2s(L, base + GETARG_A(inst), --L->top); + break; + } + case OP_LT: case OP_LE: + case OP_LTI: case OP_LEI: + case OP_GTI: case OP_GEI: + case OP_EQ: { /* note that 'OP_EQI'/'OP_EQK' cannot yield */ + int res = !l_isfalse(s2v(L->top - 1)); + L->top--; +#if defined(LUA_COMPAT_LT_LE) + if (ci->callstatus & CIST_LEQ) { /* "<=" using "<" instead? */ + ci->callstatus ^= CIST_LEQ; /* clear mark */ + res = !res; /* negate result */ + } +#endif + lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_JMP); + if (res != GETARG_k(inst)) /* condition failed? */ + ci->u.l.savedpc++; /* skip jump instruction */ + break; + } + case OP_CONCAT: { + StkId top = L->top - 1; /* top when 'luaT_trybinTM' was called */ + int a = GETARG_A(inst); /* first element to concatenate */ + int total = cast_int(top - 1 - (base + a)); /* yet to concatenate */ + setobjs2s(L, top - 2, top); /* put TM result in proper position */ + if (total > 1) { /* are there elements to concat? */ + L->top = top - 1; /* top is one after last element (at top-2) */ + luaV_concat(L, total); /* concat them (may yield again) */ + } + break; + } + default: { + /* only these other opcodes can yield */ + lua_assert(op == OP_TFORCALL || op == OP_CALL || + op == OP_TAILCALL || op == OP_SETTABUP || op == OP_SETTABLE || + op == OP_SETI || op == OP_SETFIELD); + break; + } + } +} + + + + +/* +** {================================================================== +** Macros for arithmetic/bitwise opcodes in 'luaV_execute' +** =================================================================== +*/ + + +#define l_addi(L,a,b) intop(+, a, b) +#define l_subi(L,a,b) intop(-, a, b) +#define l_muli(L,a,b) intop(*, a, b) +#define l_band(L,a,b) intop(&, a, b) +#define l_bor(L,a,b) intop(|, a, b) +#define l_bxor(L,a,b) intop(^, a, b) + + +/* +** Auxiliary macro for arithmetic operations over floats and others +** with immediate operand. 'fop' is the float operation; 'tm' is the +** corresponding metamethod; 'flip' is true if operands were flipped. +*/ +#define op_arithfI_aux(L,v1,imm,fop,tm,flip) { \ + lua_Number nb; \ + if (tonumberns(v1, nb)) { \ + setfltvalue(s2v(ra), fop(L, nb, cast_num(imm))); \ + } \ + else \ + Protect(luaT_trybiniTM(L, v1, imm, flip, ra, tm)); } + + +/* +** Arithmetic operations over floats and others with immediate operand. +*/ +#define op_arithfI(L,fop,tm) { \ + TValue *v1 = vRB(i); \ + int imm = GETARG_sC(i); \ + op_arithfI_aux(L, v1, imm, fop, tm, 0); } + +/* +** Arithmetic operations with immediate operands. 'iop' is the integer +** operation. +*/ +#define op_arithI(L,iop,fop,tm,flip) { \ + TValue *v1 = vRB(i); \ + int imm = GETARG_sC(i); \ + if (ttisinteger(v1)) { \ + setivalue(s2v(ra), iop(L, ivalue(v1), imm)); \ + } \ + else op_arithfI_aux(L, v1, imm, fop, tm, flip); } + + +/* +** Auxiliary function for arithmetic operations over floats and others +** with two register operands. +*/ +#define op_arithf_aux(L,v1,v2,fop,tm) { \ + lua_Number n1; lua_Number n2; \ + if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \ + setfltvalue(s2v(ra), fop(L, n1, n2)); \ + } \ + else \ + Protect(luaT_trybinTM(L, v1, v2, ra, tm)); } + + +/* +** Arithmetic operations over floats and others with register operands. +*/ +#define op_arithf(L,fop,tm) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = vRC(i); \ + op_arithf_aux(L, v1, v2, fop, tm); } + + +/* +** Arithmetic operations with register operands. +*/ +#define op_arith(L,iop,fop,tm) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = vRC(i); \ + if (ttisinteger(v1) && ttisinteger(v2)) { \ + lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \ + setivalue(s2v(ra), iop(L, i1, i2)); \ + } \ + else op_arithf_aux(L, v1, v2, fop, tm); } + + +/* +** Arithmetic operations with K operands. +*/ +#define op_arithK(L,iop,fop,tm,flip) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = KC(i); \ + if (ttisinteger(v1) && ttisinteger(v2)) { \ + lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \ + setivalue(s2v(ra), iop(L, i1, i2)); \ + } \ + else { \ + lua_Number n1; lua_Number n2; \ + if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \ + setfltvalue(s2v(ra), fop(L, n1, n2)); \ + } \ + else \ + Protect(luaT_trybinassocTM(L, v1, v2, ra, flip, tm)); } } + + +/* +** Arithmetic operations with K operands for floats. +*/ +#define op_arithfK(L,fop,tm) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = KC(i); \ + lua_Number n1; lua_Number n2; \ + if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \ + setfltvalue(s2v(ra), fop(L, n1, n2)); \ + } \ + else \ + Protect(luaT_trybinTM(L, v1, v2, ra, tm)); } + + +/* +** Bitwise operations with constant operand. +*/ +#define op_bitwiseK(L,op,tm) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = KC(i); \ + lua_Integer i1; \ + lua_Integer i2 = ivalue(v2); \ + if (tointegerns(v1, &i1)) { \ + setivalue(s2v(ra), op(L, i1, i2)); \ + } \ + else \ + Protect(luaT_trybiniTM(L, v1, i2, TESTARG_k(i), ra, tm)); } + + +/* +** Bitwise operations with register operands. +*/ +#define op_bitwise(L,op,tm) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = vRC(i); \ + lua_Integer i1; lua_Integer i2; \ + if (tointegerns(v1, &i1) && tointegerns(v2, &i2)) { \ + setivalue(s2v(ra), op(L, i1, i2)); \ + } \ + else \ + Protect(luaT_trybinTM(L, v1, v2, ra, tm)); } + +/* }================================================================== */ + + +/* +** {================================================================== +** Function 'luaV_execute': main interpreter loop +** =================================================================== +*/ + +/* +** some macros for common tasks in 'luaV_execute' +*/ + + +#define RA(i) (base+GETARG_A(i)) +#define RB(i) (base+GETARG_B(i)) +#define vRB(i) s2v(RB(i)) +#define KB(i) (k+GETARG_B(i)) +#define RC(i) (base+GETARG_C(i)) +#define vRC(i) s2v(RC(i)) +#define KC(i) (k+GETARG_C(i)) +#define RKC(i) ((TESTARG_k(i)) ? k + GETARG_C(i) : s2v(base + GETARG_C(i))) + + + +#define updatetrap(ci) (trap = ci->u.l.trap) + +#define updatebase(ci) (base = ci->func + 1) + + +#define updatestack(ci) { if (trap) { updatebase(ci); ra = RA(i); } } + + +/* +** Execute a jump instruction. The 'updatetrap' allows signals to stop +** tight loops. (Without it, the local copy of 'trap' could never change.) +*/ +#define dojump(ci,i,e) { pc += GETARG_sJ(i) + e; updatetrap(ci); } + + +/* for test instructions, execute the jump instruction that follows it */ +#define donextjump(ci) { i = *pc; dojump(ci, i, 1); } + +/* +** do a conditional jump: skip next instruction if 'cond' is not what +** was expected (parameter 'k'), else do next instruction, which must +** be a jump. +*/ +#define docondjump() if (cond != GETARG_k(i)) pc++; else donextjump(ci); + + +/* +** Correct global 'pc'. +*/ +#define savepc(L) (ci->u.l.savedpc = pc) + + +/* +** Whenever code can raise errors, the global 'pc' and the global +** 'top' must be correct to report occasional errors. +*/ +#define savestate(L,ci) (savepc(L), L->top = ci->top) + + +/* +** Protect code that, in general, can raise errors, reallocate the +** stack, and change the hooks. +*/ +#define Protect(exp) (savestate(L,ci), (exp), updatetrap(ci)) + +/* special version that does not change the top */ +#define ProtectNT(exp) (savepc(L), (exp), updatetrap(ci)) + +/* +** Protect code that will finish the loop (returns) or can only raise +** errors. (That is, it will not return to the interpreter main loop +** after changing the stack or hooks.) +*/ +#define halfProtect(exp) (savepc(L), (exp)) + + +#define checkGC(L,c) \ + { luaC_condGC(L, L->top = (c), /* limit of live values */ \ + updatetrap(ci)); \ + luai_threadyield(L); } + + +/* fetch an instruction and prepare its execution */ +#define vmfetch() { \ + if (trap) { /* stack reallocation or hooks? */ \ + trap = luaG_traceexec(L, pc); /* handle hooks */ \ + updatebase(ci); /* correct stack */ \ + } \ + i = *(pc++); \ + ra = RA(i); /* WARNING: any stack reallocation invalidates 'ra' */ \ +} + +#define vmdispatch(o) switch(o) +#define vmcase(l) case l: +#define vmbreak break + + +void luaV_execute (lua_State *L, CallInfo *ci) { + LClosure *cl; + TValue *k; + StkId base; + const Instruction *pc; + int trap; +#if LUA_USE_JUMPTABLE +#include "ljumptab.h" +#endif + tailcall: + trap = L->hookmask; + cl = clLvalue(s2v(ci->func)); + k = cl->p->k; + pc = ci->u.l.savedpc; + if (trap) { + if (cl->p->is_vararg) + trap = 0; /* hooks will start after PREPVARARG instruction */ + else if (pc == cl->p->code) /* first instruction (not resuming)? */ + luaD_hookcall(L, ci); + ci->u.l.trap = 1; /* there may be other hooks */ + } + base = ci->func + 1; + /* main loop of interpreter */ + for (;;) { + int cond; /* flag for conditional jumps */ + Instruction i; /* instruction being executed */ + StkId ra; /* instruction's A register */ + vmfetch(); + lua_assert(base == ci->func + 1); + lua_assert(base <= L->top && L->top < L->stack + L->stacksize); + lua_assert(ci->top < L->stack + L->stacksize); + vmdispatch (GET_OPCODE(i)) { + vmcase(OP_MOVE) { + setobjs2s(L, ra, RB(i)); + vmbreak; + } + vmcase(OP_LOADK) { + TValue *rb = k + GETARG_Bx(i); + setobj2s(L, ra, rb); + vmbreak; + } + vmcase(OP_LOADI) { + lua_Integer b = GETARG_sBx(i); + setivalue(s2v(ra), b); + vmbreak; + } + vmcase(OP_LOADF) { + int b = GETARG_sBx(i); + setfltvalue(s2v(ra), cast_num(b)); + vmbreak; + } + vmcase(OP_LOADKX) { + TValue *rb; + rb = k + GETARG_Ax(*pc); pc++; + setobj2s(L, ra, rb); + vmbreak; + } + vmcase(OP_LOADBOOL) { + setbvalue(s2v(ra), GETARG_B(i)); + if (GETARG_C(i)) pc++; /* skip next instruction (if C) */ + vmbreak; + } + vmcase(OP_LOADNIL) { + int b = GETARG_B(i); + do { + setnilvalue(s2v(ra++)); + } while (b--); + vmbreak; + } + vmcase(OP_GETUPVAL) { + int b = GETARG_B(i); + setobj2s(L, ra, cl->upvals[b]->v); + vmbreak; + } + vmcase(OP_SETUPVAL) { + UpVal *uv = cl->upvals[GETARG_B(i)]; + setobj(L, uv->v, s2v(ra)); + luaC_barrier(L, uv, s2v(ra)); + vmbreak; + } + vmcase(OP_GETTABUP) { + const TValue *slot; + TValue *upval = cl->upvals[GETARG_B(i)]->v; + TValue *rc = KC(i); + TString *key = tsvalue(rc); /* key must be a string */ + if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) { + setobj2s(L, ra, slot); + } + else + Protect(luaV_finishget(L, upval, rc, ra, slot)); + vmbreak; + } + vmcase(OP_GETTABLE) { + const TValue *slot; + TValue *rb = vRB(i); + TValue *rc = vRC(i); + lua_Unsigned n; + if (ttisinteger(rc) /* fast track for integers? */ + ? (n = ivalue(rc), luaV_fastgeti(L, rb, n, slot)) + : luaV_fastget(L, rb, rc, slot, luaH_get)) { + setobj2s(L, ra, slot); + } + else + Protect(luaV_finishget(L, rb, rc, ra, slot)); + vmbreak; + } + vmcase(OP_GETI) { + const TValue *slot; + TValue *rb = vRB(i); + int c = GETARG_C(i); + if (luaV_fastgeti(L, rb, c, slot)) { + setobj2s(L, ra, slot); + } + else { + TValue key; + setivalue(&key, c); + Protect(luaV_finishget(L, rb, &key, ra, slot)); + } + vmbreak; + } + vmcase(OP_GETFIELD) { + const TValue *slot; + TValue *rb = vRB(i); + TValue *rc = KC(i); + TString *key = tsvalue(rc); /* key must be a string */ + if (luaV_fastget(L, rb, key, slot, luaH_getshortstr)) { + setobj2s(L, ra, slot); + } + else + Protect(luaV_finishget(L, rb, rc, ra, slot)); + vmbreak; + } + vmcase(OP_SETTABUP) { + const TValue *slot; + TValue *upval = cl->upvals[GETARG_A(i)]->v; + TValue *rb = KB(i); + TValue *rc = RKC(i); + TString *key = tsvalue(rb); /* key must be a string */ + if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) { + luaV_finishfastset(L, upval, slot, rc); + } + else + Protect(luaV_finishset(L, upval, rb, rc, slot)); + vmbreak; + } + vmcase(OP_SETTABLE) { + const TValue *slot; + TValue *rb = vRB(i); /* key (table is in 'ra') */ + TValue *rc = RKC(i); /* value */ + lua_Unsigned n; + if (ttisinteger(rb) /* fast track for integers? */ + ? (n = ivalue(rb), luaV_fastgeti(L, s2v(ra), n, slot)) + : luaV_fastget(L, s2v(ra), rb, slot, luaH_get)) { + luaV_finishfastset(L, s2v(ra), slot, rc); + } + else + Protect(luaV_finishset(L, s2v(ra), rb, rc, slot)); + vmbreak; + } + vmcase(OP_SETI) { + const TValue *slot; + int c = GETARG_B(i); + TValue *rc = RKC(i); + if (luaV_fastgeti(L, s2v(ra), c, slot)) { + luaV_finishfastset(L, s2v(ra), slot, rc); + } + else { + TValue key; + setivalue(&key, c); + Protect(luaV_finishset(L, s2v(ra), &key, rc, slot)); + } + vmbreak; + } + vmcase(OP_SETFIELD) { + const TValue *slot; + TValue *rb = KB(i); + TValue *rc = RKC(i); + TString *key = tsvalue(rb); /* key must be a string */ + if (luaV_fastget(L, s2v(ra), key, slot, luaH_getshortstr)) { + luaV_finishfastset(L, s2v(ra), slot, rc); + } + else + Protect(luaV_finishset(L, s2v(ra), rb, rc, slot)); + vmbreak; + } + vmcase(OP_NEWTABLE) { + int b = GETARG_B(i); + int c = GETARG_C(i); + Table *t; + L->top = ci->top; /* correct top in case of GC */ + t = luaH_new(L); /* memory allocation */ + sethvalue2s(L, ra, t); + if (b != 0 || c != 0) + luaH_resize(L, t, luaO_fb2int(b), luaO_fb2int(c)); /* idem */ + checkGC(L, ra + 1); + vmbreak; + } + vmcase(OP_SELF) { + const TValue *slot; + TValue *rb = vRB(i); + TValue *rc = RKC(i); + TString *key = tsvalue(rc); /* key must be a string */ + setobj2s(L, ra + 1, rb); + if (luaV_fastget(L, rb, key, slot, luaH_getstr)) { + setobj2s(L, ra, slot); + } + else + Protect(luaV_finishget(L, rb, rc, ra, slot)); + vmbreak; + } + vmcase(OP_ADDI) { + op_arithI(L, l_addi, luai_numadd, TM_ADD, GETARG_k(i)); + vmbreak; + } + vmcase(OP_SUBI) { + op_arithI(L, l_subi, luai_numsub, TM_SUB, 0); + vmbreak; + } + vmcase(OP_MULI) { + op_arithI(L, l_muli, luai_nummul, TM_MUL, GETARG_k(i)); + vmbreak; + } + vmcase(OP_MODI) { + op_arithI(L, luaV_mod, luaV_modf, TM_MOD, 0); + vmbreak; + } + vmcase(OP_POWI) { + op_arithfI(L, luai_numpow, TM_POW); + vmbreak; + } + vmcase(OP_DIVI) { + op_arithfI(L, luai_numdiv, TM_DIV); + vmbreak; + } + vmcase(OP_IDIVI) { + op_arithI(L, luaV_idiv, luai_numidiv, TM_IDIV, 0); + vmbreak; + } + vmcase(OP_ADDK) { + op_arithK(L, l_addi, luai_numadd, TM_ADD, GETARG_k(i)); + vmbreak; + } + vmcase(OP_SUBK) { + op_arithK(L, l_subi, luai_numsub, TM_SUB, 0); + vmbreak; + } + vmcase(OP_MULK) { + op_arithK(L, l_muli, luai_nummul, TM_MUL, GETARG_k(i)); + vmbreak; + } + vmcase(OP_MODK) { + op_arithK(L, luaV_mod, luaV_modf, TM_MOD, 0); + vmbreak; + } + vmcase(OP_POWK) { + op_arithfK(L, luai_numpow, TM_POW); + vmbreak; + } + vmcase(OP_DIVK) { + op_arithfK(L, luai_numdiv, TM_DIV); + vmbreak; + } + vmcase(OP_IDIVK) { + op_arithK(L, luaV_idiv, luai_numidiv, TM_IDIV, 0); + vmbreak; + } + vmcase(OP_ADD) { + op_arith(L, l_addi, luai_numadd, TM_ADD); + vmbreak; + } + vmcase(OP_SUB) { + op_arith(L, l_subi, luai_numsub, TM_SUB); + vmbreak; + } + vmcase(OP_MUL) { + op_arith(L, l_muli, luai_nummul, TM_MUL); + vmbreak; + } + vmcase(OP_MOD) { + op_arith(L, luaV_mod, luaV_modf, TM_MOD); + vmbreak; + } + vmcase(OP_POW) { + op_arithf(L, luai_numpow, TM_POW); + vmbreak; + } + vmcase(OP_DIV) { /* float division (always with floats) */ + op_arithf(L, luai_numdiv, TM_DIV); + vmbreak; + } + vmcase(OP_IDIV) { /* floor division */ + op_arith(L, luaV_idiv, luai_numidiv, TM_IDIV); + vmbreak; + } + vmcase(OP_BANDK) { + op_bitwiseK(L, l_band, TM_BAND); + vmbreak; + } + vmcase(OP_BORK) { + op_bitwiseK(L, l_bor, TM_BOR); + vmbreak; + } + vmcase(OP_BXORK) { + op_bitwiseK(L, l_bxor, TM_BXOR); + vmbreak; + } + vmcase(OP_BAND) { + op_bitwise(L, l_band, TM_BAND); + vmbreak; + } + vmcase(OP_BOR) { + op_bitwise(L, l_bor, TM_BOR); + vmbreak; + } + vmcase(OP_BXOR) { + op_bitwise(L, l_bxor, TM_BXOR); + vmbreak; + } + vmcase(OP_SHRI) { + TValue *rb = vRB(i); + int ic = GETARG_sC(i); + lua_Integer ib; + if (tointegerns(rb, &ib)) { + setivalue(s2v(ra), luaV_shiftl(ib, -ic)); + } + else { + TMS ev = TM_SHR; + if (TESTARG_k(i)) { + ic = -ic; ev = TM_SHL; + } + Protect(luaT_trybiniTM(L, rb, ic, 0, ra, ev)); + } + vmbreak; + } + vmcase(OP_SHLI) { + TValue *rb = vRB(i); + int ic = GETARG_sC(i); + lua_Integer ib; + if (tointegerns(rb, &ib)) { + setivalue(s2v(ra), luaV_shiftl(ic, ib)); + } + else + Protect(luaT_trybiniTM(L, rb, ic, 1, ra, TM_SHL)); + vmbreak; + } + vmcase(OP_SHR) { + TValue *rb = vRB(i); + TValue *rc = vRC(i); + lua_Integer ib; lua_Integer ic; + if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) { + setivalue(s2v(ra), luaV_shiftl(ib, -ic)); + } + else + Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHR)); + vmbreak; + } + vmcase(OP_SHL) { + TValue *rb = vRB(i); + TValue *rc = vRC(i); + lua_Integer ib; lua_Integer ic; + if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) { + setivalue(s2v(ra), luaV_shiftl(ib, ic)); + } + else + Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHL)); + vmbreak; + } + vmcase(OP_UNM) { + TValue *rb = vRB(i); + lua_Number nb; + if (ttisinteger(rb)) { + lua_Integer ib = ivalue(rb); + setivalue(s2v(ra), intop(-, 0, ib)); + } + else if (tonumberns(rb, nb)) { + setfltvalue(s2v(ra), luai_numunm(L, nb)); + } + else + Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM)); + vmbreak; + } + vmcase(OP_BNOT) { + TValue *rb = vRB(i); + lua_Integer ib; + if (tointegerns(rb, &ib)) { + setivalue(s2v(ra), intop(^, ~l_castS2U(0), ib)); + } + else + Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT)); + vmbreak; + } + vmcase(OP_NOT) { + TValue *rb = vRB(i); + int nrb = l_isfalse(rb); /* next assignment may change this value */ + setbvalue(s2v(ra), nrb); + vmbreak; + } + vmcase(OP_LEN) { + Protect(luaV_objlen(L, ra, vRB(i))); + vmbreak; + } + vmcase(OP_CONCAT) { + int n = GETARG_B(i); /* number of elements to concatenate */ + L->top = ra + n; /* mark the end of concat operands */ + ProtectNT(luaV_concat(L, n)); + checkGC(L, L->top); /* 'luaV_concat' ensures correct top */ + vmbreak; + } + vmcase(OP_CLOSE) { + L->top = ra + 1; /* everything is free after this slot */ + Protect(luaF_close(L, ra, LUA_OK)); + vmbreak; + } + vmcase(OP_TBC) { + /* create new to-be-closed upvalue */ + halfProtect(luaF_newtbcupval(L, ra)); + vmbreak; + } + vmcase(OP_JMP) { + dojump(ci, i, 0); + vmbreak; + } + vmcase(OP_EQ) { + TValue *rb = vRB(i); + Protect(cond = luaV_equalobj(L, s2v(ra), rb)); + docondjump(); + vmbreak; + } + vmcase(OP_LT) { + TValue *rb = vRB(i); + if (ttisinteger(s2v(ra)) && ttisinteger(rb)) + cond = (ivalue(s2v(ra)) < ivalue(rb)); + else if (ttisnumber(s2v(ra)) && ttisnumber(rb)) + cond = LTnum(s2v(ra), rb); + else + Protect(cond = lessthanothers(L, s2v(ra), rb)); + docondjump(); + vmbreak; + } + vmcase(OP_LE) { + TValue *rb = vRB(i); + if (ttisinteger(s2v(ra)) && ttisinteger(rb)) + cond = (ivalue(s2v(ra)) <= ivalue(rb)); + else if (ttisnumber(s2v(ra)) && ttisnumber(rb)) + cond = LEnum(s2v(ra), rb); + else + Protect(cond = lessequalothers(L, s2v(ra), rb)); + docondjump(); + vmbreak; + } + vmcase(OP_EQK) { + TValue *rb = KB(i); + /* basic types do not use '__eq'; we can use raw equality */ + cond = luaV_equalobj(NULL, s2v(ra), rb); + docondjump(); + vmbreak; + } + vmcase(OP_EQI) { + int im = GETARG_sB(i); + if (ttisinteger(s2v(ra))) + cond = (ivalue(s2v(ra)) == im); + else if (ttisfloat(s2v(ra))) + cond = luai_numeq(fltvalue(s2v(ra)), cast_num(im)); + else + cond = 0; /* other types cannot be equal to a number */ + docondjump(); + vmbreak; + } + vmcase(OP_LTI) { + int im = GETARG_sB(i); + if (ttisinteger(s2v(ra))) + cond = (ivalue(s2v(ra)) < im); + else if (ttisfloat(s2v(ra))) + cond = luai_numlt(fltvalue(s2v(ra)), cast_num(im)); + else + Protect(cond = luaT_callorderiTM(L, s2v(ra), im, 0, TM_LT)); + docondjump(); + vmbreak; + } + vmcase(OP_LEI) { + int im = GETARG_sB(i); + if (ttisinteger(s2v(ra))) + cond = (ivalue(s2v(ra)) <= im); + else if (ttisfloat(s2v(ra))) + cond = luai_numle(fltvalue(s2v(ra)), cast_num(im)); + else + Protect(cond = luaT_callorderiTM(L, s2v(ra), im, 0, TM_LE)); + docondjump(); + vmbreak; + } + vmcase(OP_GTI) { + int im = GETARG_sB(i); + if (ttisinteger(s2v(ra))) + cond = (im < ivalue(s2v(ra))); + else if (ttisfloat(s2v(ra))) + cond = luai_numlt(cast_num(im), fltvalue(s2v(ra))); + else + Protect(cond = luaT_callorderiTM(L, s2v(ra), im, 1, TM_LT)); + docondjump(); + vmbreak; + } + vmcase(OP_GEI) { + int im = GETARG_sB(i); + if (ttisinteger(s2v(ra))) + cond = (im <= ivalue(s2v(ra))); + else if (ttisfloat(s2v(ra))) + cond = luai_numle(cast_num(im), fltvalue(s2v(ra))); + else + Protect(cond = luaT_callorderiTM(L, s2v(ra), im, 1, TM_LE)); + docondjump(); + vmbreak; + } + vmcase(OP_TEST) { + cond = !l_isfalse(s2v(ra)); + docondjump(); + vmbreak; + } + vmcase(OP_TESTSET) { + TValue *rb = vRB(i); + if (l_isfalse(rb) == GETARG_k(i)) + pc++; + else { + setobj2s(L, ra, rb); + donextjump(ci); + } + vmbreak; + } + vmcase(OP_CALL) { + int b = GETARG_B(i); + int nresults = GETARG_C(i) - 1; + if (b != 0) /* fixed number of arguments? */ + L->top = ra + b; /* top signals number of arguments */ + /* else previous instruction set top */ + ProtectNT(luaD_call(L, ra, nresults)); + vmbreak; + } + vmcase(OP_TAILCALL) { + int b = GETARG_B(i); /* number of arguments + 1 (function) */ + int delta = 0; /* virtual 'func' - real 'func' (vararg functions) */ + if (b != 0) + L->top = ra + b; + else /* previous instruction set top */ + b = cast_int(L->top - ra); + if (TESTARG_k(i)) { + int nparams1 = GETARG_C(i); + if (nparams1) /* vararg function? */ + delta = ci->u.l.nextraargs + nparams1; + /* close upvalues from current call */ + luaF_close(L, base, LUA_OK); + updatestack(ci); + } + if (!ttisfunction(s2v(ra))) { /* not a function? */ + luaD_tryfuncTM(L, ra); /* try '__call' metamethod */ + b++; /* there is now one extra argument */ + } + if (!ttisLclosure(s2v(ra))) { /* C function? */ + ProtectNT(luaD_call(L, ra, LUA_MULTRET)); /* call it */ + updatestack(ci); /* stack may have been relocated */ + ci->func -= delta; + luaD_poscall(L, ci, cast_int(L->top - ra)); + return; + } + else { /* Lua tail call */ + ci->func -= delta; + luaD_pretailcall(L, ci, ra, b); /* prepare call frame */ + goto tailcall; + } + vmbreak; + } + vmcase(OP_RETURN) { + int n = GETARG_B(i) - 1; /* number of results */ + if (n < 0) /* not fixed? */ + n = cast_int(L->top - ra); /* get what is available */ + else + L->top = ra + n; /* set call for 'luaD_poscall' */ + savepc(ci); + if (TESTARG_k(i)) { + int nparams1 = GETARG_C(i); + if (nparams1) /* vararg function? */ + ci->func -= ci->u.l.nextraargs + nparams1; + luaF_close(L, base, LUA_OK); /* there may be open upvalues */ + } + luaD_poscall(L, ci, n); + return; + } + vmcase(OP_RETURN0) { + if (L->hookmask) { + L->top = ra; + halfProtect(luaD_poscall(L, ci, 0)); /* no hurry... */ + } + else { /* do the 'poscall' here */ + int nres = ci->nresults; + L->ci = ci->previous; /* back to caller */ + L->top = base - 1; + while (nres-- > 0) + setnilvalue(s2v(L->top++)); /* all results are nil */ + } + return; + } + vmcase(OP_RETURN1) { + if (L->hookmask) { + L->top = ra + 1; + halfProtect(luaD_poscall(L, ci, 1)); /* no hurry... */ + } + else { /* do the 'poscall' here */ + int nres = ci->nresults; + L->ci = ci->previous; /* back to caller */ + if (nres == 0) + L->top = base - 1; /* asked for no results */ + else { + setobjs2s(L, base - 1, ra); /* at least this result */ + L->top = base; + while (--nres > 0) /* complete missing results */ + setnilvalue(s2v(L->top++)); + } + } + return; + } + vmcase(OP_FORLOOP1) { + lua_Integer idx = intop(+, ivalue(s2v(ra)), 1); /* increment index */ + lua_Integer limit = ivalue(s2v(ra + 1)); + if (idx <= limit) { + pc -= GETARG_Bx(i); /* jump back */ + chgivalue(s2v(ra), idx); /* update internal index... */ + setivalue(s2v(ra + 3), idx); /* ...and external index */ + } + updatetrap(ci); + vmbreak; + } + vmcase(OP_FORPREP1) { + TValue *init = s2v(ra); + TValue *plimit = s2v(ra + 1); + lua_Integer ilimit, initv; + int stopnow; + if (unlikely(!forlimit(plimit, &ilimit, 1, &stopnow))) { + savestate(L, ci); /* for the error message */ + luaG_forerror(L, plimit, "limit"); + } + initv = (stopnow ? 0 : ivalue(init)); + setivalue(plimit, ilimit); + setivalue(init, intop(-, initv, 1)); + pc += GETARG_Bx(i); + vmbreak; + } + vmcase(OP_FORLOOP) { + if (ttisinteger(s2v(ra))) { /* integer loop? */ + lua_Integer step = ivalue(s2v(ra + 2)); + lua_Integer idx = intop(+, ivalue(s2v(ra)), step); /* new index */ + lua_Integer limit = ivalue(s2v(ra + 1)); + if ((0 < step) ? (idx <= limit) : (limit <= idx)) { + pc -= GETARG_Bx(i); /* jump back */ + chgivalue(s2v(ra), idx); /* update internal index... */ + setivalue(s2v(ra + 3), idx); /* ...and external index */ + } + } + else { /* floating loop */ + lua_Number step = fltvalue(s2v(ra + 2)); + lua_Number limit = fltvalue(s2v(ra + 1)); + lua_Number idx = fltvalue(s2v(ra)); + idx = luai_numadd(L, idx, step); /* inc. index */ + if (luai_numlt(0, step) ? luai_numle(idx, limit) + : luai_numle(limit, idx)) { + pc -= GETARG_Bx(i); /* jump back */ + chgfltvalue(s2v(ra), idx); /* update internal index... */ + setfltvalue(s2v(ra + 3), idx); /* ...and external index */ + } + } + updatetrap(ci); + vmbreak; + } + vmcase(OP_FORPREP) { + TValue *init = s2v(ra); + TValue *plimit = s2v(ra + 1); + TValue *pstep = s2v(ra + 2); + lua_Integer ilimit; + int stopnow; + if (ttisinteger(init) && ttisinteger(pstep) && + forlimit(plimit, &ilimit, ivalue(pstep), &stopnow)) { + /* all values are integer */ + lua_Integer initv = (stopnow ? 0 : ivalue(init)); + setivalue(plimit, ilimit); + setivalue(init, intop(-, initv, ivalue(pstep))); + } + else { /* try making all values floats */ + lua_Number ninit; lua_Number nlimit; lua_Number nstep; + savestate(L, ci); /* in case of errors */ + if (unlikely(!tonumber(plimit, &nlimit))) + luaG_forerror(L, plimit, "limit"); + setfltvalue(plimit, nlimit); + if (unlikely(!tonumber(pstep, &nstep))) + luaG_forerror(L, pstep, "step"); + setfltvalue(pstep, nstep); + if (unlikely(!tonumber(init, &ninit))) + luaG_forerror(L, init, "initial value"); + setfltvalue(init, luai_numsub(L, ninit, nstep)); + } + pc += GETARG_Bx(i); + vmbreak; + } + vmcase(OP_TFORPREP) { + if (!ttisnil(s2v(ra + 3))) { /* is 'toclose' not nil? */ + /* create to-be-closed upvalue for it */ + halfProtect(luaF_newtbcupval(L, ra + 3)); + } + pc += GETARG_Bx(i); + i = *(pc++); /* go to next instruction */ + lua_assert(GET_OPCODE(i) == OP_TFORCALL && ra == RA(i)); + goto l_tforcall; + } + vmcase(OP_TFORCALL) { + l_tforcall: + /* 'ra' has the iterator function, 'ra + 1' has the state, + 'ra + 2' has the control variable, and 'ra + 3' has the + to-be-closed variable. The call will use the stack after + these values (starting at 'ra + 4') + */ + /* push function, state, and control variable */ + memcpy(ra + 4, ra, 3 * sizeof(*ra)); + L->top = ra + 4 + 3; + Protect(luaD_call(L, ra + 4, GETARG_C(i))); /* do the call */ + updatestack(ci); /* stack may have changed */ + i = *(pc++); /* go to next instruction */ + ra += 2; /* adjust for next instruction */ + lua_assert(GET_OPCODE(i) == OP_TFORLOOP && ra == RA(i)); + goto l_tforloop; + } + vmcase(OP_TFORLOOP) { + l_tforloop: + if (!ttisnil(s2v(ra + 2))) { /* continue loop? */ + setobjs2s(L, ra, ra + 2); /* save control variable */ + pc -= GETARG_Bx(i); /* jump back */ + } + vmbreak; + } + vmcase(OP_SETLIST) { + int n = GETARG_B(i); + int c = GETARG_C(i); + unsigned int last; + Table *h; + if (n == 0) + n = cast_int(L->top - ra) - 1; + else + L->top = ci->top; /* correct top in case of GC */ + if (c == 0) { + c = GETARG_Ax(*pc); pc++; + } + h = hvalue(s2v(ra)); + last = ((c-1)*LFIELDS_PER_FLUSH) + n; + if (last > luaH_realasize(h)) /* needs more space? */ + luaH_resizearray(L, h, last); /* preallocate it at once */ + for (; n > 0; n--) { + TValue *val = s2v(ra + n); + setobj2t(L, &h->array[last - 1], val); + last--; + luaC_barrierback(L, obj2gco(h), val); + } + vmbreak; + } + vmcase(OP_CLOSURE) { + Proto *p = cl->p->p[GETARG_Bx(i)]; + halfProtect(pushclosure(L, p, cl->upvals, base, ra)); + checkGC(L, ra + 1); + vmbreak; + } + vmcase(OP_VARARG) { + int n = GETARG_C(i) - 1; /* required results */ + Protect(luaT_getvarargs(L, ci, ra, n)); + vmbreak; + } + vmcase(OP_PREPVARARG) { + luaT_adjustvarargs(L, GETARG_A(i), ci, cl->p); + updatetrap(ci); + if (trap) { + luaD_hookcall(L, ci); + L->oldpc = pc + 1; /* next opcode will be seen as a "new" line */ + } + updatebase(ci); /* function has new base after adjustment */ + vmbreak; + } + vmcase(OP_EXTRAARG) { + lua_assert(0); + vmbreak; + } + } + } +} + +/* }================================================================== */ + diff --git a/source/lua/lvm.h b/source/lua/lvm.h new file mode 100644 index 0000000..7e8ec71 --- /dev/null +++ b/source/lua/lvm.h @@ -0,0 +1,123 @@ +/* +** $Id: lvm.h $ +** Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#ifndef lvm_h +#define lvm_h + + +#include "ldo.h" +#include "lobject.h" +#include "ltm.h" + + +#if !defined(LUA_NOCVTN2S) +#define cvt2str(o) ttisnumber(o) +#else +#define cvt2str(o) 0 /* no conversion from numbers to strings */ +#endif + + +#if !defined(LUA_NOCVTS2N) +#define cvt2num(o) ttisstring(o) +#else +#define cvt2num(o) 0 /* no conversion from strings to numbers */ +#endif + + +/* +** You can define LUA_FLOORN2I if you want to convert floats to integers +** by flooring them (instead of raising an error if they are not +** integral values) +*/ +#if !defined(LUA_FLOORN2I) +#define LUA_FLOORN2I 0 +#endif + + +/* convert an object to a float (including string coercion) */ +#define tonumber(o,n) \ + (ttisfloat(o) ? (*(n) = fltvalue(o), 1) : luaV_tonumber_(o,n)) + + +/* convert an object to a float (without string coercion) */ +#define tonumberns(o,n) \ + (ttisfloat(o) ? ((n) = fltvalue(o), 1) : \ + (ttisinteger(o) ? ((n) = cast_num(ivalue(o)), 1) : 0)) + + +/* convert an object to an integer (including string coercion) */ +#define tointeger(o,i) \ + (ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointeger(o,i,LUA_FLOORN2I)) + + +/* convert an object to an integer (without string coercion) */ +#define tointegerns(o,i) \ + (ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointegerns(o,i,LUA_FLOORN2I)) + + +#define intop(op,v1,v2) l_castU2S(l_castS2U(v1) op l_castS2U(v2)) + +#define luaV_rawequalobj(t1,t2) luaV_equalobj(NULL,t1,t2) + + +/* +** fast track for 'gettable': if 't' is a table and 't[k]' is present, +** return 1 with 'slot' pointing to 't[k]' (position of final result). +** Otherwise, return 0 (meaning it will have to check metamethod) +** with 'slot' pointing to an empty 't[k]' (if 't' is a table) or NULL +** (otherwise). 'f' is the raw get function to use. +*/ +#define luaV_fastget(L,t,k,slot,f) \ + (!ttistable(t) \ + ? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \ + : (slot = f(hvalue(t), k), /* else, do raw access */ \ + !isempty(slot))) /* result not empty? */ + + +/* +** Special case of 'luaV_fastget' for integers, inlining the fast case +** of 'luaH_getint'. +*/ +#define luaV_fastgeti(L,t,k,slot) \ + (!ttistable(t) \ + ? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \ + : (slot = (l_castS2U(k) - 1u < hvalue(t)->alimit) \ + ? &hvalue(t)->array[k - 1] : luaH_getint(hvalue(t), k), \ + !isempty(slot))) /* result not empty? */ + + +/* +** Finish a fast set operation (when fast get succeeds). In that case, +** 'slot' points to the place to put the value. +*/ +#define luaV_finishfastset(L,t,slot,v) \ + { setobj2t(L, cast(TValue *,slot), v); \ + luaC_barrierback(L, gcvalue(t), v); } + + + + +LUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2); +LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r); +LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r); +LUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n); +LUAI_FUNC int luaV_tointeger (const TValue *obj, lua_Integer *p, int mode); +LUAI_FUNC int luaV_tointegerns (const TValue *obj, lua_Integer *p, int mode); +LUAI_FUNC int luaV_flttointeger (lua_Number n, lua_Integer *p, int mode); +LUAI_FUNC void luaV_finishget (lua_State *L, const TValue *t, TValue *key, + StkId val, const TValue *slot); +LUAI_FUNC void luaV_finishset (lua_State *L, const TValue *t, TValue *key, + TValue *val, const TValue *slot); +LUAI_FUNC void luaV_finishOp (lua_State *L); +LUAI_FUNC void luaV_execute (lua_State *L, CallInfo *ci); +LUAI_FUNC void luaV_concat (lua_State *L, int total); +LUAI_FUNC lua_Integer luaV_idiv (lua_State *L, lua_Integer x, lua_Integer y); +LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y); +LUAI_FUNC lua_Number luaV_modf (lua_State *L, lua_Number x, lua_Number y); +LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y); +LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb); + +#endif diff --git a/source/lua/lvm.o b/source/lua/lvm.o new file mode 100644 index 0000000000000000000000000000000000000000..a484869db1623f94b4b681487fd5893f612476b9 GIT binary patch literal 38744 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�#W?DU1B`fpizCall6BIVQ#lH0CF`VvpMLy9 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 mPbWJOw~}Mv>J$x + +#include "lua.h" + +#include "llimits.h" +#include "lmem.h" +#include "lstate.h" +#include "lzio.h" + + +int luaZ_fill (ZIO *z) { + size_t size; + lua_State *L = z->L; + const char *buff; + lua_unlock(L); + buff = z->reader(L, z->data, &size); + lua_lock(L); + if (buff == NULL || size == 0) + return EOZ; + z->n = size - 1; /* discount char being returned */ + z->p = buff; + return cast_uchar(*(z->p++)); +} + + +void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) { + z->L = L; + z->reader = reader; + z->data = data; + z->n = 0; + z->p = NULL; +} + + +/* --------------------------------------------------------------- read --- */ +size_t luaZ_read (ZIO *z, void *b, size_t n) { + while (n) { + size_t m; + if (z->n == 0) { /* no bytes in buffer? */ + if (luaZ_fill(z) == EOZ) /* try to read more */ + return n; /* no more input; return number of missing bytes */ + else { + z->n++; /* luaZ_fill consumed first byte; put it back */ + z->p--; + } + } + m = (n <= z->n) ? n : z->n; /* min. between n and z->n */ + memcpy(b, z->p, m); + z->n -= m; + z->p += m; + b = (char *)b + m; + n -= m; + } + return 0; +} + diff --git a/source/lua/lzio.h b/source/lua/lzio.h new file mode 100644 index 0000000..38f397f --- /dev/null +++ b/source/lua/lzio.h @@ -0,0 +1,66 @@ +/* +** $Id: lzio.h $ +** Buffered streams +** See Copyright Notice in lua.h +*/ + + +#ifndef lzio_h +#define lzio_h + +#include "lua.h" + +#include "lmem.h" + + +#define EOZ (-1) /* end of stream */ + +typedef struct Zio ZIO; + +#define zgetc(z) (((z)->n--)>0 ? cast_uchar(*(z)->p++) : luaZ_fill(z)) + + +typedef struct Mbuffer { + char *buffer; + size_t n; + size_t buffsize; +} Mbuffer; + +#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0) + +#define luaZ_buffer(buff) ((buff)->buffer) +#define luaZ_sizebuffer(buff) ((buff)->buffsize) +#define luaZ_bufflen(buff) ((buff)->n) + +#define luaZ_buffremove(buff,i) ((buff)->n -= (i)) +#define luaZ_resetbuffer(buff) ((buff)->n = 0) + + +#define luaZ_resizebuffer(L, buff, size) \ + ((buff)->buffer = luaM_reallocvchar(L, (buff)->buffer, \ + (buff)->buffsize, size), \ + (buff)->buffsize = size) + +#define luaZ_freebuffer(L, buff) luaZ_resizebuffer(L, buff, 0) + + +LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, + void *data); +LUAI_FUNC size_t luaZ_read (ZIO* z, void *b, size_t n); /* read next n bytes */ + + + +/* --------- Private Part ------------------ */ + +struct Zio { + size_t n; /* bytes still unread */ + const char *p; /* current position in buffer */ + lua_Reader reader; /* reader function */ + void *data; /* additional data */ + lua_State *L; /* Lua state (for reader) */ +}; + + +LUAI_FUNC int luaZ_fill (ZIO *z); + +#endif diff --git a/source/lua/lzio.o b/source/lua/lzio.o new file mode 100644 index 0000000000000000000000000000000000000000..4bd1ef5ac17f5c129d3cdc8ca2c2e8fcc6a08688 GIT binary patch literal 1976 zcmbVMUr1A76#wp~c~iT)X3)Z57m85I%O*CmhuGY5-%7+%qcW4LUfFP);_gU&&|q3! zmf%a!Yj4p@Z_%S*WDf=r^<4B6YD7U06s&XZz7KEL8-%~{-E+?GJLi0V&iS@*zPrmK z2!ul*=g5x5Swd#2cJzp)M#uqDOZuq!ix#(KTDs+@r3Hm9_a7I_eKK8IHIC5|7@MEPntgl`jY0m${s{oI=t293*1I$TFQ&v9iO_*uSs759NvGfu#Hrh z5R<|e+OnB!*@i6{t&pnVNZV>!~k*+ZIEsgG139 z(IME7Wp|q&84+4tBZ*k-tkOI%Qpgzv<+R$a23x}g%L>hh!fLQx4TV}N6G~e!6b^=i z9fTah?E!?j%S4!wg{Jx%aRmyY0CyB8015m=CAsKHNJ^nrlB1H?Sx1NrbOh%B+_xWe z9EeBwxhToYo=(Ys-y4^dJ5^DsxmbNc3VKqtQgdugQlc**l;}Ujclu?v~G^rSjUG6n7W@OV0tsc7k3+NfyLx;93#dUkYb7Gs~V z1Rjv}Fn;4Z0c_a#{We~)@fgDqX9{vS_&KgRczzC|=4Z2pHUiR^uE-SEruB@b8v2Yu z)G^J_h&qzb6N^v_xlDRO&&(2abTXUObKsJjG;}r5Gtinhw9yHoTG4uHczjyR>TLDB z3k5>4=bV*{0EcM6NgJFsX@WWIvWU$G)rYJlgN%pgWv#euU`Xj&b!ADnf>*o(6GUIEVP|_NB1Bj&#(Y|yZBC> R>m%p3eu|N;FmH!*{Xg!N-(&y) literal 0 HcmV?d00001 diff --git a/source/lua/makefile b/source/lua/makefile new file mode 100644 index 0000000..3bd319b --- /dev/null +++ b/source/lua/makefile @@ -0,0 +1,198 @@ +# makefile for building Lua +# see INSTALL for installation instructions +# see ../Makefile and luaconf.h for further customization + +# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= + +# Warnings valid for both C and C++ +CWARNSCPP= \ + -Wextra \ + -Wshadow \ + -Wsign-compare \ + -Wundef \ + -Wwrite-strings \ + -Wredundant-decls \ + -Wdisabled-optimization \ + -Wdouble-promotion \ + #-Wno-aggressive-loop-optimizations \ + #-Wlogical-op \ + #-Wfatal-errors \ + #-Wstrict-aliasing=3 \ + # -Werror \ + # -pedantic # warns if we use jump tables \ + # the next warnings generate too much noise, so they are disabled + # -Wconversion -Wno-sign-conversion \ + # -Wsign-conversion \ + # -Wstrict-overflow=2 \ + # -Wformat=2 \ + # -Wcast-qual \ + +# The next warnings are neither valid nor needed for C++ +CWARNSC= -Wdeclaration-after-statement \ + -Wmissing-prototypes \ + -Wnested-externs \ + -Wstrict-prototypes \ + -Wc++-compat \ + -Wold-style-definition \ + + +CWARNS= $(CWARNSCPP) $(CWARNSC) + + +# -DEXTERNMEMCHECK -DHARDSTACKTESTS -DHARDMEMTESTS -DTRACEMEM='"tempmem"' +# -DMAXINDEXRK=1 +# -g -DLUA_USER_H='"ltests.h"' +# -pg -malign-double +# -DLUA_USE_CTYPE -DLUA_USE_APICHECK +# ('-ftrapv' for runtime checks of integer overflows) +# -fsanitize=undefined -ftrapv -fno-inline +TESTS= -DLUA_USER_H='"ltests.h"' -O0 + + +# LOCAL = $(TESTS) $(CWARNS) -g + + +# enable Linux goodies +MYCFLAGS= $(LOCAL) -std=c99 -DLUA_USE_LINUX -DLUA_USE_READLINE +MYLDFLAGS= $(LOCAL) -Wl,-E +MYLIBS= -ldl -lreadline + + +CC= gcc +CFLAGS= -Wall -O2 $(MYCFLAGS) -fno-stack-protector -fno-common -march=native +AR= ar rc +RANLIB= ranlib +RM= rm -f + + + +# == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE ========= + + +LIBS = -lm + +CORE_T= liblua.a +CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o \ + lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o \ + ltm.o lundump.o lvm.o lzio.o ltests.o +AUX_O= lauxlib.o +LIB_O= lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o lstrlib.o \ + lutf8lib.o loadlib.o lcorolib.o linit.o + +LUA_T= lua +LUA_O= lua.o + +# LUAC_T= luac +# LUAC_O= luac.o print.o + +ALL_T= $(CORE_T) $(LUA_T) $(LUAC_T) +ALL_O= $(CORE_O) $(LUA_O) $(LUAC_O) $(AUX_O) $(LIB_O) +ALL_A= $(CORE_T) + +all: $(ALL_T) + touch all + +o: $(ALL_O) + +a: $(ALL_A) + +$(CORE_T): $(CORE_O) $(AUX_O) $(LIB_O) + $(AR) $@ $? + $(RANLIB) $@ + +$(LUA_T): $(LUA_O) $(CORE_T) + $(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(CORE_T) $(LIBS) $(MYLIBS) $(DL) + +$(LUAC_T): $(LUAC_O) $(CORE_T) + $(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(CORE_T) $(LIBS) $(MYLIBS) + +clean: + rcsclean -u + $(RM) $(ALL_T) $(ALL_O) + +depend: + @$(CC) $(CFLAGS) -MM *.c + +echo: + @echo "CC = $(CC)" + @echo "CFLAGS = $(CFLAGS)" + @echo "AR = $(AR)" + @echo "RANLIB = $(RANLIB)" + @echo "RM = $(RM)" + @echo "MYCFLAGS = $(MYCFLAGS)" + @echo "MYLDFLAGS = $(MYLDFLAGS)" + @echo "MYLIBS = $(MYLIBS)" + @echo "DL = $(DL)" + +$(ALL_O): makefile ltests.h + +# DO NOT EDIT +# automatically made with 'gcc -MM l*.c' + +lapi.o: lapi.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lstring.h \ + ltable.h lundump.h lvm.h +lauxlib.o: lauxlib.c lprefix.h lua.h luaconf.h lauxlib.h +lbaselib.o: lbaselib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lcode.o: lcode.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ + llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ + ldo.h lgc.h lstring.h ltable.h lvm.h +lcorolib.o: lcorolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lctype.o: lctype.c lprefix.h lctype.h lua.h luaconf.h llimits.h +ldblib.o: ldblib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ldebug.o: ldebug.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h lcode.h llex.h lopcodes.h lparser.h \ + ldebug.h ldo.h lfunc.h lstring.h lgc.h ltable.h lvm.h +ldo.o: ldo.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lopcodes.h \ + lparser.h lstring.h ltable.h lundump.h lvm.h +ldump.o: ldump.c lprefix.h lua.h luaconf.h lobject.h llimits.h lstate.h \ + ltm.h lzio.h lmem.h lundump.h +lfunc.o: lfunc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h +lgc.o: lgc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h +linit.o: linit.c lprefix.h lua.h luaconf.h lualib.h lauxlib.h +liolib.o: liolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +llex.o: llex.c lprefix.h lua.h luaconf.h lctype.h llimits.h ldebug.h \ + lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lgc.h llex.h lparser.h \ + lstring.h ltable.h +lmathlib.o: lmathlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lmem.o: lmem.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h +loadlib.o: loadlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lobject.o: lobject.c lprefix.h lua.h luaconf.h lctype.h llimits.h \ + ldebug.h lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h \ + lvm.h +lopcodes.o: lopcodes.c lprefix.h lopcodes.h llimits.h lua.h luaconf.h +loslib.o: loslib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lparser.o: lparser.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ + llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ + ldo.h lfunc.h lstring.h lgc.h ltable.h +lstate.o: lstate.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h llex.h \ + lstring.h ltable.h +lstring.o: lstring.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ + lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h +lstrlib.o: lstrlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ltable.o: ltable.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h +ltablib.o: ltablib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ltests.o: ltests.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h lauxlib.h lcode.h llex.h lopcodes.h \ + lparser.h lctype.h ldebug.h ldo.h lfunc.h lopnames.h lstring.h lgc.h \ + ltable.h lualib.h +ltm.o: ltm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h +lua.o: lua.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lundump.o: lundump.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ + lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h \ + lundump.h +lutf8lib.o: lutf8lib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lvm.o: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h \ + ltable.h lvm.h ljumptab.h +lzio.o: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \ + lobject.h ltm.h lzio.h + +# (end of Makefile) diff --git a/source/lua/manual/2html b/source/lua/manual/2html new file mode 100644 index 0000000..04b2c61 --- /dev/null +++ b/source/lua/manual/2html @@ -0,0 +1,518 @@ +#!/usr/bin/env lua5.3 + + +-- special marks: +-- \1 - paragraph (empty line) +-- \4 - remove spaces around it +-- \3 - ref (followed by label|) + +--------------------------------------------------------------- +header = [[ + + + + +Lua 5.4 Reference Manual + + + + + + + +


+

+[Lua logo] +Lua 5.4 Reference Manual +

+ +by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes +

+ +Copyright +© 2018 Lua.org, PUC-Rio. All rights reserved. + +


+ + +

+ +]] + +footer = "\n\n\n\n" + +local seefmt = '(see %s)' + +if arg[1] == 'port' then + seefmt = '(ver %s)' + header = string.gsub(header, "by (.-)\n", + "%1\n

Tradução: Sérgio Queiroz de Medeiros", 1) + header = string.gsub(header, "Lua (%d+.%d+) Reference Manual", + "Manual de Referência de Lua %1") + header = string.gsub(header, "All rights reserved", + "Todos os direitos reservados") +end + + +--------------------------------------------------------------- + +local function compose (f,g) + assert(f and g) + return function (s) return g(f(s)) end +end + +local function concat (f, g) + assert(f and g) + return function (s) return f(s) .. g(s) end +end + + +local Tag = {} + + +setmetatable(Tag, { + __index = function (t, tag) + local v = function (n, att) + local e = "" + if type(att) == "table" then + for k,v in pairs(att) do e = string.format('%s %s="%s"', e, k, v) end + end + if n then + return string.format("<%s%s>%s", tag, e, n, tag) + else + return string.format("<%s%s>", tag, e) + end + end + t[tag] = v + return v + end +}) + + + +--------------------------------------------------------------- +local labels = {} + + +local function anchor (text, label, link, textlink) + if labels[label] then + error("label " .. label .. " already defined") + end + labels[label] = {text = textlink, link = link} + return Tag.a(text, {name=link}) +end + +local function makeref (label) + assert(not string.find(label, "|")) + return string.format("\3%s\3", label) +end + +local function ref (label) + local l = labels[label] + if not l then + io.stderr:write("label ", label, " undefined\n") + return "@@@@@@@" + else + return Tag.a(l.text, {href="#"..l.link}) + end +end + +--------------------------------------------------------------- +local function nopara (t) + t = string.gsub(t, "\1", "\n\n") + t = string.gsub(t, "

%s*

", "") + return t +end + +local function fixpara (t) + t = string.gsub(t, "\1", "\n

\n\n

\n") + t = string.gsub(t, "

%s*

", "") + return t +end + +local function antipara (t) + return "

\n" .. t .. "

" +end + + +Tag.pre = compose(Tag.pre, antipara) +Tag.ul = compose(Tag.ul, antipara) + +--------------------------------------------------------------- +local Gfoots = 0 +local footnotes = {} + +local line = Tag.hr(nil) + +local function dischargefoots () + if #footnotes == 0 then return "" end + local fn = table.concat(footnotes) + footnotes = {} + return line .. Tag.h3"footnotes:" .. fn .. line +end + + +local Glists = 0 +local listings = {} + +local function dischargelist () + if #listings == 0 then return "" end + local l = listings + listings = {} + return line .. table.concat(l, line..line) .. line +end + +--------------------------------------------------------------- +local counters = { +h1 = {val = 1}, +h2 = {father = "h1", val = 1}, +h3 = {father = "h2", val = 1}, +listing = {father = "h1", val = 1}, +} + +local function inccounter (count) + counters[count].val = counters[count].val + 1 + for c, v in pairs(counters) do + if v.father == count then v.val = 1 end + end +end + +local function getcounter (count) + local c = counters[count] + if c.father then + return getcounter(c.father) .. "." .. c.val + else + return c.val .. "" + end +end +--------------------------------------------------------------- + + +local function fixed (x) + return function () return x end +end + +local function id (x) return x end + + +local function prepos (x, y) + assert(x and y) + return function (s) return string.format("%s%s%s", x, s, y) end +end + + +local rw = Tag.b + + + + +local function LuaName (name) + return Tag.code(name) +end + + +local function getparam (s) + local i, e = string.find(s, "^[^%s@|]+|") + if not i then return nil, s + else return string.sub(s, i, e - 1), string.sub(s, e + 1) + end +end + + +local function gettitle (h) + local title, p = assert(string.match(h, "(.-)()")) + return title, string.sub(h, p) +end + +local function getparamtitle (what, h, nonum) + local label, title, c, count + label, h = getparam(h) + title, h = gettitle(h) + if not nonum then + count = getcounter(what) + inccounter(what) + c = string.format("%s – ", count) + else + c = "" + end + label = label or count + if label then + title = anchor(title, label, count, "§"..count) + end + title = string.format("%s%s", c, title) + return title, h +end + +local function section (what, nonum) + return function (h) + local title + title, h = getparamtitle(what, h, nonum) + local fn = what == "h1" and dischargefoots() or "" + h = fixpara(Tag.p(h)) + return "

\n" .. Tag[what](title) .. h .. fn .. + dischargelist() .. "

" + end +end + + +local function verbatim (s) + s = nopara(s) + s = string.gsub(s, "\n", "\n ") + s = string.gsub(s, "\n%s*$", "\n") + return Tag.pre(s) +end + + +local function verb (s) + return Tag.code(s) +end + + +local function lua2link (e) + return string.find(e, "luaL?_") and e or "pdf-"..e +end + + +local verbfixed = verb + + +local Tex = { + +ANSI = function (func) + return "ISO C function " .. Tag.code(func) + end, +At = fixed"@", +B = Tag.b, +bigskip = fixed"", +bignum = id, +C = fixed"", +Ci = prepos(""), +CId = function (func) + return "C function " .. Tag.code(func) + end, +chapter = section"h1", +Char = compose(verbfixed, prepos("'", "'")), +Cdots = fixed"···", +Close = fixed"}", +col = Tag.td, +defid = function (name) + local l = lua2link(name) + local c = Tag.code(name) + return anchor(c, l, l, c) + end, +def = Tag.em, +description = compose(nopara, Tag.ul), +Em = fixed("\4" .. "—" .. "\4"), +emph = Tag.em, +emphx = Tag.em, -- emphasis plus index (if there was an index) +En = fixed("–"), +format = fixed"", +["false"] = fixed(Tag.b"false"), +id = Tag.code, +idx = Tag.code, +index = fixed"", +Lidx = fixed"", -- Tag.code, +ldots = fixed"...", +x = id, +itemize = compose(nopara, Tag.ul), +leq = fixed"≤", +Lid = function (s) + return makeref(lua2link(s)) + end, +M = Tag.em, +N = function (s) return (string.gsub(s, " ", " ")) end, +NE = id, -- tag"foreignphrase", +num = id, +["nil"] = fixed(Tag.b"nil"), +Open = fixed"{", +part = section("h1", true), +Pat = compose(verbfixed, prepos("'", "'")), +preface = section("h1", true), +psect = section("h2", true), +Q = prepos('"', '"'), +refchp = makeref, +refcode = makeref, +refsec = makeref, + +pi = fixed"π", +rep = Tag.em, -- compose(prepos("<", ">"), Tag.em), +Rw = rw, +rw = rw, +sb = Tag.sub, +sp = Tag.sup, +St = compose(verbfixed, prepos('"', '"')), +sect1 = section"h1", +sect2 = section"h2", +sect3 = section"h3", +sect4 = section("h4", true), +simplesect = id, +Tab2 = function (s) return Tag.table(s, {border=1}) end, +row = Tag.tr, +title = Tag.title, +todo = Tag.todo, +["true"] = fixed(Tag.b"true"), +T = verb, + +item = function (s) + local t, p = string.match(s, "^([^\n|]+)|()") + if t then + s = string.sub(s, p) + s = Tag.b(t..": ") .. s + end + return Tag.li(fixpara(s)) + end, + +verbatim = verbatim, + +manual = id, + + +-- for the manual + +link =function (s) + local l, t = getparam(s) + assert(l) + return string.format("%s (%s)", t, makeref(l)) +end, + +see = function (s) return string.format(seefmt, makeref(s)) end, +See = makeref, +seeC = function (s) + return string.format(seefmt, makeref(s)) + end, + +seeF = function (s) + return string.format(seefmt, makeref(lua2link(s))) + end, + +APIEntry = function (e) + local h, name + h, e = string.match(e, "^%s*(.-)%s*|(.*)$") + name = string.match(h, "(luaL?_[%w_]+)%)? +%(") or + string.match(h, "luaL?_[%w_]+") + local a = anchor(Tag.code(name), name, name, Tag.code(name)) + local apiicmd, ne = string.match(e, "^(.-)(.*)") +--io.stderr:write(e) + if not apiicmd then + return antipara(Tag.hr() .. Tag.h3(a)) .. Tag.pre(h) .. e + else + return antipara(Tag.hr() .. Tag.h3(a)) .. apiicmd .. Tag.pre(h) .. ne + end +end, + +LibEntry = function (e) + local h, name + h, e = string.match(e, "^(.-)|(.*)$") + name = string.gsub(h, " (.+", "") + local l = lua2link(name) + local a = anchor(Tag.code(h), l, l, Tag.code(name)) + return Tag.hr() .. Tag.h3(a) .. e +end, + +Produc = compose(nopara, Tag.pre), +producname = prepos("\t", " ::= "), +Or = fixed" | ", +VerBar = fixed"|", -- vertical bar +OrNL = fixed" | \4", +bnfNter = prepos("", ""), +bnfopt = prepos("[", "]"), +bnfrep = prepos("{", "}"), +bnfter = compose(Tag.b, prepos("‘", "’")), +producbody = function (s) + s = string.gsub(s, "%s+", " ") + s = string.gsub(s, "\4", "\n\t\t") + return s + end, + +apii = function (s) + local pop,push,err = string.match(s, "^(.-),(.-),(.*)$") + if pop ~= "?" and string.find(pop, "%W") then + pop = "(" .. pop .. ")" + end + if push ~= "?" and string.find(push, "%W") then + push = "(" .. push .. ")" + end + err = (err == "-") and "–" or Tag.em(err) + return Tag.span( + string.format("[-%s, +%s, %s]", pop, push, err), + {class="apii"} + ) + end, +} + +local others = prepos("?? "," ??") + +local function trata (t) + t = string.gsub(t, "@(%w+)(%b{})", function (w, f) + f = trata(string.sub(f, 2, -2)) + if type(Tex[w]) ~= "function" then + io.stderr:write(w .. "\n") + return others(f) + else + return Tex[w](f, w) + end + end) + return t +end + + +--------------------------------------------------------------------- +--------------------------------------------------------------------- + +-- read whole book +t = io.read"*a" + +t = string.gsub(t, "[<>&\128-\255]", + {["<"] = "<", + [">"] = ">", + ["&"] = "&", + ["\170"] = "ª", + ["\186"] = "º", + ["\192"] = "À", + ["\193"] = "Á", + ["\194"] = "Â", + ["\195"] = "Ã", + ["\199"] = "Ç", + ["\201"] = "É", + ["\202"] = "Ê", + ["\205"] = "Í", + ["\211"] = "Ó", + ["\212"] = "Ô", + ["\218"] = "Ú", + ["\224"] = "à", + ["\225"] = "á", + ["\226"] = "â", + ["\227"] = "ã", + ["\231"] = "ç", + ["\233"] = "é", + ["\234"] = "ê", + ["\237"] = "í", + ["\243"] = "ó", + ["\244"] = "ô", + ["\245"] = "õ", + ["\250"] = "ú", + ["\252"] = "ü" + }) + +t = string.gsub(t, "\n\n+", "\1") + + + +-- complete macros with no arguments +t = string.gsub(t, "(@%w+)([^{%w])", "%1{}%2") + +t = trata(t) + +-- correct references +t = string.gsub(t, "\3(.-)\3", ref) + +-- remove extra space (??) +t = string.gsub(t, "%s*\4%s*", "") + +t = nopara(t) + +-- HTML 3.2 does not need

(but complains when it is in wrong places :) +t = string.gsub(t, "

", "") + +io.write(header, t, footer) + diff --git a/source/lua/manual/manual.of b/source/lua/manual/manual.of new file mode 100644 index 0000000..8a8ebad --- /dev/null +++ b/source/lua/manual/manual.of @@ -0,0 +1,8972 @@ +@Ci{$Id: manual.of $} +@C{[(-------------------------------------------------------------------------} +@manual{ + +@sect1{@title{Introduction} + +Lua is a powerful, efficient, lightweight, embeddable scripting language. +It supports procedural programming, +object-oriented programming, functional programming, +data-driven programming, and data description. + +Lua combines simple procedural syntax with powerful data description +constructs based on associative arrays and extensible semantics. +Lua is dynamically typed, +runs by interpreting bytecode with a register-based +virtual machine, +and has automatic memory management with +incremental garbage collection, +making it ideal for configuration, scripting, +and rapid prototyping. + +Lua is implemented as a library, written in @emphx{clean C}, +the common subset of @N{Standard C} and C++. +The Lua distribution includes a host program called @id{lua}, +which uses the Lua library to offer a complete, +standalone Lua interpreter, +for interactive or batch use. +Lua is intended to be used both as a powerful, lightweight, +embeddable scripting language for any program that needs one, +and as a powerful but lightweight and efficient stand-alone language. + +As an extension language, Lua has no notion of a @Q{main} program: +it works @emph{embedded} in a host client, +called the @emph{embedding program} or simply the @emphx{host}. +(Frequently, this host is the stand-alone @id{lua} program.) +The host program can invoke functions to execute a piece of Lua code, +can write and read Lua variables, +and can register @N{C functions} to be called by Lua code. +Through the use of @N{C functions}, Lua can be augmented to cope with +a wide range of different domains, +thus creating customized programming languages sharing a syntactical framework. + +Lua is free software, +and is provided as usual with no guarantees, +as stated in its license. +The implementation described in this manual is available +at Lua's official web site, @id{www.lua.org}. + +Like any other reference manual, +this document is dry in places. +For a discussion of the decisions behind the design of Lua, +see the technical papers available at Lua's web site. +For a detailed introduction to programming in Lua, +see Roberto's book, @emphx{Programming in Lua}. + +} + + +@C{-------------------------------------------------------------------------} +@sect1{basic| @title{Basic Concepts} + +This section describes the basic concepts of the language. + +@sect2{TypesSec| @title{Values and Types} + +Lua is a dynamically typed language. +This means that +variables do not have types; only values do. +There are no type definitions in the language. +All values carry their own type. + +All values in Lua are first-class values. +This means that all values can be stored in variables, +passed as arguments to other functions, and returned as results. + +There are eight @x{basic types} in Lua: +@def{nil}, @def{boolean}, @def{number}, +@def{string}, @def{function}, @def{userdata}, +@def{thread}, and @def{table}. +The type @emph{nil} has one single value, @nil, +whose main property is to be different from any other value; +it usually represents the absence of a useful value. +The type @emph{boolean} has two values, @false and @true. +Both @nil and @false make a condition false; +any other value makes it true. + +The type @emph{number} represents both +integer numbers and real (floating-point) numbers, +using two @x{subtypes}: @def{integer} and @def{float}. +Standard Lua uses 64-bit integers and double-precision (64-bit) floats, +but you can also compile Lua so that it +uses 32-bit integers and/or single-precision (32-bit) floats. +The option with 32 bits for both integers and floats +is particularly attractive +for small machines and embedded systems. +(See macro @id{LUA_32BITS} in file @id{luaconf.h}.) + +Lua has explicit rules about when each subtype is used, +but it also converts between them automatically as needed @see{coercion}. +Therefore, +the programmer may choose to mostly ignore the difference +between integers and floats +or to assume complete control over the representation of each number. + +The type @emph{string} represents immutable sequences of bytes. +@index{eight-bit clean} +Lua is 8-bit clean: +strings can contain any 8-bit value, +including @x{embedded zeros} (@Char{\0}). +Lua is also encoding-agnostic; +it makes no assumptions about the contents of a string. +The length of any string in Lua must fit in a Lua integer. + +Lua can call (and manipulate) functions written in Lua and +functions written in C @see{functioncall}. +Both are represented by the type @emph{function}. + +The type @emph{userdata} is provided to allow arbitrary @N{C data} to +be stored in Lua variables. +A userdata value represents a block of raw memory. +There are two kinds of userdata: +@emphx{full userdata}, +which is an object with a block of memory managed by Lua, +and @emphx{light userdata}, +which is simply a @N{C pointer} value. +Userdata has no predefined operations in Lua, +except assignment and identity test. +By using @emph{metatables}, +the programmer can define operations for full userdata values +@see{metatable}. +Userdata values cannot be created or modified in Lua, +only through the @N{C API}. +This guarantees the integrity of data owned by the host program. + +The type @def{thread} represents independent threads of execution +and it is used to implement coroutines @see{coroutine}. +Lua threads are not related to operating-system threads. +Lua supports coroutines on all systems, +even those that do not support threads natively. + +The type @emph{table} implements @x{associative arrays}, +that is, @x{arrays} that can have as indices not only numbers, +but any Lua value except @nil and @x{NaN}. +(@emphx{Not a Number} is a special floating-point value +used by the @x{IEEE 754} standard to represent +undefined numerical results, such as @T{0/0}.) +Tables can be @emph{heterogeneous}; +that is, they can contain values of all types (except @nil). +Any key with value @nil is not considered part of the table. +Conversely, any key that is not part of a table has +an associated value @nil. + +Tables are the sole data-structuring mechanism in Lua; +they can be used to represent ordinary arrays, lists, +symbol tables, sets, records, graphs, trees, etc. +To represent @x{records}, Lua uses the field name as an index. +The language supports this representation by +providing @id{a.name} as syntactic sugar for @T{a["name"]}. +There are several convenient ways to create tables in Lua +@see{tableconstructor}. + +Like indices, +the values of table fields can be of any type. +In particular, +because functions are first-class values, +table fields can contain functions. +Thus tables can also carry @emph{methods} @see{func-def}. + +The indexing of tables follows +the definition of raw equality in the language. +The expressions @T{a[i]} and @T{a[j]} +denote the same table element +if and only if @id{i} and @id{j} are raw equal +(that is, equal without metamethods). +In particular, floats with integral values +are equal to their respective integers +(e.g., @T{1.0 == 1}). +To avoid ambiguities, +any float with integral value used as a key +is converted to its respective integer. +For instance, if you write @T{a[2.0] = true}, +the actual key inserted into the table will be the +integer @T{2}. +(On the other hand, +2 and @St{2} are different Lua values and therefore +denote different table entries.) + + +Tables, functions, threads, and (full) userdata values are @emph{objects}: +variables do not actually @emph{contain} these values, +only @emph{references} to them. +Assignment, parameter passing, and function returns +always manipulate references to such values; +these operations do not imply any kind of copy. + +The library function @Lid{type} returns a string describing the type +of a given value @see{predefined}. + +} + +@sect2{globalenv| @title{Environments and the Global Environment} + +As will be discussed in @refsec{variables} and @refsec{assignment}, +any reference to a free name +(that is, a name not bound to any declaration) @id{var} +is syntactically translated to @T{_ENV.var}. +Moreover, every chunk is compiled in the scope of +an external local variable named @id{_ENV} @see{chunks}, +so @id{_ENV} itself is never a free name in a chunk. + +Despite the existence of this external @id{_ENV} variable and +the translation of free names, +@id{_ENV} is a completely regular name. +In particular, +you can define new variables and parameters with that name. +Each reference to a free name uses the @id{_ENV} that is +visible at that point in the program, +following the usual visibility rules of Lua @see{visibility}. + +Any table used as the value of @id{_ENV} is called an @def{environment}. + +Lua keeps a distinguished environment called the @def{global environment}. +This value is kept at a special index in the C registry @see{registry}. +In Lua, the global variable @Lid{_G} is initialized with this same value. +(@Lid{_G} is never used internally.) + +When Lua loads a chunk, +the default value for its @id{_ENV} upvalue +is the global environment @seeF{load}. +Therefore, by default, +free names in Lua code refer to entries in the global environment +(and, therefore, they are also called @def{global variables}). +Moreover, all standard libraries are loaded in the global environment +and some functions there operate on that environment. +You can use @Lid{load} (or @Lid{loadfile}) +to load a chunk with a different environment. +(In C, you have to load the chunk and then change the value +of its first upvalue.) + +} + +@sect2{error| @title{Error Handling} + +Because Lua is an embedded extension language, +all Lua actions start from @N{C code} in the host program +calling a function from the Lua library. +(When you use Lua standalone, +the @id{lua} application is the host program.) +Whenever an error occurs during +the compilation or execution of a Lua chunk, +control returns to the host, +which can take appropriate measures +(such as printing an error message). + +Lua code can explicitly generate an error by calling the +@Lid{error} function. +If you need to catch errors in Lua, +you can use @Lid{pcall} or @Lid{xpcall} +to call a given function in @emphx{protected mode}. + +Whenever there is an error, +an @def{error object} (also called an @def{error message}) +is propagated with information about the error. +Lua itself only generates errors whose error object is a string, +but programs may generate errors with +any value as the error object. +It is up to the Lua program or its host to handle such error objects. + + +When you use @Lid{xpcall} or @Lid{lua_pcall}, +you may give a @def{message handler} +to be called in case of errors. +This function is called with the original error object +and returns a new error object. +It is called before the error unwinds the stack, +so that it can gather more information about the error, +for instance by inspecting the stack and creating a stack traceback. +This message handler is still protected by the protected call; +so, an error inside the message handler +will call the message handler again. +If this loop goes on for too long, +Lua breaks it and returns an appropriate message. +(The message handler is called only for regular runtime errors. +It is not called for memory-allocation errors +nor for errors while running finalizers.) + +} + +@sect2{metatable| @title{Metatables and Metamethods} + +Every value in Lua can have a @emph{metatable}. +This @def{metatable} is an ordinary Lua table +that defines the behavior of the original value +under certain special operations. +You can change several aspects of the behavior +of operations over a value by setting specific fields in its metatable. +For instance, when a non-numeric value is the operand of an addition, +Lua checks for a function in the field @St{__add} of the value's metatable. +If it finds one, +Lua calls this function to perform the addition. + +The key for each event in a metatable is a string +with the event name prefixed by two underscores; +the corresponding values are called @def{metamethods}. +In the previous example, the key is @St{__add} +and the metamethod is the function that performs the addition. +Unless stated otherwise, +metamethods should be function values. + +You can query the metatable of any value +using the @Lid{getmetatable} function. +Lua queries metamethods in metatables using a raw access @seeF{rawget}. +So, to retrieve the metamethod for event @id{ev} in object @id{o}, +Lua does the equivalent to the following code: +@verbatim{ +rawget(getmetatable(@rep{o}) or {}, "__@rep{ev}") +} + +You can replace the metatable of tables +using the @Lid{setmetatable} function. +You cannot change the metatable of other types from Lua code +(except by using the @link{debuglib|debug library}); +you should use the @N{C API} for that. + +Tables and full userdata have individual metatables +(although multiple tables and userdata can share their metatables). +Values of all other types share one single metatable per type; +that is, there is one single metatable for all numbers, +one for all strings, etc. +By default, a value has no metatable, +but the string library sets a metatable for the string type @see{strlib}. + +A metatable controls how an object behaves in +arithmetic operations, bitwise operations, +order comparisons, concatenation, length operation, calls, and indexing. +A metatable also can define a function to be called +when a userdata or a table is @link{GC|garbage collected}. + +For the unary operators (negation, length, and bitwise NOT), +the metamethod is computed and called with a dummy second operand, +equal to the first one. +This extra operand is only to simplify Lua's internals +(by making these operators behave like a binary operation) +and may be removed in future versions. +(For most uses this extra operand is irrelevant.) + +A detailed list of events controlled by metatables is given next. +Each operation is identified by its corresponding key. + +@description{ + +@item{@idx{__add}| +the addition (@T{+}) operation. +If any operand for an addition is not a number +(nor a string coercible to a number), +Lua will try to call a metamethod. +First, Lua will check the first operand (even if it is valid). +If that operand does not define a metamethod for @idx{__add}, +then Lua will check the second operand. +If Lua can find a metamethod, +it calls the metamethod with the two operands as arguments, +and the result of the call +(adjusted to one value) +is the result of the operation. +Otherwise, +it raises an error. +} + +@item{@idx{__sub}| +the subtraction (@T{-}) operation. +Behavior similar to the addition operation. +} + +@item{@idx{__mul}| +the multiplication (@T{*}) operation. +Behavior similar to the addition operation. +} + +@item{@idx{__div}| +the division (@T{/}) operation. +Behavior similar to the addition operation. +} + +@item{@idx{__mod}| +the modulo (@T{%}) operation. +Behavior similar to the addition operation. +} + +@item{@idx{__pow}| +the exponentiation (@T{^}) operation. +Behavior similar to the addition operation. +} + +@item{@idx{__unm}| +the negation (unary @T{-}) operation. +Behavior similar to the addition operation. +} + +@item{@idx{__idiv}| +the floor division (@T{//}) operation. +Behavior similar to the addition operation. +} + +@item{@idx{__band}| +the bitwise AND (@T{&}) operation. +Behavior similar to the addition operation, +except that Lua will try a metamethod +if any operand is neither an integer +nor a value coercible to an integer @see{coercion}. +} + +@item{@idx{__bor}| +the bitwise OR (@T{|}) operation. +Behavior similar to the bitwise AND operation. +} + +@item{@idx{__bxor}| +the bitwise exclusive OR (binary @T{~}) operation. +Behavior similar to the bitwise AND operation. +} + +@item{@idx{__bnot}| +the bitwise NOT (unary @T{~}) operation. +Behavior similar to the bitwise AND operation. +} + +@item{@idx{__shl}| +the bitwise left shift (@T{<<}) operation. +Behavior similar to the bitwise AND operation. +} + +@item{@idx{__shr}| +the bitwise right shift (@T{>>}) operation. +Behavior similar to the bitwise AND operation. +} + +@item{@idx{__concat}| +the concatenation (@T{..}) operation. +Behavior similar to the addition operation, +except that Lua will try a metamethod +if any operand is neither a string nor a number +(which is always coercible to a string). +} + +@item{@idx{__len}| +the length (@T{#}) operation. +If the object is not a string, +Lua will try its metamethod. +If there is a metamethod, +Lua calls it with the object as argument, +and the result of the call +(always adjusted to one value) +is the result of the operation. +If there is no metamethod but the object is a table, +then Lua uses the table length operation @see{len-op}. +Otherwise, Lua raises an error. +} + +@item{@idx{__eq}| +the equal (@T{==}) operation. +Behavior similar to the addition operation, +except that Lua will try a metamethod only when the values +being compared are either both tables or both full userdata +and they are not primitively equal. +The result of the call is always converted to a boolean. +} + +@item{@idx{__lt}| +the less than (@T{<}) operation. +Behavior similar to the addition operation, +except that Lua will try a metamethod only when the values +being compared are neither both numbers nor both strings. +The result of the call is always converted to a boolean. +} + +@item{@idx{__le}| +the less equal (@T{<=}) operation. +Behavior similar to the less than operation. +} + +@item{@idx{__index}| +The indexing access operation @T{table[key]}. +This event happens when @id{table} is not a table or +when @id{key} is not present in @id{table}. +The metamethod is looked up in @id{table}. + +Despite the name, +the metamethod for this event can be either a function or a table. +If it is a function, +it is called with @id{table} and @id{key} as arguments, +and the result of the call +(adjusted to one value) +is the result of the operation. +If it is a table, +the final result is the result of indexing this table with @id{key}. +(This indexing is regular, not raw, +and therefore can trigger another metamethod.) +} + +@item{@idx{__newindex}| +The indexing assignment @T{table[key] = value}. +Like the index event, +this event happens when @id{table} is not a table or +when @id{key} is not present in @id{table}. +The metamethod is looked up in @id{table}. + +Like with indexing, +the metamethod for this event can be either a function or a table. +If it is a function, +it is called with @id{table}, @id{key}, and @id{value} as arguments. +If it is a table, +Lua does an indexing assignment to this table with the same key and value. +(This assignment is regular, not raw, +and therefore can trigger another metamethod.) + +Whenever there is a @idx{__newindex} metamethod, +Lua does not perform the primitive assignment. +(If necessary, +the metamethod itself can call @Lid{rawset} +to do the assignment.) +} + +@item{@idx{__call}| +The call operation @T{func(args)}. +This event happens when Lua tries to call a non-function value +(that is, @id{func} is not a function). +The metamethod is looked up in @id{func}. +If present, +the metamethod is called with @id{func} as its first argument, +followed by the arguments of the original call (@id{args}). +All results of the call +are the result of the operation. +(This is the only metamethod that allows multiple results.) +} + +} + +It is a good practice to add all needed metamethods to a table +before setting it as a metatable of some object. +In particular, the @idx{__gc} metamethod works only when this order +is followed @see{finalizers}. + +Because metatables are regular tables, +they can contain arbitrary fields, +not only the event names defined above. +Some functions in the standard library +(e.g., @Lid{tostring}) +use other fields in metatables for their own purposes. + +} + +@sect2{GC| @title{Garbage Collection} + +Lua performs automatic memory management. +This means that +you do not have to worry about allocating memory for new objects +or freeing it when the objects are no longer needed. +Lua manages memory automatically by running +a @def{garbage collector} to collect all @emph{dead objects} +(that is, objects that are no longer accessible from Lua). +All memory used by Lua is subject to automatic management: +strings, tables, userdata, functions, threads, internal structures, etc. + +The garbage collector (GC) in Lua can work in two modes: +incremental and generational. + +The default GC mode with the default parameters +are adequate for most uses. +Programs that waste a large proportion of its time +allocating and freeing memory can benefit from other settings. +Keep in mind that the GC behavior is non-portable +both across platforms and across different Lua releases; +therefore, optimal settings are also non-portable. + +You can change the GC mode and parameters by calling +@Lid{lua_gc} in C +or @Lid{collectgarbage} in Lua. +You can also use these functions to control +the collector directly (e.g., stop and restart it). + +@sect3{@title{Incremental Garbage Collection} + +In incremental mode, +each GC cycle performs a mark-and-sweep collection in small steps +interleaved with the program's execution. +In this mode, +the collector uses three numbers to control its garbage-collection cycles: +the @def{garbage-collector pause}, +the @def{garbage-collector step multiplier}, +and the @def{garbage-collector step size}. + +The garbage-collector pause +controls how long the collector waits before starting a new cycle. +The collector starts a new cycle when the use of memory +hits @M{n%} of the use after the previous collection. +Larger values make the collector less aggressive. +Values smaller than 100 mean the collector will not wait to +start a new cycle. +A value of 200 means that the collector waits for the total memory in use +to double before starting a new cycle. +The default value is 200; the maximum value is 1000. + +The garbage-collector step multiplier +controls the relative speed of the collector relative to +memory allocation, +that is, +how many elements it marks or sweeps for each +kilobyte of memory allocated. +Larger values make the collector more aggressive but also increase +the size of each incremental step. +You should not use values smaller than 100, +because they make the collector too slow and +can result in the collector never finishing a cycle. +The default value is 100; the maximum value is 1000. + +The garbage-collector step size controls the +size of each incremental step, +specifically how many bytes the interpreter allocates +before performing a step. +This parameter is logarithmic: +A value of @M{n} means the interpreter will allocate @M{2@sp{n}} +bytes between steps and perform equivalent work during the step. +A large value (e.g., 60) makes the collector a stop-the-world +(non-incremental) collector. +The default value is 13, +which makes for steps of approximately @N{8 Kbytes}. + +} + +@sect3{@title{Generational Garbage Collection} + +In generational mode, +the collector does frequent @emph{minor} collections, +which traverses only objects recently created. +If after a minor collection the use of memory is still above a limit, +the collector does a @emph{major} collection, +which traverses all objects. +The generational mode uses two parameters: +the @def{major multiplier} and the @def{the minor multiplier}. + +The major multiplier controls the frequency of major collections. +For a major multiplier @M{x}, +a new major collection will be done when memory +grows @M{x%} larger than the memory in use after the previous major +collection. +For instance, for a multiplier of 100, +the collector will do a major collection when the use of memory +gets larger than twice the use after the previous collection. +The default value is 100; the maximum value is 1000. + +The minor multiplier controls the frequency of minor collections. +For a minor multiplier @M{x}, +a new minor collection will be done when memory +grows @M{x%} larger than the memory in use after the previous major +collection. +For instance, for a multiplier of 20, +the collector will do a minor collection when the use of memory +gets 20% larger than the use after the previous major collection. +The default value is 20; the maximum value is 200. + +} + +@sect3{finalizers| @title{Garbage-Collection Metamethods} + +You can set garbage-collector metamethods for tables +and, using the @N{C API}, +for full userdata @see{metatable}. +These metamethods, called @def{finalizers}, +are called when the garbage collector detects that the +corresponding table or userdata is unreachable. +Finalizers allow you to coordinate Lua's garbage collection +with external resource management +such as closing files, network or database connections, +or freeing your own memory. + +For an object (table or userdata) to be finalized when collected, +you must @emph{mark} it for finalization. +@index{mark (for finalization)} +You mark an object for finalization when you set its metatable +and the metatable has a field indexed by the string @St{__gc}. +Note that if you set a metatable without a @idx{__gc} field +and later create that field in the metatable, +the object will not be marked for finalization. + +When a marked object becomes garbage, +it is not collected immediately by the garbage collector. +Instead, Lua puts it in a list. +After the collection, +Lua goes through that list. +For each object in the list, +it checks the object's @idx{__gc} metamethod: +If it is present, +Lua calls it with the object as its single argument. + +At the end of each garbage-collection cycle, +the finalizers for objects are called in +the reverse order that the objects were marked for finalization, +among those collected in that cycle; +that is, the first finalizer to be called is the one associated +with the object marked last in the program. +The execution of each finalizer may occur at any point during +the execution of the regular code. + +Because the object being collected must still be used by the finalizer, +that object (and other objects accessible only through it) +must be @emph{resurrected} by Lua.@index{resurrection} +Usually, this resurrection is transient, +and the object memory is freed in the next garbage-collection cycle. +However, if the finalizer stores the object in some global place +(e.g., a global variable), +then the resurrection is permanent. +Moreover, if the finalizer marks a finalizing object for finalization again, +its finalizer will be called again in the next cycle where the +object is unreachable. +In any case, +the object memory is freed only in a GC cycle where +the object is unreachable and not marked for finalization. + +When you close a state @seeF{lua_close}, +Lua calls the finalizers of all objects marked for finalization, +following the reverse order that they were marked. +If any finalizer marks objects for collection during that phase, +these marks have no effect. + +Finalizers cannot yield. + +Any error while running a finalizer generates a warning; +it is not propagated. + +} + +@sect3{weak-table| @title{Weak Tables} + +A @def{weak table} is a table whose elements are +@def{weak references}. +A weak reference is ignored by the garbage collector. +In other words, +if the only references to an object are weak references, +then the garbage collector will collect that object. + +A weak table can have weak keys, weak values, or both. +A table with weak values allows the collection of its values, +but prevents the collection of its keys. +A table with both weak keys and weak values allows the collection of +both keys and values. +In any case, if either the key or the value is collected, +the whole pair is removed from the table. +The weakness of a table is controlled by the +@idx{__mode} field of its metatable. +This field, if present, must be one of the following strings: +@St{k}, for a table with weak keys; +@St{v}, for a table with weak values; +or @St{kv}, for a table with both weak keys and values. + +A table with weak keys and strong values +is also called an @def{ephemeron table}. +In an ephemeron table, +a value is considered reachable only if its key is reachable. +In particular, +if the only reference to a key comes through its value, +the pair is removed. + +Any change in the weakness of a table may take effect only +at the next collect cycle. +In particular, if you change the weakness to a stronger mode, +Lua may still collect some items from that table +before the change takes effect. + +Only objects that have an explicit construction +are removed from weak tables. +Values, such as numbers and @x{light @N{C functions}}, +are not subject to garbage collection, +and therefore are not removed from weak tables +(unless their associated values are collected). +Although strings are subject to garbage collection, +they do not have an explicit construction, +and therefore are not removed from weak tables. + +Resurrected objects +(that is, objects being finalized +and objects accessible only through objects being finalized) +have a special behavior in weak tables. +They are removed from weak values before running their finalizers, +but are removed from weak keys only in the next collection +after running their finalizers, when such objects are actually freed. +This behavior allows the finalizer to access properties +associated with the object through weak tables. + +If a weak table is among the resurrected objects in a collection cycle, +it may not be properly cleared until the next cycle. + +} + +} + +@sect2{coroutine| @title{Coroutines} + +Lua supports coroutines, +also called @emphx{collaborative multithreading}. +A coroutine in Lua represents an independent thread of execution. +Unlike threads in multithread systems, however, +a coroutine only suspends its execution by explicitly calling +a yield function. + +You create a coroutine by calling @Lid{coroutine.create}. +Its sole argument is a function +that is the main function of the coroutine. +The @id{create} function only creates a new coroutine and +returns a handle to it (an object of type @emph{thread}); +it does not start the coroutine. + +You execute a coroutine by calling @Lid{coroutine.resume}. +When you first call @Lid{coroutine.resume}, +passing as its first argument +a thread returned by @Lid{coroutine.create}, +the coroutine starts its execution by +calling its main function. +Extra arguments passed to @Lid{coroutine.resume} are passed +as arguments to that function. +After the coroutine starts running, +it runs until it terminates or @emph{yields}. + +A coroutine can terminate its execution in two ways: +normally, when its main function returns +(explicitly or implicitly, after the last instruction); +and abnormally, if there is an unprotected error. +In case of normal termination, +@Lid{coroutine.resume} returns @true, +plus any values returned by the coroutine main function. +In case of errors, @Lid{coroutine.resume} returns @false +plus an error object. + +A coroutine yields by calling @Lid{coroutine.yield}. +When a coroutine yields, +the corresponding @Lid{coroutine.resume} returns immediately, +even if the yield happens inside nested function calls +(that is, not in the main function, +but in a function directly or indirectly called by the main function). +In the case of a yield, @Lid{coroutine.resume} also returns @true, +plus any values passed to @Lid{coroutine.yield}. +The next time you resume the same coroutine, +it continues its execution from the point where it yielded, +with the call to @Lid{coroutine.yield} returning any extra +arguments passed to @Lid{coroutine.resume}. + +Like @Lid{coroutine.create}, +the @Lid{coroutine.wrap} function also creates a coroutine, +but instead of returning the coroutine itself, +it returns a function that, when called, resumes the coroutine. +Any arguments passed to this function +go as extra arguments to @Lid{coroutine.resume}. +@Lid{coroutine.wrap} returns all the values returned by @Lid{coroutine.resume}, +except the first one (the boolean error code). +Unlike @Lid{coroutine.resume}, +@Lid{coroutine.wrap} does not catch errors; +any error is propagated to the caller. + +As an example of how coroutines work, +consider the following code: +@verbatim{ +function foo (a) + print("foo", a) + return coroutine.yield(2*a) +end + +co = coroutine.create(function (a,b) + print("co-body", a, b) + local r = foo(a+1) + print("co-body", r) + local r, s = coroutine.yield(a+b, a-b) + print("co-body", r, s) + return b, "end" +end) + +print("main", coroutine.resume(co, 1, 10)) +print("main", coroutine.resume(co, "r")) +print("main", coroutine.resume(co, "x", "y")) +print("main", coroutine.resume(co, "x", "y")) +} +When you run it, it produces the following output: +@verbatim{ +co-body 1 10 +foo 2 +main true 4 +co-body r +main true 11 -9 +co-body x y +main true 10 end +main false cannot resume dead coroutine +} + +You can also create and manipulate coroutines through the C API: +see functions @Lid{lua_newthread}, @Lid{lua_resume}, +and @Lid{lua_yield}. + +} + +} + + +@C{-------------------------------------------------------------------------} +@sect1{language| @title{The Language} + +This section describes the lexis, the syntax, and the semantics of Lua. +In other words, +this section describes +which tokens are valid, +how they can be combined, +and what their combinations mean. + +Language constructs will be explained using the usual extended BNF notation, +in which +@N{@bnfrep{@rep{a}} means 0} or more @rep{a}'s, and +@N{@bnfopt{@rep{a}} means} an optional @rep{a}. +Non-terminals are shown like @bnfNter{non-terminal}, +keywords are shown like @rw{kword}, +and other terminal symbols are shown like @bnfter{=}. +The complete syntax of Lua can be found in @refsec{BNF} +at the end of this manual. + +@sect2{lexical| @title{Lexical Conventions} + +Lua is a @x{free-form} language. +It ignores spaces and comments between lexical elements (@x{tokens}), +except as delimiters between @x{names} and @x{keywords}. +In source code, +Lua recognizes as spaces the standard ASCII white-space +characters space, form feed, newline, +carriage return, horizontal tab, and vertical tab. + +@def{Names} +(also called @def{identifiers}) +in Lua can be any string of Latin letters, +Arabic-Indic digits, and underscores, +not beginning with a digit and +not being a reserved word. +Identifiers are used to name variables, table fields, and labels. + +The following @def{keywords} are reserved +and cannot be used as names: +@index{reserved words} +@verbatim{ +and break do else elseif end +false for function goto if in +local nil not or repeat return +then true until while +} + +Lua is a case-sensitive language: +@id{and} is a reserved word, but @id{And} and @id{AND} +are two different, valid names. +As a convention, +programs should avoid creating +names that start with an underscore followed by +one or more uppercase letters (such as @Lid{_VERSION}). + +The following strings denote other @x{tokens}: +@verbatim{ ++ - * / % ^ # +& ~ | << >> // +== ~= <= >= < > = +( ) { } [ ] :: +; : , . .. ... +} + +A @def{short literal string} +can be delimited by matching single or double quotes, +and can contain the following C-like escape sequences: +@Char{\a} (bell), +@Char{\b} (backspace), +@Char{\f} (form feed), +@Char{\n} (newline), +@Char{\r} (carriage return), +@Char{\t} (horizontal tab), +@Char{\v} (vertical tab), +@Char{\\} (backslash), +@Char{\"} (quotation mark [double quote]), +and @Char{\'} (apostrophe [single quote]). +A backslash followed by a line break +results in a newline in the string. +The escape sequence @Char{\z} skips the following span +of white-space characters, +including line breaks; +it is particularly useful to break and indent a long literal string +into multiple lines without adding the newlines and spaces +into the string contents. +A short literal string cannot contain unescaped line breaks +nor escapes not forming a valid escape sequence. + +We can specify any byte in a short literal string, +including @x{embedded zeros}, +by its numeric value. +This can be done +with the escape sequence @T{\x@rep{XX}}, +where @rep{XX} is a sequence of exactly two hexadecimal digits, +or with the escape sequence @T{\@rep{ddd}}, +where @rep{ddd} is a sequence of up to three decimal digits. +(Note that if a decimal escape sequence is to be followed by a digit, +it must be expressed using exactly three digits.) + +The @x{UTF-8} encoding of a @x{Unicode} character +can be inserted in a literal string with +the escape sequence @T{\u{@rep{XXX}}} +(note the mandatory enclosing brackets), +where @rep{XXX} is a sequence of one or more hexadecimal digits +representing the character code point. +This code point can be any value smaller than @M{2@sp{31}}. +(Lua uses the original UTF-8 specification here.) + +Literal strings can also be defined using a long format +enclosed by @def{long brackets}. +We define an @def{opening long bracket of level @rep{n}} as an opening +square bracket followed by @rep{n} equal signs followed by another +opening square bracket. +So, an opening long bracket of @N{level 0} is written as @T{[[}, @C{]]} +an opening long bracket of @N{level 1} is written as @T{[=[}, @C{]]} +and so on. +A @emph{closing long bracket} is defined similarly; +for instance, +a closing long bracket of @N{level 4} is written as @C{[[} @T{]====]}. +A @def{long literal} starts with an opening long bracket of any level and +ends at the first closing long bracket of the same level. +It can contain any text except a closing bracket of the same level. +Literals in this bracketed form can run for several lines, +do not interpret any escape sequences, +and ignore long brackets of any other level. +Any kind of end-of-line sequence +(carriage return, newline, carriage return followed by newline, +or newline followed by carriage return) +is converted to a simple newline. + +When the opening long bracket is immediately followed by a newline, +the newline is not included in the string. +As an example, in a system using ASCII +(in which @Char{a} is coded @N{as 97}, +newline is coded @N{as 10}, and @Char{1} is coded @N{as 49}), +the five literal strings below denote the same string: +@verbatim{ +a = 'alo\n123"' +a = "alo\n123\"" +a = '\97lo\10\04923"' +a = [[alo +123"]] +a = [==[ +alo +123"]==] +} + +Any byte in a literal string not +explicitly affected by the previous rules represents itself. +However, Lua opens files for parsing in text mode, +and the system's file functions may have problems with +some control characters. +So, it is safer to represent +non-text data as a quoted literal with +explicit escape sequences for the non-text characters. + +A @def{numeric constant} (or @def{numeral}) +can be written with an optional fractional part +and an optional decimal exponent, +marked by a letter @Char{e} or @Char{E}. +Lua also accepts @x{hexadecimal constants}, +which start with @T{0x} or @T{0X}. +Hexadecimal constants also accept an optional fractional part +plus an optional binary exponent, +marked by a letter @Char{p} or @Char{P}. + +A numeric constant with a radix point or an exponent +denotes a float; +otherwise, +if its value fits in an integer or it is a hexadecimal constant, +it denotes an integer; +otherwise (that is, a decimal integer numeral that overflows), +it denotes a float. +(Hexadecimal integer numerals that overflow @emph{wrap around}; +they always denote an integer value.) +Examples of valid integer constants are +@verbatim{ +3 345 0xff 0xBEBADA +} +Examples of valid float constants are +@verbatim{ +3.0 3.1416 314.16e-2 0.31416E1 34e1 +0x0.1E 0xA23p-4 0X1.921FB54442D18P+1 +} + +A @def{comment} starts with a double hyphen (@T{--}) +anywhere outside a string. +If the text immediately after @T{--} is not an opening long bracket, +the comment is a @def{short comment}, +which runs until the end of the line. +Otherwise, it is a @def{long comment}, +which runs until the corresponding closing long bracket. + +} + +@sect2{variables| @title{Variables} + +Variables are places that store values. +There are three kinds of variables in Lua: +global variables, local variables, and table fields. + +A single name can denote a global variable or a local variable +(or a function's formal parameter, +which is a particular kind of local variable): +@Produc{ +@producname{var}@producbody{@bnfNter{Name}} +} +@bnfNter{Name} denotes identifiers, as defined in @See{lexical}. + +Any variable name is assumed to be global unless explicitly declared +as a local @see{localvar}. +@x{Local variables} are @emph{lexically scoped}: +local variables can be freely accessed by functions +defined inside their scope @see{visibility}. + +Before the first assignment to a variable, its value is @nil. + +Square brackets are used to index a table: +@Produc{ +@producname{var}@producbody{prefixexp @bnfter{[} exp @bnfter{]}} +} +The meaning of accesses to table fields can be changed via metatables +@see{metatable}. + +The syntax @id{var.Name} is just syntactic sugar for +@T{var["Name"]}: +@Produc{ +@producname{var}@producbody{prefixexp @bnfter{.} @bnfNter{Name}} +} + +An access to a global variable @id{x} +is equivalent to @id{_ENV.x}. +Due to the way that chunks are compiled, +the variable @id{_ENV} itself is never global @see{globalenv}. + +} + +@sect2{stats| @title{Statements} + +Lua supports an almost conventional set of @x{statements}, +similar to those in Pascal or C. +This set includes +assignments, control structures, function calls, +and variable declarations. + +@sect3{@title{Blocks} + +A @x{block} is a list of statements, +which are executed sequentially: +@Produc{ +@producname{block}@producbody{@bnfrep{stat}} +} +Lua has @def{empty statements} +that allow you to separate statements with semicolons, +start a block with a semicolon +or write two semicolons in sequence: +@Produc{ +@producname{stat}@producbody{@bnfter{;}} +} + +Function calls and assignments +can start with an open parenthesis. +This possibility leads to an ambiguity in Lua's grammar. +Consider the following fragment: +@verbatim{ +a = b + c +(print or io.write)('done') +} +The grammar could see it in two ways: +@verbatim{ +a = b + c(print or io.write)('done') + +a = b + c; (print or io.write)('done') +} +The current parser always sees such constructions +in the first way, +interpreting the open parenthesis +as the start of the arguments to a call. +To avoid this ambiguity, +it is a good practice to always precede with a semicolon +statements that start with a parenthesis: +@verbatim{ +;(print or io.write)('done') +} + +A block can be explicitly delimited to produce a single statement: +@Produc{ +@producname{stat}@producbody{@Rw{do} block @Rw{end}} +} +Explicit blocks are useful +to control the scope of variable declarations. +Explicit blocks are also sometimes used to +add a @Rw{return} statement in the middle +of another block @see{control}. + +} + +@sect3{chunks| @title{Chunks} + +The unit of compilation of Lua is called a @def{chunk}. +Syntactically, +a chunk is simply a block: +@Produc{ +@producname{chunk}@producbody{block} +} + +Lua handles a chunk as the body of an anonymous function +with a variable number of arguments +@see{func-def}. +As such, chunks can define local variables, +receive arguments, and return values. +Moreover, such anonymous function is compiled as in the +scope of an external local variable called @id{_ENV} @see{globalenv}. +The resulting function always has @id{_ENV} as its only upvalue, +even if it does not use that variable. + +A chunk can be stored in a file or in a string inside the host program. +To execute a chunk, +Lua first @emph{loads} it, +precompiling the chunk's code into instructions for a virtual machine, +and then Lua executes the compiled code +with an interpreter for the virtual machine. + +Chunks can also be precompiled into binary form; +see program @idx{luac} and function @Lid{string.dump} for details. +Programs in source and compiled forms are interchangeable; +Lua automatically detects the file type and acts accordingly @seeF{load}. + +} + +@sect3{assignment| @title{Assignment} + +Lua allows @x{multiple assignments}. +Therefore, the syntax for assignment +defines a list of variables on the left side +and a list of expressions on the right side. +The elements in both lists are separated by commas: +@Produc{ +@producname{stat}@producbody{varlist @bnfter{=} explist} +@producname{varlist}@producbody{var @bnfrep{@bnfter{,} var}} +@producname{explist}@producbody{exp @bnfrep{@bnfter{,} exp}} +} +Expressions are discussed in @See{expressions}. + +Before the assignment, +the list of values is @emph{adjusted} to the length of +the list of variables.@index{adjustment} +If there are more values than needed, +the excess values are thrown away. +If there are fewer values than needed, +the list is extended with as many @nil's as needed. +If the list of expressions ends with a function call, +then all values returned by that call enter the list of values, +before the adjustment +(except when the call is enclosed in parentheses; see @See{expressions}). + +The assignment statement first evaluates all its expressions +and only then the assignments are performed. +Thus the code +@verbatim{ +i = 3 +i, a[i] = i+1, 20 +} +sets @T{a[3]} to 20, without affecting @T{a[4]} +because the @id{i} in @T{a[i]} is evaluated (to 3) +before it is @N{assigned 4}. +Similarly, the line +@verbatim{ +x, y = y, x +} +exchanges the values of @id{x} and @id{y}, +and +@verbatim{ +x, y, z = y, z, x +} +cyclically permutes the values of @id{x}, @id{y}, and @id{z}. + +An assignment to a global name @T{x = val} +is equivalent to the assignment +@T{_ENV.x = val} @see{globalenv}. + +The meaning of assignments to table fields and +global variables (which are actually table fields, too) +can be changed via metatables @see{metatable}. + +} + +@sect3{control| @title{Control Structures} +The control structures +@Rw{if}, @Rw{while}, and @Rw{repeat} have the usual meaning and +familiar syntax: +@index{while-do statement} +@index{repeat-until statement} +@index{if-then-else statement} +@Produc{ +@producname{stat}@producbody{@Rw{while} exp @Rw{do} block @Rw{end}} +@producname{stat}@producbody{@Rw{repeat} block @Rw{until} exp} +@producname{stat}@producbody{@Rw{if} exp @Rw{then} block + @bnfrep{@Rw{elseif} exp @Rw{then} block} + @bnfopt{@Rw{else} block} @Rw{end}} +} +Lua also has a @Rw{for} statement, in two flavors @see{for}. + +The @x{condition expression} of a +control structure can return any value. +Both @false and @nil test false. +All values different from @nil and @false test true. +(In particular, the number 0 and the empty string also test true). + +In the @Rw{repeat}@En@Rw{until} loop, +the inner block does not end at the @Rw{until} keyword, +but only after the condition. +So, the condition can refer to local variables +declared inside the loop block. + +The @Rw{goto} statement transfers the program control to a label. +For syntactical reasons, +labels in Lua are considered statements too: +@index{goto statement} +@index{label} +@Produc{ +@producname{stat}@producbody{@Rw{goto} Name} +@producname{stat}@producbody{label} +@producname{label}@producbody{@bnfter{::} Name @bnfter{::}} +} + +A label is visible in the entire block where it is defined, +except inside nested functions. +A goto may jump to any visible label as long as it does not +enter into the scope of a local variable. +A label should not be declared +where a label with the same name is visible, +even if this other label has been declared in an enclosing block. + +Labels and empty statements are called @def{void statements}, +as they perform no actions. + +The @Rw{break} statement terminates the execution of a +@Rw{while}, @Rw{repeat}, or @Rw{for} loop, +skipping to the next statement after the loop: +@index{break statement} +@Produc{ +@producname{stat}@producbody{@Rw{break}} +} +A @Rw{break} ends the innermost enclosing loop. + +The @Rw{return} statement is used to return values +from a function or a chunk +(which is an anonymous function). +@index{return statement} +Functions can return more than one value, +so the syntax for the @Rw{return} statement is +@Produc{ +@producname{stat}@producbody{@Rw{return} @bnfopt{explist} @bnfopt{@bnfter{;}}} +} + +The @Rw{return} statement can only be written +as the last statement of a block. +If it is really necessary to @Rw{return} in the middle of a block, +then an explicit inner block can be used, +as in the idiom @T{do return end}, +because now @Rw{return} is the last statement in its (inner) block. + +} + +@sect3{for| @title{For Statement} + +@index{for statement} +The @Rw{for} statement has two forms: +one numerical and one generic. + +The numerical @Rw{for} loop repeats a block of code while a +control variable runs through an arithmetic progression. +It has the following syntax: +@Produc{ +@producname{stat}@producbody{@Rw{for} @bnfNter{Name} @bnfter{=} + exp @bnfter{,} exp @bnfopt{@bnfter{,} exp} @Rw{do} block @Rw{end}} +} +The @emph{block} is repeated for @emph{name} starting at the value of +the first @emph{exp}, until it passes the second @emph{exp} by steps of the +third @emph{exp}. +More precisely, a @Rw{for} statement like +@verbatim{ +for v = @rep{e1}, @rep{e2}, @rep{e3} do @rep{block} end +} +is equivalent to the code: +@verbatim{ +do + local @rep{var}, @rep{limit}, @rep{step} = tonumber(@rep{e1}), tonumber(@rep{e2}), tonumber(@rep{e3}) + if not (@rep{var} and @rep{limit} and @rep{step}) then error() end + @rep{var} = @rep{var} - @rep{step} + while true do + @rep{var} = @rep{var} + @rep{step} + if (@rep{step} >= 0 and @rep{var} > @rep{limit}) or (@rep{step} < 0 and @rep{var} < @rep{limit}) then + break + end + local v = @rep{var} + @rep{block} + end +end +} + +Note the following: +@itemize{ + +@item{ +All three control expressions are evaluated only once, +before the loop starts. +They must all result in numbers. +} + +@item{ +@T{@rep{var}}, @T{@rep{limit}}, and @T{@rep{step}} are invisible variables. +The names shown here are for explanatory purposes only. +} + +@item{ +If the third expression (the step) is absent, +then a step @N{of 1} is used. +} + +@item{ +You can use @Rw{break} and @Rw{goto} to exit a @Rw{for} loop. +} + +@item{ +The loop variable @T{v} is local to the loop body. +If you need its value after the loop, +assign it to another variable before exiting the loop. +} + +@item{ +The values in @rep{var}, @rep{limit}, and @rep{step} +can be integers or floats. +All operations on them respect the usual rules in Lua. +} + +} + +The generic @Rw{for} statement works over functions, +called @def{iterators}. +On each iteration, the iterator function is called to produce a new value, +stopping when this new value is @nil. +The generic @Rw{for} loop has the following syntax: +@Produc{ +@producname{stat}@producbody{@Rw{for} namelist @Rw{in} explist + @Rw{do} block @Rw{end}} +@producname{namelist}@producbody{@bnfNter{Name} @bnfrep{@bnfter{,} @bnfNter{Name}}} +} +A @Rw{for} statement like +@verbatim{ +for @rep{var_1}, @Cdots, @rep{var_n} in @rep{explist} do @rep{block} end +} +is equivalent to the code: +@verbatim{ +do + local @rep{f}, @rep{s}, @rep{var} + local *toclose @rep{tbc} = nil + @rep{f}, @rep{s}, @rep{var}, @rep{tbc} = @rep{explist} + while true do + local @rep{var_1}, @Cdots, @rep{var_n} = @rep{f}(@rep{s}, @rep{var}) + if @rep{var_1} == nil then break end + @rep{var} = @rep{var_1} + @rep{block} + end +end +} +Note the following: +@itemize{ + +@item{ +@T{@rep{explist}} is evaluated only once. +Its results are an @emph{iterator} function, +a @emph{state}, +an initial value for the first @emph{iterator variable}, +and a to-be-closed variable @see{to-be-closed}, +which can be used to release resources when the loop ends. +} + +@item{ +@T{@rep{f}}, @T{@rep{s}}, @T{@rep{var}}, and @T{@rep{tbc}} +are invisible variables. +The names are here for explanatory purposes only. +} + +@item{ +You can use @Rw{break} to exit a @Rw{for} loop. +} + +@item{ +The loop variables @T{@rep{var_i}} are local to the loop; +you cannot use their values after the @Rw{for} ends. +If you need these values, +then assign them to other variables before breaking or exiting the loop. +} + +} + +} + +@sect3{funcstat| @title{Function Calls as Statements} +To allow possible side-effects, +function calls can be executed as statements: +@Produc{ +@producname{stat}@producbody{functioncall} +} +In this case, all returned values are thrown away. +Function calls are explained in @See{functioncall}. + +} + +@sect3{localvar| @title{Local Declarations} +@x{Local variables} can be declared anywhere inside a block. +The declaration can include an initial assignment: +@Produc{ +@producname{stat}@producbody{@Rw{local} namelist @bnfopt{@bnfter{=} explist}} +} +If present, an initial assignment has the same semantics +of a multiple assignment @see{assignment}. +Otherwise, all variables are initialized with @nil. + +A chunk is also a block @see{chunks}, +and so local variables can be declared in a chunk outside any explicit block. + +The visibility rules for local variables are explained in @See{visibility}. + +} + +@sect3{to-be-closed| @title{To-be-closed Variables} + +A local variable can be declared as a @def{to-be-closed} variable, +with the following syntax: +@Produc{ +@producname{stat}@producbody{ + @Rw{local} @bnfter{*} @bnfter{toclose} Name @bnfter{=} exp +}} +A to-be-closed variable behaves like a normal local variable, +except that its value is @emph{closed} whenever the variable +goes out of scope, including normal block termination, +exiting its block by @Rw{break}/@Rw{goto}/@Rw{return}, +or exiting by an error. + +Here, to @emph{close} a value means +to call its @idx{__close} metamethod. +If the value is @nil, it is ignored; +otherwise, +if it does not have a @idx{__close} metamethod, +an error is raised. +When calling the metamethod, +the value itself is passed as the first argument +and the error object (if any) is passed as a second argument; +if there was no error, the second argument is @nil. + +If several to-be-closed variables go out of scope at the same event, +they are closed in the reverse order that they were declared. +If there is any error while running a closing method, +that error is handled like an error in the regular code +where the variable was defined; +in particular, +the other pending closing methods will still be called. + +If a coroutine yields inside a block and is never resumed again, +the variables visible at that block will never go out of scope, +and therefore they will not be closed. +(You should use finalizers to handle this case.) + +} + +} + +@sect2{expressions| @title{Expressions} + +The basic expressions in Lua are the following: +@Produc{ +@producname{exp}@producbody{prefixexp} +@producname{exp}@producbody{@Rw{nil} @Or @Rw{false} @Or @Rw{true}} +@producname{exp}@producbody{@bnfNter{Numeral}} +@producname{exp}@producbody{@bnfNter{LiteralString}} +@producname{exp}@producbody{functiondef} +@producname{exp}@producbody{tableconstructor} +@producname{exp}@producbody{@bnfter{...}} +@producname{exp}@producbody{exp binop exp} +@producname{exp}@producbody{unop exp} +@producname{prefixexp}@producbody{var @Or functioncall @Or + @bnfter{(} exp @bnfter{)}} +} + +Numerals and literal strings are explained in @See{lexical}; +variables are explained in @See{variables}; +function definitions are explained in @See{func-def}; +function calls are explained in @See{functioncall}; +table constructors are explained in @See{tableconstructor}. +Vararg expressions, +denoted by three dots (@Char{...}), can only be used when +directly inside a vararg function; +they are explained in @See{func-def}. + +Binary operators comprise arithmetic operators @see{arith}, +bitwise operators @see{bitwise}, +relational operators @see{rel-ops}, logical operators @see{logic}, +and the concatenation operator @see{concat}. +Unary operators comprise the unary minus @see{arith}, +the unary bitwise NOT @see{bitwise}, +the unary logical @Rw{not} @see{logic}, +and the unary @def{length operator} @see{len-op}. + +Both function calls and vararg expressions can result in multiple values. +If a function call is used as a statement @see{funcstat}, +then its return list is adjusted to zero elements, +thus discarding all returned values. +If an expression is used as the last (or the only) element +of a list of expressions, +then no adjustment is made +(unless the expression is enclosed in parentheses). +In all other contexts, +Lua adjusts the result list to one element, +either discarding all values except the first one +or adding a single @nil if there are no values. + +Here are some examples: +@verbatim{ +f() -- adjusted to 0 results +g(f(), x) -- f() is adjusted to 1 result +g(x, f()) -- g gets x plus all results from f() +a,b,c = f(), x -- f() is adjusted to 1 result (c gets nil) +a,b = ... -- a gets the first vararg argument, b gets + -- the second (both a and b can get nil if there + -- is no corresponding vararg argument) + +a,b,c = x, f() -- f() is adjusted to 2 results +a,b,c = f() -- f() is adjusted to 3 results +return f() -- returns all results from f() +return ... -- returns all received vararg arguments +return x,y,f() -- returns x, y, and all results from f() +{f()} -- creates a list with all results from f() +{...} -- creates a list with all vararg arguments +{f(), nil} -- f() is adjusted to 1 result +} + +Any expression enclosed in parentheses always results in only one value. +Thus, +@T{(f(x,y,z))} is always a single value, +even if @id{f} returns several values. +(The value of @T{(f(x,y,z))} is the first value returned by @id{f} +or @nil if @id{f} does not return any values.) + + + +@sect3{arith| @title{Arithmetic Operators} +Lua supports the following @x{arithmetic operators}: +@description{ +@item{@T{+}|addition} +@item{@T{-}|subtraction} +@item{@T{*}|multiplication} +@item{@T{/}|float division} +@item{@T{//}|floor division} +@item{@T{%}|modulo} +@item{@T{^}|exponentiation} +@item{@T{-}|unary minus} +} + +With the exception of exponentiation and float division, +the arithmetic operators work as follows: +If both operands are integers, +the operation is performed over integers and the result is an integer. +Otherwise, if both operands are numbers, +then they are converted to floats, +the operation is performed following the machine's rules +for floating-point arithmetic +(usually the @x{IEEE 754} standard), +and the result is a float. +(The string library coerces strings to numbers in +arithmetic operations; see @See{coercion} for details.) + +Exponentiation and float division (@T{/}) +always convert their operands to floats +and the result is always a float. +Exponentiation uses the @ANSI{pow}, +so that it works for non-integer exponents too. + +Floor division (@T{//}) is a division +that rounds the quotient towards minus infinity, +that is, the floor of the division of its operands. + +Modulo is defined as the remainder of a division +that rounds the quotient towards minus infinity (floor division). + +In case of overflows in integer arithmetic, +all operations @emphx{wrap around}, +according to the usual rules of two-complement arithmetic. +(In other words, +they return the unique representable integer +that is equal modulo @M{2@sp{n}} to the mathematical result, +where @M{n} is the number of bits of the integer type.) +} + +@sect3{bitwise| @title{Bitwise Operators} +Lua supports the following @x{bitwise operators}: +@description{ +@item{@T{&}|bitwise AND} +@item{@T{@VerBar}|bitwise OR} +@item{@T{~}|bitwise exclusive OR} +@item{@T{>>}|right shift} +@item{@T{<<}|left shift} +@item{@T{~}|unary bitwise NOT} +} + +All bitwise operations convert its operands to integers +@see{coercion}, +operate on all bits of those integers, +and result in an integer. + +Both right and left shifts fill the vacant bits with zeros. +Negative displacements shift to the other direction; +displacements with absolute values equal to or higher than +the number of bits in an integer +result in zero (as all bits are shifted out). + +} + +@sect3{coercion| @title{Coercions and Conversions} +Lua provides some automatic conversions between some +types and representations at run time. +Bitwise operators always convert float operands to integers. +Exponentiation and float division +always convert integer operands to floats. +All other arithmetic operations applied to mixed numbers +(integers and floats) convert the integer operand to a float. +The C API also converts both integers to floats and +floats to integers, as needed. +Moreover, string concatenation accepts numbers as arguments, +besides strings. + +In a conversion from integer to float, +if the integer value has an exact representation as a float, +that is the result. +Otherwise, +the conversion gets the nearest higher or +the nearest lower representable value. +This kind of conversion never fails. + +The conversion from float to integer +checks whether the float has an exact representation as an integer +(that is, the float has an integral value and +it is in the range of integer representation). +If it does, that representation is the result. +Otherwise, the conversion fails. + +The string library uses metamethods that try to coerce +strings to numbers in all arithmetic operations. +Any string operator is converted to an integer or a float, +following its syntax and the rules of the Lua lexer. +(The string may have also leading and trailing spaces and a sign.) +All conversions from strings to numbers +accept both a dot and the current locale mark +as the radix character. +(The Lua lexer, however, accepts only a dot.) + +The conversion from numbers to strings uses a +non-specified human-readable format. +For complete control over how numbers are converted to strings, +use the @id{format} function from the string library +@seeF{string.format}. + +} + +@sect3{rel-ops| @title{Relational Operators} +Lua supports the following @x{relational operators}: +@description{ +@item{@T{==}|equality} +@item{@T{~=}|inequality} +@item{@T{<}|less than} +@item{@T{>}|greater than} +@item{@T{<=}|less or equal} +@item{@T{>=}|greater or equal} +} +These operators always result in @false or @true. + +Equality (@T{==}) first compares the type of its operands. +If the types are different, then the result is @false. +Otherwise, the values of the operands are compared. +Strings are equal if they have the same content. +Numbers are equal if they denote the same mathematical value. + +Tables, userdata, and threads +are compared by reference: +two objects are considered equal only if they are the same object. +Every time you create a new object +(a table, a userdata, or a thread), +this new object is different from any previously existing object. +A function is always equal to itself. +Functions with any detectable difference +(different behavior, different definition) are always different. +Functions created at different times but with no detectable differences +may be classified as equal or not +(depending on internal caching details). + +You can change the way that Lua compares tables and userdata +by using the @idx{__eq} metamethod @see{metatable}. + +Equality comparisons do not convert strings to numbers +or vice versa. +Thus, @T{"0"==0} evaluates to @false, +and @T{t[0]} and @T{t["0"]} denote different +entries in a table. + +The operator @T{~=} is exactly the negation of equality (@T{==}). + +The order operators work as follows. +If both arguments are numbers, +then they are compared according to their mathematical values +(regardless of their subtypes). +Otherwise, if both arguments are strings, +then their values are compared according to the current locale. +Otherwise, Lua tries to call the @idx{__lt} or the @idx{__le} +metamethod @see{metatable}. +A comparison @T{a > b} is translated to @T{b < a} +and @T{a >= b} is translated to @T{b <= a}. + +Following the @x{IEEE 754} standard, +@x{NaN} is considered neither smaller than, +nor equal to, nor greater than any value (including itself). + +} + +@sect3{logic| @title{Logical Operators} +The @x{logical operators} in Lua are +@Rw{and}, @Rw{or}, and @Rw{not}. +Like the control structures @see{control}, +all logical operators consider both @false and @nil as false +and anything else as true. + +The negation operator @Rw{not} always returns @false or @true. +The conjunction operator @Rw{and} returns its first argument +if this value is @false or @nil; +otherwise, @Rw{and} returns its second argument. +The disjunction operator @Rw{or} returns its first argument +if this value is different from @nil and @false; +otherwise, @Rw{or} returns its second argument. +Both @Rw{and} and @Rw{or} use @x{short-circuit evaluation}; +that is, +the second operand is evaluated only if necessary. +Here are some examples: +@verbatim{ +10 or 20 --> 10 +10 or error() --> 10 +nil or "a" --> "a" +nil and 10 --> nil +false and error() --> false +false and nil --> false +false or nil --> nil +10 and 20 --> 20 +} + +} + +@sect3{concat| @title{Concatenation} +The string @x{concatenation} operator in Lua is +denoted by two dots (@Char{..}). +If both operands are strings or numbers, then they are converted to +strings according to the rules described in @See{coercion}. +Otherwise, the @idx{__concat} metamethod is called @see{metatable}. + +} + +@sect3{len-op| @title{The Length Operator} + +The length operator is denoted by the unary prefix operator @T{#}. + +The length of a string is its number of bytes +(that is, the usual meaning of string length when each +character is one byte). + +The length operator applied on a table +returns a @x{border} in that table. +A @def{border} in a table @id{t} is any natural number +that satisfies the following condition: +@verbatim{ +(border == 0 or t[border] ~= nil) and t[border + 1] == nil +} +In words, +a border is any (natural) index present in the table +that is followed by an absent index +(or zero, when index 1 is absent). + +A table with exactly one border is called a @def{sequence}. +For instance, the table @T{{10, 20, 30, 40, 50}} is a sequence, +as it has only one border (5). +The table @T{{10, 20, 30, nil, 50}} has two borders (3 and 5), +and therefore it is not a sequence. +The table @T{{nil, 20, 30, nil, nil, 60, nil}} +has three borders (0, 3, and 6), +so it is not a sequence, too. +The table @T{{}} is a sequence with border 0. +Note that non-natural keys do not interfere +with whether a table is a sequence. + +When @id{t} is a sequence, +@T{#t} returns its only border, +which corresponds to the intuitive notion of the length of the sequence. +When @id{t} is not a sequence, +@T{#t} can return any of its borders. +(The exact one depends on details of +the internal representation of the table, +which in turn can depend on how the table was populated and +the memory addresses of its non-numeric keys.) + +The computation of the length of a table +has a guaranteed worst time of @M{O(log n)}, +where @M{n} is the largest natural key in the table. + +A program can modify the behavior of the length operator for +any value but strings through the @idx{__len} metamethod @see{metatable}. + +} + +@sect3{prec| @title{Precedence} +@x{Operator precedence} in Lua follows the table below, +from lower to higher priority: +@verbatim{ +or +and +< > <= >= ~= == +| +~ +& +<< >> +.. ++ - +* / // % +unary operators (not # - ~) +^ +} +As usual, +you can use parentheses to change the precedences of an expression. +The concatenation (@Char{..}) and exponentiation (@Char{^}) +operators are right associative. +All other binary operators are left associative. + +} + +@sect3{tableconstructor| @title{Table Constructors} +Table @x{constructors} are expressions that create tables. +Every time a constructor is evaluated, a new table is created. +A constructor can be used to create an empty table +or to create a table and initialize some of its fields. +The general syntax for constructors is +@Produc{ +@producname{tableconstructor}@producbody{@bnfter{@Open} @bnfopt{fieldlist} @bnfter{@Close}} +@producname{fieldlist}@producbody{field @bnfrep{fieldsep field} @bnfopt{fieldsep}} +@producname{field}@producbody{@bnfter{[} exp @bnfter{]} @bnfter{=} exp @Or + @bnfNter{Name} @bnfter{=} exp @Or exp} +@producname{fieldsep}@producbody{@bnfter{,} @Or @bnfter{;}} +} + +Each field of the form @T{[exp1] = exp2} adds to the new table an entry +with key @id{exp1} and value @id{exp2}. +A field of the form @T{name = exp} is equivalent to +@T{["name"] = exp}. +Finally, fields of the form @id{exp} are equivalent to +@T{[i] = exp}, where @id{i} are consecutive integers +starting with 1. +Fields in the other formats do not affect this counting. +For example, +@verbatim{ +a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 } +} +is equivalent to +@verbatim{ +do + local t = {} + t[f(1)] = g + t[1] = "x" -- 1st exp + t[2] = "y" -- 2nd exp + t.x = 1 -- t["x"] = 1 + t[3] = f(x) -- 3rd exp + t[30] = 23 + t[4] = 45 -- 4th exp + a = t +end +} + +The order of the assignments in a constructor is undefined. +(This order would be relevant only when there are repeated keys.) + +If the last field in the list has the form @id{exp} +and the expression is a function call or a vararg expression, +then all values returned by this expression enter the list consecutively +@see{functioncall}. + +The field list can have an optional trailing separator, +as a convenience for machine-generated code. + +} + +@sect3{functioncall| @title{Function Calls} +A @x{function call} in Lua has the following syntax: +@Produc{ +@producname{functioncall}@producbody{prefixexp args} +} +In a function call, +first @bnfNter{prefixexp} and @bnfNter{args} are evaluated. +If the value of @bnfNter{prefixexp} has type @emph{function}, +then this function is called +with the given arguments. +Otherwise, the @bnfNter{prefixexp} @idx{__call} metamethod is called, +having as first argument the value of @bnfNter{prefixexp}, +followed by the original call arguments +@see{metatable}. + +The form +@Produc{ +@producname{functioncall}@producbody{prefixexp @bnfter{:} @bnfNter{Name} args} +} +can be used to call @Q{methods}. +A call @T{v:name(@rep{args})} +is syntactic sugar for @T{v.name(v,@rep{args})}, +except that @id{v} is evaluated only once. + +Arguments have the following syntax: +@Produc{ +@producname{args}@producbody{@bnfter{(} @bnfopt{explist} @bnfter{)}} +@producname{args}@producbody{tableconstructor} +@producname{args}@producbody{@bnfNter{LiteralString}} +} +All argument expressions are evaluated before the call. +A call of the form @T{f{@rep{fields}}} is +syntactic sugar for @T{f({@rep{fields}})}; +that is, the argument list is a single new table. +A call of the form @T{f'@rep{string}'} +(or @T{f"@rep{string}"} or @T{f[[@rep{string}]]}) +is syntactic sugar for @T{f('@rep{string}')}; +that is, the argument list is a single literal string. + +A call of the form @T{return @rep{functioncall}} not in the +scope of a to-be-closed variable is called a @def{tail call}. +Lua implements @def{proper tail calls} +(or @emph{proper tail recursion}): +in a tail call, +the called function reuses the stack entry of the calling function. +Therefore, there is no limit on the number of nested tail calls that +a program can execute. +However, a tail call erases any debug information about the +calling function. +Note that a tail call only happens with a particular syntax, +where the @Rw{return} has one single function call as argument, +and it is outside the scope of any to-be-closed variable. +This syntax makes the calling function return exactly +the returns of the called function, +without any intervening action. +So, none of the following examples are tail calls: +@verbatim{ +return (f(x)) -- results adjusted to 1 +return 2 * f(x) -- result multiplied by 2 +return x, f(x) -- additional results +f(x); return -- results discarded +return x or f(x) -- results adjusted to 1 +} + +} + +@sect3{func-def| @title{Function Definitions} + +The syntax for function definition is +@Produc{ +@producname{functiondef}@producbody{@Rw{function} funcbody} +@producname{funcbody}@producbody{@bnfter{(} @bnfopt{parlist} @bnfter{)} block @Rw{end}} +} + +The following syntactic sugar simplifies function definitions: +@Produc{ +@producname{stat}@producbody{@Rw{function} funcname funcbody} +@producname{stat}@producbody{@Rw{local} @Rw{function} @bnfNter{Name} funcbody} +@producname{funcname}@producbody{@bnfNter{Name} @bnfrep{@bnfter{.} @bnfNter{Name}} @bnfopt{@bnfter{:} @bnfNter{Name}}} +} +The statement +@verbatim{ +function f () @rep{body} end +} +translates to +@verbatim{ +f = function () @rep{body} end +} +The statement +@verbatim{ +function t.a.b.c.f () @rep{body} end +} +translates to +@verbatim{ +t.a.b.c.f = function () @rep{body} end +} +The statement +@verbatim{ +local function f () @rep{body} end +} +translates to +@verbatim{ +local f; f = function () @rep{body} end +} +not to +@verbatim{ +local f = function () @rep{body} end +} +(This only makes a difference when the body of the function +contains references to @id{f}.) + +A function definition is an executable expression, +whose value has type @emph{function}. +When Lua precompiles a chunk, +all its function bodies are precompiled too. +Then, whenever Lua executes the function definition, +the function is @emph{instantiated} (or @emph{closed}). +This function instance (or @emphx{closure}) +is the final value of the expression. + +Parameters act as local variables that are +initialized with the argument values: +@Produc{ +@producname{parlist}@producbody{namelist @bnfopt{@bnfter{,} @bnfter{...}} @Or + @bnfter{...}} +} +When a Lua function is called, +it adjusts its list of @x{arguments} to +the length of its list of parameters, +unless the function is a @def{vararg function}, +which is indicated by three dots (@Char{...}) +at the end of its parameter list. +A vararg function does not adjust its argument list; +instead, it collects all extra arguments and supplies them +to the function through a @def{vararg expression}, +which is also written as three dots. +The value of this expression is a list of all actual extra arguments, +similar to a function with multiple results. +If a vararg expression is used inside another expression +or in the middle of a list of expressions, +then its return list is adjusted to one element. +If the expression is used as the last element of a list of expressions, +then no adjustment is made +(unless that last expression is enclosed in parentheses). + + +As an example, consider the following definitions: +@verbatim{ +function f(a, b) end +function g(a, b, ...) end +function r() return 1,2,3 end +} +Then, we have the following mapping from arguments to parameters and +to the vararg expression: +@verbatim{ +CALL PARAMETERS + +f(3) a=3, b=nil +f(3, 4) a=3, b=4 +f(3, 4, 5) a=3, b=4 +f(r(), 10) a=1, b=10 +f(r()) a=1, b=2 + +g(3) a=3, b=nil, ... --> (nothing) +g(3, 4) a=3, b=4, ... --> (nothing) +g(3, 4, 5, 8) a=3, b=4, ... --> 5 8 +g(5, r()) a=5, b=1, ... --> 2 3 +} + +Results are returned using the @Rw{return} statement @see{control}. +If control reaches the end of a function +without encountering a @Rw{return} statement, +then the function returns with no results. + +@index{multiple return} +There is a system-dependent limit on the number of values +that a function may return. +This limit is guaranteed to be larger than 1000. + +The @emphx{colon} syntax +is used for defining @def{methods}, +that is, functions that have an implicit extra parameter @idx{self}. +Thus, the statement +@verbatim{ +function t.a.b.c:f (@rep{params}) @rep{body} end +} +is syntactic sugar for +@verbatim{ +t.a.b.c.f = function (self, @rep{params}) @rep{body} end +} + +} + +} + +@sect2{visibility| @title{Visibility Rules} + +@index{visibility} +Lua is a lexically scoped language. +The scope of a local variable begins at the first statement after +its declaration and lasts until the last non-void statement +of the innermost block that includes the declaration. +Consider the following example: +@verbatim{ +x = 10 -- global variable +do -- new block + local x = x -- new 'x', with value 10 + print(x) --> 10 + x = x+1 + do -- another block + local x = x+1 -- another 'x' + print(x) --> 12 + end + print(x) --> 11 +end +print(x) --> 10 (the global one) +} + +Notice that, in a declaration like @T{local x = x}, +the new @id{x} being declared is not in scope yet, +and so the second @id{x} refers to the outside variable. + +Because of the @x{lexical scoping} rules, +local variables can be freely accessed by functions +defined inside their scope. +A local variable used by an inner function is called +an @def{upvalue}, or @emphx{external local variable}, +inside the inner function. + +Notice that each execution of a @Rw{local} statement +defines new local variables. +Consider the following example: +@verbatim{ +a = {} +local x = 20 +for i=1,10 do + local y = 0 + a[i] = function () y=y+1; return x+y end +end +} +The loop creates ten closures +(that is, ten instances of the anonymous function). +Each of these closures uses a different @id{y} variable, +while all of them share the same @id{x}. + +} + +} + + +@C{-------------------------------------------------------------------------} +@sect1{API| @title{The Application Program Interface} + +@index{C API} +This section describes the @N{C API} for Lua, that is, +the set of @N{C functions} available to the host program to communicate +with Lua. +All API functions and related types and constants +are declared in the header file @defid{lua.h}. + +Even when we use the term @Q{function}, +any facility in the API may be provided as a macro instead. +Except where stated otherwise, +all such macros use each of their arguments exactly once +(except for the first argument, which is always a Lua state), +and so do not generate any hidden side-effects. + +As in most @N{C libraries}, +the Lua API functions do not check their arguments +for validity or consistency. +However, you can change this behavior by compiling Lua +with the macro @defid{LUA_USE_APICHECK} defined. + +The Lua library is fully reentrant: +it has no global variables. +It keeps all information it needs in a dynamic structure, +called the @def{Lua state}. + +Each Lua state has one or more threads, +which correspond to independent, cooperative lines of execution. +The type @Lid{lua_State} (despite its name) refers to a thread. +(Indirectly, through the thread, it also refers to the +Lua state associated to the thread.) + +A pointer to a thread must be passed as the first argument to +every function in the library, except to @Lid{lua_newstate}, +which creates a Lua state from scratch and returns a pointer +to the @emph{main thread} in the new state. + + +@sect2{@title{The Stack} + +Lua uses a @emph{virtual stack} to pass values to and from C. +Each element in this stack represents a Lua value +(@nil, number, string, etc.). +Functions in the API can access this stack through the +Lua state parameter that they receive. + +Whenever Lua calls C, the called function gets a new stack, +which is independent of previous stacks and of stacks of +@N{C functions} that are still active. +This stack initially contains any arguments to the @N{C function} +and it is where the @N{C function} can store temporary +Lua values and must push its results +to be returned to the caller @seeC{lua_CFunction}. + +For convenience, +most query operations in the API do not follow a strict stack discipline. +Instead, they can refer to any element in the stack +by using an @emph{index}:@index{index (API stack)} +A positive index represents an absolute stack position +(starting @N{at 1}); +a negative index represents an offset relative to the top of the stack. +More specifically, if the stack has @rep{n} elements, +then @N{index 1} represents the first element +(that is, the element that was pushed onto the stack first) +and +@N{index @rep{n}} represents the last element; +@N{index @num{-1}} also represents the last element +(that is, the element at @N{the top}) +and index @M{-n} represents the first element. + +} + +@sect2{stacksize| @title{Stack Size} + +When you interact with the Lua API, +you are responsible for ensuring consistency. +In particular, +@emph{you are responsible for controlling stack overflow}. +You can use the function @Lid{lua_checkstack} +to ensure that the stack has enough space for pushing new elements. + +Whenever Lua calls C, +it ensures that the stack has space for +at least @defid{LUA_MINSTACK} extra slots. +@id{LUA_MINSTACK} is defined as 20, +so that usually you do not have to worry about stack space +unless your code has loops pushing elements onto the stack. + +When you call a Lua function +without a fixed number of results @seeF{lua_call}, +Lua ensures that the stack has enough space for all results, +but it does not ensure any extra space. +So, before pushing anything in the stack after such a call +you should use @Lid{lua_checkstack}. + +} + +@sect2{@title{Valid and Acceptable Indices} + +Any function in the API that receives stack indices +works only with @emphx{valid indices} or @emphx{acceptable indices}. + +A @def{valid index} is an index that refers to a +position that stores a modifiable Lua value. +It comprises stack indices @N{between 1} and the stack top +(@T{1 @leq abs(index) @leq top}) +@index{stack index} +plus @def{pseudo-indices}, +which represent some positions that are accessible to @N{C code} +but that are not in the stack. +Pseudo-indices are used to access the registry @see{registry} +and the upvalues of a @N{C function} @see{c-closure}. + +Functions that do not need a specific mutable position, +but only a value (e.g., query functions), +can be called with acceptable indices. +An @def{acceptable index} can be any valid index, +but it also can be any positive index after the stack top +within the space allocated for the stack, +that is, indices up to the stack size. +(Note that 0 is never an acceptable index.) +Indices to upvalues @see{c-closure} larger than the real number +of upvalues in the current @N{C function} are also acceptable (but invalid). +Except when noted otherwise, +functions in the API work with acceptable indices. + +Acceptable indices serve to avoid extra tests +against the stack top when querying the stack. +For instance, a @N{C function} can query its third argument +without the need to first check whether there is a third argument, +that is, without the need to check whether 3 is a valid index. + +For functions that can be called with acceptable indices, +any non-valid index is treated as if it +contains a value of a virtual type @defid{LUA_TNONE}, +which behaves like a nil value. + +} + +@sect2{c-closure| @title{C Closures} + +When a @N{C function} is created, +it is possible to associate some values with it, +thus creating a @def{@N{C closure}} +@seeC{lua_pushcclosure}; +these values are called @def{upvalues} and are +accessible to the function whenever it is called. + +Whenever a @N{C function} is called, +its upvalues are located at specific pseudo-indices. +These pseudo-indices are produced by the macro +@Lid{lua_upvalueindex}. +The first upvalue associated with a function is at index +@T{lua_upvalueindex(1)}, and so on. +Any access to @T{lua_upvalueindex(@rep{n})}, +where @rep{n} is greater than the number of upvalues of the +current function +(but not greater than 256, +which is one plus the maximum number of upvalues in a closure), +produces an acceptable but invalid index. + +A @N{C closure} can also change the values of its corresponding upvalues. + +} + +@sect2{registry| @title{Registry} + +Lua provides a @def{registry}, +a predefined table that can be used by any @N{C code} to +store whatever Lua values it needs to store. +The registry table is always located at pseudo-index +@defid{LUA_REGISTRYINDEX}. +Any @N{C library} can store data into this table, +but it must take care to choose keys +that are different from those used +by other libraries, to avoid collisions. +Typically, you should use as key a string containing your library name, +or a light userdata with the address of a @N{C object} in your code, +or any Lua object created by your code. +As with variable names, +string keys starting with an underscore followed by +uppercase letters are reserved for Lua. + +The integer keys in the registry are used +by the reference mechanism @seeC{luaL_ref} +and by some predefined values. +Therefore, integer keys must not be used for other purposes. + +When you create a new Lua state, +its registry comes with some predefined values. +These predefined values are indexed with integer keys +defined as constants in @id{lua.h}. +The following constants are defined: +@description{ +@item{@defid{LUA_RIDX_MAINTHREAD}| At this index the registry has +the main thread of the state. +(The main thread is the one created together with the state.) +} + +@item{@defid{LUA_RIDX_GLOBALS}| At this index the registry has +the @x{global environment}. +} +} + +} + +@sect2{C-error|@title{Error Handling in C} + +Internally, Lua uses the C @id{longjmp} facility to handle errors. +(Lua will use exceptions if you compile it as C++; +search for @id{LUAI_THROW} in the source code for details.) +When Lua faces any error +(such as a @x{memory allocation error} or a type error) +it @emph{raises} an error; +that is, it does a long jump. +A @emphx{protected environment} uses @id{setjmp} +to set a recovery point; +any error jumps to the most recent active recovery point. + +Inside a @N{C function} you can raise an error by calling @Lid{lua_error}. + +Most functions in the API can raise an error, +for instance due to a @x{memory allocation error}. +The documentation for each function indicates whether +it can raise errors. + +If an error happens outside any protected environment, +Lua calls a @def{panic function} (see @Lid{lua_atpanic}) +and then calls @T{abort}, +thus exiting the host application. +Your panic function can avoid this exit by +never returning +(e.g., doing a long jump to your own recovery point outside Lua). + +The panic function, +as its name implies, +is a mechanism of last resort. +Programs should avoid it. +As a general rule, +when a @N{C function} is called by Lua with a Lua state, +it can do whatever it wants on that Lua state, +as it should be already protected. +However, +when C code operates on other Lua states +(e.g., a Lua-state argument to the function, +a Lua state stored in the registry, or +the result of @Lid{lua_newthread}), +it should use them only in API calls that cannot raise errors. + +The panic function runs as if it were a @x{message handler} @see{error}; +in particular, the error object is on the top of the stack. +However, there is no guarantee about stack space. +To push anything on the stack, +the panic function must first check the available space @see{stacksize}. + +} + +@sect2{continuations|@title{Handling Yields in C} + +Internally, Lua uses the C @id{longjmp} facility to yield a coroutine. +Therefore, if a @N{C function} @id{foo} calls an API function +and this API function yields +(directly or indirectly by calling another function that yields), +Lua cannot return to @id{foo} any more, +because the @id{longjmp} removes its frame from the C stack. + +To avoid this kind of problem, +Lua raises an error whenever it tries to yield across an API call, +except for three functions: +@Lid{lua_yieldk}, @Lid{lua_callk}, and @Lid{lua_pcallk}. +All those functions receive a @def{continuation function} +(as a parameter named @id{k}) to continue execution after a yield. + +We need to set some terminology to explain continuations. +We have a @N{C function} called from Lua which we will call +the @emph{original function}. +This original function then calls one of those three functions in the C API, +which we will call the @emph{callee function}, +that then yields the current thread. +(This can happen when the callee function is @Lid{lua_yieldk}, +or when the callee function is either @Lid{lua_callk} or @Lid{lua_pcallk} +and the function called by them yields.) + +Suppose the running thread yields while executing the callee function. +After the thread resumes, +it eventually will finish running the callee function. +However, +the callee function cannot return to the original function, +because its frame in the C stack was destroyed by the yield. +Instead, Lua calls a @def{continuation function}, +which was given as an argument to the callee function. +As the name implies, +the continuation function should continue the task +of the original function. + +As an illustration, consider the following function: +@verbatim{ +int original_function (lua_State *L) { + ... /* code 1 */ + status = lua_pcall(L, n, m, h); /* calls Lua */ + ... /* code 2 */ +} +} +Now we want to allow +the Lua code being run by @Lid{lua_pcall} to yield. +First, we can rewrite our function like here: +@verbatim{ +int k (lua_State *L, int status, lua_KContext ctx) { + ... /* code 2 */ +} + +int original_function (lua_State *L) { + ... /* code 1 */ + return k(L, lua_pcall(L, n, m, h), ctx); +} +} +In the above code, +the new function @id{k} is a +@emph{continuation function} (with type @Lid{lua_KFunction}), +which should do all the work that the original function +was doing after calling @Lid{lua_pcall}. +Now, we must inform Lua that it must call @id{k} if the Lua code +being executed by @Lid{lua_pcall} gets interrupted in some way +(errors or yielding), +so we rewrite the code as here, +replacing @Lid{lua_pcall} by @Lid{lua_pcallk}: +@verbatim{ +int original_function (lua_State *L) { + ... /* code 1 */ + return k(L, lua_pcallk(L, n, m, h, ctx2, k), ctx1); +} +} +Note the external, explicit call to the continuation: +Lua will call the continuation only if needed, that is, +in case of errors or resuming after a yield. +If the called function returns normally without ever yielding, +@Lid{lua_pcallk} (and @Lid{lua_callk}) will also return normally. +(Of course, instead of calling the continuation in that case, +you can do the equivalent work directly inside the original function.) + +Besides the Lua state, +the continuation function has two other parameters: +the final status of the call plus the context value (@id{ctx}) that +was passed originally to @Lid{lua_pcallk}. +(Lua does not use this context value; +it only passes this value from the original function to the +continuation function.) +For @Lid{lua_pcallk}, +the status is the same value that would be returned by @Lid{lua_pcallk}, +except that it is @Lid{LUA_YIELD} when being executed after a yield +(instead of @Lid{LUA_OK}). +For @Lid{lua_yieldk} and @Lid{lua_callk}, +the status is always @Lid{LUA_YIELD} when Lua calls the continuation. +(For these two functions, +Lua will not call the continuation in case of errors, +because they do not handle errors.) +Similarly, when using @Lid{lua_callk}, +you should call the continuation function +with @Lid{LUA_OK} as the status. +(For @Lid{lua_yieldk}, there is not much point in calling +directly the continuation function, +because @Lid{lua_yieldk} usually does not return.) + +Lua treats the continuation function as if it were the original function. +The continuation function receives the same Lua stack +from the original function, +in the same state it would be if the callee function had returned. +(For instance, +after a @Lid{lua_callk} the function and its arguments are +removed from the stack and replaced by the results from the call.) +It also has the same upvalues. +Whatever it returns is handled by Lua as if it were the return +of the original function. + +} + +@sect2{@title{Functions and Types} + +Here we list all functions and types from the @N{C API} in +alphabetical order. +Each function has an indicator like this: +@apii{o,p,x} + +The first field, @T{o}, +is how many elements the function pops from the stack. +The second field, @T{p}, +is how many elements the function pushes onto the stack. +(Any function always pushes its results after popping its arguments.) +A field in the form @T{x|y} means the function can push (or pop) +@T{x} or @T{y} elements, +depending on the situation; +an interrogation mark @Char{?} means that +we cannot know how many elements the function pops/pushes +by looking only at its arguments +(e.g., they may depend on what is on the stack). +The third field, @T{x}, +tells whether the function may raise errors: +@Char{-} means the function never raises any error; +@Char{m} means the function may raise only out-of-memory errors; +@Char{v} means the function may raise the errors explained in the text; +@Char{e} means the function can run arbitrary Lua code, +either directly or through metamethods, +and therefore may raise any errors. + + +@APIEntry{int lua_absindex (lua_State *L, int idx);| +@apii{0,0,-} + +Converts the @x{acceptable index} @id{idx} +into an equivalent @x{absolute index} +(that is, one that does not depend on the stack top). + +} + + +@APIEntry{ +typedef void * (*lua_Alloc) (void *ud, + void *ptr, + size_t osize, + size_t nsize);| + +The type of the @x{memory-allocation function} used by Lua states. +The allocator function must provide a +functionality similar to @id{realloc}, +but not exactly the same. +Its arguments are +@id{ud}, an opaque pointer passed to @Lid{lua_newstate}; +@id{ptr}, a pointer to the block being allocated/reallocated/freed; +@id{osize}, the original size of the block or some code about what +is being allocated; +and @id{nsize}, the new size of the block. + +When @id{ptr} is not @id{NULL}, +@id{osize} is the size of the block pointed by @id{ptr}, +that is, the size given when it was allocated or reallocated. + +When @id{ptr} is @id{NULL}, +@id{osize} encodes the kind of object that Lua is allocating. +@id{osize} is any of +@Lid{LUA_TSTRING}, @Lid{LUA_TTABLE}, @Lid{LUA_TFUNCTION}, +@Lid{LUA_TUSERDATA}, or @Lid{LUA_TTHREAD} when (and only when) +Lua is creating a new object of that type. +When @id{osize} is some other value, +Lua is allocating memory for something else. + +Lua assumes the following behavior from the allocator function: + +When @id{nsize} is zero, +the allocator must behave like @id{free} +and return @id{NULL}. + +When @id{nsize} is not zero, +the allocator must behave like @id{realloc}. +The allocator returns @id{NULL} +if and only if it cannot fulfill the request. + +Here is a simple implementation for the @x{allocator function}. +It is used in the auxiliary library by @Lid{luaL_newstate}. +@verbatim{ +static void *l_alloc (void *ud, void *ptr, size_t osize, + size_t nsize) { + (void)ud; (void)osize; /* not used */ + if (nsize == 0) { + free(ptr); + return NULL; + } + else + return realloc(ptr, nsize); +} +} +Note that @N{Standard C} ensures +that @T{free(NULL)} has no effect and that +@T{realloc(NULL,size)} is equivalent to @T{malloc(size)}. + +} + +@APIEntry{void lua_arith (lua_State *L, int op);| +@apii{2|1,1,e} + +Performs an arithmetic or bitwise operation over the two values +(or one, in the case of negations) +at the top of the stack, +with the value on the top being the second operand, +pops these values, and pushes the result of the operation. +The function follows the semantics of the corresponding Lua operator +(that is, it may call metamethods). + +The value of @id{op} must be one of the following constants: +@description{ + +@item{@defid{LUA_OPADD}| performs addition (@T{+})} +@item{@defid{LUA_OPSUB}| performs subtraction (@T{-})} +@item{@defid{LUA_OPMUL}| performs multiplication (@T{*})} +@item{@defid{LUA_OPDIV}| performs float division (@T{/})} +@item{@defid{LUA_OPIDIV}| performs floor division (@T{//})} +@item{@defid{LUA_OPMOD}| performs modulo (@T{%})} +@item{@defid{LUA_OPPOW}| performs exponentiation (@T{^})} +@item{@defid{LUA_OPUNM}| performs mathematical negation (unary @T{-})} +@item{@defid{LUA_OPBNOT}| performs bitwise NOT (@T{~})} +@item{@defid{LUA_OPBAND}| performs bitwise AND (@T{&})} +@item{@defid{LUA_OPBOR}| performs bitwise OR (@T{|})} +@item{@defid{LUA_OPBXOR}| performs bitwise exclusive OR (@T{~})} +@item{@defid{LUA_OPSHL}| performs left shift (@T{<<})} +@item{@defid{LUA_OPSHR}| performs right shift (@T{>>})} + +} + +} + +@APIEntry{lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf);| +@apii{0,0,-} + +Sets a new panic function and returns the old one @see{C-error}. + +} + +@APIEntry{void lua_call (lua_State *L, int nargs, int nresults);| +@apii{nargs+1,nresults,e} + +Calls a function. + +To do a call you must use the following protocol: +first, the value to be called is pushed onto the stack; +then, the arguments to the call are pushed +in direct order; +that is, the first argument is pushed first. +Finally you call @Lid{lua_call}; +@id{nargs} is the number of arguments that you pushed onto the stack. +All arguments and the function value are popped from the stack +when the function is called. +The function results are pushed onto the stack when the function returns. +The number of results is adjusted to @id{nresults}, +unless @id{nresults} is @defid{LUA_MULTRET}. +In this case, all results from the function are pushed; +Lua takes care that the returned values fit into the stack space, +but it does not ensure any extra space in the stack. +The function results are pushed onto the stack in direct order +(the first result is pushed first), +so that after the call the last result is on the top of the stack. + +Any error while calling and running the function is propagated upwards +(with a @id{longjmp}). +Like regular Lua calls, +this function respects the @idx{__call} metamethod. + +The following example shows how the host program can do the +equivalent to this Lua code: +@verbatim{ +a = f("how", t.x, 14) +} +Here it is @N{in C}: +@verbatim{ +lua_getglobal(L, "f"); /* function to be called */ +lua_pushliteral(L, "how"); /* 1st argument */ +lua_getglobal(L, "t"); /* table to be indexed */ +lua_getfield(L, -1, "x"); /* push result of t.x (2nd arg) */ +lua_remove(L, -2); /* remove 't' from the stack */ +lua_pushinteger(L, 14); /* 3rd argument */ +lua_call(L, 3, 1); /* call 'f' with 3 arguments and 1 result */ +lua_setglobal(L, "a"); /* set global 'a' */ +} +Note that the code above is @emph{balanced}: +at its end, the stack is back to its original configuration. +This is considered good programming practice. + +} + +@APIEntry{ +void lua_callk (lua_State *L, + int nargs, + int nresults, + lua_KContext ctx, + lua_KFunction k);| +@apii{nargs + 1,nresults,e} + +This function behaves exactly like @Lid{lua_call}, +but allows the called function to yield @see{continuations}. + +} + +@APIEntry{typedef int (*lua_CFunction) (lua_State *L);| + +Type for @N{C functions}. + +In order to communicate properly with Lua, +a @N{C function} must use the following protocol, +which defines the way parameters and results are passed: +a @N{C function} receives its arguments from Lua in its stack +in direct order (the first argument is pushed first). +So, when the function starts, +@T{lua_gettop(L)} returns the number of arguments received by the function. +The first argument (if any) is at index 1 +and its last argument is at index @T{lua_gettop(L)}. +To return values to Lua, a @N{C function} just pushes them onto the stack, +in direct order (the first result is pushed first), +and returns the number of results. +Any other value in the stack below the results will be properly +discarded by Lua. +Like a Lua function, a @N{C function} called by Lua can also return +many results. + +As an example, the following function receives a variable number +of numeric arguments and returns their average and their sum: +@verbatim{ +static int foo (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + lua_Number sum = 0.0; + int i; + for (i = 1; i <= n; i++) { + if (!lua_isnumber(L, i)) { + lua_pushliteral(L, "incorrect argument"); + lua_error(L); + } + sum += lua_tonumber(L, i); + } + lua_pushnumber(L, sum/n); /* first result */ + lua_pushnumber(L, sum); /* second result */ + return 2; /* number of results */ +} +} + + + +} + + +@APIEntry{int lua_checkstack (lua_State *L, int n);| +@apii{0,0,-} + +Ensures that the stack has space for at least @id{n} extra slots +(that is, that you can safely push up to @id{n} values into it). +It returns false if it cannot fulfill the request, +either because it would cause the stack +to be larger than a fixed maximum size +(typically at least several thousand elements) or +because it cannot allocate memory for the extra space. +This function never shrinks the stack; +if the stack already has space for the extra slots, +it is left unchanged. + +} + +@APIEntry{void lua_close (lua_State *L);| +@apii{0,0,-} + +Destroys all objects in the given Lua state +(calling the corresponding garbage-collection metamethods, if any) +and frees all dynamic memory used by this state. +On several platforms, you may not need to call this function, +because all resources are naturally released when the host program ends. +On the other hand, long-running programs that create multiple states, +such as daemons or web servers, +will probably need to close states as soon as they are not needed. + +} + +@APIEntry{int lua_compare (lua_State *L, int index1, int index2, int op);| +@apii{0,0,e} + +Compares two Lua values. +Returns 1 if the value at index @id{index1} satisfies @id{op} +when compared with the value at index @id{index2}, +following the semantics of the corresponding Lua operator +(that is, it may call metamethods). +Otherwise @N{returns 0}. +Also @N{returns 0} if any of the indices is not valid. + +The value of @id{op} must be one of the following constants: +@description{ + +@item{@defid{LUA_OPEQ}| compares for equality (@T{==})} +@item{@defid{LUA_OPLT}| compares for less than (@T{<})} +@item{@defid{LUA_OPLE}| compares for less or equal (@T{<=})} + +} + +} + +@APIEntry{void lua_concat (lua_State *L, int n);| +@apii{n,1,e} + +Concatenates the @id{n} values at the top of the stack, +pops them, and leaves the result on the top. +If @N{@T{n} is 1}, the result is the single value on the stack +(that is, the function does nothing); +if @id{n} is 0, the result is the empty string. +Concatenation is performed following the usual semantics of Lua +@see{concat}. + +} + +@APIEntry{void lua_copy (lua_State *L, int fromidx, int toidx);| +@apii{0,0,-} + +Copies the element at index @id{fromidx} +into the valid index @id{toidx}, +replacing the value at that position. +Values at other positions are not affected. + +} + +@APIEntry{void lua_createtable (lua_State *L, int narr, int nrec);| +@apii{0,1,m} + +Creates a new empty table and pushes it onto the stack. +Parameter @id{narr} is a hint for how many elements the table +will have as a sequence; +parameter @id{nrec} is a hint for how many other elements +the table will have. +Lua may use these hints to preallocate memory for the new table. +This preallocation is useful for performance when you know in advance +how many elements the table will have. +Otherwise you can use the function @Lid{lua_newtable}. + +} + +@APIEntry{int lua_dump (lua_State *L, + lua_Writer writer, + void *data, + int strip);| +@apii{0,0,-} + +Dumps a function as a binary chunk. +Receives a Lua function on the top of the stack +and produces a binary chunk that, +if loaded again, +results in a function equivalent to the one dumped. +As it produces parts of the chunk, +@Lid{lua_dump} calls function @id{writer} @seeC{lua_Writer} +with the given @id{data} +to write them. + +If @id{strip} is true, +the binary representation may not include all debug information +about the function, +to save space. + +The value returned is the error code returned by the last +call to the writer; +@N{0 means} no errors. + +This function does not pop the Lua function from the stack. + +} + +@APIEntry{int lua_error (lua_State *L);| +@apii{1,0,v} + +Generates a Lua error, +using the value on the top of the stack as the error object. +This function does a long jump, +and therefore never returns +@seeC{luaL_error}. + +} + +@APIEntry{int lua_gc (lua_State *L, int what, int data);| +@apii{0,0,-} + +Controls the garbage collector. + +This function performs several tasks, +according to the value of the parameter @id{what}: +@description{ + +@item{@id{LUA_GCSTOP}| +stops the garbage collector. +} + +@item{@id{LUA_GCRESTART}| +restarts the garbage collector. +} + +@item{@id{LUA_GCCOLLECT}| +performs a full garbage-collection cycle. +} + +@item{@id{LUA_GCCOUNT}| +returns the current amount of memory (in Kbytes) in use by Lua. +} + +@item{@id{LUA_GCCOUNTB}| +returns the remainder of dividing the current amount of bytes of +memory in use by Lua by 1024. +} + +@item{@id{LUA_GCSTEP}| +performs an incremental step of garbage collection. +} + +@item{@id{LUA_GCSETPAUSE}| +sets @id{data} as the new value +for the @emph{pause} of the collector @see{GC} +and returns the previous value of the pause. +} + +@item{@id{LUA_GCSETSTEPMUL}| +sets @id{data} as the new value for the @emph{step multiplier} of +the collector @see{GC} +and returns the previous value of the step multiplier. +} + +@item{@id{LUA_GCISRUNNING}| +returns a boolean that tells whether the collector is running +(i.e., not stopped). +} + +} +For more details about these options, +see @Lid{collectgarbage}. + +} + +@APIEntry{lua_Alloc lua_getallocf (lua_State *L, void **ud);| +@apii{0,0,-} + +Returns the @x{memory-allocation function} of a given state. +If @id{ud} is not @id{NULL}, Lua stores in @T{*ud} the +opaque pointer given when the memory-allocator function was set. + +} + +@APIEntry{int lua_getfield (lua_State *L, int index, const char *k);| +@apii{0,1,e} + +Pushes onto the stack the value @T{t[k]}, +where @id{t} is the value at the given index. +As in Lua, this function may trigger a metamethod +for the @Q{index} event @see{metatable}. + +Returns the type of the pushed value. + +} + +@APIEntry{void *lua_getextraspace (lua_State *L);| +@apii{0,0,-} + +Returns a pointer to a raw memory area associated with the +given Lua state. +The application can use this area for any purpose; +Lua does not use it for anything. + +Each new thread has this area initialized with a copy +of the area of the @x{main thread}. + +By default, this area has the size of a pointer to void, +but you can recompile Lua with a different size for this area. +(See @id{LUA_EXTRASPACE} in @id{luaconf.h}.) + +} + +@APIEntry{int lua_getglobal (lua_State *L, const char *name);| +@apii{0,1,e} + +Pushes onto the stack the value of the global @id{name}. +Returns the type of that value. + +} + +@APIEntry{int lua_geti (lua_State *L, int index, lua_Integer i);| +@apii{0,1,e} + +Pushes onto the stack the value @T{t[i]}, +where @id{t} is the value at the given index. +As in Lua, this function may trigger a metamethod +for the @Q{index} event @see{metatable}. + +Returns the type of the pushed value. + +} + +@APIEntry{int lua_getmetatable (lua_State *L, int index);| +@apii{0,0|1,-} + +If the value at the given index has a metatable, +the function pushes that metatable onto the stack and @N{returns 1}. +Otherwise, +the function @N{returns 0} and pushes nothing on the stack. + +} + +@APIEntry{int lua_gettable (lua_State *L, int index);| +@apii{1,1,e} + +Pushes onto the stack the value @T{t[k]}, +where @id{t} is the value at the given index +and @id{k} is the value on the top of the stack. + +This function pops the key from the stack, +pushing the resulting value in its place. +As in Lua, this function may trigger a metamethod +for the @Q{index} event @see{metatable}. + +Returns the type of the pushed value. + +} + +@APIEntry{int lua_gettop (lua_State *L);| +@apii{0,0,-} + +Returns the index of the top element in the stack. +Because indices start @N{at 1}, +this result is equal to the number of elements in the stack; +in particular, @N{0 means} an empty stack. + +} + +@APIEntry{int lua_getiuservalue (lua_State *L, int index, int n);| +@apii{0,1,-} + +Pushes onto the stack the @id{n}-th user value associated with the +full userdata at the given index and +returns the type of the pushed value. + +If the userdata does not have that value, +pushes @nil and returns @Lid{LUA_TNONE}. + +} + +@APIEntry{void lua_insert (lua_State *L, int index);| +@apii{1,1,-} + +Moves the top element into the given valid index, +shifting up the elements above this index to open space. +This function cannot be called with a pseudo-index, +because a pseudo-index is not an actual stack position. + +} + +@APIEntry{typedef @ldots lua_Integer;| + +The type of integers in Lua. + +By default this type is @id{long long}, +(usually a 64-bit two-complement integer), +but that can be changed to @id{long} or @id{int} +(usually a 32-bit two-complement integer). +(See @id{LUA_INT_TYPE} in @id{luaconf.h}.) + +Lua also defines the constants +@defid{LUA_MININTEGER} and @defid{LUA_MAXINTEGER}, +with the minimum and the maximum values that fit in this type. + +} + +@APIEntry{int lua_isboolean (lua_State *L, int index);| +@apii{0,0,-} + +Returns 1 if the value at the given index is a boolean, +and @N{0 otherwise}. + +} + +@APIEntry{int lua_iscfunction (lua_State *L, int index);| +@apii{0,0,-} + +Returns 1 if the value at the given index is a @N{C function}, +and @N{0 otherwise}. + +} + +@APIEntry{int lua_isfunction (lua_State *L, int index);| +@apii{0,0,-} + +Returns 1 if the value at the given index is a function +(either C or Lua), and @N{0 otherwise}. + +} + +@APIEntry{int lua_isinteger (lua_State *L, int index);| +@apii{0,0,-} + +Returns 1 if the value at the given index is an integer +(that is, the value is a number and is represented as an integer), +and @N{0 otherwise}. + +} + +@APIEntry{int lua_islightuserdata (lua_State *L, int index);| +@apii{0,0,-} + +Returns 1 if the value at the given index is a light userdata, +and @N{0 otherwise}. + +} + +@APIEntry{int lua_isnil (lua_State *L, int index);| +@apii{0,0,-} + +Returns 1 if the value at the given index is @nil, +and @N{0 otherwise}. + +} + +@APIEntry{int lua_isnone (lua_State *L, int index);| +@apii{0,0,-} + +Returns 1 if the given index is not valid, +and @N{0 otherwise}. + +} + +@APIEntry{int lua_isnoneornil (lua_State *L, int index);| +@apii{0,0,-} + +Returns 1 if the given index is not valid +or if the value at this index is @nil, +and @N{0 otherwise}. + +} + +@APIEntry{int lua_isnumber (lua_State *L, int index);| +@apii{0,0,-} + +Returns 1 if the value at the given index is a number +or a string convertible to a number, +and @N{0 otherwise}. + +} + +@APIEntry{int lua_isstring (lua_State *L, int index);| +@apii{0,0,-} + +Returns 1 if the value at the given index is a string +or a number (which is always convertible to a string), +and @N{0 otherwise}. + +} + +@APIEntry{int lua_istable (lua_State *L, int index);| +@apii{0,0,-} + +Returns 1 if the value at the given index is a table, +and @N{0 otherwise}. + +} + +@APIEntry{int lua_isthread (lua_State *L, int index);| +@apii{0,0,-} + +Returns 1 if the value at the given index is a thread, +and @N{0 otherwise}. + +} + +@APIEntry{int lua_isuserdata (lua_State *L, int index);| +@apii{0,0,-} + +Returns 1 if the value at the given index is a userdata +(either full or light), and @N{0 otherwise}. + +} + +@APIEntry{int lua_isyieldable (lua_State *L);| +@apii{0,0,-} + +Returns 1 if the given coroutine can yield, +and @N{0 otherwise}. + +} + +@APIEntry{typedef @ldots lua_KContext;| + +The type for continuation-function contexts. +It must be a numeric type. +This type is defined as @id{intptr_t} +when @id{intptr_t} is available, +so that it can store pointers too. +Otherwise, it is defined as @id{ptrdiff_t}. + +} + +@APIEntry{ +typedef int (*lua_KFunction) (lua_State *L, int status, lua_KContext ctx);| + +Type for continuation functions @see{continuations}. + +} + +@APIEntry{void lua_len (lua_State *L, int index);| +@apii{0,1,e} + +Returns the length of the value at the given index. +It is equivalent to the @Char{#} operator in Lua @see{len-op} and +may trigger a metamethod for the @Q{length} event @see{metatable}. +The result is pushed on the stack. + +} + +@APIEntry{ +int lua_load (lua_State *L, + lua_Reader reader, + void *data, + const char *chunkname, + const char *mode);| +@apii{0,1,-} + +Loads a Lua chunk without running it. +If there are no errors, +@id{lua_load} pushes the compiled chunk as a Lua +function on top of the stack. +Otherwise, it pushes an error message. + +The return values of @id{lua_load} are: +@description{ + +@item{@Lid{LUA_OK}| no errors;} + +@item{@defid{LUA_ERRSYNTAX}| +syntax error during precompilation;} + +@item{@Lid{LUA_ERRMEM}| +@x{memory allocation (out-of-memory) error};} + +} + +The @id{lua_load} function uses a user-supplied @id{reader} function +to read the chunk @seeC{lua_Reader}. +The @id{data} argument is an opaque value passed to the reader function. + +The @id{chunkname} argument gives a name to the chunk, +which is used for error messages and in debug information @see{debugI}. + +@id{lua_load} automatically detects whether the chunk is text or binary +and loads it accordingly (see program @idx{luac}). +The string @id{mode} works as in function @Lid{load}, +with the addition that +a @id{NULL} value is equivalent to the string @St{bt}. + +@id{lua_load} uses the stack internally, +so the reader function must always leave the stack +unmodified when returning. + +If the resulting function has upvalues, +its first upvalue is set to the value of the @x{global environment} +stored at index @id{LUA_RIDX_GLOBALS} in the registry @see{registry}. +When loading main chunks, +this upvalue will be the @id{_ENV} variable @see{globalenv}. +Other upvalues are initialized with @nil. + +} + +@APIEntry{lua_State *lua_newstate (lua_Alloc f, void *ud);| +@apii{0,0,-} + +Creates a new thread running in a new, independent state. +Returns @id{NULL} if it cannot create the thread or the state +(due to lack of memory). +The argument @id{f} is the @x{allocator function}; +Lua does all memory allocation for this state +through this function @seeF{lua_Alloc}. +The second argument, @id{ud}, is an opaque pointer that Lua +passes to the allocator in every call. + +} + +@APIEntry{void lua_newtable (lua_State *L);| +@apii{0,1,m} + +Creates a new empty table and pushes it onto the stack. +It is equivalent to @T{lua_createtable(L, 0, 0)}. + +} + +@APIEntry{lua_State *lua_newthread (lua_State *L);| +@apii{0,1,m} + +Creates a new thread, pushes it on the stack, +and returns a pointer to a @Lid{lua_State} that represents this new thread. +The new thread returned by this function shares with the original thread +its global environment, +but has an independent execution stack. + +There is no explicit function to close or to destroy a thread. +Threads are subject to garbage collection, +like any Lua object. + +} + +@APIEntry{void *lua_newuserdatauv (lua_State *L, size_t size, int nuvalue);| +@apii{0,1,m} + +This function creates and pushes on the stack a new full userdata, +with @id{nuvalue} associated Lua values (called @id{user values}) +plus an associated block of raw memory with @id{size} bytes. +(The user values can be set and read with the functions +@Lid{lua_setiuservalue} and @Lid{lua_getiuservalue}.) + +The function returns the address of the block of memory. + +} + +@APIEntry{int lua_next (lua_State *L, int index);| +@apii{1,2|0,v} + +Pops a key from the stack, +and pushes a key@En{}value pair from the table at the given index +(the @Q{next} pair after the given key). +If there are no more elements in the table, +then @Lid{lua_next} returns 0 (and pushes nothing). + +A typical traversal looks like this: +@verbatim{ +/* table is in the stack at index 't' */ +lua_pushnil(L); /* first key */ +while (lua_next(L, t) != 0) { + /* uses 'key' (at index -2) and 'value' (at index -1) */ + printf("%s - %s\n", + lua_typename(L, lua_type(L, -2)), + lua_typename(L, lua_type(L, -1))); + /* removes 'value'; keeps 'key' for next iteration */ + lua_pop(L, 1); +} +} + +While traversing a table, +do not call @Lid{lua_tolstring} directly on a key, +unless you know that the key is actually a string. +Recall that @Lid{lua_tolstring} may change +the value at the given index; +this confuses the next call to @Lid{lua_next}. + +This function may raise an error if the given key +is neither @nil nor present in the table. +See function @Lid{next} for the caveats of modifying +the table during its traversal. + +} + +@APIEntry{typedef @ldots lua_Number;| + +The type of floats in Lua. + +By default this type is double, +but that can be changed to a single float or a long double. +(See @id{LUA_FLOAT_TYPE} in @id{luaconf.h}.) + +} + +@APIEntry{int lua_numbertointeger (lua_Number n, lua_Integer *p);| + +Converts a Lua float to a Lua integer. +This macro assumes that @id{n} has an integral value. +If that value is within the range of Lua integers, +it is converted to an integer and assigned to @T{*p}. +The macro results in a boolean indicating whether the +conversion was successful. +(Note that this range test can be tricky to do +correctly without this macro, +due to roundings.) + +This macro may evaluate its arguments more than once. + +} + +@APIEntry{int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);| +@apii{nargs + 1,nresults|1,-} + +Calls a function (or a callable object) in protected mode. + +Both @id{nargs} and @id{nresults} have the same meaning as +in @Lid{lua_call}. +If there are no errors during the call, +@Lid{lua_pcall} behaves exactly like @Lid{lua_call}. +However, if there is any error, +@Lid{lua_pcall} catches it, +pushes a single value on the stack (the error object), +and returns an error code. +Like @Lid{lua_call}, +@Lid{lua_pcall} always removes the function +and its arguments from the stack. + +If @id{msgh} is 0, +then the error object returned on the stack +is exactly the original error object. +Otherwise, @id{msgh} is the stack index of a +@emph{message handler}. +(This index cannot be a pseudo-index.) +In case of runtime errors, +this function will be called with the error object +and its return value will be the object +returned on the stack by @Lid{lua_pcall}. + +Typically, the message handler is used to add more debug +information to the error object, such as a stack traceback. +Such information cannot be gathered after the return of @Lid{lua_pcall}, +since by then the stack has unwound. + +The @Lid{lua_pcall} function returns one of the following constants +(defined in @id{lua.h}): +@description{ + +@item{@defid{LUA_OK} (0)| +success.} + +@item{@defid{LUA_ERRRUN}| +a runtime error. +} + +@item{@defid{LUA_ERRMEM}| +@x{memory allocation error}. +For such errors, Lua does not call the @x{message handler}. +} + +@item{@defid{LUA_ERRERR}| +error while running the @x{message handler}. +} + +} + +} + +@APIEntry{ +int lua_pcallk (lua_State *L, + int nargs, + int nresults, + int msgh, + lua_KContext ctx, + lua_KFunction k);| +@apii{nargs + 1,nresults|1,-} + +This function behaves exactly like @Lid{lua_pcall}, +but allows the called function to yield @see{continuations}. + +} + +@APIEntry{void lua_pop (lua_State *L, int n);| +@apii{n,0,-} + +Pops @id{n} elements from the stack. + +} + +@APIEntry{void lua_pushboolean (lua_State *L, int b);| +@apii{0,1,-} + +Pushes a boolean value with value @id{b} onto the stack. + +} + +@APIEntry{void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);| +@apii{n,1,m} + +Pushes a new @N{C closure} onto the stack. +This function receives a pointer to a @N{C function} +and pushes onto the stack a Lua value of type @id{function} that, +when called, invokes the corresponding @N{C function}. +The parameter @id{n} tells how many upvalues this function will have +@see{c-closure}. + +Any function to be callable by Lua must +follow the correct protocol to receive its parameters +and return its results @seeC{lua_CFunction}. + +When a @N{C function} is created, +it is possible to associate some values with it, +thus creating a @x{@N{C closure}} @see{c-closure}; +these values are then accessible to the function whenever it is called. +To associate values with a @N{C function}, +first these values must be pushed onto the stack +(when there are multiple values, the first value is pushed first). +Then @Lid{lua_pushcclosure} +is called to create and push the @N{C function} onto the stack, +with the argument @id{n} telling how many values will be +associated with the function. +@Lid{lua_pushcclosure} also pops these values from the stack. + +The maximum value for @id{n} is 255. + +When @id{n} is zero, +this function creates a @def{light @N{C function}}, +which is just a pointer to the @N{C function}. +In that case, it never raises a memory error. + +} + +@APIEntry{void lua_pushcfunction (lua_State *L, lua_CFunction f);| +@apii{0,1,-} + +Pushes a @N{C function} onto the stack. + +} + +@APIEntry{const char *lua_pushfstring (lua_State *L, const char *fmt, ...);| +@apii{0,1,v} + +Pushes onto the stack a formatted string +and returns a pointer to this string. +It is similar to the @ANSI{sprintf}, +but has two important differences. +First, +you do not have to allocate space for the result; +the result is a Lua string and Lua takes care of memory allocation +(and deallocation, through garbage collection). +Second, +the conversion specifiers are quite restricted. +There are no flags, widths, or precisions. +The conversion specifiers can only be +@Char{%%} (inserts the character @Char{%}), +@Char{%s} (inserts a zero-terminated string, with no size restrictions), +@Char{%f} (inserts a @Lid{lua_Number}), +@Char{%I} (inserts a @Lid{lua_Integer}), +@Char{%p} (inserts a pointer as a hexadecimal numeral), +@Char{%d} (inserts an @T{int}), +@Char{%c} (inserts an @T{int} as a one-byte character), and +@Char{%U} (inserts a @T{long int} as a @x{UTF-8} byte sequence). + +This function may raise errors due to memory overflow +or an invalid conversion specifier. + +} + +@APIEntry{void lua_pushglobaltable (lua_State *L);| +@apii{0,1,-} + +Pushes the @x{global environment} onto the stack. + +} + +@APIEntry{void lua_pushinteger (lua_State *L, lua_Integer n);| +@apii{0,1,-} + +Pushes an integer with value @id{n} onto the stack. + +} + +@APIEntry{void lua_pushlightuserdata (lua_State *L, void *p);| +@apii{0,1,-} + +Pushes a light userdata onto the stack. + +Userdata represent @N{C values} in Lua. +A @def{light userdata} represents a pointer, a @T{void*}. +It is a value (like a number): +you do not create it, it has no individual metatable, +and it is not collected (as it was never created). +A light userdata is equal to @Q{any} +light userdata with the same @N{C address}. + +} + +@APIEntry{const char *lua_pushliteral (lua_State *L, const char *s);| +@apii{0,1,m} + +This macro is equivalent to @Lid{lua_pushstring}, +but should be used only when @id{s} is a literal string. + +} + +@APIEntry{const char *lua_pushlstring (lua_State *L, const char *s, size_t len);| +@apii{0,1,m} + +Pushes the string pointed to by @id{s} with size @id{len} +onto the stack. +Lua makes (or reuses) an internal copy of the given string, +so the memory at @id{s} can be freed or reused immediately after +the function returns. +The string can contain any binary data, +including @x{embedded zeros}. + +Returns a pointer to the internal copy of the string. + +} + +@APIEntry{void lua_pushnil (lua_State *L);| +@apii{0,1,-} + +Pushes a nil value onto the stack. + +} + +@APIEntry{void lua_pushnumber (lua_State *L, lua_Number n);| +@apii{0,1,-} + +Pushes a float with value @id{n} onto the stack. + +} + +@APIEntry{const char *lua_pushstring (lua_State *L, const char *s);| +@apii{0,1,m} + +Pushes the zero-terminated string pointed to by @id{s} +onto the stack. +Lua makes (or reuses) an internal copy of the given string, +so the memory at @id{s} can be freed or reused immediately after +the function returns. + +Returns a pointer to the internal copy of the string. + +If @id{s} is @id{NULL}, pushes @nil and returns @id{NULL}. + +} + +@APIEntry{int lua_pushthread (lua_State *L);| +@apii{0,1,-} + +Pushes the thread represented by @id{L} onto the stack. +Returns 1 if this thread is the @x{main thread} of its state. + +} + +@APIEntry{void lua_pushvalue (lua_State *L, int index);| +@apii{0,1,-} + +Pushes a copy of the element at the given index +onto the stack. + +} + +@APIEntry{ +const char *lua_pushvfstring (lua_State *L, + const char *fmt, + va_list argp);| +@apii{0,1,v} + +Equivalent to @Lid{lua_pushfstring}, except that it receives a @id{va_list} +instead of a variable number of arguments. + +} + +@APIEntry{int lua_rawequal (lua_State *L, int index1, int index2);| +@apii{0,0,-} + +Returns 1 if the two values in indices @id{index1} and +@id{index2} are primitively equal +(that is, without calling the @idx{__eq} metamethod). +Otherwise @N{returns 0}. +Also @N{returns 0} if any of the indices are not valid. + +} + +@APIEntry{int lua_rawget (lua_State *L, int index);| +@apii{1,1,-} + +Similar to @Lid{lua_gettable}, but does a raw access +(i.e., without metamethods). + +} + +@APIEntry{int lua_rawgeti (lua_State *L, int index, lua_Integer n);| +@apii{0,1,-} + +Pushes onto the stack the value @T{t[n]}, +where @id{t} is the table at the given index. +The access is raw, +that is, it does not invoke the @idx{__index} metamethod. + +Returns the type of the pushed value. + +} + +@APIEntry{int lua_rawgetp (lua_State *L, int index, const void *p);| +@apii{0,1,-} + +Pushes onto the stack the value @T{t[k]}, +where @id{t} is the table at the given index and +@id{k} is the pointer @id{p} represented as a light userdata. +The access is raw; +that is, it does not invoke the @idx{__index} metamethod. + +Returns the type of the pushed value. + +} + +@APIEntry{lua_Unsigned lua_rawlen (lua_State *L, int index);| +@apii{0,0,-} + +Returns the raw @Q{length} of the value at the given index: +for strings, this is the string length; +for tables, this is the result of the length operator (@Char{#}) +with no metamethods; +for userdata, this is the size of the block of memory allocated +for the userdata; +for other values, it @N{is 0}. + +} + +@APIEntry{void lua_rawset (lua_State *L, int index);| +@apii{2,0,m} + +Similar to @Lid{lua_settable}, but does a raw assignment +(i.e., without metamethods). + +} + +@APIEntry{void lua_rawseti (lua_State *L, int index, lua_Integer i);| +@apii{1,0,m} + +Does the equivalent of @T{t[i] = v}, +where @id{t} is the table at the given index +and @id{v} is the value on the top of the stack. + +This function pops the value from the stack. +The assignment is raw, +that is, it does not invoke the @idx{__newindex} metamethod. + +} + +@APIEntry{void lua_rawsetp (lua_State *L, int index, const void *p);| +@apii{1,0,m} + +Does the equivalent of @T{t[p] = v}, +where @id{t} is the table at the given index, +@id{p} is encoded as a light userdata, +and @id{v} is the value on the top of the stack. + +This function pops the value from the stack. +The assignment is raw, +that is, it does not invoke @idx{__newindex} metamethod. + +} + +@APIEntry{ +typedef const char * (*lua_Reader) (lua_State *L, + void *data, + size_t *size);| + +The reader function used by @Lid{lua_load}. +Every time it needs another piece of the chunk, +@Lid{lua_load} calls the reader, +passing along its @id{data} parameter. +The reader must return a pointer to a block of memory +with a new piece of the chunk +and set @id{size} to the block size. +The block must exist until the reader function is called again. +To signal the end of the chunk, +the reader must return @id{NULL} or set @id{size} to zero. +The reader function may return pieces of any size greater than zero. + +} + +@APIEntry{void lua_register (lua_State *L, const char *name, lua_CFunction f);| +@apii{0,0,e} + +Sets the @N{C function} @id{f} as the new value of global @id{name}. +It is defined as a macro: +@verbatim{ +#define lua_register(L,n,f) \ + (lua_pushcfunction(L, f), lua_setglobal(L, n)) +} + +} + +@APIEntry{void lua_remove (lua_State *L, int index);| +@apii{1,0,-} + +Removes the element at the given valid index, +shifting down the elements above this index to fill the gap. +This function cannot be called with a pseudo-index, +because a pseudo-index is not an actual stack position. + +} + +@APIEntry{void lua_replace (lua_State *L, int index);| +@apii{1,0,-} + +Moves the top element into the given valid index +without shifting any element +(therefore replacing the value at that given index), +and then pops the top element. + +} + +@APIEntry{int lua_resetthread (lua_State *L);| +@apii{0,?,-} + +Resets a thread, cleaning its call stack and closing all pending +to-be-closed variables. +Returns a status code: +@Lid{LUA_OK} for no errors in closing methods, +or an error status otherwise. +In case of error, +leave the error object on the stack, + +} + +@APIEntry{int lua_resume (lua_State *L, lua_State *from, int nargs, + int *nresults);| +@apii{?,?,-} + +Starts and resumes a coroutine in the given thread @id{L}. + +To start a coroutine, +you push onto the thread stack the main function plus any arguments; +then you call @Lid{lua_resume}, +with @id{nargs} being the number of arguments. +This call returns when the coroutine suspends or finishes its execution. +When it returns, +@id{nresults} is updated and +the top of the stack contains +the @id{nresults} values passed to @Lid{lua_yield} +or returned by the body function. +@Lid{lua_resume} returns +@Lid{LUA_YIELD} if the coroutine yields, +@Lid{LUA_OK} if the coroutine finishes its execution +without errors, +or an error code in case of errors @seeC{lua_pcall}. +In case of errors, +the error object is on the top of the stack. + +To resume a coroutine, +you remove all results from the last @Lid{lua_yield}, +put on its stack only the values to +be passed as results from @id{yield}, +and then call @Lid{lua_resume}. + +The parameter @id{from} represents the coroutine that is resuming @id{L}. +If there is no such coroutine, +this parameter can be @id{NULL}. + +} + +@APIEntry{void lua_rotate (lua_State *L, int idx, int n);| +@apii{0,0,-} + +Rotates the stack elements between the valid index @id{idx} +and the top of the stack. +The elements are rotated @id{n} positions in the direction of the top, +for a positive @id{n}, +or @T{-n} positions in the direction of the bottom, +for a negative @id{n}. +The absolute value of @id{n} must not be greater than the size +of the slice being rotated. +This function cannot be called with a pseudo-index, +because a pseudo-index is not an actual stack position. + +} + +@APIEntry{void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);| +@apii{0,0,-} + +Changes the @x{allocator function} of a given state to @id{f} +with user data @id{ud}. + +} + +@APIEntry{void lua_setfield (lua_State *L, int index, const char *k);| +@apii{1,0,e} + +Does the equivalent to @T{t[k] = v}, +where @id{t} is the value at the given index +and @id{v} is the value on the top of the stack. + +This function pops the value from the stack. +As in Lua, this function may trigger a metamethod +for the @Q{newindex} event @see{metatable}. + +} + +@APIEntry{void lua_setglobal (lua_State *L, const char *name);| +@apii{1,0,e} + +Pops a value from the stack and +sets it as the new value of global @id{name}. + +} + +@APIEntry{void lua_seti (lua_State *L, int index, lua_Integer n);| +@apii{1,0,e} + +Does the equivalent to @T{t[n] = v}, +where @id{t} is the value at the given index +and @id{v} is the value on the top of the stack. + +This function pops the value from the stack. +As in Lua, this function may trigger a metamethod +for the @Q{newindex} event @see{metatable}. + +} + +@APIEntry{int lua_setiuservalue (lua_State *L, int index, int n);| +@apii{1,0,-} + +Pops a value from the stack and sets it as +the new @id{n}-th user value associated to the +full userdata at the given index. +Returns 0 if the userdata does not have that value. + +} + +@APIEntry{void lua_setmetatable (lua_State *L, int index);| +@apii{1,0,-} + +Pops a table from the stack and +sets it as the new metatable for the value at the given index. + +} + +@APIEntry{void lua_settable (lua_State *L, int index);| +@apii{2,0,e} + +Does the equivalent to @T{t[k] = v}, +where @id{t} is the value at the given index, +@id{v} is the value on the top of the stack, +and @id{k} is the value just below the top. + +This function pops both the key and the value from the stack. +As in Lua, this function may trigger a metamethod +for the @Q{newindex} event @see{metatable}. + +} + +@APIEntry{void lua_settop (lua_State *L, int index);| +@apii{?,?,-} + +Accepts any index, @N{or 0}, +and sets the stack top to this index. +If the new top is larger than the old one, +then the new elements are filled with @nil. +If @id{index} @N{is 0}, then all stack elements are removed. + +} + +@APIEntry{void lua_setwarnf (lua_State *L, lua_WarnFunction f, void *ud);| +@apii{0,0,-} + +Sets the @x{warning function} to be used by Lua to emit warnings +@see{lua_WarnFunction}. +The @id{ud} parameter sets the value @id{ud} passed to +the warning function. + +} + +@APIEntry{typedef struct lua_State lua_State;| + +An opaque structure that points to a thread and indirectly +(through the thread) to the whole state of a Lua interpreter. +The Lua library is fully reentrant: +it has no global variables. +All information about a state is accessible through this structure. + +A pointer to this structure must be passed as the first argument to +every function in the library, except to @Lid{lua_newstate}, +which creates a Lua state from scratch. + +} + +@APIEntry{int lua_status (lua_State *L);| +@apii{0,0,-} + +Returns the status of the thread @id{L}. + +The status can be 0 (@Lid{LUA_OK}) for a normal thread, +an error code if the thread finished the execution +of a @Lid{lua_resume} with an error, +or @defid{LUA_YIELD} if the thread is suspended. + +You can only call functions in threads with status @Lid{LUA_OK}. +You can resume threads with status @Lid{LUA_OK} +(to start a new coroutine) or @Lid{LUA_YIELD} +(to resume a coroutine). + +} + +@APIEntry{size_t lua_stringtonumber (lua_State *L, const char *s);| +@apii{0,1,-} + +Converts the zero-terminated string @id{s} to a number, +pushes that number into the stack, +and returns the total size of the string, +that is, its length plus one. +The conversion can result in an integer or a float, +according to the lexical conventions of Lua @see{lexical}. +The string may have leading and trailing spaces and a sign. +If the string is not a valid numeral, +returns 0 and pushes nothing. +(Note that the result can be used as a boolean, +true if the conversion succeeds.) + +} + +@APIEntry{int lua_toboolean (lua_State *L, int index);| +@apii{0,0,-} + +Converts the Lua value at the given index to a @N{C boolean} +value (@N{0 or 1}). +Like all tests in Lua, +@Lid{lua_toboolean} returns true for any Lua value +different from @false and @nil; +otherwise it returns false. +(If you want to accept only actual boolean values, +use @Lid{lua_isboolean} to test the value's type.) + +} + +@APIEntry{lua_CFunction lua_tocfunction (lua_State *L, int index);| +@apii{0,0,-} + +Converts a value at the given index to a @N{C function}. +That value must be a @N{C function}; +otherwise, returns @id{NULL}. + +} + +@APIEntry{void lua_toclose (lua_State *L, int index);| +@apii{0,0,v} + +Marks the given index in the stack as a +to-be-closed @Q{variable} @see{to-be-closed}. +Like a to-be-closed variable in Lua, +the value at that index in the stack will be closed +when it goes out of scope. +Here, in the context of a C function, +to go out of scope means that the running function returns (to Lua), +there is an error, +or the index is removed from the stack through +@Lid{lua_settop} or @Lid{lua_pop}. +An index marked as to-be-closed should not be removed from the stack +by any other function in the API except @Lid{lua_settop} or @Lid{lua_pop}. + +This function should not be called for an index +that is equal to or below an already marked to-be-closed index. + +This function can raise an out-of-memory error. +In that case, the value in the given index is immediately closed, +as if it was already marked. + +} + +@APIEntry{lua_Integer lua_tointeger (lua_State *L, int index);| +@apii{0,0,-} + +Equivalent to @Lid{lua_tointegerx} with @id{isnum} equal to @id{NULL}. + +} + +@APIEntry{lua_Integer lua_tointegerx (lua_State *L, int index, int *isnum);| +@apii{0,0,-} + +Converts the Lua value at the given index +to the signed integral type @Lid{lua_Integer}. +The Lua value must be an integer, +or a number or string convertible to an integer @see{coercion}; +otherwise, @id{lua_tointegerx} @N{returns 0}. + +If @id{isnum} is not @id{NULL}, +its referent is assigned a boolean value that +indicates whether the operation succeeded. + +} + +@APIEntry{const char *lua_tolstring (lua_State *L, int index, size_t *len);| +@apii{0,0,m} + +Converts the Lua value at the given index to a @N{C string}. +If @id{len} is not @id{NULL}, +it sets @T{*len} with the string length. +The Lua value must be a string or a number; +otherwise, the function returns @id{NULL}. +If the value is a number, +then @id{lua_tolstring} also +@emph{changes the actual value in the stack to a string}. +(This change confuses @Lid{lua_next} +when @id{lua_tolstring} is applied to keys during a table traversal.) + +@id{lua_tolstring} returns a pointer +to a string inside the Lua state. +This string always has a zero (@Char{\0}) +after its last character (as @N{in C}), +but can contain other zeros in its body. + +Because Lua has garbage collection, +there is no guarantee that the pointer returned by @id{lua_tolstring} +will be valid after the corresponding Lua value is removed from the stack. + +} + +@APIEntry{lua_Number lua_tonumber (lua_State *L, int index);| +@apii{0,0,-} + +Equivalent to @Lid{lua_tonumberx} with @id{isnum} equal to @id{NULL}. + +} + +@APIEntry{lua_Number lua_tonumberx (lua_State *L, int index, int *isnum);| +@apii{0,0,-} + +Converts the Lua value at the given index +to the @N{C type} @Lid{lua_Number} @seeC{lua_Number}. +The Lua value must be a number or a string convertible to a number +@see{coercion}; +otherwise, @Lid{lua_tonumberx} @N{returns 0}. + +If @id{isnum} is not @id{NULL}, +its referent is assigned a boolean value that +indicates whether the operation succeeded. + +} + +@APIEntry{const void *lua_topointer (lua_State *L, int index);| +@apii{0,0,-} + +Converts the value at the given index to a generic +@N{C pointer} (@T{void*}). +The value can be a userdata, a table, a thread, a string, or a function; +otherwise, @id{lua_topointer} returns @id{NULL}. +Different objects will give different pointers. +There is no way to convert the pointer back to its original value. + +Typically this function is used only for hashing and debug information. + +} + +@APIEntry{const char *lua_tostring (lua_State *L, int index);| +@apii{0,0,m} + +Equivalent to @Lid{lua_tolstring} with @id{len} equal to @id{NULL}. + +} + +@APIEntry{lua_State *lua_tothread (lua_State *L, int index);| +@apii{0,0,-} + +Converts the value at the given index to a Lua thread +(represented as @T{lua_State*}). +This value must be a thread; +otherwise, the function returns @id{NULL}. + +} + +@APIEntry{void *lua_touserdata (lua_State *L, int index);| +@apii{0,0,-} + +If the value at the given index is a full userdata, +returns its memory-block address. +If the value is a light userdata, +returns its pointer. +Otherwise, returns @id{NULL}. + +} + +@APIEntry{int lua_type (lua_State *L, int index);| +@apii{0,0,-} + +Returns the type of the value in the given valid index, +or @id{LUA_TNONE} for a non-valid (but acceptable) index. +The types returned by @Lid{lua_type} are coded by the following constants +defined in @id{lua.h}: +@defid{LUA_TNIL}, +@defid{LUA_TNUMBER}, +@defid{LUA_TBOOLEAN}, +@defid{LUA_TSTRING}, +@defid{LUA_TTABLE}, +@defid{LUA_TFUNCTION}, +@defid{LUA_TUSERDATA}, +@defid{LUA_TTHREAD}, +and +@defid{LUA_TLIGHTUSERDATA}. + +} + +@APIEntry{const char *lua_typename (lua_State *L, int tp);| +@apii{0,0,-} + +Returns the name of the type encoded by the value @id{tp}, +which must be one the values returned by @Lid{lua_type}. + +} + +@APIEntry{typedef @ldots lua_Unsigned;| + +The unsigned version of @Lid{lua_Integer}. + +} + +@APIEntry{int lua_upvalueindex (int i);| +@apii{0,0,-} + +Returns the pseudo-index that represents the @id{i}-th upvalue of +the running function @see{c-closure}. +@id{i} must be in the range @M{[1,256]}. + +} + +@APIEntry{lua_Number lua_version (lua_State *L);| +@apii{0,0,-} + +Returns the version number of this core. + +} + +@APIEntry{ +typedef void (*lua_WarnFunction) (void *ud, const char *msg, int tocont);| + +The type of @x{warning function}s, called by Lua to emit warnings. +The first parameter is an opaque pointer +set by @Lid{lua_setwarnf}. +The second parameter is the warning message. +The third parameter is a boolean that +indicates whether the message is +to be continued by the message in the next call. + +} + +@APIEntry{ +void lua_warning (lua_State *L, const char *msg, int tocont);| +@apii{0,0,-} + +Emits a warning with the given message. +A message in a call with @id{tocont} true should be +continued in another call to this function. + +} + +@APIEntry{ +typedef int (*lua_Writer) (lua_State *L, + const void* p, + size_t sz, + void* ud);| + +The type of the writer function used by @Lid{lua_dump}. +Every time it produces another piece of chunk, +@Lid{lua_dump} calls the writer, +passing along the buffer to be written (@id{p}), +its size (@id{sz}), +and the @id{ud} parameter supplied to @Lid{lua_dump}. + +The writer returns an error code: +@N{0 means} no errors; +any other value means an error and stops @Lid{lua_dump} from +calling the writer again. + +} + +@APIEntry{void lua_xmove (lua_State *from, lua_State *to, int n);| +@apii{?,?,-} + +Exchange values between different threads of the same state. + +This function pops @id{n} values from the stack @id{from}, +and pushes them onto the stack @id{to}. + +} + +@APIEntry{int lua_yield (lua_State *L, int nresults);| +@apii{?,?,v} + +This function is equivalent to @Lid{lua_yieldk}, +but it has no continuation @see{continuations}. +Therefore, when the thread resumes, +it continues the function that called +the function calling @id{lua_yield}. +To avoid surprises, +this function should be called only in a tail call. + +} + + +@APIEntry{ +int lua_yieldk (lua_State *L, + int nresults, + lua_KContext ctx, + lua_KFunction k);| +@apii{?,?,v} + +Yields a coroutine (thread). + +When a @N{C function} calls @Lid{lua_yieldk}, +the running coroutine suspends its execution, +and the call to @Lid{lua_resume} that started this coroutine returns. +The parameter @id{nresults} is the number of values from the stack +that will be passed as results to @Lid{lua_resume}. + +When the coroutine is resumed again, +Lua calls the given @x{continuation function} @id{k} to continue +the execution of the @N{C function} that yielded @see{continuations}. +This continuation function receives the same stack +from the previous function, +with the @id{n} results removed and +replaced by the arguments passed to @Lid{lua_resume}. +Moreover, +the continuation function receives the value @id{ctx} +that was passed to @Lid{lua_yieldk}. + +Usually, this function does not return; +when the coroutine eventually resumes, +it continues executing the continuation function. +However, there is one special case, +which is when this function is called +from inside a line or a count hook @see{debugI}. +In that case, @id{lua_yieldk} should be called with no continuation +(probably in the form of @Lid{lua_yield}) and no results, +and the hook should return immediately after the call. +Lua will yield and, +when the coroutine resumes again, +it will continue the normal execution +of the (Lua) function that triggered the hook. + +This function can raise an error if it is called from a thread +with a pending C call with no continuation function +(what is called a @emphx{C-call boundary}, +or it is called from a thread that is not running inside a resume +(typically the main thread). + +} + +} + +@sect2{debugI| @title{The Debug Interface} + +Lua has no built-in debugging facilities. +Instead, it offers a special interface +by means of functions and @emph{hooks}. +This interface allows the construction of different +kinds of debuggers, profilers, and other tools +that need @Q{inside information} from the interpreter. + + +@APIEntry{ +typedef struct lua_Debug { + int event; + const char *name; /* (n) */ + const char *namewhat; /* (n) */ + const char *what; /* (S) */ + const char *source; /* (S) */ + int currentline; /* (l) */ + int linedefined; /* (S) */ + int lastlinedefined; /* (S) */ + unsigned char nups; /* (u) number of upvalues */ + unsigned char nparams; /* (u) number of parameters */ + char isvararg; /* (u) */ + char istailcall; /* (t) */ + unsigned short ftransfer; /* (r) index of first value transferred */ + unsigned short ntransfer; /* (r) number of transferred values */ + char short_src[LUA_IDSIZE]; /* (S) */ + /* private part */ + @rep{other fields} +} lua_Debug; +| + +A structure used to carry different pieces of +information about a function or an activation record. +@Lid{lua_getstack} fills only the private part +of this structure, for later use. +To fill the other fields of @Lid{lua_Debug} with useful information, +call @Lid{lua_getinfo}. + +The fields of @Lid{lua_Debug} have the following meaning: +@description{ + +@item{@id{source}| +the name of the chunk that created the function. +If @T{source} starts with a @Char{@At}, +it means that the function was defined in a file where +the file name follows the @Char{@At}. +If @T{source} starts with a @Char{=}, +the remainder of its contents describe the source in a user-dependent manner. +Otherwise, +the function was defined in a string where +@T{source} is that string. +} + +@item{@id{short_src}| +a @Q{printable} version of @T{source}, to be used in error messages. +} + +@item{@id{linedefined}| +the line number where the definition of the function starts. +} + +@item{@id{lastlinedefined}| +the line number where the definition of the function ends. +} + +@item{@id{what}| +the string @T{"Lua"} if the function is a Lua function, +@T{"C"} if it is a @N{C function}, +@T{"main"} if it is the main part of a chunk. +} + +@item{@id{currentline}| +the current line where the given function is executing. +When no line information is available, +@T{currentline} is set to @num{-1}. +} + +@item{@id{name}| +a reasonable name for the given function. +Because functions in Lua are first-class values, +they do not have a fixed name: +some functions can be the value of multiple global variables, +while others can be stored only in a table field. +The @T{lua_getinfo} function checks how the function was +called to find a suitable name. +If it cannot find a name, +then @id{name} is set to @id{NULL}. +} + +@item{@id{namewhat}| +explains the @T{name} field. +The value of @T{namewhat} can be +@T{"global"}, @T{"local"}, @T{"method"}, +@T{"field"}, @T{"upvalue"}, or @T{""} (the empty string), +according to how the function was called. +(Lua uses the empty string when no other option seems to apply.) +} + +@item{@id{istailcall}| +true if this function invocation was called by a tail call. +In this case, the caller of this level is not in the stack. +} + +@item{@id{nups}| +the number of upvalues of the function. +} + +@item{@id{nparams}| +the number of parameters of the function +(always @N{0 for} @N{C functions}). +} + +@item{@id{isvararg}| +true if the function is a vararg function +(always true for @N{C functions}). +} + +@item{@id{ftransfer}| +the index on the stack of the first value being @Q{transferred}, +that is, parameters in a call or return values in a return. +(The other values are in consecutive indices.) +Using this index, you can access and modify these values +through @Lid{lua_getlocal} and @Lid{lua_setlocal}. +This field is only meaningful during a +call hook, denoting the first parameter, +or a return hook, denoting the first value being returned. +(For call hooks, this value is always 1.) +} + +@item{@id{ntransfer}| +The number of values being transferred (see previous item). +(For calls of Lua functions, +this value is always equal to @id{nparams}.) +} + +} + +} + +@APIEntry{lua_Hook lua_gethook (lua_State *L);| +@apii{0,0,-} + +Returns the current hook function. + +} + +@APIEntry{int lua_gethookcount (lua_State *L);| +@apii{0,0,-} + +Returns the current hook count. + +} + +@APIEntry{int lua_gethookmask (lua_State *L);| +@apii{0,0,-} + +Returns the current hook mask. + +} + +@APIEntry{int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);| +@apii{0|1,0|1|2,m} + +Gets information about a specific function or function invocation. + +To get information about a function invocation, +the parameter @id{ar} must be a valid activation record that was +filled by a previous call to @Lid{lua_getstack} or +given as argument to a hook @seeC{lua_Hook}. + +To get information about a function, you push it onto the stack +and start the @id{what} string with the character @Char{>}. +(In that case, +@id{lua_getinfo} pops the function from the top of the stack.) +For instance, to know in which line a function @id{f} was defined, +you can write the following code: +@verbatim{ +lua_Debug ar; +lua_getglobal(L, "f"); /* get global 'f' */ +lua_getinfo(L, ">S", &ar); +printf("%d\n", ar.linedefined); +} + +Each character in the string @id{what} +selects some fields of the structure @id{ar} to be filled or +a value to be pushed on the stack: +@description{ + +@item{@Char{n}| fills in the field @id{name} and @id{namewhat}; +} + +@item{@Char{S}| +fills in the fields @id{source}, @id{short_src}, +@id{linedefined}, @id{lastlinedefined}, and @id{what}; +} + +@item{@Char{l}| fills in the field @id{currentline}; +} + +@item{@Char{t}| fills in the field @id{istailcall}; +} + +@item{@Char{u}| fills in the fields +@id{nups}, @id{nparams}, and @id{isvararg}; +} + +@item{@Char{f}| +pushes onto the stack the function that is +running at the given level; +} + +@item{@Char{L}| +pushes onto the stack a table whose indices are the +numbers of the lines that are valid on the function. +(A @emph{valid line} is a line with some associated code, +that is, a line where you can put a break point. +Non-valid lines include empty lines and comments.) + +If this option is given together with option @Char{f}, +its table is pushed after the function. + +This is the only option that can raise a memory error. +} + +} + +This function returns 0 to signal an invalid option in @id{what}; +even then the valid options are handled correctly. + +} + +@APIEntry{const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n);| +@apii{0,0|1,-} + +Gets information about a local variable or a temporary value +of a given activation record or a given function. + +In the first case, +the parameter @id{ar} must be a valid activation record that was +filled by a previous call to @Lid{lua_getstack} or +given as argument to a hook @seeC{lua_Hook}. +The index @id{n} selects which local variable to inspect; +see @Lid{debug.getlocal} for details about variable indices +and names. + +@Lid{lua_getlocal} pushes the variable's value onto the stack +and returns its name. + +In the second case, @id{ar} must be @id{NULL} and the function +to be inspected must be on the top of the stack. +In this case, only parameters of Lua functions are visible +(as there is no information about what variables are active) +and no values are pushed onto the stack. + +Returns @id{NULL} (and pushes nothing) +when the index is greater than +the number of active local variables. + +} + +@APIEntry{int lua_getstack (lua_State *L, int level, lua_Debug *ar);| +@apii{0,0,-} + +Gets information about the interpreter runtime stack. + +This function fills parts of a @Lid{lua_Debug} structure with +an identification of the @emph{activation record} +of the function executing at a given level. +@N{Level 0} is the current running function, +whereas level @M{n+1} is the function that has called level @M{n} +(except for tail calls, which do not count on the stack). +When there are no errors, @Lid{lua_getstack} returns 1; +when called with a level greater than the stack depth, +it returns 0. + +} + +@APIEntry{const char *lua_getupvalue (lua_State *L, int funcindex, int n);| +@apii{0,0|1,-} + +Gets information about the @id{n}-th upvalue +of the closure at index @id{funcindex}. +It pushes the upvalue's value onto the stack +and returns its name. +Returns @id{NULL} (and pushes nothing) +when the index @id{n} is greater than the number of upvalues. + +For @N{C functions}, this function uses the empty string @T{""} +as a name for all upvalues. +(For Lua functions, +upvalues are the external local variables that the function uses, +and that are consequently included in its closure.) + +Upvalues have no particular order, +as they are active through the whole function. +They are numbered in an arbitrary order. + +} + +@APIEntry{typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);| + +Type for debugging hook functions. + +Whenever a hook is called, its @id{ar} argument has its field +@id{event} set to the specific event that triggered the hook. +Lua identifies these events with the following constants: +@defid{LUA_HOOKCALL}, @defid{LUA_HOOKRET}, +@defid{LUA_HOOKTAILCALL}, @defid{LUA_HOOKLINE}, +and @defid{LUA_HOOKCOUNT}. +Moreover, for line events, the field @id{currentline} is also set. +To get the value of any other field in @id{ar}, +the hook must call @Lid{lua_getinfo}. + +For call events, @id{event} can be @id{LUA_HOOKCALL}, +the normal value, or @id{LUA_HOOKTAILCALL}, for a tail call; +in this case, there will be no corresponding return event. + +While Lua is running a hook, it disables other calls to hooks. +Therefore, if a hook calls back Lua to execute a function or a chunk, +this execution occurs without any calls to hooks. + +Hook functions cannot have continuations, +that is, they cannot call @Lid{lua_yieldk}, +@Lid{lua_pcallk}, or @Lid{lua_callk} with a non-null @id{k}. + +Hook functions can yield under the following conditions: +Only count and line events can yield; +to yield, a hook function must finish its execution +calling @Lid{lua_yield} with @id{nresults} equal to zero +(that is, with no values). + +} + +@APIEntry{void lua_sethook (lua_State *L, lua_Hook f, int mask, int count);| +@apii{0,0,-} + +Sets the debugging hook function. + +Argument @id{f} is the hook function. +@id{mask} specifies on which events the hook will be called: +it is formed by a bitwise OR of the constants +@defid{LUA_MASKCALL}, +@defid{LUA_MASKRET}, +@defid{LUA_MASKLINE}, +and @defid{LUA_MASKCOUNT}. +The @id{count} argument is only meaningful when the mask +includes @id{LUA_MASKCOUNT}. +For each event, the hook is called as explained below: +@description{ + +@item{The call hook| is called when the interpreter calls a function. +The hook is called just after Lua enters the new function, +before the function gets its arguments. +} + +@item{The return hook| is called when the interpreter returns from a function. +The hook is called just before Lua leaves the function. +There is no standard way to access the values +to be returned by the function. +} + +@item{The line hook| is called when the interpreter is about to +start the execution of a new line of code, +or when it jumps back in the code (even to the same line). +(This event only happens while Lua is executing a Lua function.) +} + +@item{The count hook| is called after the interpreter executes every +@T{count} instructions. +(This event only happens while Lua is executing a Lua function.) +} + +} + +A hook is disabled by setting @id{mask} to zero. + +} + +@APIEntry{const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n);| +@apii{0|1,0,-} + +Sets the value of a local variable of a given activation record. +It assigns the value on the top of the stack +to the variable and returns its name. +It also pops the value from the stack. + +Returns @id{NULL} (and pops nothing) +when the index is greater than +the number of active local variables. + +Parameters @id{ar} and @id{n} are as in function @Lid{lua_getlocal}. + +} + +@APIEntry{const char *lua_setupvalue (lua_State *L, int funcindex, int n);| +@apii{0|1,0,-} + +Sets the value of a closure's upvalue. +It assigns the value on the top of the stack +to the upvalue and returns its name. +It also pops the value from the stack. + +Returns @id{NULL} (and pops nothing) +when the index @id{n} is greater than the number of upvalues. + +Parameters @id{funcindex} and @id{n} are as in function @Lid{lua_getupvalue}. + +} + +@APIEntry{void *lua_upvalueid (lua_State *L, int funcindex, int n);| +@apii{0,0,-} + +Returns a unique identifier for the upvalue numbered @id{n} +from the closure at index @id{funcindex}. + +These unique identifiers allow a program to check whether different +closures share upvalues. +Lua closures that share an upvalue +(that is, that access a same external local variable) +will return identical ids for those upvalue indices. + +Parameters @id{funcindex} and @id{n} are as in function @Lid{lua_getupvalue}, +but @id{n} cannot be greater than the number of upvalues. + +} + +@APIEntry{ +void lua_upvaluejoin (lua_State *L, int funcindex1, int n1, + int funcindex2, int n2);| +@apii{0,0,-} + +Make the @id{n1}-th upvalue of the Lua closure at index @id{funcindex1} +refer to the @id{n2}-th upvalue of the Lua closure at index @id{funcindex2}. + +} + +} + +} + + +@C{-------------------------------------------------------------------------} +@sect1{@title{The Auxiliary Library} + +@index{lauxlib.h} +The @def{auxiliary library} provides several convenient functions +to interface C with Lua. +While the basic API provides the primitive functions for all +interactions between C and Lua, +the auxiliary library provides higher-level functions for some +common tasks. + +All functions and types from the auxiliary library +are defined in header file @id{lauxlib.h} and +have a prefix @id{luaL_}. + +All functions in the auxiliary library are built on +top of the basic API, +and so they provide nothing that cannot be done with that API. +Nevertheless, the use of the auxiliary library ensures +more consistency to your code. + + +Several functions in the auxiliary library use internally some +extra stack slots. +When a function in the auxiliary library uses less than five slots, +it does not check the stack size; +it simply assumes that there are enough slots. + +Several functions in the auxiliary library are used to +check @N{C function} arguments. +Because the error message is formatted for arguments +(e.g., @St{bad argument #1}), +you should not use these functions for other stack values. + +Functions called @id{luaL_check*} +always raise an error if the check is not satisfied. + +@sect2{@title{Functions and Types} + +Here we list all functions and types from the auxiliary library +in alphabetical order. + + +@APIEntry{void luaL_addchar (luaL_Buffer *B, char c);| +@apii{?,?,m} + +Adds the byte @id{c} to the buffer @id{B} +@seeC{luaL_Buffer}. + +} + +@APIEntry{void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l);| +@apii{?,?,m} + +Adds the string pointed to by @id{s} with length @id{l} to +the buffer @id{B} +@seeC{luaL_Buffer}. +The string can contain @x{embedded zeros}. + +} + +@APIEntry{void luaL_addsize (luaL_Buffer *B, size_t n);| +@apii{?,?,-} + +Adds to the buffer @id{B} @seeC{luaL_Buffer} +a string of length @id{n} previously copied to the +buffer area @seeC{luaL_prepbuffer}. + +} + +@APIEntry{void luaL_addstring (luaL_Buffer *B, const char *s);| +@apii{?,?,m} + +Adds the zero-terminated string pointed to by @id{s} +to the buffer @id{B} +@seeC{luaL_Buffer}. + +} + +@APIEntry{void luaL_addvalue (luaL_Buffer *B);| +@apii{1,?,m} + +Adds the value on the top of the stack +to the buffer @id{B} +@seeC{luaL_Buffer}. +Pops the value. + +This is the only function on string buffers that can (and must) +be called with an extra element on the stack, +which is the value to be added to the buffer. + +} + +@APIEntry{ +void luaL_argcheck (lua_State *L, + int cond, + int arg, + const char *extramsg);| +@apii{0,0,v} + +Checks whether @id{cond} is true. +If it is not, raises an error with a standard message @seeF{luaL_argerror}. + +} + +@APIEntry{int luaL_argerror (lua_State *L, int arg, const char *extramsg);| +@apii{0,0,v} + +Raises an error reporting a problem with argument @id{arg} +of the @N{C function} that called it, +using a standard message +that includes @id{extramsg} as a comment: +@verbatim{ +bad argument #@rep{arg} to '@rep{funcname}' (@rep{extramsg}) +} +This function never returns. + +} + +@APIEntry{ +void luaL_argexpected (lua_State *L, + int cond, + int arg, + const char *tname);| +@apii{0,0,v} + +Checks whether @id{cond} is true. +If it is not, raises an error about the type of the argument @id{arg} +with a standard message @seeF{luaL_typeerror}. + +} + +@APIEntry{typedef struct luaL_Buffer luaL_Buffer;| + +Type for a @def{string buffer}. + +A string buffer allows @N{C code} to build Lua strings piecemeal. +Its pattern of use is as follows: +@itemize{ + +@item{First declare a variable @id{b} of type @Lid{luaL_Buffer}.} + +@item{Then initialize it with a call @T{luaL_buffinit(L, &b)}.} + +@item{ +Then add string pieces to the buffer calling any of +the @id{luaL_add*} functions. +} + +@item{ +Finish by calling @T{luaL_pushresult(&b)}. +This call leaves the final string on the top of the stack. +} + +} + +If you know beforehand the maximum size of the resulting string, +you can use the buffer like this: +@itemize{ + +@item{First declare a variable @id{b} of type @Lid{luaL_Buffer}.} + +@item{Then initialize it and preallocate a space of +size @id{sz} with a call @T{luaL_buffinitsize(L, &b, sz)}.} + +@item{Then produce the string into that space.} + +@item{ +Finish by calling @T{luaL_pushresultsize(&b, sz)}, +where @id{sz} is the total size of the resulting string +copied into that space (which may be smaller than or +equal to the preallocated size). +} + +} + +During its normal operation, +a string buffer uses a variable number of stack slots. +So, while using a buffer, you cannot assume that you know where +the top of the stack is. +You can use the stack between successive calls to buffer operations +as long as that use is balanced; +that is, +when you call a buffer operation, +the stack is at the same level +it was immediately after the previous buffer operation. +(The only exception to this rule is @Lid{luaL_addvalue}.) +After calling @Lid{luaL_pushresult}, +the stack is back to its level when the buffer was initialized, +plus the final string on its top. + +} + +@APIEntry{void luaL_buffinit (lua_State *L, luaL_Buffer *B);| +@apii{0,0,-} + +Initializes a buffer @id{B}. +This function does not allocate any space; +the buffer must be declared as a variable +@seeC{luaL_Buffer}. + +} + +@APIEntry{char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz);| +@apii{?,?,m} + +Equivalent to the sequence +@Lid{luaL_buffinit}, @Lid{luaL_prepbuffsize}. + +} + +@APIEntry{int luaL_callmeta (lua_State *L, int obj, const char *e);| +@apii{0,0|1,e} + +Calls a metamethod. + +If the object at index @id{obj} has a metatable and this +metatable has a field @id{e}, +this function calls this field passing the object as its only argument. +In this case this function returns true and pushes onto the +stack the value returned by the call. +If there is no metatable or no metamethod, +this function returns false (without pushing any value on the stack). + +} + +@APIEntry{void luaL_checkany (lua_State *L, int arg);| +@apii{0,0,v} + +Checks whether the function has an argument +of any type (including @nil) at position @id{arg}. + +} + +@APIEntry{lua_Integer luaL_checkinteger (lua_State *L, int arg);| +@apii{0,0,v} + +Checks whether the function argument @id{arg} is an integer +(or can be converted to an integer) +and returns this integer cast to a @Lid{lua_Integer}. + +} + +@APIEntry{const char *luaL_checklstring (lua_State *L, int arg, size_t *l);| +@apii{0,0,v} + +Checks whether the function argument @id{arg} is a string +and returns this string; +if @id{l} is not @id{NULL} fills @T{*l} +with the string's length. + +This function uses @Lid{lua_tolstring} to get its result, +so all conversions and caveats of that function apply here. + +} + +@APIEntry{lua_Number luaL_checknumber (lua_State *L, int arg);| +@apii{0,0,v} + +Checks whether the function argument @id{arg} is a number +and returns this number. + +} + +@APIEntry{ +int luaL_checkoption (lua_State *L, + int arg, + const char *def, + const char *const lst[]);| +@apii{0,0,v} + +Checks whether the function argument @id{arg} is a string and +searches for this string in the array @id{lst} +(which must be NULL-terminated). +Returns the index in the array where the string was found. +Raises an error if the argument is not a string or +if the string cannot be found. + +If @id{def} is not @id{NULL}, +the function uses @id{def} as a default value when +there is no argument @id{arg} or when this argument is @nil. + +This is a useful function for mapping strings to @N{C enums}. +(The usual convention in Lua libraries is +to use strings instead of numbers to select options.) + +} + +@APIEntry{void luaL_checkstack (lua_State *L, int sz, const char *msg);| +@apii{0,0,v} + +Grows the stack size to @T{top + sz} elements, +raising an error if the stack cannot grow to that size. +@id{msg} is an additional text to go into the error message +(or @id{NULL} for no additional text). + +} + +@APIEntry{const char *luaL_checkstring (lua_State *L, int arg);| +@apii{0,0,v} + +Checks whether the function argument @id{arg} is a string +and returns this string. + +This function uses @Lid{lua_tolstring} to get its result, +so all conversions and caveats of that function apply here. + +} + +@APIEntry{void luaL_checktype (lua_State *L, int arg, int t);| +@apii{0,0,v} + +Checks whether the function argument @id{arg} has type @id{t}. +See @Lid{lua_type} for the encoding of types for @id{t}. + +} + +@APIEntry{void *luaL_checkudata (lua_State *L, int arg, const char *tname);| +@apii{0,0,v} + +Checks whether the function argument @id{arg} is a userdata +of the type @id{tname} @seeC{luaL_newmetatable} and +returns the userdata's memory-block address @seeC{lua_touserdata}. + +} + +@APIEntry{void luaL_checkversion (lua_State *L);| +@apii{0,0,v} + +Checks whether the code making the call and the Lua library being called +are using the same version of Lua and the same numeric types. + +} + +@APIEntry{int luaL_dofile (lua_State *L, const char *filename);| +@apii{0,?,m} + +Loads and runs the given file. +It is defined as the following macro: +@verbatim{ +(luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0)) +} +It returns false if there are no errors +or true in case of errors. + +} + +@APIEntry{int luaL_dostring (lua_State *L, const char *str);| +@apii{0,?,-} + +Loads and runs the given string. +It is defined as the following macro: +@verbatim{ +(luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0)) +} +It returns false if there are no errors +or true in case of errors. + +} + +@APIEntry{int luaL_error (lua_State *L, const char *fmt, ...);| +@apii{0,0,v} + +Raises an error. +The error message format is given by @id{fmt} +plus any extra arguments, +following the same rules of @Lid{lua_pushfstring}. +It also adds at the beginning of the message the file name and +the line number where the error occurred, +if this information is available. + +This function never returns, +but it is an idiom to use it in @N{C functions} +as @T{return luaL_error(@rep{args})}. + +} + +@APIEntry{int luaL_execresult (lua_State *L, int stat);| +@apii{0,3,m} + +This function produces the return values for +process-related functions in the standard library +(@Lid{os.execute} and @Lid{io.close}). + +} + +@APIEntry{ +int luaL_fileresult (lua_State *L, int stat, const char *fname);| +@apii{0,1|3,m} + +This function produces the return values for +file-related functions in the standard library +(@Lid{io.open}, @Lid{os.rename}, @Lid{file:seek}, etc.). + +} + +@APIEntry{int luaL_getmetafield (lua_State *L, int obj, const char *e);| +@apii{0,0|1,m} + +Pushes onto the stack the field @id{e} from the metatable +of the object at index @id{obj} and returns the type of the pushed value. +If the object does not have a metatable, +or if the metatable does not have this field, +pushes nothing and returns @id{LUA_TNIL}. + +} + +@APIEntry{int luaL_getmetatable (lua_State *L, const char *tname);| +@apii{0,1,m} + +Pushes onto the stack the metatable associated with the name @id{tname} +in the registry @seeC{luaL_newmetatable}, +or @nil if there is no metatable associated with that name. +Returns the type of the pushed value. + +} + +@APIEntry{int luaL_getsubtable (lua_State *L, int idx, const char *fname);| +@apii{0,1,e} + +Ensures that the value @T{t[fname]}, +where @id{t} is the value at index @id{idx}, +is a table, +and pushes that table onto the stack. +Returns true if it finds a previous table there +and false if it creates a new table. + +} + +@APIEntry{ +const char *luaL_gsub (lua_State *L, + const char *s, + const char *p, + const char *r);| +@apii{0,1,m} + +Creates a copy of string @id{s} by replacing +any occurrence of the string @id{p} +with the string @id{r}. +Pushes the resulting string on the stack and returns it. + +} + +@APIEntry{lua_Integer luaL_len (lua_State *L, int index);| +@apii{0,0,e} + +Returns the @Q{length} of the value at the given index +as a number; +it is equivalent to the @Char{#} operator in Lua @see{len-op}. +Raises an error if the result of the operation is not an integer. +(This case only can happen through metamethods.) + +} + +@APIEntry{ +int luaL_loadbuffer (lua_State *L, + const char *buff, + size_t sz, + const char *name);| +@apii{0,1,-} + +Equivalent to @Lid{luaL_loadbufferx} with @id{mode} equal to @id{NULL}. + +} + + +@APIEntry{ +int luaL_loadbufferx (lua_State *L, + const char *buff, + size_t sz, + const char *name, + const char *mode);| +@apii{0,1,-} + +Loads a buffer as a Lua chunk. +This function uses @Lid{lua_load} to load the chunk in the +buffer pointed to by @id{buff} with size @id{sz}. + +This function returns the same results as @Lid{lua_load}. +@id{name} is the chunk name, +used for debug information and error messages. +The string @id{mode} works as in function @Lid{lua_load}. + +} + + +@APIEntry{int luaL_loadfile (lua_State *L, const char *filename);| +@apii{0,1,m} + +Equivalent to @Lid{luaL_loadfilex} with @id{mode} equal to @id{NULL}. + +} + +@APIEntry{int luaL_loadfilex (lua_State *L, const char *filename, + const char *mode);| +@apii{0,1,m} + +Loads a file as a Lua chunk. +This function uses @Lid{lua_load} to load the chunk in the file +named @id{filename}. +If @id{filename} is @id{NULL}, +then it loads from the standard input. +The first line in the file is ignored if it starts with a @T{#}. + +The string @id{mode} works as in function @Lid{lua_load}. + +This function returns the same results as @Lid{lua_load}, +but it has an extra error code @defid{LUA_ERRFILE} +for file-related errors +(e.g., it cannot open or read the file). + +As @Lid{lua_load}, this function only loads the chunk; +it does not run it. + +} + +@APIEntry{int luaL_loadstring (lua_State *L, const char *s);| +@apii{0,1,-} + +Loads a string as a Lua chunk. +This function uses @Lid{lua_load} to load the chunk in +the zero-terminated string @id{s}. + +This function returns the same results as @Lid{lua_load}. + +Also as @Lid{lua_load}, this function only loads the chunk; +it does not run it. + +} + + +@APIEntry{void luaL_newlib (lua_State *L, const luaL_Reg l[]);| +@apii{0,1,m} + +Creates a new table and registers there +the functions in list @id{l}. + +It is implemented as the following macro: +@verbatim{ +(luaL_newlibtable(L,l), luaL_setfuncs(L,l,0)) +} +The array @id{l} must be the actual array, +not a pointer to it. + +} + +@APIEntry{void luaL_newlibtable (lua_State *L, const luaL_Reg l[]);| +@apii{0,1,m} + +Creates a new table with a size optimized +to store all entries in the array @id{l} +(but does not actually store them). +It is intended to be used in conjunction with @Lid{luaL_setfuncs} +@seeF{luaL_newlib}. + +It is implemented as a macro. +The array @id{l} must be the actual array, +not a pointer to it. + +} + +@APIEntry{int luaL_newmetatable (lua_State *L, const char *tname);| +@apii{0,1,m} + +If the registry already has the key @id{tname}, +returns 0. +Otherwise, +creates a new table to be used as a metatable for userdata, +adds to this new table the pair @T{__name = tname}, +adds to the registry the pair @T{[tname] = new table}, +and returns 1. +(The entry @idx{__name} is used by some error-reporting functions.) + +In both cases pushes onto the stack the final value associated +with @id{tname} in the registry. + +} + +@APIEntry{lua_State *luaL_newstate (void);| +@apii{0,0,-} + +Creates a new Lua state. +It calls @Lid{lua_newstate} with an +allocator based on the @N{standard C} @id{realloc} function +and then sets a panic function @see{C-error} that prints +an error message to the standard error output in case of fatal +errors. + +Returns the new state, +or @id{NULL} if there is a @x{memory allocation error}. + +} + +@APIEntry{void luaL_openlibs (lua_State *L);| +@apii{0,0,e} + +Opens all standard Lua libraries into the given state. + +} + +@APIEntry{ +T luaL_opt (L, func, arg, dflt);| +@apii{0,0,-} + +This macro is defined as follows: +@verbatim{ +(lua_isnoneornil(L,(arg)) ? (dflt) : func(L,(arg))) +} +In words, if the argument @id{arg} is nil or absent, +the macro results in the default @id{dflt}. +Otherwise, it results in the result of calling @id{func} +with the state @id{L} and the argument index @id{arg} as +arguments. +Note that it evaluates the expression @id{dflt} only if needed. + +} + +@APIEntry{ +lua_Integer luaL_optinteger (lua_State *L, + int arg, + lua_Integer d);| +@apii{0,0,v} + +If the function argument @id{arg} is an integer +(or convertible to an integer), +returns this integer. +If this argument is absent or is @nil, +returns @id{d}. +Otherwise, raises an error. + +} + +@APIEntry{ +const char *luaL_optlstring (lua_State *L, + int arg, + const char *d, + size_t *l);| +@apii{0,0,v} + +If the function argument @id{arg} is a string, +returns this string. +If this argument is absent or is @nil, +returns @id{d}. +Otherwise, raises an error. + +If @id{l} is not @id{NULL}, +fills the position @T{*l} with the result's length. +If the result is @id{NULL} +(only possible when returning @id{d} and @T{d == NULL}), +its length is considered zero. + +This function uses @Lid{lua_tolstring} to get its result, +so all conversions and caveats of that function apply here. + +} + +@APIEntry{lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number d);| +@apii{0,0,v} + +If the function argument @id{arg} is a number, +returns this number. +If this argument is absent or is @nil, +returns @id{d}. +Otherwise, raises an error. + +} + +@APIEntry{ +const char *luaL_optstring (lua_State *L, + int arg, + const char *d);| +@apii{0,0,v} + +If the function argument @id{arg} is a string, +returns this string. +If this argument is absent or is @nil, +returns @id{d}. +Otherwise, raises an error. + +} + +@APIEntry{char *luaL_prepbuffer (luaL_Buffer *B);| +@apii{?,?,m} + +Equivalent to @Lid{luaL_prepbuffsize} +with the predefined size @defid{LUAL_BUFFERSIZE}. + +} + +@APIEntry{char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz);| +@apii{?,?,m} + +Returns an address to a space of size @id{sz} +where you can copy a string to be added to buffer @id{B} +@seeC{luaL_Buffer}. +After copying the string into this space you must call +@Lid{luaL_addsize} with the size of the string to actually add +it to the buffer. + +} + +@APIEntry{void luaL_pushresult (luaL_Buffer *B);| +@apii{?,1,m} + +Finishes the use of buffer @id{B} leaving the final string on +the top of the stack. + +} + +@APIEntry{void luaL_pushresultsize (luaL_Buffer *B, size_t sz);| +@apii{?,1,m} + +Equivalent to the sequence @Lid{luaL_addsize}, @Lid{luaL_pushresult}. + +} + +@APIEntry{int luaL_ref (lua_State *L, int t);| +@apii{1,0,m} + +Creates and returns a @def{reference}, +in the table at index @id{t}, +for the object on the top of the stack (and pops the object). + +A reference is a unique integer key. +As long as you do not manually add integer keys into table @id{t}, +@Lid{luaL_ref} ensures the uniqueness of the key it returns. +You can retrieve an object referred by reference @id{r} +by calling @T{lua_rawgeti(L, t, r)}. +Function @Lid{luaL_unref} frees a reference and its associated object. + +If the object on the top of the stack is @nil, +@Lid{luaL_ref} returns the constant @defid{LUA_REFNIL}. +The constant @defid{LUA_NOREF} is guaranteed to be different +from any reference returned by @Lid{luaL_ref}. + +} + +@APIEntry{ +typedef struct luaL_Reg { + const char *name; + lua_CFunction func; +} luaL_Reg; +| + +Type for arrays of functions to be registered by +@Lid{luaL_setfuncs}. +@id{name} is the function name and @id{func} is a pointer to +the function. +Any array of @Lid{luaL_Reg} must end with a sentinel entry +in which both @id{name} and @id{func} are @id{NULL}. + +} + +@APIEntry{ +void luaL_requiref (lua_State *L, const char *modname, + lua_CFunction openf, int glb);| +@apii{0,1,e} + +If @T{package.loaded[modname]} is not true, +calls function @id{openf} with string @id{modname} as an argument +and sets the call result to @T{package.loaded[modname]}, +as if that function has been called through @Lid{require}. + +If @id{glb} is true, +also stores the module into global @id{modname}. + +Leaves a copy of the module on the stack. + +} + +@APIEntry{void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);| +@apii{nup,0,m} + +Registers all functions in the array @id{l} +@seeC{luaL_Reg} into the table on the top of the stack +(below optional upvalues, see next). + +When @id{nup} is not zero, +all functions are created with @id{nup} upvalues, +initialized with copies of the @id{nup} values +previously pushed on the stack +on top of the library table. +These values are popped from the stack after the registration. + +} + +@APIEntry{void luaL_setmetatable (lua_State *L, const char *tname);| +@apii{0,0,-} + +Sets the metatable of the object on the top of the stack +as the metatable associated with name @id{tname} +in the registry @seeC{luaL_newmetatable}. + +} + +@APIEntry{ +typedef struct luaL_Stream { + FILE *f; + lua_CFunction closef; +} luaL_Stream; +| + +The standard representation for @x{file handles}, +which is used by the standard I/O library. + +A file handle is implemented as a full userdata, +with a metatable called @id{LUA_FILEHANDLE} +(where @id{LUA_FILEHANDLE} is a macro with the actual metatable's name). +The metatable is created by the I/O library +@seeF{luaL_newmetatable}. + +This userdata must start with the structure @id{luaL_Stream}; +it can contain other data after this initial structure. +Field @id{f} points to the corresponding C stream +(or it can be @id{NULL} to indicate an incompletely created handle). +Field @id{closef} points to a Lua function +that will be called to close the stream +when the handle is closed or collected; +this function receives the file handle as its sole argument and +must return either @true (in case of success) +or @nil plus an error message (in case of error). +Once Lua calls this field, +it changes the field value to @id{NULL} +to signal that the handle is closed. + +} + +@APIEntry{void *luaL_testudata (lua_State *L, int arg, const char *tname);| +@apii{0,0,m} + +This function works like @Lid{luaL_checkudata}, +except that, when the test fails, +it returns @id{NULL} instead of raising an error. + +} + +@APIEntry{const char *luaL_tolstring (lua_State *L, int idx, size_t *len);| +@apii{0,1,e} + +Converts any Lua value at the given index to a @N{C string} +in a reasonable format. +The resulting string is pushed onto the stack and also +returned by the function. +If @id{len} is not @id{NULL}, +the function also sets @T{*len} with the string length. + +If the value has a metatable with a @idx{__tostring} field, +then @id{luaL_tolstring} calls the corresponding metamethod +with the value as argument, +and uses the result of the call as its result. + +} + +@APIEntry{ +void luaL_traceback (lua_State *L, lua_State *L1, const char *msg, + int level);| +@apii{0,1,m} + +Creates and pushes a traceback of the stack @id{L1}. +If @id{msg} is not @id{NULL} it is appended +at the beginning of the traceback. +The @id{level} parameter tells at which level +to start the traceback. + +} + +@APIEntry{const char *luaL_typeerror (lua_State *L, + int arg, + const char *tname);| +@apii{0,0,v} + +Raises a type error for argument @id{arg} +of the @N{C function} that called it, +using a standard message; +@id{tname} is a @Q{name} for the expected type. +This function never returns. + +} + +@APIEntry{const char *luaL_typename (lua_State *L, int index);| +@apii{0,0,-} + +Returns the name of the type of the value at the given index. + +} + +@APIEntry{void luaL_unref (lua_State *L, int t, int ref);| +@apii{0,0,-} + +Releases reference @id{ref} from the table at index @id{t} +@seeC{luaL_ref}. +The entry is removed from the table, +so that the referred object can be collected. +The reference @id{ref} is also freed to be used again. + +If @id{ref} is @Lid{LUA_NOREF} or @Lid{LUA_REFNIL}, +@Lid{luaL_unref} does nothing. + +} + +@APIEntry{void luaL_where (lua_State *L, int lvl);| +@apii{0,1,m} + +Pushes onto the stack a string identifying the current position +of the control at level @id{lvl} in the call stack. +Typically this string has the following format: +@verbatim{ +@rep{chunkname}:@rep{currentline}: +} +@N{Level 0} is the running function, +@N{level 1} is the function that called the running function, +etc. + +This function is used to build a prefix for error messages. + +} + +} + +} + + +@C{-------------------------------------------------------------------------} +@sect1{libraries| @title{Standard Libraries} + +The standard Lua libraries provide useful functions +that are implemented directly through the @N{C API}. +Some of these functions provide essential services to the language +(e.g., @Lid{type} and @Lid{getmetatable}); +others provide access to @Q{outside} services (e.g., I/O); +and others could be implemented in Lua itself, +but are quite useful or have critical performance requirements that +deserve an implementation in C (e.g., @Lid{table.sort}). + +All libraries are implemented through the official @N{C API} +and are provided as separate @N{C modules}. +Unless otherwise noted, +these library functions do not adjust its number of arguments +to its expected parameters. +For instance, a function documented as @T{foo(arg)} +should not be called without an argument. + +Currently, Lua has the following standard libraries: +@itemize{ + +@item{@link{predefined|basic library};} + +@item{@link{corolib|coroutine library};} + +@item{@link{packlib|package library};} + +@item{@link{strlib|string manipulation};} + +@item{@link{utf8|basic UTF-8 support};} + +@item{@link{tablib|table manipulation};} + +@item{@link{mathlib|mathematical functions} (sin, log, etc.);} + +@item{@link{iolib|input and output};} + +@item{@link{oslib|operating system facilities};} + +@item{@link{debuglib|debug facilities}.} + +} +Except for the basic and the package libraries, +each library provides all its functions as fields of a global table +or as methods of its objects. + +To have access to these libraries, +the @N{C host} program should call the @Lid{luaL_openlibs} function, +which opens all standard libraries. +Alternatively, +the host program can open them individually by using +@Lid{luaL_requiref} to call +@defid{luaopen_base} (for the basic library), +@defid{luaopen_package} (for the package library), +@defid{luaopen_coroutine} (for the coroutine library), +@defid{luaopen_string} (for the string library), +@defid{luaopen_utf8} (for the UTF8 library), +@defid{luaopen_table} (for the table library), +@defid{luaopen_math} (for the mathematical library), +@defid{luaopen_io} (for the I/O library), +@defid{luaopen_os} (for the operating system library), +and @defid{luaopen_debug} (for the debug library). +These functions are declared in @defid{lualib.h}. + +@sect2{predefined| @title{Basic Functions} + +The basic library provides core functions to Lua. +If you do not include this library in your application, +you should check carefully whether you need to provide +implementations for some of its facilities. + + +@LibEntry{assert (v [, message])| + +Calls @Lid{error} if +the value of its argument @id{v} is false (i.e., @nil or @false); +otherwise, returns all its arguments. +In case of error, +@id{message} is the error object; +when absent, it defaults to @St{assertion failed!} + +} + +@LibEntry{collectgarbage ([opt [, arg]])| + +This function is a generic interface to the garbage collector. +It performs different functions according to its first argument, @id{opt}: +@description{ + +@item{@St{collect}| +performs a full garbage-collection cycle. +This is the default option. +} + +@item{@St{stop}| +stops automatic execution of the garbage collector. +The collector will run only when explicitly invoked, +until a call to restart it. +} + +@item{@St{restart}| +restarts automatic execution of the garbage collector. +} + +@item{@St{count}| +returns the total memory in use by Lua in Kbytes. +The value has a fractional part, +so that it multiplied by 1024 +gives the exact number of bytes in use by Lua +(except for overflows). +} + +@item{@St{step}| +performs a garbage-collection step. +The step @Q{size} is controlled by @id{arg}. +With a zero value, +the collector will perform one basic (indivisible) step. +For non-zero values, +the collector will perform as if that amount of memory +(in KBytes) had been allocated by Lua. +Returns @true if the step finished a collection cycle. +} + +@item{@St{setpause}| +sets @id{arg} as the new value for the @emph{pause} of +the collector @see{GC}. +Returns the previous value for @emph{pause}. +} + +@item{@St{incremental}| +Change the collector mode to incremental. +This option can be followed by three numbers: +the garbage-collector pause, +the step multiplier, +and the step size. +} + +@item{@St{generational}| +Change the collector mode to generational. +This option can be followed by two numbers: +the garbage-collector minor multiplier +and the major multiplier. +} + +@item{@St{isrunning}| +returns a boolean that tells whether the collector is running +(i.e., not stopped). +} + +} + +} + +@LibEntry{dofile ([filename])| +Opens the named file and executes its contents as a Lua chunk. +When called without arguments, +@id{dofile} executes the contents of the standard input (@id{stdin}). +Returns all values returned by the chunk. +In case of errors, @id{dofile} propagates the error +to its caller (that is, @id{dofile} does not run in protected mode). + +} + +@LibEntry{error (message [, level])| +Terminates the last protected function called +and returns @id{message} as the error object. +Function @id{error} never returns. + +Usually, @id{error} adds some information about the error position +at the beginning of the message, if the message is a string. +The @id{level} argument specifies how to get the error position. +With @N{level 1} (the default), the error position is where the +@id{error} function was called. +@N{Level 2} points the error to where the function +that called @id{error} was called; and so on. +Passing a @N{level 0} avoids the addition of error position information +to the message. + +} + +@LibEntry{_G| +A global variable (not a function) that +holds the @x{global environment} @see{globalenv}. +Lua itself does not use this variable; +changing its value does not affect any environment, +nor vice versa. + +} + +@LibEntry{getmetatable (object)| + +If @id{object} does not have a metatable, returns @nil. +Otherwise, +if the object's metatable has a @idx{__metatable} field, +returns the associated value. +Otherwise, returns the metatable of the given object. + +} + +@LibEntry{ipairs (t)| + +Returns three values (an iterator function, the table @id{t}, and 0) +so that the construction +@verbatim{ +for i,v in ipairs(t) do @rep{body} end +} +will iterate over the key@En{}value pairs +(@T{1,t[1]}), (@T{2,t[2]}), @ldots, +up to the first absent index. + +} + +@LibEntry{load (chunk [, chunkname [, mode [, env]]])| + +Loads a chunk. + +If @id{chunk} is a string, the chunk is this string. +If @id{chunk} is a function, +@id{load} calls it repeatedly to get the chunk pieces. +Each call to @id{chunk} must return a string that concatenates +with previous results. +A return of an empty string, @nil, or no value signals the end of the chunk. + +If there are no syntactic errors, +returns the compiled chunk as a function; +otherwise, returns @nil plus the error message. + +When you load a main chunk, +the resulting function will always have exactly one upvalue, +the @id{_ENV} variable @see{globalenv}. +However, +when you load a binary chunk created from a function @seeF{string.dump}, +the resulting function can have an arbitrary number of upvalues, +and there is no guarantee that its first upvalue will be +the @id{_ENV} variable. +(A non-main function may not even have an @id{_ENV} upvalue.) + +Regardless, if the resulting function has any upvalues, +its first upvalue is set to the value of @id{env}, +if that parameter is given, +or to the value of the @x{global environment}. +Other upvalues are initialized with @nil. +All upvalues are fresh, that is, +they are not shared with any other function. + +@id{chunkname} is used as the name of the chunk for error messages +and debug information @see{debugI}. +When absent, +it defaults to @id{chunk}, if @id{chunk} is a string, +or to @St{=(load)} otherwise. + +The string @id{mode} controls whether the chunk can be text or binary +(that is, a precompiled chunk). +It may be the string @St{b} (only @x{binary chunk}s), +@St{t} (only text chunks), +or @St{bt} (both binary and text). +The default is @St{bt}. + +Lua does not check the consistency of binary chunks. +Maliciously crafted binary chunks can crash +the interpreter. + +} + +@LibEntry{loadfile ([filename [, mode [, env]]])| + +Similar to @Lid{load}, +but gets the chunk from file @id{filename} +or from the standard input, +if no file name is given. + +} + +@LibEntry{next (table [, index])| + +Allows a program to traverse all fields of a table. +Its first argument is a table and its second argument +is an index in this table. +@id{next} returns the next index of the table +and its associated value. +When called with @nil as its second argument, +@id{next} returns an initial index +and its associated value. +When called with the last index, +or with @nil in an empty table, +@id{next} returns @nil. +If the second argument is absent, then it is interpreted as @nil. +In particular, +you can use @T{next(t)} to check whether a table is empty. + +The order in which the indices are enumerated is not specified, +@emph{even for numeric indices}. +(To traverse a table in numerical order, +use a numerical @Rw{for}.) + +The behavior of @id{next} is undefined if, +during the traversal, +you assign any value to a non-existent field in the table. +You may however modify existing fields. +In particular, you may set existing fields to nil. + +} + +@LibEntry{pairs (t)| + +If @id{t} has a metamethod @idx{__pairs}, +calls it with @id{t} as argument and returns the first three +results from the call. + +Otherwise, +returns three values: the @Lid{next} function, the table @id{t}, and @nil, +so that the construction +@verbatim{ +for k,v in pairs(t) do @rep{body} end +} +will iterate over all key@En{}value pairs of table @id{t}. + +See function @Lid{next} for the caveats of modifying +the table during its traversal. + +} + +@LibEntry{pcall (f [, arg1, @Cdots])| + +Calls function @id{f} with +the given arguments in @def{protected mode}. +This means that any error @N{inside @T{f}} is not propagated; +instead, @id{pcall} catches the error +and returns a status code. +Its first result is the status code (a boolean), +which is true if the call succeeds without errors. +In such case, @id{pcall} also returns all results from the call, +after this first result. +In case of any error, @id{pcall} returns @false plus the error message. + +} + +@LibEntry{print (@Cdots)| +Receives any number of arguments +and prints their values to @id{stdout}, +using the @Lid{tostring} function to convert each argument to a string. +@id{print} is not intended for formatted output, +but only as a quick way to show a value, +for instance for debugging. +For complete control over the output, +use @Lid{string.format} and @Lid{io.write}. + +} + +@LibEntry{rawequal (v1, v2)| +Checks whether @id{v1} is equal to @id{v2}, +without invoking the @idx{__eq} metamethod. +Returns a boolean. + +} + +@LibEntry{rawget (table, index)| +Gets the real value of @T{table[index]}, +without invoking the @idx{__index} metamethod. +@id{table} must be a table; +@id{index} may be any value. + +} + +@LibEntry{rawlen (v)| +Returns the length of the object @id{v}, +which must be a table or a string, +without invoking the @idx{__len} metamethod. +Returns an integer. + +} + +@LibEntry{rawset (table, index, value)| +Sets the real value of @T{table[index]} to @id{value}, +without invoking the @idx{__newindex} metamethod. +@id{table} must be a table, +@id{index} any value different from @nil and @x{NaN}, +and @id{value} any Lua value. + +This function returns @id{table}. + +} + +@LibEntry{select (index, @Cdots)| + +If @id{index} is a number, +returns all arguments after argument number @id{index}; +a negative number indexes from the end (@num{-1} is the last argument). +Otherwise, @id{index} must be the string @T{"#"}, +and @id{select} returns the total number of extra arguments it received. + +} + +@LibEntry{setmetatable (table, metatable)| + +Sets the metatable for the given table. +(To change the metatable of other types from Lua code, +you must use the @link{debuglib|debug library}.) +If @id{metatable} is @nil, +removes the metatable of the given table. +If the original metatable has a @idx{__metatable} field, +raises an error. + +This function returns @id{table}. + +} + +@LibEntry{tonumber (e [, base])| + +When called with no @id{base}, +@id{tonumber} tries to convert its argument to a number. +If the argument is already a number or +a string convertible to a number, +then @id{tonumber} returns this number; +otherwise, it returns @nil. + +The conversion of strings can result in integers or floats, +according to the lexical conventions of Lua @see{lexical}. +(The string may have leading and trailing spaces and a sign.) + +When called with @id{base}, +then @id{e} must be a string to be interpreted as +an integer numeral in that base. +The base may be any integer between 2 and 36, inclusive. +In bases @N{above 10}, the letter @Char{A} (in either upper or lower case) +@N{represents 10}, @Char{B} @N{represents 11}, and so forth, +with @Char{Z} representing 35. +If the string @id{e} is not a valid numeral in the given base, +the function returns @nil. + +} + +@LibEntry{tostring (v)| +Receives a value of any type and +converts it to a string in a human-readable format. +(For complete control of how numbers are converted, +use @Lid{string.format}.) + +If the metatable of @id{v} has a @idx{__tostring} field, +then @id{tostring} calls the corresponding value +with @id{v} as argument, +and uses the result of the call as its result. + +} + +@LibEntry{type (v)| +Returns the type of its only argument, coded as a string. +The possible results of this function are +@St{nil} (a string, not the value @nil), +@St{number}, +@St{string}, +@St{boolean}, +@St{table}, +@St{function}, +@St{thread}, +and @St{userdata}. + +} + +@LibEntry{_VERSION| + +A global variable (not a function) that +holds a string containing the running Lua version. +The current value of this variable is @St{Lua 5.4}. + +} + +@LibEntry{warn (message [, tocont])| + +Emits a warning with the given message. +A message in a call with @id{tocont} true should be +continued in another call to this function. +The default for @id{tocont} is false. + +} + +@LibEntry{xpcall (f, msgh [, arg1, @Cdots])| + +This function is similar to @Lid{pcall}, +except that it sets a new @x{message handler} @id{msgh}. + +} + +} + +@sect2{corolib| @title{Coroutine Manipulation} + +This library comprises the operations to manipulate coroutines, +which come inside the table @defid{coroutine}. +See @See{coroutine} for a general description of coroutines. + + +@LibEntry{coroutine.create (f)| + +Creates a new coroutine, with body @id{f}. +@id{f} must be a function. +Returns this new coroutine, +an object with type @T{"thread"}. + +} + +@LibEntry{coroutine.isyieldable ()| + +Returns true when the running coroutine can yield. + +A running coroutine is yieldable if it is not the main thread and +it is not inside a non-yieldable @N{C function}. + +} + +@LibEntry{coroutine.kill(co)| + +Kills coroutine @id{co}, +closing all its pending to-be-closed variables +and putting the coroutine in a dead state. +In case of error closing some variable, +returns @false plus the error object; +otherwise returns @true. + +} + +@LibEntry{coroutine.resume (co [, val1, @Cdots])| + +Starts or continues the execution of coroutine @id{co}. +The first time you resume a coroutine, +it starts running its body. +The values @id{val1}, @ldots are passed +as the arguments to the body function. +If the coroutine has yielded, +@id{resume} restarts it; +the values @id{val1}, @ldots are passed +as the results from the yield. + +If the coroutine runs without any errors, +@id{resume} returns @true plus any values passed to @id{yield} +(when the coroutine yields) or any values returned by the body function +(when the coroutine terminates). +If there is any error, +@id{resume} returns @false plus the error message. + +} + +@LibEntry{coroutine.running ()| + +Returns the running coroutine plus a boolean, +true when the running coroutine is the main one. + +} + +@LibEntry{coroutine.status (co)| + +Returns the status of coroutine @id{co}, as a string: +@T{"running"}, +if the coroutine is running (that is, it called @id{status}); +@T{"suspended"}, if the coroutine is suspended in a call to @id{yield}, +or if it has not started running yet; +@T{"normal"} if the coroutine is active but not running +(that is, it has resumed another coroutine); +and @T{"dead"} if the coroutine has finished its body function, +or if it has stopped with an error. + +} + +@LibEntry{coroutine.wrap (f)| + +Creates a new coroutine, with body @id{f}. +@id{f} must be a function. +Returns a function that resumes the coroutine each time it is called. +Any arguments passed to the function behave as the +extra arguments to @id{resume}. +Returns the same values returned by @id{resume}, +except the first boolean. +In case of error, propagates the error. + +} + +@LibEntry{coroutine.yield (@Cdots)| + +Suspends the execution of the calling coroutine. +Any arguments to @id{yield} are passed as extra results to @id{resume}. + +} + +} + +@sect2{packlib| @title{Modules} + +The package library provides basic +facilities for loading modules in Lua. +It exports one function directly in the global environment: +@Lid{require}. +Everything else is exported in a table @defid{package}. + + +@LibEntry{require (modname)| + +Loads the given module. +The function starts by looking into the @Lid{package.loaded} table +to determine whether @id{modname} is already loaded. +If it is, then @id{require} returns the value stored +at @T{package.loaded[modname]}. +Otherwise, it tries to find a @emph{loader} for the module. + +To find a loader, +@id{require} is guided by the @Lid{package.searchers} sequence. +By changing this sequence, +we can change how @id{require} looks for a module. +The following explanation is based on the default configuration +for @Lid{package.searchers}. + +First @id{require} queries @T{package.preload[modname]}. +If it has a value, +this value (which must be a function) is the loader. +Otherwise @id{require} searches for a Lua loader using the +path stored in @Lid{package.path}. +If that also fails, it searches for a @N{C loader} using the +path stored in @Lid{package.cpath}. +If that also fails, +it tries an @emph{all-in-one} loader @seeF{package.searchers}. + +Once a loader is found, +@id{require} calls the loader with two arguments: +@id{modname} and an extra value dependent on how it got the loader. +(If the loader came from a file, +this extra value is the file name.) +If the loader returns any non-nil value, +@id{require} assigns the returned value to @T{package.loaded[modname]}. +If the loader does not return a non-nil value and +has not assigned any value to @T{package.loaded[modname]}, +then @id{require} assigns @Rw{true} to this entry. +In any case, @id{require} returns the +final value of @T{package.loaded[modname]}. + +If there is any error loading or running the module, +or if it cannot find any loader for the module, +then @id{require} raises an error. + +} + +@LibEntry{package.config| + +A string describing some compile-time configurations for packages. +This string is a sequence of lines: +@itemize{ + +@item{The first line is the @x{directory separator} string. +Default is @Char{\} for @x{Windows} and @Char{/} for all other systems.} + +@item{The second line is the character that separates templates in a path. +Default is @Char{;}.} + +@item{The third line is the string that marks the +substitution points in a template. +Default is @Char{?}.} + +@item{The fourth line is a string that, in a path in @x{Windows}, +is replaced by the executable's directory. +Default is @Char{!}.} + +@item{The fifth line is a mark to ignore all text after it +when building the @id{luaopen_} function name. +Default is @Char{-}.} + +} + +} + +@LibEntry{package.cpath| + +The path used by @Lid{require} to search for a @N{C loader}. + +Lua initializes the @N{C path} @Lid{package.cpath} in the same way +it initializes the Lua path @Lid{package.path}, +using the environment variable @defid{LUA_CPATH_5_4}, +or the environment variable @defid{LUA_CPATH}, +or a default path defined in @id{luaconf.h}. + +} + +@LibEntry{package.loaded| + +A table used by @Lid{require} to control which +modules are already loaded. +When you require a module @id{modname} and +@T{package.loaded[modname]} is not false, +@Lid{require} simply returns the value stored there. + +This variable is only a reference to the real table; +assignments to this variable do not change the +table used by @Lid{require}. + +} + +@LibEntry{package.loadlib (libname, funcname)| + +Dynamically links the host program with the @N{C library} @id{libname}. + +If @id{funcname} is @St{*}, +then it only links with the library, +making the symbols exported by the library +available to other dynamically linked libraries. +Otherwise, +it looks for a function @id{funcname} inside the library +and returns this function as a @N{C function}. +So, @id{funcname} must follow the @Lid{lua_CFunction} prototype +@seeC{lua_CFunction}. + +This is a low-level function. +It completely bypasses the package and module system. +Unlike @Lid{require}, +it does not perform any path searching and +does not automatically adds extensions. +@id{libname} must be the complete file name of the @N{C library}, +including if necessary a path and an extension. +@id{funcname} must be the exact name exported by the @N{C library} +(which may depend on the @N{C compiler} and linker used). + +This function is not supported by @N{Standard C}. +As such, it is only available on some platforms +(Windows, Linux, Mac OS X, Solaris, BSD, +plus other Unix systems that support the @id{dlfcn} standard). + +} + +@LibEntry{package.path| + +The path used by @Lid{require} to search for a Lua loader. + +At start-up, Lua initializes this variable with +the value of the environment variable @defid{LUA_PATH_5_4} or +the environment variable @defid{LUA_PATH} or +with a default path defined in @id{luaconf.h}, +if those environment variables are not defined. +Any @St{;;} in the value of the environment variable +is replaced by the default path. + +} + +@LibEntry{package.preload| + +A table to store loaders for specific modules +@seeF{require}. + +This variable is only a reference to the real table; +assignments to this variable do not change the +table used by @Lid{require}. + +} + +@LibEntry{package.searchers| + +A table used by @Lid{require} to control how to load modules. + +Each entry in this table is a @def{searcher function}. +When looking for a module, +@Lid{require} calls each of these searchers in ascending order, +with the module name (the argument given to @Lid{require}) as its +sole argument. +The function can return another function (the module @def{loader}) +plus an extra value that will be passed to that loader, +or a string explaining why it did not find that module +(or @nil if it has nothing to say). + +Lua initializes this table with four searcher functions. + +The first searcher simply looks for a loader in the +@Lid{package.preload} table. + +The second searcher looks for a loader as a Lua library, +using the path stored at @Lid{package.path}. +The search is done as described in function @Lid{package.searchpath}. + +The third searcher looks for a loader as a @N{C library}, +using the path given by the variable @Lid{package.cpath}. +Again, +the search is done as described in function @Lid{package.searchpath}. +For instance, +if the @N{C path} is the string +@verbatim{ +"./?.so;./?.dll;/usr/local/?/init.so" +} +the searcher for module @id{foo} +will try to open the files @T{./foo.so}, @T{./foo.dll}, +and @T{/usr/local/foo/init.so}, in that order. +Once it finds a @N{C library}, +this searcher first uses a dynamic link facility to link the +application with the library. +Then it tries to find a @N{C function} inside the library to +be used as the loader. +The name of this @N{C function} is the string @St{luaopen_} +concatenated with a copy of the module name where each dot +is replaced by an underscore. +Moreover, if the module name has a hyphen, +its suffix after (and including) the first hyphen is removed. +For instance, if the module name is @id{a.b.c-v2.1}, +the function name will be @id{luaopen_a_b_c}. + +The fourth searcher tries an @def{all-in-one loader}. +It searches the @N{C path} for a library for +the root name of the given module. +For instance, when requiring @id{a.b.c}, +it will search for a @N{C library} for @id{a}. +If found, it looks into it for an open function for +the submodule; +in our example, that would be @id{luaopen_a_b_c}. +With this facility, a package can pack several @N{C submodules} +into one single library, +with each submodule keeping its original open function. + +All searchers except the first one (preload) return as the extra value +the file name where the module was found, +as returned by @Lid{package.searchpath}. +The first searcher returns no extra value. + +} + +@LibEntry{package.searchpath (name, path [, sep [, rep]])| + +Searches for the given @id{name} in the given @id{path}. + +A path is a string containing a sequence of +@emph{templates} separated by semicolons. +For each template, +the function replaces each interrogation mark (if any) +in the template with a copy of @id{name} +wherein all occurrences of @id{sep} +(a dot, by default) +were replaced by @id{rep} +(the system's directory separator, by default), +and then tries to open the resulting file name. + +For instance, if the path is the string +@verbatim{ +"./?.lua;./?.lc;/usr/local/?/init.lua" +} +the search for the name @id{foo.a} +will try to open the files +@T{./foo/a.lua}, @T{./foo/a.lc}, and +@T{/usr/local/foo/a/init.lua}, in that order. + +Returns the resulting name of the first file that it can +open in read mode (after closing the file), +or @nil plus an error message if none succeeds. +(This error message lists all file names it tried to open.) + +} + +} + +@sect2{strlib| @title{String Manipulation} + +This library provides generic functions for string manipulation, +such as finding and extracting substrings, and pattern matching. +When indexing a string in Lua, the first character is at @N{position 1} +(not @N{at 0}, as in C). +Indices are allowed to be negative and are interpreted as indexing backwards, +from the end of the string. +Thus, the last character is at position @num{-1}, and so on. + +The string library provides all its functions inside the table +@defid{string}. +It also sets a @x{metatable for strings} +where the @idx{__index} field points to the @id{string} table. +Therefore, you can use the string functions in object-oriented style. +For instance, @T{string.byte(s,i)} +can be written as @T{s:byte(i)}. + +The string library assumes one-byte character encodings. + + +@LibEntry{string.byte (s [, i [, j]])| +Returns the internal numeric codes of the characters @T{s[i]}, +@T{s[i+1]}, @ldots, @T{s[j]}. +The default value for @id{i} @N{is 1}; +the default value for @id{j} @N{is @id{i}}. +These indices are corrected +following the same rules of function @Lid{string.sub}. + +Numeric codes are not necessarily portable across platforms. + +} + +@LibEntry{string.char (@Cdots)| +Receives zero or more integers. +Returns a string with length equal to the number of arguments, +in which each character has the internal numeric code equal +to its corresponding argument. + +Numeric codes are not necessarily portable across platforms. + +} + +@LibEntry{string.dump (function [, strip])| + +Returns a string containing a binary representation +(a @emph{binary chunk}) +of the given function, +so that a later @Lid{load} on this string returns +a copy of the function (but with new upvalues). +If @id{strip} is a true value, +the binary representation may not include all debug information +about the function, +to save space. + +Functions with upvalues have only their number of upvalues saved. +When (re)loaded, +those upvalues receive fresh instances. +(See the @Lid{load} function for details about +how these upvalues are initialized. +You can use the debug library to serialize +and reload the upvalues of a function +in a way adequate to your needs.) + +} + +@LibEntry{string.find (s, pattern [, init [, plain]])| + +Looks for the first match of +@id{pattern} @see{pm} in the string @id{s}. +If it finds a match, then @id{find} returns the indices @N{of @T{s}} +where this occurrence starts and ends; +otherwise, it returns @nil. +A third, optional numeric argument @id{init} specifies +where to start the search; +its default value @N{is 1} and can be negative. +A value of @true as a fourth, optional argument @id{plain} +turns off the pattern matching facilities, +so the function does a plain @Q{find substring} operation, +with no characters in @id{pattern} being considered magic. +Note that if @id{plain} is given, then @id{init} must be given as well. + +If the pattern has captures, +then in a successful match +the captured values are also returned, +after the two indices. + +} + +@LibEntry{string.format (formatstring, @Cdots)| + +Returns a formatted version of its variable number of arguments +following the description given in its first argument (which must be a string). +The format string follows the same rules as the @ANSI{sprintf}. +The only differences are that the conversion specifiers and modifiers +@T{*}, @id{h}, @id{L}, @id{l}, and @id{n} are not supported +and that there is an extra specifier, @id{q}. + +The specifier @id{q} formats booleans, nil, numbers, and strings +in a way that the result is a valid constant in Lua source code. +Booleans and nil are written in the obvious way +(@id{true}, @id{false}, @id{nil}). +Floats are written in hexadecimal, +to preserve full precision. +A string is written between double quotes, +using escape sequences when necessary to ensure that +it can safely be read back by the Lua interpreter. +For instance, the call +@verbatim{ +string.format('%q', 'a string with "quotes" and \n new line') +} +may produce the string: +@verbatim{ +"a string with \"quotes\" and \ + new line" +} +This specifier does not support modifiers (flags, width, length). + +The conversion specifiers +@id{A}, @id{a}, @id{E}, @id{e}, @id{f}, +@id{G}, and @id{g} all expect a number as argument. +The specifiers @id{c}, @id{d}, +@id{i}, @id{o}, @id{u}, @id{X}, and @id{x} +expect an integer. +When Lua is compiled with a C89 compiler, +the specifiers @id{A} and @id{a} (hexadecimal floats) +do not support modifiers. + +The specifier @id{s} expects a string; +if its argument is not a string, +it is converted to one following the same rules of @Lid{tostring}. +If the specifier has any modifier, +the corresponding string argument should not contain @x{embedded zeros}. + +The specifier @id{p} formats the pointer +returned by @Lid{lua_topointer}. +That gives a unique string identifier for tables, userdata, +threads, strings, and functions. +For other values (numbers, nil, booleans), +this specifier results in a string representing +the pointer @id{NULL}. + +} + +@LibEntry{string.gmatch (s, pattern [, init])| +Returns an iterator function that, +each time it is called, +returns the next captures from @id{pattern} @see{pm} +over the string @id{s}. +If @id{pattern} specifies no captures, +then the whole match is produced in each call. +A third, optional numeric argument @id{init} specifies +where to start the search; +its default value @N{is 1} and can be negative. + +As an example, the following loop +will iterate over all the words from string @id{s}, +printing one per line: +@verbatim{ +s = "hello world from Lua" +for w in string.gmatch(s, "%a+") do + print(w) +end +} +The next example collects all pairs @T{key=value} from the +given string into a table: +@verbatim{ +t = {} +s = "from=world, to=Lua" +for k, v in string.gmatch(s, "(%w+)=(%w+)") do + t[k] = v +end +} + +For this function, a caret @Char{^} at the start of a pattern does not +work as an anchor, as this would prevent the iteration. + +} + +@LibEntry{string.gsub (s, pattern, repl [, n])| +Returns a copy of @id{s} +in which all (or the first @id{n}, if given) +occurrences of the @id{pattern} @see{pm} have been +replaced by a replacement string specified by @id{repl}, +which can be a string, a table, or a function. +@id{gsub} also returns, as its second value, +the total number of matches that occurred. +The name @id{gsub} comes from @emph{Global SUBstitution}. + +If @id{repl} is a string, then its value is used for replacement. +The @N{character @T{%}} works as an escape character: +any sequence in @id{repl} of the form @T{%@rep{d}}, +with @rep{d} between 1 and 9, +stands for the value of the @rep{d}-th captured substring. +The sequence @T{%0} stands for the whole match. +The sequence @T{%%} stands for a @N{single @T{%}}. + +If @id{repl} is a table, then the table is queried for every match, +using the first capture as the key. + +If @id{repl} is a function, then this function is called every time a +match occurs, with all captured substrings passed as arguments, +in order. + +In any case, +if the pattern specifies no captures, +then it behaves as if the whole pattern was inside a capture. + +If the value returned by the table query or by the function call +is a string or a number, +then it is used as the replacement string; +otherwise, if it is @Rw{false} or @nil, +then there is no replacement +(that is, the original match is kept in the string). + +Here are some examples: +@verbatim{ +x = string.gsub("hello world", "(%w+)", "%1 %1") +--> x="hello hello world world" + +x = string.gsub("hello world", "%w+", "%0 %0", 1) +--> x="hello hello world" + +x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1") +--> x="world hello Lua from" + +x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv) +--> x="home = /home/roberto, user = roberto" + +x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s) + return load(s)() + end) +--> x="4+5 = 9" + +local t = {name="lua", version="5.4"} +x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t) +--> x="lua-5.4.tar.gz" +} + +} + +@LibEntry{string.len (s)| + +Receives a string and returns its length. +The empty string @T{""} has length 0. +Embedded zeros are counted, +so @T{"a\000bc\000"} has length 5. + +} + +@LibEntry{string.lower (s)| + +Receives a string and returns a copy of this string with all +uppercase letters changed to lowercase. +All other characters are left unchanged. +The definition of what an uppercase letter is depends on the current locale. + +} + +@LibEntry{string.match (s, pattern [, init])| + +Looks for the first @emph{match} of +@id{pattern} @see{pm} in the string @id{s}. +If it finds one, then @id{match} returns +the captures from the pattern; +otherwise it returns @nil. +If @id{pattern} specifies no captures, +then the whole match is returned. +A third, optional numeric argument @id{init} specifies +where to start the search; +its default value @N{is 1} and can be negative. + +} + +@LibEntry{string.pack (fmt, v1, v2, @Cdots)| + +Returns a binary string containing the values @id{v1}, @id{v2}, etc. +packed (that is, serialized in binary form) +according to the format string @id{fmt} @see{pack}. + +} + +@LibEntry{string.packsize (fmt)| + +Returns the size of a string resulting from @Lid{string.pack} +with the given format. +The format string cannot have the variable-length options +@Char{s} or @Char{z} @see{pack}. + +} + +@LibEntry{string.rep (s, n [, sep])| + +Returns a string that is the concatenation of @id{n} copies of +the string @id{s} separated by the string @id{sep}. +The default value for @id{sep} is the empty string +(that is, no separator). +Returns the empty string if @id{n} is not positive. + +(Note that it is very easy to exhaust the memory of your machine +with a single call to this function.) + +} + +@LibEntry{string.reverse (s)| + +Returns a string that is the string @id{s} reversed. + +} + +@LibEntry{string.sub (s, i [, j])| + +Returns the substring of @id{s} that +starts at @id{i} and continues until @id{j}; +@id{i} and @id{j} can be negative. +If @id{j} is absent, then it is assumed to be equal to @num{-1} +(which is the same as the string length). +In particular, +the call @T{string.sub(s,1,j)} returns a prefix of @id{s} +with length @id{j}, +and @T{string.sub(s, -i)} (for a positive @id{i}) +returns a suffix of @id{s} +with length @id{i}. + +If, after the translation of negative indices, +@id{i} is less than 1, +it is corrected to 1. +If @id{j} is greater than the string length, +it is corrected to that length. +If, after these corrections, +@id{i} is greater than @id{j}, +the function returns the empty string. + +} + +@LibEntry{string.unpack (fmt, s [, pos])| + +Returns the values packed in string @id{s} @seeF{string.pack} +according to the format string @id{fmt} @see{pack}. +An optional @id{pos} marks where +to start reading in @id{s} (default is 1). +After the read values, +this function also returns the index of the first unread byte in @id{s}. + +} + +@LibEntry{string.upper (s)| + +Receives a string and returns a copy of this string with all +lowercase letters changed to uppercase. +All other characters are left unchanged. +The definition of what a lowercase letter is depends on the current locale. + +} + + +@sect3{pm| @title{Patterns} + +Patterns in Lua are described by regular strings, +which are interpreted as patterns by the pattern-matching functions +@Lid{string.find}, +@Lid{string.gmatch}, +@Lid{string.gsub}, +and @Lid{string.match}. +This section describes the syntax and the meaning +(that is, what they match) of these strings. + +@sect4{@title{Character Class:} +A @def{character class} is used to represent a set of characters. +The following combinations are allowed in describing a character class: +@description{ + +@item{@rep{x}| +(where @rep{x} is not one of the @emphx{magic characters} +@T{^$()%.[]*+-?}) +represents the character @emph{x} itself. +} + +@item{@T{.}| (a dot) represents all characters.} + +@item{@T{%a}| represents all letters.} + +@item{@T{%c}| represents all control characters.} + +@item{@T{%d}| represents all digits.} + +@item{@T{%g}| represents all printable characters except space.} + +@item{@T{%l}| represents all lowercase letters.} + +@item{@T{%p}| represents all punctuation characters.} + +@item{@T{%s}| represents all space characters.} + +@item{@T{%u}| represents all uppercase letters.} + +@item{@T{%w}| represents all alphanumeric characters.} + +@item{@T{%x}| represents all hexadecimal digits.} + +@item{@T{%@rep{x}}| (where @rep{x} is any non-alphanumeric character) +represents the character @rep{x}. +This is the standard way to escape the magic characters. +Any non-alphanumeric character +(including all punctuation characters, even the non-magical) +can be preceded by a @Char{%} +when used to represent itself in a pattern. +} + +@item{@T{[@rep{set}]}| +represents the class which is the union of all +characters in @rep{set}. +A range of characters can be specified by +separating the end characters of the range, +in ascending order, with a @Char{-}. +All classes @T{%}@emph{x} described above can also be used as +components in @rep{set}. +All other characters in @rep{set} represent themselves. +For example, @T{[%w_]} (or @T{[_%w]}) +represents all alphanumeric characters plus the underscore, +@T{[0-7]} represents the octal digits, +and @T{[0-7%l%-]} represents the octal digits plus +the lowercase letters plus the @Char{-} character. + +You can put a closing square bracket in a set +by positioning it as the first character in the set. +You can put a hyphen in a set +by positioning it as the first or the last character in the set. +(You can also use an escape for both cases.) + +The interaction between ranges and classes is not defined. +Therefore, patterns like @T{[%a-z]} or @T{[a-%%]} +have no meaning. +} + +@item{@T{[^@rep{set}]}| +represents the complement of @rep{set}, +where @rep{set} is interpreted as above. +} + +} +For all classes represented by single letters (@T{%a}, @T{%c}, etc.), +the corresponding uppercase letter represents the complement of the class. +For instance, @T{%S} represents all non-space characters. + +The definitions of letter, space, and other character groups +depend on the current locale. +In particular, the class @T{[a-z]} may not be equivalent to @T{%l}. + +} + +@sect4{@title{Pattern Item:} +A @def{pattern item} can be +@itemize{ + +@item{ +a single character class, +which matches any single character in the class; +} + +@item{ +a single character class followed by @Char{*}, +which matches zero or more repetitions of characters in the class. +These repetition items will always match the longest possible sequence; +} + +@item{ +a single character class followed by @Char{+}, +which matches one or more repetitions of characters in the class. +These repetition items will always match the longest possible sequence; +} + +@item{ +a single character class followed by @Char{-}, +which also matches zero or more repetitions of characters in the class. +Unlike @Char{*}, +these repetition items will always match the shortest possible sequence; +} + +@item{ +a single character class followed by @Char{?}, +which matches zero or one occurrence of a character in the class. +It always matches one occurrence if possible; +} + +@item{ +@T{%@rep{n}}, for @rep{n} between 1 and 9; +such item matches a substring equal to the @rep{n}-th captured string +(see below); +} + +@item{ +@T{%b@rep{xy}}, where @rep{x} and @rep{y} are two distinct characters; +such item matches strings that start @N{with @rep{x}}, end @N{with @rep{y}}, +and where the @rep{x} and @rep{y} are @emph{balanced}. +This means that, if one reads the string from left to right, +counting @M{+1} for an @rep{x} and @M{-1} for a @rep{y}, +the ending @rep{y} is the first @rep{y} where the count reaches 0. +For instance, the item @T{%b()} matches expressions with +balanced parentheses. +} + +@item{ +@T{%f[@rep{set}]}, a @def{frontier pattern}; +such item matches an empty string at any position such that +the next character belongs to @rep{set} +and the previous character does not belong to @rep{set}. +The set @rep{set} is interpreted as previously described. +The beginning and the end of the subject are handled as if +they were the character @Char{\0}. +} + +} + +} + +@sect4{@title{Pattern:} +A @def{pattern} is a sequence of pattern items. +A caret @Char{^} at the beginning of a pattern anchors the match at the +beginning of the subject string. +A @Char{$} at the end of a pattern anchors the match at the +end of the subject string. +At other positions, +@Char{^} and @Char{$} have no special meaning and represent themselves. + +} + +@sect4{@title{Captures:} +A pattern can contain sub-patterns enclosed in parentheses; +they describe @def{captures}. +When a match succeeds, the substrings of the subject string +that match captures are stored (@emph{captured}) for future use. +Captures are numbered according to their left parentheses. +For instance, in the pattern @T{"(a*(.)%w(%s*))"}, +the part of the string matching @T{"a*(.)%w(%s*)"} is +stored as the first capture (and therefore has @N{number 1}); +the character matching @St{.} is captured with @N{number 2}, +and the part matching @St{%s*} has @N{number 3}. + +As a special case, the empty capture @T{()} captures +the current string position (a number). +For instance, if we apply the pattern @T{"()aa()"} on the +string @T{"flaaap"}, there will be two captures: @N{3 and 5}. + +} + +@sect4{@title{Multiple matches:} +The function @Lid{string.gsub} and the iterator @Lid{string.gmatch} +match multiple occurrences of the given pattern in the subject. +For these functions, +a new match is considered valid only +if it ends at least one byte after the previous match. +In other words, the pattern machine never accepts the +empty string as a match immediately after another match. +As an example, +consider the results of the following code: +@verbatim{ +> string.gsub("abc", "()a*()", print); +--> 1 2 +--> 3 3 +--> 4 4 +} +The second and third results come from Lua matching an empty +string after @Char{b} and another one after @Char{c}. +Lua does not match an empty string after @Char{a}, +because it would end at the same position of the previous match. + +} + +} + +@sect3{pack| @title{Format Strings for Pack and Unpack} + +The first argument to @Lid{string.pack}, +@Lid{string.packsize}, and @Lid{string.unpack} +is a format string, +which describes the layout of the structure being created or read. + +A format string is a sequence of conversion options. +The conversion options are as follows: +@description{ +@item{@T{<}|sets little endian} +@item{@T{>}|sets big endian} +@item{@T{=}|sets native endian} +@item{@T{![@rep{n}]}|sets maximum alignment to @id{n} +(default is native alignment)} +@item{@T{b}|a signed byte (@id{char})} +@item{@T{B}|an unsigned byte (@id{char})} +@item{@T{h}|a signed @id{short} (native size)} +@item{@T{H}|an unsigned @id{short} (native size)} +@item{@T{l}|a signed @id{long} (native size)} +@item{@T{L}|an unsigned @id{long} (native size)} +@item{@T{j}|a @id{lua_Integer}} +@item{@T{J}|a @id{lua_Unsigned}} +@item{@T{T}|a @id{size_t} (native size)} +@item{@T{i[@rep{n}]}|a signed @id{int} with @id{n} bytes +(default is native size)} +@item{@T{I[@rep{n}]}|an unsigned @id{int} with @id{n} bytes +(default is native size)} +@item{@T{f}|a @id{float} (native size)} +@item{@T{d}|a @id{double} (native size)} +@item{@T{n}|a @id{lua_Number}} +@item{@T{c@rep{n}}|a fixed-sized string with @id{n} bytes} +@item{@T{z}|a zero-terminated string} +@item{@T{s[@emph{n}]}|a string preceded by its length +coded as an unsigned integer with @id{n} bytes +(default is a @id{size_t})} +@item{@T{x}|one byte of padding} +@item{@T{X@rep{op}}|an empty item that aligns +according to option @id{op} +(which is otherwise ignored)} +@item{@Char{ }|(empty space) ignored} +} +(A @St{[@rep{n}]} means an optional integral numeral.) +Except for padding, spaces, and configurations +(options @St{xX <=>!}), +each option corresponds to an argument (in @Lid{string.pack}) +or a result (in @Lid{string.unpack}). + +For options @St{!@rep{n}}, @St{s@rep{n}}, @St{i@rep{n}}, and @St{I@rep{n}}, +@id{n} can be any integer between 1 and 16. +All integral options check overflows; +@Lid{string.pack} checks whether the given value fits in the given size; +@Lid{string.unpack} checks whether the read value fits in a Lua integer. + +Any format string starts as if prefixed by @St{!1=}, +that is, +with maximum alignment of 1 (no alignment) +and native endianness. + +Native endianness assumes that the whole system is +either big or little endian. +The packing functions will not emulate correctly the behavior +of mixed-endian formats. + +Alignment works as follows: +For each option, +the format gets extra padding until the data starts +at an offset that is a multiple of the minimum between the +option size and the maximum alignment; +this minimum must be a power of 2. +Options @St{c} and @St{z} are not aligned; +option @St{s} follows the alignment of its starting integer. + + +All padding is filled with zeros by @Lid{string.pack} +(and ignored by @Lid{string.unpack}). + +} + +} + +@sect2{utf8| @title{UTF-8 Support} + +This library provides basic support for @x{UTF-8} encoding. +It provides all its functions inside the table @defid{utf8}. +This library does not provide any support for @x{Unicode} other +than the handling of the encoding. +Any operation that needs the meaning of a character, +such as character classification, is outside its scope. + +Unless stated otherwise, +all functions that expect a byte position as a parameter +assume that the given position is either the start of a byte sequence +or one plus the length of the subject string. +As in the string library, +negative indices count from the end of the string. + +Functions that create byte sequences +accept all values up to @T{0x7FFFFFFF}, +as defined in the original UTF-8 specification; +that implies byte sequences of up to six bytes. + +Functions that interpret byte sequences only accept +valid sequences (well formed and not overlong). +By default, they only accept byte sequences +that result in valid Unicode code points, +rejecting values larger than @T{10FFFF} and surrogates. +A boolean argument @id{nonstrict}, when available, +lifts these checks, +so that all values up to @T{0x7FFFFFFF} are accepted. +(Not well formed and overlong sequences are still rejected.) + + +@LibEntry{utf8.char (@Cdots)| + +Receives zero or more integers, +converts each one to its corresponding UTF-8 byte sequence +and returns a string with the concatenation of all these sequences. + +} + +@LibEntry{utf8.charpattern| + +The pattern (a string, not a function) @St{[\0-\x7F\xC2-\xFD][\x80-\xBF]*} +@see{pm}, +which matches exactly one UTF-8 byte sequence, +assuming that the subject is a valid UTF-8 string. + +} + +@LibEntry{utf8.codes (s [, nonstrict])| + +Returns values so that the construction +@verbatim{ +for p, c in utf8.codes(s) do @rep{body} end +} +will iterate over all characters in string @id{s}, +with @id{p} being the position (in bytes) and @id{c} the code point +of each character. +It raises an error if it meets any invalid byte sequence. + +} + +@LibEntry{utf8.codepoint (s [, i [, j [, nonstrict]]])| + +Returns the codepoints (as integers) from all characters in @id{s} +that start between byte position @id{i} and @id{j} (both included). +The default for @id{i} is 1 and for @id{j} is @id{i}. +It raises an error if it meets any invalid byte sequence. + +} + +@LibEntry{utf8.len (s [, i [, j [, nonstrict]]])| + +Returns the number of UTF-8 characters in string @id{s} +that start between positions @id{i} and @id{j} (both inclusive). +The default for @id{i} is @num{1} and for @id{j} is @num{-1}. +If it finds any invalid byte sequence, +returns a false value plus the position of the first invalid byte. + +} + +@LibEntry{utf8.offset (s, n [, i])| + +Returns the position (in bytes) where the encoding of the +@id{n}-th character of @id{s} +(counting from position @id{i}) starts. +A negative @id{n} gets characters before position @id{i}. +The default for @id{i} is 1 when @id{n} is non-negative +and @T{#s + 1} otherwise, +so that @T{utf8.offset(s, -n)} gets the offset of the +@id{n}-th character from the end of the string. +If the specified character is neither in the subject +nor right after its end, +the function returns @nil. + +As a special case, +when @id{n} is 0 the function returns the start of the encoding +of the character that contains the @id{i}-th byte of @id{s}. + +This function assumes that @id{s} is a valid UTF-8 string. + +} + +} + +@sect2{tablib| @title{Table Manipulation} + +This library provides generic functions for table manipulation. +It provides all its functions inside the table @defid{table}. + +Remember that, whenever an operation needs the length of a table, +all caveats about the length operator apply @see{len-op}. +All functions ignore non-numeric keys +in the tables given as arguments. + + +@LibEntry{table.concat (list [, sep [, i [, j]]])| + +Given a list where all elements are strings or numbers, +returns the string @T{list[i]..sep..list[i+1] @Cdots sep..list[j]}. +The default value for @id{sep} is the empty string, +the default for @id{i} is 1, +and the default for @id{j} is @T{#list}. +If @id{i} is greater than @id{j}, returns the empty string. + +} + +@LibEntry{table.insert (list, [pos,] value)| + +Inserts element @id{value} at position @id{pos} in @id{list}, +shifting up the elements +@T{list[pos], list[pos+1], @Cdots, list[#list]}. +The default value for @id{pos} is @T{#list+1}, +so that a call @T{table.insert(t,x)} inserts @id{x} at the end +of list @id{t}. + +} + +@LibEntry{table.move (a1, f, e, t [,a2])| + +Moves elements from table @id{a1} to table @id{a2}, +performing the equivalent to the following +multiple assignment: +@T{a2[t],@Cdots = a1[f],@Cdots,a1[e]}. +The default for @id{a2} is @id{a1}. +The destination range can overlap with the source range. +The number of elements to be moved must fit in a Lua integer. + +Returns the destination table @id{a2}. + +} + +@LibEntry{table.pack (@Cdots)| + +Returns a new table with all arguments stored into keys 1, 2, etc. +and with a field @St{n} with the total number of arguments. +Note that the resulting table may not be a sequence, +if some arguments are @nil. + +} + +@LibEntry{table.remove (list [, pos])| + +Removes from @id{list} the element at position @id{pos}, +returning the value of the removed element. +When @id{pos} is an integer between 1 and @T{#list}, +it shifts down the elements +@T{list[pos+1], list[pos+2], @Cdots, list[#list]} +and erases element @T{list[#list]}; +The index @id{pos} can also be 0 when @T{#list} is 0, +or @T{#list + 1}. + +The default value for @id{pos} is @T{#list}, +so that a call @T{table.remove(l)} removes the last element +of list @id{l}. + +} + +@LibEntry{table.sort (list [, comp])| + +Sorts list elements in a given order, @emph{in-place}, +from @T{list[1]} to @T{list[#list]}. +If @id{comp} is given, +then it must be a function that receives two list elements +and returns true when the first element must come +before the second in the final order +(so that, after the sort, +@T{i < j} implies @T{not comp(list[j],list[i])}). +If @id{comp} is not given, +then the standard Lua operator @T{<} is used instead. + +Note that the @id{comp} function must define +a strict partial order over the elements in the list; +that is, it must be asymmetric and transitive. +Otherwise, no valid sort may be possible. + +The sort algorithm is not stable: +elements considered equal by the given order +may have their relative positions changed by the sort. + +} + +@LibEntry{table.unpack (list [, i [, j]])| + +Returns the elements from the given list. +This function is equivalent to +@verbatim{ +return list[i], list[i+1], @Cdots, list[j] +} +By default, @id{i} @N{is 1} and @id{j} is @T{#list}. + +} + +} + +@sect2{mathlib| @title{Mathematical Functions} + +This library provides basic mathematical functions. +It provides all its functions and constants inside the table @defid{math}. +Functions with the annotation @St{integer/float} give +integer results for integer arguments +and float results for float (or mixed) arguments. +Rounding functions +(@Lid{math.ceil}, @Lid{math.floor}, and @Lid{math.modf}) +return an integer when the result fits in the range of an integer, +or a float otherwise. + +@LibEntry{math.abs (x)| + +Returns the absolute value of @id{x}. (integer/float) + +} + +@LibEntry{math.acos (x)| + +Returns the arc cosine of @id{x} (in radians). + +} + +@LibEntry{math.asin (x)| + +Returns the arc sine of @id{x} (in radians). + +} + +@LibEntry{math.atan (y [, x])| + +@index{atan2} +Returns the arc tangent of @T{y/x} (in radians), +but uses the signs of both arguments to find the +quadrant of the result. +(It also handles correctly the case of @id{x} being zero.) + +The default value for @id{x} is 1, +so that the call @T{math.atan(y)} +returns the arc tangent of @id{y}. + +} + +@LibEntry{math.ceil (x)| + +Returns the smallest integral value larger than or equal to @id{x}. + +} + +@LibEntry{math.cos (x)| + +Returns the cosine of @id{x} (assumed to be in radians). + +} + +@LibEntry{math.deg (x)| + +Converts the angle @id{x} from radians to degrees. + +} + +@LibEntry{math.exp (x)| + +Returns the value @M{e@sp{x}} +(where @id{e} is the base of natural logarithms). + +} + +@LibEntry{math.floor (x)| + +Returns the largest integral value smaller than or equal to @id{x}. + +} + +@LibEntry{math.fmod (x, y)| + +Returns the remainder of the division of @id{x} by @id{y} +that rounds the quotient towards zero. (integer/float) + +} + +@LibEntry{math.huge| + +The float value @idx{HUGE_VAL}, +a value larger than any other numeric value. + +} + +@LibEntry{math.log (x [, base])| + +Returns the logarithm of @id{x} in the given base. +The default for @id{base} is @M{e} +(so that the function returns the natural logarithm of @id{x}). + +} + +@LibEntry{math.max (x, @Cdots)| + +Returns the argument with the maximum value, +according to the Lua operator @T{<}. (integer/float) + +} + +@LibEntry{math.maxinteger| +An integer with the maximum value for an integer. + +} + +@LibEntry{math.min (x, @Cdots)| + +Returns the argument with the minimum value, +according to the Lua operator @T{<}. (integer/float) + +} + +@LibEntry{math.mininteger| +An integer with the minimum value for an integer. + +} + +@LibEntry{math.modf (x)| + +Returns the integral part of @id{x} and the fractional part of @id{x}. +Its second result is always a float. + +} + +@LibEntry{math.pi| + +The value of @M{@pi}. + +} + +@LibEntry{math.rad (x)| + +Converts the angle @id{x} from degrees to radians. + +} + +@LibEntry{math.random ([m [, n]])| + +When called without arguments, +returns a pseudo-random float with uniform distribution +in the range @C{(} @M{[0,1)}. @C{]} +When called with two integers @id{m} and @id{n}, +@id{math.random} returns a pseudo-random integer +with uniform distribution in the range @M{[m, n]}. +The call @T{math.random(n)}, for a positive @id{n}, +is equivalent to @T{math.random(1,n)}. +The call @T{math.random(0)} produces an integer with +all bits (pseudo)random. + +Lua initializes its pseudo-random generator with the equivalent of +a call to @Lid{math.randomseed} with no arguments, +so that @id{math.random} should generate +different sequences of results each time the program runs. + +The results from this function have good statistical qualities, +but they are not cryptographically secure. +(For instance, there are no guarantees that it is hard +to predict future results based on the observation of +some number of previous results.) + +} + +@LibEntry{math.randomseed ([x [, y]])| + +When called with at least one argument, +the integer parameters @id{x} and @id{y} are +concatenated into a 128-bit @emphx{seed} that +is used to reinitialize the pseudo-random generator; +equal seeds produce equal sequences of numbers. +The default for @id{y} is zero. + +When called with no arguments, +Lua generates a seed with +a weak attempt for randomness. +To ensure a required level of randomness to the initial state +(or contrarily, to have a deterministic sequence, +for instance when debugging a program), +you should call @Lid{math.randomseed} with explicit arguments. + +} + +@LibEntry{math.sin (x)| + +Returns the sine of @id{x} (assumed to be in radians). + +} + +@LibEntry{math.sqrt (x)| + +Returns the square root of @id{x}. +(You can also use the expression @T{x^0.5} to compute this value.) + +} + +@LibEntry{math.tan (x)| + +Returns the tangent of @id{x} (assumed to be in radians). + +} + +@LibEntry{math.tointeger (x)| + +If the value @id{x} is convertible to an integer, +returns that integer. +Otherwise, returns @nil. + +} + +@LibEntry{math.type (x)| + +Returns @St{integer} if @id{x} is an integer, +@St{float} if it is a float, +or @nil if @id{x} is not a number. + +} + +@LibEntry{math.ult (m, n)| + +Returns a boolean, +true if and only if integer @id{m} is below integer @id{n} when +they are compared as @x{unsigned integers}. + +} + +} + + +@sect2{iolib| @title{Input and Output Facilities} + +The I/O library provides two different styles for file manipulation. +The first one uses implicit file handles; +that is, there are operations to set a default input file and a +default output file, +and all input/output operations are over these default files. +The second style uses explicit file handles. + +When using implicit file handles, +all operations are supplied by table @defid{io}. +When using explicit file handles, +the operation @Lid{io.open} returns a file handle +and then all operations are supplied as methods of the file handle. + +The table @id{io} also provides +three predefined file handles with their usual meanings from C: +@defid{io.stdin}, @defid{io.stdout}, and @defid{io.stderr}. +The I/O library never closes these files. +The metatable for file handles provides metamethods +for @idx{__gc} and @idx{__close} that try +to close the file when called. + +Unless otherwise stated, +all I/O functions return @nil on failure +(plus an error message as a second result and +a system-dependent error code as a third result) +and some value different from @nil on success. +On non-POSIX systems, +the computation of the error message and error code +in case of errors +may be not @x{thread safe}, +because they rely on the global C variable @id{errno}. + +@LibEntry{io.close ([file])| + +Equivalent to @T{file:close()}. +Without a @id{file}, closes the default output file. + +} + +@LibEntry{io.flush ()| + +Equivalent to @T{io.output():flush()}. + +} + +@LibEntry{io.input ([file])| + +When called with a file name, it opens the named file (in text mode), +and sets its handle as the default input file. +When called with a file handle, +it simply sets this file handle as the default input file. +When called without arguments, +it returns the current default input file. + +In case of errors this function raises the error, +instead of returning an error code. + +} + +@LibEntry{io.lines ([filename, @Cdots])| + +Opens the given file name in read mode +and returns an iterator function that +works like @T{file:lines(@Cdots)} over the opened file. +When the iterator function detects the end of file, +it returns no values (to finish the loop) and automatically closes the file. +Besides the iterator function, +@id{io.lines} returns three other values: +two @nil values as placeholders, +plus the created file handle. +Therefore, when used in a generic @Rw{for} loop, +the file is closed also if the loop is interrupted by an +error or a @Rw{break}. + +The call @T{io.lines()} (with no file name) is equivalent +to @T{io.input():lines("l")}; +that is, it iterates over the lines of the default input file. +In this case, the iterator does not close the file when the loop ends. + +In case of errors this function raises the error, +instead of returning an error code. + +} + +@LibEntry{io.open (filename [, mode])| + +This function opens a file, +in the mode specified in the string @id{mode}. +In case of success, +it returns a new file handle. + +The @id{mode} string can be any of the following: +@description{ +@item{@St{r}| read mode (the default);} +@item{@St{w}| write mode;} +@item{@St{a}| append mode;} +@item{@St{r+}| update mode, all previous data is preserved;} +@item{@St{w+}| update mode, all previous data is erased;} +@item{@St{a+}| append update mode, previous data is preserved, + writing is only allowed at the end of file.} +} +The @id{mode} string can also have a @Char{b} at the end, +which is needed in some systems to open the file in binary mode. + +} + +@LibEntry{io.output ([file])| + +Similar to @Lid{io.input}, but operates over the default output file. + +} + +@LibEntry{io.popen (prog [, mode])| + +This function is system dependent and is not available +on all platforms. + +Starts program @id{prog} in a separated process and returns +a file handle that you can use to read data from this program +(if @id{mode} is @T{"r"}, the default) +or to write data to this program +(if @id{mode} is @T{"w"}). + +} + +@LibEntry{io.read (@Cdots)| + +Equivalent to @T{io.input():read(@Cdots)}. + +} + +@LibEntry{io.tmpfile ()| + +In case of success, +returns a handle for a temporary file. +This file is opened in update mode +and it is automatically removed when the program ends. + +} + +@LibEntry{io.type (obj)| + +Checks whether @id{obj} is a valid file handle. +Returns the string @T{"file"} if @id{obj} is an open file handle, +@T{"closed file"} if @id{obj} is a closed file handle, +or @nil if @id{obj} is not a file handle. + +} + +@LibEntry{io.write (@Cdots)| + +Equivalent to @T{io.output():write(@Cdots)}. + + +} + +@LibEntry{file:close ()| + +Closes @id{file}. +Note that files are automatically closed when +their handles are garbage collected, +but that takes an unpredictable amount of time to happen. + +When closing a file handle created with @Lid{io.popen}, +@Lid{file:close} returns the same values +returned by @Lid{os.execute}. + +} + +@LibEntry{file:flush ()| + +Saves any written data to @id{file}. + +} + +@LibEntry{file:lines (@Cdots)| + +Returns an iterator function that, +each time it is called, +reads the file according to the given formats. +When no format is given, +uses @St{l} as a default. +As an example, the construction +@verbatim{ +for c in file:lines(1) do @rep{body} end +} +will iterate over all characters of the file, +starting at the current position. +Unlike @Lid{io.lines}, this function does not close the file +when the loop ends. + +In case of errors this function raises the error, +instead of returning an error code. + +} + +@LibEntry{file:read (@Cdots)| + +Reads the file @id{file}, +according to the given formats, which specify what to read. +For each format, +the function returns a string or a number with the characters read, +or @nil if it cannot read data with the specified format. +(In this latter case, +the function does not read subsequent formats.) +When called without arguments, +it uses a default format that reads the next line +(see below). + +The available formats are +@description{ + +@item{@St{n}| +reads a numeral and returns it as a float or an integer, +following the lexical conventions of Lua. +(The numeral may have leading spaces and a sign.) +This format always reads the longest input sequence that +is a valid prefix for a numeral; +if that prefix does not form a valid numeral +(e.g., an empty string, @St{0x}, or @St{3.4e-}), +it is discarded and the format returns @nil. +} + +@item{@St{a}| +reads the whole file, starting at the current position. +On end of file, it returns the empty string. +} + +@item{@St{l}| +reads the next line skipping the end of line, +returning @nil on end of file. +This is the default format. +} + +@item{@St{L}| +reads the next line keeping the end-of-line character (if present), +returning @nil on end of file. +} + +@item{@emph{number}| +reads a string with up to this number of bytes, +returning @nil on end of file. +If @id{number} is zero, +it reads nothing and returns an empty string, +or @nil on end of file. +} + +} +The formats @St{l} and @St{L} should be used only for text files. + +} + +@LibEntry{file:seek ([whence [, offset]])| + +Sets and gets the file position, +measured from the beginning of the file, +to the position given by @id{offset} plus a base +specified by the string @id{whence}, as follows: +@description{ +@item{@St{set}| base is position 0 (beginning of the file);} +@item{@St{cur}| base is current position;} +@item{@St{end}| base is end of file;} +} +In case of success, @id{seek} returns the final file position, +measured in bytes from the beginning of the file. +If @id{seek} fails, it returns @nil, +plus a string describing the error. + +The default value for @id{whence} is @T{"cur"}, +and for @id{offset} is 0. +Therefore, the call @T{file:seek()} returns the current +file position, without changing it; +the call @T{file:seek("set")} sets the position to the +beginning of the file (and returns 0); +and the call @T{file:seek("end")} sets the position to the +end of the file, and returns its size. + +} + +@LibEntry{file:setvbuf (mode [, size])| + +Sets the buffering mode for an output file. +There are three available modes: +@description{ + +@item{@St{no}| +no buffering; the result of any output operation appears immediately. +} + +@item{@St{full}| +full buffering; output operation is performed only +when the buffer is full or when +you explicitly @T{flush} the file @seeF{io.flush}. +} + +@item{@St{line}| +line buffering; output is buffered until a newline is output +or there is any input from some special files +(such as a terminal device). +} + +} +For the last two cases, +@id{size} is a hint for the size of the buffer, in bytes. +The default is an appropriate size. + +} + +@LibEntry{file:write (@Cdots)| + +Writes the value of each of its arguments to @id{file}. +The arguments must be strings or numbers. + +In case of success, this function returns @id{file}. +Otherwise it returns @nil plus a string describing the error. + +} + +} + +@sect2{oslib| @title{Operating System Facilities} + +This library is implemented through table @defid{os}. + + +@LibEntry{os.clock ()| + +Returns an approximation of the amount in seconds of CPU time +used by the program. + +} + +@LibEntry{os.date ([format [, time]])| + +Returns a string or a table containing date and time, +formatted according to the given string @id{format}. + +If the @id{time} argument is present, +this is the time to be formatted +(see the @Lid{os.time} function for a description of this value). +Otherwise, @id{date} formats the current time. + +If @id{format} starts with @Char{!}, +then the date is formatted in Coordinated Universal Time. +After this optional character, +if @id{format} is the string @St{*t}, +then @id{date} returns a table with the following fields: +@id{year}, @id{month} (1@En{}12), @id{day} (1@En{}31), +@id{hour} (0@En{}23), @id{min} (0@En{}59), +@id{sec} (0@En{}61, due to leap seconds), +@id{wday} (weekday, 1@En{}7, Sunday @N{is 1}), +@id{yday} (day of the year, 1@En{}366), +and @id{isdst} (daylight saving flag, a boolean). +This last field may be absent +if the information is not available. + +If @id{format} is not @St{*t}, +then @id{date} returns the date as a string, +formatted according to the same rules as the @ANSI{strftime}. + +When called without arguments, +@id{date} returns a reasonable date and time representation that depends on +the host system and on the current locale. +(More specifically, @T{os.date()} is equivalent to @T{os.date("%c")}.) + +On non-POSIX systems, +this function may be not @x{thread safe} +because of its reliance on @CId{gmtime} and @CId{localtime}. + +} + +@LibEntry{os.difftime (t2, t1)| + +Returns the difference, in seconds, +from time @id{t1} to time @id{t2} +(where the times are values returned by @Lid{os.time}). +In @x{POSIX}, @x{Windows}, and some other systems, +this value is exactly @id{t2}@M{-}@id{t1}. + +} + +@LibEntry{os.execute ([command])| + +This function is equivalent to the @ANSI{system}. +It passes @id{command} to be executed by an operating system shell. +Its first result is @true +if the command terminated successfully, +or @nil otherwise. +After this first result +the function returns a string plus a number, +as follows: +@description{ + +@item{@St{exit}| +the command terminated normally; +the following number is the exit status of the command. +} + +@item{@St{signal}| +the command was terminated by a signal; +the following number is the signal that terminated the command. +} + +} + +When called without a @id{command}, +@id{os.execute} returns a boolean that is true if a shell is available. + +} + +@LibEntry{os.exit ([code [, close]])| + +Calls the @ANSI{exit} to terminate the host program. +If @id{code} is @Rw{true}, +the returned status is @idx{EXIT_SUCCESS}; +if @id{code} is @Rw{false}, +the returned status is @idx{EXIT_FAILURE}; +if @id{code} is a number, +the returned status is this number. +The default value for @id{code} is @Rw{true}. + +If the optional second argument @id{close} is true, +closes the Lua state before exiting. + +} + +@LibEntry{os.getenv (varname)| + +Returns the value of the process environment variable @id{varname}, +or @nil if the variable is not defined. + +} + +@LibEntry{os.remove (filename)| + +Deletes the file (or empty directory, on @x{POSIX} systems) +with the given name. +If this function fails, it returns @nil, +plus a string describing the error and the error code. +Otherwise, it returns true. + +} + +@LibEntry{os.rename (oldname, newname)| + +Renames the file or directory named @id{oldname} to @id{newname}. +If this function fails, it returns @nil, +plus a string describing the error and the error code. +Otherwise, it returns true. + +} + +@LibEntry{os.setlocale (locale [, category])| + +Sets the current locale of the program. +@id{locale} is a system-dependent string specifying a locale; +@id{category} is an optional string describing which category to change: +@T{"all"}, @T{"collate"}, @T{"ctype"}, +@T{"monetary"}, @T{"numeric"}, or @T{"time"}; +the default category is @T{"all"}. +The function returns the name of the new locale, +or @nil if the request cannot be honored. + +If @id{locale} is the empty string, +the current locale is set to an implementation-defined native locale. +If @id{locale} is the string @St{C}, +the current locale is set to the standard C locale. + +When called with @nil as the first argument, +this function only returns the name of the current locale +for the given category. + +This function may be not @x{thread safe} +because of its reliance on @CId{setlocale}. + +} + +@LibEntry{os.time ([table])| + +Returns the current time when called without arguments, +or a time representing the local date and time specified by the given table. +This table must have fields @id{year}, @id{month}, and @id{day}, +and may have fields +@id{hour} (default is 12), +@id{min} (default is 0), +@id{sec} (default is 0), +and @id{isdst} (default is @nil). +Other fields are ignored. +For a description of these fields, see the @Lid{os.date} function. + +When the function is called, +the values in these fields do not need to be inside their valid ranges. +For instance, if @id{sec} is -10, +it means 10 seconds before the time specified by the other fields; +if @id{hour} is 1000, +it means 1000 hours after the time specified by the other fields. + +The returned value is a number, whose meaning depends on your system. +In @x{POSIX}, @x{Windows}, and some other systems, +this number counts the number +of seconds since some given start time (the @Q{epoch}). +In other systems, the meaning is not specified, +and the number returned by @id{time} can be used only as an argument to +@Lid{os.date} and @Lid{os.difftime}. + +When called with a table, +@id{os.time} also normalizes all the fields +documented in the @Lid{os.date} function, +so that they represent the same time as before the call +but with values inside their valid ranges. + +} + +@LibEntry{os.tmpname ()| + +Returns a string with a file name that can +be used for a temporary file. +The file must be explicitly opened before its use +and explicitly removed when no longer needed. + +In @x{POSIX} systems, +this function also creates a file with that name, +to avoid security risks. +(Someone else might create the file with wrong permissions +in the time between getting the name and creating the file.) +You still have to open the file to use it +and to remove it (even if you do not use it). + +When possible, +you may prefer to use @Lid{io.tmpfile}, +which automatically removes the file when the program ends. + +} + +} + +@sect2{debuglib| @title{The Debug Library} + +This library provides +the functionality of the @link{debugI|debug interface} to Lua programs. +You should exert care when using this library. +Several of its functions +violate basic assumptions about Lua code +(e.g., that variables local to a function +cannot be accessed from outside; +that userdata metatables cannot be changed by Lua code; +that Lua programs do not crash) +and therefore can compromise otherwise secure code. +Moreover, some functions in this library may be slow. + +All functions in this library are provided +inside the @defid{debug} table. +All functions that operate over a thread +have an optional first argument which is the +thread to operate over. +The default is always the current thread. + + +@LibEntry{debug.debug ()| + +Enters an interactive mode with the user, +running each string that the user enters. +Using simple commands and other debug facilities, +the user can inspect global and local variables, +change their values, evaluate expressions, and so on. +A line containing only the word @id{cont} finishes this function, +so that the caller continues its execution. + +Note that commands for @id{debug.debug} are not lexically nested +within any function and so have no direct access to local variables. + +} + +@LibEntry{debug.gethook ([thread])| + +Returns the current hook settings of the thread, as three values: +the current hook function, the current hook mask, +and the current hook count +(as set by the @Lid{debug.sethook} function). + +} + +@LibEntry{debug.getinfo ([thread,] f [, what])| + +Returns a table with information about a function. +You can give the function directly +or you can give a number as the value of @id{f}, +which means the function running at level @id{f} of the call stack +of the given thread: +@N{level 0} is the current function (@id{getinfo} itself); +@N{level 1} is the function that called @id{getinfo} +(except for tail calls, which do not count on the stack); +and so on. +If @id{f} is a number larger than the number of active functions, +then @id{getinfo} returns @nil. + +The returned table can contain all the fields returned by @Lid{lua_getinfo}, +with the string @id{what} describing which fields to fill in. +The default for @id{what} is to get all information available, +except the table of valid lines. +If present, +the option @Char{f} +adds a field named @id{func} with the function itself. +If present, +the option @Char{L} +adds a field named @id{activelines} with the table of +valid lines. + +For instance, the expression @T{debug.getinfo(1,"n").name} returns +a name for the current function, +if a reasonable name can be found, +and the expression @T{debug.getinfo(print)} +returns a table with all available information +about the @Lid{print} function. + +} + +@LibEntry{debug.getlocal ([thread,] f, local)| + +This function returns the name and the value of the local variable +with index @id{local} of the function at level @id{f} of the stack. +This function accesses not only explicit local variables, +but also parameters, temporaries, etc. + +The first parameter or local variable has @N{index 1}, and so on, +following the order that they are declared in the code, +counting only the variables that are active +in the current scope of the function. +Negative indices refer to vararg arguments; +@num{-1} is the first vararg argument. +The function returns @nil if there is no variable with the given index, +and raises an error when called with a level out of range. +(You can call @Lid{debug.getinfo} to check whether the level is valid.) + +Variable names starting with @Char{(} (open parenthesis) @C{)} +represent variables with no known names +(internal variables such as loop control variables, +and variables from chunks saved without debug information). + +The parameter @id{f} may also be a function. +In that case, @id{getlocal} returns only the name of function parameters. + +} + +@LibEntry{debug.getmetatable (value)| + +Returns the metatable of the given @id{value} +or @nil if it does not have a metatable. + +} + +@LibEntry{debug.getregistry ()| + +Returns the registry table @see{registry}. + +} + +@LibEntry{debug.getupvalue (f, up)| + +This function returns the name and the value of the upvalue +with index @id{up} of the function @id{f}. +The function returns @nil if there is no upvalue with the given index. + +Variable names starting with @Char{(} (open parenthesis) @C{)} +represent variables with no known names +(variables from chunks saved without debug information). + +} + +@LibEntry{debug.getuservalue (u, n)| + +Returns the @id{n}-th user value associated +to the userdata @id{u} plus a boolean, +@false if the userdata does not have that value. + +} + +@LibEntry{debug.sethook ([thread,] hook, mask [, count])| + +Sets the given function as a hook. +The string @id{mask} and the number @id{count} describe +when the hook will be called. +The string mask may have any combination of the following characters, +with the given meaning: +@description{ +@item{@Char{c}| the hook is called every time Lua calls a function;} +@item{@Char{r}| the hook is called every time Lua returns from a function;} +@item{@Char{l}| the hook is called every time Lua enters a new line of code.} +} +Moreover, +with a @id{count} different from zero, +the hook is called also after every @id{count} instructions. + +When called without arguments, +@Lid{debug.sethook} turns off the hook. + +When the hook is called, its first parameter is a string +describing the event that has triggered its call: +@T{"call"} (or @T{"tail call"}), +@T{"return"}, +@T{"line"}, and @T{"count"}. +For line events, +the hook also gets the new line number as its second parameter. +Inside a hook, +you can call @id{getinfo} with @N{level 2} to get more information about +the running function +(@N{level 0} is the @id{getinfo} function, +and @N{level 1} is the hook function). + +} + +@LibEntry{debug.setlocal ([thread,] level, local, value)| + +This function assigns the value @id{value} to the local variable +with index @id{local} of the function at level @id{level} of the stack. +The function returns @nil if there is no local +variable with the given index, +and raises an error when called with a @id{level} out of range. +(You can call @id{getinfo} to check whether the level is valid.) +Otherwise, it returns the name of the local variable. + +See @Lid{debug.getlocal} for more information about +variable indices and names. + +} + +@LibEntry{debug.setmetatable (value, table)| + +Sets the metatable for the given @id{value} to the given @id{table} +(which can be @nil). +Returns @id{value}. + +} + +@LibEntry{debug.setupvalue (f, up, value)| + +This function assigns the value @id{value} to the upvalue +with index @id{up} of the function @id{f}. +The function returns @nil if there is no upvalue +with the given index. +Otherwise, it returns the name of the upvalue. + +} + +@LibEntry{debug.setuservalue (udata, value, n)| + +Sets the given @id{value} as +the @id{n}-th user value associated to the given @id{udata}. +@id{udata} must be a full userdata. + +Returns @id{udata}, +or @nil if the userdata does not have that value. + +} + +@LibEntry{debug.traceback ([thread,] [message [, level]])| + +If @id{message} is present but is neither a string nor @nil, +this function returns @id{message} without further processing. +Otherwise, +it returns a string with a traceback of the call stack. +The optional @id{message} string is appended +at the beginning of the traceback. +An optional @id{level} number tells at which level +to start the traceback +(default is 1, the function calling @id{traceback}). + +} + +@LibEntry{debug.upvalueid (f, n)| + +Returns a unique identifier (as a light userdata) +for the upvalue numbered @id{n} +from the given function. + +These unique identifiers allow a program to check whether different +closures share upvalues. +Lua closures that share an upvalue +(that is, that access a same external local variable) +will return identical ids for those upvalue indices. + +} + +@LibEntry{debug.upvaluejoin (f1, n1, f2, n2)| + +Make the @id{n1}-th upvalue of the Lua closure @id{f1} +refer to the @id{n2}-th upvalue of the Lua closure @id{f2}. + +} + +} + +} + + +@C{-------------------------------------------------------------------------} +@sect1{lua-sa| @title{Lua Standalone} + +Although Lua has been designed as an extension language, +to be embedded in a host @N{C program}, +it is also frequently used as a standalone language. +An interpreter for Lua as a standalone language, +called simply @id{lua}, +is provided with the standard distribution. +The @x{standalone interpreter} includes +all standard libraries, including the debug library. +Its usage is: +@verbatim{ +lua [options] [script [args]] +} +The options are: +@description{ +@item{@T{-e @rep{stat}}| executes string @rep{stat};} +@item{@T{-l @rep{mod}}| @Q{requires} @rep{mod} and assigns the + result to global @rep{mod};} +@item{@T{-i}| enters interactive mode after running @rep{script};} +@item{@T{-v}| prints version information;} +@item{@T{-E}| ignores environment variables;} +@item{@T{--}| stops handling options;} +@item{@T{-}| executes @id{stdin} as a file and stops handling options.} +} +After handling its options, @id{lua} runs the given @emph{script}. +When called without arguments, +@id{lua} behaves as @T{lua -v -i} +when the standard input (@id{stdin}) is a terminal, +and as @T{lua -} otherwise. + +When called without option @T{-E}, +the interpreter checks for an environment variable @defid{LUA_INIT_5_4} +(or @defid{LUA_INIT} if the versioned name is not defined) +before running any argument. +If the variable content has the format @T{@At@rep{filename}}, +then @id{lua} executes the file. +Otherwise, @id{lua} executes the string itself. + +When called with option @T{-E}, +besides ignoring @id{LUA_INIT}, +Lua also ignores +the values of @id{LUA_PATH} and @id{LUA_CPATH}, +setting the values of +@Lid{package.path} and @Lid{package.cpath} +with the default paths defined in @id{luaconf.h}. + +All options are handled in order, except @T{-i} and @T{-E}. +For instance, an invocation like +@verbatim{ +$ lua -e'a=1' -e 'print(a)' script.lua +} +will first set @id{a} to 1, then print the value of @id{a}, +and finally run the file @id{script.lua} with no arguments. +(Here @T{$} is the shell prompt. Your prompt may be different.) + +Before running any code, +@id{lua} collects all command-line arguments +in a global table called @id{arg}. +The script name goes to index 0, +the first argument after the script name goes to index 1, +and so on. +Any arguments before the script name +(that is, the interpreter name plus its options) +go to negative indices. +For instance, in the call +@verbatim{ +$ lua -la b.lua t1 t2 +} +the table is like this: +@verbatim{ +arg = { [-2] = "lua", [-1] = "-la", + [0] = "b.lua", + [1] = "t1", [2] = "t2" } +} +If there is no script in the call, +the interpreter name goes to index 0, +followed by the other arguments. +For instance, the call +@verbatim{ +$ lua -e "print(arg[1])" +} +will print @St{-e}. +If there is a script, +the script is called with arguments +@T{arg[1]}, @Cdots, @T{arg[#arg]}. +(Like all chunks in Lua, +the script is compiled as a vararg function.) + +In interactive mode, +Lua repeatedly prompts and waits for a line. +After reading a line, +Lua first try to interpret the line as an expression. +If it succeeds, it prints its value. +Otherwise, it interprets the line as a statement. +If you write an incomplete statement, +the interpreter waits for its completion +by issuing a different prompt. + +If the global variable @defid{_PROMPT} contains a string, +then its value is used as the prompt. +Similarly, if the global variable @defid{_PROMPT2} contains a string, +its value is used as the secondary prompt +(issued during incomplete statements). + +In case of unprotected errors in the script, +the interpreter reports the error to the standard error stream. +If the error object is not a string but +has a metamethod @idx{__tostring}, +the interpreter calls this metamethod to produce the final message. +Otherwise, the interpreter converts the error object to a string +and adds a stack traceback to it. + +When finishing normally, +the interpreter closes its main Lua state +@seeF{lua_close}. +The script can avoid this step by +calling @Lid{os.exit} to terminate. + +To allow the use of Lua as a +script interpreter in Unix systems, +the standalone interpreter skips +the first line of a chunk if it starts with @T{#}. +Therefore, Lua scripts can be made into executable programs +by using @T{chmod +x} and @N{the @T{#!}} form, +as in +@verbatim{ +#!/usr/local/bin/lua +} +(Of course, +the location of the Lua interpreter may be different in your machine. +If @id{lua} is in your @id{PATH}, +then +@verbatim{ +#!/usr/bin/env lua +} +is a more portable solution.) + +} + + +@sect1{incompat| @title{Incompatibilities with the Previous Version} + +Here we list the incompatibilities that you may find when moving a program +from @N{Lua 5.3} to @N{Lua 5.4}. +You can avoid some incompatibilities by compiling Lua with +appropriate options (see file @id{luaconf.h}). +However, +all these compatibility options will be removed in the future. + +Lua versions can always change the C API in ways that +do not imply source-code changes in a program, +such as the numeric values for constants +or the implementation of functions as macros. +Therefore, +you should not assume that binaries are compatible between +different Lua versions. +Always recompile clients of the Lua API when +using a new version. + +Similarly, Lua versions can always change the internal representation +of precompiled chunks; +precompiled chunks are not compatible between different Lua versions. + +The standard paths in the official distribution may +change between versions. + +@sect2{@title{Changes in the Language} +@itemize{ + +@item{ +The coercion of strings to numbers in +arithmetic and bitwise operations +has been removed from the core language. +The string library does a similar job +for arithmetic (but not for bitwise) operations +using the string metamethods. +However, unlike in previous versions, +the new implementation preserves the implicit type of the numeral +in the string. +For instance, the result of @T{"1" + "2"} now is an integer, +not a float. +} + +@item{ +The use of the @idx{__lt} metamethod to emulate @id{__le} +has been removed. +When needed, this metamethod must be explicitly defined. +} + +@item{ +When a coroutine finishes with an error, +its stack is unwound (to run any pending closing methods). +} + +@item{ +A label for a @Rw{goto} cannot be declared where a label with the same +name is visible, even if this other label is declared in an enclosing +block. +} + +@item{ +When finalizing an object, +Lua does not ignore @idx{__gc} metamethods that are not functions. +Any value will be called, if present. +(Non-callable values will generate a warning, +like any other error when calling a finalizer.) +} + +} + +} + +@sect2{@title{Changes in the Libraries} +@itemize{ + +@item{ +The pseudo-random number generator used by the function @Lid{math.random} +now starts with a somewhat random seed. +Moreover, it uses a different algorithm. +} + +@item{ +The function @Lid{io.lines} now returns three extra values, +besides the iterator function. +You can enclose the call in parentheses if you need to +discard these extra results. +} + +@item{ +By default, the decoding functions in the @Lid{utf8} library +do not accept surrogates as valid code points. +An extra parameter in these functions makes them more permissive. +} + +} + +} + +@sect2{@title{Changes in the API} + +@itemize{ + +@item{ +Full userdata now has an arbitrary number of associated user values. +Therefore, the functions @id{lua_newuserdata}, +@id{lua_setuservalue}, and @id{lua_getuservalue} were +replaced by @Lid{lua_newuserdatauv}, +@Lid{lua_setiuservalue}, and @Lid{lua_getiuservalue}, +which have an extra argument. + +For compatibility, the old names still work as macros assuming +one single user value. +Note, however, that the call @T{lua_newuserdatauv(L,size,0)} +produces a smaller userdata. +} + +@item{ +The function @Lid{lua_resume} has an extra parameter. +This out parameter returns the number of values on +the top of the stack that were yielded or returned by the coroutine. +(In previous versions, +those values were the entire stack.) +} + +@item{ +The function @Lid{lua_version} returns the version number, +instead of an address of the version number. +(The Lua core should work correctly with libraries using their +own static copies of the same core, +so there is no need to check whether they are using the same +address space.) +} + +@item{ +The constant @id{LUA_ERRGCMM} was removed. +Errors in finalizers are never propagated; +instead, they generate a warning. +} + +} + +} + +} + + +@C{[===============================================================} + +@sect1{BNF| @title{The Complete Syntax of Lua} + +Here is the complete syntax of Lua in extended BNF. +As usual in extended BNF, +@bnfNter{{A}} means 0 or more @bnfNter{A}s, +and @bnfNter{[A]} means an optional @bnfNter{A}. +(For operator precedences, see @See{prec}; +for a description of the terminals +@bnfNter{Name}, @bnfNter{Numeral}, +and @bnfNter{LiteralString}, see @See{lexical}.) +@index{grammar} + +@Produc{ + +@producname{chunk}@producbody{block} + +@producname{block}@producbody{@bnfrep{stat} @bnfopt{retstat}} + +@producname{stat}@producbody{ + @bnfter{;} +@OrNL varlist @bnfter{=} explist +@OrNL functioncall +@OrNL label +@OrNL @Rw{break} +@OrNL @Rw{goto} Name +@OrNL @Rw{do} block @Rw{end} +@OrNL @Rw{while} exp @Rw{do} block @Rw{end} +@OrNL @Rw{repeat} block @Rw{until} exp +@OrNL @Rw{if} exp @Rw{then} block + @bnfrep{@Rw{elseif} exp @Rw{then} block} + @bnfopt{@Rw{else} block} @Rw{end} +@OrNL @Rw{for} @bnfNter{Name} @bnfter{=} exp @bnfter{,} exp @bnfopt{@bnfter{,} exp} + @Rw{do} block @Rw{end} +@OrNL @Rw{for} namelist @Rw{in} explist @Rw{do} block @Rw{end} +@OrNL @Rw{function} funcname funcbody +@OrNL @Rw{local} @Rw{function} @bnfNter{Name} funcbody +@OrNL @Rw{local} namelist @bnfopt{@bnfter{=} explist} +@OrNL @Rw{local} @bnfter{*} @bnfter{toclose} Name @bnfter{=} exp +} + +@producname{retstat}@producbody{@Rw{return} + @bnfopt{explist} @bnfopt{@bnfter{;}}} + +@producname{label}@producbody{@bnfter{::} Name @bnfter{::}} + +@producname{funcname}@producbody{@bnfNter{Name} @bnfrep{@bnfter{.} @bnfNter{Name}} + @bnfopt{@bnfter{:} @bnfNter{Name}}} + +@producname{varlist}@producbody{var @bnfrep{@bnfter{,} var}} + +@producname{var}@producbody{ + @bnfNter{Name} +@Or prefixexp @bnfter{[} exp @bnfter{]} +@Or prefixexp @bnfter{.} @bnfNter{Name} +} + +@producname{namelist}@producbody{@bnfNter{Name} @bnfrep{@bnfter{,} @bnfNter{Name}}} + + +@producname{explist}@producbody{exp @bnfrep{@bnfter{,} exp}} + +@producname{exp}@producbody{ + @Rw{nil} +@Or @Rw{false} +@Or @Rw{true} +@Or @bnfNter{Numeral} +@Or @bnfNter{LiteralString} +@Or @bnfter{...} +@Or functiondef +@OrNL prefixexp +@Or tableconstructor +@Or exp binop exp +@Or unop exp +} + +@producname{prefixexp}@producbody{var @Or functioncall @Or @bnfter{(} exp @bnfter{)}} + +@producname{functioncall}@producbody{ + prefixexp args +@Or prefixexp @bnfter{:} @bnfNter{Name} args +} + +@producname{args}@producbody{ + @bnfter{(} @bnfopt{explist} @bnfter{)} +@Or tableconstructor +@Or @bnfNter{LiteralString} +} + +@producname{functiondef}@producbody{@Rw{function} funcbody} + +@producname{funcbody}@producbody{@bnfter{(} @bnfopt{parlist} @bnfter{)} block @Rw{end}} + +@producname{parlist}@producbody{namelist @bnfopt{@bnfter{,} @bnfter{...}} + @Or @bnfter{...}} + +@producname{tableconstructor}@producbody{@bnfter{@Open} @bnfopt{fieldlist} @bnfter{@Close}} + +@producname{fieldlist}@producbody{field @bnfrep{fieldsep field} @bnfopt{fieldsep}} + +@producname{field}@producbody{@bnfter{[} exp @bnfter{]} @bnfter{=} exp @Or @bnfNter{Name} @bnfter{=} exp @Or exp} + +@producname{fieldsep}@producbody{@bnfter{,} @Or @bnfter{;}} + +@producname{binop}@producbody{ + @bnfter{+} @Or @bnfter{-} @Or @bnfter{*} @Or @bnfter{/} @Or @bnfter{//} + @Or @bnfter{^} @Or @bnfter{%} + @OrNL + @bnfter{&} @Or @bnfter{~} @Or @bnfter{|} @Or @bnfter{>>} @Or @bnfter{<<} + @Or @bnfter{..} + @OrNL + @bnfter{<} @Or @bnfter{<=} @Or @bnfter{>} @Or @bnfter{>=} + @Or @bnfter{==} @Or @bnfter{~=} + @OrNL + @Rw{and} @Or @Rw{or}} + +@producname{unop}@producbody{@bnfter{-} @Or @Rw{not} @Or @bnfter{#} @Or + @bnfter{~}} + +} + +} + +@C{]===============================================================} + +} +@C{)]-------------------------------------------------------------------------} diff --git a/source/lua/testes/all.lua b/source/lua/testes/all.lua new file mode 100644 index 0000000..8d727b6 --- /dev/null +++ b/source/lua/testes/all.lua @@ -0,0 +1,299 @@ +#!../lua +-- $Id: testes/all.lua $ +-- See Copyright Notice at the end of this file + + +local version = "Lua 5.4" +if _VERSION ~= version then + warn(string.format( + "This test suite is for %s, not for %s\nExiting tests", version, _VERSION)) + return +end + + +_G.ARG = arg -- save arg for other tests + + +-- next variables control the execution of some tests +-- true means no test (so an undefined variable does not skip a test) +-- defaults are for Linux; test everything. +-- Make true to avoid long or memory consuming tests +_soft = rawget(_G, "_soft") or false +-- Make true to avoid non-portable tests +_port = rawget(_G, "_port") or false +-- Make true to avoid messages about tests not performed +_nomsg = rawget(_G, "_nomsg") or false + + +local usertests = rawget(_G, "_U") + +if usertests then + -- tests for sissies ;) Avoid problems + _soft = true + _port = true + _nomsg = true +end + +-- tests should require debug when needed +debug = nil + +require"bwcoercion" + + +if usertests then + T = nil -- no "internal" tests for user tests +else + T = rawget(_G, "T") -- avoid problems with 'strict' module +end + +math.randomseed(0) + +--[=[ + example of a long [comment], + [[spanning several [lines]]] + +]=] + +print("current path:\n****" .. package.path .. "****\n") + + +local initclock = os.clock() +local lastclock = initclock +local walltime = os.time() + +local collectgarbage = collectgarbage + +do -- ( + +-- track messages for tests not performed +local msgs = {} +function Message (m) + if not _nomsg then + print(m) + msgs[#msgs+1] = string.sub(m, 3, -3) + end +end + +assert(os.setlocale"C") + +local T,print,format,write,assert,type,unpack,floor = + T,print,string.format,io.write,assert,type,table.unpack,math.floor + +-- use K for 1000 and M for 1000000 (not 2^10 -- 2^20) +local function F (m) + local function round (m) + m = m + 0.04999 + return format("%.1f", m) -- keep one decimal digit + end + if m < 1000 then return m + else + m = m / 1000 + if m < 1000 then return round(m).."K" + else + return round(m/1000).."M" + end + end +end + +local showmem +if not T then + local max = 0 + showmem = function () + local m = collectgarbage("count") * 1024 + max = (m > max) and m or max + print(format(" ---- total memory: %s, max memory: %s ----\n", + F(m), F(max))) + end +else + showmem = function () + T.checkmemory() + local total, numblocks, maxmem = T.totalmem() + local count = collectgarbage("count") + print(format( + "\n ---- total memory: %s (%.0fK), max use: %s, blocks: %d\n", + F(total), count, F(maxmem), numblocks)) + print(format("\t(strings: %d, tables: %d, functions: %d, ".. + "\n\tudata: %d, threads: %d)", + T.totalmem"string", T.totalmem"table", T.totalmem"function", + T.totalmem"userdata", T.totalmem"thread")) + end +end + + +-- +-- redefine dofile to run files through dump/undump +-- +local function report (n) print("\n***** FILE '"..n.."'*****") end +local olddofile = dofile +local dofile = function (n, strip) + showmem() + local c = os.clock() + print(string.format("time: %g (+%g)", c - initclock, c - lastclock)) + lastclock = c + report(n) + local f = assert(loadfile(n)) + local b = string.dump(f, strip) + f = assert(load(b)) + return f() +end + +dofile('main.lua') + +do + local next, setmetatable, stderr = next, setmetatable, io.stderr + -- track collections + local mt = {} + -- each time a table is collected, remark it for finalization + -- on next cycle + mt.__gc = function (o) + stderr:write'.' -- mark progress + local n = setmetatable(o, mt) -- remark it + end + local n = setmetatable({}, mt) -- create object +end + +report"gc.lua" +local f = assert(loadfile('gc.lua')) +f() + +dofile('db.lua') +assert(dofile('calls.lua') == deep and deep) +olddofile('strings.lua') +olddofile('literals.lua') +dofile('tpack.lua') +assert(dofile('attrib.lua') == 27) +dofile('gengc.lua') +assert(dofile('locals.lua') == 5) +dofile('constructs.lua') +dofile('code.lua', true) +if not _G._soft then + report('big.lua') + local f = coroutine.wrap(assert(loadfile('big.lua'))) + assert(f() == 'b') + assert(f() == 'a') +end +dofile('cstack.lua') +dofile('nextvar.lua') +dofile('pm.lua') +dofile('utf8.lua') +dofile('api.lua') +assert(dofile('events.lua') == 12) +dofile('vararg.lua') +dofile('closure.lua') +dofile('coroutine.lua') +dofile('goto.lua', true) +dofile('errors.lua') +dofile('math.lua') +dofile('sort.lua', true) +dofile('bitwise.lua') +assert(dofile('verybig.lua', true) == 10); collectgarbage() +dofile('files.lua') + +if #msgs > 0 then + warn("#tests not performed:", true) + for i=1,#msgs do + warn("\n ", true); warn(msgs[i], true) + end + warn("\n") +end + +print("(there should be two warnings now)") +warn("#This is ", true); warn("an expected", true); warn(" warning") +warn("#This is", true); warn(" another one") + +-- no test module should define 'debug' +assert(debug == nil) + +local debug = require "debug" + +print(string.format("%d-bit integers, %d-bit floats", + string.packsize("j") * 8, string.packsize("n") * 8)) + +debug.sethook(function (a) assert(type(a) == 'string') end, "cr") + +-- to survive outside block +_G.showmem = showmem + +end --) + +local _G, showmem, print, format, clock, time, difftime, assert, open = + _G, showmem, print, string.format, os.clock, os.time, os.difftime, + assert, io.open + +-- file with time of last performed test +local fname = T and "time-debug.txt" or "time.txt" +local lasttime + +if not usertests then + -- open file with time of last performed test + local f = io.open(fname) + if f then + lasttime = assert(tonumber(f:read'a')) + f:close(); + else -- no such file; assume it is recording time for first time + lasttime = nil + end +end + +-- erase (almost) all globals +print('cleaning all!!!!') +for n in pairs(_G) do + if not ({___Glob = 1, tostring = 1})[n] then + _G[n] = undef + end +end + + +collectgarbage() +collectgarbage() +collectgarbage() +collectgarbage() +collectgarbage() +collectgarbage();showmem() + +local clocktime = clock() - initclock +walltime = difftime(time(), walltime) + +print(format("\n\ntotal time: %.2fs (wall time: %gs)\n", clocktime, walltime)) + +if not usertests then + lasttime = lasttime or clocktime -- if no last time, ignore difference + -- check whether current test time differs more than 5% from last time + local diff = (clocktime - lasttime) / lasttime + local tolerance = 0.05 -- 5% + if (diff >= tolerance or diff <= -tolerance) then + print(format("WARNING: time difference from previous test: %+.1f%%", + diff * 100)) + end + assert(open(fname, "w")):write(clocktime):close() +end + +print("final OK !!!") + + + +--[[ +***************************************************************************** +* Copyright (C) 1994-2016 Lua.org, PUC-Rio. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +***************************************************************************** +]] + diff --git a/source/lua/testes/api.lua b/source/lua/testes/api.lua new file mode 100644 index 0000000..08672e8 --- /dev/null +++ b/source/lua/testes/api.lua @@ -0,0 +1,1382 @@ +-- $Id: testes/api.lua $ +-- See Copyright Notice in file all.lua + +if T==nil then + (Message or print)('\n >>> testC not active: skipping API tests <<<\n') + return +end + +local debug = require "debug" + +local pack = table.pack + + +function tcheck (t1, t2) + assert(t1.n == (t2.n or #t2) + 1) + for i = 2, t1.n do assert(t1[i] == t2[i - 1]) end +end + + +local function checkerr (msg, f, ...) + local stat, err = pcall(f, ...) + assert(not stat and string.find(err, msg)) +end + + +print('testing C API') + +a = T.testC("pushvalue R; return 1") +assert(a == debug.getregistry()) + + +-- absindex +assert(T.testC("settop 10; absindex -1; return 1") == 10) +assert(T.testC("settop 5; absindex -5; return 1") == 1) +assert(T.testC("settop 10; absindex 1; return 1") == 1) +assert(T.testC("settop 10; absindex R; return 1") < -10) + +-- testing alignment +a = T.d2s(12458954321123.0) +assert(a == string.pack("d", 12458954321123.0)) +assert(T.s2d(a) == 12458954321123.0) + +a,b,c = T.testC("pushnum 1; pushnum 2; pushnum 3; return 2") +assert(a == 2 and b == 3 and not c) + +f = T.makeCfunc("pushnum 1; pushnum 2; pushnum 3; return 2") +a,b,c = f() +assert(a == 2 and b == 3 and not c) + +-- test that all trues are equal +a,b,c = T.testC("pushbool 1; pushbool 2; pushbool 0; return 3") +assert(a == b and a == true and c == false) +a,b,c = T.testC"pushbool 0; pushbool 10; pushnil;\ + tobool -3; tobool -3; tobool -3; return 3" +assert(a==false and b==true and c==false) + + +a,b,c = T.testC("gettop; return 2", 10, 20, 30, 40) +assert(a == 40 and b == 5 and not c) + +t = pack(T.testC("settop 5; return *", 2, 3)) +tcheck(t, {n=4,2,3}) + +t = pack(T.testC("settop 0; settop 15; return 10", 3, 1, 23)) +assert(t.n == 10 and t[1] == nil and t[10] == nil) + +t = pack(T.testC("remove -2; return *", 2, 3, 4)) +tcheck(t, {n=2,2,4}) + +t = pack(T.testC("insert -1; return *", 2, 3)) +tcheck(t, {n=2,2,3}) + +t = pack(T.testC("insert 3; return *", 2, 3, 4, 5)) +tcheck(t, {n=4,2,5,3,4}) + +t = pack(T.testC("replace 2; return *", 2, 3, 4, 5)) +tcheck(t, {n=3,5,3,4}) + +t = pack(T.testC("replace -2; return *", 2, 3, 4, 5)) +tcheck(t, {n=3,2,3,5}) + +t = pack(T.testC("remove 3; return *", 2, 3, 4, 5)) +tcheck(t, {n=3,2,4,5}) + +t = pack(T.testC("copy 3 4; return *", 2, 3, 4, 5)) +tcheck(t, {n=4,2,3,3,5}) + +t = pack(T.testC("copy -3 -1; return *", 2, 3, 4, 5)) +tcheck(t, {n=4,2,3,4,3}) + +do -- testing 'rotate' + local t = {10, 20, 30, 40, 50, 60} + for i = -6, 6 do + local s = string.format("rotate 2 %d; return 7", i) + local t1 = pack(T.testC(s, 10, 20, 30, 40, 50, 60)) + tcheck(t1, t) + table.insert(t, 1, table.remove(t)) + end + + t = pack(T.testC("rotate -2 1; return *", 10, 20, 30, 40)) + tcheck(t, {10, 20, 40, 30}) + t = pack(T.testC("rotate -2 -1; return *", 10, 20, 30, 40)) + tcheck(t, {10, 20, 40, 30}) + + -- some corner cases + t = pack(T.testC("rotate -1 0; return *", 10, 20, 30, 40)) + tcheck(t, {10, 20, 30, 40}) + t = pack(T.testC("rotate -1 1; return *", 10, 20, 30, 40)) + tcheck(t, {10, 20, 30, 40}) + t = pack(T.testC("rotate 5 -1; return *", 10, 20, 30, 40)) + tcheck(t, {10, 20, 30, 40}) +end + + +-- testing warnings +T.testC([[ + warningC "#This shold be a" + warningC " single " + warning "warning" + warningC "#This should be " + warning "another one" +]]) + + +-- testing message handlers +do + local f = T.makeCfunc[[ + getglobal error + pushstring bola + pcall 1 1 1 # call 'error' with given handler + pushstatus + return 2 # return error message and status + ]] + + local msg, st = f(string.upper) -- function handler + assert(st == "ERRRUN" and msg == "BOLA") + local msg, st = f(string.len) -- function handler + assert(st == "ERRRUN" and msg == 4) + +end + +t = pack(T.testC("insert 3; pushvalue 3; remove 3; pushvalue 2; remove 2; \ + insert 2; pushvalue 1; remove 1; insert 1; \ + insert -2; pushvalue -2; remove -3; return *", + 2, 3, 4, 5, 10, 40, 90)) +tcheck(t, {n=7,2,3,4,5,10,40,90}) + +t = pack(T.testC("concat 5; return *", "alo", 2, 3, "joao", 12)) +tcheck(t, {n=1,"alo23joao12"}) + +-- testing MULTRET +t = pack(T.testC("call 2,-1; return *", + function (a,b) return 1,2,3,4,a,b end, "alo", "joao")) +tcheck(t, {n=6,1,2,3,4,"alo", "joao"}) + +do -- test returning more results than fit in the caller stack + local a = {} + for i=1,1000 do a[i] = true end; a[999] = 10 + local b = T.testC([[pcall 1 -1 0; pop 1; tostring -1; return 1]], + table.unpack, a) + assert(b == "10") +end + + +-- testing globals +_G.a = 14; _G.b = "a31" +local a = {T.testC[[ + getglobal a; + getglobal b; + getglobal b; + setglobal a; + return * +]]} +assert(a[2] == 14 and a[3] == "a31" and a[4] == nil and _G.a == "a31") + + +-- testing arith +assert(T.testC("pushnum 10; pushnum 20; arith /; return 1") == 0.5) +assert(T.testC("pushnum 10; pushnum 20; arith -; return 1") == -10) +assert(T.testC("pushnum 10; pushnum -20; arith *; return 1") == -200) +assert(T.testC("pushnum 10; pushnum 3; arith ^; return 1") == 1000) +assert(T.testC("pushnum 10; pushstring 20; arith /; return 1") == 0.5) +assert(T.testC("pushstring 10; pushnum 20; arith -; return 1") == -10) +assert(T.testC("pushstring 10; pushstring -20; arith *; return 1") == -200) +assert(T.testC("pushstring 10; pushstring 3; arith ^; return 1") == 1000) +assert(T.testC("arith /; return 1", 2, 0) == 10.0/0) +a = T.testC("pushnum 10; pushint 3; arith \\; return 1") +assert(a == 3.0 and math.type(a) == "float") +a = T.testC("pushint 10; pushint 3; arith \\; return 1") +assert(a == 3 and math.type(a) == "integer") +a = assert(T.testC("pushint 10; pushint 3; arith +; return 1")) +assert(a == 13 and math.type(a) == "integer") +a = assert(T.testC("pushnum 10; pushint 3; arith +; return 1")) +assert(a == 13 and math.type(a) == "float") +a,b,c = T.testC([[pushnum 1; + pushstring 10; arith _; + pushstring 5; return 3]]) +assert(a == 1 and b == -10 and c == "5") +mt = {__add = function (a,b) return setmetatable({a[1] + b[1]}, mt) end, + __mod = function (a,b) return setmetatable({a[1] % b[1]}, mt) end, + __unm = function (a) return setmetatable({a[1]* 2}, mt) end} +a,b,c = setmetatable({4}, mt), + setmetatable({8}, mt), + setmetatable({-3}, mt) +x,y,z = T.testC("arith +; return 2", 10, a, b) +assert(x == 10 and y[1] == 12 and z == nil) +assert(T.testC("arith %; return 1", a, c)[1] == 4%-3) +assert(T.testC("arith _; arith +; arith %; return 1", b, a, c)[1] == + 8 % (4 + (-3)*2)) + +-- errors in arithmetic +checkerr("divide by zero", T.testC, "arith \\", 10, 0) +checkerr("%%0", T.testC, "arith %", 10, 0) + + +-- testing lessthan and lessequal +assert(T.testC("compare LT 2 5, return 1", 3, 2, 2, 4, 2, 2)) +assert(T.testC("compare LE 2 5, return 1", 3, 2, 2, 4, 2, 2)) +assert(not T.testC("compare LT 3 4, return 1", 3, 2, 2, 4, 2, 2)) +assert(T.testC("compare LE 3 4, return 1", 3, 2, 2, 4, 2, 2)) +assert(T.testC("compare LT 5 2, return 1", 4, 2, 2, 3, 2, 2)) +assert(not T.testC("compare LT 2 -3, return 1", "4", "2", "2", "3", "2", "2")) +assert(not T.testC("compare LT -3 2, return 1", "3", "2", "2", "4", "2", "2")) + +-- non-valid indices produce false +assert(not T.testC("compare LT 1 4, return 1")) +assert(not T.testC("compare LE 9 1, return 1")) +assert(not T.testC("compare EQ 9 9, return 1")) + +local b = {__lt = function (a,b) return a[1] < b[1] end} +local a1,a3,a4 = setmetatable({1}, b), + setmetatable({3}, b), + setmetatable({4}, b) +assert(T.testC("compare LT 2 5, return 1", a3, 2, 2, a4, 2, 2)) +assert(T.testC("compare LE 2 5, return 1", a3, 2, 2, a4, 2, 2)) +assert(T.testC("compare LT 5 -6, return 1", a4, 2, 2, a3, 2, 2)) +a,b = T.testC("compare LT 5 -6, return 2", a1, 2, 2, a3, 2, 20) +assert(a == 20 and b == false) +a,b = T.testC("compare LE 5 -6, return 2", a1, 2, 2, a3, 2, 20) +assert(a == 20 and b == false) +a,b = T.testC("compare LE 5 -6, return 2", a1, 2, 2, a1, 2, 20) +assert(a == 20 and b == true) + +-- testing length +local t = setmetatable({x = 20}, {__len = function (t) return t.x end}) +a,b,c = T.testC([[ + len 2; + Llen 2; + objsize 2; + return 3 +]], t) +assert(a == 20 and b == 20 and c == 0) + +t.x = "234"; t[1] = 20 +a,b,c = T.testC([[ + len 2; + Llen 2; + objsize 2; + return 3 +]], t) +assert(a == "234" and b == 234 and c == 1) + +t.x = print; t[1] = 20 +a,c = T.testC([[ + len 2; + objsize 2; + return 2 +]], t) +assert(a == print and c == 1) + + +-- testing __concat + +a = setmetatable({x="u"}, {__concat = function (a,b) return a.x..'.'..b.x end}) +x,y = T.testC([[ + pushnum 5 + pushvalue 2; + pushvalue 2; + concat 2; + pushvalue -2; + return 2; +]], a, a) +assert(x == a..a and y == 5) + +-- concat with 0 elements +assert(T.testC("concat 0; return 1") == "") + +-- concat with 1 element +assert(T.testC("concat 1; return 1", "xuxu") == "xuxu") + + + +-- testing lua_is + +function B(x) return x and 1 or 0 end + +function count (x, n) + n = n or 2 + local prog = [[ + isnumber %d; + isstring %d; + isfunction %d; + iscfunction %d; + istable %d; + isuserdata %d; + isnil %d; + isnull %d; + return 8 + ]] + prog = string.format(prog, n, n, n, n, n, n, n, n) + local a,b,c,d,e,f,g,h = T.testC(prog, x) + return B(a)+B(b)+B(c)+B(d)+B(e)+B(f)+B(g)+(100*B(h)) +end + +assert(count(3) == 2) +assert(count('alo') == 1) +assert(count('32') == 2) +assert(count({}) == 1) +assert(count(print) == 2) +assert(count(function () end) == 1) +assert(count(nil) == 1) +assert(count(io.stdin) == 1) +assert(count(nil, 15) == 100) + + +-- testing lua_to... + +function to (s, x, n) + n = n or 2 + return T.testC(string.format("%s %d; return 1", s, n), x) +end + +local null = T.pushuserdata(0) +local hfunc = string.gmatch("", "") -- a "heavy C function" (with upvalues) +assert(debug.getupvalue(hfunc, 1)) +assert(to("tostring", {}) == nil) +assert(to("tostring", "alo") == "alo") +assert(to("tostring", 12) == "12") +assert(to("tostring", 12, 3) == nil) +assert(to("objsize", {}) == 0) +assert(to("objsize", {1,2,3}) == 3) +assert(to("objsize", "alo\0\0a") == 6) +assert(to("objsize", T.newuserdata(0)) == 0) +assert(to("objsize", T.newuserdata(101)) == 101) +assert(to("objsize", 124) == 0) +assert(to("objsize", true) == 0) +assert(to("tonumber", {}) == 0) +assert(to("tonumber", "12") == 12) +assert(to("tonumber", "s2") == 0) +assert(to("tonumber", 1, 20) == 0) +assert(to("topointer", 10) == null) +assert(to("topointer", true) == null) +assert(to("topointer", nil) == null) +assert(to("topointer", "abc") ~= null) +assert(to("topointer", string.rep("x", 10)) == + to("topointer", string.rep("x", 10))) -- short strings +assert(to("topointer", string.rep("x", 300)) ~= + to("topointer", string.rep("x", 300))) -- long strings +assert(to("topointer", T.pushuserdata(20)) ~= null) +assert(to("topointer", io.read) ~= null) -- light C function +assert(to("topointer", hfunc) ~= null) -- "heavy" C function +assert(to("topointer", function () end) ~= null) -- Lua function +assert(to("topointer", io.stdin) ~= null) -- full userdata +assert(to("func2num", 20) == 0) +assert(to("func2num", T.pushuserdata(10)) == 0) +assert(to("func2num", io.read) ~= 0) -- light C function +assert(to("func2num", hfunc) ~= 0) -- "heavy" C function (with upvalue) +a = to("tocfunction", math.deg) +assert(a(3) == math.deg(3) and a == math.deg) + + +print("testing panic function") +do + -- trivial error + assert(T.checkpanic("pushstring hi; error") == "hi") + + -- using the stack inside panic + assert(T.checkpanic("pushstring hi; error;", + [[checkstack 5 XX + pushstring ' alo' + pushstring ' mundo' + concat 3]]) == "hi alo mundo") + + -- "argerror" without frames + assert(T.checkpanic("loadstring 4") == + "bad argument #4 (string expected, got no value)") + + + -- memory error + T.totalmem(T.totalmem()+10000) -- set low memory limit (+10k) + assert(T.checkpanic("newuserdata 20000") == "not enough memory") + T.totalmem(0) -- restore high limit + + -- stack error + if not _soft then + local msg = T.checkpanic[[ + pushstring "function f() f() end" + loadstring -1; call 0 0 + getglobal f; call 0 0 + ]] + assert(string.find(msg, "stack overflow")) + end + + -- exit in panic still close to-be-closed variables + assert(T.checkpanic([[ + pushstring "return {__close = function () Y = 'ho'; end}" + newtable + loadstring -2 + call 0 1 + setmetatable -2 + toclose -1 + pushstring "hi" + error + ]], + [[ + getglobal Y + concat 2 # concat original error with global Y + ]]) == "hiho") + + +end + +-- testing deep C stack +if not _soft then + print("testing stack overflow") + collectgarbage("stop") + checkerr("XXXX", T.testC, "checkstack 1000023 XXXX") -- too deep + -- too deep (with no message) + checkerr("^stack overflow$", T.testC, "checkstack 1000023 ''") + local s = string.rep("pushnil;checkstack 1 XX;", 1000000) + checkerr("overflow", T.testC, s) + collectgarbage("restart") + print'+' +end + +local lim = _soft and 500 or 12000 +local prog = {"checkstack " .. (lim * 2 + 100) .. "msg", "newtable"} +for i = 1,lim do + prog[#prog + 1] = "pushnum " .. i + prog[#prog + 1] = "pushnum " .. i * 10 +end + +prog[#prog + 1] = "rawgeti R 2" -- get global table in registry +prog[#prog + 1] = "insert " .. -(2*lim + 2) + +for i = 1,lim do + prog[#prog + 1] = "settable " .. -(2*(lim - i + 1) + 1) +end + +prog[#prog + 1] = "return 2" + +prog = table.concat(prog, ";") +local g, t = T.testC(prog) +assert(g == _G) +for i = 1,lim do assert(t[i] == i*10); t[i] = undef end +assert(next(t) == nil) +prog, g, t = nil + +-- testing errors + +a = T.testC([[ + loadstring 2; pcall 0 1 0; + pushvalue 3; insert -2; pcall 1 1 0; + pcall 0 0 0; + return 1 +]], "x=150", function (a) assert(a==nil); return 3 end) + +assert(type(a) == 'string' and x == 150) + +function check3(p, ...) + local arg = {...} + assert(#arg == 3) + assert(string.find(arg[3], p)) +end +check3(":1:", T.testC("loadstring 2; return *", "x=")) +check3("%.", T.testC("loadfile 2; return *", ".")) +check3("xxxx", T.testC("loadfile 2; return *", "xxxx")) + +-- test errors in non protected threads +function checkerrnopro (code, msg) + local th = coroutine.create(function () end) -- create new thread + local stt, err = pcall(T.testC, th, code) -- run code there + assert(not stt and string.find(err, msg)) +end + +if not _soft then + checkerrnopro("pushnum 3; call 0 0", "attempt to call") + print"testing stack overflow in unprotected thread" + function f () f() end + checkerrnopro("getglobal 'f'; call 0 0;", "stack overflow") +end +print"+" + + +-- testing table access + +do -- getp/setp + local a = {} + T.testC("rawsetp 2 1", a, 20) + assert(a[T.pushuserdata(1)] == 20) + assert(T.testC("rawgetp 2 1; return 1", a) == 20) +end + +a = {x=0, y=12} +x, y = T.testC("gettable 2; pushvalue 4; gettable 2; return 2", + a, 3, "y", 4, "x") +assert(x == 0 and y == 12) +T.testC("settable -5", a, 3, 4, "x", 15) +assert(a.x == 15) +a[a] = print +x = T.testC("gettable 2; return 1", a) -- table and key are the same object! +assert(x == print) +T.testC("settable 2", a, "x") -- table and key are the same object! +assert(a[a] == "x") + +b = setmetatable({p = a}, {}) +getmetatable(b).__index = function (t, i) return t.p[i] end +k, x = T.testC("gettable 3, return 2", 4, b, 20, 35, "x") +assert(x == 15 and k == 35) +k = T.testC("getfield 2 y, return 1", b) +assert(k == 12) +getmetatable(b).__index = function (t, i) return a[i] end +getmetatable(b).__newindex = function (t, i,v ) a[i] = v end +y = T.testC("insert 2; gettable -5; return 1", 2, 3, 4, "y", b) +assert(y == 12) +k = T.testC("settable -5, return 1", b, 3, 4, "x", 16) +assert(a.x == 16 and k == 4) +a[b] = 'xuxu' +y = T.testC("gettable 2, return 1", b) +assert(y == 'xuxu') +T.testC("settable 2", b, 19) +assert(a[b] == 19) + +-- +do -- testing getfield/setfield with long keys + local t = {_012345678901234567890123456789012345678901234567890123456789 = 32} + local a = T.testC([[ + getfield 2 _012345678901234567890123456789012345678901234567890123456789 + return 1 + ]], t) + assert(a == 32) + local a = T.testC([[ + pushnum 33 + setglobal _012345678901234567890123456789012345678901234567890123456789 + ]]) + assert(_012345678901234567890123456789012345678901234567890123456789 == 33) + _012345678901234567890123456789012345678901234567890123456789 = nil +end + +-- testing next +a = {} +t = pack(T.testC("next; return *", a, nil)) +tcheck(t, {n=1,a}) +a = {a=3} +t = pack(T.testC("next; return *", a, nil)) +tcheck(t, {n=3,a,'a',3}) +t = pack(T.testC("next; pop 1; next; return *", a, nil)) +tcheck(t, {n=1,a}) + + + +-- testing upvalues + +do + local A = T.testC[[ pushnum 10; pushnum 20; pushcclosure 2; return 1]] + t, b, c = A([[pushvalue U0; pushvalue U1; pushvalue U2; return 3]]) + assert(b == 10 and c == 20 and type(t) == 'table') + a, b = A([[tostring U3; tonumber U4; return 2]]) + assert(a == nil and b == 0) + A([[pushnum 100; pushnum 200; replace U2; replace U1]]) + b, c = A([[pushvalue U1; pushvalue U2; return 2]]) + assert(b == 100 and c == 200) + A([[replace U2; replace U1]], {x=1}, {x=2}) + b, c = A([[pushvalue U1; pushvalue U2; return 2]]) + assert(b.x == 1 and c.x == 2) + T.checkmemory() +end + + +-- testing absent upvalues from C-function pointers +assert(T.testC[[isnull U1; return 1]] == true) +assert(T.testC[[isnull U100; return 1]] == true) +assert(T.testC[[pushvalue U1; return 1]] == nil) + +local f = T.testC[[ pushnum 10; pushnum 20; pushcclosure 2; return 1]] +assert(T.upvalue(f, 1) == 10 and + T.upvalue(f, 2) == 20 and + T.upvalue(f, 3) == nil) +T.upvalue(f, 2, "xuxu") +assert(T.upvalue(f, 2) == "xuxu") + + +-- large closures +do + local A = "checkstack 300 msg;" .. + string.rep("pushnum 10;", 255) .. + "pushcclosure 255; return 1" + A = T.testC(A) + for i=1,255 do + assert(A(("pushvalue U%d; return 1"):format(i)) == 10) + end + assert(A("isnull U256; return 1")) + assert(not A("isnil U256; return 1")) +end + + + +-- testing get/setuservalue +-- bug in 5.1.2 +checkerr("got number", debug.setuservalue, 3, {}) +checkerr("got nil", debug.setuservalue, nil, {}) +checkerr("got light userdata", debug.setuservalue, T.pushuserdata(1), {}) + +-- testing multiple user values +local b = T.newuserdata(0, 10) +for i = 1, 10 do + local v, p = debug.getuservalue(b, i) + assert(v == nil and p) +end +do -- indices out of range + local v, p = debug.getuservalue(b, -2) + assert(v == nil and not p) + local v, p = debug.getuservalue(b, 11) + assert(v == nil and not p) +end +local t = {true, false, 4.56, print, {}, b, "XYZ"} +for k, v in ipairs(t) do + debug.setuservalue(b, v, k) +end +for k, v in ipairs(t) do + local v1, p = debug.getuservalue(b, k) + assert(v1 == v and p) +end + +assert(debug.getuservalue(4) == nil) + +debug.setuservalue(b, function () return 10 end, 10) +collectgarbage() -- function should not be collected +assert(debug.getuservalue(b, 10)() == 10) + +debug.setuservalue(b, 134) +collectgarbage() -- number should not be a problem for collector +assert(debug.getuservalue(b) == 134) + + +-- test barrier for uservalues +do + local oldmode = collectgarbage("incremental") + T.gcstate("atomic") + assert(T.gccolor(b) == "black") + debug.setuservalue(b, {x = 100}) + T.gcstate("pause") -- complete collection + assert(debug.getuservalue(b).x == 100) -- uvalue should be there + collectgarbage(oldmode) +end + +-- long chain of userdata +for i = 1, 1000 do + local bb = T.newuserdata(0, 1) + debug.setuservalue(bb, b) + b = bb +end +collectgarbage() -- nothing should not be collected +for i = 1, 1000 do + b = debug.getuservalue(b) +end +assert(debug.getuservalue(b).x == 100) +b = nil + + +-- testing locks (refs) + +-- reuse of references +local i = T.ref{} +T.unref(i) +assert(T.ref{} == i) + +Arr = {} +Lim = 100 +for i=1,Lim do -- lock many objects + Arr[i] = T.ref({}) +end + +assert(T.ref(nil) == -1 and T.getref(-1) == nil) +T.unref(-1); T.unref(-1) + +for i=1,Lim do -- unlock all them + T.unref(Arr[i]) +end + +function printlocks () + local f = T.makeCfunc("gettable R; return 1") + local n = f("n") + print("n", n) + for i=0,n do + print(i, f(i)) + end +end + + +for i=1,Lim do -- lock many objects + Arr[i] = T.ref({}) +end + +for i=1,Lim,2 do -- unlock half of them + T.unref(Arr[i]) +end + +assert(type(T.getref(Arr[2])) == 'table') + + +assert(T.getref(-1) == nil) + + +a = T.ref({}) + +collectgarbage() + +assert(type(T.getref(a)) == 'table') + + +-- colect in cl the `val' of all collected userdata +tt = {} +cl = {n=0} +A = nil; B = nil +local F +F = function (x) + local udval = T.udataval(x) + table.insert(cl, udval) + local d = T.newuserdata(100) -- create garbage + d = nil + assert(debug.getmetatable(x).__gc == F) + assert(load("table.insert({}, {})"))() -- create more garbage + collectgarbage() -- force a GC during GC + assert(debug.getmetatable(x).__gc == F) -- previous GC did not mess this? + local dummy = {} -- create more garbage during GC + if A ~= nil then + assert(type(A) == "userdata") + assert(T.udataval(A) == B) + debug.getmetatable(A) -- just acess it + end + A = x -- ressucita userdata + B = udval + return 1,2,3 +end +tt.__gc = F + +-- test whether udate collection frees memory in the right time +do + collectgarbage(); + collectgarbage(); + local x = collectgarbage("count"); + local a = T.newuserdata(5001) + assert(T.testC("objsize 2; return 1", a) == 5001) + assert(collectgarbage("count") >= x+4) + a = nil + collectgarbage(); + assert(collectgarbage("count") <= x+1) + -- udata without finalizer + x = collectgarbage("count") + collectgarbage("stop") + for i=1,1000 do T.newuserdata(0) end + assert(collectgarbage("count") > x+10) + collectgarbage() + assert(collectgarbage("count") <= x+1) + -- udata with finalizer + collectgarbage() + x = collectgarbage("count") + collectgarbage("stop") + a = {__gc = function () end} + for i=1,1000 do debug.setmetatable(T.newuserdata(0), a) end + assert(collectgarbage("count") >= x+10) + collectgarbage() -- this collection only calls TM, without freeing memory + assert(collectgarbage("count") >= x+10) + collectgarbage() -- now frees memory + assert(collectgarbage("count") <= x+1) + collectgarbage("restart") +end + + +collectgarbage("stop") + +-- create 3 userdatas with tag `tt' +a = T.newuserdata(0); debug.setmetatable(a, tt); na = T.udataval(a) +b = T.newuserdata(0); debug.setmetatable(b, tt); nb = T.udataval(b) +c = T.newuserdata(0); debug.setmetatable(c, tt); nc = T.udataval(c) + +-- create userdata without meta table +x = T.newuserdata(4) +y = T.newuserdata(0) + +checkerr("FILE%* expected, got userdata", io.input, a) +checkerr("FILE%* expected, got userdata", io.input, x) + +assert(debug.getmetatable(x) == nil and debug.getmetatable(y) == nil) + +d=T.ref(a); +e=T.ref(b); +f=T.ref(c); +t = {T.getref(d), T.getref(e), T.getref(f)} +assert(t[1] == a and t[2] == b and t[3] == c) + +t=nil; a=nil; c=nil; +T.unref(e); T.unref(f) + +collectgarbage() + +-- check that unref objects have been collected +assert(#cl == 1 and cl[1] == nc) + +x = T.getref(d) +assert(type(x) == 'userdata' and debug.getmetatable(x) == tt) +x =nil +tt.b = b -- create cycle +tt=nil -- frees tt for GC +A = nil +b = nil +T.unref(d); +n5 = T.newuserdata(0) +debug.setmetatable(n5, {__gc=F}) +n5 = T.udataval(n5) +collectgarbage() +assert(#cl == 4) +-- check order of collection +assert(cl[2] == n5 and cl[3] == nb and cl[4] == na) + +collectgarbage"restart" + + +a, na = {}, {} +for i=30,1,-1 do + a[i] = T.newuserdata(0) + debug.setmetatable(a[i], {__gc=F}) + na[i] = T.udataval(a[i]) +end +cl = {} +a = nil; collectgarbage() +assert(#cl == 30) +for i=1,30 do assert(cl[i] == na[i]) end +na = nil + + +for i=2,Lim,2 do -- unlock the other half + T.unref(Arr[i]) +end + +x = T.newuserdata(41); debug.setmetatable(x, {__gc=F}) +assert(T.testC("objsize 2; return 1", x) == 41) +cl = {} +a = {[x] = 1} +x = T.udataval(x) +collectgarbage() +-- old `x' cannot be collected (`a' still uses it) +assert(#cl == 0) +for n in pairs(a) do a[n] = undef end +collectgarbage() +assert(#cl == 1 and cl[1] == x) -- old `x' must be collected + +-- testing lua_equal +assert(T.testC("compare EQ 2 4; return 1", print, 1, print, 20)) +assert(T.testC("compare EQ 3 2; return 1", 'alo', "alo")) +assert(T.testC("compare EQ 2 3; return 1", nil, nil)) +assert(not T.testC("compare EQ 2 3; return 1", {}, {})) +assert(not T.testC("compare EQ 2 3; return 1")) +assert(not T.testC("compare EQ 2 3; return 1", 3)) + +-- testing lua_equal with fallbacks +do + local map = {} + local t = {__eq = function (a,b) return map[a] == map[b] end} + local function f(x) + local u = T.newuserdata(0) + debug.setmetatable(u, t) + map[u] = x + return u + end + assert(f(10) == f(10)) + assert(f(10) ~= f(11)) + assert(T.testC("compare EQ 2 3; return 1", f(10), f(10))) + assert(not T.testC("compare EQ 2 3; return 1", f(10), f(20))) + t.__eq = nil + assert(f(10) ~= f(10)) +end + +print'+' + + + +-- testing changing hooks during hooks +_G.t = {} +T.sethook([[ + # set a line hook after 3 count hooks + sethook 4 0 ' + getglobal t; + pushvalue -3; append -2 + pushvalue -2; append -2 + ']], "c", 3) +local a = 1 -- counting +a = 1 -- counting +a = 1 -- count hook (set line hook) +a = 1 -- line hook +a = 1 -- line hook +debug.sethook() +t = _G.t +assert(t[1] == "line") +line = t[2] +assert(t[3] == "line" and t[4] == line + 1) +assert(t[5] == "line" and t[6] == line + 2) +assert(t[7] == nil) + + +------------------------------------------------------------------------- +do -- testing errors during GC + collectgarbage("stop") + local a = {} + for i=1,20 do + a[i] = T.newuserdata(i) -- creates several udata + end + for i=1,20,2 do -- mark half of them to raise errors during GC + debug.setmetatable(a[i], + {__gc = function (x) error("@expected error in gc") end}) + end + for i=2,20,2 do -- mark the other half to count and to create more garbage + debug.setmetatable(a[i], {__gc = function (x) load("A=A+1")() end}) + end + a = nil + _G.A = 0 + collectgarbage() + assert(A == 10) -- number of normal collections + collectgarbage("restart") +end +------------------------------------------------------------------------- +-- test for userdata vals +do + local a = {}; local lim = 30 + for i=0,lim do a[i] = T.pushuserdata(i) end + for i=0,lim do assert(T.udataval(a[i]) == i) end + for i=0,lim do assert(T.pushuserdata(i) == a[i]) end + for i=0,lim do a[a[i]] = i end + for i=0,lim do a[T.pushuserdata(i)] = i end + assert(type(tostring(a[1])) == "string") +end + + +------------------------------------------------------------------------- +-- testing multiple states +T.closestate(T.newstate()); +L1 = T.newstate() +assert(L1) + +assert(T.doremote(L1, "X='a'; return 'a'") == 'a') + + +assert(#pack(T.doremote(L1, "function f () return 'alo', 3 end; f()")) == 0) + +a, b = T.doremote(L1, "return f()") +assert(a == 'alo' and b == '3') + +T.doremote(L1, "_ERRORMESSAGE = nil") +-- error: `sin' is not defined +a, _, b = T.doremote(L1, "return sin(1)") +assert(a == nil and b == 2) -- 2 == run-time error + +-- error: syntax error +a, b, c = T.doremote(L1, "return a+") +assert(a == nil and c == 3 and type(b) == "string") -- 3 == syntax error + +T.loadlib(L1) +a, b, c = T.doremote(L1, [[ + string = require'string' + a = require'_G'; assert(a == _G and require("_G") == a) + io = require'io'; assert(type(io.read) == "function") + assert(require("io") == io) + a = require'table'; assert(type(a.insert) == "function") + a = require'debug'; assert(type(a.getlocal) == "function") + a = require'math'; assert(type(a.sin) == "function") + return string.sub('okinama', 1, 2) +]]) +assert(a == "ok") + +T.closestate(L1); + + +L1 = T.newstate() +T.loadlib(L1) +T.doremote(L1, "a = {}") +T.testC(L1, [[getglobal "a"; pushstring "x"; pushint 1; + settable -3]]) +assert(T.doremote(L1, "return a.x") == "1") + +T.closestate(L1) + +L1 = nil + +print('+') +------------------------------------------------------------------------- +-- testing to-be-closed variables +------------------------------------------------------------------------- +print"testing to-be-closed variables" + +do + local openresource = {} + + local function newresource () + local x = setmetatable({10}, {__close = function(y) + assert(openresource[#openresource] == y) + openresource[#openresource] = nil + y[1] = y[1] + 1 + end}) + openresource[#openresource + 1] = x + return x + end + + local a, b = T.testC([[ + call 0 1 # create resource + pushnil + toclose -2 # mark call result to be closed + toclose -1 # mark nil to be closed (will be ignored) + return 2 + ]], newresource) + assert(a[1] == 11 and b == nil) + assert(#openresource == 0) -- was closed + + -- repeat the test, but calling function in a 'multret' context + local a = {T.testC([[ + call 0 1 # create resource + toclose 2 # mark it to be closed + return 2 + ]], newresource)} + assert(type(a[1]) == "string" and a[2][1] == 11) + assert(#openresource == 0) -- was closed + + -- error + local a, b = pcall(T.makeCfunc[[ + call 0 1 # create resource + toclose -1 # mark it to be closed + error # resource is the error object + ]], newresource) + assert(a == false and b[1] == 11) + assert(#openresource == 0) -- was closed + + local function check (n) + assert(#openresource == n) + end + + -- closing resources with 'settop' + local a = T.testC([[ + pushvalue 2 + call 0 1 # create resource + toclose -1 # mark it to be closed + pushvalue 2 + call 0 1 # create another resource + toclose -1 # mark it to be closed + pushvalue 3 + pushint 2 # there should be two open resources + call 1 0 + pop 1 # pop second resource from the stack + pushvalue 3 + pushint 1 # there should be one open resource + call 1 0 + pop 1 # pop second resource from the stack + pushint * + return 1 # return stack size + ]], newresource, check) + assert(a == 3) -- no extra items left in the stack + + -- non-closable value + local a, b = pcall(T.makeCfunc[[ + pushint 32 + toclose -1 + ]]) + assert(not a and string.find(b, "(C temporary)")) + +end + + +------------------------------------------------------------------------- +-- testing memory limits +------------------------------------------------------------------------- +print("memory-allocation errors") + +checkerr("block too big", T.newuserdata, math.maxinteger) +collectgarbage() +local f = load"local a={}; for i=1,100000 do a[i]=i end" +T.alloccount(10) +checkerr("not enough memory", f) +T.alloccount() -- remove limit + +-- test memory errors; increase limit for number of allocations one +-- by one, so that we get memory errors in all allocations of a given +-- task, until there is enough allocations to complete the task without +-- errors. + +function testamem (s, f) + collectgarbage(); collectgarbage() + local M = 0 + local a,b = nil + while true do + T.alloccount(M) + a, b = pcall(f) + T.alloccount() -- remove limit + if a and b then break end -- stop when no more errors + if not a and not -- `real' error? + (string.find(b, "memory") or string.find(b, "overflow")) then + error(b, 0) -- propagate it + end + M = M + 1 -- increase allocation limit + end + print(string.format("limit for %s: %d allocations", s, M)) + return b +end + + +-- doing nothing +b = testamem("doing nothing", function () return 10 end) +assert(b == 10) + +-- testing memory errors when creating a new state + +b = testamem("state creation", T.newstate) +T.closestate(b); -- close new state + +testamem("empty-table creation", function () + return {} +end) + +testamem("string creation", function () + return "XXX" .. "YYY" +end) + +testamem("coroutine creation", function() + return coroutine.create(print) +end) + + +-- testing to-be-closed variables +testamem("to-be-closed variables", function() + local flag + do + local *toclose x = setmetatable({}, {__close = function () flag = true end}) + flag = false + local x = {} + end + return flag +end) + + +-- testing threads + +-- get main thread from registry (at index LUA_RIDX_MAINTHREAD == 1) +mt = T.testC("rawgeti R 1; return 1") +assert(type(mt) == "thread" and coroutine.running() == mt) + + + +function expand (n,s) + if n==0 then return "" end + local e = string.rep("=", n) + return string.format("T.doonnewstack([%s[ %s;\n collectgarbage(); %s]%s])\n", + e, s, expand(n-1,s), e) +end + +G=0; collectgarbage(); a =collectgarbage("count") +load(expand(20,"G=G+1"))() +assert(G==20); collectgarbage(); -- assert(gcinfo() <= a+1) + +testamem("running code on new thread", function () + return T.doonnewstack("x=1") == 0 -- try to create thread +end) + + +-- testing memory x compiler + +testamem("loadstring", function () + return load("x=1") -- try to do load a string +end) + + +local testprog = [[ +local function foo () return end +local t = {"x"} +a = "aaa" +for i = 1, #t do a=a..t[i] end +return true +]] + +-- testing memory x dofile +_G.a = nil +local t =os.tmpname() +local f = assert(io.open(t, "w")) +f:write(testprog) +f:close() +testamem("dofile", function () + local a = loadfile(t) + return a and a() +end) +assert(os.remove(t)) +assert(_G.a == "aaax") + + +-- other generic tests + +testamem("gsub", function () + local a, b = string.gsub("alo alo", "(a)", function (x) return x..'b' end) + return (a == 'ablo ablo') +end) + +testamem("dump/undump", function () + local a = load(testprog) + local b = a and string.dump(a) + a = b and load(b) + return a and a() +end) + +local t = os.tmpname() +testamem("file creation", function () + local f = assert(io.open(t, 'w')) + assert (not io.open"nomenaoexistente") + io.close(f); + return not loadfile'nomenaoexistente' +end) +assert(os.remove(t)) + +testamem("table creation", function () + local a, lim = {}, 10 + for i=1,lim do a[i] = i; a[i..'a'] = {} end + return (type(a[lim..'a']) == 'table' and a[lim] == lim) +end) + +testamem("constructors", function () + local a = {10, 20, 30, 40, 50; a=1, b=2, c=3, d=4, e=5} + return (type(a) == 'table' and a.e == 5) +end) + +local a = 1 +close = nil +testamem("closure creation", function () + function close (b) + return function (x) return b + x end + end + return (close(2)(4) == 6) +end) + +testamem("using coroutines", function () + local a = coroutine.wrap(function () + coroutine.yield(string.rep("a", 10)) + return {} + end) + assert(string.len(a()) == 10) + return a() +end) + +do -- auxiliary buffer + local lim = 100 + local a = {}; for i = 1, lim do a[i] = "01234567890123456789" end + testamem("auxiliary buffer", function () + return (#table.concat(a, ",") == 20*lim + lim - 1) + end) +end + +testamem("growing stack", function () + local function foo (n) + if n == 0 then return 1 else return 1 + foo(n - 1) end + end + return foo(100) +end) + +do -- testing failing in 'lua_checkstack' + local res = T.testC([[rawcheckstack 500000; return 1]]) + assert(res == false) + local L = T.newstate() + T.alloccount(0) -- will be unable to reallocate the stack + res = T.testC(L, [[rawcheckstack 5000; return 1]]) + T.alloccount() + T.closestate(L) + assert(res == false) +end + +do -- closing state with no extra memory + local L = T.newstate() + T.alloccount(0) + T.closestate(L) + T.alloccount() +end + +do -- garbage collection with no extra memory + local L = T.newstate() + T.loadlib(L) + local res = (T.doremote(L, [[ + _ENV = require"_G" + local T = require"T" + local a = {} + for i = 1, 1000 do a[i] = 'i' .. i end -- grow string table + local stsize, stuse = T.querystr() + assert(stuse > 1000) + local function foo (n) + if n > 0 then foo(n - 1) end + end + foo(180) -- grow stack + local _, stksize = T.stacklevel() + assert(stksize > 180) + a = nil + T.alloccount(0) + collectgarbage() + T.alloccount() + -- stack and string table could not be reallocated, + -- so they kept their sizes (without errors) + assert(select(2, T.stacklevel()) == stksize) + assert(T.querystr() == stsize) + return 'ok' + ]])) + assert(res == 'ok') + T.closestate(L) +end + +print'+' + +-- testing some auxlib functions +local function gsub (a, b, c) + a, b = T.testC("gsub 2 3 4; gettop; return 2", a, b, c) + assert(b == 5) + return a +end + +assert(gsub("alo.alo.uhuh.", ".", "//") == "alo//alo//uhuh//") +assert(gsub("alo.alo.uhuh.", "alo", "//") == "//.//.uhuh.") +assert(gsub("", "alo", "//") == "") +assert(gsub("...", ".", "/.") == "/././.") +assert(gsub("...", "...", "") == "") + + +-- testing luaL_newmetatable +local mt_xuxu, res, top = T.testC("newmetatable xuxu; gettop; return 3") +assert(type(mt_xuxu) == "table" and res and top == 3) +local d, res, top = T.testC("newmetatable xuxu; gettop; return 3") +assert(mt_xuxu == d and not res and top == 3) +d, res, top = T.testC("newmetatable xuxu1; gettop; return 3") +assert(mt_xuxu ~= d and res and top == 3) + +x = T.newuserdata(0); +y = T.newuserdata(0); +T.testC("pushstring xuxu; gettable R; setmetatable 2", x) +assert(getmetatable(x) == mt_xuxu) + +-- testing luaL_testudata +-- correct metatable +local res1, res2, top = T.testC([[testudata -1 xuxu + testudata 2 xuxu + gettop + return 3]], x) +assert(res1 and res2 and top == 4) + +-- wrong metatable +res1, res2, top = T.testC([[testudata -1 xuxu1 + testudata 2 xuxu1 + gettop + return 3]], x) +assert(not res1 and not res2 and top == 4) + +-- non-existent type +res1, res2, top = T.testC([[testudata -1 xuxu2 + testudata 2 xuxu2 + gettop + return 3]], x) +assert(not res1 and not res2 and top == 4) + +-- userdata has no metatable +res1, res2, top = T.testC([[testudata -1 xuxu + testudata 2 xuxu + gettop + return 3]], y) +assert(not res1 and not res2 and top == 4) + +-- erase metatables +do + local r = debug.getregistry() + assert(r.xuxu == mt_xuxu and r.xuxu1 == d) + r.xuxu = nil; r.xuxu1 = nil +end + +print'OK' + diff --git a/source/lua/testes/attrib.lua b/source/lua/testes/attrib.lua new file mode 100644 index 0000000..dcafd63 --- /dev/null +++ b/source/lua/testes/attrib.lua @@ -0,0 +1,487 @@ +-- $Id: testes/attrib.lua $ +-- See Copyright Notice in file all.lua + +print "testing require" + +assert(require"string" == string) +assert(require"math" == math) +assert(require"table" == table) +assert(require"io" == io) +assert(require"os" == os) +assert(require"coroutine" == coroutine) + +assert(type(package.path) == "string") +assert(type(package.cpath) == "string") +assert(type(package.loaded) == "table") +assert(type(package.preload) == "table") + +assert(type(package.config) == "string") +print("package config: "..string.gsub(package.config, "\n", "|")) + +do + -- create a path with 'max' templates, + -- each with 1-10 repetitions of '?' + local max = _soft and 100 or 2000 + local t = {} + for i = 1,max do t[i] = string.rep("?", i%10 + 1) end + t[#t + 1] = ";" -- empty template + local path = table.concat(t, ";") + -- use that path in a search + local s, err = package.searchpath("xuxu", path) + -- search fails; check that message has an occurence of + -- '??????????' with ? replaced by xuxu and at least 'max' lines + assert(not s and + string.find(err, string.rep("xuxu", 10)) and + #string.gsub(err, "[^\n]", "") >= max) + -- path with one very long template + local path = string.rep("?", max) + local s, err = package.searchpath("xuxu", path) + assert(not s and string.find(err, string.rep('xuxu', max))) +end + +do + local oldpath = package.path + package.path = {} + local s, err = pcall(require, "no-such-file") + assert(not s and string.find(err, "package.path")) + package.path = oldpath +end + +print('+') + + +-- The next tests for 'require' assume some specific directories and +-- libraries. + +if not _port then --[ + +local dirsep = string.match(package.config, "^([^\n]+)\n") + +-- auxiliary directory with C modules and temporary files +local DIR = "libs" .. dirsep + +-- prepend DIR to a name and correct directory separators +local function D (x) + x = string.gsub(x, "/", dirsep) + return DIR .. x +end + +-- prepend DIR and pospend proper C lib. extension to a name +local function DC (x) + local ext = (dirsep == '\\') and ".dll" or ".so" + return D(x .. ext) +end + + +local function createfiles (files, preextras, posextras) + for n,c in pairs(files) do + io.output(D(n)) + io.write(string.format(preextras, n)) + io.write(c) + io.write(string.format(posextras, n)) + io.close(io.output()) + end +end + +function removefiles (files) + for n in pairs(files) do + os.remove(D(n)) + end +end + +local files = { + ["names.lua"] = "do return {...} end\n", + ["err.lua"] = "B = 15; a = a + 1;", + ["synerr.lua"] = "B =", + ["A.lua"] = "", + ["B.lua"] = "assert(...=='B');require 'A'", + ["A.lc"] = "", + ["A"] = "", + ["L"] = "", + ["XXxX"] = "", + ["C.lua"] = "package.loaded[...] = 25; require'C'", +} + +AA = nil +local extras = [[ +NAME = '%s' +REQUIRED = ... +return AA]] + +createfiles(files, "", extras) + +-- testing explicit "dir" separator in 'searchpath' +assert(package.searchpath("C.lua", D"?", "", "") == D"C.lua") +assert(package.searchpath("C.lua", D"?", ".", ".") == D"C.lua") +assert(package.searchpath("--x-", D"?", "-", "X") == D"XXxX") +assert(package.searchpath("---xX", D"?", "---", "XX") == D"XXxX") +assert(package.searchpath(D"C.lua", "?", dirsep) == D"C.lua") +assert(package.searchpath(".\\C.lua", D"?", "\\") == D"./C.lua") + +local oldpath = package.path + +package.path = string.gsub("D/?.lua;D/?.lc;D/?;D/??x?;D/L", "D/", DIR) + +local try = function (p, n, r) + NAME = nil + local rr = require(p) + assert(NAME == n) + assert(REQUIRED == p) + assert(rr == r) +end + +a = require"names" +assert(a[1] == "names" and a[2] == D"names.lua") + +_G.a = nil +local st, msg = pcall(require, "err") +assert(not st and string.find(msg, "arithmetic") and B == 15) +st, msg = pcall(require, "synerr") +assert(not st and string.find(msg, "error loading module")) + +assert(package.searchpath("C", package.path) == D"C.lua") +assert(require"C" == 25) +assert(require"C" == 25) +AA = nil +try('B', 'B.lua', true) +assert(package.loaded.B) +assert(require"B" == true) +assert(package.loaded.A) +assert(require"C" == 25) +package.loaded.A = nil +try('B', nil, true) -- should not reload package +try('A', 'A.lua', true) +package.loaded.A = nil +os.remove(D'A.lua') +AA = {} +try('A', 'A.lc', AA) -- now must find second option +assert(package.searchpath("A", package.path) == D"A.lc") +assert(require("A") == AA) +AA = false +try('K', 'L', false) -- default option +try('K', 'L', false) -- default option (should reload it) +assert(rawget(_G, "_REQUIREDNAME") == nil) + +AA = "x" +try("X", "XXxX", AA) + + +removefiles(files) + + +-- testing require of sub-packages + +local _G = _G + +package.path = string.gsub("D/?.lua;D/?/init.lua", "D/", DIR) + +files = { + ["P1/init.lua"] = "AA = 10", + ["P1/xuxu.lua"] = "AA = 20", +} + +createfiles(files, "_ENV = {}\n", "\nreturn _ENV\n") +AA = 0 + +local m = assert(require"P1") +assert(AA == 0 and m.AA == 10) +assert(require"P1" == m) +assert(require"P1" == m) + +assert(package.searchpath("P1.xuxu", package.path) == D"P1/xuxu.lua") +m.xuxu = assert(require"P1.xuxu") +assert(AA == 0 and m.xuxu.AA == 20) +assert(require"P1.xuxu" == m.xuxu) +assert(require"P1.xuxu" == m.xuxu) +assert(require"P1" == m and m.AA == 10) + + +removefiles(files) + + +package.path = "" +assert(not pcall(require, "file_does_not_exist")) +package.path = "??\0?" +assert(not pcall(require, "file_does_not_exist1")) + +package.path = oldpath + +-- check 'require' error message +local fname = "file_does_not_exist2" +local m, err = pcall(require, fname) +for t in string.gmatch(package.path..";"..package.cpath, "[^;]+") do + t = string.gsub(t, "?", fname) + assert(string.find(err, t, 1, true)) +end + +do -- testing 'package.searchers' not being a table + local searchers = package.searchers + package.searchers = 3 + local st, msg = pcall(require, 'a') + assert(not st and string.find(msg, "must be a table")) + package.searchers = searchers +end + +local function import(...) + local f = {...} + return function (m) + for i=1, #f do m[f[i]] = _G[f[i]] end + end +end + +-- cannot change environment of a C function +assert(not pcall(module, 'XUXU')) + + + +-- testing require of C libraries + + +local p = "" -- On Mac OS X, redefine this to "_" + +-- check whether loadlib works in this system +local st, err, when = package.loadlib(DC"lib1", "*") +if not st then + local f, err, when = package.loadlib("donotexist", p.."xuxu") + assert(not f and type(err) == "string" and when == "absent") + ;(Message or print)('\n >>> cannot load dynamic library <<<\n') + print(err, when) +else + -- tests for loadlib + local f = assert(package.loadlib(DC"lib1", p.."onefunction")) + local a, b = f(15, 25) + assert(a == 25 and b == 15) + + f = assert(package.loadlib(DC"lib1", p.."anotherfunc")) + assert(f(10, 20) == "10%20\n") + + -- check error messages + local f, err, when = package.loadlib(DC"lib1", p.."xuxu") + assert(not f and type(err) == "string" and when == "init") + f, err, when = package.loadlib("donotexist", p.."xuxu") + assert(not f and type(err) == "string" and when == "open") + + -- symbols from 'lib1' must be visible to other libraries + f = assert(package.loadlib(DC"lib11", p.."luaopen_lib11")) + assert(f() == "exported") + + -- test C modules with prefixes in names + package.cpath = DC"?" + local lib2 = require"lib2-v2" + -- check correct access to global environment and correct + -- parameters + assert(_ENV.x == "lib2-v2" and _ENV.y == DC"lib2-v2") + assert(lib2.id("x") == "x") + + -- test C submodules + local fs = require"lib1.sub" + assert(_ENV.x == "lib1.sub" and _ENV.y == DC"lib1") + assert(fs.id(45) == 45) +end + +_ENV = _G + + +-- testing preload + +do + local p = package + package = {} + p.preload.pl = function (...) + local _ENV = {...} + function xuxu (x) return x+20 end + return _ENV + end + + local pl = require"pl" + assert(require"pl" == pl) + assert(pl.xuxu(10) == 30) + assert(pl[1] == "pl" and pl[2] == nil) + + package = p + assert(type(package.path) == "string") +end + +print('+') + +end --] + +print("testing assignments, logical operators, and constructors") + +local res, res2 = 27 + +a, b = 1, 2+3 +assert(a==1 and b==5) +a={} +function f() return 10, 11, 12 end +a.x, b, a[1] = 1, 2, f() +assert(a.x==1 and b==2 and a[1]==10) +a[f()], b, a[f()+3] = f(), a, 'x' +assert(a[10] == 10 and b == a and a[13] == 'x') + +do + local f = function (n) local x = {}; for i=1,n do x[i]=i end; + return table.unpack(x) end; + local a,b,c + a,b = 0, f(1) + assert(a == 0 and b == 1) + A,b = 0, f(1) + assert(A == 0 and b == 1) + a,b,c = 0,5,f(4) + assert(a==0 and b==5 and c==1) + a,b,c = 0,5,f(0) + assert(a==0 and b==5 and c==nil) +end + +a, b, c, d = 1 and nil, 1 or nil, (1 and (nil or 1)), 6 +assert(not a and b and c and d==6) + +d = 20 +a, b, c, d = f() +assert(a==10 and b==11 and c==12 and d==nil) +a,b = f(), 1, 2, 3, f() +assert(a==10 and b==1) + +assert(ab == true) +assert((10 and 2) == 2) +assert((10 or 2) == 10) +assert((10 or assert(nil)) == 10) +assert(not (nil and assert(nil))) +assert((nil or "alo") == "alo") +assert((nil and 10) == nil) +assert((false and 10) == false) +assert((true or 10) == true) +assert((false or 10) == 10) +assert(false ~= nil) +assert(nil ~= false) +assert(not nil == true) +assert(not not nil == false) +assert(not not 1 == true) +assert(not not a == true) +assert(not not (6 or nil) == true) +assert(not not (nil and 56) == false) +assert(not not (nil and true) == false) +assert(not 10 == false) +assert(not {} == false) +assert(not 0.5 == false) +assert(not "x" == false) + +assert({} ~= {}) +print('+') + +a = {} +a[true] = 20 +a[false] = 10 +assert(a[1<2] == 20 and a[1>2] == 10) + +function f(a) return a end + +local a = {} +for i=3000,-3000,-1 do a[i + 0.0] = i; end +a[10e30] = "alo"; a[true] = 10; a[false] = 20 +assert(a[10e30] == 'alo' and a[not 1] == 20 and a[10<20] == 10) +for i=3000,-3000,-1 do assert(a[i] == i); end +a[print] = assert +a[f] = print +a[a] = a +assert(a[a][a][a][a][print] == assert) +a[print](a[a[f]] == a[print]) +assert(not pcall(function () local a = {}; a[nil] = 10 end)) +assert(not pcall(function () local a = {[nil] = 10} end)) +assert(a[nil] == undef) +a = nil + +a = {10,9,8,7,6,5,4,3,2; [-3]='a', [f]=print, a='a', b='ab'} +a, a.x, a.y = a, a[-3] +assert(a[1]==10 and a[-3]==a.a and a[f]==print and a.x=='a' and not a.y) +a[1], f(a)[2], b, c = {['alo']=assert}, 10, a[1], a[f], 6, 10, 23, f(a), 2 +a[1].alo(a[2]==10 and b==10 and c==print) + +a.aVeryLongName012345678901234567890123456789012345678901234567890123456789 = 10 +local function foo () + return a.aVeryLongName012345678901234567890123456789012345678901234567890123456789 +end +assert(foo() == 10 and +a.aVeryLongName012345678901234567890123456789012345678901234567890123456789 == +10) + + + +-- test of large float/integer indices + +-- compute maximum integer where all bits fit in a float +local maxint = math.maxinteger + +-- trim (if needed) to fit in a float +while maxint ~= (maxint + 0.0) or (maxint - 1) ~= (maxint - 1.0) do + maxint = maxint // 2 +end + +maxintF = maxint + 0.0 -- float version + +assert(maxintF == maxint and math.type(maxintF) == "float" and + maxintF >= 2.0^14) + +-- floats and integers must index the same places +a[maxintF] = 10; a[maxintF - 1.0] = 11; +a[-maxintF] = 12; a[-maxintF + 1.0] = 13; + +assert(a[maxint] == 10 and a[maxint - 1] == 11 and + a[-maxint] == 12 and a[-maxint + 1] == 13) + +a[maxint] = 20 +a[-maxint] = 22 + +assert(a[maxintF] == 20 and a[maxintF - 1.0] == 11 and + a[-maxintF] == 22 and a[-maxintF + 1.0] == 13) + +a = nil + + +-- test conflicts in multiple assignment +do + local a,i,j,b + a = {'a', 'b'}; i=1; j=2; b=a + i, a[i], a, j, a[j], a[i+j] = j, i, i, b, j, i + assert(i == 2 and b[1] == 1 and a == 1 and j == b and b[2] == 2 and + b[3] == 1) + a = {} + local function foo () -- assigining to upvalues + b, a.x, a = a, 10, 20 + end + foo() + assert(a == 20 and b.x == 10) +end + +-- repeat test with upvalues +do + local a,i,j,b + a = {'a', 'b'}; i=1; j=2; b=a + local function foo () + i, a[i], a, j, a[j], a[i+j] = j, i, i, b, j, i + end + foo() + assert(i == 2 and b[1] == 1 and a == 1 and j == b and b[2] == 2 and + b[3] == 1) + local t = {} + (function (a) t[a], a = 10, 20 end)(1); + assert(t[1] == 10) +end + +-- bug in 5.2 beta +local function foo () + local a + return function () + local b + a, b = 3, 14 -- local and upvalue have same index + return a, b + end +end + +local a, b = foo()() +assert(a == 3 and b == 14) + +print('OK') + +return res + diff --git a/source/lua/testes/big.lua b/source/lua/testes/big.lua new file mode 100644 index 0000000..150d15d --- /dev/null +++ b/source/lua/testes/big.lua @@ -0,0 +1,82 @@ +-- $Id: testes/big.lua $ +-- See Copyright Notice in file all.lua + +if _soft then + return 'a' +end + +print "testing large tables" + +local debug = require"debug" + +local lim = 2^18 + 1000 +local prog = { "local y = {0" } +for i = 1, lim do prog[#prog + 1] = i end +prog[#prog + 1] = "}\n" +prog[#prog + 1] = "X = y\n" +prog[#prog + 1] = ("assert(X[%d] == %d)"):format(lim - 1, lim - 2) +prog[#prog + 1] = "return 0" +prog = table.concat(prog, ";") + +local env = {string = string, assert = assert} +local f = assert(load(prog, nil, nil, env)) + +f() +assert(env.X[lim] == lim - 1 and env.X[lim + 1] == lim) +for k in pairs(env) do env[k] = undef end + +-- yields during accesses larger than K (in RK) +setmetatable(env, { + __index = function (t, n) coroutine.yield('g'); return _G[n] end, + __newindex = function (t, n, v) coroutine.yield('s'); _G[n] = v end, +}) + +X = nil +co = coroutine.wrap(f) +assert(co() == 's') +assert(co() == 'g') +assert(co() == 'g') +assert(co() == 0) + +assert(X[lim] == lim - 1 and X[lim + 1] == lim) + +-- errors in accesses larger than K (in RK) +getmetatable(env).__index = function () end +getmetatable(env).__newindex = function () end +local e, m = pcall(f) +assert(not e and m:find("global 'X'")) + +-- errors in metamethods +getmetatable(env).__newindex = function () error("hi") end +local e, m = xpcall(f, debug.traceback) +assert(not e and m:find("'newindex'")) + +f, X = nil + +coroutine.yield'b' + +if 2^32 == 0 then -- (small integers) { + +print "testing string length overflow" + +local repstrings = 192 -- number of strings to be concatenated +local ssize = math.ceil(2.0^32 / repstrings) + 1 -- size of each string + +assert(repstrings * ssize > 2.0^32) -- it should be larger than maximum size + +local longs = string.rep("\0", ssize) -- create one long string + +-- create function to concatentate 'repstrings' copies of its argument +local rep = assert(load( + "local a = ...; return " .. string.rep("a", repstrings, ".."))) + +local a, b = pcall(rep, longs) -- call that function + +-- it should fail without creating string (result would be too large) +assert(not a and string.find(b, "overflow")) + +end -- } + +print'OK' + +return 'a' diff --git a/source/lua/testes/bitwise.lua b/source/lua/testes/bitwise.lua new file mode 100644 index 0000000..af542e7 --- /dev/null +++ b/source/lua/testes/bitwise.lua @@ -0,0 +1,346 @@ +-- $Id: testes/bitwise.lua $ +-- See Copyright Notice in file all.lua + +print("testing bitwise operations") + +require "bwcoercion" + +local numbits = string.packsize('j') * 8 + +assert(~0 == -1) + +assert((1 << (numbits - 1)) == math.mininteger) + +-- basic tests for bitwise operators; +-- use variables to avoid constant folding +local a, b, c, d +a = 0xFFFFFFFFFFFFFFFF +assert(a == -1 and a & -1 == a and a & 35 == 35) +a = 0xF0F0F0F0F0F0F0F0 +assert(a | -1 == -1) +assert(a ~ a == 0 and a ~ 0 == a and a ~ ~a == -1) +assert(a >> 4 == ~a) +a = 0xF0; b = 0xCC; c = 0xAA; d = 0xFD +assert(a | b ~ c & d == 0xF4) + +a = 0xF0.0; b = 0xCC.0; c = "0xAA.0"; d = "0xFD.0" +assert(a | b ~ c & d == 0xF4) + +a = 0xF0000000; b = 0xCC000000; +c = 0xAA000000; d = 0xFD000000 +assert(a | b ~ c & d == 0xF4000000) +assert(~~a == a and ~a == -1 ~ a and -d == ~d + 1) + +a = a << 32 +b = b << 32 +c = c << 32 +d = d << 32 +assert(a | b ~ c & d == 0xF4000000 << 32) +assert(~~a == a and ~a == -1 ~ a and -d == ~d + 1) + +assert(-1 >> 1 == (1 << (numbits - 1)) - 1 and 1 << 31 == 0x80000000) +assert(-1 >> (numbits - 1) == 1) +assert(-1 >> numbits == 0 and + -1 >> -numbits == 0 and + -1 << numbits == 0 and + -1 << -numbits == 0) + +assert((2^30 - 1) << 2^30 == 0) +assert((2^30 - 1) >> 2^30 == 0) + +assert(1 >> -3 == 1 << 3 and 1000 >> 5 == 1000 << -5) + + +-- coercion from strings to integers +assert("0xffffffffffffffff" | 0 == -1) +assert("0xfffffffffffffffe" & "-1" == -2) +assert(" \t-0xfffffffffffffffe\n\t" & "-1" == 2) +assert(" \n -45 \t " >> " -2 " == -45 * 4) +assert("1234.0" << "5.0" == 1234 * 32) +assert("0xffff.0" ~ "0xAAAA" == 0x5555) +assert(~"0x0.000p4" == -1) + +assert("7" .. 3 << 1 == 146) +assert(10 >> 1 .. "9" == 0) +assert(10 | 1 .. "9" == 27) + +do + local st, msg = pcall(function () return 4 & "a" end) + assert(string.find(msg, "'band'")) + + local st, msg = pcall(function () return ~"a" end) + assert(string.find(msg, "'bnot'")) +end + + +-- out of range number +assert(not pcall(function () return "0xffffffffffffffff.0" | 0 end)) + +-- embedded zeros +assert(not pcall(function () return "0xffffffffffffffff\0" | 0 end)) + +print'+' + + +package.preload.bit32 = function () --{ + +-- no built-in 'bit32' library: implement it using bitwise operators + +local bit = {} + +function bit.bnot (a) + return ~a & 0xFFFFFFFF +end + + +-- +-- in all vararg functions, avoid creating 'arg' table when there are +-- only 2 (or less) parameters, as 2 parameters is the common case +-- + +function bit.band (x, y, z, ...) + if not z then + return ((x or -1) & (y or -1)) & 0xFFFFFFFF + else + local arg = {...} + local res = x & y & z + for i = 1, #arg do res = res & arg[i] end + return res & 0xFFFFFFFF + end +end + +function bit.bor (x, y, z, ...) + if not z then + return ((x or 0) | (y or 0)) & 0xFFFFFFFF + else + local arg = {...} + local res = x | y | z + for i = 1, #arg do res = res | arg[i] end + return res & 0xFFFFFFFF + end +end + +function bit.bxor (x, y, z, ...) + if not z then + return ((x or 0) ~ (y or 0)) & 0xFFFFFFFF + else + local arg = {...} + local res = x ~ y ~ z + for i = 1, #arg do res = res ~ arg[i] end + return res & 0xFFFFFFFF + end +end + +function bit.btest (...) + return bit.band(...) ~= 0 +end + +function bit.lshift (a, b) + return ((a & 0xFFFFFFFF) << b) & 0xFFFFFFFF +end + +function bit.rshift (a, b) + return ((a & 0xFFFFFFFF) >> b) & 0xFFFFFFFF +end + +function bit.arshift (a, b) + a = a & 0xFFFFFFFF + if b <= 0 or (a & 0x80000000) == 0 then + return (a >> b) & 0xFFFFFFFF + else + return ((a >> b) | ~(0xFFFFFFFF >> b)) & 0xFFFFFFFF + end +end + +function bit.lrotate (a ,b) + b = b & 31 + a = a & 0xFFFFFFFF + a = (a << b) | (a >> (32 - b)) + return a & 0xFFFFFFFF +end + +function bit.rrotate (a, b) + return bit.lrotate(a, -b) +end + +local function checkfield (f, w) + w = w or 1 + assert(f >= 0, "field cannot be negative") + assert(w > 0, "width must be positive") + assert(f + w <= 32, "trying to access non-existent bits") + return f, ~(-1 << w) +end + +function bit.extract (a, f, w) + local f, mask = checkfield(f, w) + return (a >> f) & mask +end + +function bit.replace (a, v, f, w) + local f, mask = checkfield(f, w) + v = v & mask + a = (a & ~(mask << f)) | (v << f) + return a & 0xFFFFFFFF +end + +return bit + +end --} + + +print("testing bitwise library") + +local bit32 = require'bit32' + +assert(bit32.band() == bit32.bnot(0)) +assert(bit32.btest() == true) +assert(bit32.bor() == 0) +assert(bit32.bxor() == 0) + +assert(bit32.band() == bit32.band(0xffffffff)) +assert(bit32.band(1,2) == 0) + + +-- out-of-range numbers +assert(bit32.band(-1) == 0xffffffff) +assert(bit32.band((1 << 33) - 1) == 0xffffffff) +assert(bit32.band(-(1 << 33) - 1) == 0xffffffff) +assert(bit32.band((1 << 33) + 1) == 1) +assert(bit32.band(-(1 << 33) + 1) == 1) +assert(bit32.band(-(1 << 40)) == 0) +assert(bit32.band(1 << 40) == 0) +assert(bit32.band(-(1 << 40) - 2) == 0xfffffffe) +assert(bit32.band((1 << 40) - 4) == 0xfffffffc) + +assert(bit32.lrotate(0, -1) == 0) +assert(bit32.lrotate(0, 7) == 0) +assert(bit32.lrotate(0x12345678, 0) == 0x12345678) +assert(bit32.lrotate(0x12345678, 32) == 0x12345678) +assert(bit32.lrotate(0x12345678, 4) == 0x23456781) +assert(bit32.rrotate(0x12345678, -4) == 0x23456781) +assert(bit32.lrotate(0x12345678, -8) == 0x78123456) +assert(bit32.rrotate(0x12345678, 8) == 0x78123456) +assert(bit32.lrotate(0xaaaaaaaa, 2) == 0xaaaaaaaa) +assert(bit32.lrotate(0xaaaaaaaa, -2) == 0xaaaaaaaa) +for i = -50, 50 do + assert(bit32.lrotate(0x89abcdef, i) == bit32.lrotate(0x89abcdef, i%32)) +end + +assert(bit32.lshift(0x12345678, 4) == 0x23456780) +assert(bit32.lshift(0x12345678, 8) == 0x34567800) +assert(bit32.lshift(0x12345678, -4) == 0x01234567) +assert(bit32.lshift(0x12345678, -8) == 0x00123456) +assert(bit32.lshift(0x12345678, 32) == 0) +assert(bit32.lshift(0x12345678, -32) == 0) +assert(bit32.rshift(0x12345678, 4) == 0x01234567) +assert(bit32.rshift(0x12345678, 8) == 0x00123456) +assert(bit32.rshift(0x12345678, 32) == 0) +assert(bit32.rshift(0x12345678, -32) == 0) +assert(bit32.arshift(0x12345678, 0) == 0x12345678) +assert(bit32.arshift(0x12345678, 1) == 0x12345678 // 2) +assert(bit32.arshift(0x12345678, -1) == 0x12345678 * 2) +assert(bit32.arshift(-1, 1) == 0xffffffff) +assert(bit32.arshift(-1, 24) == 0xffffffff) +assert(bit32.arshift(-1, 32) == 0xffffffff) +assert(bit32.arshift(-1, -1) == bit32.band(-1 * 2, 0xffffffff)) + +assert(0x12345678 << 4 == 0x123456780) +assert(0x12345678 << 8 == 0x1234567800) +assert(0x12345678 << -4 == 0x01234567) +assert(0x12345678 << -8 == 0x00123456) +assert(0x12345678 << 32 == 0x1234567800000000) +assert(0x12345678 << -32 == 0) +assert(0x12345678 >> 4 == 0x01234567) +assert(0x12345678 >> 8 == 0x00123456) +assert(0x12345678 >> 32 == 0) +assert(0x12345678 >> -32 == 0x1234567800000000) + +print("+") +-- some special cases +local c = {0, 1, 2, 3, 10, 0x80000000, 0xaaaaaaaa, 0x55555555, + 0xffffffff, 0x7fffffff} + +for _, b in pairs(c) do + assert(bit32.band(b) == b) + assert(bit32.band(b, b) == b) + assert(bit32.band(b, b, b, b) == b) + assert(bit32.btest(b, b) == (b ~= 0)) + assert(bit32.band(b, b, b) == b) + assert(bit32.band(b, b, b, ~b) == 0) + assert(bit32.btest(b, b, b) == (b ~= 0)) + assert(bit32.band(b, bit32.bnot(b)) == 0) + assert(bit32.bor(b, bit32.bnot(b)) == bit32.bnot(0)) + assert(bit32.bor(b) == b) + assert(bit32.bor(b, b) == b) + assert(bit32.bor(b, b, b) == b) + assert(bit32.bor(b, b, 0, ~b) == 0xffffffff) + assert(bit32.bxor(b) == b) + assert(bit32.bxor(b, b) == 0) + assert(bit32.bxor(b, b, b) == b) + assert(bit32.bxor(b, b, b, b) == 0) + assert(bit32.bxor(b, 0) == b) + assert(bit32.bnot(b) ~= b) + assert(bit32.bnot(bit32.bnot(b)) == b) + assert(bit32.bnot(b) == (1 << 32) - 1 - b) + assert(bit32.lrotate(b, 32) == b) + assert(bit32.rrotate(b, 32) == b) + assert(bit32.lshift(bit32.lshift(b, -4), 4) == bit32.band(b, bit32.bnot(0xf))) + assert(bit32.rshift(bit32.rshift(b, 4), -4) == bit32.band(b, bit32.bnot(0xf))) +end + +-- for this test, use at most 24 bits (mantissa of a single float) +c = {0, 1, 2, 3, 10, 0x800000, 0xaaaaaa, 0x555555, 0xffffff, 0x7fffff} +for _, b in pairs(c) do + for i = -40, 40 do + local x = bit32.lshift(b, i) + local y = math.floor(math.fmod(b * 2.0^i, 2.0^32)) + assert(math.fmod(x - y, 2.0^32) == 0) + end +end + +assert(not pcall(bit32.band, {})) +assert(not pcall(bit32.bnot, "a")) +assert(not pcall(bit32.lshift, 45)) +assert(not pcall(bit32.lshift, 45, print)) +assert(not pcall(bit32.rshift, 45, print)) + +print("+") + + +-- testing extract/replace + +assert(bit32.extract(0x12345678, 0, 4) == 8) +assert(bit32.extract(0x12345678, 4, 4) == 7) +assert(bit32.extract(0xa0001111, 28, 4) == 0xa) +assert(bit32.extract(0xa0001111, 31, 1) == 1) +assert(bit32.extract(0x50000111, 31, 1) == 0) +assert(bit32.extract(0xf2345679, 0, 32) == 0xf2345679) + +assert(not pcall(bit32.extract, 0, -1)) +assert(not pcall(bit32.extract, 0, 32)) +assert(not pcall(bit32.extract, 0, 0, 33)) +assert(not pcall(bit32.extract, 0, 31, 2)) + +assert(bit32.replace(0x12345678, 5, 28, 4) == 0x52345678) +assert(bit32.replace(0x12345678, 0x87654321, 0, 32) == 0x87654321) +assert(bit32.replace(0, 1, 2) == 2^2) +assert(bit32.replace(0, -1, 4) == 2^4) +assert(bit32.replace(-1, 0, 31) == (1 << 31) - 1) +assert(bit32.replace(-1, 0, 1, 2) == (1 << 32) - 7) + + +-- testing conversion of floats + +assert(bit32.bor(3.0) == 3) +assert(bit32.bor(-4.0) == 0xfffffffc) + +-- large floats and large-enough integers? +if 2.0^50 < 2.0^50 + 1.0 and 2.0^50 < (-1 >> 1) then + assert(bit32.bor(2.0^32 - 5.0) == 0xfffffffb) + assert(bit32.bor(-2.0^32 - 6.0) == 0xfffffffa) + assert(bit32.bor(2.0^48 - 5.0) == 0xfffffffb) + assert(bit32.bor(-2.0^48 - 6.0) == 0xfffffffa) +end + +print'OK' + diff --git a/source/lua/testes/bwcoercion.lua b/source/lua/testes/bwcoercion.lua new file mode 100644 index 0000000..cd735ab --- /dev/null +++ b/source/lua/testes/bwcoercion.lua @@ -0,0 +1,78 @@ +local tonumber, tointeger = tonumber, math.tointeger +local type, getmetatable, rawget, error = type, getmetatable, rawget, error +local strsub = string.sub + +local print = print + +_ENV = nil + +-- Try to convert a value to an integer, without assuming any coercion. +local function toint (x) + x = tonumber(x) -- handle numerical strings + if not x then + return false -- not coercible to a number + end + return tointeger(x) +end + + +-- If operation fails, maybe second operand has a metamethod that should +-- have been called if not for this string metamethod, so try to +-- call it. +local function trymt (x, y, mtname) + if type(y) ~= "string" then -- avoid recalling original metamethod + local mt = getmetatable(y) + local mm = mt and rawget(mt, mtname) + if mm then + return mm(x, y) + end + end + -- if any test fails, there is no other metamethod to be called + error("attempt to '" .. strsub(mtname, 3) .. + "' a " .. type(x) .. " with a " .. type(y), 4) +end + + +local function checkargs (x, y, mtname) + local xi = toint(x) + local yi = toint(y) + if xi and yi then + return xi, yi + else + return trymt(x, y, mtname), nil + end +end + + +local smt = getmetatable("") + +smt.__band = function (x, y) + local x, y = checkargs(x, y, "__band") + return y and x & y or x +end + +smt.__bor = function (x, y) + local x, y = checkargs(x, y, "__bor") + return y and x | y or x +end + +smt.__bxor = function (x, y) + local x, y = checkargs(x, y, "__bxor") + return y and x ~ y or x +end + +smt.__shl = function (x, y) + local x, y = checkargs(x, y, "__shl") + return y and x << y or x +end + +smt.__shr = function (x, y) + local x, y = checkargs(x, y, "__shr") + return y and x >> y or x +end + +smt.__bnot = function (x) + local x, y = checkargs(x, x, "__bnot") + return y and ~x or x +end + diff --git a/source/lua/testes/calls.lua b/source/lua/testes/calls.lua new file mode 100644 index 0000000..f5108a4 --- /dev/null +++ b/source/lua/testes/calls.lua @@ -0,0 +1,435 @@ +-- $Id: testes/calls.lua $ +-- See Copyright Notice in file all.lua + +print("testing functions and calls") + +local debug = require "debug" + +-- get the opportunity to test 'type' too ;) + +assert(type(1<2) == 'boolean') +assert(type(true) == 'boolean' and type(false) == 'boolean') +assert(type(nil) == 'nil' + and type(-3) == 'number' + and type'x' == 'string' + and type{} == 'table' + and type(type) == 'function') + +assert(type(assert) == type(print)) +function f (x) return a:x (x) end +assert(type(f) == 'function') +assert(not pcall(type)) + + +do -- test error in 'print' too... + local tostring = _ENV.tostring + + _ENV.tostring = nil + local st, msg = pcall(print, 1) + assert(st == false and string.find(msg, "attempt to call a nil value")) + + _ENV.tostring = function () return {} end + local st, msg = pcall(print, 1) + assert(st == false and string.find(msg, "must return a string")) + + _ENV.tostring = tostring +end + + +-- testing local-function recursion +fact = false +do + local res = 1 + local function fact (n) + if n==0 then return res + else return n*fact(n-1) + end + end + assert(fact(5) == 120) +end +assert(fact == false) + +-- testing declarations +a = {i = 10} +self = 20 +function a:x (x) return x+self.i end +function a.y (x) return x+self end + +assert(a:x(1)+10 == a.y(1)) + +a.t = {i=-100} +a["t"].x = function (self, a,b) return self.i+a+b end + +assert(a.t:x(2,3) == -95) + +do + local a = {x=0} + function a:add (x) self.x, a.y = self.x+x, 20; return self end + assert(a:add(10):add(20):add(30).x == 60 and a.y == 20) +end + +local a = {b={c={}}} + +function a.b.c.f1 (x) return x+1 end +function a.b.c:f2 (x,y) self[x] = y end +assert(a.b.c.f1(4) == 5) +a.b.c:f2('k', 12); assert(a.b.c.k == 12) + +print('+') + +t = nil -- 'declare' t +function f(a,b,c) local d = 'a'; t={a,b,c,d} end + +f( -- this line change must be valid + 1,2) +assert(t[1] == 1 and t[2] == 2 and t[3] == nil and t[4] == 'a') +f(1,2, -- this one too + 3,4) +assert(t[1] == 1 and t[2] == 2 and t[3] == 3 and t[4] == 'a') + +function fat(x) + if x <= 1 then return 1 + else return x*load("return fat(" .. x-1 .. ")", "")() + end +end + +assert(load "load 'assert(fat(6)==720)' () ")() +a = load('return fat(5), 3') +a,b = a() +assert(a == 120 and b == 3) +print('+') + +function err_on_n (n) + if n==0 then error(); exit(1); + else err_on_n (n-1); exit(1); + end +end + +do + function dummy (n) + if n > 0 then + assert(not pcall(err_on_n, n)) + dummy(n-1) + end + end +end + +dummy(10) + +function deep (n) + if n>0 then deep(n-1) end +end +deep(10) +deep(180) + +-- testing tail calls +function deep (n) if n>0 then return deep(n-1) else return 101 end end +assert(deep(30000) == 101) +a = {} +function a:deep (n) if n>0 then return self:deep(n-1) else return 101 end end +assert(a:deep(30000) == 101) + +do -- tail calls x varargs + local function foo (x, ...) local a = {...}; return x, a[1], a[2] end + + local function foo1 (x) return foo(10, x, x + 1) end + + local a, b, c = foo1(-2) + assert(a == 10 and b == -2 and c == -1) + + -- tail calls x metamethods + local t = setmetatable({}, {__call = foo}) + local function foo2 (x) return t(10, x) end + a, b, c = foo2(100) + assert(a == t and b == 10 and c == 100) + + a, b = (function () return foo() end)() + assert(a == nil and b == nil) + + local X, Y, A + local function foo (x, y, ...) X = x; Y = y; A = {...} end + local function foo1 (...) return foo(...) end + + local a, b, c = foo1() + assert(X == nil and Y == nil and #A == 0) + + a, b, c = foo1(10) + assert(X == 10 and Y == nil and #A == 0) + + a, b, c = foo1(10, 20) + assert(X == 10 and Y == 20 and #A == 0) + + a, b, c = foo1(10, 20, 30) + assert(X == 10 and Y == 20 and #A == 1 and A[1] == 30) +end + +print('+') + + +a = nil +(function (x) a=x end)(23) +assert(a == 23 and (function (x) return x*2 end)(20) == 40) + + +-- testing closures + +-- fixed-point operator +Z = function (le) + local function a (f) + return le(function (x) return f(f)(x) end) + end + return a(a) + end + + +-- non-recursive factorial + +F = function (f) + return function (n) + if n == 0 then return 1 + else return n*f(n-1) end + end + end + +fat = Z(F) + +assert(fat(0) == 1 and fat(4) == 24 and Z(F)(5)==5*Z(F)(4)) + +local function g (z) + local function f (a,b,c,d) + return function (x,y) return a+b+c+d+a+x+y+z end + end + return f(z,z+1,z+2,z+3) +end + +f = g(10) +assert(f(9, 16) == 10+11+12+13+10+9+16+10) + +Z, F, f = nil +print('+') + +-- testing multiple returns + +function unlpack (t, i) + i = i or 1 + if (i <= #t) then + return t[i], unlpack(t, i+1) + end +end + +function equaltab (t1, t2) + assert(#t1 == #t2) + for i = 1, #t1 do + assert(t1[i] == t2[i]) + end +end + +local pack = function (...) return (table.pack(...)) end + +function f() return 1,2,30,4 end +function ret2 (a,b) return a,b end + +local a,b,c,d = unlpack{1,2,3} +assert(a==1 and b==2 and c==3 and d==nil) +a = {1,2,3,4,false,10,'alo',false,assert} +equaltab(pack(unlpack(a)), a) +equaltab(pack(unlpack(a), -1), {1,-1}) +a,b,c,d = ret2(f()), ret2(f()) +assert(a==1 and b==1 and c==2 and d==nil) +a,b,c,d = unlpack(pack(ret2(f()), ret2(f()))) +assert(a==1 and b==1 and c==2 and d==nil) +a,b,c,d = unlpack(pack(ret2(f()), (ret2(f())))) +assert(a==1 and b==1 and c==nil and d==nil) + +a = ret2{ unlpack{1,2,3}, unlpack{3,2,1}, unlpack{"a", "b"}} +assert(a[1] == 1 and a[2] == 3 and a[3] == "a" and a[4] == "b") + + +-- testing calls with 'incorrect' arguments +rawget({}, "x", 1) +rawset({}, "x", 1, 2) +assert(math.sin(1,2) == math.sin(1)) +table.sort({10,9,8,4,19,23,0,0}, function (a,b) return a 10 or a[i]() ~= x +assert(i == 11 and a[1]() == 1 and a[3]() == 3 and i == 4) + + +-- testing closures created in 'then' and 'else' parts of 'if's +a = {} +for i = 1, 10 do + if i % 3 == 0 then + local y = 0 + a[i] = function (x) local t = y; y = x; return t end + elseif i % 3 == 1 then + goto L1 + error'not here' + ::L1:: + local y = 1 + a[i] = function (x) local t = y; y = x; return t end + elseif i % 3 == 2 then + local t + goto l4 + ::l4a:: a[i] = t; goto l4b + error("should never be here!") + ::l4:: + local y = 2 + t = function (x) local t = y; y = x; return t end + goto l4a + error("should never be here!") + ::l4b:: + end +end + +for i = 1, 10 do + assert(a[i](i * 10) == i % 3 and a[i]() == i * 10) +end + +print'+' + + +-- test for correctly closing upvalues in tail calls of vararg functions +local function t () + local function c(a,b) assert(a=="test" and b=="OK") end + local function v(f, ...) c("test", f() ~= 1 and "FAILED" or "OK") end + local x = 1 + return v(function() return x end) +end +t() + + +-- test for debug manipulation of upvalues +local debug = require'debug' + +do + local a , b, c = 3, 5, 7 + foo1 = function () return a+b end; + foo2 = function () return b+a end; + do + local a = 10 + foo3 = function () return a+b end; + end +end + +assert(debug.upvalueid(foo1, 1)) +assert(debug.upvalueid(foo1, 2)) +assert(not pcall(debug.upvalueid, foo1, 3)) +assert(debug.upvalueid(foo1, 1) == debug.upvalueid(foo2, 2)) +assert(debug.upvalueid(foo1, 2) == debug.upvalueid(foo2, 1)) +assert(debug.upvalueid(foo3, 1)) +assert(debug.upvalueid(foo1, 1) ~= debug.upvalueid(foo3, 1)) +assert(debug.upvalueid(foo1, 2) == debug.upvalueid(foo3, 2)) + +assert(debug.upvalueid(string.gmatch("x", "x"), 1) ~= nil) + +assert(foo1() == 3 + 5 and foo2() == 5 + 3) +debug.upvaluejoin(foo1, 2, foo2, 2) +assert(foo1() == 3 + 3 and foo2() == 5 + 3) +assert(foo3() == 10 + 5) +debug.upvaluejoin(foo3, 2, foo2, 1) +assert(foo3() == 10 + 5) +debug.upvaluejoin(foo3, 2, foo2, 2) +assert(foo3() == 10 + 3) + +assert(not pcall(debug.upvaluejoin, foo1, 3, foo2, 1)) +assert(not pcall(debug.upvaluejoin, foo1, 1, foo2, 3)) +assert(not pcall(debug.upvaluejoin, foo1, 0, foo2, 1)) +assert(not pcall(debug.upvaluejoin, print, 1, foo2, 1)) +assert(not pcall(debug.upvaluejoin, {}, 1, foo2, 1)) +assert(not pcall(debug.upvaluejoin, foo1, 1, print, 1)) + +print'OK' diff --git a/source/lua/testes/code.lua b/source/lua/testes/code.lua new file mode 100644 index 0000000..834ff5e --- /dev/null +++ b/source/lua/testes/code.lua @@ -0,0 +1,384 @@ +-- $Id: testes/code.lua $ +-- See Copyright Notice in file all.lua + +if T==nil then + (Message or print)('\n >>> testC not active: skipping opcode tests <<<\n') + return +end +print "testing code generation and optimizations" + + +-- this code gave an error for the code checker +do + local function f (a) + for k,v,w in a do end + end +end + + +-- testing reuse in constant table +local function checkKlist (func, list) + local k = T.listk(func) + assert(#k == #list) + for i = 1, #k do + assert(k[i] == list[i] and math.type(k[i]) == math.type(list[i])) + end +end + +local function foo () + local a + a = 3; + a = 0; a = 0.0; a = -7 + 7 + a = 3.78/4; a = 3.78/4 + a = -3.78/4; a = 3.78/4; a = -3.78/4 + a = -3.79/4; a = 0.0; a = -0; + a = 3; a = 3.0; a = 3; a = 3.0 +end + +checkKlist(foo, {3.78/4, -3.78/4, -3.79/4}) + + +-- testing opcodes + +-- check that 'f' opcodes match '...' +function check (f, ...) + local arg = {...} + local c = T.listcode(f) + for i=1, #arg do + local opcode = string.match(c[i], "%u%w+") + -- print(arg[i], opcode) + assert(arg[i] == opcode) + end + assert(c[#arg+2] == undef) +end + + +-- check that 'f' opcodes match '...' and that 'f(p) == r'. +function checkR (f, p, r, ...) + local r1 = f(p) + assert(r == r1 and math.type(r) == math.type(r1)) + check(f, ...) +end + + +-- check that 'a' and 'b' has the same opcodes +function checkequal (a, b) + a = T.listcode(a) + b = T.listcode(b) + assert(#a == #b) + for i = 1, #a do + a[i] = string.gsub(a[i], '%b()', '') -- remove line number + b[i] = string.gsub(b[i], '%b()', '') -- remove line number + assert(a[i] == b[i]) + end +end + + +-- some basic instructions +check(function () -- function does not create upvalues + (function () end){f()} +end, 'CLOSURE', 'NEWTABLE', 'GETTABUP', 'CALL', 'SETLIST', 'CALL', 'RETURN0') + +check(function (x) -- function creates upvalues + (function () return x end){f()} +end, 'CLOSURE', 'NEWTABLE', 'GETTABUP', 'CALL', 'SETLIST', 'CALL', 'RETURN') + + +-- sequence of LOADNILs +check(function () + local a,b,c + local d; local e; + local f,g,h; + d = nil; d=nil; b=nil; a=nil; c=nil; +end, 'LOADNIL', 'RETURN0') + +check(function () + local a,b,c,d = 1,1,1,1 + d=nil;c=nil;b=nil;a=nil +end, 'LOADI', 'LOADI', 'LOADI', 'LOADI', 'LOADNIL', 'RETURN0') + +do + local a,b,c,d = 1,1,1,1 + d=nil;c=nil;b=nil;a=nil + assert(a == nil and b == nil and c == nil and d == nil) +end + + +-- single return +check (function (a,b,c) return a end, 'RETURN1') + + +-- infinite loops +check(function () while true do local a = -1 end end, +'LOADI', 'JMP', 'RETURN0') + +check(function () while 1 do local a = -1 end end, +'LOADI', 'JMP', 'RETURN0') + +check(function () repeat local x = 1 until true end, +'LOADI', 'RETURN0') + + +-- concat optimization +check(function (a,b,c,d) return a..b..c..d end, + 'MOVE', 'MOVE', 'MOVE', 'MOVE', 'CONCAT', 'RETURN1') + +-- not +check(function () return not not nil end, 'LOADBOOL', 'RETURN1') +check(function () return not not false end, 'LOADBOOL', 'RETURN1') +check(function () return not not true end, 'LOADBOOL', 'RETURN1') +check(function () return not not 1 end, 'LOADBOOL', 'RETURN1') + +-- direct access to locals +check(function () + local a,b,c,d + a = b*a + c.x, a[b] = -((a + d/b - a[b]) ^ a.x), b +end, + 'LOADNIL', + 'MUL', + 'DIV', 'ADD', 'GETTABLE', 'SUB', 'GETFIELD', 'POW', + 'UNM', 'SETTABLE', 'SETFIELD', 'RETURN0') + + +-- direct access to constants +check(function () + local a,b + a.x = 3.2 + a.x = b + a[b] = 'x' +end, + 'LOADNIL', 'SETFIELD', 'SETFIELD', 'SETTABLE', 'RETURN0') + +-- "get/set table" with numeric indices +check(function (a) + a[1] = a[100] + a[255] = a[256] + a[256] = 5 +end, + 'GETI', 'SETI', + 'LOADI', 'GETTABLE', 'SETI', + 'LOADI', 'SETTABLE', 'RETURN0') + +check(function () + local a,b + a = a - a + b = a/a + b = 5-4 +end, + 'LOADNIL', 'SUB', 'DIV', 'LOADI', 'RETURN0') + +check(function () + local a,b + a[true] = false +end, + 'LOADNIL', 'LOADBOOL', 'SETTABLE', 'RETURN0') + + +-- equalities +checkR(function (a) if a == 1 then return 2 end end, 1, 2, + 'EQI', 'JMP', 'LOADI', 'RETURN1') + +checkR(function (a) if -4.0 == a then return 2 end end, -4, 2, + 'EQI', 'JMP', 'LOADI', 'RETURN1') + +checkR(function (a) if a == "hi" then return 2 end end, 10, nil, + 'EQK', 'JMP', 'LOADI', 'RETURN1') + +checkR(function (a) if a == 10000 then return 2 end end, 1, nil, + 'EQK', 'JMP', 'LOADI', 'RETURN1') -- number too large + +checkR(function (a) if -10000 == a then return 2 end end, -10000, 2, + 'EQK', 'JMP', 'LOADI', 'RETURN1') -- number too large + +-- comparisons + +checkR(function (a) if -10 <= a then return 2 end end, -10, 2, + 'GEI', 'JMP', 'LOADI', 'RETURN1') + +checkR(function (a) if 128.0 > a then return 2 end end, 129, nil, + 'LTI', 'JMP', 'LOADI', 'RETURN1') + +checkR(function (a) if -127.0 < a then return 2 end end, -127, nil, + 'GTI', 'JMP', 'LOADI', 'RETURN1') + +checkR(function (a) if 10 < a then return 2 end end, 11, 2, + 'GTI', 'JMP', 'LOADI', 'RETURN1') + +checkR(function (a) if 129 < a then return 2 end end, 130, 2, + 'LOADI', 'LT', 'JMP', 'LOADI', 'RETURN1') + +checkR(function (a) if a >= 23.0 then return 2 end end, 25, 2, + 'GEI', 'JMP', 'LOADI', 'RETURN1') + +checkR(function (a) if a >= 23.1 then return 2 end end, 0, nil, + 'LOADK', 'LE', 'JMP', 'LOADI', 'RETURN1') + +checkR(function (a) if a > 2300.0 then return 2 end end, 0, nil, + 'LOADF', 'LT', 'JMP', 'LOADI', 'RETURN1') + + +-- constant folding +local function checkK (func, val) + check(func, 'LOADK', 'RETURN1') + checkKlist(func, {val}) + assert(func() == val) +end + +local function checkI (func, val) + check(func, 'LOADI', 'RETURN1') + checkKlist(func, {}) + assert(func() == val) +end + +local function checkF (func, val) + check(func, 'LOADF', 'RETURN1') + checkKlist(func, {}) + assert(func() == val) +end + +checkF(function () return 0.0 end, 0.0) +checkI(function () return 0 end, 0) +checkI(function () return -0//1 end, 0) +checkK(function () return 3^-1 end, 1/3) +checkK(function () return (1 + 1)^(50 + 50) end, 2^100) +checkK(function () return (-2)^(31 - 2) end, -0x20000000 + 0.0) +checkF(function () return (-3^0 + 5) // 3.0 end, 1.0) +checkI(function () return -3 % 5 end, 2) +checkF(function () return -((2.0^8 + -(-1)) % 8)/2 * 4 - 3 end, -5.0) +checkF(function () return -((2^8 + -(-1)) % 8)//2 * 4 - 3 end, -7.0) +checkI(function () return 0xF0.0 | 0xCC.0 ~ 0xAA & 0xFD end, 0xF4) +checkI(function () return ~(~0xFF0 | 0xFF0) end, 0) +checkI(function () return ~~-1024.0 end, -1024) +checkI(function () return ((100 << 6) << -4) >> 2 end, 100) + +-- borders around MAXARG_sBx ((((1 << 17) - 1) >> 1) == 65535) +local a = 17; local sbx = ((1 << a) - 1) >> 1 -- avoid folding +checkI(function () return 65535 end, sbx) +checkI(function () return -65535 end, -sbx) +checkI(function () return 65536 end, sbx + 1) +checkK(function () return 65537 end, sbx + 2) +checkK(function () return -65536 end, -(sbx + 1)) + +checkF(function () return 65535.0 end, sbx + 0.0) +checkF(function () return -65535.0 end, -sbx + 0.0) +checkF(function () return 65536.0 end, (sbx + 1.0)) +checkK(function () return 65537.0 end, (sbx + 2.0)) +checkK(function () return -65536.0 end, -(sbx + 1.0)) + + +-- immediate operands +checkR(function (x) return x + 1 end, 10, 11, 'ADDI', 'RETURN1') +checkR(function (x) return 128 + x end, 0.0, 128.0, 'ADDI', 'RETURN1') +checkR(function (x) return x * -127 end, -1.0, 127.0, 'MULI', 'RETURN1') +checkR(function (x) return 20 * x end, 2, 40, 'MULI', 'RETURN1') +checkR(function (x) return x ^ -2 end, 2, 0.25, 'POWI', 'RETURN1') +checkR(function (x) return x / 40 end, 40, 1.0, 'DIVI', 'RETURN1') +checkR(function (x) return x // 1 end, 10.0, 10.0, 'IDIVI', 'RETURN1') +checkR(function (x) return x % (100 - 10) end, 91, 1, 'MODI', 'RETURN1') +checkR(function (x) return 1 << x end, 3, 8, 'SHLI', 'RETURN1') +checkR(function (x) return x << 2 end, 10, 40, 'SHRI', 'RETURN1') +checkR(function (x) return x >> 2 end, 8, 2, 'SHRI', 'RETURN1') +checkR(function (x) return x & 1 end, 9, 1, 'BANDK', 'RETURN1') +checkR(function (x) return 10 | x end, 1, 11, 'BORK', 'RETURN1') +checkR(function (x) return -10 ~ x end, -1, 9, 'BXORK', 'RETURN1') + +-- K operands in arithmetic operations +checkR(function (x) return x + 0.0 end, 1, 1.0, 'ADDK', 'RETURN1') +-- check(function (x) return 128 + x end, 'ADDK', 'RETURN1') +checkR(function (x) return x * -10000 end, 2, -20000, 'MULK', 'RETURN1') +-- check(function (x) return 20 * x end, 'MULK', 'RETURN1') +checkR(function (x) return x ^ 0.5 end, 4, 2.0, 'POWK', 'RETURN1') +checkR(function (x) return x / 2.0 end, 4, 2.0, 'DIVK', 'RETURN1') +checkR(function (x) return x // 10000 end, 10000, 1, 'IDIVK', 'RETURN1') +checkR(function (x) return x % (100.0 - 10) end, 91, 1.0, 'MODK', 'RETURN1') + +-- no foldings (and immediate operands) +check(function () return -0.0 end, 'LOADF', 'UNM', 'RETURN1') +check(function () return 3/0 end, 'LOADI', 'DIVI', 'RETURN1') +check(function () return 0%0 end, 'LOADI', 'MODI', 'RETURN1') +check(function () return -4//0 end, 'LOADI', 'IDIVI', 'RETURN1') +check(function (x) return x >> 2.0 end, 'LOADF', 'SHR', 'RETURN1') +check(function (x) return x & 2.0 end, 'LOADF', 'BAND', 'RETURN1') + +-- basic 'for' loops +check(function () for i = -10, 10.5 do end end, +'LOADI', 'LOADK', 'LOADI', 'FORPREP1', 'FORLOOP1', 'RETURN0') +check(function () for i = 0xfffffff, 10.0, 1 do end end, +'LOADK', 'LOADF', 'LOADI', 'FORPREP1', 'FORLOOP1', 'RETURN0') + +-- bug in constant folding for 5.1 +check(function () return -nil end, 'LOADNIL', 'UNM', 'RETURN1') + + +check(function () + local a,b,c + b[c], a = c, b + b[a], a = c, b + a, b = c, a + a = a +end, + 'LOADNIL', + 'MOVE', 'MOVE', 'SETTABLE', + 'MOVE', 'MOVE', 'MOVE', 'SETTABLE', + 'MOVE', 'MOVE', 'MOVE', + -- no code for a = a + 'RETURN0') + + +-- x == nil , x ~= nil +-- checkequal(function (b) if (a==nil) then a=1 end; if a~=nil then a=1 end end, +-- function () if (a==9) then a=1 end; if a~=9 then a=1 end end) + +-- check(function () if a==nil then a='a' end end, +-- 'GETTABUP', 'EQ', 'JMP', 'SETTABUP', 'RETURN') + +do -- tests for table access in upvalues + local t + check(function () t.x = t.y end, 'GETTABUP', 'SETTABUP') + check(function (a) t[a()] = t[a()] end, + 'MOVE', 'CALL', 'GETUPVAL', 'MOVE', 'CALL', + 'GETUPVAL', 'GETTABLE', 'SETTABLE') +end + +-- de morgan +checkequal(function () local a; if not (a or b) then b=a end end, + function () local a; if (not a and not b) then b=a end end) + +checkequal(function (l) local a; return 0 <= a and a <= l end, + function (l) local a; return not (not(a >= 0) or not(a <= l)) end) + + +-- if-break optimizations +check(function (a, b) + while a do + if b then break else a = a + 1 end + end + end, +'TEST', 'JMP', 'TEST', 'JMP', 'ADDI', 'JMP', 'RETURN0') + +checkequal( +function (a) while a < 10 do a = a + 1 end end, +function (a) + ::loop:: + if not (a < 10) then goto exit end + a = a + 1 + goto loop +::exit:: +end +) + +checkequal( +function (a) repeat local x = a + 1; a = x until a > 0 end, +function (a) + ::loop:: do + local x = a + 1 + a = x + end + if not (a > 0) then goto loop end +end +) + + +print 'OK' + diff --git a/source/lua/testes/constructs.lua b/source/lua/testes/constructs.lua new file mode 100644 index 0000000..a83df79 --- /dev/null +++ b/source/lua/testes/constructs.lua @@ -0,0 +1,302 @@ +-- $Id: testes/constructs.lua $ +-- See Copyright Notice in file all.lua + +;;print "testing syntax";; + +local debug = require "debug" + + +local function checkload (s, msg) + assert(string.find(select(2, load(s)), msg)) +end + +-- testing semicollons +do ;;; end +; do ; a = 3; assert(a == 3) end; +; + + +-- invalid operations should not raise errors when not executed +if false then a = 3 // 0; a = 0 % 0 end + + +-- testing priorities + +assert(2^3^2 == 2^(3^2)); +assert(2^3*4 == (2^3)*4); +assert(2.0^-2 == 1/4 and -2^- -2 == - - -4); +assert(not nil and 2 and not(2>3 or 3<2)); +assert(-3-1-5 == 0+0-9); +assert(-2^2 == -4 and (-2)^2 == 4 and 2*2-3-1 == 0); +assert(-3%5 == 2 and -3+5 == 2) +assert(2*1+3/3 == 3 and 1+2 .. 3*1 == "33"); +assert(not(2+1 > 3*1) and "a".."b" > "a"); + +assert(0xF0 | 0xCC ~ 0xAA & 0xFD == 0xF4) +assert(0xFD & 0xAA ~ 0xCC | 0xF0 == 0xF4) +assert(0xF0 & 0x0F + 1 == 0x10) + +assert(3^4//2^3//5 == 2) + +assert(-3+4*5//2^3^2//9+4%10/3 == (-3)+(((4*5)//(2^(3^2)))//9)+((4%10)/3)) + +assert(not ((true or false) and nil)) +assert( true or false and nil) + +-- old bug +assert((((1 or false) and true) or false) == true) +assert((((nil and true) or false) and true) == false) + +local a,b = 1,nil; +assert(-(1 or 2) == -1 and (1 and 2)+(-1.25 or -4) == 0.75); +x = ((b or a)+1 == 2 and (10 or a)+1 == 11); assert(x); +x = (((2<3) or 1) == true and (2<3 and 4) == 4); assert(x); + +x,y=1,2; +assert((x>y) and x or y == 2); +x,y=2,1; +assert((x>y) and x or y == 2); + +assert(1234567890 == tonumber('1234567890') and 1234567890+1 == 1234567891) + + +-- silly loops +repeat until 1; repeat until true; +while false do end; while nil do end; + +do -- test old bug (first name could not be an `upvalue') + local a; function f(x) x={a=1}; x={x=1}; x={G=1} end +end + +function f (i) + if type(i) ~= 'number' then return i,'jojo'; end; + if i > 0 then return i, f(i-1); end; +end + +x = {f(3), f(5), f(10);}; +assert(x[1] == 3 and x[2] == 5 and x[3] == 10 and x[4] == 9 and x[12] == 1); +assert(x[nil] == nil) +x = {f'alo', f'xixi', nil}; +assert(x[1] == 'alo' and x[2] == 'xixi' and x[3] == nil); +x = {f'alo'..'xixi'}; +assert(x[1] == 'aloxixi') +x = {f{}} +assert(x[2] == 'jojo' and type(x[1]) == 'table') + + +local f = function (i) + if i < 10 then return 'a'; + elseif i < 20 then return 'b'; + elseif i < 30 then return 'c'; + end; +end + +assert(f(3) == 'a' and f(12) == 'b' and f(26) == 'c' and f(100) == nil) + +for i=1,1000 do break; end; +n=100; +i=3; +t = {}; +a=nil +while not a do + a=0; for i=1,n do for i=i,1,-1 do a=a+1; t[i]=1; end; end; +end +assert(a == n*(n+1)/2 and i==3); +assert(t[1] and t[n] and not t[0] and not t[n+1]) + +function f(b) + local x = 1; + repeat + local a; + if b==1 then local b=1; x=10; break + elseif b==2 then x=20; break; + elseif b==3 then x=30; + else local a,b,c,d=math.sin(1); x=x+1; + end + until x>=12; + return x; +end; + +assert(f(1) == 10 and f(2) == 20 and f(3) == 30 and f(4)==12) + + +local f = function (i) + if i < 10 then return 'a' + elseif i < 20 then return 'b' + elseif i < 30 then return 'c' + else return 8 + end +end + +assert(f(3) == 'a' and f(12) == 'b' and f(26) == 'c' and f(100) == 8) + +local a, b = nil, 23 +x = {f(100)*2+3 or a, a or b+2} +assert(x[1] == 19 and x[2] == 25) +x = {f=2+3 or a, a = b+2} +assert(x.f == 5 and x.a == 25) + +a={y=1} +x = {a.y} +assert(x[1] == 1) + +function f(i) + while 1 do + if i>0 then i=i-1; + else return; end; + end; +end; + +function g(i) + while 1 do + if i>0 then i=i-1 + else return end + end +end + +f(10); g(10); + +do + function f () return 1,2,3; end + local a, b, c = f(); + assert(a==1 and b==2 and c==3) + a, b, c = (f()); + assert(a==1 and b==nil and c==nil) +end + +local a,b = 3 and f(); +assert(a==1 and b==nil) + +function g() f(); return; end; +assert(g() == nil) +function g() return nil or f() end +a,b = g() +assert(a==1 and b==nil) + +print'+'; + + +f = [[ +return function ( a , b , c , d , e ) + local x = a >= b or c or ( d and e ) or nil + return x +end , { a = 1 , b = 2 >= 1 , } or { 1 }; +]] +f = string.gsub(f, "%s+", "\n"); -- force a SETLINE between opcodes +f,a = load(f)(); +assert(a.a == 1 and a.b) + +function g (a,b,c,d,e) + if not (a>=b or c or d and e or nil) then return 0; else return 1; end; +end + +function h (a,b,c,d,e) + while (a>=b or c or (d and e) or nil) do return 1; end; + return 0; +end; + +assert(f(2,1) == true and g(2,1) == 1 and h(2,1) == 1) +assert(f(1,2,'a') == 'a' and g(1,2,'a') == 1 and h(1,2,'a') == 1) +assert(f(1,2,'a') +~= -- force SETLINE before nil +nil, "") +assert(f(1,2,'a') == 'a' and g(1,2,'a') == 1 and h(1,2,'a') == 1) +assert(f(1,2,nil,1,'x') == 'x' and g(1,2,nil,1,'x') == 1 and + h(1,2,nil,1,'x') == 1) +assert(f(1,2,nil,nil,'x') == nil and g(1,2,nil,nil,'x') == 0 and + h(1,2,nil,nil,'x') == 0) +assert(f(1,2,nil,1,nil) == nil and g(1,2,nil,1,nil) == 0 and + h(1,2,nil,1,nil) == 0) + +assert(1 and 2<3 == true and 2<3 and 'a'<'b' == true) +x = 2<3 and not 3; assert(x==false) +x = 2<1 or (2>1 and 'a'); assert(x=='a') + + +do + local a; if nil then a=1; else a=2; end; -- this nil comes as PUSHNIL 2 + assert(a==2) +end + +function F(a) + assert(debug.getinfo(1, "n").name == 'F') + return a,2,3 +end + +a,b = F(1)~=nil; assert(a == true and b == nil); +a,b = F(nil)==nil; assert(a == true and b == nil) + +---------------------------------------------------------------- +------------------------------------------------------------------ + +-- sometimes will be 0, sometimes will not... +_ENV.GLOB1 = math.floor(os.time()) % 2 + +-- basic expressions with their respective values +local basiccases = { + {"nil", nil}, + {"false", false}, + {"true", true}, + {"10", 10}, + {"(0==_ENV.GLOB1)", 0 == _ENV.GLOB1}, +} + +print('testing short-circuit optimizations (' .. _ENV.GLOB1 .. ')') + + +-- operators with their respective values +local binops = { + {" and ", function (a,b) if not a then return a else return b end end}, + {" or ", function (a,b) if a then return a else return b end end}, +} + +local cases = {} + +-- creates all combinations of '(cases[i] op cases[n-i])' plus +-- 'not(cases[i] op cases[n-i])' (syntax + value) +local function createcases (n) + local res = {} + for i = 1, n - 1 do + for _, v1 in ipairs(cases[i]) do + for _, v2 in ipairs(cases[n - i]) do + for _, op in ipairs(binops) do + local t = { + "(" .. v1[1] .. op[1] .. v2[1] .. ")", + op[2](v1[2], v2[2]) + } + res[#res + 1] = t + res[#res + 1] = {"not" .. t[1], not t[2]} + end + end + end + end + return res +end + +-- do not do too many combinations for soft tests +local level = _soft and 3 or 4 + +cases[1] = basiccases +for i = 2, level do cases[i] = createcases(i) end +print("+") + +local prog = [[if %s then IX = true end; return %s]] + +local i = 0 +for n = 1, level do + for _, v in pairs(cases[n]) do + local s = v[1] + local p = load(string.format(prog, s, s), "") + IX = false + assert(p() == v[2] and IX == not not v[2]) + i = i + 1 + if i % 60000 == 0 then print('+') end + end +end +------------------------------------------------------------------ + +-- testing some syntax errors (chosen through 'gcov') +checkload("for x do", "expected") +checkload("x:call", "expected") + +print'OK' diff --git a/source/lua/testes/coroutine.lua b/source/lua/testes/coroutine.lua new file mode 100644 index 0000000..a4321be --- /dev/null +++ b/source/lua/testes/coroutine.lua @@ -0,0 +1,970 @@ +-- $Id: testes/coroutine.lua $ +-- See Copyright Notice in file all.lua + +print "testing coroutines" + +local debug = require'debug' + +local f + +local main, ismain = coroutine.running() +assert(type(main) == "thread" and ismain) +assert(not coroutine.resume(main)) +assert(not coroutine.isyieldable()) +assert(not pcall(coroutine.yield)) + + +-- trivial errors +assert(not pcall(coroutine.resume, 0)) +assert(not pcall(coroutine.status, 0)) + + +-- tests for multiple yield/resume arguments + +local function eqtab (t1, t2) + assert(#t1 == #t2) + for i = 1, #t1 do + local v = t1[i] + assert(t2[i] == v) + end +end + +_G.x = nil -- declare x +function foo (a, ...) + local x, y = coroutine.running() + assert(x == f and y == false) + -- next call should not corrupt coroutine (but must fail, + -- as it attempts to resume the running coroutine) + assert(coroutine.resume(f) == false) + assert(coroutine.status(f) == "running") + local arg = {...} + assert(coroutine.isyieldable()) + for i=1,#arg do + _G.x = {coroutine.yield(table.unpack(arg[i]))} + end + return table.unpack(a) +end + +f = coroutine.create(foo) +assert(type(f) == "thread" and coroutine.status(f) == "suspended") +assert(string.find(tostring(f), "thread")) +local s,a,b,c,d +s,a,b,c,d = coroutine.resume(f, {1,2,3}, {}, {1}, {'a', 'b', 'c'}) +assert(s and a == nil and coroutine.status(f) == "suspended") +s,a,b,c,d = coroutine.resume(f) +eqtab(_G.x, {}) +assert(s and a == 1 and b == nil) +s,a,b,c,d = coroutine.resume(f, 1, 2, 3) +eqtab(_G.x, {1, 2, 3}) +assert(s and a == 'a' and b == 'b' and c == 'c' and d == nil) +s,a,b,c,d = coroutine.resume(f, "xuxu") +eqtab(_G.x, {"xuxu"}) +assert(s and a == 1 and b == 2 and c == 3 and d == nil) +assert(coroutine.status(f) == "dead") +s, a = coroutine.resume(f, "xuxu") +assert(not s and string.find(a, "dead") and coroutine.status(f) == "dead") + + +-- yields in tail calls +local function foo (i) return coroutine.yield(i) end +f = coroutine.wrap(function () + for i=1,10 do + assert(foo(i) == _G.x) + end + return 'a' +end) +for i=1,10 do _G.x = i; assert(f(i) == i) end +_G.x = 'xuxu'; assert(f('xuxu') == 'a') + +-- recursive +function pf (n, i) + coroutine.yield(n) + pf(n*i, i+1) +end + +f = coroutine.wrap(pf) +local s=1 +for i=1,10 do + assert(f(1, 1) == s) + s = s*i +end + +-- sieve +function gen (n) + return coroutine.wrap(function () + for i=2,n do coroutine.yield(i) end + end) +end + + +function filter (p, g) + return coroutine.wrap(function () + while 1 do + local n = g() + if n == nil then return end + if math.fmod(n, p) ~= 0 then coroutine.yield(n) end + end + end) +end + +local x = gen(80) +local a = {} +while 1 do + local n = x() + if n == nil then break end + table.insert(a, n) + x = filter(n, x) +end + +assert(#a == 22 and a[#a] == 79) +x, a = nil + + +-- coroutine kill +do + -- ok to kill a dead coroutine + local co = coroutine.create(print) + assert(coroutine.resume(co, "testing 'coroutine.kill'")) + assert(coroutine.status(co) == "dead") + assert(coroutine.kill(co)) + + -- cannot kill the running coroutine + local st, msg = pcall(coroutine.kill, coroutine.running()) + assert(not st and string.find(msg, "running")) + + local main = coroutine.running() + + -- cannot kill a "normal" coroutine + ;(coroutine.wrap(function () + local st, msg = pcall(coroutine.kill, main) + assert(not st and string.find(msg, "normal")) + end))() + + -- to-be-closed variables in coroutines + local X + + local function func2close (f) + return setmetatable({}, {__close = f}) + end + + co = coroutine.create(function () + local *toclose x = func2close(function (self, err) + assert(err == nil); X = false + end) + X = true + coroutine.yield() + end) + coroutine.resume(co) + assert(X) + assert(coroutine.kill(co)) + assert(not X and coroutine.status(co) == "dead") + + -- error killing a coroutine + co = coroutine.create(function() + local *toclose x = func2close(function (self, err) + assert(err == nil); error(111) + end) + coroutine.yield() + end) + coroutine.resume(co) + local st, msg = coroutine.kill(co) + assert(not st and coroutine.status(co) == "dead" and msg == 111) + +end + + +-- yielding across C boundaries + +co = coroutine.wrap(function() + assert(not pcall(table.sort,{1,2,3}, coroutine.yield)) + assert(coroutine.isyieldable()) + coroutine.yield(20) + return 30 + end) + +assert(co() == 20) +assert(co() == 30) + + +local f = function (s, i) return coroutine.yield(i) end + +local f1 = coroutine.wrap(function () + return xpcall(pcall, function (...) return ... end, + function () + local s = 0 + for i in f, nil, 1 do pcall(function () s = s + i end) end + error({s}) + end) + end) + +f1() +for i = 1, 10 do assert(f1(i) == i) end +local r1, r2, v = f1(nil) +assert(r1 and not r2 and v[1] == (10 + 1)*10/2) + + +function f (a, b) a = coroutine.yield(a); error{a + b} end +function g(x) return x[1]*2 end + +co = coroutine.wrap(function () + coroutine.yield(xpcall(f, g, 10, 20)) + end) + +assert(co() == 10) +r, msg = co(100) +assert(not r and msg == 240) + + +-- unyieldable C call +do + local function f (c) + assert(not coroutine.isyieldable()) + return c .. c + end + + local co = coroutine.wrap(function (c) + assert(coroutine.isyieldable()) + local s = string.gsub("a", ".", f) + return s + end) + assert(co() == "aa") +end + + + +do -- testing single trace of coroutines + local X + local co = coroutine.create(function () + coroutine.yield(10) + return 20; + end) + local trace = {} + local function dotrace (event) + trace[#trace + 1] = event + end + debug.sethook(co, dotrace, "clr") + repeat until not coroutine.resume(co) + local correcttrace = {"call", "line", "call", "return", "line", "return"} + assert(#trace == #correcttrace) + for k, v in pairs(trace) do + assert(v == correcttrace[k]) + end +end + +-- errors in coroutines +function foo () + assert(debug.getinfo(1).currentline == debug.getinfo(foo).linedefined + 1) + assert(debug.getinfo(2).currentline == debug.getinfo(goo).linedefined) + coroutine.yield(3) + error(foo) +end + +function goo() foo() end +x = coroutine.wrap(goo) +assert(x() == 3) +local a,b = pcall(x) +assert(not a and b == foo) + +x = coroutine.create(goo) +a,b = coroutine.resume(x) +assert(a and b == 3) +a,b = coroutine.resume(x) +assert(not a and b == foo and coroutine.status(x) == "dead") +a,b = coroutine.resume(x) +assert(not a and string.find(b, "dead") and coroutine.status(x) == "dead") + + +-- co-routines x for loop +function all (a, n, k) + if k == 0 then coroutine.yield(a) + else + for i=1,n do + a[k] = i + all(a, n, k-1) + end + end +end + +local a = 0 +for t in coroutine.wrap(function () all({}, 5, 4) end) do + a = a+1 +end +assert(a == 5^4) + + +-- access to locals of collected corroutines +local C = {}; setmetatable(C, {__mode = "kv"}) +local x = coroutine.wrap (function () + local a = 10 + local function f () a = a+10; return a end + while true do + a = a+1 + coroutine.yield(f) + end + end) + +C[1] = x; + +local f = x() +assert(f() == 21 and x()() == 32 and x() == f) +x = nil +collectgarbage() +assert(C[1] == undef) +assert(f() == 43 and f() == 53) + + +-- old bug: attempt to resume itself + +function co_func (current_co) + assert(coroutine.running() == current_co) + assert(coroutine.resume(current_co) == false) + coroutine.yield(10, 20) + assert(coroutine.resume(current_co) == false) + coroutine.yield(23) + return 10 +end + +local co = coroutine.create(co_func) +local a,b,c = coroutine.resume(co, co) +assert(a == true and b == 10 and c == 20) +a,b = coroutine.resume(co, co) +assert(a == true and b == 23) +a,b = coroutine.resume(co, co) +assert(a == true and b == 10) +assert(coroutine.resume(co, co) == false) +assert(coroutine.resume(co, co) == false) + + +-- other old bug when attempting to resume itself +-- (trigger C-code assertions) +do + local A = coroutine.running() + local B = coroutine.create(function() return coroutine.resume(A) end) + local st, res = coroutine.resume(B) + assert(st == true and res == false) + + A = coroutine.wrap(function() return pcall(A, 1) end) + st, res = A() + assert(not st and string.find(res, "non%-suspended")) +end + + +-- attempt to resume 'normal' coroutine +local co1, co2 +co1 = coroutine.create(function () return co2() end) +co2 = coroutine.wrap(function () + assert(coroutine.status(co1) == 'normal') + assert(not coroutine.resume(co1)) + coroutine.yield(3) + end) + +a,b = coroutine.resume(co1) +assert(a and b == 3) +assert(coroutine.status(co1) == 'dead') + +-- infinite recursion of coroutines +a = function(a) coroutine.wrap(a)(a) end +assert(not pcall(a, a)) +a = nil + + +-- access to locals of erroneous coroutines +local x = coroutine.create (function () + local a = 10 + _G.f = function () a=a+1; return a end + error('x') + end) + +assert(not coroutine.resume(x)) +-- overwrite previous position of local `a' +assert(not coroutine.resume(x, 1, 1, 1, 1, 1, 1, 1)) +assert(_G.f() == 11) +assert(_G.f() == 12) + + +if not T then + (Message or print)('\n >>> testC not active: skipping yield/hook tests <<<\n') +else + print "testing yields inside hooks" + + local turn + + function fact (t, x) + assert(turn == t) + if x == 0 then return 1 + else return x*fact(t, x-1) + end + end + + local A, B = 0, 0 + + local x = coroutine.create(function () + T.sethook("yield 0", "", 2) + A = fact("A", 6) + end) + + local y = coroutine.create(function () + T.sethook("yield 0", "", 3) + B = fact("B", 7) + end) + + while A==0 or B==0 do -- A ~= 0 when 'x' finishes (similar for 'B','y') + if A==0 then turn = "A"; assert(T.resume(x)) end + if B==0 then turn = "B"; assert(T.resume(y)) end + end + + assert(B // A == 7) -- fact(7) // fact(6) + + local line = debug.getinfo(1, "l").currentline + 2 -- get line number + local function foo () + local x = 10 --<< this line is 'line' + x = x + 10 + _G.XX = x + end + + -- testing yields in line hook + local co = coroutine.wrap(function () + T.sethook("setglobal X; yield 0", "l", 0); foo(); return 10 end) + + _G.XX = nil; + _G.X = nil; co(); assert(_G.X == line) + _G.X = nil; co(); assert(_G.X == line + 1) + _G.X = nil; co(); assert(_G.X == line + 2 and _G.XX == nil) + _G.X = nil; co(); assert(_G.X == line + 3 and _G.XX == 20) + assert(co() == 10) + + -- testing yields in count hook + co = coroutine.wrap(function () + T.sethook("yield 0", "", 1); foo(); return 10 end) + + _G.XX = nil; + local c = 0 + repeat c = c + 1; local a = co() until a == 10 + assert(_G.XX == 20 and c >= 5) + + co = coroutine.wrap(function () + T.sethook("yield 0", "", 2); foo(); return 10 end) + + _G.XX = nil; + local c = 0 + repeat c = c + 1; local a = co() until a == 10 + assert(_G.XX == 20 and c >= 5) + _G.X = nil; _G.XX = nil + + do + -- testing debug library on a coroutine suspended inside a hook + -- (bug in 5.2/5.3) + c = coroutine.create(function (a, ...) + T.sethook("yield 0", "l") -- will yield on next two lines + assert(a == 10) + return ... + end) + + assert(coroutine.resume(c, 1, 2, 3)) -- start coroutine + local n,v = debug.getlocal(c, 0, 1) -- check its local + assert(n == "a" and v == 1) + assert(debug.setlocal(c, 0, 1, 10)) -- test 'setlocal' + local t = debug.getinfo(c, 0) -- test 'getinfo' + assert(t.currentline == t.linedefined + 1) + assert(not debug.getinfo(c, 1)) -- no other level + assert(coroutine.resume(c)) -- run next line + v = {coroutine.resume(c)} -- finish coroutine + assert(v[1] == true and v[2] == 2 and v[3] == 3 and v[4] == undef) + assert(not coroutine.resume(c)) + end + + do + -- testing debug library on last function in a suspended coroutine + -- (bug in 5.2/5.3) + local c = coroutine.create(function () T.testC("yield 1", 10, 20) end) + local a, b = coroutine.resume(c) + assert(a and b == 20) + assert(debug.getinfo(c, 0).linedefined == -1) + a, b = debug.getlocal(c, 0, 2) + assert(b == 10) + end + + + print "testing coroutine API" + + -- reusing a thread + assert(T.testC([[ + newthread # create thread + pushvalue 2 # push body + pushstring 'a a a' # push argument + xmove 0 3 2 # move values to new thread + resume -1, 1 # call it first time + pushstatus + xmove 3 0 0 # move results back to stack + setglobal X # result + setglobal Y # status + pushvalue 2 # push body (to call it again) + pushstring 'b b b' + xmove 0 3 2 + resume -1, 1 # call it again + pushstatus + xmove 3 0 0 + return 1 # return result + ]], function (...) return ... end) == 'b b b') + + assert(X == 'a a a' and Y == 'OK') + + + -- resuming running coroutine + C = coroutine.create(function () + return T.testC([[ + pushnum 10; + pushnum 20; + resume -3 2; + pushstatus + gettop; + return 3]], C) + end) + local a, b, c, d = coroutine.resume(C) + assert(a == true and string.find(b, "non%-suspended") and + c == "ERRRUN" and d == 4) + + a, b, c, d = T.testC([[ + rawgeti R 1 # get main thread + pushnum 10; + pushnum 20; + resume -3 2; + pushstatus + gettop; + return 4]]) + assert(a == coroutine.running() and string.find(b, "non%-suspended") and + c == "ERRRUN" and d == 4) + + + -- using a main thread as a coroutine + local state = T.newstate() + T.loadlib(state) + + assert(T.doremote(state, [[ + coroutine = require'coroutine'; + X = function (x) coroutine.yield(x, 'BB'); return 'CC' end; + return 'ok']])) + + t = table.pack(T.testC(state, [[ + rawgeti R 1 # get main thread + pushstring 'XX' + getglobal X # get function for body + pushstring AA # arg + resume 1 1 # 'resume' shadows previous stack! + gettop + setglobal T # top + setglobal B # second yielded value + setglobal A # fist yielded value + rawgeti R 1 # get main thread + pushnum 5 # arg (noise) + resume 1 1 # after coroutine ends, previous stack is back + pushstatus + return * + ]])) + assert(t.n == 4 and t[2] == 'XX' and t[3] == 'CC' and t[4] == 'OK') + assert(T.doremote(state, "return T") == '2') + assert(T.doremote(state, "return A") == 'AA') + assert(T.doremote(state, "return B") == 'BB') + + T.closestate(state) + + print'+' + +end + + +-- leaving a pending coroutine open +_X = coroutine.wrap(function () + local a = 10 + local x = function () a = a+1 end + coroutine.yield() + end) + +_X() + + +if not _soft then + -- bug (stack overflow) + local j = 2^9 + local lim = 1000000 -- (C stack limit; assume 32-bit machine) + local t = {lim - 10, lim - 5, lim - 1, lim, lim + 1} + for i = 1, #t do + local j = t[i] + co = coroutine.create(function() + local t = {} + for i = 1, j do t[i] = i end + return table.unpack(t) + end) + local r, msg = coroutine.resume(co) + assert(not r) + end + co = nil +end + + +assert(coroutine.running() == main) + +print"+" + + +print"testing yields inside metamethods" + +local function val(x) + if type(x) == "table" then return x.x else return x end +end + +local mt = { + __eq = function(a,b) coroutine.yield(nil, "eq"); return val(a) == val(b) end, + __lt = function(a,b) coroutine.yield(nil, "lt"); return val(a) < val(b) end, + __le = function(a,b) coroutine.yield(nil, "le"); return a - b <= 0 end, + __add = function(a,b) coroutine.yield(nil, "add"); + return val(a) + val(b) end, + __sub = function(a,b) coroutine.yield(nil, "sub"); return val(a) - val(b) end, + __mul = function(a,b) coroutine.yield(nil, "mul"); return val(a) * val(b) end, + __div = function(a,b) coroutine.yield(nil, "div"); return val(a) / val(b) end, + __idiv = function(a,b) coroutine.yield(nil, "idiv"); + return val(a) // val(b) end, + __pow = function(a,b) coroutine.yield(nil, "pow"); return val(a) ^ val(b) end, + __mod = function(a,b) coroutine.yield(nil, "mod"); return val(a) % val(b) end, + __unm = function(a,b) coroutine.yield(nil, "unm"); return -val(a) end, + __bnot = function(a,b) coroutine.yield(nil, "bnot"); return ~val(a) end, + __shl = function(a,b) coroutine.yield(nil, "shl"); + return val(a) << val(b) end, + __shr = function(a,b) coroutine.yield(nil, "shr"); + return val(a) >> val(b) end, + __band = function(a,b) + coroutine.yield(nil, "band") + return val(a) & val(b) + end, + __bor = function(a,b) coroutine.yield(nil, "bor"); + return val(a) | val(b) end, + __bxor = function(a,b) coroutine.yield(nil, "bxor"); + return val(a) ~ val(b) end, + + __concat = function(a,b) + coroutine.yield(nil, "concat"); + return val(a) .. val(b) + end, + __index = function (t,k) coroutine.yield(nil, "idx"); return t.k[k] end, + __newindex = function (t,k,v) coroutine.yield(nil, "nidx"); t.k[k] = v end, +} + + +local function new (x) + return setmetatable({x = x, k = {}}, mt) +end + + +local a = new(10) +local b = new(12) +local c = new"hello" + +local function run (f, t) + local i = 1 + local c = coroutine.wrap(f) + while true do + local res, stat = c() + if res then assert(t[i] == undef); return res, t end + assert(stat == t[i]) + i = i + 1 + end +end + + +assert(run(function () if (a>=b) then return '>=' else return '<' end end, + {"le", "sub"}) == "<") +assert(run(function () if (a<=b) then return '<=' else return '>' end end, + {"le", "sub"}) == "<=") +assert(run(function () if (a==b) then return '==' else return '~=' end end, + {"eq"}) == "~=") + +assert(run(function () return a & b + a end, {"add", "band"}) == 2) + +assert(run(function () return 1 + a end, {"add"}) == 11) +assert(run(function () return a - 25 end, {"sub"}) == -15) +assert(run(function () return 2 * a end, {"mul"}) == 20) +assert(run(function () return a ^ 2 end, {"pow"}) == 100) +assert(run(function () return a / 2 end, {"div"}) == 5) +assert(run(function () return a % 6 end, {"mod"}) == 4) +assert(run(function () return a // 3 end, {"idiv"}) == 3) + +assert(run(function () return a + b end, {"add"}) == 22) +assert(run(function () return a - b end, {"sub"}) == -2) +assert(run(function () return a * b end, {"mul"}) == 120) +assert(run(function () return a ^ b end, {"pow"}) == 10^12) +assert(run(function () return a / b end, {"div"}) == 10/12) +assert(run(function () return a % b end, {"mod"}) == 10) +assert(run(function () return a // b end, {"idiv"}) == 0) + + +assert(run(function () return a % b end, {"mod"}) == 10) + +assert(run(function () return ~a & b end, {"bnot", "band"}) == ~10 & 12) +assert(run(function () return a | b end, {"bor"}) == 10 | 12) +assert(run(function () return a ~ b end, {"bxor"}) == 10 ~ 12) +assert(run(function () return a << b end, {"shl"}) == 10 << 12) +assert(run(function () return a >> b end, {"shr"}) == 10 >> 12) + +assert(run(function () return 10 & b end, {"band"}) == 10 & 12) +assert(run(function () return a | 2 end, {"bor"}) == 10 | 2) +assert(run(function () return a ~ 2 end, {"bxor"}) == 10 ~ 2) + +assert(run(function () return a..b end, {"concat"}) == "1012") + +assert(run(function() return a .. b .. c .. a end, + {"concat", "concat", "concat"}) == "1012hello10") + +assert(run(function() return "a" .. "b" .. a .. "c" .. c .. b .. "x" end, + {"concat", "concat", "concat"}) == "ab10chello12x") + + +do -- a few more tests for comparsion operators + local mt1 = { + __le = function (a,b) + coroutine.yield(10) + return (val(a) <= val(b)) + end, + __lt = function (a,b) + coroutine.yield(10) + return val(a) < val(b) + end, + } + local mt2 = { __lt = mt1.__lt, __le = mt1.__le } + + local function run (f) + local co = coroutine.wrap(f) + local res + repeat + res = co() + until res ~= 10 + return res + end + + local function test () + local a1 = setmetatable({x=1}, mt1) + local a2 = setmetatable({x=2}, mt2) + assert(a1 < a2) + assert(a1 <= a2) + assert(1 < a2) + assert(1 <= a2) + assert(2 > a1) + assert(2 >= a2) + return true + end + + run(test) + +end + +assert(run(function () + a.BB = print + return a.BB + end, {"nidx", "idx"}) == print) + +-- getuptable & setuptable +do local _ENV = _ENV + f = function () AAA = BBB + 1; return AAA end +end +g = new(10); g.k.BBB = 10; +debug.setupvalue(f, 1, g) +assert(run(f, {"idx", "nidx", "idx"}) == 11) +assert(g.k.AAA == 11) + +print"+" + +print"testing yields inside 'for' iterators" + +local f = function (s, i) + if i%2 == 0 then coroutine.yield(nil, "for") end + if i < s then return i + 1 end + end + +assert(run(function () + local s = 0 + for i in f, 4, 0 do s = s + i end + return s + end, {"for", "for", "for"}) == 10) + + + +-- tests for coroutine API +if T==nil then + (Message or print)('\n >>> testC not active: skipping coroutine API tests <<<\n') + return +end + +print('testing coroutine API') + +local function apico (...) + local x = {...} + return coroutine.wrap(function () + return T.testC(table.unpack(x)) + end) +end + +local a = {apico( +[[ + pushstring errorcode + pcallk 1 0 2; + invalid command (should not arrive here) +]], +[[return *]], +"stackmark", +error +)()} +assert(#a == 4 and + a[3] == "stackmark" and + a[4] == "errorcode" and + _G.status == "ERRRUN" and + _G.ctx == 2) -- 'ctx' to pcallk + +local co = apico( + "pushvalue 2; pushnum 10; pcallk 1 2 3; invalid command;", + coroutine.yield, + "getglobal status; getglobal ctx; pushvalue 2; pushstring a; pcallk 1 0 4; invalid command", + "getglobal status; getglobal ctx; return *") + +assert(co() == 10) +assert(co(20, 30) == 'a') +a = {co()} +assert(#a == 10 and + a[2] == coroutine.yield and + a[5] == 20 and a[6] == 30 and + a[7] == "YIELD" and a[8] == 3 and + a[9] == "YIELD" and a[10] == 4) +assert(not pcall(co)) -- coroutine is dead now + + +f = T.makeCfunc("pushnum 3; pushnum 5; yield 1;") +co = coroutine.wrap(function () + assert(f() == 23); assert(f() == 23); return 10 +end) +assert(co(23,16) == 5) +assert(co(23,16) == 5) +assert(co(23,16) == 10) + + +-- testing coroutines with C bodies +f = T.makeCfunc([[ + pushnum 102 + yieldk 1 U2 + cannot be here! +]], +[[ # continuation + pushvalue U3 # accessing upvalues inside a continuation + pushvalue U4 + return * +]], 23, "huu") + +x = coroutine.wrap(f) +assert(x() == 102) +eqtab({x()}, {23, "huu"}) + + +f = T.makeCfunc[[pushstring 'a'; pushnum 102; yield 2; ]] + +a, b, c, d = T.testC([[newthread; pushvalue 2; xmove 0 3 1; resume 3 0; + pushstatus; xmove 3 0 0; resume 3 0; pushstatus; + return 4; ]], f) + +assert(a == 'YIELD' and b == 'a' and c == 102 and d == 'OK') + + +-- testing chain of suspendable C calls + +local count = 3 -- number of levels + +f = T.makeCfunc([[ + remove 1; # remove argument + pushvalue U3; # get selection function + call 0 1; # call it (result is 'f' or 'yield') + pushstring hello # single argument for selected function + pushupvalueindex 2; # index of continuation program + callk 1 -1 .; # call selected function + errorerror # should never arrive here +]], +[[ + # continuation program + pushnum 34 # return value + return * # return all results +]], +function () -- selection function + count = count - 1 + if count == 0 then return coroutine.yield + else return f + end +end +) + +co = coroutine.wrap(function () return f(nil) end) +assert(co() == "hello") -- argument to 'yield' +a = {co()} +-- three '34's (one from each pending C call) +assert(#a == 3 and a[1] == a[2] and a[2] == a[3] and a[3] == 34) + + +-- testing yields with continuations + +co = coroutine.wrap(function (...) return + T.testC([[ # initial function + yieldk 1 2 + cannot be here! + ]], + [[ # 1st continuation + yieldk 0 3 + cannot be here! + ]], + [[ # 2nd continuation + yieldk 0 4 + cannot be here! + ]], + [[ # 3th continuation + pushvalue 6 # function which is last arg. to 'testC' here + pushnum 10; pushnum 20; + pcall 2 0 0 # call should throw an error and return to next line + pop 1 # remove error message + pushvalue 6 + getglobal status; getglobal ctx + pcallk 2 2 5 # call should throw an error and jump to continuation + cannot be here! + ]], + [[ # 4th (and last) continuation + return * + ]], + -- function called by 3th continuation + function (a,b) x=a; y=b; error("errmsg") end, + ... +) +end) + +local a = {co(3,4,6)} +assert(a[1] == 6 and a[2] == undef) +a = {co()}; assert(a[1] == undef and _G.status == "YIELD" and _G.ctx == 2) +a = {co()}; assert(a[1] == undef and _G.status == "YIELD" and _G.ctx == 3) +a = {co(7,8)}; +-- original arguments +assert(type(a[1]) == 'string' and type(a[2]) == 'string' and + type(a[3]) == 'string' and type(a[4]) == 'string' and + type(a[5]) == 'string' and type(a[6]) == 'function') +-- arguments left from fist resume +assert(a[7] == 3 and a[8] == 4) +-- arguments to last resume +assert(a[9] == 7 and a[10] == 8) +-- error message and nothing more +assert(a[11]:find("errmsg") and #a == 11) +-- check arguments to pcallk +assert(x == "YIELD" and y == 4) + +assert(not pcall(co)) -- coroutine should be dead + + +-- bug in nCcalls +local co = coroutine.wrap(function () + local a = {pcall(pcall,pcall,pcall,pcall,pcall,pcall,pcall,error,"hi")} + return pcall(assert, table.unpack(a)) +end) + +local a = {co()} +assert(a[10] == "hi") + +print'OK' diff --git a/source/lua/testes/cstack.lua b/source/lua/testes/cstack.lua new file mode 100644 index 0000000..9e5bbae --- /dev/null +++ b/source/lua/testes/cstack.lua @@ -0,0 +1,62 @@ +-- $Id: testes/cstack.lua $ +-- See Copyright Notice in file all.lua + +print"testing C-stack overflow detection" + +-- Segmentation faults in these tests probably result from a C-stack +-- overflow. To avoid these errors, recompile Lua with a smaller +-- value for the constant 'LUAI_MAXCCALLS' or else ensure a larger +-- stack for the program. + +local function checkerror (msg, f, ...) + local s, err = pcall(f, ...) + assert(not s and string.find(err, msg)) +end + + +do -- simple recursion + local count = 0 + local function foo () + count = count + 1 + foo() + end + checkerror("stack overflow", foo) + print(" maximum recursion: " .. count) +end + + +-- bug since 2.5 (C-stack overflow in recursion inside pattern matching) +do + local function f (size) + local s = string.rep("a", size) + local p = string.rep(".?", size) + return string.match(s, p) + end + local m = f(80) + assert(#m == 80) + checkerror("too complex", f, 200000) +end + + +-- testing stack-overflow in recursive 'gsub' +do + local count = 0 + local function foo () + count = count + 1 + string.gsub("a", ".", foo) + end + checkerror("stack overflow", foo) + print(" maximum 'gsub' nest (calls): " .. count) + + -- can be done with metamethods, too + count = 0 + local t = setmetatable({}, {__index = foo}) + foo = function () + count = count + 1 + string.gsub("a", ".", t) + end + checkerror("stack overflow", foo) + print(" maximum 'gsub' nest (metamethods): " .. count) +end + +print'OK' diff --git a/source/lua/testes/db.lua b/source/lua/testes/db.lua new file mode 100644 index 0000000..976962b --- /dev/null +++ b/source/lua/testes/db.lua @@ -0,0 +1,949 @@ +-- $Id: testes/db.lua $ +-- See Copyright Notice in file all.lua + +-- testing debug library + +local debug = require "debug" + +local function dostring(s) return assert(load(s))() end + +print"testing debug library and debug information" + +do +local a=1 +end + +assert(not debug.gethook()) + +local testline = 19 -- line where 'test' is defined +function test (s, l, p) -- this must be line 19 + collectgarbage() -- avoid gc during trace + local function f (event, line) + assert(event == 'line') + local l = table.remove(l, 1) + if p then print(l, line) end + assert(l == line, "wrong trace!!") + end + debug.sethook(f,"l"); load(s)(); debug.sethook() + assert(#l == 0) +end + + +do + assert(not pcall(debug.getinfo, print, "X")) -- invalid option + assert(not debug.getinfo(1000)) -- out of range level + assert(not debug.getinfo(-1)) -- out of range level + local a = debug.getinfo(print) + assert(a.what == "C" and a.short_src == "[C]") + a = debug.getinfo(print, "L") + assert(a.activelines == nil) + local b = debug.getinfo(test, "SfL") + assert(b.name == nil and b.what == "Lua" and b.linedefined == testline and + b.lastlinedefined == b.linedefined + 10 and + b.func == test and not string.find(b.short_src, "%[")) + assert(b.activelines[b.linedefined + 1] and + b.activelines[b.lastlinedefined]) + assert(not b.activelines[b.linedefined] and + not b.activelines[b.lastlinedefined + 1]) +end + + +-- test file and string names truncation +a = "function f () end" +local function dostring (s, x) return load(s, x)() end +dostring(a) +assert(debug.getinfo(f).short_src == string.format('[string "%s"]', a)) +dostring(a..string.format("; %s\n=1", string.rep('p', 400))) +assert(string.find(debug.getinfo(f).short_src, '^%[string [^\n]*%.%.%."%]$')) +dostring(a..string.format("; %s=1", string.rep('p', 400))) +assert(string.find(debug.getinfo(f).short_src, '^%[string [^\n]*%.%.%."%]$')) +dostring("\n"..a) +assert(debug.getinfo(f).short_src == '[string "..."]') +dostring(a, "") +assert(debug.getinfo(f).short_src == '[string ""]') +dostring(a, "@xuxu") +assert(debug.getinfo(f).short_src == "xuxu") +dostring(a, "@"..string.rep('p', 1000)..'t') +assert(string.find(debug.getinfo(f).short_src, "^%.%.%.p*t$")) +dostring(a, "=xuxu") +assert(debug.getinfo(f).short_src == "xuxu") +dostring(a, string.format("=%s", string.rep('x', 500))) +assert(string.find(debug.getinfo(f).short_src, "^x*$")) +dostring(a, "=") +assert(debug.getinfo(f).short_src == "") +a = nil; f = nil; + + +repeat + local g = {x = function () + local a = debug.getinfo(2) + assert(a.name == 'f' and a.namewhat == 'local') + a = debug.getinfo(1) + assert(a.name == 'x' and a.namewhat == 'field') + return 'xixi' + end} + local f = function () return 1+1 and (not 1 or g.x()) end + assert(f() == 'xixi') + g = debug.getinfo(f) + assert(g.what == "Lua" and g.func == f and g.namewhat == "" and not g.name) + + function f (x, name) -- local! + name = name or 'f' + local a = debug.getinfo(1) + assert(a.name == name and a.namewhat == 'local') + return x + end + + -- breaks in different conditions + if 3>4 then break end; f() + if 3<4 then a=1 else break end; f() + while 1 do local x=10; break end; f() + local b = 1 + if 3>4 then return math.sin(1) end; f() + a = 3<4; f() + a = 3<4 or 1; f() + repeat local x=20; if 4>3 then f() else break end; f() until 1 + g = {} + f(g).x = f(2) and f(10)+f(9) + assert(g.x == f(19)) + function g(x) if not x then return 3 end return (x('a', 'x')) end + assert(g(f) == 'a') +until 1 + +test([[if +math.sin(1) +then + a=1 +else + a=2 +end +]], {2,3,4,7}) + +test([[-- +if nil then + a=1 +else + a=2 +end +]], {2,5,6}) + +test([[a=1 +repeat + a=a+1 +until a==3 +]], {1,3,4,3,4}) + +test([[ do + return +end +]], {2}) + +test([[local a +a=1 +while a<=3 do + a=a+1 +end +]], {1,2,3,4,3,4,3,4,3,5}) + +test([[while math.sin(1) do + if math.sin(1) + then break + end +end +a=1]], {1,2,3,6}) + +test([[for i=1,3 do + a=i +end +]], {1,2,1,2,1,2,1,3}) + +test([[for i,v in pairs{'a','b'} do + a=tostring(i) .. v +end +]], {1,2,1,2,1,3}) + +test([[for i=1,4 do a=1 end]], {1,1,1,1,1}) + + +do -- testing line info/trace with large gaps in source + + local a = {1, 2, 3, 10, 124, 125, 126, 127, 128, 129, 130, + 255, 256, 257, 500, 1000} + local s = [[ + local b = {10} + a = b[1] X + Y b[1] + b = 4 + ]] + for _, i in ipairs(a) do + local subs = {X = string.rep("\n", i)} + for _, j in ipairs(a) do + subs.Y = string.rep("\n", j) + local s = string.gsub(s, "[XY]", subs) + test(s, {1, 2 + i, 2 + i + j, 2 + i, 2 + i + j, 3 + i + j}) + end + end +end + +print'+' + +-- invalid levels in [gs]etlocal +assert(not pcall(debug.getlocal, 20, 1)) +assert(not pcall(debug.setlocal, -1, 1, 10)) + + +-- parameter names +local function foo (a,b,...) local d, e end +local co = coroutine.create(foo) + +assert(debug.getlocal(foo, 1) == 'a') +assert(debug.getlocal(foo, 2) == 'b') +assert(not debug.getlocal(foo, 3)) +assert(debug.getlocal(co, foo, 1) == 'a') +assert(debug.getlocal(co, foo, 2) == 'b') +assert(not debug.getlocal(co, foo, 3)) + +assert(not debug.getlocal(print, 1)) + + +local function foo () return (debug.getlocal(1, -1)) end +assert(not foo(10)) + + +-- varargs +local function foo (a, ...) + local t = table.pack(...) + for i = 1, t.n do + local n, v = debug.getlocal(1, -i) + assert(n == "(vararg)" and v == t[i]) + end + assert(not debug.getlocal(1, -(t.n + 1))) + assert(not debug.setlocal(1, -(t.n + 1), 30)) + if t.n > 0 then + (function (x) + assert(debug.setlocal(2, -1, x) == "(vararg)") + assert(debug.setlocal(2, -t.n, x) == "(vararg)") + end)(430) + assert(... == 430) + end +end + +foo() +foo(print) +foo(200, 3, 4) +local a = {} +for i = 1, (_soft and 100 or 1000) do a[i] = i end +foo(table.unpack(a)) +a = nil + + + +do -- test hook presence in debug info + assert(not debug.gethook()) + local count = 0 + local function f () + assert(debug.getinfo(1).namewhat == "hook") + local sndline = string.match(debug.traceback(), "\n(.-)\n") + assert(string.find(sndline, "hook")) + count = count + 1 + end + debug.sethook(f, "l") + local a = 0 + _ENV.a = a + a = 1 + debug.sethook() + assert(count == 4) +end + + +a = {}; L = nil +local glob = 1 +local oldglob = glob +debug.sethook(function (e,l) + collectgarbage() -- force GC during a hook + local f, m, c = debug.gethook() + assert(m == 'crl' and c == 0) + if e == "line" then + if glob ~= oldglob then + L = l-1 -- get the first line where "glob" has changed + oldglob = glob + end + elseif e == "call" then + local f = debug.getinfo(2, "f").func + a[f] = 1 + else assert(e == "return") + end +end, "crl") + + +function f(a,b) + collectgarbage() + local _, x = debug.getlocal(1, 1) + local _, y = debug.getlocal(1, 2) + assert(x == a and y == b) + assert(debug.setlocal(2, 3, "pera") == "AA".."AA") + assert(debug.setlocal(2, 4, "maçã") == "B") + x = debug.getinfo(2) + assert(x.func == g and x.what == "Lua" and x.name == 'g' and + x.nups == 2 and string.find(x.source, "^@.*db%.lua$")) + glob = glob+1 + assert(debug.getinfo(1, "l").currentline == L+1) + assert(debug.getinfo(1, "l").currentline == L+2) +end + +function foo() + glob = glob+1 + assert(debug.getinfo(1, "l").currentline == L+1) +end; foo() -- set L +-- check line counting inside strings and empty lines + +_ = 'alo\ +alo' .. [[ + +]] +--[[ +]] +assert(debug.getinfo(1, "l").currentline == L+11) -- check count of lines + + +function g (...) + local arg = {...} + do local a,b,c; a=math.sin(40); end + local feijao + local AAAA,B = "xuxu", "mamão" + f(AAAA,B) + assert(AAAA == "pera" and B == "maçã") + do + local B = 13 + local x,y = debug.getlocal(1,5) + assert(x == 'B' and y == 13) + end +end + +g() + + +assert(a[f] and a[g] and a[assert] and a[debug.getlocal] and not a[print]) + + +-- tests for manipulating non-registered locals (C and Lua temporaries) + +local n, v = debug.getlocal(0, 1) +assert(v == 0 and n == "(C temporary)") +local n, v = debug.getlocal(0, 2) +assert(v == 2 and n == "(C temporary)") +assert(not debug.getlocal(0, 3)) +assert(not debug.getlocal(0, 0)) + +function f() + assert(select(2, debug.getlocal(2,3)) == 1) + assert(not debug.getlocal(2,4)) + debug.setlocal(2, 3, 10) + return 20 +end + +function g(a,b) return (a+1) + f() end + +assert(g(0,0) == 30) + + +debug.sethook(nil); +assert(debug.gethook() == nil) + + +-- minimal tests for setuservalue/getuservalue +do + assert(debug.setuservalue(io.stdin, 10) == nil) + local a, b = debug.getuservalue(io.stdin, 10) + assert(a == nil and not b) +end + +-- testing iteraction between multiple values x hooks +do + local function f(...) return 3, ... end + local count = 0 + local a = {} + for i = 1, 100 do a[i] = i end + debug.sethook(function () count = count + 1 end, "", 1) + local t = {table.unpack(a)} + assert(#t == 100) + t = {table.unpack(a, 1, 3)} + assert(#t == 3) + t = {f(table.unpack(a, 1, 30))} + assert(#t == 31) +end + + +-- testing access to function arguments + +local function collectlocals (level) + local tab = {} + for i = 1, math.huge do + local n, v = debug.getlocal(level + 1, i) + if not (n and string.find(n, "^[a-zA-Z0-9_]+$")) then + break -- consider only real variables + end + tab[n] = v + end + return tab +end + + +X = nil +a = {} +function a:f (a, b, ...) local arg = {...}; local c = 13 end +debug.sethook(function (e) + assert(e == "call") + dostring("XX = 12") -- test dostring inside hooks + -- testing errors inside hooks + assert(not pcall(load("a='joao'+1"))) + debug.sethook(function (e, l) + assert(debug.getinfo(2, "l").currentline == l) + local f,m,c = debug.gethook() + assert(e == "line") + assert(m == 'l' and c == 0) + debug.sethook(nil) -- hook is called only once + assert(not X) -- check that + X = collectlocals(2) + end, "l") +end, "c") + +a:f(1,2,3,4,5) +assert(X.self == a and X.a == 1 and X.b == 2 and X.c == nil) +assert(XX == 12) +assert(debug.gethook() == nil) + + +-- testing access to local variables in return hook (bug in 5.2) +do + local X = false + + local function foo (a, b, ...) + do local x,y,z end + local c, d = 10, 20 + return + end + + local function aux () + if debug.getinfo(2).name == "foo" then + X = true -- to signal that it found 'foo' + local tab = {a = 100, b = 200, c = 10, d = 20} + for n, v in pairs(collectlocals(2)) do + assert(tab[n] == v) + tab[n] = undef + end + assert(next(tab) == nil) -- 'tab' must be empty + end + end + + debug.sethook(aux, "r"); foo(100, 200); debug.sethook() + assert(X) + +end + + +local function eqseq (t1, t2) + assert(#t1 == #t2) + for i = 1, #t1 do + assert(t1[i] == t2[i]) + end +end + + +do print("testing inspection of parameters/returned values") + local on = false + local inp, out + + local function hook (event) + if not on then return end + local ar = debug.getinfo(2, "ruS") + local t = {} + for i = ar.ftransfer, ar.ftransfer + ar.ntransfer - 1 do + local _, v = debug.getlocal(2, i) + t[#t + 1] = v + end + if event == "return" then + out = t + else + inp = t + end + end + + debug.sethook(hook, "cr") + + on = true; math.sin(3); on = false + eqseq(inp, {3}); eqseq(out, {math.sin(3)}) + + on = true; select(2, 10, 20, 30, 40); on = false + eqseq(inp, {2, 10, 20, 30, 40}); eqseq(out, {20, 30, 40}) + + local function foo (a, ...) return ... end + local function foo1 () on = not on; return foo(20, 10, 0) end + foo1(); on = false + eqseq(inp, {20}); eqseq(out, {10, 0}) + + debug.sethook() +end + + + +-- testing upvalue access +local function getupvalues (f) + local t = {} + local i = 1 + while true do + local name, value = debug.getupvalue(f, i) + if not name then break end + assert(not t[name]) + t[name] = value + i = i + 1 + end + return t +end + +local a,b,c = 1,2,3 +local function foo1 (a) b = a; return c end +local function foo2 (x) a = x; return c+b end +assert(not debug.getupvalue(foo1, 3)) +assert(not debug.getupvalue(foo1, 0)) +assert(not debug.setupvalue(foo1, 3, "xuxu")) +local t = getupvalues(foo1) +assert(t.a == nil and t.b == 2 and t.c == 3) +t = getupvalues(foo2) +assert(t.a == 1 and t.b == 2 and t.c == 3) +assert(debug.setupvalue(foo1, 1, "xuxu") == "b") +assert(({debug.getupvalue(foo2, 3)})[2] == "xuxu") +-- upvalues of C functions are allways "called" "" (the empty string) +assert(debug.getupvalue(string.gmatch("x", "x"), 1) == "") + + +-- testing count hooks +local a=0 +debug.sethook(function (e) a=a+1 end, "", 1) +a=0; for i=1,1000 do end; assert(1000 < a and a < 1012) +debug.sethook(function (e) a=a+1 end, "", 4) +a=0; for i=1,1000 do end; assert(250 < a and a < 255) +local f,m,c = debug.gethook() +assert(m == "" and c == 4) +debug.sethook(function (e) a=a+1 end, "", 4000) +a=0; for i=1,1000 do end; assert(a == 0) + +do + debug.sethook(print, "", 2^24 - 1) -- count upperbound + local f,m,c = debug.gethook() + assert(({debug.gethook()})[3] == 2^24 - 1) +end + +debug.sethook() + + +-- tests for tail calls +local function f (x) + if x then + assert(debug.getinfo(1, "S").what == "Lua") + assert(debug.getinfo(1, "t").istailcall == true) + local tail = debug.getinfo(2) + assert(tail.func == g1 and tail.istailcall == true) + assert(debug.getinfo(3, "S").what == "main") + print"+" + end +end + +function g(x) return f(x) end + +function g1(x) g(x) end + +local function h (x) local f=g1; return f(x) end + +h(true) + +local b = {} +debug.sethook(function (e) table.insert(b, e) end, "cr") +h(false) +debug.sethook() +local res = {"return", -- first return (from sethook) + "call", "tail call", "call", "tail call", + "return", "return", + "call", -- last call (to sethook) +} +for i = 1, #res do assert(res[i] == table.remove(b, 1)) end + +b = 0 +debug.sethook(function (e) + if e == "tail call" then + b = b + 1 + assert(debug.getinfo(2, "t").istailcall == true) + else + assert(debug.getinfo(2, "t").istailcall == false) + end + end, "c") +h(false) +debug.sethook() +assert(b == 2) -- two tail calls + +lim = _soft and 3000 or 30000 +local function foo (x) + if x==0 then + assert(debug.getinfo(2).what == "main") + local info = debug.getinfo(1) + assert(info.istailcall == true and info.func == foo) + else return foo(x-1) + end +end + +foo(lim) + + +print"+" + + +-- testing local function information +co = load[[ + local A = function () + return x + end + return +]] + +local a = 0 +-- 'A' should be visible to debugger only after its complete definition +debug.sethook(function (e, l) + if l == 3 then a = a + 1; assert(debug.getlocal(2, 1) == "(temporary)") + elseif l == 4 then a = a + 1; assert(debug.getlocal(2, 1) == "A") + end +end, "l") +co() -- run local function definition +debug.sethook() -- turn off hook +assert(a == 2) -- ensure all two lines where hooked + +-- testing traceback + +assert(debug.traceback(print) == print) +assert(debug.traceback(print, 4) == print) +assert(string.find(debug.traceback("hi", 4), "^hi\n")) +assert(string.find(debug.traceback("hi"), "^hi\n")) +assert(not string.find(debug.traceback("hi"), "'debug.traceback'")) +assert(string.find(debug.traceback("hi", 0), "'debug.traceback'")) +assert(string.find(debug.traceback(), "^stack traceback:\n")) + +do -- C-function names in traceback + local st, msg = (function () return pcall end)()(debug.traceback) + assert(st == true and string.find(msg, "pcall")) +end + + +-- testing nparams, nups e isvararg +local t = debug.getinfo(print, "u") +assert(t.isvararg == true and t.nparams == 0 and t.nups == 0) + +t = debug.getinfo(function (a,b,c) end, "u") +assert(t.isvararg == false and t.nparams == 3 and t.nups == 0) + +t = debug.getinfo(function (a,b,...) return t[a] end, "u") +assert(t.isvararg == true and t.nparams == 2 and t.nups == 1) + +t = debug.getinfo(1) -- main +assert(t.isvararg == true and t.nparams == 0 and t.nups == 1 and + debug.getupvalue(t.func, 1) == "_ENV") + + + + +-- testing debugging of coroutines + +local function checktraceback (co, p, level) + local tb = debug.traceback(co, nil, level) + local i = 0 + for l in string.gmatch(tb, "[^\n]+\n?") do + assert(i == 0 or string.find(l, p[i])) + i = i+1 + end + assert(p[i] == undef) +end + + +local function f (n) + if n > 0 then f(n-1) + else coroutine.yield() end +end + +local co = coroutine.create(f) +coroutine.resume(co, 3) +checktraceback(co, {"yield", "db.lua", "db.lua", "db.lua", "db.lua"}) +checktraceback(co, {"db.lua", "db.lua", "db.lua", "db.lua"}, 1) +checktraceback(co, {"db.lua", "db.lua", "db.lua"}, 2) +checktraceback(co, {"db.lua"}, 4) +checktraceback(co, {}, 40) + + +co = coroutine.create(function (x) + local a = 1 + coroutine.yield(debug.getinfo(1, "l")) + coroutine.yield(debug.getinfo(1, "l").currentline) + return a + end) + +local tr = {} +local foo = function (e, l) if l then table.insert(tr, l) end end +debug.sethook(co, foo, "lcr") + +local _, l = coroutine.resume(co, 10) +local x = debug.getinfo(co, 1, "lfLS") +assert(x.currentline == l.currentline and x.activelines[x.currentline]) +assert(type(x.func) == "function") +for i=x.linedefined + 1, x.lastlinedefined do + assert(x.activelines[i]) + x.activelines[i] = undef +end +assert(next(x.activelines) == nil) -- no 'extra' elements +assert(not debug.getinfo(co, 2)) +local a,b = debug.getlocal(co, 1, 1) +assert(a == "x" and b == 10) +a,b = debug.getlocal(co, 1, 2) +assert(a == "a" and b == 1) +debug.setlocal(co, 1, 2, "hi") +assert(debug.gethook(co) == foo) +assert(#tr == 2 and + tr[1] == l.currentline-1 and tr[2] == l.currentline) + +a,b,c = pcall(coroutine.resume, co) +assert(a and b and c == l.currentline+1) +checktraceback(co, {"yield", "in function <"}) + +a,b = coroutine.resume(co) +assert(a and b == "hi") +assert(#tr == 4 and tr[4] == l.currentline+2) +assert(debug.gethook(co) == foo) +assert(not debug.gethook()) +checktraceback(co, {}) + + +-- check get/setlocal in coroutines +co = coroutine.create(function (x) + local a, b = coroutine.yield(x) + assert(a == 100 and b == nil) + return x +end) +a, b = coroutine.resume(co, 10) +assert(a and b == 10) +a, b = debug.getlocal(co, 1, 1) +assert(a == "x" and b == 10) +assert(not debug.getlocal(co, 1, 5)) +assert(debug.setlocal(co, 1, 1, 30) == "x") +assert(not debug.setlocal(co, 1, 5, 40)) +a, b = coroutine.resume(co, 100) +assert(a and b == 30) + + +-- check traceback of suspended coroutines + +function f(i) coroutine.yield(i == 0); f(i - 1) end + +co = coroutine.create(function (x) f(x) end) +a, b = coroutine.resume(co, 3) +t = {"'coroutine.yield'", "'f'", "in function <"} +repeat + checktraceback(co, t) + a, b = coroutine.resume(co) + table.insert(t, 2, "'f'") -- one more recursive call to 'f' +until b +checktraceback(co, t) + + +-- test acessing line numbers of a coroutine from a resume inside +-- a C function (this is a known bug in Lua 5.0) + +local function g(x) + coroutine.yield(x) +end + +local function f (i) + debug.sethook(function () end, "l") + for j=1,1000 do + g(i+j) + end +end + +local co = coroutine.wrap(f) +co(10) +pcall(co) +pcall(co) + + +assert(type(debug.getregistry()) == "table") + + +-- test tagmethod information +local a = {} +local function f (t) + local info = debug.getinfo(1); + assert(info.namewhat == "metamethod") + a.op = info.name + return info.name +end +setmetatable(a, { + __index = f; __add = f; __div = f; __mod = f; __concat = f; __pow = f; + __mul = f; __idiv = f; __unm = f; __len = f; __sub = f; + __shl = f; __shr = f; __bor = f; __bxor = f; + __eq = f; __le = f; __lt = f; __unm = f; __len = f; __band = f; + __bnot = f; +}) + +local b = setmetatable({}, getmetatable(a)) + +assert(a[3] == "index" and a^3 == "pow" and a..a == "concat") +assert(a/3 == "div" and 3%a == "mod") +assert(a+3 == "add" and 3-a == "sub" and a*3 == "mul" and + -a == "unm" and #a == "len" and a&3 == "band") +assert(a + 30000 == "add" and a - 3.0 == "sub" and a * 3.0 == "mul" and + -a == "unm" and #a == "len" and a & 3 == "band") +assert(a|3 == "bor" and 3~a == "bxor" and a<<3 == "shift" and + a>>1 == "shift") +assert (a==b and a.op == "eq") +assert (a>=b and a.op == "order") +assert (a>b and a.op == "order") +assert(~a == "bnot") + +do -- testing for-iterator name + local function f() + assert(debug.getinfo(1).name == "for iterator") + end + + for i in f do end +end + + +do -- testing debug info for finalizers + local name = nil + + -- create a piece of garbage with a finalizer + setmetatable({}, {__gc = function () + local t = debug.getinfo(2) -- get callee information + assert(t.namewhat == "metamethod") + name = t.name + end}) + + -- repeat until previous finalizer runs (setting 'name') + repeat local a = {} until name + assert(name == "__gc") +end + + +do + print("testing traceback sizes") + + local function countlines (s) + return select(2, string.gsub(s, "\n", "")) + end + + local function deep (lvl, n) + if lvl == 0 then + return (debug.traceback("message", n)) + else + return (deep(lvl-1, n)) + end + end + + local function checkdeep (total, start) + local s = deep(total, start) + local rest = string.match(s, "^message\nstack traceback:\n(.*)$") + local cl = countlines(rest) + -- at most 10 lines in first part, 11 in second, plus '...' + assert(cl <= 10 + 11 + 1) + local brk = string.find(rest, "%.%.%.") + if brk then -- does message have '...'? + local rest1 = string.sub(rest, 1, brk) + local rest2 = string.sub(rest, brk, #rest) + assert(countlines(rest1) == 10 and countlines(rest2) == 11) + else + assert(cl == total - start + 2) + end + end + + for d = 1, 51, 10 do + for l = 1, d do + -- use coroutines to ensure complete control of the stack + coroutine.wrap(checkdeep)(d, l) + end + end + +end + + +print("testing debug functions on chunk without debug info") +prog = [[-- program to be loaded without debug information +local debug = require'debug' +local a = 12 -- a local variable + +local n, v = debug.getlocal(1, 1) +assert(n == "(temporary)" and v == debug) -- unkown name but known value +n, v = debug.getlocal(1, 2) +assert(n == "(temporary)" and v == 12) -- unkown name but known value + +-- a function with an upvalue +local f = function () local x; return a end +n, v = debug.getupvalue(f, 1) +assert(n == "(no name)" and v == 12) +assert(debug.setupvalue(f, 1, 13) == "(no name)") +assert(a == 13) + +local t = debug.getinfo(f) +assert(t.name == nil and t.linedefined > 0 and + t.lastlinedefined == t.linedefined and + t.short_src == "?") +assert(debug.getinfo(1).currentline == -1) + +t = debug.getinfo(f, "L").activelines +assert(next(t) == nil) -- active lines are empty + +-- dump/load a function without debug info +f = load(string.dump(f)) + +t = debug.getinfo(f) +assert(t.name == nil and t.linedefined > 0 and + t.lastlinedefined == t.linedefined and + t.short_src == "?") +assert(debug.getinfo(1).currentline == -1) + +return a +]] + + +-- load 'prog' without debug info +local f = assert(load(string.dump(load(prog), true))) + +assert(f() == 13) + +do -- tests for 'source' in binary dumps + local prog = [[ + return function (x) + return function (y) + return x + y + end + end + ]] + local name = string.rep("x", 1000) + local p = assert(load(prog, name)) + -- load 'p' as a binary chunk with debug information + local c = string.dump(p) + assert(#c > 1000 and #c < 2000) -- no repetition of 'source' in dump + local f = assert(load(c)) + local g = f() + local h = g(3) + assert(h(5) == 8) + assert(debug.getinfo(f).source == name and -- all functions have 'source' + debug.getinfo(g).source == name and + debug.getinfo(h).source == name) + -- again, without debug info + local c = string.dump(p, true) + assert(#c < 500) -- no 'source' in dump + local f = assert(load(c)) + local g = f() + local h = g(30) + assert(h(50) == 80) + assert(debug.getinfo(f).source == '=?' and -- no function has 'source' + debug.getinfo(g).source == '=?' and + debug.getinfo(h).source == '=?') +end + +print"OK" + diff --git a/source/lua/testes/errors.lua b/source/lua/testes/errors.lua new file mode 100644 index 0000000..74975e3 --- /dev/null +++ b/source/lua/testes/errors.lua @@ -0,0 +1,581 @@ +-- $Id: testes/errors.lua $ +-- See Copyright Notice in file all.lua + +print("testing errors") + +local debug = require"debug" + +-- avoid problems with 'strict' module (which may generate other error messages) +local mt = getmetatable(_G) or {} +local oldmm = mt.__index +mt.__index = nil + +local function checkerr (msg, f, ...) + local st, err = pcall(f, ...) + assert(not st and string.find(err, msg)) +end + + +local function doit (s) + local f, msg = load(s) + if f == nil then return msg end + local cond, msg = pcall(f) + return (not cond) and msg +end + + +local function checkmessage (prog, msg) + local m = doit(prog) + assert(string.find(m, msg, 1, true)) +end + +local function checksyntax (prog, extra, token, line) + local msg = doit(prog) + if not string.find(token, "^<%a") and not string.find(token, "^char%(") + then token = "'"..token.."'" end + token = string.gsub(token, "(%p)", "%%%1") + local pt = string.format([[^%%[string ".*"%%]:%d: .- near %s$]], + line, token) + assert(string.find(msg, pt)) + assert(string.find(msg, msg, 1, true)) +end + + +-- test error message with no extra info +assert(doit("error('hi', 0)") == 'hi') + +-- test error message with no info +assert(doit("error()") == nil) + + +-- test common errors/errors that crashed in the past +assert(doit("table.unpack({}, 1, n=2^30)")) +assert(doit("a=math.sin()")) +assert(not doit("tostring(1)") and doit("tostring()")) +assert(doit"tonumber()") +assert(doit"repeat until 1; a") +assert(doit"return;;") +assert(doit"assert(false)") +assert(doit"assert(nil)") +assert(doit("function a (... , ...) end")) +assert(doit("function a (, ...) end")) +assert(doit("local t={}; t = t[#t] + 1")) + +checksyntax([[ + local a = {4 + +]], "'}' expected (to close '{' at line 1)", "", 3) + + +if not T then + (Message or print) + ('\n >>> testC not active: skipping memory message test <<<\n') +else + print "testing memory error message" + local a = {} + for i = 1, 10000 do a[i] = true end -- preallocate array + collectgarbage() + T.totalmem(T.totalmem() + 10000) + -- force a memory error (by a small margin) + local st, msg = pcall(function() + for i = 1, 100000 do a[i] = tostring(i) end + end) + T.totalmem(0) + assert(not st and msg == "not enough" .. " memory") +end + + +-- tests for better error messages + +checkmessage("a = {} + 1", "arithmetic") +checkmessage("a = {} | 1", "bitwise operation") +checkmessage("a = {} < 1", "attempt to compare") +checkmessage("a = {} <= 1", "attempt to compare") + +checkmessage("a=1; bbbb=2; a=math.sin(3)+bbbb(3)", "global 'bbbb'") +checkmessage("a={}; do local a=1 end a:bbbb(3)", "method 'bbbb'") +checkmessage("local a={}; a.bbbb(3)", "field 'bbbb'") +assert(not string.find(doit"a={13}; local bbbb=1; a[bbbb](3)", "'bbbb'")) +checkmessage("a={13}; local bbbb=1; a[bbbb](3)", "number") +checkmessage("a=(1)..{}", "a table value") + +checkmessage("a = #print", "length of a function value") +checkmessage("a = #3", "length of a number value") + +aaa = nil +checkmessage("aaa.bbb:ddd(9)", "global 'aaa'") +checkmessage("local aaa={bbb=1}; aaa.bbb:ddd(9)", "field 'bbb'") +checkmessage("local aaa={bbb={}}; aaa.bbb:ddd(9)", "method 'ddd'") +checkmessage("local a,b,c; (function () a = b+1.1 end)()", "upvalue 'b'") +assert(not doit"local aaa={bbb={ddd=next}}; aaa.bbb:ddd(nil)") + +-- upvalues being indexed do not go to the stack +checkmessage("local a,b,cc; (function () a = cc[1] end)()", "upvalue 'cc'") +checkmessage("local a,b,cc; (function () a.x = 1 end)()", "upvalue 'a'") + +checkmessage("local _ENV = {x={}}; a = a + 1", "global 'a'") + +checkmessage("b=1; local aaa={}; x=aaa+b", "local 'aaa'") +checkmessage("aaa={}; x=3.3/aaa", "global 'aaa'") +checkmessage("aaa=2; b=nil;x=aaa*b", "global 'b'") +checkmessage("aaa={}; x=-aaa", "global 'aaa'") + +-- short circuit +checkmessage("a=1; local a,bbbb=2,3; a = math.sin(1) and bbbb(3)", + "local 'bbbb'") +checkmessage("a=1; local a,bbbb=2,3; a = bbbb(1) or a(3)", "local 'bbbb'") +checkmessage("local a,b,c,f = 1,1,1; f((a and b) or c)", "local 'f'") +checkmessage("local a,b,c = 1,1,1; ((a and b) or c)()", "call a number value") +assert(not string.find(doit"aaa={}; x=(aaa or aaa)+(aaa and aaa)", "'aaa'")) +assert(not string.find(doit"aaa={}; (aaa or aaa)()", "'aaa'")) + +checkmessage("print(print < 10)", "function with number") +checkmessage("print(print < print)", "two function values") +checkmessage("print('10' < 10)", "string with number") +checkmessage("print(10 < '23')", "number with string") + +-- float->integer conversions +checkmessage("local a = 2.0^100; x = a << 2", "local a") +checkmessage("local a = 1 >> 2.0^100", "has no integer representation") +checkmessage("local a = 10.1 << 2.0^100", "has no integer representation") +checkmessage("local a = 2.0^100 & 1", "has no integer representation") +checkmessage("local a = 2.0^100 & 1e100", "has no integer representation") +checkmessage("local a = 2.0 | 1e40", "has no integer representation") +checkmessage("local a = 2e100 ~ 1", "has no integer representation") +checkmessage("string.sub('a', 2.0^100)", "has no integer representation") +checkmessage("string.rep('a', 3.3)", "has no integer representation") +checkmessage("return 6e40 & 7", "has no integer representation") +checkmessage("return 34 << 7e30", "has no integer representation") +checkmessage("return ~-3e40", "has no integer representation") +checkmessage("return ~-3.009", "has no integer representation") +checkmessage("return 3.009 & 1", "has no integer representation") +checkmessage("return 34 >> {}", "table value") +checkmessage("a = 24 // 0", "divide by zero") +checkmessage("a = 1 % 0", "'n%0'") + + +-- numeric for loops +checkmessage("for i = {}, 10 do end", "table") +checkmessage("for i = io.stdin, 10 do end", "FILE") +checkmessage("for i = {}, 10 do end", "initial value") +checkmessage("for i = 1, 'x', 10 do end", "string") +checkmessage("for i = 1, {}, 10 do end", "limit") +checkmessage("for i = 1, {} do end", "limit") +checkmessage("for i = 1, 10, print do end", "step") +checkmessage("for i = 1, 10, print do end", "function") + +-- passing light userdata instead of full userdata +_G.D = debug +checkmessage([[ + -- create light udata + local x = D.upvalueid(function () return debug end, 1) + D.setuservalue(x, {}) +]], "light userdata") +_G.D = nil + +do -- named objects (field '__name') + checkmessage("math.sin(io.input())", "(number expected, got FILE*)") + _G.XX = setmetatable({}, {__name = "My Type"}) + assert(string.find(tostring(XX), "^My Type")) + checkmessage("io.input(XX)", "(FILE* expected, got My Type)") + checkmessage("return XX + 1", "on a My Type value") + checkmessage("return ~io.stdin", "on a FILE* value") + checkmessage("return XX < XX", "two My Type values") + checkmessage("return {} < XX", "table with My Type") + checkmessage("return XX < io.stdin", "My Type with FILE*") + _G.XX = nil +end + +-- global functions +checkmessage("(io.write or print){}", "io.write") +checkmessage("(collectgarbage or print){}", "collectgarbage") + +-- errors in functions without debug info +do + local f = function (a) return a + 1 end + f = assert(load(string.dump(f, true))) + assert(f(3) == 4) + checkerr("^%?:%-1:", f, {}) + + -- code with a move to a local var ('OP_MOV A B' with A3+1, + {d = x and aaa[x or y]}} +]], "global 'aaa'") + +checkmessage([[ +local x,y = {},1 +if math.sin(1) == 0 then return 3 end -- return +x.a()]], "field 'a'") + +checkmessage([[ +prefix = nil +insert = nil +while 1 do + local a + if nil then break end + insert(prefix, a) +end]], "global 'insert'") + +checkmessage([[ -- tail call + return math.sin("a") +]], "'sin'") + +checkmessage([[collectgarbage("nooption")]], "invalid option") + +checkmessage([[x = print .. "a"]], "concatenate") +checkmessage([[x = "a" .. false]], "concatenate") +checkmessage([[x = {} .. 2]], "concatenate") + +checkmessage("getmetatable(io.stdin).__gc()", "no value") + +checkmessage([[ +local Var +local function main() + NoSuchName (function() Var=0 end) +end +main() +]], "global 'NoSuchName'") +print'+' + +a = {}; setmetatable(a, {__index = string}) +checkmessage("a:sub()", "bad self") +checkmessage("string.sub('a', {})", "#2") +checkmessage("('a'):sub{}", "#1") + +checkmessage("table.sort({1,2,3}, table.sort)", "'table.sort'") +checkmessage("string.gsub('s', 's', setmetatable)", "'setmetatable'") + +-- tests for errors in coroutines + +local function f (n) + local c = coroutine.create(f) + local a,b = coroutine.resume(c) + return b +end +assert(string.find(f(), "C stack overflow")) + +checkmessage("coroutine.yield()", "outside a coroutine") + +f = coroutine.wrap(function () table.sort({1,2,3}, coroutine.yield) end) +checkerr("yield across", f) + + +-- testing size of 'source' info; size of buffer for that info is +-- LUA_IDSIZE, declared as 60 in luaconf. Get one position for '\0'. +idsize = 60 - 1 +local function checksize (source) + -- syntax error + local _, msg = load("x", source) + msg = string.match(msg, "^([^:]*):") -- get source (1st part before ':') + assert(msg:len() <= idsize) +end + +for i = 60 - 10, 60 + 10 do -- check border cases around 60 + checksize("@" .. string.rep("x", i)) -- file names + checksize(string.rep("x", i - 10)) -- string sources + checksize("=" .. string.rep("x", i)) -- exact sources +end + + +-- testing line error + +local function lineerror (s, l) + local err,msg = pcall(load(s)) + local line = string.match(msg, ":(%d+):") + assert(tonumber(line) == l) +end + +lineerror("local a\n for i=1,'a' do \n print(i) \n end", 2) +lineerror("\n local a \n for k,v in 3 \n do \n print(k) \n end", 3) +lineerror("\n\n for k,v in \n 3 \n do \n print(k) \n end", 4) +lineerror("function a.x.y ()\na=a+1\nend", 1) + +lineerror("a = \na\n+\n{}", 3) +lineerror("a = \n3\n+\n(\n4\n/\nprint)", 6) +lineerror("a = \nprint\n+\n(\n4\n/\n7)", 3) + +lineerror("a\n=\n-\n\nprint\n;", 3) + +lineerror([[ +a +( +23) +]], 1) + +lineerror([[ +local a = {x = 13} +a +. +x +( +23 +) +]], 2) + +lineerror([[ +local a = {x = 13} +a +. +x +( +23 + a +) +]], 6) + +local p = [[ + function g() f() end + function f(x) error('a', X) end +g() +]] +X=3;lineerror((p), 3) +X=0;lineerror((p), nil) +X=1;lineerror((p), 2) +X=2;lineerror((p), 1) + + +lineerror([[ +local b = false +if not b then + error 'test' +end]], 3) + +lineerror([[ +local b = false +if not b then + if not b then + if not b then + error 'test' + end + end +end]], 5) + + +if not _soft then + -- several tests that exaust the Lua stack + collectgarbage() + print"testing stack overflow" + C = 0 + local l = debug.getinfo(1, "l").currentline; function y () C=C+1; y() end + + local function checkstackmessage (m) + return (string.find(m, "stack overflow")) + end + -- repeated stack overflows (to check stack recovery) + assert(checkstackmessage(doit('y()'))) + print('+') + assert(checkstackmessage(doit('y()'))) + print('+') + assert(checkstackmessage(doit('y()'))) + print('+') + + + -- error lines in stack overflow + C = 0 + local l1 + local function g(x) + l1 = debug.getinfo(x, "l").currentline; y() + end + local _, stackmsg = xpcall(g, debug.traceback, 1) + print('+') + local stack = {} + for line in string.gmatch(stackmsg, "[^\n]*") do + local curr = string.match(line, ":(%d+):") + if curr then table.insert(stack, tonumber(curr)) end + end + local i=1 + while stack[i] ~= l1 do + assert(stack[i] == l) + i = i+1 + end + assert(i > 15) + + + -- error in error handling + local res, msg = xpcall(error, error) + assert(not res and type(msg) == 'string') + print('+') + + local function f (x) + if x==0 then error('a\n') + else + local aux = function () return f(x-1) end + local a,b = xpcall(aux, aux) + return a,b + end + end + f(3) + + local function loop (x,y,z) return 1 + loop(x, y, z) end + + local res, msg = xpcall(loop, function (m) + assert(string.find(m, "stack overflow")) + checkerr("error handling", loop) + assert(math.sin(0) == 0) + return 15 + end) + assert(msg == 15) + + local f = function () + for i = 999900, 1000000, 1 do table.unpack({}, 1, i) end + end + checkerr("too many results", f) + +end + + +do + -- non string messages + local t = {} + local res, msg = pcall(function () error(t) end) + assert(not res and msg == t) + + res, msg = pcall(function () error(nil) end) + assert(not res and msg == nil) + + local function f() error{msg='x'} end + res, msg = xpcall(f, function (r) return {msg=r.msg..'y'} end) + assert(msg.msg == 'xy') + + -- 'assert' with extra arguments + res, msg = pcall(assert, false, "X", t) + assert(not res and msg == "X") + + -- 'assert' with no message + res, msg = pcall(function () assert(false) end) + local line = string.match(msg, "%w+%.lua:(%d+): assertion failed!$") + assert(tonumber(line) == debug.getinfo(1, "l").currentline - 2) + + -- 'assert' with non-string messages + res, msg = pcall(assert, false, t) + assert(not res and msg == t) + + res, msg = pcall(assert, nil, nil) + assert(not res and msg == nil) + + -- 'assert' without arguments + res, msg = pcall(assert) + assert(not res and string.find(msg, "value expected")) +end + +-- xpcall with arguments +a, b, c = xpcall(string.find, error, "alo", "al") +assert(a and b == 1 and c == 2) +a, b, c = xpcall(string.find, function (x) return {} end, true, "al") +assert(not a and type(b) == "table" and c == nil) + + +print("testing tokens in error messages") +checksyntax("syntax error", "", "error", 1) +checksyntax("1.000", "", "1.000", 1) +checksyntax("[[a]]", "", "[[a]]", 1) +checksyntax("'aa'", "", "'aa'", 1) +checksyntax("while << do end", "", "<<", 1) +checksyntax("for >> do end", "", ">>", 1) + +-- test invalid non-printable char in a chunk +checksyntax("a\1a = 1", "", "<\\1>", 1) + +-- test 255 as first char in a chunk +checksyntax("\255a = 1", "", "<\\255>", 1) + +doit('I = load("a=9+"); a=3') +assert(a==3 and I == nil) +print('+') + +lim = 1000 +if _soft then lim = 100 end +for i=1,lim do + doit('a = ') + doit('a = 4+nil') +end + + +-- testing syntax limits + +local function testrep (init, rep, close, repc) + local s = init .. string.rep(rep, 100) .. close .. string.rep(repc, 100) + assert(load(s)) -- 100 levels is OK + s = init .. string.rep(rep, 10000) + local res, msg = load(s) -- 10000 levels not ok + assert(not res and (string.find(msg, "too many registers") or + string.find(msg, "stack overflow"))) +end + +testrep("local a; a", ",a", "= 1", ",1") -- multiple assignment +testrep("local a; a=", "{", "0", "}") +testrep("local a; a=", "(", "2", ")") +testrep("local a; ", "a(", "2", ")") +testrep("", "do ", "", " end") +testrep("", "while a do ", "", " end") +testrep("local a; ", "if a then else ", "", " end") +testrep("", "function foo () ", "", " end") +testrep("local a; a=", "a..", "a", "") +testrep("local a; a=", "a^", "a", "") + +checkmessage("a = f(x" .. string.rep(",x", 260) .. ")", "too many registers") + + +-- testing other limits + +-- upvalues +local lim = 127 +local s = "local function fooA ()\n local " +for j = 1,lim do + s = s.."a"..j..", " +end +s = s.."b,c\n" +s = s.."local function fooB ()\n local " +for j = 1,lim do + s = s.."b"..j..", " +end +s = s.."b\n" +s = s.."function fooC () return b+c" +local c = 1+2 +for j = 1,lim do + s = s.."+a"..j.."+b"..j + c = c + 2 +end +s = s.."\nend end end" +local a,b = load(s) +assert(c > 255 and string.find(b, "too many upvalues") and + string.find(b, "line 5")) + +-- local variables +s = "\nfunction foo ()\n local " +for j = 1,300 do + s = s.."a"..j..", " +end +s = s.."b\n" +local a,b = load(s) +assert(string.find(b, "line 2") and string.find(b, "too many local variables")) + +mt.__index = oldmm + +print('OK') diff --git a/source/lua/testes/events.lua b/source/lua/testes/events.lua new file mode 100644 index 0000000..ac630d8 --- /dev/null +++ b/source/lua/testes/events.lua @@ -0,0 +1,474 @@ +-- $Id: testes/events.lua $ +-- See Copyright Notice in file all.lua + +print('testing metatables') + +local debug = require'debug' + +X = 20; B = 30 + +_ENV = setmetatable({}, {__index=_G}) + +collectgarbage() + +X = X+10 +assert(X == 30 and _G.X == 20) +B = false +assert(B == false) +_ENV["B"] = undef +assert(B == 30) + +assert(getmetatable{} == nil) +assert(getmetatable(4) == nil) +assert(getmetatable(nil) == nil) +a={name = "NAME"}; setmetatable(a, {__metatable = "xuxu", + __tostring=function(x) return x.name end}) +assert(getmetatable(a) == "xuxu") +assert(tostring(a) == "NAME") +-- cannot change a protected metatable +assert(pcall(setmetatable, a, {}) == false) +a.name = "gororoba" +assert(tostring(a) == "gororoba") + +local a, t = {10,20,30; x="10", y="20"}, {} +assert(setmetatable(a,t) == a) +assert(getmetatable(a) == t) +assert(setmetatable(a,nil) == a) +assert(getmetatable(a) == nil) +assert(setmetatable(a,t) == a) + + +function f (t, i, e) + assert(not e) + local p = rawget(t, "parent") + return (p and p[i]+3), "dummy return" +end + +t.__index = f + +a.parent = {z=25, x=12, [4] = 24} +assert(a[1] == 10 and a.z == 28 and a[4] == 27 and a.x == "10") + +collectgarbage() + +a = setmetatable({}, t) +function f(t, i, v) rawset(t, i, v-3) end +setmetatable(t, t) -- causes a bug in 5.1 ! +t.__newindex = f +a[1] = 30; a.x = "101"; a[5] = 200 +assert(a[1] == 27 and a.x == 98 and a[5] == 197) + +do -- bug in Lua 5.3.2 + local mt = {} + mt.__newindex = mt + local t = setmetatable({}, mt) + t[1] = 10 -- will segfault on some machines + assert(mt[1] == 10) +end + + +local c = {} +a = setmetatable({}, t) +t.__newindex = c +t.__index = c +a[1] = 10; a[2] = 20; a[3] = 90; +for i = 4, 20 do a[i] = i * 10 end +assert(a[1] == 10 and a[2] == 20 and a[3] == 90) +for i = 4, 20 do assert(a[i] == i * 10) end +assert(next(a) == nil) + + +do + local a; + a = setmetatable({}, {__index = setmetatable({}, + {__index = setmetatable({}, + {__index = function (_,n) return a[n-3]+4, "lixo" end})})}) + a[0] = 20 + for i=0,10 do + assert(a[i*3] == 20 + i*4) + end +end + + +do -- newindex + local foi + local a = {} + for i=1,10 do a[i] = 0; a['a'..i] = 0; end + setmetatable(a, {__newindex = function (t,k,v) foi=true; rawset(t,k,v) end}) + foi = false; a[1]=0; assert(not foi) + foi = false; a['a1']=0; assert(not foi) + foi = false; a['a11']=0; assert(foi) + foi = false; a[11]=0; assert(foi) + foi = false; a[1]=undef; assert(not foi) + a[1] = undef + foi = false; a[1]=nil; assert(foi) +end + + +setmetatable(t, nil) +function f (t, ...) return t, {...} end +t.__call = f + +do + local x,y = a(table.unpack{'a', 1}) + assert(x==a and y[1]=='a' and y[2]==1 and y[3]==undef) + x,y = a() + assert(x==a and y[1]==undef) +end + + +local b = setmetatable({}, t) +setmetatable(b,t) + +function f(op) + return function (...) cap = {[0] = op, ...} ; return (...) end +end +t.__add = f("add") +t.__sub = f("sub") +t.__mul = f("mul") +t.__div = f("div") +t.__idiv = f("idiv") +t.__mod = f("mod") +t.__unm = f("unm") +t.__pow = f("pow") +t.__len = f("len") +t.__band = f("band") +t.__bor = f("bor") +t.__bxor = f("bxor") +t.__shl = f("shl") +t.__shr = f("shr") +t.__bnot = f("bnot") + +-- Some tests are done inside small anonymous functions to ensure +-- that constants go to constant table even in debug compilation, +-- when the constant table is very small. +assert(b+5 == b) +assert(cap[0] == "add" and cap[1] == b and cap[2] == 5 and cap[3]==undef) +assert(5.2 + b == 5.2) +assert(cap[0] == "add" and cap[1] == 5.2 and cap[2] == b and cap[3]==undef) +assert(b+'5' == b) +assert(cap[0] == "add" and cap[1] == b and cap[2] == '5' and cap[3]==undef) +assert(5+b == 5) +assert(cap[0] == "add" and cap[1] == 5 and cap[2] == b and cap[3]==undef) +assert('5'+b == '5') +assert(cap[0] == "add" and cap[1] == '5' and cap[2] == b and cap[3]==undef) +b=b-3; assert(getmetatable(b) == t) +assert(cap[0] == "sub" and cap[1] == b and cap[2] == 3 and cap[3]==undef) +assert(5-a == 5) +assert(cap[0] == "sub" and cap[1] == 5 and cap[2] == a and cap[3]==undef) +assert('5'-a == '5') +assert(cap[0] == "sub" and cap[1] == '5' and cap[2] == a and cap[3]==undef) +assert(a*a == a) +assert(cap[0] == "mul" and cap[1] == a and cap[2] == a and cap[3]==undef) +assert(a/0 == a) +assert(cap[0] == "div" and cap[1] == a and cap[2] == 0 and cap[3]==undef) +assert(a%2 == a) +assert(cap[0] == "mod" and cap[1] == a and cap[2] == 2 and cap[3]==undef) +assert(a // (1/0) == a) +assert(cap[0] == "idiv" and cap[1] == a and cap[2] == 1/0 and cap[3]==undef) +;(function () assert(a & "hi" == a) end)() +assert(cap[0] == "band" and cap[1] == a and cap[2] == "hi" and cap[3]==undef) +;(function () assert(10 & a == 10) end)() +assert(cap[0] == "band" and cap[1] == 10 and cap[2] == a and cap[3]==undef) +;(function () assert(a | 10 == a) end)() +assert(cap[0] == "bor" and cap[1] == a and cap[2] == 10 and cap[3]==undef) +assert(a | "hi" == a) +assert(cap[0] == "bor" and cap[1] == a and cap[2] == "hi" and cap[3]==undef) +assert("hi" ~ a == "hi") +assert(cap[0] == "bxor" and cap[1] == "hi" and cap[2] == a and cap[3]==undef) +;(function () assert(10 ~ a == 10) end)() +assert(cap[0] == "bxor" and cap[1] == 10 and cap[2] == a and cap[3]==undef) +assert(-a == a) +assert(cap[0] == "unm" and cap[1] == a) +assert(a^4 == a) +assert(cap[0] == "pow" and cap[1] == a and cap[2] == 4 and cap[3]==undef) +assert(a^'4' == a) +assert(cap[0] == "pow" and cap[1] == a and cap[2] == '4' and cap[3]==undef) +assert(4^a == 4) +assert(cap[0] == "pow" and cap[1] == 4 and cap[2] == a and cap[3]==undef) +assert('4'^a == '4') +assert(cap[0] == "pow" and cap[1] == '4' and cap[2] == a and cap[3]==undef) +assert(#a == a) +assert(cap[0] == "len" and cap[1] == a) +assert(~a == a) +assert(cap[0] == "bnot" and cap[1] == a) +assert(a << 3 == a) +assert(cap[0] == "shl" and cap[1] == a and cap[2] == 3) +assert(1.5 >> a == 1.5) +assert(cap[0] == "shr" and cap[1] == 1.5 and cap[2] == a) + + +-- test for rawlen +t = setmetatable({1,2,3}, {__len = function () return 10 end}) +assert(#t == 10 and rawlen(t) == 3) +assert(rawlen"abc" == 3) +assert(not pcall(rawlen, io.stdin)) +assert(not pcall(rawlen, 34)) +assert(not pcall(rawlen)) + +-- rawlen for long strings +assert(rawlen(string.rep('a', 1000)) == 1000) + + +t = {} +t.__lt = function (a,b,c) + collectgarbage() + assert(c == nil) + if type(a) == 'table' then a = a.x end + if type(b) == 'table' then b = b.x end + return aOp(1)) and not(Op(1)>Op(2)) and (Op(2)>Op(1))) + assert(not(Op('a')>Op('a')) and not(Op('a')>Op('b')) and (Op('b')>Op('a'))) + assert((Op(1)>=Op(1)) and not(Op(1)>=Op(2)) and (Op(2)>=Op(1))) + assert((1 >= Op(1)) and not(1 >= Op(2)) and (Op(2) >= 1)) + assert((Op('a')>=Op('a')) and not(Op('a')>=Op('b')) and (Op('b')>=Op('a'))) + assert(('a' >= Op('a')) and not(Op('a') >= 'b') and (Op('b') >= Op('a'))) +end + +test() + + +-- test `partial order' + +local function rawSet(x) + local y = {} + for _,k in pairs(x) do y[k] = 1 end + return y +end + +local function Set(x) + return setmetatable(rawSet(x), t) +end + +t.__lt = function (a,b) + for k in pairs(a) do + if not b[k] then return false end + b[k] = undef + end + return next(b) ~= nil +end + +t.__le = function (a,b) + for k in pairs(a) do + if not b[k] then return false end + end + return true +end + +assert(Set{1,2,3} < Set{1,2,3,4}) +assert(not(Set{1,2,3,4} < Set{1,2,3,4})) +assert((Set{1,2,3,4} <= Set{1,2,3,4})) +assert((Set{1,2,3,4} >= Set{1,2,3,4})) +assert(not (Set{1,3} <= Set{3,5})) +assert(not(Set{1,3} <= Set{3,5})) +assert(not(Set{1,3} >= Set{3,5})) + + +t.__eq = function (a,b) + for k in pairs(a) do + if not b[k] then return false end + b[k] = undef + end + return next(b) == nil +end + +local s = Set{1,3,5} +assert(s == Set{3,5,1}) +assert(not rawequal(s, Set{3,5,1})) +assert(rawequal(s, s)) +assert(Set{1,3,5,1} == rawSet{3,5,1}) +assert(rawSet{1,3,5,1} == Set{3,5,1}) +assert(Set{1,3,5} ~= Set{3,5,1,6}) + +-- '__eq' is not used for table accesses +t[Set{1,3,5}] = 1 +assert(t[Set{1,3,5}] == undef) + + +if not T then + (Message or print)('\n >>> testC not active: skipping tests for \z +userdata <<<\n') +else + local u1 = T.newuserdata(0, 1) + local u2 = T.newuserdata(0, 1) + local u3 = T.newuserdata(0, 1) + assert(u1 ~= u2 and u1 ~= u3) + debug.setuservalue(u1, 1); + debug.setuservalue(u2, 2); + debug.setuservalue(u3, 1); + debug.setmetatable(u1, {__eq = function (a, b) + return debug.getuservalue(a) == debug.getuservalue(b) + end}) + debug.setmetatable(u2, {__eq = function (a, b) + return true + end}) + assert(u1 == u3 and u3 == u1 and u1 ~= u2) + assert(u2 == u1 and u2 == u3 and u3 == u2) + assert(u2 ~= {}) -- different types cannot be equal + + local mirror = {} + debug.setmetatable(u3, {__index = mirror, __newindex = mirror}) + for i = 1, 10 do u3[i] = i end + for i = 1, 10 do assert(u3[i] == i) end +end + + +t.__concat = function (a,b,c) + assert(c == nil) + if type(a) == 'table' then a = a.val end + if type(b) == 'table' then b = b.val end + if A then return a..b + else + return setmetatable({val=a..b}, t) + end +end + +c = {val="c"}; setmetatable(c, t) +d = {val="d"}; setmetatable(d, t) + +A = true +assert(c..d == 'cd') +assert(0 .."a".."b"..c..d.."e".."f"..(5+3).."g" == "0abcdef8g") + +A = false +assert((c..d..c..d).val == 'cdcd') +x = c..d +assert(getmetatable(x) == t and x.val == 'cd') +x = 0 .."a".."b"..c..d.."e".."f".."g" +assert(x.val == "0abcdefg") + + +-- concat metamethod x numbers (bug in 5.1.1) +c = {} +local x +setmetatable(c, {__concat = function (a,b) + assert(type(a) == "number" and b == c or type(b) == "number" and a == c) + return c +end}) +assert(c..5 == c and 5 .. c == c) +assert(4 .. c .. 5 == c and 4 .. 5 .. 6 .. 7 .. c == c) + + +-- test comparison compatibilities +local t1, t2, c, d +t1 = {}; c = {}; setmetatable(c, t1) +d = {} +t1.__eq = function () return true end +t1.__lt = function () return true end +t1.__le = function () return false end +setmetatable(d, t1) +assert(c == d and c < d and not(d <= c)) +t2 = {} +t2.__eq = t1.__eq +t2.__lt = t1.__lt +setmetatable(d, t2) +assert(c == d and c < d and not(d <= c)) + + + +-- test for several levels of calls +local i +local tt = { + __call = function (t, ...) + i = i+1 + if t.f then return t.f(...) + else return {...} + end + end +} + +local a = setmetatable({}, tt) +local b = setmetatable({f=a}, tt) +local c = setmetatable({f=b}, tt) + +i = 0 +x = c(3,4,5) +assert(i == 3 and x[1] == 3 and x[3] == 5) + + +assert(_G.X == 20) + +print'+' + +local _g = _G +_ENV = setmetatable({}, {__index=function (_,k) return _g[k] end}) + + +a = {} +rawset(a, "x", 1, 2, 3) +assert(a.x == 1 and rawget(a, "x", 3) == 1) + +print '+' + +-- testing metatables for basic types +mt = {__index = function (a,b) return a+b end, + __len = function (x) return math.floor(x) end} +debug.setmetatable(10, mt) +assert(getmetatable(-2) == mt) +assert((10)[3] == 13) +assert((10)["3"] == 13) +assert(#3.45 == 3) +debug.setmetatable(23, nil) +assert(getmetatable(-2) == nil) + +debug.setmetatable(true, mt) +assert(getmetatable(false) == mt) +mt.__index = function (a,b) return a or b end +assert((true)[false] == true) +assert((false)[false] == false) +debug.setmetatable(false, nil) +assert(getmetatable(true) == nil) + +debug.setmetatable(nil, mt) +assert(getmetatable(nil) == mt) +mt.__add = function (a,b) return (a or 1) + (b or 2) end +assert(10 + nil == 12) +assert(nil + 23 == 24) +assert(nil + nil == 3) +debug.setmetatable(nil, nil) +assert(getmetatable(nil) == nil) + +debug.setmetatable(nil, {}) + + +-- loops in delegation +a = {}; setmetatable(a, a); a.__index = a; a.__newindex = a +assert(not pcall(function (a,b) return a[b] end, a, 10)) +assert(not pcall(function (a,b,c) a[b] = c end, a, 10, true)) + +-- bug in 5.1 +T, K, V = nil +grandparent = {} +grandparent.__newindex = function(t,k,v) T=t; K=k; V=v end + +parent = {} +parent.__newindex = parent +setmetatable(parent, grandparent) + +child = setmetatable({}, parent) +child.foo = 10 --> CRASH (on some machines) +assert(T == parent and K == "foo" and V == 10) + +print 'OK' + +return 12 + + diff --git a/source/lua/testes/files.lua b/source/lua/testes/files.lua new file mode 100644 index 0000000..34fcf85 --- /dev/null +++ b/source/lua/testes/files.lua @@ -0,0 +1,880 @@ +-- $Id: testes/files.lua $ +-- See Copyright Notice in file all.lua + +local debug = require "debug" + +local maxint = math.maxinteger + +assert(type(os.getenv"PATH") == "string") + +assert(io.input(io.stdin) == io.stdin) +assert(not pcall(io.input, "non-existent-file")) +assert(io.output(io.stdout) == io.stdout) + + +local function testerr (msg, f, ...) + local stat, err = pcall(f, ...) + return (not stat and string.find(err, msg, 1, true)) +end + + +local function checkerr (msg, f, ...) + assert(testerr(msg, f, ...)) +end + + +-- cannot close standard files +assert(not io.close(io.stdin) and + not io.stdout:close() and + not io.stderr:close()) + +-- cannot call close method without an argument (new in 5.3.5) +checkerr("got no value", io.stdin.close) + + +assert(type(io.input()) == "userdata" and io.type(io.output()) == "file") +assert(type(io.stdin) == "userdata" and io.type(io.stderr) == "file") +assert(not io.type(8)) +local a = {}; setmetatable(a, {}) +assert(not io.type(a)) + +assert(getmetatable(io.input()).__name == "FILE*") + +local a,b,c = io.open('xuxu_nao_existe') +assert(not a and type(b) == "string" and type(c) == "number") + +a,b,c = io.open('/a/b/c/d', 'w') +assert(not a and type(b) == "string" and type(c) == "number") + +local file = os.tmpname() +local f, msg = io.open(file, "w") +if not f then + (Message or print)("'os.tmpname' file cannot be open; skipping file tests") + +else --{ most tests here need tmpname +f:close() + +print('testing i/o') + +local otherfile = os.tmpname() + +checkerr("invalid mode", io.open, file, "rw") +checkerr("invalid mode", io.open, file, "rb+") +checkerr("invalid mode", io.open, file, "r+bk") +checkerr("invalid mode", io.open, file, "") +checkerr("invalid mode", io.open, file, "+") +checkerr("invalid mode", io.open, file, "b") +assert(io.open(file, "r+b")):close() +assert(io.open(file, "r+")):close() +assert(io.open(file, "rb")):close() + +assert(os.setlocale('C', 'all')) + +io.input(io.stdin); io.output(io.stdout); + +os.remove(file) +assert(not loadfile(file)) +checkerr("", dofile, file) +assert(not io.open(file)) +io.output(file) +assert(io.output() ~= io.stdout) + +if not _port then -- invalid seek + local status, msg, code = io.stdin:seek("set", 1000) + assert(not status and type(msg) == "string" and type(code) == "number") +end + +assert(io.output():seek() == 0) +assert(io.write("alo alo"):seek() == string.len("alo alo")) +assert(io.output():seek("cur", -3) == string.len("alo alo")-3) +assert(io.write("joao")) +assert(io.output():seek("end") == string.len("alo joao")) + +assert(io.output():seek("set") == 0) + +assert(io.write('"álo"', "{a}\n", "second line\n", "third line \n")) +assert(io.write('çfourth_line')) +io.output(io.stdout) +collectgarbage() -- file should be closed by GC +assert(io.input() == io.stdin and rawequal(io.output(), io.stdout)) +print('+') + +-- test GC for files +collectgarbage() +for i=1,120 do + for i=1,5 do + io.input(file) + assert(io.open(file, 'r')) + io.lines(file) + end + collectgarbage() +end + +io.input():close() +io.close() + +assert(os.rename(file, otherfile)) +assert(not os.rename(file, otherfile)) + +io.output(io.open(otherfile, "ab")) +assert(io.write("\n\n\t\t ", 3450, "\n")); +io.close() + + +do + -- closing file by scope + local F = nil + do + local *toclose f = assert(io.open(file, "w")) + F = f + end + assert(tostring(F) == "file (closed)") +end +assert(os.remove(file)) + + +do + -- test writing/reading numbers + local *toclose f = assert(io.open(file, "w")) + f:write(maxint, '\n') + f:write(string.format("0X%x\n", maxint)) + f:write("0xABCp-3", '\n') + f:write(0, '\n') + f:write(-maxint, '\n') + f:write(string.format("0x%X\n", -maxint)) + f:write("-0xABCp-3", '\n') + assert(f:close()) + f = assert(io.open(file, "r")) + assert(f:read("n") == maxint) + assert(f:read("n") == maxint) + assert(f:read("n") == 0xABCp-3) + assert(f:read("n") == 0) + assert(f:read("*n") == -maxint) -- test old format (with '*') + assert(f:read("n") == -maxint) + assert(f:read("*n") == -0xABCp-3) -- test old format (with '*') +end +assert(os.remove(file)) + + +-- testing multiple arguments to io.read +do + local *toclose f = assert(io.open(file, "w")) + f:write[[ +a line +another line +1234 +3.45 +one +two +three +]] + local l1, l2, l3, l4, n1, n2, c, dummy + assert(f:close()) + f = assert(io.open(file, "r")) + l1, l2, n1, n2, dummy = f:read("l", "L", "n", "n") + assert(l1 == "a line" and l2 == "another line\n" and + n1 == 1234 and n2 == 3.45 and dummy == nil) + assert(f:close()) + f = assert(io.open(file, "r")) + l1, l2, n1, n2, c, l3, l4, dummy = f:read(7, "l", "n", "n", 1, "l", "l") + assert(l1 == "a line\n" and l2 == "another line" and c == '\n' and + n1 == 1234 and n2 == 3.45 and l3 == "one" and l4 == "two" + and dummy == nil) + assert(f:close()) + f = assert(io.open(file, "r")) + -- second item failing + l1, n1, n2, dummy = f:read("l", "n", "n", "l") + assert(l1 == "a line" and n1 == nil) +end +assert(os.remove(file)) + + + +-- test yielding during 'dofile' +f = assert(io.open(file, "w")) +f:write[[ +local x, z = coroutine.yield(10) +local y = coroutine.yield(20) +return x + y * z +]] +assert(f:close()) +f = coroutine.wrap(dofile) +assert(f(file) == 10) +assert(f(100, 101) == 20) +assert(f(200) == 100 + 200 * 101) +assert(os.remove(file)) + + +f = assert(io.open(file, "w")) +-- test number termination +f:write[[ +-12.3- -0xffff+ .3|5.E-3X +234e+13E 0xDEADBEEFDEADBEEFx +0x1.13Ap+3e +]] +-- very long number +f:write("1234"); for i = 1, 1000 do f:write("0") end; f:write("\n") +-- invalid sequences (must read and discard valid prefixes) +f:write[[ +.e+ 0.e; --; 0xX; +]] +assert(f:close()) +f = assert(io.open(file, "r")) +assert(f:read("n") == -12.3); assert(f:read(1) == "-") +assert(f:read("n") == -0xffff); assert(f:read(2) == "+ ") +assert(f:read("n") == 0.3); assert(f:read(1) == "|") +assert(f:read("n") == 5e-3); assert(f:read(1) == "X") +assert(f:read("n") == 234e13); assert(f:read(1) == "E") +assert(f:read("n") == 0Xdeadbeefdeadbeef); assert(f:read(2) == "x\n") +assert(f:read("n") == 0x1.13aP3); assert(f:read(1) == "e") + +do -- attempt to read too long number + assert(f:read("n") == nil) -- fails + local s = f:read("L") -- read rest of line + assert(string.find(s, "^00*\n$")) -- lots of 0's left +end + +assert(not f:read("n")); assert(f:read(2) == "e+") +assert(not f:read("n")); assert(f:read(1) == ";") +assert(not f:read("n")); assert(f:read(2) == "-;") +assert(not f:read("n")); assert(f:read(1) == "X") +assert(not f:read("n")); assert(f:read(1) == ";") +assert(not f:read("n")); assert(not f:read(0)) -- end of file +assert(f:close()) +assert(os.remove(file)) + + +-- test line generators +assert(not pcall(io.lines, "non-existent-file")) +assert(os.rename(otherfile, file)) +io.output(otherfile) +local n = 0 +local f = io.lines(file) +while f() do n = n + 1 end; +assert(n == 6) -- number of lines in the file +checkerr("file is already closed", f) +checkerr("file is already closed", f) +-- copy from file to otherfile +n = 0 +for l in io.lines(file) do io.write(l, "\n"); n = n + 1 end +io.close() +assert(n == 6) +-- copy from otherfile back to file +local f = assert(io.open(otherfile)) +assert(io.type(f) == "file") +io.output(file) +assert(not io.output():read()) +n = 0 +for l in f:lines() do io.write(l, "\n"); n = n + 1 end +assert(tostring(f):sub(1, 5) == "file ") +assert(f:close()); io.close() +assert(n == 6) +checkerr("closed file", io.close, f) +assert(tostring(f) == "file (closed)") +assert(io.type(f) == "closed file") +io.input(file) +f = io.open(otherfile):lines() +n = 0 +for l in io.lines() do assert(l == f()); n = n + 1 end +f = nil; collectgarbage() +assert(n == 6) +assert(os.remove(otherfile)) + +do -- bug in 5.3.1 + io.output(otherfile) + io.write(string.rep("a", 300), "\n") + io.close() + local t ={}; for i = 1, 250 do t[i] = 1 end + t = {io.lines(otherfile, table.unpack(t))()} + -- everything ok here + assert(#t == 250 and t[1] == 'a' and t[#t] == 'a') + t[#t + 1] = 1 -- one too many + checkerr("too many arguments", io.lines, otherfile, table.unpack(t)) + collectgarbage() -- ensure 'otherfile' is closed + assert(os.remove(otherfile)) +end + +io.input(file) +do -- test error returns + local a,b,c = io.input():write("xuxu") + assert(not a and type(b) == "string" and type(c) == "number") +end +checkerr("invalid format", io.read, "x") +assert(io.read(0) == "") -- not eof +assert(io.read(5, 'l') == '"álo"') +assert(io.read(0) == "") +assert(io.read() == "second line") +local x = io.input():seek() +assert(io.read() == "third line ") +assert(io.input():seek("set", x)) +assert(io.read('L') == "third line \n") +assert(io.read(1) == "ç") +assert(io.read(string.len"fourth_line") == "fourth_line") +assert(io.input():seek("cur", -string.len"fourth_line")) +assert(io.read() == "fourth_line") +assert(io.read() == "") -- empty line +assert(io.read('n') == 3450) +assert(io.read(1) == '\n') +assert(io.read(0) == nil) -- end of file +assert(io.read(1) == nil) -- end of file +assert(io.read(30000) == nil) -- end of file +assert(({io.read(1)})[2] == undef) +assert(io.read() == nil) -- end of file +assert(({io.read()})[2] == undef) +assert(io.read('n') == nil) -- end of file +assert(({io.read('n')})[2] == undef) +assert(io.read('a') == '') -- end of file (OK for 'a') +assert(io.read('a') == '') -- end of file (OK for 'a') +collectgarbage() +print('+') +io.close(io.input()) +checkerr(" input file is closed", io.read) + +assert(os.remove(file)) + +local t = '0123456789' +for i=1,10 do t = t..t; end +assert(string.len(t) == 10*2^10) + +io.output(file) +io.write("alo"):write("\n") +io.close() +checkerr(" output file is closed", io.write) +local f = io.open(file, "a+b") +io.output(f) +collectgarbage() + +assert(io.write(' ' .. t .. ' ')) +assert(io.write(';', 'end of file\n')) +f:flush(); io.flush() +f:close() +print('+') + +io.input(file) +assert(io.read() == "alo") +assert(io.read(1) == ' ') +assert(io.read(string.len(t)) == t) +assert(io.read(1) == ' ') +assert(io.read(0)) +assert(io.read('a') == ';end of file\n') +assert(io.read(0) == nil) +assert(io.close(io.input())) + + +-- test errors in read/write +do + local function ismsg (m) + -- error message is not a code number + return (type(m) == "string" and tonumber(m) == nil) + end + + -- read + local f = io.open(file, "w") + local r, m, c = f:read() + assert(not r and ismsg(m) and type(c) == "number") + assert(f:close()) + -- write + f = io.open(file, "r") + r, m, c = f:write("whatever") + assert(not r and ismsg(m) and type(c) == "number") + assert(f:close()) + -- lines + f = io.open(file, "w") + r, m = pcall(f:lines()) + assert(r == false and ismsg(m)) + assert(f:close()) +end + +assert(os.remove(file)) + +-- test for L format +io.output(file); io.write"\n\nline\nother":close() +io.input(file) +assert(io.read"L" == "\n") +assert(io.read"L" == "\n") +assert(io.read"L" == "line\n") +assert(io.read"L" == "other") +assert(io.read"L" == nil) +io.input():close() + +local f = assert(io.open(file)) +local s = "" +for l in f:lines("L") do s = s .. l end +assert(s == "\n\nline\nother") +f:close() + +io.input(file) +s = "" +for l in io.lines(nil, "L") do s = s .. l end +assert(s == "\n\nline\nother") +io.input():close() + +s = "" +for l in io.lines(file, "L") do s = s .. l end +assert(s == "\n\nline\nother") + +s = "" +for l in io.lines(file, "l") do s = s .. l end +assert(s == "lineother") + +io.output(file); io.write"a = 10 + 34\na = 2*a\na = -a\n":close() +local t = {} +assert(load(io.lines(file, "L"), nil, nil, t))() +assert(t.a == -((10 + 34) * 2)) + + +do -- testing closing file in line iteration + + -- get the to-be-closed variable from a loop + local function gettoclose (lv) + lv = lv + 1 + for i = 1, math.maxinteger do + local n, v = debug.getlocal(lv, i) + if n == "(for toclose)" then + return v + end + end + end + + local f + for l in io.lines(file) do + f = gettoclose(1) + assert(io.type(f) == "file") + break + end + assert(io.type(f) == "closed file") + + f = nil + local function foo (name) + for l in io.lines(name) do + f = gettoclose(1) + assert(io.type(f) == "file") + error(f) -- exit loop with an error + end + end + local st, msg = pcall(foo, file) + assert(st == false and io.type(msg) == "closed file") + +end + + +-- test for multipe arguments in 'lines' +io.output(file); io.write"0123456789\n":close() +for a,b in io.lines(file, 1, 1) do + if a == "\n" then assert(b == nil) + else assert(tonumber(a) == tonumber(b) - 1) + end +end + +for a,b,c in io.lines(file, 1, 2, "a") do + assert(a == "0" and b == "12" and c == "3456789\n") +end + +for a,b,c in io.lines(file, "a", 0, 1) do + if a == "" then break end + assert(a == "0123456789\n" and b == nil and c == nil) +end +collectgarbage() -- to close file in previous iteration + +io.output(file); io.write"00\n10\n20\n30\n40\n":close() +for a, b in io.lines(file, "n", "n") do + if a == 40 then assert(b == nil) + else assert(a == b - 10) + end +end + + +-- test load x lines +io.output(file); +io.write[[ +local y += X +X = +X * +2 + +X; +X = +X +- y; +]]:close() +_G.X = 1 +assert(not load((io.lines(file)))) +collectgarbage() -- to close file in previous iteration +load((io.lines(file, "L")))() +assert(_G.X == 2) +load((io.lines(file, 1)))() +assert(_G.X == 4) +load((io.lines(file, 3)))() +assert(_G.X == 8) + +print('+') + +local x1 = "string\n\n\\com \"\"''coisas [[estranhas]] ]]'" +io.output(file) +assert(io.write(string.format("x2 = %q\n-- comment without ending EOS", x1))) +io.close() +assert(loadfile(file))() +assert(x1 == x2) +print('+') +assert(os.remove(file)) +assert(not os.remove(file)) +assert(not os.remove(otherfile)) + +-- testing loadfile +local function testloadfile (s, expres) + io.output(file) + if s then io.write(s) end + io.close() + local res = assert(loadfile(file))() + assert(os.remove(file)) + assert(res == expres) +end + +-- loading empty file +testloadfile(nil, nil) + +-- loading file with initial comment without end of line +testloadfile("# a non-ending comment", nil) + + +-- checking Unicode BOM in files +testloadfile("\xEF\xBB\xBF# some comment\nreturn 234", 234) +testloadfile("\xEF\xBB\xBFreturn 239", 239) +testloadfile("\xEF\xBB\xBF", nil) -- empty file with a BOM + + +-- checking line numbers in files with initial comments +testloadfile("# a comment\nreturn require'debug'.getinfo(1).currentline", 2) + + +-- loading binary file +io.output(io.open(file, "wb")) +assert(io.write(string.dump(function () return 10, '\0alo\255', 'hi' end))) +io.close() +a, b, c = assert(loadfile(file))() +assert(a == 10 and b == "\0alo\255" and c == "hi") +assert(os.remove(file)) + +-- bug in 5.2.1 +do + io.output(io.open(file, "wb")) + -- save function with no upvalues + assert(io.write(string.dump(function () return 1 end))) + io.close() + f = assert(loadfile(file, "b", {})) + assert(type(f) == "function" and f() == 1) + assert(os.remove(file)) +end + +-- loading binary file with initial comment +io.output(io.open(file, "wb")) +assert(io.write("#this is a comment for a binary file\0\n", + string.dump(function () return 20, '\0\0\0' end))) +io.close() +a, b, c = assert(loadfile(file))() +assert(a == 20 and b == "\0\0\0" and c == nil) +assert(os.remove(file)) + + +-- 'loadfile' with 'env' +do + local f = io.open(file, 'w') + f:write[[ + if (...) then a = 15; return b, c, d + else return _ENV + end + ]] + f:close() + local t = {b = 12, c = "xuxu", d = print} + local f = assert(loadfile(file, 't', t)) + local b, c, d = f(1) + assert(t.a == 15 and b == 12 and c == t.c and d == print) + assert(f() == t) + f = assert(loadfile(file, 't', nil)) + assert(f() == nil) + f = assert(loadfile(file)) + assert(f() == _G) + assert(os.remove(file)) +end + + +-- 'loadfile' x modes +do + io.open(file, 'w'):write("return 10"):close() + local s, m = loadfile(file, 'b') + assert(not s and string.find(m, "a text chunk")) + io.open(file, 'w'):write("\27 return 10"):close() + local s, m = loadfile(file, 't') + assert(not s and string.find(m, "a binary chunk")) + assert(os.remove(file)) +end + + +io.output(file) +assert(io.write("qualquer coisa\n")) +assert(io.write("mais qualquer coisa")) +io.close() +assert(io.output(assert(io.open(otherfile, 'wb'))) + :write("outra coisa\0\1\3\0\0\0\0\255\0") + :close()) + +local filehandle = assert(io.open(file, 'r+')) +local otherfilehandle = assert(io.open(otherfile, 'rb')) +assert(filehandle ~= otherfilehandle) +assert(type(filehandle) == "userdata") +assert(filehandle:read('l') == "qualquer coisa") +io.input(otherfilehandle) +assert(io.read(string.len"outra coisa") == "outra coisa") +assert(filehandle:read('l') == "mais qualquer coisa") +filehandle:close(); +assert(type(filehandle) == "userdata") +io.input(otherfilehandle) +assert(io.read(4) == "\0\1\3\0") +assert(io.read(3) == "\0\0\0") +assert(io.read(0) == "") -- 255 is not eof +assert(io.read(1) == "\255") +assert(io.read('a') == "\0") +assert(not io.read(0)) +assert(otherfilehandle == io.input()) +otherfilehandle:close() +assert(os.remove(file)) +assert(os.remove(otherfile)) +collectgarbage() + +io.output(file) + :write[[ + 123.4 -56e-2 not a number +second line +third line + +and the rest of the file +]] + :close() +io.input(file) +local _,a,b,c,d,e,h,__ = io.read(1, 'n', 'n', 'l', 'l', 'l', 'a', 10) +assert(io.close(io.input())) +assert(_ == ' ' and __ == nil) +assert(type(a) == 'number' and a==123.4 and b==-56e-2) +assert(d=='second line' and e=='third line') +assert(h==[[ + +and the rest of the file +]]) +assert(os.remove(file)) +collectgarbage() + +-- testing buffers +do + local f = assert(io.open(file, "w")) + local fr = assert(io.open(file, "r")) + assert(f:setvbuf("full", 2000)) + f:write("x") + assert(fr:read("all") == "") -- full buffer; output not written yet + f:close() + fr:seek("set") + assert(fr:read("all") == "x") -- `close' flushes it + f = assert(io.open(file), "w") + assert(f:setvbuf("no")) + f:write("x") + fr:seek("set") + assert(fr:read("all") == "x") -- no buffer; output is ready + f:close() + f = assert(io.open(file, "a")) + assert(f:setvbuf("line")) + f:write("x") + fr:seek("set", 1) + assert(fr:read("all") == "") -- line buffer; no output without `\n' + f:write("a\n"):seek("set", 1) + assert(fr:read("all") == "xa\n") -- now we have a whole line + f:close(); fr:close() + assert(os.remove(file)) +end + + +if not _soft then + print("testing large files (> BUFSIZ)") + io.output(file) + for i=1,5001 do io.write('0123456789123') end + io.write('\n12346'):close() + io.input(file) + local x = io.read('a') + io.input():seek('set', 0) + local y = io.read(30001)..io.read(1005)..io.read(0).. + io.read(1)..io.read(100003) + assert(x == y and string.len(x) == 5001*13 + 6) + io.input():seek('set', 0) + y = io.read() -- huge line + assert(x == y..'\n'..io.read()) + assert(io.read() == nil) + io.close(io.input()) + assert(os.remove(file)) + x = nil; y = nil +end + +if not _port then + local progname + do -- get name of running executable + local arg = arg or ARG + local i = 0 + while arg[i] do i = i - 1 end + progname = '"' .. arg[i + 1] .. '"' + end + print("testing popen/pclose and execute") + local tests = { + -- command, what, code + {"ls > /dev/null", "ok"}, + {"not-to-be-found-command", "exit"}, + {"exit 3", "exit", 3}, + {"exit 129", "exit", 129}, + {"kill -s HUP $$", "signal", 1}, + {"kill -s KILL $$", "signal", 9}, + {"sh -c 'kill -s HUP $$'", "exit"}, + {progname .. ' -e " "', "ok"}, + {progname .. ' -e "os.exit(0, true)"', "ok"}, + {progname .. ' -e "os.exit(20, true)"', "exit", 20}, + } + print("\n(some error messages are expected now)") + for _, v in ipairs(tests) do + local x, y, z = io.popen(v[1]):close() + local x1, y1, z1 = os.execute(v[1]) + assert(x == x1 and y == y1 and z == z1) + if v[2] == "ok" then + assert(x and y == 'exit' and z == 0) + else + assert(not x and y == v[2]) -- correct status and 'what' + -- correct code if known (but always different from 0) + assert((v[3] == nil and z > 0) or v[3] == z) + end + end +end + + +-- testing tmpfile +f = io.tmpfile() +assert(io.type(f) == "file") +f:write("alo") +f:seek("set") +assert(f:read"a" == "alo") + +end --} + +print'+' + +print("testing date/time") + +assert(os.date("") == "") +assert(os.date("!") == "") +assert(os.date("\0\0") == "\0\0") +assert(os.date("!\0\0") == "\0\0") +local x = string.rep("a", 10000) +assert(os.date(x) == x) +local t = os.time() +D = os.date("*t", t) +assert(os.date(string.rep("%d", 1000), t) == + string.rep(os.date("%d", t), 1000)) +assert(os.date(string.rep("%", 200)) == string.rep("%", 100)) + +local t = os.time() +D = os.date("*t", t) +load(os.date([[assert(D.year==%Y and D.month==%m and D.day==%d and + D.hour==%H and D.min==%M and D.sec==%S and + D.wday==%w+1 and D.yday==%j and type(D.isdst) == 'boolean')]], t))() + +checkerr("invalid conversion specifier", os.date, "%") +checkerr("invalid conversion specifier", os.date, "%9") +checkerr("invalid conversion specifier", os.date, "%") +checkerr("invalid conversion specifier", os.date, "%O") +checkerr("invalid conversion specifier", os.date, "%E") +checkerr("invalid conversion specifier", os.date, "%Ea") + +checkerr("not an integer", os.time, {year=1000, month=1, day=1, hour='x'}) +checkerr("not an integer", os.time, {year=1000, month=1, day=1, hour=1.5}) + +checkerr("missing", os.time, {hour = 12}) -- missing date + +if not _port then + -- test Posix-specific modifiers + assert(type(os.date("%Ex")) == 'string') + assert(type(os.date("%Oy")) == 'string') + + + -- test out-of-range dates (at least for Unix) + if maxint >= 2^62 then -- cannot do these tests in Small Lua + -- no arith overflows + checkerr("out-of-bound", os.time, {year = -maxint, month = 1, day = 1}) + if string.packsize("i") == 4 then -- 4-byte ints + if testerr("out-of-bound", os.date, "%Y", 2^40) then + -- time_t has 4 bytes and therefore cannot represent year 4000 + print(" 4-byte time_t") + checkerr("cannot be represented", os.time, {year=4000, month=1, day=1}) + else + -- time_t has 8 bytes; an int year cannot represent a huge time + print(" 8-byte time_t") + checkerr("cannot be represented", os.date, "%Y", 2^60) + -- it should have no problems with year 4000 + assert(tonumber(os.time{year=4000, month=1, day=1})) + end + else -- 8-byte ints + -- assume time_t has 8 bytes too + print(" 8-byte time_t") + assert(tonumber(os.date("%Y", 2^60))) + -- but still cannot represent a huge year + checkerr("cannot be represented", os.time, {year=2^60, month=1, day=1}) + end + end +end + + +D = os.date("!*t", t) +load(os.date([[!assert(D.year==%Y and D.month==%m and D.day==%d and + D.hour==%H and D.min==%M and D.sec==%S and + D.wday==%w+1 and D.yday==%j and type(D.isdst) == 'boolean')]], t))() + +do + local D = os.date("*t") + local t = os.time(D) + assert(type(D.isdst) == 'boolean') + D.isdst = nil + local t1 = os.time(D) + assert(t == t1) -- if isdst is absent uses correct default +end + +t = os.time(D) +D.year = D.year-1; +local t1 = os.time(D) +-- allow for leap years +assert(math.abs(os.difftime(t,t1)/(24*3600) - 365) < 2) + +-- should not take more than 1 second to execute these two lines +t = os.time() +t1 = os.time(os.date("*t")) +local diff = os.difftime(t1,t) +assert(0 <= diff and diff <= 1) +diff = os.difftime(t,t1) +assert(-1 <= diff and diff <= 0) + +local t1 = os.time{year=2000, month=10, day=1, hour=23, min=12} +local t2 = os.time{year=2000, month=10, day=1, hour=23, min=10, sec=19} +assert(os.difftime(t1,t2) == 60*2-19) + +-- since 5.3.3, 'os.time' normalizes table fields +t1 = {year = 2005, month = 1, day = 1, hour = 1, min = 0, sec = -3602} +os.time(t1) +assert(t1.day == 31 and t1.month == 12 and t1.year == 2004 and + t1.hour == 23 and t1.min == 59 and t1.sec == 58 and + t1.yday == 366) + +io.output(io.stdout) +local t = os.date('%d %m %Y %H %M %S') +local d, m, a, h, min, s = string.match(t, + "(%d+) (%d+) (%d+) (%d+) (%d+) (%d+)") +d = tonumber(d) +m = tonumber(m) +a = tonumber(a) +h = tonumber(h) +min = tonumber(min) +s = tonumber(s) +io.write(string.format('test done on %2.2d/%2.2d/%d', d, m, a)) +io.write(string.format(', at %2.2d:%2.2d:%2.2d\n', h, min, s)) +io.write(string.format('%s\n', _VERSION)) + + diff --git a/source/lua/testes/gc.lua b/source/lua/testes/gc.lua new file mode 100644 index 0000000..91e78a4 --- /dev/null +++ b/source/lua/testes/gc.lua @@ -0,0 +1,683 @@ +-- $Id: testes/gc.lua $ +-- See Copyright Notice in file all.lua + +print('testing incremental garbage collection') + +local debug = require"debug" + +assert(collectgarbage("isrunning")) + +collectgarbage() + +local oldmode = collectgarbage("incremental") + +-- changing modes should return previous mode +assert(collectgarbage("generational") == "incremental") +assert(collectgarbage("generational") == "generational") +assert(collectgarbage("incremental") == "generational") +assert(collectgarbage("incremental") == "incremental") + + +local function nop () end + +local function gcinfo () + return collectgarbage"count" * 1024 +end + + +-- test weird parameters to 'collectgarbage' +do + -- save original parameters + local a = collectgarbage("setpause", 200) + local b = collectgarbage("setstepmul", 200) + local t = {0, 2, 10, 90, 500, 5000, 30000, 0x7ffffffe} + for i = 1, #t do + local p = t[i] + for j = 1, #t do + local m = t[j] + collectgarbage("setpause", p) + collectgarbage("setstepmul", m) + collectgarbage("step", 0) + collectgarbage("step", 10000) + end + end + -- restore original parameters + collectgarbage("setpause", a) + collectgarbage("setstepmul", b) + collectgarbage() +end + + +_G["while"] = 234 + + +-- +-- tests for GC activation when creating different kinds of objects +-- +local function GC1 () + local u + local b -- (above 'u' it in the stack) + local finish = false + u = setmetatable({}, {__gc = function () finish = true end}) + b = {34} + repeat u = {} until finish + assert(b[1] == 34) -- 'u' was collected, but 'b' was not + + finish = false; local i = 1 + u = setmetatable({}, {__gc = function () finish = true end}) + repeat i = i + 1; u = tostring(i) .. tostring(i) until finish + assert(b[1] == 34) -- 'u' was collected, but 'b' was not + + finish = false + u = setmetatable({}, {__gc = function () finish = true end}) + repeat local i; u = function () return i end until finish + assert(b[1] == 34) -- 'u' was collected, but 'b' was not +end + +local function GC2 () + local u + local finish = false + u = {setmetatable({}, {__gc = function () finish = true end})} + local b = {34} + repeat u = {{}} until finish + assert(b[1] == 34) -- 'u' was collected, but 'b' was not + + finish = false; local i = 1 + u = {setmetatable({}, {__gc = function () finish = true end})} + repeat i = i + 1; u = {tostring(i) .. tostring(i)} until finish + assert(b[1] == 34) -- 'u' was collected, but 'b' was not + + finish = false + u = {setmetatable({}, {__gc = function () finish = true end})} + repeat local i; u = {function () return i end} until finish + assert(b[1] == 34) -- 'u' was collected, but 'b' was not +end + +local function GC() GC1(); GC2() end + + +do + print("creating many objects") + + local contCreate = 0 + + local limit = 5000 + + while contCreate <= limit do + local a = {}; a = nil + contCreate = contCreate+1 + end + + local a = "a" + + contCreate = 0 + while contCreate <= limit do + a = contCreate .. "b"; + a = string.gsub(a, '(%d%d*)', string.upper) + a = "a" + contCreate = contCreate+1 + end + + + contCreate = 0 + + a = {} + + function a:test () + while contCreate <= limit do + load(string.format("function temp(a) return 'a%d' end", contCreate), "")() + assert(temp() == string.format('a%d', contCreate)) + contCreate = contCreate+1 + end + end + + a:test() + +end + + +-- collection of functions without locals, globals, etc. +do local f = function () end end + + +print("functions with errors") +prog = [[ +do + a = 10; + function foo(x,y) + a = sin(a+0.456-0.23e-12); + return function (z) return sin(%x+z) end + end + local x = function (w) a=a+w; end +end +]] +do + local step = 1 + if _soft then step = 13 end + for i=1, string.len(prog), step do + for j=i, string.len(prog), step do + pcall(load(string.sub(prog, i, j), "")) + end + end +end + +foo = nil +print('long strings') +x = "01234567890123456789012345678901234567890123456789012345678901234567890123456789" +assert(string.len(x)==80) +s = '' +n = 0 +k = math.min(300, (math.maxinteger // 80) // 2) +while n < k do s = s..x; n=n+1; j=tostring(n) end +assert(string.len(s) == k*80) +s = string.sub(s, 1, 10000) +s, i = string.gsub(s, '(%d%d%d%d)', '') +assert(i==10000 // 4) +s = nil +x = nil + +assert(_G["while"] == 234) + + +-- +-- test the "size" of basic GC steps (whatever they mean...) +-- +do +print("steps") + + print("steps (2)") + + local function dosteps (siz) + collectgarbage() + local a = {} + for i=1,100 do a[i] = {{}}; local b = {} end + local x = gcinfo() + local i = 0 + repeat -- do steps until it completes a collection cycle + i = i+1 + until collectgarbage("step", siz) + assert(gcinfo() < x) + return i -- number of steps + end + + collectgarbage"stop" + + if not _port then + assert(dosteps(10) < dosteps(2)) + end + + -- collector should do a full collection with so many steps + assert(dosteps(20000) == 1) + assert(collectgarbage("step", 20000) == true) + assert(collectgarbage("step", 20000) == true) + + assert(not collectgarbage("isrunning")) + collectgarbage"restart" + assert(collectgarbage("isrunning")) + +end + + +if not _port then + -- test the pace of the collector + collectgarbage(); collectgarbage() + local x = gcinfo() + collectgarbage"stop" + repeat + local a = {} + until gcinfo() > 3 * x + collectgarbage"restart" + assert(collectgarbage("isrunning")) + repeat + local a = {} + until gcinfo() <= x * 2 +end + + +print("clearing tables") +lim = 15 +a = {} +-- fill a with `collectable' indices +for i=1,lim do a[{}] = i end +b = {} +for k,v in pairs(a) do b[k]=v end +-- remove all indices and collect them +for n in pairs(b) do + a[n] = undef + assert(type(n) == 'table' and next(n) == nil) + collectgarbage() +end +b = nil +collectgarbage() +for n in pairs(a) do error'cannot be here' end +for i=1,lim do a[i] = i end +for i=1,lim do assert(a[i] == i) end + + +print('weak tables') +a = {}; setmetatable(a, {__mode = 'k'}); +-- fill a with some `collectable' indices +for i=1,lim do a[{}] = i end +-- and some non-collectable ones +for i=1,lim do a[i] = i end +for i=1,lim do local s=string.rep('@', i); a[s] = s..'#' end +collectgarbage() +local i = 0 +for k,v in pairs(a) do assert(k==v or k..'#'==v); i=i+1 end +assert(i == 2*lim) + +a = {}; setmetatable(a, {__mode = 'v'}); +a[1] = string.rep('b', 21) +collectgarbage() +assert(a[1]) -- strings are *values* +a[1] = undef +-- fill a with some `collectable' values (in both parts of the table) +for i=1,lim do a[i] = {} end +for i=1,lim do a[i..'x'] = {} end +-- and some non-collectable ones +for i=1,lim do local t={}; a[t]=t end +for i=1,lim do a[i+lim]=i..'x' end +collectgarbage() +local i = 0 +for k,v in pairs(a) do assert(k==v or k-lim..'x' == v); i=i+1 end +assert(i == 2*lim) + +a = {}; setmetatable(a, {__mode = 'kv'}); +local x, y, z = {}, {}, {} +-- keep only some items +a[1], a[2], a[3] = x, y, z +a[string.rep('$', 11)] = string.rep('$', 11) +-- fill a with some `collectable' values +for i=4,lim do a[i] = {} end +for i=1,lim do a[{}] = i end +for i=1,lim do local t={}; a[t]=t end +collectgarbage() +assert(next(a) ~= nil) +local i = 0 +for k,v in pairs(a) do + assert((k == 1 and v == x) or + (k == 2 and v == y) or + (k == 3 and v == z) or k==v); + i = i+1 +end +assert(i == 4) +x,y,z=nil +collectgarbage() +assert(next(a) == string.rep('$', 11)) + + +-- 'bug' in 5.1 +a = {} +local t = {x = 10} +local C = setmetatable({key = t}, {__mode = 'v'}) +local C1 = setmetatable({[t] = 1}, {__mode = 'k'}) +a.x = t -- this should not prevent 't' from being removed from + -- weak table 'C' by the time 'a' is finalized + +setmetatable(a, {__gc = function (u) + assert(C.key == nil) + assert(type(next(C1)) == 'table') + end}) + +a, t = nil +collectgarbage() +collectgarbage() +assert(next(C) == nil and next(C1) == nil) +C, C1 = nil + + +-- ephemerons +local mt = {__mode = 'k'} +a = {{10},{20},{30},{40}}; setmetatable(a, mt) +x = nil +for i = 1, 100 do local n = {}; a[n] = {k = {x}}; x = n end +GC() +local n = x +local i = 0 +while n do n = a[n].k[1]; i = i + 1 end +assert(i == 100) +x = nil +GC() +for i = 1, 4 do assert(a[i][1] == i * 10); a[i] = undef end +assert(next(a) == nil) + +local K = {} +a[K] = {} +for i=1,10 do a[K][i] = {}; a[a[K][i]] = setmetatable({}, mt) end +x = nil +local k = 1 +for j = 1,100 do + local n = {}; local nk = k%10 + 1 + a[a[K][nk]][n] = {x, k = k}; x = n; k = nk +end +GC() +local n = x +local i = 0 +while n do local t = a[a[K][k]][n]; n = t[1]; k = t.k; i = i + 1 end +assert(i == 100) +K = nil +GC() +-- assert(next(a) == nil) + + +-- testing errors during GC +if T then + collectgarbage("stop") -- stop collection + local u = {} + local s = {}; setmetatable(s, {__mode = 'k'}) + setmetatable(u, {__gc = function (o) + local i = s[o] + s[i] = true + assert(not s[i - 1]) -- check proper finalization order + if i == 8 then error("@expected@") end -- error during GC + end}) + + for i = 6, 10 do + local n = setmetatable({}, getmetatable(u)) + s[n] = i + end + + collectgarbage() + assert(string.find(_WARN, "error in __gc metamethod")) + assert(string.match(_WARN, "@(.-)@") == "expected") + for i = 8, 10 do assert(s[i]) end + + for i = 1, 5 do + local n = setmetatable({}, getmetatable(u)) + s[n] = i + end + + collectgarbage() + for i = 1, 10 do assert(s[i]) end + + getmetatable(u).__gc = nil + +end +print '+' + + +-- testing userdata +if T==nil then + (Message or print)('\n >>> testC not active: skipping userdata GC tests <<<\n') + +else + + local function newproxy(u) + return debug.setmetatable(T.newuserdata(0), debug.getmetatable(u)) + end + + collectgarbage("stop") -- stop collection + local u = newproxy(nil) + debug.setmetatable(u, {__gc = true}) + local s = 0 + local a = {[u] = 0}; setmetatable(a, {__mode = 'vk'}) + for i=1,10 do a[newproxy(u)] = i end + for k in pairs(a) do assert(getmetatable(k) == getmetatable(u)) end + local a1 = {}; for k,v in pairs(a) do a1[k] = v end + for k,v in pairs(a1) do a[v] = k end + for i =1,10 do assert(a[i]) end + getmetatable(u).a = a1 + getmetatable(u).u = u + do + local u = u + getmetatable(u).__gc = function (o) + assert(a[o] == 10-s) + assert(a[10-s] == undef) -- udata already removed from weak table + assert(getmetatable(o) == getmetatable(u)) + assert(getmetatable(o).a[o] == 10-s) + s=s+1 + end + end + a1, u = nil + assert(next(a) ~= nil) + collectgarbage() + assert(s==11) + collectgarbage() + assert(next(a) == nil) -- finalized keys are removed in two cycles +end + + +-- __gc x weak tables +local u = setmetatable({}, {__gc = true}) +-- __gc metamethod should be collected before running +setmetatable(getmetatable(u), {__mode = "v"}) +getmetatable(u).__gc = function (o) os.exit(1) end -- cannot happen +u = nil +collectgarbage() + +local u = setmetatable({}, {__gc = true}) +local m = getmetatable(u) +m.x = {[{0}] = 1; [0] = {1}}; setmetatable(m.x, {__mode = "kv"}); +m.__gc = function (o) + assert(next(getmetatable(o).x) == nil) + m = 10 +end +u, m = nil +collectgarbage() +assert(m==10) + +do -- tests for string keys in weak tables + collectgarbage(); collectgarbage() + local m = collectgarbage("count") -- current memory + local a = setmetatable({}, {__mode = "kv"}) + a[string.rep("a", 2^22)] = 25 -- long string key -> number value + a[string.rep("b", 2^22)] = {} -- long string key -> colectable value + a[{}] = 14 -- colectable key + assert(collectgarbage("count") > m + 2^13) -- 2^13 == 2 * 2^22 in KB + collectgarbage() + assert(collectgarbage("count") >= m + 2^12 and + collectgarbage("count") < m + 2^13) -- one key was collected + local k, v = next(a) -- string key with number value preserved + assert(k == string.rep("a", 2^22) and v == 25) + assert(next(a, k) == nil) -- everything else cleared + assert(a[string.rep("b", 2^22)] == undef) + a[k] = undef -- erase this last entry + k = nil + collectgarbage() + assert(next(a) == nil) + -- make sure will not try to compare with dead key + assert(a[string.rep("b", 100)] == undef) + assert(collectgarbage("count") <= m + 1) -- eveything collected +end + + +-- errors during collection +if T then + u = setmetatable({}, {__gc = function () error "@expected error" end}) + u = nil + collectgarbage() +end + + +if not _soft then + print("long list") + local a = {} + for i = 1,200000 do + a = {next = a} + end + a = nil + collectgarbage() +end + +-- create many threads with self-references and open upvalues +print("self-referenced threads") +local thread_id = 0 +local threads = {} + +local function fn (thread) + local x = {} + threads[thread_id] = function() + thread = x + end + coroutine.yield() +end + +while thread_id < 1000 do + local thread = coroutine.create(fn) + coroutine.resume(thread, thread) + thread_id = thread_id + 1 +end + + +-- Create a closure (function inside 'f') with an upvalue ('param') that +-- points (through a table) to the closure itself and to the thread +-- ('co' and the initial value of 'param') where closure is running. +-- Then, assert that table (and therefore everything else) will be +-- collected. +do + local collected = false -- to detect collection + collectgarbage(); collectgarbage("stop") + do + local function f (param) + ;(function () + assert(type(f) == 'function' and type(param) == 'thread') + param = {param, f} + setmetatable(param, {__gc = function () collected = true end}) + coroutine.yield(100) + end)() + end + local co = coroutine.create(f) + assert(coroutine.resume(co, co)) + end + -- Now, thread and closure are not reacheable any more. + collectgarbage() + assert(collected) + collectgarbage("restart") +end + + +do + collectgarbage() + collectgarbage"stop" + collectgarbage("step", 0) -- steps should not unblock the collector + local x = gcinfo() + repeat + for i=1,1000 do _ENV.a = {} end -- no collection during the loop + until gcinfo() > 2 * x + collectgarbage"restart" +end + + +if T then -- tests for weird cases collecting upvalues + + local function foo () + local a = {x = 20} + coroutine.yield(function () return a.x end) -- will run collector + assert(a.x == 20) -- 'a' is 'ok' + a = {x = 30} -- create a new object + assert(T.gccolor(a) == "white") -- of course it is new... + coroutine.yield(100) -- 'a' is still local to this thread + end + + local t = setmetatable({}, {__mode = "kv"}) + collectgarbage(); collectgarbage('stop') + -- create coroutine in a weak table, so it will never be marked + t.co = coroutine.wrap(foo) + local f = t.co() -- create function to access local 'a' + T.gcstate("atomic") -- ensure all objects are traversed + assert(T.gcstate() == "atomic") + assert(t.co() == 100) -- resume coroutine, creating new table for 'a' + assert(T.gccolor(t.co) == "white") -- thread was not traversed + T.gcstate("pause") -- collect thread, but should mark 'a' before that + assert(t.co == nil and f() == 30) -- ensure correct access to 'a' + + collectgarbage("restart") + + -- test barrier in sweep phase (backing userdata to gray) + local u = T.newuserdata(0, 1) -- create a userdata + collectgarbage() + collectgarbage"stop" + local a = {} -- avoid 'u' as first element in 'allgc' + T.gcstate"atomic" + T.gcstate"sweepallgc" + local x = {} + assert(T.gccolor(u) == "black") -- userdata is "old" (black) + assert(T.gccolor(x) == "white") -- table is "new" (white) + debug.setuservalue(u, x) -- trigger barrier + assert(T.gccolor(u) == "gray") -- userdata changed back to gray + collectgarbage"restart" + + print"+" +end + + +if T then + local debug = require "debug" + collectgarbage("stop") + local x = T.newuserdata(0) + local y = T.newuserdata(0) + debug.setmetatable(y, {__gc = nop}) -- bless the new udata before... + debug.setmetatable(x, {__gc = nop}) -- ...the old one + assert(T.gccolor(y) == "white") + T.checkmemory() + collectgarbage("restart") +end + + +if T then + print("emergency collections") + collectgarbage() + collectgarbage() + T.totalmem(T.totalmem() + 200) + for i=1,200 do local a = {} end + T.totalmem(0) + collectgarbage() + local t = T.totalmem("table") + local a = {{}, {}, {}} -- create 4 new tables + assert(T.totalmem("table") == t + 4) + t = T.totalmem("function") + a = function () end -- create 1 new closure + assert(T.totalmem("function") == t + 1) + t = T.totalmem("thread") + a = coroutine.create(function () end) -- create 1 new coroutine + assert(T.totalmem("thread") == t + 1) +end + + +-- create an object to be collected when state is closed +do + local setmetatable,assert,type,print,getmetatable = + setmetatable,assert,type,print,getmetatable + local tt = {} + tt.__gc = function (o) + assert(getmetatable(o) == tt) + -- create new objects during GC + local a = 'xuxu'..(10+3)..'joao', {} + ___Glob = o -- ressurect object! + setmetatable({}, tt) -- creates a new one with same metatable + print(">>> closing state " .. "<<<\n") + end + local u = setmetatable({}, tt) + ___Glob = {u} -- avoid object being collected before program end +end + +-- create several objects to raise errors when collected while closing state +if T then + local error, assert, find = error, assert, string.find + local n = 0 + local lastmsg + local mt = {__gc = function (o) + n = n + 1 + assert(n == o[1]) + if n == 1 then + _WARN = nil + elseif n == 2 then + assert(find(_WARN, "@expected warning")) + lastmsg = _WARN -- get message from previous error (first 'o') + else + assert(lastmsg == _WARN) -- subsequent error messages are equal + end + error"@expected warning" + end} + for i = 10, 1, -1 do + -- create object and preserve it until the end + table.insert(___Glob, setmetatable({i}, mt)) + end +end + +-- just to make sure +assert(collectgarbage'isrunning') + +collectgarbage(oldmode) + +print('OK') diff --git a/source/lua/testes/gengc.lua b/source/lua/testes/gengc.lua new file mode 100644 index 0000000..b02f471 --- /dev/null +++ b/source/lua/testes/gengc.lua @@ -0,0 +1,83 @@ +-- $Id: testes/gengc.lua $ +-- See Copyright Notice in file all.lua + +print('testing generational garbage collection') + +local debug = require"debug" + +assert(collectgarbage("isrunning")) + +collectgarbage() + +local oldmode = collectgarbage("generational") + + +-- ensure that table barrier evolves correctly +do + local U = {} + -- full collection makes 'U' old + collectgarbage() + assert(not T or T.gcage(U) == "old") + + -- U refers to a new table, so it becomes 'touched1' + U[1] = {x = {234}} + assert(not T or (T.gcage(U) == "touched1" and T.gcage(U[1]) == "new")) + + -- both U and the table survive one more collection + collectgarbage("step", 0) + assert(not T or (T.gcage(U) == "touched2" and T.gcage(U[1]) == "survival")) + + -- both U and the table survive yet another collection + -- now everything is old + collectgarbage("step", 0) + assert(not T or (T.gcage(U) == "old" and T.gcage(U[1]) == "old1")) + + -- data was not corrupted + assert(U[1].x[1] == 234) +end + + +if T == nil then + (Message or print)('\n >>> testC not active: \z + skipping some generational tests <<<\n') + print 'OK' + return +end + + +-- ensure that userdata barrier evolves correctly +do + local U = T.newuserdata(0, 1) + -- full collection makes 'U' old + collectgarbage() + assert(T.gcage(U) == "old") + + -- U refers to a new table, so it becomes 'touched1' + debug.setuservalue(U, {x = {234}}) + assert(T.gcage(U) == "touched1" and + T.gcage(debug.getuservalue(U)) == "new") + + -- both U and the table survive one more collection + collectgarbage("step", 0) + assert(T.gcage(U) == "touched2" and + T.gcage(debug.getuservalue(U)) == "survival") + + -- both U and the table survive yet another collection + -- now everything is old + collectgarbage("step", 0) + assert(T.gcage(U) == "old" and + T.gcage(debug.getuservalue(U)) == "old1") + + -- data was not corrupted + assert(debug.getuservalue(U).x[1] == 234) +end + + + +-- just to make sure +assert(collectgarbage'isrunning') + +collectgarbage(oldmode) + +print('OK') + diff --git a/source/lua/testes/goto.lua b/source/lua/testes/goto.lua new file mode 100644 index 0000000..f3dcfd4 --- /dev/null +++ b/source/lua/testes/goto.lua @@ -0,0 +1,271 @@ +-- $Id: testes/goto.lua $ +-- See Copyright Notice in file all.lua + +collectgarbage() + +local function errmsg (code, m) + local st, msg = load(code) + assert(not st and string.find(msg, m)) +end + +-- cannot see label inside block +errmsg([[ goto l1; do ::l1:: end ]], "label 'l1'") +errmsg([[ do ::l1:: end goto l1; ]], "label 'l1'") + +-- repeated label +errmsg([[ ::l1:: ::l1:: ]], "label 'l1'") +errmsg([[ ::l1:: do ::l1:: end]], "label 'l1'") + + +-- undefined label +errmsg([[ goto l1; local aa ::l1:: ::l2:: print(3) ]], "local 'aa'") + +-- jumping over variable definition +errmsg([[ +do local bb, cc; goto l1; end +local aa +::l1:: print(3) +]], "local 'aa'") + +-- jumping into a block +errmsg([[ do ::l1:: end goto l1 ]], "label 'l1'") +errmsg([[ goto l1 do ::l1:: end ]], "label 'l1'") + +-- cannot continue a repeat-until with variables +errmsg([[ + repeat + if x then goto cont end + local xuxu = 10 + ::cont:: + until xuxu < x +]], "local 'xuxu'") + +-- simple gotos +local x +do + local y = 12 + goto l1 + ::l2:: x = x + 1; goto l3 + ::l1:: x = y; goto l2 +end +::l3:: ::l3_1:: assert(x == 13) + + +-- long labels +do + local prog = [[ + do + local a = 1 + goto l%sa; a = a + 1 + ::l%sa:: a = a + 10 + goto l%sb; a = a + 2 + ::l%sb:: a = a + 20 + return a + end + ]] + local label = string.rep("0123456789", 40) + prog = string.format(prog, label, label, label, label) + assert(assert(load(prog))() == 31) +end + + +-- ok to jump over local dec. to end of block +do + goto l1 + local a = 23 + x = a + ::l1::; +end + +while true do + goto l4 + goto l1 -- ok to jump over local dec. to end of block + goto l1 -- multiple uses of same label + local x = 45 + ::l1:: ;;; +end +::l4:: assert(x == 13) + +if print then + goto l1 -- ok to jump over local dec. to end of block + error("should not be here") + goto l2 -- ok to jump over local dec. to end of block + local x + ::l1:: ; ::l2:: ;; +else end + +-- to repeat a label in a different function is OK +local function foo () + local a = {} + goto l3 + ::l1:: a[#a + 1] = 1; goto l2; + ::l2:: a[#a + 1] = 2; goto l5; + ::l3:: + ::l3a:: a[#a + 1] = 3; goto l1; + ::l4:: a[#a + 1] = 4; goto l6; + ::l5:: a[#a + 1] = 5; goto l4; + ::l6:: assert(a[1] == 3 and a[2] == 1 and a[3] == 2 and + a[4] == 5 and a[5] == 4) + if not a[6] then a[6] = true; goto l3a end -- do it twice +end + +::l6:: foo() + + +do -- bug in 5.2 -> 5.3.2 + local x + ::L1:: + local y -- cannot join this SETNIL with previous one + assert(y == nil) + y = true + if x == nil then + x = 1 + goto L1 + else + x = x + 1 + end + assert(x == 2 and y == true) +end + +-- bug in 5.3 +do + local first = true + local a = false + if true then + goto LBL + ::loop:: + a = true + ::LBL:: + if first then + first = false + goto loop + end + end + assert(a) +end + +do -- compiling infinite loops + goto escape -- do not run the infinite loops + ::a:: goto a + ::b:: goto c + ::c:: goto b +end +::escape:: +-------------------------------------------------------------------------------- +-- testing closing of upvalues + +local debug = require 'debug' + +local function foo () + local t = {} + do + local i = 1 + local a, b, c, d + t[1] = function () return a, b, c, d end + ::l1:: + local b + do + local c + t[#t + 1] = function () return a, b, c, d end -- t[2], t[4], t[6] + if i > 2 then goto l2 end + do + local d + t[#t + 1] = function () return a, b, c, d end -- t[3], t[5] + i = i + 1 + local a + goto l1 + end + end + end + ::l2:: return t +end + +local a = foo() +assert(#a == 6) + +-- all functions share same 'a' +for i = 2, 6 do + assert(debug.upvalueid(a[1], 1) == debug.upvalueid(a[i], 1)) +end + +-- 'b' and 'c' are shared among some of them +for i = 2, 6 do + -- only a[1] uses external 'b'/'b' + assert(debug.upvalueid(a[1], 2) ~= debug.upvalueid(a[i], 2)) + assert(debug.upvalueid(a[1], 3) ~= debug.upvalueid(a[i], 3)) +end + +for i = 3, 5, 2 do + -- inner functions share 'b'/'c' with previous ones + assert(debug.upvalueid(a[i], 2) == debug.upvalueid(a[i - 1], 2)) + assert(debug.upvalueid(a[i], 3) == debug.upvalueid(a[i - 1], 3)) + -- but not with next ones + assert(debug.upvalueid(a[i], 2) ~= debug.upvalueid(a[i + 1], 2)) + assert(debug.upvalueid(a[i], 3) ~= debug.upvalueid(a[i + 1], 3)) +end + +-- only external 'd' is shared +for i = 2, 6, 2 do + assert(debug.upvalueid(a[1], 4) == debug.upvalueid(a[i], 4)) +end + +-- internal 'd's are all different +for i = 3, 5, 2 do + for j = 1, 6 do + assert((debug.upvalueid(a[i], 4) == debug.upvalueid(a[j], 4)) + == (i == j)) + end +end + +-------------------------------------------------------------------------------- +-- testing if x goto optimizations + +local function testG (a) + if a == 1 then + goto l1 + error("should never be here!") + elseif a == 2 then goto l2 + elseif a == 3 then goto l3 + elseif a == 4 then + goto l1 -- go to inside the block + error("should never be here!") + ::l1:: a = a + 1 -- must go to 'if' end + else + goto l4 + ::l4a:: a = a * 2; goto l4b + error("should never be here!") + ::l4:: goto l4a + error("should never be here!") + ::l4b:: + end + do return a end + ::l2:: do return "2" end + ::l3:: do return "3" end + ::l1:: return "1" +end + +assert(testG(1) == "1") +assert(testG(2) == "2") +assert(testG(3) == "3") +assert(testG(4) == 5) +assert(testG(5) == 10) + +do + -- if x back goto out of scope of upvalue + local X + goto L1 + + ::L2:: goto L3 + + ::L1:: do + local *toclose a = setmetatable({}, {__close = function () X = true end}) + assert(X == nil) + if a then goto L2 end -- jumping back out of scope of 'a' + end + + ::L3:: assert(X == true) -- checks that 'a' was correctly closed +end +-------------------------------------------------------------------------------- + + +print'OK' diff --git a/source/lua/testes/heavy.lua b/source/lua/testes/heavy.lua new file mode 100644 index 0000000..4731c74 --- /dev/null +++ b/source/lua/testes/heavy.lua @@ -0,0 +1,173 @@ +-- $Id: heavy.lua,v 1.7 2017/12/29 15:42:15 roberto Exp $ +-- See Copyright Notice in file all.lua + +local function teststring () + print("creating a string too long") + do + local a = "x" + local st, msg = pcall(function () + while true do + a = a .. a.. a.. a.. a.. a.. a.. a.. a.. a + .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a + .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a + .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a + .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a + .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a + .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a + .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a + .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a + .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a + print(string.format("string with %d bytes", #a)) + end + end) + assert(not st and + (string.find(msg, "string length overflow") or + string.find(msg, "not enough memory"))) + print("string length overflow with " .. #a * 100) + end + print('+') +end + +local function loadrep (x, what) + local p = 1<<20 + local s = string.rep(x, p) + local count = 0 + local function f() + count = count + p + if count % (0x80*p) == 0 then + io.stderr:write("(", count // 2^20, " M)") + end + return s + end + local st, msg = load(f, "=big") + print("\nmemory: ", collectgarbage'count' * 1024) + msg = string.match(msg, "^[^\n]+") -- get only first line + print(string.format("total: 0x%x %s ('%s')", count, what, msg)) + return st, msg +end + + +function controlstruct () + print("control structure too long") + local lim = ((1 << 24) - 2) // 3 + local s = string.rep("a = a + 1\n", lim) + s = "while true do " .. s .. "end" + assert(load(s)) + print("ok with " .. lim .. " lines") + lim = lim + 3 + s = string.rep("a = a + 1\n", lim) + s = "while true do " .. s .. "end" + local st, msg = load(s) + assert(not st and string.find(msg, "too long")) + print(msg) +end + + +function manylines () + print("loading chunk with too many lines") + local st, msg = loadrep("\n", "lines") + assert(not st and string.find(msg, "too many lines")) + print('+') +end + + +function hugeid () + print("loading chunk with huge identifier") + local st, msg = loadrep("a", "chars") + assert(not st and + (string.find(msg, "lexical element too long") or + string.find(msg, "not enough memory"))) + print('+') +end + +function toomanyinst () + print("loading chunk with too many instructions") + local st, msg = loadrep("a = 10; ", "instructions") + print('+') +end + + +local function loadrepfunc (prefix, f) + local count = -1 + local function aux () + count = count + 1 + if count == 0 then + return prefix + else + if count % (0x100000) == 0 then + io.stderr:write("(", count // 2^20, " M)") + end + return f(count) + end + end + local st, msg = load(aux, "k") + print("\nmemory: ", collectgarbage'count' * 1024) + msg = string.match(msg, "^[^\n]+") -- get only first line + print("expected error: ", msg) +end + + +function toomanyconst () + print("loading function with too many constants") + loadrepfunc("function foo () return {0,", + function (n) + -- convert 'n' to a string in the format [["...",]], + -- where '...' is a kind of number in base 128 + -- (in a range that does not include either the double quote + -- and the escape.) + return string.char(34, + ((n // 128^0) & 127) + 128, + ((n // 128^1) & 127) + 128, + ((n // 128^2) & 127) + 128, + ((n // 128^3) & 127) + 128, + ((n // 128^4) & 127) + 128, + 34, 44) + end) +end + + +function toomanystr () + local a = {} + local st, msg = pcall(function () + for i = 1, math.huge do + if i % (0x100000) == 0 then + io.stderr:write("(", i // 2^20, " M)") + end + a[i] = string.pack("I", i) + end + end) + local size = #a + a = collectgarbage'count' + print("\nmemory:", a * 1024) + print("expected error:", msg) + print("size:", size) +end + + +function toomanyidx () + local a = {} + local st, msg = pcall(function () + for i = 1, math.huge do + if i % (0x100000) == 0 then + io.stderr:write("(", i // 2^20, " M)") + end + a[i] = i + end + end) + print("\nmemory: ", collectgarbage'count' * 1024) + print("expected error: ", msg) + print("size:", #a) +end + + + +-- teststring() +-- controlstruct() +-- manylines() +-- hugeid() +-- toomanyinst() +-- toomanyconst() +-- toomanystr() +toomanyidx() + +print "OK" diff --git a/source/lua/testes/libs/P1/dummy b/source/lua/testes/libs/P1/dummy new file mode 100644 index 0000000..b0468a0 --- /dev/null +++ b/source/lua/testes/libs/P1/dummy @@ -0,0 +1,2 @@ +# This is a dummy file just to make git keep the otherwise empty +# directory 'P1' in the repository. diff --git a/source/lua/testes/libs/lib1.c b/source/lua/testes/libs/lib1.c new file mode 100644 index 0000000..56b6ef4 --- /dev/null +++ b/source/lua/testes/libs/lib1.c @@ -0,0 +1,44 @@ +#include "lua.h" +#include "lauxlib.h" + +static int id (lua_State *L) { + return lua_gettop(L); +} + + +static const struct luaL_Reg funcs[] = { + {"id", id}, + {NULL, NULL} +}; + + +/* function used by lib11.c */ +LUAMOD_API int lib1_export (lua_State *L) { + lua_pushstring(L, "exported"); + return 1; +} + + +LUAMOD_API int onefunction (lua_State *L) { + luaL_checkversion(L); + lua_settop(L, 2); + lua_pushvalue(L, 1); + return 2; +} + + +LUAMOD_API int anotherfunc (lua_State *L) { + luaL_checkversion(L); + lua_pushfstring(L, "%d%%%d\n", (int)lua_tointeger(L, 1), + (int)lua_tointeger(L, 2)); + return 1; +} + + +LUAMOD_API int luaopen_lib1_sub (lua_State *L) { + lua_setglobal(L, "y"); /* 2nd arg: extra value (file name) */ + lua_setglobal(L, "x"); /* 1st arg: module name */ + luaL_newlib(L, funcs); + return 1; +} + diff --git a/source/lua/testes/libs/lib11.c b/source/lua/testes/libs/lib11.c new file mode 100644 index 0000000..377d0c4 --- /dev/null +++ b/source/lua/testes/libs/lib11.c @@ -0,0 +1,10 @@ +#include "lua.h" + +/* function from lib1.c */ +int lib1_export (lua_State *L); + +LUAMOD_API int luaopen_lib11 (lua_State *L) { + return lib1_export(L); +} + + diff --git a/source/lua/testes/libs/lib2.c b/source/lua/testes/libs/lib2.c new file mode 100644 index 0000000..bc9651e --- /dev/null +++ b/source/lua/testes/libs/lib2.c @@ -0,0 +1,23 @@ +#include "lua.h" +#include "lauxlib.h" + +static int id (lua_State *L) { + return lua_gettop(L); +} + + +static const struct luaL_Reg funcs[] = { + {"id", id}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_lib2 (lua_State *L) { + lua_settop(L, 2); + lua_setglobal(L, "y"); /* y gets 2nd parameter */ + lua_setglobal(L, "x"); /* x gets 1st parameter */ + luaL_newlib(L, funcs); + return 1; +} + + diff --git a/source/lua/testes/libs/lib21.c b/source/lua/testes/libs/lib21.c new file mode 100644 index 0000000..a39b683 --- /dev/null +++ b/source/lua/testes/libs/lib21.c @@ -0,0 +1,10 @@ +#include "lua.h" + + +int luaopen_lib2 (lua_State *L); + +LUAMOD_API int luaopen_lib21 (lua_State *L) { + return luaopen_lib2(L); +} + + diff --git a/source/lua/testes/libs/makefile b/source/lua/testes/libs/makefile new file mode 100644 index 0000000..acff484 --- /dev/null +++ b/source/lua/testes/libs/makefile @@ -0,0 +1,27 @@ +# change this variable to point to the directory with Lua headers +# of the version being tested +LUA_DIR = ../../ + +CC = gcc + +# compilation should generate Dynamic-Link Libraries +CFLAGS = -Wall -std=gnu99 -O2 -I$(LUA_DIR) -fPIC -shared + +# libraries used by the tests +all: lib1.so lib11.so lib2.so lib21.so lib2-v2.so + touch all + +lib1.so: lib1.c $(LUA_DIR)/luaconf.h $(LUA_DIR)/ltests.h + $(CC) $(CFLAGS) -o lib1.so lib1.c + +lib11.so: lib11.c $(LUA_DIR)/luaconf.h $(LUA_DIR)/ltests.h + $(CC) $(CFLAGS) -o lib11.so lib11.c + +lib2.so: lib2.c $(LUA_DIR)/luaconf.h $(LUA_DIR)/ltests.h + $(CC) $(CFLAGS) -o lib2.so lib2.c + +lib21.so: lib21.c $(LUA_DIR)/luaconf.h $(LUA_DIR)/ltests.h + $(CC) $(CFLAGS) -o lib21.so lib21.c + +lib2-v2.so: lib2.so + cp lib2.so ./lib2-v2.so diff --git a/source/lua/testes/literals.lua b/source/lua/testes/literals.lua new file mode 100644 index 0000000..fc45d4a --- /dev/null +++ b/source/lua/testes/literals.lua @@ -0,0 +1,309 @@ +-- $Id: testes/literals.lua $ +-- See Copyright Notice in file all.lua + +print('testing scanner') + +local debug = require "debug" + + +local function dostring (x) return assert(load(x), "")() end + +dostring("x \v\f = \t\r 'a\0a' \v\f\f") +assert(x == 'a\0a' and string.len(x) == 3) + +-- escape sequences +assert('\n\"\'\\' == [[ + +"'\]]) + +assert(string.find("\a\b\f\n\r\t\v", "^%c%c%c%c%c%c%c$")) + +-- assume ASCII just for tests: +assert("\09912" == 'c12') +assert("\99ab" == 'cab') +assert("\099" == '\99') +assert("\099\n" == 'c\10') +assert('\0\0\0alo' == '\0' .. '\0\0' .. 'alo') + +assert(010 .. 020 .. -030 == "1020-30") + +-- hexadecimal escapes +assert("\x00\x05\x10\x1f\x3C\xfF\xe8" == "\0\5\16\31\60\255\232") + +local function lexstring (x, y, n) + local f = assert(load('return ' .. x .. + ', require"debug".getinfo(1).currentline', '')) + local s, l = f() + assert(s == y and l == n) +end + +lexstring("'abc\\z \n efg'", "abcefg", 2) +lexstring("'abc\\z \n\n\n'", "abc", 4) +lexstring("'\\z \n\t\f\v\n'", "", 3) +lexstring("[[\nalo\nalo\n\n]]", "alo\nalo\n\n", 5) +lexstring("[[\nalo\ralo\n\n]]", "alo\nalo\n\n", 5) +lexstring("[[\nalo\ralo\r\n]]", "alo\nalo\n", 4) +lexstring("[[\ralo\n\ralo\r\n]]", "alo\nalo\n", 4) +lexstring("[[alo]\n]alo]]", "alo]\n]alo", 2) + +assert("abc\z + def\z + ghi\z + " == 'abcdefghi') + + +-- UTF-8 sequences +assert("\u{0}\u{00000000}\x00\0" == string.char(0, 0, 0, 0)) + +-- limits for 1-byte sequences +assert("\u{0}\u{7F}" == "\x00\x7F") + +-- limits for 2-byte sequences +assert("\u{80}\u{7FF}" == "\xC2\x80\xDF\xBF") + +-- limits for 3-byte sequences +assert("\u{800}\u{FFFF}" == "\xE0\xA0\x80\xEF\xBF\xBF") + +-- limits for 4-byte sequences +assert("\u{10000}\u{1FFFFF}" == "\xF0\x90\x80\x80\xF7\xBF\xBF\xBF") + +-- limits for 5-byte sequences +assert("\u{200000}\u{3FFFFFF}" == "\xF8\x88\x80\x80\x80\xFB\xBF\xBF\xBF\xBF") + +-- limits for 6-byte sequences +assert("\u{4000000}\u{7FFFFFFF}" == + "\xFC\x84\x80\x80\x80\x80\xFD\xBF\xBF\xBF\xBF\xBF") + + +-- Error in escape sequences +local function lexerror (s, err) + local st, msg = load('return ' .. s, '') + if err ~= '' then err = err .. "'" end + assert(not st and string.find(msg, "near .-" .. err)) +end + +lexerror([["abc\x"]], [[\x"]]) +lexerror([["abc\x]], [[\x]]) +lexerror([["\x]], [[\x]]) +lexerror([["\x5"]], [[\x5"]]) +lexerror([["\x5]], [[\x5]]) +lexerror([["\xr"]], [[\xr]]) +lexerror([["\xr]], [[\xr]]) +lexerror([["\x.]], [[\x.]]) +lexerror([["\x8%"]], [[\x8%%]]) +lexerror([["\xAG]], [[\xAG]]) +lexerror([["\g"]], [[\g]]) +lexerror([["\g]], [[\g]]) +lexerror([["\."]], [[\%.]]) + +lexerror([["\999"]], [[\999"]]) +lexerror([["xyz\300"]], [[\300"]]) +lexerror([[" \256"]], [[\256"]]) + +-- errors in UTF-8 sequences +lexerror([["abc\u{100000000}"]], [[abc\u{100000000]]) -- too large +lexerror([["abc\u11r"]], [[abc\u1]]) -- missing '{' +lexerror([["abc\u"]], [[abc\u"]]) -- missing '{' +lexerror([["abc\u{11r"]], [[abc\u{11r]]) -- missing '}' +lexerror([["abc\u{11"]], [[abc\u{11"]]) -- missing '}' +lexerror([["abc\u{11]], [[abc\u{11]]) -- missing '}' +lexerror([["abc\u{r"]], [[abc\u{r]]) -- no digits + +-- unfinished strings +lexerror("[=[alo]]", "") +lexerror("[=[alo]=", "") +lexerror("[=[alo]", "") +lexerror("'alo", "") +lexerror("'alo \\z \n\n", "") +lexerror("'alo \\z", "") +lexerror([['alo \98]], "") + +-- valid characters in variable names +for i = 0, 255 do + local s = string.char(i) + assert(not string.find(s, "[a-zA-Z_]") == not load(s .. "=1", "")) + assert(not string.find(s, "[a-zA-Z_0-9]") == + not load("a" .. s .. "1 = 1", "")) +end + + +-- long variable names + +var1 = string.rep('a', 15000) .. '1' +var2 = string.rep('a', 15000) .. '2' +prog = string.format([[ + %s = 5 + %s = %s + 1 + return function () return %s - %s end +]], var1, var2, var1, var1, var2) +local f = dostring(prog) +assert(_G[var1] == 5 and _G[var2] == 6 and f() == -1) +var1, var2, f = nil +print('+') + +-- escapes -- +assert("\n\t" == [[ + + ]]) +assert([[ + + $debug]] == "\n $debug") +assert([[ [ ]] ~= [[ ] ]]) +-- long strings -- +b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789" +assert(string.len(b) == 960) +prog = [=[ +print('+') + +a1 = [["this is a 'string' with several 'quotes'"]] +a2 = "'quotes'" + +assert(string.find(a1, a2) == 34) +print('+') + +a1 = [==[temp = [[an arbitrary value]]; ]==] +assert(load(a1))() +assert(temp == 'an arbitrary value') +-- long strings -- +b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789" +assert(string.len(b) == 960) +print('+') + +a = [[00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +]] +assert(string.len(a) == 1863) +assert(string.sub(a, 1, 40) == string.sub(b, 1, 40)) +x = 1 +]=] + +print('+') +x = nil +dostring(prog) +assert(x) + +prog = nil +a = nil +b = nil + + +-- testing line ends +prog = [[ +a = 1 -- a comment +b = 2 + + +x = [=[ +hi +]=] +y = "\ +hello\r\n\ +" +return require"debug".getinfo(1).currentline +]] + +for _, n in pairs{"\n", "\r", "\n\r", "\r\n"} do + local prog, nn = string.gsub(prog, "\n", n) + assert(dostring(prog) == nn) + assert(_G.x == "hi\n" and _G.y == "\nhello\r\n\n") +end + + +-- testing comments and strings with long brackets +a = [==[]=]==] +assert(a == "]=") + +a = [==[[===[[=[]]=][====[]]===]===]==] +assert(a == "[===[[=[]]=][====[]]===]===") + +a = [====[[===[[=[]]=][====[]]===]===]====] +assert(a == "[===[[=[]]=][====[]]===]===") + +a = [=[]]]]]]]]]=] +assert(a == "]]]]]]]]") + + +--[===[ +x y z [==[ blu foo +]== +] +]=]==] +error error]=]===] + +-- generate all strings of four of these chars +local x = {"=", "[", "]", "\n"} +local len = 4 +local function gen (c, n) + if n==0 then coroutine.yield(c) + else + for _, a in pairs(x) do + gen(c..a, n-1) + end + end +end + +for s in coroutine.wrap(function () gen("", len) end) do + assert(s == load("return [====[\n"..s.."]====]", "")()) +end + + +-- testing decimal point locale +if os.setlocale("pt_BR") or os.setlocale("ptb") then + assert(tonumber("3,4") == 3.4 and tonumber"3.4" == 3.4) + assert(tonumber(" -.4 ") == -0.4) + assert(tonumber(" +0x.41 ") == 0X0.41) + assert(not load("a = (3,4)")) + assert(assert(load("return 3.4"))() == 3.4) + assert(assert(load("return .4,3"))() == .4) + assert(assert(load("return 4."))() == 4.) + assert(assert(load("return 4.+.5"))() == 4.5) + + assert(" 0x.1 " + " 0x,1" + "-0X.1\t" == 0x0.1) + + assert(tonumber"inf" == nil and tonumber"NAN" == nil) + + assert(assert(load(string.format("return %q", 4.51)))() == 4.51) + + local a,b = load("return 4.5.") + assert(string.find(b, "'4%.5%.'")) + + assert(os.setlocale("C")) +else + (Message or print)( + '\n >>> pt_BR locale not available: skipping decimal point tests <<<\n') +end + + +-- testing %q x line ends +local s = "a string with \r and \n and \r\n and \n\r" +local c = string.format("return %q", s) +assert(assert(load(c))() == s) + +-- testing errors +assert(not load"a = 'non-ending string") +assert(not load"a = 'non-ending string\n'") +assert(not load"a = '\\345'") +assert(not load"a = [=x]") + +print('OK') diff --git a/source/lua/testes/locals.lua b/source/lua/testes/locals.lua new file mode 100644 index 0000000..de47ae3 --- /dev/null +++ b/source/lua/testes/locals.lua @@ -0,0 +1,510 @@ +-- $Id: testes/locals.lua $ +-- See Copyright Notice in file all.lua + +print('testing local variables and environments') + +local debug = require"debug" + + +-- bug in 5.1: + +local function f(x) x = nil; return x end +assert(f(10) == nil) + +local function f() local x; return x end +assert(f(10) == nil) + +local function f(x) x = nil; local y; return x, y end +assert(f(10) == nil and select(2, f(20)) == nil) + +do + local i = 10 + do local i = 100; assert(i==100) end + do local i = 1000; assert(i==1000) end + assert(i == 10) + if i ~= 10 then + local i = 20 + else + local i = 30 + assert(i == 30) + end +end + + + +f = nil + +local f +x = 1 + +a = nil +load('local a = {}')() +assert(a == nil) + +function f (a) + local _1, _2, _3, _4, _5 + local _6, _7, _8, _9, _10 + local x = 3 + local b = a + local c,d = a,b + if (d == b) then + local x = 'q' + x = b + assert(x == 2) + else + assert(nil) + end + assert(x == 3) + local f = 10 +end + +local b=10 +local a; repeat local b; a,b=1,2; assert(a+1==b); until a+b==3 + + +assert(x == 1) + +f(2) +assert(type(f) == 'function') + + +local function getenv (f) + local a,b = debug.getupvalue(f, 1) + assert(a == '_ENV') + return b +end + +-- test for global table of loaded chunks +assert(getenv(load"a=3") == _G) +local c = {}; local f = load("a = 3", nil, nil, c) +assert(getenv(f) == c) +assert(c.a == nil) +f() +assert(c.a == 3) + +-- old test for limits for special instructions (now just a generic test) +do + local i = 2 + local p = 4 -- p == 2^i + repeat + for j=-3,3 do + assert(load(string.format([[local a=%s; + a=a+%s; + assert(a ==2^%s)]], j, p-j, i), '')) () + assert(load(string.format([[local a=%s; + a=a-%s; + assert(a==-2^%s)]], -j, p-j, i), '')) () + assert(load(string.format([[local a,b=0,%s; + a=b-%s; + assert(a==-2^%s)]], -j, p-j, i), '')) () + end + p = 2 * p; i = i + 1 + until p <= 0 +end + +print'+' + + +if rawget(_G, "T") then + -- testing clearing of dead elements from tables + collectgarbage("stop") -- stop GC + local a = {[{}] = 4, [3] = 0, alo = 1, + a1234567890123456789012345678901234567890 = 10} + + local t = T.querytab(a) + + for k,_ in pairs(a) do a[k] = undef end + collectgarbage() -- restore GC and collect dead fiels in `a' + for i=0,t-1 do + local k = querytab(a, i) + assert(k == nil or type(k) == 'number' or k == 'alo') + end + + -- testing allocation errors during table insertions + local a = {} + local function additems () + a.x = true; a.y = true; a.z = true + a[1] = true + a[2] = true + end + for i = 1, math.huge do + T.alloccount(i) + local st, msg = pcall(additems) + T.alloccount() + local count = 0 + for k, v in pairs(a) do + assert(a[k] == v) + count = count + 1 + end + if st then assert(count == 5); break end + end +end + + +-- testing lexical environments + +assert(_ENV == _G) + +do +local dummy +local _ENV = (function (...) return ... end)(_G, dummy) -- { + +do local _ENV = {assert=assert}; assert(true) end +mt = {_G = _G} +local foo,x +A = false -- "declare" A +do local _ENV = mt + function foo (x) + A = x + do local _ENV = _G; A = 1000 end + return function (x) return A .. x end + end +end +assert(getenv(foo) == mt) +x = foo('hi'); assert(mt.A == 'hi' and A == 1000) +assert(x('*') == mt.A .. '*') + +do local _ENV = {assert=assert, A=10}; + do local _ENV = {assert=assert, A=20}; + assert(A==20);x=A + end + assert(A==10 and x==20) +end +assert(x==20) + + +print"testing to-be-closed variables" + +local function stack(n) n = ((n == 0) or stack(n - 1)) end + +local function func2close (f) + return setmetatable({}, {__close = f}) +end + + +do + local a = {} + do + local *toclose x = setmetatable({"x"}, {__close = function (self) + a[#a + 1] = self[1] end}) + local *toclose y = func2close(function (self, err) + assert(err == nil); a[#a + 1] = "y" + end) + a[#a + 1] = "in" + end + a[#a + 1] = "out" + assert(a[1] == "in" and a[2] == "y" and a[3] == "x" and a[4] == "out") +end + +do + local X = false + + local closescope = func2close(function () stack(10); X = true end) + + -- closing functions do not corrupt returning values + local function foo (x) + local *toclose _ = closescope + return x, X, 23 + end + + local a, b, c = foo(1.5) + assert(a == 1.5 and b == false and c == 23 and X == true) + + X = false + foo = function (x) + local *toclose _ = closescope + local y = 15 + return y + end + + assert(foo() == 15 and X == true) + + X = false + foo = function () + local *toclose x = closescope + return x + end + + assert(foo() == closescope and X == true) + +end + + +do + -- calls cannot be tail in the scope of to-be-closed variables + local X, Y + local function foo () + local *toclose _ = func2close(function () Y = 10 end) + assert(X == true and Y == nil) -- 'X' not closed yet + return 1,2,3 + end + + local function bar () + local *toclose _ = func2close(function () X = false end) + X = true + do + return foo() -- not a tail call! + end + end + + local a, b, c, d = bar() + assert(a == 1 and b == 2 and c == 3 and X == false and Y == 10 and d == nil) +end + + +do -- errors in __close + local log = {} + local function foo (err) + local *toclose x = + func2close(function (self, msg) log[#log + 1] = msg; error(1) end) + local *toclose x1 = + func2close(function (self, msg) log[#log + 1] = msg; end) + local *toclose gc = func2close(function () collectgarbage() end) + local *toclose y = + func2close(function (self, msg) log[#log + 1] = msg; error(2) end) + local *toclose z = + func2close(function (self, msg) log[#log + 1] = msg or 10; error(3) end) + if err then error(4) end + end + local stat, msg = pcall(foo, false) + assert(msg == 1) + assert(log[1] == 10 and log[2] == 3 and log[3] == 2 and log[4] == 2 + and #log == 4) + + log = {} + local stat, msg = pcall(foo, true) + assert(msg == 1) + assert(log[1] == 4 and log[2] == 3 and log[3] == 2 and log[4] == 2 + and #log == 4) +end + + +do + + -- errors due to non-closable values + local function foo () + local *toclose x = 34 + end + local stat, msg = pcall(foo) + assert(not stat and string.find(msg, "variable 'x'")) + + + -- with other errors, non-closable values are ignored + local function foo () + local *toclose x = 34 + local *toclose y = func2close(function () error(32) end) + end + local stat, msg = pcall(foo) + assert(not stat and msg == 32) + +end + + +if rawget(_G, "T") then + + -- memory error inside closing function + local function foo () + local *toclose y = func2close(function () T.alloccount() end) + local *toclose x = setmetatable({}, {__close = function () + T.alloccount(0); local x = {} -- force a memory error + end}) + error("a") -- common error inside the function's body + end + + stack(5) -- ensure a minimal number of CI structures + + -- despite memory error, 'y' will be executed and + -- memory limit will be lifted + local _, msg = pcall(foo) + assert(msg == "not enough memory") + + local close = func2close(function (self, msg) + T.alloccount() + assert(msg == "not enough memory") + end) + + -- set a memory limit and return a closing object to remove the limit + local function enter (count) + stack(10) -- reserve some stack space + T.alloccount(count) + return close + end + + local function test () + local *toclose x = enter(0) -- set a memory limit + -- creation of previous upvalue will raise a memory error + assert(false) -- should not run + end + + local _, msg = pcall(test) + assert(msg == "not enough memory") + + -- now use metamethod for closing + close = setmetatable({}, {__close = function () + T.alloccount() + end}) + + -- repeat test with extra closing upvalues + local function test () + local *toclose xxx = func2close(function (self, msg) + assert(msg == "not enough memory"); + error(1000) -- raise another error + end) + local *toclose xx = func2close(function (self, msg) + assert(msg == "not enough memory"); + end) + local *toclose x = enter(0) -- set a memory limit + -- creation of previous upvalue will raise a memory error + os.exit(false) -- should not run + end + + local _, msg = pcall(test) + assert(msg == 1000) + + + do -- testing 'toclose' in C string buffer + collectgarbage() + local s = string.rep('a', 10000) -- large string + local m = T.totalmem() + collectgarbage("stop") + s = string.upper(s) -- allocate buffer + new string (10K each) + -- ensure buffer was deallocated + assert(T.totalmem() - m <= 11000) + collectgarbage("restart") + end + + do -- now some tests for freeing buffer in case of errors + local lim = 10000 -- some size larger than the static buffer + local extra = 2000 -- some extra memory (for callinfo, etc.) + + local s = string.rep("a", lim) + + -- concat this table needs two buffer resizes (one for each 's') + local a = {s, s} + + collectgarbage() + + m = T.totalmem() + collectgarbage("stop") + + -- error in the first buffer allocation + T. totalmem(m + extra) + assert(not pcall(table.concat, a)) + -- first buffer was not even allocated + assert(T.totalmem() - m <= extra) + + -- error in the second buffer allocation + T. totalmem(m + lim + extra) + assert(not pcall(table.concat, a)) + -- first buffer was released by 'toclose' + assert(T.totalmem() - m <= extra) + + -- error in creation of final string + T.totalmem(m + 2 * lim + extra) + assert(not pcall(table.concat, a)) + -- second buffer was released by 'toclose' + assert(T.totalmem() - m <= extra) + + -- userdata, upvalue, buffer, buffer, final string + T.totalmem(m + 4*lim + extra) + assert(#table.concat(a) == 2*lim) + + T.totalmem(0) -- remove memory limit + collectgarbage("restart") + + print'+' + end +end + + +-- to-be-closed variables in coroutines +do + -- an error in a coroutine closes variables + local x = false + local y = false + local co = coroutine.create(function () + local *toclose xv = func2close(function () x = true end) + do + local *toclose yv = func2close(function () y = true end) + coroutine.yield(100) -- yield doesn't close variable + end + coroutine.yield(200) -- yield doesn't close variable + error(23) -- error does + end) + + local a, b = coroutine.resume(co) + assert(a and b == 100 and not x and not y) + a, b = coroutine.resume(co) + assert(a and b == 200 and not x and y) + a, b = coroutine.resume(co) + assert(not a and b == 23 and x and y) +end + +-- a suspended coroutine should not close its variables when collected +local co +co = coroutine.wrap(function() + local *toclose x = function () os.exit(false) end -- should not run + co = nil + coroutine.yield() +end) +co() -- start coroutine +assert(co == nil) -- eventually it will be collected + + +-- to-be-closed variables in generic for loops +do + local numopen = 0 + local function open (x) + numopen = numopen + 1 + return + function () -- iteraction function + x = x - 1 + if x > 0 then return x end + end, + nil, -- state + nil, -- control variable + func2close(function () numopen = numopen - 1 end) -- closing function + end + + local s = 0 + for i in open(10) do + s = s + i + end + assert(s == 45 and numopen == 0) + + local s = 0 + for i in open(10) do + if i < 5 then break end + s = s + i + end + assert(s == 35 and numopen == 0) + + -- repeat test with '__open' metamethod instead of a function + local function open (x) + numopen = numopen + 1 + local state = setmetatable({x}, + {__close = function () numopen = numopen - 1 end}) + return + function (t) -- iteraction function + t[1] = t[1] - 1 + if t[1] > 0 then return t[1] end + end, + state, + nil, + state -- to-be-closed + end + + local s = 0 + for i in open(10) do + if (i < 5) then break end + s = s + i + end + assert(s == 35 and numopen == 0) +end + +print('OK') + +return 5,f + +end -- } + diff --git a/source/lua/testes/main.lua b/source/lua/testes/main.lua new file mode 100644 index 0000000..b9dcab1 --- /dev/null +++ b/source/lua/testes/main.lua @@ -0,0 +1,395 @@ +# testing special comment on first line +-- $Id: testes/main.lua $ +-- See Copyright Notice in file all.lua + +-- most (all?) tests here assume a reasonable "Unix-like" shell +if _port then return end + +-- use only "double quotes" inside shell scripts (better change to +-- run on Windows) + + +print ("testing stand-alone interpreter") + +assert(os.execute()) -- machine has a system command + +local arg = arg or ARG + +local prog = os.tmpname() +local otherprog = os.tmpname() +local out = os.tmpname() + +local progname +do + local i = 0 + while arg[i] do i=i-1 end + progname = arg[i+1] +end +print("progname: "..progname) + +local prepfile = function (s, p) + p = p or prog + io.output(p) + io.write(s) + assert(io.close()) +end + +local function getoutput () + io.input(out) + local t = io.read("a") + io.input():close() + assert(os.remove(out)) + return t +end + +local function checkprogout (s) + local t = getoutput() + for line in string.gmatch(s, ".-\n") do + assert(string.find(t, line, 1, true)) + end +end + +local function checkout (s) + local t = getoutput() + if s ~= t then print(string.format("'%s' - '%s'\n", s, t)) end + assert(s == t) + return t +end + + +local function RUN (p, ...) + p = string.gsub(p, "lua", '"'..progname..'"', 1) + local s = string.format(p, ...) + assert(os.execute(s)) +end + +local function NoRun (msg, p, ...) + p = string.gsub(p, "lua", '"'..progname..'"', 1) + local s = string.format(p, ...) + s = string.format("%s 2> %s", s, out) -- will send error to 'out' + assert(not os.execute(s)) + assert(string.find(getoutput(), msg, 1, true)) -- check error message +end + +RUN('lua -v') + +print(string.format("(temporary program file used in these tests: %s)", prog)) + +-- running stdin as a file +prepfile"" +RUN('lua - < %s > %s', prog, out) +checkout("") + +prepfile[[ + print( +1, a +) +]] +RUN('lua - < %s > %s', prog, out) +checkout("1\tnil\n") + +RUN('echo "print(10)\nprint(2)\n" | lua > %s', out) +checkout("10\n2\n") + + +-- test option '-' +RUN('echo "print(arg[1])" | lua - -h > %s', out) +checkout("-h\n") + +-- test environment variables used by Lua + +prepfile("print(package.path)") + +-- test LUA_PATH +RUN('env LUA_INIT= LUA_PATH=x lua %s > %s', prog, out) +checkout("x\n") + +-- test LUA_PATH_version +RUN('env LUA_INIT= LUA_PATH_5_4=y LUA_PATH=x lua %s > %s', prog, out) +checkout("y\n") + +-- test LUA_CPATH +prepfile("print(package.cpath)") +RUN('env LUA_INIT= LUA_CPATH=xuxu lua %s > %s', prog, out) +checkout("xuxu\n") + +-- test LUA_CPATH_version +RUN('env LUA_INIT= LUA_CPATH_5_4=yacc LUA_CPATH=x lua %s > %s', prog, out) +checkout("yacc\n") + +-- test LUA_INIT (and its access to 'arg' table) +prepfile("print(X)") +RUN('env LUA_INIT="X=tonumber(arg[1])" lua %s 3.2 > %s', prog, out) +checkout("3.2\n") + +-- test LUA_INIT_version +prepfile("print(X)") +RUN('env LUA_INIT_5_4="X=10" LUA_INIT="X=3" lua %s > %s', prog, out) +checkout("10\n") + +-- test LUA_INIT for files +prepfile("x = x or 10; print(x); x = x + 1") +RUN('env LUA_INIT="@%s" lua %s > %s', prog, prog, out) +checkout("10\n11\n") + +-- test errors in LUA_INIT +NoRun('LUA_INIT:1: msg', 'env LUA_INIT="error(\'msg\')" lua') + +-- test option '-E' +local defaultpath, defaultCpath + +do + prepfile("print(package.path, package.cpath)") + RUN('env LUA_INIT="error(10)" LUA_PATH=xxx LUA_CPATH=xxx lua -E %s > %s', + prog, out) + local out = getoutput() + defaultpath = string.match(out, "^(.-)\t") + defaultCpath = string.match(out, "\t(.-)$") +end + +-- paths did not changed +assert(not string.find(defaultpath, "xxx") and + string.find(defaultpath, "lua") and + not string.find(defaultCpath, "xxx") and + string.find(defaultCpath, "lua")) + + +-- test replacement of ';;' to default path +local function convert (p) + prepfile("print(package.path)") + RUN('env LUA_PATH="%s" lua %s > %s', p, prog, out) + local expected = getoutput() + expected = string.sub(expected, 1, -2) -- cut final end of line + assert(string.gsub(p, ";;", ";"..defaultpath..";") == expected) +end + +convert(";") +convert(";;") +convert(";;;") +convert(";;;;") +convert(";;;;;") +convert(";;a;;;bc") + + +-- test -l over multiple libraries +prepfile("print(1); a=2; return {x=15}") +prepfile(("print(a); print(_G['%s'].x)"):format(prog), otherprog) +RUN('env LUA_PATH="?;;" lua -l %s -l%s -lstring -l io %s > %s', prog, otherprog, otherprog, out) +checkout("1\n2\n15\n2\n15\n") + +-- test 'arg' table +local a = [[ + assert(#arg == 3 and arg[1] == 'a' and + arg[2] == 'b' and arg[3] == 'c') + assert(arg[-1] == '--' and arg[-2] == "-e " and arg[-3] == '%s') + assert(arg[4] == undef and arg[-4] == undef) + local a, b, c = ... + assert(... == 'a' and a == 'a' and b == 'b' and c == 'c') +]] +a = string.format(a, progname) +prepfile(a) +RUN('lua "-e " -- %s a b c', prog) -- "-e " runs an empty command + +-- test 'arg' availability in libraries +prepfile"assert(arg)" +prepfile("assert(arg)", otherprog) +RUN('env LUA_PATH="?;;" lua -l%s - < %s', prog, otherprog) + +-- test messing up the 'arg' table +RUN('echo "print(...)" | lua -e "arg[1] = 100" - > %s', out) +checkout("100\n") +NoRun("'arg' is not a table", 'echo "" | lua -e "arg = 1" -') + +-- test error in 'print' +RUN('echo 10 | lua -e "print=nil" -i > /dev/null 2> %s', out) +assert(string.find(getoutput(), "error calling 'print'")) + +-- test 'debug.debug' +RUN('echo "io.stderr:write(1000)\ncont" | lua -e "require\'debug\'.debug()" 2> %s', out) +checkout("lua_debug> 1000lua_debug> ") + +-- test many arguments +prepfile[[print(({...})[30])]] +RUN('lua %s %s > %s', prog, string.rep(" a", 30), out) +checkout("a\n") + +RUN([[lua "-eprint(1)" -ea=3 -e "print(a)" > %s]], out) +checkout("1\n3\n") + +-- test iteractive mode +prepfile[[ +(6*2-6) -- === +a = +10 +print(a) +a]] +RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out) +checkprogout("6\n10\n10\n\n") + +prepfile("a = [[b\nc\nd\ne]]\n=a") +RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out) +checkprogout("b\nc\nd\ne\n\n") + +prompt = "alo" +prepfile[[ -- +a = 2 +]] +RUN([[lua "-e_PROMPT='%s'" -i < %s > %s]], prompt, prog, out) +local t = getoutput() +assert(string.find(t, prompt .. ".*" .. prompt .. ".*" .. prompt)) + +-- test for error objects +prepfile[[ +debug = require "debug" +m = {x=0} +setmetatable(m, {__tostring = function(x) + return tostring(debug.getinfo(4).currentline + x.x) +end}) +error(m) +]] +NoRun(progname .. ": 6\n", [[lua %s]], prog) + +prepfile("error{}") +NoRun("error object is a table value", [[lua %s]], prog) + + +-- chunk broken in many lines +s = [=[ -- +function f ( x ) + local a = [[ +xuxu +]] + local b = "\ +xuxu\n" + if x == 11 then return 1 + 12 , 2 + 20 end --[[ test multiple returns ]] + return x + 1 + --\\ +end +return( f( 100 ) ) +assert( a == b ) +do return f( 11 ) end ]=] +s = string.gsub(s, ' ', '\n\n') -- change all spaces for newlines +prepfile(s) +RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out) +checkprogout("101\n13\t22\n\n") + +prepfile[[#comment in 1st line without \n at the end]] +RUN('lua %s', prog) + +prepfile[[#test line number when file starts with comment line +debug = require"debug" +print(debug.getinfo(1).currentline) +]] +RUN('lua %s > %s', prog, out) +checkprogout('3') + +-- close Lua with an open file +prepfile(string.format([[io.output(%q); io.write('alo')]], out)) +RUN('lua %s', prog) +checkout('alo') + +-- bug in 5.2 beta (extra \0 after version line) +RUN([[lua -v -e"print'hello'" > %s]], out) +t = getoutput() +assert(string.find(t, "PUC%-Rio\nhello")) + + +-- testing os.exit +prepfile("os.exit(nil, true)") +RUN('lua %s', prog) +prepfile("os.exit(0, true)") +RUN('lua %s', prog) +prepfile("os.exit(true, true)") +RUN('lua %s', prog) +prepfile("os.exit(1, true)") +NoRun("", "lua %s", prog) -- no message +prepfile("os.exit(false, true)") +NoRun("", "lua %s", prog) -- no message + + +-- to-be-closed variables in main chunk +prepfile[[ + local *toclose x = function (err) + assert(err == 120) + print("Ok") + end + local *toclose e1 = function () error(120) end + os.exit(true, true) +]] +RUN('lua %s > %s', prog, out) +checkprogout("Ok") + + +-- remove temporary files +assert(os.remove(prog)) +assert(os.remove(otherprog)) +assert(not os.remove(out)) + +-- invalid options +NoRun("unrecognized option '-h'", "lua -h") +NoRun("unrecognized option '---'", "lua ---") +NoRun("unrecognized option '-Ex'", "lua -Ex") +NoRun("unrecognized option '-vv'", "lua -vv") +NoRun("unrecognized option '-iv'", "lua -iv") +NoRun("'-e' needs argument", "lua -e") +NoRun("syntax error", "lua -e a") +NoRun("'-l' needs argument", "lua -l") + + +if T then -- auxiliary library? + print("testing 'not enough memory' to create a state") + NoRun("not enough memory", "env MEMLIMIT=100 lua") +end +print('+') + +print('testing Ctrl C') +do + -- interrupt a script + local function kill (pid) + return os.execute(string.format('kill -INT %s 2> /dev/null', pid)) + end + + -- function to run a script in background, returning its output file + -- descriptor and its pid + local function runback (luaprg) + -- shell script to run 'luaprg' in background and echo its pid + local shellprg = string.format('%s -e "%s" & echo $!', progname, luaprg) + local f = io.popen(shellprg, "r") -- run shell script + local pid = f:read() -- get pid for Lua script + print("(if test fails now, it may leave a Lua script running in \z + background, pid " .. pid .. ")") + return f, pid + end + + -- Lua script that runs protected infinite loop and then prints '42' + local f, pid = runback[[ + pcall(function () print(12); while true do end end); print(42)]] + -- wait until script is inside 'pcall' + assert(f:read() == "12") + kill(pid) -- send INT signal to Lua script + -- check that 'pcall' captured the exception and script continued running + assert(f:read() == "42") -- expected output + assert(f:close()) + print("done") + + -- Lua script in a long unbreakable search + local f, pid = runback[[ + print(15); string.find(string.rep('a', 100000), '.*b')]] + -- wait (so script can reach the loop) + assert(f:read() == "15") + assert(os.execute("sleep 1")) + -- must send at least two INT signals to stop this Lua script + local n = 100 + for i = 0, 100 do -- keep sending signals + if not kill(pid) then -- until it fails + n = i -- number of non-failed kills + break + end + end + assert(f:close()) + assert(n >= 2) + print(string.format("done (with %d kills)", n)) + +end + +print("OK") diff --git a/source/lua/testes/math.lua b/source/lua/testes/math.lua new file mode 100644 index 0000000..b010ff6 --- /dev/null +++ b/source/lua/testes/math.lua @@ -0,0 +1,1008 @@ +-- $Id: testes/math.lua $ +-- See Copyright Notice in file all.lua + +print("testing numbers and math lib") + +local minint = math.mininteger +local maxint = math.maxinteger + +local intbits = math.floor(math.log(maxint, 2) + 0.5) + 1 +assert((1 << intbits) == 0) + +assert(minint == 1 << (intbits - 1)) +assert(maxint == minint - 1) + +-- number of bits in the mantissa of a floating-point number +local floatbits = 24 +do + local p = 2.0^floatbits + while p < p + 1.0 do + p = p * 2.0 + floatbits = floatbits + 1 + end +end + +local function isNaN (x) + return (x ~= x) +end + +assert(isNaN(0/0)) +assert(not isNaN(1/0)) + + +do + local x = 2.0^floatbits + assert(x > x - 1.0 and x == x + 1.0) + + print(string.format("%d-bit integers, %d-bit (mantissa) floats", + intbits, floatbits)) +end + +assert(math.type(0) == "integer" and math.type(0.0) == "float" + and math.type("10") == nil) + + +local function checkerror (msg, f, ...) + local s, err = pcall(f, ...) + assert(not s and string.find(err, msg)) +end + +local msgf2i = "number.* has no integer representation" + +-- float equality +function eq (a,b,limit) + if not limit then + if floatbits >= 50 then limit = 1E-11 + else limit = 1E-5 + end + end + -- a == b needed for +inf/-inf + return a == b or math.abs(a-b) <= limit +end + + +-- equality with types +function eqT (a,b) + return a == b and math.type(a) == math.type(b) +end + + +-- basic float notation +assert(0e12 == 0 and .0 == 0 and 0. == 0 and .2e2 == 20 and 2.E-1 == 0.2) + +do + local a,b,c = "2", " 3e0 ", " 10 " + assert(a+b == 5 and -b == -3 and b+"2" == 5 and "10"-c == 0) + assert(type(a) == 'string' and type(b) == 'string' and type(c) == 'string') + assert(a == "2" and b == " 3e0 " and c == " 10 " and -c == -" 10 ") + assert(c%a == 0 and a^b == 08) + a = 0 + assert(a == -a and 0 == -0) +end + +do + local x = -1 + local mz = 0/x -- minus zero + t = {[0] = 10, 20, 30, 40, 50} + assert(t[mz] == t[0] and t[-0] == t[0]) +end + +do -- tests for 'modf' + local a,b = math.modf(3.5) + assert(a == 3.0 and b == 0.5) + a,b = math.modf(-2.5) + assert(a == -2.0 and b == -0.5) + a,b = math.modf(-3e23) + assert(a == -3e23 and b == 0.0) + a,b = math.modf(3e35) + assert(a == 3e35 and b == 0.0) + a,b = math.modf(-1/0) -- -inf + assert(a == -1/0 and b == 0.0) + a,b = math.modf(1/0) -- inf + assert(a == 1/0 and b == 0.0) + a,b = math.modf(0/0) -- NaN + assert(isNaN(a) and isNaN(b)) + a,b = math.modf(3) -- integer argument + assert(eqT(a, 3) and eqT(b, 0.0)) + a,b = math.modf(minint) + assert(eqT(a, minint) and eqT(b, 0.0)) +end + +assert(math.huge > 10e30) +assert(-math.huge < -10e30) + + +-- integer arithmetic +assert(minint < minint + 1) +assert(maxint - 1 < maxint) +assert(0 - minint == minint) +assert(minint * minint == 0) +assert(maxint * maxint * maxint == maxint) + + +-- testing floor division and conversions + +for _, i in pairs{-16, -15, -3, -2, -1, 0, 1, 2, 3, 15} do + for _, j in pairs{-16, -15, -3, -2, -1, 1, 2, 3, 15} do + for _, ti in pairs{0, 0.0} do -- try 'i' as integer and as float + for _, tj in pairs{0, 0.0} do -- try 'j' as integer and as float + local x = i + ti + local y = j + tj + assert(i//j == math.floor(i/j)) + end + end + end +end + +assert(1//0.0 == 1/0) +assert(-1 // 0.0 == -1/0) +assert(eqT(3.5 // 1.5, 2.0)) +assert(eqT(3.5 // -1.5, -3.0)) + +do -- tests for different kinds of opcodes + local x, y + x = 1; assert(x // 0.0 == 1/0) + x = 1.0; assert(x // 0 == 1/0) + x = 3.5; assert(eqT(x // 1, 3.0)) + assert(eqT(x // -1, -4.0)) + + x = 3.5; y = 1.5; assert(eqT(x // y, 2.0)) + x = 3.5; y = -1.5; assert(eqT(x // y, -3.0)) +end + +assert(maxint // maxint == 1) +assert(maxint // 1 == maxint) +assert((maxint - 1) // maxint == 0) +assert(maxint // (maxint - 1) == 1) +assert(minint // minint == 1) +assert(minint // minint == 1) +assert((minint + 1) // minint == 0) +assert(minint // (minint + 1) == 1) +assert(minint // 1 == minint) + +assert(minint // -1 == -minint) +assert(minint // -2 == 2^(intbits - 2)) +assert(maxint // -1 == -maxint) + + +-- negative exponents +do + assert(2^-3 == 1 / 2^3) + assert(eq((-3)^-3, 1 / (-3)^3)) + for i = -3, 3 do -- variables avoid constant folding + for j = -3, 3 do + -- domain errors (0^(-n)) are not portable + if not _port or i ~= 0 or j > 0 then + assert(eq(i^j, 1 / i^(-j))) + end + end + end +end + +-- comparison between floats and integers (border cases) +if floatbits < intbits then + assert(2.0^floatbits == (1 << floatbits)) + assert(2.0^floatbits - 1.0 == (1 << floatbits) - 1.0) + assert(2.0^floatbits - 1.0 ~= (1 << floatbits)) + -- float is rounded, int is not + assert(2.0^floatbits + 1.0 ~= (1 << floatbits) + 1) +else -- floats can express all integers with full accuracy + assert(maxint == maxint + 0.0) + assert(maxint - 1 == maxint - 1.0) + assert(minint + 1 == minint + 1.0) + assert(maxint ~= maxint - 1.0) +end +assert(maxint + 0.0 == 2.0^(intbits - 1) - 1.0) +assert(minint + 0.0 == minint) +assert(minint + 0.0 == -2.0^(intbits - 1)) + + +-- order between floats and integers +assert(1 < 1.1); assert(not (1 < 0.9)) +assert(1 <= 1.1); assert(not (1 <= 0.9)) +assert(-1 < -0.9); assert(not (-1 < -1.1)) +assert(1 <= 1.1); assert(not (-1 <= -1.1)) +assert(-1 < -0.9); assert(not (-1 < -1.1)) +assert(-1 <= -0.9); assert(not (-1 <= -1.1)) +assert(minint <= minint + 0.0) +assert(minint + 0.0 <= minint) +assert(not (minint < minint + 0.0)) +assert(not (minint + 0.0 < minint)) +assert(maxint < minint * -1.0) +assert(maxint <= minint * -1.0) + +do + local fmaxi1 = 2^(intbits - 1) + assert(maxint < fmaxi1) + assert(maxint <= fmaxi1) + assert(not (fmaxi1 <= maxint)) + assert(minint <= -2^(intbits - 1)) + assert(-2^(intbits - 1) <= minint) +end + +if floatbits < intbits then + print("testing order (floats cannot represent all integers)") + local fmax = 2^floatbits + local ifmax = fmax | 0 + assert(fmax < ifmax + 1) + assert(fmax - 1 < ifmax) + assert(-(fmax - 1) > -ifmax) + assert(not (fmax <= ifmax - 1)) + assert(-fmax > -(ifmax + 1)) + assert(not (-fmax >= -(ifmax - 1))) + + assert(fmax/2 - 0.5 < ifmax//2) + assert(-(fmax/2 - 0.5) > -ifmax//2) + + assert(maxint < 2^intbits) + assert(minint > -2^intbits) + assert(maxint <= 2^intbits) + assert(minint >= -2^intbits) +else + print("testing order (floats can represent all integers)") + assert(maxint < maxint + 1.0) + assert(maxint < maxint + 0.5) + assert(maxint - 1.0 < maxint) + assert(maxint - 0.5 < maxint) + assert(not (maxint + 0.0 < maxint)) + assert(maxint + 0.0 <= maxint) + assert(not (maxint < maxint + 0.0)) + assert(maxint + 0.0 <= maxint) + assert(maxint <= maxint + 0.0) + assert(not (maxint + 1.0 <= maxint)) + assert(not (maxint + 0.5 <= maxint)) + assert(not (maxint <= maxint - 1.0)) + assert(not (maxint <= maxint - 0.5)) + + assert(minint < minint + 1.0) + assert(minint < minint + 0.5) + assert(minint <= minint + 0.5) + assert(minint - 1.0 < minint) + assert(minint - 1.0 <= minint) + assert(not (minint + 0.0 < minint)) + assert(not (minint + 0.5 < minint)) + assert(not (minint < minint + 0.0)) + assert(minint + 0.0 <= minint) + assert(minint <= minint + 0.0) + assert(not (minint + 1.0 <= minint)) + assert(not (minint + 0.5 <= minint)) + assert(not (minint <= minint - 1.0)) +end + +do + local NaN = 0/0 + assert(not (NaN < 0)) + assert(not (NaN > minint)) + assert(not (NaN <= -9)) + assert(not (NaN <= maxint)) + assert(not (NaN < maxint)) + assert(not (minint <= NaN)) + assert(not (minint < NaN)) + assert(not (4 <= NaN)) + assert(not (4 < NaN)) +end + + +-- avoiding errors at compile time +local function checkcompt (msg, code) + checkerror(msg, assert(load(code))) +end +checkcompt("divide by zero", "return 2 // 0") +checkcompt(msgf2i, "return 2.3 >> 0") +checkcompt(msgf2i, ("return 2.0^%d & 1"):format(intbits - 1)) +checkcompt("field 'huge'", "return math.huge << 1") +checkcompt(msgf2i, ("return 1 | 2.0^%d"):format(intbits - 1)) +checkcompt(msgf2i, "return 2.3 ~ 0.0") + + +-- testing overflow errors when converting from float to integer (runtime) +local function f2i (x) return x | x end +checkerror(msgf2i, f2i, math.huge) -- +inf +checkerror(msgf2i, f2i, -math.huge) -- -inf +checkerror(msgf2i, f2i, 0/0) -- NaN + +if floatbits < intbits then + -- conversion tests when float cannot represent all integers + assert(maxint + 1.0 == maxint + 0.0) + assert(minint - 1.0 == minint + 0.0) + checkerror(msgf2i, f2i, maxint + 0.0) + assert(f2i(2.0^(intbits - 2)) == 1 << (intbits - 2)) + assert(f2i(-2.0^(intbits - 2)) == -(1 << (intbits - 2))) + assert((2.0^(floatbits - 1) + 1.0) // 1 == (1 << (floatbits - 1)) + 1) + -- maximum integer representable as a float + local mf = maxint - (1 << (floatbits - intbits)) + 1 + assert(f2i(mf + 0.0) == mf) -- OK up to here + mf = mf + 1 + assert(f2i(mf + 0.0) ~= mf) -- no more representable +else + -- conversion tests when float can represent all integers + assert(maxint + 1.0 > maxint) + assert(minint - 1.0 < minint) + assert(f2i(maxint + 0.0) == maxint) + checkerror("no integer rep", f2i, maxint + 1.0) + checkerror("no integer rep", f2i, minint - 1.0) +end + +-- 'minint' should be representable as a float no matter the precision +assert(f2i(minint + 0.0) == minint) + + +-- testing numeric strings + +assert("2" + 1 == 3) +assert("2 " + 1 == 3) +assert(" -2 " + 1 == -1) +assert(" -0xa " + 1 == -9) + + +-- Literal integer Overflows (new behavior in 5.3.3) +do + -- no overflows + assert(eqT(tonumber(tostring(maxint)), maxint)) + assert(eqT(tonumber(tostring(minint)), minint)) + + -- add 1 to last digit as a string (it cannot be 9...) + local function incd (n) + local s = string.format("%d", n) + s = string.gsub(s, "%d$", function (d) + assert(d ~= '9') + return string.char(string.byte(d) + 1) + end) + return s + end + + -- 'tonumber' with overflow by 1 + assert(eqT(tonumber(incd(maxint)), maxint + 1.0)) + assert(eqT(tonumber(incd(minint)), minint - 1.0)) + + -- large numbers + assert(eqT(tonumber("1"..string.rep("0", 30)), 1e30)) + assert(eqT(tonumber("-1"..string.rep("0", 30)), -1e30)) + + -- hexa format still wraps around + assert(eqT(tonumber("0x1"..string.rep("0", 30)), 0)) + + -- lexer in the limits + assert(minint == load("return " .. minint)()) + assert(eqT(maxint, load("return " .. maxint)())) + + assert(eqT(10000000000000000000000.0, 10000000000000000000000)) + assert(eqT(-10000000000000000000000.0, -10000000000000000000000)) +end + + +-- testing 'tonumber' + +-- 'tonumber' with numbers +assert(tonumber(3.4) == 3.4) +assert(eqT(tonumber(3), 3)) +assert(eqT(tonumber(maxint), maxint) and eqT(tonumber(minint), minint)) +assert(tonumber(1/0) == 1/0) + +-- 'tonumber' with strings +assert(tonumber("0") == 0) +assert(tonumber("") == nil) +assert(tonumber(" ") == nil) +assert(tonumber("-") == nil) +assert(tonumber(" -0x ") == nil) +assert(tonumber{} == nil) +assert(tonumber'+0.01' == 1/100 and tonumber'+.01' == 0.01 and + tonumber'.01' == 0.01 and tonumber'-1.' == -1 and + tonumber'+1.' == 1) +assert(tonumber'+ 0.01' == nil and tonumber'+.e1' == nil and + tonumber'1e' == nil and tonumber'1.0e+' == nil and + tonumber'.' == nil) +assert(tonumber('-012') == -010-2) +assert(tonumber('-1.2e2') == - - -120) + +assert(tonumber("0xffffffffffff") == (1 << (4*12)) - 1) +assert(tonumber("0x"..string.rep("f", (intbits//4))) == -1) +assert(tonumber("-0x"..string.rep("f", (intbits//4))) == 1) + +-- testing 'tonumber' with base +assert(tonumber(' 001010 ', 2) == 10) +assert(tonumber(' 001010 ', 10) == 001010) +assert(tonumber(' -1010 ', 2) == -10) +assert(tonumber('10', 36) == 36) +assert(tonumber(' -10 ', 36) == -36) +assert(tonumber(' +1Z ', 36) == 36 + 35) +assert(tonumber(' -1z ', 36) == -36 + -35) +assert(tonumber('-fFfa', 16) == -(10+(16*(15+(16*(15+(16*15))))))) +assert(tonumber(string.rep('1', (intbits - 2)), 2) + 1 == 2^(intbits - 2)) +assert(tonumber('ffffFFFF', 16)+1 == (1 << 32)) +assert(tonumber('0ffffFFFF', 16)+1 == (1 << 32)) +assert(tonumber('-0ffffffFFFF', 16) - 1 == -(1 << 40)) +for i = 2,36 do + local i2 = i * i + local i10 = i2 * i2 * i2 * i2 * i2 -- i^10 + assert(tonumber('\t10000000000\t', i) == i10) +end + +if not _soft then + -- tests with very long numerals + assert(tonumber("0x"..string.rep("f", 13)..".0") == 2.0^(4*13) - 1) + assert(tonumber("0x"..string.rep("f", 150)..".0") == 2.0^(4*150) - 1) + assert(tonumber("0x"..string.rep("f", 300)..".0") == 2.0^(4*300) - 1) + assert(tonumber("0x"..string.rep("f", 500)..".0") == 2.0^(4*500) - 1) + assert(tonumber('0x3.' .. string.rep('0', 1000)) == 3) + assert(tonumber('0x' .. string.rep('0', 1000) .. 'a') == 10) + assert(tonumber('0x0.' .. string.rep('0', 13).."1") == 2.0^(-4*14)) + assert(tonumber('0x0.' .. string.rep('0', 150).."1") == 2.0^(-4*151)) + assert(tonumber('0x0.' .. string.rep('0', 300).."1") == 2.0^(-4*301)) + assert(tonumber('0x0.' .. string.rep('0', 500).."1") == 2.0^(-4*501)) + + assert(tonumber('0xe03' .. string.rep('0', 1000) .. 'p-4000') == 3587.0) + assert(tonumber('0x.' .. string.rep('0', 1000) .. '74p4004') == 0x7.4) +end + +-- testing 'tonumber' for invalid formats + +local function f (...) + if select('#', ...) == 1 then + return (...) + else + return "***" + end +end + +assert(f(tonumber('fFfa', 15)) == nil) +assert(f(tonumber('099', 8)) == nil) +assert(f(tonumber('1\0', 2)) == nil) +assert(f(tonumber('', 8)) == nil) +assert(f(tonumber(' ', 9)) == nil) +assert(f(tonumber(' ', 9)) == nil) +assert(f(tonumber('0xf', 10)) == nil) + +assert(f(tonumber('inf')) == nil) +assert(f(tonumber(' INF ')) == nil) +assert(f(tonumber('Nan')) == nil) +assert(f(tonumber('nan')) == nil) + +assert(f(tonumber(' ')) == nil) +assert(f(tonumber('')) == nil) +assert(f(tonumber('1 a')) == nil) +assert(f(tonumber('1 a', 2)) == nil) +assert(f(tonumber('1\0')) == nil) +assert(f(tonumber('1 \0')) == nil) +assert(f(tonumber('1\0 ')) == nil) +assert(f(tonumber('e1')) == nil) +assert(f(tonumber('e 1')) == nil) +assert(f(tonumber(' 3.4.5 ')) == nil) + + +-- testing 'tonumber' for invalid hexadecimal formats + +assert(tonumber('0x') == nil) +assert(tonumber('x') == nil) +assert(tonumber('x3') == nil) +assert(tonumber('0x3.3.3') == nil) -- two decimal points +assert(tonumber('00x2') == nil) +assert(tonumber('0x 2') == nil) +assert(tonumber('0 x2') == nil) +assert(tonumber('23x') == nil) +assert(tonumber('- 0xaa') == nil) +assert(tonumber('-0xaaP ') == nil) -- no exponent +assert(tonumber('0x0.51p') == nil) +assert(tonumber('0x5p+-2') == nil) + + +-- testing hexadecimal numerals + +assert(0x10 == 16 and 0xfff == 2^12 - 1 and 0XFB == 251) +assert(0x0p12 == 0 and 0x.0p-3 == 0) +assert(0xFFFFFFFF == (1 << 32) - 1) +assert(tonumber('+0x2') == 2) +assert(tonumber('-0xaA') == -170) +assert(tonumber('-0xffFFFfff') == -(1 << 32) + 1) + +-- possible confusion with decimal exponent +assert(0E+1 == 0 and 0xE+1 == 15 and 0xe-1 == 13) + + +-- floating hexas + +assert(tonumber(' 0x2.5 ') == 0x25/16) +assert(tonumber(' -0x2.5 ') == -0x25/16) +assert(tonumber(' +0x0.51p+8 ') == 0x51) +assert(0x.FfffFFFF == 1 - '0x.00000001') +assert('0xA.a' + 0 == 10 + 10/16) +assert(0xa.aP4 == 0XAA) +assert(0x4P-2 == 1) +assert(0x1.1 == '0x1.' + '+0x.1') +assert(0Xabcdef.0 == 0x.ABCDEFp+24) + + +assert(1.1 == 1.+.1) +assert(100.0 == 1E2 and .01 == 1e-2) +assert(1111111111 - 1111111110 == 1000.00e-03) +assert(1.1 == '1.'+'.1') +assert(tonumber'1111111111' - tonumber'1111111110' == + tonumber" +0.001e+3 \n\t") + +assert(0.1e-30 > 0.9E-31 and 0.9E30 < 0.1e31) + +assert(0.123456 > 0.123455) + +assert(tonumber('+1.23E18') == 1.23*10.0^18) + +-- testing order operators +assert(not(1<1) and (1<2) and not(2<1)) +assert(not('a'<'a') and ('a'<'b') and not('b'<'a')) +assert((1<=1) and (1<=2) and not(2<=1)) +assert(('a'<='a') and ('a'<='b') and not('b'<='a')) +assert(not(1>1) and not(1>2) and (2>1)) +assert(not('a'>'a') and not('a'>'b') and ('b'>'a')) +assert((1>=1) and not(1>=2) and (2>=1)) +assert(('a'>='a') and not('a'>='b') and ('b'>='a')) +assert(1.3 < 1.4 and 1.3 <= 1.4 and not (1.3 < 1.3) and 1.3 <= 1.3) + +-- testing mod operator +assert(eqT(-4 % 3, 2)) +assert(eqT(4 % -3, -2)) +assert(eqT(-4.0 % 3, 2.0)) +assert(eqT(4 % -3.0, -2.0)) +assert(eqT(4 % -5, -1)) +assert(eqT(4 % -5.0, -1.0)) +assert(eqT(4 % 5, 4)) +assert(eqT(4 % 5.0, 4.0)) +assert(eqT(-4 % -5, -4)) +assert(eqT(-4 % -5.0, -4.0)) +assert(eqT(-4 % 5, 1)) +assert(eqT(-4 % 5.0, 1.0)) +assert(eqT(4.25 % 4, 0.25)) +assert(eqT(10.0 % 2, 0.0)) +assert(eqT(-10.0 % 2, 0.0)) +assert(eqT(-10.0 % -2, 0.0)) +assert(math.pi - math.pi % 1 == 3) +assert(math.pi - math.pi % 0.001 == 3.141) + +do -- very small numbers + local i, j = 0, 20000 + while i < j do + local m = (i + j) // 2 + if 10^-m > 0 then + i = m + 1 + else + j = m + end + end + -- 'i' is the smallest possible ten-exponent + local b = 10^-(i - (i // 10)) -- a very small number + assert(b > 0 and b * b == 0) + local delta = b / 1000 + assert(eq((2.1 * b) % (2 * b), (0.1 * b), delta)) + assert(eq((-2.1 * b) % (2 * b), (2 * b) - (0.1 * b), delta)) + assert(eq((2.1 * b) % (-2 * b), (0.1 * b) - (2 * b), delta)) + assert(eq((-2.1 * b) % (-2 * b), (-0.1 * b), delta)) +end + + +-- basic consistency between integer modulo and float modulo +for i = -10, 10 do + for j = -10, 10 do + if j ~= 0 then + assert((i + 0.0) % j == i % j) + end + end +end + +for i = 0, 10 do + for j = -10, 10 do + if j ~= 0 then + assert((2^i) % j == (1 << i) % j) + end + end +end + +do -- precision of module for large numbers + local i = 10 + while (1 << i) > 0 do + assert((1 << i) % 3 == i % 2 + 1) + i = i + 1 + end + + i = 10 + while 2^i < math.huge do + assert(2^i % 3 == i % 2 + 1) + i = i + 1 + end +end + +assert(eqT(minint % minint, 0)) +assert(eqT(maxint % maxint, 0)) +assert((minint + 1) % minint == minint + 1) +assert((maxint - 1) % maxint == maxint - 1) +assert(minint % maxint == maxint - 1) + +assert(minint % -1 == 0) +assert(minint % -2 == 0) +assert(maxint % -2 == -1) + +-- non-portable tests because Windows C library cannot compute +-- fmod(1, huge) correctly +if not _port then + local function anan (x) assert(isNaN(x)) end -- assert Not a Number + anan(0.0 % 0) + anan(1.3 % 0) + anan(math.huge % 1) + anan(math.huge % 1e30) + anan(-math.huge % 1e30) + anan(-math.huge % -1e30) + assert(1 % math.huge == 1) + assert(1e30 % math.huge == 1e30) + assert(1e30 % -math.huge == -math.huge) + assert(-1 % math.huge == math.huge) + assert(-1 % -math.huge == -1) +end + + +-- testing unsigned comparisons +assert(math.ult(3, 4)) +assert(not math.ult(4, 4)) +assert(math.ult(-2, -1)) +assert(math.ult(2, -1)) +assert(not math.ult(-2, -2)) +assert(math.ult(maxint, minint)) +assert(not math.ult(minint, maxint)) + + +assert(eq(math.sin(-9.8)^2 + math.cos(-9.8)^2, 1)) +assert(eq(math.tan(math.pi/4), 1)) +assert(eq(math.sin(math.pi/2), 1) and eq(math.cos(math.pi/2), 0)) +assert(eq(math.atan(1), math.pi/4) and eq(math.acos(0), math.pi/2) and + eq(math.asin(1), math.pi/2)) +assert(eq(math.deg(math.pi/2), 90) and eq(math.rad(90), math.pi/2)) +assert(math.abs(-10.43) == 10.43) +assert(eqT(math.abs(minint), minint)) +assert(eqT(math.abs(maxint), maxint)) +assert(eqT(math.abs(-maxint), maxint)) +assert(eq(math.atan(1,0), math.pi/2)) +assert(math.fmod(10,3) == 1) +assert(eq(math.sqrt(10)^2, 10)) +assert(eq(math.log(2, 10), math.log(2)/math.log(10))) +assert(eq(math.log(2, 2), 1)) +assert(eq(math.log(9, 3), 2)) +assert(eq(math.exp(0), 1)) +assert(eq(math.sin(10), math.sin(10%(2*math.pi)))) + + +assert(tonumber(' 1.3e-2 ') == 1.3e-2) +assert(tonumber(' -1.00000000000001 ') == -1.00000000000001) + +-- testing constant limits +-- 2^23 = 8388608 +assert(8388609 + -8388609 == 0) +assert(8388608 + -8388608 == 0) +assert(8388607 + -8388607 == 0) + + + +do -- testing floor & ceil + assert(eqT(math.floor(3.4), 3)) + assert(eqT(math.ceil(3.4), 4)) + assert(eqT(math.floor(-3.4), -4)) + assert(eqT(math.ceil(-3.4), -3)) + assert(eqT(math.floor(maxint), maxint)) + assert(eqT(math.ceil(maxint), maxint)) + assert(eqT(math.floor(minint), minint)) + assert(eqT(math.floor(minint + 0.0), minint)) + assert(eqT(math.ceil(minint), minint)) + assert(eqT(math.ceil(minint + 0.0), minint)) + assert(math.floor(1e50) == 1e50) + assert(math.ceil(1e50) == 1e50) + assert(math.floor(-1e50) == -1e50) + assert(math.ceil(-1e50) == -1e50) + for _, p in pairs{31,32,63,64} do + assert(math.floor(2^p) == 2^p) + assert(math.floor(2^p + 0.5) == 2^p) + assert(math.ceil(2^p) == 2^p) + assert(math.ceil(2^p - 0.5) == 2^p) + end + checkerror("number expected", math.floor, {}) + checkerror("number expected", math.ceil, print) + assert(eqT(math.tointeger(minint), minint)) + assert(eqT(math.tointeger(minint .. ""), minint)) + assert(eqT(math.tointeger(maxint), maxint)) + assert(eqT(math.tointeger(maxint .. ""), maxint)) + assert(eqT(math.tointeger(minint + 0.0), minint)) + assert(math.tointeger(0.0 - minint) == nil) + assert(math.tointeger(math.pi) == nil) + assert(math.tointeger(-math.pi) == nil) + assert(math.floor(math.huge) == math.huge) + assert(math.ceil(math.huge) == math.huge) + assert(math.tointeger(math.huge) == nil) + assert(math.floor(-math.huge) == -math.huge) + assert(math.ceil(-math.huge) == -math.huge) + assert(math.tointeger(-math.huge) == nil) + assert(math.tointeger("34.0") == 34) + assert(math.tointeger("34.3") == nil) + assert(math.tointeger({}) == nil) + assert(math.tointeger(0/0) == nil) -- NaN +end + + +-- testing fmod for integers +for i = -6, 6 do + for j = -6, 6 do + if j ~= 0 then + local mi = math.fmod(i, j) + local mf = math.fmod(i + 0.0, j) + assert(mi == mf) + assert(math.type(mi) == 'integer' and math.type(mf) == 'float') + if (i >= 0 and j >= 0) or (i <= 0 and j <= 0) or mi == 0 then + assert(eqT(mi, i % j)) + end + end + end +end +assert(eqT(math.fmod(minint, minint), 0)) +assert(eqT(math.fmod(maxint, maxint), 0)) +assert(eqT(math.fmod(minint + 1, minint), minint + 1)) +assert(eqT(math.fmod(maxint - 1, maxint), maxint - 1)) + +checkerror("zero", math.fmod, 3, 0) + + +do -- testing max/min + checkerror("value expected", math.max) + checkerror("value expected", math.min) + assert(eqT(math.max(3), 3)) + assert(eqT(math.max(3, 5, 9, 1), 9)) + assert(math.max(maxint, 10e60) == 10e60) + assert(eqT(math.max(minint, minint + 1), minint + 1)) + assert(eqT(math.min(3), 3)) + assert(eqT(math.min(3, 5, 9, 1), 1)) + assert(math.min(3.2, 5.9, -9.2, 1.1) == -9.2) + assert(math.min(1.9, 1.7, 1.72) == 1.7) + assert(math.min(-10e60, minint) == -10e60) + assert(eqT(math.min(maxint, maxint - 1), maxint - 1)) + assert(eqT(math.min(maxint - 2, maxint, maxint - 1), maxint - 2)) +end +-- testing implicit convertions + +local a,b = '10', '20' +assert(a*b == 200 and a+b == 30 and a-b == -10 and a/b == 0.5 and -b == -20) +assert(a == '10' and b == '20') + + +do + print("testing -0 and NaN") + local mz, z = -0.0, 0.0 + assert(mz == z) + assert(1/mz < 0 and 0 < 1/z) + local a = {[mz] = 1} + assert(a[z] == 1 and a[mz] == 1) + a[z] = 2 + assert(a[z] == 2 and a[mz] == 2) + local inf = math.huge * 2 + 1 + mz, z = -1/inf, 1/inf + assert(mz == z) + assert(1/mz < 0 and 0 < 1/z) + local NaN = inf - inf + assert(NaN ~= NaN) + assert(not (NaN < NaN)) + assert(not (NaN <= NaN)) + assert(not (NaN > NaN)) + assert(not (NaN >= NaN)) + assert(not (0 < NaN) and not (NaN < 0)) + local NaN1 = 0/0 + assert(NaN ~= NaN1 and not (NaN <= NaN1) and not (NaN1 <= NaN)) + local a = {} + assert(not pcall(rawset, a, NaN, 1)) + assert(a[NaN] == undef) + a[1] = 1 + assert(not pcall(rawset, a, NaN, 1)) + assert(a[NaN] == undef) + -- strings with same binary representation as 0.0 (might create problems + -- for constant manipulation in the pre-compiler) + local a1, a2, a3, a4, a5 = 0, 0, "\0\0\0\0\0\0\0\0", 0, "\0\0\0\0\0\0\0\0" + assert(a1 == a2 and a2 == a4 and a1 ~= a3) + assert(a3 == a5) +end + + +print("testing 'math.random'") + +local random, max, min = math.random, math.max, math.min + +local function testnear (val, ref, tol) + return (math.abs(val - ref) < ref * tol) +end + + +-- low-level!! For the current implementation of random in Lua, +-- the first call after seed 1007 should return 0x7a7040a5a323c9d6 +do + -- all computations assume at most 32-bit integers + local h = 0x7a7040a5 -- higher half + local l = 0xa323c9d6 -- lower half + + math.randomseed(1007) + -- get the low 'intbits' of the 64-bit expected result + local res = (h << 32 | l) & ~(~0 << intbits) + assert(random(0) == res) + + math.randomseed(1007, 0) + -- using higher bits to generate random floats; (the '% 2^32' converts + -- 32-bit integers to floats as unsigned) + local res + if floatbits <= 32 then + -- get all bits from the higher half + res = (h >> (32 - floatbits)) % 2^32 + else + -- get 32 bits from the higher half and the rest from the lower half + res = (h % 2^32) * 2^(floatbits - 32) + ((l >> (64 - floatbits)) % 2^32) + end + local rand = random() + assert(eq(rand, 0x0.7a7040a5a323c9d6, 2^-floatbits)) + assert(rand * 2^floatbits == res) +end + +math.randomseed() + +do -- test random for floats + local randbits = math.min(floatbits, 64) -- at most 64 random bits + local mult = 2^randbits -- to make random float into an integral + local counts = {} -- counts for bits + for i = 1, randbits do counts[i] = 0 end + local up = -math.huge + local low = math.huge + local rounds = 100 * randbits -- 100 times for each bit + local totalrounds = 0 + ::doagain:: -- will repeat test until we get good statistics + for i = 0, rounds do + local t = random() + assert(0 <= t and t < 1) + up = max(up, t) + low = min(low, t) + assert(t * mult % 1 == 0) -- no extra bits + local bit = i % randbits -- bit to be tested + if (t * 2^bit) % 1 >= 0.5 then -- is bit set? + counts[bit + 1] = counts[bit + 1] + 1 -- increment its count + end + end + totalrounds = totalrounds + rounds + if not (eq(up, 1, 0.001) and eq(low, 0, 0.001)) then + goto doagain + end + -- all bit counts should be near 50% + local expected = (totalrounds / randbits / 2) + for i = 1, randbits do + if not testnear(counts[i], expected, 0.10) then + goto doagain + end + end + print(string.format("float random range in %d calls: [%f, %f]", + totalrounds, low, up)) +end + + +do -- test random for full integers + local up = 0 + local low = 0 + local counts = {} -- counts for bits + for i = 1, intbits do counts[i] = 0 end + local rounds = 100 * intbits -- 100 times for each bit + local totalrounds = 0 + ::doagain:: -- will repeat test until we get good statistics + for i = 0, rounds do + local t = random(0) + up = max(up, t) + low = min(low, t) + local bit = i % intbits -- bit to be tested + -- increment its count if it is set + counts[bit + 1] = counts[bit + 1] + ((t >> bit) & 1) + end + totalrounds = totalrounds + rounds + local lim = maxint >> 10 + if not (maxint - up < lim and low - minint < lim) then + goto doagain + end + -- all bit counts should be near 50% + local expected = (totalrounds / intbits / 2) + for i = 1, intbits do + if not testnear(counts[i], expected, 0.10) then + goto doagain + end + end + print(string.format( + "integer random range in %d calls: [minint + %.0fppm, maxint - %.0fppm]", + totalrounds, (minint - low) / minint * 1e6, + (maxint - up) / maxint * 1e6)) +end + +do + -- test distribution for a dice + local count = {0, 0, 0, 0, 0, 0} + local rep = 200 + local totalrep = 0 + ::doagain:: + for i = 1, rep * 6 do + local r = random(6) + count[r] = count[r] + 1 + end + totalrep = totalrep + rep + for i = 1, 6 do + if not testnear(count[i], totalrep, 0.05) then + goto doagain + end + end +end + +do + local function aux (x1, x2) -- test random for small intervals + local mark = {}; local count = 0 -- to check that all values appeared + while true do + local t = random(x1, x2) + assert(x1 <= t and t <= x2) + if not mark[t] then -- new value + mark[t] = true + count = count + 1 + if count == x2 - x1 + 1 then -- all values appeared; OK + goto ok + end + end + end + ::ok:: + end + + aux(-10,0) + aux(1, 6) + aux(1, 2) + aux(1, 32) + aux(-10, 10) + aux(-10,-10) -- unit set + aux(minint, minint) -- unit set + aux(maxint, maxint) -- unit set + aux(minint, minint + 9) + aux(maxint - 3, maxint) +end + +do + local function aux(p1, p2) -- test random for large intervals + local max = minint + local min = maxint + local n = 100 + local mark = {}; local count = 0 -- to count how many different values + ::doagain:: + for _ = 1, n do + local t = random(p1, p2) + if not mark[t] then -- new value + assert(p1 <= t and t <= p2) + max = math.max(max, t) + min = math.min(min, t) + mark[t] = true + count = count + 1 + end + end + -- at least 80% of values are different + if not (count >= n * 0.8) then + goto doagain + end + -- min and max not too far from formal min and max + local diff = (p2 - p1) >> 4 + if not (min < p1 + diff and max > p2 - diff) then + goto doagain + end + end + aux(0, maxint) + aux(1, maxint) + aux(minint, -1) + aux(minint // 2, maxint // 2) + aux(minint, maxint) + aux(minint + 1, maxint) + aux(minint, maxint - 1) + aux(0, 1 << (intbits - 5)) +end + + +assert(not pcall(random, 1, 2, 3)) -- too many arguments + +-- empty interval +assert(not pcall(random, minint + 1, minint)) +assert(not pcall(random, maxint, maxint - 1)) +assert(not pcall(random, maxint, minint)) + + + +print('OK') diff --git a/source/lua/testes/nextvar.lua b/source/lua/testes/nextvar.lua new file mode 100644 index 0000000..d2306ed --- /dev/null +++ b/source/lua/testes/nextvar.lua @@ -0,0 +1,669 @@ +-- $Id: testes/nextvar.lua $ +-- See Copyright Notice in file all.lua + +print('testing tables, next, and for') + +local function checkerror (msg, f, ...) + local s, err = pcall(f, ...) + assert(not s and string.find(err, msg)) +end + + +local a = {} + +-- make sure table has lots of space in hash part +for i=1,100 do a[i.."+"] = true end +for i=1,100 do a[i.."+"] = undef end +-- fill hash part with numeric indices testing size operator +for i=1,100 do + a[i] = true + assert(#a == i) +end + +-- testing ipairs +local x = 0 +for k,v in ipairs{10,20,30;x=12} do + x = x + 1 + assert(k == x and v == x * 10) +end + +for _ in ipairs{x=12, y=24} do assert(nil) end + +-- test for 'false' x ipair +x = false +local i = 0 +for k,v in ipairs{true,false,true,false} do + i = i + 1 + x = not x + assert(x == v) +end +assert(i == 4) + +-- iterator function is always the same +assert(type(ipairs{}) == 'function' and ipairs{} == ipairs{}) + + +if not T then + (Message or print) + ('\n >>> testC not active: skipping tests for table sizes <<<\n') +else --[ +-- testing table sizes + +local function log2 (x) return math.log(x, 2) end + +local function mp2 (n) -- minimum power of 2 >= n + local mp = 2^math.ceil(log2(n)) + assert(n == 0 or (mp/2 < n and n <= mp)) + return mp +end + +local function fb (n) + local r, nn = T.int2fb(n) + assert(r < 256) + return nn +end + +-- test fb function +for a = 1, 10000 do -- all numbers up to 10^4 + local n = fb(a) + assert(a <= n and n <= a*1.125) +end +local a = 1024 -- plus a few up to 2 ^30 +local lim = 2^30 +while a < lim do + local n = fb(a) + assert(a <= n and n <= a*1.125) + a = math.ceil(a*1.3) +end + + +local function check (t, na, nh) + local a, h = T.querytab(t) + if a ~= na or h ~= nh then + print(na, nh, a, h) + assert(nil) + end +end + + +-- testing C library sizes +do + local s = 0 + for _ in pairs(math) do s = s + 1 end + check(math, 0, mp2(s)) +end + + +-- testing constructor sizes +local lim = 40 +local s = 'return {' +for i=1,lim do + s = s..i..',' + local s = s + for k=0,lim do + local t = load(s..'}', '')() + assert(#t == i) + check(t, fb(i), mp2(k)) + s = string.format('%sa%d=%d,', s, k, k) + end +end + + +-- tests with unknown number of elements +local a = {} +for i=1,lim do a[i] = i end -- build auxiliary table +for k=0,lim do + local a = {table.unpack(a,1,k)} + assert(#a == k) + check(a, k, 0) + a = {1,2,3,table.unpack(a,1,k)} + check(a, k+3, 0) + assert(#a == k + 3) +end + + +-- testing tables dynamically built +local lim = 130 +local a = {}; a[2] = 1; check(a, 0, 1) +a = {}; a[0] = 1; check(a, 0, 1); a[2] = 1; check(a, 0, 2) +a = {}; a[0] = 1; a[1] = 1; check(a, 1, 1) +a = {} +for i = 1,lim do + a[i] = 1 + assert(#a == i) + check(a, mp2(i), 0) +end + +a = {} +for i = 1,lim do + a['a'..i] = 1 + assert(#a == 0) + check(a, 0, mp2(i)) +end + +a = {} +for i=1,16 do a[i] = i end +check(a, 16, 0) +do + for i=1,11 do a[i] = undef end + for i=30,50 do a[i] = true; a[i] = undef end -- force a rehash (?) + check(a, 0, 8) -- 5 elements in the table + a[10] = 1 + for i=30,50 do a[i] = true; a[i] = undef end -- force a rehash (?) + check(a, 0, 8) -- only 6 elements in the table + for i=1,14 do a[i] = true; a[i] = undef end + for i=18,50 do a[i] = true; a[i] = undef end -- force a rehash (?) + check(a, 0, 4) -- only 2 elements ([15] and [16]) +end + +-- reverse filling +for i=1,lim do + local a = {} + for i=i,1,-1 do a[i] = i end -- fill in reverse + check(a, mp2(i), 0) +end + +-- size tests for vararg +lim = 35 +function foo (n, ...) + local arg = {...} + check(arg, n, 0) + assert(select('#', ...) == n) + arg[n+1] = true + check(arg, mp2(n+1), 0) + arg.x = true + check(arg, mp2(n+1), 1) +end +local a = {} +for i=1,lim do a[i] = true; foo(i, table.unpack(a)) end + + +-- Table length with limit smaller than maximum value at array +local a = {} +for i = 1,64 do a[i] = true end -- make its array size 64 +for i = 1,64 do a[i] = nil end -- erase all elements +assert(T.querytab(a) == 64) -- array part has 64 elements +a[32] = true; a[48] = true; -- binary search will find these ones +a[51] = true -- binary search will miss this one +assert(#a == 48) -- this will set the limit +assert(select(4, T.querytab(a)) == 48) -- this is the limit now +a[50] = true -- this will set a new limit +assert(select(4, T.querytab(a)) == 50) -- this is the limit now +-- but the size is larger (and still inside the array part) +assert(#a == 51) + +end --] + + +-- test size operation on tables with nils +assert(#{} == 0) +assert(#{nil} == 0) +assert(#{nil, nil} == 0) +assert(#{nil, nil, nil} == 0) +assert(#{nil, nil, nil, nil} == 0) +assert(#{1, 2, 3, nil, nil} == 3) +print'+' + + +local nofind = {} + +a,b,c = 1,2,3 +a,b,c = nil + + +-- next uses always the same iteraction function +assert(next{} == next{}) + +local function find (name) + local n,v + while 1 do + n,v = next(_G, n) + if not n then return nofind end + assert(_G[n] ~= undef) + if n == name then return v end + end +end + +local function find1 (name) + for n,v in pairs(_G) do + if n==name then return v end + end + return nil -- not found +end + + +assert(print==find("print") and print == find1("print")) +assert(_G["print"]==find("print")) +assert(assert==find1("assert")) +assert(nofind==find("return")) +assert(not find1("return")) +_G["ret" .. "urn"] = undef +assert(nofind==find("return")) +_G["xxx"] = 1 +assert(xxx==find("xxx")) + +-- invalid key to 'next' +checkerror("invalid key", next, {10,20}, 3) + +-- both 'pairs' and 'ipairs' need an argument +checkerror("bad argument", pairs) +checkerror("bad argument", ipairs) + +print('+') + +a = {} +for i=0,10000 do + if math.fmod(i,10) ~= 0 then + a['x'..i] = i + end +end + +n = {n=0} +for i,v in pairs(a) do + n.n = n.n+1 + assert(i and v and a[i] == v) +end +assert(n.n == 9000) +a = nil + +do -- clear global table + local a = {} + for n,v in pairs(_G) do a[n]=v end + for n,v in pairs(a) do + if not package.loaded[n] and type(v) ~= "function" and + not string.find(n, "^[%u_]") then + _G[n] = undef + end + collectgarbage() + end +end + + +-- + +local function checknext (a) + local b = {} + do local k,v = next(a); while k do b[k] = v; k,v = next(a,k) end end + for k,v in pairs(b) do assert(a[k] == v) end + for k,v in pairs(a) do assert(b[k] == v) end +end + +checknext{1,x=1,y=2,z=3} +checknext{1,2,x=1,y=2,z=3} +checknext{1,2,3,x=1,y=2,z=3} +checknext{1,2,3,4,x=1,y=2,z=3} +checknext{1,2,3,4,5,x=1,y=2,z=3} + +assert(#{} == 0) +assert(#{[-1] = 2} == 0) +for i=0,40 do + local a = {} + for j=1,i do a[j]=j end + assert(#a == i) +end + +-- 'maxn' is now deprecated, but it is easily defined in Lua +function table.maxn (t) + local max = 0 + for k in pairs(t) do + max = (type(k) == 'number') and math.max(max, k) or max + end + return max +end + +assert(table.maxn{} == 0) +assert(table.maxn{["1000"] = true} == 0) +assert(table.maxn{["1000"] = true, [24.5] = 3} == 24.5) +assert(table.maxn{[1000] = true} == 1000) +assert(table.maxn{[10] = true, [100*math.pi] = print} == 100*math.pi) + +table.maxn = nil + +-- int overflow +a = {} +for i=0,50 do a[2^i] = true end +assert(a[#a]) + +print('+') + + +do -- testing 'next' with all kinds of keys + local a = { + [1] = 1, -- integer + [1.1] = 2, -- float + ['x'] = 3, -- short string + [string.rep('x', 1000)] = 4, -- long string + [print] = 5, -- C function + [checkerror] = 6, -- Lua function + [coroutine.running()] = 7, -- thread + [true] = 8, -- boolean + [io.stdin] = 9, -- userdata + [{}] = 10, -- table + } + local b = {}; for i = 1, 10 do b[i] = true end + for k, v in pairs(a) do + assert(b[v]); b[v] = undef + end + assert(next(b) == nil) -- 'b' now is empty +end + + +-- erasing values +local t = {[{1}] = 1, [{2}] = 2, [string.rep("x ", 4)] = 3, + [100.3] = 4, [4] = 5} + +local n = 0 +for k, v in pairs( t ) do + n = n+1 + assert(t[k] == v) + t[k] = undef + collectgarbage() + assert(t[k] == undef) +end +assert(n == 5) + + +local function test (a) + assert(not pcall(table.insert, a, 2, 20)); + table.insert(a, 10); table.insert(a, 2, 20); + table.insert(a, 1, -1); table.insert(a, 40); + table.insert(a, #a+1, 50) + table.insert(a, 2, -2) + assert(a[2] ~= undef) + assert(a["2"] == undef) + assert(not pcall(table.insert, a, 0, 20)); + assert(not pcall(table.insert, a, #a + 2, 20)); + assert(table.remove(a,1) == -1) + assert(table.remove(a,1) == -2) + assert(table.remove(a,1) == 10) + assert(table.remove(a,1) == 20) + assert(table.remove(a,1) == 40) + assert(table.remove(a,1) == 50) + assert(table.remove(a,1) == nil) + assert(table.remove(a) == nil) + assert(table.remove(a, #a) == nil) +end + +a = {n=0, [-7] = "ban"} +test(a) +assert(a.n == 0 and a[-7] == "ban") + +a = {[-7] = "ban"}; +test(a) +assert(a.n == nil and #a == 0 and a[-7] == "ban") + +a = {[-1] = "ban"} +test(a) +assert(#a == 0 and table.remove(a) == nil and a[-1] == "ban") + +a = {[0] = "ban"} +assert(#a == 0 and table.remove(a) == "ban" and a[0] == undef) + +table.insert(a, 1, 10); table.insert(a, 1, 20); table.insert(a, 1, -1) +assert(table.remove(a) == 10) +assert(table.remove(a) == 20) +assert(table.remove(a) == -1) +assert(table.remove(a) == nil) + +a = {'c', 'd'} +table.insert(a, 3, 'a') +table.insert(a, 'b') +assert(table.remove(a, 1) == 'c') +assert(table.remove(a, 1) == 'd') +assert(table.remove(a, 1) == 'a') +assert(table.remove(a, 1) == 'b') +assert(table.remove(a, 1) == nil) +assert(#a == 0 and a.n == nil) + +a = {10,20,30,40} +assert(table.remove(a, #a + 1) == nil) +assert(not pcall(table.remove, a, 0)) +assert(a[#a] == 40) +assert(table.remove(a, #a) == 40) +assert(a[#a] == 30) +assert(table.remove(a, 2) == 20) +assert(a[#a] == 30 and #a == 2) + +do -- testing table library with metamethods + local function test (proxy, t) + for i = 1, 10 do + table.insert(proxy, 1, i) + end + assert(#proxy == 10 and #t == 10 and proxy[1] ~= undef) + for i = 1, 10 do + assert(t[i] == 11 - i) + end + table.sort(proxy) + for i = 1, 10 do + assert(t[i] == i and proxy[i] == i) + end + assert(table.concat(proxy, ",") == "1,2,3,4,5,6,7,8,9,10") + for i = 1, 8 do + assert(table.remove(proxy, 1) == i) + end + assert(#proxy == 2 and #t == 2) + local a, b, c = table.unpack(proxy) + assert(a == 9 and b == 10 and c == nil) + end + + -- all virtual + local t = {} + local proxy = setmetatable({}, { + __len = function () return #t end, + __index = t, + __newindex = t, + }) + test(proxy, t) + + -- only __newindex + local count = 0 + t = setmetatable({}, { + __newindex = function (t,k,v) count = count + 1; rawset(t,k,v) end}) + test(t, t) + assert(count == 10) -- after first 10, all other sets are not new + + -- no __newindex + t = setmetatable({}, { + __index = function (_,k) return k + 1 end, + __len = function (_) return 5 end}) + assert(table.concat(t, ";") == "2;3;4;5;6") + +end + + +if not T then + (Message or print) + ('\n >>> testC not active: skipping tests for table library on non-tables <<<\n') +else --[ + local debug = require'debug' + local tab = {10, 20, 30} + local mt = {} + local u = T.newuserdata(0) + checkerror("table expected", table.insert, u, 40) + checkerror("table expected", table.remove, u) + debug.setmetatable(u, mt) + checkerror("table expected", table.insert, u, 40) + checkerror("table expected", table.remove, u) + mt.__index = tab + checkerror("table expected", table.insert, u, 40) + checkerror("table expected", table.remove, u) + mt.__newindex = tab + checkerror("table expected", table.insert, u, 40) + checkerror("table expected", table.remove, u) + mt.__len = function () return #tab end + table.insert(u, 40) + assert(#u == 4 and #tab == 4 and u[4] == 40 and tab[4] == 40) + assert(table.remove(u) == 40) + table.insert(u, 1, 50) + assert(#u == 4 and #tab == 4 and u[4] == 30 and tab[1] == 50) + + mt.__newindex = nil + mt.__len = nil + local tab2 = {} + local u2 = T.newuserdata(0) + debug.setmetatable(u2, {__newindex = function (_, k, v) tab2[k] = v end}) + table.move(u, 1, 4, 1, u2) + assert(#tab2 == 4 and tab2[1] == tab[1] and tab2[4] == tab[4]) + +end -- ] + +print('+') + +a = {} +for i=1,1000 do + a[i] = i; a[i - 1] = undef +end +assert(next(a,nil) == 1000 and next(a,1000) == nil) + +assert(next({}) == nil) +assert(next({}, nil) == nil) + +for a,b in pairs{} do error"not here" end +for i=1,0 do error'not here' end +for i=0,1,-1 do error'not here' end +a = nil; for i=1,1 do assert(not a); a=1 end; assert(a) +a = nil; for i=1,1,-1 do assert(not a); a=1 end; assert(a) + +do + print("testing floats in numeric for") + local a + -- integer count + a = 0; for i=1, 1, 1 do a=a+1 end; assert(a==1) + a = 0; for i=10000, 1e4, -1 do a=a+1 end; assert(a==1) + a = 0; for i=1, 0.99999, 1 do a=a+1 end; assert(a==0) + a = 0; for i=9999, 1e4, -1 do a=a+1 end; assert(a==0) + a = 0; for i=1, 0.99999, -1 do a=a+1 end; assert(a==1) + + -- float count + a = 0; for i=0, 0.999999999, 0.1 do a=a+1 end; assert(a==10) + a = 0; for i=1.0, 1, 1 do a=a+1 end; assert(a==1) + a = 0; for i=-1.5, -1.5, 1 do a=a+1 end; assert(a==1) + a = 0; for i=1e6, 1e6, -1 do a=a+1 end; assert(a==1) + a = 0; for i=1.0, 0.99999, 1 do a=a+1 end; assert(a==0) + a = 0; for i=99999, 1e5, -1.0 do a=a+1 end; assert(a==0) + a = 0; for i=1.0, 0.99999, -1 do a=a+1 end; assert(a==1) +end + +-- conversion +a = 0; for i="10","1","-2" do a=a+1 end; assert(a==5) + +do -- checking types + local c + local function checkfloat (i) + assert(math.type(i) == "float") + c = c + 1 + end + + c = 0; for i = 1.0, 10 do checkfloat(i) end + assert(c == 10) + + c = 0; for i = -1, -10, -1.0 do checkfloat(i) end + assert(c == 10) + + local function checkint (i) + assert(math.type(i) == "integer") + c = c + 1 + end + + local m = math.maxinteger + c = 0; for i = m, m - 10, -1 do checkint(i) end + assert(c == 11) + + c = 0; for i = 1, 10.9 do checkint(i) end + assert(c == 10) + + c = 0; for i = 10, 0.001, -1 do checkint(i) end + assert(c == 10) + + c = 0; for i = 1, "10.8" do checkint(i) end + assert(c == 10) + + c = 0; for i = 9, "3.4", -1 do checkint(i) end + assert(c == 6) + + c = 0; for i = 0, " -3.4 ", -1 do checkint(i) end + assert(c == 4) + + c = 0; for i = 100, "96.3", -2 do checkint(i) end + assert(c == 2) + + c = 0; for i = 1, math.huge do if i > 10 then break end; checkint(i) end + assert(c == 10) + + c = 0; for i = -1, -math.huge, -1 do + if i < -10 then break end; checkint(i) + end + assert(c == 10) + + + for i = math.mininteger, -10e100 do assert(false) end + for i = math.maxinteger, 10e100, -1 do assert(false) end + +end + +collectgarbage() + + +-- testing generic 'for' + +local function f (n, p) + local t = {}; for i=1,p do t[i] = i*10 end + return function (_,n) + if n > 0 then + n = n-1 + return n, table.unpack(t) + end + end, nil, n +end + +local x = 0 +for n,a,b,c,d in f(5,3) do + x = x+1 + assert(a == 10 and b == 20 and c == 30 and d == nil) +end +assert(x == 5) + + + +-- testing __pairs and __ipairs metamethod +a = {} +do + local x,y,z = pairs(a) + assert(type(x) == 'function' and y == a and z == nil) +end + +local function foo (e,i) + assert(e == a) + if i <= 10 then return i+1, i+2 end +end + +local function foo1 (e,i) + i = i + 1 + assert(e == a) + if i <= e.n then return i,a[i] end +end + +setmetatable(a, {__pairs = function (x) return foo, x, 0 end}) + +local i = 0 +for k,v in pairs(a) do + i = i + 1 + assert(k == i and v == k+1) +end + +a.n = 5 +a[3] = 30 + +-- testing ipairs with metamethods +a = {n=10} +setmetatable(a, { __index = function (t,k) + if k <= t.n then return k * 10 end + end}) +i = 0 +for k,v in ipairs(a) do + i = i + 1 + assert(k == i and v == i * 10) +end +assert(i == a.n) + +print"OK" diff --git a/source/lua/testes/pm.lua b/source/lua/testes/pm.lua new file mode 100644 index 0000000..8cc8772 --- /dev/null +++ b/source/lua/testes/pm.lua @@ -0,0 +1,391 @@ +-- $Id: testes/pm.lua $ +-- See Copyright Notice in file all.lua + +print('testing pattern matching') + +local function checkerror (msg, f, ...) + local s, err = pcall(f, ...) + assert(not s and string.find(err, msg)) +end + + +function f(s, p) + local i,e = string.find(s, p) + if i then return string.sub(s, i, e) end +end + +a,b = string.find('', '') -- empty patterns are tricky +assert(a == 1 and b == 0); +a,b = string.find('alo', '') +assert(a == 1 and b == 0) +a,b = string.find('a\0o a\0o a\0o', 'a', 1) -- first position +assert(a == 1 and b == 1) +a,b = string.find('a\0o a\0o a\0o', 'a\0o', 2) -- starts in the midle +assert(a == 5 and b == 7) +a,b = string.find('a\0o a\0o a\0o', 'a\0o', 9) -- starts in the midle +assert(a == 9 and b == 11) +a,b = string.find('a\0a\0a\0a\0\0ab', '\0ab', 2); -- finds at the end +assert(a == 9 and b == 11); +a,b = string.find('a\0a\0a\0a\0\0ab', 'b') -- last position +assert(a == 11 and b == 11) +assert(string.find('a\0a\0a\0a\0\0ab', 'b\0') == nil) -- check ending +assert(string.find('', '\0') == nil) +assert(string.find('alo123alo', '12') == 4) +assert(string.find('alo123alo', '^12') == nil) + +assert(string.match("aaab", ".*b") == "aaab") +assert(string.match("aaa", ".*a") == "aaa") +assert(string.match("b", ".*b") == "b") + +assert(string.match("aaab", ".+b") == "aaab") +assert(string.match("aaa", ".+a") == "aaa") +assert(not string.match("b", ".+b")) + +assert(string.match("aaab", ".?b") == "ab") +assert(string.match("aaa", ".?a") == "aa") +assert(string.match("b", ".?b") == "b") + +assert(f('aloALO', '%l*') == 'alo') +assert(f('aLo_ALO', '%a*') == 'aLo') + +assert(f(" \n\r*&\n\r xuxu \n\n", "%g%g%g+") == "xuxu") + +assert(f('aaab', 'a*') == 'aaa'); +assert(f('aaa', '^.*$') == 'aaa'); +assert(f('aaa', 'b*') == ''); +assert(f('aaa', 'ab*a') == 'aa') +assert(f('aba', 'ab*a') == 'aba') +assert(f('aaab', 'a+') == 'aaa') +assert(f('aaa', '^.+$') == 'aaa') +assert(f('aaa', 'b+') == nil) +assert(f('aaa', 'ab+a') == nil) +assert(f('aba', 'ab+a') == 'aba') +assert(f('a$a', '.$') == 'a') +assert(f('a$a', '.%$') == 'a$') +assert(f('a$a', '.$.') == 'a$a') +assert(f('a$a', '$$') == nil) +assert(f('a$b', 'a$') == nil) +assert(f('a$a', '$') == '') +assert(f('', 'b*') == '') +assert(f('aaa', 'bb*') == nil) +assert(f('aaab', 'a-') == '') +assert(f('aaa', '^.-$') == 'aaa') +assert(f('aabaaabaaabaaaba', 'b.*b') == 'baaabaaabaaab') +assert(f('aabaaabaaabaaaba', 'b.-b') == 'baaab') +assert(f('alo xo', '.o$') == 'xo') +assert(f(' \n isto é assim', '%S%S*') == 'isto') +assert(f(' \n isto é assim', '%S*$') == 'assim') +assert(f(' \n isto é assim', '[a-z]*$') == 'assim') +assert(f('um caracter ? extra', '[^%sa-z]') == '?') +assert(f('', 'a?') == '') +assert(f('á', 'á?') == 'á') +assert(f('ábl', 'á?b?l?') == 'ábl') +assert(f(' ábl', 'á?b?l?') == '') +assert(f('aa', '^aa?a?a') == 'aa') +assert(f(']]]áb', '[^]]') == 'á') +assert(f("0alo alo", "%x*") == "0a") +assert(f("alo alo", "%C+") == "alo alo") +print('+') + + +function f1(s, p) + p = string.gsub(p, "%%([0-9])", function (s) + return "%" .. (tonumber(s)+1) + end) + p = string.gsub(p, "^(^?)", "%1()", 1) + p = string.gsub(p, "($?)$", "()%1", 1) + local t = {string.match(s, p)} + return string.sub(s, t[1], t[#t] - 1) +end + +assert(f1('alo alx 123 b\0o b\0o', '(..*) %1') == "b\0o b\0o") +assert(f1('axz123= 4= 4 34', '(.+)=(.*)=%2 %1') == '3= 4= 4 3') +assert(f1('=======', '^(=*)=%1$') == '=======') +assert(string.match('==========', '^([=]*)=%1$') == nil) + +local function range (i, j) + if i <= j then + return i, range(i+1, j) + end +end + +local abc = string.char(range(0, 127)) .. string.char(range(128, 255)); + +assert(string.len(abc) == 256) + +function strset (p) + local res = {s=''} + string.gsub(abc, p, function (c) res.s = res.s .. c end) + return res.s +end; + +assert(string.len(strset('[\200-\210]')) == 11) + +assert(strset('[a-z]') == "abcdefghijklmnopqrstuvwxyz") +assert(strset('[a-z%d]') == strset('[%da-uu-z]')) +assert(strset('[a-]') == "-a") +assert(strset('[^%W]') == strset('[%w]')) +assert(strset('[]%%]') == '%]') +assert(strset('[a%-z]') == '-az') +assert(strset('[%^%[%-a%]%-b]') == '-[]^ab') +assert(strset('%Z') == strset('[\1-\255]')) +assert(strset('.') == strset('[\1-\255%z]')) +print('+'); + +assert(string.match("alo xyzK", "(%w+)K") == "xyz") +assert(string.match("254 K", "(%d*)K") == "") +assert(string.match("alo ", "(%w*)$") == "") +assert(string.match("alo ", "(%w+)$") == nil) +assert(string.find("(álo)", "%(á") == 1) +local a, b, c, d, e = string.match("âlo alo", "^(((.).).* (%w*))$") +assert(a == 'âlo alo' and b == 'âl' and c == 'â' and d == 'alo' and e == nil) +a, b, c, d = string.match('0123456789', '(.+(.?)())') +assert(a == '0123456789' and b == '' and c == 11 and d == nil) +print('+') + +assert(string.gsub('ülo ülo', 'ü', 'x') == 'xlo xlo') +assert(string.gsub('alo úlo ', ' +$', '') == 'alo úlo') -- trim +assert(string.gsub(' alo alo ', '^%s*(.-)%s*$', '%1') == 'alo alo') -- double trim +assert(string.gsub('alo alo \n 123\n ', '%s+', ' ') == 'alo alo 123 ') +t = "abç d" +a, b = string.gsub(t, '(.)', '%1@') +assert('@'..a == string.gsub(t, '', '@') and b == 5) +a, b = string.gsub('abçd', '(.)', '%0@', 2) +assert(a == 'a@b@çd' and b == 2) +assert(string.gsub('alo alo', '()[al]', '%1') == '12o 56o') +assert(string.gsub("abc=xyz", "(%w*)(%p)(%w+)", "%3%2%1-%0") == + "xyz=abc-abc=xyz") +assert(string.gsub("abc", "%w", "%1%0") == "aabbcc") +assert(string.gsub("abc", "%w+", "%0%1") == "abcabc") +assert(string.gsub('áéí', '$', '\0óú') == 'áéí\0óú') +assert(string.gsub('', '^', 'r') == 'r') +assert(string.gsub('', '$', 'r') == 'r') +print('+') + + +do -- new (5.3.3) semantics for empty matches + assert(string.gsub("a b cd", " *", "-") == "-a-b-c-d-") + + local res = "" + local sub = "a \nbc\t\td" + local i = 1 + for p, e in string.gmatch(sub, "()%s*()") do + res = res .. string.sub(sub, i, p - 1) .. "-" + i = e + end + assert(res == "-a-b-c-d-") +end + + +assert(string.gsub("um (dois) tres (quatro)", "(%(%w+%))", string.upper) == + "um (DOIS) tres (QUATRO)") + +do + local function setglobal (n,v) rawset(_G, n, v) end + string.gsub("a=roberto,roberto=a", "(%w+)=(%w%w*)", setglobal) + assert(_G.a=="roberto" and _G.roberto=="a") +end + +function f(a,b) return string.gsub(a,'.',b) end +assert(string.gsub("trocar tudo em |teste|b| é |beleza|al|", "|([^|]*)|([^|]*)|", f) == + "trocar tudo em bbbbb é alalalalalal") + +local function dostring (s) return load(s, "")() or "" end +assert(string.gsub("alo $a='x'$ novamente $return a$", + "$([^$]*)%$", + dostring) == "alo novamente x") + +x = string.gsub("$x=string.gsub('alo', '.', string.upper)$ assim vai para $return x$", + "$([^$]*)%$", dostring) +assert(x == ' assim vai para ALO') + +t = {} +s = 'a alo jose joao' +r = string.gsub(s, '()(%w+)()', function (a,w,b) + assert(string.len(w) == b-a); + t[a] = b-a; + end) +assert(s == r and t[1] == 1 and t[3] == 3 and t[7] == 4 and t[13] == 4) + + +function isbalanced (s) + return string.find(string.gsub(s, "%b()", ""), "[()]") == nil +end + +assert(isbalanced("(9 ((8))(\0) 7) \0\0 a b ()(c)() a")) +assert(not isbalanced("(9 ((8) 7) a b (\0 c) a")) +assert(string.gsub("alo 'oi' alo", "%b''", '"') == 'alo " alo') + + +local t = {"apple", "orange", "lime"; n=0} +assert(string.gsub("x and x and x", "x", function () t.n=t.n+1; return t[t.n] end) + == "apple and orange and lime") + +t = {n=0} +string.gsub("first second word", "%w%w*", function (w) t.n=t.n+1; t[t.n] = w end) +assert(t[1] == "first" and t[2] == "second" and t[3] == "word" and t.n == 3) + +t = {n=0} +assert(string.gsub("first second word", "%w+", + function (w) t.n=t.n+1; t[t.n] = w end, 2) == "first second word") +assert(t[1] == "first" and t[2] == "second" and t[3] == undef) + +checkerror("invalid replacement value %(a table%)", + string.gsub, "alo", ".", {a = {}}) +checkerror("invalid capture index %%2", string.gsub, "alo", ".", "%2") +checkerror("invalid capture index %%0", string.gsub, "alo", "(%0)", "a") +checkerror("invalid capture index %%1", string.gsub, "alo", "(%1)", "a") +checkerror("invalid use of '%%'", string.gsub, "alo", ".", "%x") + + +if not _soft then + print("big strings") + local a = string.rep('a', 300000) + assert(string.find(a, '^a*.?$')) + assert(not string.find(a, '^a*.?b$')) + assert(string.find(a, '^a-.?$')) + + -- bug in 5.1.2 + a = string.rep('a', 10000) .. string.rep('b', 10000) + assert(not pcall(string.gsub, a, 'b')) +end + +-- recursive nest of gsubs +function rev (s) + return string.gsub(s, "(.)(.+)", function (c,s1) return rev(s1)..c end) +end + +local x = "abcdef" +assert(rev(rev(x)) == x) + + +-- gsub with tables +assert(string.gsub("alo alo", ".", {}) == "alo alo") +assert(string.gsub("alo alo", "(.)", {a="AA", l=""}) == "AAo AAo") +assert(string.gsub("alo alo", "(.).", {a="AA", l="K"}) == "AAo AAo") +assert(string.gsub("alo alo", "((.)(.?))", {al="AA", o=false}) == "AAo AAo") + +assert(string.gsub("alo alo", "().", {'x','yy','zzz'}) == "xyyzzz alo") + +t = {}; setmetatable(t, {__index = function (t,s) return string.upper(s) end}) +assert(string.gsub("a alo b hi", "%w%w+", t) == "a ALO b HI") + + +-- tests for gmatch +local a = 0 +for i in string.gmatch('abcde', '()') do assert(i == a+1); a=i end +assert(a==6) + +t = {n=0} +for w in string.gmatch("first second word", "%w+") do + t.n=t.n+1; t[t.n] = w +end +assert(t[1] == "first" and t[2] == "second" and t[3] == "word") + +t = {3, 6, 9} +for i in string.gmatch ("xuxx uu ppar r", "()(.)%2") do + assert(i == table.remove(t, 1)) +end +assert(#t == 0) + +t = {} +for i,j in string.gmatch("13 14 10 = 11, 15= 16, 22=23", "(%d+)%s*=%s*(%d+)") do + t[tonumber(i)] = tonumber(j) +end +a = 0 +for k,v in pairs(t) do assert(k+1 == v+0); a=a+1 end +assert(a == 3) + + +do -- init parameter in gmatch + local s = 0 + for k in string.gmatch("10 20 30", "%d+", 3) do + s = s + tonumber(k) + end + assert(s == 50) + + s = 0 + for k in string.gmatch("11 21 31", "%d+", -4) do + s = s + tonumber(k) + end + assert(s == 32) + + -- there is an empty string at the end of the subject + s = 0 + for k in string.gmatch("11 21 31", "%w*", 9) do + s = s + 1 + end + assert(s == 1) + + -- there are no empty strings after the end of the subject + s = 0 + for k in string.gmatch("11 21 31", "%w*", 10) do + s = s + 1 + end + assert(s == 0) +end + + +-- tests for `%f' (`frontiers') + +assert(string.gsub("aaa aa a aaa a", "%f[%w]a", "x") == "xaa xa x xaa x") +assert(string.gsub("[[]] [][] [[[[", "%f[[].", "x") == "x[]] x]x] x[[[") +assert(string.gsub("01abc45de3", "%f[%d]", ".") == ".01abc.45de.3") +assert(string.gsub("01abc45 de3x", "%f[%D]%w", ".") == "01.bc45 de3.") +assert(string.gsub("function", "%f[\1-\255]%w", ".") == ".unction") +assert(string.gsub("function", "%f[^\1-\255]", ".") == "function.") + +assert(string.find("a", "%f[a]") == 1) +assert(string.find("a", "%f[^%z]") == 1) +assert(string.find("a", "%f[^%l]") == 2) +assert(string.find("aba", "%f[a%z]") == 3) +assert(string.find("aba", "%f[%z]") == 4) +assert(not string.find("aba", "%f[%l%z]")) +assert(not string.find("aba", "%f[^%l%z]")) + +local i, e = string.find(" alo aalo allo", "%f[%S].-%f[%s].-%f[%S]") +assert(i == 2 and e == 5) +local k = string.match(" alo aalo allo", "%f[%S](.-%f[%s].-%f[%S])") +assert(k == 'alo ') + +local a = {1, 5, 9, 14, 17,} +for k in string.gmatch("alo alo th02 is 1hat", "()%f[%w%d]") do + assert(table.remove(a, 1) == k) +end +assert(#a == 0) + + +-- malformed patterns +local function malform (p, m) + m = m or "malformed" + local r, msg = pcall(string.find, "a", p) + assert(not r and string.find(msg, m)) +end + +malform("(.", "unfinished capture") +malform(".)", "invalid pattern capture") +malform("[a") +malform("[]") +malform("[^]") +malform("[a%]") +malform("[a%") +malform("%b") +malform("%ba") +malform("%") +malform("%f", "missing") + +-- \0 in patterns +assert(string.match("ab\0\1\2c", "[\0-\2]+") == "\0\1\2") +assert(string.match("ab\0\1\2c", "[\0-\0]+") == "\0") +assert(string.find("b$a", "$\0?") == 2) +assert(string.find("abc\0efg", "%\0") == 4) +assert(string.match("abc\0efg\0\1e\1g", "%b\0\1") == "\0efg\0\1e\1") +assert(string.match("abc\0\0\0", "%\0+") == "\0\0\0") +assert(string.match("abc\0\0\0", "%\0%\0?") == "\0\0") + +-- magic char after \0 +assert(string.find("abc\0\0","\0.") == 4) +assert(string.find("abcx\0\0abc\0abc","x\0\0abc\0a.") == 4) + +print('OK') + diff --git a/source/lua/testes/sort.lua b/source/lua/testes/sort.lua new file mode 100644 index 0000000..ef405d9 --- /dev/null +++ b/source/lua/testes/sort.lua @@ -0,0 +1,310 @@ +-- $Id: testes/sort.lua $ +-- See Copyright Notice in file all.lua + +print "testing (parts of) table library" + +print "testing unpack" + +local unpack = table.unpack + +local maxI = math.maxinteger +local minI = math.mininteger + + +local function checkerror (msg, f, ...) + local s, err = pcall(f, ...) + assert(not s and string.find(err, msg)) +end + + +checkerror("wrong number of arguments", table.insert, {}, 2, 3, 4) + +local x,y,z,a,n +a = {}; lim = _soft and 200 or 2000 +for i=1, lim do a[i]=i end +assert(select(lim, unpack(a)) == lim and select('#', unpack(a)) == lim) +x = unpack(a) +assert(x == 1) +x = {unpack(a)} +assert(#x == lim and x[1] == 1 and x[lim] == lim) +x = {unpack(a, lim-2)} +assert(#x == 3 and x[1] == lim-2 and x[3] == lim) +x = {unpack(a, 10, 6)} +assert(next(x) == nil) -- no elements +x = {unpack(a, 11, 10)} +assert(next(x) == nil) -- no elements +x,y = unpack(a, 10, 10) +assert(x == 10 and y == nil) +x,y,z = unpack(a, 10, 11) +assert(x == 10 and y == 11 and z == nil) +a,x = unpack{1} +assert(a==1 and x==nil) +a,x = unpack({1,2}, 1, 1) +assert(a==1 and x==nil) + +do + local maxi = (1 << 31) - 1 -- maximum value for an int (usually) + local mini = -(1 << 31) -- minimum value for an int (usually) + checkerror("too many results", unpack, {}, 0, maxi) + checkerror("too many results", unpack, {}, 1, maxi) + checkerror("too many results", unpack, {}, 0, maxI) + checkerror("too many results", unpack, {}, 1, maxI) + checkerror("too many results", unpack, {}, mini, maxi) + checkerror("too many results", unpack, {}, -maxi, maxi) + checkerror("too many results", unpack, {}, minI, maxI) + unpack({}, maxi, 0) + unpack({}, maxi, 1) + unpack({}, maxI, minI) + pcall(unpack, {}, 1, maxi + 1) + local a, b = unpack({[maxi] = 20}, maxi, maxi) + assert(a == 20 and b == nil) + a, b = unpack({[maxi] = 20}, maxi - 1, maxi) + assert(a == nil and b == 20) + local t = {[maxI - 1] = 12, [maxI] = 23} + a, b = unpack(t, maxI - 1, maxI); assert(a == 12 and b == 23) + a, b = unpack(t, maxI, maxI); assert(a == 23 and b == nil) + a, b = unpack(t, maxI, maxI - 1); assert(a == nil and b == nil) + t = {[minI] = 12.3, [minI + 1] = 23.5} + a, b = unpack(t, minI, minI + 1); assert(a == 12.3 and b == 23.5) + a, b = unpack(t, minI, minI); assert(a == 12.3 and b == nil) + a, b = unpack(t, minI + 1, minI); assert(a == nil and b == nil) +end + +do -- length is not an integer + local t = setmetatable({}, {__len = function () return 'abc' end}) + assert(#t == 'abc') + checkerror("object length is not an integer", table.insert, t, 1) +end + +print "testing pack" + +a = table.pack() +assert(a[1] == undef and a.n == 0) + +a = table.pack(table) +assert(a[1] == table and a.n == 1) + +a = table.pack(nil, nil, nil, nil) +assert(a[1] == nil and a.n == 4) + + +-- testing move +do + + checkerror("table expected", table.move, 1, 2, 3, 4) + + local function eqT (a, b) + for k, v in pairs(a) do assert(b[k] == v) end + for k, v in pairs(b) do assert(a[k] == v) end + end + + local a = table.move({10,20,30}, 1, 3, 2) -- move forward + eqT(a, {10,10,20,30}) + + -- move forward with overlap of 1 + a = table.move({10, 20, 30}, 1, 3, 3) + eqT(a, {10, 20, 10, 20, 30}) + + -- moving to the same table (not being explicit about it) + a = {10, 20, 30, 40} + table.move(a, 1, 4, 2, a) + eqT(a, {10, 10, 20, 30, 40}) + + a = table.move({10,20,30}, 2, 3, 1) -- move backward + eqT(a, {20,30,30}) + + a = {} -- move to new table + assert(table.move({10,20,30}, 1, 3, 1, a) == a) + eqT(a, {10,20,30}) + + a = {} + assert(table.move({10,20,30}, 1, 0, 3, a) == a) -- empty move (no move) + eqT(a, {}) + + a = table.move({10,20,30}, 1, 10, 1) -- move to the same place + eqT(a, {10,20,30}) + + -- moving on the fringes + a = table.move({[maxI - 2] = 1, [maxI - 1] = 2, [maxI] = 3}, + maxI - 2, maxI, -10, {}) + eqT(a, {[-10] = 1, [-9] = 2, [-8] = 3}) + + a = table.move({[minI] = 1, [minI + 1] = 2, [minI + 2] = 3}, + minI, minI + 2, -10, {}) + eqT(a, {[-10] = 1, [-9] = 2, [-8] = 3}) + + a = table.move({45}, 1, 1, maxI) + eqT(a, {45, [maxI] = 45}) + + a = table.move({[maxI] = 100}, maxI, maxI, minI) + eqT(a, {[minI] = 100, [maxI] = 100}) + + a = table.move({[minI] = 100}, minI, minI, maxI) + eqT(a, {[minI] = 100, [maxI] = 100}) + + a = setmetatable({}, { + __index = function (_,k) return k * 10 end, + __newindex = error}) + local b = table.move(a, 1, 10, 3, {}) + eqT(a, {}) + eqT(b, {nil,nil,10,20,30,40,50,60,70,80,90,100}) + + b = setmetatable({""}, { + __index = error, + __newindex = function (t,k,v) + t[1] = string.format("%s(%d,%d)", t[1], k, v) + end}) + table.move(a, 10, 13, 3, b) + assert(b[1] == "(3,100)(4,110)(5,120)(6,130)") + local stat, msg = pcall(table.move, b, 10, 13, 3, b) + assert(not stat and msg == b) +end + +do + -- for very long moves, just check initial accesses and interrupt + -- move with an error + local function checkmove (f, e, t, x, y) + local pos1, pos2 + local a = setmetatable({}, { + __index = function (_,k) pos1 = k end, + __newindex = function (_,k) pos2 = k; error() end, }) + local st, msg = pcall(table.move, a, f, e, t) + assert(not st and not msg and pos1 == x and pos2 == y) + end + checkmove(1, maxI, 0, 1, 0) + checkmove(0, maxI - 1, 1, maxI - 1, maxI) + checkmove(minI, -2, -5, -2, maxI - 6) + checkmove(minI + 1, -1, -2, -1, maxI - 3) + checkmove(minI, -2, 0, minI, 0) -- non overlapping + checkmove(minI + 1, -1, 1, minI + 1, 1) -- non overlapping +end + +checkerror("too many", table.move, {}, 0, maxI, 1) +checkerror("too many", table.move, {}, -1, maxI - 1, 1) +checkerror("too many", table.move, {}, minI, -1, 1) +checkerror("too many", table.move, {}, minI, maxI, 1) +checkerror("wrap around", table.move, {}, 1, maxI, 2) +checkerror("wrap around", table.move, {}, 1, 2, maxI) +checkerror("wrap around", table.move, {}, minI, -2, 2) + + +print"testing sort" + + +-- strange lengths +local a = setmetatable({}, {__len = function () return -1 end}) +assert(#a == -1) +table.sort(a, error) -- should not compare anything +a = setmetatable({}, {__len = function () return maxI end}) +checkerror("too big", table.sort, a) + +-- test checks for invalid order functions +local function check (t) + local function f(a, b) assert(a and b); return true end + checkerror("invalid order function", table.sort, t, f) +end + +check{1,2,3,4} +check{1,2,3,4,5} +check{1,2,3,4,5,6} + + +function check (a, f) + f = f or function (x,y) return x 'alo\0alo\0') +assert('alo' < 'alo\0') +assert('alo\0' > 'alo') +assert('\0' < '\1') +assert('\0\0' < '\0\1') +assert('\1\0a\0a' <= '\1\0a\0a') +assert(not ('\1\0a\0b' <= '\1\0a\0a')) +assert('\0\0\0' < '\0\0\0\0') +assert(not('\0\0\0\0' < '\0\0\0')) +assert('\0\0\0' <= '\0\0\0\0') +assert(not('\0\0\0\0' <= '\0\0\0')) +assert('\0\0\0' <= '\0\0\0') +assert('\0\0\0' >= '\0\0\0') +assert(not ('\0\0b' < '\0\0a\0')) + +-- testing string.sub +assert(string.sub("123456789",2,4) == "234") +assert(string.sub("123456789",7) == "789") +assert(string.sub("123456789",7,6) == "") +assert(string.sub("123456789",7,7) == "7") +assert(string.sub("123456789",0,0) == "") +assert(string.sub("123456789",-10,10) == "123456789") +assert(string.sub("123456789",1,9) == "123456789") +assert(string.sub("123456789",-10,-20) == "") +assert(string.sub("123456789",-1) == "9") +assert(string.sub("123456789",-4) == "6789") +assert(string.sub("123456789",-6, -4) == "456") +assert(string.sub("123456789", mini, -4) == "123456") +assert(string.sub("123456789", mini, maxi) == "123456789") +assert(string.sub("123456789", mini, mini) == "") +assert(string.sub("\000123456789",3,5) == "234") +assert(("\000123456789"):sub(8) == "789") + +-- testing string.find +assert(string.find("123456789", "345") == 3) +a,b = string.find("123456789", "345") +assert(string.sub("123456789", a, b) == "345") +assert(string.find("1234567890123456789", "345", 3) == 3) +assert(string.find("1234567890123456789", "345", 4) == 13) +assert(string.find("1234567890123456789", "346", 4) == nil) +assert(string.find("1234567890123456789", ".45", -9) == 13) +assert(string.find("abcdefg", "\0", 5, 1) == nil) +assert(string.find("", "") == 1) +assert(string.find("", "", 1) == 1) +assert(not string.find("", "", 2)) +assert(string.find('', 'aaa', 1) == nil) +assert(('alo(.)alo'):find('(.)', 1, 1) == 4) + +assert(string.len("") == 0) +assert(string.len("\0\0\0") == 3) +assert(string.len("1234567890") == 10) + +assert(#"" == 0) +assert(#"\0\0\0" == 3) +assert(#"1234567890" == 10) + +-- testing string.byte/string.char +assert(string.byte("a") == 97) +assert(string.byte("\xe4") > 127) +assert(string.byte(string.char(255)) == 255) +assert(string.byte(string.char(0)) == 0) +assert(string.byte("\0") == 0) +assert(string.byte("\0\0alo\0x", -1) == string.byte('x')) +assert(string.byte("ba", 2) == 97) +assert(string.byte("\n\n", 2, -1) == 10) +assert(string.byte("\n\n", 2, 2) == 10) +assert(string.byte("") == nil) +assert(string.byte("hi", -3) == nil) +assert(string.byte("hi", 3) == nil) +assert(string.byte("hi", 9, 10) == nil) +assert(string.byte("hi", 2, 1) == nil) +assert(string.char() == "") +assert(string.char(0, 255, 0) == "\0\255\0") +assert(string.char(0, string.byte("\xe4"), 0) == "\0\xe4\0") +assert(string.char(string.byte("\xe4l\0óu", 1, -1)) == "\xe4l\0óu") +assert(string.char(string.byte("\xe4l\0óu", 1, 0)) == "") +assert(string.char(string.byte("\xe4l\0óu", -10, 100)) == "\xe4l\0óu") + +checkerror("out of range", string.char, 256) +checkerror("out of range", string.char, -1) +checkerror("out of range", string.char, math.maxinteger) +checkerror("out of range", string.char, math.mininteger) + +assert(string.upper("ab\0c") == "AB\0C") +assert(string.lower("\0ABCc%$") == "\0abcc%$") +assert(string.rep('teste', 0) == '') +assert(string.rep('tés\00tê', 2) == 'tés\0têtés\000tê') +assert(string.rep('', 10) == '') + +if string.packsize("i") == 4 then + -- result length would be 2^31 (int overflow) + checkerror("too large", string.rep, 'aa', (1 << 30)) + checkerror("too large", string.rep, 'a', (1 << 30), ',') +end + +-- repetitions with separator +assert(string.rep('teste', 0, 'xuxu') == '') +assert(string.rep('teste', 1, 'xuxu') == 'teste') +assert(string.rep('\1\0\1', 2, '\0\0') == '\1\0\1\0\0\1\0\1') +assert(string.rep('', 10, '.') == string.rep('.', 9)) +assert(not pcall(string.rep, "aa", maxi // 2 + 10)) +assert(not pcall(string.rep, "", maxi // 2 + 10, "aa")) + +assert(string.reverse"" == "") +assert(string.reverse"\0\1\2\3" == "\3\2\1\0") +assert(string.reverse"\0001234" == "4321\0") + +for i=0,30 do assert(string.len(string.rep('a', i)) == i) end + +assert(type(tostring(nil)) == 'string') +assert(type(tostring(12)) == 'string') +assert(string.find(tostring{}, 'table:')) +assert(string.find(tostring(print), 'function:')) +assert(#tostring('\0') == 1) +assert(tostring(true) == "true") +assert(tostring(false) == "false") +assert(tostring(-1203) == "-1203") +assert(tostring(1203.125) == "1203.125") +assert(tostring(-0.5) == "-0.5") +assert(tostring(-32767) == "-32767") +if math.tointeger(2147483647) then -- no overflow? (32 bits) + assert(tostring(-2147483647) == "-2147483647") +end +if math.tointeger(4611686018427387904) then -- no overflow? (64 bits) + assert(tostring(4611686018427387904) == "4611686018427387904") + assert(tostring(-4611686018427387904) == "-4611686018427387904") +end + +if tostring(0.0) == "0.0" then -- "standard" coercion float->string + assert('' .. 12 == '12' and 12.0 .. '' == '12.0') + assert(tostring(-1203 + 0.0) == "-1203.0") +else -- compatible coercion + assert(tostring(0.0) == "0") + assert('' .. 12 == '12' and 12.0 .. '' == '12') + assert(tostring(-1203 + 0.0) == "-1203") +end + +do -- tests for '%p' format + -- not much to test, as C does not specify what '%p' does. + -- ("The value of the pointer is converted to a sequence of printing + -- characters, in an implementation-defined manner.") + local null = string.format("%p", nil) + assert(string.format("%p", {}) ~= null) + assert(string.format("%p", 4) == null) + assert(string.format("%p", print) ~= null) + assert(string.format("%p", coroutine.running()) ~= null) + assert(string.format("%p", {}) ~= string.format("%p", {})) + assert(string.format("%p", string.rep("a", 10)) == + string.format("%p", string.rep("a", 10))) -- short strings + assert(string.format("%p", string.rep("a", 300)) ~= + string.format("%p", string.rep("a", 300))) -- long strings + assert(#string.format("%90p", {}) == 90) +end + +x = '"ílo"\n\\' +assert(string.format('%q%s', x, x) == '"\\"ílo\\"\\\n\\\\""ílo"\n\\') +assert(string.format('%q', "\0") == [["\0"]]) +assert(load(string.format('return %q', x))() == x) +x = "\0\1\0023\5\0009" +assert(load(string.format('return %q', x))() == x) +assert(string.format("\0%c\0%c%x\0", string.byte("\xe4"), string.byte("b"), 140) == + "\0\xe4\0b8c\0") +assert(string.format('') == "") +assert(string.format("%c",34)..string.format("%c",48)..string.format("%c",90)..string.format("%c",100) == + string.format("%c%c%c%c", 34, 48, 90, 100)) +assert(string.format("%s\0 is not \0%s", 'not be', 'be') == 'not be\0 is not \0be') +assert(string.format("%%%d %010d", 10, 23) == "%10 0000000023") +assert(tonumber(string.format("%f", 10.3)) == 10.3) +x = string.format('"%-50s"', 'a') +assert(#x == 52) +assert(string.sub(x, 1, 4) == '"a ') + +assert(string.format("-%.20s.20s", string.rep("%", 2000)) == + "-"..string.rep("%", 20)..".20s") +assert(string.format('"-%20s.20s"', string.rep("%", 2000)) == + string.format("%q", "-"..string.rep("%", 2000)..".20s")) + +do + local function checkQ (v) + local s = string.format("%q", v) + local nv = load("return " .. s)() + assert(v == nv and math.type(v) == math.type(nv)) + end + checkQ("\0\0\1\255\u{234}") + checkQ(math.maxinteger) + checkQ(math.mininteger) + checkQ(math.pi) + checkQ(0.1) + checkQ(true) + checkQ(nil) + checkQ(false) + checkQ(math.huge) + checkQ(-math.huge) + assert(string.format("%q", 0/0) == "(0/0)") -- NaN + checkerror("no literal", string.format, "%q", {}) +end + +assert(string.format("\0%s\0", "\0\0\1") == "\0\0\0\1\0") +checkerror("contains zeros", string.format, "%10s", "\0") +checkerror("cannot have modifiers", string.format, "%10q", "1") + +-- format x tostring +assert(string.format("%s %s", nil, true) == "nil true") +assert(string.format("%s %.4s", false, true) == "false true") +assert(string.format("%.3s %.3s", false, true) == "fal tru") +local m = setmetatable({}, {__tostring = function () return "hello" end, + __name = "hi"}) +assert(string.format("%s %.10s", m, m) == "hello hello") +getmetatable(m).__tostring = nil -- will use '__name' from now on +assert(string.format("%.4s", m) == "hi: ") + +getmetatable(m).__tostring = function () return {} end +checkerror("'__tostring' must return a string", tostring, m) + + +assert(string.format("%x", 0.0) == "0") +assert(string.format("%02x", 0.0) == "00") +assert(string.format("%08X", 0xFFFFFFFF) == "FFFFFFFF") +assert(string.format("%+08d", 31501) == "+0031501") +assert(string.format("%+08d", -30927) == "-0030927") + + +do -- longest number that can be formatted + local i = 1 + local j = 10000 + while i + 1 < j do -- binary search for maximum finite float + local m = (i + j) // 2 + if 10^m < math.huge then i = m else j = m end + end + assert(10^i < math.huge and 10^j == math.huge) + local s = string.format('%.99f', -(10^i)) + assert(string.len(s) >= i + 101) + assert(tonumber(s) == -(10^i)) +end + + +-- testing large numbers for format +do -- assume at least 32 bits + local max, min = 0x7fffffff, -0x80000000 -- "large" for 32 bits + assert(string.sub(string.format("%8x", -1), -8) == "ffffffff") + assert(string.format("%x", max) == "7fffffff") + assert(string.sub(string.format("%x", min), -8) == "80000000") + assert(string.format("%d", max) == "2147483647") + assert(string.format("%d", min) == "-2147483648") + assert(string.format("%u", 0xffffffff) == "4294967295") + assert(string.format("%o", 0xABCD) == "125715") + + max, min = 0x7fffffffffffffff, -0x8000000000000000 + if max > 2.0^53 then -- only for 64 bits + assert(string.format("%x", (2^52 | 0) - 1) == "fffffffffffff") + assert(string.format("0x%8X", 0x8f000003) == "0x8F000003") + assert(string.format("%d", 2^53) == "9007199254740992") + assert(string.format("%i", -2^53) == "-9007199254740992") + assert(string.format("%x", max) == "7fffffffffffffff") + assert(string.format("%x", min) == "8000000000000000") + assert(string.format("%d", max) == "9223372036854775807") + assert(string.format("%d", min) == "-9223372036854775808") + assert(string.format("%u", ~(-1 << 64)) == "18446744073709551615") + assert(tostring(1234567890123) == '1234567890123') + end +end + + +do print("testing 'format %a %A'") + local function matchhexa (n) + local s = string.format("%a", n) + -- result matches ISO C requirements + assert(string.find(s, "^%-?0x[1-9a-f]%.?[0-9a-f]*p[-+]?%d+$")) + assert(tonumber(s) == n) -- and has full precision + s = string.format("%A", n) + assert(string.find(s, "^%-?0X[1-9A-F]%.?[0-9A-F]*P[-+]?%d+$")) + assert(tonumber(s) == n) + end + for _, n in ipairs{0.1, -0.1, 1/3, -1/3, 1e30, -1e30, + -45/247, 1, -1, 2, -2, 3e-20, -3e-20} do + matchhexa(n) + end + + assert(string.find(string.format("%A", 0.0), "^0X0%.?0?P%+?0$")) + assert(string.find(string.format("%a", -0.0), "^%-0x0%.?0?p%+?0$")) + + if not _port then -- test inf, -inf, NaN, and -0.0 + assert(string.find(string.format("%a", 1/0), "^inf")) + assert(string.find(string.format("%A", -1/0), "^%-INF")) + assert(string.find(string.format("%a", 0/0), "^%-?nan")) + assert(string.find(string.format("%a", -0.0), "^%-0x0")) + end + + if not pcall(string.format, "%.3a", 0) then + (Message or print)("\n >>> modifiers for format '%a' not available <<<\n") + else + assert(string.find(string.format("%+.2A", 12), "^%+0X%x%.%x0P%+?%d$")) + assert(string.find(string.format("%.4A", -12), "^%-0X%x%.%x000P%+?%d$")) + end +end + + +-- errors in format + +local function check (fmt, msg) + checkerror(msg, string.format, fmt, 10) +end + +local aux = string.rep('0', 600) +check("%100.3d", "too long") +check("%1"..aux..".3d", "too long") +check("%1.100d", "too long") +check("%10.1"..aux.."004d", "too long") +check("%t", "invalid conversion") +check("%"..aux.."d", "repeated flags") +check("%d %d", "no value") + + +assert(load("return 1\n--comment without ending EOL")() == 1) + + +checkerror("table expected", table.concat, 3) +assert(table.concat{} == "") +assert(table.concat({}, 'x') == "") +assert(table.concat({'\0', '\0\1', '\0\1\2'}, '.\0.') == "\0.\0.\0\1.\0.\0\1\2") +local a = {}; for i=1,300 do a[i] = "xuxu" end +assert(table.concat(a, "123").."123" == string.rep("xuxu123", 300)) +assert(table.concat(a, "b", 20, 20) == "xuxu") +assert(table.concat(a, "", 20, 21) == "xuxuxuxu") +assert(table.concat(a, "x", 22, 21) == "") +assert(table.concat(a, "3", 299) == "xuxu3xuxu") +assert(table.concat({}, "x", maxi, maxi - 1) == "") +assert(table.concat({}, "x", mini + 1, mini) == "") +assert(table.concat({}, "x", maxi, mini) == "") +assert(table.concat({[maxi] = "alo"}, "x", maxi, maxi) == "alo") +assert(table.concat({[maxi] = "alo", [maxi - 1] = "y"}, "-", maxi - 1, maxi) + == "y-alo") + +assert(not pcall(table.concat, {"a", "b", {}})) + +a = {"a","b","c"} +assert(table.concat(a, ",", 1, 0) == "") +assert(table.concat(a, ",", 1, 1) == "a") +assert(table.concat(a, ",", 1, 2) == "a,b") +assert(table.concat(a, ",", 2) == "b,c") +assert(table.concat(a, ",", 3) == "c") +assert(table.concat(a, ",", 4) == "") + +if not _port then + + local locales = { "ptb", "pt_BR.iso88591", "ISO-8859-1" } + local function trylocale (w) + for i = 1, #locales do + if os.setlocale(locales[i], w) then + print(string.format("'%s' locale set to '%s'", w, locales[i])) + return locales[i] + end + end + print(string.format("'%s' locale not found", w)) + return false + end + + if trylocale("collate") then + assert("alo" < "álo" and "álo" < "amo") + end + + if trylocale("ctype") then + assert(string.gsub("áéíóú", "%a", "x") == "xxxxx") + assert(string.gsub("áÁéÉ", "%l", "x") == "xÁxÉ") + assert(string.gsub("áÁéÉ", "%u", "x") == "áxéx") + assert(string.upper"áÁé{xuxu}ção" == "ÁÁÉ{XUXU}ÇÃO") + end + + os.setlocale("C") + assert(os.setlocale() == 'C') + assert(os.setlocale(nil, "numeric") == 'C') + +end + + +-- bug in Lua 5.3.2 +-- 'gmatch' iterator does not work across coroutines +do + local f = string.gmatch("1 2 3 4 5", "%d+") + assert(f() == "1") + co = coroutine.wrap(f) + assert(co() == "2") +end + +print('OK') + diff --git a/source/lua/testes/tpack.lua b/source/lua/testes/tpack.lua new file mode 100644 index 0000000..2b9953f --- /dev/null +++ b/source/lua/testes/tpack.lua @@ -0,0 +1,322 @@ +-- $Id: testes/tpack.lua $ +-- See Copyright Notice in file all.lua + +local pack = string.pack +local packsize = string.packsize +local unpack = string.unpack + +print "testing pack/unpack" + +-- maximum size for integers +local NB = 16 + +local sizeshort = packsize("h") +local sizeint = packsize("i") +local sizelong = packsize("l") +local sizesize_t = packsize("T") +local sizeLI = packsize("j") +local sizefloat = packsize("f") +local sizedouble = packsize("d") +local sizenumber = packsize("n") +local little = (pack("i2", 1) == "\1\0") +local align = packsize("!xXi16") + +assert(1 <= sizeshort and sizeshort <= sizeint and sizeint <= sizelong and + sizefloat <= sizedouble) + +print("platform:") +print(string.format( + "\tshort %d, int %d, long %d, size_t %d, float %d, double %d,\n\z + \tlua Integer %d, lua Number %d", + sizeshort, sizeint, sizelong, sizesize_t, sizefloat, sizedouble, + sizeLI, sizenumber)) +print("\t" .. (little and "little" or "big") .. " endian") +print("\talignment: " .. align) + + +-- check errors in arguments +function checkerror (msg, f, ...) + local status, err = pcall(f, ...) + -- print(status, err, msg) + assert(not status and string.find(err, msg)) +end + +-- minimum behavior for integer formats +assert(unpack("B", pack("B", 0xff)) == 0xff) +assert(unpack("b", pack("b", 0x7f)) == 0x7f) +assert(unpack("b", pack("b", -0x80)) == -0x80) + +assert(unpack("H", pack("H", 0xffff)) == 0xffff) +assert(unpack("h", pack("h", 0x7fff)) == 0x7fff) +assert(unpack("h", pack("h", -0x8000)) == -0x8000) + +assert(unpack("L", pack("L", 0xffffffff)) == 0xffffffff) +assert(unpack("l", pack("l", 0x7fffffff)) == 0x7fffffff) +assert(unpack("l", pack("l", -0x80000000)) == -0x80000000) + + +for i = 1, NB do + -- small numbers with signal extension ("\xFF...") + local s = string.rep("\xff", i) + assert(pack("i" .. i, -1) == s) + assert(packsize("i" .. i) == #s) + assert(unpack("i" .. i, s) == -1) + + -- small unsigned number ("\0...\xAA") + s = "\xAA" .. string.rep("\0", i - 1) + assert(pack("I" .. i, 0xAA) == s:reverse()) + assert(unpack(">I" .. i, s:reverse()) == 0xAA) +end + +do + local lnum = 0x13121110090807060504030201 + local s = pack("i" .. i, ("\xFF"):rep(i - sizeLI) .. s:reverse()) == -lnum) + assert(unpack("i" .. i, "\1" .. ("\x00"):rep(i - 1)) + end +end + +for i = 1, sizeLI do + local lstr = "\1\2\3\4\5\6\7\8\9\10\11\12\13" + local lnum = 0x13121110090807060504030201 + local n = lnum & (~(-1 << (i * 8))) + local s = string.sub(lstr, 1, i) + assert(pack("i" .. i, n) == s:reverse()) + assert(unpack(">i" .. i, s:reverse()) == n) +end + +-- sign extension +do + local u = 0xf0 + for i = 1, sizeLI - 1 do + assert(unpack("I"..i, "\xf0"..("\xff"):rep(i - 1)) == u) + u = u * 256 + 0xff + end +end + +-- mixed endianness +do + assert(pack(">i2 i2", "\10\0\0\20") + assert(a == 10 and b == 20) + assert(pack("=i4", 2001) == pack("i4", 2001)) +end + +print("testing invalid formats") + +checkerror("out of limits", pack, "i0", 0) +checkerror("out of limits", pack, "i" .. NB + 1, 0) +checkerror("out of limits", pack, "!" .. NB + 1, 0) +checkerror("%(17%) out of limits %[1,16%]", pack, "Xi" .. NB + 1) +checkerror("invalid format option 'r'", pack, "i3r", 0) +checkerror("16%-byte integer", unpack, "i16", string.rep('\3', 16)) +checkerror("not power of 2", pack, "!4i3", 0); +checkerror("missing size", pack, "c", "") +checkerror("variable%-length format", packsize, "s") +checkerror("variable%-length format", packsize, "z") + +-- overflow in option size (error will be in digit after limit) +checkerror("invalid format", packsize, "c1" .. string.rep("0", 40)) + +if packsize("i") == 4 then + -- result would be 2^31 (2^3 repetitions of 2^28 strings) + local s = string.rep("c268435456", 2^3) + checkerror("too large", packsize, s) + -- one less is OK + s = string.rep("c268435456", 2^3 - 1) .. "c268435455" + assert(packsize(s) == 0x7fffffff) +end + +-- overflow in packing +for i = 1, sizeLI - 1 do + local umax = (1 << (i * 8)) - 1 + local max = umax >> 1 + local min = ~max + checkerror("overflow", pack, "I" .. i, umax + 1) + + checkerror("overflow", pack, ">i" .. i, umax) + checkerror("overflow", pack, ">i" .. i, max + 1) + checkerror("overflow", pack, "i" .. i, pack(">i" .. i, max)) == max) + assert(unpack("I" .. i, pack(">I" .. i, umax)) == umax) +end + +-- Lua integer size +assert(unpack(">j", pack(">j", math.maxinteger)) == math.maxinteger) +assert(unpack("f", 24)) +end + +print "testing pack/unpack of floating-point numbers" + +for _, n in ipairs{0, -1.1, 1.9, 1/0, -1/0, 1e20, -1e20, 0.1, 2000.7} do + assert(unpack("n", pack("n", n)) == n) + assert(unpack("n", pack(">n", n)) == n) + assert(pack("f", n):reverse()) + assert(pack(">d", n) == pack("f", pack(">f", n)) == n) + assert(unpack("d", pack(">d", n)) == n) +end + +print "testing pack/unpack of strings" +do + local s = string.rep("abc", 1000) + assert(pack("zB", s, 247) == s .. "\0\xF7") + local s1, b = unpack("zB", s .. "\0\xF9") + assert(b == 249 and s1 == s) + s1 = pack("s", s) + assert(unpack("s", s1) == s) + + checkerror("does not fit", pack, "s1", s) + + checkerror("contains zeros", pack, "z", "alo\0"); + + checkerror("unfinished string", unpack, "zc10000000", "alo") + + for i = 2, NB do + local s1 = pack("s" .. i, s) + assert(unpack("s" .. i, s1) == s and #s1 == #s + i) + end +end + +do + local x = pack("s", "alo") + checkerror("too short", unpack, "s", x:sub(1, -2)) + checkerror("too short", unpack, "c5", "abcd") + checkerror("out of limits", pack, "s100", "alo") +end + +do + assert(pack("c0", "") == "") + assert(packsize("c0") == 0) + assert(unpack("c0", "") == "") + assert(pack("!4 c6", "abcdef") == "abcdef") + assert(pack("c3", "123") == "123") + assert(pack("c0", "") == "") + assert(pack("c8", "123456") == "123456\0\0") + assert(pack("c88", "") == string.rep("\0", 88)) + assert(pack("c188", "ab") == "ab" .. string.rep("\0", 188 - 2)) + local a, b, c = unpack("!4 z c3", "abcdefghi\0xyz") + assert(a == "abcdefghi" and b == "xyz" and c == 14) + checkerror("longer than", pack, "c3", "1234") +end + + +-- testing multiple types and sequence +do + local x = pack("!8 b Xh i4 i8 c1 Xi8", -12, 100, 200, "\xEC") + assert(#x == packsize(">!8 b Xh i4 i8 c1 Xi8")) + assert(x == "\xf4" .. "\0\0\0" .. + "\0\0\0\100" .. + "\0\0\0\0\0\0\0\xC8" .. + "\xEC" .. "\0\0\0\0\0\0\0") + local a, b, c, d, pos = unpack(">!8 c1 Xh i4 i8 b Xi8 XI XH", x) + assert(a == "\xF4" and b == 100 and c == 200 and d == -20 and (pos - 1) == #x) + + x = pack(">!4 c3 c4 c2 z i4 c5 c2 Xi4", + "abc", "abcd", "xz", "hello", 5, "world", "xy") + assert(x == "abcabcdxzhello\0\0\0\0\0\5worldxy\0") + local a, b, c, d, e, f, g, pos = unpack(">!4 c3 c4 c2 z i4 c5 c2 Xh Xi4", x) + assert(a == "abc" and b == "abcd" and c == "xz" and d == "hello" and + e == 5 and f == "world" and g == "xy" and (pos - 1) % 4 == 0) + + x = pack(" b b Xd b Xb x", 1, 2, 3) + assert(packsize(" b b Xd b Xb x") == 4) + assert(x == "\1\2\3\0") + a, b, c, pos = unpack("bbXdb", x) + assert(a == 1 and b == 2 and c == 3 and pos == #x) + + -- only alignment + assert(packsize("!8 xXi8") == 8) + local pos = unpack("!8 xXi8", "0123456701234567"); assert(pos == 9) + assert(packsize("!8 xXi2") == 2) + local pos = unpack("!8 xXi2", "0123456701234567"); assert(pos == 3) + assert(packsize("!2 xXi2") == 2) + local pos = unpack("!2 xXi2", "0123456701234567"); assert(pos == 3) + assert(packsize("!2 xXi8") == 2) + local pos = unpack("!2 xXi8", "0123456701234567"); assert(pos == 3) + assert(packsize("!16 xXi16") == 16) + local pos = unpack("!16 xXi16", "0123456701234567"); assert(pos == 17) + + checkerror("invalid next option", pack, "X") + checkerror("invalid next option", unpack, "XXi", "") + checkerror("invalid next option", unpack, "X i", "") + checkerror("invalid next option", pack, "Xc1") +end + +do -- testing initial position + local x = pack("i4i4i4i4", 1, 2, 3, 4) + for pos = 1, 16, 4 do + local i, p = unpack("i4", x, pos) + assert(i == pos//4 + 1 and p == pos + 4) + end + + -- with alignment + for pos = 0, 12 do -- will always round position to power of 2 + local i, p = unpack("!4 i4", x, pos + 1) + assert(i == (pos + 3)//4 + 1 and p == i*4 + 1) + end + + -- negative indices + local i, p = unpack("!4 i4", x, -4) + assert(i == 4 and p == 17) + local i, p = unpack("!4 i4", x, -7) + assert(i == 4 and p == 17) + local i, p = unpack("!4 i4", x, -#x) + assert(i == 1 and p == 5) + + -- limits + for i = 1, #x + 1 do + assert(unpack("c0", x, i) == "") + end + checkerror("out of string", unpack, "c0", x, #x + 2) + +end + +print "OK" + diff --git a/source/lua/testes/utf8.lua b/source/lua/testes/utf8.lua new file mode 100644 index 0000000..86ec1b0 --- /dev/null +++ b/source/lua/testes/utf8.lua @@ -0,0 +1,238 @@ +-- $Id: testes/utf8.lua $ +-- See Copyright Notice in file all.lua + +print "testing UTF-8 library" + +local utf8 = require'utf8' + + +local function checkerror (msg, f, ...) + local s, err = pcall(f, ...) + assert(not s and string.find(err, msg)) +end + + +local function len (s) + return #string.gsub(s, "[\x80-\xBF]", "") +end + + +local justone = "^" .. utf8.charpattern .. "$" + +-- 't' is the list of codepoints of 's' +local function checksyntax (s, t) + -- creates a string "return '\u{t[1]}...\u{t[n]}'" + local ts = {"return '"} + for i = 1, #t do ts[i + 1] = string.format("\\u{%x}", t[i]) end + ts[#t + 2] = "'" + ts = table.concat(ts) + -- its execution should result in 's' + assert(assert(load(ts))() == s) +end + +assert(utf8.offset("alo", 5) == nil) +assert(utf8.offset("alo", -4) == nil) + +-- 'check' makes several tests over the validity of string 's'. +-- 't' is the list of codepoints of 's'. +local function check (s, t, nonstrict) + local l = utf8.len(s, 1, -1, nonstrict) + assert(#t == l and len(s) == l) + assert(utf8.char(table.unpack(t)) == s) -- 't' and 's' are equivalent + + assert(utf8.offset(s, 0) == 1) + + checksyntax(s, t) + + -- creates new table with all codepoints of 's' + local t1 = {utf8.codepoint(s, 1, -1, nonstrict)} + assert(#t == #t1) + for i = 1, #t do assert(t[i] == t1[i]) end -- 't' is equal to 't1' + + for i = 1, l do -- for all codepoints + local pi = utf8.offset(s, i) -- position of i-th char + local pi1 = utf8.offset(s, 2, pi) -- position of next char + assert(string.find(string.sub(s, pi, pi1 - 1), justone)) + assert(utf8.offset(s, -1, pi1) == pi) + assert(utf8.offset(s, i - l - 1) == pi) + assert(pi1 - pi == #utf8.char(utf8.codepoint(s, pi, pi, nonstrict))) + for j = pi, pi1 - 1 do + assert(utf8.offset(s, 0, j) == pi) + end + for j = pi + 1, pi1 - 1 do + assert(not utf8.len(s, j)) + end + assert(utf8.len(s, pi, pi, nonstrict) == 1) + assert(utf8.len(s, pi, pi1 - 1, nonstrict) == 1) + assert(utf8.len(s, pi, -1, nonstrict) == l - i + 1) + assert(utf8.len(s, pi1, -1, nonstrict) == l - i) + assert(utf8.len(s, 1, pi, -1, nonstrict) == i) + end + + local i = 0 + for p, c in utf8.codes(s, nonstrict) do + i = i + 1 + assert(c == t[i] and p == utf8.offset(s, i)) + assert(utf8.codepoint(s, p, p, nonstrict) == c) + end + assert(i == #t) + + i = 0 + for c in string.gmatch(s, utf8.charpattern) do + i = i + 1 + assert(c == utf8.char(t[i])) + end + assert(i == #t) + + for i = 1, l do + assert(utf8.offset(s, i) == utf8.offset(s, i - l - 1, #s + 1)) + end + +end + + +do -- error indication in utf8.len + local function check (s, p) + local a, b = utf8.len(s) + assert(not a and b == p) + end + check("abc\xE3def", 4) + check("汉字\x80", #("汉字") + 1) + check("\xF4\x9F\xBF", 1) + check("\xF4\x9F\xBF\xBF", 1) +end + +-- errors in utf8.codes +do + local function errorcodes (s) + checkerror("invalid UTF%-8 code", + function () + for c in utf8.codes(s) do assert(c) end + end) + end + errorcodes("ab\xff") + errorcodes("\u{110000}") +end + +-- error in initial position for offset +checkerror("position out of range", utf8.offset, "abc", 1, 5) +checkerror("position out of range", utf8.offset, "abc", 1, -4) +checkerror("position out of range", utf8.offset, "", 1, 2) +checkerror("position out of range", utf8.offset, "", 1, -1) +checkerror("continuation byte", utf8.offset, "𦧺", 1, 2) +checkerror("continuation byte", utf8.offset, "𦧺", 1, 2) +checkerror("continuation byte", utf8.offset, "\x80", 1) + + + +local s = "hello World" +local t = {string.byte(s, 1, -1)} +for i = 1, utf8.len(s) do assert(t[i] == string.byte(s, i)) end +check(s, t) + +check("汉字/漢字", {27721, 23383, 47, 28450, 23383,}) + +do + local s = "áéí\128" + local t = {utf8.codepoint(s,1,#s - 1)} + assert(#t == 3 and t[1] == 225 and t[2] == 233 and t[3] == 237) + checkerror("invalid UTF%-8 code", utf8.codepoint, s, 1, #s) + checkerror("out of range", utf8.codepoint, s, #s + 1) + t = {utf8.codepoint(s, 4, 3)} + assert(#t == 0) + checkerror("out of range", utf8.codepoint, s, -(#s + 1), 1) + checkerror("out of range", utf8.codepoint, s, 1, #s + 1) + -- surrogates + assert(utf8.codepoint("\u{D7FF}") == 0xD800 - 1) + assert(utf8.codepoint("\u{E000}") == 0xDFFF + 1) + assert(utf8.codepoint("\u{D800}", 1, 1, true) == 0xD800) + assert(utf8.codepoint("\u{DFFF}", 1, 1, true) == 0xDFFF) + assert(utf8.codepoint("\u{7FFFFFFF}", 1, 1, true) == 0x7FFFFFFF) +end + +assert(utf8.char() == "") +assert(utf8.char(0, 97, 98, 99, 1) == "\0abc\1") + +assert(utf8.codepoint(utf8.char(0x10FFFF)) == 0x10FFFF) +assert(utf8.codepoint(utf8.char(0x7FFFFFFF), 1, 1, true) == (1<<31) - 1) + +checkerror("value out of range", utf8.char, 0x7FFFFFFF + 1) +checkerror("value out of range", utf8.char, -1) + +local function invalid (s) + checkerror("invalid UTF%-8 code", utf8.codepoint, s) + assert(not utf8.len(s)) +end + +-- UTF-8 representation for 0x11ffff (value out of valid range) +invalid("\xF4\x9F\xBF\xBF") + +-- surrogates +invalid("\u{D800}") +invalid("\u{DFFF}") + +-- overlong sequences +invalid("\xC0\x80") -- zero +invalid("\xC1\xBF") -- 0x7F (should be coded in 1 byte) +invalid("\xE0\x9F\xBF") -- 0x7FF (should be coded in 2 bytes) +invalid("\xF0\x8F\xBF\xBF") -- 0xFFFF (should be coded in 3 bytes) + + +-- invalid bytes +invalid("\x80") -- continuation byte +invalid("\xBF") -- continuation byte +invalid("\xFE") -- invalid byte +invalid("\xFF") -- invalid byte + + +-- empty string +check("", {}) + +-- minimum and maximum values for each sequence size +s = "\0 \x7F\z + \xC2\x80 \xDF\xBF\z + \xE0\xA0\x80 \xEF\xBF\xBF\z + \xF0\x90\x80\x80 \xF4\x8F\xBF\xBF" +s = string.gsub(s, " ", "") +check(s, {0,0x7F, 0x80,0x7FF, 0x800,0xFFFF, 0x10000,0x10FFFF}) + +do + -- original UTF-8 values + local s = "\u{4000000}\u{7FFFFFFF}" + assert(#s == 12) + check(s, {0x4000000, 0x7FFFFFFF}, true) + + s = "\u{200000}\u{3FFFFFF}" + assert(#s == 10) + check(s, {0x200000, 0x3FFFFFF}, true) + + s = "\u{10000}\u{1fffff}" + assert(#s == 8) + check(s, {0x10000, 0x1FFFFF}, true) +end + +x = "日本語a-4\0éó" +check(x, {26085, 26412, 35486, 97, 45, 52, 0, 233, 243}) + + +-- Supplementary Characters +check("𣲷𠜎𠱓ð¡»ð µ¼ab𠺢", + {0x23CB7, 0x2070E, 0x20C53, 0x2107B, 0x20D7C, 0x61, 0x62, 0x20EA2,}) + +check("𨳊𩶘𦧺𨳒𥄫𤓓\xF4\x8F\xBF\xBF", + {0x28CCA, 0x29D98, 0x269FA, 0x28CD2, 0x2512B, 0x244D3, 0x10ffff}) + + +local i = 0 +for p, c in string.gmatch(x, "()(" .. utf8.charpattern .. ")") do + i = i + 1 + assert(utf8.offset(x, i) == p) + assert(utf8.len(x, p) == utf8.len(x) - i + 1) + assert(utf8.len(c) == 1) + for j = 1, #c - 1 do + assert(utf8.offset(x, 0, p + j - 1) == p) + end +end + +print'ok' + diff --git a/source/lua/testes/vararg.lua b/source/lua/testes/vararg.lua new file mode 100644 index 0000000..44848d2 --- /dev/null +++ b/source/lua/testes/vararg.lua @@ -0,0 +1,151 @@ +-- $Id: testes/vararg.lua $ +-- See Copyright Notice in file all.lua + +print('testing vararg') + +function f(a, ...) + local x = {n = select('#', ...), ...} + for i = 1, x.n do assert(a[i] == x[i]) end + return x.n +end + +function c12 (...) + assert(arg == _G.arg) -- no local 'arg' + local x = {...}; x.n = #x + local res = (x.n==2 and x[1] == 1 and x[2] == 2) + if res then res = 55 end + return res, 2 +end + +function vararg (...) return {n = select('#', ...), ...} end + +local call = function (f, args) return f(table.unpack(args, 1, args.n)) end + +assert(f() == 0) +assert(f({1,2,3}, 1, 2, 3) == 3) +assert(f({"alo", nil, 45, f, nil}, "alo", nil, 45, f, nil) == 5) + +assert(vararg().n == 0) +assert(vararg(nil, nil).n == 2) + +assert(c12(1,2)==55) +a,b = assert(call(c12, {1,2})) +assert(a == 55 and b == 2) +a = call(c12, {1,2;n=2}) +assert(a == 55 and b == 2) +a = call(c12, {1,2;n=1}) +assert(not a) +assert(c12(1,2,3) == false) +local a = vararg(call(next, {_G,nil;n=2})) +local b,c = next(_G) +assert(a[1] == b and a[2] == c and a.n == 2) +a = vararg(call(call, {c12, {1,2}})) +assert(a.n == 2 and a[1] == 55 and a[2] == 2) +a = call(print, {'+'}) +assert(a == nil) + +local t = {1, 10} +function t:f (...) local arg = {...}; return self[...]+#arg end +assert(t:f(1,4) == 3 and t:f(2) == 11) +print('+') + +lim = 20 +local i, a = 1, {} +while i <= lim do a[i] = i+0.3; i=i+1 end + +function f(a, b, c, d, ...) + local more = {...} + assert(a == 1.3 and more[1] == 5.3 and + more[lim-4] == lim+0.3 and not more[lim-3]) +end + +function g(a,b,c) + assert(a == 1.3 and b == 2.3 and c == 3.3) +end + +call(f, a) +call(g, a) + +a = {} +i = 1 +while i <= lim do a[i] = i; i=i+1 end +assert(call(math.max, a) == lim) + +print("+") + + +-- new-style varargs + +function oneless (a, ...) return ... end + +function f (n, a, ...) + local b + assert(arg == _G.arg) -- no local 'arg' + if n == 0 then + local b, c, d = ... + return a, b, c, d, oneless(oneless(oneless(...))) + else + n, b, a = n-1, ..., a + assert(b == ...) + return f(n, a, ...) + end +end + +a,b,c,d,e = assert(f(10,5,4,3,2,1)) +assert(a==5 and b==4 and c==3 and d==2 and e==1) + +a,b,c,d,e = f(4) +assert(a==nil and b==nil and c==nil and d==nil and e==nil) + + +-- varargs for main chunks +f = load[[ return {...} ]] +x = f(2,3) +assert(x[1] == 2 and x[2] == 3 and x[3] == undef) + + +f = load[[ + local x = {...} + for i=1,select('#', ...) do assert(x[i] == select(i, ...)) end + assert(x[select('#', ...)+1] == undef) + return true +]] + +assert(f("a", "b", nil, {}, assert)) +assert(f()) + +a = {select(3, table.unpack{10,20,30,40})} +assert(#a == 2 and a[1] == 30 and a[2] == 40) +a = {select(1)} +assert(next(a) == nil) +a = {select(-1, 3, 5, 7)} +assert(a[1] == 7 and a[2] == undef) +a = {select(-2, 3, 5, 7)} +assert(a[1] == 5 and a[2] == 7 and a[3] == undef) +pcall(select, 10000) +pcall(select, -10000) + + +-- bug in 5.2.2 + +function f(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, +p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, +p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, +p31, p32, p33, p34, p35, p36, p37, p38, p39, p40, +p41, p42, p43, p44, p45, p46, p48, p49, p50, ...) + local a1,a2,a3,a4,a5,a6,a7 + local a8,a9,a10,a11,a12,a13,a14 +end + +-- assertion fail here +f() + +-- missing arguments in tail call +do + local function f(a,b,c) return c, b end + local function g() return f(1,2) end + local a, b = g() + assert(a == nil and b == 2) +end +print('OK') + diff --git a/source/lua/testes/verybig.lua b/source/lua/testes/verybig.lua new file mode 100644 index 0000000..8fb7b13 --- /dev/null +++ b/source/lua/testes/verybig.lua @@ -0,0 +1,152 @@ +-- $Id: testes/verybig.lua $ +-- See Copyright Notice in file all.lua + +print "testing RK" + +-- testing opcodes with RK arguments larger than K limit +local function foo () + local dummy = { + -- fill first 256 entries in table of constants + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, + } + assert(24.5 + 0.6 == 25.1) + local t = {foo = function (self, x) return x + self.x end, x = 10} + t.t = t + assert(t:foo(1.5) == 11.5) + assert(t.t:foo(0.5) == 10.5) -- bug in 5.2 alpha + assert(24.3 == 24.3) + assert((function () return t.x end)() == 10) +end + + +foo() +foo = nil + +if _soft then return 10 end + +print "testing large programs (>64k)" + +-- template to create a very big test file +prog = [[$ + +local a,b + +b = {$1$ + b30009 = 65534, + b30010 = 65535, + b30011 = 65536, + b30012 = 65537, + b30013 = 16777214, + b30014 = 16777215, + b30015 = 16777216, + b30016 = 16777217, + b30017 = 0x7fffff, + b30018 = -0x7fffff, + b30019 = 0x1ffffff, + b30020 = -0x1ffffd, + b30021 = -65534, + b30022 = -65535, + b30023 = -65536, + b30024 = -0xffffff, + b30025 = 15012.5, + $2$ +}; + +assert(b.a50008 == 25004 and b["a11"] == -5.5) +assert(b.a33007 == -16503.5 and b.a50009 == -25004.5) +assert(b["b"..30024] == -0xffffff) + +function b:xxx (a,b) return a+b end +assert(b:xxx(10, 12) == 22) -- pushself with non-constant index +b["xxx"] = undef + +s = 0; n=0 +for a,b in pairs(b) do s=s+b; n=n+1 end +-- with 32-bit floats, exact value of 's' depends on summation order +assert(81800000.0 < s and s < 81860000 and n == 70001) + +a = nil; b = nil +print'+' + +function f(x) b=x end + +a = f{$3$} or 10 + +assert(a==10) +assert(b[1] == "a10" and b[2] == 5 and b[#b-1] == "a50009") + + +function xxxx (x) return b[x] end + +assert(xxxx(3) == "a11") + +a = nil; b=nil +xxxx = nil + +return 10 + +]] + +-- functions to fill in the $n$ + +local function sig (x) + return (x % 2 == 0) and '' or '-' +end + +F = { +function () -- $1$ + for i=10,50009 do + io.write('a', i, ' = ', sig(i), 5+((i-10)/2), ',\n') + end +end, + +function () -- $2$ + for i=30026,50009 do + io.write('b', i, ' = ', sig(i), 15013+((i-30026)/2), ',\n') + end +end, + +function () -- $3$ + for i=10,50009 do + io.write('"a', i, '", ', sig(i), 5+((i-10)/2), ',\n') + end +end, +} + +file = os.tmpname() +io.output(file) +for s in string.gmatch(prog, "$([^$]+)") do + local n = tonumber(s) + if not n then io.write(s) else F[n]() end +end +io.close() +result = dofile(file) +assert(os.remove(file)) +print'OK' +return result + diff --git a/source/main.c b/source/main.c new file mode 100644 index 0000000..190262e --- /dev/null +++ b/source/main.c @@ -0,0 +1,367 @@ +#include + +#include +#include +#include +#include +#include +#include + +#include "useful.h" + +#include "saltysd_core.h" +#include "saltysd_ipc.h" +#include "saltysd_dynamic.h" + +#include "lua/lua.h" +#include "lua/lstate.h" + +#include "l2c.h" + +u32 __nx_applet_type = AppletType_None; + +static char g_heap[0x8000]; + +Handle orig_main_thread; +void* orig_ctx; +void* orig_saved_lr; + +void __libnx_init(void* ctx, Handle main_thread, void* saved_lr) +{ + extern char* fake_heap_start; + extern char* fake_heap_end; + + fake_heap_start = &g_heap[0]; + fake_heap_end = &g_heap[sizeof g_heap]; + + orig_ctx = ctx; + orig_main_thread = main_thread; + orig_saved_lr = saved_lr; + + // Call constructors. + void __libc_init_array(void); + __libc_init_array(); +} + +void __attribute__((weak)) NORETURN __libnx_exit(int rc) +{ + // Call destructors. + void __libc_fini_array(void); + __libc_fini_array(); + + SaltySD_printf("SaltySD Plugin: jumping to %p\n", orig_saved_lr); + + __nx_exit(0, orig_saved_lr); +} + +extern uint64_t _ZN2nn2fs8ReadFileEPmNS0_10FileHandleElPvm(uint64_t idk1, uint64_t idk2, uint64_t idk3, uint64_t idk4, uint64_t idk5) LINKABLE; +extern uint64_t _ZN2nn2fs8ReadFileENS0_10FileHandleElPvm(uint64_t handle, uint64_t offset, uint64_t out, uint64_t size) LINKABLE; + +extern uint64_t _ZN2nn4util14DecompressZlibEPvmPKvmS1_m(void * idk1, unsigned long idk2, void const* idk3, unsigned long idk4, void * idk5, unsigned long idk6) LINKABLE; +extern uint64_t _ZN2nn2ro10LoadModuleEPNS0_6ModuleEPKvPvmi(uint64_t *module, void const* idk1, void * idk2, unsigned long idk3, int idk4) LINKABLE; + +uint64_t _ZN2nn4util14DecompressZlibEPvmPKvmS1_m_intercept(void * idk1, unsigned long idk2, void const* idk3, unsigned long idk4, void * idk5, unsigned long idk6) { + uint64_t ret = _ZN2nn4util14DecompressZlibEPvmPKvmS1_m(idk1, idk2, idk3, idk4, idk5, idk6); + SaltySD_printf("SaltySD Plugin: DecompressZlib(%llx, %llx, %llx, %llx, %llx, %llx) -> %llx\n", idk1, idk2, idk3, idk4, idk5, idk6, ret); + return ret; +} + +uint64_t _ZN2nn2ro10LoadModuleEPNS0_6ModuleEPKvPvmi_intercept(uint64_t *module, void const* idk1, void * idk2, unsigned long idk3, int idk4) { + uint64_t ret = _ZN2nn2ro10LoadModuleEPNS0_6ModuleEPKvPvmi(module, idk1, idk2, idk3, idk4); + SaltySD_printf("SaltySD Plugin: nn::ro::LoadModule(%llx, %llx, %llx, %llx, %llx) -> %llx\n", module, idk1, idk2, idk3, idk4, ret); + return ret; +} + +uint64_t ReadFile_intercept(uint64_t idk1, uint64_t idk2, uint64_t idk3, uint64_t idk4, uint64_t idk5) +{ + uint64_t ret = _ZN2nn2fs8ReadFileEPmNS0_10FileHandleElPvm(idk1, idk2, idk3, idk4, idk5); + SaltySD_printf("SaltySD Plugin: ReadFile(%llx, %llx, %llx, %llx, %llx) -> %llx\n", idk1, idk2, idk3, idk4, idk5, ret); + return ret; +} + +uint64_t ReadFile_intercept2(uint64_t handle, uint64_t offset, uint64_t out, uint64_t size) +{ + uint64_t ret = _ZN2nn2fs8ReadFileENS0_10FileHandleElPvm(handle, offset, out, size); + SaltySD_printf("SaltySD Plugin: ReadFile2(%llx, %llx, %llx, %llx) -> %llx\n", handle, offset, out, size, ret); + return ret; +} + +float _ZN3app11peachdaikon32PEACH_PEACHDAIKON_DAIKON_1_POWEREv_replace() { + float (*getStitchDamage)() = (float (*)(void)) SaltySDCore_FindSymbol("_ZN3app11peachdaikon32PEACH_PEACHDAIKON_DAIKON_8_POWEREv"); + float stitchDamage = getStitchDamage(); + return stitchDamage*10; +} + +uint64_t attack_code_replace(uint64_t*** arg0, uint64_t arg1) { + /* + arg0 = *(_QWORD *)(v5 + 160) + arg1 = v7 + func = (**(_QWORD **)(v5 + 160) + 104LL) + (*func)(arg0, arg1); + */ + uint64_t (*given_func)(uint64_t, uint64_t) = (uint64_t (*)(uint64_t, uint64_t))((*(*(arg0+160)) + 104)); + return given_func(*(arg0+160), arg1); +} + +void _ZN3app10sv_animcmd6ATTACKEP9lua_State_replace(__int64_t a1) { + // Get necessary functions + // lib::L2CAgent::L2CAgent(L2CAgent*, lua_State *) + __int64_t (*lib_L2CAgent)(__int64_t*, __int64_t) = + (__int64_t (*)(__int64_t*, __int64_t))(SaltySDCore_FindSymbol("_ZN3lib8L2CAgentC2EP9lua_State")); + + // lib::L2CAgent::~L2CAgent(L2CAgent*) + __int64_t (*lib_L2CAgent_del)(__int64_t*) = + (__int64_t (*)(__int64_t*))(SaltySDCore_FindSymbol("_ZN3lib8L2CAgentD2Ev")); + + // L2CAgent *__fastcall lib::L2CAgent::push_lua_stack(L2CAgent *result, const lib::L2CValue *a2) + __int64_t (*lib_L2CAgent_push_lua_stack)(__int64_t, const __int64_t*) = + (__int64_t (*)(__int64_t, const __int64_t*))(SaltySDCore_FindSymbol("_ZN3lib8L2CAgent14push_lua_stackERKNS_8L2CValueE")); + + // pop_lua_stack + // Notes: + // Actually takes three arguments, but the third is given through X8 due to how + // AArch64 treats struct pointers that are used as pass by reference to get the value. + // Thus, my current solution is to use inline ASM before using this to pass the + // last arg. This is done using asm("mov x8, %x0" : : "r"(&popped) : "x8" );, where + // popped is an L2CValue that will be populated by the function. + // FURTHERMORE, this function does NOT actually pop the stack, it only returns the value at the + // position indicated by the second argument. + // This index is either positive, meaning absolute position in the stack, or negative, + // which is more traditional, i.e. -1 is the top of the stack. + __int64_t (*lib_L2CAgent_pop_lua_stack)(__int64_t, int) = + (__int64_t (*)(__int64_t, int))(SaltySDCore_FindSymbol("_ZN3lib8L2CAgent13pop_lua_stackEi")); + + // L2CAgent *__fastcall lib::L2CAgent::clear_lua_stack(L2CAgent *result) + __int64_t (*lib_L2CAgent_clear_lua_stack)(__int64_t) = + (__int64_t (*)(__int64_t))(SaltySDCore_FindSymbol("_ZN3lib8L2CAgent15clear_lua_stackEv")); + + // lib::L2CValue::L2CValue(lib::L2CValue *__hidden this, int) + __int64_t (*lib_L2CValue_L2CValue_int)(__int64_t, __int64_t) = + (__int64_t (*)(__int64_t, __int64_t))(SaltySDCore_FindSymbol("_ZN3lib8L2CValueC1Ei")); + + // lib::L2CValue::L2CValue(lib::L2CValue *__hidden this, float) + __int64_t (*lib_L2CValue_L2CValue_float)(__int64_t, float) = + (__int64_t (*)(__int64_t, float))(SaltySDCore_FindSymbol("_ZN3lib8L2CValueC1Ef")); + + // lib::L2CValue::L2CValue(lib::L2CValue *__hidden this, phx::Hash40) + __int64_t (*_ZN3lib8L2CValueC1EN3phx6Hash40E)(__int64_t, __int64_t) = + (__int64_t (*)(__int64_t, __int64_t))(SaltySDCore_FindSymbol("_ZN3lib8L2CValueC1EN3phx6Hash40E")); + + // lib::L2CValue::L2CValue(lib::L2CValue *__hidden this, bool) + __int64_t (*lib_L2CValue_L2CValue_bool)(__int64_t, bool) = + (__int64_t (*)(__int64_t, bool))(SaltySDCore_FindSymbol("_ZN3lib8L2CValueC1Eb")); + + // lib::L2CValue::~L2CValue(lib::L2CValue *__hidden this) + __int64_t (*lib_L2CValue_L2CValue_del)(__int64_t) = + (__int64_t (*)(__int64_t))(SaltySDCore_FindSymbol("_ZN3lib8L2CValueD1Ev")); + + // app::sv::animcmd::FLASH(lua_State* a1) + __int64_t (*app_sv_animcmd_FLASH)(__int64_t) = + (__int64_t (*)(__int64_t))(SaltySDCore_FindSymbol("_ZN3app10sv_animcmd5FLASHEP9lua_State")); + + // app::sv::animcmd::EFFECT(lua_State* a1) + __int64_t (*app_sv_animcmd_EFFECT)(__int64_t) = + (__int64_t (*)(__int64_t))(SaltySDCore_FindSymbol("_ZN3app10sv_animcmd6EFFECTEP9lua_State")); + + __int64_t v1; // x19 + uint64_t v2; // x9 + uint64_t i; // x8 + + // Instantiate our own L2CAgent with the given lua_State + struct L2CAgent l2c_agent; + lib_L2CAgent(&l2c_agent, a1); + + lua_State* l2c_state = (lua_State*) a1; + + int num_elems = lua_gettop(l2c_state); + /* + struct L2CValue hitboxParams[36]; + for (int i = 35; i >= 0; i--) { + lib_L2CAgent_pop_lua_stack(&l2c_agent, 1, &hitboxParams[i]); + } + + for (int i = 0; i < 36; i++) { + if (i == 3) { + struct L2CValue inject_dmg = {.raw_float = (float)20, .type = L2C_number}; + lib_L2CAgent_push_lua_stack(&l2c_agent, &inject_dmg); + } + else if (i == 4) { + struct L2CValue inject_angle = {.raw = (int)90, .type = L2C_integer}; + lib_L2CAgent_push_lua_stack(&l2c_agent, &inject_angle); + } + else + lib_L2CAgent_push_lua_stack(&l2c_agent, &hitboxParams[i]); + }*/ + + // Replacing a value on the stack: + // Works! :D + /* + struct L2CValue inject_dmg = {.raw_float = (float)20, .type = L2C_number}; + lib_L2CAgent_push_lua_stack(&l2c_agent, &inject_dmg); + lua_replace((lua_State*) l2c_agent.lua_state_agent, 4); + */ + + // Getting and replacing a value on the stack? + struct L2CValue damage; + asm("mov x8, %x0" : : "r"(&damage) : "x8" ); + lib_L2CAgent_pop_lua_stack(&l2c_agent, 4); + struct L2CValue inject_dmg = {.raw_float = ((float)(damage.raw_float) + 10), .type = L2C_number}; + lib_L2CAgent_push_lua_stack(&l2c_agent, &inject_dmg); + lua_replace((lua_State*) l2c_agent.lua_state_agent, 4); + + // PLAN: + // - Iterate through lua_State stack, store all values (in an array?) + // - Pop all values off of the stack + // - Push our own values on the stack + // - Call simple animcmd function with the stack + // - Pop all values off the stack + // - Push the stored values back on the stack in the proper order + + v1 = a1; + u64 attack_code_addr = SaltySDCore_FindSymbol("_ZN3app10sv_animcmd6ATTACKEP9lua_State"); + void (*sub_71019420D0)(__int64_t, __int64_t) = (void (*)(__int64_t, __int64_t))(attack_code_addr + 96); + sub_71019420D0(*(__int64_t *)(*(__int64_t *)(a1 - 8) + 416LL), a1); + + // Test: + + struct Hash40 effectHash1 = {.hash = 0x1446E1363ALL}; + struct Hash40 effectHash2 = {.hash = 0x31ED91FCALL}; + struct L2CValue v33 = {.raw = effectHash1.hash, .type = L2C_hash}; + struct L2CValue v31 = {.raw = effectHash2.hash, .type = L2C_hash}; + struct L2CValue v28 = {.raw = (int)0, .type = L2C_integer}; + struct L2CValue v27 = {.raw_float = (float)8.5, .type = L2C_number}; + struct L2CValue v26 = {.raw = (int)-13, .type = L2C_integer}; + struct L2CValue v25 = {.raw = (int)0, .type = L2C_integer}; + struct L2CValue v24 = {.raw = (int)0, .type = L2C_integer}; + struct L2CValue v23 = {.raw = (int)0, .type = L2C_integer}; + struct L2CValue v22 = {.raw = (int)1, .type = L2C_integer}; + struct L2CValue v21 = {.raw = (int)0, .type = L2C_integer}; + struct L2CValue v20 = {.raw = (int)0, .type = L2C_integer}; + struct L2CValue v19 = {.raw = (int)0, .type = L2C_integer}; + struct L2CValue v18 = {.raw = (int)0, .type = L2C_integer}; + struct L2CValue v17 = {.raw = (int)0, .type = L2C_integer}; + struct L2CValue v16 = {.raw = (int)0, .type = L2C_integer}; + struct L2CValue v15 = {.raw = (bool) 1, .type = L2C_bool}; + lib_L2CAgent_clear_lua_stack(&l2c_agent); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v33); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v31); + + // Test popping then pushing two values. + struct L2CValue v31Popped; + asm("mov x8, %x0" : : "r"(&v31Popped) : "x8" ); + lib_L2CAgent_pop_lua_stack(&l2c_agent, 2); + struct L2CValue v33Popped; + asm("mov x8, %x0" : : "r"(&v33Popped) : "x8" ); + lib_L2CAgent_pop_lua_stack(&l2c_agent, 1); + + //lib_L2CAgent_clear_lua_stack(&l2c_agent); + //lib_L2CAgent_push_lua_stack(&l2c_agent, &v33Popped); + //lib_L2CAgent_push_lua_stack(&l2c_agent, &v31Popped); + + lib_L2CAgent_push_lua_stack(&l2c_agent, &v28); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v27); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v26); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v25); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v24); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v23); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v22); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v21); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v20); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v19); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v18); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v17); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v16); + lib_L2CAgent_push_lua_stack(&l2c_agent, &v15); + + app_sv_animcmd_EFFECT(l2c_agent.lua_state_agent); + + // Push an extra to test popping... Works! + /*struct L2CValue vToPop = {.raw = (bool) 1, .type = L2C_bool}; + lib_L2CAgent_push_lua_stack(&l2c_agent, &vToPop); + struct L2CValue vPopped; + asm("mov x8, %x0" : : "r"(&vPopped) : "x8" ); + lib_L2CAgent_pop_lua_stack(&l2c_agent, 1, &vPopped); + */ + + // clear_lua_stack section + v2 = *(__int64_t *)(v1 + 16); + for ( i = **(__int64_t **)(v1 + 32) + 16LL; v2 < i; v2 = *(__int64_t *)(v1 + 16) ) + { + *(__int64_t *)(v1 + 16) = v2 + 16; + *(__int32_t *)(v2 + 8) = 0; + } + *(__int64_t *)(v1 + 16) = i; + +} + +float _ZN3app11peachdaikon32PEACH_PEACHDAIKON_DAIKON_1_POWEREv_replace_with_arg(float arg1) { + return arg1; +} + +int SaltySD_function_replace_sym(const char* function_sym, u64 new_func) { + u64 addr = SaltySDCore_FindSymbol(function_sym); + return SaltySD_function_replace(addr, new_func); +} + +int SaltySD_function_replace(u64 addr, u64 new_func) { + if (addr) { + SaltySD_Memcpy(addr, "\x49\x00\x00\x58", 4); // LDR X9, .+8 + SaltySD_Memcpy(addr+4, "\x20\x01\x1F\xD6", 4); // BR X9 + SaltySD_Memcpy(addr+8, &new_func, 8); // .dword newaddr + + SaltySD_printf("SaltySD Plugin: forcing function at %llx to jump to %11x\n", addr, new_func); + + return 0; + } + + return -1; +} + +int main(int argc, char *argv[]) +{ + SaltySD_printf("SaltySD Plugin: alive\n"); + + char* ver = "Ver. %d.%d.%d"; + u64 dst_3 = SaltySDCore_findCode(ver, strlen(ver)); + if (dst_3) + { + SaltySD_Memcpy(dst_3, "noice v%d%d%d", 13); + } + + u64 code_start = SaltySDCore_getCodeStart(); + u64 code_size = SaltySDCore_getCodeSize(); + + SaltySD_printf("SaltySD Plugin: code start: %llx, code size: %11x\n", code_start, code_size); + + char* dmgCode = "\xB9\xD8\xA9\x41\x94\xE0\x2B"; + u64 dst_dmg = SaltySDCore_findCode(dmgCode, strlen(dmgCode)); + if (dst_dmg) + { + dst_dmg = dst_dmg + 1; + SaltySD_printf("SaltySD Plugin: found attack damage code at: %llx\n", dst_dmg); + //SaltySD_Memcpy(dst_dmg, "\x40\x0B\x80\x52", 4); // MOV W0, #90 + } + + //SaltySD_function_replace_sym("_ZN3app11peachdaikon32PEACH_PEACHDAIKON_DAIKON_1_POWEREv", &_ZN3app11peachdaikon32PEACH_PEACHDAIKON_DAIKON_1_POWEREv_replace); + u64 addr = SaltySDCore_FindSymbol("_ZN3app11peachdaikon32PEACH_PEACHDAIKON_DAIKON_1_POWEREv"); + if (addr) { + SaltySD_Memcpy(addr, "\x00\x90\x26\x1e", 4); // FMOV S0, #20.0 + SaltySD_Memcpy(addr+4, "\x49\x00\x00\x58", 4); // LDR X9, .+8 + SaltySD_Memcpy(addr+8, "\x20\x01\x1F\xD6", 4); // BR X9 + u64 new_addr = &_ZN3app11peachdaikon32PEACH_PEACHDAIKON_DAIKON_1_POWEREv_replace_with_arg; + SaltySD_Memcpy(addr+12, &new_addr, 8); // .dword newaddr + + SaltySD_printf("SaltySD Plugin: forcing function at %llx to jump to %llx\n", addr, new_addr); + } + + SaltySD_function_replace_sym("_ZN3app10sv_animcmd6ATTACKEP9lua_State", &_ZN3app10sv_animcmd6ATTACKEP9lua_State_replace); + + + SaltySDCore_ReplaceImport("_ZN2nn2fs8ReadFileEPmNS0_10FileHandleElPvm", ReadFile_intercept); + SaltySDCore_ReplaceImport("_ZN2nn2fs8ReadFileENS0_10FileHandleElPvm", ReadFile_intercept2); + SaltySDCore_ReplaceImport("_ZN2nn4util14DecompressZlibEPvmPKvmS1_m", _ZN2nn4util14DecompressZlibEPvmPKvmS1_m_intercept); + SaltySDCore_ReplaceImport("_ZN2nn2ro10LoadModuleEPNS0_6ModuleEPKvPvmi", _ZN2nn2ro10LoadModuleEPNS0_6ModuleEPKvPvmi_intercept); + + __libnx_exit(0); +} + diff --git a/source/saltysd_core.h b/source/saltysd_core.h new file mode 100644 index 0000000..84b43ee --- /dev/null +++ b/source/saltysd_core.h @@ -0,0 +1,12 @@ +#ifndef SALTYSD_CORE_H +#define SALTYSD_CORE_H + +#include + +#include "useful.h" + +extern u64 SaltySDCore_getCodeStart() LINKABLE; +extern u64 SaltySDCore_getCodeSize() LINKABLE; +extern u64 SaltySDCore_findCode(u8* code, size_t size) LINKABLE; + +#endif // SALTYSD_CORE_H diff --git a/source/saltysd_dynamic.h b/source/saltysd_dynamic.h new file mode 100644 index 0000000..33c7e8a --- /dev/null +++ b/source/saltysd_dynamic.h @@ -0,0 +1,17 @@ +#ifndef SALTYSD_DYNAMIC_H +#define SALTYSD_DYNAMIC_H + +#include + +#include "useful.h" + +extern uint64_t SaltySDCore_GetSymbolAddr(void* base, char* name) LINKABLE; +extern uint64_t SaltySDCore_FindSymbol(char* name) LINKABLE; +extern uint64_t SaltySDCore_FindSymbolBuiltin(char* name) LINKABLE; +extern void SaltySDCore_RegisterModule(void* base) LINKABLE; +extern void SaltySDCore_RegisterBuiltinModule(void* base) LINKABLE; +extern void SaltySDCore_DynamicLinkModule(void* base) LINKABLE; +extern void SaltySDCore_ReplaceModuleImport(void* base, char* name, void* new) LINKABLE; +extern void SaltySDCore_ReplaceImport(char* name, void* new) LINKABLE; + +#endif // SALTYSD_DYNAMIC_H diff --git a/source/saltysd_ipc.h b/source/saltysd_ipc.h new file mode 100644 index 0000000..ac263ea --- /dev/null +++ b/source/saltysd_ipc.h @@ -0,0 +1,17 @@ +#ifndef SALTYSD_IPC_H +#define SALTYSD_IPC_H + +#include + +#include "useful.h" + +extern void SaltySD_Init() LINKABLE; +extern Result SaltySD_Deinit() LINKABLE; +extern Result SaltySD_Term() LINKABLE; +extern Result SaltySD_Restore() LINKABLE; +extern Result SaltySD_LoadELF(u64 heap, u64* elf_addr, u64* elf_size, char* name) LINKABLE; +extern Result SaltySD_Memcpy(u64 to, u64 from, u64 size) LINKABLE; +extern Result SaltySD_GetSDCard(Handle *retrieve) LINKABLE; +extern Result SaltySD_printf(const char* format, ...) LINKABLE; + +#endif //SALTYSD_IPC_H diff --git a/source/useful.h b/source/useful.h new file mode 100644 index 0000000..153bb31 --- /dev/null +++ b/source/useful.h @@ -0,0 +1,14 @@ +#ifndef USEFUL_H +#define USEFUL_H + +#include +#include +#include + +#define LINKABLE __attribute__ ((weak)) + +#define debug_log(...) \ + {char log_buf[0x200]; snprintf(log_buf, 0x200, __VA_ARGS__); \ + svcOutputDebugString(log_buf, strlen(log_buf));} + +#endif // USEFUL_H diff --git a/switch.ld b/switch.ld new file mode 100644 index 0000000..0fdfe47 --- /dev/null +++ b/switch.ld @@ -0,0 +1,212 @@ +OUTPUT_ARCH(aarch64) +ENTRY(_start) + +PHDRS +{ + code PT_LOAD FLAGS(5) /* Read | Execute */; + rodata PT_LOAD FLAGS(4) /* Read */; + data PT_LOAD FLAGS(6) /* Read | Write */; + dyn PT_DYNAMIC; +} + +SECTIONS +{ + /* =========== CODE section =========== */ + PROVIDE(__start__ = 0x0); + . = __start__; + + .crt0 : + { + KEEP (*(.crt0)) + . = ALIGN(8); + } :code + + .init : + { + KEEP( *(.init) ) + . = ALIGN(8); + } :code + + .plt : + { + *(.plt) + *(.iplt) + . = ALIGN(8); + } :code + + .text : + { + *(.text.unlikely .text.*_unlikely .text.unlikely.*) + *(.text.exit .text.exit.*) + *(.text.startup .text.startup.*) + *(.text.hot .text.hot.*) + *(.text .stub .text.* .gnu.linkonce.t.*) + . = ALIGN(8); + } :code + + .fini : + { + KEEP( *(.fini) ) + . = ALIGN(8); + } :code + + /* =========== RODATA section =========== */ + . = ALIGN(0x1000); + + .rodata : + { + *(.rodata .rodata.* .gnu.linkonce.r.*) + . = ALIGN(8); + } :rodata + + .eh_frame_hdr : { __eh_frame_hdr_start = .; *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) __eh_frame_hdr_end = .; } :rodata + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) } :rodata + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } :rodata + .gnu_extab : ONLY_IF_RO { *(.gnu_extab*) } : rodata + + .dynamic : { *(.dynamic) } :rodata :dyn + .dynsym : { *(.dynsym) } :rodata + .dynstr : { *(.dynstr) } :rodata + .rela.dyn : { *(.rela.*) } :rodata + .interp : { *(.interp) } :rodata + .hash : { *(.hash) } :rodata + .gnu.hash : { *(.gnu.hash) } :rodata + .gnu.version : { *(.gnu.version) } :rodata + .gnu.version_d : { *(.gnu.version_d) } :rodata + .gnu.version_r : { *(.gnu.version_r) } :rodata + .note.gnu.build-id : { *(.note.gnu.build-id) } :rodata + + /* =========== DATA section =========== */ + . = ALIGN(0x1000); + + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } :data + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } :data + .gnu_extab : ONLY_IF_RW { *(.gnu_extab*) } : data + .exception_ranges : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) } :data + + .tdata ALIGN(8) : + { + __tdata_lma = .; + *(.tdata .tdata.* .gnu.linkonce.td.*) + . = ALIGN(8); + __tdata_lma_end = .; + } :data + + .tbss ALIGN(8) : + { + *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) + . = ALIGN(8); + } :data + + .preinit_array ALIGN(8) : + { + PROVIDE (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE (__preinit_array_end = .); + } :data + + .init_array ALIGN(8) : + { + PROVIDE (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE (__init_array_end = .); + } :data + + .fini_array ALIGN(8) : + { + PROVIDE (__fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE (__fini_array_end = .); + } :data + + .ctors ALIGN(8) : + { + KEEP (*crtbegin.o(.ctors)) /* MUST be first -- GCC requires it */ + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } :data + + .dtors ALIGN(8) : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } :data + + __got_start__ = .; + + .got : { *(.got) *(.igot) } :data + .got.plt : { *(.got.plt) *(.igot.plt) } :data + + __got_end__ = .; + + .data ALIGN(8) : + { + *(.data .data.* .gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + } :data + + __bss_start__ = .; + .bss ALIGN(8) : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(8); + + /* Reserve space for the TLS segment of the main thread */ + __tls_start = .; + . += + SIZEOF(.tdata) + SIZEOF(.tbss); + __tls_end = .; + } : data + __bss_end__ = .; + + __end__ = ABSOLUTE(.) ; + + . = ALIGN(0x1000); + __argdata__ = ABSOLUTE(.) ; + + /* ================== + ==== Metadata ==== + ================== */ + + /* Discard sections that difficult post-processing */ + /DISCARD/ : { *(.group .comment .note) } + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } +} diff --git a/switch.specs b/switch.specs new file mode 100644 index 0000000..4d5fcce --- /dev/null +++ b/switch.specs @@ -0,0 +1,8 @@ +%rename link old_link + +*link: +%(old_link) -T %:getenv(TOPDIR /switch.ld) -pie --gc-sections -z text --build-id=sha1 + +*startfile: +crti%O%s crtbegin%O%s +