Skip to content

Commit

Permalink
Merge pull request #246 from jow-/fix-upvalue-resolve
Browse files Browse the repository at this point in the history
vm: resolve upvalues before pushing them onto the stack
  • Loading branch information
jow- authored Nov 29, 2024
2 parents 3408edf + ed5ce8f commit 1323a27
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 118 deletions.
53 changes: 0 additions & 53 deletions .github/workflows/openwrt-ci-master.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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/
53 changes: 0 additions & 53 deletions .github/workflows/openwrt-ci-pull-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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/
27 changes: 27 additions & 0 deletions tests/custom/99_bugs/50_missing_upvalue_resolving
Original file line number Diff line number Diff line change
@@ -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 --
48 changes: 37 additions & 11 deletions types.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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);
}
Expand Down
2 changes: 1 addition & 1 deletion vm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down

0 comments on commit 1323a27

Please sign in to comment.