Skip to content

Commit b5d927a

Browse files
committed
fbc: PROCPTR( UDT.member [, [VIRTUAL] [ANY|signature]] )
- minor corrections after merge of PROCPTR() updates in 0b8098f - PROCPTR( UDT.member, virtual ... ) returns zero based index in the virtual table - PROCPTR( UDT.member, virtual ... ) returns -1 special value for non-virtuals
1 parent 0b8098f commit b5d927a

File tree

4 files changed

+25
-34
lines changed

4 files changed

+25
-34
lines changed

changelog.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ Version 1.10.0
6767
- Add makefile option DISABLE_STDCXX_PATH to disable usnig gcc to search for some c++ library path
6868
- fbc: allow typename.member symbol checks for #ifdef / #ifndef / defined() where member can be a data field, static data field, nested type, constructor, destructor, property, operator (self-assignment, new, new[], delete, delete[], let, cast, for, step, next), or member procedure.
6969
- rtlib: dos: add "__fb_dos_no_dpmi_yield" variable to control calling "__dpmi_yield()" and prevent a crash under some dos extenders in dosbox
70-
- fbc: PROCPTR( UDT.member [, SUB|FUNCTION ...] ) to get a procedure pointer for type member procedures. If the member is abstract, then return 0 (null function pointer of the member procedure's call signature)
71-
- fbc: PROCPTR( UDT.member VIRTUAL [, SUB|FUNCTION ...] ) to get the offset (in bytes) in to the virtual table. If there is no virtual table entry (or no virtual table at all) then return the special value of -2147483648
70+
- fbc: PROCPTR( UDT.member [, ANY|SUB|FUNCTION ...] ) to get a procedure pointer for type member procedures. If the member is abstract, then return 0 (null function pointer of the member procedure's call signature)
71+
- fbc: PROCPTR( UDT.member [, VIRTUAL ANY|SUB|FUNCTION ...] ) to get the zero based index in the virtual table. If there is no virtual table entry (or no virtual table at all) then return the special value of -1
7272

7373
[fixed]
7474
- gas64: missing restoring of use of one virtual register on sqr for float (SARG)

src/compiler/parser-expr-unary.bas

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ private function hProcPtrBody _
492492
byval base_parent as FBSYMBOL ptr, _
493493
byval proc as FBSYMBOL ptr, _
494494
byval check_exact as boolean, _
495-
byval is_vtable_offset as integer _
495+
byval is_vtable_index as integer _
496496
) as ASTNODE ptr
497497

498498
assert( proc <> NULL )
@@ -525,18 +525,18 @@ private function hProcPtrBody _
525525
callback( proc )
526526
end if
527527

528-
if( is_vtable_offset ) then
528+
if( is_vtable_index ) then
529529
'' if not virtual or abstract then procedure doesn't exist in
530530
'' the virtual table. Don't throw an error, just return an
531531
'' invalid vtable offset. vtable offsets are something that
532532
'' the user will have to deal with anyway
533-
dim as integer vtableoffset = -2147483648u
533+
dim as integer vtableindex = -1
534534

535535
if( symbIsAbstract( proc ) or symbIsVirtual( proc ) ) then
536-
vtableoffset = ( symbProcGetVtableIndex( proc ) - 2 ) * env.pointersize
536+
vtableindex = ( symbProcGetVtableIndex( proc ) - 2 )
537537
endif
538538

539-
var expr = astNewCONSTi( vtableoffset )
539+
var expr = astNewCONSTi( vtableindex )
540540
return expr
541541
end if
542542

@@ -553,7 +553,7 @@ private function hProcPtrBody _
553553
return astBuildProcAddrof( proc )
554554
end function
555555

556-
'' PROCPTR '(' Proc ('('')')? VIRTUAL? ( ',' signature )? ')'
556+
'' PROCPTR '(' Proc ('('')')? ( ',' VIRTUAL? ( ANY|signature )? )? ')'
557557
function cProcPtrBody _
558558
( _
559559
byval dtype as integer, _
@@ -563,7 +563,7 @@ function cProcPtrBody _
563563
dim as FBSYMCHAIN ptr chain_ = any
564564
dim as FBSYMBOL ptr sym = any, base_parent = any
565565
dim as ASTNODE ptr expr = any
566-
dim as integer is_vtable_offset = FALSE
566+
dim as integer is_vtable_index = FALSE
567567

568568
if( dtype = FB_DATATYPE_STRUCT ) then
569569
base_parent = subtype
@@ -603,7 +603,7 @@ function cProcPtrBody _
603603

604604
'' VIRTUAL?
605605
if( lexGetToken( ) = FB_TK_VIRTUAL ) then
606-
is_vtable_offset = TRUE
606+
is_vtable_index = TRUE
607607
lexSkipToken( LEXCHECK_POST_SUFFIX )
608608
end if
609609

@@ -634,13 +634,13 @@ function cProcPtrBody _
634634
parser.ctxsym = subtype
635635
parser.ctx_dtype = dtype
636636

637-
expr = hProcPtrBody( base_parent, sym, is_exact, is_vtable_offset )
637+
expr = hProcPtrBody( base_parent, sym, is_exact, is_vtable_index )
638638

639639
parser.ctxsym = oldsym
640640
parser.ctx_dtype = old_dtype
641641

642642
else
643-
expr = hProcPtrBody( base_parent, sym, FALSE, is_vtable_offset )
643+
expr = hProcPtrBody( base_parent, sym, FALSE, is_vtable_index )
644644
end if
645645

646646
return expr
@@ -776,7 +776,7 @@ function cAddrOfExpression( ) as ASTNODE ptr
776776
hSkipUntil( CHAR_RPRNT, TRUE )
777777
end if
778778

779-
'' PROCPTR '(' Proc ('('')')? VIRTUAL? ( ',' signature )? ')'
779+
'' PROCPTR '(' Proc ('('')')? ( ',' VIRTUAL? ( ANY|signature )? )? ')'
780780
case FB_TK_PROCPTR
781781
lexSkipToken( LEXCHECK_POST_SUFFIX )
782782

tests/pointers/procptr-low-level-delegate.bas

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,38 +6,29 @@ SUITE( fbc_tests.pointers.procptr_low_level_delegate )
66

77
#macro decl_delegate( delegateName, typeName, procName, signature... )
88
type delegateName
9-
#if __FB_ARG_COUNT__( signature ) = 0
10-
proc as typeof( procptr( typeName.procName ) )
11-
#else
12-
proc as typeof( procptr( typeName.procName, signature ) )
13-
#endif
14-
ofst as integer
9+
proc as typeof( procptr( typeName.procName, signature ) )
10+
indx as integer
1511
inst as typeName ptr
1612
end type
1713
#endmacro
1814

1915
#macro init_delegate( delegate, instance, typeName, procName, signature... )
20-
#if __FB_ARG_COUNT__( signature ) = 0
21-
delegate.proc = procptr( typeName.procName )
22-
delegate.ofst = procptr( typeName.procName, virtual )
23-
#else
24-
delegate.proc = procptr( typeName.procName, signature )
25-
delegate.ofst = procptr( typeName.procName, virtual signature )
26-
#endif
16+
delegate.proc = procptr( typeName.procName )
17+
delegate.indx = procptr( typeName.procName, virtual )
2718
delegate.inst = instance
2819
#endmacro
2920

3021
#macro call_delegate( delegate, args... )
3122
__FB_IIF__( _
3223
__FB_ARG_COUNT__( args ) = 0, _
3324
iif( _
34-
delegate.ofst >= 0, _
35-
cptr( typeof(delegate.proc), (*cast( any ptr ptr ptr, delegate.inst ))[delegate.ofst\sizeof(any ptr)] ), _
25+
delegate.indx >= 0, _
26+
cptr( typeof(delegate.proc), (*cast( any ptr ptr ptr, delegate.inst ))[delegate.indx] ), _
3627
delegate.proc _
3728
)( *(delegate.inst) ), _
3829
iif( _
39-
delegate.ofst >= 0, _
40-
cptr( typeof(delegate.proc), (*cast( any ptr ptr ptr, delegate.inst ))[delegate.ofst\sizeof(any ptr)] ), _
30+
delegate.indx >= 0, _
31+
cptr( typeof(delegate.proc), (*cast( any ptr ptr ptr, delegate.inst ))[delegate.indx] ), _
4132
delegate.proc _
4233
)( *(delegate.inst), args ) _
4334
)

tests/pointers/procptr-virtual.bas

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,10 @@ SUITE( fbc_tests.pointers.procptr_virtual )
107107
#endmacro
108108

109109
TEST( offsets )
110-
const INDEX0 = sizeof(any ptr) * 0
111-
const INDEX1 = sizeof(any ptr) * 1
112-
const INDEX2 = sizeof(any ptr) * 2
113-
const INDEX_NONE = -2147483648
110+
const INDEX0 = 0
111+
const INDEX1 = 1
112+
const INDEX2 = 2
113+
const INDEX_NONE = -1
114114

115115
check_virtual_offset( T, proc1, INDEX_NONE ) '' non-virtual
116116
check_virtual_offset( T, proc2, INDEX_NONE ) '' non-virtual

0 commit comments

Comments
 (0)