String Escapes and Quotes

Status: JSON's escapes and \' implemented; JavaScript's other escapes are refused

A string is JSON's, between double quotes or between single quotes:

export default ["hello!", 'hello!'];

Between double quotes it is exactly JSON's string: JSON's escapes — \", \\, \/, \b, \f, \n, \r, \t, and \uXXXX — and no unescaped ", \ or C0 control character (U+0000 through U+001F). Between single quotes it is the same with the delimiters swapped: a " stands for itself, and \' is the one escape it adds, so 'it\'s' and "it's" are one string. Every other code point may stand raw in either quote, as in JSON: DEL (U+007F), the C1 controls (U+0080 through U+009F), U+FEFF, U+2028 and U+2029, and a code point above U+FFFF included. The quote is a spelling, not part of the value, and every output writes the string between double quotes.

\' stays refused between double quotes, where JavaScript accepts it, so a double-quoted string is always a JSON string. JavaScript's other spellings — the \v, \0, \xHH and \u{…} escapes, a raw TAB or other C0 control character, a line continuation — are refused in both quotes; see js-string-literals. Backtick-delimited template literals have their own expression syntax.

This holds at every string position of a module: a value, an object key, plain or in brackets, the key of a property access in brackets (o['k']), the path of an import statement and the value of its attribute — with { type: 'json' } is the attribute with { type: "json" } is.

Examples

The compiler demo offers the programs stringEscapes in module.f.js, each with its real output.

The demo on this page runs sample.f.js, this page's example as a function of one number — a JSON escape, \\' in single quotes, and a \\u escape, each string's length — with every output fjs compile makes of it: the expression graph (EDAG), the Rust and the WebAssembly that Rust builds to. Its Run button calls the default export with 0, 1 and 2, as JavaScript and as WebAssembly, and shows what each call returned or threw.

export default (...a) => ["tab\there", 'it\'s', "\u0041"][Number(a[0])].length;

Reference

Demo

In FunctionalScript

fjs compile accepts this module, and it runs as JavaScript and as WebAssembly alike.

A FunctionalScript module and what fjs compile makes of it: the expression graph it lowers to, the Rust it compiles to on the NaNVM runtime, and the WebAssembly that Rust builds to. Run calls its default export with 0, then 1, then 2, first as the JavaScript it already is and then as WebAssembly, and shows what each call returned or threw and how long one call takes, timed over 1000 calls.

FunctionalScript source:

/**
 * The example of [`README.md`](./README.md) (String Escapes and Quotes) as a
 * function of one number, for the page's WASM demo: a JSON escape, `\\'` in
 * single quotes, and a `\\u` escape, each string's length.
 *
 * @module
 */

/** @type {(...a: readonly number[]) => unknown} */
export default (...a) => ["tab\there", 'it\'s', "\u0041"][Number(a[0])].length;

Expression graph (EDAG) that fjs compile lowers it to:

=>lengthbody0..objkey."length".objidx[]012"tab\there""it's""A"Numberoperand.objidxrest0

The same graph, as fjs compile writes it to a .edag.data.js file:

export default ["{}",[[":","default",["=>",0,[],[".",[".",["[]",["tab\there","it's","A"]],["Number",[".",["rest"],0]]],"length"]]]]];

Rust that fjs compile writes from it, on the NaNVM runtime:

// @generated by `fjs compile`. Do not edit: recompile the source module instead.

use nanvm_lib::vm::unstable::{f64_any, string_any, string_key};
use nanvm_lib::vm::{Any, Array, IStaticFunction, ToAny, ToArray, ToObject};

#[rustfmt::skip]
#[allow(clippy::if_same_then_else)]
pub fn module<A: IStaticFunction>(_runtime: Any<A>) -> Result<Any<A>, Any<A>> {
    Ok([(string_key("default"), A::static_function(|_self, _args| {
        let _b264: Any<A> = _args.rest(0).to_any();
        Any::dot((Any::dot([string_any("tab\there"), string_any("it's"), string_any("A")].to_array().to_any(), (Any::number((Any::dot(_b264.clone(), f64_any(0x0000000000000000)).end())?))?).end())?, string_any("length")).end()
    }, 0, Array::default(), Some("(...$0)=>[\"tab\\there\",\"it's\",\"A\"][Number($0[0])].length")).to_any())].to_object().to_any())
}

