diff options
author | gokhale <asgokhale@users.noreply.github.com> | 1997-12-30 04:11:20 +0000 |
---|---|---|
committer | gokhale <asgokhale@users.noreply.github.com> | 1997-12-30 04:11:20 +0000 |
commit | de713ce8fd8f63ba78d1ace01cfab40b7f5c6719 (patch) | |
tree | 4056f838173df7da7e977da5f90c2e894c56da85 /TAO/TAO_IDL | |
parent | c87966ff014b059058e359747eea99511d41d5bf (diff) | |
download | ATCD-de713ce8fd8f63ba78d1ace01cfab40b7f5c6719.tar.gz |
*** empty log message ***
Diffstat (limited to 'TAO/TAO_IDL')
-rw-r--r-- | TAO/TAO_IDL/be/be_sequence.cpp | 112 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_state_argument.cpp | 16 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_state_attribute.cpp | 4 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_state_operation.cpp | 2 | ||||
-rw-r--r-- | TAO/TAO_IDL/be_include/be_sequence.h | 2 |
5 files changed, 117 insertions, 19 deletions
diff --git a/TAO/TAO_IDL/be/be_sequence.cpp b/TAO/TAO_IDL/be/be_sequence.cpp index 3d3fa8ba987..f10aec1f658 100644 --- a/TAO/TAO_IDL/be/be_sequence.cpp +++ b/TAO/TAO_IDL/be/be_sequence.cpp @@ -53,7 +53,7 @@ be_sequence::be_sequence (AST_Expression *v, AST_Type *t) } // helper to create_name -const char * +char * be_sequence::gen_name (void) { char namebuf [NAMEBUFSIZE]; @@ -97,7 +97,7 @@ be_sequence::gen_name (void) ACE_OS::sprintf (namebuf, "%s_%d", namebuf, this->max_size ()->ev ()->u.ulval); } - return namebuf; + return ACE_OS::strdup (namebuf); } // create a name for ourselves @@ -324,6 +324,17 @@ be_sequence::gen_client_header (void) *ch << " &operator[] (CORBA::ULong index) const;" << nl; cg->pop (); // back to the previous state + // init_mgr method for managed types + switch (this->managed_type ()) + { + case be_sequence::MNG_OBJREF: + case be_sequence::MNG_STRING: + ch->indent (); + *ch << "void init_mgr (void);" << nl; + break; + default: + break; + } s = cg->make_state (); // generate the static allocbuf and freebuf methods *ch << "static "; @@ -737,15 +748,67 @@ be_sequence::gen_client_stubs (void) cs->decr_indent (); *cs << "}\n\n"; + // the init manager method for managed typed sequences + if (this->managed_type () != be_sequence::MNG_NONE) + { + cs->indent (); + *cs << "// init manager" << nl; + *cs << "void " << this->name () << "::init_mgr (void)" << nl; + *cs << "{\n"; + cs->incr_indent (); + + // if release flag, free the manager + *cs << "if (this->release_)" << nl; + *cs << "{\n"; + cs->incr_indent (); + // only for obj references and strings, we need to free each individual + // element + if (this->managed_type () != be_sequence::MNG_NONE) + { + *cs << "delete []this->mgr_; // ensures each element is freed" << nl; + } + cs->decr_indent (); + *cs << "}" << nl; + // copy each element + switch (this->managed_type ()) + { + case be_sequence::MNG_OBJREF: + { + *cs << "this->mgr_ = new " << this->name () << + "::TAO_ObjRefMngType [this->maximum_];" << nl; + *cs << "for (CORBA::ULong i=0; i < this->length_; i++)" << nl; + *cs << "{" << nl; + *cs << "\tthis->mgr_[i].ptr_ = &this->buffer_[i];" << nl; + *cs << "\tthis->mgr_[i].release_ = 1;" << nl; + *cs << "}\n"; + } + break; + case be_sequence::MNG_STRING: + { + *cs << "this->mgr_ = new " << this->name () << + "::TAO_StrMngType [this->maximum_];" << nl; + *cs << "for (CORBA::ULong i=0; i < this->length_; i++)" << nl; + *cs << "{" << nl; + *cs << "\tthis->mgr_[i].ptr_ = &this->buffer_[i];" << nl; + *cs << "\tthis->mgr_[i].release_ = 1;" << nl; + *cs << "}\n"; + } + break; + default: + break; + } + cs->decr_indent (); + *cs << "}\n\n"; + } + // the length method cs->indent (); *cs << "void" << nl; *cs << this->name () << "::length (CORBA::ULong length)" << nl; *cs << "{\n"; cs->incr_indent (); - if (this->max_size () != 0) // bounded sequence - we cannot increase - // length more than its max => no - // reallocation necessary + if (!this->unbounded_) // bounded sequence - we cannot increase length + // more than its max => no reallocation necessary { // The sequence has a maximum length, check that the new // length is valid before changing anything. @@ -753,7 +816,7 @@ be_sequence::gen_client_stubs (void) *cs << "{\n"; cs->incr_indent (); *cs << "// @@ throw something?" << nl; - *cs << "return;" << nl; + *cs << "return;\n"; cs->decr_indent (); *cs << "}" << nl; *cs << "this->length_ = length;\n"; @@ -783,15 +846,21 @@ be_sequence::gen_client_stubs (void) { case be_sequence::MNG_OBJREF: { - *cs << this->name () << "::TAO_ObjRefMngType *tmp_mgr" << + *cs << this->name () << "::TAO_ObjRefMngType *tmp_mgr_" << " = new " << this->name () << "::TAO_ObjRefMngType [length];" << nl; - *cs << "for (CORBA::ULong i=0; i < length; i++)" << nl; + *cs << "CORBA::ULong i;" << nl; + *cs << "// copy old buffer" << nl; + *cs << "for (i=0; i < this->length_; i++)" << nl; *cs << "{" << nl; *cs << "\ttmp[i] = " << bt->name () << "::_duplicate (" << "this->buffer_[i]);" << nl; - *cs << "\ttmp_mgr[i].ptr_ = &tmp[i];" << nl; - *cs << "\ttmp_mgr[i].release_ = 1; // always" << nl; + *cs << "}" << nl; + *cs << "// initialize the new manager" << nl; + *cs << "for (i=0; i < length; i++)" << nl; + *cs << "{" << nl; + *cs << "\ttmp_mgr_[i].ptr_ = &tmp[i];" << nl; + *cs << "\ttmp_mgr_[i].release_ = 1; // always" << nl; *cs << "}" << nl; } break; @@ -800,17 +869,30 @@ be_sequence::gen_client_stubs (void) *cs << this->name () << "::TAO_StrMngType *tmp_mgr_" << " = new " << this->name () << "::TAO_StrMngType [length];" << nl; - *cs << "for (CORBA::ULong i=0; i < length; i++)" << nl; + *cs << "CORBA::ULong i;" << nl; + *cs << "// copy old buffer" << nl; + *cs << "for (i=0; i < this->length_; i++)" << nl; *cs << "{" << nl; *cs << "\ttmp[i] = CORBA::string_dup (" << "this->buffer_[i]);" << nl; - *cs << "\ttmp_mgr[i]->ptr_ = &tmp[i];" << nl; - *cs << "\ttmp_mgr[i]->release_ = 1;" << nl; + *cs << "}" << nl; + *cs << "// initialize the new manager" << nl; + *cs << "for (i=0; i < length; i++)" << nl; + *cs << "{" << nl; + *cs << "\ttmp_mgr_[i].ptr_ = &tmp[i];" << nl; + *cs << "\ttmp_mgr_[i].release_ = 1;" << nl; *cs << "}" << nl; } break; default: // all other types are self managed, just assign them. - *cs << "\ttmp[i] = this->buffer_[i];" << nl; + { + *cs << "CORBA::ULong i;" << nl; + *cs << "// copy old buffer" << nl; + *cs << "for (i=0; i < this->length_; i++)" << nl; + *cs << "{" << nl; + *cs << "\ttmp[i] = this->buffer_[i];" << nl; + *cs << "}" << nl; + } } // if release is set, we must free the previous buffer *cs << "if (this->release_) // free old one if we own it" << nl; @@ -832,7 +914,7 @@ be_sequence::gen_client_stubs (void) *cs << "this->release_ = 1; //after reallocation, we own it" << nl; if (this->managed_type () != be_sequence::MNG_NONE) { - *cs << "this->mgr_ = tmp_mgr;" << nl; + *cs << "this->mgr_ = tmp_mgr_;" << nl; } *cs << "this->maximum_ = length;\n"; cs->decr_indent (); diff --git a/TAO/TAO_IDL/be/be_state_argument.cpp b/TAO/TAO_IDL/be/be_state_argument.cpp index e657651a8bd..8d7055d6f41 100644 --- a/TAO/TAO_IDL/be/be_state_argument.cpp +++ b/TAO/TAO_IDL/be/be_state_argument.cpp @@ -1753,12 +1753,16 @@ be_state_argument::gen_code (be_type *bt, be_decl *d, be_type *type) break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { - // nothing + // if we are sequence, call init manager + if (type->node_type () == AST_Decl::NT_sequence) + { + *os << arg->local_name () << ".init_mgr ();" << nl; + } } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { - *os << arg->local_name () << ", "; + *os << "*" << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: @@ -1823,7 +1827,7 @@ be_state_argument::gen_code (be_type *bt, be_decl *d, be_type *type) else { // declare a variable - *os << bt->name () << " " << arg->local_name () << + *os << bt->name () << " *" << arg->local_name () << " = new " << bt->name () << ";" << nl; #if 0 // now define a NamedValue_ptr @@ -1870,6 +1874,12 @@ be_state_argument::gen_code (be_type *bt, be_decl *d, be_type *type) break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { + // if we are sequence, call init manager + if (type->node_type () == AST_Decl::NT_sequence) + { + *os << "_tao_base_" << arg->local_name () << + "->init_mgr ();" << nl; + } if (bt->size_type () == be_decl::VARIABLE) { *os << arg->local_name () << " = _tao_base_" << diff --git a/TAO/TAO_IDL/be/be_state_attribute.cpp b/TAO/TAO_IDL/be/be_state_attribute.cpp index d74e6d51da6..f864f6ec368 100644 --- a/TAO/TAO_IDL/be/be_state_attribute.cpp +++ b/TAO/TAO_IDL/be/be_state_attribute.cpp @@ -944,6 +944,10 @@ be_state_attribute::gen_code (be_type *bt, be_decl *d, be_type *type) break; case TAO_CodeGen::TAO_ATTRIBUTE_RETVAL_RETURN_CS: { + if (type->node_type () == AST_Decl::NT_sequence) + { + *os << "retval->init_mgr ();" << nl; + } *os << "return retval;" << nl; } break; diff --git a/TAO/TAO_IDL/be/be_state_operation.cpp b/TAO/TAO_IDL/be/be_state_operation.cpp index f9221f1ada1..80ba60d6e63 100644 --- a/TAO/TAO_IDL/be/be_state_operation.cpp +++ b/TAO/TAO_IDL/be/be_state_operation.cpp @@ -473,6 +473,8 @@ be_state_operation::gen_code (be_type *bt, be_decl *d, be_type *type) break; case TAO_CodeGen::TAO_OPERATION_RETVAL_RETURN_CS: { + // if we are sequence, call init manager + *os << "retval->init_mgr ();" << nl; *os << "return retval;" << nl; } break; diff --git a/TAO/TAO_IDL/be_include/be_sequence.h b/TAO/TAO_IDL/be_include/be_sequence.h index f44a4eb72d6..b179dbadb71 100644 --- a/TAO/TAO_IDL/be_include/be_sequence.h +++ b/TAO/TAO_IDL/be_include/be_sequence.h @@ -119,7 +119,7 @@ public: DEF_NARROW_FROM_DECL (be_sequence); protected: - virtual const char *gen_name (void); + virtual char *gen_name (void); // helper to create_name private: |