Impr: More restrictive bool constructor and unary operator ! - #2739
Impr: More restrictive bool constructor and unary operator !#2739cieplypolar wants to merge 4 commits into
Conversation
|
pkg.pr.new packages benchmark commit |
Resolution Time Benchmark---
config:
themeVariables:
xyChart:
plotColorPalette: "#E63946, #3B82F6, #059669"
---
xychart
title "Random Branching (🔴 PR | 🔵 main | 🟢 release)"
x-axis "max depth" [1, 2, 3, 4, 5, 6, 7, 8]
y-axis "time (ms)"
line [0.94, 1.85, 4.04, 6.07, 7.30, 12.12, 23.08, 23.00]
line [0.94, 1.85, 4.19, 6.24, 7.38, 10.97, 23.04, 24.75]
line [0.95, 2.03, 4.36, 6.95, 7.57, 11.36, 22.65, 24.39]
---
config:
themeVariables:
xyChart:
plotColorPalette: "#E63946, #3B82F6, #059669"
---
xychart
title "Linear Recursion (🔴 PR | 🔵 main | 🟢 release)"
x-axis "max depth" [1, 2, 3, 4, 5, 6, 7, 8]
y-axis "time (ms)"
line [0.31, 0.52, 0.65, 0.87, 1.10, 1.15, 1.39, 1.53]
line [0.32, 0.52, 0.70, 0.84, 1.08, 1.17, 1.42, 1.53]
line [0.34, 0.55, 0.71, 0.89, 1.14, 1.15, 1.45, 1.61]
---
config:
themeVariables:
xyChart:
plotColorPalette: "#E63946, #3B82F6, #059669"
---
xychart
title "Full Tree (🔴 PR | 🔵 main | 🟢 release)"
x-axis "max depth" [1, 2, 3, 4, 5, 6, 7, 8]
y-axis "time (ms)"
line [0.78, 2.15, 3.46, 6.81, 12.76, 25.75, 53.94, 110.20]
line [0.82, 2.11, 4.45, 6.92, 13.21, 25.44, 52.69, 108.55]
line [0.89, 2.05, 4.30, 6.52, 13.12, 26.48, 55.81, 113.74]
|
Bundle size comparison (
|
| 🟢 Decreased | ➖ Unchanged | 🔴 Increased (max 5.53%) | ❔ Unknown |
|---|---|---|---|
| 0 | 37 | 285 | 0 |
import * as ... in PR vs import * as ... in target (did bundle size increase?):
Click to reveal the results table (263 entries).
| Test | tsdown |
|---|---|
| d_bool.ts | 13.93 kB ( |
| d_f16.ts | 13.93 kB ( |
| d_f32.ts | 13.93 kB ( |
| d_i32.ts | 13.93 kB ( |
| d_u32.ts | 13.93 kB ( |
| d_u16.ts | 13.96 kB ( |
| d_textureDepth2d.ts | 14.38 kB ( |
| d_textureDepthCube.ts | 14.38 kB ( |
| d_texture1d.ts | 14.39 kB ( |
| d_texture2d.ts | 14.39 kB ( |
| d_texture3d.ts | 14.39 kB ( |
| d_textureCube.ts | 14.39 kB ( |
| d_textureDepth2dArray.ts | 14.39 kB ( |
| d_textureDepthCubeArray.ts | 14.40 kB ( |
| d_textureDepthMultisampled2d.ts | 14.40 kB ( |
| d_texture2dArray.ts | 14.40 kB ( |
| d_textureCubeArray.ts | 14.41 kB ( |
| d_textureMultisampled2d.ts | 14.41 kB ( |
| std_discard.ts | 15.22 kB ( |
| std_isBeingTranspiled.ts | 15.31 kB ( |
| std_getTargetShaderLanguage.ts | 15.38 kB ( |
| std_extensionEnabled.ts | 15.43 kB ( |
| std_copy.ts | 15.47 kB ( |
| std_arrayLength.ts | 15.47 kB ( |
| std_range.ts | 15.70 kB ( |
| d_disarrayOf.ts | 15.87 kB ( |
| std_dpdx.ts | 16.19 kB ( |
| std_dpdxCoarse.ts | 16.19 kB ( |
| std_dpdxFine.ts | 16.19 kB ( |
| std_dpdy.ts | 16.19 kB ( |
| std_dpdyCoarse.ts | 16.19 kB ( |
| std_dpdyFine.ts | 16.19 kB ( |
| std_fwidth.ts | 16.19 kB ( |
| std_fwidthCoarse.ts | 16.19 kB ( |
| std_fwidthFine.ts | 16.19 kB ( |
| std_atomicLoad.ts | 16.99 kB ( |
| std_atomicStore.ts | 16.99 kB ( |
| std_textureBarrier.ts | 16.99 kB ( |
| std_atomicAdd.ts | 17.00 kB ( |
| std_atomicAnd.ts | 17.00 kB ( |
| std_atomicMax.ts | 17.00 kB ( |
| std_atomicMin.ts | 17.00 kB ( |
| std_atomicOr.ts | 17.00 kB ( |
| std_atomicSub.ts | 17.00 kB ( |
| std_atomicXor.ts | 17.00 kB ( |
| std_storageBarrier.ts | 17.00 kB ( |
| std_workgroupBarrier.ts | 17.00 kB ( |
| d_vec2b.ts | 20.36 kB ( |
| d_vec2f.ts | 20.36 kB ( |
| d_vec2h.ts | 20.36 kB ( |
| d_vec2i.ts | 20.36 kB ( |
| d_vec2u.ts | 20.36 kB ( |
| d_vec3b.ts | 20.36 kB ( |
| d_vec3f.ts | 20.36 kB ( |
| d_vec3h.ts | 20.36 kB ( |
| d_vec3i.ts | 20.36 kB ( |
| d_vec3u.ts | 20.36 kB ( |
| d_vec4b.ts | 20.36 kB ( |
| d_vec4f.ts | 20.36 kB ( |
| d_vec4h.ts | 20.36 kB ( |
| d_vec4i.ts | 20.36 kB ( |
| d_vec4u.ts | 20.36 kB ( |
| d_uint8.ts | 21.86 kB ( |
| d_float16.ts | 21.87 kB ( |
| d_float16x2.ts | 21.87 kB ( |
| d_float16x4.ts | 21.87 kB ( |
| d_float32.ts | 21.87 kB ( |
| d_float32x2.ts | 21.87 kB ( |
| d_float32x3.ts | 21.87 kB ( |
| d_float32x4.ts | 21.87 kB ( |
| d_sint16.ts | 21.87 kB ( |
| d_sint16x2.ts | 21.87 kB ( |
| d_sint16x4.ts | 21.87 kB ( |
| d_sint32.ts | 21.87 kB ( |
| d_sint32x2.ts | 21.87 kB ( |
| d_sint32x3.ts | 21.87 kB ( |
| d_sint32x4.ts | 21.87 kB ( |
| d_sint8.ts | 21.87 kB ( |
| d_sint8x2.ts | 21.87 kB ( |
| d_sint8x4.ts | 21.87 kB ( |
| d_snorm16.ts | 21.87 kB ( |
| d_snorm16x2.ts | 21.87 kB ( |
| d_snorm16x4.ts | 21.87 kB ( |
| d_snorm8.ts | 21.87 kB ( |
| d_snorm8x2.ts | 21.87 kB ( |
| d_snorm8x4.ts | 21.87 kB ( |
| d_uint16.ts | 21.87 kB ( |
| d_uint16x2.ts | 21.87 kB ( |
| d_uint16x4.ts | 21.87 kB ( |
| d_uint32.ts | 21.87 kB ( |
| d_uint32x2.ts | 21.87 kB ( |
| d_uint32x3.ts | 21.87 kB ( |
| d_uint32x4.ts | 21.87 kB ( |
| d_uint8x2.ts | 21.87 kB ( |
| d_uint8x4.ts | 21.87 kB ( |
| d_unorm10_10_10_2.ts | 21.87 kB ( |
| d_unorm16.ts | 21.87 kB ( |
| d_unorm16x2.ts | 21.87 kB ( |
| d_unorm16x4.ts | 21.87 kB ( |
| d_unorm8.ts | 21.87 kB ( |
| d_unorm8x2.ts | 21.87 kB ( |
| d_unorm8x4.ts | 21.87 kB ( |
| d_unorm8x4_bgra.ts | 21.87 kB ( |
| d_formatToWGSLType.ts | 21.86 kB ( |
| d_packedFormats.ts | 21.88 kB ( |
| d_isPackedData.ts | 21.93 kB ( |
| d_alignmentOf.ts | 22.81 kB ( |
| std_subgroupAdd.ts | 25.31 kB ( |
| std_subgroupAll.ts | 25.32 kB ( |
| std_subgroupAnd.ts | 25.32 kB ( |
| std_subgroupAny.ts | 25.32 kB ( |
| std_subgroupBallot.ts | 25.32 kB ( |
| std_subgroupBroadcast.ts | 25.32 kB ( |
| std_subgroupBroadcastFirst.ts | 25.32 kB ( |
| std_subgroupElect.ts | 25.32 kB ( |
| std_subgroupExclusiveAdd.ts | 25.32 kB ( |
| std_subgroupExclusiveMul.ts | 25.32 kB ( |
| std_subgroupInclusiveAdd.ts | 25.32 kB ( |
| std_subgroupInclusiveMul.ts | 25.32 kB ( |
| std_subgroupMax.ts | 25.32 kB ( |
| std_subgroupMin.ts | 25.32 kB ( |
| std_subgroupMul.ts | 25.32 kB ( |
| std_subgroupOr.ts | 25.32 kB ( |
| std_subgroupShuffle.ts | 25.32 kB ( |
| std_subgroupShuffleDown.ts | 25.32 kB ( |
| std_subgroupShuffleUp.ts | 25.32 kB ( |
| std_subgroupShuffleXor.ts | 25.32 kB ( |
| std_subgroupXor.ts | 25.32 kB ( |
| d_isBuiltin.ts | 25.54 kB ( |
| d_sizeOf.ts | 25.59 kB ( |
| d_isContiguous.ts | 25.60 kB ( |
| d_getLongestContiguousPrefix.ts | 25.61 kB ( |
| std_textureDimensions.ts | 26.92 kB ( |
| std_textureGather.ts | 26.92 kB ( |
| std_textureLoad.ts | 26.93 kB ( |
| std_textureSample.ts | 26.93 kB ( |
| std_textureSampleBaseClampToEdge.ts | 26.93 kB ( |
| std_textureSampleBias.ts | 26.93 kB ( |
| std_textureSampleCompare.ts | 26.93 kB ( |
| std_textureSampleCompareLevel.ts | 26.93 kB ( |
| std_textureSampleGrad.ts | 26.93 kB ( |
| std_textureSampleLevel.ts | 26.93 kB ( |
| std_textureStore.ts | 26.93 kB ( |
| d_arrayOf.ts | 27.03 kB ( |
| d_size.ts | 27.28 kB ( |
| d_align.ts | 27.28 kB ( |
| d_location.ts | 27.28 kB ( |
| d_interpolate.ts | 27.28 kB ( |
| d_invariant.ts | 27.65 kB ( |
| std_identity2.ts | 27.98 kB ( |
| std_identity3.ts | 27.98 kB ( |
| std_identity4.ts | 27.98 kB ( |
| std_rotationX4.ts | 27.98 kB ( |
| std_rotationY4.ts | 27.98 kB ( |
| std_rotationZ4.ts | 27.98 kB ( |
| std_scaling4.ts | 27.98 kB ( |
| d_mat4x4f.ts | 27.98 kB ( |
| d_mat2x2f.ts | 27.98 kB ( |
| d_mat3x3f.ts | 27.98 kB ( |
| std_translation4.ts | 27.98 kB ( |
| d_matToArray.ts | 28.11 kB ( |
| d_builtin.ts | 29.49 kB ( |
| std_pack2x16float.ts | 37.03 kB ( |
| std_pack4x8unorm.ts | 37.03 kB ( |
| std_unpack2x16float.ts | 37.03 kB ( |
| std_unpack4x8unorm.ts | 37.03 kB ( |
| common_fullScreenTriangle.ts | 41.30 kB ( |
| common_writeSoA.ts | 42.15 kB ( |
| d_memoryLayoutOf.ts | 42.91 kB ( |
| STATIC_common.ts | 58.07 kB ( |
| std_bitcastF32toU32.ts | 47.59 kB ( |
| std_bitcastU32toF32.ts | 47.59 kB ( |
| std_bitcastU32toI32.ts | 47.59 kB ( |
| std_bitcast.ts | 47.60 kB ( |
| std_neg.ts | 49.40 kB ( |
| std_add.ts | 49.41 kB ( |
| std_bitShiftLeft.ts | 49.41 kB ( |
| std_bitShiftRight.ts | 49.41 kB ( |
| std_div.ts | 49.41 kB ( |
| std_mod.ts | 49.41 kB ( |
| std_mul.ts | 49.41 kB ( |
| std_sub.ts | 49.41 kB ( |
| std_rotateX4.ts | 50.24 kB ( |
| std_scale4.ts | 50.24 kB ( |
| std_translate4.ts | 50.24 kB ( |
| std_rotateY4.ts | 50.25 kB ( |
| std_rotateZ4.ts | 50.25 kB ( |
| std_dot.ts | 67.94 kB ( |
| std_length.ts | 67.94 kB ( |
| std_distance.ts | 67.94 kB ( |
| std_dot4U8Packed.ts | 67.94 kB ( |
| std_fract.ts | 67.94 kB ( |
| std_frexp.ts | 67.94 kB ( |
| std_mix.ts | 67.94 kB ( |
| std_modf.ts | 67.94 kB ( |
| std_abs.ts | 67.95 kB ( |
| std_acos.ts | 67.95 kB ( |
| std_acosh.ts | 67.95 kB ( |
| std_asin.ts | 67.95 kB ( |
| std_asinh.ts | 67.95 kB ( |
| std_atan.ts | 67.95 kB ( |
| std_atan2.ts | 67.95 kB ( |
| std_atanh.ts | 67.95 kB ( |
| std_ceil.ts | 67.95 kB ( |
| std_clamp.ts | 67.95 kB ( |
| std_cos.ts | 67.95 kB ( |
| std_cosh.ts | 67.95 kB ( |
| std_countLeadingZeros.ts | 67.95 kB ( |
| std_countOneBits.ts | 67.95 kB ( |
| std_countTrailingZeros.ts | 67.95 kB ( |
| std_cross.ts | 67.95 kB ( |
| std_degrees.ts | 67.95 kB ( |
| std_determinant.ts | 67.95 kB ( |
| std_dot4I8Packed.ts | 67.95 kB ( |
| std_exp.ts | 67.95 kB ( |
| std_exp2.ts | 67.95 kB ( |
| std_extractBits.ts | 67.95 kB ( |
| std_faceForward.ts | 67.95 kB ( |
| std_firstLeadingBit.ts | 67.95 kB ( |
| std_firstTrailingBit.ts | 67.95 kB ( |
| std_floor.ts | 67.95 kB ( |
| std_fma.ts | 67.95 kB ( |
| std_insertBits.ts | 67.95 kB ( |
| std_inverseSqrt.ts | 67.95 kB ( |
| std_ldexp.ts | 67.95 kB ( |
| std_log.ts | 67.95 kB ( |
| std_log2.ts | 67.95 kB ( |
| std_max.ts | 67.95 kB ( |
| std_min.ts | 67.95 kB ( |
| std_normalize.ts | 67.95 kB ( |
| std_pow.ts | 67.95 kB ( |
| std_quantizeToF16.ts | 67.95 kB ( |
| std_radians.ts | 67.95 kB ( |
| std_reflect.ts | 67.95 kB ( |
| std_refract.ts | 67.95 kB ( |
| std_reverseBits.ts | 67.95 kB ( |
| std_round.ts | 67.95 kB ( |
| std_saturate.ts | 67.95 kB ( |
| std_sign.ts | 67.95 kB ( |
| std_sin.ts | 67.95 kB ( |
| std_sinh.ts | 67.95 kB ( |
| std_smoothstep.ts | 67.95 kB ( |
| std_sqrt.ts | 67.95 kB ( |
| std_step.ts | 67.95 kB ( |
| std_tan.ts | 67.95 kB ( |
| std_tanh.ts | 67.95 kB ( |
| std_transpose.ts | 67.95 kB ( |
| std_trunc.ts | 67.95 kB ( |
| STATIC_d.ts | 88.44 kB ( |
| std_and.ts | 52.77 kB ( |
| std_or.ts | 52.77 kB ( |
| std_all.ts | 52.77 kB ( |
| std_allEq.ts | 52.77 kB ( |
| std_eq.ts | 52.77 kB ( |
| std_lt.ts | 52.77 kB ( |
| std_ne.ts | 52.77 kB ( |
| std_not.ts | 52.77 kB ( |
| std_select.ts | 52.77 kB ( |
| std_any.ts | 52.78 kB ( |
| std_ge.ts | 52.78 kB ( |
| std_gt.ts | 52.78 kB ( |
| std_isCloseTo.ts | 52.78 kB ( |
| std_le.ts | 52.78 kB ( |
import { ... } in PR vs import * as ... in PR (is the library tree-Shakeable?):
| Test | tsdown |
|---|---|
| tgpu_init.ts | 260.07 kB ( |
| tgpu_initFromDevice.ts | 259.56 kB ( |
| tgpu_resolve.ts | 165.77 kB ( |
| tgpu_resolveWithContext.ts | 165.70 kB ( |
| tgpu_bindGroupLayout.ts | 69.50 kB ( |
| tgpu_mutableAccessor.ts | 66.51 kB ( |
| tgpu_accessor.ts | 66.49 kB ( |
| tgpu_privateVar.ts | 65.84 kB ( |
| tgpu_workgroupVar.ts | 65.84 kB ( |
| tgpu_const.ts | 65.08 kB ( |
| tgpu_fn.ts | 38.87 kB ( |
| tgpu_fragmentFn.ts | 38.87 kB ( |
| tgpu_vertexFn.ts | 38.68 kB ( |
| tgpu_computeFn.ts | 38.39 kB ( |
| tgpu_vertexLayout.ts | 27.51 kB ( |
| tgpu_comptime.ts | 15.21 kB ( |
| tgpu_unroll.ts | 1.66 kB ( |
| tgpu_slot.ts | 1.54 kB ( |
| tgpu_lazy.ts | 1.19 kB ( |
If you wish to run a comparison for other, slower bundlers, run the 'Tree-shake test' from the GitHub Actions menu.
There was a problem hiding this comment.
Reviewed changes — Restrict d.bool() to accept only number | boolean, tighten std.not to booleans and boolean vectors, and make the TGSL unary ! operator reject non-boolean runtime operands.
- Added documentation warning about JS-truthiness undefined behavior in WGSL.
- Updated the
Booltype to disallowundefinedconstructor arguments at the type level. - Added
isVecBoolInstanceruntime guard for boolean vector instances. - Simplified
cpuNotandstd.notcodegen to only handle booleans and boolean vectors. - Updated the WGSL generator's unary
!to throw on non-bool runtime operands and point users tostd.notfor component-wise vector negation. - Added comprehensive tests for the new restrictions and removed obsolete numeric/non-primitive test cases.
✅ No new issues found.
All related test suites pass (numeric, std/boolean/not, tgsl/wgslGenerator, tgsl/sideEffects, and the tgsl-parsing-test individual example).
Kimi K2 (free via Pullfrog for OSS) | 𝕏
d47ced9 to
c289c5f
Compare
There was a problem hiding this comment.
Reviewed changes — All four commits are new since the prior review (force-pushed). Tightened d.bool() to accept only number | boolean with finite-math guard, restricted TGSL unary ! to boolean-only runtime operands, and limited std.not to booleans and boolean vectors.
- Restricted
d.bool()— throws on non-number/non-boolean arguments, enforces finite math, and uses intersection type((v: number | boolean) => boolean) & (() => boolean)to rejectundefinedat the type level. - Restricted unary
!— runtime operands must bebool; boolean vectors get a helpful error pointing tostd.not. Comptime-known operands still fold with JS semantics. - Restricted
std.not— accepts onlyboolean | v2b | v3b | v4b, throwingSignatureNotSupportedErrorfor anything else. Removed numeric vector conversion path. - Added
isVecBoolInstanceguard inwgslTypes.tsfor boolean-vector instance checks. - Added docs warning about JS-truthiness undefined behavior in WGSL, with a concrete example of the
!!eloop anti-pattern. - Updated tests — comprehensive coverage of new restrictions; removed obsolete numeric/non-primitive test cases for
!andstd.not.
The cpuNot implementation preserves correct overloads for (value: boolean): boolean and (value: AnyBooleanVecInstance): AnyBooleanVecInstance. The not import in wgslGenerator.ts is used only for the error-message hint and does not introduce circular dependencies. The side-effects test correctly swapped impureInt for impureBool to match the new boolean-only contract. Generated WGSL for std.not(vecB) simplified from !(v) to !v with no precedence change.
✅ No new issues found.
DeepSeek Pro (free via Pullfrog for OSS) (Kimi K2 not used — the program covers this model; add its provider key to run your pick) | 𝕏
c289c5f to
3c6fa4c
Compare

Closes #2701.