Skip to content

Part of debug info missed for template function #2686

@JesseCodeBones

Description

@JesseCodeBones

Bug description

After compilation, some debug info (sourcemap) missed for $assembly/index/testFoo<assembly/index/AA|null> funciton.

I prepared a reproduce repo: https://github.com/JesseCodeBones/miss_debug_info
for this function, this part of debug info will be missed:

  if(v.length > 10) {
    return 2;
  } else {
    return 3;
  }

below is the output for function $assembly/index/testFoo<assembly/index/AA|null> and $assembly/index/testFoo<assembly/index/AA>

(func $assembly/index/testFoo<assembly/index/AA|null> (param $v i32) (result i32)
  (local $1 i32)
  (global.set $~lib/memory/__stack_pointer
   (i32.sub
    (global.get $~lib/memory/__stack_pointer)
    (i32.const 4)
   )
  )
  (call $~stack_check)
  (i32.store
   (global.get $~lib/memory/__stack_pointer)
   (i32.const 0)
  )
  ;;@ assembly/index.ts:6:28
  (if
   (i32.eq
    ;;@ assembly/index.ts:6:23
    (local.get $v)
    ;;@ assembly/index.ts:6:28
    (i32.const 0)
   )
   (block
    ;;@ assembly/index.ts:7:11
    (local.set $1
     (i32.const 1)
    )
    (global.set $~lib/memory/__stack_pointer
     (i32.add
      (global.get $~lib/memory/__stack_pointer)
      (i32.const 4)
     )
    )
    ;;@ assembly/index.ts:7:4
    (return
     (local.get $1)
    )
   )
  )
  (local.set $1
   (local.get $v)
  )
  (i32.store
   (global.get $~lib/memory/__stack_pointer)
   (local.get $1)
  )
  (if
   (i32.gt_s
    (call $assembly/index/AA#get:length <--------------------**from here the debug info missed ** 
     (local.get $1)
    )
    (i32.const 10)
   )
   (block
    (local.set $1
     (i32.const 2)
    )
    (global.set $~lib/memory/__stack_pointer
     (i32.add
      (global.get $~lib/memory/__stack_pointer)
      (i32.const 4)
     )
    )
    (return
     (local.get $1)
    )
   )
   (block
    (local.set $1
     (i32.const 3)
    )
    (global.set $~lib/memory/__stack_pointer
     (i32.add
      (global.get $~lib/memory/__stack_pointer)
      (i32.const 4)
     )
    )
    (return
     (local.get $1)
    )
   )
  )
 )

but debug info for $assembly/index/testFoo<assembly/index/AA> is good:

(func $assembly/index/testFoo<assembly/index/AA> (param $v i32) (result i32)
  (local $1 i32)
  (global.set $~lib/memory/__stack_pointer
   (i32.sub
    (global.get $~lib/memory/__stack_pointer)
    (i32.const 4)
   )
  )
  (call $~stack_check)
  (i32.store
   (global.get $~lib/memory/__stack_pointer)
   (i32.const 0)
  )
  ;;@ assembly/index.ts:6:6
  (drop
   (i32.const 0)
  )
  ;;@ assembly/index.ts:9:6
  (local.set $1
   (local.get $v)
  )
  (i32.store
   (global.get $~lib/memory/__stack_pointer)
   (local.get $1)
  )
  ;;@ assembly/index.ts:9:17
  (if
   (i32.gt_s
    ;;@ assembly/index.ts:9:6
    (call $assembly/index/AA#get:length
     (local.get $1)
    )
    ;;@ assembly/index.ts:9:17
    (i32.const 10)
   )
   (block
    ;;@ assembly/index.ts:10:11
    (local.set $1
     (i32.const 2)
    )
    (global.set $~lib/memory/__stack_pointer
     (i32.add
      (global.get $~lib/memory/__stack_pointer)
      (i32.const 4)
     )
    )
    ;;@ assembly/index.ts:10:4
    (return
     (local.get $1)
    )
   )
   (block
    ;;@ assembly/index.ts:12:11
    (local.set $1
     (i32.const 3)
    )
    (global.set $~lib/memory/__stack_pointer
     (i32.add
      (global.get $~lib/memory/__stack_pointer)
      (i32.const 4)
     )
    )
    ;;@ assembly/index.ts:12:4
    (return
     (local.get $1)
    )
   )
  )
 )

Steps to reproduce

  1. create AS file with below code:
 class AA {
  length: i32 = 1
}

function testFoo<T>(v: T): i32 {
  if (isNullable(v) && v == null) {
    return 1;
  }
  if (v.length > 10) {
    return 2;
  } else {
    return 3;
  }
}
export function testExport(): void {
  testFoo<AA | null>(null);
  const a = new AA();
  testFoo(a);
}

  1. run compile command: asc assembly/index.ts --debug --disable bulk-memory --sourceMap --textFile --outFile dist/test.wasm
  2. run [wasm-opt executable] dist/test.wasm -ism dist/test.wasm.map --print

AssemblyScript version

v0.27.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions