From c8434b3e4786a0d6b7bcdfaaab64c499510e709e Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Fri, 24 Apr 2026 13:57:07 +0200 Subject: [PATCH] fix: Error when resolving raw external array --- packages/typegpu/src/resolutionCtx.ts | 10 +-------- packages/typegpu/src/shared/stringify.ts | 4 ++++ packages/typegpu/tests/array.test.ts | 27 ++++++++++++++++++++---- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/packages/typegpu/src/resolutionCtx.ts b/packages/typegpu/src/resolutionCtx.ts index 49a012ad08..f12d51d14b 100644 --- a/packages/typegpu/src/resolutionCtx.ts +++ b/packages/typegpu/src/resolutionCtx.ts @@ -970,14 +970,6 @@ export class ResolutionCtxImpl implements ResolutionCtx { ); } - if (Array.isArray(item)) { - return snip( - stitch`array(${item.map((element) => this.resolve(element))})`, - UnknownData, - /* origin */ 'runtime', - ) as ResolvedSnippet; - } - if (schema && isWgslStruct(schema)) { return snip( stitch`${this.resolve(schema)}(${Object.entries(schema.propTypes).map(([key, propType]) => @@ -989,7 +981,7 @@ export class ResolutionCtxImpl implements ResolutionCtx { } throw new WgslTypeError( - `Value ${item} (as json: ${safeStringify(item)}) is not resolvable${ + `Value ${safeStringify(item)} is not resolvable${ schema ? ` to type ${safeStringify(schema)}` : '' }`, ); diff --git a/packages/typegpu/src/shared/stringify.ts b/packages/typegpu/src/shared/stringify.ts index 21bd8e8a1b..7af99b8e0e 100644 --- a/packages/typegpu/src/shared/stringify.ts +++ b/packages/typegpu/src/shared/stringify.ts @@ -1,6 +1,10 @@ import { isMatInstance, isVecInstance } from '../data/wgslTypes.ts'; export function safeStringify(item: unknown): string { + if (Array.isArray(item)) { + return `[${item.map(safeStringify).join(', ')}]`; + } + const asString = String(item); if (asString !== '[object Object]') { return asString; diff --git a/packages/typegpu/tests/array.test.ts b/packages/typegpu/tests/array.test.ts index c4de72d5fc..b141b9146b 100644 --- a/packages/typegpu/tests/array.test.ts +++ b/packages/typegpu/tests/array.test.ts @@ -193,18 +193,21 @@ describe('array', () => { it('generates correct code when array clone is used', () => { const ArraySchema = d.arrayOf(d.u32, 1); - const f = (arr: d.Infer) => { + function f(arr: d.InferGPU) { 'use gpu'; const clone = ArraySchema(arr); - }; + } - const testFn = () => { + const external = [3]; + + function testFn() { 'use gpu'; const myArray = ArraySchema([d.u32(10)]); const myClone = ArraySchema(myArray); + const myExternal = ArraySchema(external); f(myArray); return; - }; + } expect(tgpu.resolve([testFn])).toMatchInlineSnapshot(` "fn f(arr: array) { @@ -214,6 +217,7 @@ describe('array', () => { fn testFn() { var myArray = array(10u); var myClone = myArray; + var myExternal = array(3u); f(myArray); return; }" @@ -538,6 +542,21 @@ describe('array', () => { }" `); }); + + it('throws when trying to resolve an untyped external array', () => { + const arr = [1, 2, 3]; + function main() { + 'use gpu'; + arr; + } + + expect(() => tgpu.resolve([main])).toThrowErrorMatchingInlineSnapshot(` + [Error: Resolution of the following tree failed: + - + - fn*:main + - fn*:main(): Value [1, 2, 3] is not resolvable] + `); + }); }); describe('array.length', () => {