summaryrefslogtreecommitdiffstats
path: root/src/testdir/test_vim9_disassemble.vim
diff options
context:
space:
mode:
Diffstat (limited to 'src/testdir/test_vim9_disassemble.vim')
-rw-r--r--src/testdir/test_vim9_disassemble.vim68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index 89dcceed57..7746b23b41 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -1761,6 +1761,74 @@ def Test_disassemble_typecast()
instr)
enddef
+def Test_disassemble_object_cast()
+ # Downcasting.
+ var lines =<< trim END
+ vim9script
+ class A
+ endclass
+ class B extends A
+ var mylen: number
+ endclass
+ def F(o: A): number
+ return (<B>o).mylen
+ enddef
+
+ g:instr = execute('disassemble F')
+ END
+ v9.CheckScriptSuccess(lines)
+ assert_match('\<SNR>\d*_F\_s*' ..
+ 'return (<B>o).mylen\_s*' ..
+ '0 LOAD arg\[-1\]\_s*' ..
+ '1 CHECKTYPE object<B> stack\[-1\]\_s*' ..
+ '2 OBJ_MEMBER 0\_s*' ..
+ '3 RETURN\_s*',
+ g:instr)
+
+ # Upcasting.
+ lines =<< trim END
+ vim9script
+ class A
+ var mylen: number
+ endclass
+ class B extends A
+ endclass
+ def F(o: B): number
+ return (<A>o).mylen
+ enddef
+
+ g:instr = execute('disassemble F')
+ END
+ v9.CheckScriptSuccess(lines)
+ assert_match('\<SNR>\d*_F\_s*' ..
+ 'return (<A>o).mylen\_s*' ..
+ '0 LOAD arg\[-1\]\_s*' ..
+ '1 OBJ_MEMBER 0\_s*' ..
+ '2 RETURN\_s*',
+ g:instr)
+
+ # Casting, type is not statically known.
+ lines =<< trim END
+ vim9script
+ class A
+ endclass
+ class B extends A
+ endclass
+ def F(o: any): any
+ return <A>o
+ enddef
+
+ g:instr = execute('disassemble F')
+ END
+ v9.CheckScriptSuccess(lines)
+ assert_match('\<SNR>\d*_F\_s*' ..
+ 'return <A>o\_s*' ..
+ '0 LOAD arg\[-1\]\_s*' ..
+ '1 CHECKTYPE object<A> stack\[-1\]\_s*' ..
+ '2 RETURN\_s*',
+ g:instr)
+enddef
+
def s:Computing()
var nr = 3
var nrres = nr + 7