Menu

#725 vtable lookups don't work-around sidefx, static method calls don't preserve sidefx

open
nobody
None
compiler
2015-12-08
2014-03-30
No

When a virtual member procedure or a static member procedure (or variable) is called (or accessed) on an object returned from a function, the function is called respectively twice or not at all!

Code to highlight the bug:

Type UDT Extends Object
  Declare Virtual Sub info_virtual ()
  Declare Static Sub info_static ()
  Static As Integer int_static
End Type
Dim As Integer UDT.int_static = 1
Virtual Sub UDT.info_virtual ()
  Print " UDT.info_virtual()"
  Print UDT.int_static
End Sub
Static Sub UDT.info_static ()
  Print " UDT.info_static()"
  Print UDT.int_static
End Sub

Function inc (Byref u As UDT) Byref As UDT
  Print " inc()"
  UDT.int_static += 1
  Return u
End Function

Dim As UDT u

Print "'Print UDT.int_static':"
Print UDT.int_static
Print
Print "'inc(u).info_virtual()':"
inc(u).info_virtual()      '' *** Bug : function inc() called twice!
Print
Print "'inc(u).info_static()':"
inc(u).info_static()      '' *** Bug : function inc() not called at all!
Print
Print "'Print inc(u).int_static':"
Print inc(u).int_static   '' *** Bug : function inc() not called at all!

Sleep

Output:

'Print UDT.int_static':
 1

'inc(u).info_virtual()':
 inc()
 inc()
 UDT.info_virtual()
 3

'inc(u).info_static()':
 UDT.info_static()
 3

'Print inc(u).int_static':
 3

Referring at forum from post http://www.freebasic.net/forum/viewtopic.php?p=196522#p196522

Related

Bugs: #732
Bugs: #789
Bugs: #865

Discussion

  • dkl

    dkl - 2015-12-08

    To clarify, there are two problems:

    • vtable lookups re-use (duplicate) the This argument expression without handling/working-around side-effects in it. Thus any functions in the This expression are being called twice, but shouldn't be.

    • static method calls delete the This argument expression without handling side-effects. Thus any functions in the This expression aren't being called but probably should be.

     
  • dkl

    dkl - 2015-12-08
    • summary: When accessing virtual/static member on object returned from function, this one is called twice/never! --> vtable lookups don't work-around sidefx, static method calls don't preserve sidefx
     

Log in to post a comment.