WebAssembly text (WAT) of the functions compiled from this source, without the NaNVM runtime:

  (func $nanvm_demos::samples::string_escapes::module::<nanvm_lib::naive::Naive> (;589;) (type 1) (param i32 i32)
    (local i32 i32 i32 i32 i32 i32 i32)
    global.get $__stack_pointer
    i32.const 112
    i32.sub
    local.tee 2
    global.set $__stack_pointer
    local.get 2
    i32.const 255
    i32.store8 offset=40
    local.get 2
    i32.const 0
    i32.store16 offset=72
    local.get 2
    i32.const 1064816
    i32.store offset=68
    local.get 2
    i32.const 1064809
    i32.store offset=64
    local.get 2
    local.get 2
    i32.const 40
    i32.add
    i32.store offset=76
    local.get 2
    i32.const 24
    i32.add
    local.get 2
    i32.const 64
    i32.add
    call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::str::iter::EncodeUtf16, core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::Ok>, core::result::Result<core::convert::Infallible, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>> as alloc::rc::ToRcSlice<u16>>::to_rc_slice"
    local.get 2
    local.get 2
    i32.load offset=28
    local.tee 3
    i32.store offset=60
    local.get 2
    local.get 2
    i32.load offset=24
    local.tee 4
    i32.store offset=56
    block ;; label = @1
      local.get 2
      i32.load8_u offset=40
      local.tee 5
      i32.const 255
      i32.eq
      br_if 0 (;@1;)
      local.get 2
      i32.load offset=44
      local.set 0
      local.get 2
      i32.load offset=48
      local.set 3
      local.get 2
      i32.load offset=52
      local.set 1
      local.get 2
      i32.load16_u offset=41 align=1
      local.set 6
      local.get 2
      i32.load8_u offset=43
      local.set 7
      local.get 4
      local.get 4
      i32.load
      i32.const -1
      i32.add
      local.tee 8
      i32.store
      local.get 2
      local.get 7
      i32.store8 offset=38
      local.get 2
      local.get 6
      i32.store16 offset=36
      block ;; label = @2
        local.get 8
        br_if 0 (;@2;)
        local.get 2
        i32.const 56
        i32.add
        call $"<alloc::rc::Rc<[u16]>>::drop_slow"
      end
      local.get 2
      local.get 5
      i32.store8 offset=64
      local.get 2
      local.get 2
      i32.load16_u offset=36
      i32.store16 offset=65 align=1
      local.get 2
      local.get 2
      i32.load8_u offset=38
      i32.store8 offset=67
      local.get 2
      local.get 1
      i32.store offset=76
      local.get 2
      local.get 3
      i32.store offset=72
      local.get 2
      local.get 0
      i32.store offset=68
      i32.const 1065572
      i32.const 43
      local.get 2
      i32.const 64
      i32.add
      i32.const 1065556
      i32.const 1065616
      call $core::result::unwrap_failed
      unreachable
    end
    local.get 2
    i32.const 0
    i32.store8 offset=40
    local.get 2
    i32.const 16
    i32.add
    local.get 2
    i32.const 40
    i32.add
    call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::iter::sources::empty::Empty<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>, core::result::Result<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>, ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>>::to_rc_slice"
    local.get 2
    local.get 2
    i32.load offset=20
    local.tee 6
    i32.store offset=68
    local.get 2
    local.get 2
    i32.load offset=16
    local.tee 5
    i32.store offset=64
    block ;; label = @1
      block ;; label = @2
        local.get 2
        i32.load8_u offset=40
        i32.const 1
        i32.ne
        br_if 0 (;@2;)
        local.get 5
        local.get 5
        i32.load
        i32.const -1
        i32.add
        local.tee 0
        i32.store
        local.get 0
        br_if 1 (;@1;)
        local.get 2
        i32.const 64
        i32.add
        call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
        br 1 (;@1;)
      end
      local.get 5
      i32.eqz
      br_if 0 (;@1;)
      i32.const 173
      i32.const 0
      local.get 5
      local.get 6
      i32.const 1064901
      i32.const 55
      call $<nanvm_lib::naive::function::Function>::new
      local.set 5
      local.get 2
      i32.const 0
      i32.store8 offset=56
      local.get 2
      local.get 5
      i32.store offset=84
      local.get 2
      i32.const 7
      i32.store8 offset=80
      local.get 2
      local.get 3
      i32.store offset=76
      local.get 2
      local.get 4
      i32.store offset=72
      local.get 2
      i64.const 4294967296
      i64.store offset=64
      local.get 2
      local.get 2
      i32.const 56
      i32.add
      i32.store offset=96
      local.get 2
      i32.const 8
      i32.add
      local.get 2
      i32.const 64
      i32.add
      call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::array::iter::IntoIter<(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>), 1>, core::result::Result<(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>), ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>)>>::to_rc_slice"
      local.get 2
      local.get 2
      i32.load offset=12
      local.tee 4
      i32.store offset=44
      local.get 2
      local.get 2
      i32.load offset=8
      local.tee 5
      i32.store offset=40
      block ;; label = @2
        block ;; label = @3
          local.get 2
          i32.load8_u offset=56
          i32.const 1
          i32.ne
          br_if 0 (;@3;)
          local.get 5
          local.get 5
          i32.load
          i32.const -1
          i32.add
          local.tee 0
          i32.store
          local.get 0
          br_if 1 (;@2;)
          local.get 2
          i32.const 40
          i32.add
          call $"<alloc::rc::Rc<[(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>)]>>::drop_slow"
          br 1 (;@2;)
        end
        local.get 5
        i32.eqz
        br_if 0 (;@2;)
        local.get 0
        local.get 4
        i32.store offset=16
        local.get 0
        local.get 5
        i32.store offset=12
        local.get 0
        i32.const 5
        i32.store8 offset=8
        local.get 0
        i64.const 0
        i64.store
        local.get 1
        call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
        local.get 2
        i32.const 112
        i32.add
        global.set $__stack_pointer
        return
      end
      i32.const 1057428
      i32.const 43
      local.get 2
      i32.const 111
      i32.add
      i32.const 1057412
      i32.const 1057472
      call $core::result::unwrap_failed
      unreachable
    end
    i32.const 1057428
    i32.const 43
    local.get 2
    i32.const 111
    i32.add
    i32.const 1057412
    i32.const 1057472
    call $core::result::unwrap_failed
    unreachable
  )
  (func $"<nanvm_demos::samples::string_escapes::module<nanvm_lib::naive::Naive>::{closure#0} as core::ops::function::FnOnce<(&nanvm_lib::naive::function::Function, nanvm_lib::vm::array::Array<nanvm_lib::naive::Naive>)>>::call_once" (;590;) (type 4) (param i32 i32 i32 i32)
    (local i32 i32 i32 i32 i32 i32 i32 i32 f64)
    global.get $__stack_pointer
    i32.const 320
    i32.sub
    local.tee 4
    global.set $__stack_pointer
    local.get 4
    local.get 3
    i32.store offset=52
    local.get 4
    local.get 2
    i32.store offset=48
    local.get 2
    local.get 2
    i32.load
    i32.const 1
    i32.add
    local.tee 5
    i32.store
    block ;; label = @1
      block ;; label = @2
        block ;; label = @3
          block ;; label = @4
            local.get 5
            i32.eqz
            br_if 0 (;@4;)
            local.get 4
            local.get 3
            i32.store offset=64
            local.get 4
            local.get 2
            i32.store offset=60
            local.get 4
            i32.const 6
            i32.store8 offset=56
            local.get 4
            i32.const 255
            i32.store8 offset=184
            local.get 4
            i32.const 0
            i32.store16 offset=256
            local.get 4
            i32.const 1065654
            i32.store offset=252
            local.get 4
            i32.const 1065646
            i32.store offset=248
            local.get 4
            local.get 4
            i32.const 184
            i32.add
            i32.store offset=260
            local.get 4
            i32.const 40
            i32.add
            local.get 4
            i32.const 248
            i32.add
            call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::str::iter::EncodeUtf16, core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::Ok>, core::result::Result<core::convert::Infallible, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>> as alloc::rc::ToRcSlice<u16>>::to_rc_slice"
            local.get 4
            local.get 4
            i32.load offset=44
            local.tee 6
            i32.store offset=140
            local.get 4
            local.get 4
            i32.load offset=40
            local.tee 5
            i32.store offset=136
            block ;; label = @5
              local.get 4
              i32.load8_u offset=184
              local.tee 7
              i32.const 255
              i32.eq
              br_if 0 (;@5;)
              local.get 4
              i32.load offset=188
              local.set 2
              local.get 4
              i32.load offset=192
              local.set 0
              local.get 4
              i32.load offset=196
              local.set 3
              local.get 4
              i32.load16_u offset=185 align=1
              local.set 6
              local.get 4
              i32.load8_u offset=187
              local.set 8
              local.get 5
              local.get 5
              i32.load
              i32.const -1
              i32.add
              local.tee 9
              i32.store
              local.get 4
              local.get 8
              i32.store8 offset=90
              local.get 4
              local.get 6
              i32.store16 offset=88
              block ;; label = @6
                local.get 9
                br_if 0 (;@6;)
                local.get 4
                i32.const 136
                i32.add
                call $"<alloc::rc::Rc<[u16]>>::drop_slow"
              end
              local.get 4
              local.get 7
              i32.store8 offset=248
              local.get 4
              local.get 4
              i32.load16_u offset=88
              i32.store16 offset=249 align=1
              local.get 4
              local.get 4
              i32.load8_u offset=90
              i32.store8 offset=251
              local.get 4
              local.get 3
              i32.store offset=260
              local.get 4
              local.get 0
              i32.store offset=256
              local.get 4
              local.get 2
              i32.store offset=252
              i32.const 1065572
              i32.const 43
              local.get 4
              i32.const 248
              i32.add
              i32.const 1065556
              i32.const 1065616
              call $core::result::unwrap_failed
              unreachable
            end
            local.get 4
            i32.const 255
            i32.store8 offset=184
            local.get 4
            i32.const 0
            i32.store16 offset=256
            local.get 4
            i32.const 1065658
            i32.store offset=252
            local.get 4
            i32.const 1065654
            i32.store offset=248
            local.get 4
            local.get 4
            i32.const 184
            i32.add
            i32.store offset=260
            local.get 4
            i32.const 32
            i32.add
            local.get 4
            i32.const 248
            i32.add
            call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::str::iter::EncodeUtf16, core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::Ok>, core::result::Result<core::convert::Infallible, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>> as alloc::rc::ToRcSlice<u16>>::to_rc_slice"
            local.get 4
            local.get 4
            i32.load offset=36
            local.tee 9
            i32.store offset=140
            local.get 4
            local.get 4
            i32.load offset=32
            local.tee 7
            i32.store offset=136
            block ;; label = @5
              local.get 4
              i32.load8_u offset=184
              local.tee 8
              i32.const 255
              i32.eq
              br_if 0 (;@5;)
              local.get 4
              i32.load offset=188
              local.set 2
              local.get 4
              i32.load offset=192
              local.set 0
              local.get 4
              i32.load offset=196
              local.set 3
              local.get 4
              i32.load16_u offset=185 align=1
              local.set 5
              local.get 4
              i32.load8_u offset=187
              local.set 6
              local.get 7
              local.get 7
              i32.load
              i32.const -1
              i32.add
              local.tee 9
              i32.store
              local.get 4
              local.get 6
              i32.store8 offset=90
              local.get 4
              local.get 5
              i32.store16 offset=88
              block ;; label = @6
                local.get 9
                br_if 0 (;@6;)
                local.get 4
                i32.const 136
                i32.add
                call $"<alloc::rc::Rc<[u16]>>::drop_slow"
              end
              local.get 4
              local.get 8
              i32.store8 offset=248
              local.get 4
              local.get 4
              i32.load16_u offset=88
              i32.store16 offset=249 align=1
              local.get 4
              local.get 4
              i32.load8_u offset=90
              i32.store8 offset=251
              local.get 4
              local.get 3
              i32.store offset=260
              local.get 4
              local.get 0
              i32.store offset=256
              local.get 4
              local.get 2
              i32.store offset=252
              i32.const 1065572
              i32.const 43
              local.get 4
              i32.const 248
              i32.add
              i32.const 1065556
              i32.const 1065616
              call $core::result::unwrap_failed
              unreachable
            end
            local.get 4
            i32.const 255
            i32.store8 offset=184
            local.get 4
            i32.const 0
            i32.store16 offset=256
            local.get 4
            i32.const 1065659
            i32.store offset=252
            local.get 4
            i32.const 1065658
            i32.store offset=248
            local.get 4
            local.get 4
            i32.const 184
            i32.add
            i32.store offset=260
            local.get 4
            i32.const 24
            i32.add
            local.get 4
            i32.const 248
            i32.add
            call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::str::iter::EncodeUtf16, core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::Ok>, core::result::Result<core::convert::Infallible, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>> as alloc::rc::ToRcSlice<u16>>::to_rc_slice"
            local.get 4
            local.get 4
            i32.load offset=28
            local.tee 10
            i32.store offset=140
            local.get 4
            local.get 4
            i32.load offset=24
            local.tee 8
            i32.store offset=136
            block ;; label = @5
              local.get 4
              i32.load8_u offset=184
              local.tee 11
              i32.const 255
              i32.eq
              br_if 0 (;@5;)
              local.get 4
              i32.load offset=188
              local.set 2
              local.get 4
              i32.load offset=192
              local.set 0
              local.get 4
              i32.load offset=196
              local.set 3
              local.get 4
              i32.load16_u offset=185 align=1
              local.set 5
              local.get 4
              i32.load8_u offset=187
              local.set 7
              local.get 8
              local.get 8
              i32.load
              i32.const -1
              i32.add
              local.tee 6
              i32.store
              local.get 4
              local.get 7
              i32.store8 offset=90
              local.get 4
              local.get 5
              i32.store16 offset=88
              block ;; label = @6
                local.get 6
                br_if 0 (;@6;)
                local.get 4
                i32.const 136
                i32.add
                call $"<alloc::rc::Rc<[u16]>>::drop_slow"
              end
              local.get 4
              local.get 11
              i32.store8 offset=248
              local.get 4
              local.get 4
              i32.load16_u offset=88
              i32.store16 offset=249 align=1
              local.get 4
              local.get 4
              i32.load8_u offset=90
              i32.store8 offset=251
              local.get 4
              local.get 3
              i32.store offset=260
              local.get 4
              local.get 0
              i32.store offset=256
              local.get 4
              local.get 2
              i32.store offset=252
              i32.const 1065572
              i32.const 43
              local.get 4
              i32.const 248
              i32.add
              i32.const 1065556
              i32.const 1065616
              call $core::result::unwrap_failed
              unreachable
            end
            local.get 4
            i32.const 0
            i32.store8 offset=136
            local.get 4
            local.get 10
            i32.store offset=296
            local.get 4
            local.get 8
            i32.store offset=292
            local.get 4
            i32.const 3
            i32.store8 offset=288
            local.get 4
            local.get 9
            i32.store offset=280
            local.get 4
            local.get 7
            i32.store offset=276
            local.get 4
            i32.const 3
            i32.store8 offset=272
            local.get 4
            local.get 6
            i32.store offset=264
            local.get 4
            local.get 5
            i32.store offset=260
            local.get 4
            i32.const 3
            i32.store8 offset=256
            local.get 4
            i64.const 12884901888
            i64.store offset=248
            local.get 4
            local.get 4
            i32.const 136
            i32.add
            i32.store offset=304
            local.get 4
            i32.const 16
            i32.add
            local.get 4
            i32.const 248
            i32.add
            call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::array::iter::IntoIter<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>, 3>, core::result::Result<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>, ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>>::to_rc_slice"
            local.get 4
            local.get 4
            i32.load offset=20
            local.tee 7
            i32.store offset=188
            local.get 4
            local.get 4
            i32.load offset=16
            local.tee 5
            i32.store offset=184
            block ;; label = @5
              local.get 4
              i32.load8_u offset=136
              i32.const 1
              i32.ne
              br_if 0 (;@5;)
              local.get 5
              local.get 5
              i32.load
              i32.const -1
              i32.add
              local.tee 2
              i32.store
              local.get 2
              br_if 4 (;@1;)
              local.get 4
              i32.const 184
              i32.add
              call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
              br 4 (;@1;)
            end
            local.get 5
            i32.eqz
            br_if 3 (;@1;)
            local.get 4
            local.get 7
            i32.store offset=240
            local.get 4
            local.get 5
            i32.store offset=236
            local.get 4
            i32.const 6
            i32.store8 offset=232
            local.get 2
            local.get 2
            i32.load
            i32.const 1
            i32.add
            local.tee 5
            i32.store
            local.get 5
            i32.eqz
            br_if 0 (;@4;)
            local.get 4
            local.get 2
            i32.store offset=188
            local.get 4
            i32.const 6
            i32.store8 offset=184
            local.get 4
            local.get 3
            i64.extend_i32_u
            i64.store offset=192
            local.get 4
            i64.const 0
            i64.store offset=256
            local.get 4
            i32.const 2
            i32.store8 offset=248
            local.get 4
            i32.const 88
            i32.add
            local.get 4
            i32.const 184
            i32.add
            local.get 4
            i32.const 248
            i32.add
            call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
            block ;; label = @5
              block ;; label = @6
                local.get 4
                i32.load8_u offset=88
                i32.const 255
                i32.ne
                br_if 0 (;@6;)
                local.get 0
                local.get 4
                i64.load offset=104
                i64.store offset=16
                local.get 0
                local.get 4
                i64.load offset=96
                i64.store offset=8
                local.get 0
                i64.const 1
                i64.store
                local.get 4
                i32.const 232
                i32.add
                call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                br 1 (;@5;)
              end
              local.get 4
              local.get 4
              i64.load offset=112
              i64.store offset=272
              local.get 4
              local.get 4
              i64.load offset=104
              i64.store offset=264
              local.get 4
              local.get 4
              i64.load offset=96
              i64.store offset=256
              local.get 4
              local.get 4
              i64.load offset=88
              i64.store offset=248
              local.get 4
              i32.const 184
              i32.add
              local.get 4
              i32.const 248
              i32.add
              call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
              block ;; label = @6
                block ;; label = @7
                  local.get 4
                  i32.load8_u offset=184
                  i32.const 255
                  i32.eq
                  br_if 0 (;@7;)
                  local.get 4
                  local.get 4
                  i64.load offset=192
                  i64.store offset=128
                  local.get 4
                  local.get 4
                  i64.load offset=184
                  i64.store offset=120
                  br 1 (;@6;)
                end
                local.get 4
                i32.const 256
                i32.store16 offset=120
              end
              local.get 4
              i32.const 248
              i32.add
              call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
              local.get 4
              i32.const 264
              i32.add
              call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
              local.get 4
              i32.const 248
              i32.add
              local.get 4
              i32.const 120
              i32.add
              call $<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::to_numeric
              local.get 4
              f64.load offset=264
              local.set 12
              local.get 4
              i32.load offset=260
              local.set 3
              local.get 4
              i32.load offset=256
              local.set 5
              block ;; label = @6
                local.get 4
                i32.load offset=248
                br_if 0 (;@6;)
                block ;; label = @7
                  local.get 5
                  i32.const 1
                  i32.ne
                  br_if 0 (;@7;)
                  local.get 4
                  local.get 12
                  f64.store offset=252 align=4
                  local.get 4
                  local.get 3
                  i32.store offset=248
                  local.get 4
                  i32.const 248
                  i32.add
                  call $<nanvm_lib::vm::bigint::BigInt<nanvm_lib::naive::Naive>>::to_number
                  local.set 12
                  local.get 3
                  local.get 3
                  i32.load
                  i32.const -1
                  i32.add
                  local.tee 5
                  i32.store
                  local.get 5
                  br_if 0 (;@7;)
                  local.get 4
                  i32.const 248
                  i32.add
                  call $"<alloc::rc::Rc<[u64]>>::drop_slow"
                end
                local.get 4
                local.get 12
                f64.store offset=80
                local.get 4
                i32.const 2
                i32.store offset=72
                local.get 4
                i32.const 136
                i32.add
                local.get 4
                i32.const 232
                i32.add
                local.get 4
                i32.const 72
                i32.add
                call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
                block ;; label = @7
                  local.get 4
                  i32.load8_u offset=136
                  i32.const 255
                  i32.ne
                  br_if 0 (;@7;)
                  local.get 0
                  local.get 4
                  i64.load offset=152
                  i64.store offset=16
                  local.get 0
                  local.get 4
                  i64.load offset=144
                  i64.store offset=8
                  local.get 0
                  i64.const 1
                  i64.store
                  br 2 (;@5;)
                end
                local.get 4
                local.get 4
                i64.load offset=160
                i64.store offset=272
                local.get 4
                local.get 4
                i64.load offset=152
                i64.store offset=264
                local.get 4
                local.get 4
                i64.load offset=144
                i64.store offset=256
                local.get 4
                local.get 4
                i64.load offset=136
                i64.store offset=248
                local.get 4
                i32.const 184
                i32.add
                local.get 4
                i32.const 248
                i32.add
                call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
                block ;; label = @7
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=184
                    i32.const 255
                    i32.eq
                    br_if 0 (;@8;)
                    local.get 4
                    local.get 4
                    i64.load offset=192
                    i64.store offset=176
                    local.get 4
                    local.get 4
                    i64.load offset=184
                    i64.store offset=168
                    br 1 (;@7;)
                  end
                  local.get 4
                  i32.const 256
                  i32.store16 offset=168
                end
                local.get 4
                i32.const 248
                i32.add
                call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                local.get 4
                i32.const 264
                i32.add
                call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                local.get 4
                i32.const 255
                i32.store8 offset=184
                local.get 4
                i32.const 0
                i32.store16 offset=256
                local.get 4
                i32.const 1065643
                i32.store offset=252
                local.get 4
                i32.const 1065637
                i32.store offset=248
                local.get 4
                local.get 4
                i32.const 184
                i32.add
                i32.store offset=260
                local.get 4
                i32.const 8
                i32.add
                local.get 4
                i32.const 248
                i32.add
                call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::str::iter::EncodeUtf16, core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::Ok>, core::result::Result<core::convert::Infallible, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>> as alloc::rc::ToRcSlice<u16>>::to_rc_slice"
                local.get 4
                local.get 4
                i32.load offset=12
                local.tee 5
                i32.store offset=236
                local.get 4
                local.get 4
                i32.load offset=8
                local.tee 3
                i32.store offset=232
                block ;; label = @7
                  local.get 4
                  i32.load8_u offset=184
                  local.tee 7
                  i32.const 255
                  i32.eq
                  br_if 0 (;@7;)
                  local.get 4
                  i32.load offset=188
                  local.set 2
                  local.get 4
                  i32.load offset=192
                  local.set 0
                  local.get 4
                  i32.load offset=196
                  local.set 5
                  local.get 4
                  i32.load16_u offset=185 align=1
                  local.set 6
                  local.get 4
                  i32.load8_u offset=187
                  local.set 8
                  local.get 3
                  local.get 3
                  i32.load
                  i32.const -1
                  i32.add
                  local.tee 9
                  i32.store
                  local.get 4
                  local.get 8
                  i32.store8 offset=218
                  local.get 4
                  local.get 6
                  i32.store16 offset=216
                  block ;; label = @8
                    local.get 9
                    br_if 0 (;@8;)
                    local.get 4
                    i32.const 232
                    i32.add
                    call $"<alloc::rc::Rc<[u16]>>::drop_slow"
                  end
                  local.get 4
                  local.get 7
                  i32.store8 offset=248
                  local.get 4
                  local.get 4
                  i32.load16_u offset=216
                  i32.store16 offset=249 align=1
                  local.get 4
                  local.get 4
                  i32.load8_u offset=218
                  i32.store8 offset=251
                  local.get 4
                  local.get 5
                  i32.store offset=260
                  local.get 4
                  local.get 0
                  i32.store offset=256
                  local.get 4
                  local.get 2
                  i32.store offset=252
                  i32.const 1065572
                  i32.const 43
                  local.get 4
                  i32.const 248
                  i32.add
                  i32.const 1065556
                  i32.const 1065616
                  call $core::result::unwrap_failed
                  unreachable
                end
                local.get 4
                local.get 5
                i32.store offset=256
                local.get 4
                local.get 3
                i32.store offset=252
                local.get 4
                i32.const 3
                i32.store8 offset=248
                local.get 4
                i32.const 184
                i32.add
                local.get 4
                i32.const 168
                i32.add
                local.get 4
                i32.const 248
                i32.add
                call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
                block ;; label = @7
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=184
                    i32.const 255
                    i32.ne
                    br_if 0 (;@8;)
                    local.get 0
                    local.get 4
                    i64.load offset=200
                    i64.store offset=16
                    local.get 0
                    local.get 4
                    i64.load offset=192
                    i64.store offset=8
                    local.get 0
                    i64.const 1
                    i64.store
                    br 1 (;@7;)
                  end
                  local.get 4
                  local.get 4
                  i64.load offset=208
                  i64.store offset=272
                  local.get 4
                  local.get 4
                  i64.load offset=200
                  i64.store offset=264
                  local.get 4
                  local.get 4
                  i64.load offset=192
                  i64.store offset=256
                  local.get 4
                  local.get 4
                  i64.load offset=184
                  i64.store offset=248
                  local.get 4
                  i32.const 232
                  i32.add
                  local.get 4
                  i32.const 248
                  i32.add
                  call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
                  block ;; label = @8
                    block ;; label = @9
                      local.get 4
                      i32.load8_u offset=232
                      local.tee 3
                      i32.const 255
                      i32.ne
                      br_if 0 (;@9;)
                      i32.const 1
                      local.set 5
                      i32.const 0
                      local.set 3
                      br 1 (;@8;)
                    end
                    local.get 4
                    local.get 4
                    i64.load offset=234 align=2
                    i64.store offset=216
                    local.get 4
                    local.get 4
                    i64.load offset=240 align=2
                    i64.store offset=222 align=2
                    local.get 4
                    i32.load8_u offset=233
                    local.set 5
                  end
                  local.get 4
                  i32.const 248
                  i32.add
                  call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 4
                  i32.const 264
                  i32.add
                  call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 0
                  local.get 5
                  i32.store8 offset=9
                  local.get 0
                  local.get 3
                  i32.store8 offset=8
                  local.get 0
                  i64.const 0
                  i64.store
                  local.get 0
                  local.get 4
                  i64.load offset=216
                  i64.store offset=10 align=2
                  local.get 0
                  local.get 4
                  i64.load offset=222 align=2
                  i64.store offset=16 align=2
                end
                local.get 4
                i32.const 56
                i32.add
                call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                local.get 2
                local.get 2
                i32.load
                i32.const -1
                i32.add
                local.tee 0
                i32.store
                local.get 0
                br_if 4 (;@2;)
                br 3 (;@3;)
              end
              local.get 0
              local.get 12
              f64.store offset=16
              local.get 0
              local.get 3
              i32.store offset=12
              local.get 0
              local.get 5
              i32.store offset=8
              local.get 0
              i64.const 1
              i64.store
              local.get 4
              i32.const 232
              i32.add
              call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
            end
            local.get 4
            i32.const 56
            i32.add
            call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
            local.get 2
            local.get 2
            i32.load
            i32.const -1
            i32.add
            local.tee 0
            i32.store
            local.get 0
            i32.eqz
            br_if 1 (;@3;)
            br 2 (;@2;)
          end
          unreachable
        end
        local.get 4
        i32.const 48
        i32.add
        call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
      end
      local.get 4
      i32.const 320
      i32.add
      global.set $__stack_pointer
      return
    end
    i32.const 1057428
    i32.const 43
    local.get 4
    i32.const 319
    i32.add
    i32.const 1057412
    i32.const 1057472
    call $core::result::unwrap_failed
    unreachable
  )

Emergent Testing

Idle. Press Run to start the suite.

  • ./proof.f.mjs