summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornanbor <nanbor@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2001-08-16 20:18:54 +0000
committernanbor <nanbor@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2001-08-16 20:18:54 +0000
commit1362b8f11e8335bf60d6d6fdc7b3fa2507b4fcdd (patch)
treee10ddae3c9ec12a1ad9cb91b525853b93ddfba9f
parentbdda74e8c68e6806b462e928d12a0f92f4a253f8 (diff)
downloadATCD-1362b8f11e8335bf60d6d6fdc7b3fa2507b4fcdd.tar.gz
ChangeLogTag:Thu Aug 16 15:16:18 2001 Nanbor Wang <nanbor@cs.wustl.edu>
-rw-r--r--TAO/ChangeLogs/ChangeLog-02a23
-rw-r--r--TAO/TAO_IDL/be/be_sequence.cpp57
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/buffer_type.cpp18
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_cs.cpp12
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/elemtype.cpp64
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ch.cpp24
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ci.cpp110
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_cs.cpp57
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ch.cpp24
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ci.cpp102
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_cs.cpp90
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/sequence_base.cpp46
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp124
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/sequence_ci.cpp119
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp67
-rw-r--r--TAO/TAO_IDL/be_include/be_sequence.h1
-rw-r--r--TAO/TAO_IDL/be_include/be_visitor_sequence/buffer_type.h2
-rw-r--r--TAO/TAO_IDL/be_include/be_visitor_sequence/cdr_op_cs.h6
-rw-r--r--TAO/TAO_IDL/be_include/be_visitor_sequence/elemtype.h2
-rw-r--r--TAO/TAO_IDL/be_include/be_visitor_sequence/sequence_base.h10
20 files changed, 635 insertions, 323 deletions
diff --git a/TAO/ChangeLogs/ChangeLog-02a b/TAO/ChangeLogs/ChangeLog-02a
index 6d2e2b2520a..e21f8a6e027 100644
--- a/TAO/ChangeLogs/ChangeLog-02a
+++ b/TAO/ChangeLogs/ChangeLog-02a
@@ -1,3 +1,26 @@
+Thu Aug 16 15:16:18 2001 Nanbor Wang <nanbor@cs.wustl.edu>
+
+ * TAO_IDL/be/be_sequence.cpp:
+ * TAO_IDL/be/be_visitor_sequence/buffer_type.cpp:
+ * TAO_IDL/be/be_visitor_sequence/cdr_op_cs.cpp:
+ * TAO_IDL/be/be_visitor_sequence/elemtype.cpp:
+ * TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ch.cpp:
+ * TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ci.cpp:
+ * TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_cs.cpp:
+ * TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ch.cpp:
+ * TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ci.cpp:
+ * TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_cs.cpp:
+ * TAO_IDL/be/be_visitor_sequence/sequence_base.cpp:
+ * TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp:
+ * TAO_IDL/be/be_visitor_sequence/sequence_ci.cpp:
+ * TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp:
+ * TAO_IDL/be_include/be_sequence.h:
+ * TAO_IDL/be_include/be_visitor_sequence/buffer_type.h:
+ * TAO_IDL/be_include/be_visitor_sequence/cdr_op_cs.h:
+ * TAO_IDL/be_include/be_visitor_sequence/elemtype.h:
+ * TAO_IDL/be_include/be_visitor_sequence/sequence_base.h: Allowed
+ using valuetypes in sequences. This is required by the CCM IDL.
+
Mon Aug 13 16:48:05 2001 Nanbor Wang <nanbor@cs.wustl.edu>
* tao/Sequence_T.h:
diff --git a/TAO/TAO_IDL/be/be_sequence.cpp b/TAO/TAO_IDL/be/be_sequence.cpp
index b166fc951f7..962ee7d8a9e 100644
--- a/TAO/TAO_IDL/be/be_sequence.cpp
+++ b/TAO/TAO_IDL/be/be_sequence.cpp
@@ -39,15 +39,15 @@ be_sequence::be_sequence (AST_Expression *v,
AST_Type *t,
idl_bool local,
idl_bool abstract)
- : AST_Sequence (v,
- t,
- t->is_local () || local,
+ : AST_Sequence (v,
+ t,
+ t->is_local () || local,
abstract),
AST_Decl (AST_Decl::NT_sequence,
0,
0,
I_TRUE),
- COMMON_Base (t->is_local () || local,
+ COMMON_Base (t->is_local () || local,
abstract),
mt_ (be_sequence::MNG_UNKNOWN)
{
@@ -66,8 +66,8 @@ be_sequence::gen_name (void)
be_type *bt = 0; // Base type.
// Reset the buffer.
- ACE_OS::memset (namebuf,
- '\0',
+ ACE_OS::memset (namebuf,
+ '\0',
NAMEBUFSIZE);
// Retrieve the base type.
@@ -108,14 +108,14 @@ be_sequence::gen_name (void)
UTL_Scope *parent = this->defined_in ();
seq->set_defined_in (parent);
parent->add_sequence (seq);
- ACE_OS::sprintf (namebuf,
- "_tao_seq_%s",
+ ACE_OS::sprintf (namebuf,
+ "_tao_seq_%s",
seq->gen_name ());
}
else
{
- ACE_OS::sprintf (namebuf,
- "_tao_seq_%s",
+ ACE_OS::sprintf (namebuf,
+ "_tao_seq_%s",
bt->local_name ()->get_string ());
}
@@ -220,8 +220,18 @@ be_sequence::managed_type (void)
{
case AST_Decl::NT_interface:
case AST_Decl::NT_interface_fwd:
- this->mt_ = be_sequence::MNG_OBJREF;
- break;
+ {
+ be_interface *bf = be_interface::narrow_from_decl (prim_type);
+ if (bf->is_valuetype ())
+ {
+ this->mt_ = be_sequence::MNG_VALUE;
+ }
+ else
+ {
+ this->mt_ = be_sequence::MNG_OBJREF;
+ }
+ break;
+ }
case AST_Decl::NT_string:
this->mt_ = be_sequence::MNG_STRING;
break;
@@ -230,7 +240,7 @@ be_sequence::managed_type (void)
break;
case AST_Decl::NT_pre_defined:
{
- be_predefined_type *bpd =
+ be_predefined_type *bpd =
be_predefined_type::narrow_from_decl (prim_type);
if (bpd->pt () == AST_PredefinedType::PT_pseudo)
@@ -292,8 +302,8 @@ const char *
be_sequence::instance_name ()
{
static char namebuf[NAMEBUFSIZE];
- ACE_OS::memset (namebuf,
- '\0',
+ ACE_OS::memset (namebuf,
+ '\0',
NAMEBUFSIZE);
be_type *bt = 0;
@@ -340,6 +350,21 @@ be_sequence::instance_name ()
this->max_size ()->ev ()->u.ulval);
}
break;
+ case be_sequence::MNG_VALUE:
+ if (this->unbounded ())
+ {
+ ACE_OS::sprintf (namebuf,
+ "_TAO_Unbounded_Valuetype_Sequence_%s",
+ this->flat_name ());
+ }
+ else
+ {
+ ACE_OS::sprintf (namebuf,
+ "_TAO_Bounded_Valuetype_Sequence_%s_%lu",
+ this->flat_name (),
+ this->max_size ()->ev ()->u.ulval);
+ }
+ break;
case be_sequence::MNG_STRING:
if (this->unbounded ())
{
@@ -374,7 +399,7 @@ be_sequence::instance_name ()
be_predefined_type *predef =
be_predefined_type::narrow_from_decl (prim_type);
- if (predef != 0
+ if (predef != 0
&& predef->pt() == AST_PredefinedType::PT_octet)
{
ACE_OS::sprintf (namebuf,
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/buffer_type.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/buffer_type.cpp
index 8c71efb085c..a00c048e0e6 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/buffer_type.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/buffer_type.cpp
@@ -18,9 +18,9 @@
//
// ============================================================================
-#include "idl.h"
-#include "idl_extern.h"
-#include "be.h"
+#include "idl.h"
+#include "idl_extern.h"
+#include "be.h"
#include "be_visitor_sequence.h"
@@ -100,6 +100,18 @@ be_visitor_sequence_buffer_type::visit_interface_fwd (be_interface_fwd *node)
}
int
+be_visitor_sequence_buffer_type::visit_valuetype (be_valuetype *node)
+{
+ return this->visit_interface (node);
+}
+
+int
+be_visitor_sequence_buffer_type::visit_valuetype_fwd (be_valuetype_fwd *node)
+{
+ return this->visit_interface_fwd (node);
+}
+
+int
be_visitor_sequence_buffer_type::visit_string (be_string *node)
{
TAO_OutStream *os = this->ctx_->stream ();
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_cs.cpp
index 399992eadfb..3258ee8ddc0 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_cs.cpp
@@ -266,6 +266,18 @@ be_visitor_sequence_cdr_op_cs::visit_interface_fwd (be_interface_fwd *node)
}
int
+be_visitor_sequence_cdr_op_cs::visit_valuetype (be_valuetype *node)
+{
+ return this->visit_node (node);
+}
+
+int
+be_visitor_sequence_cdr_op_cs::visit_valuetype_fwd (be_valuetype_fwd *node)
+{
+ return this->visit_node (node);
+}
+
+int
be_visitor_sequence_cdr_op_cs::visit_predefined_type (be_predefined_type *node)
{
TAO_OutStream *os = this->ctx_->stream ();
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/elemtype.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/elemtype.cpp
index 7ce182d7966..49e2c399c6a 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/elemtype.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/elemtype.cpp
@@ -18,9 +18,9 @@
//
// ============================================================================
-#include "idl.h"
-#include "idl_extern.h"
-#include "be.h"
+#include "idl.h"
+#include "idl_extern.h"
+#include "be.h"
#include "be_visitor_sequence.h"
@@ -101,9 +101,9 @@ be_visitor_sequence_elemtype::visit_predefined_type (be_predefined_type *node)
break;
default:
if (this->ctx_->state () == TAO_CodeGen::TAO_SEQELEM_RETTYPE_CH)
- *os << bt->nested_type_name (this->ctx_->scope ()) << " &";
+ *os << bt->nested_type_name (this->ctx_->scope ()) << " &";
else
- *os << bt->name () << " &";
+ *os << bt->name () << " &";
}
return 0;
}
@@ -142,6 +142,33 @@ be_visitor_sequence_elemtype::visit_interface (be_interface *node)
}
int
+be_visitor_sequence_elemtype::visit_valuetype (be_valuetype *node)
+{
+ TAO_OutStream *os = this->ctx_->stream ();
+ be_type *bt;
+
+ if (this->ctx_->alias ())
+ bt = this->ctx_->alias ();
+ else
+ bt = node;
+
+ if (this->ctx_->state () == TAO_CodeGen::TAO_SEQELEM_RETTYPE_CH)
+ {
+ *os << "TAO_Valuetype_Manager<";
+ *os << bt->nested_type_name (this->ctx_->scope ()) << ", ";
+ *os << bt->nested_type_name (this->ctx_->scope (), "_var") << ">";
+ }
+ else
+ {
+ *os << "TAO_Valuetype_Manager<";
+ *os << bt->name () << ", ";
+ *os << bt->name () << "_var>";
+ }
+
+ return 0;
+}
+
+int
be_visitor_sequence_elemtype::visit_interface_fwd (be_interface_fwd *node)
{
TAO_OutStream *os = this->ctx_->stream ();
@@ -169,6 +196,33 @@ be_visitor_sequence_elemtype::visit_interface_fwd (be_interface_fwd *node)
}
int
+be_visitor_sequence_elemtype::visit_valuetype_fwd (be_valuetype_fwd *node)
+{
+ TAO_OutStream *os = this->ctx_->stream ();
+ be_type *bt;
+
+ if (this->ctx_->alias ())
+ bt = this->ctx_->alias ();
+ else
+ bt = node;
+
+ if (this->ctx_->state () == TAO_CodeGen::TAO_SEQELEM_RETTYPE_CH)
+ {
+ *os << "TAO_Valuetype_Manager<";
+ *os << bt->nested_type_name (this->ctx_->scope ()) << ",";
+ *os << bt->nested_type_name (this->ctx_->scope (), "_var") << ">";
+ }
+ else
+ {
+ *os << "TAO_Valuetype_Manager<";
+ *os << bt->name () << ",";
+ *os << bt->name () << "_var>";
+ }
+
+ return 0;
+}
+
+int
be_visitor_sequence_elemtype::visit_string (be_string *node)
{
TAO_OutStream *os = this->ctx_->stream ();
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ch.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ch.cpp
index f804c829f80..47bedc70227 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ch.cpp
@@ -20,7 +20,7 @@
//
// ============================================================================
-#include "be.h"
+#include "be.h"
#include "be_visitor_sequence.h"
@@ -113,6 +113,7 @@ be_visitor_sequence_ch::gen_bounded_obj_sequence (be_sequence *node)
&& prim && prim->pt () == AST_PredefinedType::PT_pseudo
&& ACE_OS::strcmp (prim->local_name ()->get_string (),
"Object") != 0;
+ int is_valuetype = 0;
// operator[]
if (is_pseudo_object)
@@ -121,7 +122,12 @@ be_visitor_sequence_ch::gen_bounded_obj_sequence (be_sequence *node)
}
else
{
- *os << "TAO_Object_Manager<";
+ be_interface *bf = be_interface::narrow_from_decl (pt);
+ is_valuetype = bf->is_valuetype ();
+ if (is_valuetype)
+ *os << "TAO_Valuetype_Manager<";
+ else
+ *os << "TAO_Object_Manager<";
}
*os << bt->name () << ","
@@ -171,16 +177,16 @@ be_visitor_sequence_ch::gen_bounded_obj_sequence (be_sequence *node)
<< "CORBA::ULong ol" << be_uidt_nl
<< ");" << be_uidt_nl << be_nl;
- if (!is_pseudo_object)
+ if (! (is_pseudo_object || is_valuetype))
{
// Pseudo objects do not require these methods.
*os << "virtual void _downcast (" << be_idt << be_idt_nl
- << "void* target," << be_nl
- << "CORBA_Object *src," << be_nl
- << "CORBA_Environment &ACE_TRY_ENV = " << be_idt_nl
- << "TAO_default_environment ()"
- << be_uidt << be_uidt_nl
- << ");" << be_uidt_nl;
+ << "void* target," << be_nl
+ << "CORBA_Object *src," << be_nl
+ << "CORBA_Environment &ACE_TRY_ENV = " << be_idt_nl
+ << "TAO_default_environment ()"
+ << be_uidt << be_uidt_nl
+ << ");" << be_uidt_nl;
*os << "virtual CORBA_Object* _upcast (void *src) const;";
}
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ci.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ci.cpp
index 6d0af4f55a4..9013e9e80c2 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ci.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ci.cpp
@@ -19,7 +19,7 @@
// Modifications by Aniruddha Gokhale
// ============================================================================
-#include "be.h"
+#include "be.h"
#include "be_visitor_sequence.h"
@@ -40,7 +40,7 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_ci::"
"visit_sequence - "
- "Bad element type\n"),
+ "Bad element type\n"),
-1);
}
@@ -58,7 +58,7 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
pt = bt;
}
- const char *name =
+ const char *name =
be_decl::narrow_from_decl (pt)->full_name ();
idl_bool bt_is_defined;
@@ -83,22 +83,22 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
const char * class_name = node->instance_name ();
static char full_class_name [NAMEBUFSIZE];
- ACE_OS::memset (full_class_name,
- '\0',
+ ACE_OS::memset (full_class_name,
+ '\0',
NAMEBUFSIZE);
if (node->is_nested ())
{
be_scope *parent = be_scope::narrow_from_scope (node->defined_in ());
- ACE_OS::sprintf (full_class_name,
+ ACE_OS::sprintf (full_class_name,
"%s::%s",
parent->decl ()->full_name (),
class_name);
}
else
{
- ACE_OS::sprintf (full_class_name,
+ ACE_OS::sprintf (full_class_name,
"%s",
class_name);
}
@@ -146,12 +146,18 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
*os << "*[" << node->max_size () << "], 0);" << be_nl
<< be_nl
- << "for (CORBA::ULong i = 0; i < " << node->max_size ()
+ << "for (CORBA::ULong i = 0; i < " << node->max_size ()
<< "; i++)" << be_idt_nl
<< "{" << be_idt_nl
<< "buf[i] = ";
- if (bt_is_defined)
+ int is_valuetype = be_interface::narrow_from_decl (pt)->is_valuetype ();
+
+ if (is_valuetype)
+ {
+ *os << "0;";
+ }
+ else if (bt_is_defined)
{
bt->accept (visitor);
@@ -175,12 +181,19 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
*os << " **buffer)" << be_nl
<< "{" << be_idt_nl
- << "for (CORBA::ULong i = 0; i < " << node->max_size ()
+ << "for (CORBA::ULong i = 0; i < " << node->max_size ()
<< "; ++i)" << be_idt_nl
<< "{" << be_idt_nl
<< "if (buffer[i] != ";
- if (bt_is_defined)
+ if (is_valuetype)
+ {
+ *os << "0)" << be_idt_nl
+ << "{" << be_idt_nl
+ << "buffer[i]->_remove_ref ();" << be_nl
+ << "buffer[i] = 0;" << be_uidt_nl;
+ }
+ else if (bt_is_defined)
{
bt->accept (visitor);
@@ -202,7 +215,7 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
<< "tao_" << pt->flat_name () << "_nil ();" << be_uidt_nl;
}
- *os << "}" << be_uidt << be_uidt_nl
+ *os << "}" << be_uidt << be_uidt_nl
<< "}" << be_uidt_nl << be_nl
<< "delete[] buffer;" << be_uidt_nl
<< "} " << be_nl
@@ -228,7 +241,7 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
*os <<"* *value," << be_nl
<< "CORBA::Boolean release)" << be_uidt_nl
<< "// Constructor from data." << be_nl
- << " : TAO_Bounded_Base_Sequence (" << node->max_size ()
+ << " : TAO_Bounded_Base_Sequence (" << node->max_size ()
<< ", length, value, release)" << be_nl
<< "{" << be_nl
<< "}" << be_nl
@@ -256,18 +269,27 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
*os << "** ACE_CAST_CONST, rhs.buffer_);" << be_nl
<< "for (CORBA::ULong i = 0; i < rhs.length_; i++)" << be_idt_nl
- << "{" << be_idt_nl
- << "tmp1[i] = ";
+ << "{" << be_idt_nl;
- if (bt_is_defined)
+ if (is_valuetype)
{
- bt->accept (visitor);
-
- *os << "::_duplicate (tmp2[i]);";
+ *os << "if (tmp2[i] != 0)" << be_idt_nl
+ << "tmp2[i]->_add_ref ();" << be_uidt_nl
+ << "tmp1[i] = tmp2[i];";
}
else
{
- *os << "tao_" << pt->flat_name () << "_duplicate (tmp2[i]);";
+ *os << "tmp1[i] = ";
+ if (bt_is_defined)
+ {
+ bt->accept (visitor);
+
+ *os << "::_duplicate (tmp2[i]);";
+ }
+ else
+ {
+ *os << "tao_" << pt->flat_name () << "_duplicate (tmp2[i]);";
+ }
}
*os << be_uidt_nl
@@ -304,7 +326,13 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
<< "for (CORBA::ULong i = 0; i < this->length_; ++i)" << be_idt_nl
<< "{" << be_idt_nl;
- if (bt_is_defined)
+ if (is_valuetype)
+ {
+ *os << "if (tmp[i] != 0)" << be_idt_nl
+ << "tmp[i]->_remove_ref ();" << be_uidt_nl
+ << "tmp[i] = 0;";
+ }
+ else if (bt_is_defined)
{
*os << "CORBA::release (tmp[i]);" << be_nl
<< "tmp[i] = ";
@@ -324,7 +352,7 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
<< "}" << be_uidt << be_uidt_nl
<< "}" << be_nl
<< "else" << be_idt_nl
- << "this->buffer_ = " << class_name
+ << "this->buffer_ = " << class_name
<< "::allocbuf (rhs.maximum_);" << be_uidt_nl
<< be_nl
<< "TAO_Bounded_Base_Sequence::operator= (rhs);" << be_nl
@@ -346,18 +374,27 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
*os << " ** ACE_CAST_CONST, rhs.buffer_);" << be_nl
<< "for (CORBA::ULong i=0; i < rhs.length_; ++i)" << be_idt_nl
- << "{" << be_idt_nl
- << "tmp1[i] = ";
+ << "{" << be_idt_nl;
- if (bt_is_defined)
+ if (is_valuetype)
{
- bt->accept (visitor);
-
- *os << "::_duplicate (tmp2[i]);";
+ *os << "if (tmp2[i] != 0)" << be_idt_nl
+ << "tmp2[i]->_add_ref ();" << be_uidt_nl
+ << "tmp1[i] = tmp2[i];";
}
else
{
- *os << "tao_" << pt->flat_name () << "_duplicate (tmp2[i]);";
+ *os << "tmp1[i] = ";
+ if (bt_is_defined)
+ {
+ bt->accept (visitor);
+
+ *os << "::_duplicate (tmp2[i]);";
+ }
+ else
+ {
+ *os << "tao_" << pt->flat_name () << "_duplicate (tmp2[i]);";
+ }
}
*os << be_uidt_nl
@@ -374,7 +411,6 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
&& prim && prim->pt () == AST_PredefinedType::PT_pseudo
&& ACE_OS::strcmp (prim->local_name ()->get_string (),
"Object") != 0;
-
// operator[].
if (is_pseudo_object)
{
@@ -382,7 +418,10 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
}
else
{
- *os << "ACE_INLINE TAO_Object_Manager<";
+ if (is_valuetype)
+ *os << "TAO_Valuetype_Manager<";
+ else
+ *os << "ACE_INLINE TAO_Object_Manager<";
}
*os << bt->name () << ","
@@ -406,7 +445,10 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
}
else
{
- *os << "return TAO_Object_Manager<";
+ if (is_valuetype)
+ *os << "return TAO_Valuetype_Manager<";
+ else
+ *os << "return TAO_Object_Manager<";
}
*os << bt->name () << ","
@@ -421,7 +463,7 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
bt->accept(visitor);
*os << " **" << be_nl;
- *os << full_class_name << "::get_buffer (CORBA::Boolean orphan)"
+ *os << full_class_name << "::get_buffer (CORBA::Boolean orphan)"
<< be_nl
<< "{" << be_idt_nl;
@@ -433,7 +475,7 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node)
<< "// We retain ownership." << be_nl
<< "if (this->buffer_ == 0)" << be_nl
<< "{" << be_idt_nl
- << "result = " << class_name << "::allocbuf (this->maximum_);"
+ << "result = " << class_name << "::allocbuf (this->maximum_);"
<< be_nl
<< "this->buffer_ = result;" << be_nl
<< "this->release_ = 1;" << be_uidt_nl
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_cs.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_cs.cpp
index 22459a78dae..782985e5741 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_cs.cpp
@@ -19,7 +19,7 @@
// Modifications by Aniruddha Gokhale
// ============================================================================
-#include "be.h"
+#include "be.h"
#include "be_visitor_sequence.h"
@@ -40,7 +40,7 @@ be_visitor_sequence_cs::gen_bounded_obj_sequence (be_sequence *node)
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cs::"
"visit_sequence - "
- "Bad element type\n"),
+ "Bad element type\n"),
-1);
}
@@ -58,7 +58,7 @@ be_visitor_sequence_cs::gen_bounded_obj_sequence (be_sequence *node)
pt = bt;
}
- const char *name =
+ const char *name =
be_decl::narrow_from_decl (pt)->full_name ();
idl_bool bt_is_defined;
@@ -80,25 +80,27 @@ be_visitor_sequence_cs::gen_bounded_obj_sequence (be_sequence *node)
bt_is_defined = ibt->is_defined ();
}
+ int is_valuetype = be_interface::narrow_from_decl (pt)->is_valuetype ();
+
const char * class_name = node->instance_name ();
static char full_class_name [NAMEBUFSIZE];
- ACE_OS::memset (full_class_name,
- '\0',
+ ACE_OS::memset (full_class_name,
+ '\0',
NAMEBUFSIZE);
if (node->is_nested ())
{
be_scope *parent = be_scope::narrow_from_scope (node->defined_in ());
- ACE_OS::sprintf (full_class_name,
+ ACE_OS::sprintf (full_class_name,
"%s::%s",
parent->decl ()->full_name (),
class_name);
}
else
{
- ACE_OS::sprintf (full_class_name,
+ ACE_OS::sprintf (full_class_name,
"%s",
class_name);
}
@@ -129,7 +131,7 @@ be_visitor_sequence_cs::gen_bounded_obj_sequence (be_sequence *node)
<< "// For this class memory is never reallocated so the implementation"
<< be_nl
<< "// is *really* simple." << be_nl
- << "this->buffer_ = " << class_name << "::allocbuf (length);"
+ << "this->buffer_ = " << class_name << "::allocbuf (length);"
<< be_uidt_nl
<< "}" << be_nl
<< be_nl;
@@ -163,7 +165,7 @@ be_visitor_sequence_cs::gen_bounded_obj_sequence (be_sequence *node)
// _shrink_buffer
*os << "void" << be_nl
- << full_class_name
+ << full_class_name
<< "::_shrink_buffer (CORBA::ULong nl, CORBA::ULong ol)"
<< be_nl
<< "{" << be_idt_nl;
@@ -179,7 +181,13 @@ be_visitor_sequence_cs::gen_bounded_obj_sequence (be_sequence *node)
<< "for (CORBA::ULong i = nl; i < ol; ++i)" << be_nl
<< "{" << be_idt_nl;
- if (bt_is_defined)
+ if (is_valuetype)
+ {
+ *os << "if (tmp[i] != 0)" << be_idt_nl
+ << "tmp[i]->_remove_ref ();" << be_uidt_nl
+ << "tmp[i] = 0;";
+ }
+ else if (bt_is_defined)
{
*os << "CORBA::release (tmp[i]);" << be_nl
<< "tmp[i] = ";
@@ -201,19 +209,20 @@ be_visitor_sequence_cs::gen_bounded_obj_sequence (be_sequence *node)
be_predefined_type *prim = be_predefined_type::narrow_from_decl (pt);
- if ((pt->node_type () != AST_Decl::NT_pre_defined)
- || (prim
- && (prim->pt () == AST_PredefinedType::PT_pseudo)
+ if (! is_valuetype
+ && (pt->node_type () != AST_Decl::NT_pre_defined)
+ || (prim
+ && (prim->pt () == AST_PredefinedType::PT_pseudo)
&& (!ACE_OS::strcmp (prim->local_name ()->get_string (), "Object"))))
{
// Pseudo objects do not require these methods.
*os << "void" << be_nl
<< full_class_name << "::_downcast (" << be_idt << be_idt_nl
- << "void* target," << be_nl
- << "CORBA_Object *src," << be_nl
- << "CORBA::Environment &ACE_TRY_ENV" << be_uidt_nl
- << ")" << be_uidt_nl
- << "{" << be_idt_nl;
+ << "void* target," << be_nl
+ << "CORBA_Object *src," << be_nl
+ << "CORBA::Environment &ACE_TRY_ENV" << be_uidt_nl
+ << ")" << be_uidt_nl
+ << "{" << be_idt_nl;
bt->accept (visitor);
@@ -222,7 +231,7 @@ be_visitor_sequence_cs::gen_bounded_obj_sequence (be_sequence *node)
bt->accept (visitor);
*os << "**, target);" << be_nl
- << "*tmp = ";
+ << "*tmp = ";
if (bt_is_defined)
{
@@ -232,17 +241,17 @@ be_visitor_sequence_cs::gen_bounded_obj_sequence (be_sequence *node)
}
else
{
- *os << "tao_" << pt->flat_name ()
+ *os << "tao_" << pt->flat_name ()
<< "_narrow (src, ACE_TRY_ENV);";
}
*os << be_nl
<< "ACE_CHECK;" << be_uidt_nl
- << "}\n" << be_nl;
+ << "}\n" << be_nl;
*os << "CORBA_Object*" << be_nl
<< full_class_name << "::_upcast (void *src) const" << be_nl
- << "{" << be_idt_nl;
+ << "{" << be_idt_nl;
if (bt_is_defined)
{
@@ -257,11 +266,11 @@ be_visitor_sequence_cs::gen_bounded_obj_sequence (be_sequence *node)
}
else
{
- *os << "return tao_" << pt->flat_name () << "_upcast (src);";
+ *os << "return tao_" << pt->flat_name () << "_upcast (src);";
}
*os << be_uidt_nl
- << "}" << be_nl;
+ << "}" << be_nl;
}
os->gen_endif ();
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ch.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ch.cpp
index 308d3257ea0..280f589eced 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ch.cpp
@@ -21,7 +21,7 @@
// ============================================================================
-#include "be.h"
+#include "be.h"
#include "be_visitor_sequence.h"
@@ -118,6 +118,7 @@ be_visitor_sequence_ch::gen_unbounded_obj_sequence (be_sequence *node)
&& prim && prim->pt () == AST_PredefinedType::PT_pseudo
&& ACE_OS::strcmp (prim->local_name ()->get_string (),
"Object") != 0;
+ int is_valuetype = 0;
if (is_pseudo_object)
{
@@ -125,7 +126,12 @@ be_visitor_sequence_ch::gen_unbounded_obj_sequence (be_sequence *node)
}
else
{
- *os << "TAO_Object_Manager<";
+ be_interface *bf = be_interface::narrow_from_decl (pt);
+ is_valuetype = bf->is_valuetype ();
+ if (is_valuetype)
+ *os << "TAO_Valuetype_Manager<";
+ else
+ *os << "TAO_Object_Manager<";
}
*os << bt->name () << ","
@@ -176,16 +182,16 @@ be_visitor_sequence_ch::gen_unbounded_obj_sequence (be_sequence *node)
<< "CORBA::ULong ol" << be_uidt_nl
<< ");" << be_uidt_nl << be_nl;
- if (!is_pseudo_object)
+ if (! (is_pseudo_object || is_valuetype))
{
// Pseudo objects do not require these methods.
*os << "virtual void _downcast (" << be_idt << be_idt_nl
- << "void* target," << be_nl
- << "CORBA_Object *src," << be_nl
- << "CORBA_Environment &ACE_TRY_ENV = " << be_idt_nl
- << "TAO_default_environment ()"
- << be_uidt << be_uidt_nl
- << ");" << be_uidt_nl;
+ << "void* target," << be_nl
+ << "CORBA_Object *src," << be_nl
+ << "CORBA_Environment &ACE_TRY_ENV = " << be_idt_nl
+ << "TAO_default_environment ()"
+ << be_uidt << be_uidt_nl
+ << ");" << be_uidt_nl;
*os << "virtual CORBA_Object* _upcast (void *src) const;";
}
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ci.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ci.cpp
index aefb0f1509a..43e94ab2b82 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ci.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ci.cpp
@@ -19,7 +19,7 @@
// Modifications by Aniruddha Gokhale
// ============================================================================
-#include "be.h"
+#include "be.h"
#include "be_visitor_sequence.h"
@@ -39,7 +39,7 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_ci::"
"visit_sequence - "
- "Bad element type\n"),
+ "Bad element type\n"),
-1);
}
@@ -57,7 +57,7 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
pt = bt;
}
- const char *name =
+ const char *name =
be_decl::narrow_from_decl (pt)->full_name ();
idl_bool bt_is_defined;
@@ -82,22 +82,22 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
const char *class_name = node->instance_name ();
static char full_class_name [NAMEBUFSIZE];
- ACE_OS::memset (full_class_name,
- '\0',
+ ACE_OS::memset (full_class_name,
+ '\0',
NAMEBUFSIZE);
if (node->is_nested ())
{
be_scope *parent = be_scope::narrow_from_scope (node->defined_in ());
- ACE_OS::sprintf (full_class_name,
+ ACE_OS::sprintf (full_class_name,
"%s::%s",
parent->decl ()->full_name (),
class_name);
}
else
{
- ACE_OS::sprintf (full_class_name,
+ ACE_OS::sprintf (full_class_name,
"%s",
class_name);
}
@@ -147,7 +147,13 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
<< "{" << be_idt_nl
<< "buf[i] = ";
- if (bt_is_defined)
+ int is_valuetype = be_interface::narrow_from_decl (pt)->is_valuetype ();
+
+ if (is_valuetype)
+ {
+ *os << "0;";
+ }
+ else if (bt_is_defined)
{
bt->accept (visitor);
@@ -158,7 +164,7 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
*os << "tao_" << pt->flat_name () << "_nil ();";
}
- *os << be_uidt_nl
+ *os << be_uidt_nl
<< "}" << be_uidt_nl << be_nl
<< "return buf;" << be_uidt_nl
<< "}" << be_nl << be_nl;
@@ -186,7 +192,7 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
// Constructor.
*os << "ACE_INLINE" << be_nl
- << full_class_name << "::" << class_name
+ << full_class_name << "::" << class_name
<< " (CORBA::ULong maximum)" << be_idt_nl
<< ": TAO_Unbounded_Base_Sequence (maximum, "
<< class_name << "::allocbuf (maximum))" << be_uidt_nl
@@ -196,7 +202,7 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
// Constructor.
*os << "ACE_INLINE" << be_nl
- << full_class_name << "::" << class_name
+ << full_class_name << "::" << class_name
<< " (CORBA::ULong maximum," << be_idt_nl
<< "CORBA::ULong length," << be_nl;
@@ -221,7 +227,7 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
bt->accept(visitor);
- *os <<" **tmp1 = " << class_name << "::allocbuf (this->maximum_);"
+ *os <<" **tmp1 = " << class_name << "::allocbuf (this->maximum_);"
<< be_nl;
bt->accept (visitor);
@@ -233,18 +239,27 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
*os << " ** ACE_CAST_CONST, rhs.buffer_);" << be_nl
<< be_nl
<< "for (CORBA::ULong i = 0; i < rhs.length_; ++i)" << be_idt_nl
- << "{" << be_idt_nl
- << "tmp1[i] = ";
+ << "{" << be_idt_nl;
- if (bt_is_defined)
+ if (is_valuetype)
{
- bt->accept (visitor);
-
- *os << "::_duplicate (tmp2[i]);";
+ *os << "if (tmp2[i] != 0)" << be_idt_nl
+ << "tmp2[i]->_add_ref ();" << be_uidt_nl
+ << "tmp1[i] = tmp2 [i];";
}
else
{
- *os << "tao_" << pt->flat_name () << "_duplicate (tmp2[i]);";
+ *os << "tmp1[i] = ";
+ if (bt_is_defined)
+ {
+ bt->accept (visitor);
+
+ *os << "::_duplicate (tmp2[i]);";
+ }
+ else
+ {
+ *os << "tao_" << pt->flat_name () << "_duplicate (tmp2[i]);";
+ }
}
*os << be_uidt_nl
@@ -260,7 +275,7 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
// Operator =.
*os << "ACE_INLINE " << full_class_name << " &" << be_nl
- << full_class_name << "::operator= (const "
+ << full_class_name << "::operator= (const "
<< class_name << " &rhs)" << be_nl
<< "{" << be_idt_nl
<< "if (this == &rhs)" << be_idt_nl
@@ -280,7 +295,13 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
<< "for (CORBA::ULong i = 0; i < this->length_; ++i)" << be_nl
<< "{" << be_idt_nl;
- if (bt_is_defined)
+ if (is_valuetype)
+ {
+ *os << "if (tmp[i] != 0)" << be_idt_nl
+ << "tmp[i]->_remove_ref ();" << be_uidt_nl
+ << "tmp[i] = 0;";
+ }
+ else if (bt_is_defined)
{
*os << "CORBA::release (tmp[i]);" << be_nl
<< "tmp[i] = ";
@@ -329,20 +350,28 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
*os << " ** ACE_CAST_CONST, rhs.buffer_);" << be_nl
<< be_nl
<< "for (CORBA::ULong i = 0; i < rhs.length_; ++i)" << be_idt_nl
- << "{" << be_idt_nl
- << "tmp1[i] = ";
+ << "{" << be_idt_nl;
- if (bt_is_defined)
+ if (is_valuetype)
{
- bt->accept (visitor);
-
- *os << "::_duplicate (tmp2[i]);";
+ *os << "if (tmp2[i] != 0)" << be_idt_nl
+ << "tmp2[i]->_add_ref ();" << be_uidt_nl
+ << "tmp1[i] = tmp2 [i];";
}
else
{
- *os << "tao_" << pt->flat_name () << "_duplicate (tmp2[i]);";
+ *os << "tmp1[i] = ";
+ if (bt_is_defined)
+ {
+ bt->accept (visitor);
+
+ *os << "::_duplicate (tmp2[i]);";
+ }
+ else
+ {
+ *os << "tao_" << pt->flat_name () << "_duplicate (tmp2[i]);";
+ }
}
-
*os << be_uidt_nl
<< "}" << be_uidt_nl << be_nl
<< "return *this;" << be_uidt_nl
@@ -356,19 +385,21 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
&& prim && prim->pt () == AST_PredefinedType::PT_pseudo
&& ACE_OS::strcmp (prim->local_name ()->get_string (),
"Object") != 0;
-
if (is_pseudo_object)
{
*os << "ACE_INLINE TAO_Pseudo_Object_Manager<";
}
else
{
- *os << "ACE_INLINE TAO_Object_Manager<";
+ if (is_valuetype)
+ *os << "ACE_INLINE TAO_Valuetype_Manager<";
+ else
+ *os << "ACE_INLINE TAO_Object_Manager<";
}
*os << bt->name () << ","
<< bt->name () << "_var>" << be_nl
- << full_class_name << "::operator[] (CORBA::ULong index) const"
+ << full_class_name << "::operator[] (CORBA::ULong index) const"
<< be_nl
<< "// read-write accessor" << be_nl
<< "{" << be_idt_nl
@@ -388,7 +419,10 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
}
else
{
- *os << "return TAO_Object_Manager<";
+ if (is_valuetype)
+ *os << "return TAO_Valuetype_Manager<";
+ else
+ *os << "return TAO_Object_Manager<";
}
*os << bt->name () << ","
@@ -414,7 +448,7 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node)
<< "// We retain ownership." << be_nl
<< "if (this->buffer_ == 0)" << be_nl
<< "{" << be_idt_nl
- << "result = " << class_name << "::allocbuf (this->maximum_);"
+ << "result = " << class_name << "::allocbuf (this->maximum_);"
<< be_nl
<< "this->buffer_ = result;" << be_nl
<< "this->release_ = 1;" << be_uidt_nl
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_cs.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_cs.cpp
index dc8289ec615..26e399ce6a2 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_cs.cpp
@@ -19,7 +19,7 @@
// Modifications by Aniruddha Gokhale
// ============================================================================
-#include "be.h"
+#include "be.h"
#include "be_visitor_sequence.h"
@@ -57,7 +57,7 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node)
pt = bt;
}
- const char *name =
+ const char *name =
be_decl::narrow_from_decl (pt)->full_name ();
idl_bool bt_is_defined;
@@ -79,25 +79,27 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node)
bt_is_defined = ibt->is_defined ();
}
+ int is_valuetype = be_interface::narrow_from_decl (pt)->is_valuetype ();
+
const char * class_name = node->instance_name ();
static char full_class_name [NAMEBUFSIZE];
- ACE_OS::memset (full_class_name,
- '\0',
+ ACE_OS::memset (full_class_name,
+ '\0',
NAMEBUFSIZE);
if (node->is_nested ())
{
be_scope *parent = be_scope::narrow_from_scope (node->defined_in ());
- ACE_OS::sprintf (full_class_name,
+ ACE_OS::sprintf (full_class_name,
"%s::%s",
parent->decl ()->full_name (),
class_name);
}
else
{
- ACE_OS::sprintf (full_class_name,
+ ACE_OS::sprintf (full_class_name,
"%s",
class_name);
}
@@ -115,10 +117,10 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node)
os->indent ();
// allocate_buffer.
- *os << "// The Base_Sequence functions, please see tao/Sequence.h"
+ *os << "// The Base_Sequence functions, please see tao/Sequence.h"
<< be_nl
<< "void" << be_nl
- << full_class_name << "::_allocate_buffer (CORBA::ULong length)"
+ << full_class_name << "::_allocate_buffer (CORBA::ULong length)"
<< be_nl
<< "{" << be_idt_nl;
@@ -140,30 +142,39 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node)
<< "for (CORBA::ULong i = 0; i < this->length_; ++i)" << be_idt_nl
<< "{" << be_idt_nl
<< "if (!this->release_)" << be_idt_nl
- << "{" << be_idt_nl
- << "tmp[i] = ";
+ << "{" << be_idt_nl;
- if (bt_is_defined)
+ if (is_valuetype)
{
- bt->accept (visitor);
-
- *os << "::_duplicate (old[i]);";
+ *os << "if (old[i] != 0)" << be_idt_nl
+ << "old[i]->_add_ref ();" << be_uidt_nl
+ << "tmp[i] = old[i];";
}
else
{
- *os << "tao_" << pt->flat_name () << "_duplicate (old[i]);";
+ *os << "tmp[i] = ";
+ if (bt_is_defined)
+ {
+ bt->accept (visitor);
+
+ *os << "::_duplicate (old[i]);";
+ }
+ else
+ {
+ *os << "tao_" << pt->flat_name () << "_duplicate (old[i]);";
+ }
}
*os << be_uidt_nl
<< "}" << be_uidt_nl
<< "else" << be_idt_nl
<< "{" << be_idt_nl
- << "tmp[i] = old[i];" << be_uidt_nl
+ << "tmp[i] = old[i];" << be_uidt_nl
<< "}" << be_uidt << be_uidt_nl
<< "}" << be_uidt_nl << be_nl
<< "if (this->release_)" << be_idt_nl
<< "{" << be_idt_nl
- << "delete[] old;" << be_uidt_nl
+ << "delete[] old;" << be_uidt_nl
<< "}" << be_uidt << be_uidt_nl
<< "}" << be_nl
<< "this->buffer_ = tmp;" << be_uidt_nl
@@ -187,7 +198,13 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node)
<< "for (CORBA::ULong i = 0; i < this->length_; ++i)" << be_idt_nl
<< "{" << be_idt_nl;
- if (bt_is_defined)
+ if (is_valuetype)
+ {
+ *os << "if (tmp[i] != 0)" << be_idt_nl
+ << "tmp[i]->_remove_ref ();" << be_uidt_nl
+ << "tmp[i] = 0;";
+ }
+ else if (bt_is_defined)
{
*os << "CORBA::release (tmp[i]);" << be_nl
<< "tmp[i] = ";
@@ -219,7 +236,7 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node)
// shrink_buffer.
*os << "void" << be_nl
- << full_class_name
+ << full_class_name
<< "::_shrink_buffer (CORBA::ULong nl, CORBA::ULong ol)" << be_nl
<< "{" << be_idt_nl;
@@ -233,7 +250,13 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node)
<< "for (CORBA::ULong i = nl; i < ol; ++i)" << be_idt_nl
<< "{" << be_idt_nl;
- if (bt_is_defined)
+ if (is_valuetype)
+ {
+ *os << "if (tmp[i] != 0)" << be_idt_nl
+ << "tmp[i]->_remove_ref ();" << be_uidt_nl
+ << "tmp[i] = 0;";
+ }
+ else if (bt_is_defined)
{
*os << "CORBA::release (tmp[i]);" << be_nl
<< "tmp[i] = ";
@@ -256,19 +279,20 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node)
be_predefined_type *prim = be_predefined_type::narrow_from_decl (pt);
- if ((pt->node_type () != AST_Decl::NT_pre_defined) ||
+ if (! is_valuetype
+ && (pt->node_type () != AST_Decl::NT_pre_defined) ||
(prim && (prim->pt () == AST_PredefinedType::PT_pseudo) &&
(!ACE_OS::strcmp (prim->local_name ()->get_string (), "Object"))))
{
// Pseudo objects do not require these methods.
*os << "void " << be_nl
<< full_class_name << "::_downcast (" << be_idt << be_idt_nl
- << "void* target," << be_nl
- << "CORBA_Object *src," << be_nl
- << "CORBA_Environment &ACE_TRY_ENV"
- << be_uidt_nl
- << ")" << be_uidt_nl
- << "{" << be_idt_nl;
+ << "void* target," << be_nl
+ << "CORBA_Object *src," << be_nl
+ << "CORBA_Environment &ACE_TRY_ENV"
+ << be_uidt_nl
+ << ")" << be_uidt_nl
+ << "{" << be_idt_nl;
bt->accept (visitor);
@@ -277,7 +301,7 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node)
bt->accept (visitor);
*os << "**, target);" << be_nl
- << "*tmp = ";
+ << "*tmp = ";
if (bt_is_defined)
{
@@ -287,17 +311,17 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node)
}
else
{
- *os << "tao_" << pt->flat_name ()
+ *os << "tao_" << pt->flat_name ()
<< "_narrow (src, ACE_TRY_ENV);";
}
*os << be_nl
<< "ACE_CHECK;" << be_uidt_nl
- << "}\n" << be_nl;
+ << "}\n" << be_nl;
*os << "CORBA_Object*" << be_nl
<< full_class_name << "::_upcast (void *src) const" << be_nl
- << "{" << be_idt_nl;
+ << "{" << be_idt_nl;
if (bt_is_defined)
{
@@ -312,11 +336,11 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node)
}
else
{
- *os << "return tao_" << pt->flat_name () << "_upcast (src);";
+ *os << "return tao_" << pt->flat_name () << "_upcast (src);";
}
*os << be_uidt_nl
- << "}" << be_nl;
+ << "}" << be_nl;
}
os->gen_endif ();
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_base.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_base.cpp
index 495d82eac43..78a915512b7 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_base.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_base.cpp
@@ -18,9 +18,9 @@
//
// ============================================================================
-#include "idl.h"
-#include "idl_extern.h"
-#include "be.h"
+#include "idl.h"
+#include "idl_extern.h"
+#include "be.h"
#include "be_visitor_sequence.h"
@@ -69,7 +69,7 @@ be_visitor_sequence_base::visit_node (be_type *node)
if (this->ctx_->state () == TAO_CodeGen::TAO_SEQUENCE_BASE_CH)
{
- if (this->ctx_->sub_state ()
+ if (this->ctx_->sub_state ()
== TAO_CodeGen::TAO_ARRAY_SEQ_CH_TEMPLATE_VAR)
{
*os << bt->nested_type_name (this->ctx_->scope (), "_var");
@@ -96,7 +96,7 @@ be_visitor_sequence_base::visit_sequence (be_sequence *node)
int
be_visitor_sequence_base::visit_interface (be_interface *node)
{
-
+
return this->visit_node (node);
}
@@ -108,6 +108,20 @@ be_visitor_sequence_base::visit_interface_fwd (be_interface_fwd *node)
}
int
+be_visitor_sequence_base::visit_valuetype (be_valuetype *node)
+{
+
+ return this->visit_node (node);
+
+}
+
+int
+be_visitor_sequence_base::visit_valuetype_fwd (be_valuetype_fwd *node)
+{
+ return this->visit_node (node);
+}
+
+int
be_visitor_sequence_base::visit_string (be_string *)
{
// NO-OP, we have ad-hoc classes from strings.
@@ -206,7 +220,7 @@ be_visitor_sequence_base_template_args::visit_interface (be_interface *node)
*os << bt->name () << "_var";
}
- return 0;
+ return 0;
}
int
@@ -237,7 +251,21 @@ be_visitor_sequence_base_template_args::visit_interface_fwd (
*os << bt->name () << "_var";
}
- return 0;
+ return 0;
+}
+
+int
+be_visitor_sequence_base_template_args::visit_valuetype (be_valuetype *node)
+{
+ return this->visit_interface (node);
+}
+
+int
+be_visitor_sequence_base_template_args::visit_valuetype_fwd (
+ be_valuetype_fwd *node
+ )
+{
+ return this->visit_interface_fwd (node);
}
int
@@ -248,11 +276,11 @@ be_visitor_sequence_base_template_args::visit_predefined_type (
TAO_OutStream *os = this->ctx_->stream ();
*os << node->name ();
- if (beseq_->managed_type () == be_sequence::MNG_PSEUDO
+ if (beseq_->managed_type () == be_sequence::MNG_PSEUDO
|| beseq_->managed_type () == be_sequence::MNG_OBJREF)
{
*os << "," << node->name () << "_var";
}
-
+
return 0;
}
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp
index a516a5ab189..058334f1431 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp
@@ -90,6 +90,17 @@ be_visitor_sequence_ch::gen_base_sequence_class (be_sequence *node)
}
break;
+ case be_sequence::MNG_VALUE:
+ if (node->unbounded ())
+ {
+ *os << "TAO_Unbounded_Valuetype_Sequence<";
+ }
+ else
+ {
+ *os << "TAO_Bounded_Valuetype_Sequence<";
+ }
+
+ break;
case be_sequence::MNG_STRING:
if (node->unbounded ())
{
@@ -144,7 +155,7 @@ be_visitor_sequence_ch::gen_base_sequence_class (be_sequence *node)
be_visitor_context (*this->ctx_),
0);
- be_visitor_sequence_base_template_args visitor (ctx,
+ be_visitor_sequence_base_template_args visitor (ctx,
node);
ctx->state (TAO_CodeGen::TAO_SEQUENCE_BASE_CH);
@@ -158,7 +169,7 @@ be_visitor_sequence_ch::gen_base_sequence_class (be_sequence *node)
-1);
}
- // Find out if the sequence is of a managed type and if
+ // Find out if the sequence is of a managed type and if
// it is bounded or not.
if (node->managed_type () == be_sequence::MNG_STRING
|| node->managed_type () == be_sequence::MNG_WSTRING)
@@ -225,6 +236,7 @@ be_visitor_sequence_ch::instantiate_sequence (be_sequence *node)
{
case be_sequence::MNG_PSEUDO:
case be_sequence::MNG_OBJREF:
+ case be_sequence::MNG_VALUE:
if (node->unbounded ())
{
this->gen_unbounded_obj_sequence (node);
@@ -251,41 +263,41 @@ be_visitor_sequence_ch::instantiate_sequence (be_sequence *node)
break;
default: // Not a managed type.
if (node->unbounded ())
- {
- // TAO provides extensions for octet sequences, first find out
- // if the base type is an octet (or an alias for octet)
- be_predefined_type *predef = 0;
-
- if (bt->base_node_type () == AST_Type::NT_pre_defined)
- {
- be_typedef* alias =
- be_typedef::narrow_from_decl (bt);
-
- if (alias == 0)
- {
- predef =
- be_predefined_type::narrow_from_decl (bt);
- }
- else
- {
- predef =
+ {
+ // TAO provides extensions for octet sequences, first find out
+ // if the base type is an octet (or an alias for octet)
+ be_predefined_type *predef = 0;
+
+ if (bt->base_node_type () == AST_Type::NT_pre_defined)
+ {
+ be_typedef* alias =
+ be_typedef::narrow_from_decl (bt);
+
+ if (alias == 0)
+ {
+ predef =
+ be_predefined_type::narrow_from_decl (bt);
+ }
+ else
+ {
+ predef =
be_predefined_type::narrow_from_decl (
alias->primitive_base_type ()
);
- }
- }
- if (predef != 0)
- {
- if (predef->pt() != AST_PredefinedType::PT_octet)
+ }
+ }
+ if (predef != 0)
+ {
+ if (predef->pt() != AST_PredefinedType::PT_octet)
{
- this->gen_unbounded_sequence (node);
+ this->gen_unbounded_sequence (node);
}
- }
- else
+ }
+ else
{
- this->gen_unbounded_sequence (node);
+ this->gen_unbounded_sequence (node);
}
- }
+ }
else
{
this->gen_bounded_sequence (node);
@@ -375,7 +387,7 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_ch::"
"visit_sequence - "
- "codegen for base sequence class\n"),
+ "codegen for base sequence class\n"),
-1);
}
@@ -410,7 +422,7 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_ch::"
"visit_sequence - "
- "Bad visitor\n"),
+ "Bad visitor\n"),
-1);
}
@@ -437,7 +449,7 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
// but we must protect against certain versions of g++.
if (this->ctx_->tdef () != 0)
{
- *os << "\n#if !defined(__GNUC__) || !defined (ACE_HAS_GNUG_PRE_2_8)"
+ *os << "\n#if !defined(__GNUC__) || !defined (ACE_HAS_GNUG_PRE_2_8)"
<< be_nl;
*os << "typedef " << node->local_name () << "_var _var_type;\n"
<< "#endif /* ! __GNUC__ || g++ >= 2.8 */" << be_nl << be_nl;
@@ -450,19 +462,19 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
if (bt->base_node_type () == AST_Type::NT_pre_defined)
{
be_typedef* alias =
- be_typedef::narrow_from_decl (bt);
+ be_typedef::narrow_from_decl (bt);
if (alias == 0)
- {
- predef = be_predefined_type::narrow_from_decl (bt);
- }
+ {
+ predef = be_predefined_type::narrow_from_decl (bt);
+ }
else
- {
- predef =
+ {
+ predef =
be_predefined_type::narrow_from_decl (
alias->primitive_base_type ()
);
- }
+ }
}
// Now generate the extension...
@@ -470,13 +482,13 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
&& node->unbounded ())
{
*os << "\n#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)" << be_nl
- << node->local_name () << " (" << be_idt << be_idt_nl
- << "CORBA::ULong length," << be_nl
- << "const ACE_Message_Block* mb" << be_uidt_nl
- << ")" << be_uidt_nl
- << " : " << node->instance_name ()
- << " (length, mb) {}" << "\n"
- << "#endif /* TAO_NO_COPY_OCTET_SEQUENCE == 1 */" << be_nl;
+ << node->local_name () << " (" << be_idt << be_idt_nl
+ << "CORBA::ULong length," << be_nl
+ << "const ACE_Message_Block* mb" << be_uidt_nl
+ << ")" << be_uidt_nl
+ << " : " << node->instance_name ()
+ << " (length, mb) {}" << "\n"
+ << "#endif /* TAO_NO_COPY_OCTET_SEQUENCE == 1 */" << be_nl;
}
*os << be_uidt_nl << "};" << be_nl;
@@ -585,7 +597,7 @@ be_visitor_sequence_ch::gen_var_defn (be_sequence *node)
*os << be_nl;
// Assignment operator from a pointer.
- *os << namebuf << " &operator= ("
+ *os << namebuf << " &operator= ("
<< node->local_name () << " *);" << be_nl;
// Assignment from _var.
@@ -601,7 +613,7 @@ be_visitor_sequence_ch::gen_var_defn (be_sequence *node)
// Arrow operator.
*os << node->local_name () << " *operator-> (void);" << be_nl;
- *os << "const " << node->local_name ()
+ *os << "const " << node->local_name ()
<< " *operator-> (void) const;" << be_nl;
*os << be_nl;
@@ -666,7 +678,7 @@ be_visitor_sequence_ch::gen_var_defn (be_sequence *node)
pdt = p->pt ();
}
- // @@ (JP) Problems with constant instantiations of TAO_Object_Manager,
+ // @@ (JP) Problems with constant instantiations of TAO_Object_Manager,
// TAO_Pseudo_Object_Manager, TAO_SeqElem_WString_Manager and
// TAO_SeqElem_String_Manager make these impossible right now [BUGID:676].
if (nt != AST_Decl::NT_string
@@ -703,7 +715,7 @@ be_visitor_sequence_ch::gen_var_defn (be_sequence *node)
*os << node->local_name () << " *&out (void);" << be_nl;
*os << node->local_name () << " *_retn (void);" << be_nl;
- // Generate an additional member function that
+ // Generate an additional member function that
// returns the underlying pointer.
*os << node->local_name () << " *ptr (void) const;" << be_uidt_nl << be_nl;
@@ -724,11 +736,11 @@ be_visitor_sequence_ch::gen_out_defn (be_sequence *node)
char namebuf [NAMEBUFSIZE];
be_type *bt = 0;
- ACE_OS::memset (namebuf,
- '\0',
+ ACE_OS::memset (namebuf,
+ '\0',
NAMEBUFSIZE);
- ACE_OS::sprintf (namebuf,
- "%s_out",
+ ACE_OS::sprintf (namebuf,
+ "%s_out",
node->local_name ()->get_string ());
// Retrieve base type.
@@ -808,7 +820,7 @@ be_visitor_sequence_ch::gen_out_defn (be_sequence *node)
*os << node->local_name () << " *&ptr_;" << be_nl;
*os << "// Assignment from T_var not allowed." << be_nl;
- *os << "void operator= (const " << node->local_name ()
+ *os << "void operator= (const " << node->local_name ()
<< "_var &);" << be_uidt_nl;
*os << "};" << be_nl << be_nl;
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ci.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ci.cpp
index 151610e5c37..59a8b83f105 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ci.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ci.cpp
@@ -114,6 +114,7 @@ be_visitor_sequence_ci::instantiate_sequence (be_sequence *node)
{
case be_sequence::MNG_PSEUDO:
case be_sequence::MNG_OBJREF:
+ case be_sequence::MNG_VALUE:
if (node->unbounded ())
{
this->gen_unbounded_obj_sequence (node);
@@ -140,42 +141,42 @@ be_visitor_sequence_ci::instantiate_sequence (be_sequence *node)
break;
default: // Not a managed type.
if (node->unbounded ())
- {
- // TAO provides extensions for octet sequences, first find out
- // if the base type is an octet (or an alias for octet).
- be_predefined_type *predef = 0;
-
- if (bt->base_node_type () == AST_Type::NT_pre_defined)
- {
- be_typedef* alias =
- be_typedef::narrow_from_decl (bt);
-
- if (alias == 0)
- {
- predef =
- be_predefined_type::narrow_from_decl (bt);
- }
- else
- {
- predef =
+ {
+ // TAO provides extensions for octet sequences, first find out
+ // if the base type is an octet (or an alias for octet).
+ be_predefined_type *predef = 0;
+
+ if (bt->base_node_type () == AST_Type::NT_pre_defined)
+ {
+ be_typedef* alias =
+ be_typedef::narrow_from_decl (bt);
+
+ if (alias == 0)
+ {
+ predef =
+ be_predefined_type::narrow_from_decl (bt);
+ }
+ else
+ {
+ predef =
be_predefined_type::narrow_from_decl (
alias->primitive_base_type ()
);
- }
- }
+ }
+ }
- if (predef != 0)
- {
- if (predef->pt() != AST_PredefinedType::PT_octet)
+ if (predef != 0)
+ {
+ if (predef->pt() != AST_PredefinedType::PT_octet)
{
- this->gen_unbounded_sequence (node);
+ this->gen_unbounded_sequence (node);
}
- }
- else
+ }
+ else
{
- this->gen_unbounded_sequence (node);
+ this->gen_unbounded_sequence (node);
}
- }
+ }
else
{
this->gen_bounded_sequence (node);
@@ -194,20 +195,20 @@ be_visitor_sequence_ci::gen_var_impl (be_sequence *node)
char fname [NAMEBUFSIZE];
char lname [NAMEBUFSIZE];
- ACE_OS::memset (fname,
- '\0',
+ ACE_OS::memset (fname,
+ '\0',
NAMEBUFSIZE);
- ACE_OS::sprintf (fname,
- "%s_var",
+ ACE_OS::sprintf (fname,
+ "%s_var",
node->full_name ());
- ACE_OS::memset (lname,
- '\0',
+ ACE_OS::memset (lname,
+ '\0',
NAMEBUFSIZE);
- ACE_OS::sprintf (lname,
- "%s_var",
+ ACE_OS::sprintf (lname,
+ "%s_var",
node->local_name ()->get_string ());
// Retrieve base type.
@@ -239,18 +240,18 @@ be_visitor_sequence_ci::gen_var_impl (be_sequence *node)
// Constuctorr from a _ptr.
*os << "ACE_INLINE" << be_nl;
- *os << fname << "::" << lname << " (" << node->local_name ()
+ *os << fname << "::" << lname << " (" << node->local_name ()
<< " *p)" << be_nl;
*os << " : ptr_ (p)" << be_nl;
*os << "{}" << be_nl << be_nl;
// Copy constructor.
*os << "ACE_INLINE" << be_nl;
- *os << fname << "::" << lname << " (const ::" << fname
+ *os << fname << "::" << lname << " (const ::" << fname
<< " &p) // copy constructor" << be_nl;
*os << "{" << be_idt_nl;
*os << "if (p.ptr_)" << be_idt_nl;
- *os << "ACE_NEW (this->ptr_, ::" << node->name ()
+ *os << "ACE_NEW (this->ptr_, ::" << node->name ()
<< " (*p.ptr_));" << be_uidt_nl;
*os << "else" << be_nl;
*os << " this->ptr_ = 0;" << be_uidt_nl;
@@ -261,10 +262,10 @@ be_visitor_sequence_ci::gen_var_impl (be_sequence *node)
{
*os << "// fixed-size base types only" << be_nl;
*os << "ACE_INLINE" << be_nl;
- *os << fname << "::" << lname << " (const ::"
+ *os << fname << "::" << lname << " (const ::"
<< node->name () << " &p)" << be_nl;
*os << "{" << be_idt_nl;
- *os << "ACE_NEW (this->ptr_, ::" << node->name ()
+ *os << "ACE_NEW (this->ptr_, ::" << node->name ()
<< " (p));" << be_uidt_nl;
*os << "}" << be_nl << be_nl;
}
@@ -278,7 +279,7 @@ be_visitor_sequence_ci::gen_var_impl (be_sequence *node)
// Assignment operator from a pointer.
*os << "ACE_INLINE " << fname << " &" << be_nl;
- *os << fname << "::operator= (" << node->local_name ()
+ *os << fname << "::operator= (" << node->local_name ()
<< " *p)" << be_nl;
*os << "{" << be_idt_nl;
*os << "delete this->ptr_;" << be_nl;
@@ -301,7 +302,7 @@ be_visitor_sequence_ci::gen_var_impl (be_sequence *node)
<< "else" << be_idt_nl
<< "{" << be_idt_nl
<< node->local_name () << " *deep_copy =" << be_idt_nl
- << "new " << node->local_name () << " (*p.ptr_);"
+ << "new " << node->local_name () << " (*p.ptr_);"
<< be_uidt_nl << be_nl
<< "if (deep_copy != 0)" << be_idt_nl
<< "{" << be_idt_nl
@@ -320,13 +321,13 @@ be_visitor_sequence_ci::gen_var_impl (be_sequence *node)
{
*os << "// fixed-size types only" << be_nl;
*os << "ACE_INLINE ::" << fname << " &" << be_nl;
- *os << fname << "::operator= (const ::" << node->name ()
+ *os << fname << "::operator= (const ::" << node->name ()
<< " &p)" << be_nl;
*os << "{" << be_idt_nl;
*os << "if (this->ptr_ != &p)" << be_nl;
*os << "{" << be_idt_nl;
*os << "delete this->ptr_;" << be_nl;
- *os << "ACE_NEW_RETURN (this->ptr_, ::"
+ *os << "ACE_NEW_RETURN (this->ptr_, ::"
<< node->name () << " (p), *this);" << be_uidt_nl;
*os << "}" << be_nl;
*os << "return *this;" << be_uidt_nl;
@@ -348,21 +349,21 @@ be_visitor_sequence_ci::gen_var_impl (be_sequence *node)
// Other extra methods - 3 cast operator ().
*os << "ACE_INLINE " << be_nl;
- *os << fname << "::operator const ::" << node->name ()
+ *os << fname << "::operator const ::" << node->name ()
<< " &() const // cast" << be_nl;
*os << "{" << be_idt_nl;
*os << "return *this->ptr_;" << be_uidt_nl;
*os << "}" << be_nl << be_nl;
*os << "ACE_INLINE " << be_nl;
- *os << fname << "::operator ::" << node->name ()
+ *os << fname << "::operator ::" << node->name ()
<< " &() // cast " << be_nl;
*os << "{" << be_idt_nl;
*os << "return *this->ptr_;" << be_uidt_nl;
*os << "}" << be_nl << be_nl;
*os << "ACE_INLINE " << be_nl;
- *os << fname << "::operator ::" << node->name ()
+ *os << fname << "::operator ::" << node->name ()
<< " &() const // cast " << be_nl;
*os << "{" << be_idt_nl;
*os << "return *this->ptr_;" << be_uidt_nl;
@@ -373,7 +374,7 @@ be_visitor_sequence_ci::gen_var_impl (be_sequence *node)
{
*os << "// variable-size types only" << be_nl;
*os << "ACE_INLINE" << be_nl;
- *os << fname << "::operator ::" << node->name ()
+ *os << fname << "::operator ::" << node->name ()
<< " *&() // cast " << be_nl;
*os << "{" << be_idt_nl;
*os << "return this->ptr_;" << be_uidt_nl;
@@ -434,7 +435,7 @@ be_visitor_sequence_ci::gen_var_impl (be_sequence *node)
pdt = p->pt ();
}
- // @@ (JP) Problems with constant instantiations of TAO_Object_Manager,
+ // @@ (JP) Problems with constant instantiations of TAO_Object_Manager,
// TAO_Pseudo_Object_Manager, TAO_SeqElem_WString_Manager and
// TAO_SeqElem_String_Manager make these impossible right now [BUGID:676].
if (nt != AST_Decl::NT_string
@@ -461,7 +462,7 @@ be_visitor_sequence_ci::gen_var_impl (be_sequence *node)
*os << "{" << be_idt_nl;
*os << "return ACE_const_cast (const ";
-
+
if (bt->accept (visitor) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
@@ -555,7 +556,7 @@ be_visitor_sequence_ci::gen_out_impl (be_sequence *node)
// Constuctorr from a pointer.
*os << "ACE_INLINE" << be_nl;
- *os << fname << "::" << lname << " (" << node->local_name ()
+ *os << fname << "::" << lname << " (" << node->local_name ()
<< " *&p)" << be_nl;
*os << " : ptr_ (p)" << be_nl;
*os << "{" << be_idt_nl;
@@ -564,7 +565,7 @@ be_visitor_sequence_ci::gen_out_impl (be_sequence *node)
// Constructor from _var &.
*os << "ACE_INLINE" << be_nl;
- *os << fname << "::" << lname << " (" << node->local_name ()
+ *os << fname << "::" << lname << " (" << node->local_name ()
<< "_var &p) // constructor from _var" << be_nl;
*os << " : ptr_ (p.out ())" << be_nl;
*os << "{" << be_idt_nl;
@@ -574,18 +575,18 @@ be_visitor_sequence_ci::gen_out_impl (be_sequence *node)
// Copy constructor.
*os << "ACE_INLINE" << be_nl;
- *os << fname << "::" << lname << " (const ::" << fname
+ *os << fname << "::" << lname << " (const ::" << fname
<< " &p) // copy constructor" << be_nl;
- *os << " : ptr_ (ACE_const_cast (" << lname
+ *os << " : ptr_ (ACE_const_cast (" << lname
<< "&, p).ptr_)" << be_nl;
*os << "{}" << be_nl << be_nl;
// Assignment operator from _out &.
*os << "ACE_INLINE ::" << fname << " &" << be_nl;
- *os << fname << "::operator= (const ::" << fname
+ *os << fname << "::operator= (const ::" << fname
<< " &p)" << be_nl;
*os << "{" << be_idt_nl;
- *os << "this->ptr_ = ACE_const_cast (" << lname
+ *os << "this->ptr_ = ACE_const_cast (" << lname
<< "&, p).ptr_;" << be_nl;
*os << "return *this;" << be_uidt_nl;
*os << "}" << be_nl << be_nl;
@@ -594,7 +595,7 @@ be_visitor_sequence_ci::gen_out_impl (be_sequence *node)
// Assignment operator from pointer.
*os << "ACE_INLINE ::" << fname << " &" << be_nl;
- *os << fname << "::operator= (" << node->local_name ()
+ *os << fname << "::operator= (" << node->local_name ()
<< " *p)" << be_nl;
*os << "{" << be_idt_nl;
*os << "this->ptr_ = p;" << be_nl;
@@ -603,7 +604,7 @@ be_visitor_sequence_ci::gen_out_impl (be_sequence *node)
// Other extra methods - cast operator ().
*os << "ACE_INLINE " << be_nl;
- *os << fname << "::operator ::" << node->name ()
+ *os << fname << "::operator ::" << node->name ()
<< " *&() // cast" << be_nl;
*os << "{" << be_idt_nl;
*os << "return this->ptr_;" << be_uidt_nl;
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp
index ba0e7ecb4e6..1625b56b86a 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp
@@ -18,9 +18,9 @@
//
// ============================================================================
-#include "idl.h"
-#include "idl_extern.h"
-#include "be.h"
+#include "idl.h"
+#include "idl_extern.h"
+#include "be.h"
#include "be_visitor_sequence.h"
@@ -83,6 +83,12 @@ be_visitor_sequence_cs::gen_base_sequence_class (be_sequence *node)
else
*os << "TAO_Bounded_Pseudo_Sequence<";
break;
+ case be_sequence::MNG_VALUE:
+ if (node->unbounded ())
+ *os << "TAO_Unbounded_Valuetype_Sequence<";
+ else
+ *os << "TAO_Bounded_Valuetype_Sequence<";
+ break;
case be_sequence::MNG_STRING:
if (node->unbounded ())
*os << "TAO_Unbounded_String_Sequence";
@@ -341,6 +347,7 @@ be_visitor_sequence_cs::instantiate_sequence (be_sequence *node)
{
case be_sequence::MNG_PSEUDO:
case be_sequence::MNG_OBJREF:
+ case be_sequence::MNG_VALUE:
if (node->unbounded ())
this->gen_unbounded_obj_sequence (node);
else
@@ -360,40 +367,40 @@ be_visitor_sequence_cs::instantiate_sequence (be_sequence *node)
break;
default: // not a managed type
if (node->unbounded ())
- {
- // TAO provides extensions for octet sequences, first find out
- // if the base type is an octet (or an alias for octet)
- be_predefined_type *predef = 0;
- if (bt->base_node_type () == AST_Type::NT_pre_defined)
- {
- be_typedef* alias =
- be_typedef::narrow_from_decl (bt);
-
- if (alias == 0)
- {
- predef =
- be_predefined_type::narrow_from_decl (bt);
- }
- else
- {
- predef =
+ {
+ // TAO provides extensions for octet sequences, first find out
+ // if the base type is an octet (or an alias for octet)
+ be_predefined_type *predef = 0;
+ if (bt->base_node_type () == AST_Type::NT_pre_defined)
+ {
+ be_typedef* alias =
+ be_typedef::narrow_from_decl (bt);
+
+ if (alias == 0)
+ {
+ predef =
+ be_predefined_type::narrow_from_decl (bt);
+ }
+ else
+ {
+ predef =
be_predefined_type::narrow_from_decl (
alias->primitive_base_type ()
);
- }
- }
- if (predef != 0)
- {
- if (predef->pt() != AST_PredefinedType::PT_octet)
+ }
+ }
+ if (predef != 0)
+ {
+ if (predef->pt() != AST_PredefinedType::PT_octet)
{
- this->gen_unbounded_sequence (node);
+ this->gen_unbounded_sequence (node);
}
- }
- else
+ }
+ else
{
- this->gen_unbounded_sequence (node);
+ this->gen_unbounded_sequence (node);
}
- }
+ }
else
{
this->gen_bounded_sequence (node);
diff --git a/TAO/TAO_IDL/be_include/be_sequence.h b/TAO/TAO_IDL/be_include/be_sequence.h
index caef7cdfed1..abf916c0b56 100644
--- a/TAO/TAO_IDL/be_include/be_sequence.h
+++ b/TAO/TAO_IDL/be_include/be_sequence.h
@@ -48,6 +48,7 @@ public:
MNG_STRING,
MNG_WSTRING,
MNG_OBJREF,
+ MNG_VALUE,
MNG_PSEUDO
};
diff --git a/TAO/TAO_IDL/be_include/be_visitor_sequence/buffer_type.h b/TAO/TAO_IDL/be_include/be_visitor_sequence/buffer_type.h
index 1fe1880f3dd..523f903bc98 100644
--- a/TAO/TAO_IDL/be_include/be_visitor_sequence/buffer_type.h
+++ b/TAO/TAO_IDL/be_include/be_visitor_sequence/buffer_type.h
@@ -45,6 +45,8 @@ public:
virtual int visit_predefined_type (be_predefined_type *node);
virtual int visit_interface (be_interface *node);
virtual int visit_interface_fwd (be_interface_fwd *node);
+ virtual int visit_valuetype (be_valuetype *node);
+ virtual int visit_valuetype_fwd (be_valuetype_fwd *node);
virtual int visit_structure (be_structure *node);
virtual int visit_enum (be_enum *node);
virtual int visit_exception (be_exception *node);
diff --git a/TAO/TAO_IDL/be_include/be_visitor_sequence/cdr_op_cs.h b/TAO/TAO_IDL/be_include/be_visitor_sequence/cdr_op_cs.h
index 1a36b175013..b4be5b420c9 100644
--- a/TAO/TAO_IDL/be_include/be_visitor_sequence/cdr_op_cs.h
+++ b/TAO/TAO_IDL/be_include/be_visitor_sequence/cdr_op_cs.h
@@ -61,6 +61,12 @@ public:
virtual int visit_interface_fwd (be_interface_fwd *node);
// visit an interface forward node
+ virtual int visit_valuetype (be_valuetype *node);
+ // visit an interface
+
+ virtual int visit_valuetype_fwd (be_valuetype_fwd *node);
+ // visit an interface forward node
+
virtual int visit_predefined_type (be_predefined_type *node);
// visit a predefined type node
diff --git a/TAO/TAO_IDL/be_include/be_visitor_sequence/elemtype.h b/TAO/TAO_IDL/be_include/be_visitor_sequence/elemtype.h
index c307db5fa6e..993a9894fff 100644
--- a/TAO/TAO_IDL/be_include/be_visitor_sequence/elemtype.h
+++ b/TAO/TAO_IDL/be_include/be_visitor_sequence/elemtype.h
@@ -48,6 +48,8 @@ public:
virtual int visit_predefined_type (be_predefined_type *node);
virtual int visit_interface (be_interface *node);
virtual int visit_interface_fwd (be_interface_fwd *node);
+ virtual int visit_valuetype (be_valuetype *node);
+ virtual int visit_valuetype_fwd (be_valuetype_fwd *node);
virtual int visit_structure (be_structure *node);
virtual int visit_enum (be_enum *node);
virtual int visit_exception (be_exception *node);
diff --git a/TAO/TAO_IDL/be_include/be_visitor_sequence/sequence_base.h b/TAO/TAO_IDL/be_include/be_visitor_sequence/sequence_base.h
index 710e595aa6d..71bca6b32b2 100644
--- a/TAO/TAO_IDL/be_include/be_visitor_sequence/sequence_base.h
+++ b/TAO/TAO_IDL/be_include/be_visitor_sequence/sequence_base.h
@@ -51,6 +51,8 @@ public:
virtual int visit_predefined_type (be_predefined_type *node);
virtual int visit_interface (be_interface *node);
virtual int visit_interface_fwd (be_interface_fwd *node);
+ virtual int visit_valuetype (be_valuetype *node);
+ virtual int visit_valuetype_fwd (be_valuetype_fwd *node);
virtual int visit_structure (be_structure *node);
virtual int visit_enum (be_enum *node);
virtual int visit_exception (be_exception *node);
@@ -71,7 +73,7 @@ class be_visitor_sequence_base_template_args: public be_visitor_sequence_base
//
// =TITLE
// be_visitor_sequnce_base_template_args
- //
+ //
// =Description
// This is a derived class just used to override the method
// visit_interface that generates the arguments for the
@@ -81,7 +83,7 @@ class be_visitor_sequence_base_template_args: public be_visitor_sequence_base
public:
be_visitor_sequence_base_template_args (be_visitor_context *ctx,
be_sequence *node );
-
+
~be_visitor_sequence_base_template_args (void);
//Dtor
@@ -90,6 +92,10 @@ public:
virtual int visit_interface_fwd (be_interface_fwd *node);
+ virtual int visit_valuetype (be_valuetype *node);
+
+ virtual int visit_valuetype_fwd (be_valuetype_fwd *node);
+
virtual int visit_predefined_type (be_predefined_type *node);
private:
be_sequence *beseq_;