Subject: "*":: vs virtually inherited functions From: Lars Date: Wed, 17 Feb 1999 21:56:37 +0100 (MET) Type: Bug State: Done - corrected in 3.2.8-dev.151. See also: p-990217. If function 'f' is inherited in object o virtually several times, using parallel parent lines, a "*"::f in o may call f repeatedly. This may be C++ like, but imo consitutes a bug. Sunblood writes on this topic in p-990217: Eine Sache war mich nicht 100% klar, und zwar in dem "*":: fall (in insert_inherited()). Da steht weiter unter ein continue, das ich recht unlogisch fand, selbst bei dem alten verhalten. Lies dir bitte den kommentar durch und schau, ob ich recht hab oder nicht. diff -rc ldmud-dev-37/prolang.y ldmud-dev/prolang.y *** 6036,6044 **** --- 6050,6080 ---- !(prog2->variable_names[numvar2-1].flags & TYPE_MOD_VIRTUAL) ) { /* Inherited from a virtually inherited program */ + #if 0 /* The call for the virtually program itself should * be sufficent. */ + /* wieso???? ich hab wirklich keine ahnung wozu das gut sein soll + * + * wenn man verhindern will, dass mehrfach virtuell inheritete + * funktionen mehrfach aufgerufen werden, sollte man + * das selbst in lpc machen (is ja auch in c++ so) + * + * ausserdem: wenn ein programm mehrmals virtuell + * inherited wird, gibt es hier 2 alternativen: entweder man + * macht meinen neuen obigen test, was zur folge hat, dass + * die funktion in der klasse ueberhaupt nicht aufgerufen wird, + * oder man macht ihn nicht und ruft somit die funktion in + * allen zusaetzlichen inherits auf (also potentiell + * mehrfach) UND hat den bug a la ::f(), d.h. eigentlich + * ueberladene funktionen werden auch aufgerufen + * + * wenn ich mich jedoch irren sollte, nimm es wieder rein + */ continue; + #else + do --ip; while (ip->prog != prog2); + i -= ip2->function_index_offset; + #endif } } add_f_byte(F_CALL_EXPLICIT_INHERITED);