🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Dave Nichols Thu, 07 Dec 1989 00:05
pointers to member functions on convex
#688
Author: Dave Nichols
Date: Thu, 07 Dec 1989 00:05
130 lines
4720 bytes
 A problem with pointers to member functions ?

 g++ 1.36.2- + patches posted in gnu.g++.bug ( also fails with 1.36.0 )
 Running on a convex-c1 (convex unix 7.1), collect2 is used for loading.

 tm.h@ -> ./config/tm-convex1.h
 md@ -> ./config/convex.md

 This code is derived from the squares demo in Interviews, there appears to 
 be problem with pointers to member functions when vtbls are used.
 
 If the code is compiled with -Dvtbl ( which forces the class to have a
 virtual function table ) it fails, see below.

 This code works fine ether way on a sun4 and a DECstation3100.
  

Script started on Wed Dec  6 14:18:33 1989

hanauma 301> cat testdn.c

#include <stream.h>

class SquaresFrame;

typedef void (SquaresFrame::*MenuFunc)();

class SquaresFrame  {
public:
	SquaresFrame();
	void DoCommands( MenuFunc[], int );

	void Print1();
#ifdef vtbl	
	virtual void Print2();
#else
	void Print2();
#endif
};


SquaresFrame::SquaresFrame () { }

void SquaresFrame::DoCommands( MenuFunc funcs[], int num ) {
    for (int i = 0; i <num ; i++) {
	 ( this->*funcs[i])();
    }
}

void SquaresFrame::Print1() { cout << "1 \n" ; }
void SquaresFrame::Print2() { cout << "2 \n" ; }



main() {

MenuFunc funclist[2] = {  &SquaresFrame::Print1 , &SquaresFrame::Print2 };

SquaresFrame* test= new SquaresFrame();

test->DoCommands(funclist,2);

}

****** The SquaresFrame class doesn't have a vtbl in this case  ********

hanauma 302> g++ -v -g -I/usr/local/include/g++-include testdn.c
g++ version 1.36.2- (based on GCC 1.36)
 /usr/local/lib/gcc-cpp -+ -v -I/usr/local/include/g++-include -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dconvex -Dparsec -Dunix -D__convex__ -D__parsec__ -D__unix__ testdn.c /usr/tmp/cc023439.cpp
GNU CPP version 1.36
 /usr/local/lib/gcc-cc1plus /usr/tmp/cc023439.cpp -quiet -dumpbase testdn.c -g -version -o /usr/tmp/cc023439.s
GNU C++ version 1.36.2- (based on GCC 1.36) (convex) compiled by GNU C version 1.36.
default target switches: -mc1
 as -o testdn.o /usr/tmp/cc023439.s
 /usr/local/lib/gcc-ld /lib/crt0.o testdn.o -lg++ /usr/local/lib/gcc-gnulib -lg -lc
hanauma 303> a.out
1 
2 


****** now force the SquaresFrame class to have a vtbl  ********

hanauma 304> g++ -v -g -I/usr/local/include/g++-include testdn.c -Dvtbl
g++ version 1.36.2- (based on GCC 1.36)
 /usr/local/lib/gcc-cpp -+ -v -Dvtbl -I/usr/local/include/g++-include -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dconvex -Dparsec -Dunix -D__convex__ -D__parsec__ -D__unix__ testdn.c /usr/tmp/cc023488.cpp
GNU CPP version 1.36
 /usr/local/lib/gcc-cc1plus /usr/tmp/cc023488.cpp -quiet -dumpbase testdn.c -g -version -o /usr/tmp/cc023488.s
GNU C++ version 1.36.2- (based on GCC 1.36) (convex) compiled by GNU C version 1.36.
default target switches: -mc1
 as -o testdn.o /usr/tmp/cc023488.s
 /usr/local/lib/gcc-ld /lib/crt0.o testdn.o -lg++ /usr/local/lib/gcc-gnulib -lg -lc

hanauma 305> a.out
Segmentation fault (core dumped)

hanauma 306> gdb a.out
GDB 3.4, Copyright (C) 1989 Free Software Foundation, Inc.
There is ABSOLUTELY NO WARRANTY for GDB; type "info warranty" for details.
GDB is free software and you are welcome to distribute copies of it
 under certain conditions; type "info copying" to see the conditions.
Reading symbol data from /sep/dave/test/g++/a.out...done.
Type "help" for a list of commands.
(gdb) run
Starting program: /sep/dave/test/g++/a.out 

Program received signal 11, Segmentation fault
0x80000000 in gen$soff ()
(gdb) where
#0  0x80000000 in gen$soff ()
#1  0x80001260 in DoCommands__12SquaresFramePPM12SquaresFrameFv_vi (...) (...)
#2  0x800013f2 in main (...) (...)
(gdb) up
Reading in symbols for testdn.c...done.
#1  0x80001260 in DoCommands__12SquaresFramePPM12SquaresFrameFv_vi ($this=(SquaresFrame *) 0x80019000, funcs=(MenuFunc *) 0xffffcda8, num=2) (testdn.c line 26)
26		 ( this->*funcs[i])();
(gdb) p funcs[0]
$1 = (MenuFunc) (MenuFunc) 268436047
(gdb) q
The program is running.  Quit anyway? (y or n) y


Notes
-----

(1) gdb on the convex never seems to print out the member functions nicely 
like it does on a sun4, this may or may not be related.

(2) If only one function is present (remove all references to print1 ) it
works fine.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads