diff options
-rw-r--r-- | .github/workflows/openwrt-ci-master.yml | 53 | ||||
-rw-r--r-- | .github/workflows/openwrt-ci-pull-request.yml | 53 | ||||
-rw-r--r-- | tests/custom/99_bugs/50_missing_upvalue_resolving | 27 | ||||
-rw-r--r-- | types.c | 48 | ||||
-rw-r--r-- | vm.c | 2 |
5 files changed, 65 insertions, 118 deletions
diff --git a/.github/workflows/openwrt-ci-master.yml b/.github/workflows/openwrt-ci-master.yml index fda3f80..f95c924 100644 --- a/.github/workflows/openwrt-ci-master.yml +++ b/.github/workflows/openwrt-ci-master.yml @@ -32,56 +32,3 @@ jobs: path: | build/scan tests/cram/**/*.t.err - - sdk_build: - name: Build with OpenWrt ${{ matrix.arch }} SDK - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - include: - - arch: mips_24kc - target: ath79-generic - - - arch: arm_cortex-a9_neon - target: imx-cortexa9 - - - arch: mipsel_24kc - target: malta-le - - - arch: aarch64_cortex-a53 - target: mediatek-mt7622 - - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Determine branch name - run: | - BRANCH="${GITHUB_BASE_REF#refs/heads/}" - echo "Building for $BRANCH" - echo "BRANCH=$BRANCH" >> $GITHUB_ENV - - - name: Build with OpenWrt ${{ matrix.arch }} SDK - uses: openwrt/gh-action-sdk@v5 - env: - ARCH: ${{ matrix.arch }} - FEEDNAME: ucode_ci - PACKAGES: ucode - - - name: Move created packages to project dir - run: cp bin/packages/${{ matrix.arch }}/ucode_ci/*.ipk . || true - - - name: Store packages - uses: actions/upload-artifact@v3 - with: - name: ${{ matrix.arch }}-packages - path: "*.ipk" - - - name: Store logs - uses: actions/upload-artifact@v3 - with: - name: ${{ matrix.arch }}-logs - path: logs/ diff --git a/.github/workflows/openwrt-ci-pull-request.yml b/.github/workflows/openwrt-ci-pull-request.yml index e8c29c1..8d6ad34 100644 --- a/.github/workflows/openwrt-ci-pull-request.yml +++ b/.github/workflows/openwrt-ci-pull-request.yml @@ -34,56 +34,3 @@ jobs: path: | build/scan tests/cram/**/*.t.err - - sdk_build: - name: Build with OpenWrt ${{ matrix.arch }} SDK - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - include: - - arch: mips_24kc - target: ath79-generic - - - arch: arm_cortex-a9_neon - target: imx-cortexa9 - - - arch: mipsel_24kc - target: malta-le - - - arch: aarch64_cortex-a53 - target: mediatek-mt7622 - - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Determine branch name - run: | - BRANCH="${GITHUB_BASE_REF#refs/heads/}" - echo "Building for $BRANCH" - echo "BRANCH=$BRANCH" >> $GITHUB_ENV - - - name: Build with OpenWrt ${{ matrix.arch }} SDK - uses: openwrt/gh-action-sdk@v5 - env: - ARCH: ${{ matrix.arch }} - FEEDNAME: ucode_ci - PACKAGES: ucode - - - name: Move created packages to project dir - run: cp bin/packages/${{ matrix.arch }}/ucode_ci/*.ipk . || true - - - name: Store packages - uses: actions/upload-artifact@v3 - with: - name: ${{ matrix.arch }}-packages - path: "*.ipk" - - - name: Store logs - uses: actions/upload-artifact@v3 - with: - name: ${{ matrix.arch }}-logs - path: logs/ diff --git a/tests/custom/99_bugs/50_missing_upvalue_resolving b/tests/custom/99_bugs/50_missing_upvalue_resolving new file mode 100644 index 0000000..5e96634 --- /dev/null +++ b/tests/custom/99_bugs/50_missing_upvalue_resolving @@ -0,0 +1,27 @@ +Commit e5fe6b1 ("treewide: refactor vector usage code") accidentially dropped +the upvalue resolving logic from uc_vm_stack_push(), leading to unresolved +upvalues leaking into the script execution context. + +-- File test.uc -- +export let obj = { foo: true, bar: false }; +-- End -- + +-- Testcase -- +import * as test from "./files/test.uc"; + +printf("%.J\n", [ + type(test.obj), + test.obj.foo +]); +-- End -- + +-- Args -- +-R +-- End -- + +-- Expect stdout -- +[ + "object", + true +] +-- End -- @@ -2237,8 +2237,9 @@ uc_value_t * ucv_key_get(uc_vm_t *vm, uc_value_t *scope, uc_value_t *key) { uc_value_t *o, *v = NULL; + bool found = false; + uc_upvalref_t *ref; int64_t idx; - bool found; char *k; if (ucv_type(scope) == UC_ARRAY) { @@ -2247,23 +2248,48 @@ ucv_key_get(uc_vm_t *vm, uc_value_t *scope, uc_value_t *key) if (idx < 0 && idx > INT64_MIN && (uint64_t)llabs(idx) <= ucv_array_length(scope)) idx += ucv_array_length(scope); - if (idx >= 0 && (uint64_t)idx < ucv_array_length(scope)) - return ucv_get(ucv_array_get(scope, idx)); + if (idx >= 0 && (uint64_t)idx < ucv_array_length(scope)) { + v = ucv_array_get(scope, idx); + found = true; + } } - k = ucv_key_to_string(vm, key); + if (!found) { + k = ucv_key_to_string(vm, key); + + for (o = scope; o; o = ucv_prototype_get(o)) { + if (ucv_type(o) != UC_OBJECT) + continue; - for (o = scope; o; o = ucv_prototype_get(o)) { - if (ucv_type(o) != UC_OBJECT) - continue; + v = ucv_object_get(o, k ? k : ucv_string_get(key), &found); - v = ucv_object_get(o, k ? k : ucv_string_get(key), &found); + if (found) + break; + } - if (found) - break; + free(k); } - free(k); + /* Handle upvalue values in objects; under some specific circumstances + objects may contain upvalues, this primarily happens with wildcard module + import namespace dictionaries. */ +#ifdef __clang_analyzer__ + /* Clang static analyzer does not understand that ucv_type(NULL) can't + * possibly yield UC_UPVALUE. Nudge it. */ + if (v != NULL && ucv_type(v) == UC_UPVALUE) +#else + if (ucv_type(v) == UC_UPVALUE) +#endif + { + ref = (uc_upvalref_t *)v; + + if (ref->closed) + return ucv_get(ref->value); + else if (vm) + return ucv_get(vm->stack.entries[ref->slot]); + else + return NULL; + } return ucv_get(v); } @@ -431,7 +431,7 @@ uc_vm_resolve_upval(uc_vm_t *vm, uc_value_t *value) void uc_vm_stack_push(uc_vm_t *vm, uc_value_t *value) { - uc_vector_push(&vm->stack, value); + uc_vector_push(&vm->stack, uc_vm_resolve_upval(vm, value)); if (vm->trace) { fprintf(stderr, " [+%zd] %s\n", |