numbl 0.4.7 → 0.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-browser/browser/index.d.ts +21 -0
- package/dist-browser/browser/mip.d.ts +10 -0
- package/dist-browser/browser/protocol.d.ts +59 -0
- package/dist-browser/browser/session.d.ts +55 -0
- package/dist-browser/browser/system-store.d.ts +30 -0
- package/dist-browser/browser/worker.d.ts +1 -0
- package/dist-browser/browser.js +131 -0
- package/dist-browser/db/operations.d.ts +25 -0
- package/dist-browser/db/schema.d.ts +26 -0
- package/dist-browser/graphics/axisLimits.d.ts +23 -0
- package/dist-browser/graphics/figuresReducer.d.ts +86 -0
- package/dist-browser/graphics/types.d.ts +423 -0
- package/dist-browser/hooks/useProjectFiles.d.ts +45 -0
- package/dist-browser/numbl-core/diagnostics/errors.d.ts +8 -0
- package/dist-browser/numbl-core/diagnostics/index.d.ts +27 -0
- package/dist-browser/numbl-core/executeCode.d.ts +108 -0
- package/dist-browser/numbl-core/executors/cache.d.ts +26 -0
- package/dist-browser/numbl-core/executors/classification.d.ts +134 -0
- package/dist-browser/numbl-core/executors/context.d.ts +76 -0
- package/dist-browser/numbl-core/executors/handleInline.d.ts +58 -0
- package/dist-browser/numbl-core/executors/index.d.ts +14 -0
- package/dist-browser/numbl-core/executors/jit/cJitCallExecutor.d.ts +35 -0
- package/dist-browser/numbl-core/executors/jit/cJitLoopExecutor.d.ts +31 -0
- package/dist-browser/numbl-core/executors/jit/cJitTopLevelExecutor.d.ts +29 -0
- package/dist-browser/numbl-core/executors/jit/callExecutor.d.ts +45 -0
- package/dist-browser/numbl-core/executors/jit/compileC.d.ts +51 -0
- package/dist-browser/numbl-core/executors/jit/compileC.node.d.ts +25 -0
- package/dist-browser/numbl-core/executors/jit/hostHelpers.d.ts +31 -0
- package/dist-browser/numbl-core/executors/jit/loopExecutor.d.ts +41 -0
- package/dist-browser/numbl-core/executors/jit/session.d.ts +17 -0
- package/dist-browser/numbl-core/executors/jit/topLevelExecutor.d.ts +36 -0
- package/dist-browser/numbl-core/executors/jit/typeAdapter.d.ts +28 -0
- package/dist-browser/numbl-core/executors/jit/typeAdapterC.d.ts +73 -0
- package/dist-browser/numbl-core/executors/jit/valueAdapter.d.ts +55 -0
- package/dist-browser/numbl-core/executors/jit/valueAdapterC.d.ts +108 -0
- package/dist-browser/numbl-core/executors/lowering.d.ts +120 -0
- package/dist-browser/numbl-core/executors/plugins.d.ts +41 -0
- package/dist-browser/numbl-core/executors/registry.d.ts +148 -0
- package/dist-browser/numbl-core/executors/types.d.ts +103 -0
- package/dist-browser/numbl-core/externalAccessDirective.d.ts +6 -0
- package/dist-browser/numbl-core/fileIOAdapter.d.ts +88 -0
- package/dist-browser/numbl-core/functionResolve.d.ts +70 -0
- package/dist-browser/numbl-core/helpers/arithmetic.d.ts +47 -0
- package/dist-browser/numbl-core/helpers/bessel.d.ts +49 -0
- package/dist-browser/numbl-core/helpers/check-helpers.d.ts +49 -0
- package/dist-browser/numbl-core/helpers/constants.d.ts +6 -0
- package/dist-browser/numbl-core/helpers/dummy.d.ts +5 -0
- package/dist-browser/numbl-core/helpers/effectively-real.d.ts +25 -0
- package/dist-browser/numbl-core/helpers/eigs-select.d.ts +25 -0
- package/dist-browser/numbl-core/helpers/erf.d.ts +5 -0
- package/dist-browser/numbl-core/helpers/gmres.d.ts +51 -0
- package/dist-browser/numbl-core/helpers/linsolve.d.ts +25 -0
- package/dist-browser/numbl-core/helpers/marching-cubes-tables.d.ts +10 -0
- package/dist-browser/numbl-core/helpers/marching-cubes.d.ts +46 -0
- package/dist-browser/numbl-core/helpers/ode-rk.d.ts +83 -0
- package/dist-browser/numbl-core/helpers/prng.d.ts +19 -0
- package/dist-browser/numbl-core/helpers/quadgk.d.ts +32 -0
- package/dist-browser/numbl-core/helpers/reduction/cumulative.d.ts +8 -0
- package/dist-browser/numbl-core/helpers/reduction/min-max.d.ts +5 -0
- package/dist-browser/numbl-core/helpers/reduction-helpers.d.ts +66 -0
- package/dist-browser/numbl-core/helpers/registry.d.ts +7 -0
- package/dist-browser/numbl-core/helpers/scanFormat.d.ts +11 -0
- package/dist-browser/numbl-core/helpers/shape-utils.d.ts +7 -0
- package/dist-browser/numbl-core/helpers/sparse-arithmetic.d.ts +16 -0
- package/dist-browser/numbl-core/helpers/string.d.ts +11 -0
- package/dist-browser/numbl-core/interpreter/builtins/arithmetic.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/array-construction.d.ts +10 -0
- package/dist-browser/numbl-core/interpreter/builtins/array-extras.d.ts +5 -0
- package/dist-browser/numbl-core/interpreter/builtins/array-manipulation.d.ts +7 -0
- package/dist-browser/numbl-core/interpreter/builtins/cell-struct.d.ts +5 -0
- package/dist-browser/numbl-core/interpreter/builtins/complex.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/datetime.d.ts +40 -0
- package/dist-browser/numbl-core/interpreter/builtins/dictionary.d.ts +15 -0
- package/dist-browser/numbl-core/interpreter/builtins/fft.d.ts +7 -0
- package/dist-browser/numbl-core/interpreter/builtins/gallery.d.ts +7 -0
- package/dist-browser/numbl-core/interpreter/builtins/geometry.d.ts +10 -0
- package/dist-browser/numbl-core/interpreter/builtins/graph.d.ts +29 -0
- package/dist-browser/numbl-core/interpreter/builtins/help-text.d.ts +5 -0
- package/dist-browser/numbl-core/interpreter/builtins/index.d.ts +39 -0
- package/dist-browser/numbl-core/interpreter/builtins/introspection.d.ts +6 -0
- package/dist-browser/numbl-core/interpreter/builtins/linear-algebra.d.ts +9 -0
- package/dist-browser/numbl-core/interpreter/builtins/logical.d.ts +9 -0
- package/dist-browser/numbl-core/interpreter/builtins/math.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/misc.d.ts +7 -0
- package/dist-browser/numbl-core/interpreter/builtins/numerical.d.ts +10 -0
- package/dist-browser/numbl-core/interpreter/builtins/predicates.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/prng.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/reductions.d.ts +6 -0
- package/dist-browser/numbl-core/interpreter/builtins/set-operations.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/sparse.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/special-math.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/string-extras.d.ts +5 -0
- package/dist-browser/numbl-core/interpreter/builtins/strings.d.ts +7 -0
- package/dist-browser/numbl-core/interpreter/builtins/time-system.d.ts +6 -0
- package/dist-browser/numbl-core/interpreter/builtins/type-constructors.d.ts +5 -0
- package/dist-browser/numbl-core/interpreter/builtins/types.d.ts +98 -0
- package/dist-browser/numbl-core/interpreter/builtins/utility.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/validation.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/interpreter.d.ts +199 -0
- package/dist-browser/numbl-core/interpreter/interpreterExec.d.ts +81 -0
- package/dist-browser/numbl-core/interpreter/interpreterFunctions.d.ts +62 -0
- package/dist-browser/numbl-core/interpreter/interpreterSpecialBuiltins.d.ts +35 -0
- package/dist-browser/numbl-core/interpreter/types.d.ts +114 -0
- package/dist-browser/numbl-core/jit/builtins/defs/_shared.d.ts +43 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/_elemwise.d.ts +123 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/minus.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mpower.d.ts +12 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mrdivide.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mtimes.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/plus.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/power.d.ts +30 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/rdivide.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/times.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/uminus.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/_compare.d.ts +12 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/eq.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/ge.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/gt.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/le.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/lt.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/ne.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/diag/assert.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/defs/io/_format_args.d.ts +17 -0
- package/dist-browser/numbl-core/jit/builtins/defs/io/disp.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/io/error.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/io/fprintf.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/io/sprintf.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/io/warning.d.ts +15 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/_shortcircuit.d.ts +30 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/_unary_pred.d.ts +30 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/and.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/andand.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/boolconst.d.ts +3 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/classBuiltin.d.ts +21 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/fieldnames.d.ts +15 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isa.d.ts +13 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/iscell.d.ts +8 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isempty.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isequal.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isfield.d.ts +20 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isinf.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isnan.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isnumeric.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isreal.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isscalar.d.ts +20 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isstruct.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/logical.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/not.d.ts +15 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/or.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/oror.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/strcmp.d.ts +21 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/typequery.d.ts +10 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/xor.d.ts +12 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/_complex_fold.d.ts +34 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/_unary_real.d.ts +51 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/abs.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/angle.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/asinh.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/atan.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/atan2.d.ts +3 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/besselh.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/ceil.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/conj.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/constants.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/cos.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/cosh.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/dot.d.ts +20 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/double.d.ts +28 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/exp.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/fix.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/floor.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/hypot.d.ts +3 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/imag.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/linspace.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/log.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/log10.d.ts +3 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/log2.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/logspace.d.ts +8 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/mod.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/norm.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/rand.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/real.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/rem.d.ts +3 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/round.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/sign.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/sin.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/sinh.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/sqrt.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/tan.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/tanh.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/uniquetol.d.ts +22 -0
- package/dist-browser/numbl-core/jit/builtins/defs/plot/dispatch.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/_cumulative.d.ts +49 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/_shape.d.ts +126 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/_variance.d.ts +17 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/all.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/any.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/cummax.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/cummin.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/cumprod.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/cumsum.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/diff.d.ts +16 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/length.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/max.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/mean.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/min.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/numel.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/prod.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/std.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/sum.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/var.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/_construct.d.ts +67 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/_triangular.d.ts +34 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/cat.d.ts +33 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/diag.d.ts +29 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/eye.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/flip.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/meshgrid.d.ts +12 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/ones.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/repmat.d.ts +37 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/reshape.d.ts +39 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/size.d.ts +20 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/sort.d.ts +19 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/transpose.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/tril.d.ts +16 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/triu.d.ts +16 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/zeros.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/system/deal.d.ts +20 -0
- package/dist-browser/numbl-core/jit/builtins/defs/system/feval.d.ts +36 -0
- package/dist-browser/numbl-core/jit/builtins/defs/system/pathBuiltins.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/defs/system/tic.d.ts +8 -0
- package/dist-browser/numbl-core/jit/builtins/defs/system/toc.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/index.d.ts +16 -0
- package/dist-browser/numbl-core/jit/builtins/registry.d.ts +138 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/cell/cell.d.ts +24 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/indexing/loop_count.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/indexing/range_value.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/indexing/scalar_index.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/indexing/tensor_make_range.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/assert_fmt.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_complex.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_double.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_struct.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_tensor.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_tensor_complex.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/error_fmt.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/format_complex.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/format_double.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/format_engine.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/fprintf.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/sprintf.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/warning_fmt.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/plot/plot_dispatch.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/snippets.c.gen.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/snippets.gen.d.ts +85 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/system/cdiv.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/system/cscalar.d.ts +103 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/system/deep_clone.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/system/isequal.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/system/tictoc.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_nd.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_nd_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_copy_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_matrix.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_matrix_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_row.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_row_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_cat.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_cumulative.d.ts +32 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_diag.d.ts +33 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_diff.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_dot.d.ts +16 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_complex.d.ts +90 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_real.d.ts +75 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_real_fn.d.ts +95 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_eye.d.ts +10 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_fill_nd.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_fill_square.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_flip.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_imag_all_zero.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_linspace.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_logical_real.d.ts +10 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_logspace.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_meshgrid.d.ts +29 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_mtimes_complex.d.ts +10 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_mtimes_real.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_norm.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_ones_nd.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_ones_square.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_predicate.d.ts +42 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reduce_complex.d.ts +53 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reduce_real.d.ts +42 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_repmat.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reshape_nd.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reshape_nd_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_size.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_sort_real.d.ts +36 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_transpose.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_transpose_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_triangular.d.ts +22 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_unary_complex_math.d.ts +128 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_unary_real_math.d.ts +95 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_uniquetol.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_var.d.ts +12 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_zeros_nd.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_zeros_square.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/text/strcmp.d.ts +2 -0
- package/dist-browser/numbl-core/jit/codegen/cFormat.d.ts +36 -0
- package/dist-browser/numbl-core/jit/codegen/cHelpers.d.ts +48 -0
- package/dist-browser/numbl-core/jit/codegen/emit.d.ts +55 -0
- package/dist-browser/numbl-core/jit/codegen/emitCellTypedef.d.ts +23 -0
- package/dist-browser/numbl-core/jit/codegen/emitExpr.d.ts +33 -0
- package/dist-browser/numbl-core/jit/codegen/emitIndex.d.ts +56 -0
- package/dist-browser/numbl-core/jit/codegen/emitJs.d.ts +64 -0
- package/dist-browser/numbl-core/jit/codegen/emitNamedTypedef.d.ts +58 -0
- package/dist-browser/numbl-core/jit/codegen/emitStmt.d.ts +76 -0
- package/dist-browser/numbl-core/jit/codegen/emitTensorConcat.d.ts +23 -0
- package/dist-browser/numbl-core/jit/codegen/emitTensorConcatJs.d.ts +16 -0
- package/dist-browser/numbl-core/jit/codegen/emitTensorFused.d.ts +77 -0
- package/dist-browser/numbl-core/jit/codegen/inlinePass.d.ts +66 -0
- package/dist-browser/numbl-core/jit/codegen/liveness.d.ts +58 -0
- package/dist-browser/numbl-core/jit/codegen/prettyIR.d.ts +24 -0
- package/dist-browser/numbl-core/jit/codegen/runtime.d.ts +152 -0
- package/dist-browser/numbl-core/jit/compileSpec.d.ts +84 -0
- package/dist-browser/numbl-core/jit/compileSpecC.d.ts +100 -0
- package/dist-browser/numbl-core/jit/index.d.ts +15 -0
- package/dist-browser/numbl-core/jit/lowering/classDefs.d.ts +109 -0
- package/dist-browser/numbl-core/jit/lowering/definiteAssign.d.ts +42 -0
- package/dist-browser/numbl-core/jit/lowering/errors.d.ts +35 -0
- package/dist-browser/numbl-core/jit/lowering/indexFold.d.ts +31 -0
- package/dist-browser/numbl-core/jit/lowering/indexResolve.d.ts +100 -0
- package/dist-browser/numbl-core/jit/lowering/ir.d.ts +584 -0
- package/dist-browser/numbl-core/jit/lowering/lower.d.ts +271 -0
- package/dist-browser/numbl-core/jit/lowering/lowerCellIndex.d.ts +41 -0
- package/dist-browser/numbl-core/jit/lowering/lowerCellLit.d.ts +19 -0
- package/dist-browser/numbl-core/jit/lowering/lowerClassConstructor.d.ts +55 -0
- package/dist-browser/numbl-core/jit/lowering/lowerFuncCall.d.ts +34 -0
- package/dist-browser/numbl-core/jit/lowering/lowerHandle.d.ts +57 -0
- package/dist-browser/numbl-core/jit/lowering/lowerIndexLoad.d.ts +16 -0
- package/dist-browser/numbl-core/jit/lowering/lowerIndexSlice.d.ts +29 -0
- package/dist-browser/numbl-core/jit/lowering/lowerIndexSliceStore.d.ts +19 -0
- package/dist-browser/numbl-core/jit/lowering/lowerIndexStore.d.ts +14 -0
- package/dist-browser/numbl-core/jit/lowering/lowerMethodCall.d.ts +45 -0
- package/dist-browser/numbl-core/jit/lowering/lowerMultiAssign.d.ts +36 -0
- package/dist-browser/numbl-core/jit/lowering/lowerTensorLit.d.ts +25 -0
- package/dist-browser/numbl-core/jit/lowering/rangeCount.d.ts +19 -0
- package/dist-browser/numbl-core/jit/lowering/specialize.d.ts +93 -0
- package/dist-browser/numbl-core/jit/lowering/types.d.ts +503 -0
- package/dist-browser/numbl-core/jit/lowering/walk.d.ts +17 -0
- package/dist-browser/numbl-core/jit/numbl/index.d.ts +30 -0
- package/dist-browser/numbl-core/jit/parser/astUtils.d.ts +43 -0
- package/dist-browser/numbl-core/jit/parser/index.d.ts +12 -0
- package/dist-browser/numbl-core/jit/parser/sourceLoc.d.ts +12 -0
- package/dist-browser/numbl-core/jit/runtime/context.d.ts +23 -0
- package/dist-browser/numbl-core/jit/runtime/inferType.d.ts +10 -0
- package/dist-browser/numbl-core/jit/runtime/value.d.ts +101 -0
- package/dist-browser/numbl-core/jit/workspace/driverPrologue.d.ts +59 -0
- package/dist-browser/numbl-core/jit/workspace/mtoc2UserFunctionLoader.d.ts +62 -0
- package/dist-browser/numbl-core/jit/workspace/workspace.d.ts +243 -0
- package/dist-browser/numbl-core/jitDeclineDiagnostics.d.ts +32 -0
- package/dist-browser/numbl-core/jitTypes.d.ts +94 -0
- package/dist-browser/numbl-core/jsUserFunctions.d.ts +61 -0
- package/dist-browser/numbl-core/lexer/helpers.d.ts +15 -0
- package/dist-browser/numbl-core/lexer/index.d.ts +4 -0
- package/dist-browser/numbl-core/lexer/keywords.d.ts +3 -0
- package/dist-browser/numbl-core/lexer/token-config.d.ts +94 -0
- package/dist-browser/numbl-core/lexer/tokenizer.d.ts +9 -0
- package/dist-browser/numbl-core/lexer/types.d.ts +80 -0
- package/dist-browser/numbl-core/lowering/classInfo.d.ts +53 -0
- package/dist-browser/numbl-core/lowering/constants.d.ts +4 -0
- package/dist-browser/numbl-core/lowering/errors.d.ts +17 -0
- package/dist-browser/numbl-core/lowering/index.d.ts +3 -0
- package/dist-browser/numbl-core/lowering/itemTypes.d.ts +87 -0
- package/dist-browser/numbl-core/lowering/loweringContext.d.ts +241 -0
- package/dist-browser/numbl-core/native/bridge-resolve.d.ts +14 -0
- package/dist-browser/numbl-core/native/geometry-bridge.d.ts +39 -0
- package/dist-browser/numbl-core/native/lapack-bridge.d.ts +482 -0
- package/dist-browser/numbl-core/native/qhull-browser.d.ts +15 -0
- package/dist-browser/numbl-core/native/qhull-node.d.ts +13 -0
- package/dist-browser/numbl-core/native/ts-lapack-bridge.d.ts +9 -0
- package/dist-browser/numbl-core/native/ts-lapack-eig-complex.d.ts +32 -0
- package/dist-browser/numbl-core/ops/bessel.d.ts +18 -0
- package/dist-browser/numbl-core/ops/comparison.d.ts +11 -0
- package/dist-browser/numbl-core/ops/complexBinaryElemwise.d.ts +10 -0
- package/dist-browser/numbl-core/ops/complexUnaryElemwise.d.ts +8 -0
- package/dist-browser/numbl-core/ops/dispatch.d.ts +26 -0
- package/dist-browser/numbl-core/ops/index.d.ts +8 -0
- package/dist-browser/numbl-core/ops/opCodes.d.ts +70 -0
- package/dist-browser/numbl-core/ops/realBinaryElemwise.d.ts +8 -0
- package/dist-browser/numbl-core/ops/realUnaryElemwise.d.ts +5 -0
- package/dist-browser/numbl-core/ops/reduce.d.ts +6 -0
- package/dist-browser/numbl-core/parser/ArgumentsParser.d.ts +33 -0
- package/dist-browser/numbl-core/parser/ClassParser.d.ts +21 -0
- package/dist-browser/numbl-core/parser/CommandParser.d.ts +31 -0
- package/dist-browser/numbl-core/parser/ControlFlowParser.d.ts +16 -0
- package/dist-browser/numbl-core/parser/ExpressionParser.d.ts +32 -0
- package/dist-browser/numbl-core/parser/FunctionParser.d.ts +10 -0
- package/dist-browser/numbl-core/parser/Parser.d.ts +17 -0
- package/dist-browser/numbl-core/parser/ParserBase.d.ts +35 -0
- package/dist-browser/numbl-core/parser/StatementParser.d.ts +13 -0
- package/dist-browser/numbl-core/parser/errors.d.ts +15 -0
- package/dist-browser/numbl-core/parser/index.d.ts +7 -0
- package/dist-browser/numbl-core/parser/types.d.ts +342 -0
- package/dist-browser/numbl-core/runtime/alloc.d.ts +12 -0
- package/dist-browser/numbl-core/runtime/axisCommand.d.ts +34 -0
- package/dist-browser/numbl-core/runtime/compare.d.ts +5 -0
- package/dist-browser/numbl-core/runtime/constructors.d.ts +39 -0
- package/dist-browser/numbl-core/runtime/convert.d.ts +10 -0
- package/dist-browser/numbl-core/runtime/cow.d.ts +33 -0
- package/dist-browser/numbl-core/runtime/display.d.ts +6 -0
- package/dist-browser/numbl-core/runtime/error.d.ts +78 -0
- package/dist-browser/numbl-core/runtime/index.d.ts +13 -0
- package/dist-browser/numbl-core/runtime/indexing.d.ts +28 -0
- package/dist-browser/numbl-core/runtime/plotBuiltinDispatch.d.ts +92 -0
- package/dist-browser/numbl-core/runtime/plotUtils.d.ts +336 -0
- package/dist-browser/numbl-core/runtime/refcount.d.ts +85 -0
- package/dist-browser/numbl-core/runtime/runtime.d.ts +354 -0
- package/dist-browser/numbl-core/runtime/runtimeDispatch.d.ts +27 -0
- package/dist-browser/numbl-core/runtime/runtimeHelpers.d.ts +31 -0
- package/dist-browser/numbl-core/runtime/runtimeIndexing.d.ts +28 -0
- package/dist-browser/numbl-core/runtime/runtimeMemberAccess.d.ts +26 -0
- package/dist-browser/numbl-core/runtime/runtimeOperators.d.ts +24 -0
- package/dist-browser/numbl-core/runtime/runtimePlot.d.ts +129 -0
- package/dist-browser/numbl-core/runtime/sentinels.d.ts +4 -0
- package/dist-browser/numbl-core/runtime/specialBuiltinNames.d.ts +2 -0
- package/dist-browser/numbl-core/runtime/specialBuiltins.d.ts +13 -0
- package/dist-browser/numbl-core/runtime/struct-access.d.ts +11 -0
- package/dist-browser/numbl-core/runtime/syncChannel.d.ts +1 -0
- package/dist-browser/numbl-core/runtime/tensor-construction.d.ts +10 -0
- package/dist-browser/numbl-core/runtime/types.d.ts +197 -0
- package/dist-browser/numbl-core/runtime/uihtmlSession.d.ts +40 -0
- package/dist-browser/numbl-core/runtime/utils.d.ts +19 -0
- package/dist-browser/numbl-core/stdlib-bundle.d.ts +3 -0
- package/dist-browser/numbl-core/systemAdapter.d.ts +23 -0
- package/dist-browser/numbl-core/version.d.ts +2 -0
- package/dist-browser/numbl-core/workspace/index.d.ts +4 -0
- package/dist-browser/numbl-core/workspace/types.d.ts +24 -0
- package/dist-browser/ts-lapack/src/BLAS/daxpy.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dcopy.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/ddot.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dgemm.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dgemm_optimized.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dgemv.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dger.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dnrm2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/drot.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dscal.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dswap.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dtrmm.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dtrmv.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dtrsm.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/idamax.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dbdsqr.d.ts +10 -0
- package/dist-browser/ts-lapack/src/SRC/dgebak.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgebal.d.ts +5 -0
- package/dist-browser/ts-lapack/src/SRC/dgebd2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgebrd.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgeev.d.ts +3 -0
- package/dist-browser/ts-lapack/src/SRC/dgehd2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgehrd.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgelq2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgelqf.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgeqr2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgeqrf.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgeqrf_optimized.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgesvd.d.ts +28 -0
- package/dist-browser/ts-lapack/src/SRC/dgetrf.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgetrf2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgetri.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dhseqr.d.ts +32 -0
- package/dist-browser/ts-lapack/src/SRC/dlabrd.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlacpy.d.ts +18 -0
- package/dist-browser/ts-lapack/src/SRC/dladiv.d.ts +9 -0
- package/dist-browser/ts-lapack/src/SRC/dlaexc.d.ts +21 -0
- package/dist-browser/ts-lapack/src/SRC/dlahqr.d.ts +24 -0
- package/dist-browser/ts-lapack/src/SRC/dlahr2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlaln2.d.ts +5 -0
- package/dist-browser/ts-lapack/src/SRC/dlamch.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlange.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlanv2.d.ts +12 -0
- package/dist-browser/ts-lapack/src/SRC/dlapy2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlaqr1.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlaqr30.d.ts +81 -0
- package/dist-browser/ts-lapack/src/SRC/dlaqr5.d.ts +38 -0
- package/dist-browser/ts-lapack/src/SRC/dlarf.d.ts +18 -0
- package/dist-browser/ts-lapack/src/SRC/dlarf1f.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlarfb.d.ts +25 -0
- package/dist-browser/ts-lapack/src/SRC/dlarfg.d.ts +4 -0
- package/dist-browser/ts-lapack/src/SRC/dlarft.d.ts +20 -0
- package/dist-browser/ts-lapack/src/SRC/dlarfx.d.ts +17 -0
- package/dist-browser/ts-lapack/src/SRC/dlartg.d.ts +5 -0
- package/dist-browser/ts-lapack/src/SRC/dlas2.d.ts +4 -0
- package/dist-browser/ts-lapack/src/SRC/dlascl.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlaset.d.ts +19 -0
- package/dist-browser/ts-lapack/src/SRC/dlasr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlassq.d.ts +18 -0
- package/dist-browser/ts-lapack/src/SRC/dlasv2.d.ts +8 -0
- package/dist-browser/ts-lapack/src/SRC/dlaswp.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlasy2.d.ts +5 -0
- package/dist-browser/ts-lapack/src/SRC/dorg2r.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorgbr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorghr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorgl2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorglq.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorgqr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorgqr_optimized.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorm2r.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dormhr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dormqr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dpotf2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dtrevc3.d.ts +27 -0
- package/dist-browser/ts-lapack/src/SRC/dtrexc.d.ts +24 -0
- package/dist-browser/ts-lapack/src/SRC/dtrti2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dtrtri.d.ts +1 -0
- package/dist-browser/ts-lapack/src/utils/constants.d.ts +28 -0
- package/dist-browser/ts-lapack/src/utils/iladlc.d.ts +1 -0
- package/dist-browser/ts-lapack/src/utils/iladlr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/utils/ilaenv.d.ts +1 -0
- package/dist-browser/ts-lapack/src/utils/xerbla.d.ts +1 -0
- package/dist-browser/vfs/BrowserFileIOAdapter.d.ts +60 -0
- package/dist-browser/vfs/BrowserSystemAdapter.d.ts +27 -0
- package/dist-browser/vfs/VirtualFileSystem.d.ts +66 -0
- package/dist-browser/vfs/syncVfsChanges.d.ts +23 -0
- package/dist-browser/vfs/unzipToFiles.d.ts +7 -0
- package/dist-cli/cli.js +1527 -205
- package/dist-lib/lib.d.ts +4 -0
- package/dist-lib/lib.js +2217 -199
- package/dist-lib/numbl-core/executors/jit/hostHelpers.d.ts +4 -0
- package/dist-lib/numbl-core/fileIOAdapter.d.ts +13 -0
- package/dist-lib/numbl-core/helpers/scanFormat.d.ts +11 -0
- package/dist-lib/numbl-core/jit/builtins/defs/logical/fieldnames.d.ts +2 -2
- package/dist-lib/numbl-core/jit/builtins/defs/math/rand.d.ts +2 -0
- package/dist-lib/numbl-core/jitDeclineDiagnostics.d.ts +32 -0
- package/dist-lib/numbl-core/jsUserFunctions.d.ts +13 -0
- package/dist-lib/numbl-core/runtime/constructors.d.ts +3 -1
- package/dist-lib/numbl-core/runtime/indexing.d.ts +3 -0
- package/dist-lib/numbl-core/runtime/runtime.d.ts +1 -0
- package/dist-lib/numbl-core/runtime/types.d.ts +15 -1
- package/dist-lib/numbl-core/runtime/utils.d.ts +3 -0
- package/dist-lib/numbl-core/version.d.ts +1 -1
- package/dist-lib/vfs/BrowserFileIOAdapter.d.ts +60 -0
- package/dist-lib/vfs/BrowserSystemAdapter.d.ts +27 -0
- package/dist-lib/vfs/VirtualFileSystem.d.ts +66 -0
- package/dist-site-viewer/assets/index-CT9HA1Pn.js +4831 -0
- package/dist-site-viewer/assets/numbl-worker-CYPflGmm.js +5246 -0
- package/dist-site-viewer/index.html +1 -1
- package/package.json +9 -3
- package/dist-site-viewer/assets/index-RucHpf4b.js +0 -4826
- package/dist-site-viewer/assets/numbl-worker-IO39kohI.js +0 -5228
package/dist-lib/lib.js
CHANGED
|
@@ -110,6 +110,7 @@ var isRuntimeStructArray = (value) => typeof value === "object" && value !== nul
|
|
|
110
110
|
var isRuntimeClassInstanceArray = (value) => typeof value === "object" && value !== null && value.kind === "class_instance_array";
|
|
111
111
|
var isRuntimeSparseMatrix = (value) => typeof value === "object" && value !== null && value.kind === "sparse_matrix";
|
|
112
112
|
var isRuntimeDictionary = (value) => typeof value === "object" && value !== null && value.kind === "dictionary";
|
|
113
|
+
var isRuntimeStringArray = (value) => typeof value === "object" && value !== null && value.kind === "string_array";
|
|
113
114
|
var kstr = (value) => {
|
|
114
115
|
if (isRuntimeNumber(value)) return "number";
|
|
115
116
|
if (isRuntimeLogical(value)) return "logical";
|
|
@@ -128,6 +129,7 @@ var kstr = (value) => {
|
|
|
128
129
|
if (isRuntimeStructArray(value)) return "struct array";
|
|
129
130
|
if (isRuntimeSparseMatrix(value)) return "sparse matrix";
|
|
130
131
|
if (isRuntimeDictionary(value)) return "dictionary";
|
|
132
|
+
if (isRuntimeStringArray(value)) return "string array";
|
|
131
133
|
return "unknown";
|
|
132
134
|
};
|
|
133
135
|
var RuntimeTensor = class extends Refcounted {
|
|
@@ -159,6 +161,24 @@ var RuntimeChar = class extends Refcounted {
|
|
|
159
161
|
this.shape = shape;
|
|
160
162
|
}
|
|
161
163
|
};
|
|
164
|
+
var RuntimeStringArray = class extends Refcounted {
|
|
165
|
+
kind = "string_array";
|
|
166
|
+
/** Elements in column-major order (plain JS strings). */
|
|
167
|
+
data;
|
|
168
|
+
/** 2-D shape [rows, cols]; data.length === rows*cols. A 1x1 string is
|
|
169
|
+
* normally represented as a primitive JS string, not a 1x1 array —
|
|
170
|
+
* use stringArrayValue() to build results so scalars collapse. */
|
|
171
|
+
shape;
|
|
172
|
+
constructor(data, shape) {
|
|
173
|
+
super();
|
|
174
|
+
this.data = data;
|
|
175
|
+
this.shape = shape;
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
function stringArrayValue(data, shape) {
|
|
179
|
+
if (data.length === 1 && shape[0] === 1 && shape[1] === 1) return data[0];
|
|
180
|
+
return new RuntimeStringArray(data, shape);
|
|
181
|
+
}
|
|
162
182
|
var RuntimeCell = class extends Refcounted {
|
|
163
183
|
kind = "cell";
|
|
164
184
|
data;
|
|
@@ -613,6 +633,29 @@ function sub2ind(shape, subs) {
|
|
|
613
633
|
}
|
|
614
634
|
return idx;
|
|
615
635
|
}
|
|
636
|
+
function matlabNumToString(n) {
|
|
637
|
+
if (n === Infinity) return "Inf";
|
|
638
|
+
if (n === -Infinity) return "-Inf";
|
|
639
|
+
if (isNaN(n)) return "NaN";
|
|
640
|
+
if (n === 0) return "0";
|
|
641
|
+
if (Number.isInteger(n)) return String(n);
|
|
642
|
+
const prec = 5;
|
|
643
|
+
const exp2 = Math.floor(Math.log10(Math.abs(n)));
|
|
644
|
+
let s;
|
|
645
|
+
if (exp2 < -4 || exp2 >= prec) {
|
|
646
|
+
s = n.toExponential(prec - 1);
|
|
647
|
+
const ePos = s.indexOf("e");
|
|
648
|
+
let mantissa = s.slice(0, ePos);
|
|
649
|
+
const expPart0 = s.slice(ePos);
|
|
650
|
+
if (mantissa.includes(".")) mantissa = mantissa.replace(/\.?0+$/, "");
|
|
651
|
+
const expPart = expPart0.replace(/([eE][+-])(\d)$/, "$10$2");
|
|
652
|
+
s = mantissa + expPart;
|
|
653
|
+
} else {
|
|
654
|
+
s = n.toPrecision(prec);
|
|
655
|
+
if (s.includes(".")) s = s.replace(/\.?0+$/, "");
|
|
656
|
+
}
|
|
657
|
+
return s;
|
|
658
|
+
}
|
|
616
659
|
|
|
617
660
|
// src/numbl-core/runtime/convert.ts
|
|
618
661
|
function toNumber(v) {
|
|
@@ -689,6 +732,11 @@ function toString(v) {
|
|
|
689
732
|
switch (v.kind) {
|
|
690
733
|
case "char":
|
|
691
734
|
return v.value;
|
|
735
|
+
case "string_array":
|
|
736
|
+
if (v.data.length === 1) return v.data[0];
|
|
737
|
+
throw new RuntimeError(
|
|
738
|
+
"Expected a scalar text value, got a string array"
|
|
739
|
+
);
|
|
692
740
|
default:
|
|
693
741
|
throw new RuntimeError(`Cannot convert ${kstr(v)} to string`);
|
|
694
742
|
}
|
|
@@ -748,6 +796,15 @@ var valuesAreEqual = (a, b) => {
|
|
|
748
796
|
}
|
|
749
797
|
case "dictionary":
|
|
750
798
|
return a === b;
|
|
799
|
+
case "string_array": {
|
|
800
|
+
const sb = b;
|
|
801
|
+
if (a.shape[0] !== sb.shape[0] || a.shape[1] !== sb.shape[1])
|
|
802
|
+
return false;
|
|
803
|
+
for (let i = 0; i < a.data.length; i++) {
|
|
804
|
+
if (a.data[i] !== sb.data[i]) return false;
|
|
805
|
+
}
|
|
806
|
+
return true;
|
|
807
|
+
}
|
|
751
808
|
default:
|
|
752
809
|
return false;
|
|
753
810
|
}
|
|
@@ -800,7 +857,34 @@ function displayValue(v) {
|
|
|
800
857
|
return formatDictionary(v);
|
|
801
858
|
case "class_instance_array":
|
|
802
859
|
return ` ${v.shape[0]}x${v.shape[1]} ${v.className} array`;
|
|
860
|
+
case "string_array":
|
|
861
|
+
return formatStringArray(v);
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
function formatStringArray(v) {
|
|
865
|
+
const [rows, cols] = v.shape;
|
|
866
|
+
if (v.data.length === 0) {
|
|
867
|
+
return ` ${rows}x${cols} empty string array`;
|
|
868
|
+
}
|
|
869
|
+
const quoted = v.data.map((s) => `"${s}"`);
|
|
870
|
+
const widths = [];
|
|
871
|
+
for (let c = 0; c < cols; c++) {
|
|
872
|
+
let w = 0;
|
|
873
|
+
for (let r = 0; r < rows; r++) {
|
|
874
|
+
w = Math.max(w, quoted[c * rows + r].length);
|
|
875
|
+
}
|
|
876
|
+
widths.push(w);
|
|
877
|
+
}
|
|
878
|
+
const lines = [];
|
|
879
|
+
for (let r = 0; r < rows; r++) {
|
|
880
|
+
const parts = [];
|
|
881
|
+
for (let c = 0; c < cols; c++) {
|
|
882
|
+
const q = quoted[c * rows + r];
|
|
883
|
+
parts.push(c === cols - 1 ? q : q.padEnd(widths[c]));
|
|
884
|
+
}
|
|
885
|
+
lines.push(" " + parts.join(" "));
|
|
803
886
|
}
|
|
887
|
+
return lines.join("\n");
|
|
804
888
|
}
|
|
805
889
|
var formatStructArray = (v) => {
|
|
806
890
|
const elements = v.elements;
|
|
@@ -1115,6 +1199,10 @@ var RTV = {
|
|
|
1115
1199
|
string(value) {
|
|
1116
1200
|
return value;
|
|
1117
1201
|
},
|
|
1202
|
+
/** String array (does NOT collapse 1x1 — use stringArrayValue for that). */
|
|
1203
|
+
stringArray(data, shape) {
|
|
1204
|
+
return new RuntimeStringArray(data, shape);
|
|
1205
|
+
},
|
|
1118
1206
|
char(value) {
|
|
1119
1207
|
return new RuntimeChar(value);
|
|
1120
1208
|
},
|
|
@@ -22719,6 +22807,28 @@ function coerceToConcatString(v) {
|
|
|
22719
22807
|
return null;
|
|
22720
22808
|
}
|
|
22721
22809
|
function mAdd(a, b) {
|
|
22810
|
+
if (isRuntimeStringArray(a) || isRuntimeStringArray(b)) {
|
|
22811
|
+
const sa = isRuntimeStringArray(a) ? a : null;
|
|
22812
|
+
const sb = isRuntimeStringArray(b) ? b : null;
|
|
22813
|
+
if (sa && sb) {
|
|
22814
|
+
if (sa.shape[0] !== sb.shape[0] || sa.shape[1] !== sb.shape[1]) {
|
|
22815
|
+
throw new RuntimeError("Array dimensions must match for string plus");
|
|
22816
|
+
}
|
|
22817
|
+
return stringArrayValue(
|
|
22818
|
+
sa.data.map((s, i) => s + sb.data[i]),
|
|
22819
|
+
sa.shape
|
|
22820
|
+
);
|
|
22821
|
+
}
|
|
22822
|
+
const arr = sa ?? sb;
|
|
22823
|
+
const other = coerceToConcatString(sa ? b : a);
|
|
22824
|
+
if (other === null) {
|
|
22825
|
+
throw new RuntimeError("Cannot concatenate this value with a string");
|
|
22826
|
+
}
|
|
22827
|
+
return stringArrayValue(
|
|
22828
|
+
arr.data.map((s) => sa ? s + other : other + s),
|
|
22829
|
+
arr.shape
|
|
22830
|
+
);
|
|
22831
|
+
}
|
|
22722
22832
|
if (isRuntimeString(a) || isRuntimeString(b)) {
|
|
22723
22833
|
const aStr = coerceToConcatString(a);
|
|
22724
22834
|
const bStr = coerceToConcatString(b);
|
|
@@ -23225,12 +23335,24 @@ function transposeClassInstanceArray(v) {
|
|
|
23225
23335
|
}
|
|
23226
23336
|
return new RuntimeClassInstanceArray(v.className, out, [c, r]);
|
|
23227
23337
|
}
|
|
23338
|
+
function transposeStringArray(v) {
|
|
23339
|
+
const [r, c] = v.shape;
|
|
23340
|
+
const out = new Array(r * c);
|
|
23341
|
+
for (let i = 0; i < r; i++) {
|
|
23342
|
+
for (let j = 0; j < c; j++) {
|
|
23343
|
+
out[i * c + j] = v.data[j * r + i];
|
|
23344
|
+
}
|
|
23345
|
+
}
|
|
23346
|
+
return stringArrayValue(out, [c, r]);
|
|
23347
|
+
}
|
|
23228
23348
|
function mTranspose(v) {
|
|
23229
23349
|
if (isRuntimeSparseMatrix(v)) return sparseTranspose(v);
|
|
23230
23350
|
if (isRuntimeComplexNumber(v)) return v;
|
|
23231
23351
|
if (isRuntimeNumber(v) || isRuntimeLogical(v)) return v;
|
|
23232
23352
|
if (isRuntimeCell(v)) return transposeCellArray(v);
|
|
23233
23353
|
if (isRuntimeChar(v)) return v;
|
|
23354
|
+
if (isRuntimeString(v)) return v;
|
|
23355
|
+
if (isRuntimeStringArray(v)) return transposeStringArray(v);
|
|
23234
23356
|
if (isRuntimeClassInstance(v)) return v;
|
|
23235
23357
|
if (isRuntimeClassInstanceArray(v)) return transposeClassInstanceArray(v);
|
|
23236
23358
|
if (!isRuntimeTensor(v))
|
|
@@ -23243,6 +23365,8 @@ function mConjugateTranspose(v) {
|
|
|
23243
23365
|
if (isRuntimeNumber(v) || isRuntimeLogical(v)) return v;
|
|
23244
23366
|
if (isRuntimeCell(v)) return transposeCellArray(v);
|
|
23245
23367
|
if (isRuntimeChar(v)) return v;
|
|
23368
|
+
if (isRuntimeString(v)) return v;
|
|
23369
|
+
if (isRuntimeStringArray(v)) return transposeStringArray(v);
|
|
23246
23370
|
if (isRuntimeClassInstance(v)) return v;
|
|
23247
23371
|
if (isRuntimeClassInstanceArray(v)) return transposeClassInstanceArray(v);
|
|
23248
23372
|
if (!isRuntimeTensor(v))
|
|
@@ -23255,7 +23379,38 @@ function asStringPair(a, b) {
|
|
|
23255
23379
|
if (isRuntimeChar(a) && isRuntimeString(b)) return [a.value, b];
|
|
23256
23380
|
return null;
|
|
23257
23381
|
}
|
|
23382
|
+
function textOperandElems(v) {
|
|
23383
|
+
if (isRuntimeString(v)) return { data: [v], shape: [1, 1] };
|
|
23384
|
+
if (isRuntimeChar(v)) {
|
|
23385
|
+
const rows = v.shape ? v.shape[0] : 1;
|
|
23386
|
+
if (rows > 1) return null;
|
|
23387
|
+
return { data: [v.value], shape: [1, 1] };
|
|
23388
|
+
}
|
|
23389
|
+
if (isRuntimeStringArray(v)) return { data: v.data, shape: v.shape };
|
|
23390
|
+
return null;
|
|
23391
|
+
}
|
|
23258
23392
|
function stringComparisonOp(a, b, op) {
|
|
23393
|
+
if (isRuntimeStringArray(a) || isRuntimeStringArray(b)) {
|
|
23394
|
+
const ta = textOperandElems(a);
|
|
23395
|
+
const tb = textOperandElems(b);
|
|
23396
|
+
if (ta === null || tb === null) return null;
|
|
23397
|
+
const aScalar = ta.data.length === 1 && ta.shape[0] * ta.shape[1] === 1;
|
|
23398
|
+
const bScalar = tb.data.length === 1 && tb.shape[0] * tb.shape[1] === 1;
|
|
23399
|
+
if (!aScalar && !bScalar && (ta.shape[0] !== tb.shape[0] || ta.shape[1] !== tb.shape[1])) {
|
|
23400
|
+
throw new RuntimeError("Array dimensions must match for comparison");
|
|
23401
|
+
}
|
|
23402
|
+
const shape = aScalar ? tb.shape : ta.shape;
|
|
23403
|
+
const n = aScalar ? tb.data.length : ta.data.length;
|
|
23404
|
+
const out = allocFloat64Array(n);
|
|
23405
|
+
for (let i = 0; i < n; i++) {
|
|
23406
|
+
const x = aScalar ? ta.data[0] : ta.data[i];
|
|
23407
|
+
const y = bScalar ? tb.data[0] : tb.data[i];
|
|
23408
|
+
out[i] = op(x, y) ? 1 : 0;
|
|
23409
|
+
}
|
|
23410
|
+
const t = RTV.tensor(out, [shape[0], shape[1]]);
|
|
23411
|
+
t._isLogical = true;
|
|
23412
|
+
return t;
|
|
23413
|
+
}
|
|
23259
23414
|
const pair = asStringPair(a, b);
|
|
23260
23415
|
if (pair === null) return null;
|
|
23261
23416
|
return RTV.logical(op(pair[0], pair[1]));
|
|
@@ -24638,6 +24793,68 @@ function indexIntoChar(base, indices) {
|
|
|
24638
24793
|
}
|
|
24639
24794
|
throw new RuntimeError("Char indexing supports 1 or 2 dimensions");
|
|
24640
24795
|
}
|
|
24796
|
+
function stringArraySubscript(idx, extent) {
|
|
24797
|
+
if (isColonIndex(idx)) {
|
|
24798
|
+
return Array.from({ length: extent }, (_, i) => i);
|
|
24799
|
+
}
|
|
24800
|
+
if (isRuntimeTensor(idx)) {
|
|
24801
|
+
if (idx._isLogical) {
|
|
24802
|
+
const out = [];
|
|
24803
|
+
for (let i = 0; i < idx.data.length; i++)
|
|
24804
|
+
if (idx.data[i] !== 0) out.push(i);
|
|
24805
|
+
return out;
|
|
24806
|
+
}
|
|
24807
|
+
return Array.from(idx.data, (v) => Math.round(v) - 1);
|
|
24808
|
+
}
|
|
24809
|
+
if (isRuntimeLogical(idx)) return idx ? [0] : [];
|
|
24810
|
+
return [Math.round(toNumber(idx)) - 1];
|
|
24811
|
+
}
|
|
24812
|
+
function indexIntoStringArray(base, indices) {
|
|
24813
|
+
const [rows, cols] = base.shape;
|
|
24814
|
+
const total = base.data.length;
|
|
24815
|
+
if (indices.length === 2) {
|
|
24816
|
+
const ri = stringArraySubscript(indices[0], rows);
|
|
24817
|
+
const ci = stringArraySubscript(indices[1], cols);
|
|
24818
|
+
const out2 = [];
|
|
24819
|
+
for (const c of ci) {
|
|
24820
|
+
if (c < 0 || c >= cols)
|
|
24821
|
+
throw new RuntimeError("Index exceeds array bounds");
|
|
24822
|
+
for (const r of ri) {
|
|
24823
|
+
if (r < 0 || r >= rows)
|
|
24824
|
+
throw new RuntimeError("Index exceeds array bounds");
|
|
24825
|
+
out2.push(base.data[c * rows + r]);
|
|
24826
|
+
}
|
|
24827
|
+
}
|
|
24828
|
+
return stringArrayValue(out2, [ri.length, ci.length]);
|
|
24829
|
+
}
|
|
24830
|
+
if (indices.length !== 1) {
|
|
24831
|
+
throw new RuntimeError("String array indexing supports 1 or 2 subscripts");
|
|
24832
|
+
}
|
|
24833
|
+
const idx = indices[0];
|
|
24834
|
+
if (isColonIndex(idx)) {
|
|
24835
|
+
return stringArrayValue(base.data.slice(), [total, 1]);
|
|
24836
|
+
}
|
|
24837
|
+
const linear = stringArraySubscript(idx, total);
|
|
24838
|
+
const out = [];
|
|
24839
|
+
for (const i of linear) {
|
|
24840
|
+
if (i < 0 || i >= total)
|
|
24841
|
+
throw new RuntimeError("Index exceeds array bounds");
|
|
24842
|
+
out.push(base.data[i]);
|
|
24843
|
+
}
|
|
24844
|
+
let shape;
|
|
24845
|
+
if (rows === 1 || cols === 1) {
|
|
24846
|
+
shape = rows === 1 ? [1, out.length] : [out.length, 1];
|
|
24847
|
+
} else if (isRuntimeTensor(idx) && !idx._isLogical) {
|
|
24848
|
+
const is = idx.shape;
|
|
24849
|
+
const im = is.length >= 2 ? is[0] : 1;
|
|
24850
|
+
shape = [im, out.length / (im || 1)];
|
|
24851
|
+
} else if (isRuntimeTensor(idx) && idx._isLogical) {
|
|
24852
|
+
shape = [out.length, 1];
|
|
24853
|
+
} else {
|
|
24854
|
+
shape = [1, out.length];
|
|
24855
|
+
}
|
|
24856
|
+
return stringArrayValue(out, shape);
|
|
24857
|
+
}
|
|
24641
24858
|
function indexIntoLogical(base, indices) {
|
|
24642
24859
|
if (indices.length === 1) {
|
|
24643
24860
|
const idx = indices[0];
|
|
@@ -24768,6 +24985,9 @@ function indexIntoRTValue(base, indices) {
|
|
|
24768
24985
|
return base;
|
|
24769
24986
|
}
|
|
24770
24987
|
}
|
|
24988
|
+
if (isRuntimeStringArray(base)) {
|
|
24989
|
+
return indexIntoStringArray(base, indices);
|
|
24990
|
+
}
|
|
24771
24991
|
if (isRuntimeLogical(base)) {
|
|
24772
24992
|
return indexIntoLogical(base, indices);
|
|
24773
24993
|
}
|
|
@@ -25589,26 +25809,18 @@ function horzcat(...values) {
|
|
|
25589
25809
|
if (values.some((v) => isRuntimeCell(v))) {
|
|
25590
25810
|
return cellCatAlongDim(values, 1);
|
|
25591
25811
|
}
|
|
25812
|
+
if (values.some((v) => isRuntimeString(v) || isRuntimeStringArray(v))) {
|
|
25813
|
+
return stringCat(values, 1);
|
|
25814
|
+
}
|
|
25592
25815
|
if (values.some((v) => isRuntimeChar(v))) {
|
|
25593
25816
|
let result = "";
|
|
25594
25817
|
for (const v of values) {
|
|
25595
25818
|
if (isRuntimeChar(v)) result += v.value;
|
|
25596
|
-
else if (isRuntimeString(v)) result += v;
|
|
25597
25819
|
else if (isRuntimeNumber(v)) result += String.fromCharCode(Math.round(v));
|
|
25598
25820
|
else throw new RuntimeError(`Cannot concatenate ${kstr(v)} into char`);
|
|
25599
25821
|
}
|
|
25600
25822
|
return RTV.char(result);
|
|
25601
25823
|
}
|
|
25602
|
-
if (values.some((v) => isRuntimeString(v) || isRuntimeChar(v))) {
|
|
25603
|
-
let result = "";
|
|
25604
|
-
for (const v of values) {
|
|
25605
|
-
if (isRuntimeString(v)) result += v;
|
|
25606
|
-
else if (isRuntimeChar(v)) result += v.value;
|
|
25607
|
-
else if (isRuntimeNumber(v)) result += String(v);
|
|
25608
|
-
else throw new RuntimeError(`Cannot concatenate ${v} into string`);
|
|
25609
|
-
}
|
|
25610
|
-
return RTV.string(result);
|
|
25611
|
-
}
|
|
25612
25824
|
if (values.some((v) => isRuntimeStruct(v) || isRuntimeStructArray(v))) {
|
|
25613
25825
|
return structCat(values);
|
|
25614
25826
|
}
|
|
@@ -25623,6 +25835,9 @@ function vertcat(...values) {
|
|
|
25623
25835
|
if (values.some((v) => isRuntimeCell(v))) {
|
|
25624
25836
|
return cellCatAlongDim(values, 0);
|
|
25625
25837
|
}
|
|
25838
|
+
if (values.some((v) => isRuntimeString(v) || isRuntimeStringArray(v))) {
|
|
25839
|
+
return stringCat(values, 0);
|
|
25840
|
+
}
|
|
25626
25841
|
if (values.some((v) => isRuntimeChar(v))) {
|
|
25627
25842
|
return vertcatChars(values);
|
|
25628
25843
|
}
|
|
@@ -25631,6 +25846,86 @@ function vertcat(...values) {
|
|
|
25631
25846
|
}
|
|
25632
25847
|
return catAlongDim(values, 0);
|
|
25633
25848
|
}
|
|
25849
|
+
function toStringBlock(v) {
|
|
25850
|
+
if (isRuntimeString(v)) return { data: [v], rows: 1, cols: 1 };
|
|
25851
|
+
if (isRuntimeStringArray(v)) {
|
|
25852
|
+
if (v.data.length === 0) return null;
|
|
25853
|
+
return { data: v.data.slice(), rows: v.shape[0], cols: v.shape[1] };
|
|
25854
|
+
}
|
|
25855
|
+
if (isRuntimeChar(v)) {
|
|
25856
|
+
const rows = v.shape ? v.shape[0] : 1;
|
|
25857
|
+
const width = v.shape ? v.shape[1] : v.value.length;
|
|
25858
|
+
if (rows <= 1) return { data: [v.value], rows: 1, cols: 1 };
|
|
25859
|
+
const out = [];
|
|
25860
|
+
for (let r = 0; r < rows; r++) {
|
|
25861
|
+
out.push(v.value.slice(r * width, (r + 1) * width));
|
|
25862
|
+
}
|
|
25863
|
+
return { data: out, rows, cols: 1 };
|
|
25864
|
+
}
|
|
25865
|
+
if (isRuntimeNumber(v)) {
|
|
25866
|
+
return { data: [matlabNumToString(v)], rows: 1, cols: 1 };
|
|
25867
|
+
}
|
|
25868
|
+
if (isRuntimeLogical(v)) {
|
|
25869
|
+
return { data: [v ? "true" : "false"], rows: 1, cols: 1 };
|
|
25870
|
+
}
|
|
25871
|
+
if (isRuntimeTensor(v)) {
|
|
25872
|
+
if (v.data.length === 0) return null;
|
|
25873
|
+
const rows = v.shape.length >= 2 ? v.shape[0] : 1;
|
|
25874
|
+
const cols = v.data.length / (rows || 1);
|
|
25875
|
+
const out = [];
|
|
25876
|
+
for (let i = 0; i < v.data.length; i++) {
|
|
25877
|
+
out.push(
|
|
25878
|
+
v._isLogical ? v.data[i] ? "true" : "false" : matlabNumToString(v.data[i])
|
|
25879
|
+
);
|
|
25880
|
+
}
|
|
25881
|
+
return { data: out, rows, cols };
|
|
25882
|
+
}
|
|
25883
|
+
throw new RuntimeError(`Cannot concatenate ${kstr(v)} into string array`);
|
|
25884
|
+
}
|
|
25885
|
+
function stringCat(values, dim) {
|
|
25886
|
+
const blocks = [];
|
|
25887
|
+
for (const v of values) {
|
|
25888
|
+
const b = toStringBlock(v);
|
|
25889
|
+
if (b) blocks.push(b);
|
|
25890
|
+
}
|
|
25891
|
+
if (blocks.length === 0) return RTV.stringArray([], [0, 0]);
|
|
25892
|
+
if (dim === 1) {
|
|
25893
|
+
const rows2 = blocks[0].rows;
|
|
25894
|
+
let cols2 = 0;
|
|
25895
|
+
for (const b of blocks) {
|
|
25896
|
+
if (b.rows !== rows2) {
|
|
25897
|
+
throw new RuntimeError(
|
|
25898
|
+
"Dimensions of arrays being concatenated are not consistent"
|
|
25899
|
+
);
|
|
25900
|
+
}
|
|
25901
|
+
cols2 += b.cols;
|
|
25902
|
+
}
|
|
25903
|
+
const data2 = [];
|
|
25904
|
+
for (const b of blocks) data2.push(...b.data);
|
|
25905
|
+
return stringArrayValue(data2, [rows2, cols2]);
|
|
25906
|
+
}
|
|
25907
|
+
const cols = blocks[0].cols;
|
|
25908
|
+
let rows = 0;
|
|
25909
|
+
for (const b of blocks) {
|
|
25910
|
+
if (b.cols !== cols) {
|
|
25911
|
+
throw new RuntimeError(
|
|
25912
|
+
"Dimensions of arrays being concatenated are not consistent"
|
|
25913
|
+
);
|
|
25914
|
+
}
|
|
25915
|
+
rows += b.rows;
|
|
25916
|
+
}
|
|
25917
|
+
const data = new Array(rows * cols);
|
|
25918
|
+
let rOff = 0;
|
|
25919
|
+
for (const b of blocks) {
|
|
25920
|
+
for (let c = 0; c < cols; c++) {
|
|
25921
|
+
for (let r = 0; r < b.rows; r++) {
|
|
25922
|
+
data[c * rows + rOff + r] = b.data[c * b.rows + r];
|
|
25923
|
+
}
|
|
25924
|
+
}
|
|
25925
|
+
rOff += b.rows;
|
|
25926
|
+
}
|
|
25927
|
+
return stringArrayValue(data, [rows, cols]);
|
|
25928
|
+
}
|
|
25634
25929
|
function vertcatChars(values) {
|
|
25635
25930
|
let cols = null;
|
|
25636
25931
|
let totalRows = 0;
|
|
@@ -29860,9 +30155,9 @@ var ExpressionParser = class extends ParserBase {
|
|
|
29860
30155
|
if (this.consume(50 /* LParen */)) {
|
|
29861
30156
|
const args = [];
|
|
29862
30157
|
if (!this.consume(51 /* RParen */)) {
|
|
29863
|
-
|
|
30158
|
+
this.parseFuncArg(args);
|
|
29864
30159
|
while (this.consume(47 /* Comma */)) {
|
|
29865
|
-
|
|
30160
|
+
this.parseFuncArg(args);
|
|
29866
30161
|
}
|
|
29867
30162
|
if (!this.consume(51 /* RParen */)) {
|
|
29868
30163
|
throw this.error("expected ')' after method arguments");
|
|
@@ -29891,9 +30186,9 @@ var ExpressionParser = class extends ParserBase {
|
|
|
29891
30186
|
}
|
|
29892
30187
|
const args = [];
|
|
29893
30188
|
if (!this.consume(51 /* RParen */)) {
|
|
29894
|
-
|
|
30189
|
+
this.parseFuncArg(args);
|
|
29895
30190
|
while (this.consume(47 /* Comma */)) {
|
|
29896
|
-
|
|
30191
|
+
this.parseFuncArg(args);
|
|
29897
30192
|
}
|
|
29898
30193
|
if (!this.consume(51 /* RParen */)) {
|
|
29899
30194
|
throw this.error("expected ')' after super call arguments");
|
|
@@ -30740,13 +31035,8 @@ var FunctionParser = class extends ArgumentsParser {
|
|
|
30740
31035
|
}
|
|
30741
31036
|
}
|
|
30742
31037
|
const vararginIdx = params.indexOf("varargin");
|
|
30743
|
-
if (vararginIdx !== -1) {
|
|
30744
|
-
|
|
30745
|
-
throw this.error("'varargin' must be the last input parameter");
|
|
30746
|
-
}
|
|
30747
|
-
if (params.filter((p2) => p2 === "varargin").length > 1) {
|
|
30748
|
-
throw this.error("'varargin' cannot appear more than once");
|
|
30749
|
-
}
|
|
31038
|
+
if (vararginIdx !== -1 && params.filter((p2) => p2 === "varargin").length > 1) {
|
|
31039
|
+
throw this.error("'varargin' cannot appear more than once");
|
|
30750
31040
|
}
|
|
30751
31041
|
const varargoutIdx = outputs.indexOf("varargout");
|
|
30752
31042
|
if (varargoutIdx !== -1) {
|
|
@@ -30758,6 +31048,22 @@ var FunctionParser = class extends ArgumentsParser {
|
|
|
30758
31048
|
}
|
|
30759
31049
|
}
|
|
30760
31050
|
const argumentsBlocks = this.parseArgumentsBlocks();
|
|
31051
|
+
if (vararginIdx !== -1 && vararginIdx !== params.length - 1) {
|
|
31052
|
+
const nvBases = /* @__PURE__ */ new Set();
|
|
31053
|
+
for (const block of argumentsBlocks) {
|
|
31054
|
+
if (block.kind === "Output" || block.kind === "OutputRepeating")
|
|
31055
|
+
continue;
|
|
31056
|
+
for (const e of block.entries) {
|
|
31057
|
+
const dot2 = e.name.indexOf(".");
|
|
31058
|
+
if (dot2 >= 0) nvBases.add(e.name.slice(0, dot2));
|
|
31059
|
+
}
|
|
31060
|
+
}
|
|
31061
|
+
for (const p2 of params.slice(vararginIdx + 1)) {
|
|
31062
|
+
if (!nvBases.has(p2)) {
|
|
31063
|
+
throw this.error("'varargin' must be the last input parameter");
|
|
31064
|
+
}
|
|
31065
|
+
}
|
|
31066
|
+
}
|
|
30761
31067
|
const body = this.parseBlock((t) => t === 15 /* End */);
|
|
30762
31068
|
if (!this.consume(15 /* End */)) {
|
|
30763
31069
|
throw this.error("expected 'end'");
|
|
@@ -32170,6 +32476,16 @@ function forIter(v) {
|
|
|
32170
32476
|
if (isRuntimeChar(mv)) {
|
|
32171
32477
|
return Array.from(mv.value).map((c) => RTV.char(c));
|
|
32172
32478
|
}
|
|
32479
|
+
if (isRuntimeStringArray(mv)) {
|
|
32480
|
+
const [rows, cols] = mv.shape;
|
|
32481
|
+
const out = [];
|
|
32482
|
+
for (let c = 0; c < cols; c++) {
|
|
32483
|
+
out.push(
|
|
32484
|
+
stringArrayValue(mv.data.slice(c * rows, (c + 1) * rows), [rows, 1])
|
|
32485
|
+
);
|
|
32486
|
+
}
|
|
32487
|
+
return out;
|
|
32488
|
+
}
|
|
32173
32489
|
return [v];
|
|
32174
32490
|
}
|
|
32175
32491
|
function emptyTensor() {
|
|
@@ -34601,6 +34917,13 @@ function valuesEqualSimple(a, b) {
|
|
|
34601
34917
|
}
|
|
34602
34918
|
return true;
|
|
34603
34919
|
}
|
|
34920
|
+
if (isRuntimeStringArray(a) && isRuntimeStringArray(b)) {
|
|
34921
|
+
if (a.shape[0] !== b.shape[0] || a.shape[1] !== b.shape[1]) return false;
|
|
34922
|
+
for (let i = 0; i < a.data.length; i++) {
|
|
34923
|
+
if (a.data[i] !== b.data[i]) return false;
|
|
34924
|
+
}
|
|
34925
|
+
return true;
|
|
34926
|
+
}
|
|
34604
34927
|
return false;
|
|
34605
34928
|
}
|
|
34606
34929
|
function textValue(v) {
|
|
@@ -34873,6 +35196,7 @@ function getShape(v) {
|
|
|
34873
35196
|
if (isRuntimeCell(v)) return v.shape;
|
|
34874
35197
|
if (isRuntimeStructArray(v)) return [1, v.elements.length];
|
|
34875
35198
|
if (isRuntimeClassInstanceArray(v)) return [...v.shape];
|
|
35199
|
+
if (isRuntimeStringArray(v)) return [...v.shape];
|
|
34876
35200
|
return [1, 1];
|
|
34877
35201
|
}
|
|
34878
35202
|
defineBuiltin({
|
|
@@ -34928,7 +35252,11 @@ defineBuiltin({
|
|
|
34928
35252
|
});
|
|
34929
35253
|
defineBuiltin({
|
|
34930
35254
|
name: "isstring",
|
|
34931
|
-
cases: [
|
|
35255
|
+
cases: [
|
|
35256
|
+
anyToLogicalCase(
|
|
35257
|
+
(args) => isRuntimeString(args[0]) || isRuntimeStringArray(args[0])
|
|
35258
|
+
)
|
|
35259
|
+
]
|
|
34932
35260
|
});
|
|
34933
35261
|
var MATLAB_KEYWORDS = /* @__PURE__ */ new Set([
|
|
34934
35262
|
"break",
|
|
@@ -35111,6 +35439,7 @@ defineBuiltin({
|
|
|
35111
35439
|
if (isRuntimeString(v)) return false;
|
|
35112
35440
|
if (isRuntimeStructArray(v)) return v.elements.length === 0;
|
|
35113
35441
|
if (isRuntimeClassInstanceArray(v)) return v.elements.length === 0;
|
|
35442
|
+
if (isRuntimeStringArray(v)) return v.data.length === 0;
|
|
35114
35443
|
return false;
|
|
35115
35444
|
})
|
|
35116
35445
|
]
|
|
@@ -35165,6 +35494,7 @@ defineBuiltin({
|
|
|
35165
35494
|
if (isRuntimeString(v)) return 1;
|
|
35166
35495
|
if (isRuntimeStructArray(v)) return v.elements.length;
|
|
35167
35496
|
if (isRuntimeClassInstanceArray(v)) return v.elements.length;
|
|
35497
|
+
if (isRuntimeStringArray(v)) return v.data.length;
|
|
35168
35498
|
return 1;
|
|
35169
35499
|
}
|
|
35170
35500
|
}
|
|
@@ -35195,6 +35525,8 @@ defineBuiltin({
|
|
|
35195
35525
|
if (isRuntimeStructArray(v)) return v.elements.length;
|
|
35196
35526
|
if (isRuntimeClassInstanceArray(v))
|
|
35197
35527
|
return v.elements.length === 0 ? 0 : Math.max(...v.shape);
|
|
35528
|
+
if (isRuntimeStringArray(v))
|
|
35529
|
+
return v.data.length === 0 ? 0 : Math.max(...v.shape);
|
|
35198
35530
|
return 1;
|
|
35199
35531
|
}
|
|
35200
35532
|
}
|
|
@@ -35322,6 +35654,7 @@ defineBuiltin({
|
|
|
35322
35654
|
return mkChar(v._isLogical ? "logical" : "double");
|
|
35323
35655
|
if (isRuntimeSparseMatrix(v)) return mkChar("double");
|
|
35324
35656
|
if (isRuntimeString(v)) return mkChar("string");
|
|
35657
|
+
if (isRuntimeStringArray(v)) return mkChar("string");
|
|
35325
35658
|
if (isRuntimeChar(v)) return mkChar("char");
|
|
35326
35659
|
if (isRuntimeStruct(v) || isRuntimeStructArray(v))
|
|
35327
35660
|
return mkChar("struct");
|
|
@@ -35372,7 +35705,7 @@ function fieldnamesApply(args) {
|
|
|
35372
35705
|
if (isRuntimeStructArray(v)) {
|
|
35373
35706
|
const names2 = v.fieldNames;
|
|
35374
35707
|
return RTV.cell(
|
|
35375
|
-
names2.map((n) => RTV.
|
|
35708
|
+
names2.map((n) => RTV.char(n)),
|
|
35376
35709
|
[names2.length, 1]
|
|
35377
35710
|
);
|
|
35378
35711
|
}
|
|
@@ -35380,7 +35713,7 @@ function fieldnamesApply(args) {
|
|
|
35380
35713
|
throw new RuntimeError("fieldnames: argument must be a struct");
|
|
35381
35714
|
const names = [...v.fields.keys()];
|
|
35382
35715
|
return RTV.cell(
|
|
35383
|
-
names.map((n) => RTV.
|
|
35716
|
+
names.map((n) => RTV.char(n)),
|
|
35384
35717
|
[names.length, 1]
|
|
35385
35718
|
);
|
|
35386
35719
|
}
|
|
@@ -36457,6 +36790,87 @@ defineBuiltin({
|
|
|
36457
36790
|
]
|
|
36458
36791
|
});
|
|
36459
36792
|
|
|
36793
|
+
// src/numbl-core/helpers/scanFormat.ts
|
|
36794
|
+
function scanFormat(str, fmt, maxCount) {
|
|
36795
|
+
const results = [];
|
|
36796
|
+
let strPos = 0;
|
|
36797
|
+
let fmtPos = 0;
|
|
36798
|
+
let matchFailure = false;
|
|
36799
|
+
while (fmtPos < fmt.length && strPos < str.length && results.length < maxCount) {
|
|
36800
|
+
if (fmt[fmtPos] === "%") {
|
|
36801
|
+
fmtPos++;
|
|
36802
|
+
if (fmtPos >= fmt.length) break;
|
|
36803
|
+
while (fmtPos < fmt.length && /[\d.]/.test(fmt[fmtPos])) fmtPos++;
|
|
36804
|
+
if (fmtPos >= fmt.length) break;
|
|
36805
|
+
const spec = fmt[fmtPos];
|
|
36806
|
+
fmtPos++;
|
|
36807
|
+
if (spec !== "c" && spec !== "s") {
|
|
36808
|
+
while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
|
|
36809
|
+
}
|
|
36810
|
+
if (spec === "d" || spec === "i" || spec === "u") {
|
|
36811
|
+
const m = str.slice(strPos).match(/^[+-]?\d+/);
|
|
36812
|
+
if (!m) {
|
|
36813
|
+
matchFailure = true;
|
|
36814
|
+
break;
|
|
36815
|
+
}
|
|
36816
|
+
results.push(parseInt(m[0], 10));
|
|
36817
|
+
strPos += m[0].length;
|
|
36818
|
+
} else if (spec === "f" || spec === "e" || spec === "g") {
|
|
36819
|
+
const m = str.slice(strPos).match(/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?/);
|
|
36820
|
+
if (!m) {
|
|
36821
|
+
matchFailure = true;
|
|
36822
|
+
break;
|
|
36823
|
+
}
|
|
36824
|
+
results.push(parseFloat(m[0]));
|
|
36825
|
+
strPos += m[0].length;
|
|
36826
|
+
} else if (spec === "x") {
|
|
36827
|
+
const m = str.slice(strPos).match(/^[+-]?[0-9a-fA-F]+/);
|
|
36828
|
+
if (!m) {
|
|
36829
|
+
matchFailure = true;
|
|
36830
|
+
break;
|
|
36831
|
+
}
|
|
36832
|
+
results.push(parseInt(m[0], 16));
|
|
36833
|
+
strPos += m[0].length;
|
|
36834
|
+
} else if (spec === "o") {
|
|
36835
|
+
const m = str.slice(strPos).match(/^[+-]?[0-7]+/);
|
|
36836
|
+
if (!m) {
|
|
36837
|
+
matchFailure = true;
|
|
36838
|
+
break;
|
|
36839
|
+
}
|
|
36840
|
+
results.push(parseInt(m[0], 8));
|
|
36841
|
+
strPos += m[0].length;
|
|
36842
|
+
} else if (spec === "c") {
|
|
36843
|
+
results.push(str.charCodeAt(strPos));
|
|
36844
|
+
strPos++;
|
|
36845
|
+
} else if (spec === "s") {
|
|
36846
|
+
const m = str.slice(strPos).match(/^\S+/);
|
|
36847
|
+
if (!m) {
|
|
36848
|
+
matchFailure = true;
|
|
36849
|
+
break;
|
|
36850
|
+
}
|
|
36851
|
+
for (let ci = 0; ci < m[0].length && results.length < maxCount; ci++) {
|
|
36852
|
+
results.push(m[0].charCodeAt(ci));
|
|
36853
|
+
}
|
|
36854
|
+
strPos += m[0].length;
|
|
36855
|
+
}
|
|
36856
|
+
} else if (/\s/.test(fmt[fmtPos])) {
|
|
36857
|
+
fmtPos++;
|
|
36858
|
+
while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
|
|
36859
|
+
} else {
|
|
36860
|
+
if (str[strPos] !== fmt[fmtPos]) {
|
|
36861
|
+
matchFailure = true;
|
|
36862
|
+
break;
|
|
36863
|
+
}
|
|
36864
|
+
strPos++;
|
|
36865
|
+
fmtPos++;
|
|
36866
|
+
}
|
|
36867
|
+
if (fmtPos >= fmt.length && results.length < maxCount && strPos < str.length) {
|
|
36868
|
+
fmtPos = 0;
|
|
36869
|
+
}
|
|
36870
|
+
}
|
|
36871
|
+
return { results, consumed: strPos, matchFailure };
|
|
36872
|
+
}
|
|
36873
|
+
|
|
36460
36874
|
// src/numbl-core/interpreter/builtins/strings.ts
|
|
36461
36875
|
function isTextType(t) {
|
|
36462
36876
|
return t.kind === "char" || t.kind === "string";
|
|
@@ -36481,6 +36895,9 @@ function applyTextFn(v, fn) {
|
|
|
36481
36895
|
return RTV.char(fn(v.value));
|
|
36482
36896
|
}
|
|
36483
36897
|
if (isRuntimeString(v)) return RTV.string(fn(toString(v)));
|
|
36898
|
+
if (isRuntimeStringArray(v)) {
|
|
36899
|
+
return RTV.stringArray(v.data.map(fn), [v.shape[0], v.shape[1]]);
|
|
36900
|
+
}
|
|
36484
36901
|
return v;
|
|
36485
36902
|
}
|
|
36486
36903
|
function textPreserveResolve(fn) {
|
|
@@ -36493,6 +36910,16 @@ function textPreserveResolve(fn) {
|
|
|
36493
36910
|
apply: (args) => applyTextFn(args[0], fn)
|
|
36494
36911
|
};
|
|
36495
36912
|
}
|
|
36913
|
+
if (t.kind === "unknown") {
|
|
36914
|
+
return {
|
|
36915
|
+
outputTypes: [{ kind: "unknown" }],
|
|
36916
|
+
apply: (args) => {
|
|
36917
|
+
if (!isRuntimeStringArray(args[0]))
|
|
36918
|
+
throw new RuntimeError("Expected a text input");
|
|
36919
|
+
return applyTextFn(args[0], fn);
|
|
36920
|
+
}
|
|
36921
|
+
};
|
|
36922
|
+
}
|
|
36496
36923
|
const out = preserveTextType(t);
|
|
36497
36924
|
if (!out) return null;
|
|
36498
36925
|
return {
|
|
@@ -36582,17 +37009,14 @@ registerIBuiltin({
|
|
|
36582
37009
|
name: "erase",
|
|
36583
37010
|
resolve: (argTypes) => {
|
|
36584
37011
|
if (argTypes.length !== 2) return null;
|
|
36585
|
-
const out = preserveTextType(argTypes[0]);
|
|
37012
|
+
const out = argTypes[0].kind === "unknown" ? { kind: "unknown" } : preserveTextType(argTypes[0]);
|
|
36586
37013
|
if (!out) return null;
|
|
36587
37014
|
if (!isTextType(argTypes[1])) return null;
|
|
36588
37015
|
return {
|
|
36589
37016
|
outputTypes: [out],
|
|
36590
37017
|
apply: (args) => {
|
|
36591
|
-
const v = args[0];
|
|
36592
|
-
const s = toString(v);
|
|
36593
37018
|
const pat = toString(args[1]);
|
|
36594
|
-
|
|
36595
|
-
return isRuntimeChar(v) ? RTV.char(result) : RTV.string(result);
|
|
37019
|
+
return applyTextFn(args[0], (s) => s.split(pat).join(""));
|
|
36596
37020
|
}
|
|
36597
37021
|
};
|
|
36598
37022
|
}
|
|
@@ -36600,18 +37024,15 @@ registerIBuiltin({
|
|
|
36600
37024
|
function strreplaceResolve() {
|
|
36601
37025
|
return (argTypes) => {
|
|
36602
37026
|
if (argTypes.length !== 3) return null;
|
|
36603
|
-
const out = preserveTextType(argTypes[0]);
|
|
37027
|
+
const out = argTypes[0].kind === "unknown" || argTypes[0].kind === "cell" ? { kind: argTypes[0].kind } : preserveTextType(argTypes[0]);
|
|
36604
37028
|
if (!out) return null;
|
|
36605
37029
|
if (!isTextType(argTypes[1]) || !isTextType(argTypes[2])) return null;
|
|
36606
37030
|
return {
|
|
36607
37031
|
outputTypes: [out],
|
|
36608
37032
|
apply: (args) => {
|
|
36609
|
-
const v = args[0];
|
|
36610
|
-
const s = toString(v);
|
|
36611
37033
|
const old = toString(args[1]);
|
|
36612
37034
|
const rep = toString(args[2]);
|
|
36613
|
-
|
|
36614
|
-
return isRuntimeChar(v) ? RTV.char(result) : RTV.string(result);
|
|
37035
|
+
return applyTextFn(args[0], (s) => s.split(old).join(rep));
|
|
36615
37036
|
}
|
|
36616
37037
|
};
|
|
36617
37038
|
};
|
|
@@ -36779,9 +37200,16 @@ registerIBuiltin({
|
|
|
36779
37200
|
function isText(v) {
|
|
36780
37201
|
return isRuntimeChar(v) || isRuntimeString(v);
|
|
36781
37202
|
}
|
|
37203
|
+
function stringArrayToCell(v) {
|
|
37204
|
+
if (!isRuntimeStringArray(v)) return v;
|
|
37205
|
+
return RTV.cell(
|
|
37206
|
+
v.data.map((s) => RTV.string(s)),
|
|
37207
|
+
[v.shape[0], v.shape[1]]
|
|
37208
|
+
);
|
|
37209
|
+
}
|
|
36782
37210
|
function strcmpApply(args, cmp) {
|
|
36783
|
-
const a = args[0];
|
|
36784
|
-
const b = args[1];
|
|
37211
|
+
const a = stringArrayToCell(args[0]);
|
|
37212
|
+
const b = stringArrayToCell(args[1]);
|
|
36785
37213
|
const aIsCell = isRuntimeCell(a);
|
|
36786
37214
|
const bIsCell = isRuntimeCell(b);
|
|
36787
37215
|
if (!aIsCell && !bIsCell) {
|
|
@@ -37027,24 +37455,43 @@ registerIBuiltin({
|
|
|
37027
37455
|
};
|
|
37028
37456
|
}
|
|
37029
37457
|
});
|
|
37458
|
+
function patternList(pat) {
|
|
37459
|
+
if (isRuntimeCell(pat)) return pat.data.map((e) => toString(e));
|
|
37460
|
+
if (isRuntimeStringArray(pat)) return pat.data.slice();
|
|
37461
|
+
return [toString(pat)];
|
|
37462
|
+
}
|
|
37463
|
+
function textSubjectApply(subject, perElem) {
|
|
37464
|
+
if (isRuntimeStringArray(subject)) {
|
|
37465
|
+
return new RuntimeTensor(
|
|
37466
|
+
allocFloat64Array(subject.data.map((s) => perElem(s) ? 1 : 0)),
|
|
37467
|
+
[subject.shape[0], subject.shape[1]],
|
|
37468
|
+
void 0,
|
|
37469
|
+
true
|
|
37470
|
+
);
|
|
37471
|
+
}
|
|
37472
|
+
if (isRuntimeCell(subject)) {
|
|
37473
|
+
return new RuntimeTensor(
|
|
37474
|
+
allocFloat64Array(subject.data.map((e) => perElem(toString(e)) ? 1 : 0)),
|
|
37475
|
+
subject.shape.slice(),
|
|
37476
|
+
void 0,
|
|
37477
|
+
true
|
|
37478
|
+
);
|
|
37479
|
+
}
|
|
37480
|
+
return RTV.logical(perElem(toString(subject)));
|
|
37481
|
+
}
|
|
37482
|
+
function subjectTypeOk(t) {
|
|
37483
|
+
return isTextType(t) || t.kind === "cell" || t.kind === "unknown";
|
|
37484
|
+
}
|
|
37030
37485
|
registerIBuiltin({
|
|
37031
37486
|
name: "contains",
|
|
37032
37487
|
resolve: (argTypes) => {
|
|
37033
37488
|
if (argTypes.length < 2) return null;
|
|
37034
|
-
if (!
|
|
37035
|
-
if (argTypes[1].kind === "unknown") return null;
|
|
37489
|
+
if (!subjectTypeOk(argTypes[0])) return null;
|
|
37036
37490
|
return {
|
|
37037
37491
|
outputTypes: [{ kind: "boolean" }],
|
|
37038
37492
|
apply: (args) => {
|
|
37039
|
-
const
|
|
37040
|
-
|
|
37041
|
-
if (isRuntimeCell(pat)) {
|
|
37042
|
-
for (let i = 0; i < pat.data.length; i++) {
|
|
37043
|
-
if (s.includes(toString(pat.data[i]))) return RTV.logical(true);
|
|
37044
|
-
}
|
|
37045
|
-
return RTV.logical(false);
|
|
37046
|
-
}
|
|
37047
|
-
return RTV.logical(s.includes(toString(pat)));
|
|
37493
|
+
const pats = patternList(args[1]);
|
|
37494
|
+
return textSubjectApply(args[0], (s) => pats.some((p2) => s.includes(p2)));
|
|
37048
37495
|
}
|
|
37049
37496
|
};
|
|
37050
37497
|
}
|
|
@@ -37054,7 +37501,7 @@ function resolveStartsEndsWith(name, testFn) {
|
|
|
37054
37501
|
name,
|
|
37055
37502
|
resolve: (argTypes) => {
|
|
37056
37503
|
if (argTypes.length < 2) return null;
|
|
37057
|
-
if (!
|
|
37504
|
+
if (!subjectTypeOk(argTypes[0])) return null;
|
|
37058
37505
|
return {
|
|
37059
37506
|
outputTypes: [{ kind: "boolean" }],
|
|
37060
37507
|
apply: (args) => {
|
|
@@ -37064,20 +37511,12 @@ function resolveStartsEndsWith(name, testFn) {
|
|
|
37064
37511
|
ic = !!toNumber(args[i + 1]);
|
|
37065
37512
|
}
|
|
37066
37513
|
}
|
|
37067
|
-
let
|
|
37068
|
-
if (ic)
|
|
37069
|
-
|
|
37070
|
-
|
|
37071
|
-
|
|
37072
|
-
|
|
37073
|
-
if (ic) p3 = p3.toLowerCase();
|
|
37074
|
-
if (testFn(s, p3)) return RTV.logical(true);
|
|
37075
|
-
}
|
|
37076
|
-
return RTV.logical(false);
|
|
37077
|
-
}
|
|
37078
|
-
let p2 = toString(pat);
|
|
37079
|
-
if (ic) p2 = p2.toLowerCase();
|
|
37080
|
-
return RTV.logical(testFn(s, p2));
|
|
37514
|
+
let pats = patternList(args[1]);
|
|
37515
|
+
if (ic) pats = pats.map((p2) => p2.toLowerCase());
|
|
37516
|
+
return textSubjectApply(args[0], (s0) => {
|
|
37517
|
+
const s = ic ? s0.toLowerCase() : s0;
|
|
37518
|
+
return pats.some((p2) => testFn(s, p2));
|
|
37519
|
+
});
|
|
37081
37520
|
}
|
|
37082
37521
|
};
|
|
37083
37522
|
}
|
|
@@ -37089,13 +37528,19 @@ registerIBuiltin({
|
|
|
37089
37528
|
name: "strlength",
|
|
37090
37529
|
resolve: (argTypes) => {
|
|
37091
37530
|
if (argTypes.length !== 1) return null;
|
|
37092
|
-
if (!isTextType(argTypes[0])) return null;
|
|
37531
|
+
if (!isTextType(argTypes[0]) && argTypes[0].kind !== "unknown") return null;
|
|
37093
37532
|
return {
|
|
37094
37533
|
outputTypes: [{ kind: "number", sign: "nonneg" }],
|
|
37095
37534
|
apply: (args) => {
|
|
37096
37535
|
const v = args[0];
|
|
37097
37536
|
if (isRuntimeString(v)) return RTV.num(v.length);
|
|
37098
37537
|
if (isRuntimeChar(v)) return RTV.num(v.value.length);
|
|
37538
|
+
if (isRuntimeStringArray(v)) {
|
|
37539
|
+
return RTV.tensor(allocFloat64Array(v.data.map((s) => s.length)), [
|
|
37540
|
+
v.shape[0],
|
|
37541
|
+
v.shape[1]
|
|
37542
|
+
]);
|
|
37543
|
+
}
|
|
37099
37544
|
throw new RuntimeError("strlength: argument must be a string or char");
|
|
37100
37545
|
}
|
|
37101
37546
|
};
|
|
@@ -37151,6 +37596,20 @@ registerIBuiltin({
|
|
|
37151
37596
|
}
|
|
37152
37597
|
};
|
|
37153
37598
|
}
|
|
37599
|
+
if (t.kind === "unknown") {
|
|
37600
|
+
return {
|
|
37601
|
+
outputTypes: [{ kind: "tensor", isComplex: false }],
|
|
37602
|
+
apply: (args) => {
|
|
37603
|
+
const v = args[0];
|
|
37604
|
+
if (!isRuntimeStringArray(v))
|
|
37605
|
+
throw new RuntimeError("str2double: expected text input");
|
|
37606
|
+
return RTV.tensor(
|
|
37607
|
+
allocFloat64Array(v.data.map((s) => str2doubleScalar(s))),
|
|
37608
|
+
[v.shape[0], v.shape[1]]
|
|
37609
|
+
);
|
|
37610
|
+
}
|
|
37611
|
+
};
|
|
37612
|
+
}
|
|
37154
37613
|
return null;
|
|
37155
37614
|
}
|
|
37156
37615
|
});
|
|
@@ -37336,29 +37795,7 @@ registerIBuiltin({
|
|
|
37336
37795
|
};
|
|
37337
37796
|
}
|
|
37338
37797
|
});
|
|
37339
|
-
|
|
37340
|
-
if (n === Infinity) return "Inf";
|
|
37341
|
-
if (n === -Infinity) return "-Inf";
|
|
37342
|
-
if (isNaN(n)) return "NaN";
|
|
37343
|
-
if (n === 0) return "0";
|
|
37344
|
-
if (Number.isInteger(n)) return String(n);
|
|
37345
|
-
const prec = 5;
|
|
37346
|
-
const exp2 = Math.floor(Math.log10(Math.abs(n)));
|
|
37347
|
-
let s;
|
|
37348
|
-
if (exp2 < -4 || exp2 >= prec) {
|
|
37349
|
-
s = n.toExponential(prec - 1);
|
|
37350
|
-
const ePos = s.indexOf("e");
|
|
37351
|
-
let mantissa = s.slice(0, ePos);
|
|
37352
|
-
const expPart0 = s.slice(ePos);
|
|
37353
|
-
if (mantissa.includes(".")) mantissa = mantissa.replace(/\.?0+$/, "");
|
|
37354
|
-
const expPart = expPart0.replace(/([eE][+-])(\d)$/, "$10$2");
|
|
37355
|
-
s = mantissa + expPart;
|
|
37356
|
-
} else {
|
|
37357
|
-
s = n.toPrecision(prec);
|
|
37358
|
-
if (s.includes(".")) s = s.replace(/\.?0+$/, "");
|
|
37359
|
-
}
|
|
37360
|
-
return s;
|
|
37361
|
-
}
|
|
37798
|
+
var numStr2 = matlabNumToString;
|
|
37362
37799
|
registerIBuiltin({
|
|
37363
37800
|
name: "num2str",
|
|
37364
37801
|
resolve: (argTypes) => {
|
|
@@ -37569,7 +38006,7 @@ registerIBuiltin({
|
|
|
37569
38006
|
resolve: (argTypes) => {
|
|
37570
38007
|
if (argTypes.length !== 1) return null;
|
|
37571
38008
|
const a = argTypes[0];
|
|
37572
|
-
if (a.kind !== "char" && a.kind !== "string" && a.kind !== "number" && a.kind !== "tensor" && a.kind !== "cell")
|
|
38009
|
+
if (a.kind !== "char" && a.kind !== "string" && a.kind !== "number" && a.kind !== "tensor" && a.kind !== "cell" && a.kind !== "unknown")
|
|
37573
38010
|
return null;
|
|
37574
38011
|
return {
|
|
37575
38012
|
outputTypes: [{ kind: "char" }],
|
|
@@ -37591,6 +38028,9 @@ registerIBuiltin({
|
|
|
37591
38028
|
for (const el of v.data) rows.push(...valueToCharRows(el));
|
|
37592
38029
|
return charRowsToMatrix(rows);
|
|
37593
38030
|
}
|
|
38031
|
+
if (isRuntimeStringArray(v)) {
|
|
38032
|
+
return charRowsToMatrix(v.data.slice());
|
|
38033
|
+
}
|
|
37594
38034
|
throw new RuntimeError("char: unsupported arguments");
|
|
37595
38035
|
}
|
|
37596
38036
|
};
|
|
@@ -37601,14 +38041,260 @@ registerIBuiltin({
|
|
|
37601
38041
|
resolve: (argTypes) => {
|
|
37602
38042
|
if (argTypes.length !== 1) return null;
|
|
37603
38043
|
const a = argTypes[0];
|
|
37604
|
-
|
|
38044
|
+
const scalarText = a.kind === "char" || a.kind === "string" || a.kind === "number" || a.kind === "boolean";
|
|
37605
38045
|
return {
|
|
37606
|
-
outputTypes: [{ kind: "string" }],
|
|
38046
|
+
outputTypes: [scalarText ? { kind: "string" } : { kind: "unknown" }],
|
|
37607
38047
|
apply: (args) => {
|
|
38048
|
+
const v = args[0];
|
|
38049
|
+
if (isRuntimeString(v) || isRuntimeStringArray(v)) return v;
|
|
38050
|
+
if (isRuntimeChar(v)) {
|
|
38051
|
+
const rows = v.shape ? v.shape[0] : 1;
|
|
38052
|
+
if (rows <= 1) return RTV.string(v.value);
|
|
38053
|
+
const width = v.shape[1];
|
|
38054
|
+
const out = [];
|
|
38055
|
+
for (let r = 0; r < rows; r++) {
|
|
38056
|
+
out.push(v.value.slice(r * width, (r + 1) * width));
|
|
38057
|
+
}
|
|
38058
|
+
return RTV.stringArray(out, [rows, 1]);
|
|
38059
|
+
}
|
|
38060
|
+
if (isRuntimeNumber(v)) return RTV.string(numStr2(v));
|
|
38061
|
+
if (isRuntimeLogical(v)) return RTV.string(v ? "true" : "false");
|
|
38062
|
+
if (isRuntimeTensor(v)) {
|
|
38063
|
+
const rows = v.shape.length >= 2 ? v.shape[0] : 1;
|
|
38064
|
+
const cols = v.data.length === 0 ? v.shape[1] ?? 0 : v.data.length / (rows || 1);
|
|
38065
|
+
const out = [];
|
|
38066
|
+
for (let i = 0; i < v.data.length; i++) {
|
|
38067
|
+
out.push(
|
|
38068
|
+
v._isLogical ? v.data[i] ? "true" : "false" : numStr2(v.data[i])
|
|
38069
|
+
);
|
|
38070
|
+
}
|
|
38071
|
+
return stringArrayValue(out, [rows, cols]);
|
|
38072
|
+
}
|
|
38073
|
+
if (isRuntimeCell(v)) {
|
|
38074
|
+
const rows = v.shape.length >= 2 ? v.shape[0] : 1;
|
|
38075
|
+
const cols = v.data.length / (rows || 1);
|
|
38076
|
+
const out = v.data.map((el) => {
|
|
38077
|
+
const rv = ensureRuntimeValue(el);
|
|
38078
|
+
if (isRuntimeChar(rv)) return rv.value;
|
|
38079
|
+
if (isRuntimeString(rv)) return rv;
|
|
38080
|
+
if (isRuntimeNumber(rv)) return numStr2(rv);
|
|
38081
|
+
if (isRuntimeLogical(rv)) return rv ? "true" : "false";
|
|
38082
|
+
throw new RuntimeError(
|
|
38083
|
+
"string: cell elements must be text or numbers"
|
|
38084
|
+
);
|
|
38085
|
+
});
|
|
38086
|
+
return stringArrayValue(out, [rows, cols]);
|
|
38087
|
+
}
|
|
38088
|
+
return RTV.string(displayValue(v));
|
|
38089
|
+
}
|
|
38090
|
+
};
|
|
38091
|
+
}
|
|
38092
|
+
});
|
|
38093
|
+
registerIBuiltin({
|
|
38094
|
+
name: "strings",
|
|
38095
|
+
help: {
|
|
38096
|
+
signatures: ["strings", "strings(n)", "strings(m,n)", "strings([m n])"],
|
|
38097
|
+
description: 'Create a string array with every element set to "" (empty string).'
|
|
38098
|
+
},
|
|
38099
|
+
resolve: (argTypes) => {
|
|
38100
|
+
if (argTypes.some((t) => t.kind !== "number" && t.kind !== "tensor"))
|
|
38101
|
+
return null;
|
|
38102
|
+
return {
|
|
38103
|
+
outputTypes: [{ kind: "unknown" }],
|
|
38104
|
+
apply: (args) => {
|
|
38105
|
+
const dims = [];
|
|
38106
|
+
for (const a of args) {
|
|
38107
|
+
const rv = ensureRuntimeValue(a);
|
|
38108
|
+
if (isRuntimeTensor(rv)) {
|
|
38109
|
+
for (const d of rv.data) dims.push(Math.max(0, Math.round(d)));
|
|
38110
|
+
} else {
|
|
38111
|
+
dims.push(Math.max(0, Math.round(toNumber(rv))));
|
|
38112
|
+
}
|
|
38113
|
+
}
|
|
38114
|
+
if (dims.length === 0) dims.push(1, 1);
|
|
38115
|
+
if (dims.length === 1) dims.push(dims[0]);
|
|
38116
|
+
const m = dims[0];
|
|
38117
|
+
const n = dims.slice(1).reduce((a, b) => a * b, 1);
|
|
38118
|
+
return stringArrayValue(new Array(m * n).fill(""), [m, n]);
|
|
38119
|
+
}
|
|
38120
|
+
};
|
|
38121
|
+
}
|
|
38122
|
+
});
|
|
38123
|
+
registerIBuiltin({
|
|
38124
|
+
name: "newline",
|
|
38125
|
+
help: {
|
|
38126
|
+
signatures: ["newline"],
|
|
38127
|
+
description: "Newline character, char(10)."
|
|
38128
|
+
},
|
|
38129
|
+
resolve: (argTypes) => {
|
|
38130
|
+
if (argTypes.length !== 0) return null;
|
|
38131
|
+
return {
|
|
38132
|
+
outputTypes: [{ kind: "char" }],
|
|
38133
|
+
apply: () => RTV.char("\n")
|
|
38134
|
+
};
|
|
38135
|
+
}
|
|
38136
|
+
});
|
|
38137
|
+
registerIBuiltin({
|
|
38138
|
+
name: "split",
|
|
38139
|
+
help: {
|
|
38140
|
+
signatures: ["split(str)", "split(str, delimiter)"],
|
|
38141
|
+
description: "Split text at whitespace (or the given delimiter(s)) into a string array. A scalar input yields a column of parts."
|
|
38142
|
+
},
|
|
38143
|
+
resolve: (argTypes) => {
|
|
38144
|
+
if (argTypes.length < 1 || argTypes.length > 2) return null;
|
|
38145
|
+
const a = argTypes[0];
|
|
38146
|
+
if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
|
|
38147
|
+
return null;
|
|
38148
|
+
return {
|
|
38149
|
+
outputTypes: [{ kind: "unknown" }],
|
|
38150
|
+
apply: (args) => {
|
|
38151
|
+
const delims = args.length >= 2 ? patternList(args[1]) : null;
|
|
38152
|
+
const splitOne = (s) => {
|
|
38153
|
+
if (delims === null) {
|
|
38154
|
+
const trimmed = s.trim();
|
|
38155
|
+
return trimmed.length === 0 ? [""] : trimmed.split(/\s+/);
|
|
38156
|
+
}
|
|
38157
|
+
const escaped = delims.map((d) => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
|
|
38158
|
+
return s.split(new RegExp(escaped));
|
|
38159
|
+
};
|
|
38160
|
+
const v = args[0];
|
|
38161
|
+
const subjects = isRuntimeStringArray(v) ? v.data.slice() : isRuntimeCell(v) ? v.data.map((e) => toString(e)) : [toString(v)];
|
|
38162
|
+
const partsPer = subjects.map(splitOne);
|
|
38163
|
+
const nParts = partsPer[0].length;
|
|
38164
|
+
if (partsPer.some((p2) => p2.length !== nParts)) {
|
|
38165
|
+
throw new RuntimeError(
|
|
38166
|
+
"split: all elements must split into the same number of parts"
|
|
38167
|
+
);
|
|
38168
|
+
}
|
|
38169
|
+
if (subjects.length === 1) {
|
|
38170
|
+
return stringArrayValue(partsPer[0], [nParts, 1]);
|
|
38171
|
+
}
|
|
38172
|
+
const m = subjects.length;
|
|
38173
|
+
const out = new Array(m * nParts);
|
|
38174
|
+
for (let i = 0; i < m; i++) {
|
|
38175
|
+
for (let j = 0; j < nParts; j++) {
|
|
38176
|
+
out[j * m + i] = partsPer[i][j];
|
|
38177
|
+
}
|
|
38178
|
+
}
|
|
38179
|
+
return stringArrayValue(out, [m, nParts]);
|
|
38180
|
+
}
|
|
38181
|
+
};
|
|
38182
|
+
}
|
|
38183
|
+
});
|
|
38184
|
+
registerIBuiltin({
|
|
38185
|
+
name: "join",
|
|
38186
|
+
help: {
|
|
38187
|
+
signatures: ["join(str)", "join(str, delimiter)"],
|
|
38188
|
+
description: "Combine the elements of a string array into single strings, separated by a space (or the given delimiter)."
|
|
38189
|
+
},
|
|
38190
|
+
resolve: (argTypes) => {
|
|
38191
|
+
if (argTypes.length < 1 || argTypes.length > 2) return null;
|
|
38192
|
+
const a = argTypes[0];
|
|
38193
|
+
if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
|
|
38194
|
+
return null;
|
|
38195
|
+
return {
|
|
38196
|
+
outputTypes: [{ kind: "unknown" }],
|
|
38197
|
+
apply: (args) => {
|
|
38198
|
+
const delim = args.length >= 2 ? toString(args[1]) : " ";
|
|
37608
38199
|
const v = args[0];
|
|
37609
38200
|
if (isRuntimeString(v)) return v;
|
|
37610
38201
|
if (isRuntimeChar(v)) return RTV.string(v.value);
|
|
37611
|
-
|
|
38202
|
+
const elems = isRuntimeStringArray(v) ? v.data : isRuntimeCell(v) ? v.data.map((e) => toString(e)) : [toString(v)];
|
|
38203
|
+
const shape = isRuntimeStringArray(v) ? v.shape : [1, elems.length];
|
|
38204
|
+
const [m, n] = shape;
|
|
38205
|
+
if (m === 1 || n === 1) {
|
|
38206
|
+
return RTV.string(elems.join(delim));
|
|
38207
|
+
}
|
|
38208
|
+
const out = [];
|
|
38209
|
+
for (let r = 0; r < m; r++) {
|
|
38210
|
+
const parts = [];
|
|
38211
|
+
for (let c = 0; c < n; c++) parts.push(elems[c * m + r]);
|
|
38212
|
+
out.push(parts.join(delim));
|
|
38213
|
+
}
|
|
38214
|
+
return stringArrayValue(out, [m, 1]);
|
|
38215
|
+
}
|
|
38216
|
+
};
|
|
38217
|
+
}
|
|
38218
|
+
});
|
|
38219
|
+
registerIBuiltin({
|
|
38220
|
+
name: "cellstr",
|
|
38221
|
+
help: {
|
|
38222
|
+
signatures: ["cellstr(A)"],
|
|
38223
|
+
description: "Convert a string array, char array, or cell array of text to a cell array of character vectors."
|
|
38224
|
+
},
|
|
38225
|
+
resolve: (argTypes) => {
|
|
38226
|
+
if (argTypes.length !== 1) return null;
|
|
38227
|
+
const a = argTypes[0];
|
|
38228
|
+
if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
|
|
38229
|
+
return null;
|
|
38230
|
+
return {
|
|
38231
|
+
outputTypes: [{ kind: "cell" }],
|
|
38232
|
+
apply: (args) => {
|
|
38233
|
+
const v = args[0];
|
|
38234
|
+
if (isRuntimeCell(v)) {
|
|
38235
|
+
return RTV.cell(
|
|
38236
|
+
v.data.map((e) => RTV.char(toString(e))),
|
|
38237
|
+
[...v.shape]
|
|
38238
|
+
);
|
|
38239
|
+
}
|
|
38240
|
+
if (isRuntimeStringArray(v)) {
|
|
38241
|
+
return RTV.cell(
|
|
38242
|
+
v.data.map((s) => RTV.char(s)),
|
|
38243
|
+
[v.shape[0], v.shape[1]]
|
|
38244
|
+
);
|
|
38245
|
+
}
|
|
38246
|
+
if (isRuntimeString(v)) return RTV.cell([RTV.char(v)], [1, 1]);
|
|
38247
|
+
if (isRuntimeChar(v)) {
|
|
38248
|
+
const rows = v.shape ? v.shape[0] : 1;
|
|
38249
|
+
if (rows <= 1) {
|
|
38250
|
+
return RTV.cell([RTV.char(v.value.replace(/\s+$/, ""))], [1, 1]);
|
|
38251
|
+
}
|
|
38252
|
+
const width = v.shape[1];
|
|
38253
|
+
const out = [];
|
|
38254
|
+
for (let r = 0; r < rows; r++) {
|
|
38255
|
+
out.push(
|
|
38256
|
+
RTV.char(
|
|
38257
|
+
v.value.slice(r * width, (r + 1) * width).replace(/\s+$/, "")
|
|
38258
|
+
)
|
|
38259
|
+
);
|
|
38260
|
+
}
|
|
38261
|
+
return RTV.cell(out, [rows, 1]);
|
|
38262
|
+
}
|
|
38263
|
+
throw new RuntimeError("cellstr: unsupported argument");
|
|
38264
|
+
}
|
|
38265
|
+
};
|
|
38266
|
+
}
|
|
38267
|
+
});
|
|
38268
|
+
registerIBuiltin({
|
|
38269
|
+
name: "ismissing",
|
|
38270
|
+
help: {
|
|
38271
|
+
signatures: ["ismissing(A)"],
|
|
38272
|
+
description: "Logical array marking missing elements. numbl has no <missing> value, so string inputs return all-false."
|
|
38273
|
+
},
|
|
38274
|
+
resolve: (argTypes) => {
|
|
38275
|
+
if (argTypes.length !== 1) return null;
|
|
38276
|
+
return {
|
|
38277
|
+
outputTypes: [{ kind: "boolean" }],
|
|
38278
|
+
apply: (args) => {
|
|
38279
|
+
const v = args[0];
|
|
38280
|
+
if (isRuntimeStringArray(v)) {
|
|
38281
|
+
const t = RTV.tensor(allocFloat64Array(v.data.length), [
|
|
38282
|
+
v.shape[0],
|
|
38283
|
+
v.shape[1]
|
|
38284
|
+
]);
|
|
38285
|
+
t._isLogical = true;
|
|
38286
|
+
return t;
|
|
38287
|
+
}
|
|
38288
|
+
if (isRuntimeTensor(v)) {
|
|
38289
|
+
const t = RTV.tensor(
|
|
38290
|
+
allocFloat64Array(v.data.map((x) => isNaN(x) ? 1 : 0)),
|
|
38291
|
+
[...v.shape]
|
|
38292
|
+
);
|
|
38293
|
+
t._isLogical = true;
|
|
38294
|
+
return t;
|
|
38295
|
+
}
|
|
38296
|
+
if (isRuntimeNumber(v)) return RTV.logical(isNaN(v));
|
|
38297
|
+
return RTV.logical(false);
|
|
37612
38298
|
}
|
|
37613
38299
|
};
|
|
37614
38300
|
}
|
|
@@ -37645,7 +38331,10 @@ registerIBuiltin({
|
|
|
37645
38331
|
outputTypes: [outType],
|
|
37646
38332
|
apply: (args) => {
|
|
37647
38333
|
const fmt = toString(args[0]);
|
|
37648
|
-
const
|
|
38334
|
+
const rest = args.slice(1).flatMap(
|
|
38335
|
+
(a) => isRuntimeStringArray(a) ? a.data.map((s) => RTV.string(s)) : [a]
|
|
38336
|
+
);
|
|
38337
|
+
const result = sprintfFormat(fmt, rest);
|
|
37649
38338
|
return isChar5 ? RTV.char(result) : RTV.string(result);
|
|
37650
38339
|
}
|
|
37651
38340
|
};
|
|
@@ -37666,80 +38355,11 @@ registerIBuiltin({
|
|
|
37666
38355
|
const str = toString(args[0]);
|
|
37667
38356
|
const fmt = toString(args[1]);
|
|
37668
38357
|
const maxCount = args.length >= 3 ? toNumber(args[2]) : Infinity;
|
|
37669
|
-
const
|
|
37670
|
-
|
|
37671
|
-
|
|
37672
|
-
|
|
37673
|
-
|
|
37674
|
-
if (fmt[fmtPos] === "%") {
|
|
37675
|
-
fmtPos++;
|
|
37676
|
-
if (fmtPos >= fmt.length) break;
|
|
37677
|
-
const spec = fmt[fmtPos];
|
|
37678
|
-
fmtPos++;
|
|
37679
|
-
if (spec !== "c" && spec !== "s") {
|
|
37680
|
-
while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
|
|
37681
|
-
}
|
|
37682
|
-
if (spec === "d" || spec === "i") {
|
|
37683
|
-
const m = str.slice(strPos).match(/^[+-]?\d+/);
|
|
37684
|
-
if (!m) {
|
|
37685
|
-
matchFailure = true;
|
|
37686
|
-
break;
|
|
37687
|
-
}
|
|
37688
|
-
results.push(parseInt(m[0], 10));
|
|
37689
|
-
strPos += m[0].length;
|
|
37690
|
-
} else if (spec === "f" || spec === "e" || spec === "g") {
|
|
37691
|
-
const m = str.slice(strPos).match(/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?/);
|
|
37692
|
-
if (!m) {
|
|
37693
|
-
matchFailure = true;
|
|
37694
|
-
break;
|
|
37695
|
-
}
|
|
37696
|
-
results.push(parseFloat(m[0]));
|
|
37697
|
-
strPos += m[0].length;
|
|
37698
|
-
} else if (spec === "x") {
|
|
37699
|
-
const m = str.slice(strPos).match(/^[+-]?[0-9a-fA-F]+/);
|
|
37700
|
-
if (!m) {
|
|
37701
|
-
matchFailure = true;
|
|
37702
|
-
break;
|
|
37703
|
-
}
|
|
37704
|
-
results.push(parseInt(m[0], 16));
|
|
37705
|
-
strPos += m[0].length;
|
|
37706
|
-
} else if (spec === "o") {
|
|
37707
|
-
const m = str.slice(strPos).match(/^[+-]?[0-7]+/);
|
|
37708
|
-
if (!m) {
|
|
37709
|
-
matchFailure = true;
|
|
37710
|
-
break;
|
|
37711
|
-
}
|
|
37712
|
-
results.push(parseInt(m[0], 8));
|
|
37713
|
-
strPos += m[0].length;
|
|
37714
|
-
} else if (spec === "c") {
|
|
37715
|
-
results.push(str.charCodeAt(strPos));
|
|
37716
|
-
strPos++;
|
|
37717
|
-
} else if (spec === "s") {
|
|
37718
|
-
const m = str.slice(strPos).match(/^\S+/);
|
|
37719
|
-
if (!m) {
|
|
37720
|
-
matchFailure = true;
|
|
37721
|
-
break;
|
|
37722
|
-
}
|
|
37723
|
-
for (let ci = 0; ci < m[0].length && results.length < maxCount; ci++) {
|
|
37724
|
-
results.push(m[0].charCodeAt(ci));
|
|
37725
|
-
}
|
|
37726
|
-
strPos += m[0].length;
|
|
37727
|
-
}
|
|
37728
|
-
} else if (/\s/.test(fmt[fmtPos])) {
|
|
37729
|
-
fmtPos++;
|
|
37730
|
-
while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
|
|
37731
|
-
} else {
|
|
37732
|
-
if (str[strPos] !== fmt[fmtPos]) {
|
|
37733
|
-
matchFailure = true;
|
|
37734
|
-
break;
|
|
37735
|
-
}
|
|
37736
|
-
strPos++;
|
|
37737
|
-
fmtPos++;
|
|
37738
|
-
}
|
|
37739
|
-
if (fmtPos >= fmt.length && results.length < maxCount && strPos < str.length) {
|
|
37740
|
-
fmtPos = 0;
|
|
37741
|
-
}
|
|
37742
|
-
}
|
|
38358
|
+
const {
|
|
38359
|
+
results,
|
|
38360
|
+
consumed: strPos,
|
|
38361
|
+
matchFailure
|
|
38362
|
+
} = scanFormat(str, fmt, maxCount);
|
|
37743
38363
|
const vals = results.length === 1 ? RTV.num(results[0]) : RTV.tensor(allocFloat64Array(results), [results.length, 1]);
|
|
37744
38364
|
if (nout >= 2) {
|
|
37745
38365
|
const out = [vals, RTV.num(results.length)];
|
|
@@ -38018,6 +38638,10 @@ defineBuiltin({
|
|
|
38018
38638
|
};
|
|
38019
38639
|
return nargout > 1 ? [out, idx] : [out];
|
|
38020
38640
|
}
|
|
38641
|
+
if (a.kind === "string" || a.kind === "unknown") {
|
|
38642
|
+
const out = { kind: "unknown" };
|
|
38643
|
+
return nargout > 1 ? [out, { kind: "unknown" }] : [out];
|
|
38644
|
+
}
|
|
38021
38645
|
return null;
|
|
38022
38646
|
},
|
|
38023
38647
|
apply: (args, nargout) => {
|
|
@@ -38036,6 +38660,33 @@ defineBuiltin({
|
|
|
38036
38660
|
if (args.length >= 3 && (isRuntimeString(args[2]) || isRuntimeChar(args[2]))) {
|
|
38037
38661
|
descend = rstr(args[2]).toLowerCase() === "descend";
|
|
38038
38662
|
}
|
|
38663
|
+
if (isRuntimeStringArray(v)) {
|
|
38664
|
+
const order = v.data.map((_, i) => i);
|
|
38665
|
+
order.sort((i, j) => {
|
|
38666
|
+
const x = v.data[i];
|
|
38667
|
+
const y = v.data[j];
|
|
38668
|
+
const c = x < y ? -1 : x > y ? 1 : 0;
|
|
38669
|
+
return descend ? -c : c;
|
|
38670
|
+
});
|
|
38671
|
+
const sorted = order.map((i) => v.data[i]);
|
|
38672
|
+
const isRow = v.shape[0] === 1;
|
|
38673
|
+
const shape = isRow ? [1, sorted.length] : [sorted.length, 1];
|
|
38674
|
+
const result = stringArrayValue(sorted, shape);
|
|
38675
|
+
if (nargout > 1) {
|
|
38676
|
+
return [
|
|
38677
|
+
result,
|
|
38678
|
+
RTV.tensor(allocFloat64Array(order.map((i) => i + 1)), [
|
|
38679
|
+
shape[0],
|
|
38680
|
+
shape[1]
|
|
38681
|
+
])
|
|
38682
|
+
];
|
|
38683
|
+
}
|
|
38684
|
+
return result;
|
|
38685
|
+
}
|
|
38686
|
+
if (isRuntimeString(v)) {
|
|
38687
|
+
if (nargout > 1) return [v, RTV.num(1)];
|
|
38688
|
+
return v;
|
|
38689
|
+
}
|
|
38039
38690
|
if (isRuntimeNumber(v)) {
|
|
38040
38691
|
if (nargout > 1) return [v, RTV.num(1)];
|
|
38041
38692
|
return v;
|
|
@@ -38351,8 +39002,12 @@ var ismemberCases = [
|
|
|
38351
39002
|
apply: (args, nargout) => {
|
|
38352
39003
|
if (args.length < 2)
|
|
38353
39004
|
throw new RuntimeError("ismember requires 2 arguments");
|
|
38354
|
-
const
|
|
38355
|
-
|
|
39005
|
+
const asCellstr = (x) => isRuntimeStringArray(x) ? RTV.cell(
|
|
39006
|
+
x.data.map((s) => RTV.string(s)),
|
|
39007
|
+
[x.shape[0], x.shape[1]]
|
|
39008
|
+
) : x;
|
|
39009
|
+
const v = asCellstr(args[0]);
|
|
39010
|
+
const b = asCellstr(args[1]);
|
|
38356
39011
|
const isStringLike = (x) => isRuntimeString(x) || isRuntimeChar(x);
|
|
38357
39012
|
const isCellOfStrings = (x) => isRuntimeCell(x) && x.data.every(
|
|
38358
39013
|
(e) => isRuntimeString(e) || isRuntimeChar(e)
|
|
@@ -38655,6 +39310,30 @@ defineBuiltin({
|
|
|
38655
39310
|
)) {
|
|
38656
39311
|
return uniqueCellOfStrings(v, nargout, stable);
|
|
38657
39312
|
}
|
|
39313
|
+
if (isRuntimeStringArray(v)) {
|
|
39314
|
+
const elems = v.data;
|
|
39315
|
+
const seen = /* @__PURE__ */ new Map();
|
|
39316
|
+
for (let i = 0; i < elems.length; i++) {
|
|
39317
|
+
if (!seen.has(elems[i])) seen.set(elems[i], i);
|
|
39318
|
+
}
|
|
39319
|
+
let vals = [...seen.keys()];
|
|
39320
|
+
if (!stable) vals = vals.sort();
|
|
39321
|
+
const isRow = v.shape[0] === 1;
|
|
39322
|
+
const shape = isRow ? [1, vals.length] : [vals.length, 1];
|
|
39323
|
+
const result = stringArrayValue(vals, shape);
|
|
39324
|
+
if (nargout <= 1) return result;
|
|
39325
|
+
const ia = RTV.tensor(
|
|
39326
|
+
allocFloat64Array(vals.map((s) => seen.get(s) + 1)),
|
|
39327
|
+
[vals.length, 1]
|
|
39328
|
+
);
|
|
39329
|
+
if (nargout === 2) return [result, ia];
|
|
39330
|
+
const pos = new Map(vals.map((s, i) => [s, i + 1]));
|
|
39331
|
+
const ic = RTV.tensor(
|
|
39332
|
+
allocFloat64Array(elems.map((s) => pos.get(s))),
|
|
39333
|
+
[elems.length, 1]
|
|
39334
|
+
);
|
|
39335
|
+
return [result, ia, ic];
|
|
39336
|
+
}
|
|
38658
39337
|
if (!isRuntimeTensor(v))
|
|
38659
39338
|
throw new RuntimeError("unique: argument must be numeric");
|
|
38660
39339
|
if (byRows) return uniqueByRows(v, nargout, stable);
|
|
@@ -41858,6 +42537,27 @@ function flipAlongDim(v, dimIdx) {
|
|
|
41858
42537
|
}
|
|
41859
42538
|
return RTV.tensor(result, [...shape], resultImag);
|
|
41860
42539
|
}
|
|
42540
|
+
function flipCellAlongDim(v, dimIdx) {
|
|
42541
|
+
const shape = v.shape.length >= 2 ? v.shape : [1, v.shape[0] ?? v.data.length];
|
|
42542
|
+
const totalElems = v.data.length;
|
|
42543
|
+
const dimSize = dimIdx < shape.length ? shape[dimIdx] : 1;
|
|
42544
|
+
let strideDim = 1;
|
|
42545
|
+
for (let d = 0; d < dimIdx; d++) strideDim *= shape[d];
|
|
42546
|
+
const slabSize = strideDim * dimSize;
|
|
42547
|
+
const numOuter = totalElems / slabSize;
|
|
42548
|
+
const result = new Array(totalElems);
|
|
42549
|
+
for (let outer = 0; outer < numOuter; outer++) {
|
|
42550
|
+
const base = outer * slabSize;
|
|
42551
|
+
for (let k = 0; k < dimSize; k++) {
|
|
42552
|
+
const srcOff = base + k * strideDim;
|
|
42553
|
+
const dstOff = base + (dimSize - 1 - k) * strideDim;
|
|
42554
|
+
for (let i = 0; i < strideDim; i++) {
|
|
42555
|
+
result[dstOff + i] = v.data[srcOff + i];
|
|
42556
|
+
}
|
|
42557
|
+
}
|
|
42558
|
+
}
|
|
42559
|
+
return RTV.cell(result, [...shape]);
|
|
42560
|
+
}
|
|
41861
42561
|
function flipSparse(v, dimIdx) {
|
|
41862
42562
|
const isComplex = v.pi !== void 0;
|
|
41863
42563
|
const nnz = v.jc[v.n];
|
|
@@ -42034,6 +42734,41 @@ defineBuiltin({
|
|
|
42034
42734
|
chars[i2 * nc + j2] = linear[j2 * nr + i2];
|
|
42035
42735
|
return new RuntimeChar(chars.join(""), [nr, nc]);
|
|
42036
42736
|
}
|
|
42737
|
+
if (isRuntimeStringArray(v)) {
|
|
42738
|
+
const s = parseReshapeDims(args, v.data.length);
|
|
42739
|
+
while (s.length > 2 && s[s.length - 1] === 1) s.pop();
|
|
42740
|
+
if (s.length > 2)
|
|
42741
|
+
throw new RuntimeError("reshape: string arrays must be 2-D");
|
|
42742
|
+
const nr = s[0];
|
|
42743
|
+
const nc = s.length >= 2 ? s[1] : 1;
|
|
42744
|
+
return stringArrayValue(v.data.slice(), [nr, nc]);
|
|
42745
|
+
}
|
|
42746
|
+
if (isRuntimeString(v)) {
|
|
42747
|
+
parseReshapeDims(args, 1);
|
|
42748
|
+
return v;
|
|
42749
|
+
}
|
|
42750
|
+
if (isRuntimeClassInstanceArray(v)) {
|
|
42751
|
+
const total = v.elements.length;
|
|
42752
|
+
const s = parseReshapeDims(args, total);
|
|
42753
|
+
while (s.length > 2 && s[s.length - 1] === 1) s.pop();
|
|
42754
|
+
if (s.length > 2)
|
|
42755
|
+
throw new RuntimeError("reshape: object arrays must be 2-D");
|
|
42756
|
+
const nr = s[0];
|
|
42757
|
+
const nc = s.length >= 2 ? s[1] : 1;
|
|
42758
|
+
if (nr * nc !== total)
|
|
42759
|
+
throw new RuntimeError(
|
|
42760
|
+
"reshape: number of elements must not change"
|
|
42761
|
+
);
|
|
42762
|
+
return RTV.classInstanceArray(v.className, v.elements, [nr, nc]);
|
|
42763
|
+
}
|
|
42764
|
+
if (isRuntimeClassInstance(v)) {
|
|
42765
|
+
const s = parseReshapeDims(args, 1);
|
|
42766
|
+
if (s.reduce((a, b) => a * b, 1) !== 1)
|
|
42767
|
+
throw new RuntimeError(
|
|
42768
|
+
"reshape: number of elements must not change"
|
|
42769
|
+
);
|
|
42770
|
+
return v;
|
|
42771
|
+
}
|
|
42037
42772
|
if (!isRuntimeTensor(v) && !isRuntimeNumber(v) && !isRuntimeComplexNumber(v))
|
|
42038
42773
|
throw new RuntimeError("reshape: first argument must be numeric");
|
|
42039
42774
|
const data = isRuntimeTensor(v) ? v.data : isRuntimeComplexNumber(v) ? allocFloat64Array([v.re]) : allocFloat64Array([v]);
|
|
@@ -42345,6 +43080,7 @@ defineBuiltin({
|
|
|
42345
43080
|
if (isRuntimeChar(v))
|
|
42346
43081
|
return RTV.char(v.value.split("").reverse().join(""));
|
|
42347
43082
|
if (isRuntimeSparseMatrix(v)) return flipSparse(v, 1);
|
|
43083
|
+
if (isRuntimeCell(v)) return flipCellAlongDim(v, 1);
|
|
42348
43084
|
if (!isRuntimeTensor(v))
|
|
42349
43085
|
throw new RuntimeError("fliplr: argument must be numeric or char");
|
|
42350
43086
|
return flipAlongDim(v, 1);
|
|
@@ -42365,6 +43101,7 @@ defineBuiltin({
|
|
|
42365
43101
|
if (isRuntimeNumber(v)) return v;
|
|
42366
43102
|
if (isRuntimeChar(v)) return v;
|
|
42367
43103
|
if (isRuntimeSparseMatrix(v)) return flipSparse(v, 0);
|
|
43104
|
+
if (isRuntimeCell(v)) return flipCellAlongDim(v, 0);
|
|
42368
43105
|
if (!isRuntimeTensor(v))
|
|
42369
43106
|
throw new RuntimeError("flipud: argument must be numeric or char");
|
|
42370
43107
|
return flipAlongDim(v, 0);
|
|
@@ -42383,8 +43120,8 @@ defineBuiltin({
|
|
|
42383
43120
|
apply: (args) => {
|
|
42384
43121
|
const v = args[0];
|
|
42385
43122
|
if (isRuntimeNumber(v)) return v;
|
|
42386
|
-
if (!isRuntimeTensor(v))
|
|
42387
|
-
throw new RuntimeError("flip: argument must be numeric");
|
|
43123
|
+
if (!isRuntimeTensor(v) && !isRuntimeCell(v))
|
|
43124
|
+
throw new RuntimeError("flip: argument must be numeric or cell");
|
|
42388
43125
|
let dimIdx = 0;
|
|
42389
43126
|
if (args.length >= 2) {
|
|
42390
43127
|
dimIdx = Math.round(toNumber(args[1])) - 1;
|
|
@@ -42393,7 +43130,7 @@ defineBuiltin({
|
|
|
42393
43130
|
dimIdx = shape.findIndex((d) => d > 1);
|
|
42394
43131
|
if (dimIdx === -1) dimIdx = 0;
|
|
42395
43132
|
}
|
|
42396
|
-
return flipAlongDim(v, dimIdx);
|
|
43133
|
+
return isRuntimeCell(v) ? flipCellAlongDim(v, dimIdx) : flipAlongDim(v, dimIdx);
|
|
42397
43134
|
}
|
|
42398
43135
|
}
|
|
42399
43136
|
]
|
|
@@ -44063,6 +44800,8 @@ function getValClassName(v) {
|
|
|
44063
44800
|
return "double";
|
|
44064
44801
|
case "dictionary":
|
|
44065
44802
|
return "dictionary";
|
|
44803
|
+
case "string_array":
|
|
44804
|
+
return "string";
|
|
44066
44805
|
default:
|
|
44067
44806
|
return "unknown";
|
|
44068
44807
|
}
|
|
@@ -44092,6 +44831,8 @@ function getShapeOf(v) {
|
|
|
44092
44831
|
return [1, 1];
|
|
44093
44832
|
case "struct_array":
|
|
44094
44833
|
return [1, obj.elements.length];
|
|
44834
|
+
case "string_array":
|
|
44835
|
+
return [...obj.shape];
|
|
44095
44836
|
default:
|
|
44096
44837
|
return [1, 1];
|
|
44097
44838
|
}
|
|
@@ -45759,6 +46500,12 @@ defineBuiltin({
|
|
|
45759
46500
|
});
|
|
45760
46501
|
|
|
45761
46502
|
// src/numbl-core/interpreter/builtins/type-constructors.ts
|
|
46503
|
+
function parseDoubleText(s) {
|
|
46504
|
+
const t = s.trim();
|
|
46505
|
+
if (t === "") return NaN;
|
|
46506
|
+
if (/^[+-]?inf(inity)?$/i.test(t)) return t[0] === "-" ? -Infinity : Infinity;
|
|
46507
|
+
return Number(t);
|
|
46508
|
+
}
|
|
45762
46509
|
defineBuiltin({
|
|
45763
46510
|
name: "double",
|
|
45764
46511
|
cases: [
|
|
@@ -45766,7 +46513,7 @@ defineBuiltin({
|
|
|
45766
46513
|
match: (argTypes) => {
|
|
45767
46514
|
if (argTypes.length !== 1) return null;
|
|
45768
46515
|
const a = argTypes[0];
|
|
45769
|
-
if (a.kind === "number" || a.kind === "boolean" || a.kind === "char" || a.kind === "complex_or_number" || a.kind === "class_instance")
|
|
46516
|
+
if (a.kind === "number" || a.kind === "boolean" || a.kind === "char" || a.kind === "string" || a.kind === "unknown" || a.kind === "complex_or_number" || a.kind === "class_instance")
|
|
45770
46517
|
return [{ kind: "number" }];
|
|
45771
46518
|
if (a.kind === "tensor")
|
|
45772
46519
|
return [
|
|
@@ -45788,6 +46535,13 @@ defineBuiltin({
|
|
|
45788
46535
|
const codes = Array.from(v.value).map((c) => c.charCodeAt(0));
|
|
45789
46536
|
return RTV.row(codes);
|
|
45790
46537
|
}
|
|
46538
|
+
if (isRuntimeString(v)) return RTV.num(parseDoubleText(v));
|
|
46539
|
+
if (isRuntimeStringArray(v)) {
|
|
46540
|
+
return RTV.tensor(allocFloat64Array(v.data.map(parseDoubleText)), [
|
|
46541
|
+
v.shape[0],
|
|
46542
|
+
v.shape[1]
|
|
46543
|
+
]);
|
|
46544
|
+
}
|
|
45791
46545
|
if (isRuntimeLogical(v)) return RTV.num(v ? 1 : 0);
|
|
45792
46546
|
if (isRuntimeNumber(v)) return v;
|
|
45793
46547
|
if (isRuntimeComplexNumber(v)) return v.re;
|
|
@@ -46491,14 +47245,19 @@ registerIBuiltin({
|
|
|
46491
47245
|
let delims;
|
|
46492
47246
|
if (isRuntimeCell(args[1])) {
|
|
46493
47247
|
delims = args[1].data.map((d) => toString(d));
|
|
47248
|
+
} else if (isRuntimeStringArray(args[1])) {
|
|
47249
|
+
delims = args[1].data.slice();
|
|
46494
47250
|
} else {
|
|
46495
47251
|
delims = [toString(args[1])];
|
|
46496
47252
|
}
|
|
46497
47253
|
const escaped = delims.map((d) => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
|
|
46498
47254
|
parts = s.split(new RegExp("(?:" + escaped + ")+"));
|
|
46499
47255
|
}
|
|
47256
|
+
if (isRuntimeString(args[0]) || isRuntimeStringArray(args[0])) {
|
|
47257
|
+
return stringArrayValue(parts, [1, parts.length]);
|
|
47258
|
+
}
|
|
46500
47259
|
return RTV.cell(
|
|
46501
|
-
parts.map((p2) => RTV.
|
|
47260
|
+
parts.map((p2) => RTV.char(p2)),
|
|
46502
47261
|
[1, parts.length]
|
|
46503
47262
|
);
|
|
46504
47263
|
}
|
|
@@ -46512,11 +47271,18 @@ registerIBuiltin({
|
|
|
46512
47271
|
return {
|
|
46513
47272
|
outputTypes: [{ kind: "string" }],
|
|
46514
47273
|
apply: (args) => {
|
|
46515
|
-
|
|
47274
|
+
let elements;
|
|
47275
|
+
if (isRuntimeCell(args[0])) {
|
|
47276
|
+
elements = args[0].data.map((v) => toString(v));
|
|
47277
|
+
} else if (isRuntimeStringArray(args[0])) {
|
|
47278
|
+
elements = args[0].data.slice();
|
|
47279
|
+
} else if (isRuntimeString(args[0])) {
|
|
47280
|
+
elements = [args[0]];
|
|
47281
|
+
} else {
|
|
46516
47282
|
throw new RuntimeError(
|
|
46517
|
-
"strjoin: first argument must be a cell array"
|
|
47283
|
+
"strjoin: first argument must be a cell array or string array"
|
|
46518
47284
|
);
|
|
46519
|
-
|
|
47285
|
+
}
|
|
46520
47286
|
const delim = args.length >= 2 ? toString(args[1]) : " ";
|
|
46521
47287
|
return RTV.string(elements.join(delim));
|
|
46522
47288
|
}
|
|
@@ -46593,6 +47359,19 @@ function regexpImpl(caseSensitive, name, args, nargout) {
|
|
|
46593
47359
|
[1, tokensList.length]
|
|
46594
47360
|
);
|
|
46595
47361
|
}
|
|
47362
|
+
if (mode === "split") {
|
|
47363
|
+
const splits = [];
|
|
47364
|
+
let prev = 0;
|
|
47365
|
+
for (let i = 0; i < starts.length; i++) {
|
|
47366
|
+
splits.push(str.slice(prev, starts[i] - 1));
|
|
47367
|
+
prev = ends[i];
|
|
47368
|
+
}
|
|
47369
|
+
splits.push(str.slice(prev));
|
|
47370
|
+
return RTV.cell(
|
|
47371
|
+
splits.map((s) => RTV.char(s)),
|
|
47372
|
+
[1, splits.length]
|
|
47373
|
+
);
|
|
47374
|
+
}
|
|
46596
47375
|
if (mode === "names") {
|
|
46597
47376
|
if (starts.length === 0) return RTV.tensor(allocFloat64Array(0), [0, 0]);
|
|
46598
47377
|
const namedRe = new RegExp(pat, flags);
|
|
@@ -55036,6 +55815,7 @@ var SPECIAL_BUILTIN_NAMES = [
|
|
|
55036
55815
|
"fclose",
|
|
55037
55816
|
"fgetl",
|
|
55038
55817
|
"fgets",
|
|
55818
|
+
"fscanf",
|
|
55039
55819
|
"fileread",
|
|
55040
55820
|
"feof",
|
|
55041
55821
|
"ferror",
|
|
@@ -55132,6 +55912,8 @@ var SPECIAL_BUILTIN_NAMES = [
|
|
|
55132
55912
|
"delete",
|
|
55133
55913
|
"rmdir",
|
|
55134
55914
|
"movefile",
|
|
55915
|
+
"copyfile",
|
|
55916
|
+
"fileattrib",
|
|
55135
55917
|
"unzip",
|
|
55136
55918
|
"dir",
|
|
55137
55919
|
"warning",
|
|
@@ -55141,6 +55923,7 @@ var SPECIAL_BUILTIN_NAMES = [
|
|
|
55141
55923
|
"userpath",
|
|
55142
55924
|
"getenv",
|
|
55143
55925
|
"setenv",
|
|
55926
|
+
"maxNumCompThreads",
|
|
55144
55927
|
"pwd",
|
|
55145
55928
|
"cd",
|
|
55146
55929
|
"ode45",
|
|
@@ -55300,7 +56083,10 @@ function registerSpecialBuiltins(rt) {
|
|
|
55300
56083
|
fmtIdx = 1;
|
|
55301
56084
|
}
|
|
55302
56085
|
const fmt = toString(margs[fmtIdx]);
|
|
55303
|
-
|
|
56086
|
+
const rest = margs.slice(fmtIdx + 1).flatMap(
|
|
56087
|
+
(a) => isRuntimeStringArray(a) ? a.data.map((s) => RTV.string(s)) : [a]
|
|
56088
|
+
);
|
|
56089
|
+
output = sprintfFormat(fmt, rest);
|
|
55304
56090
|
if (fid === 1 || fid === 2) {
|
|
55305
56091
|
rt.output(output);
|
|
55306
56092
|
} else {
|
|
@@ -55454,6 +56240,53 @@ function registerSpecialBuiltins(rt) {
|
|
|
55454
56240
|
const result = io.fgets(toNumber(margs[0]));
|
|
55455
56241
|
return typeof result === "number" ? RTV.num(result) : RTV.char(result);
|
|
55456
56242
|
});
|
|
56243
|
+
registerSpecial("fscanf", (nargout, args) => {
|
|
56244
|
+
const io = requireFileIO();
|
|
56245
|
+
const margs = args.map((a) => ensureRuntimeValue(a));
|
|
56246
|
+
if (margs.length < 2)
|
|
56247
|
+
throw new RuntimeError("fscanf requires at least 2 arguments");
|
|
56248
|
+
if (!io.ftell || !io.fseek || !io.freadBytes)
|
|
56249
|
+
throw new RuntimeError("fscanf is not supported in this environment");
|
|
56250
|
+
const fid = toNumber(margs[0]);
|
|
56251
|
+
const fmt = toString(margs[1]);
|
|
56252
|
+
let maxCount = Infinity;
|
|
56253
|
+
let rows = null;
|
|
56254
|
+
if (margs.length >= 3) {
|
|
56255
|
+
const sz = margs[2];
|
|
56256
|
+
if (isRuntimeTensor(sz) && sz.data.length >= 2) {
|
|
56257
|
+
rows = sz.data[0];
|
|
56258
|
+
maxCount = sz.data[0] * sz.data[1];
|
|
56259
|
+
} else {
|
|
56260
|
+
maxCount = toNumber(sz);
|
|
56261
|
+
}
|
|
56262
|
+
}
|
|
56263
|
+
const pos = io.ftell(fid);
|
|
56264
|
+
const CHUNK = 1 << 16;
|
|
56265
|
+
const chunks = [];
|
|
56266
|
+
for (; ; ) {
|
|
56267
|
+
const bytes = io.freadBytes(fid, CHUNK);
|
|
56268
|
+
let s = "";
|
|
56269
|
+
for (let i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i]);
|
|
56270
|
+
chunks.push(s);
|
|
56271
|
+
if (bytes.length < CHUNK) break;
|
|
56272
|
+
}
|
|
56273
|
+
const { results, consumed } = scanFormat(chunks.join(""), fmt, maxCount);
|
|
56274
|
+
io.fseek(fid, pos + consumed, -1);
|
|
56275
|
+
const n = results.length;
|
|
56276
|
+
let out;
|
|
56277
|
+
if (rows !== null && Number.isFinite(rows) && rows > 0) {
|
|
56278
|
+
const cols = Math.ceil(n / rows);
|
|
56279
|
+
const data = allocFloat64Array(rows * cols);
|
|
56280
|
+
for (let i = 0; i < n; i++) data[i] = results[i];
|
|
56281
|
+
out = RTV.tensor(data, [rows, cols]);
|
|
56282
|
+
} else if (n === 1) {
|
|
56283
|
+
out = RTV.num(results[0]);
|
|
56284
|
+
} else {
|
|
56285
|
+
out = RTV.tensor(allocFloat64Array(results), [n, 1]);
|
|
56286
|
+
}
|
|
56287
|
+
if (nargout >= 2) return [out, RTV.num(n)];
|
|
56288
|
+
return out;
|
|
56289
|
+
});
|
|
55457
56290
|
registerSpecial("fileread", (_nargout, args) => {
|
|
55458
56291
|
const io = requireFileIO();
|
|
55459
56292
|
const margs = args.map((a) => ensureRuntimeValue(a));
|
|
@@ -56082,6 +56915,65 @@ function registerSpecialBuiltins(rt) {
|
|
|
56082
56915
|
RTV.char("")
|
|
56083
56916
|
];
|
|
56084
56917
|
});
|
|
56918
|
+
registerSpecial("copyfile", (nargout, args) => {
|
|
56919
|
+
const io = requireFileIO();
|
|
56920
|
+
if (!io.copyfile)
|
|
56921
|
+
throw new RuntimeError("copyfile is not available in this environment");
|
|
56922
|
+
const margs = args.map((a) => ensureRuntimeValue(a));
|
|
56923
|
+
if (margs.length < 1)
|
|
56924
|
+
throw new RuntimeError("copyfile requires at least 1 argument");
|
|
56925
|
+
const source = toString(margs[0]);
|
|
56926
|
+
const destination = margs.length >= 2 ? toString(margs[1]) : rt.system?.cwd() ?? ".";
|
|
56927
|
+
let force = false;
|
|
56928
|
+
if (margs.length >= 3) {
|
|
56929
|
+
const third = toString(margs[2]);
|
|
56930
|
+
if (third.toLowerCase() === "f") force = true;
|
|
56931
|
+
}
|
|
56932
|
+
const ok = io.copyfile(source, destination, force);
|
|
56933
|
+
if (nargout === 0) {
|
|
56934
|
+
if (!ok)
|
|
56935
|
+
throw new RuntimeError(
|
|
56936
|
+
`copyfile: cannot copy '${source}' to '${destination}'`
|
|
56937
|
+
);
|
|
56938
|
+
return void 0;
|
|
56939
|
+
}
|
|
56940
|
+
return nargout <= 1 ? RTV.num(ok ? 1 : 0) : [
|
|
56941
|
+
RTV.num(ok ? 1 : 0),
|
|
56942
|
+
RTV.char(ok ? "" : `Cannot copy '${source}' to '${destination}'`),
|
|
56943
|
+
RTV.char("")
|
|
56944
|
+
];
|
|
56945
|
+
});
|
|
56946
|
+
registerSpecial("fileattrib", (nargout, args) => {
|
|
56947
|
+
const io = requireFileIO();
|
|
56948
|
+
if (!io.fileattrib)
|
|
56949
|
+
throw new RuntimeError("fileattrib is not available in this environment");
|
|
56950
|
+
const margs = args.map((a) => ensureRuntimeValue(a));
|
|
56951
|
+
if (margs.length < 1)
|
|
56952
|
+
throw new RuntimeError("fileattrib requires at least 1 argument");
|
|
56953
|
+
const p2 = toString(margs[0]);
|
|
56954
|
+
const info = io.fileattrib(p2);
|
|
56955
|
+
if (nargout === 0) {
|
|
56956
|
+
if (!info)
|
|
56957
|
+
throw new RuntimeError(
|
|
56958
|
+
`fileattrib: cannot find '${p2}': No such file or directory`
|
|
56959
|
+
);
|
|
56960
|
+
return void 0;
|
|
56961
|
+
}
|
|
56962
|
+
const values = info ? RTV.struct(
|
|
56963
|
+
/* @__PURE__ */ new Map([
|
|
56964
|
+
["Name", RTV.char(info.Name)],
|
|
56965
|
+
["archive", RTV.num(0)],
|
|
56966
|
+
["system", RTV.num(0)],
|
|
56967
|
+
["hidden", RTV.num(0)],
|
|
56968
|
+
["directory", RTV.num(info.directory ? 1 : 0)],
|
|
56969
|
+
["UserRead", RTV.num(info.UserRead ? 1 : 0)],
|
|
56970
|
+
["UserWrite", RTV.num(info.UserWrite ? 1 : 0)],
|
|
56971
|
+
["UserExecute", RTV.num(info.UserExecute ? 1 : 0)]
|
|
56972
|
+
])
|
|
56973
|
+
) : RTV.char(`No such file or directory: ${p2}`);
|
|
56974
|
+
if (nargout <= 1) return RTV.num(info ? 1 : 0);
|
|
56975
|
+
return [RTV.num(info ? 1 : 0), values, RTV.char("")];
|
|
56976
|
+
});
|
|
56085
56977
|
registerSpecial("unzip", (nargout, args) => {
|
|
56086
56978
|
const io = requireFileIO();
|
|
56087
56979
|
if (!io.unzip)
|
|
@@ -56407,6 +57299,7 @@ function registerSpecialBuiltins(rt) {
|
|
|
56407
57299
|
}
|
|
56408
57300
|
return RTV.char(sys?.getEnv(toString(args[0])) ?? "");
|
|
56409
57301
|
});
|
|
57302
|
+
registerSpecial("maxNumCompThreads", () => RTV.num(1));
|
|
56410
57303
|
registerSpecialVoid("setenv", (args) => {
|
|
56411
57304
|
const sys = rt.system;
|
|
56412
57305
|
if (args.length === 2) {
|
|
@@ -57821,6 +58714,9 @@ function isa(rt, value, classNameArg) {
|
|
|
57821
58714
|
case "class_instance_array":
|
|
57822
58715
|
valueClass = mv.className;
|
|
57823
58716
|
break;
|
|
58717
|
+
case "string_array":
|
|
58718
|
+
valueClass = "string";
|
|
58719
|
+
break;
|
|
57824
58720
|
default:
|
|
57825
58721
|
valueClass = "unknown";
|
|
57826
58722
|
break;
|
|
@@ -58394,6 +59290,8 @@ function numblClass(v) {
|
|
|
58394
59290
|
return "double";
|
|
58395
59291
|
case "class_instance":
|
|
58396
59292
|
return v.className;
|
|
59293
|
+
case "string_array":
|
|
59294
|
+
return "string";
|
|
58397
59295
|
default:
|
|
58398
59296
|
return "unknown";
|
|
58399
59297
|
}
|
|
@@ -58563,6 +59461,10 @@ function endResolver(mv, numIndices) {
|
|
|
58563
59461
|
}
|
|
58564
59462
|
if (isRuntimeStructArray(mv)) return mv.elements.length;
|
|
58565
59463
|
if (isRuntimeClassInstanceArray(mv)) return mv.elements.length;
|
|
59464
|
+
if (isRuntimeStringArray(mv)) {
|
|
59465
|
+
if (numIndices === 1) return mv.data.length;
|
|
59466
|
+
return dim < 2 ? mv.shape[dim] : 1;
|
|
59467
|
+
}
|
|
58566
59468
|
if (isRuntimeSparseMatrix(mv)) {
|
|
58567
59469
|
if (numIndices === 1) return mv.m * mv.n;
|
|
58568
59470
|
return dim === 0 ? mv.m : dim === 1 ? mv.n : 1;
|
|
@@ -58849,6 +59751,28 @@ function indexCell(rt, base, indices) {
|
|
|
58849
59751
|
if (isRuntimeCell(val) && val.data.length === 1) return val.data[0];
|
|
58850
59752
|
return val;
|
|
58851
59753
|
}
|
|
59754
|
+
if (isRuntimeString(mv) || isRuntimeStringArray(mv)) {
|
|
59755
|
+
const idxMvals2 = resolveIndices(indices, endResolver(mv, indices.length));
|
|
59756
|
+
const elems = isRuntimeString(mv) ? [mv] : mv.data;
|
|
59757
|
+
const shape = isRuntimeString(mv) ? [1, 1] : mv.shape;
|
|
59758
|
+
let lin;
|
|
59759
|
+
if (idxMvals2.length === 1) {
|
|
59760
|
+
lin = Math.round(toNumber(idxMvals2[0])) - 1;
|
|
59761
|
+
} else if (idxMvals2.length === 2) {
|
|
59762
|
+
const r = Math.round(toNumber(idxMvals2[0])) - 1;
|
|
59763
|
+
const c = Math.round(toNumber(idxMvals2[1])) - 1;
|
|
59764
|
+
if (r < 0 || r >= shape[0] || c < 0 || c >= shape[1])
|
|
59765
|
+
throw new RuntimeError("Index exceeds array bounds");
|
|
59766
|
+
lin = c * shape[0] + r;
|
|
59767
|
+
} else {
|
|
59768
|
+
throw new RuntimeError(
|
|
59769
|
+
"String brace indexing supports 1 or 2 subscripts"
|
|
59770
|
+
);
|
|
59771
|
+
}
|
|
59772
|
+
if (lin < 0 || lin >= elems.length)
|
|
59773
|
+
throw new RuntimeError("Index exceeds array bounds");
|
|
59774
|
+
return RTV.char(elems[lin]);
|
|
59775
|
+
}
|
|
58852
59776
|
if (!isRuntimeCell(mv)) throw new RuntimeError("Cell indexing on non-cell");
|
|
58853
59777
|
const idxMvals = resolveIndices(indices, endResolver(mv, indices.length));
|
|
58854
59778
|
if (idxMvals.length === 1) {
|
|
@@ -59042,6 +59966,15 @@ function indexStore(rt, base, indices, rhs, skipSubsasgn = false) {
|
|
|
59042
59966
|
return rhsMv2;
|
|
59043
59967
|
}
|
|
59044
59968
|
}
|
|
59969
|
+
{
|
|
59970
|
+
const rhsMv0 = ensureRuntimeValue(rhs);
|
|
59971
|
+
const baseIsStr = isRuntimeString(mv) || isRuntimeStringArray(mv);
|
|
59972
|
+
const baseEmpty = isRuntimeTensor(mv) && mv.data.length === 0;
|
|
59973
|
+
const rhsIsStr = isRuntimeString(rhsMv0) || isRuntimeStringArray(rhsMv0);
|
|
59974
|
+
if (baseIsStr || baseEmpty && rhsIsStr) {
|
|
59975
|
+
return stringArrayIndexStore(mv, indices, rhsMv0);
|
|
59976
|
+
}
|
|
59977
|
+
}
|
|
59045
59978
|
let wasScalar = false;
|
|
59046
59979
|
let wasChar = false;
|
|
59047
59980
|
if (!isRuntimeTensor(mv)) {
|
|
@@ -59085,6 +60018,109 @@ function indexStore(rt, base, indices, rhs, skipSubsasgn = false) {
|
|
|
59085
60018
|
}
|
|
59086
60019
|
return result;
|
|
59087
60020
|
}
|
|
60021
|
+
function rhsToStringElems(rhsMv) {
|
|
60022
|
+
if (isRuntimeString(rhsMv)) return [rhsMv];
|
|
60023
|
+
if (isRuntimeStringArray(rhsMv)) return rhsMv.data.slice();
|
|
60024
|
+
if (isRuntimeChar(rhsMv)) {
|
|
60025
|
+
const rows = rhsMv.shape ? rhsMv.shape[0] : 1;
|
|
60026
|
+
if (rows <= 1) return [rhsMv.value];
|
|
60027
|
+
const width = rhsMv.shape[1];
|
|
60028
|
+
const out = [];
|
|
60029
|
+
for (let r = 0; r < rows; r++)
|
|
60030
|
+
out.push(rhsMv.value.slice(r * width, (r + 1) * width));
|
|
60031
|
+
return out;
|
|
60032
|
+
}
|
|
60033
|
+
if (isRuntimeNumber(rhsMv)) return [matlabNumToString(rhsMv)];
|
|
60034
|
+
if (isRuntimeLogical(rhsMv)) return [rhsMv ? "true" : "false"];
|
|
60035
|
+
if (isRuntimeTensor(rhsMv))
|
|
60036
|
+
return Array.from(rhsMv.data, (d) => matlabNumToString(d));
|
|
60037
|
+
return null;
|
|
60038
|
+
}
|
|
60039
|
+
function stringArrayIndexStore(mv, indices, rhsMv) {
|
|
60040
|
+
let data;
|
|
60041
|
+
let rows;
|
|
60042
|
+
let cols;
|
|
60043
|
+
if (isRuntimeStringArray(mv)) {
|
|
60044
|
+
data = mv.data.slice();
|
|
60045
|
+
[rows, cols] = mv.shape;
|
|
60046
|
+
} else if (isRuntimeString(mv)) {
|
|
60047
|
+
data = [mv];
|
|
60048
|
+
rows = 1;
|
|
60049
|
+
cols = 1;
|
|
60050
|
+
} else {
|
|
60051
|
+
data = [];
|
|
60052
|
+
rows = 0;
|
|
60053
|
+
cols = 0;
|
|
60054
|
+
}
|
|
60055
|
+
const idxMvals = resolveIndices(indices, endResolver(mv, indices.length));
|
|
60056
|
+
if (isRuntimeTensor(rhsMv) && rhsMv.data.length === 0 && idxMvals.length === 1) {
|
|
60057
|
+
const del = new Set(stringArraySubscript(idxMvals[0], data.length));
|
|
60058
|
+
const kept = data.filter((_, i) => !del.has(i));
|
|
60059
|
+
if (cols === 1 && rows > 1) return stringArrayValue(kept, [kept.length, 1]);
|
|
60060
|
+
return stringArrayValue(kept, [1, kept.length]);
|
|
60061
|
+
}
|
|
60062
|
+
const rhsElems = rhsToStringElems(rhsMv);
|
|
60063
|
+
if (rhsElems === null) {
|
|
60064
|
+
throw new RuntimeError("Cannot assign this value into a string array");
|
|
60065
|
+
}
|
|
60066
|
+
if (idxMvals.length === 1) {
|
|
60067
|
+
const positions = stringArraySubscript(idxMvals[0], data.length);
|
|
60068
|
+
const maxPos = positions.length ? Math.max(...positions) : -1;
|
|
60069
|
+
if (positions.some((p2) => p2 < 0)) {
|
|
60070
|
+
throw new RuntimeError("Index must be a positive integer");
|
|
60071
|
+
}
|
|
60072
|
+
if (maxPos >= data.length) {
|
|
60073
|
+
if (rows > 1 && cols > 1) {
|
|
60074
|
+
throw new RuntimeError("Index exceeds array bounds");
|
|
60075
|
+
}
|
|
60076
|
+
while (data.length <= maxPos) data.push("");
|
|
60077
|
+
}
|
|
60078
|
+
if (rhsElems.length !== 1 && rhsElems.length !== positions.length) {
|
|
60079
|
+
throw new RuntimeError(
|
|
60080
|
+
"Unable to perform assignment because the left and right sides have a different number of elements"
|
|
60081
|
+
);
|
|
60082
|
+
}
|
|
60083
|
+
positions.forEach((p2, k) => {
|
|
60084
|
+
data[p2] = rhsElems.length === 1 ? rhsElems[0] : rhsElems[k];
|
|
60085
|
+
});
|
|
60086
|
+
if (rows > 1 && cols > 1) return stringArrayValue(data, [rows, cols]);
|
|
60087
|
+
if (cols === 1 && rows > 1) return stringArrayValue(data, [data.length, 1]);
|
|
60088
|
+
return stringArrayValue(data, [1, data.length]);
|
|
60089
|
+
}
|
|
60090
|
+
if (idxMvals.length === 2) {
|
|
60091
|
+
const ri = stringArraySubscript(idxMvals[0], rows);
|
|
60092
|
+
const ci = stringArraySubscript(idxMvals[1], cols);
|
|
60093
|
+
if (ri.some((p2) => p2 < 0) || ci.some((p2) => p2 < 0)) {
|
|
60094
|
+
throw new RuntimeError("Index must be a positive integer");
|
|
60095
|
+
}
|
|
60096
|
+
const newRows = Math.max(rows, ri.length ? Math.max(...ri) + 1 : 0);
|
|
60097
|
+
const newCols = Math.max(cols, ci.length ? Math.max(...ci) + 1 : 0);
|
|
60098
|
+
let grid = data;
|
|
60099
|
+
if (newRows !== rows || newCols !== cols) {
|
|
60100
|
+
grid = new Array(newRows * newCols).fill("");
|
|
60101
|
+
for (let c = 0; c < cols; c++) {
|
|
60102
|
+
for (let r = 0; r < rows; r++) {
|
|
60103
|
+
grid[c * newRows + r] = data[c * rows + r];
|
|
60104
|
+
}
|
|
60105
|
+
}
|
|
60106
|
+
}
|
|
60107
|
+
const count = ri.length * ci.length;
|
|
60108
|
+
if (rhsElems.length !== 1 && rhsElems.length !== count) {
|
|
60109
|
+
throw new RuntimeError(
|
|
60110
|
+
"Unable to perform assignment because the left and right sides have a different number of elements"
|
|
60111
|
+
);
|
|
60112
|
+
}
|
|
60113
|
+
let k = 0;
|
|
60114
|
+
for (const c of ci) {
|
|
60115
|
+
for (const r of ri) {
|
|
60116
|
+
grid[c * newRows + r] = rhsElems.length === 1 ? rhsElems[0] : rhsElems[k];
|
|
60117
|
+
k++;
|
|
60118
|
+
}
|
|
60119
|
+
}
|
|
60120
|
+
return stringArrayValue(grid, [newRows, newCols]);
|
|
60121
|
+
}
|
|
60122
|
+
throw new RuntimeError("String array assignment supports 1 or 2 subscripts");
|
|
60123
|
+
}
|
|
59088
60124
|
function indexCellStore(base, indices, rhs, rt) {
|
|
59089
60125
|
if (base === void 0 || base === null) base = RTV.cell([], [0, 0]);
|
|
59090
60126
|
let mv = ensureRuntimeValue(base);
|
|
@@ -61298,6 +62334,7 @@ var Runtime = class _Runtime {
|
|
|
61298
62334
|
if (isRuntimeChar(rv))
|
|
61299
62335
|
return rv.shape ?? (rv.value.length === 0 ? [0, 0] : [1, rv.value.length]);
|
|
61300
62336
|
if (isRuntimeString(rv)) return [1, 1];
|
|
62337
|
+
if (isRuntimeStringArray(rv)) return [...rv.shape];
|
|
61301
62338
|
if (isRuntimeClassInstance(rv)) return [1, 1];
|
|
61302
62339
|
return [1, 1];
|
|
61303
62340
|
}
|
|
@@ -62056,6 +63093,13 @@ function defaultClassInstanceVertcat(rows) {
|
|
|
62056
63093
|
}
|
|
62057
63094
|
|
|
62058
63095
|
// src/numbl-core/jsUserFunctions.ts
|
|
63096
|
+
function callHandle(handle, args, nargout = 1) {
|
|
63097
|
+
const rt = getCurrentRuntime();
|
|
63098
|
+
if (!rt) {
|
|
63099
|
+
throw new RuntimeError("callHandle: no active runtime to invoke handle");
|
|
63100
|
+
}
|
|
63101
|
+
return rt.index(handle, args, nargout);
|
|
63102
|
+
}
|
|
62059
63103
|
function funcNameFromFile(fileName) {
|
|
62060
63104
|
const base = fileName.split("/").pop();
|
|
62061
63105
|
return base.replace(/\.numbl\.js$/, "");
|
|
@@ -62101,6 +63145,8 @@ function instantiateWasm(wasmData) {
|
|
|
62101
63145
|
const moduleImports = WebAssembly.Module.imports(wasmModule);
|
|
62102
63146
|
const importObject = {};
|
|
62103
63147
|
const neededModules = new Set(moduleImports.map((i) => i.module));
|
|
63148
|
+
const callbacks = /* @__PURE__ */ new Map();
|
|
63149
|
+
let nextCbId = 1;
|
|
62104
63150
|
if (neededModules.has("wasi_snapshot_preview1")) {
|
|
62105
63151
|
importObject.wasi_snapshot_preview1 = {
|
|
62106
63152
|
fd_write: () => 0,
|
|
@@ -62120,10 +63166,36 @@ function instantiateWasm(wasmData) {
|
|
|
62120
63166
|
if (neededModules.has("env")) {
|
|
62121
63167
|
importObject.env = {
|
|
62122
63168
|
emscripten_notify_memory_growth: () => {
|
|
63169
|
+
},
|
|
63170
|
+
// Scalar callback: WASM calls back into a registered handle with one
|
|
63171
|
+
// f64 and receives an f64. Exceptions thrown here (incl. a missing id)
|
|
63172
|
+
// propagate out through the WASM call into the apply.
|
|
63173
|
+
numbl_cb_d: (id, x) => {
|
|
63174
|
+
const fn = callbacks.get(id);
|
|
63175
|
+
if (!fn) {
|
|
63176
|
+
throw new RuntimeError(
|
|
63177
|
+
`numbl_cb_d: no callback registered for id ${id}`
|
|
63178
|
+
);
|
|
63179
|
+
}
|
|
63180
|
+
return fn(x);
|
|
62123
63181
|
}
|
|
62124
63182
|
};
|
|
62125
63183
|
}
|
|
62126
|
-
|
|
63184
|
+
const instance = new WebAssembly.Instance(
|
|
63185
|
+
wasmModule,
|
|
63186
|
+
importObject
|
|
63187
|
+
);
|
|
63188
|
+
instance.callbacks = {
|
|
63189
|
+
add(fn) {
|
|
63190
|
+
const id = nextCbId++;
|
|
63191
|
+
callbacks.set(id, fn);
|
|
63192
|
+
return id;
|
|
63193
|
+
},
|
|
63194
|
+
remove(id) {
|
|
63195
|
+
callbacks.delete(id);
|
|
63196
|
+
}
|
|
63197
|
+
};
|
|
63198
|
+
return instance;
|
|
62127
63199
|
}
|
|
62128
63200
|
function resolveBindings(file, directives, getWasmInstance, nativeBridge) {
|
|
62129
63201
|
const wasmInstance = directives.wasm ? getWasmInstance(directives.wasm) : void 0;
|
|
@@ -62198,6 +63270,8 @@ function loadJsUserFunctions(jsFiles, wasmFiles, nativeBridge) {
|
|
|
62198
63270
|
"wasm",
|
|
62199
63271
|
"native",
|
|
62200
63272
|
"importJS",
|
|
63273
|
+
"callHandle",
|
|
63274
|
+
"toNumber",
|
|
62201
63275
|
libFile.source
|
|
62202
63276
|
);
|
|
62203
63277
|
const exports = factory(
|
|
@@ -62207,7 +63281,9 @@ function loadJsUserFunctions(jsFiles, wasmFiles, nativeBridge) {
|
|
|
62207
63281
|
dummyRegister,
|
|
62208
63282
|
wasmInstance,
|
|
62209
63283
|
nativeLib,
|
|
62210
|
-
importJS
|
|
63284
|
+
importJS,
|
|
63285
|
+
callHandle,
|
|
63286
|
+
toNumber
|
|
62211
63287
|
);
|
|
62212
63288
|
libCache.set(name, exports);
|
|
62213
63289
|
return exports;
|
|
@@ -62245,6 +63321,8 @@ function loadJsUserFunctions(jsFiles, wasmFiles, nativeBridge) {
|
|
|
62245
63321
|
"wasm",
|
|
62246
63322
|
"native",
|
|
62247
63323
|
"importJS",
|
|
63324
|
+
"callHandle",
|
|
63325
|
+
"toNumber",
|
|
62248
63326
|
file.source
|
|
62249
63327
|
);
|
|
62250
63328
|
factory(
|
|
@@ -62254,7 +63332,9 @@ function loadJsUserFunctions(jsFiles, wasmFiles, nativeBridge) {
|
|
|
62254
63332
|
registerFn,
|
|
62255
63333
|
wasmInstance,
|
|
62256
63334
|
nativeLib,
|
|
62257
|
-
importJS
|
|
63335
|
+
importJS,
|
|
63336
|
+
callHandle,
|
|
63337
|
+
toNumber
|
|
62258
63338
|
);
|
|
62259
63339
|
if (!builtin) {
|
|
62260
63340
|
throw new Error(
|
|
@@ -63874,6 +64954,15 @@ __export(interpreterExec_exports, {
|
|
|
63874
64954
|
writeLValueBase: () => writeLValueBase
|
|
63875
64955
|
});
|
|
63876
64956
|
|
|
64957
|
+
// src/numbl-core/jitDeclineDiagnostics.ts
|
|
64958
|
+
var lastDecline = null;
|
|
64959
|
+
function recordJitDecline(d) {
|
|
64960
|
+
lastDecline = d;
|
|
64961
|
+
}
|
|
64962
|
+
function getLastJitDecline() {
|
|
64963
|
+
return lastDecline;
|
|
64964
|
+
}
|
|
64965
|
+
|
|
63877
64966
|
// src/numbl-core/runtime/cow.ts
|
|
63878
64967
|
function cowCopy(v) {
|
|
63879
64968
|
if (isRuntimeTensor(v)) {
|
|
@@ -64176,14 +65265,16 @@ function execStmtInner(stmt) {
|
|
|
64176
65265
|
case "Directive": {
|
|
64177
65266
|
if (stmt.directive === "assert_jit") {
|
|
64178
65267
|
const wantC = stmt.args.includes("c");
|
|
65268
|
+
const decline = getLastJitDecline();
|
|
65269
|
+
const why = decline ? ` Most recent JIT decline (${decline.where}, ${decline.kind}): ${decline.message}` : ` (no JIT decline reason was recorded \u2014 the unit may have been declined before lowering, e.g. an unsupported input type.)`;
|
|
64179
65270
|
if (this.optimization === "1") {
|
|
64180
65271
|
throw new RuntimeError(
|
|
64181
|
-
`%!numbl:assert_jit: expected the enclosing loop/function/script to be JS-JIT-compiled at --opt 1, but it ran in the interpreter
|
|
65272
|
+
`%!numbl:assert_jit: expected the enclosing loop/function/script to be JS-JIT-compiled at --opt 1, but it ran in the interpreter.${why} (Run with --opt 0 to silence.)`
|
|
64182
65273
|
);
|
|
64183
65274
|
}
|
|
64184
65275
|
if (this.optimization === "2" && wantC) {
|
|
64185
65276
|
throw new RuntimeError(
|
|
64186
|
-
`%!numbl:assert_jit c: expected the enclosing loop/function/script to be C-JIT-compiled at --opt 2, but it ran in the interpreter
|
|
65277
|
+
`%!numbl:assert_jit c: expected the enclosing loop/function/script to be C-JIT-compiled at --opt 2, but it ran in the interpreter.${why} (Run with --opt 0 to silence.)`
|
|
64187
65278
|
);
|
|
64188
65279
|
}
|
|
64189
65280
|
}
|
|
@@ -64255,13 +65346,16 @@ function evalExprNargout(expr, nargout) {
|
|
|
64255
65346
|
return ctx.dimIndex < rv.shape.length ? rv.shape[ctx.dimIndex] : 1;
|
|
64256
65347
|
}
|
|
64257
65348
|
if (isRuntimeChar(rv)) return rv.value.length;
|
|
64258
|
-
if (isRuntimeString(rv)) return
|
|
65349
|
+
if (isRuntimeString(rv)) return 1;
|
|
64259
65350
|
if (isRuntimeClassInstance(rv)) {
|
|
64260
|
-
|
|
64261
|
-
|
|
64262
|
-
|
|
64263
|
-
|
|
64264
|
-
|
|
65351
|
+
if (this.rt.resolveClassMethod?.(rv.className, "end")) {
|
|
65352
|
+
return this.rt.dispatch("end", 1, [
|
|
65353
|
+
rv,
|
|
65354
|
+
ctx.dimIndex + 1,
|
|
65355
|
+
ctx.numIndices
|
|
65356
|
+
]);
|
|
65357
|
+
}
|
|
65358
|
+
return 1;
|
|
64265
65359
|
}
|
|
64266
65360
|
if (isRuntimeStructArray(rv)) {
|
|
64267
65361
|
return rv.elements.length;
|
|
@@ -64270,6 +65364,10 @@ function evalExprNargout(expr, nargout) {
|
|
|
64270
65364
|
if (ctx.numIndices === 1) return rv.elements.length;
|
|
64271
65365
|
return ctx.dimIndex < rv.shape.length ? rv.shape[ctx.dimIndex] : 1;
|
|
64272
65366
|
}
|
|
65367
|
+
if (isRuntimeStringArray(rv)) {
|
|
65368
|
+
if (ctx.numIndices === 1) return rv.data.length;
|
|
65369
|
+
return ctx.dimIndex < 2 ? rv.shape[ctx.dimIndex] : 1;
|
|
65370
|
+
}
|
|
64273
65371
|
if (isRuntimeSparseMatrix(rv)) {
|
|
64274
65372
|
if (ctx.numIndices === 1) return rv.m * rv.n;
|
|
64275
65373
|
return ctx.dimIndex === 0 ? rv.m : ctx.dimIndex === 1 ? rv.n : 1;
|
|
@@ -64594,7 +65692,8 @@ function evalMember(expr, nargout) {
|
|
|
64594
65692
|
if (lastDot > 0) {
|
|
64595
65693
|
const prefix = dottedName.slice(0, lastDot);
|
|
64596
65694
|
const methodName = dottedName.slice(lastDot + 1);
|
|
64597
|
-
if (this.functionIndex.classStaticMethods.get(prefix)?.has(methodName))
|
|
65695
|
+
if (this.functionIndex.classStaticMethods.get(prefix)?.has(methodName) || // Implicit static `ClassName.empty` (handled by interpretClassMethod)
|
|
65696
|
+
methodName === "empty" && this.functionIndex.workspaceClasses.has(prefix)) {
|
|
64598
65697
|
const target = {
|
|
64599
65698
|
kind: "classMethod",
|
|
64600
65699
|
className: prefix,
|
|
@@ -65846,6 +66945,22 @@ function interpretClassMethod(target, args, nargout) {
|
|
|
65846
66945
|
() => this.callUserFunction(extFn, actualArgs2, nargout)
|
|
65847
66946
|
);
|
|
65848
66947
|
}
|
|
66948
|
+
if (methodName === "empty") {
|
|
66949
|
+
const dims = [];
|
|
66950
|
+
for (const a of args) {
|
|
66951
|
+
const rv = ensureRuntimeValue(a);
|
|
66952
|
+
if (isRuntimeTensor(rv)) for (const d of rv.data) dims.push(d);
|
|
66953
|
+
else dims.push(toNumber(rv));
|
|
66954
|
+
}
|
|
66955
|
+
if (dims.length === 1) dims.push(dims[0]);
|
|
66956
|
+
if (dims.length === 0) dims.push(0, 0);
|
|
66957
|
+
if (!dims.some((d) => d === 0)) {
|
|
66958
|
+
throw new RuntimeError(
|
|
66959
|
+
`${className}.empty: at least one dimension must be zero`
|
|
66960
|
+
);
|
|
66961
|
+
}
|
|
66962
|
+
return RTV.classInstanceArray(className, [], [dims[0], dims[1]]);
|
|
66963
|
+
}
|
|
65849
66964
|
throw new RuntimeError(
|
|
65850
66965
|
`No method '${methodName}' for class '${className}'`
|
|
65851
66966
|
);
|
|
@@ -65971,8 +67086,9 @@ function callUserFunction(fn, args, nargout, narginOverride) {
|
|
|
65971
67086
|
const fnEnv = new Environment();
|
|
65972
67087
|
fnEnv.rt = this.rt;
|
|
65973
67088
|
fnEnv.persistentFuncId = `${this.currentFile}:${fn.name}`;
|
|
65974
|
-
const
|
|
65975
|
-
const
|
|
67089
|
+
const vararginIdx = fn.params.indexOf("varargin");
|
|
67090
|
+
const hasVarargin = vararginIdx !== -1;
|
|
67091
|
+
const regularParams = hasVarargin ? fn.params.slice(0, vararginIdx) : fn.params;
|
|
65976
67092
|
let numPositional = regularParams.length;
|
|
65977
67093
|
const inputBlocks = (fn.argumentsBlocks ?? []).filter(
|
|
65978
67094
|
(b) => b.kind !== "Output"
|
|
@@ -65991,7 +67107,14 @@ function callUserFunction(fn, args, nargout, narginOverride) {
|
|
|
65991
67107
|
}
|
|
65992
67108
|
}
|
|
65993
67109
|
if (hasVarargin) {
|
|
65994
|
-
|
|
67110
|
+
let extras = sharedArgs.slice(regularParams.length);
|
|
67111
|
+
if (vararginIdx !== fn.params.length - 1) {
|
|
67112
|
+
extras = extras.slice(
|
|
67113
|
+
0,
|
|
67114
|
+
nameValueTailStart(extras, nameValueFieldNames(fn))
|
|
67115
|
+
);
|
|
67116
|
+
}
|
|
67117
|
+
const extraArgs = extras.map((a) => ensureRuntimeValue(a));
|
|
65995
67118
|
fnEnv.set("varargin", RTV.cell(extraArgs, [1, extraArgs.length]));
|
|
65996
67119
|
}
|
|
65997
67120
|
fnEnv.set("$nargin", narginOverride ?? args.length);
|
|
@@ -66376,6 +67499,28 @@ function evalInLocalScope(codeArg, fileName) {
|
|
|
66376
67499
|
}
|
|
66377
67500
|
throw new RuntimeError("eval not available in this context");
|
|
66378
67501
|
}
|
|
67502
|
+
function nameValueFieldNames(fn) {
|
|
67503
|
+
const names = /* @__PURE__ */ new Set();
|
|
67504
|
+
for (const block of fn.argumentsBlocks ?? []) {
|
|
67505
|
+
if (block.kind === "Output" || block.kind === "OutputRepeating") continue;
|
|
67506
|
+
for (const e of block.entries) {
|
|
67507
|
+
const dot2 = e.name.indexOf(".");
|
|
67508
|
+
if (dot2 >= 0) names.add(e.name.slice(dot2 + 1));
|
|
67509
|
+
}
|
|
67510
|
+
}
|
|
67511
|
+
return names;
|
|
67512
|
+
}
|
|
67513
|
+
function nameValueTailStart(extras, fieldNames) {
|
|
67514
|
+
if (fieldNames.size === 0) return extras.length;
|
|
67515
|
+
for (let i = 0; i < extras.length; i++) {
|
|
67516
|
+
if (extras[i] === void 0) continue;
|
|
67517
|
+
const rv = ensureRuntimeValue(extras[i]);
|
|
67518
|
+
if ((isRuntimeChar(rv) || isRuntimeString(rv)) && fieldNames.has(toString(rv))) {
|
|
67519
|
+
return i;
|
|
67520
|
+
}
|
|
67521
|
+
}
|
|
67522
|
+
return extras.length;
|
|
67523
|
+
}
|
|
66379
67524
|
function processArgumentsBlocks(fn, args) {
|
|
66380
67525
|
const argBlocks = fn.argumentsBlocks;
|
|
66381
67526
|
if (!argBlocks || argBlocks.length === 0) return;
|
|
@@ -66410,9 +67555,18 @@ function processArgumentsBlocks(fn, args) {
|
|
|
66410
67555
|
);
|
|
66411
67556
|
}
|
|
66412
67557
|
}
|
|
67558
|
+
const vararginIdx = fn.params.indexOf("varargin");
|
|
66413
67559
|
for (const [paramName, fields] of nvGroups) {
|
|
66414
67560
|
const pIdx = fn.params.indexOf(paramName);
|
|
66415
|
-
|
|
67561
|
+
let nvArgs;
|
|
67562
|
+
if (pIdx >= 0 && vararginIdx >= 0 && vararginIdx < pIdx) {
|
|
67563
|
+
const extras = args.slice(vararginIdx);
|
|
67564
|
+
nvArgs = extras.slice(
|
|
67565
|
+
nameValueTailStart(extras, nameValueFieldNames(fn))
|
|
67566
|
+
);
|
|
67567
|
+
} else {
|
|
67568
|
+
nvArgs = args.slice(pIdx >= 0 ? pIdx : args.length);
|
|
67569
|
+
}
|
|
66416
67570
|
const defaults = {};
|
|
66417
67571
|
for (const { field, defaultExpr } of fields) {
|
|
66418
67572
|
if (defaultExpr) defaults[field] = this.evalExpr(defaultExpr);
|
|
@@ -67698,6 +68852,11 @@ var shimFiles = [
|
|
|
67698
68852
|
else
|
|
67699
68853
|
result = val;
|
|
67700
68854
|
end
|
|
68855
|
+
% The backing dictionary stores char values as strings;
|
|
68856
|
+
% MATLAB's containers.Map hands back char.
|
|
68857
|
+
if strcmp(obj.ValueType, 'char') && isstring(result)
|
|
68858
|
+
result = char(result);
|
|
68859
|
+
end
|
|
67701
68860
|
elseif strcmp(S(1).type, '.')
|
|
67702
68861
|
result = builtin('subsref', obj, S);
|
|
67703
68862
|
elseif strcmp(S(1).type, '{}')
|
|
@@ -67731,11 +68890,14 @@ var shimFiles = [
|
|
|
67731
68890
|
end
|
|
67732
68891
|
k = keys(obj.data_);
|
|
67733
68892
|
if strcmp(obj.KeyType, 'char')
|
|
67734
|
-
% Return
|
|
67735
|
-
|
|
67736
|
-
|
|
67737
|
-
|
|
67738
|
-
|
|
68893
|
+
% Return a cellstr: the backing dictionary stores keys as
|
|
68894
|
+
% strings, but MATLAB's containers.Map returns char vectors.
|
|
68895
|
+
if ~iscell(k)
|
|
68896
|
+
k = {k};
|
|
68897
|
+
end
|
|
68898
|
+
result = cell(size(k));
|
|
68899
|
+
for i = 1:numel(k)
|
|
68900
|
+
result{i} = char(k{i});
|
|
67739
68901
|
end
|
|
67740
68902
|
else
|
|
67741
68903
|
% Numeric keys: parse back from string
|
|
@@ -67768,6 +68930,14 @@ var shimFiles = [
|
|
|
67768
68930
|
result{i} = v(i);
|
|
67769
68931
|
end
|
|
67770
68932
|
end
|
|
68933
|
+
if strcmp(obj.ValueType, 'char')
|
|
68934
|
+
% Stored as strings in the dictionary; MATLAB returns char.
|
|
68935
|
+
for i = 1:numel(result)
|
|
68936
|
+
if isstring(result{i})
|
|
68937
|
+
result{i} = char(result{i});
|
|
68938
|
+
end
|
|
68939
|
+
end
|
|
68940
|
+
end
|
|
67771
68941
|
end
|
|
67772
68942
|
end
|
|
67773
68943
|
|
|
@@ -77094,6 +78264,30 @@ var sin = defineUnaryRealMath({
|
|
|
77094
78264
|
complex: { cFnComplex: "mtoc2_csin", jsFnComplex: cSin }
|
|
77095
78265
|
});
|
|
77096
78266
|
|
|
78267
|
+
// src/numbl-core/jit/builtins/defs/math/rand.ts
|
|
78268
|
+
var rand = {
|
|
78269
|
+
name: "rand",
|
|
78270
|
+
transfer(argTypes, nargout) {
|
|
78271
|
+
if (nargout > 1) {
|
|
78272
|
+
throw new UnsupportedConstruct(
|
|
78273
|
+
`'rand' does not support multi-output (nargout=${nargout})`
|
|
78274
|
+
);
|
|
78275
|
+
}
|
|
78276
|
+
if (argTypes.length !== 0) {
|
|
78277
|
+
throw new UnsupportedConstruct(
|
|
78278
|
+
`JS-JIT 'rand' supports only the scalar form rand() so far (got ${argTypes.length} arg(s)); matrix/seed forms run in the interpreter`
|
|
78279
|
+
);
|
|
78280
|
+
}
|
|
78281
|
+
return [scalarDouble("nonneg")];
|
|
78282
|
+
},
|
|
78283
|
+
emitJs() {
|
|
78284
|
+
return "$rand()";
|
|
78285
|
+
},
|
|
78286
|
+
call() {
|
|
78287
|
+
return [rngRandom()];
|
|
78288
|
+
}
|
|
78289
|
+
};
|
|
78290
|
+
|
|
77097
78291
|
// src/numbl-core/jit/builtins/defs/math/tan.ts
|
|
77098
78292
|
var tan = defineUnaryRealMath({
|
|
77099
78293
|
name: "tan",
|
|
@@ -82477,6 +83671,7 @@ for (const b of [
|
|
|
82477
83671
|
stdBuiltin,
|
|
82478
83672
|
min,
|
|
82479
83673
|
max,
|
|
83674
|
+
rand,
|
|
82480
83675
|
any,
|
|
82481
83676
|
all,
|
|
82482
83677
|
zeros,
|
|
@@ -88262,12 +89457,13 @@ function emitJsProgram(prog, opts = {}) {
|
|
|
88262
89457
|
const wrapperLines = [];
|
|
88263
89458
|
if (opts.exposeSpec !== void 0) {
|
|
88264
89459
|
wrapperLines.push(
|
|
88265
|
-
`return function ($h) { globalThis.$write = $h.write; globalThis.$plotDispatch = $h.plotDispatch; return ${opts.exposeSpec}; };`
|
|
89460
|
+
`return function ($h) { globalThis.$write = $h.write; globalThis.$plotDispatch = $h.plotDispatch; globalThis.$rand = $h.rand; return ${opts.exposeSpec}; };`
|
|
88266
89461
|
);
|
|
88267
89462
|
} else {
|
|
88268
89463
|
wrapperLines.push("function run($h) {");
|
|
88269
89464
|
wrapperLines.push(" globalThis.$write = $h.write;");
|
|
88270
89465
|
wrapperLines.push(" globalThis.$plotDispatch = $h.plotDispatch;");
|
|
89466
|
+
wrapperLines.push(" globalThis.$rand = $h.rand;");
|
|
88271
89467
|
const locals = collectAssignedLocals(prog.topLevelStmts);
|
|
88272
89468
|
if (locals.length > 0) {
|
|
88273
89469
|
wrapperLines.push(` let ${locals.join(", ")};`);
|
|
@@ -90304,6 +91500,7 @@ function getOrCreateSession(interp) {
|
|
|
90304
91500
|
function buildHostHelpers(rt) {
|
|
90305
91501
|
return {
|
|
90306
91502
|
write: (s) => rt.output(s),
|
|
91503
|
+
rand: () => rngRandom(),
|
|
90307
91504
|
plotDispatch: (name, args) => {
|
|
90308
91505
|
const runtimeArgs = args.map((a) => jitToNumbl(a));
|
|
90309
91506
|
const handled = dispatchPlotBuiltin(
|
|
@@ -90396,6 +91593,11 @@ var jitCallExecutor = {
|
|
|
90396
91593
|
return { specFn };
|
|
90397
91594
|
} catch (e) {
|
|
90398
91595
|
if (e instanceof UnsupportedConstruct || e instanceof TypeError2) {
|
|
91596
|
+
recordJitDecline({
|
|
91597
|
+
message: e.message,
|
|
91598
|
+
kind: e.constructor.name,
|
|
91599
|
+
where: "jit-call"
|
|
91600
|
+
});
|
|
90399
91601
|
return null;
|
|
90400
91602
|
}
|
|
90401
91603
|
throw e;
|
|
@@ -90522,6 +91724,11 @@ var jitLoopExecutor = {
|
|
|
90522
91724
|
return { specFn };
|
|
90523
91725
|
} catch (e) {
|
|
90524
91726
|
if (e instanceof UnsupportedConstruct || e instanceof TypeError2) {
|
|
91727
|
+
recordJitDecline({
|
|
91728
|
+
message: e.message,
|
|
91729
|
+
kind: e.constructor.name,
|
|
91730
|
+
where: "jit-loop"
|
|
91731
|
+
});
|
|
90525
91732
|
return null;
|
|
90526
91733
|
}
|
|
90527
91734
|
throw e;
|
|
@@ -90662,6 +91869,11 @@ var jitTopLevelExecutor = {
|
|
|
90662
91869
|
return { specFn, nargout };
|
|
90663
91870
|
} catch (e) {
|
|
90664
91871
|
if (e instanceof UnsupportedConstruct || e instanceof TypeError2) {
|
|
91872
|
+
recordJitDecline({
|
|
91873
|
+
message: e.message,
|
|
91874
|
+
kind: e.constructor.name,
|
|
91875
|
+
where: "jit-top-level"
|
|
91876
|
+
});
|
|
90665
91877
|
return null;
|
|
90666
91878
|
}
|
|
90667
91879
|
throw e;
|
|
@@ -90866,6 +92078,31 @@ function executeCode(source, options = {}, workspaceFiles, mainFileName = "scrip
|
|
|
90866
92078
|
implicitCwdPath = null;
|
|
90867
92079
|
}
|
|
90868
92080
|
}
|
|
92081
|
+
if (searchPaths && options.fileIO?.scanDirectory) {
|
|
92082
|
+
const haveM = new Set(mWorkspaceFiles.map((f) => f.name));
|
|
92083
|
+
for (const dir of searchPaths) {
|
|
92084
|
+
try {
|
|
92085
|
+
const absDir = options.fileIO.resolvePath?.(dir) ?? dir;
|
|
92086
|
+
for (const f of options.fileIO.scanDirectory(absDir)) {
|
|
92087
|
+
if (f.name.endsWith(".m")) {
|
|
92088
|
+
if (!haveM.has(f.name)) {
|
|
92089
|
+
mWorkspaceFiles.push(f);
|
|
92090
|
+
haveM.add(f.name);
|
|
92091
|
+
}
|
|
92092
|
+
} else if (isNumblJsFile(f.name)) {
|
|
92093
|
+
if (!jsWorkspaceFiles.some((e) => e.name === f.name)) {
|
|
92094
|
+
jsWorkspaceFiles.push(f);
|
|
92095
|
+
}
|
|
92096
|
+
} else if (f.name.endsWith(".wasm")) {
|
|
92097
|
+
if (!wasmWorkspaceFiles.some((e) => e.name === f.name)) {
|
|
92098
|
+
wasmWorkspaceFiles.push(f);
|
|
92099
|
+
}
|
|
92100
|
+
}
|
|
92101
|
+
}
|
|
92102
|
+
} catch {
|
|
92103
|
+
}
|
|
92104
|
+
}
|
|
92105
|
+
}
|
|
90869
92106
|
const jsUserFunctions = loadJsUserFunctions(
|
|
90870
92107
|
jsWorkspaceFiles,
|
|
90871
92108
|
wasmWorkspaceFiles,
|
|
@@ -91325,9 +92562,790 @@ async function load() {
|
|
|
91325
92562
|
setDelaunayBackend((points, dim) => qhull.delaunay(points, dim).facets);
|
|
91326
92563
|
setConvexHullBackend((points, dim) => qhull.convexHull(points, dim).facets);
|
|
91327
92564
|
}
|
|
92565
|
+
|
|
92566
|
+
// src/vfs/VirtualFileSystem.ts
|
|
92567
|
+
var VirtualFileSystem = class {
|
|
92568
|
+
files = /* @__PURE__ */ new Map();
|
|
92569
|
+
directories = /* @__PURE__ */ new Set();
|
|
92570
|
+
cwd = "/project";
|
|
92571
|
+
// Change tracking
|
|
92572
|
+
createdFiles = /* @__PURE__ */ new Set();
|
|
92573
|
+
modifiedFiles = /* @__PURE__ */ new Set();
|
|
92574
|
+
deletedFiles = /* @__PURE__ */ new Set();
|
|
92575
|
+
/** Clear change tracking. Call after populating the VFS with initial files. */
|
|
92576
|
+
clearChangeTracking() {
|
|
92577
|
+
this.createdFiles.clear();
|
|
92578
|
+
this.modifiedFiles.clear();
|
|
92579
|
+
this.deletedFiles.clear();
|
|
92580
|
+
}
|
|
92581
|
+
/** Normalize a path to absolute form. */
|
|
92582
|
+
normalizePath(p2) {
|
|
92583
|
+
if (!p2.startsWith("/")) {
|
|
92584
|
+
p2 = this.cwd + "/" + p2;
|
|
92585
|
+
}
|
|
92586
|
+
const parts = p2.split("/");
|
|
92587
|
+
const resolved = [];
|
|
92588
|
+
for (const part of parts) {
|
|
92589
|
+
if (part === "" || part === ".") continue;
|
|
92590
|
+
if (part === "..") {
|
|
92591
|
+
if (resolved.length > 0) resolved.pop();
|
|
92592
|
+
} else {
|
|
92593
|
+
resolved.push(part);
|
|
92594
|
+
}
|
|
92595
|
+
}
|
|
92596
|
+
return "/" + resolved.join("/");
|
|
92597
|
+
}
|
|
92598
|
+
getCwd() {
|
|
92599
|
+
return this.cwd;
|
|
92600
|
+
}
|
|
92601
|
+
setCwd(dir) {
|
|
92602
|
+
this.cwd = this.normalizePath(dir);
|
|
92603
|
+
}
|
|
92604
|
+
readFile(path) {
|
|
92605
|
+
const norm2 = this.normalizePath(path);
|
|
92606
|
+
const file = this.files.get(norm2);
|
|
92607
|
+
if (!file) throw new Error(`File not found: ${path}`);
|
|
92608
|
+
return file.content;
|
|
92609
|
+
}
|
|
92610
|
+
writeFile(path, content) {
|
|
92611
|
+
const norm2 = this.normalizePath(path);
|
|
92612
|
+
const existed = this.files.has(norm2);
|
|
92613
|
+
this.files.set(norm2, { content, mtimeMs: Date.now() });
|
|
92614
|
+
this.ensureParentDirs(norm2);
|
|
92615
|
+
if (this.deletedFiles.has(norm2)) {
|
|
92616
|
+
this.deletedFiles.delete(norm2);
|
|
92617
|
+
this.modifiedFiles.add(norm2);
|
|
92618
|
+
} else if (!existed) {
|
|
92619
|
+
this.createdFiles.add(norm2);
|
|
92620
|
+
} else if (!this.createdFiles.has(norm2)) {
|
|
92621
|
+
this.modifiedFiles.add(norm2);
|
|
92622
|
+
}
|
|
92623
|
+
}
|
|
92624
|
+
deleteFile(path) {
|
|
92625
|
+
const norm2 = this.normalizePath(path);
|
|
92626
|
+
if (!this.files.has(norm2)) return false;
|
|
92627
|
+
this.files.delete(norm2);
|
|
92628
|
+
if (this.createdFiles.has(norm2)) {
|
|
92629
|
+
this.createdFiles.delete(norm2);
|
|
92630
|
+
this.modifiedFiles.delete(norm2);
|
|
92631
|
+
} else {
|
|
92632
|
+
this.modifiedFiles.delete(norm2);
|
|
92633
|
+
this.deletedFiles.add(norm2);
|
|
92634
|
+
}
|
|
92635
|
+
return true;
|
|
92636
|
+
}
|
|
92637
|
+
exists(path) {
|
|
92638
|
+
const norm2 = this.normalizePath(path);
|
|
92639
|
+
if (this.files.has(norm2)) return "file";
|
|
92640
|
+
if (this.directories.has(norm2)) return "dir";
|
|
92641
|
+
const prefix = norm2 + "/";
|
|
92642
|
+
for (const key of this.files.keys()) {
|
|
92643
|
+
if (key.startsWith(prefix)) return "dir";
|
|
92644
|
+
}
|
|
92645
|
+
return null;
|
|
92646
|
+
}
|
|
92647
|
+
fileSize(path) {
|
|
92648
|
+
const norm2 = this.normalizePath(path);
|
|
92649
|
+
const file = this.files.get(norm2);
|
|
92650
|
+
return file ? file.content.length : 0;
|
|
92651
|
+
}
|
|
92652
|
+
mkdir(dirPath) {
|
|
92653
|
+
const norm2 = this.normalizePath(dirPath);
|
|
92654
|
+
this.directories.add(norm2);
|
|
92655
|
+
this.ensureParentDirs(norm2 + "/placeholder");
|
|
92656
|
+
return true;
|
|
92657
|
+
}
|
|
92658
|
+
/** Move/rename a file or directory tree. Returns true on success. */
|
|
92659
|
+
movefile(source, destination) {
|
|
92660
|
+
const srcNorm = this.normalizePath(source);
|
|
92661
|
+
const srcType = this.exists(srcNorm);
|
|
92662
|
+
if (srcType === null) return false;
|
|
92663
|
+
let dstNorm = this.normalizePath(destination);
|
|
92664
|
+
const dstType = this.exists(dstNorm);
|
|
92665
|
+
if (dstType === "dir") {
|
|
92666
|
+
const lastSlash = srcNorm.lastIndexOf("/");
|
|
92667
|
+
const baseName = lastSlash >= 0 ? srcNorm.slice(lastSlash + 1) : srcNorm;
|
|
92668
|
+
dstNorm = (dstNorm === "/" ? "" : dstNorm) + "/" + baseName;
|
|
92669
|
+
}
|
|
92670
|
+
if (srcType === "dir" && this.exists(dstNorm) === "file") return false;
|
|
92671
|
+
if (srcType === "file") {
|
|
92672
|
+
const content = this.files.get(srcNorm).content;
|
|
92673
|
+
if (this.exists(dstNorm) === "file") this.deleteFile(dstNorm);
|
|
92674
|
+
this.writeFile(dstNorm, content);
|
|
92675
|
+
this.deleteFile(srcNorm);
|
|
92676
|
+
return true;
|
|
92677
|
+
}
|
|
92678
|
+
const srcPrefix = srcNorm + "/";
|
|
92679
|
+
const filesToMove = [];
|
|
92680
|
+
for (const [path, file] of this.files) {
|
|
92681
|
+
if (path === srcNorm || path.startsWith(srcPrefix)) {
|
|
92682
|
+
const rest = path === srcNorm ? "" : path.slice(srcNorm.length);
|
|
92683
|
+
filesToMove.push({
|
|
92684
|
+
from: path,
|
|
92685
|
+
to: dstNorm + rest,
|
|
92686
|
+
content: file.content
|
|
92687
|
+
});
|
|
92688
|
+
}
|
|
92689
|
+
}
|
|
92690
|
+
const dirsToMove = [];
|
|
92691
|
+
for (const dir of this.directories) {
|
|
92692
|
+
if (dir === srcNorm || dir.startsWith(srcPrefix)) {
|
|
92693
|
+
const rest = dir === srcNorm ? "" : dir.slice(srcNorm.length);
|
|
92694
|
+
dirsToMove.push({ from: dir, to: dstNorm + rest });
|
|
92695
|
+
}
|
|
92696
|
+
}
|
|
92697
|
+
for (const { from } of filesToMove) this.deleteFile(from);
|
|
92698
|
+
for (const { from } of dirsToMove) this.directories.delete(from);
|
|
92699
|
+
this.directories.add(dstNorm);
|
|
92700
|
+
for (const { to } of dirsToMove) this.directories.add(to);
|
|
92701
|
+
for (const { to, content } of filesToMove) this.writeFile(to, content);
|
|
92702
|
+
return true;
|
|
92703
|
+
}
|
|
92704
|
+
/** Copy a file or directory tree (source is left in place). True on success. */
|
|
92705
|
+
copyfile(source, destination) {
|
|
92706
|
+
const srcNorm = this.normalizePath(source);
|
|
92707
|
+
const srcType = this.exists(srcNorm);
|
|
92708
|
+
if (srcType === null) return false;
|
|
92709
|
+
let dstNorm = this.normalizePath(destination);
|
|
92710
|
+
if (this.exists(dstNorm) === "dir") {
|
|
92711
|
+
const lastSlash = srcNorm.lastIndexOf("/");
|
|
92712
|
+
const baseName = lastSlash >= 0 ? srcNorm.slice(lastSlash + 1) : srcNorm;
|
|
92713
|
+
dstNorm = (dstNorm === "/" ? "" : dstNorm) + "/" + baseName;
|
|
92714
|
+
}
|
|
92715
|
+
if (srcType === "dir" && this.exists(dstNorm) === "file") return false;
|
|
92716
|
+
if (srcType === "file") {
|
|
92717
|
+
const content = this.files.get(srcNorm).content;
|
|
92718
|
+
if (this.exists(dstNorm) === "file") this.deleteFile(dstNorm);
|
|
92719
|
+
this.writeFile(dstNorm, content);
|
|
92720
|
+
return true;
|
|
92721
|
+
}
|
|
92722
|
+
const srcPrefix = srcNorm + "/";
|
|
92723
|
+
for (const [path, file] of [...this.files]) {
|
|
92724
|
+
if (path === srcNorm || path.startsWith(srcPrefix)) {
|
|
92725
|
+
const rest = path === srcNorm ? "" : path.slice(srcNorm.length);
|
|
92726
|
+
this.writeFile(dstNorm + rest, file.content);
|
|
92727
|
+
}
|
|
92728
|
+
}
|
|
92729
|
+
for (const dir of [...this.directories]) {
|
|
92730
|
+
if (dir === srcNorm || dir.startsWith(srcPrefix)) {
|
|
92731
|
+
const rest = dir === srcNorm ? "" : dir.slice(srcNorm.length);
|
|
92732
|
+
this.directories.add(dstNorm + rest);
|
|
92733
|
+
}
|
|
92734
|
+
}
|
|
92735
|
+
this.directories.add(dstNorm);
|
|
92736
|
+
return true;
|
|
92737
|
+
}
|
|
92738
|
+
/** Resolve a path to its (normalized) absolute path + attributes, or null. */
|
|
92739
|
+
fileattrib(path) {
|
|
92740
|
+
const norm2 = this.normalizePath(path);
|
|
92741
|
+
const t = this.exists(norm2);
|
|
92742
|
+
if (t === null) return null;
|
|
92743
|
+
return {
|
|
92744
|
+
Name: norm2,
|
|
92745
|
+
directory: t === "dir",
|
|
92746
|
+
UserRead: true,
|
|
92747
|
+
UserWrite: true,
|
|
92748
|
+
UserExecute: t === "dir"
|
|
92749
|
+
};
|
|
92750
|
+
}
|
|
92751
|
+
rmdir(dirPath, recursive) {
|
|
92752
|
+
const norm2 = this.normalizePath(dirPath);
|
|
92753
|
+
if (this.exists(norm2) !== "dir") return false;
|
|
92754
|
+
if (recursive) {
|
|
92755
|
+
const prefix = norm2 + "/";
|
|
92756
|
+
for (const key of [...this.files.keys()]) {
|
|
92757
|
+
if (key.startsWith(prefix)) {
|
|
92758
|
+
this.deleteFile(key);
|
|
92759
|
+
}
|
|
92760
|
+
}
|
|
92761
|
+
for (const dir of [...this.directories]) {
|
|
92762
|
+
if (dir === norm2 || dir.startsWith(prefix)) {
|
|
92763
|
+
this.directories.delete(dir);
|
|
92764
|
+
}
|
|
92765
|
+
}
|
|
92766
|
+
} else {
|
|
92767
|
+
const prefix = norm2 + "/";
|
|
92768
|
+
for (const key of this.files.keys()) {
|
|
92769
|
+
if (key.startsWith(prefix)) return false;
|
|
92770
|
+
}
|
|
92771
|
+
this.directories.delete(norm2);
|
|
92772
|
+
}
|
|
92773
|
+
return true;
|
|
92774
|
+
}
|
|
92775
|
+
/** List entries in a directory. */
|
|
92776
|
+
listDir(dirPath) {
|
|
92777
|
+
const norm2 = this.normalizePath(dirPath);
|
|
92778
|
+
const prefix = norm2 === "/" ? "/" : norm2 + "/";
|
|
92779
|
+
const results = [];
|
|
92780
|
+
const now = Date.now();
|
|
92781
|
+
results.push({
|
|
92782
|
+
name: ".",
|
|
92783
|
+
folder: norm2,
|
|
92784
|
+
bytes: 0,
|
|
92785
|
+
isdir: true,
|
|
92786
|
+
mtimeMs: now
|
|
92787
|
+
});
|
|
92788
|
+
results.push({
|
|
92789
|
+
name: "..",
|
|
92790
|
+
folder: norm2,
|
|
92791
|
+
bytes: 0,
|
|
92792
|
+
isdir: true,
|
|
92793
|
+
mtimeMs: now
|
|
92794
|
+
});
|
|
92795
|
+
const seen = /* @__PURE__ */ new Set();
|
|
92796
|
+
for (const [path, file] of this.files) {
|
|
92797
|
+
if (!path.startsWith(prefix)) continue;
|
|
92798
|
+
const rest = path.slice(prefix.length);
|
|
92799
|
+
const slashIdx = rest.indexOf("/");
|
|
92800
|
+
if (slashIdx === -1) {
|
|
92801
|
+
results.push({
|
|
92802
|
+
name: rest,
|
|
92803
|
+
folder: norm2,
|
|
92804
|
+
bytes: file.content.length,
|
|
92805
|
+
isdir: false,
|
|
92806
|
+
mtimeMs: file.mtimeMs
|
|
92807
|
+
});
|
|
92808
|
+
} else {
|
|
92809
|
+
const dirName = rest.slice(0, slashIdx);
|
|
92810
|
+
if (!seen.has(dirName)) {
|
|
92811
|
+
seen.add(dirName);
|
|
92812
|
+
results.push({
|
|
92813
|
+
name: dirName,
|
|
92814
|
+
folder: norm2,
|
|
92815
|
+
bytes: 0,
|
|
92816
|
+
isdir: true,
|
|
92817
|
+
mtimeMs: now
|
|
92818
|
+
});
|
|
92819
|
+
}
|
|
92820
|
+
}
|
|
92821
|
+
}
|
|
92822
|
+
for (const dir of this.directories) {
|
|
92823
|
+
if (!dir.startsWith(prefix)) continue;
|
|
92824
|
+
const rest = dir.slice(prefix.length);
|
|
92825
|
+
if (!rest.includes("/") && rest.length > 0 && !seen.has(rest)) {
|
|
92826
|
+
seen.add(rest);
|
|
92827
|
+
results.push({
|
|
92828
|
+
name: rest,
|
|
92829
|
+
folder: norm2,
|
|
92830
|
+
bytes: 0,
|
|
92831
|
+
isdir: true,
|
|
92832
|
+
mtimeMs: now
|
|
92833
|
+
});
|
|
92834
|
+
}
|
|
92835
|
+
}
|
|
92836
|
+
return results;
|
|
92837
|
+
}
|
|
92838
|
+
/** List all file paths in the VFS. */
|
|
92839
|
+
allFiles() {
|
|
92840
|
+
return [...this.files.keys()];
|
|
92841
|
+
}
|
|
92842
|
+
/** Get the changes since the VFS was created. */
|
|
92843
|
+
getChanges() {
|
|
92844
|
+
const created = [];
|
|
92845
|
+
const modified = [];
|
|
92846
|
+
for (const path of this.createdFiles) {
|
|
92847
|
+
const file = this.files.get(path);
|
|
92848
|
+
if (file) created.push({ path, content: file.content });
|
|
92849
|
+
}
|
|
92850
|
+
for (const path of this.modifiedFiles) {
|
|
92851
|
+
const file = this.files.get(path);
|
|
92852
|
+
if (file) modified.push({ path, content: file.content });
|
|
92853
|
+
}
|
|
92854
|
+
return {
|
|
92855
|
+
created,
|
|
92856
|
+
modified,
|
|
92857
|
+
deleted: [...this.deletedFiles]
|
|
92858
|
+
};
|
|
92859
|
+
}
|
|
92860
|
+
ensureParentDirs(path) {
|
|
92861
|
+
const parts = path.split("/").filter(Boolean);
|
|
92862
|
+
for (let i = 1; i < parts.length; i++) {
|
|
92863
|
+
const dir = "/" + parts.slice(0, i).join("/");
|
|
92864
|
+
this.directories.add(dir);
|
|
92865
|
+
}
|
|
92866
|
+
}
|
|
92867
|
+
};
|
|
92868
|
+
|
|
92869
|
+
// src/vfs/BrowserFileIOAdapter.ts
|
|
92870
|
+
import { unzipSync } from "fflate";
|
|
92871
|
+
var TEXT_DECODER = new TextDecoder("utf-8");
|
|
92872
|
+
var TEXT_ENCODER = new TextEncoder();
|
|
92873
|
+
var READ_CHUNK_SIZE = 8192;
|
|
92874
|
+
var BrowserFileIOAdapter = class {
|
|
92875
|
+
constructor(vfs) {
|
|
92876
|
+
this.vfs = vfs;
|
|
92877
|
+
}
|
|
92878
|
+
nextFid = 3;
|
|
92879
|
+
// 0=stdin, 1=stdout, 2=stderr reserved
|
|
92880
|
+
openFiles = /* @__PURE__ */ new Map();
|
|
92881
|
+
fopen(filename, permission) {
|
|
92882
|
+
const perm = permission.replace(/b/g, "");
|
|
92883
|
+
const path = this.vfs.normalizePath(filename);
|
|
92884
|
+
try {
|
|
92885
|
+
let data;
|
|
92886
|
+
let pos = 0;
|
|
92887
|
+
if (perm === "r" || perm === "r+") {
|
|
92888
|
+
if (this.vfs.exists(filename) !== "file") return -1;
|
|
92889
|
+
data = new Uint8Array(this.vfs.readFile(filename));
|
|
92890
|
+
} else if (perm === "w" || perm === "w+") {
|
|
92891
|
+
data = new Uint8Array(0);
|
|
92892
|
+
} else if (perm === "a" || perm === "a+") {
|
|
92893
|
+
if (this.vfs.exists(filename) === "file") {
|
|
92894
|
+
data = new Uint8Array(this.vfs.readFile(filename));
|
|
92895
|
+
pos = data.length;
|
|
92896
|
+
} else {
|
|
92897
|
+
data = new Uint8Array(0);
|
|
92898
|
+
}
|
|
92899
|
+
} else {
|
|
92900
|
+
return -1;
|
|
92901
|
+
}
|
|
92902
|
+
const fid = this.nextFid++;
|
|
92903
|
+
this.openFiles.set(fid, {
|
|
92904
|
+
path,
|
|
92905
|
+
permission: perm,
|
|
92906
|
+
lastError: "",
|
|
92907
|
+
buffer: "",
|
|
92908
|
+
eof: false,
|
|
92909
|
+
pos,
|
|
92910
|
+
data,
|
|
92911
|
+
dataLen: data.length,
|
|
92912
|
+
dirty: perm === "w" || perm === "a"
|
|
92913
|
+
// w starts dirty (truncated or new)
|
|
92914
|
+
});
|
|
92915
|
+
return fid;
|
|
92916
|
+
} catch {
|
|
92917
|
+
return -1;
|
|
92918
|
+
}
|
|
92919
|
+
}
|
|
92920
|
+
fclose(fidOrAll) {
|
|
92921
|
+
if (fidOrAll === "all") {
|
|
92922
|
+
for (const [, entry2] of this.openFiles) {
|
|
92923
|
+
this.flushEntry(entry2);
|
|
92924
|
+
}
|
|
92925
|
+
this.openFiles.clear();
|
|
92926
|
+
return 0;
|
|
92927
|
+
}
|
|
92928
|
+
const entry = this.openFiles.get(fidOrAll);
|
|
92929
|
+
if (!entry) return -1;
|
|
92930
|
+
this.flushEntry(entry);
|
|
92931
|
+
this.openFiles.delete(fidOrAll);
|
|
92932
|
+
return 0;
|
|
92933
|
+
}
|
|
92934
|
+
fgetl(fid) {
|
|
92935
|
+
const entry = this.getEntry(fid);
|
|
92936
|
+
if (!entry) return -1;
|
|
92937
|
+
return this.readLine(entry, false);
|
|
92938
|
+
}
|
|
92939
|
+
fgets(fid) {
|
|
92940
|
+
const entry = this.getEntry(fid);
|
|
92941
|
+
if (!entry) return -1;
|
|
92942
|
+
return this.readLine(entry, true);
|
|
92943
|
+
}
|
|
92944
|
+
fileread(filename) {
|
|
92945
|
+
const data = this.vfs.readFile(filename);
|
|
92946
|
+
return TEXT_DECODER.decode(data);
|
|
92947
|
+
}
|
|
92948
|
+
feof(fid) {
|
|
92949
|
+
const entry = this.getEntry(fid);
|
|
92950
|
+
if (!entry) return 1;
|
|
92951
|
+
if (entry.buffer.length > 0) return 0;
|
|
92952
|
+
if (entry.eof) return 1;
|
|
92953
|
+
if (entry.pos >= entry.dataLen) {
|
|
92954
|
+
entry.eof = true;
|
|
92955
|
+
return 1;
|
|
92956
|
+
}
|
|
92957
|
+
return 0;
|
|
92958
|
+
}
|
|
92959
|
+
ferror(fid) {
|
|
92960
|
+
const entry = this.getEntry(fid);
|
|
92961
|
+
if (!entry) return "Invalid file identifier";
|
|
92962
|
+
return entry.lastError;
|
|
92963
|
+
}
|
|
92964
|
+
fwrite(fid, text) {
|
|
92965
|
+
const entry = this.getEntry(fid);
|
|
92966
|
+
if (!entry) throw new Error(`Invalid file identifier: ${fid}`);
|
|
92967
|
+
const bytes = TEXT_ENCODER.encode(text);
|
|
92968
|
+
this.writeBytes(entry, bytes);
|
|
92969
|
+
entry.lastError = "";
|
|
92970
|
+
}
|
|
92971
|
+
freadBytes(fid, count) {
|
|
92972
|
+
const entry = this.getEntry(fid);
|
|
92973
|
+
if (!entry) throw new Error(`Invalid file identifier: ${fid}`);
|
|
92974
|
+
if (entry.buffer.length > 0) {
|
|
92975
|
+
entry.buffer = "";
|
|
92976
|
+
}
|
|
92977
|
+
const available = entry.dataLen - entry.pos;
|
|
92978
|
+
const toRead = Math.min(count, available);
|
|
92979
|
+
if (toRead <= 0) {
|
|
92980
|
+
entry.eof = true;
|
|
92981
|
+
return new Uint8Array(0);
|
|
92982
|
+
}
|
|
92983
|
+
const result = new Uint8Array(toRead);
|
|
92984
|
+
result.set(entry.data.subarray(entry.pos, entry.pos + toRead));
|
|
92985
|
+
entry.pos += toRead;
|
|
92986
|
+
if (entry.pos >= entry.dataLen) entry.eof = true;
|
|
92987
|
+
entry.lastError = "";
|
|
92988
|
+
return result;
|
|
92989
|
+
}
|
|
92990
|
+
fwriteBytes(fid, data) {
|
|
92991
|
+
const entry = this.getEntry(fid);
|
|
92992
|
+
if (!entry) throw new Error(`Invalid file identifier: ${fid}`);
|
|
92993
|
+
this.writeBytes(entry, data);
|
|
92994
|
+
entry.lastError = "";
|
|
92995
|
+
return data.length;
|
|
92996
|
+
}
|
|
92997
|
+
fseek(fid, offset, origin) {
|
|
92998
|
+
const entry = this.getEntry(fid);
|
|
92999
|
+
if (!entry) return -1;
|
|
93000
|
+
entry.buffer = "";
|
|
93001
|
+
entry.eof = false;
|
|
93002
|
+
if (origin === -1) {
|
|
93003
|
+
entry.pos = offset;
|
|
93004
|
+
} else if (origin === 0) {
|
|
93005
|
+
entry.pos += offset;
|
|
93006
|
+
} else {
|
|
93007
|
+
entry.pos = entry.dataLen + offset;
|
|
93008
|
+
}
|
|
93009
|
+
return 0;
|
|
93010
|
+
}
|
|
93011
|
+
ftell(fid) {
|
|
93012
|
+
const entry = this.getEntry(fid);
|
|
93013
|
+
if (!entry) return -1;
|
|
93014
|
+
return entry.pos;
|
|
93015
|
+
}
|
|
93016
|
+
scanDirectory(dirPath) {
|
|
93017
|
+
const norm2 = this.vfs.normalizePath(dirPath);
|
|
93018
|
+
const prefix = norm2 === "/" ? "/" : norm2 + "/";
|
|
93019
|
+
const results = [];
|
|
93020
|
+
for (const filePath of this.vfs.allFiles()) {
|
|
93021
|
+
if (!filePath.startsWith(prefix)) continue;
|
|
93022
|
+
const relativePath = filePath.slice(prefix.length);
|
|
93023
|
+
if (!relativePath) continue;
|
|
93024
|
+
const segments = relativePath.split("/");
|
|
93025
|
+
const dirs = segments.slice(0, -1);
|
|
93026
|
+
const allSpecial = dirs.every(
|
|
93027
|
+
(d) => d.startsWith("@") || d.startsWith("+") || d === "private"
|
|
93028
|
+
);
|
|
93029
|
+
if (!allSpecial) continue;
|
|
93030
|
+
if (!relativePath.endsWith(".m") && !relativePath.endsWith(".numbl.js") && !relativePath.endsWith(".wasm")) {
|
|
93031
|
+
continue;
|
|
93032
|
+
}
|
|
93033
|
+
try {
|
|
93034
|
+
const content = this.vfs.readFile(filePath);
|
|
93035
|
+
if (relativePath.endsWith(".wasm")) {
|
|
93036
|
+
results.push({
|
|
93037
|
+
name: filePath,
|
|
93038
|
+
source: "",
|
|
93039
|
+
data: new Uint8Array(content)
|
|
93040
|
+
});
|
|
93041
|
+
} else {
|
|
93042
|
+
results.push({
|
|
93043
|
+
name: filePath,
|
|
93044
|
+
source: TEXT_DECODER.decode(content)
|
|
93045
|
+
});
|
|
93046
|
+
}
|
|
93047
|
+
} catch {
|
|
93048
|
+
}
|
|
93049
|
+
}
|
|
93050
|
+
return results;
|
|
93051
|
+
}
|
|
93052
|
+
resolvePath(dirPath) {
|
|
93053
|
+
return this.vfs.normalizePath(dirPath);
|
|
93054
|
+
}
|
|
93055
|
+
existsPath(path) {
|
|
93056
|
+
return this.vfs.exists(path);
|
|
93057
|
+
}
|
|
93058
|
+
mkdir(dirPath) {
|
|
93059
|
+
return this.vfs.mkdir(dirPath);
|
|
93060
|
+
}
|
|
93061
|
+
tempdir() {
|
|
93062
|
+
return "/tmp";
|
|
93063
|
+
}
|
|
93064
|
+
userpath() {
|
|
93065
|
+
return "/system";
|
|
93066
|
+
}
|
|
93067
|
+
deleteFile(pattern) {
|
|
93068
|
+
const norm2 = this.vfs.normalizePath(pattern);
|
|
93069
|
+
if (norm2.includes("*") || norm2.includes("?")) {
|
|
93070
|
+
const lastSlash = norm2.lastIndexOf("/");
|
|
93071
|
+
const dir = norm2.slice(0, lastSlash);
|
|
93072
|
+
const globPat = norm2.slice(lastSlash + 1);
|
|
93073
|
+
const re = new RegExp(
|
|
93074
|
+
"^" + globPat.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*").replace(/\?/g, ".") + "$"
|
|
93075
|
+
);
|
|
93076
|
+
const entries = this.vfs.listDir(dir);
|
|
93077
|
+
for (const entry of entries) {
|
|
93078
|
+
if (!entry.isdir && re.test(entry.name)) {
|
|
93079
|
+
this.vfs.deleteFile(dir + "/" + entry.name);
|
|
93080
|
+
}
|
|
93081
|
+
}
|
|
93082
|
+
} else {
|
|
93083
|
+
this.vfs.deleteFile(norm2);
|
|
93084
|
+
}
|
|
93085
|
+
}
|
|
93086
|
+
rmdir(dirPath, recursive) {
|
|
93087
|
+
return this.vfs.rmdir(dirPath, recursive);
|
|
93088
|
+
}
|
|
93089
|
+
movefile(source, destination) {
|
|
93090
|
+
return this.vfs.movefile(source, destination);
|
|
93091
|
+
}
|
|
93092
|
+
copyfile(source, destination) {
|
|
93093
|
+
return this.vfs.copyfile(source, destination);
|
|
93094
|
+
}
|
|
93095
|
+
fileattrib(path) {
|
|
93096
|
+
return this.vfs.fileattrib(path);
|
|
93097
|
+
}
|
|
93098
|
+
listDir(dirPath) {
|
|
93099
|
+
const norm2 = this.vfs.normalizePath(dirPath);
|
|
93100
|
+
if (dirPath.includes("**")) {
|
|
93101
|
+
return this.listDirRecursive(dirPath);
|
|
93102
|
+
}
|
|
93103
|
+
if (dirPath.includes("*") || dirPath.includes("?")) {
|
|
93104
|
+
return this.listDirGlob(dirPath);
|
|
93105
|
+
}
|
|
93106
|
+
const type = this.vfs.exists(dirPath);
|
|
93107
|
+
if (type === "file") {
|
|
93108
|
+
const lastSlash = norm2.lastIndexOf("/");
|
|
93109
|
+
const name = lastSlash >= 0 ? norm2.slice(lastSlash + 1) : norm2;
|
|
93110
|
+
const folder = lastSlash >= 0 ? norm2.slice(0, lastSlash) : "/";
|
|
93111
|
+
return [
|
|
93112
|
+
{
|
|
93113
|
+
name,
|
|
93114
|
+
folder,
|
|
93115
|
+
bytes: this.vfs.fileSize(dirPath),
|
|
93116
|
+
isdir: false,
|
|
93117
|
+
mtimeMs: Date.now()
|
|
93118
|
+
}
|
|
93119
|
+
];
|
|
93120
|
+
}
|
|
93121
|
+
return this.vfs.listDir(dirPath);
|
|
93122
|
+
}
|
|
93123
|
+
websave(url, filename, options) {
|
|
93124
|
+
url = filterUrl(url);
|
|
93125
|
+
const method = options?.requestMethod?.toUpperCase() || "GET";
|
|
93126
|
+
const xhr = new XMLHttpRequest();
|
|
93127
|
+
xhr.open(method, url, false);
|
|
93128
|
+
if (options?.timeout) xhr.timeout = Math.round(options.timeout * 1e3);
|
|
93129
|
+
if (options?.username && options?.password) {
|
|
93130
|
+
xhr.setRequestHeader(
|
|
93131
|
+
"Authorization",
|
|
93132
|
+
"Basic " + btoa(`${options.username}:${options.password}`)
|
|
93133
|
+
);
|
|
93134
|
+
}
|
|
93135
|
+
if (options?.keyName && options?.keyValue) {
|
|
93136
|
+
xhr.setRequestHeader(options.keyName, options.keyValue);
|
|
93137
|
+
}
|
|
93138
|
+
xhr.responseType = "arraybuffer";
|
|
93139
|
+
xhr.send();
|
|
93140
|
+
if (xhr.status < 200 || xhr.status >= 300) {
|
|
93141
|
+
throw new Error(`websave: HTTP ${xhr.status} for ${url}`);
|
|
93142
|
+
}
|
|
93143
|
+
const data = new Uint8Array(xhr.response);
|
|
93144
|
+
this.vfs.writeFile(filename, data);
|
|
93145
|
+
}
|
|
93146
|
+
webread(url, options) {
|
|
93147
|
+
url = filterUrl(url);
|
|
93148
|
+
const method = options?.requestMethod?.toUpperCase() || "GET";
|
|
93149
|
+
const xhr = new XMLHttpRequest();
|
|
93150
|
+
xhr.open(method, url, false);
|
|
93151
|
+
if (options?.timeout) xhr.timeout = Math.round(options.timeout * 1e3);
|
|
93152
|
+
if (options?.username && options?.password) {
|
|
93153
|
+
xhr.setRequestHeader(
|
|
93154
|
+
"Authorization",
|
|
93155
|
+
"Basic " + btoa(`${options.username}:${options.password}`)
|
|
93156
|
+
);
|
|
93157
|
+
}
|
|
93158
|
+
if (options?.keyName && options?.keyValue) {
|
|
93159
|
+
xhr.setRequestHeader(options.keyName, options.keyValue);
|
|
93160
|
+
}
|
|
93161
|
+
xhr.send();
|
|
93162
|
+
if (xhr.status < 200 || xhr.status >= 300) {
|
|
93163
|
+
throw new Error(`webread: HTTP ${xhr.status} for ${url}`);
|
|
93164
|
+
}
|
|
93165
|
+
return xhr.responseText;
|
|
93166
|
+
}
|
|
93167
|
+
unzip(zipfilename, outputfolder) {
|
|
93168
|
+
zipfilename = filterUrl(zipfilename);
|
|
93169
|
+
const zipData = this.vfs.readFile(zipfilename);
|
|
93170
|
+
this.vfs.mkdir(outputfolder);
|
|
93171
|
+
const files = unzipSync(zipData);
|
|
93172
|
+
const extracted = [];
|
|
93173
|
+
for (const [entryName, fileData] of Object.entries(files)) {
|
|
93174
|
+
if (entryName.endsWith("/")) {
|
|
93175
|
+
this.vfs.mkdir(outputfolder + "/" + entryName);
|
|
93176
|
+
continue;
|
|
93177
|
+
}
|
|
93178
|
+
const outPath = outputfolder + "/" + entryName;
|
|
93179
|
+
const lastSlash = outPath.lastIndexOf("/");
|
|
93180
|
+
if (lastSlash > 0) {
|
|
93181
|
+
this.vfs.mkdir(outPath.slice(0, lastSlash));
|
|
93182
|
+
}
|
|
93183
|
+
this.vfs.writeFile(outPath, fileData);
|
|
93184
|
+
extracted.push(this.vfs.normalizePath(outPath));
|
|
93185
|
+
}
|
|
93186
|
+
return extracted;
|
|
93187
|
+
}
|
|
93188
|
+
/** Get the VFS changes for syncing back to the main thread. */
|
|
93189
|
+
getChanges() {
|
|
93190
|
+
for (const [, entry] of this.openFiles) {
|
|
93191
|
+
this.flushEntry(entry);
|
|
93192
|
+
}
|
|
93193
|
+
return this.vfs.getChanges();
|
|
93194
|
+
}
|
|
93195
|
+
getEntry(fid) {
|
|
93196
|
+
return this.openFiles.get(fid);
|
|
93197
|
+
}
|
|
93198
|
+
flushEntry(entry) {
|
|
93199
|
+
if (entry.dirty) {
|
|
93200
|
+
const finalData = entry.dataLen === entry.data.length ? entry.data : entry.data.subarray(0, entry.dataLen);
|
|
93201
|
+
this.vfs.writeFile(entry.path, finalData);
|
|
93202
|
+
entry.dirty = false;
|
|
93203
|
+
}
|
|
93204
|
+
}
|
|
93205
|
+
writeBytes(entry, bytes) {
|
|
93206
|
+
const needed = entry.pos + bytes.length;
|
|
93207
|
+
if (needed > entry.data.length) {
|
|
93208
|
+
const newSize = Math.max(needed, entry.data.length * 2, 256);
|
|
93209
|
+
const newData = new Uint8Array(newSize);
|
|
93210
|
+
newData.set(entry.data.subarray(0, entry.dataLen));
|
|
93211
|
+
entry.data = newData;
|
|
93212
|
+
}
|
|
93213
|
+
entry.data.set(bytes, entry.pos);
|
|
93214
|
+
entry.pos += bytes.length;
|
|
93215
|
+
if (entry.pos > entry.dataLen) {
|
|
93216
|
+
entry.dataLen = entry.pos;
|
|
93217
|
+
}
|
|
93218
|
+
entry.dirty = true;
|
|
93219
|
+
}
|
|
93220
|
+
/**
|
|
93221
|
+
* `entry.pos` stays the logical (consumed) byte position: the text buffer
|
|
93222
|
+
* holds the bytes starting at `entry.pos`, and consuming a line advances
|
|
93223
|
+
* `entry.pos` by its byte length. This keeps fgetl/fgets coherent with
|
|
93224
|
+
* freadBytes/fseek/ftell (and fscanf, which mixes the two).
|
|
93225
|
+
*/
|
|
93226
|
+
readLine(entry, keepNewline) {
|
|
93227
|
+
while (!entry.eof) {
|
|
93228
|
+
const nlIdx2 = entry.buffer.indexOf("\n");
|
|
93229
|
+
if (nlIdx2 !== -1) break;
|
|
93230
|
+
const bufStart = entry.pos + TEXT_ENCODER.encode(entry.buffer).length;
|
|
93231
|
+
const available = entry.dataLen - bufStart;
|
|
93232
|
+
if (available <= 0) {
|
|
93233
|
+
entry.eof = true;
|
|
93234
|
+
break;
|
|
93235
|
+
}
|
|
93236
|
+
const toRead = Math.min(READ_CHUNK_SIZE, available);
|
|
93237
|
+
const chunk = entry.data.subarray(bufStart, bufStart + toRead);
|
|
93238
|
+
entry.buffer += TEXT_DECODER.decode(chunk, { stream: true });
|
|
93239
|
+
}
|
|
93240
|
+
if (entry.buffer.length === 0) {
|
|
93241
|
+
return -1;
|
|
93242
|
+
}
|
|
93243
|
+
const nlIdx = entry.buffer.indexOf("\n");
|
|
93244
|
+
if (nlIdx !== -1) {
|
|
93245
|
+
const consumed = entry.buffer.slice(0, nlIdx + 1);
|
|
93246
|
+
const line2 = keepNewline ? consumed : entry.buffer.slice(0, nlIdx);
|
|
93247
|
+
entry.buffer = entry.buffer.slice(nlIdx + 1);
|
|
93248
|
+
entry.pos += TEXT_ENCODER.encode(consumed).length;
|
|
93249
|
+
return line2;
|
|
93250
|
+
}
|
|
93251
|
+
const line = entry.buffer;
|
|
93252
|
+
entry.buffer = "";
|
|
93253
|
+
entry.pos += TEXT_ENCODER.encode(line).length;
|
|
93254
|
+
return line;
|
|
93255
|
+
}
|
|
93256
|
+
listDirGlob(pattern) {
|
|
93257
|
+
const norm2 = this.vfs.normalizePath(pattern);
|
|
93258
|
+
const lastSlash = norm2.lastIndexOf("/");
|
|
93259
|
+
const dir = lastSlash >= 0 ? norm2.slice(0, lastSlash) : "/";
|
|
93260
|
+
const globPat = lastSlash >= 0 ? norm2.slice(lastSlash + 1) : norm2;
|
|
93261
|
+
const re = new RegExp(
|
|
93262
|
+
"^" + globPat.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*").replace(/\?/g, ".") + "$"
|
|
93263
|
+
);
|
|
93264
|
+
const entries = this.vfs.listDir(dir);
|
|
93265
|
+
return entries.filter(
|
|
93266
|
+
(e) => e.name !== "." && e.name !== ".." && re.test(e.name)
|
|
93267
|
+
);
|
|
93268
|
+
}
|
|
93269
|
+
listDirRecursive(pattern) {
|
|
93270
|
+
const idx = pattern.indexOf("**");
|
|
93271
|
+
let baseDir = pattern.slice(0, idx);
|
|
93272
|
+
if (baseDir.endsWith("/")) baseDir = baseDir.slice(0, -1);
|
|
93273
|
+
if (!baseDir) baseDir = ".";
|
|
93274
|
+
const results = [];
|
|
93275
|
+
const walkDir = (dir) => {
|
|
93276
|
+
const entries = this.vfs.listDir(dir);
|
|
93277
|
+
results.push(...entries);
|
|
93278
|
+
for (const entry of entries) {
|
|
93279
|
+
if (entry.isdir && entry.name !== "." && entry.name !== "..") {
|
|
93280
|
+
walkDir(entry.folder + "/" + entry.name);
|
|
93281
|
+
}
|
|
93282
|
+
}
|
|
93283
|
+
};
|
|
93284
|
+
walkDir(this.vfs.normalizePath(baseDir));
|
|
93285
|
+
return results;
|
|
93286
|
+
}
|
|
93287
|
+
};
|
|
93288
|
+
function filterUrl(url) {
|
|
93289
|
+
if (/^https:\/\/github\.com\/.+\/releases\/download\/.+/.test(url)) {
|
|
93290
|
+
url = url.replace(
|
|
93291
|
+
"https://github.com/",
|
|
93292
|
+
"https://mip-cors-proxy.figurl.workers.dev/gh/"
|
|
93293
|
+
);
|
|
93294
|
+
url += url.includes("?") ? "&" : "?";
|
|
93295
|
+
url += "t=" + Date.now();
|
|
93296
|
+
}
|
|
93297
|
+
return url;
|
|
93298
|
+
}
|
|
93299
|
+
|
|
93300
|
+
// src/vfs/BrowserSystemAdapter.ts
|
|
93301
|
+
var BrowserSystemAdapter = class {
|
|
93302
|
+
vars = /* @__PURE__ */ new Map();
|
|
93303
|
+
vfs = null;
|
|
93304
|
+
// Used only when no VFS is attached (e.g. tests that don't need files).
|
|
93305
|
+
fallbackCwd = "/";
|
|
93306
|
+
constructor(vfs) {
|
|
93307
|
+
if (vfs) this.vfs = vfs;
|
|
93308
|
+
}
|
|
93309
|
+
/** Attach (or replace) the VFS used as the cwd source of truth. */
|
|
93310
|
+
setVfs(vfs) {
|
|
93311
|
+
this.vfs = vfs;
|
|
93312
|
+
}
|
|
93313
|
+
getEnv(name) {
|
|
93314
|
+
return this.vars.get(name);
|
|
93315
|
+
}
|
|
93316
|
+
getAllEnv() {
|
|
93317
|
+
const result = {};
|
|
93318
|
+
for (const [k, v] of this.vars) {
|
|
93319
|
+
result[k] = v;
|
|
93320
|
+
}
|
|
93321
|
+
return result;
|
|
93322
|
+
}
|
|
93323
|
+
setEnv(name, value) {
|
|
93324
|
+
this.vars.set(name, value);
|
|
93325
|
+
}
|
|
93326
|
+
cwd() {
|
|
93327
|
+
return this.vfs ? this.vfs.getCwd() : this.fallbackCwd;
|
|
93328
|
+
}
|
|
93329
|
+
chdir(dir) {
|
|
93330
|
+
if (this.vfs) {
|
|
93331
|
+
this.vfs.setCwd(dir);
|
|
93332
|
+
} else {
|
|
93333
|
+
this.fallbackCwd = dir.startsWith("/") ? dir : this.fallbackCwd.replace(/\/$/, "") + "/" + dir;
|
|
93334
|
+
}
|
|
93335
|
+
}
|
|
93336
|
+
platform() {
|
|
93337
|
+
return "linux";
|
|
93338
|
+
}
|
|
93339
|
+
arch() {
|
|
93340
|
+
return "x64";
|
|
93341
|
+
}
|
|
93342
|
+
};
|
|
91328
93343
|
export {
|
|
93344
|
+
BrowserFileIOAdapter,
|
|
93345
|
+
BrowserSystemAdapter,
|
|
91329
93346
|
RTV,
|
|
91330
93347
|
RuntimeError,
|
|
93348
|
+
VirtualFileSystem,
|
|
91331
93349
|
displayValue,
|
|
91332
93350
|
executeCode,
|
|
91333
93351
|
loadQhullNodeBackend as loadDelaunayBackend,
|