// Compute total number of members. int AST_Operation::compute_argument_attr (void) { if (this->argument_count_ != -1) { return 0; } AST_Decl *d = 0; AST_Type *type = 0; AST_Argument *arg = 0; this->argument_count_ = 0; // If there are elements in this scope. if (this->nmembers () > 0) { // Instantiate a scope iterator. for (UTL_ScopeActiveIterator si (this, UTL_Scope::IK_decls); !si.is_done (); si.next ()) { // Get the next AST decl node. d = si.item (); if (d->node_type () == AST_Decl::NT_argument) { this->argument_count_++; arg = AST_Argument::narrow_from_decl (d); if (arg->direction() == AST_Argument::dir_IN || arg->direction() == AST_Argument::dir_INOUT) { this->has_in_arguments_ = true; } type = AST_Type::narrow_from_decl (arg->field_type ()); if (type->node_type () == AST_Decl::NT_native) { this->has_native_ = 1; } } } } type = AST_Type::narrow_from_decl (this->return_type ()); if (type->node_type () == AST_Decl::NT_native) { this->has_native_ = 1; } return 0; }
int AST_Operation::count_arguments_with_direction (int direction_mask) { int count = 0; for (UTL_ScopeActiveIterator si (this, UTL_Scope::IK_decls); !si.is_done (); si.next ()) { AST_Argument *arg = AST_Argument::narrow_from_decl (si.item ()); if ((arg->direction () & direction_mask) != 0) { ++count; } } return count; }
int be_visitor_operation_direct_proxy_impl_ss::gen_invoke ( be_visitor_context & /*ctx*/, be_operation *node ) { TAO_OutStream *os = this->ctx_->stream (); *os << "->" << node->local_name () << " (" << be_idt << be_idt << be_idt; UTL_ScopeActiveIterator si (node, UTL_Scope::IK_decls); if (si.is_done ()) { *os << be_uidt_nl << ");"; return 0; } AST_Argument *arg = 0; int index = 1; for (; !si.is_done (); si.next (), ++index) { arg = AST_Argument::narrow_from_decl (si.item ()); *os << (index == 1 ? "" : ",") << be_nl << "((TAO::Arg_Traits< "; this->gen_arg_template_param_name (arg, arg->field_type (), os); *os << ">::"; switch (arg->direction ()) { case AST_Argument::dir_IN: *os << "in"; break; case AST_Argument::dir_INOUT: *os << "inout"; break; case AST_Argument::dir_OUT: *os << "out"; default: break; } *os << "_arg_val *) args[" << index << "])->arg ()"; } // End the upcall *os << be_uidt_nl << ");"; return 0; }