From 826bb1abbe74adb812399deb44cfe4820ed7e08d Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 18 Aug 2019 16:54:43 -0400 Subject: [PATCH 01/13] Update appveyor deployment. --- CHANGELOG.md | 5 +++++ appveyor.yml | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9695b4b4..063b8712 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # Changelog All notable changes to this project will be documented in this file. +## Unreleased +- Some bug fixes with `jpm` +- Add `os/arch` to get ISA that janet was compiled for +- Add color to stacktraces via `(dyn :err-color)` + ## 1.2.0 - 2019-08-08 - Add `take` and `drop` functions that are easier to use compared to the existing slice functions. diff --git a/appveyor.yml b/appveyor.yml index ef1f09b9..38f22037 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -35,6 +35,9 @@ only_commits: - src/ artifacts: + - name: janet-v1.2.0-windows.zip + path: dist + type: Zip - path: janet-v1.2.0-windows-installer.exe name: janet-v1.2.0-windows-installer.exe type: File @@ -44,7 +47,7 @@ deploy: provider: GitHub auth_token: secure: lwEXy09qhj2jSH9s1C/KvCkAUqJSma8phFR+0kbsfUc3rVxpNK5uD3z9Md0SjYRx - artifact: janet-windows + artifact: /janet-.*/ draft: true on: APPVEYOR_REPO_TAG: true From 79bbb0ee1cf804243517953cc035356104762aa9 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 18 Aug 2019 17:05:53 -0400 Subject: [PATCH 02/13] Appveyor test2. --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 38f22037..7323c565 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -35,7 +35,7 @@ only_commits: - src/ artifacts: - - name: janet-v1.2.0-windows.zip + - name: janet-v1.2.0-windows path: dist type: Zip - path: janet-v1.2.0-windows-installer.exe From daf92be5bc70f6f91525413da1d1b0714f7e1de0 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 18 Aug 2019 17:54:52 -0400 Subject: [PATCH 03/13] Better deploy test. --- appveyor.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 7323c565..e4bf1633 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -35,11 +35,11 @@ only_commits: - src/ artifacts: - - name: janet-v1.2.0-windows + - name: "janet-$(appveyor_repo_tag_name)-windows" path: dist type: Zip - - path: janet-v1.2.0-windows-installer.exe - name: janet-v1.2.0-windows-installer.exe + - path: "janet-$(appveyor_repo_tag_name)-windows-installer.exe" + name: "janet-$(appveyor_repo_tag_name)-windows-installer.exe" type: File deploy: From 3cdbf5753d69e9228dbab6bc974c931adc5ec355 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 18 Aug 2019 18:02:28 -0400 Subject: [PATCH 04/13] Add some more artifacts to automate release. --- appveyor.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index e4bf1633..0cd08d3d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -35,6 +35,15 @@ only_commits: - src/ artifacts: + - name: janet.c + path: dist\janet.c + type: File + - name: janet.h + path: dist\janet.h + type: File + - name: janetconf.h + path: dist\janetconf.h + type: File - name: "janet-$(appveyor_repo_tag_name)-windows" path: dist type: Zip From 2695f2da46f585e8a65811b0eb22c9c3a1715257 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 18 Aug 2019 19:16:15 -0400 Subject: [PATCH 05/13] Update installer with appveyor commands. --- appveyor.yml | 10 ++++++---- janet-installer.nsi | 14 +++++++++++++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 0cd08d3d..2da5aa20 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -26,7 +26,9 @@ install: - refreshenv # We need to reload vcvars after refreshing - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat" - - build_win test-install + - build_win test-install\ + - set janet_outname="%appveyor_repo_tag_name%" + - if "%janet_outname%"=="" (set janet_outname=v1.2.0) build: off only_commits: @@ -44,11 +46,11 @@ artifacts: - name: janetconf.h path: dist\janetconf.h type: File - - name: "janet-$(appveyor_repo_tag_name)-windows" + - name: "janet-$(janet_outname)-windows" path: dist type: Zip - - path: "janet-$(appveyor_repo_tag_name)-windows-installer.exe" - name: "janet-$(appveyor_repo_tag_name)-windows-installer.exe" + - path: "janet-$(janet_outname)-windows-installer.exe" + name: "janet-$(janet_outname)-windows-installer.exe" type: File deploy: diff --git a/janet-installer.nsi b/janet-installer.nsi index b9f9f0f8..8719d42a 100644 --- a/janet-installer.nsi +++ b/janet-installer.nsi @@ -25,7 +25,19 @@ VIFileVersion "${PRODUCT_VERSION}" # Basics Name "Janet" -OutFile "janet-v${VERSION}-windows-installer.exe" + +# Do some NSIS-fu to figure out at compile time if we are in appveyor +!define OUTNAME $%APPVEYOR_REPO_TAG_NAME% +!define "CHECK_${OUTNAME}" +!define DOLLAR "$" +!ifdef CHECK_${DOLLAR}%APPVEYOR_REPO_TAG_NAME% + # We are not in the appveyor environment, use version name + !define OUTNAME_PART v${VERSION}-nonrelease- +!else + # We are in appveyor, use git tag name for installer + !define OUTNAME_PART ${OUTNAME} +!endif +OutFile "janet-${OUTNAME_PART}-windows-installer.exe" # Some Configuration !define APPNAME "Janet" From 5d475848a639173cd01286e8f5c23628ff5c3232 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 18 Aug 2019 19:35:17 -0400 Subject: [PATCH 06/13] Fix appveyor.yml --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 2da5aa20..0081b3cd 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,7 +15,7 @@ matrix: # skip unsupported combinations init: -- call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat" + - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat" install: - choco install nsis -y -pre @@ -26,7 +26,7 @@ install: - refreshenv # We need to reload vcvars after refreshing - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat" - - build_win test-install\ + - build_win test-install - set janet_outname="%appveyor_repo_tag_name%" - if "%janet_outname%"=="" (set janet_outname=v1.2.0) build: off From a1f785038dc4f338ba7808898711e1195f41cf17 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 18 Aug 2019 19:53:18 -0400 Subject: [PATCH 07/13] release-test4 --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 0081b3cd..544b7bf8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -29,6 +29,7 @@ install: - build_win test-install - set janet_outname="%appveyor_repo_tag_name%" - if "%janet_outname%"=="" (set janet_outname=v1.2.0) + - echo "%janet_outname%" build: off only_commits: From 1de09ec1493d0537ccbf8aa53c0d3eb7728e5547 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 18 Aug 2019 20:02:06 -0400 Subject: [PATCH 08/13] release test 5 --- appveyor.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 544b7bf8..9197963d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -27,9 +27,9 @@ install: # We need to reload vcvars after refreshing - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat" - build_win test-install - - set janet_outname="%appveyor_repo_tag_name%" - - if "%janet_outname%"=="" (set janet_outname=v1.2.0) - - echo "%janet_outname%" + - set janet_outname=%appveyor_repo_tag_name% + - if %janet_outname%=="" (set janet_outname=v1.2.0) + - echo %janet_outname% build: off only_commits: From 6a539df480575eeb967959680493913bd4f83acb Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 18 Aug 2019 20:07:12 -0400 Subject: [PATCH 09/13] Make sure all appveyor artifacts get deployed --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 9197963d..5aaec113 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -59,7 +59,7 @@ deploy: provider: GitHub auth_token: secure: lwEXy09qhj2jSH9s1C/KvCkAUqJSma8phFR+0kbsfUc3rVxpNK5uD3z9Md0SjYRx - artifact: /janet-.*/ + artifact: /janet.*/ draft: true on: APPVEYOR_REPO_TAG: true From 1c73d8ce2bcc84066abb1ad8cb1bbc1a7811850e Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 18 Aug 2019 20:19:50 -0400 Subject: [PATCH 10/13] Remove some parens --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 5aaec113..1408c064 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,7 +28,7 @@ install: - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat" - build_win test-install - set janet_outname=%appveyor_repo_tag_name% - - if %janet_outname%=="" (set janet_outname=v1.2.0) + - if %janet_outname%=="" set janet_outname=v1.2.0 - echo %janet_outname% build: off From c35d6d23966e4fec413ecad46d3ba51969eb90ac Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 18 Aug 2019 20:27:26 -0400 Subject: [PATCH 11/13] More batch syntax issues. --- appveyor.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 1408c064..14bf3907 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,8 +28,7 @@ install: - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat" - build_win test-install - set janet_outname=%appveyor_repo_tag_name% - - if %janet_outname%=="" set janet_outname=v1.2.0 - - echo %janet_outname% + - if "%janet_outname%"=="" set janet_outname=v1.2.0 build: off only_commits: From 0360942942e83ee19760ee1b6e3d4cdf5ee30f43 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 18 Aug 2019 21:01:47 -0400 Subject: [PATCH 12/13] Add build commit hash to windows build from appveyor. --- appveyor.yml | 1 + build_win.bat | 27 ++++++++++++++++----------- janet-installer.nsi | 2 +- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 14bf3907..382d9cf3 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -18,6 +18,7 @@ init: - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat" install: + - set JANET_BUILD=%appveyor_repo_commit:~0,7% - choco install nsis -y -pre # Replace makensis.exe and files with special long string build. This should # prevent issues when setting PATH during installation. diff --git a/build_win.bat b/build_win.bat index 054c8a7c..6bda6464 100644 --- a/build_win.bat +++ b/build_win.bat @@ -23,36 +23,41 @@ @set JANET_LINK=link /nologo @set JANET_LINK_STATIC=lib /nologo +@rem Add janet build tag +if not "%JANET_BUILD%" == "" ( + @set JANET_COMPILE=%JANET_COMPILE% /DJANET_BUILD="\"%JANET_BUILD%\"" +) + mkdir build mkdir build\core mkdir build\mainclient mkdir build\boot @rem Build the xxd tool for generating sources -@cl /nologo /c tools/xxd.c /Fobuild\xxd.obj +cl /nologo /c tools/xxd.c /Fobuild\xxd.obj @if errorlevel 1 goto :BUILDFAIL -@link /nologo /out:build\xxd.exe build\xxd.obj +link /nologo /out:build\xxd.exe build\xxd.obj @if errorlevel 1 goto :BUILDFAIL @rem Generate the embedded sources -@build\xxd.exe src\mainclient\init.janet build\init.gen.c janet_gen_init +build\xxd.exe src\mainclient\init.janet build\init.gen.c janet_gen_init @if errorlevel 1 goto :BUILDFAIL -@build\xxd.exe src\boot\boot.janet build\boot.gen.c janet_gen_boot +build\xxd.exe src\boot\boot.janet build\boot.gen.c janet_gen_boot @if errorlevel 1 goto :BUILDFAIL @rem Build the generated sources -@%JANET_COMPILE% /Fobuild\mainclient\init.gen.obj build\init.gen.c +%JANET_COMPILE% /Fobuild\mainclient\init.gen.obj build\init.gen.c @if errorlevel 1 goto :BUILDFAIL -@%JANET_COMPILE% /Fobuild\boot\boot.gen.obj build\boot.gen.c +%JANET_COMPILE% /Fobuild\boot\boot.gen.obj build\boot.gen.c @if errorlevel 1 goto :BUILDFAIL @rem Build the bootstrap interpreter for %%f in (src\core\*.c) do ( - @%JANET_COMPILE% /DJANET_BOOTSTRAP /Fobuild\boot\%%~nf.obj %%f + %JANET_COMPILE% /DJANET_BOOTSTRAP /Fobuild\boot\%%~nf.obj %%f @if errorlevel 1 goto :BUILDFAIL ) for %%f in (src\boot\*.c) do ( - @%JANET_COMPILE% /DJANET_BOOTSTRAP /Fobuild\boot\%%~nf.obj %%f + %JANET_COMPILE% /DJANET_BOOTSTRAP /Fobuild\boot\%%~nf.obj %%f @if errorlevel 1 goto :BUILDFAIL ) %JANET_LINK% /out:build\janet_boot.exe build\boot\*.obj @@ -60,12 +65,12 @@ for %%f in (src\boot\*.c) do ( build\janet_boot build\core_image.c @rem Build the core image -@%JANET_COMPILE% /Fobuild\core_image.obj build\core_image.c +%JANET_COMPILE% /Fobuild\core_image.obj build\core_image.c @if errorlevel 1 goto :BUILDFAIL @rem Build the sources for %%f in (src\core\*.c) do ( - @%JANET_COMPILE% /Fobuild\core\%%~nf.obj %%f + %JANET_COMPILE% /Fobuild\core\%%~nf.obj %%f @if errorlevel 1 goto :BUILDFAIL ) @@ -74,7 +79,7 @@ rc /nologo /fobuild\janet_win.res janet_win.rc @rem Build the main client for %%f in (src\mainclient\*.c) do ( - @%JANET_COMPILE% /Fobuild\mainclient\%%~nf.obj %%f + %JANET_COMPILE% /Fobuild\mainclient\%%~nf.obj %%f @if errorlevel 1 goto :BUILDFAIL ) diff --git a/janet-installer.nsi b/janet-installer.nsi index 8719d42a..417222a6 100644 --- a/janet-installer.nsi +++ b/janet-installer.nsi @@ -32,7 +32,7 @@ Name "Janet" !define DOLLAR "$" !ifdef CHECK_${DOLLAR}%APPVEYOR_REPO_TAG_NAME% # We are not in the appveyor environment, use version name - !define OUTNAME_PART v${VERSION}-nonrelease- + !define OUTNAME_PART v${VERSION} !else # We are in appveyor, use git tag name for installer !define OUTNAME_PART ${OUTNAME} From 292be33b9d4f75c5e4da9628234c07d7a5a19774 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Mon, 19 Aug 2019 01:19:51 -0400 Subject: [PATCH 13/13] Fix some stack overflow bugs. --- CHANGELOG.md | 1 + meson_options.txt | 2 +- src/core/array.c | 4 +++- src/core/fiber.c | 18 ++++++++++++++---- src/core/vm.c | 3 +++ src/include/janet.h | 7 +++---- 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 063b8712..7bb0b8a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ All notable changes to this project will be documented in this file. ## Unreleased +- Change default fiber stack limit to the maximum value of a 32 bit signed integer. - Some bug fixes with `jpm` - Add `os/arch` to get ISA that janet was compiled for - Add color to stacktraces via `(dyn :err-color)` diff --git a/meson_options.txt b/meson_options.txt index afa8f0b9..b63c8ec1 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -14,7 +14,7 @@ option('int_types', type : 'boolean', value : true) option('recursion_guard', type : 'integer', min : 10, max : 8000, value : 1024) option('max_proto_depth', type : 'integer', min : 10, max : 8000, value : 200) option('max_macro_expand', type : 'integer', min : 1, max : 8000, value : 200) -option('stack_max', type : 'integer', min : 8096, max : 1000000000, value : 16384) +option('stack_max', type : 'integer', min : 8096, max : 0x7fffffff, value : 0x7fffffff) option('arch_name', type : 'string', value: '') option('os_name', type : 'string', value: '') diff --git a/src/core/array.c b/src/core/array.c index 62fa7844..39acff80 100644 --- a/src/core/array.c +++ b/src/core/array.c @@ -64,7 +64,9 @@ void janet_array_ensure(JanetArray *array, int32_t capacity, int32_t growth) { Janet *newData; Janet *old = array->data; if (capacity <= array->capacity) return; - capacity *= growth; + int64_t new_capacity = capacity * growth; + if (new_capacity > INT32_MAX) new_capacity = INT32_MAX; + capacity = (int32_t) new_capacity; newData = realloc(old, capacity * sizeof(Janet)); if (NULL == newData) { JANET_OUT_OF_MEMORY; diff --git a/src/core/fiber.c b/src/core/fiber.c index d4fa5e82..cb1eea93 100644 --- a/src/core/fiber.c +++ b/src/core/fiber.c @@ -87,19 +87,27 @@ void janet_fiber_setcapacity(JanetFiber *fiber, int32_t n) { fiber->capacity = n; } +/* Grow fiber if needed */ +static void janet_fiber_grow(JanetFiber *fiber, int32_t needed) { + int32_t cap = needed > (INT32_MAX / 2) ? INT32_MAX : 2 * needed; + janet_fiber_setcapacity(fiber, cap); +} + /* Push a value on the next stack frame */ void janet_fiber_push(JanetFiber *fiber, Janet x) { + if (fiber->stacktop == INT32_MAX) janet_panic("stack overflow"); if (fiber->stacktop >= fiber->capacity) { - janet_fiber_setcapacity(fiber, 2 * fiber->stacktop); + janet_fiber_grow(fiber, fiber->stacktop); } fiber->data[fiber->stacktop++] = x; } /* Push 2 values on the next stack frame */ void janet_fiber_push2(JanetFiber *fiber, Janet x, Janet y) { + if (fiber->stacktop >= INT32_MAX - 1) janet_panic("stack overflow"); int32_t newtop = fiber->stacktop + 2; if (newtop > fiber->capacity) { - janet_fiber_setcapacity(fiber, 2 * newtop); + janet_fiber_grow(fiber, newtop); } fiber->data[fiber->stacktop] = x; fiber->data[fiber->stacktop + 1] = y; @@ -108,9 +116,10 @@ void janet_fiber_push2(JanetFiber *fiber, Janet x, Janet y) { /* Push 3 values on the next stack frame */ void janet_fiber_push3(JanetFiber *fiber, Janet x, Janet y, Janet z) { + if (fiber->stacktop >= INT32_MAX - 2) janet_panic("stack overflow"); int32_t newtop = fiber->stacktop + 3; if (newtop > fiber->capacity) { - janet_fiber_setcapacity(fiber, 2 * newtop); + janet_fiber_grow(fiber, newtop); } fiber->data[fiber->stacktop] = x; fiber->data[fiber->stacktop + 1] = y; @@ -120,9 +129,10 @@ void janet_fiber_push3(JanetFiber *fiber, Janet x, Janet y, Janet z) { /* Push an array on the next stack frame */ void janet_fiber_pushn(JanetFiber *fiber, const Janet *arr, int32_t n) { + if (fiber->stacktop > INT32_MAX - n) janet_panic("stack overflow"); int32_t newtop = fiber->stacktop + n; if (newtop > fiber->capacity) { - janet_fiber_setcapacity(fiber, 2 * newtop); + janet_fiber_grow(fiber, newtop); } memcpy(fiber->data + fiber->stacktop, arr, n * sizeof(Janet)); fiber->stacktop = newtop; diff --git a/src/core/vm.c b/src/core/vm.c index 21bec2e8..7a2016a8 100644 --- a/src/core/vm.c +++ b/src/core/vm.c @@ -628,6 +628,9 @@ static JanetSignal run_vm(JanetFiber *fiber, Janet in, JanetFiberStatus status) VM_OP(JOP_TAILCALL) { Janet callee = stack[D]; + if (fiber->stacktop > fiber->maxstack) { + vm_throw("stack overflow"); + } if (janet_checktype(callee, JANET_KEYWORD)) { vm_commit(); callee = resolve_method(callee, fiber); diff --git a/src/include/janet.h b/src/include/janet.h index b8c651db..1d597ae9 100644 --- a/src/include/janet.h +++ b/src/include/janet.h @@ -171,11 +171,10 @@ extern "C" { /* Maximum depth to follow table prototypes before giving up and returning nil. */ #define JANET_MAX_MACRO_EXPAND 200 -/* Define max stack size for stacks before raising a stack overflow error. - * If this is not defined, fiber stacks can grow without limit (until memory - * runs out) */ +/* Define default max stack size for stacks before raising a stack overflow error. + * This can also be set on a per fiber basis. */ #ifndef JANET_STACK_MAX -#define JANET_STACK_MAX 16384 +#define JANET_STACK_MAX 0x7fffffff #endif /* Use nanboxed values - uses 8 bytes per value instead of 12 or 16.