From 8f5705f79dc496f4149e5378b6bb3c95bab5d3f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Mich=C3=A1lek?= Date: Thu, 8 Jan 2026 15:58:51 +0100 Subject: [PATCH 1/6] add Lua --- .github/ISSUE_TEMPLATE/bug-report.yml | 1 + .github/workflows/upload_component.yml | 1 + .gitmodules | 4 + .idf_build_apps.toml | 1 + lua/CMakeLists.txt | 42 + lua/Kconfig | 11 + lua/LICENSE | 22 + lua/README.md | 60 ++ lua/examples/lua_example/CMakeLists.txt | 8 + lua/examples/lua_example/README.md | 54 ++ lua/examples/lua_example/main/CMakeLists.txt | 2 + .../lua_example/main/idf_component.yml | 4 + lua/examples/lua_example/main/lua_example.c | 149 ++++ .../lua_example/pytest_lua_example.py | 17 + lua/idf_component.yml | 10 + lua/include/luaconf.h | 816 ++++++++++++++++++ lua/lua | 1 + lua/sbom_lua.yml | 7 + 18 files changed, 1210 insertions(+) create mode 100644 lua/CMakeLists.txt create mode 100644 lua/Kconfig create mode 100644 lua/LICENSE create mode 100644 lua/README.md create mode 100644 lua/examples/lua_example/CMakeLists.txt create mode 100644 lua/examples/lua_example/README.md create mode 100644 lua/examples/lua_example/main/CMakeLists.txt create mode 100644 lua/examples/lua_example/main/idf_component.yml create mode 100644 lua/examples/lua_example/main/lua_example.c create mode 100644 lua/examples/lua_example/pytest_lua_example.py create mode 100644 lua/idf_component.yml create mode 100644 lua/include/luaconf.h create mode 160000 lua/lua create mode 100644 lua/sbom_lua.yml diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 9ec8f4f117..5f3591498e 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -54,6 +54,7 @@ body: - led_strip - libpng - libsodium + - lua - esp_linenoise - network_provisioning - nghttp diff --git a/.github/workflows/upload_component.yml b/.github/workflows/upload_component.yml index b2e1b6c0a0..21a3ad09d2 100644 --- a/.github/workflows/upload_component.yml +++ b/.github/workflows/upload_component.yml @@ -57,6 +57,7 @@ jobs: json_parser led_strip libsodium + lua network_provisioning nghttp onewire_bus diff --git a/.gitmodules b/.gitmodules index 4e208d99a7..cdbf741121 100644 --- a/.gitmodules +++ b/.gitmodules @@ -81,3 +81,7 @@ [submodule "cjson/cJSON"] path = cjson/cJSON url = https://github.com/DaveGamble/cJSON.git + +[submodule "lua/lua"] + path = lua/lua + url = https://github.com/lua/lua.git diff --git a/.idf_build_apps.toml b/.idf_build_apps.toml index 833a709ef1..a131cb4331 100644 --- a/.idf_build_apps.toml +++ b/.idf_build_apps.toml @@ -27,6 +27,7 @@ manifest_file = [ "json_parser/.build-test-rules.yml", "libpng/.build-test-rules.yml", "libsodium/.build-test-rules.yml", + "lua/.build-test-rules.yml", "onewire_bus/.build-test-rules.yml", "pcap/.build-test-rules.yml", "pid_ctrl/.build-test-rules.yml", diff --git a/lua/CMakeLists.txt b/lua/CMakeLists.txt new file mode 100644 index 0000000000..d60c0e58a8 --- /dev/null +++ b/lua/CMakeLists.txt @@ -0,0 +1,42 @@ +idf_component_register( + SRCS + "lua/lapi.c" + "lua/lauxlib.c" + "lua/lbaselib.c" + "lua/lcode.c" + "lua/lctype.c" + "lua/lcorolib.c" + "lua/ldblib.c" + "lua/ldebug.c" + "lua/ldo.c" + "lua/lfunc.c" + "lua/lgc.c" + "lua/linit.c" + "lua/liolib.c" + "lua/llex.c" + "lua/lmathlib.c" + "lua/lmem.c" + "lua/lopcodes.c" + "lua/loadlib.c" + "lua/loslib.c" + "lua/lstate.c" + "lua/ltable.c" + "lua/ltm.c" + "lua/lvm.c" + "lua/lobject.c" + "lua/lparser.c" + "lua/lstrlib.c" + "lua/lstring.c" + "lua/ltablib.c" + "lua/ldump.c" + "lua/lundump.c" + "lua/lutf8lib.c" + "lua/lzio.c" + INCLUDE_DIRS + "include" + "lua" +) + +# Suppress compiler warnings from upstream Lua code +target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-unused-function) + diff --git a/lua/Kconfig b/lua/Kconfig new file mode 100644 index 0000000000..286904cf06 --- /dev/null +++ b/lua/Kconfig @@ -0,0 +1,11 @@ +menu "Lua" + config LUA_MAXSTACK + int "Stack size limit" + default 1000000 + help + 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). + +endmenu diff --git a/lua/LICENSE b/lua/LICENSE new file mode 100644 index 0000000000..f41e9a5123 --- /dev/null +++ b/lua/LICENSE @@ -0,0 +1,22 @@ +Lua is licensed under the MIT license. + +Copyright (C) 1994-2025 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/lua/README.md b/lua/README.md new file mode 100644 index 0000000000..0a18f3402a --- /dev/null +++ b/lua/README.md @@ -0,0 +1,60 @@ +# Lua - ESP-IDF Component + +ESP-IDF component which wraps Lua from upstream repository - https://www.lua.org/ + +This component provides Lua 5.5.0, a powerful, efficient, lightweight, embeddable scripting language. + +## Features + +- Lua 5.5.0 (latest version from upstream) +- Suitable for embedding Lua code inside ESP-IDF applications +- Configurable stack size limit +- MIT license + +## Configuration option + +- `LUA_MAXSTACK` - default value: 1000000 - Limits the size of the Lua stack. + +Modify values: + +```shell +idf.py menuconfig +``` + +## Usage + +This component is suitable for embedding Lua scripts in ESP-IDF applications. For a complete example, see the `examples/lua_example` directory. + +### Basic Usage + +```c +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" + +void run_lua() { + lua_State *L = luaL_newstate(); + luaL_openlibs(L); + + // Run a simple Lua script + if (luaL_dostring(L, "print('Hello from Lua!')") != LUA_OK) { + printf("Error: %s\n", lua_tostring(L, -1)); + } + + lua_close(L); +} +``` + +## Changes to upstream + +This component overrides `luaconf.h` to set `LUA_32BITS` to 1, which is required for ESP32 and other Xtensa/RISC-V architectures. + +## License + +Lua is licensed under the MIT license. See LICENSE file for details. + +## Upstream + +- Lua: https://www.lua.org/ +- Repository: https://github.com/lua/lua + diff --git a/lua/examples/lua_example/CMakeLists.txt b/lua/examples/lua_example/CMakeLists.txt new file mode 100644 index 0000000000..4164a7b77d --- /dev/null +++ b/lua/examples/lua_example/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(lua_example) + +# Create LittleFS partition image +idf_component_register(SRCS "" INCLUDE_DIRS ".") +littlefs_create_partition_image(assets assets FLASH_IN_PROJECT) diff --git a/lua/examples/lua_example/README.md b/lua/examples/lua_example/README.md new file mode 100644 index 0000000000..ee893effe9 --- /dev/null +++ b/lua/examples/lua_example/README.md @@ -0,0 +1,54 @@ +# Lua Example + +This example demonstrates how to embed Lua in an ESP-IDF application. + +## Features + +- **Embedded Lua script execution**: Run Lua code directly from C strings +- **File-based Lua script execution**: Load and execute Lua scripts from LittleFS filesystem +- **Memory tracking**: Monitor memory usage throughout Lua operations +- **Error handling**: Proper error handling and reporting + +## Example Contents + +1. **Simple Embedded Script**: A basic Lua script that calculates and prints a value (answer = 42) +2. **Fibonacci Script**: A Lua script loaded from filesystem that calculates Fibonacci numbers + +## Hardware Requirements + +- Any ESP32 series board (ESP32, ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6, etc.) +- Minimum 4MB flash (for filesystem partition) + +## Configuration + +- The example uses LittleFS to store Lua scripts +- A custom partition table is included with an "assets" partition for Lua scripts + +## Building and Flashing + +```bash +idf.py build flash monitor +``` + +## Expected Output + +``` +I (xxx) lua_example: Lua Example Starting +I (xxx) lua_example: Starting Lua test: Simple Embedded Script +The answer is: 42 +I (xxx) lua_example: End of Lua test: Simple Embedded Script +I (xxx) lua_example: Starting Lua test from file: Fibonacci Script from File +Fibonacci of 10 is: 55 +I (xxx) lua_example: End of Lua test from file: Fibonacci Script from File +I (xxx) lua_example: End of Lua example application. +``` + +## Customization + +You can add your own Lua scripts to the `assets/` directory and execute them from your application code. + +## See Also + +- [Lua Component Documentation](../../README.md) +- [Lua Official Website](https://www.lua.org/) +- [Lua Reference Manual](https://www.lua.org/manual/5.5/) diff --git a/lua/examples/lua_example/main/CMakeLists.txt b/lua/examples/lua_example/main/CMakeLists.txt new file mode 100644 index 0000000000..c4c5b52791 --- /dev/null +++ b/lua/examples/lua_example/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "lua_example.c" + INCLUDE_DIRS ".") diff --git a/lua/examples/lua_example/main/idf_component.yml b/lua/examples/lua_example/main/idf_component.yml new file mode 100644 index 0000000000..c4cacd5a76 --- /dev/null +++ b/lua/examples/lua_example/main/idf_component.yml @@ -0,0 +1,4 @@ +dependencies: + espressif/esp_littlefs: "^1.0.0" + lua/cpp: + path: ${CMAKE_CURRENT_LIST_DIR}/../.. diff --git a/lua/examples/lua_example/main/lua_example.c b/lua/examples/lua_example/main/lua_example.c new file mode 100644 index 0000000000..f8f68a1885 --- /dev/null +++ b/lua/examples/lua_example/main/lua_example.c @@ -0,0 +1,149 @@ +/* + * Lua Example + * + * This example demonstrates how to embed Lua in an ESP-IDF application. + * It shows both embedded Lua script execution and loading Lua scripts from + * a filesystem (LittleFS). + */ + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_heap_caps.h" +#include "esp_log.h" +#include "esp_littlefs.h" +#include "esp_vfs.h" +#include + +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" + +#define TAG "lua_example" +#define LUA_FILE_PATH "/assets" + +// Function to log memory usage +static void log_memory_usage(const char *message) +{ + ESP_LOGI(TAG, "Free heap: %d, Min free heap: %d, Largest free block: %d, %s", + heap_caps_get_free_size(MALLOC_CAP_DEFAULT), + heap_caps_get_minimum_free_size(MALLOC_CAP_DEFAULT), + heap_caps_get_largest_free_block(MALLOC_CAP_DEFAULT), + message); +} + +// Initialize and mount the filesystem +static void init_filesystem(void) +{ + ESP_LOGI(TAG, "Initializing LittleFS filesystem"); + + esp_vfs_littlefs_conf_t conf = { + .base_path = LUA_FILE_PATH, + .partition_label = "assets", + .format_if_mount_failed = true, + .dont_mount = false, + }; + + esp_err_t err = esp_vfs_littlefs_register(&conf); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to mount or format filesystem: %s", esp_err_to_name(err)); + } else { + ESP_LOGI(TAG, "Filesystem mounted at %s", LUA_FILE_PATH); + } +} + +// Function to run a Lua script from file +static void run_lua_file(const char *file_name, const char *test_name) +{ + ESP_LOGI(TAG, "Starting Lua test from file: %s", test_name); + + log_memory_usage("Start of test"); + + lua_State *L = luaL_newstate(); + if (L == NULL) { + ESP_LOGE(TAG, "Failed to create new Lua state"); + return; + } + log_memory_usage("After luaL_newstate"); + + luaL_openlibs(L); + + // Set the Lua module search path + if (luaL_dostring(L, "package.path = package.path .. ';./?.lua;/assets/?.lua'")) { + ESP_LOGE(TAG, "Failed to set package.path: %s", lua_tostring(L, -1)); + lua_pop(L, 1); + } + + log_memory_usage("After luaL_openlibs"); + + // Construct the full file path + char full_path[128]; + snprintf(full_path, sizeof(full_path), LUA_FILE_PATH"/%s", file_name); + + if (luaL_dofile(L, full_path) == LUA_OK) { + lua_pop(L, lua_gettop(L)); + } else { + ESP_LOGE(TAG, "Error running Lua script from file '%s': %s", full_path, lua_tostring(L, -1)); + lua_pop(L, 1); + } + log_memory_usage("After executing Lua script from file"); + + lua_close(L); + log_memory_usage("After lua_close"); + + ESP_LOGI(TAG, "End of Lua test from file: %s", test_name); +} + +// Function to run an embedded Lua script +static void run_embedded_lua_test(const char *lua_script, const char *test_name) +{ + ESP_LOGI(TAG, "Starting Lua test: %s", test_name); + + log_memory_usage("Start of test"); + + lua_State *L = luaL_newstate(); + if (L == NULL) { + ESP_LOGE(TAG, "Failed to create new Lua state"); + return; + } + log_memory_usage("After luaL_newstate"); + + luaL_openlibs(L); + log_memory_usage("After luaL_openlibs"); + + if (luaL_dostring(L, lua_script) == LUA_OK) { + lua_pop(L, lua_gettop(L)); + } else { + ESP_LOGE(TAG, "Error running embedded Lua script: %s", lua_tostring(L, -1)); + lua_pop(L, 1); + } + log_memory_usage("After executing Lua script"); + + lua_close(L); + log_memory_usage("After lua_close"); + + ESP_LOGI(TAG, "End of Lua test: %s", test_name); +} + +void app_main(void) +{ + ESP_LOGI(TAG, "Lua Example Starting"); + + // Initialize and mount the filesystem + init_filesystem(); + + // Test 1: Simple embedded Lua script + const char *simple_script = "answer = 42; print('The answer is: '..answer)"; + run_embedded_lua_test(simple_script, "Simple Embedded Script"); + + // Test 2: Run Lua script from a file (fibonacci.lua) + run_lua_file("fibonacci.lua", "Fibonacci Script from File"); + + ESP_LOGI(TAG, "End of Lua example application."); + + // Prevent the task from ending + while (1) { + vTaskDelay(pdMS_TO_TICKS(1000)); + } +} diff --git a/lua/examples/lua_example/pytest_lua_example.py b/lua/examples/lua_example/pytest_lua_example.py new file mode 100644 index 0000000000..0024c4d530 --- /dev/null +++ b/lua/examples/lua_example/pytest_lua_example.py @@ -0,0 +1,17 @@ +# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Unlicense OR CC0-1.0 + +import pytest +from pytest_embedded import Dut + + +@pytest.mark.generic +def test_lua_example(dut: Dut) -> None: + dut.expect_exact('Lua Example Starting') + dut.expect_exact('Starting Lua test: Simple Embedded Script') + dut.expect_exact('The answer is: 42') + dut.expect_exact('End of Lua test: Simple Embedded Script') + dut.expect_exact('Starting Lua test from file: Fibonacci Script from File') + dut.expect_exact('Fibonacci of 10 is: 55') + dut.expect_exact('End of Lua test from file: Fibonacci Script from File') + dut.expect_exact('End of Lua example application.') diff --git a/lua/idf_component.yml b/lua/idf_component.yml new file mode 100644 index 0000000000..1ec121efcd --- /dev/null +++ b/lua/idf_component.yml @@ -0,0 +1,10 @@ +version: "5.5.0" +description: Lua is a powerful, efficient, lightweight, embeddable scripting language +url: https://github.com/espressif/idf-extra-components/tree/master/lua +repository: https://github.com/espressif/idf-extra-components.git +dependencies: + idf: ">=5.0" +sbom: + manifests: + - path: sbom_lua.yml + dest: lua diff --git a/lua/include/luaconf.h b/lua/include/luaconf.h new file mode 100644 index 0000000000..1ace706cea --- /dev/null +++ b/lua/include/luaconf.h @@ -0,0 +1,816 @@ +/* +** $Id: luaconf.h $ +** Configuration file for Lua +** See Copyright Notice in lua.h +*/ + + +#ifndef luaconf_h +#define luaconf_h + +#include +#include + + +/* +** =================================================================== +** General Configuration File for Lua +** +** Some definitions here can be changed externally, through the compiler +** (e.g., with '-D' options): They are commented out or protected +** by '#if !defined' guards. However, several other definitions +** should be changed directly here, either because they affect the +** Lua ABI (by making the changes here, you ensure that all software +** connected to Lua, such as C libraries, will be compiled with the same +** configuration); or because they are seldom changed. +** +** Search for "@@" to find all configurable definitions. +** =================================================================== +*/ + + +/* +** {==================================================================== +** System Configuration: macros to adapt (if needed) Lua to some +** particular platform, for instance restricting it to C89. +** ===================================================================== +*/ + +/* +@@ 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 + + +/* +** When Posix DLL ('LUA_USE_DLOPEN') is enabled, the Lua stand-alone +** application will try to dynamically link a 'readline' facility +** for its REPL. In that case, LUA_READLINELIB is the name of the +** library it will look for those facilities. If lua.c cannot open +** the specified library, it will generate a warning and then run +** without 'readline'. If that macro is not defined, lua.c will not +** use 'readline'. +*/ +#if defined(LUA_USE_LINUX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ +#define LUA_READLINELIB "libreadline.so" +#endif + + +#if defined(LUA_USE_MACOSX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* MacOS does not need -ldl */ +#define LUA_READLINELIB "libedit.dylib" +#endif + + +#if defined(LUA_USE_IOS) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN +#endif + + +/* +@@ LUAI_IS32INT is true iff 'int' has (at least) 32 bits. +*/ +#define LUAI_IS32INT ((UINT_MAX >> 30) >= 3) + +/* }================================================================== */ + + + +/* +** {================================================================== +** Configuration for Number types. These options should not be +** set externally, because any other code connected to Lua must +** use the same configuration. +** =================================================================== +*/ + +/* +@@ 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 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 + + +/* Default configuration ('long long' and 'double', for 64-bit Lua) */ +#define LUA_INT_DEFAULT LUA_INT_LONGLONG +#define LUA_FLOAT_DEFAULT LUA_FLOAT_DOUBLE + + +/* +@@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. +*/ +#define LUA_32BITS 1 + + +/* +@@ 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 1 +#else +#define LUA_C89_NUMBERS 0 +#endif + + +#if LUA_32BITS /* { */ +/* +** 32-bit integers and 'float' +*/ +#if LUAI_IS32INT /* use 'int' if big enough */ +#define LUA_INT_TYPE LUA_INT_INT +#else /* otherwise use 'long' */ +#define LUA_INT_TYPE LUA_INT_LONG +#endif +#define LUA_FLOAT_TYPE LUA_FLOAT_FLOAT + +#elif LUA_C89_NUMBERS /* }{ */ +/* +** largest types available for C89 ('long' and 'double') +*/ +#define LUA_INT_TYPE LUA_INT_LONG +#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE + +#else /* }{ */ +/* use defaults */ + +#define LUA_INT_TYPE LUA_INT_DEFAULT +#define LUA_FLOAT_TYPE LUA_FLOAT_DEFAULT + +#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 "\\" + +#if !defined(LUA_PATH_DEFAULT) +#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" +#endif + +#if !defined(LUA_CPATH_DEFAULT) +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.dll;" \ + LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \ + LUA_CDIR"loadall.dll;" ".\\?.dll" +#endif + +#else /* }{ */ + +#define LUA_ROOT "/usr/local/" +#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR "/" +#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR "/" + +#if !defined(LUA_PATH_DEFAULT) +#define LUA_PATH_DEFAULT \ + LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \ + "./?.lua;" "./?/init.lua" +#endif + +#if !defined(LUA_CPATH_DEFAULT) +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so" +#endif + +#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(LUA_DIRSEP) + +#if defined(_WIN32) +#define LUA_DIRSEP "\\" +#else +#define LUA_DIRSEP "/" +#endif + +#endif + + +/* +** LUA_IGMARK is a mark to ignore all after it when building the +** module name (e.g., used to build the luaopen_ function name). +** Typically, the suffix after the mark is the module version, +** as in "mod-v1.2.so". +*/ +#define LUA_IGMARK "-" + +/* }================================================================== */ + + +/* +** {================================================================== +** 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; +** nevertheless they are still available here.) +*/ +#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.) +** (These macros were also officially removed in 5.3, but they are still +** available here.) +*/ +#define LUA_COMPAT_APIINTCASTS + + +/* +@@ LUA_COMPAT_LT_LE controls the emulation of the '__le' metamethod +** using '__lt'. +*/ +#define LUA_COMPAT_LT_LE + + +/* +@@ 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. +** (Once more, these macros were officially removed in 5.3, but they are +** still available here.) +*/ +#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) + +#endif /* } */ + +/* }================================================================== */ + + + +/* +** {================================================================== +** Configuration for Numbers (low-level part). +** Change these definitions if no predefined LUA_FLOAT_* / LUA_INT_* +** satisfy your needs. +** =================================================================== +*/ + +/* +@@ LUAI_UACNUMBER is the result of a 'default argument promotion' +@@ over a floating number. +@@ l_floatatt(x) corrects float attribute '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 with the maximum +** number of digits that respects tostring(tonumber(numeral)) == numeral. +** (That would be floor(log10(2^n)), where n is the number of bits in +** the float mantissa.) +@@ LUA_NUMBER_FMT_N is the format for writing floats with the minimum +** number of digits that ensures tonumber(tostring(number)) == number. +** (That would be LUA_NUMBER_FMT+2.) +@@ 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 numeral to a number. +*/ + + +/* The following definitions are good for most cases here */ + +#define l_floor(x) (l_mathop(floor)(x)) + + +/* +@@ 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_floatatt(n) (FLT_##n) + +#define LUAI_UACNUMBER double + +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.7g" +#define LUA_NUMBER_FMT_N "%.9g" + +#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_floatatt(n) (LDBL_##n) + +#define LUAI_UACNUMBER long double + +#define LUA_NUMBER_FRMLEN "L" +#define LUA_NUMBER_FMT "%.19Lg" +#define LUA_NUMBER_FMT_N "%.21Lg" + +#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_floatatt(n) (DBL_##n) + +#define LUAI_UACNUMBER double + +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.15g" +#define LUA_NUMBER_FMT_N "%.17g" + +#define l_mathop(op) op + +#define lua_str2number(s,p) strtod((s), (p)) + +#else /* }{ */ + +#error "numeric float type not defined" + +#endif /* } */ + + + +/* +@@ 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_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 + + +/* 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 + +#define LUA_MAXUNSIGNED UINT_MAX + +#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 + +#define LUA_MAXUNSIGNED ULONG_MAX + +#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 + +#define LUA_MAXUNSIGNED ULLONG_MAX + +#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 + +#define LUA_MAXUNSIGNED _UI64_MAX + +#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 numeral 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 numeral. +** 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 the header 'locale.h'.) +*/ +#if !defined(lua_getlocaledecpoint) +#define lua_getlocaledecpoint() (localeconv()->decimal_point[0]) +#endif + + +/* +** macros to improve jump prediction, used mostly for error handling +** and debug facilities. (Some macros in the Lua API use these macros. +** Define LUA_NOBUILTIN if you do not want '__builtin_expect' in your +** code.) +*/ +#if !defined(luai_likely) + +#if defined(__GNUC__) && !defined(LUA_NOBUILTIN) +#define luai_likely(x) (__builtin_expect(((x) != 0), 1)) +#define luai_unlikely(x) (__builtin_expect(((x) != 0), 0)) +#else +#define luai_likely(x) (x) +#define luai_unlikely(x) (x) +#endif + +#endif + + +#if defined(LUA_CORE) || defined(LUA_LIB) +/* shorter names for Lua's own use */ +#define l_likely(x) luai_likely(x) +#define l_unlikely(x) luai_unlikely(x) +#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. +*/ +/* #define LUA_USE_APICHECK */ + +/* }================================================================== */ + + +/* +** {================================================================== +** 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). +** ===================================================================== +*/ + +/* +@@ 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(int)/2.) +*/ +#if 1000000 < (INT_MAX / 2) +#define LUAI_MAXSTACK CONFIG_LUA_MAXSTACK +#else +#define LUAI_MAXSTACK (INT_MAX / 2u) +#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 initial buffer size used by the lauxlib +** buffer system. +*/ +#define LUAL_BUFFERSIZE ((int)(16 * sizeof(void*) * sizeof(lua_Number))) + + +/* +@@ 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/lua/lua b/lua/lua new file mode 160000 index 0000000000..a5522f06d2 --- /dev/null +++ b/lua/lua @@ -0,0 +1 @@ +Subproject commit a5522f06d2679b8f18534fd6a9968f7eb539dc31 diff --git a/lua/sbom_lua.yml b/lua/sbom_lua.yml new file mode 100644 index 0000000000..655e24fe50 --- /dev/null +++ b/lua/sbom_lua.yml @@ -0,0 +1,7 @@ +name: lua +version: 5.5.0 +cpe: cpe:2.3:a:lua:lua:{}:*:*:*:*:*:*:* +supplier: 'Organization: Lua.org, PUC-Rio ' +description: Lua is a powerful, efficient, lightweight, embeddable scripting language +url: https://www.lua.org/ +license: MIT From e629993f6e8bad4457fca4a6455e244cba54a555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Mich=C3=A1lek?= Date: Thu, 8 Jan 2026 16:29:59 +0100 Subject: [PATCH 2/6] update lua example --- lua/examples/lua_example/CMakeLists.txt | 4 - lua/examples/lua_example/README.md | 2 + lua/examples/lua_example/assets/fibonacci.lua | 11 + lua/examples/lua_example/main/CMakeLists.txt | 3 + .../lua_example/main/idf_component.yml | 6 +- lua/examples/lua_example/partitions.csv | 6 + .../lua_example/pytest_lua_example.py | 2 + lua/examples/lua_example/sdkconfig.defaults | 2 + lua/include/luaconf.h | 316 +++++++++--------- 9 files changed, 187 insertions(+), 165 deletions(-) create mode 100644 lua/examples/lua_example/assets/fibonacci.lua create mode 100644 lua/examples/lua_example/partitions.csv create mode 100644 lua/examples/lua_example/sdkconfig.defaults diff --git a/lua/examples/lua_example/CMakeLists.txt b/lua/examples/lua_example/CMakeLists.txt index 4164a7b77d..3747ac9e6f 100644 --- a/lua/examples/lua_example/CMakeLists.txt +++ b/lua/examples/lua_example/CMakeLists.txt @@ -2,7 +2,3 @@ cmake_minimum_required(VERSION 3.16) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(lua_example) - -# Create LittleFS partition image -idf_component_register(SRCS "" INCLUDE_DIRS ".") -littlefs_create_partition_image(assets assets FLASH_IN_PROJECT) diff --git a/lua/examples/lua_example/README.md b/lua/examples/lua_example/README.md index ee893effe9..d5dbfbee11 100644 --- a/lua/examples/lua_example/README.md +++ b/lua/examples/lua_example/README.md @@ -34,6 +34,8 @@ idf.py build flash monitor ``` I (xxx) lua_example: Lua Example Starting +I (xxx) lua_example: Initializing LittleFS filesystem +I (xxx) lua_example: Filesystem mounted at /assets I (xxx) lua_example: Starting Lua test: Simple Embedded Script The answer is: 42 I (xxx) lua_example: End of Lua test: Simple Embedded Script diff --git a/lua/examples/lua_example/assets/fibonacci.lua b/lua/examples/lua_example/assets/fibonacci.lua new file mode 100644 index 0000000000..f5df2860b6 --- /dev/null +++ b/lua/examples/lua_example/assets/fibonacci.lua @@ -0,0 +1,11 @@ +-- fibonacci.lua +-- This script calculates the 10th number in the Fibonacci sequence and prints it. + +local function fibonacci(n) + if n <= 1 then return n end + return fibonacci(n - 1) + fibonacci(n - 2) +end + +local fib_10 = fibonacci(10) +print('Fibonacci of 10 is: ' .. fib_10) +return fib_10 diff --git a/lua/examples/lua_example/main/CMakeLists.txt b/lua/examples/lua_example/main/CMakeLists.txt index c4c5b52791..f23be0886f 100644 --- a/lua/examples/lua_example/main/CMakeLists.txt +++ b/lua/examples/lua_example/main/CMakeLists.txt @@ -1,2 +1,5 @@ idf_component_register(SRCS "lua_example.c" INCLUDE_DIRS ".") + +# Note: you must have a partition named "assets" in your partition table +littlefs_create_partition_image(assets ../assets FLASH_IN_PROJECT) diff --git a/lua/examples/lua_example/main/idf_component.yml b/lua/examples/lua_example/main/idf_component.yml index c4cacd5a76..fb08674bc0 100644 --- a/lua/examples/lua_example/main/idf_component.yml +++ b/lua/examples/lua_example/main/idf_component.yml @@ -1,4 +1,4 @@ dependencies: - espressif/esp_littlefs: "^1.0.0" - lua/cpp: - path: ${CMAKE_CURRENT_LIST_DIR}/../.. + lua: + override_path: "../../.." + joltwallet/littlefs: "^1.20.3" diff --git a/lua/examples/lua_example/partitions.csv b/lua/examples/lua_example/partitions.csv new file mode 100644 index 0000000000..3edcf2c25d --- /dev/null +++ b/lua/examples/lua_example/partitions.csv @@ -0,0 +1,6 @@ +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x6000, +phy_init, data, phy, 0xf000, 0x1000, +factory, app, factory, 0x10000, 1M, +assets, data, littlefs, , 0xF0000, diff --git a/lua/examples/lua_example/pytest_lua_example.py b/lua/examples/lua_example/pytest_lua_example.py index 0024c4d530..eff4dca619 100644 --- a/lua/examples/lua_example/pytest_lua_example.py +++ b/lua/examples/lua_example/pytest_lua_example.py @@ -8,6 +8,8 @@ @pytest.mark.generic def test_lua_example(dut: Dut) -> None: dut.expect_exact('Lua Example Starting') + dut.expect_exact('Initializing LittleFS filesystem') + dut.expect_exact('Filesystem mounted at /assets') dut.expect_exact('Starting Lua test: Simple Embedded Script') dut.expect_exact('The answer is: 42') dut.expect_exact('End of Lua test: Simple Embedded Script') diff --git a/lua/examples/lua_example/sdkconfig.defaults b/lua/examples/lua_example/sdkconfig.defaults new file mode 100644 index 0000000000..91d7574d37 --- /dev/null +++ b/lua/examples/lua_example/sdkconfig.defaults @@ -0,0 +1,2 @@ +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" diff --git a/lua/include/luaconf.h b/lua/include/luaconf.h index 1ace706cea..926c7b094d 100644 --- a/lua/include/luaconf.h +++ b/lua/include/luaconf.h @@ -53,8 +53,8 @@ #if defined(LUA_USE_WINDOWS) -#define LUA_DL_DLL /* enable support for DLL */ -#define LUA_USE_C89 /* broadly, Windows is C89 */ +#define LUA_DL_DLL /* enable support for DLL */ +#define LUA_USE_C89 /* broadly, Windows is C89 */ #endif @@ -69,15 +69,15 @@ */ #if defined(LUA_USE_LINUX) #define LUA_USE_POSIX -#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ -#define LUA_READLINELIB "libreadline.so" +#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ +#define LUA_READLINELIB "libreadline.so" #endif #if defined(LUA_USE_MACOSX) #define LUA_USE_POSIX -#define LUA_USE_DLOPEN /* MacOS does not need -ldl */ -#define LUA_READLINELIB "libedit.dylib" +#define LUA_USE_DLOPEN /* MacOS does not need -ldl */ +#define LUA_READLINELIB "libedit.dylib" #endif @@ -90,7 +90,7 @@ /* @@ LUAI_IS32INT is true iff 'int' has (at least) 32 bits. */ -#define LUAI_IS32INT ((UINT_MAX >> 30) >= 3) +#define LUAI_IS32INT ((UINT_MAX >> 30) >= 3) /* }================================================================== */ @@ -115,25 +115,25 @@ */ /* predefined options for LUA_INT_TYPE */ -#define LUA_INT_INT 1 -#define LUA_INT_LONG 2 -#define LUA_INT_LONGLONG 3 +#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 +#define LUA_FLOAT_FLOAT 1 +#define LUA_FLOAT_DOUBLE 2 +#define LUA_FLOAT_LONGDOUBLE 3 /* Default configuration ('long long' and 'double', for 64-bit Lua) */ -#define LUA_INT_DEFAULT LUA_INT_LONGLONG -#define LUA_FLOAT_DEFAULT LUA_FLOAT_DOUBLE +#define LUA_INT_DEFAULT LUA_INT_LONGLONG +#define LUA_FLOAT_DEFAULT LUA_FLOAT_DOUBLE /* @@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. */ -#define LUA_32BITS 1 +#define LUA_32BITS 1 /* @@ -142,37 +142,37 @@ ** not need to use this case. */ #if defined(LUA_USE_C89) && !defined(LUA_USE_WINDOWS) -#define LUA_C89_NUMBERS 1 +#define LUA_C89_NUMBERS 1 #else -#define LUA_C89_NUMBERS 0 +#define LUA_C89_NUMBERS 0 #endif -#if LUA_32BITS /* { */ +#if LUA_32BITS /* { */ /* ** 32-bit integers and 'float' */ #if LUAI_IS32INT /* use 'int' if big enough */ -#define LUA_INT_TYPE LUA_INT_INT +#define LUA_INT_TYPE LUA_INT_INT #else /* otherwise use 'long' */ -#define LUA_INT_TYPE LUA_INT_LONG +#define LUA_INT_TYPE LUA_INT_LONG #endif -#define LUA_FLOAT_TYPE LUA_FLOAT_FLOAT +#define LUA_FLOAT_TYPE LUA_FLOAT_FLOAT -#elif LUA_C89_NUMBERS /* }{ */ +#elif LUA_C89_NUMBERS /* }{ */ /* ** largest types available for C89 ('long' and 'double') */ -#define LUA_INT_TYPE LUA_INT_LONG -#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE +#define LUA_INT_TYPE LUA_INT_LONG +#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE -#else /* }{ */ +#else /* }{ */ /* use defaults */ -#define LUA_INT_TYPE LUA_INT_DEFAULT -#define LUA_FLOAT_TYPE LUA_FLOAT_DEFAULT +#define LUA_INT_TYPE LUA_INT_DEFAULT +#define LUA_FLOAT_TYPE LUA_FLOAT_DEFAULT -#endif /* } */ +#endif /* } */ /* }================================================================== */ @@ -207,50 +207,50 @@ ** non-conventional directories. */ -#define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR -#if defined(_WIN32) /* { */ +#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_LDIR "!\\lua\\" +#define LUA_CDIR "!\\" +#define LUA_SHRDIR "!\\..\\share\\lua\\" LUA_VDIR "\\" #if !defined(LUA_PATH_DEFAULT) #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" + LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" \ + LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \ + ".\\?.lua;" ".\\?\\init.lua" #endif #if !defined(LUA_CPATH_DEFAULT) #define LUA_CPATH_DEFAULT \ - LUA_CDIR"?.dll;" \ - LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \ - LUA_CDIR"loadall.dll;" ".\\?.dll" + LUA_CDIR"?.dll;" \ + LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \ + LUA_CDIR"loadall.dll;" ".\\?.dll" #endif -#else /* }{ */ +#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_ROOT "/usr/local/" +#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR "/" +#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR "/" #if !defined(LUA_PATH_DEFAULT) #define LUA_PATH_DEFAULT \ - LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ - LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \ - "./?.lua;" "./?/init.lua" + LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \ + "./?.lua;" "./?/init.lua" #endif #if !defined(LUA_CPATH_DEFAULT) #define LUA_CPATH_DEFAULT \ - LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so" + LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so" #endif -#endif /* } */ +#endif /* } */ /* @@ -261,9 +261,9 @@ #if !defined(LUA_DIRSEP) #if defined(_WIN32) -#define LUA_DIRSEP "\\" +#define LUA_DIRSEP "\\" #else -#define LUA_DIRSEP "/" +#define LUA_DIRSEP "/" #endif #endif @@ -275,7 +275,7 @@ ** Typically, the suffix after the mark is the module version, ** as in "mod-v1.2.so". */ -#define LUA_IGMARK "-" +#define LUA_IGMARK "-" /* }================================================================== */ @@ -295,26 +295,26 @@ ** 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_BUILD_AS_DLL) /* { */ -#if defined(LUA_CORE) || defined(LUA_LIB) /* { */ +#if defined(LUA_CORE) || defined(LUA_LIB) /* { */ #define LUA_API __declspec(dllexport) -#else /* }{ */ +#else /* }{ */ #define LUA_API __declspec(dllimport) -#endif /* } */ +#endif /* } */ -#else /* }{ */ +#else /* }{ */ -#define LUA_API extern +#define LUA_API extern -#endif /* } */ +#endif /* } */ /* ** More often than not the libs go together with the core. */ -#define LUALIB_API LUA_API -#define LUAMOD_API LUA_API +#define LUALIB_API LUA_API +#define LUAMOD_API LUA_API /* @@ -332,14 +332,14 @@ ** 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 /* } */ + 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 */ +#define LUAI_DDEC(dec) LUAI_FUNC dec +#define LUAI_DDEF /* empty */ /* }================================================================== */ @@ -355,7 +355,7 @@ ** You can define it to get all options, or change specific options ** to fit your specific needs. */ -#if defined(LUA_COMPAT_5_3) /* { */ +#if defined(LUA_COMPAT_5_3) /* { */ /* @@ LUA_COMPAT_MATHLIB controls the presence of several deprecated @@ -389,14 +389,14 @@ ** (Once more, these macros were officially removed in 5.3, but they are ** still available here.) */ -#define lua_strlen(L,i) lua_rawlen(L, (i)) +#define lua_strlen(L,i) lua_rawlen(L, (i)) -#define lua_objlen(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) +#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) -#endif /* } */ +#endif /* } */ /* }================================================================== */ @@ -431,7 +431,7 @@ /* The following definitions are good for most cases here */ -#define l_floor(x) (l_mathop(floor)(x)) +#define l_floor(x) (l_mathop(floor)(x)) /* @@ -451,60 +451,60 @@ /* now the variable definitions */ -#if LUA_FLOAT_TYPE == LUA_FLOAT_FLOAT /* { single float */ +#if LUA_FLOAT_TYPE == LUA_FLOAT_FLOAT /* { single float */ -#define LUA_NUMBER float +#define LUA_NUMBER float -#define l_floatatt(n) (FLT_##n) +#define l_floatatt(n) (FLT_##n) -#define LUAI_UACNUMBER double +#define LUAI_UACNUMBER double -#define LUA_NUMBER_FRMLEN "" -#define LUA_NUMBER_FMT "%.7g" -#define LUA_NUMBER_FMT_N "%.9g" +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.7g" +#define LUA_NUMBER_FMT_N "%.9g" -#define l_mathop(op) op##f +#define l_mathop(op) op##f -#define lua_str2number(s,p) strtof((s), (p)) +#define lua_str2number(s,p) strtof((s), (p)) -#elif LUA_FLOAT_TYPE == LUA_FLOAT_LONGDOUBLE /* }{ long double */ +#elif LUA_FLOAT_TYPE == LUA_FLOAT_LONGDOUBLE /* }{ long double */ -#define LUA_NUMBER long double +#define LUA_NUMBER long double -#define l_floatatt(n) (LDBL_##n) +#define l_floatatt(n) (LDBL_##n) -#define LUAI_UACNUMBER long double +#define LUAI_UACNUMBER long double -#define LUA_NUMBER_FRMLEN "L" -#define LUA_NUMBER_FMT "%.19Lg" -#define LUA_NUMBER_FMT_N "%.21Lg" +#define LUA_NUMBER_FRMLEN "L" +#define LUA_NUMBER_FMT "%.19Lg" +#define LUA_NUMBER_FMT_N "%.21Lg" -#define l_mathop(op) op##l +#define l_mathop(op) op##l -#define lua_str2number(s,p) strtold((s), (p)) +#define lua_str2number(s,p) strtold((s), (p)) -#elif LUA_FLOAT_TYPE == LUA_FLOAT_DOUBLE /* }{ double */ +#elif LUA_FLOAT_TYPE == LUA_FLOAT_DOUBLE /* }{ double */ -#define LUA_NUMBER double +#define LUA_NUMBER double -#define l_floatatt(n) (DBL_##n) +#define l_floatatt(n) (DBL_##n) -#define LUAI_UACNUMBER double +#define LUAI_UACNUMBER double -#define LUA_NUMBER_FRMLEN "" -#define LUA_NUMBER_FMT "%.15g" -#define LUA_NUMBER_FMT_N "%.17g" +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.15g" +#define LUA_NUMBER_FMT_N "%.17g" -#define l_mathop(op) op +#define l_mathop(op) op -#define lua_str2number(s,p) strtod((s), (p)) +#define lua_str2number(s,p) strtod((s), (p)) -#else /* }{ */ +#else /* }{ */ #error "numeric float type not defined" -#endif /* } */ +#endif /* } */ @@ -523,79 +523,79 @@ /* The following definitions are good for most cases here */ -#define LUA_INTEGER_FMT "%" LUA_INTEGER_FRMLEN "d" +#define LUA_INTEGER_FMT "%" LUA_INTEGER_FRMLEN "d" -#define LUAI_UACINT LUA_INTEGER +#define LUAI_UACINT LUA_INTEGER #define lua_integer2str(s,sz,n) \ - l_sprintf((s), sz, LUA_INTEGER_FMT, (LUAI_UACINT)(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_UNSIGNED unsigned LUAI_UACINT /* now the variable definitions */ -#if LUA_INT_TYPE == LUA_INT_INT /* { int */ +#if LUA_INT_TYPE == LUA_INT_INT /* { int */ -#define LUA_INTEGER int -#define LUA_INTEGER_FRMLEN "" +#define LUA_INTEGER int +#define LUA_INTEGER_FRMLEN "" -#define LUA_MAXINTEGER INT_MAX -#define LUA_MININTEGER INT_MIN +#define LUA_MAXINTEGER INT_MAX +#define LUA_MININTEGER INT_MIN -#define LUA_MAXUNSIGNED UINT_MAX +#define LUA_MAXUNSIGNED UINT_MAX -#elif LUA_INT_TYPE == LUA_INT_LONG /* }{ long */ +#elif LUA_INT_TYPE == LUA_INT_LONG /* }{ long */ -#define LUA_INTEGER long -#define LUA_INTEGER_FRMLEN "l" +#define LUA_INTEGER long +#define LUA_INTEGER_FRMLEN "l" -#define LUA_MAXINTEGER LONG_MAX -#define LUA_MININTEGER LONG_MIN +#define LUA_MAXINTEGER LONG_MAX +#define LUA_MININTEGER LONG_MIN -#define LUA_MAXUNSIGNED ULONG_MAX +#define LUA_MAXUNSIGNED ULONG_MAX -#elif LUA_INT_TYPE == LUA_INT_LONGLONG /* }{ long long */ +#elif LUA_INT_TYPE == LUA_INT_LONGLONG /* }{ long long */ /* use presence of macro LLONG_MAX as proxy for C99 compliance */ -#if defined(LLONG_MAX) /* { */ +#if defined(LLONG_MAX) /* { */ /* use ISO C99 stuff */ -#define LUA_INTEGER long long -#define LUA_INTEGER_FRMLEN "ll" +#define LUA_INTEGER long long +#define LUA_INTEGER_FRMLEN "ll" -#define LUA_MAXINTEGER LLONG_MAX -#define LUA_MININTEGER LLONG_MIN +#define LUA_MAXINTEGER LLONG_MAX +#define LUA_MININTEGER LLONG_MIN -#define LUA_MAXUNSIGNED ULLONG_MAX +#define LUA_MAXUNSIGNED ULLONG_MAX #elif defined(LUA_USE_WINDOWS) /* }{ */ /* in Windows, can use specific Windows types */ -#define LUA_INTEGER __int64 -#define LUA_INTEGER_FRMLEN "I64" +#define LUA_INTEGER __int64 +#define LUA_INTEGER_FRMLEN "I64" -#define LUA_MAXINTEGER _I64_MAX -#define LUA_MININTEGER _I64_MIN +#define LUA_MAXINTEGER _I64_MAX +#define LUA_MININTEGER _I64_MIN -#define LUA_MAXUNSIGNED _UI64_MAX +#define LUA_MAXUNSIGNED _UI64_MAX -#else /* }{ */ +#else /* }{ */ #error "Compiler does not support 'long long'. Use option '-DLUA_32BITS' \ - or '-DLUA_C89_NUMBERS' (see file 'luaconf.h' for details)" +or '-DLUA_C89_NUMBERS' (see file 'luaconf.h' for details)" -#endif /* } */ +#endif /* } */ -#else /* }{ */ +#else /* }{ */ #error "numeric integer type not defined" -#endif /* } */ +#endif /* } */ /* }================================================================== */ @@ -611,9 +611,9 @@ ** (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) +#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)) +#define l_sprintf(s,sz,f,i) ((void)(sz), sprintf(s,f,i)) #endif @@ -624,7 +624,7 @@ ** implementation. */ #if !defined(LUA_USE_C89) -#define lua_strx2number(s,p) lua_str2number(s,p) +#define lua_strx2number(s,p) lua_str2number(s,p) #endif @@ -632,7 +632,7 @@ @@ 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) +#define lua_pointer2str(buff,sz,p) l_sprintf(buff,sz,"%p",p) /* @@ -643,7 +643,7 @@ */ #if !defined(LUA_USE_C89) #define lua_number2strx(L,b,sz,f,n) \ - ((void)L, l_sprintf(b,sz,f,(LUAI_UACNUMBER)(n))) + ((void)L, l_sprintf(b,sz,f,(LUAI_UACNUMBER)(n))) #endif @@ -656,8 +656,8 @@ #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))) +#define l_mathop(op) (lua_Number)op /* no variant */ +#define lua_str2number(s,p) ((lua_Number)strtod((s), (p))) #endif @@ -667,14 +667,14 @@ ** available, otherwise it will use 'ptrdiff_t' (the nearest thing to ** 'intptr_t' in C89) */ -#define LUA_KCONTEXT ptrdiff_t +#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 +#define LUA_KCONTEXT intptr_t #endif #endif @@ -685,7 +685,7 @@ ** macro must include the header 'locale.h'.) */ #if !defined(lua_getlocaledecpoint) -#define lua_getlocaledecpoint() (localeconv()->decimal_point[0]) +#define lua_getlocaledecpoint() (localeconv()->decimal_point[0]) #endif @@ -698,11 +698,11 @@ #if !defined(luai_likely) #if defined(__GNUC__) && !defined(LUA_NOBUILTIN) -#define luai_likely(x) (__builtin_expect(((x) != 0), 1)) -#define luai_unlikely(x) (__builtin_expect(((x) != 0), 0)) +#define luai_likely(x) (__builtin_expect(((x) != 0), 1)) +#define luai_unlikely(x) (__builtin_expect(((x) != 0), 0)) #else -#define luai_likely(x) (x) -#define luai_unlikely(x) (x) +#define luai_likely(x) (x) +#define luai_unlikely(x) (x) #endif #endif @@ -710,8 +710,8 @@ #if defined(LUA_CORE) || defined(LUA_LIB) /* shorter names for Lua's own use */ -#define l_likely(x) luai_likely(x) -#define l_unlikely(x) luai_unlikely(x) +#define l_likely(x) luai_likely(x) +#define l_unlikely(x) luai_unlikely(x) #endif @@ -760,9 +760,9 @@ ** (It must fit into max(int)/2.) */ #if 1000000 < (INT_MAX / 2) -#define LUAI_MAXSTACK CONFIG_LUA_MAXSTACK +#define LUAI_MAXSTACK CONFIG_LUA_MAXSTACK #else -#define LUAI_MAXSTACK (INT_MAX / 2u) +#define LUAI_MAXSTACK (INT_MAX / 2u) #endif @@ -771,7 +771,7 @@ ** a Lua state with very fast access. ** CHANGE it if you need a different size. */ -#define LUA_EXTRASPACE (sizeof(void *)) +#define LUA_EXTRASPACE (sizeof(void *)) /* @@ -779,7 +779,7 @@ ** of a function in debug information. ** CHANGE it if you want a different size. */ -#define LUA_IDSIZE 60 +#define LUA_IDSIZE 60 /* From 8736da056b11c96e4b085e0d0e3a6e7294534de7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Mich=C3=A1lek?= Date: Fri, 9 Jan 2026 10:41:30 +0100 Subject: [PATCH 3/6] lua: use port header, instead of copy of original header --- lua/CMakeLists.txt | 5 +- lua/README.md | 5 +- lua/examples/lua_example/sdkconfig.defaults | 1 + lua/include/luaconf.h | 816 -------------------- lua/port/include/luaconf.h | 48 ++ 5 files changed, 55 insertions(+), 820 deletions(-) delete mode 100644 lua/include/luaconf.h create mode 100644 lua/port/include/luaconf.h diff --git a/lua/CMakeLists.txt b/lua/CMakeLists.txt index d60c0e58a8..ad85ba53cd 100644 --- a/lua/CMakeLists.txt +++ b/lua/CMakeLists.txt @@ -33,10 +33,13 @@ idf_component_register( "lua/lutf8lib.c" "lua/lzio.c" INCLUDE_DIRS - "include" + "port/include" "lua" ) +# Enable 32-bit mode for Lua (required for ESP32 and Xtensa/RISC-V architectures) +target_compile_definitions(${COMPONENT_LIB} PRIVATE LUA_32BITS=1) + # Suppress compiler warnings from upstream Lua code target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-unused-function) diff --git a/lua/README.md b/lua/README.md index 0a18f3402a..5fe86b3d0f 100644 --- a/lua/README.md +++ b/lua/README.md @@ -2,11 +2,10 @@ ESP-IDF component which wraps Lua from upstream repository - https://www.lua.org/ -This component provides Lua 5.5.0, a powerful, efficient, lightweight, embeddable scripting language. +This component provides Lua, a powerful, efficient, lightweight, embeddable scripting language. ## Features -- Lua 5.5.0 (latest version from upstream) - Suitable for embedding Lua code inside ESP-IDF applications - Configurable stack size limit - MIT license @@ -47,7 +46,7 @@ void run_lua() { ## Changes to upstream -This component overrides `luaconf.h` to set `LUA_32BITS` to 1, which is required for ESP32 and other Xtensa/RISC-V architectures. +This component uses header injection to provide ESP-IDF specific configuration overrides without modifying the upstream Lua source code. The platform-specific settings (such as `LUA_32BITS` for ESP32 and Xtensa/RISC-V architectures) are defined in `lua/port/include/luaconf.h`. ## License diff --git a/lua/examples/lua_example/sdkconfig.defaults b/lua/examples/lua_example/sdkconfig.defaults index 91d7574d37..f53cf8923c 100644 --- a/lua/examples/lua_example/sdkconfig.defaults +++ b/lua/examples/lua_example/sdkconfig.defaults @@ -1,2 +1,3 @@ CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_LUA_MAXSTACK=1000000 diff --git a/lua/include/luaconf.h b/lua/include/luaconf.h deleted file mode 100644 index 926c7b094d..0000000000 --- a/lua/include/luaconf.h +++ /dev/null @@ -1,816 +0,0 @@ -/* -** $Id: luaconf.h $ -** Configuration file for Lua -** See Copyright Notice in lua.h -*/ - - -#ifndef luaconf_h -#define luaconf_h - -#include -#include - - -/* -** =================================================================== -** General Configuration File for Lua -** -** Some definitions here can be changed externally, through the compiler -** (e.g., with '-D' options): They are commented out or protected -** by '#if !defined' guards. However, several other definitions -** should be changed directly here, either because they affect the -** Lua ABI (by making the changes here, you ensure that all software -** connected to Lua, such as C libraries, will be compiled with the same -** configuration); or because they are seldom changed. -** -** Search for "@@" to find all configurable definitions. -** =================================================================== -*/ - - -/* -** {==================================================================== -** System Configuration: macros to adapt (if needed) Lua to some -** particular platform, for instance restricting it to C89. -** ===================================================================== -*/ - -/* -@@ 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 - - -/* -** When Posix DLL ('LUA_USE_DLOPEN') is enabled, the Lua stand-alone -** application will try to dynamically link a 'readline' facility -** for its REPL. In that case, LUA_READLINELIB is the name of the -** library it will look for those facilities. If lua.c cannot open -** the specified library, it will generate a warning and then run -** without 'readline'. If that macro is not defined, lua.c will not -** use 'readline'. -*/ -#if defined(LUA_USE_LINUX) -#define LUA_USE_POSIX -#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ -#define LUA_READLINELIB "libreadline.so" -#endif - - -#if defined(LUA_USE_MACOSX) -#define LUA_USE_POSIX -#define LUA_USE_DLOPEN /* MacOS does not need -ldl */ -#define LUA_READLINELIB "libedit.dylib" -#endif - - -#if defined(LUA_USE_IOS) -#define LUA_USE_POSIX -#define LUA_USE_DLOPEN -#endif - - -/* -@@ LUAI_IS32INT is true iff 'int' has (at least) 32 bits. -*/ -#define LUAI_IS32INT ((UINT_MAX >> 30) >= 3) - -/* }================================================================== */ - - - -/* -** {================================================================== -** Configuration for Number types. These options should not be -** set externally, because any other code connected to Lua must -** use the same configuration. -** =================================================================== -*/ - -/* -@@ 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 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 - - -/* Default configuration ('long long' and 'double', for 64-bit Lua) */ -#define LUA_INT_DEFAULT LUA_INT_LONGLONG -#define LUA_FLOAT_DEFAULT LUA_FLOAT_DOUBLE - - -/* -@@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. -*/ -#define LUA_32BITS 1 - - -/* -@@ 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 1 -#else -#define LUA_C89_NUMBERS 0 -#endif - - -#if LUA_32BITS /* { */ -/* -** 32-bit integers and 'float' -*/ -#if LUAI_IS32INT /* use 'int' if big enough */ -#define LUA_INT_TYPE LUA_INT_INT -#else /* otherwise use 'long' */ -#define LUA_INT_TYPE LUA_INT_LONG -#endif -#define LUA_FLOAT_TYPE LUA_FLOAT_FLOAT - -#elif LUA_C89_NUMBERS /* }{ */ -/* -** largest types available for C89 ('long' and 'double') -*/ -#define LUA_INT_TYPE LUA_INT_LONG -#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE - -#else /* }{ */ -/* use defaults */ - -#define LUA_INT_TYPE LUA_INT_DEFAULT -#define LUA_FLOAT_TYPE LUA_FLOAT_DEFAULT - -#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 "\\" - -#if !defined(LUA_PATH_DEFAULT) -#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" -#endif - -#if !defined(LUA_CPATH_DEFAULT) -#define LUA_CPATH_DEFAULT \ - LUA_CDIR"?.dll;" \ - LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \ - LUA_CDIR"loadall.dll;" ".\\?.dll" -#endif - -#else /* }{ */ - -#define LUA_ROOT "/usr/local/" -#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR "/" -#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR "/" - -#if !defined(LUA_PATH_DEFAULT) -#define LUA_PATH_DEFAULT \ - LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ - LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \ - "./?.lua;" "./?/init.lua" -#endif - -#if !defined(LUA_CPATH_DEFAULT) -#define LUA_CPATH_DEFAULT \ - LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so" -#endif - -#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(LUA_DIRSEP) - -#if defined(_WIN32) -#define LUA_DIRSEP "\\" -#else -#define LUA_DIRSEP "/" -#endif - -#endif - - -/* -** LUA_IGMARK is a mark to ignore all after it when building the -** module name (e.g., used to build the luaopen_ function name). -** Typically, the suffix after the mark is the module version, -** as in "mod-v1.2.so". -*/ -#define LUA_IGMARK "-" - -/* }================================================================== */ - - -/* -** {================================================================== -** 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; -** nevertheless they are still available here.) -*/ -#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.) -** (These macros were also officially removed in 5.3, but they are still -** available here.) -*/ -#define LUA_COMPAT_APIINTCASTS - - -/* -@@ LUA_COMPAT_LT_LE controls the emulation of the '__le' metamethod -** using '__lt'. -*/ -#define LUA_COMPAT_LT_LE - - -/* -@@ 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. -** (Once more, these macros were officially removed in 5.3, but they are -** still available here.) -*/ -#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) - -#endif /* } */ - -/* }================================================================== */ - - - -/* -** {================================================================== -** Configuration for Numbers (low-level part). -** Change these definitions if no predefined LUA_FLOAT_* / LUA_INT_* -** satisfy your needs. -** =================================================================== -*/ - -/* -@@ LUAI_UACNUMBER is the result of a 'default argument promotion' -@@ over a floating number. -@@ l_floatatt(x) corrects float attribute '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 with the maximum -** number of digits that respects tostring(tonumber(numeral)) == numeral. -** (That would be floor(log10(2^n)), where n is the number of bits in -** the float mantissa.) -@@ LUA_NUMBER_FMT_N is the format for writing floats with the minimum -** number of digits that ensures tonumber(tostring(number)) == number. -** (That would be LUA_NUMBER_FMT+2.) -@@ 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 numeral to a number. -*/ - - -/* The following definitions are good for most cases here */ - -#define l_floor(x) (l_mathop(floor)(x)) - - -/* -@@ 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_floatatt(n) (FLT_##n) - -#define LUAI_UACNUMBER double - -#define LUA_NUMBER_FRMLEN "" -#define LUA_NUMBER_FMT "%.7g" -#define LUA_NUMBER_FMT_N "%.9g" - -#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_floatatt(n) (LDBL_##n) - -#define LUAI_UACNUMBER long double - -#define LUA_NUMBER_FRMLEN "L" -#define LUA_NUMBER_FMT "%.19Lg" -#define LUA_NUMBER_FMT_N "%.21Lg" - -#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_floatatt(n) (DBL_##n) - -#define LUAI_UACNUMBER double - -#define LUA_NUMBER_FRMLEN "" -#define LUA_NUMBER_FMT "%.15g" -#define LUA_NUMBER_FMT_N "%.17g" - -#define l_mathop(op) op - -#define lua_str2number(s,p) strtod((s), (p)) - -#else /* }{ */ - -#error "numeric float type not defined" - -#endif /* } */ - - - -/* -@@ 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_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 - - -/* 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 - -#define LUA_MAXUNSIGNED UINT_MAX - -#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 - -#define LUA_MAXUNSIGNED ULONG_MAX - -#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 - -#define LUA_MAXUNSIGNED ULLONG_MAX - -#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 - -#define LUA_MAXUNSIGNED _UI64_MAX - -#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 numeral 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 numeral. -** 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 the header 'locale.h'.) -*/ -#if !defined(lua_getlocaledecpoint) -#define lua_getlocaledecpoint() (localeconv()->decimal_point[0]) -#endif - - -/* -** macros to improve jump prediction, used mostly for error handling -** and debug facilities. (Some macros in the Lua API use these macros. -** Define LUA_NOBUILTIN if you do not want '__builtin_expect' in your -** code.) -*/ -#if !defined(luai_likely) - -#if defined(__GNUC__) && !defined(LUA_NOBUILTIN) -#define luai_likely(x) (__builtin_expect(((x) != 0), 1)) -#define luai_unlikely(x) (__builtin_expect(((x) != 0), 0)) -#else -#define luai_likely(x) (x) -#define luai_unlikely(x) (x) -#endif - -#endif - - -#if defined(LUA_CORE) || defined(LUA_LIB) -/* shorter names for Lua's own use */ -#define l_likely(x) luai_likely(x) -#define l_unlikely(x) luai_unlikely(x) -#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. -*/ -/* #define LUA_USE_APICHECK */ - -/* }================================================================== */ - - -/* -** {================================================================== -** 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). -** ===================================================================== -*/ - -/* -@@ 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(int)/2.) -*/ -#if 1000000 < (INT_MAX / 2) -#define LUAI_MAXSTACK CONFIG_LUA_MAXSTACK -#else -#define LUAI_MAXSTACK (INT_MAX / 2u) -#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 initial buffer size used by the lauxlib -** buffer system. -*/ -#define LUAL_BUFFERSIZE ((int)(16 * sizeof(void*) * sizeof(lua_Number))) - - -/* -@@ 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/lua/port/include/luaconf.h b/lua/port/include/luaconf.h new file mode 100644 index 0000000000..d29d634270 --- /dev/null +++ b/lua/port/include/luaconf.h @@ -0,0 +1,48 @@ +/* +** Lua port configuration for ESP-IDF +** +** This file provides platform-specific overrides for Lua configuration. +** It uses header injection technique to modify upstream Lua behavior +** without forking the entire luaconf.h file. +** +** The upstream luaconf.h is included first, then specific macros are +** overridden for ESP-IDF platform requirements. +*/ + +#ifndef LUA_PORT_LUACONF_H +#define LUA_PORT_LUACONF_H + +#ifdef __IDF__ +/* +** Include upstream luaconf.h to get all default definitions. +** This ensures we have access to all upstream configuration. +*/ +#include "luaconf.h" + +/* +** ESP-IDF specific overrides +*/ + +/* +** LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. +** This is required for ESP32 and other Xtensa/RISC-V architectures. +*/ +#undef LUA_32BITS +#define LUA_32BITS 1 + +/* +** LUAI_MAXSTACK limits the size of the Lua stack. +** Override to use ESP-IDF Kconfig value (CONFIG_LUA_MAXSTACK). +** This allows users to configure stack size via menuconfig. +*/ +#if 1000000 < (INT_MAX / 2) +#undef LUAI_MAXSTACK +#define LUAI_MAXSTACK CONFIG_LUA_MAXSTACK +#else +#undef LUAI_MAXSTACK +#define LUAI_MAXSTACK (INT_MAX / 2u) +#endif + +#endif /* __IDF__ */ + +#endif /* LUA_PORT_LUACONF_H */ From e7443a904a3becfc3c1907af41739a4e1dbc16e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Mich=C3=A1lek?= Date: Fri, 9 Jan 2026 10:57:41 +0100 Subject: [PATCH 4/6] lua: add build-test-rules.yml --- lua/.build-test-rules.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 lua/.build-test-rules.yml diff --git a/lua/.build-test-rules.yml b/lua/.build-test-rules.yml new file mode 100644 index 0000000000..a05d1ee856 --- /dev/null +++ b/lua/.build-test-rules.yml @@ -0,0 +1,4 @@ +lua/examples/lua_example: + enable: + - if: IDF_TARGET in ["esp32", "esp32c3"] + reason: "Sufficient to test on one Xtensa and one RISC-V target" From 8128bd5451d9eeb5a94348457306d5ce9c895388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Mich=C3=A1lek?= Date: Fri, 9 Jan 2026 13:41:59 +0100 Subject: [PATCH 5/6] lua: explicit add LIBC_NEWLIB --- lua/examples/lua_example/sdkconfig.defaults | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/examples/lua_example/sdkconfig.defaults b/lua/examples/lua_example/sdkconfig.defaults index f53cf8923c..9a7dae40f3 100644 --- a/lua/examples/lua_example/sdkconfig.defaults +++ b/lua/examples/lua_example/sdkconfig.defaults @@ -1,3 +1,4 @@ CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" CONFIG_LUA_MAXSTACK=1000000 +CONFIG_LIBC_NEWLIB=y From e7dd0bb4ce365653d5d3434ea5f35c9a4f82422e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Mich=C3=A1lek?= Date: Fri, 9 Jan 2026 15:01:28 +0100 Subject: [PATCH 6/6] revert newlibc setting --- lua/examples/lua_example/sdkconfig.defaults | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/examples/lua_example/sdkconfig.defaults b/lua/examples/lua_example/sdkconfig.defaults index 9a7dae40f3..f53cf8923c 100644 --- a/lua/examples/lua_example/sdkconfig.defaults +++ b/lua/examples/lua_example/sdkconfig.defaults @@ -1,4 +1,3 @@ CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" CONFIG_LUA_MAXSTACK=1000000 -CONFIG_LIBC_NEWLIB=y