[omniORB] bug making DynAny from any holding alias to sequence of obj refs

James Riden jamesr@harlequin.co.uk
13 Mar 2000 16:33:42 +0000


Dear omniORBers,

I think I've found a problem with DynAnys in omniORB 2.8 (latest CVS
checkout) on WinNT 4.0 / MSVC 5.0 SP 3. The following code illustrates
this: 

usage:
 collie% test.exe
 'IOR:01234567890ABCDEF'

in a new shell window do :

 collie% client.exe IOR:01234567890ABCDEF

in the first shell I get:

 Caught omniORB2 fatalException. This indicates a bug is caught within
 omniORB2. Please send a bug report.
 The exception was thrown in file: ..\typecode.cc, line 962

The reason given is "TypeCode_base::NP_aliasExpand() - should not have
been called".

cheers,
 James

=====

// begin bug.idl

module BugTest {

  interface Foo {
  };
  
  typedef sequence<Foo> Foos;

  interface FooServer
  {

    void passFoos(in any myAny);

  };

};

// eof bug.idl

// begin test.cpp

#include "bug.hh"
#include <omniORB2/omniORB.h>
#include <omniORB2/CORBA.h>

#include <iostream>

using namespace std;

static  CORBA::ORB_ptr orb;

class FooImpl : public BugTest::_sk_Foo
{
public:
  FooImpl()
  {};

  ~FooImpl()
  {};
};

class FooServerImpl : public BugTest::_sk_FooServer
{
public:
  FooServerImpl()
  {};

  ~FooServerImpl()
  {};

  void passFoos( const CORBA::Any& myAny )
  {
    try
    {
        CORBA::DynAny_var dyn_any = orb->create_dyn_any( myAny );
    }
    catch (omniORB::fatalException& ex)
    {
      cerr << "Caught omniORB2 fatalException. This indicates a bug is caught "
           << "within omniORB2.\nPlease send a bug report.\n"
           << "The exception was thrown in file: " << ex.file()
           << ", line " << ex.line() << "\n" ;      
    }

    return;
  }
};

int main(int argc, char **argv)
{
  orb = CORBA::ORB_init(argc,argv,"omniORB2");
  CORBA::BOA_ptr boa = orb->BOA_init(argc,argv,"omniORB2_BOA");

  FooServerImpl* fooserver = new FooServerImpl();

  fooserver->_obj_is_ready(boa);

  BugTest::FooServer_var myobjRef = fooserver->_this();
  CORBA::String_var p = orb->object_to_string(myobjRef);
  cerr << "'" << (char*)p << "'" << endl;

  boa->impl_is_ready();

  return 0;
}

// eof test.cpp

// begin client.cpp

#include "bug.hh"
#include <omniORB2/omniORB.h>
#include <omniORB2/CORBA.h>

#include <iostream>

using namespace std;

class FooImpl : public BugTest::Foo
{
public:
  FooImpl() {};
  ~FooImpl() {};
};

int main(int argc, char **argv)
{
  CORBA::ORB_ptr orb = CORBA::ORB_init(argc,argv,"omniORB2");
  CORBA::BOA_ptr boa = orb->BOA_init(argc,argv,"omniORB2_BOA");

  try {
    CORBA::Object_var obj = orb->string_to_object(argv[1]);
  
    BugTest::Foo_ptr elt1 = new FooImpl();

    BugTest::Foo_ptr elt2 = new FooImpl();
    
    BugTest::Foo* foo_array[] = { elt1, elt2 };
    
    BugTest::Foos foos = BugTest::Foos( 1, 1, (BugTest::Foo **) foo_array );

    CORBA::Any myAny;
    
    myAny <<= (&foos);
    
    BugTest::FooServer_var my_obj = BugTest::FooServer::_narrow( obj );
    
    my_obj->passFoos( myAny );
    
  }
  catch(...) {
    cerr << "Caught exception." << endl;
  } 

  return 0;
}

// eof client.cpp

// begin makefile

OMNI=c:\ORBs\omni
OMNIBIN=$(OMNI)\bin\x86_win32
OMNILIB=$(OMNI)\lib\x86_win32

all:	bug test

bug:    bugSK.cpp
	$(OMNIBIN)\omniidl2 -a bug.idl
	cl -c -GX bugSK.cpp -D__x86__ -D__NT__ -D__OSVERSION__=4 -D__WIN32__ -I$(OMNI)\include -o bugSK.o
	cl -c -GX bugDynSK.cpp -D__x86__ -D__NT__ -D__OSVERSION__=4 -D__WIN32__ -I$(OMNI)\include -o bugDynSK.o

test:	test.cpp
	cl -GX $(OMNILIB)\omniDynamic280_rt.lib $(OMNILIB)\omniORB280_rt.lib $(OMNILIB)\omnithread2_rt.lib test.cpp bugSK.obj bugDynSK.obj -D__x86__ -D__NT__ -D__OSVERSION__=4 -D__WIN32__ -I$(OMNI)\include 

client: client.cpp
	cl -GX $(OMNILIB)\omniDynamic280_rt.lib $(OMNILIB)\omniORB280_rt.lib $(OMNILIB)\omnithread2_rt.lib client.cpp bugSK.obj bugDynSK.obj -D__x86__ -D__NT__ -D__OSVERSION__=4 -D__WIN32__ -I$(OMNI)\include 

// eof makefile


-- 
James Riden
jamesr@harlequin.co.uk