id(); if ($debug) print $ret . "\n"; check::equal($ret, $expected, "#1 failed"); # Polymorphic call from C++ $caller = new Caller(); $caller->setCallback($person); $ret = $caller->call(); if ($debug) print $ret . "\n"; check::equal($ret, $expected, "#2 failed"); # Polymorphic call of object created in target language and passed to # C++ and back again $baseclass = $caller->baseClass(); $ret = $baseclass->id(); if ($debug) print $ret . "\n"; # TODO: Currently we do not track the dynamic type of returned # objects, so in case it's possible that the dynamic type is not equal # to the static type, we skip this check. if (get_parent_class($person) === false) check::equal($ret, $expected, "#3 failed"); $caller->resetCallback(); if ($debug) print "----------------------------------------\n"; } $person = new Person(); mycheck($person, "Person"); unset($person); $person = new Child(); mycheck($person, "Child"); unset($person); $person = new GrandChild(); mycheck($person, "GrandChild"); unset($person); $person = new TargetLangPerson(); mycheck($person, "TargetLangPerson"); unset($person); $person = new TargetLangChild(); mycheck($person, "TargetLangChild"); unset($person); $person = new TargetLangGrandChild(); mycheck($person, "TargetLangGrandChild"); unset($person); # Semis - don't override id() in target language $person = new TargetLangSemiPerson(); mycheck($person, "Person"); unset($person); $person = new TargetLangSemiChild(); mycheck($person, "Child"); unset($person); $person = new TargetLangSemiGrandChild(); mycheck($person, "GrandChild"); unset($person); # Orphans - don't override id() in C++ $person = new OrphanPerson(); mycheck($person, "Person"); unset($person); $person = new OrphanChild(); mycheck($person, "Child"); unset($person); $person = new TargetLangOrphanPerson(); mycheck($person, "TargetLangOrphanPerson"); unset($person); $person = new TargetLangOrphanChild(); mycheck($person, "TargetLangOrphanChild"); unset($person); check::done(); ?>