Issue 52: Omission in union C++ mapping
Issue 75: Access to sequence buffers
Issue 91: Efficiency issue in C++ mapping
Issue 92: T__alloc in C mapping
Issue 94: Defining an operator for struct/union/sequence _var types
Issue 95: Re-opening modules
Issue 96: C++ classes for modules
Issue 98: In String Argument Passing Question
Issue 100: Union discriminators in C++
Issue 101: Memory Management Clarification
Issue 123: Fixed structs
Issue 125: Passing of object reference in pointers
Issue 134: Union problem
Issue 141: Practical problem with DII using Request Pseudo Object
Issue 142: inserter and extractor functions for exceptions
Issue 143: Testing exceptions
Issue 144: Rethrowing exceptions
Issue 145: Missing Any inserter
Issue 146: Any extractor signature problem
Issue 147: Defintion of Any
Issue 148: Adding T_copy function
Issue 150: Any string extractor
Issue 154: Problem with Any::to_object memory management
Issue 178: Bounded sequence problem (Section 16.11 p. 16-23)
Issue 185: Return value of maximum() for unbounded sequences
Issue 186: Inconsistent interfaces for the operation pairs *duplicate* and
Issue 187: Freeing inaccessible storage for T_var as out parameter
Issue 188: interface mapping
Issue 189: Distinction between _var and _ptr types
Issue 190: Names of anonymous types
Issue 191: get_principal () needs an environment parameter
Issue 192: Identifier conflicts resulting from the language mapping
Issue 193: Pseudo objects for DSI
Issue 194: Implementation dependency for _var and _ptr
Issue 195: _ptr member accessors for string and objref
Issue 196: illegal union access when discriminator is wrong
Issue 197: TypeCode/Value mismatch in ANY
Issue 198: Representation of void* returned from ANY
Issue 199: Levels of portability conformance requested
Issue 200: fixed- vs. variable-length types
Issue 201: example incorrect?
Issue 202: Assignment to T_var
Issue 203: Detection of initialization of T_var
Issue 204: string and objrev members of constructed types
Issue 205: Taking T out of T_var
Issue 206: Implementation description
Issue 207: C++ mapping complexity
Issue 208: Autoextension of sequences
Issue 209: Sequence implementation
Issue 210: State of release flag for sequence
Issue 211: Sequence maximum() call
Issue 212: References returned from sequence operator[] after realloc
Issue 213: Sequence lacks common features
Issue 214: Sequence buffer types
Issue 215: C vs. C++ coding style
Issue 216: Sequence creation
Issue 217: Copying of out parameters
Issue 218: Semantics of sequence length() operation
Issue 219: Array slice example
Issue 220: Return value of operator[] for array var
Issue 221: Array_forany
Issue 222: Global functions vs. T_var namespace
Issue 223: Storage ownership issue
Issue 224: Pointers vs. values
Issue 225: handling void* from Any
Issue 226: void* from Any for constructed types
Issue 227: anonymus types
Issue 228: callee-allocated storage modification
Issue 229: Typo in table 3?
Issue 230: _var types for fixed-length types
Issue 231: union accessors
Issue 232: Mapping for IDL context
Issue 234: accessor function on SystemException
Issue 235: A_ptr and A_var should be distinct types
Issue 236: operator>>= on strings and object references
Issue 237: Allocated storage for out and return strings
Issue 238: C++ namespaces
Issue 239: Implementation of parameter passing for T_var types
Issue 240: Any and IN_COPY_VALUE
Issue 241: allocbuf and initialization of elements
Issue 242: freebuf and destruction of elements
Issue 244: RTTI vs. _narrow for exceptions
Issue 245: accessor members for structs
Issue 246: Access to sequence elements
Issue 247: TypeCode mapping update for CORBA 2.)
Issue 248: nested ptr and var types
Issue 249: to/from string for Any type safety
Issue 250: union accessors require temporaries
Issue 251: decompose Any into constituent primitives
Issue 252: T_copy for string and array
Issue 253: Name field for SystemExceptions
Issue 254: iterating over Any primitives
Issue 255: Constructor taking discriminant as argument
Issue 256: Accessors for release flag of sequence
Issue 257: Any release flag and operator<<=
Issue 258: Accessors for the Any release flag
Issue 259: Accessor for exception id
Issue 260: Exception id for each exception type
Issue 261: TypeCode for each basic and IDL defined types
Issue 262: TypeCode interpreter
Issue 263: buffer classes for sequences
Issue 264: make String_var reference but not adopt
Issue 265: explicit copy/adopt for String_var
Issue 266: operator<< for ostreams and Exceptions
Issue 267: ANy release flag and operator
Issue 268: C++ semantics vs. IDL semantics
Issue 269: Default constructor for String_var
Issue 290: u++ binding for ServerRequest pseudo object
Issue 456: Interpretation of _narrow semantics
Issue 479: DII and DSI are useless with current Any
Issue 480: Persistent Any values
Issue 481: [q] intf name == op name
Issue 482: Defect with anonymus types in union mapping
Issue 484: OMG C++ Mapping: Implicit Conversion Operators
Issue 496: Double underscore identifier mapping
Issue 497: Legal IDL cannot map to C++
Issue 501: Bug in C++ NVList mapping
Issue 594: Boolean type left undefined by C++ mapping
Issue 599: const method qualification should be removed
Issue 600: String_var and Any_var are missing the T_ptr definition
Issue 601: Section 17..13.1 release()method should be added to mappping
Issue 605: Section 8.2: set_exception() supported by BOA?
Issue 608: Interface definition must be standardized
Issue 615: POA_*_tie classes in 18.1.4 can"t be supported
Issue 617: Why does get_principal() take an Environment parameter
Issue 618: IDL from Ennvironment has invalid attribute
Issue 621: C mapping for list_initial_services is incorrect
Issue 622: Section 16.2, Section 16.6: editorial
Issue 627: PortableServer:ObjectId_tow_wstring() and string_to_ObjectId()
Issue 637: Section 18.1.2: _this() and IMPLICIT_ACTIVATION need clarification
Issue 646: Blocking semantics of get_next_response not well specified
Issue 647: include files
Issue 653: sec. 18.1.2: explicit information on _this() is missing
Issue 663: Implementation problem with policy objects using root POA
Issue 673: C++ mapping of servants may result in ambigous run-time behavior
Issue 674: Multiple inheritance of C++ Servants is ill-defined
Issue 678: inout strings modifiable?
Issue 705: C and C++ Mapping question
Issue 721: Bounded strings
Issue 722: Wide string allocation (1)
Issue 723: Wide string allocation (2)
Issue 731: IDL generated C++ types and stream operators
Issue 732: Typo in C++ mapping
Issue 781: C++ mapping for IN object references
Issue 800: Missing Mappings for Object
Issue 801: Alias type codes in any values
Issue 803: C++ mapping: missing from_wchar and to_wchar
Issue 804: Typos in PIDL to C++ mappings
Issue 863: Read-only restrictions on parameters
Issue 902: CORBA::Bounds and CORBA::TypeCode::Bounds
Issue 914: Mappings for hash, is_equivalent, _is_a and _non_existent
Issue 920: ServantBase mappings
Issue 932: Semantics of >>= operator in C++ mapping
Issue 933: CORBA::ORB::InvalidName ambigious in C++ mapping
Issue 956: No conversion defined from a B_var to an A_ptr
Issue 1056: Fixed types in orbos/98-01-11
Issue 1069: Typos on p 20-34 of orbos/98-01-11
Issue 1070: macros for fixed arithmetic results
Issue 1072: fixed_digits and fixed_scale member functions
Issue 1073: Missing constructor for Fixed
Issue 1092: C++ mapping for fixed is broken (01)
Issue 1093: C++ mapping for fixed is broken (02)
Issue 1095: Old References in C++ mapping
Issue 1115: TypeCode_ptr base_typecode(TypeCode_ptr tc)
Issue 1124: C++ Fixed type issue (01)
Issue 1125: Fixed type (02)
Issue 1126: C++ Fixed Type (03)
Issue 1128: String member initialization
Issue 1134: C++ Sequence mapping Question
Issue 1137: Typos in parameter passing rules
Issue 1148: Typo in orbos/98-01-11
Issue 1149: _out parameter typo
Issue 1289: How to put a generic CORBA exception into an Any
Issue 1319: C++ Any mapping proposed change
Issue 1383: Missing operators in orbos/98-01-11
Issue 1384: Mapping for wide strings
Issue 1386: Any and WChar issue
Issue 1418: C++ _var type widening proposal
Issue 1519: _var & _out types problems (01)
Issue 1520: Spec does not mention the existance of an Any_out class
Issue 1521: Spec is too verse in defining the T_var types for fixed length
Issue 1534: Add _narrow() operation to each POA servant
Issue 1535: Do POA servant classes need to use virtual inheritance?
Issue 1538: Missing text describing fixed point constant mapping
Issue 1617: C++ mapping for strings
Issue 1626: C++ issue to coordinate with proposed resolution of issue 752
Issue 1627: Problems with deactivate_object()
Issue 1631: C++ Servants: Adding Reference counting
Issue 1655: Section 5.3.6.3 Value Factories
Issue 1656: C++ language mapping minor editorial revision
Issue 1657: Section 7.3.5 ValueBase editorial changes
Issue 1658: Parameter passing rules for ValueFactory
Issue 1659: Section 7.3.6: PortableServer::ValueRefCountBase
Issue 1686: resolve_initial_references missing from Orb interface
Issue 1700: void * functions for Any
Issue 1735: Servant management rules
Issue 1747: from_string issue
Issue 1776: New C++ issue about T_out classes
Issue 1777: DSI C++ issue
Issue 1783: Comparison operators for Fixed
Issue 1785: Passing Fixed to operations
Issue 1794: _ptr_type and _var_type typedefs
Issue 1799: struct containing Fixed type
Issue 1898: Fixed-point initialization
Issue 1899: Rounding and truncation of Fixed
Issue 1923: Is SystemException supposed to be concrete?
Issue 1937: Signature of _narrow in exceptions
Issue 1946: sequence allocbuf parameter != 0
Issue 1947: sequence max < length
Issue 1971: Extraction of strings from an Any
Issue 1983: Extraction of Fixed from Any
Issue 1984: Generic extraction of Fixed
Issue 2002: The C++ mapping for valuetype _narrow should not _add_ref
Issue 2003: Tie classes
Issue 2029: _primary_interface
Issue 2032: Typedef for ties?
Issue 2035: mapping IDL Unicode escapes to C++
Issue 2097: 98-09-03, exception inconsistency
Issue 2118: Any missing LongLong operators, etc?
Issue 2207: Need more info for custom marshalled value in C++
Issue 2215: Object reference members, _var, and widening
Issue 2222: Is public _ptr member mandatory?
Issue 2226: Errors in example code for boxed struct
Issue 2231: _raise() should be const
Issue 2234: String sequence and allocbuff
Issue 2253: portable includes
Issue 2285: Value Box Mapping
Issue 2286: string allocation functions -- description ambiguous
Issue 2288: C++ spec uses reserved names in global namespace
Issue 2306: Valuetypes as operation arguments
Issue 2309: Memory management of recursive value
Issue 2335: Extraction from Any by pointer
Issue 2345: "Diamond of Death" in CosLifeCycleReference
Issue 2346: Any inserters and extractors
Issue 2350: boxed types for floating point values
Issue 2351: CORBA2.3 C++ mapping for the TypeCode class (section 20.31.2)
Issue 2354: CustomMarshal mapping type
Issue 2355: ORB mapping re Policy
Issue 2357: Misleading text for DSI invoke() and _primary_interface()
Issue 2375: Transfer of C++ codes
Issue 2376: Interface issue
Issue 2441: tie doesn"t do ref counting
Issue 2443: C++ keyword mapping ambiguous
Issue 2445: add a _var type for each servant type
Issue 2453: Any inserters for strings need to use const pointers
Issue 2463: Incorrect types for type-safe Any extraction
Issue 2489: 20.17.9 Valuetype Inheritance
Issue 2496: generate concrete classes and factories for valuetypes without initializer
Issue 2497: Value boxes and sensible value issue
Issue 2498: narrow abstract interface class to concrete object?
Issue 2499: Add AbstractBase base type to IDL language?
Issue 2523: Valuetype argument passing
Issue 2525: string sequences and empty strings
Issue 2530: Sequences and get_buffer()
Issue 2560: Factories for StringValue and WStringValue
Issue 2561: Valuetypes and arbitrary graphs
Issue 2564: Valuetypes and _out classes in C++ mapping
Issue 2614: Setting the TypeCode of an Any without setting a value
Issue 2619: operator>> for String_var
Issue 2640: IDL that is not IDL!
Issue 2841: Two obvious typos in the C++ mapping for OBV (docs/formal/99-07-41.pdf)
Issue 2875: ValueBase::_copy_value clarification
Issue 2880: Union string member mapping defect?
Issue 2887: Contents of string members (01)
Issue 2888: Contents of string members (02)
Issue 2890: String extractor semantics undefined?
Issue 2895: Exception::_raise() should be const?
Issue 2897: Exception constructors should be protected
Issue 2902: Unary operators for Fixed class have wrong return types
Issue 2946: CORBA 2.3 Editorial problem in TypeCode
Issue 2947: Object _out class copy constructor & assignment op wrong
Issue 2948: Editorial typo in Section 1.36.3 of C++ mapping
Issue 2949: Fixed(const char *) constructor problem
Issue 2950: Fixed::round and truncate issue
Issue 2951: Inconsistency in 1.7 and 1.9 of mapping
Issue 2966: Standard object operations & DynamicImplementation
Issue 2967: NamedValue not only an NVList element
Issue 3055: _default_POA
Issue 3074: Problem with AbstractBase definition
Issue 3078: 1 of 4 issues with Abstract interfaces
Issue 3079: 2 of4 issues with Abstract interfaces
Issue 3080: don't understand the last paragraph of 1.18.2:
Issue 3081: 4 of 4 issues with Abstract interfaces
Issue 3092: Need Any::to_value operation?
Issue 3101: _var types for fixed-length underlying types
Issue 3103: Extraction operator for system exceptions?
Issue 3110: allocbuf() for bounded sequences?
Issue 3111: Abstract interface and DSI issue with C++
Issue 3113: Any::to_abstract_base needs statement about memory management
Issue 3150: Exceptions in servant constructors
Issue 3161: _out types and nested calls
Issue 3165: C++: ostream insertion
Issue 3206: Valuetype code typo in CORBA 2.3 C++ mapping
Issue 3217: Any and UnknownUserException
Issue 3222: C++ valuetype issue (01)
Issue 3223: Valuebox for object reference underspecified
Issue 3224: C++ Value Type issue (02)
Issue 3225: C++ ValueBox & Fixed question
Issue 3239: Obsolete text in 1.40.3
Issue 3242: C++ spec: Valuebase missing get_value_def
Issue 3245: Construction of _var types
Issue 3246: UnknownUserException and stubs
Issue 3247: fixed-length _var assignment from pointer
Issue 3248: Object Reference insertion/extration to Any
Issue 3298: Problem with OBV_ valuetype class constructor
Issue 3304: Problem with type specific valuetype factories in CORBA 2.3.1 C++ mapping
Issue 3326: ValueBase::_copy_value() function is underspecified
Issue 3328: Do valuetype POA servants get tie templates?
Issue 3331: Valuetype "copying" semantics underspecified? (C++ issue # 1)
Issue 3332: Valuetype "copying" semantics underspecified? (C++ Issue # 2)
Issue 3339: ref counting ambiguous?
Issue 3340: set_servant and null servant
Issue 3359: Issue with valuetypes & inout/out parameters
Issue 3380: Constructor for structures?
Issue 3381: _name and _rep_id
Issue 3401: void * operations on Any?
Issue 3532: DSI and implicit activation
Issue 3534: Null assignment to String_var?
Issue 3537: Sequence mapping & custom marshalling
Issue 3538: Read-only parameter remnants
Issue 3539: Variable-length out params and exceptions
Issue 3562: Supporting typedefs for _var types?
Issue 3563: Supporting typedefs for _var types?
Issue 3567: Any insertion for Boolean/Octet/Char
Issue 3574: unclear semantics for valuetype insertion into Any
Issue 3603: unspecified criterion for Any extraction
Issue 3604: Any extraction widening to ValueBase
Issue 3616: CORBA::Environment for EH compilers
Issue 3673: CORBA::release and CORBA::is_nil on POA_ptr
Issue 3796: Missing conversion operator on String_var
Issue 3797: Another issue with String_var
Issue 3944: CORBA::Fixed needs a to_string() conversion function
Issue 3966: _default_POA if no default ORB?
Issue 4002: CORBA::RequestSeq or CORBA::ORB::RequestSeq?
Issue 4114: Requiring ref counting in ServantBase
Issue 4119: questions to IDL - C++ mapping ( CORBA 2.3, valuebox)
Issue 4144: ORB::destroy() missing
Issue 4150: Optional parameters for _create_request?
Issue 4151: Passing two context lists to _create_request()
Issue 4153: _name & _rep_id pure virtual?
Issue 4157: publication of messaging / unchecked_narrow
Issue 4160: mapping of local interfaces
Issue 4166: Need for TIE template for skeletons for valuetypes that support
Issue 4172: LocalObject
Issue 4186: CORBA::Object & LocalObject
Issue 4199: Inserters/extractors for boxed strings?
Issue 4210: Non-exception neutral code in C++ mapping.
Issue 4243: Backward compatibility with C
Issue 4244: Remnant of read-only return values and out params
Issue 4245: How to create a local object reference?
Issue 4265: Server-side exception specifications and ISO C++ std::exception
Issue 4270: semantics of valuetype _downcast operation unclear
Issue 4274: There is an incorrect page reference
Issue 4288: ServantBase needs _get_domain_managers()?
Issue 4325: Deprecated Ref identifier
Issue 4340: Structure member ordering
Issue 4344: Typedefs for struct members?
Issue 4496: Local interfaces issue 1
Issue 4498: Escaped keyword mapping?
Issue 4499: Dangling reference
Issue 4530: Bug on _var references
Issue 4533: Fixed and truncation/rounding?
Issue 4539: UTF-8 and IDL character types in C++
Issue 4545: C++ mapping for CORBA::LocalObject
Issue 4567: ORB interface destroy() operation issue
Issue 4610: ValueRefCountBase::_add_ref
Issue 4743: Context PIDL mapping bug
Issue 4797: Add set of typedefs that would facilitate template programming
Issue 4871: Missin operations in Object interface, ptc/01-06-07
Issue 5440: Prohibit extracting from any into _out type?
Issue 5450: Typographical problems
Issue 5466: conversion algorithm not specified
Issue 5578: Initialized T_var?
Issue 5579: implementing local interfaces in C++
Issue 5580: No Mapping for Local interface in C++
Issue 5784: need mapping for get_orb and get_component on CORBA::Object
Issue 5807: String_var and C++ implicit conversions
Issue 5854: 1.16.3 Extraction from any
Issue 6163: _var's and valuetypes
Issue 6245: No portable way to create a OUT argument for a DII request
Issue 6276: Sequence _var needs const operator []
Issue 6413: Concrete ValueType _init class problem
Issue 11403: Section: 13.6 Server mapping
Issue 12856: Section 4.5.4: parameter to _narrow
Issue 12913: Servant_var + spec typo?
Issue 14169: make it possible to write more generic C++ code
Issue 14852: Describe operator != and == for all generated types
Issue 16283: C++ keywords should be updated
Issue 16355: Interface should add _out_type typedef
Issue 16356: valuetype classes should add _out_type typedef
Issue 16358: get_policy should return Policy, not Policy_ptr
Issue 16528: valuetype example has errors
Issue 16892: need unchecked narrow
Issue 52: Omission in union C++ mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Several problems exist with the definition of union constructors.
Resolution: fixed by adding clarifying text
Revised Text:
Actions taken:
July 11, 1996: Received issue
February 19, 1999: closed issue
Discussion:
Issue 75: Access to sequence buffers (cxx_revision)
Click here for this issue's archive.
Nature: ENHANCEMENT
Severity: Serious
Summary: Summary: We would like to see an enhancement which allows access to sequence buffers once they have been constructed.
Resolution: Fixed
Revised Text:
Actions taken:
August 13, 1996: Received issue
February 19, 1999: closed issue
Discussion:
Issue 91: Efficiency issue in C++ mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: There is a problem with the C++ mapping which requires excessive memory copying in order to be exception safe while constructing a return value.
Resolution: This issue was fixed by Portability Submission
Revised Text:
Actions taken:
August 22, 1996: Received issue
January 2, 1998: closed issue
Discussion:
Issue 92: T__alloc in C mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Is it intended that use of T__alloc functions are the only conformant way to allocate values of (variable length) type T? Or can a conformant app also declare them on the stack?
Resolution: clarified
Revised Text:
Actions taken:
August 27, 1996: Received issue
February 19, 1999: closed issue
Discussion:
Issue 94: Defining an operator for struct/union/sequence _var types (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: If no operator *() is defined for struct, union, or sequence _var types, some pieces of code will break.
Resolution: withdrawn by submitter
Revised Text:
Actions taken:
August 29, 1996: Received issue
February 19, 1999: closed issue
Discussion:
Issue 95: Re-opening modules (cxx_revision)
Click here for this issue's archive.
Nature: Clarification
Severity: Minor
Summary: Summary: Is it legal to split IDL module declarations and to re-open a module similarly to what is done with C++ namespaces?
Resolution: obsolete, cloe issue
Revised Text: Answered in the text of CORBA 2.0.
Actions taken:
August 30, 1996: Received issue
September 1, 1996: Resolved issue
Discussion:
Issue 96: C++ classes for modules (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Does the standard require an implementation to use C++ classes for modules if there is no namespace support? Or is it simply a suggestion?
Resolution: clarified
Revised Text:
Actions taken:
September 3, 1996: Received issue
February 19, 1999: closed issue
Discussion:
Issue 98: In String Argument Passing Question (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: To be compliant, does a client have to pass a string_alloc"ed string to a CORBA operation that takes an in string parameter? If so, why should the ORB care how the client created storage?
Resolution: clarified
Revised Text:
Actions taken:
September 6, 1996: Received issue
February 19, 1999: closed issue
Discussion:
Issue 100: Union discriminators in C++ (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Is a modifier function required under the C++ mapping of unions, and if it is, can it be used to set the discriminator to an illegal value?
Resolution: clarified
Revised Text:
Actions taken:
September 6, 1996: Received issue
February 19, 1999: closed issue
Discussion:
Issue 101: Memory Management Clarification (cxx_revision)
Click here for this issue's archive.
Nature: Clarification
Severity:
Summary: Summary: Should fields of a struct persist across a deep copy?
Resolution:
Revised Text:
Actions taken:
September 6, 1996: Received issue
February 19, 1999: closed issue
Discussion: clarified
Issue 123: Fixed structs (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Should the ORB hide the difference between fixed and variable length structs from the application developer?
Resolution: Close no change. This change is too intrusive and would break too much existing code.
Revised Text:
Actions taken:
September 23, 1996: Received issue
June 13, 2000: closed issue
Discussion:
Issue 125: Passing of object reference in pointers (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Suggest changing the mapping so that object references for an interface "T" are passed as "const T_ptr&" instead of just "T_ptr" for "in" parameters.
Resolution: Close no change. This change is too intrusive and would break too much existing code.
Revised Text:
Actions taken:
September 23, 1996: Received issue
June 13, 2000: closed issue
Discussion:
Issue 134: Union problem (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Is this legal: union X switch(boolean) {case TRUE: short a; case FALSE: long b;default: double c;};? If no, why? If yes, what does _d() return if the union was set with the c() access function?
Resolution: fixed
Revised Text:
Actions taken:
September 24, 1996: Received issue
February 19, 1999: closed issue
Discussion:
Issue 141: Practical problem with DII using Request Pseudo Object (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: If I want to use the DII to send out multiple simultaneous requests, I don"t see a practical way to associate any client specific context that is C++ compliant to those requests.
Resolution:
Revised Text:
Actions taken:
October 1, 1996: Received issue
Discussion: deferred in June 2011 to the next RTF
Issue 142: inserter and extractor functions for exceptions (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: The spec is silent about whether to generate Any inserter and extractor (<<= and >>=) functions for exceptions, although they appear necessary for properly storing and manipulating exceptions.
Resolution: added clarifying texed, fixed
Revised Text:
Actions taken:
October 1, 1996: Received issue
February 19, 1999: closed issue
Discussion:
Issue 143: Testing exceptions (cxx_revision)
Click here for this issue's archive.
Nature: Enhancement
Severity:
Summary: Summary: In the DII, testing what variety of exception is stored in the Request Pseudo-object requires a sequence of dynamic_cast<> or (_narrow) calls. It would be useful to have a single call.
Resolution: closed/resolved
Revised Text: Change the signature of CORBA::Exception on page 1-94 as follows:
// C++
class Exception {
public:
virtual ~Exception();
virtual void _raise() const = 0;
virtual const char * _name() const;
virtual const char * _rep_id() const;
};
Add the following text on page 1-109, preceding the para that introduces UserException:
The _name() function returns the unqualified name of the exception. The _rep_id() function returns the repository
ID of the exception.
Actions taken:
October 1, 1996: Received issue
June 13, 2000: closed issue
Discussion:
Issue 144: Rethrowing exceptions (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: If all I want to do is rethrow an exception in my C++ client code, there is no convenient and compliant way. It would be useful to add extra members to allow this.
Resolution: Fixed by Portability submission
Revised Text:
Actions taken:
October 1, 1996: Received issue
January 2, 1998: closed issue
Discussion:
Issue 145: Missing Any inserter (cxx_revision)
Click here for this issue's archive.
Nature: Clarification
Severity:
Summary: Summary: The following inserter is missing in the C++ spec: void operation <<=(Any &, Any *); // non-copying
Resolution: Fixed in CORBA 2.2 editing process
Revised Text:
Actions taken:
October 1, 1996: Received issue
February 26, 1998: closed issue
Discussion:
Issue 146: Any extractor signature problem (cxx_revision)
Click here for this issue's archive.
Nature: Clarification
Severity:
Summary: Summary: Should the Any extractor signature be (Any_ptr &) instead of (Any &)?
Resolution: Fixed in CORBA 2.2 editing process
Revised Text:
Actions taken:
October 1, 1996: Received issue
February 26, 1998: closed issue
Discussion:
Issue 147: Defintion of Any (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: The definition of Any in C.3 is missing the no_copy flag in the class Any::from_string.
Resolution: Fixed in CORBA 2.2 editing process
Revised Text:
Actions taken:
October 1, 1996: Received issue
February 26, 1998: closed issue
Discussion:
Issue 148: Adding T_copy function (cxx_revision)
Click here for this issue's archive.
Nature: Enhancement
Severity:
Summary: Summary: It would be useful if the C++ mapping for IDL arrays also generated a T_copy() function to go along with T_alloc(), T_dup(), and T_free().
Resolution: Fixed as suggested by submitter
Revised Text:
Actions taken:
October 1, 1996: Received issue
February 19, 1999: closed issue
Discussion:
Issue 150: Any string extractor (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Does the Any string extractor (>>=) return a pointer that is still managed by the Any or a copy? The spec appears to be silent about this.
Resolution: Clarifying text added
Revised Text:
Actions taken:
October 2, 1996: Received issue
February 19, 1999: closed issue
Discussion:
Issue 154: Problem with Any::to_object memory management (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Section 16.14.5-implies that a CORBA::Object reference extracted from Any must share memory with actual interface stored in Any.Better: results of Any::to_object require explicit release()
Resolution: resolved, close issue
Revised Text:
Actions taken:
October 7, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 178: Bounded sequence problem (Section 16.11 p. 16-23) (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: "Default constructor for a bounded sequence always allocates a contents vector.."-> Bad effect for sequences such as CORBA::ReferenceDatawhich allocates 1024 octets of storage
Resolution: resolved, close issue
Revised Text:
Actions taken:
October 7, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 185: Return value of maximum() for unbounded sequences (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: CRITICAL
Summary: Summary: Return value of maximum() for unbounded sequences must be specified.
Resolution: resolved, close issue
Revised Text: Paragraph 11 on page 38 fully explains the return values of maximum(), so that it is not an issue. Wording of page 37 para 3 should be similar to wording of first sentence of para 13 p. 38.Wording should be added to front of C++ Mapping Spec that defines
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 186: Inconsistent interfaces for the operation pairs *duplicate* and (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: CRITICAL
Summary: Summary: The operations *duplicate* and *release* work together to provide memory mgmt. functionallity. It"s desirable to use both via similar interface/syntax. *nil*/*is_nil* similar problem
Resolution: close with no change
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close 186 with no change. Making changes to fundamental parts of the API purely to for stylistic reasons is too high a price to
pay because it would break existing code.
Issue 187: Freeing inaccessible storage for T_var as out parameter (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: CRITICAL
Summary: Summary: Standard requires that a conforming implementation must free the inaccessable storage associated with a parameter passed as a managed type(T_var). How to achieve it for out parameters??
Resolution: Fixed by Portability submission
Revised Text:
Actions taken:
October 14, 1996: received issue
January 2, 1998: closed issue
Discussion:
Issue 188: interface mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Mapping for Interface [16.3 CORBA2.0] Mapping example in 3.5.6 implements the ptr type as full pointer. A pointer could be implemented as a class
Resolution: Close no change. This change is too intrusive and would break too much existing code.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Proposed resolution: Passing an objref implemented as an object (as opposed to a pointer) as a reference to const requires all the operations supported by that objref to be const member functions.
Issue 189: Distinction between _var and _ptr types (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: A_var may be identical to A_ptr, so a conforming program cannot overload operations using these types solely. This may clash with statement of different behaviour between the two.
Resolution: fixed
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue, fixed
Discussion:
Issue 190: Names of anonymous types (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: The spec does not define how anonymous types defined within constructed types should be named (as the C mapping does)
Resolution: Duplicate of issue 52
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 191: get_principal () needs an environment parameter (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: get principal() needs an Environment parameter, but object implementations using C++ EH do not have them. Spec should clarify this.
Resolution: resolved, close issue
Revised Text: proposed resolution: The Security Service has deprecated the Principal interface and hence get_principal(). Hence we should let this one just rest in peace :-)
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 192: Identifier conflicts resulting from the language mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Section 3.1 para 4 specifies the rule for resolving identifier conflicts with C++ keywords. A similar rule is required to resolve name conflicts resulting from the mapping.
Resolution: Close 192 with no change
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close 192 with no change. We've discussed this in the past, and all the options we could come up with a worse than the
original problem. I haven't heard anyone complain about this in practice, so it's probably better to leave it alone.
Issue 193: Pseudo objects for DSI (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: Medium
Summary: Summary: [Ch 17 CORBA2.0] Sun would like section 4 to include the interface for the dynamic server invocation
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 194: Implementation dependency for _var and _ptr (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Implementation dependent: Implementation scheme for Interface _var & _ptr types
Resolution: Duplicate of issue189
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 195: _ptr member accessors for string and objref (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Implementation dependent: _ptr member accessors for strings & object references
Resolution: Close no change. Issue withdrawn by submitter.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 196: illegal union access when discriminator is wrong (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Implementation dependent: illegal access of union member accessor functions when the discriminator has the wrong value
Resolution: Close no change. Issue withdrawn by submitter.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 197: TypeCode/Value mismatch in ANY (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Implementation dependent: What happens if the typecode & value for the unsafe Any operations do not match?
Resolution: Close no change. Issue withdrawn by submitter.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 198: Representation of void* returned from ANY (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Implementation dependent: Implementation representation of the void * pointer returned by Any::value() for unknown types
Resolution: Close with no change. The latest draft has already deprecated the void * member functions for type A
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close with no change. The latest draft has already deprecated the void * member functions for type Any, so the issue is moot.
Issue 199: Levels of portability conformance requested (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 15.1.1 Pg 15-1 CORBA2.0 "Conforming client or server program is portable across all conforming implementations" We object the word "portable"being used in this context.
Resolution: Close no change. We do not have enough context to determine what the issue is.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 200: fixed- vs. variable-length types (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.8 Pg 16-22 CORBA2.0, p. 28, Section 3.10, para 2: Devastating to programmers. Simple change to IDL an IDL file will require a complete rewrite of application code
Resolution: Duplicate of issue123
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 201: example incorrect? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.8 Pg 16-13 CORBA2.0 p. 29, Section 3.10 example para 4. : This example looks incorrect. Example shown in 3.10.1 is inconsistent with the code in paragraph 4.
Resolution: Close no change. We do not have enough context to determine what the issue is.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 202: Assignment to T_var (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: What happens if i assign a container of data I hold Does aliasing allow in more than simple temporary. Is there a restriction that there can be NO overlapping?
Resolution: Close no change. We do not have enough context to determine what the issue is.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 203: Detection of initialization of T_var (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: [Sec 16.8.1 Pg 16-14 CORBA2.0] p.31, Section 3.10.1 para 12: How do I know if the T_var I"ve been passed (in C++) has been initialized?
Resolution: Close no change. This change is too intrusive and would break too much existing code.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 204: string and objrev members of constructed types (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Implementation dependent: Type of string & object reference members of struct, union, sequence
Resolution: Withdrawn by submitter
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 205: Taking T out of T_var (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: [Sec 16.8.1 Pg 16-14 CORBA2.0 p31, Section 3.10.1 para 14: If I have T_var referring to T. How can I take ownership?How to stop it from being deallocated when T_var goes out of scope?
Resolution: Fixed by Portability submission
Revised Text:
Actions taken:
October 14, 1996: received issue
January 2, 1998: closed issue
Discussion:
Issue 206: Implementation description (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: [Sec 16.9 Pg 16-15 CORBA2.0 p.32, Section 3.11 para 4: Seems to describe an implementation. Why is it specified. Is this how Sec. 3.10.1 para 14 issue is supposed to be addressed?
Resolution: Close no change. We do not have enough context to determine what the issue is.
Revised Text:
Actions taken:
October 11, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 207: C++ mapping complexity (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: [Sec 16.9 Pg 16-15 CORBA2.0 p. 32, Sec. 3.11 A comment nothing can be done about at thisstage. This section is way too complex. Goal is not to be natural C++ programmers !!!!
Resolution: Beyond scope of RTF - closed
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 208: Autoextension of sequences (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: [Sec 16.11 Pg 16-21 CORBA2.0 Since autoextension is not apparently supported, you should change "may" to "must"
Resolution: resolved and closed
Revised Text: Page 23-38, last line, change
The programmer must always explicitly modify the current length of any sequence.
to:
The length of a sequence never changes without an explicit call to the length() member function.
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 209: Sequence implementation (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: {sec 16.11 Pg 16-22 CORBA2.0 p.38, Sec 3.13 para 7: Must an implementation REALLY implement a sequence as a contigous chunk of memory?
Resolution: Addressed by resolution to issue 75
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 210: State of release flag for sequence (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.11 Pg 16-22 CORBA2.0 If release is FALSE under these circumstances, old storage will not be freed before reallocation is performed. After realloc release TRUE or FALSE?
Resolution: Addressed by resolution to issue 75
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 211: Sequence maximum() call (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.11 Pg 16-22 CORBA2.0 p.38 Section 3.13 para11: It"s not clear how maximum()call is supposed to be used.
Resolution: Duplicate of issue 185 - closed
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 212: References returned from sequence operator[] after realloc (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.11 Pg 16-23 CORBA2.0 What happens to refs returned by operator[] when a realloc occurs? Are these invalid?
Resolution: clarified
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 213: Sequence lacks common features (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.11 Pg 16-23 CORBA2.0 p.38,sec 3.13 para 13 There is no auto extend, no inset,append, delete. It doesn"t seem like a sequence. Seems more like a resizable array. Could call it so.
Resolution: Beyond scope of RTF - closed
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 214: Sequence buffer types (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.11 Pg 16-23 CORBA2.0 p. 39, Sec. 3.13 para 15 Why are you passing string buffers as char ** and object references as T_ptr*. There already is a type used for overloading assignment.
Resolution: Addressed by resolution to issue 75
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 215: C vs. C++ coding style (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.11.2 Pg 16-24 CORBA2.0 p. 40 Section 3.13.2, para 17 Looks like C, not C++
Resolution: Close no change. We do not have enough context to determine what the issue is.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 216: Sequence creation (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.11.2 Pg 16-25 CORBA2.0 How do I know how sequence was created. Must my code carry arround an extra piece of information saying how sequence was created?
Resolution: clarified
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 217: Copying of out parameters (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.11.2 Pg 16-25 CORBA2.0 p.41, section 3.13.2 para 21 Do I have to make an application level full copy? This doesn"t meet the performance goal outlined in the beginning
Resolution: Already resolved.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 218: Semantics of sequence length() operation (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.11 Pg 16-23 CORBA2.0 What is the semantics of the length() member? When can I do reallocation? Can it truncate? Can it realloc if length== current size?
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 219: Array slice example (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.12 Pg 16-27 CORBA 2.0 Why is a Long Array_slice declared to be a typedef Long[]? Why are these locked down rather than allowing a slice to be a class?
Resolution: resolved/closed
Revised Text: Close with explanation that, for arrays to be passed to functions, an array slice must be the element type of the array because
when an array is passed as a function argument, it degenerates to a pointer to the array's row type. This means that, for an
array type T with elements of type E, the slice type must be E.
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 220: Return value of operator[] for array var (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.12 Pg 16-27 CORBA2.o Why are we returning a Long * from operator[] rather than an LongArray_slice&?
Resolution: Fixed by Portability submission
Revised Text:
Actions taken:
October 14, 1996: received issue
January 2, 1998: closed issue
Discussion:
Issue 221: Array_forany (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Do you anticipate end user"s instantiating the Array_forany class? Isn"t this a implementation detail? The name conflicts with IDL specifiable. Section should be removed.
Resolution: closed/resolved
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close with explanation that application code must use the array_forany class in order to insert and extract arrays of the correct
type. The helper class is necessary because, otherwise, there would be no way to distinguish among arrays of the same element
type, but of different length.
Issue 222: Global functions vs. T_var namespace (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.12 Pg 16-28 CORBA2.0 p. 44, sec 3.14 para 8: Why are these global functions rather than static methods of T_var?
Resolution: closed/resolved
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close with no change. I dug up the old 2.0 spec (96-08-04.pdf), but the question obviously refers to some draft version of the
document. Neither section numbers nor page numbers match. It appears impossible to identify the document to which the
question refers to. Since it was simply a question without a proposal or defect, we should close it.
Issue 223: Storage ownership issue (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: CORBA2.0 Care must be taken to avoid using T_var types with these extraction operators. They will try to assume responsibility for deleting storage owned by Any. Problem in mapping.
Resolution: Close with no change. That's how the mapping was designed to work.
Revised Text: In section 20.16.3 (Extraction from any), replace the sentence:
Care must be taken to avoid using T_var types with these extraction operators, since they will try to assume
responsibility for deleting the storage owned by the any.
In its place, add the following sentence:
An attempt to extract to a _var type is non-conforming and must cause a compile-time error.
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 224: Pointers vs. values (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec. 16.14.3 Pg 16-34 para 30 CORBA2.0 p.48, sec 3.16.3, para 26 Why is this specified. Why are pointers treated differently from Values. Primitives are not set to NULL
Resolution: Close with no change. It is no longer possible to identify the document to which the question refers
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 225: handling void* from Any (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Sec 16.14.6 Pg 16-38 para 44 CORBA2.0 How are you supposed to delete/duplicate this void* value if you don"t know the type? Do we have to emulate a C++ compiler
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 226: void* from Any for constructed types (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: tables not present in CORBA2.0 What about structs, unions, exceptions, and arrays?
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 227: anonymus types (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Tables not present in CORBA2.0 Aren"t anonymus sequences still allowed in structs, union, and exception?
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text: proposed resolution: Editorial change. Yes, they are
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 228: callee-allocated storage modification (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: CORBA2.0 Sec 16.18 Pg 16-45 para 9 The caller has sufficient knowledge to release, but not sufficient knowledge to know if contiguous. ("to allow..we adopt the policy....")
Resolution: Already resolved.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 229: Typo in table 3? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Pg 16-46 table 24 CORBA2.0 Shouldn"t arrays be by & for inout? This looks like a typo.
Resolution: clarified
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 230: _var types for fixed-length types (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: LOW
Summary: Summary: As a convenience for managing this pointer, the mapping also provides another class of each variable-length type. It also provides one for fixed-length types. You should say so
Resolution: clarified
Revised Text: proposed resolution: Editorial change
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 231: union accessors (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: LOW
Summary: Summary: Accessors that return a reference to a non-const object can be used for read-write access. They are provided only for following types: struct, union, sequence, any.Provede for all types..
Resolution: Close no change. This change is too intrusive and would break too much existing code.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 232: Mapping for IDL context (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: LOW
Summary: Summary: If operation in an IDL spec. has a context spec, then a Context_ptr input parameter follows all operation specific arguments (OMGD 3.19) It should map to const Context_ptr
Resolution: Close with no change. Object references are always passed as a plain _ptr parameter and never as a c
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close with no change. Object references are always passed as a plain _ptr parameter and never as a const _ptr parameter.
Issue 234: accessor function on SystemException (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: LOW
Summary: Summary: SystemException has accessor functions minor() and completed() rather than public data members like exceptions normally do. Normal mapping is to make exception data into public data members
Resolution: Close with no change.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close with no change. I agree, the discrepancy between user exceptions and system exceptions is jarring. However, there i too
much code out there that would break if we cleaned this up.
Issue 235: A_ptr and A_var should be distinct types (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: LOW
Summary: Summary: Sec 16.2.1 Pg 16-4 CORBA2.0 A_ptr and A_var need not be distinct. Since these types have distinct semantics, they need to be distinct (Section 3.5.1 para 4)
Resolution: Duplicate of issue 189 - closed
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 236: operator>>= on strings and object references (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: LOW
Summary: Summary: Sec 16.12.2 Pg 16-27 CORBA2.0 Sun wants to add para.: Extraction operator>>= doesn"t free old storage, doesn"t pass old string to string_free, doesn"t invoke release on old object reference.
Resolution: Clarifying text added
Revised Text: editorial change
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 237: Allocated storage for out and return strings (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: LOW
Summary: Summary: Sec 16.6 Pg 16-11 CORBA2.0: Sec D.12 states that client stub allocates buffer of specified size for bounded strings.This may result in unnecessary memory consumption.
Resolution: close with no change
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close no change. We believe the caller misread the text to say that the return buffer for bounded strings must always be the
maximum size, which is incorrect.
Issue 238: C++ namespaces (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: LOW
Summary: Summary: Implementation dependent: Namespaces available/not available
Resolution: Close no change. Issue withdrawn by submitter.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 239: Implementation of parameter passing for T_var types (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: LOW
Summary: Summary: Implementation dependent: Implementation of parameter passing using T_var types
Resolution: Fixed by Portability submission
Revised Text:
Actions taken:
October 14, 1996: received issue
January 2, 1998: closed issue
Discussion:
Issue 240: Any and IN_COPY_VALUE (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: SERIOUS
Summary: Summary: Binding spec states that implementation af Any must not store its value as reference or pointer to value passed into insertion operator <<= Any return pointer must not be NULL pointer...
Resolution: clarifying text added
Revised Text: Swee Boon Lim will send a proposal to the cxx_revision mailing list to change copy semantics to adoption semantics for the Any mapping type
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 241: allocbuf and initialization of elements (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: SERIOUS
Summary: Summary: Sec 3.13.2 para 25describes allocbuf. Sun prefers that allocated sequence elements be initialized as if vector were allocated by sequence constructor
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 242: freebuf and destruction of elements (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: SERIOUS
Summary: Summary: Sec 3.13.2 para 25 describes freebuf. It doesn"t specify if storage associated with each element is released, i.e deep-free. Sun prefers that freebuf deep-free...
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
October 14, 1996: received issue
July 5, 2000: 061300
Discussion:
Issue 244: RTTI vs. _narrow for exceptions (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: SERIOUS
Summary: Summary: Since RTTI is not ubiquitous, the _narrow operations for Exceptions should be defined, even when RTTI available. They are trivial to implement using RTTI.
Resolution: Fixed by Portability submission
Revised Text:
Actions taken:
October 14, 1996: received issue
January 2, 1998: closed issue
Discussion:
Issue 245: accessor members for structs (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: Struct Mapping: IONA that accessor functions be provided for struct members. Direct access to member variables still available. Enhancement affords the user a consistent interface.
Resolution: Closed with no change
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close with no change. Accessor functions for structure members would have to have names that differ from the name of the
member because a C++ class cannot contain a data member and a member function that have the same name. However,
choosing a name for accessors is problematic because of potential name clashes with other members. In addition, making
stylistic changes like this now would complicate the mapping without substantial gain.
Issue 246: Access to sequence elements (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: At present sequence elements can only be accessed through operator[]. Public accessors be provided to allow a sequence to simultaneously be viewed as alinked list.
Resolution: Duplicate of issue 75 - closed
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 247: TypeCode mapping update for CORBA 2.) (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: It seems that the TypeCode mapping needs to be updated to reflect the TypeCode definition in Interface Repository Spec (p 64)
Resolution: TypeCode interface updated
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 248: nested ptr and var types (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: ptr and var types for objrefs should be nested inside interface class, e.g A::ptr and A::var. Would make writing templates using these types easier.
Resolution: resolved, close issue
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 249: to/from string for Any type safety (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: We sure could use any_to/from_string<nnn> classes so that the type safe any api could be used for all IDL types
Resolution: Requested functionality added
Revised Text: Same as OMGCXX!.1-014-E
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 250: union accessors require temporaries (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: For structs and exceptions: Unions" access functions return primitives by value, not by refs.I need to use temporaries.Change them to refs
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 251: decompose Any into constituent primitives (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: Here is an extremely simple extension to the any type to allow decomposition of values to their constituent parts: <EXAMPLE issue251>
Resolution: Fixed by Portability submission
Revised Text:
Actions taken:
October 14, 1996: received issue
January 2, 1998: closed issue
Discussion:
Issue 252: T_copy for string and array (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary:
Resolution: Duplicate of issue 148 - closed
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 253: Name field for SystemExceptions (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: SystemException class should contain a string name field for easy printing of error messages,or operator<< should be overloaded for each system exception
Resolution: closed/resolved
Revised Text: Change the signature of CORBA::Exception on page 1-94 as follows:
// C++
class Exception {
public:
virtual ~Exception();
virtual void _raise() const = 0;
virtual const char * _name() const;
virtual const char * _rep_id() const;
};
Add the following text on page 1-109, preceding the para that introduces UserException:
The _name() function returns the unqualified name of the exception. The _rep_id() function returns the repository
ID of the exception.
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 254: iterating over Any primitives (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: There hsould be a way to access an unknown type inside an Any by "iterating" over the Any to examine the type in terms of the primitive types that make it up.
Resolution: Fixed by Portability submission
Revised Text:
Actions taken:
October 14, 1996: received issue
January 2, 1998: closed issue
Discussion:
Issue 255: Constructor taking discriminant as argument (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: Sec 3.12 para1 describes union constructors.Sun would like to add new constructor that takes as its sole argument a discriminant value.It initializes union according to specified discr. value
Resolution: Close with no change
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close with no change. The proposal would weaken the safety of union mapping (after we struggled for ages to make it safe). In
addition, the proposal would force every union class to carry code for default-initialization of union members. While we have
this functionality in DynAny, I don't think it is appropriate to force this into the static stubs as well.
Issue 256: Accessors for release flag of sequence (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: Sec 3.13.describes mapping for sequence.Accessor functions should be provided for release flag.Add following member functions: void release(Boolean), Boolean release() --pure accessors
Resolution: Duplicate of issue 75 - closed
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 257: Any release flag and operator<<= (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: Sec 3.16.2 para 11 describes lifetime of inserted value. Any should take over the inserted value(Sun) Avoids unnecessary copy for structured types listed in table 2
Resolution: requested functionality added
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 258: Accessors for the Any release flag (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: Sun would like to add the following accessors to Any: Boolean release(); void release(Boolean);
Resolution: Close with no change
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close with no change. Adding a release() member to type Any would confuse the memory management issues further. There is
no point in having two API calls to achieve the same thing, and we can hardly deprecate the current one.
Issue 259: Accessor for exception id (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: The base exception class should include an accessor to get the exception id of an exception.It"s obtained from environment.Ability to get exception id is desirable in C++
Resolution: closed/resolved
Revised Text: Change the signature of CORBA::Exception on page 1-94 as follows:
// C++
class Exception {
public:
virtual ~Exception();
virtual void _raise() const = 0;
virtual const char * _name() const;
virtual const char * _rep_id() const;
};
Add the following text on page 1-109, preceding the para that introduces UserException:
The _name() function returns the unqualified name of the exception. The _rep_id() function returns the repository
ID of the exception.
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 260: Exception id for each exception type (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: C++ mapping should make available the exception id for each exception type.. Sun would like to revise sec. 3.17 to add following function: static const char * _exception_id();
Resolution: closed/resolved
Revised Text: Change the signature of CORBA::Exception on page 1-94 as follows:
// C++
class Exception {
public:
virtual ~Exception();
virtual void _raise() const = 0;
virtual const char * _name() const;
virtual const char * _rep_id() const;
};
Add the following text on page 1-109, preceding the para that introduces UserException:
The _name() function returns the unqualified name of the exception. The _rep_id() function returns the repository
ID of the exception.
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 261: TypeCode for each basic and IDL defined types (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: Sec 4.10 para 2: pseudo object reference of form _tc_<type> made available for basic and IDL defined types. Sun wants replacements with global function of form TypeCode_ptr _tc_<type>
Resolution: Close with no change
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close with no change. The type code constants have been with us in their present form since the day dot, and changing these to
functions now would achieve nothing except break code.
Issue 262: TypeCode interpreter (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: Sec 4.10 describes mapping for TypeCode. Sun proposes the following typecode interpreter interface: (available in /archives/issues/issue261)
Resolution: Fixed with issue 251
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 263: buffer classes for sequences (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: p41,sec 3.13.3,para 24: These functions should return buffers, not T* If you wanted a T* provide a conversion on returned buffer. No need to lock down implementation in this manner
Resolution: closed with no change
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close with no change. The sequence buffer functions have been a round a long time, and were updated with the 2.2 spec.
Mucking around with these again will make matters worse instead of better.
Issue 264: make String_var reference but not adopt (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: String_var could refer to memory without assuming memory management responsibilities for it, like void String_var::value(const char*, Boolean release = 0
Resolution: close with no change
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issdue
Discussion: Close with no change. The _var type usage is so entrenched now that to change the memory-management behavior would
break just about every C++ CORBA program in existence.
Issue 265: explicit copy/adopt for String_var (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: Copying + adopting performed by String_var::operator= are very error-prone.Better to have explicit functions to copy, adopt,reference.(e.g void String_var::copy(const char*);
Resolution: handled by Portability submission - closed
Revised Text:
Actions taken:
October 14, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 266: operator<< for ostreams and Exceptions (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: ENHANCEMENT
Summary: Summary: Exceptions could be formatted onto ostreams using operator<<..Examples available on /archives/issues/issue266
Resolution: closed/resolved
Revised Text: Insert the following text immediately before secion 1.19.1 on page 1-98 (so 1.19.1 becomes 1.19.2):
1.19.1 ostream Inserters Conforming implementations shall provide ostream inserters with the following signatures:
ostream& operator<<(ostream &, const CORBA::Exception &); ostream& operator<<(ostream &, const
CORBA::Exception *); These inserters print information about an exception on an ostream. The format and
amount of detail of the printed information is implementation dependent. To guarantee that applications can control
formatting of exceptions by providing custom overloaded inserters for more derived exception types, a
conforming implementation must never provide overloaded inserters for SystemException, UserException or other
more derived exception types.
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 267: ANy release flag and operator (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: LOW
Summary: Summary: Sec 3.16.2 para 11 describes lifetime of inserted value. Since lifetime of the value is independent of value passed to operator<<=, Any must contain a copy of value.
Resolution: close with no change
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion: Close with no change. It is clear that, by default, type Any makes a deep copy on insertion. In addition, consuming insertion is
possible too, so there is no issue.
Issue 268: C++ semantics vs. IDL semantics (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity: MEDIUM
Summary: Summary: Isn"t it the mappings responsibility to decide how to project the semantics to the underlying "wire rep". You don"t need to put NULL on the wire. Sec 16.18 Pg 16-46 para 11 CORBA2.0
Resolution: Close no change. This change is too intrusive and would break too much existing code
Revised Text:
Actions taken:
October 14, 1996: received issue
June 13, 2000: closed issue
Discussion:
.
Issue 269: Default constructor for String_var (cxx_revision)
Click here for this issue's archive.
Nature: ENHANCEMENT
Severity: Medium
Summary: Summary: C++ mapping currently specifies that the default constructor for CORBA::String_var initializes the string to NULL Pointer. This is very inconvenient, in particular for structures
Resolution: Fixed as suggested by submitter
Revised Text:
Actions taken:
October 17, 1996: received issue
February 19, 1999: closed issue
Discussion:
Issue 290: u++ binding for ServerRequest pseudo object (cxx_revision)
Click here for this issue's archive.
Nature: Interpretation
Severity: Medium
Summary: Summary: Class defined for ServerRequest shows op_def() operation. Seems not to be in IDL for ServerRequest and there is no description in the rest of the section (CORBA 2 spec, Sect. 18.4.1)
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text: --related to issue128 orb_revision
Actions taken:
October 24, 1996: received issue
June 13, 2000: closed issue
Discussion:
Issue 456: Interpretation of _narrow semantics (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Section 16.3.4: Question on how to use _narrow with C++ bindings. Should D::_narrow work? Does answer depend on interpretation of "actual (run-time) type"?
Resolution: fixed, close issue
Revised Text:
Actions taken:
November 16, 1996: received issue
February 23, 1999: issue closed
Discussion:
Issue 479: DII and DSI are useless with current Any (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Cannot use DII to invoke an operation that expects or returns a complex user-defined type. Any needs to provide member functions for composing Any"s containing arbitrary user-defined values
Resolution: Fixed by Portability submission
Revised Text:
Actions taken:
January 22, 1997: received issue
January 2, 1998: closed issue
Discussion:
Issue 480: Persistent Any values (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: It"s currently not possible for a C++ client or server to receive a parameter value of type Any, store that value in filesystem or a database and later reconstruct Any value from persistent represe
Resolution: Fixed by portability submission
Revised Text:
Actions taken:
January 22, 1997: received issue
January 2, 1998: closed issue
Discussion:
Issue 481: [q] intf name == op name (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Sentence in IDL spec "An identifier can only be defined once in a scope.However,identifiers can be redifined in nested scopes" seems to allow interface Foo { void Foo(in long 1); };
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification
Revised Text:
Actions taken:
January 22, 1997: received issue
June 13, 2000: closed issue
Discussion:
.
Issue 482: Defect with anonymus types in union mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: There are some serious inconsistencies in the union mapping. Spec. (page 16-18, para4 and page 16-19, para 1) The 2 paragraphs appear to be in conflict with each other.
Resolution: Fixed as suggested by submitter
Revised Text:
Actions taken:
January 25, 1997: received issue
February 19, 1999: closed issue
Discussion:
Issue 484: OMG C++ Mapping: Implicit Conversion Operators (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: I propose that public interface of _var types, the similar "smart pointer" types used in struct fields, and "smart pointer" types returned from sequence index operators be extended. (see file)
Resolution: Fixed by Portability submission
Revised Text:
Actions taken:
January 30, 1997: received issue
January 2, 1998: closed issue
Discussion:
Issue 496: Double underscore identifier mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: identifiers containing a double underscore[..] are reserved for use by C++ implementations and standard libraries and shall be avoided by users. IDL could be amended to prohibit double undersc.
Resolution: closed with no change
Revised Text:
Actions taken:
February 5, 1997: received issue
June 13, 2000: closed issue
Discussion: Proposed Resolution:
Close with no change. True, double underscores technically invade the C++ compiler's namespace but, in practice, it is rarely
(never?) a problem.
Changing the IDL identifier rules to outlaw double underscore strikes me as a bit drastic too. (I'd rather not muck around in the
core unless we really have to.) Because I've never come across a case where this is a practical problem, we should close the
issue.
Issue 497: Legal IDL cannot map to C++ (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Generated C++ (example) ends up with redefinition errors. This is not addressed in current C++ mapping. Options are to amend IDL or to simply state that such IDL cannot be translated.
Resolution: close with no change
Revised Text:
Actions taken:
February 5, 1997: received issue
June 13, 2000: closed issue
Discussion: Close with no change. It's ugly to have these name clashes in the mapping, but the steps required to fix this aren't pretty either,
and the name clash is rarely (never?) a problem in practice.
Issue 501: Bug in C++ NVList mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: NVList has an item () operation, which returns a NamedValue reference. The same special memory management rules should apply to item().
Resolution: Fixed by portability submission
Revised Text: Suggestion: Specify that item() also retains ownership of the reference it returns
Actions taken:
February 20, 1997: received issue
January 2, 1998: closed issue
Discussion:
Issue 594: Boolean type left undefined by C++ mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: CORBA::Boolean can be mapped to totally non-sensical things such as structs, class, type double, type long etc. There are no guarantees about size of underlying type given to implementor
Resolution: resolved, close issue
Revised Text:
Actions taken:
June 18, 1997: received issue
February 19, 1999: closed issue, resolved
Discussion:
Issue 599: const method qualification should be removed (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: C++ mapping for pseudo request class contains const member functions mapped from readonly attributes. IDL does not define C++ mapping for readonly attribs to const member functions.
Resolution: close with no change
Revised Text:
Actions taken:
July 9, 1997: received issue
July 24, 1997: reasigned to cxx_revision
June 13, 2000: closed issue
Discussion: Close with no change. The fact that IDL doesn't have const operations doesn't mean that member functions in the C++
mapping can't be const. In addition, making this change now can cause code that currently works to no longer compile.
Issue 600: String_var and Any_var are missing the T_ptr definition (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Appendix E page E-2 and E-3: String_var and Any_var classes are missing T_ptr definition that occurs in the template for var types. These should be added for completness.
Resolution: Close with no change. Only object reference types have _ptr type. They do not apply to strings or ty
Revised Text:
Actions taken:
July 9, 1997: received issue
July 24, 1997: reassigned to cxx_revision
June 13, 2000: closed issue
Discussion: Close with no change. Only object reference types have _ptr type. They do not apply to strings or type Any.
Issue 601: Section 17..13.1 release()method should be added to mappping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: The Object IDL contains a release() mmethod that is not mapped in the C++ mapping. This method should be added in the mapping
Resolution: clarified
Revised Text:
Actions taken:
July 9, 1997: received issue
February 19, 1999: closed issue
Discussion:
Issue 605: Section 8.2: set_exception() supported by BOA? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: The BOA interface defined a method called set_exception(). This is not present in the IDL in section 17.17. Does the BOA support this method or not?
Resolution: clarified
Revised Text:
Actions taken:
July 9, 1997: received issue
July 24, 1997: reassigned to cxx_revision
February 19, 1999: closed issue
Discussion: closed issue
Issue 608: Interface definition must be standardized (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: IDL for Object Interface differs from that provided by core specification in section 7.2 page 7.2
Resolution: Close with no change. The relevant functions are shown in the latest C++ mapping.
Revised Text:
Actions taken:
July 9, 1997: received issue
July 24, 1997: reassigned to cxx_revision
June 13, 2000: closed issue
Discussion:
Issue 615: POA_*_tie classes in 18.1.4 can"t be supported (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: If C++ compiler doesn"t support namespaces or templates defined inside classes, POA_*_tie classes in 18.1.4 cannot be supported within specified scopes.
Resolution: resolved, close issue
Revised Text:
Actions taken:
July 11, 1997: received issue
February 19, 1999: closed issue, resolved
Discussion:
Issue 617: Why does get_principal() take an Environment parameter (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: When this IDL is mapped into C++ for a non-EH target compiler, won"t this method end up having 2 environment parameters?. This is only IDL in current spec that takes environment parameter
Resolution: Duplicate of issue 191 - closed
Revised Text:
Actions taken:
July 14, 1997: received issue
February 19, 1999: closed issue
Discussion:
Issue 618: IDL from Ennvironment has invalid attribute (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: IDL from Environment has an attribute called "exception" which is invalid. This member should be renammed to "ex"or some other name which is a legal identifier
Resolution: Close no change. Environment is defined as PIDL, so this is legal.
Revised Text:
Actions taken:
July 14, 1997: received issue
June 18, 2000: closed issue
Discussion:
Issue 621: C mapping for list_initial_services is incorrect (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Section 14.29: The C mapping for list_initial_services is incorrect and should return a pointer to a sequence (example in corresponding archive file)
Resolution: Fixed in CORBA 2.2 editing process
Revised Text:
Actions taken:
July 9, 1997: received issue
February 26, 1998: closed issue
Discussion:
Issue 622: Section 16.2, Section 16.6: editorial (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Section 16.2: "A shown" should be "As shown". Section 16.6: The title is incorrect "TMapping" remove the "T"
Resolution: Close as fixed. A search through the current draft does not locate either of the two typos mentioned
Revised Text:
Actions taken:
July 9, 1997: received issue
June 23, 1998: moved from orb_revision to cxx_revision
June 13, 2000: closed issue
Discussion: Close as fixed. A search through the current draft does not locate either of the two typos mentioned.
Issue 627: PortableServer:ObjectId_tow_wstring() and string_to_ObjectId() (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: PortableServer::ObjectId_to_wstring() and string_to_ObjectId() are written (*in section 18.4) using the "wchar_t" type. Shouldn"t they use the CORBA::wchar type instead?
Resolution: Fixed in CORBA 2.2 editing process
Revised Text:
Actions taken:
July 16, 1997: received issue
January 2, 1998: closed issue
May 8, 1998: transferred from port-rtf to cxx_revision
February 19, 1999: closed issue, resolved
Discussion: transferred from port-rtf to cxx_revision
Issue 637: Section 18.1.2: _this() and IMPLICIT_ACTIVATION need clarification (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Section states that _this() can implicitly activate servant if IMPLICIT_ACTIVATION applies. _this() does not have a way to specify which POA is to be used for the activation
Resolution: resolved, close issue
Revised Text:
Actions taken:
July 30, 1997: received issue
May 12, 1998: issue transferred from port-rtf to cxx_revision
February 19, 1999: closed issue, resolved
Discussion: closed issue, resolved
Issue 646: Blocking semantics of get_next_response not well specified (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: The semantics of get_next_response sec 4.3.4 are not well-defined with respect to blocking behavior. There is no explicit description of the behavior of the C++ routines
Resolution: resolved, issue closed
Revised Text: Replace the 5th bullet point on page 23-118 of ptc/99-03-04 with:
The get_response operation does not take a flag argument. If invoked before the request has completed, get_response
blocks until the request completes; if invoked after the request has completed, get_response returns immediately. The
poll_response operation returns immediately. A true return value indicates that the request has completed. A false return
value indicates that the reply for the request is still outstanding.
Actions taken:
July 31, 1997: received issue
June 13, 2000: closed issue
Discussion:
Issue 647: include files (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: There seems to be nothing in the spec that specifies the name of the include files for things in the CORBA module (e.g. type definitions). Add such a requirement to each language mapping
Resolution:
Revised Text:
Actions taken:
August 1, 1997: received issue
Discussion:
Issue 653: sec. 18.1.2: explicit information on _this() is missing (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: The discussion of how _this() operates is missing explicit information about what to do if there is no request context. Should _this() return nil reference, or should exception be thrown
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
August 5, 1997: received issue
May 12, 1998: issue moved from port-rtf to cxx_revision
June 13, 2000: closed issue
Discussion:
Issue 663: Implementation problem with policy objects using root POA (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: It appears to be impossible to implement the policy objects using the root POA due to race conditions on the Polilicy::destroy() operation. There appears to be no safe time to delete servant
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
August 9, 1997: received issue
February 25, 1999: moved to cxx_revision
June 13, 2000: closed issue
Discussion:
Issue 673: C++ mapping of servants may result in ambigous run-time behavior (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: If the same servant and ObjectId are registered with two POAs, _this() can"t know which object to return outside of a method invokation
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
August 11, 1997: received issue
May 12, 1998: issue moved from port-rtf to cxx_revision
June 13, 2000: closed issue
Discussion:
Issue 674: Multiple inheritance of C++ Servants is ill-defined (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: Please find example/discussion in corresponding archive file
Resolution: closed and resolved
Revised Text: Add the following to the end of section 1.36.6 of formal/99-07-41:
For interfaces which inherit from one or more base interfaces, the generated POA skeleton class uses virtual
inheritance: // IDL interface A { ... }; interface B : A { ... }; interface C : A { ... }; interface D : B, C { ... }; //
C++ class POA_A : public virtual PortableServer::ServantBase { ... }; class POA_B : public virtual POA_A { ...
}; class POA_C : public virtual POA_A { ... }; class POA_D : public virtual POA_B, public virtual POA_A { ...
}; This guarantees that the POA skeleton class inherits only one version of each operation, and also allows
optional inheritance of implementations. In this example, the implementation of interface B reuses the
implementation of interface A: // C++ class A_impl: public virtual POA_A { ... }; class B_impl: public virtual
POA_B, public virtual A_impl {}; For interfaces which inherit from an abstract interface, the POA skeleton class
is also virtually derived directly from the abstract interface class, but with protected access: // IDL abstract
interface A { ... }; interface B : A { ... }; // C++ class A { ... }; class POA_B : public virtual
PortableServer::ServantBase, protected virtual A { ... }; The abstract interface is inherited with protected access
to prevent accidental conversion of the POA skeleton pointer to an abstract interface reference, for ORBs which
implement object references as pointers. This also allows implementation classes and valutypes to share an
implementation of the abstract interface: // IDL valuetype V : supports A { ... }; // C++ class MyA : virtual A { ...
}; class MyB : public virtual POA_B, protected virtual MyA { ... }; class MyV : public virtual V, public virtual
MyA { ... };
Actions taken:
August 11, 1997: received issue
May 12, 1998: issue moved from port-rtf to cxx_revision
June 13, 2000: closed issue
Discussion:
Issue 678: inout strings modifiable? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: C++ mapping spec should be clearer about the rules for inout strings.There are currently two possible interpretations of what server can do with an inout string (details in archive)
Resolution: resolverd and closed
Revised Text:
Actions taken:
August 18, 1997: received issue
June 13, 2000: closed issue
Discussion: Close as fixed. The relevant example text now appears on page 23-103 of 99-03-04.
Issue 705: C and C++ Mapping question (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: IDL spec states that identifiers can have characters that are things like an A with accent aigu, or a german script B. Can IDL identifiers have these characters? How are they mapped ontoC/C++?
Resolution: Close as non-issue. IDL no longer permits non-ASCII letters in identifiers.
Revised Text:
Actions taken:
August 23, 1997: received issue
June 13, 2000: closed issue
Discussion:
Issue 721: Bounded strings (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: The C++ mapping basically ignores bounded strings and maps them to char* What should happen if I assign a string that is too long to a bounded string? No statement is made
Resolution: resolved, close issue
Revised Text:
Actions taken:
September 18, 1997: received issue
February 19, 1999: closed issue, resolved
Discussion:
Issue 722: Wide string allocation (1) (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: There is no wstring_dup(). For symmetrie with string_dup(), I would suggest to create wstring_dup() as well
Resolution: closed issue, fixed
Revised Text:
Actions taken:
September 17, 1997: received issue
February 19, 1999: closed issue, fixed
Discussion:
Issue 723: Wide string allocation (2) (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized
Severity:
Summary: Summary: There is no statement about the terminating zero value. Is room allocated for it or not?For symmetrie with string_alloc() I suggest that wstring_alloc() also should allocate more room.
Resolution: Fixed with issue 722
Revised Text:
Actions taken:
September 17, 1997: received issue
February 19, 1999: closed issue
Discussion:
Issue 731: IDL generated C++ types and stream operators (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity: Minor
Summary: Summary: Most ORBs provide overloaded operators to inject String_var values into ostream, istream, on ifstream. Problem: C++ does not make these operators mandatory, so every time I use one of them, I am writing non-portable and proprietary code. Nail those operators down and make them mandatory in the spec
Resolution: Fixed, requirements added
Revised Text:
Actions taken:
September 24, 1997: received issue
February 19, 1999: closed issue
Discussion:
Issue 732: Typo in C++ mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity: Minor
Summary: Summary: C++ mapping in CORBA 2.1 has a typo in the array mapping (section 18.15 page 18-33).Same typo appears in orbos/97-05-15 in section 16.12 page 16-33. It would be nice to actually show the C++ definitions for the types F, V, and M. Find details in corresponding file
Resolution: Fixed in CORBA 2.2 editing process
Revised Text:
Actions taken:
September 25, 1997: received issue
February 26, 1998: closed issue
Discussion:
Issue 781: C++ mapping for IN object references (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity: Significant
Summary: Summary: According to C++ mapping spec in the POA document (table 2, section 16.18.1) the signature for an object reference in argument should be "objref_ptr", not the more likely "const objref_ptr". this is an conflict with the convention for all other in args except numeric, and is in contrast with the table 3, that specifies "const objref_var&".
Resolution: Duplicate of issue 188 - closed
Revised Text:
Actions taken:
November 19, 1997: received issue
November 25, 1997: moved to cxx_revision
February 19, 1999: closed issue
Discussion: closed issue
Issue 800: Missing Mappings for Object (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity: Significant
Summary: Summary: The C++ mapping currently lack mappings for is_a(), is_equivalent(),
hash(), and non_existent(). These need to be added. The question is, which of these operations can validly be invoked on
a nil reference, because that affects the mapping. My thinking is that
all of these should be allowed for nil references.
Resolution: closed with no change
Revised Text:
Actions taken:
December 5, 1997: received issue
March 19, 1999: closed issue
Discussion: Close with no change. These functions are mapped following the normal C++ mapping rules. The proposed
change for adding helper functions to the CORBA module is too intrusive and is not deemed to be valuable enough to add.
Issue 801: Alias type codes in any values (cxx_revision)
Click here for this issue's archive.
Click here for this issue's attachments.
Nature: Uncategorized Issue
Severity: Significant
Summary: Summary: I believe the spec should be updated to explicitly require the following
to be safe: a1.replace(a1.type(), a1.value(), false);
In other words, an Any should be obliged to detect assignment to self
for the passed void *. Reason: The above is the only way I can see
to get a tk_alias type code into an any, so the receiver can tell the
difference between a date and an address.
Resolution: Close issue with no change -- already resolved in section 20.16.8.
Revised Text:
Actions taken:
December 12, 1997: received issue
March 19, 1999: closed issue
Discussion:
Issue 803: C++ mapping: missing from_wchar and to_wchar (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity: Minor
Summary: Summary: The C++ mapping states that "wchar" is not required map onto a
unique C++ type. Yet in 18.17.4, the mapping fails to define the
from_wchar and to_wchar struct types and associated <<= and >>=
operators for inserting and extract wide chars into anys. This
also needs to be fixed in appendix A.6 of section 18.
Resolution:
Revised Text:
Actions taken:
December 2, 1997: received issue
February 19, 1999: closed issue, fixed
Discussion: fixed
Issue 804: Typos in PIDL to C++ mappings (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity: Minor
Summary: Summary: I think that there is a pervasive Typo in Appendix A of chapter 18.
A number of the PIDL classes include a member function _duplicate.
It should be declared as a static member function
with an argument; i.e. the pointer to be "duplicated".
Resolution:
Revised Text:
Actions taken:
December 4, 1997: received issue
February 26, 1998: closed issue
Discussion:
Issue 863: Read-only restrictions on parameters (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: A variable-length in parameter is read-only in the
server, and a variable-length out parameter or return value is read-only
in the client. I believe the restriction is too harsh to be useful, and the optimization
permitted by the restriction is not worth it.
Resolution: Clarifying text added, fixed
Revised Text: Lift the restriction. No ORB that we are aware of makes use of the possible optimizations, and the restriction
places unnecessary burdens on application developers.
Revised Text: On page 20-109 of ptc/98-09-03, delete starting from paragraph beginning with:
The ORB is permitted to allocate a single contiguous area of storage for all data associated with a variable-length parameter.
This permits an ORB to, for example, unmarshal a sequence of...
Delete all text up to and including the paragraph ending with:
... but calling delete on a pointer to const object is an error.
A compliant mapping implementation therefore is not required to
detect this error.
Also delete footnote 17.
Actions taken:
Actions taken:
January 5, 1998: received issue
February 19, 1999: closed issue
Discussion:
Issue 902: CORBA::Bounds and CORBA::TypeCode::Bounds (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The C++ mapping uses a Bounds exception in the PIDL for NVList (page 17-6). This is the first time that the Bounds exception is mentioned (as far as I can see). There is no exception declaration for Bounds in the PIDL. This raises the questions:
1) Does Bounds have data members or not?
2) At what scope should Bounds be defined?
Given that the Bounds exception is also used by the
Request interface, I suspect what is meant is CORBA::Bounds.
The TypeCode interface also uses a Bounds exception. It is explicitly
declared in the scope of the TypeCode interface (page 17-15):
It would be nice to only have one of these, probably CORBA::Bounds, and
to add the missing declaration.
Resolution: resolved, close issue
Revised Text:
Actions taken:
January 13, 1998: received issue
February 19, 1999: closed issue, resolved
Discussion:
Issue 914: Mappings for hash, is_equivalent, _is_a and _non_existent (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The C++ mapping for CORBA::Object does not specify the mappings for
hash, is_equivalent, is_a and non_existent methods. I am assuming
these map to _hash, _is_equivalent, _is_a and _non_existent. Is this
correct ?
Resolution: duplicate of issue # 800, closed
Revised Text:
Actions taken:
January 19, 1998: received issue
January 27, 1998: closed issue..same as issue 800
Discussion:
Issue 920: ServantBase mappings (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Should the C++ mapping for ServantBase also have _duplicate,
_var mappings ? For example if get_servant is called on POA, what
are the ownership rules for the returned Servant. It seems providing
a _duplicate, _release operations on ServantBase might be useful. These
operations could be used to ensure that the Servant is not released
while the caller has a reference to it.
Resolution: resolved and closed in ptc/1998-09-03
Revised Text:
Actions taken:
January 27, 1998: received issue
July 6, 2000: closed issue
Discussion:
Issue 932: Semantics of >>= operator in C++ mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: According to the IIOP protocol specification, it is possible to receive
an any with a TypeCode which doesn"t include names, member names and
repository ids.
However, it is not clear what the behaviour of the >>= operator is in the C++
mapping for these cases. What happens if I receive an any value from
a remote ORB which didn"t encode names, member names and repository ids ? Is
it posible to extract its value using the so-called "type-safe" operator >>= ?
Resolution: closed with no change
Revised Text: Close as fixed. The TypeCode::equivalent() function determines whether or not extraction succeeds.
Actions taken:
January 28, 1998: received issue
June 22, 1998: moved from orb_revision to cxx_revision
March 19, 1999: closed issue
Discussion: Close 932 without change. The core already states that optional strings in type codes are the empty string, so it
follows that extraction of such a string results in an empty string. The remainder of the issue was resolved with the definition of
TypeCode::equivalent().
Issue 933: CORBA::ORB::InvalidName ambigious in C++ mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: In section 5.6:
// PIDL
module CORBA {
interface ORB {
exception InvalidName {};
};
};
In section A.24:
// C++
class ORB {
public:
class InvalidName {...};
};
The C++ mapping should be clarified to show that this is indeed a user
exception.
Resolution:
Revised Text:
Actions taken:
January 30, 1998: received issue
February 19, 1999: closed issue, resolved
Discussion:
Issue 956: No conversion defined from a B_var to an A_ptr (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: I was writing some C++ code and noticed that the following doesn"t work:
// IDL
interface A {
};
interface B : A {
};
// C++
B_var bv = get_b_from_somewhere();
A_var av = A::_duplicate(bv);
because there is no conversion defined from a B_var to an A_ptr. Is
there a way that this could be added to the language binding without
ambiguity problems?
Resolution: close with no change
Revised Text:
Actions taken:
February 11, 1998: received issue
June 13, 2000: closed issue
Discussion: Close no change. The needed widening can easily be achieved using the B_var::in() function like this:
A_var av = A::_duplicate(bv.in());
Issue 1056: Fixed types in orbos/98-01-11 (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: On page 20-36, near the top, the mapping says:
A T_out type for a Fixed type is defined as typedef to a
reference to the Fixed type, with the digits and scale added to
the name to disambiguate it. For example, the name of the T_out
type for the type Fixed<5,2> is Fixed_5_2_out:
// C++
typedef Fixed<5, 2>& Fixed_5_2_out;
This doesn"t appear to work for fixed types with negative scale. For example:
Resolution:
Revised Text:
Actions taken:
March 17, 1998: received issue
February 23, 1999: close issue
Discussion:
Issue 1069: Typos on p 20-34 of orbos/98-01-11 (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity: Minor
Summary: Summary: page 20-34 of orbos/98-01-11 contains a few typos:
1)
template<CORBA::UShort d, Short s>
should be
template<CORBA::UShort d, CORBA::Short s>
2)
operator LongDouble() const;
should be
operator CORBA::LongDouble() const;
3)
template<unsigned short d1, short s1, unsigned short d2, short s2)
should use CORBA types and use a closing ">" instead of ")":
template<
CORBA::UShort d1,
CORBA::Short s1,
CORBA::UShort d2,
CORBA::Short s2
> // Note closing ">"
Resolution:
Revised Text:
Actions taken:
March 18, 1998: received issue
February 19, 1999: closed issue, resolved
Discussion:
Issue 1070: macros for fixed arithmetic results (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The fixed mapping says on page 20-35 of orbos/98-01-11:
One way to do this is to declare the result types with a macro
that evaluates to the approate values, based on the digits and
scale of the operands:
// Example of Fixed result type declaraction
// Fixed<_FIXED_ADD_TYPE(d1,s1,d2,s2)> -> Fixed<dr,sr>
I think the name of the macro for each rule needs to be nailed down.
Resolution:
Revised Text:
Actions taken:
March 18, 1998: received issue
February 23, 1999: closed issue
Discussion:
Issue 1072: fixed_digits and fixed_scale member functions (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Page 20-34 of CORBA 2.2 shows member functions of the Fixed template:
CORBA::UShort fixed_digits() const;
CORBA::Short fixed_scale() const;
There are no semantics specified for these. I assume they return the
number of the respective digits passed to the template? For example, given
Fixed<5,2> x;
assert(x.fixed_digits() == 5);
assert(x.fixed_scale() == 2);
Is this the correct interpretation? If so, the spec should say so (otherwise,
I might, for example, expect that fixed_digits returns 3 and fixed_scale
return 2).
Resolution:
Revised Text: :UShort fixed_digits() const;
Actions taken:
March 19, 1998: received issue
June 24, 1998: moved from orb_revision to cxx_revision
February 23, 1999: closed issue
Discussion:
Issue 1073: Missing constructor for Fixed (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Type Fixed has constructors for LongDouble and int. This causes
a few initialization problems. For example:
Fixed<8,2> x = 6.75;
Fixed<8,2> y = 10L;
Fixed<8,2> z = 10U;
None of these will compile because of the ambiguity as to whether to use
the int or the LongDouble constructor.
I think Fixed will need additional constructors to allow initialization
from float, double, long and unsigned values.
Resolution:
Revised Text:
Actions taken:
March 19, 1998: received issue
February 23, 1999: closed issue
Discussion:
Issue 1092: C++ mapping for fixed is broken (01) (cxx_revision)
Click here for this issue's archive.
Nature:
Severity:
Summary: Summary: 1. If the C++ target environment does not support namespaces and/or
nested template class definitions, then it is impossible to implement
the Fixed template type as part of the CORBA module.
Resolution:
Revised Text:
Actions taken:
March 21, 1998: received issue
February 23, 1999: closed issue
Discussion:
Issue 1093: C++ mapping for fixed is broken (02) (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity: Significant
Summary: Summary: 2. The mapping for the "_out" type for Fixed is broken. It is
specified as a typedef, for example "Fixed<3,1>" maps to:
typedef Fixed<3,1> &Fixed_3_1_out;
but the IDL grammar allows fixed types to be declared as attribute
types, operation parameters and return values. This causes problems
because it is no longer obvious where to declare the _out type for an
out parameter.
Resolution: Close as fixed. The new Fixed mapping takes care of this.
Revised Text:
Actions taken:
March 21, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 1095: Old References in C++ mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: orbos/98-01-11 contains some stale references. For example, on page 20-18:
...
private:
// hidden assignment operators for var types to
// fulfill the fules specified in
// Section 19.3.2
};
The definition for the A_out type is the same as the one shown
in Section 19.3.6.
These should now refer to Section 20.
Resolution: Close without change. Already fixed.
Revised Text:
Actions taken:
March 23, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 1115: TypeCode_ptr base_typecode(TypeCode_ptr tc) (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity: Significant
Summary: Summary: Look at this code and tell me what is wrong with it (CORBA:: left off
for simplicity):
So, now the question is: Inside the
TypeCode_var::operator=(TypeCode_ptr tc)
assignment operator, when tc == this, what should happen?
Should this call release(this) to satisfy the requirements of code frag
#3? Or should it be a noop to satisfy the requirements of code frag #4?
Resolution: Close no change. The submitter of the issue misunderstood _var reference counting semantics.
Revised Text:
Actions taken:
April 6, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 1124: C++ Fixed type issue (01) (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: 1) Page 20-34: the unary + and - operators in the Fixed class should
return by value, not by reference.
Resolution:
Revised Text:
Actions taken:
March 31, 1998: received issue
February 23, 1999: closed issue
Discussion: received issue
Issue 1125: Fixed type (02) (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: 2) Page 20-35: the semantics of the istream extraction and ostream
insertion functions are totally unspecified -- what formats are used
to read and write Fixed types?
Resolution:
Revised Text:
Actions taken:
March 31, 1998: received issue
February 23, 1999: closed issue
Discussion:
Issue 1126: C++ Fixed Type (03) (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: 3) Page 20-35: the +=, -=, *=, and /= operators are required by the
C++ language to be member functions, not global functions. They
should be moved into the Fixed class and should return a reference to
*this, not a value.
Resolution:
Revised Text:
Actions taken:
March 31, 1998: received issue
February 23, 1999: closed issue
Discussion:
Issue 1128: String member initialization (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: orbos/98-01-11 doesn"t initialize string members if they are inside
a sequence or array.
For consistency, it would be better to adopt the following:
- A plain String_var is default-constructed to contain a
null pointer (like all other _var types).
- If a structure, exception, sequence, or array contains
a string, that string is initialized to the empty string
when default-constructed. In case of a sequence of strings,
this means that strings are default-constructed to the
empty string when the sequence is extended.
Resolution:
Revised Text:
Actions taken:
April 1, 1998: received issue
February 19, 1999: closed issue, resolved
Discussion:
Issue 1134: C++ Sequence mapping Question (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Section 20.13 states:
"For each different named OMG IDL sequence type, a compliant
implementation provides a separate C++ sequence type."
This certainly means that each declared sequence with a different bound
and component type maps to a unique C++ class. But how about this:
// IDL
typedef sequence<long> LongSeq1;
typedef sequence<long> LongSeq2;
Are LongSeq1 & LongSeq2 mapped to the same or different C++ classes?
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
April 7, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 1137: Typos in parameter passing rules (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: page 20-74 of orbos/98-01-11 shows the tables for the parameter passing
rules. There are six notes on page 20-76 that are meant to be referenced
by the tables. However, those references are no longer correct.
For example, the array parameter passing rules in table 19-2 (should be
table 20-2) have the index 2, but note 2 actually refers to the rules
for passing references.
Notes 3 to 6 are no longer referenced by the table, but should be.
Resolution:
Revised Text:
Actions taken:
March 30, 1998: received issueq
April 16, 1998: closed issue
Discussion:
Issue 1148: Typo in orbos/98-01-11 (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity: Minor
Summary: Summary: Page 20-74, para 1:
... original specified except the first oneA caller is ...
Should be
... original specified except the first one. A caller is ...
Resolution:
Revised Text:
Actions taken:
April 17, 1998: received issue
February 19, 1999: closed issue
Discussion:
Issue 1149: _out parameter typo (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity: Minor
Summary: Summary: orbos/98-01-11 contains a typo on page 20-20.
The last line of Table 19-1 shows CORBA::Octet in the "C++ Out Type"
column. This should be CORBA::Octet_out instead.
Resolution:
Revised Text: :Octet in the "C++ Out Type"
Actions taken:
April 17, 1998: received issue
February 19, 1999: closed issue
Discussion:
Issue 1289: How to put a generic CORBA exception into an Any (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: There doesn"t appear to be any way to place an arbitrary exception into
an Any with the current C++ mapping. This is necessary to make the DSI
usefulThe spec needs to be extended to provide an inserter function to insert
a CORBA::Exception into an Any. I know that this has potential issue
for the inserter function to determine the correct typecode for the
exception, but I can"t think of any other way to get an exception into
the Any when all I"ve got is a CORBA::Exception * without having to
enumerate each possible exception by calling _narrow.
Resolution:
Revised Text:
Actions taken:
April 29, 1998: received issue
February 19, 1999: closed issue, resolved
Discussion:
Issue 1319: C++ Any mapping proposed change (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: Add the following operation to CORBA::Any:
class Any {
...
void type(TypeCode_ptr);
...
};
This will replace the internal typecode in the any with the specified
typecode. If the new typecode is not equivalent to the old typecode (as
defined by TypeCode::equivalent), then implementation will raise the
BAD_TYPECODE system exception.
Resolution:
Revised Text:
Actions taken:
May 12, 1998: received issue
February 23, 1999: close issue
Discussion:
Issue 1383: Missing operators in orbos/98-01-11 (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: the Any class shown on page 20-115 of 98-01-11 appears to be missing
support for some of the new IDL types. In particular, no operators
are shown for (unsigned and signed) long long and long double.
Also, there is no operator to insert an *unbounded* *wide* string.
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
May 18, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 1384: Mapping for wide strings (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: the spec doesn"t say what the type CORBA::WChar should map to. Presumably,
it should be wchar_t? If so, I think this should be stated.
It is important to nail this down because of overloading ambiguities. For
example, if CORBA::WChar * is allowed to be the same as char *, then
we cannot use the overloaded <<= operator to insert unbounded wide strings
into an Any.
Resolution: Fix the mapping to specify what WChar maps to.
Revised Text: On page 20-24 of ptc/98-09-03, change the paragraph:
Except for boolean, char, and octet, the mappings for basic types must be distinguishable from each other for the
purposes of overloading. That is, one can safely write overloaded C++ functions on Short, UShort, Long, ULong,
Float, and Double.
To read:
Types Boolean, Char, and Octet may all map to the same underlying C++ type. This means that these types may
not be distinguishable for the purposes of overloading.
Type WChar maps to wchar_t in standard C++ environments or, for non-standard C++ environments, may also
map to one of the integer types. This means that WChar may not be distinguishable from integer types for the
purposes of overloading.
All other mapping sfor basic types are distinguishable for the purposes of overlaoding; that is, one can safely write
overloaded C++ functions on Short, UShort, Long, ULong, LongLong, Float, Double, and LongDouble.
On page 20-59, add the following text to the paragraph introducing the overloaded string insertion operators:
Note that insertion of wide strings in this manner depends on standard C++, in which wchar_t is a distinct type.
Code that must be portable across standard and older C++ compilers must use the from_wstring helper type.
Add a footnote to the second bullet on page 20-62:
Note that extraction of wide strings in this manner depends on standard C++, in which wchar_t is a distinct type.
Code that must be portable across standard and older C++ compilers must use the to_wstring helper type.
Add the missing insertion and extraction operators for wide strings to the Any class on page 20-159:
void operator<<=(const WChar *);
Boolean operator>>=(WChar * &) const;
Actions taken:
May 19, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 1386: Any and WChar issue (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The C++ mapping requires that attempt to insert a Boolean, Octet, or
Char value into an any must generate a compile-time error:
CORBA::Any a;
CORBA::Char c = "x";
a <<= c; // Compile-time error
The spec says nothing about WChar and WChar *. This implies that no such
guarantee exists. However, I don"t think it would hurt to spell this out:
CORBA::Any a;
CORBA::WChar wc = L"x";
a <<= wc; // Undefined behavior
Resolution: closed, fixed
Revised Text: nsert the following text on page 20-59 of ptc/98-09-03, prior to the paragraph beginning with "Because valuetypes":
Note that the following code has undefined behavior in non-standard C++ environments:
CORBA::Any a;
CORBA::WChar wc = L'x';
a <<= wc; // Undefined behavior
This code may erroneously insert an integer type in environments where wchar_t is not a distinct type.
On page 20-62, preceding the para beginning with "For non-primitive types...", insert the following text:
Note that the following code has undefined behavior in non-standard C++ environments:
CORBA::Any a = ...;
CORBA::WChar wc;
a >>= wc; // Undefined behavior
This code may erroneously extract an integer type in environments where wchar_t is not a distinct type.
Add the following text as the final paragraph of 20.16.4:
In standard C++ environments, the mapping must declare the from_* and to_* constructors as explicit. This
prevents undesirable conversions via temporaries.
Actions taken:
May 19, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 1418: C++ _var type widening proposal (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Michi Henning & Steve Vinoski have previously challenged people to come
up with a modification to the C++ language mapping that would allow for
type safe widening of object reference _var types for assignment or copy
construction. I believe I have come up with the solution, and Michi
agrees with me:
Proposal:
For object reference _var types, replace the copy and assignment
operators:
class T_var {
public:
...
T_var(const T_var &);
T_var &operator = (const T_var &);
...
};
with:
class T_var {
public:
...
template <class C_var>
T_var(const C_var &cv) : ptr_(T::_duplicate(cv.in()) {
}
template <class C_var>
T_var &operator = (const C_var &cv) {
if ((void *)this != (void *)cv) {
CORBA::release(ptr_);
ptr_ = T::_duplicate(cv.in());
}
return *this;
}
...
private:
T_ptr ptr_;
};
Resolution:
Revised Text:
Actions taken:
June 2, 1998: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 1519: _var & _out types problems (01) (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: 1. The spec insection 20.9.2 does not specifically address the form of
T_out types for fixed length structured types. So, should the T_out
type be:
typedef T &T_out;
or should it follow the form of the T_out type for variable length
structured types and define as a "class T_out"? In this case, of course
the copy contructor operator from T_var would not delete the pointer
held by the T_var.
Since the "class T_out" solution for fixed length types does not appear
to have any advantages over the typedef, I recommend that the spec be
modified to state that T_out types for fixed length structured types
simply be a typedef of "T&".
Resolution: see below
Revised Text: Preceding the final paragraph of 1.9.2, add the following para:
For fixed-length underlying types, no memory management issues arise;
however, a compliant mapping must provide the following type definition
in the scope of T:
typedef T &T_out;
Actions taken:
June 10, 1998: received issue
May 13, 2002: closed issue
Discussion:
Issue 1520: Spec does not mention the existance of an Any_out class (cxx_revision)
Click here for this issue's archive.
Nature: Enhancement
Severity:
Summary: Summary: 2. The spec does not explicitly mention the existence of an Any_out
class. I believe that this class is necessary, following the same
pattern as the normal T_out class for variable length structured types.
Resolution: resolved and closed
Revised Text: Change 1.16.1 of formal/99-07-41 to read:
1.16.11 The Any_var and Any_out Classes Since Anys are returned via pointer as out and return parameters (see
Table 1-3 on page 1-104), there exists an Any_var class similar to the T_var classes for object references.
Any_var obeys the rules for T_var classes described in Section 1.9, "Mapping for Structured Types," on page
1-21, calling delete on its Any* when it goes out of scope or is otherwise destroyed. The full interface of the
Any_var class is shown in Section 1.41.6, "Any_var Class," on page 1-154. An Any_out class is also available
that is similar in form to the T_out class described in Section 1.9.2.
Actions taken:
June 10, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 1521: Spec is too verse in defining the T_var types for fixed length (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: 3. The spec is too terse in defining the T_var types for fixed length
structured types as having "the same semantics as T_var types for
variable-length types." This is not quite true, since the signatures
for out and return values of these types are different, thus changing
the semantics of the implicit and explicit (out() and _retn())
conversion operations. The spec should show the definition of the out()
and _retn() operations for fixed length types as:
T &T_var::out()
{
return ptr_;
}
T &T_var::_retn()
{
return ptr_;
}
Resolution: closed/resolved
Revised Text: On page 1-25 of formal/99-07-41, change the paragraph beginning with "The T_var types are also produced for fixed-length
structured types..." to the following:
The T_var types are also produced for fixed-length structured types for reasons of consistency. These types have
the same semantics as T_var types for variable-length types. This allows applications to be coded in terms of
T_var types regardless of whether the underlying types are fixed- or variable-length. T_var types for fixed-length
structured types have the following general form: class T_var { public: T_var() : m_ptr(0) {} T_var(T *t) :
m_ptr(t) {} T_var(const T& t) : m_ptr(new T(t)) {} T_var(const T_var &t) : m_ptr(0) { if (t.m_ptr != 0) m_ptr =
new T(*t.m_ptr); } ~T_var() { delete m_ptr; } T_var &operator=(T *t) { if (t != m_ptr) { delete m_ptr; m_ptr =
t; } return *this; } T_var &operator=(const T& t) { if (&t != m_ptr) { T* old_m_ptr = m_ptr; m_ptr = new T(t);
delete old_m_ptr; } return *this; } T_var &operator=(const T_var &t) { if (this != &t) { T* old_m_ptr = m_ptr;
if (t.m_ptr != 0) m_ptr = new T(*t.m_ptr); else m_ptr = 0; delete old_m_ptr; } return *this; } T* operator->() {
return m_ptr; } const T* operator->() const { return m_ptr; } const T& in() const { return *m_ptr; } T& inout()
{ return *m_ptr; } T& out() { if (m_ptr == 0) m_ptr = new T; return *m_ptr; } T _retn() { return *m_ptr; }
private: T* m_ptr; };
Actions taken:
June 10, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 1534: Add _narrow() operation to each POA servant (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: 1. The C++ spec requires that all POA servant classes derive from
PortableServer::ServantBase as a virtual base class. For C++
environments without RTTI, it is then impossible for the programmer to
narrow a servant received from the POA via reference_to_servant() or
id_to_servant() back to the programmer"s specific servant class.
Proposal: Add a _narrow() operation to each POA servant class in the
same fashion that _narrow() operations are defined for exception
classes:
// IDL
interface A { };
// C++
class POA_A : public virtual PortableServer::ServantBase {
public:
POA_A *_narrow(PortableServer::Servant);
};
The _narrow() operation will return a valid pointer if the servant isa
POA_A, otherwise it returns 0.
Resolution: :ServantBase as a virtual base class. For C++
Revised Text:
Actions taken:
June 18, 1998: received issue
Discussion: Add a _narrow() operation to each POA servant class in the
Issue 1535: Do POA servant classes need to use virtual inheritance? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: 2. The spec is silent on whether POA servant classes need to use
virtual inheritence when an IDL class inherits from the same base
interface more than once:
// IDL
interface A { void op(); };
interface B : A { };
interface C : A { };
value D : supports B, C { };
Must POA_B & POA_C inherit virtually from POA_A or can defined
independently with all of interface A"s operations? This makes a big
difference for values that support interfaces, since, for example, value
D is defined by the C++ language mapping to inherit from both POA_B and
POA_C. So, does value D inherit one or two versions of A::op()?
Resolution: resolved
Revised Text: Add the following to the end of section 1.36.6 of formal/99-07-41:
For interfaces which inherit from one or more base interfaces, the generated POA skeleton class uses virtual
inheritance: // IDL interface A { ... }; interface B : A { ... }; interface C : A { ... }; interface D : B, C { ... }; //
C++ class POA_A : public virtual PortableServer::ServantBase { ... }; class POA_B : public virtual POA_A { ...
}; class POA_C : public virtual POA_A { ... }; class POA_D : public virtual POA_B, public virtual POA_A { ...
}; This guarantees that the POA skeleton class inherits only one version of each operation, and also allows
optional inheritance of implementations. In this example, the implementation of interface B reuses the
implementation of interface A: // C++ class A_impl: public virtual POA_A { ... }; class B_impl: public virtual
POA_B, public virtual A_impl {}; For interfaces which inherit from an abstract interface, the POA skeleton class
is also virtually derived directly from the abstract interface class, but with protected access: // IDL abstract
interface A { ... }; interface B : A { ... }; // C++ class A { ... }; class POA_B : public virtual
PortableServer::ServantBase, protected virtual A { ... }; The abstract interface is inherited with protected access
to prevent accidental conversion of the POA skeleton pointer to an abstract interface reference, for ORBs which
implement object references as pointers. This also allows implementation classes and valutypes to share an
implementation of the abstract interface: // IDL valuetype V : supports A { ... }; // C++ class MyA : virtual A { ...
}; class MyB : public virtual POA_B, protected virtual MyA { ... }; class MyV : public virtual V, public virtual
MyA { ... };
Actions taken:
June 18, 1998: received issue
June 13, 2000: closded issue
Discussion: A { };
Issue 1538: Missing text describing fixed point constant mapping (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: There is no text in the C++ language mapping that describes how to map a
fixed point constant declaration.
Resolution:
Revised Text:
Actions taken:
June 23, 1998: received issue
February 23, 1999: closed issue
Discussion: received issue
Issue 1617: C++ mapping for strings (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: The C++ mapping requires that strings are to be mapped to char *.
Unfortunately, with ANSI C++ compilers, this creates problems if
string literals are involved.
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification
Revised Text:
.
Actions taken:
June 30, 1998: received issue
March 19, 1999: closed issue
Discussion: Close with no change. While the suggestion in the issue's archive would work, it would be too intrusive.
Issue 1626: C++ issue to coordinate with proposed resolution of issue 752 (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: In coordination with the proposed resolution to the ORB Portability RTF
Issue #752, add the following operations to PortableServer::ServantBase
in section 20.34.1:
class ServantBase {
...
public:
...
virtual InterfaceDef_ptr _get_interface() throw(SystemException);
virtual Boolean _is_a(const char * logical_type_id)
throw(SystemException);
virtual Boolean _non_existent() throw(SystemException);
...
};
and change the last paragraph of section 20.34.1 to:
The default implementation of the _default_POA() function provided by
ServantBase returns an object reference to the root POA of the default
ORB in this process — the same as the return value of an invocation of
ORB::resolve_initial_references("RootPOA") on the default ORB. Classes
derived from ServantBase can override this definition to return the POA
of their choice, if desired.
and add the following text at the end of section 20.34.1:
ServantBase provides default implementations of the _get_interface(),
_is_a(), and _non_existent() standard object reference operations that
can be overridden by the object implementation if the default behavior
is not adequate. These functions are called just like normal skeleton
operations by the POA, so the programmer can use _this() and and the
PortableServer::Current interface in the function bodies.
The default implementation of the _get_interface() and _is_a() functions
provided by ServantBase uses the interface associated with the skeleton
class if it is static to determine its return value. If the skeleton is
dynamic (see 20.36) it uses the _primary_interface() function to
determine its return value.
The default implementation of the _non_existent() function simply
returns false.
Resolution: :ServantBase
Revised Text:
Actions taken:
July 2, 1998: received issue
February 23, 1999: closed issue
Discussion:
Issue 1627: Problems with deactivate_object() (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: The POA does not properly define the behavior of POA operations
for requests that are currently executing in an object that
has been deactivated.
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
July 2, 1998: received issue
February 25, 1999: moved to cxx_revision
June 13, 2000: closed issue
Discussion:
Issue 1631: C++ Servants: Adding Reference counting (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The C++ mapping for the Portability Specification does not provide
reference counting for servants. This proposal adds reference
counting to the C++ mapping to ease memory management of
implementations. It borrows from the C++ language mapping from the
Objects by Value specification which does have reference counting for
values. Specifying the reference counting calls is important so that
both the Adapter implementation and multi-threaded application code
can cooperate to ensure that implementations are only deleted when no
longer used by any thread. Without specifying these calls, deadlocks
are extremely easy to introduce into the system.
Resolution:
Revised Text:
Actions taken:
July 2, 1998: received issue
Discussion:
Issue 1655: Section 5.3.6.3 Value Factories (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The last paragraph of section 5.3.6.3 says the standard language mapping
rules are followed when determining these operation signatures. Since
one of the arguments/return values is a Native, this isn"t quite
possible.
Resolution: Already resolved.
Revised Text:
Actions taken:
July 9, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 1656: C++ language mapping minor editorial revision (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: There are a few minor editorial mistakes in the C++ language
mapping examples. These are included in this single issue for
brevity.
Resolution: Already resolved.
Revised Text:
Actions taken:
July 9, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 1657: Section 7.3.5 ValueBase editorial changes (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: The C++ language mapping for ValueBase is missing return
values on _add_ref and _remove_ref.
Resolution: Fix the code.
Revised Text: On the top of page 20-77 of ptc/98-09-03, change the signatures of _add_ref and _remove_ref to be:
virtual ValueBase* _add_ref() = 0;
virtual void _remove_ref() = 0;
Actions taken:
July 9, 1998: received issue
March 19, 1999: closed issue
Discussion: received issue
Issue 1658: Parameter passing rules for ValueFactory (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: Since it is a native, the parameter passing rules for ValueFactory
must be specified so the register/unregister/lookup operations
can be mapped.
Resolution: Already resolved.
Revised Text:
Actions taken:
July 9, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 1659: Section 7.3.6: PortableServer::ValueRefCountBase (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: There is no mention of PortableServer::ValueRefCountBase after this
page. It is not clear why values that also implement interfaces
do not use the same reference counting scheme as other values.
Resolution:
Revised Text:
Actions taken:
July 9, 1998: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 1686: resolve_initial_references missing from Orb interface (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: Are you looking at CORBA 2.2, document orbos/98-02-01?
Section 20.31.4 covers ORB_init and friends. The POA is an ordinary IDL
interface that just follows the ordinary C++ mapping rules, so it needs no
special mention. The C++ server side is explained in 20.33 through 20.38.
You are correct that resolve_initial_references is missing from the ORB
interface. This was because it used to be covered in another section, and
it appears to have been inadvertantly dropped by the editors at the OMG.
Juergen, this should be logged as a cxx_revision issue. However,
resolve_initial_references just follows the regular C++ mapping rules, so
there"s really no harm in it being missing.
Resolution: Add the missing text.
Revised Text: In Section 20.33.1, page 20-130, of ptc/98-09-03, add the following to the ORB IDL:
typedef string ObjectId;
typedef sequence<ObjectId> ObjectIdList;
Object resolve_initial_references(in ObjectId id) raises(InvalidName);
ObjectIdList list_initial_services();
In section 20.33.2, pages 20-130 and 20-131, and page 20-169, add the following to the ORB class:
typedef char* ObjectId;
class ObjectIdList { ... };
Object_ptr resolve_initial_references(const char* id);
ObjectIdList* list_initial_services();
Actions taken:
July 15, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 1700: void * functions for Any (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The mapping for Any currently requires:
Any(TypeCode_ptr tc, void *value, Boolean release = FALSE);
void replace(TypeCode_ptr tc, void *value, Boolean release = FALSE);
const void *value() const;
The meaning of the void * parameters is never defined (and cannot ever
be defined because it would have to mandate a particular binary layout).
This means these three functions have completely undefined semantics. Even
for basic types, such as CORBA::Long, I cannot assume that the void *
will point directly at the long value, because the mapping implementation
is free to make the pointer point at some other value internal to an Any.
Proposal: Remove these three functions from the mapping. If vendors want
to retain them for backward compatibility reasons, they can.
However, functions with completely undefined semantics that are
inherently non-portable have no place in a standard mapping.
Resolution: Leave the original text in place. Add a sentence saying that DynAny should be used instead.
Revised Text: Delete section 1.16.8, “Handling Untyped Values”.
• Move the signature for the type() accessor to section 1.16.9.
• Add the signature for the type modifier to section 1.16.9 (because it is
missing currently from 1.16.8).
• Update the mapping for Any in section 1.41.5:
remove the constructor from void *, and the replace() and value() member
functions.
Actions taken:
July 20, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 1735: Servant management rules (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Here is a list of all the POA-related operations that deal with the Servant
type, and how I believe they need to act with respect to reference
counting. Because there aren"t that many operations in this list, I believe
that by spelling them out in detail rather than trying to capture their
behavior in general rules accomplishes two things:
1) We make it crystal clear to POA implementors and application developers
how each operation handles reference counting for the Servants it deals
with, and how the POA interacts with those servants.
2) We make it clear to future maintainers of the C++ mapping for the
PortableServer module that any new operations that deal with servants must
have their servant reference counting semantics explicitly specified.
Again, because there are so few operations to cover, explicitly specifying
rules for each one is simple and precise.
Resolution:
Revised Text:
Actions taken:
July 25, 1998: received issue
August 5, 1998: closed issue
Discussion:
Issue 1747: from_string issue (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: The latest C++ mapping (document orbos/98-05-08) defines the
Any::from_string type as
struct from_string {
from_string(char* s, ULong b, Boolean nocopy = FALSE) : val(s),
bound(b) {}
...
};
In ANSI C++, this disallows the following code:
any <<= Any::from_string("string literal");
This is because string literals in ANSI C++ are const char[], not char[].
Therefore, from_string should have an additional constructor to allow
insertion of a const char* as well.
Resolution: Close as duplicate of 2453.
Revised Text:
Actions taken:
July 28, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 1776: New C++ issue about T_out classes (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary:
In 20.9.2, the T_out class has a copy constructor and assignment
operator that take non-const references to a T_out argument. These
should be changed to const references instead because the T_out class
still works correctly with the change, and many compilers issue errors
or warnings about non-const references arguments bound to temporary
values.
Resolution: fixed, issue closed
Revised Text: On page 20-33 of ptc/98-09-03, change the T_out copy constructor and assignment operator as follows:
T_out(const T_out& p) : ptr_(p.ptr_) {}
T_out& operator=(const T_out& p) {
ptr_ = p.ptr_;
return *this;
}
return *this;
}
Actions taken:
August 5, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 1777: DSI C++ issue (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Section 20.36.1, page 20-118 of orbos/98-07-12 says:
"Similarly, data allocated by the DIR and handed to the ORB (the NVList
parameters, the result value, and exception values) are freed by the ORB
rather
than by the DIR."
However, the signatures for the set_result() and set_exception() functions of
ServerRequest take arguments of type const Any&. How can the ORB adopt the
result and exception data from a const Any? Unless I am missing something,
either these signatures have to be changed to Any&, or the quoted sentence has
to change to remove the text "the result value, and exception values".
Resolution: Change the text as suggested.
Revised Text: Change the last sentence of 20.38.1, page 20-152 of ptc/98-09-03, to:
Similarly, data allocated by the DIR and handed to the ORB (the NVList parameters) are freed by the ORB
rather than by the DIR.
Actions taken:
August 5, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 1783: Comparison operators for Fixed (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: The fixed mapping in 98-07-12 shows:
Fixed operator > (const Fixed &val1, const Fixed& val2);
Fixed operator < (const Fixed &val1, const Fixed& val2);
Fixed operator >= (const Fixed &val1, const Fixed& val2);
Fixed operator <= (const Fixed &val1, const Fixed& val2);
Fixed operator != (const Fixed &val1, const Fixed& val2);
Fixed operator == (const Fixed &val1, const Fixed& val2);
I"m surprised at the return type -- shouldn"t that be bool for ANSI
compilers and int for non-ANSI compilers?
Resolution: Already resolved.
Revised Text:
Actions taken:
August 7, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 1785: Passing Fixed to operations (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: // IDL
typedef fixed<4,2> F;
interface foo {
void op(in F param);
};
What should happen if at run time, I do the following?
F myf = "12345.678D";
foo_var fv = ...;
fv->op(myf); // ???
I think the operation should raise BAD_PARAM, because silent truncation
is too dangerous. Note that the operation cannot send a fixed<8,3> because
the operation expects a fixed<4,2> and will get a marshalling error if
what arrives over the wire does not match the IDL definition.
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
August 7, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 1794: _ptr_type and _var_type typedefs (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: We recently added _ptr_type and _var_type typedefs into interface classes
to make writing templates for interface types easier. We should add the
same typedefs for valuetype classes.
Resolution: Add the missing typedefs
Revised Text: Add to 4.19:
To facilitate template-based programming, typedefs for the _ptr, _out, and _var types are
provided in the valuetype class. The typedef for _ptr is named _ptr_type, the typedef for
_out is named _out_type, and the typedef for _var is named _var_type.
Add to the example as part of 4.19.1:
typedef ... Val_ptr;
class Val_out;
class Val_var;
class Val : public virtual ValueBase {
public:
...
typedef Val_ptr _ptr_type;
typedef Val_var _var_type;
typedef Val_out _out_type;
Actions taken:
August 11, 1998: received issue
January 11, 2012: closed issue
Discussion:
Issue 1799: struct containing Fixed type (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Section 20.9, page 20-28 of orbos/98-07-12 describes what types are
considered variable-length. Since the new Fixed class has non-trivial
constructors, it should also be a considered a variable-length type. Note
that any fixed-length struct containing one cannot be statically initialized.
Resolution:
Revised Text:
Actions taken:
August 11, 1998: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 1898: Fixed-point initialization (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The Fixed mapping requires throwing DATA_CONVERSION if a value has more
than 31 integral digits:
Fixed f = 1E32; // DATA_CONVERSION
This raises the question of how to deal with Fixed types in environments
without C++ exceptions. Presumably, we need to add a CORBA::Environment
parameter everywhere. Unfortunately, that isn"t possible with the overloaded
operators that are currently defined.
Resolution:
Revised Text:
Actions taken:
August 31, 1998: received issue
Discussion: :Environment
Issue 1899: Rounding and truncation of Fixed (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: What happens if I do:
Fixed f = "999999.999";
Fixed f2;
f2 = f.round(3, 1); // ???
f2 = f.truncate(3, 1); // ???
Should these throw DATA_CONVERSION? I think so -- if we agree on this,
the spec should state it.
Resolution:
Revised Text:
Actions taken:
August 31, 1998: received issue
Discussion:
Issue 1923: Is SystemException supposed to be concrete? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The CORBA 2.2 C++ binding has the SystemException class defined as a
concrete class, because it redefines _raise() as a non-pure virtual.
This seems to be a bad idea to me. It would be better to leave _raise()
as a pure virtual so that SystemException cannot be instantiated. This
prevents accidental programming errors in catching SystemExceptions by
value, which slices off the real exception type.
Resolution: Add pure virtual _raise functions to CORBA::SystemException and CORBA::UserException.
Revised Text: On page 20-102 of ptc/98-09-03, add a pure virtual _raise function to UserException. Do the same for
SystemException on pages 20-102 and 20-103. Do the same for SystemException on page 20-162 and for UserException on
page 20-163.
Actions taken:
September 2, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 1937: Signature of _narrow in exceptions (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The mapping shows the signature for the _narrow static member
functions in exceptions as
static SystemException * _narrow(Exception *);
I think we should change this to
static SystemException * _narrow(const Exception *);
Otherwise, I cannot catch an exception as const and then narrow it
without a cast.
Resolution:
Revised Text:
Actions taken:
September 7, 1998: received issue
February 22, 1999: closed issue
Discussion:
Issue 1946: sequence allocbuf parameter != 0 (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Sequence allocbuf functions should be specified such that passing zero for
their arguments is illegal. Allocating a sequence buffer of zero elements
is rather pointless because nothing useful can be done with such a buffer.
The result of passing zero to allocbuf should be implementation-defined,
since throwing an exception is not a good way to handle programming logic
errors (similar to how indexing past the end of a sequence is a logic error
for which an exception is pretty useless).
Resolution: Close no change. Discussion of this issue determined that a zero parameter to allocbuf is legal and
Revised Text:
Actions taken:
September 13, 1998: received issue
June 13, 2000: closed issue
Discussion: Close no change. Discussion of this issue determined that a zero parameter to allocbuf is legal and useful.
Issue 1947: sequence max < length (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: What happens when you pass a maximum argument that is less than the length
argument to the "T* data" constructor of an unbounded sequence? Should the
length argument be treated as equal to the max argument, or should an
implementation-defined error (such as an assert) be allowed?
What happens if you pass a null pointer for the buffer argument to the "T*
data" constructor of a sequence? Should the constructor create the sequence
as if it was created with the default constructor, or should an
implementation-defined error (such as an assert) be allowed? Should a null
pointer argument be allowed if the maximum and length arguments are zero?
Resolution:
Revised Text:
Actions taken:
September 13, 1998: received issue
Discussion:
Issue 1971: Extraction of strings from an Any (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: What happens if I write
CORBA::Any a = ...;
const char *p;
a >>= p;
and the type code in the Any indicates a *bounded* string? Does the extraction
succeed or fail? The mapping doesn"t say.
Resolution:
Revised Text:
Actions taken:
September 17, 1998: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 1983: Extraction of Fixed from Any (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The mapping right now offers Any::to_fixed to get a Fixed value out of an Any:
to_fixed(Fixed &f, UShort d, UShort s);
The spec doesn"t state what should happen if the digits and scale do
not match what is in the type code. I believe extraction should fail in
this case.
Resolution:
Revised Text:
Actions taken:
September 22, 1998: receive dissue
Discussion: deferred in June 2011 to the next RTF
Issue 1984: Generic extraction of Fixed (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary:
The C++ mapping does not permit extraction of a Fixed from an Any
in a generic way -- I must always specify matching digits and scale in
order to call Any::to_fixed(). This is inconvenient if an application
wants to deal with Fixed values generically (because Fixed is a generic
type in C++ anyway).
Proposal:
Add an overloaded >>= operator for extraction of Fixed from an Any.
The operator sets the Fixed value to whatever scale and digits
are present in the type code.
Cheers,
Michi.
Resolution:
Revised Text:
Actions taken:
September 22, 1998: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 2002: The C++ mapping for valuetype _narrow should not _add_ref (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The C++ mapping for valuetype includes a typesafe _narrow generated
for all values. The specification states that the caller
of _narrow must invoke _remove_ref once on the returned value
from _narrow (just like object reference _narrow).
f
Resolution: Already resolved.
Revised Text:
Actions taken:
September 27, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 2003: Tie classes (cxx_revision)
Click here for this issue's archive.
Nature: Enhancement
Severity: Minor
Summary: Summary: It would be nice to have a trait in the Tie classes of the class that the requests are being forwarded to. Something like this:
template <class T>
class POA_Foo_tie : public POA_Foo
{
public:
// ....
typedef T tie_object_type;
};
Resolution:
Revised Text:
Actions taken:
September 28, 1998: received issue
September 30, 1998: closed, no action
Discussion:
Issue 2029: _primary_interface (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: From the C++ spec (CORBA2_3-c++.pdf) pg: 20-132
For static skeletons, the default implementation of the _get_interface
and _is_a functions provided by ServantBase use the interface associated
with the skeleton class to determine their respective return values. For
dynamic skeletons (see Section 20.37), these functions use the
_primary_interface function to determine their return values.
Does this mean that a dynamic implementation needs the IFR?
If not, then how can _is_a be implemented for sub-types?
I note that the java mapping includes the method _all_interfaces in Servant
for precisely this reason...
Resolution: Already resolved.
Revised Text:
Actions taken:
October 2, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 2032: Typedef for ties? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: We currently have the _ptr_type and _var_type definitions for interface
classes. These are useful for template functions that need to deal with
the proxy type as well as the _ptr and/or _var references.
In a similar vein, we could add a typedef to the tie template for the
tied object class:
template<class T>
class POA_A_tie : public POA_A {
public:
typedef T _tied_object_type; // <=== New
//
};
Resolution:
Revised Text:
Actions taken:
October 5, 1998: received issue
October 5, 1998: closed issue
Discussion:
Issue 2035: mapping IDL Unicode escapes to C++ (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The question has arisen how the new Unicode escapes that were
introduced in the Java to IDL mapping should be mapped to C++.
There"s nothing about this in the C++ mapping chapter.
Resolution:
Revised Text:
Actions taken:
October 5, 1998: received issue
October 6, 1998: moved from core to c++ revision
Discussion:
Issue 2097: 98-09-03, exception inconsistency (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: In 98-09-03, SystemException has a pure virtual _raise() member
(Section 20.18). That member is not shown in Section 20.40.8.
Also, I think UserException also should have the pure virtual _raise()
member, but neither the text in Section 20.18 nor the summary in
Section 20.40.9 shows it.
Resolution: Close as duplicate of 1923.
Revised Text:
Actions taken:
October 19, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 2118: Any missing LongLong operators, etc? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: In the latest spec (98-09-03) the Any class appears to be missing
insertion extraction operators for LongLong, ULongLong, etc.
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
October 22, 1998: received issue
June 13, 2000: closed issue
Discussion:
Issue 2207: Need more info for custom marshalled value in C++ (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The current C++ chapter for custom marshalled values on p. 20-94 lacks
information about how one implements a custom value.
The "Value Type Semantics" chapter in "ptc/98-10-06, 15 Oct. 98[REVIEW]"
p. 5-11 says,
" The implementer of a custom value type shall provide an
implementation of the CustomMarshaller operations. The manner
in which this [sic] done shall be specified for each language mapping..."
Resolution:
Revised Text:
Actions taken:
November 12, 1998: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 2215: Object reference members, _var, and widening (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: I recently encountered an issue regarding the assignment of
Object_vars (shorthand for any object reference _var) to object
reference members. While the spec explicitly forbids implicit widening
when assigning Object_vars, it does not explicitly forbid it when
assigning object reference members.
Resolution: Clarify the text
Revised Text: Change the first sentence of the para in the middle of page 20-16 of ptc/98-09-03 from:
Implicit widening from a B_var to A_var or Object_var need not be supported.
to:
Implicit widening from a B_var to A_var or Object_var is not supported.
Add the following sentence at the end of the same paragraph:
The same rules apply for object reference types that are nested in a complex type, such as a structure or
sequence.
Actions taken:
November 16, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 2222: Is public _ptr member mandatory? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: In a number of places in the sample code for the C++ binding, the symbol
_ptr is used as a member variable in _var types. In all of these the
actual member is shown as private, so it is clear that actual
implementations could use something else.
The one exception to this is in section 20.10 on the Mapping for Struct
Types. This discusses (without sample code) the mapping for string and
object reference members of structs.
Resolution:
Revised Text:
Actions taken:
November 19, 1998: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 2226: Errors in example code for boxed struct (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: On page 82 in 98-09-03 (Nov 6 1998), the sample code for a boxed
struct is using the type "BoxedS" where "S" should be used.
Specifically, the _value() and _boxed_XXX() functions.
Resolution: Modify the sample code as indicated.
Revised Text: On page 20-82 of ptc/98-09-03 change the _value, boxed_in, _boxed_inout, and _boxed_out functions to:
const S& _value() const;
S& _value();
void _value(const S& val);
const S& _boxed_in() const;
S& _boxed_inout();
S*& _boxed_out();
Actions taken:
November 20, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 2231: _raise() should be const (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity:
Summary: Summary: The CORBA::Exception::_raise() virtual member function should have the
const qualifier. Since it effectively throws a copy of the exception,
there isn"t any reason why you shouldn"t be able to call it on a const
Exception.
Resolution: Make _raise a const member function.
Revised Text: In ptc/98-09-03, pages 20-100 through 20-103 and 20-162 through 20-163, make _raise a const member
function for classes Exception, SystemException, UserException, and UnknownUserException. Also note that this overlaps
with the modifications for resolution to 1923.
Actions taken:
December 1, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 2234: String sequence and allocbuff (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The allocbuf function allocates a vector of T elements that can be
passed to the T
*data constructor and to the replace() member function. The length of
the vector
is given by the nelems function argument. The allocbuf function
initializes each
element using its default constructor, except for strings and wide
strings, which are
initialized to null pointers, and object references, which are
initialized to suitably-typed
nil object references. A null pointer is returned if allocbuf for some
reason
cannot allocate the requested vector.
Since in the latest mapping the elements of string sequences are now
initialized as empty strings, wouldn"t it be more logical if allocbuf
would also initialize the elements of the returned string vector with
empty strings instead of null pointers?
Resolution: closed
Revised Text: Change the specification of allocbuf to initialize each element in buffers of strings to point to an empty string.
Change the specification of allocbuf to initialize each element in buffers of wide strings to point to an empty wide string.
Revised Text: Change the second-to-last sentence at the bottom of page 20-52 of ptc/98-09-03 to:
The allocbuf function initializes each element using its default constructor, except for strings and wide strings, which are
initialized to empty strings pointers, and object references, which are initialized to suitably-typed nil object references.
Actions taken:
December 1, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 2253: portable includes (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: We all know that the names of the C++ #include files generated from IDL are
not standardized, and are thus the one remaining major source portability
issue. One way to fix this would be to agree on some standard filenames,
but we"ve tried this before and have never succeeded.
Just thinking out loud here, but another way to fix it would be to agree on
some standard macro names that applications could use to portably include
the appropriate files. For example, define one macro for a client-side
include and one macro for a server-side include, both taking the basename
of the IDL file as an argument:
#ifndef CORBA_CXX_CLIENT_INCLUDE
#define CORBA_CXX_CLIENT_INCLUDE(base) <base ## Client.hh>
#endif
#ifndef CORBA_CXX_SERVER_INCLUDE
#define CORBA_CXX_SERVER_INCLUDE(base) <base ## Server.hh>
#endif
Obviously, the exact definition of the macro would depend on the names of
the generated files.
I believe these could then be used portably in the client and server source
code like this:
#include CORBA_CXX_CLIENT_INCLUDE(file)
With this approach, nobody has to change the names of the files they
currently generate.
Resolution:
Revised Text:
Actions taken:
December 14, 1998: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 2285: Value Box Mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: This may be a naive question, but it seems like the C++ mapping
for value boxes is incomplete. As far as I can tell, the specification
defines the mapping for the following types:
basic types, enum, objref, string, wstring, struct, union, sequence, array, fixed, any
But what about the types that have not been mentioned?
value, value box, TypeCode, Principal, native, except
If these types aren"t allowed, does the specification say that somewhere?
Resolution:
Revised Text:
Actions taken:
December 23, 1998: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 2286: string allocation functions -- description ambiguous (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: the text for string_alloc et al. says:
The string_alloc function dynamically allocates a string,
or returns a null pointer if it cannot perform the allocation.
[ ... ]
The string_alloc, string_dup, and string_free functions may not
throw CORBA exceptions.
I think the second sentence is a little misleading. What is meant is that
these functions cannot throw *any* exceptions at, not that they won"t throw
CORBA excecptions but are allowed to throw others, such as bad_alloc.
I suggest to change the second sentence to read:
The string_alloc, string_dup, and string_free functions may not
throw exceptions.
Resolution: Clarify the text.
Revised Text: On page 20-26 of ptc/98-09-03, change the sentence:
The string_alloc, string_dup, and string_free functions may not throw CORBA exceptions.
To read:
The string_alloc, string_dup, and string_free functions may not throw exceptions.
Actions taken:
December 24, 1998: received issue
December 24, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 2288: C++ spec uses reserved names in global namespace (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The C++ language mapping generates typecode names for global IDL type
definitions that start with an underscore. The C++ standard reserves
global symbols that start with an underscore for the compiler
implementation. We need to resolve this conflict.
Resolution: Close with no change
Revised Text: : Close with no change. We don't have evidence that the _tc_ mapping causes problems for existing
implementations. We would prefer not to make an incompatible change for something that is not definitely known to cause a
problem.
Actions taken:
December 29, 1998: received issue
March 19, 1999: closed issue
Discussion:
Issue 2306: Valuetypes as operation arguments (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The C++ mapping document (98-09-03, p. 108) states that "... the callee
shall receive a copy of each valuetype argument passed to it even if the
caller and callee are collocated in the same process."
In the collocated case, should the ORB invoke _copy_value() to produce
the copy?
Since the user could implement _copy_value() to return a nil value, it
seems unlikely that the ORB could rely on this mechanism. However, a
properly implemented _copy_value() would likely provide a significant
speed improvement over marshalling and unmarshalling.
Resolution:
Revised Text:
Actions taken:
January 18, 1999: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 2309: Memory management of recursive value (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Section 20.21, "Argument Passing Considerations," says that for valuetypes:
"The caller shall eventually invoked _remove_ref on the valuetype
instance it receives back as either an inout, out, or return value."
For memory management purposes, this is not sufficient in some cases.
Resolution:
Revised Text:
Actions taken:
January 20, 1999: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 2335: Extraction from Any by pointer (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: the mapping currently specifies that for char * and WChar *, the following
extraction operators must be defined on type Any:
class Any {
Boolean operator>>=(const Any &, char * &);
Boolean operator>>=(const Any &, WChar * &);
// ...
};
For user-defined complex types and other variable-length types, the mapping
requires:
class Any {
Boolean operator>>=(const Any &, T * &);
// ...
};
This means that a conforming ORB need not compile the following:
CORBA::Any a = ...;
const char * p;
a >>= p; // No matching operator
This is a Bad Thing (TM), in my opinion. The reason is that when I extract
something by pointer, first, the Any retains ownership and, second,
I must treat the pointed-to memory as read-only.
Resolution: fixed, issue closed
Revised Text: Change second extraction operator near the bottom of page 20-61 of ptc/98-09-03 (the one for extraction by
pointer) to read:
Boolean operator>>=(const Any&, T*&); // Deprecated
Boolean operator>>=(const Any&, const T*&);
Add a note or footnote to state that:
The non-constant version of the operator will be deprecated in a future version of the mapping and should not be
used.
Change the para in the middle of page 20-62 that currently reads
For non-primitive types, such as struct, union, sequence, exception, Any, and valuetype, extraction is done by
pointer. For example, consider the following IDL struct:
to the following:
For non-primitive types, such as struct, union, sequence, exception, and Any, extraction is done by constant
pointer (valuetypes are extracted by non-const pointer, however, because valuetype operations do not support
const.) For example, consider the following IDL struct:
Change the code examples that follows to read:
// C++
Any a;
// ... a is somehow given a value of type MyStruct ...
const MyStruct * struct_ptr;
if (a >>= struct_ptr) {
// ... use the value ...
}
Overload the constructors for to_string and to_wstring on page 20-65 for const pointers (the public members need to be
references to constant pointers) and mark the old constructors as deprecated:
struct to_string {
to_string(const char *&s, ULong b) : val(s), bound(b) {}
const char *&val;
ULong bound;
// Deprecated:
to_string(char *&s, ULong b) : val(s), bound(b) {}
};
struct to_wstring {
to_wstring(const WChar *&s, ULong b) : val(s), bound(b) {}
const WChar *&val;
ULong bound;
// Deprecated:
to_wstring(WChar *&s, ULong b) : val(s), bound(b) {}
};
Add a note to state:
The non-constant versions of the constructors will be removed in a future version of the mapping and should not
be used.
Change the code example for string extraction on page 20-66 to adjust it for extraction by constant pointer.
const char * p = "bounded";
any <<= Any::from_string(p, 8);
// ...
if (any >>= Any::to_string(p, 8)) {
// ...any contained a string<8>...
}
Actions taken:
January 22, 1999: received issue
March 19, 1999: closed issue
Discussion:
Issue 2345: "Diamond of Death" in CosLifeCycleReference (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The following MIGHT be considered an issue for CosLifeCycle and/or
CosReference.
The inheritance of CosReference::Relationship and
CosCompoundLifeCycle::Relationship by CosLifeCycleReference::Relationship
creates a "Diamond of Death" inheritance structure, in which
CosRelationships::Relationship is inherited by two distinct paths:
CosRelationships::Relationship
/ \
/ \
CosReference::Relationship CosCompoundLifeCycle::Relationship
\ /
\ /
CosLifeCycleReference::Relationship
Resolution:
Revised Text:
Actions taken:
January 26, 1999: received issue
January 27, 1999: closed issue
Discussion: :Relationship is inherited by two distinct paths:
Issue 2346: Any inserters and extractors (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: the 1.4 version of the C++ mapping has an internal inconsistency. In
sections 20.16.2 and 20.16.3, the inserters and extractors for built-in
types that don"t require a from_* or to_* helper class are shown
as non-member functions of type Any.
However, section 20.39.5 shows the the inserters and extractors as
member functions of type Any.
Section 20.39.5 is wrong and needs be updated to reflect the signatures
in 20.16.
Resolution: closed issue
Revised Text:
Actions taken:
January 27, 1999: received issue
March 19, 1999: closed isue
Discussion:
Issue 2350: boxed types for floating point values (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: In ptc/98-08-03 p.20-80:
For all the integer types, boolean, octet, char, wchar and
enumerated types, value box classes provide.
1. The phrase "integer types" should presumably read "integer types except for
fixed" in view of the separate mapping for fixed type on p. 20-85. It
is true that "integer type" can mean signed_int or unsigned_int, in
contexts such as Corba 2.3a grammar, but the phrase here seems
potentially ambigous.
2. The phrase should be extended to include floating point types
(including float, double, and long double).
Resolution: Clarify the text.
Revised Text: Change the affected sentence to:
For all the signed and unsigned integer types except for the fixed type, and for boolean, octet, char, wchar, float,
double, long double, and enumerated types, and for typedefs of all of these, value box classes provide:
Actions taken:
January 28, 1999: received issue
March 19, 1999: closed issue
Discussion:
Issue 2351: CORBA2.3 C++ mapping for the TypeCode class (section 20.31.2) (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Issue: The CORBA2.3 C++ mapping for the TypeCode class
(section 20.31.2) has not been updated.
Suggested Resolution: Add get_compact_typecode() and valuetype/
valuebox operations. Also, remove the param_count and parameter
methods which were deprecated in CORBA2.2 and eliminated in
CORBA2.3.
Resolution: This issue has already been resolved.
Revised Text:
Actions taken:
January 28, 1999: received issue
March 19, 1999: closed issue
Discussion:
Issue 2354: CustomMarshal mapping type (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: ptc/98-09-03, p. 20-96: In "The C++ mappings for the IDL
CORBA::CustomerMarshal..." change Customer to Custom.
Resolution: Fix the typo.
Revised Text: Change the first sentence on page 20-96 of ptc/98-09-03 to:
The C++ mappings for the IDL CORBA::CustomerMarshal, CORBA::DataOutputStream, and
CORBA::DataInputStream types follow normal C++ valuetype mapping rules.
Actions taken:
January 29, 1999: received issue
March 19, 1999: closed issue
Discussion: received issue
Issue 2355: ORB mapping re Policy (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: 1. ORB pidl on 20-130 of ptc/98-09-03 is missing the create_policy
pseudo-operation.
2. Sometimes I think the traditional style of PIDL mapping used for the Java,
C++, and draft Lisp mappings, wherein each PIDL pseudo-operation is
explicitly listed in each mapping, is risky - insofar as version
mismatches between the Core Pseudo-IDL and the pseudo-IDL used in the
mapping document can and frequently do arise.
Resolution: Add the missing operation.
Revised Text: To the ORB interface in 20.33.1, page 20-130, of ptc/98-09-03, add the following operation:
Policy create_policy(in PolicyType type, in any val)
raises(PolicyError);
To the ORB class in 20.33.2, page 20-130, add the following member function:
Policy_ptr create_policy(PolicyType type, const Any& val)
throw(SystemException, PolicyError);
Actions taken:
January 29, 1999: received issue
March 19, 1999: closed issue
Discussion:
Issue 2357: Misleading text for DSI invoke() and _primary_interface() (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Section 20.38.3 of the CORBA 2.3 draft states:
I believe that the intent of this paragraph is to forbid the user from
calling invoke() and _primary_interface() directly, not to forbid the
POA from calling _primary_interface() in circumstances other than
processing a request.
The paragraph should be reworded to say:
"The invoke() and _primary_interface() methods will be called by the
POA, and should never be explicitly called by the application."
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
January 29, 1999: received issue
June 13, 2000: closed issue
Discussion:
Issue 2375: Transfer of C++ codes (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity: Minor
Summary: Summary: During my study of the specification CORBA 2.2, I tried to transfer C++ codes on pages 20-12, 20-13 and 20-11 to the C++ source, add some dummy declarations and definitions of such classes as Object and tried to compile it. I obtained error message from the definition of the constructor A_out::A_out(A_var& p) : ptr_(p.ptr_) ... due to unauthorized access to protected member A_var::ptr_. This was no conceptual problem to introduce access function A_var::ptr() in similar manner like has been introduces function A_out::ptr() and correct the problem, another way is definition of some classes as friend ... . But my reliance to document containing such mistakes was lost. Please, can you pay more attention to testing and preparing of the concluding documents?
Resolution: Closed without change
Revised Text: Closed without change. The code compiles correctly; moreover, it is not intended to be a tutorial on C++
software development, nor is it meant as a normative implementation.
Actions taken:
February 2, 1999: received issue
February 5, 1999: moved from orb_revision to cxx_revision
March 19, 1999: closed issue
Discussion:
Issue 2376: Interface issue (cxx_revision)
Click here for this issue's archive.
Nature: Revision
Severity: Minor
Summary: Summary: The interface between application programmer and CORBA components (BOA, stubs, skeletons etc.) should be as simple as possible (but, naturally, not more simple). I am afraid, that introduction of the new classes to C++ mapping like A_out is not the best way to simplify their life to the creators of the final applications - the application programmers. It is naturally, when creator of the CORBA implementation use very advanced and sophisticated constructions of the programming language, but let he/she left application creators their invention to study application problems, not those advanced features of the programming environment. How many application programmers understand well such construction like "reference to pointer"?
Naturally, if the new constructions would bring some new principal features to the problem, they may be accepted, but I am afraid, that the only reason of the A_out class is to ensure freeing of memory occupied by the old data of the corresponding variables. But the same service may be done by the first statement of the (generated) stub.
Resolution: Close no change. This change is too intrusive and would break too much existing code.
Revised Text: Close without change. The addition of the _out types at CORBA 2.2 already caused much churn for C++
developers, and changing things back now would just cause code to needlessly break again.
Actions taken:
February 2, 1999: received issue
February 5, 1999: moved from orb_revision to cxx_revision
March 19, 1999: closed issue
Discussion:
Issue 2441: tie doesn"t do ref counting (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: After all the recently past work getting servant reference counting, it
just occurred to me that this doesn"t work with TIE. Or am I missing
something?
As things stand, to make it work it is necessary to derive a new class
from both the instantiated tie template and RefCountServantBase. This
then requires all the constructors to be redefined - ugh!
Resolution: See resolution for issue 4114, which addresses this issue as well.
Revised Text:
Actions taken:
February 5, 1999: received issue
February 5, 1999: changed from orb-revision to cxx_revision
May 13, 2002: closed issue
Discussion:
Issue 2443: C++ keyword mapping ambiguous (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The last para of section 20.1.2 says:
To avoid C++ compilation problems, every use in OMG IDL of a
C++ keyword as an identifier is mapped into the same name preceded
by the prefix "_cxx_". For example, an IDL interface named
"try" would be named "_cxx_try" when its name is mapped into C++.
This is ambiguous because it doesn"t make it clear what the names of types
derived from that interface shold be.
Resolution: Clarify the text.
Revised Text: Change the para (page 20-13) that now reads:
To avoid C++ compilation problems, every use in OMG IDL of a C++ keyword as an identifier is mapped into
the same name preceded by the prefix "_cxx_". For example, an IDL interface named "try" would be named
"_cxx_try" when its name is mapped into C++. The complete list of C++ keywords from the 2 December 1996
Working Paper of the ANSI/ISO C++ standardization committees (X3J16, WG21) can be found in the "C++
Keywords" appendix.
To read:
To avoid C++ compilation problems, every use in OMG IDL of a C++ keyword as an identifier is mapped into
the same name preceded by the prefix "_cxx_". For example, an IDL interface named "try" would be named
"_cxx_try" when its name is mapped into C++. For consistency, this also rule applies to identifiers that are derived
from IDL identifiers; for example, an IDL interface "try" generates the names "_cxx_try_var" and "_cxx_try_ptr",
that is, the IDL compiler behaves as if the interface were name "_cxx_try" and then applies the normal mapping
rules.
The complete list of C++ keywords from the 2 December 1996 Working Paper of the ANSI/ISO C++
standardization committees (X3J16, WG21) can be found in the "C++ Keywords" appendix.
Actions taken:
February 8, 1999: received issue
March 19, 1999: closed issue
Discussion:
Issue 2445: add a _var type for each servant type (cxx_revision)
Click here for this issue's archive.
Nature: Enhancement
Severity: Minor
Summary: Summary: full_desc: The C++ mapping for CORBA 2.3 introduces reference
counting on servants and provides the
PortableServer::ServantBase_var class for automated
reference counting. However, this class can not be
used if a more specific type of the servant is needed.
Proposal: add a _var type for each servant type, for
example POA_FooBar_var.
Resolution: see below
Revised Text: See also the resolution for issue 4210; the two issues affect the same section
of text.
Add the following as the last sentence to the first para of section
“ServantBase_var Class”:
Class ServantBase_var is a type definition of the Servant_var template for
type ServantBase: // C++
namespace PortableServer {
class ServantBase { /* ... */ };
typedef Servant_var<ServantBase> ServantBase_var;
}
The definition of the Servant_var template is as follows:
namespace PortableServer
{
template<typename Servant>
class Servant_var {
protected:
void swap(Servant* lhs, Servant* rhs)
{
Servant *tmp = lhs;
lhs = rhs;
rhs = tmp;
}
public:
Servant_var() : _ptr(0) {}
Servant_var(Servant* p) : _ptr(p) {}
Servant_var(const Servant_var& b)
: _ptr(b._ptr)
{
if (_ptr != 0) _ptr->_add_ref();
}
~Servant_var()
{
if (_ptr != 0) {
try {
_ptr->_remove_ref();
} catch (...) {
// swallow exceptions
}
}
}
Servant_var& operator=(Servant* p)
{
if (_ptr != p) {
Servant_var<Servant> tmp = p;
swap(_ptr, p);
}
return *this;
}
Servant_var&
operator=(const Servant_var& b)
{
if (_ptr != b._ptr) {
Servant_var<Servant> tmp = b;
swap(_ptr, b._ptr);
}
return *this; }
Servant* operator->() const { return _ptr; }
Servant* in() const { return _ptr; }
Servant*& inout() { return _ptr; }
Servant*& out()
{
if (_ptr != 0) {
Servant_var<Servant> tmp;
swap(_ptr, tmp._ptr);
}
return _ptr;
}
Servant* _retn()
{
Servant* retval = _ptr;
_ptr =0;
return retval;
}
private:
Servant* _ptr;
};
typedef Servant_var<ServantBase> ServantBase_var;
}
Insert the following text immediately preceding the end of the Servant_var
section:
The Servant_var template can be used to write exception-safe and type-safe
code for heap-allocated servants. For example:
{
Servant_var<Foo_impl> foo_servant = new Foo_impl;
foo_servant->do_something();
// might throw...
some_poa->activate_object_with_id(...);
return foo_servant->this;
}
Actions taken:
February 9, 1999: received issue
May 13, 2002: closed issue
Discussion:
Issue 2453: Any inserters for strings need to use const pointers (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The inserter helper functions for string and wstring on type Any should
have const pointers as the constructor parameter, otherwise I can"t
insert string literals with an ANSI C++ compiler.
Resolution: Make the suggested fixes.
Revised Text: Modify the from_string and from_wstring insertion helper types shown on page 20-64 and 20-159 of
ptc/98-09-03 as follows:
struct from_string {
from_string(char* s, ULong b,
Boolean n = FALSE) :
val(s), bound(b), nocopy(n) {}
from_string(const char* s, ULong b) :
val(const_cast<char *>(s)), bound(b), nocopy(0) {}
char *val;
ULong bound;
Boolean nocopy;
};
struct from_wstring {
from_wstring(WChar* s, ULong b,
Boolean n = FALSE) :
val(s), bound(b), nocopy(n) {}
from_wstring(const WChar* s, ULong b) :
val(const_cast<WChar *>(s)), bound(b), nocopy(0) {}
WChar *val;
ULong bound;
Boolean nocopy;
};
Actions taken:
February 16, 1999: received issue
March 19, 1999: closed issue
Discussion:
Issue 2463: Incorrect types for type-safe Any extraction (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The first bullet point at the bottom of page 20-61 is incorrect. It
states that Boolean, Char, and Octet can be extracted using >>=. However,
on page 20-66, the mapping requires a compile-time error for attempts
to extract these types with >>=.
Proposal:
Delete Boolean, Char, and Octet from teh list of types at
the bottom of page 20-61.
Resolution:
Revised Text:
Actions taken:
February 22, 1999: received issue
February 22, 1999: closed issue
Discussion:
Issue 2489: 20.17.9 Valuetype Inheritance (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: For an IDL valuetype derived from other valuetypes or that supports
interface types, several C++ inheritance scenarios are possible:
...
* Interface classes supported by the IDL valuetype are not inherited. Instead,
the operations on the interface (and base interfaces, if any) are mapped to
pure virtual functions in the generated C++ base value class. In addition to
this abstract base value class and the OBV_ class, the IDL compiler generates
a POA skeleton for this value type; the name of this skeleton is formed by
prepending the string "POA_" to the fully-scoped name of the valuetype. The
base value class and the POA skeleton of the interface type are public virtual
base classes of this skeleton.
Consider this example:
// IDL
interface I {};
abstract valuetype A supports I {};
valuetype B : A {};
Is a POA skeleton generated for A? Is one generated for B?
Resolution:
Revised Text:
Actions taken:
February 25, 1999: received issue
Discussion:
Issue 2496: generate concrete classes and factories for valuetypes without initializer (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Suggestion: generate concrete classes and factories
for valuetypes that do not have any initializers. If a
value type does not have any initializers, it should
be safe to use the default constructor for all members.
This would reduce the size of the code that needs
to be written by the application programmer.
Similarly, concrete factories could be generated for
value boxes
Resolution: resolved/closed
Revised Text: 1.Change the semantics of the generated OBV_ classes for valuetypes that have no operations so that the OBV_ class can
be used directly by the programmer. This allows the OBV_ class for valuetypes like this:
valuetype Pair {
string name;
any value;
};
to be used in an application without creating an extra redundant derived class that adds no behavior.
Change the paragraph in 1.17.2 that reads: (fixing an editorial error as well)
For the same reasons, a C++ OBV_ class defines a protected default constructor, a protected constructor
that takes an initializer for each valuetype data member, and a protected default constructor. The
parameters of the constructor that takes an initializer for each member appear in the same order as the data
members appear, top to bottom, in the IDL valuetype definition, regardless of whether they are public or
private. All parameters for the member initializer constructor follow the C++ mapping parameter passing
rules for in arguments of their respective types.
to:
For the same reasons, a C++ OBV_ class for a valuetype that has operations defines a protected default
constructor, a protected constructor that takes an initializer for each valuetype data member, and a
protected default destructor. The parameters of the constructor that takes an initializer for each member
appear in the same order as the data members appear, top to bottom, in the IDL valuetype definition,
regardless of whether they are public or private. All parameters for the member initializer constructor follow
the C++ mapping parameter passing rules for in arguments of their respective types. For valuetypes that
have no operations other than factory initializers, the same constructors and destructors are generated, but
with public access so that they can be directly instantiated by application code.
2.Change the semantics of the generated type-specific ValueFactory class for valuetypes that have no operations or
factory initializers to be concrete, so an application can use it directly rather than having to derive from it.
Change the last paragraph of 1.17.10.3 from:
For valuetypes that have no initializers, there are no type-specific abstract factory classes, but applications
must still supply concrete factory classes. These classes, which are derived directly from
ValueFactoryBase, need not supply _downcast functions, and only need to override the
create_for_unmarshal function.
to:
For valuetypes that have no operations or initializers, a concrete type-specific factory class is generated
whose implementation of the create_for_unmarshal function simply constructs an instance of the OBV_
class for the valuetype using new and the default constructor. For valuetypes that have operations, but no
initializers, there are no type-specific abstract factory classes, but applications must still supply concrete
factory classes. These classes, which are derived directly from ValueFactoryBase, need not supply
_downcast functions, and only need to override the create_for_unmarshal function."
Actions taken:
March 1, 1999: received issue
March 16, 2000: closed issue
Discussion:
Issue 2497: Value boxes and sensible value issue (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Value Boxes inherit from CORBA::ValueBase and
must therefore implement get_value_def(), but
cannot return a sensible value.
Resolution:
Revised Text:
Actions taken:
March 1, 1999: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 2498: narrow abstract interface class to concrete object? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Should it be possible to narrow an abstract interface
class to a concrete Object, or to downcast it to a
Valuetype?
Resolution: closed/resolved
Revised Text: In section 1.18.1 of formal/99-07-41, add the following operations to AbstractBase:
class AbstractBase {
...
public:
...
Object_ptr _to_object();
ValueBase * _to_value();
...
};
and the following paragraph:
If the concrete type of an abstract interface instance is a normal object reference, the _to_object() function returns
a reference to that object, otherwise it returns a nil reference. If the concrete type is a valuetype, _to_value()
returns a pointer to that valuetype, otherwise it returns a null pointer. The caller of _to_object() or _to_value() is
responsible for properly releasing the returned reference or pointer.
Actions taken:
March 1, 1999: received issue
June 13, 2000: closed issue
Discussion:
Issue 2499: Add AbstractBase base type to IDL language? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Does it make sense to add the AbstractBase base
type to the IDL language, so that operations could
receive an AbstractBase parameter?
Resolution: close with no change
Revised Text:
Actions taken:
March 1, 1999: received issue
June 13, 2000: closed issue
Discussion: Close no change. AbstractBase is already defined in IDL as a native type. Some disagree with this definition, and it may change
in the future, but nevertheless it is workable for now.
Issue 2523: Valuetype argument passing (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The passing of valuetypes as parameter to operations needs more
consideration. Section 20.22 of ptc/98-09-03 (98/11/06) specifies
that the callee should receive a deep-copy of each valuetype to
preserve location transparently.
Now, does this apply only to operations of interfaces, or also to
valuetype operations? With the current phrasing, this applies just
the same (meaning that valuetype operations also receive a deep-
copy). And then there are abstract interfaces, which may incarnate
a remote interface or a local valuetype.
Resolution: Close no change. The specification is already clear about valuetype argument passing semantics.
Revised Text:
Actions taken:
March 9, 1999: received issue
June 13, 2000: closed issue
Discussion:
Issue 2525: string sequences and empty strings (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: For string sequences, new string elements, that are created when the
sequence length is increased, should be initialized to the empty string.
I therefore raise this herewith as an official issue.
I also don"t think it makes sense to vote on issue 2234 before we
decided on the issue above. As I already pointed out, I raised issue
2234 in the believe that the spec already says that new string sequence
elements are initialized as empty string. But this assumption was wrong.
Resolution: closed and fixed
Revised Text: Modify the specification to require string elements and wide string elements of sequences to be initialized to the
empty string when the sequence length is increased.
Revised Text: On page 20-48 of ptc/98-09-03, add the following paragraph after the second paragraph:
The length() functions can be used to access and modify the length of the sequence. Increasing the length of a
sequence adds new elements at the tail. The newly-added elements behave as if they are default-constructed
when the sequence length is increased. However, a sequence implementation may delay actual default
construction until a newly-added element is first accessed. For sequences of strings and wide strings, default
element construction requires initialization of each element to the empty string or wide string. For sequences of
object references, default element construction requires initialization of each element to a suitably-typed nil
reference. For sequences of valuetypes, default element construction requires initialization of each element to a null
pointer. The elements of sequences of other complex types, such as structs and sequences, are initialized by their
default constructors. Union sequences elements do not have any application-visible initialization; in particular, a
default-constructed union element is not safe for marshaling or access. Sequence elements of a basic type, such as
ULong, have undefined default values.
Actions taken:
March 10, 1999: received issue
March 19, 1999: closed issue
Discussion:
Issue 2530: Sequences and get_buffer() (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: This is a new issue for the C++ RTF.
The mapping for sequences mandates a get_buffer() accessor for read/write
access to the members of the sequence. It is mentioned that an implemen-
tation is not required to store sequence elements in continuous memory
for efficiency reasons, but may choose to do so only when get_buffer()
is called.
However, this introduces coherency problems if sequence elements are
accessed and modified using both get_buffer() and operator[].
get_buffer() is not possible for recursive sequences anyway.
Resolution: Close no change. The submitter of the issue misread the specification.
Revised Text:
Actions taken:
March 12, 1999: received issue
June 13, 2000: closed issue
Discussion:
Issue 2560: Factories for StringValue and WStringValue (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The C++ mapping for Objects by Value requires factories for marshalling
valuetypes. Therefore, it needs to specify default factories for the
standard StringValue and WStringValue types.
Resolution: Close no change. Valueboxes do not have factories.
Revised Text:
Actions taken:
March 30, 1999: received issue
June 13, 2000: closed issue
Discussion:
Issue 2561: Valuetypes and arbitrary graphs (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Valuetypes can be used to form arbitrary, potentially circular graphs.
This means that reference counts may never drop to zero and that more
advanced garbage collection is required, which does not come natural to
C++.
An ORB may keep track of circularity by traversing a graph and can detect
if the last outside reference is lost. However, the overhead is significant,
and the solution would be incomplete, as users need not use "proper" refe-
rence counting on graph nodes by ignoring both OBV_* classes and default
reference counting.
Possible solution: restrict CORBA::DefaultValueRefCountBase to
non-circular graphs. Users can decide much better when a graph is safe
to be cleaned up.
Resolution: Close as duplicate of 2309.
Revised Text:
Actions taken:
March 30, 1999: received issue
June 13, 2000: closed issue
Discussion:
Issue 2564: Valuetypes and _out classes in C++ mapping (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: I"m trying to work out how valuetypes interact with My question is what should the two reference counts be, and why?
>From my understanding, myVal"s reference count should be 1, and myPtr"s
reference count should be 0.
Is this correct? Perhaps an example _out type for valuetypes should be
included in the spec to clear this up for future reference.
Resolution: Close no change. The submitter of the issue misunderstood _var semantics.
Revised Text:
Actions taken:
March 31, 1999: received issue
March 31, 1999: moved from core to cxx_revision
June 13, 2000: closed issue
Discussion:
Issue 2614: Setting the TypeCode of an Any without setting a value (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: Consider the following IDL:
----------------------------------------------------------------------
// IDL
typedef long MyArray[1000000];
interface I
{
void set_array(in MyArray array);
};
----------------------------------------------------------------------
Now let"s assume that I want to implement this using the DSI:
----------------------------------------------------------------------
// C++
void
I_impl::invoke(ServerRequest_ptr request) throw()
{
String_var name = request -> op_name();
if(strcmp(name, "set_array") == 0)
{
NVList_ptr list;
orb -> create_list(0, list);
Any* any = list -> add(ARG_IN) -> value();
XXX
request -> params(list);
MyArray_forany arg;
*any >>= arg;
... // Do something with arg;
return;
}
else
{
NVList_ptr list;
orb -> create_list(0, list);
request -> params(list);
Any* any = new Any;
*any <<= new BAD_OPERATION();
request -> exception(any);
}
}
----------------------------------------------------------------------
At the line I marked with XXX, I have to set the TypeCode of the
Any.
Resolution:
Revised Text:
Actions taken:
April 20, 1999: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 2619: operator>> for String_var (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The C++ mapping says:
A compliant mapping implementation shall provide overloaded operator<<
(insertion) and operator>> (extraction) operators for using String_var
and
String_out directly with C++ iostreams.
>From this definition it"s no clear whether operator>> allocates memory
or not. That is, is the following code correct?
CORBA::String_var str;
cin >> str;
Resolution: closed/resolved
Revised Text: Add the following to the last sentence in Section 1.7 of formal/99-07-41:
The operator>> extraction operator has the same semantics as the underlying standard C++ operator>> for
extracting strings from an input stream (extracting until whitespace or end of file). Space to store the extracted
characters are allocated by calling string_alloc, and the previous contents of the String_var are released by calling
string_free.
Add the following to the last sentence in Section 1.8:
The operator>> extraction operator has the same semantics as the underlying standard C++ operator>> for
extracting wide strings from an input stream (extracting until whitespace or end of file). Space to store the
extracted characters are allocated by calling wstring_alloc, and the previous contents of the WString_var are
released by calling wstring_free.
Actions taken:
April 21, 1999: received issue
June 13, 2000: closed issue
Discussion:
Issue 2640: IDL that is not IDL! (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The C++ language mapping chapter contains many blocks of IDL like stuff
with the comment
// IDL
in the first line, but the stuff in the block is not valid IDL for
various reasons:
(i) Uses "pseudo" as an apparent keyword.
(ii) Contains declarations like
attribute exception exception;
I suggest that the comment "// IDL" be replaced by "// Augmented IDL
(see "Usage" on page x-y)" cross-referencing to section 20.23 Usage, so
that people know for sure that this is not IDL.
Furthermore, to make the claim in section 20.23 true, the declaration:
attribute exception exception;
should be fixed to be something else, or alternatively, the exceptional
use of exception should be called out as a specific augmentation of IDL
in section 20.23.
Resolution:
Revised Text:
Actions taken:
May 6, 1999: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 2841: Two obvious typos in the C++ mapping for OBV (docs/formal/99-07-41.pdf) (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: - The factories" names in the example IDL on page 1-88 are incomplete
- Page 1-90: should be CORBA::CustomMarshal rather than
CORBA::CustomerMarshal. Nice freudian slip. Might it be that the OBV
mapping was done by marketeers rather than technicians?
Resolution: Close as duplicate of 2354.
Revised Text:
Actions taken:
August 15, 1999: received issue
August 15, 1999: received issue
June 13, 2000: closed issue
Discussion:
Issue 2875: ValueBase::_copy_value clarification (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: The ValueBase::_copy_value() function is included in the discussion
of the "reference counting interface" in section 1.17.5 of 99-07-41.
Later, the description of the reference counting mix-in classes
says:
"Each of these classes shall be fully concrete and shall completely
fulfill the ValueBase reference counting interface..."
However, I do not believe that the intent was to require the mix-in
classes to implement _copy_value().
Therefore I suggest one of two clarifications:
1) Move the discussion of _copy_value() out of the reference-counting
section, or
2) Specify which functions the mix-in classes are actually expected to
implement, e.g.,
"Each of these classes shall be fully concrete and shall completely
fulfill the ValueBase reference counting interface (_add_ref,
_remove_ref, and _refcount_value), ..."
Resolution:
Revised Text:
Actions taken:
September 9, 1999: received issue
Discussion: deferred in June 2011 to the next RTF
Issue 2880: Union string member mapping defect? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary:
The mapping for string members has modifier functions for "char *",
"const char *", and "String_var". Shouldn"t there also be a modifier
function that takes the unnamed struct string member and array string
member types?
Resolution: closed/resolved
Revised Text: Change the paragraph in 1.12 of formal/99-07-41 that reads:
For string union members, the char* modifier results in the freeing of old storage before ownership of the pointer
parameter is assumed, while the const char* modifier and the String_var modifier both result in the freeing of old
storage before the parameter's storage is copied. The accessor for a string member returns a const char* to allow
examination but not modification of the string storage.
to:
For string union members, the char* modifier results in the freeing of old storage before ownership of the pointer
parameter is assumed, while the const char* modifier and the String_var modifier both result in the freeing of old
storage before the parameter's storage is copied. The accessor for a string member returns a const char* to allow
examination but not modification of the string storage. The union will also provide modifier functions that take the
unnamed string struct member, array member and sequence member types as a parameter, with the same
semantics as the String_var modifier.
Actions taken:
September 4, 1999: received issue
June 13, 2000: closed issue
Discussion:
Issue 2887: Contents of string members (01) (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: 1. What is the contents of a string member of a struct, sequence, array
or exception after out() or _retn() has been called? Is it a null
pointer, or an empty string?
I think that for best consistency, it should be an empty string, which
is the same state after default construction.
Resolution: closed/resolved
Revised Text: Add the following to the end of the first paragraph of section 1.7 of formal/99-07-41:
Calling the out() or _retn() functions of a String_var has the side effect of setting its internal pointer back to null.
An application may also explicitly assign a null pointer to the String_var.
Actions taken:
September 14, 1999: received issue
June 13, 2000: closed issue
Discussion:
Issue 2888: Contents of string members (02) (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: 2. Should it be legal to assign a null pointer to a string member of a
struct, sequence, array or exception?
Resolution: closed/resolved
Revised Text: Add the following to the end of the first paragraph of section 1.7 of formal/99-07-41:
Calling the out() or _retn() functions of a String_var has the side effect of setting its internal pointer back to null.
An application may also explicitly assign a null pointer to the String_var.
Actions taken:
September 14, 1999: received issue
June 13, 2000: closed issue
Discussion:
Issue 2890: String extractor semantics undefined? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: CORBA 2.3 added the requirement (1.7 & 1.8) that string extractor
operators be defined for String_var & string member classes, for
example:
std::istream& operator >>(std::istream &, CORBA::String_var &);
However, the semantics of the extractor operations is undefined. Does
the extractor operator extract characters until the first whitespace?
until a newline? until the default width of the stream? until eof?
The same applies to wide strings.
Resolution: closed/resolved
Revised Text: Add the following to the last sentence in Section 1.7 of formal/99-07-41:
The operator>> extraction operator has the same semantics as the underlying standard C++ operator>> for
extracting strings from an input stream (extracting until whitespace or end of file). Space to store the extracted
characters are allocated by calling string_alloc, and the previous contents of the String_var are released by calling
string_free.
Add the following to the last sentence in Section 1.8:
The operator>> extraction operator has the same semantics as the underlying standard C++ operator>> for
extracting wide strings from an input stream (extracting until whitespace or end of file). Space to store the
extracted characters are allocated by calling wstring_alloc, and the previous contents of the WString_var are
released by calling wstring_free.
Actions taken:
September 14, 1999: received issue
June 13, 2000: closed issue
Discussion:
Issue 2895: Exception::_raise() should be const? (cxx_revision)
Click here for this issue's archive.
Nature: Uncategorized Issue
Severity:
Summary: Summary: There is no reason that the _raise() function for CORBA::Exception
should not be const. We should change it"s signature to:
class Exception {
public:
...
void _raise() const = 0;
...
};
Resolution: Close no change. This issue is already addressed in the CORBA 2.3 specification.
Revised Text:
Actions taken:
September 20, 1999: received issue
June 13, 2000: closed issue
Discussion:
Issue 2897: Exception constructors should be protected (cxx_revision)
Click here for this issue's archive.
Source: Floorboard Software (Mr. Jonathan Biggar, jon(at)floorboard.com)
Nature: Uncategorized Issue
Severity:
Summary:
The constructors for CORBA::Exception, CORBA::SystemException and CORBA::UserException should be protected, not public, since there is no reason for a direct instance of these classes ever to be instantiated.
Some of the unary operators for the Fixed class have the wrong return type:
Sections 1.32.2 and 1.41.20 have TypeCode::type_modifier() returning a ValuetypeModifier. It should be ValueModifier instead. --
Issue 1776 was supposed to change all T_out classes so that their copy constructor and assignment operators took a "const T_out &". The _out class in 1.3.6 didn't get updated with this change.
The code example has a "ServantBaseBase_var".
The CORBA 2.3 C++ spec says (1.11):
"The Fixed(char*) constructor converts a string representation of a
fixed-point literal into a real fixed-point value, with the trailing 'd'
or 'D' optional."
However, the CORBA 2.3 spec for a fixed point literal says (3.2.5.5):
"A fixed-point decimal literal consists of an integer part, a decimal
point, a fraction part and a d or D. The integer and fraction parts both
consist of a sequence of decimal (base 10) digits. Either the integer
part or the fraction part (but not both) may be missing; the decimal
point (but not the letter d (or D)) may be missing."
This means that the following call is illegal:
CORBA::Fixed f("-1.0");
Even though this can be rewritten (legally) as:
CORBA::Fixed f(-CORBA::Fixed("1.0"));
I think it would be a good idea change the definition of the constructor
to also allow an optional sign (+ or -).
The Fixed::round() and Fixed::truncate() functions do not mention what to do if their scale argument is larger than the current scale. I figure they shouldn't do anything -- for example, "truncating" by making something have more digits doesn't seem to make sense. I propose adding the sentence below after the sentence reading "The round and truncate functions convert a fixed value to a new value with the specified scale." (page 23-32 of ptc/99-03-04): If the new scale is equal to or larger than the new scale, no rounding or truncation is performed and the result is equal to the target object.
Minor editorial issue:
In Section 1.9.2, "T_out Types":
class T_out {
public:
//...
T_out(const T_out& p) : ptr_(p.ptr_) {}
T_out& operator=(const T_out& p) { ... }
};
In Section 1.7, "Mapping for String Types":
class String_out {
public:
// ...
String_out(String_out& s) : ptr_(s.ptr_) {}
String_out& operator=(String_out& s) { ... }
};
Note the missing "const" in 1.7. I suspect String_out should do the
same as T_out and pass const references.
The CORBA 2.3 spec needs to make it clear that for dynamic implementations, invocations of the standard object operations (get_interface, is_a, non_existent) call the virtual functions defined in PortableServer::ServantBase, and do not call PortableServer::DynamicImplementation::invoke().
In formal/99-07-41 section 1.28 "NamedValue" it says "NamedValue is used only as an element of NVList, especially in the DII." but this is not correct. Note the remark in section 1.33.3 "Differences from C-PIDL" which describes other uses: "Added create_named_value, which is required for creating NamedValue objects to be used as return value parameters for the Object::create_request operation."
what should _default_POA() return if no default ORB exists in the server (that is, ORB_init() with an empty ORB ID was never called)?
deferred in June 2011 to the next RTF
In the CORBA 2.3 spec, section 6.2, CORBA::AbstractBase is defined as:
module CORBA {
native AbstractBase;
};
This implies that the C++ mapping for AbstractBase when used as a
parameter is like this:
class DataOutputStream { // from CORBA 2.3, section 5.5.2
void write_Abstract(AbstractBase value);
};
But section 1.18.1 of the CORBA 2.3 C++ mapping makes it clear that the
signature should be:
class DataOutputStream { //
void write_Abstract(AbstractBase_ptr value);
};
Now I know that DataInputStream & DataOutputStream can be special cased
to handle this, but if we need to add additional operations that use
AbstractBase in the future, it would be nice if this could be fixed to
behave consistently with the other native type mappings to C++.
deferred in June 2011 to the next RTF
1. The resolution that we seemed to be converging on for issue 674
allows programmers to inherit servant implementations like this:
// IDL
interface A {
};
interface B : A {
};
// C++
class MyA : public virtual POA_A {
};
class MyB : public virtual POA_B, public virtual MyA {
};
However, this paradigm breaks when using abstract interfaces:
// IDL
abstract interface A {
};
interface B : A {
};
since the spec does not require a POA skeleton be generated for A.
I think we should change the spec to state that POA skeletons for
abstract interfaces are generated, but that these skeletons do not
inherit from ServantBase, and do not contain a _this() member function.
This will allow inheritence of implementations, even for abstract
interfaces.
I considered just having POA_B just inherit directly from the abstract
class A, but that would allow POA_B skeletons to be widened implicitly
to an abstract interface pointer (for implementations which define A_ptr
as A *), and that seems to be too trouble prone. If someone can think
of a way to do this and prevent implicit widening, then this would be
better, since it would even allow sharing of implementation between a
servant and a valutype that both inherit from the same abstract
interface.
2. I do not understand this bullet in section 1.18.2: "o Inserting an abstract interface reference into a CORBA::Any operates polymorphically; either the object reference or valuetype to which the abstract interface reference refers is what actually gets inserted into the Any. Because abstract interfaces cannot actually be inserted into an Any, there is no need for abstract interface extraction operators, either. The CORBA::Any::to_abstract_base type allows the contents of an Any to be extracted as an AbstractBase if the entity stored in the Any is an object reference type or a valuetype directly or indirectly derived from the AbstractBase base class. See Section 1.16.6, Widening to Abstract Interface, on page 1-62 for details." This seems to make no sense. It seems to state that the actual reference or valuetype is inserted into the Any, which means that the TCKind associated with the any will be tk_objref or tk_value, not tk_abstract_interface. This seems to have particularly bad implications with the DII & DSI. How does the DII know to encode an abstract interface correctly in CDR if the Any it receives doesn't have a tk_abstract_interface TypeCode? It also means that an application which only knows the abstract interface type must handle the case where the Any has a tk_objref or tk_value instead, use Any::to_abstract_interface and then a narrow call to get the abstract interface pointer it needs. This seems needlessly complex and unnecessary. This bullet should be replaced with one that just states that abstract interfaces have inserters and extractors generated for them just like normal interfaces.
"Both interfaces that are derived from one or more abstract interfaces,
and valuetypes that support one or more abstract interfaces support
implicit widening to the _ptr type for each abstract interface base
class. Specifically, the T* for valuetype T and the T_ptr type for
interface type T support implicit widening to the Base_ptr type for
abstract interface type Base. The only exception to this rule is for
valuetypes that directly or indirectly support one or more regular
interface types (see Section 1.17.9, Valuetype Inheritance, on page
1-83). In these cases, it is the object reference for the valuetype, not
the pointer to the valuetype, that supports widening to the abstract
interface base."
This seems to prohibit widening from a valuetype pointer to an abstract
interface _ptr if the valuetype happens to support a normal interface.
I don't understand the restriction. This seems to prohibit the
programmer making a choice of using value or reference semantics in the
case of diamond inheritence of an abstract interface:
// IDL
abstract interface A {
};
interface I : A {
};
valuetype V1 : supports A {
};
valuetype V2 : supports I {
};
This means that I must always pass V2 valuetypes by reference to
operations expecting an A, and cannot choose to pass V2 valuetypes by
value instead. Why was this restriction added and what would be the
problem with relaxing it in this case?4. Is there any merit in adding narrow operations to AbstractBase that would allow the programmer to narrow to ValueBase or Object_ptr?
Given that we have Any::to_object and Any::to_abstract_base, shouldn't there be an Any::to_value_base as well?
the spec currently is extremely vague about how _var types for fixed-length underlying types are supposed to work. The only words are: The T_var types are also produced for fixed-length structured types for reasons of consistency. These types have the same semantics as T_var types for variable-length types. This allows applications to be coded in terms of T_var types regardless of whether the underlying types are fixed- or variable-length. This has long been a source of confusion to me. In particular, it doesn't answer questions such as - Can a _var for a fixed-length type be initialized with a pointer to the fixed-length type? If so, does the _var adopt it? - Can a _var for fixed-length type be initialized with a value? - What does assignment between _vars for fixed-length types do? - Does the _var for a fixed-length type work like a reference and remain bound to the same block of memory? - What does default-initialization of such a _var do? - etc, etc.
currently it is not possible to pull an exception out of an Any generically, that is, I cannot write: const CORBA::SystemException * sep; CORBA::Any a; // assume a contains a system exception... a >>= sep; Normally, I won't need this. However, it's come up as part of portable interceptors. For example, I might want to write an interceptor that logs things, including system exceptions. Now, if I have a system exception in an Any, the only way to get it out is to successively try to extract every possible system exception until I find one that works. That's rather tedious. It would be nicer if I could extract a base pointer to the actual exception, so I can print the minor number and completion status. I would like to suggest adding the following extraction operator: Boolean operator>>=(const SystemException * &);
What should allocbuf() for a bounded sequence return if I ask for more elements than the sequence bound? The spec doesn't say. I think it should return null in this case. Also, what should allocbuf() return if I ask for zero elements?
There doens't appear to be any portable way to implement an object that inherits from an abstract interface using the DSI in C++ without compile time knowledge of the abstract interface. The basic problem is that I can create an object reference from a POA, but there is no way to convert the reference into an abstract interface reference so that I can send it out on the wire. We need some mechanism to coerce an object reference into an abstract interface reference (with a runtime check) to make this work.
deferred in June 2011 to the next RTF
The description of Any::to_abstract_base does not have any information about its memory managment implications. It should have the equivalent semantics to Any::to_object, and require the resulting reference to be released by the caller.
I think we have a defect/omission in the C++ mapping with respect
to exception safety. Consider a servant class with a constructor:
class FooImpl : public virtual POA_Foo {
public:
FooImpl();
// ...
};
Consider what happens if FooImpl() throws an exception for some reason.
By the time FooImpl() runs, the base class constructor POA_Foo() has run
already. So, when the compiler deals with the exception, it invokes
~POA_Foo().
The problem arises because, in our implementation at least, ~POA_Foo()
checks if the reference count is zero and asserts if not.
deferred in June 2011 to the next RTF
consider:
// IDL
struct VariableStruct { ... };
interface I
{
void foo(out VariableStruct s);
void bar(out VariableStruct s);
};
Then:
// C++
void
MyImplForI::foo(VariableStruct_out s)
{
bar(s);
bar(s); // Leak here
}
void
MyImplForI::bar(VariableStruct_out s)
{
s = new VariableStruct;
}
The freeing of memory for out params relies on the default conversion
by the _out constructor from a pointer to the _out type which, as a
side effect, frees the memory return by the previous call. However,
in this case, and _out param is passed to another call, so the
assignment operator runs, not the constructor:
T_out& operator=(T* p) { ptr_ = p; return *this; }
The assignment operator doesn't free the previous memory, so we get
the leak.
Should the assignment operator be changed?deferred in June 2011 to the next RTF
Many ORBs provide ostream insertion for exceptions as an extension to C++
mapping. Typically, applications are required to use them (there is not really
a usable alternative) to write code in the following style:
try
{
// do some operations
}
catch (CORBA::Exception & ex)
{
cerr << "some operation failed: " << ex << endl;
}
This breaks portability as not all ORBs provide the functionality in the same
way. Therefore ostream insertion should be part of the standard.
Date: Fri, 24 Dec 1999 07:30:24 +1000 (EST) From: Michi Henning <michi@ooc.com.au> To: Juergen Boldt <juergen@omg.org> cc: issues@emerald.omg.org, cxx_revision@emerald.omg.org Subject: Re: issue 3165 -- C++ RTF issue In-Reply-To: <4.1.19991223114858.00992cc0@emerald.omg.org> Message-ID: <Pine.HPX.4.05.9912240725430.12793-100000@bobo.ooc.com.au> Organization: Object Oriented Concepts MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-UIDL: Yp]!!J5%"!JIGe9nUI!! On Thu, 23 Dec 1999, Juergen Boldt wrote: > This is issue # 3165 > > C++: ostream insertion Juergen, that's a duplicate of 266, for which a proposal is currently up for vote. So, 3165 can be closed as a duplicate.
Section 1.17.10.2, the definition of operator= for ValueFactoryBase_var has "ValueFactoryBaseBase_var".
The mapping requires that it must be possible to insert CORBA::Exception into an any (section 1.19.2). Question: Is it possible to insert UnknownUserException into an Any? If the answer is yes, what are the members of UnknownUserException, what is its CDR representation, and what is its TypeCode? If the answer is no, we should clearly state this and specify what happens if I attempt to insert UnknownUserException into an Any.
deferred in June 2011 to the next RTF
The CORBA 2.3 C++ mapping makes no mention of _out types for valuetypes. Clearly this is needed and should be mentioned.
The CORBA 2.3 C++ mapping for valueboxes (1.17.7.2) does not specify the behavior of the constructors, assignment operator and _value modifier method with respect to the object reference argument. These methods clearly need to call _duplicate on their argument, since the valuebox must manage its own memory. Proposal: Add the following paragraph just before the example in 1.17.7.2: Value box classes for object reference maintain a private managed copy of the object reference. The constructor, assignment operator and _value modifier method for these classes call _duplicate on the object reference argument, and the destructor calls CORBA::release on the boxed reference.
2. Valuetypes should have _var typedef inside the class to aid template programming just like objects, structs and unions.
Section 1.17.7.5 states: "Value boxes for these types [including Fixed]
map to classes that have exactly the same public interfaces as the
underlying boxed types...".
Does this also include overloaded operators that are defined in the
Fixed class?
It sure seems weird to allow some operators to work but not others:
// IDL
valuetype FixedVal fixed<5,2>;
// C++
FixedVal *fv = ...;
++fv; // legal?
CORBA::Fixed f = fv * 2; // illegal?
deferred in June 2011 to the next RTF
The last C++ RTF made changes that identify specific inheritence strategies must be used for generating code for interfaces that inherit from abstract interfaces. The text in 1.40.3 was not updated to reflect this, and still suggests that other strategies are possible, when they are no longer allowed.
In section 1.17.5, the C++ class for Valuebase does not show the get_value_def operation.
deferred in June 2011 to the next RTF
the spec says (on page 1-23): The T* constructor creates a T_var that, when destroyed, will delete the storage pointed to by the T* parameter. The parameter to this constructor should never be a null pointer. Compliant implementations are not required to detect null pointers passed to this constructor. This seems broken for two reasons: - In an environment without real exceptions, null pointers must be returned for variable-length types in the presence of an exception. So if I write Foo_var fv(some_ref->op(my_corba_environment)); and op() raises an exception (which will be returned in the environment), I'm hosed. - The assignment operator permits assignment of null, but the constructor doesn't. This is inconsistent, if nothing else. It seems that disallowing initialization from null pointer is some historical hangover? I think the restriction should be removed.
deferred in June 2011 to the next RTF
the spec currently says (page 1-101):
Request invocations made through the DII may result in
user-defined exceptions that cannot be fully represented
in the calling program because the specific exception type
was not known at compile-time. The mapping provides the
UnknownUserException so that such exceptions can be represented
in the calling process: [...]
Here is a code snippet for the DII:
req->invoke();
if (req->env()->exception()) {
// Got an exception
CORBA::Exception * ep = req->env()->exception();
// ...
}
The para on page 1-101, by implication, says that:
- If there are concrete C++ types available in the caller that
can represent the user exception, a real user exception is
instantiated and the pointer returned by exception() points
at the concrete user exception instance.
- If there is no concrete C++ type available in the caller for
a user exception, the pointer returned by exception() points
at an instance of UnknownUserException.
It's not as clearly spelled out as this, but it can be implied from the
words on page 1-101.
This is bad. For one, it implies "action at a distance". For example,
linking the stubs for a user exception into a completely unrelated
part of the same binary (possibly via a library) would change
the behavior of the above DII call. Further, to make this behavior
happen would require some form of global initialization data structure.
In effect, there would have to be something that would let the ORB
know (globally) for which user exceptions stub code is linked in.
We rejected the need for global data recently in another context (for
the proposed extraction operator for user exceptions). For the same reason,
we should reject this here and mandate that, if I use the DII, *all* user
exceptions are *always* returned as UnknownUserException.
deferred in June 2011 to the next RTF
the new mapping for _var types for fixed-length underlying types shows:
T_var &operator=(T *t) {
if (t != m_ptr) {
delete m_ptr;
m_ptr = t;
}
return *this;
}
This guards against self assignment when a pointer is assigned to the _var.
I don't think this is right:
- Assigning a pointer to a _var that already owns what the pointer
points at is almost certainly an error:
MyStruct * p = ...;
MyStruct_var v = p; // OK
// ...
v = p; // Almost certainly an error
- We don't do the same thing elsewhere. On page 1-13:
A_var &operator=(const A_var& a) {
reset(p); return *this;
}
This is inconsistent: assignment of a _ptr to a _var reference
is not safe against self assignment, so assignment of a pointer
to the _var for a fixed-length type shouldn't be either.
Note that the other assignment operators are just fine -- I'm only objecting
to testing for self-assignment for operator= with a pointer as the RHS.
(A nice compiler could even insert an assertions if a _var is assigned the
same thing that it already points at.)
deferred in June 2011 to the next RTF
I believe the specification for insertion of object references to Anys is
somewhat ambiguous. And, if it is intended to be as I think, it may also be
less than ideal.
Consider the following idl:
interface B {...};
interface D : B {...};
And then consider the following code:
D_ptr d; // initialize this to non-null value somehow
B_ptr b = B::_narrow(d);
Any ab;
ab <<= b;
Any ad;
ad <<= d;
// ...
B_ptr b_val;
if (ab>>=b_val) { /* do stuff with b_val */ }; // 1
if (ad>>=b_val) { /* do stuff with b_val */ }; // 2
D_ptr d_val;
if (ab>>=d_val) { /* do stuff with d_val */ }; // 3
if (ad>>=d_val) { /* do stuff with d_val */ }; // 4
>From what I can see of the spec, it is a bit unclear about whether then
insertion of an object should use the static type or the dynamic type of the
object to initialize the typecode. Simplicity and consistency with other
related operations suggests that it should use the static type. That is what
we currently do, and a quick test of ORBIX 2000 seems to tell me it does it
that way too.
With that interpretation, 1&4 will work, while 2&3 will fail.
Nobody should be surprised that 3 fails, but it is inconvenient
that 2 doesn't work.
If insertion used the dynamic type of its argument, then 1&2
would work, while 3&4 would fail.
To get reasonable behavior when derived types might be present,
(and how often can you be certain they cannot?)
it seems that one should almost never use type specific object
extraction. Instead, one must do something like:
Object_var o;
B_var bv;
if (ad>>=to_object(o._out()) &&
!CORBA::is_nil(bv = B::_narrow(o)))
{ // do stuff with bv };
This is unfortunately a bit inconvenient.
So, is there any text in the spec that says, when inserting an object
reference type into an any, if the repository id in the typecode should be
the static type of the inserted argument or the dynamic type of the value of
the argument?
If not, I think we need to add some text.
deferred in June 2011 to the next RTF
The CORBA 2.3.1 specification does not cover the case of code generation
for the OBV_ class constructor for a valuetype that inherits from
another concrete valuetype:
// IDL
valuetype A {
octet o1;
};
valuetype B : A {
octet o2;
};
The generated OBV constructor for class B needs to take both o1 and o2
arguments, so it should look like this:
// C++
class OBV_B {
...
protected:
...
OBV_B(Octet init_o1, Octet init_o2)
};
Proposal:
Change the second paragraph of 1.17.2 to read:
"For the same reasons, a C++ OBV_ class defines a protected default
constructor, a protected constructor that takes an initializer for each
valuetype data member, and a protected default constructor. The
parameters of the constructor that takes an initializer for each member
appear in the same order as the data members appear, top to bottom, in
the IDL valuetype definition, regardless of whether they are public or
private. If the valuetype inherits from a concrete valuetype, then
parameters for the data members of the inherited valuetype appear
first. All parameters for the member initializer constructor follow the
C++ mapping parameter passing rules for in arguments of their respective
types."
Section 1.17.10.3 states that type specific valuetype factories are generated with a public destructor. This conflicts with the reference counting requirement for factories, since it makes it easier for application code to delete a factory that still has outstanding references. Proposal: Change the text in 1.17.10.3 to make destructors for type specific valuetype factories protected rather than public.
The CORBA 2.3 C++ mapping is clear on what the use of ValueBase::_copy_value is, but is unclear as to who is responsible for providing an overriding definition of this pure virtual function. Is it the IDL compiler, generating an overriding _copy_value() function for each valuetype C++ class, or is the user, when he provides a valuetype implementation class?
deferred in June 2011 to the next RTF
Section 1.17.9 states that valuetypes that support a non-abstract interface have a POA skeleton class generated for them. Is a tie template class also supposed to be generated?
C++ issue #1: The C++ specification should state that valuetype parameters which are copied by the ORB for collocated invocations are done using an ORB internal mechanism, not _copy_value().
deferred in June 2011 to the next RTF
C++ issue #2: The ValueBase::_copy_value() function should be
deprecated in favor of a new ValueBase::_clone_value() operation:
// IDL
module CORBA {
abstract valuetype CloneContext { };
};
// C++
namespace CORBA {
...
class ValueBase {
...
public:
ValueBase *_clone_value(CloneContext *&);
};
...
};
The _clone_value() function provides an independant copy of the
valuetype it is invoked on. Any valuetypes reachable via the state of
the original valuetype are also copied, and relationships between
original valuetype(s) will be preserved in the cloned copies. The
CloneContext argument provides the necessary state information for the
ORB to properly maintain relationships between copied valuetypes. If
_clone_value() is called with a null CloneContext, a new CloneContext
will be generated and returned by the ORB as a result of the call.
deferred in June 2011 to the next RTF
For servant reference counting, the words "at least once" appear in a number of places when it comes to servant activation. set_servant(), activate_object(), activate_object_with_id(), servant_to_id(), servant_to_reference(), and _this() all use this language (pages 1-137 and 1-138): ... will invoke _add_ref at least once on the Servant argument... Problem: suppose my ORB calls _add_ref() twice in each of these operations for some reason. I now have a problem. That's because, for servant activators, responsibility for calling _remove_ref() passes to etherialize(). However, if the ORB is permitted to call _add_ref() as many times as it likes, I have no idea how many times I have to call _remove_ref() from within etherealize(). I think that the spec should say that _add_ref() is called *exactly* once for these operations *if* the corresponding servant is not in the AOM already. I vaguely remember the discussion about optimization of the calls to _add_ref() and _remove_ref(). I think the idea was to permit the ORB to avoid redundant calls. However, it seems that the language in the spec isn't precise enough. Under one interpretation, the refcount counts the number of entries in the AOM. Under another interpretation, it counts the number of calls in progress as well (because an ORB could call _add_ref() when a call is dispatched and call _remove_ref() when it finishes). Under yet a third interpretation, the refcount counts the number of object references in my address space. That interpretation is happens if *every* call to _this() calls _add_ref()... The language is not precise enough, I think...
deferred in June 2011 to the next RTF
the text for set_servant doesn't say what should happen if I call set_servant(0). I would suggest to throw BAD_PARAM in this case.
Transfer to C++ RTF deferred in June 2011 to the next RTF
The CORBA 2.3 C++ specification, section 1.22 states that valuetypes passed as in parameters to an invocation of an object are copied, even if the object is collocated with the caller. It does not make this statement for inout or out parameters (or return results), which strongly suggests that valuetype copying is not necessary. In fact, the text for valuetype inout parameters strongly suggests that copying is not performed. I think this is wrong and inout & out valuetypes should be copied as well (inout parameters should be copied before and after the invocation, while out and return values should be copied after the invocation completes.) Without the copies, call transparency will be broken and the client can distinguish between a local and a remote call.
deferred in June 2011 to the next RTF
The mapping for user exceptions and structures is identical, except for one thing: user exceptions have an additional constructor with one parameter for each member, so I can construct and throw the exception with a single throw statement. However, structures are second-class citizens: I can't instantiate and initialize a structure at the same time. (Well, at least not in general, because static initialization only works for aggregates and, at any rate, I can only instantiate and initialize with compile-time constants.) So, why don't we add the same constructor to the mapping for structures? It seems inconsistent to have one mapping for structures and a slightly different one for exceptions, when in fact they both could be the same.
deferred in June 2011 to the next RTF
Question: do I need to deallocate the string returned by Exception::_name() and Exception::_rep_id() or not? The spec doesn't say... Given that these are PIDL, and that the return value is const char * (rather than non-const char *), I'd say that I shouldn't have to deallocate the return value. But I think we should clarify this in the spec. Also, the Exception class in section 1.41.7 doesn't show the _name and _rep_id members, so we need to add them there. Further, Exception doesn't show up in section 1.23 (Mapping of Pseudo Objects). I suspect that we need to add Exception there as well and mention the exception to the memory management rules? Another interesting thing is that, if Exception is a pseudo object, then UserException and everything derived from it is also a pseudo object. But, user exceptions can't be pseudo objects. But, if they are not pseudo-objects, we can't really make special-purpose memory managment rules. Sigh... :-(
I seem to remember that we decided to deprecate the void * functions on type Any. However, looking at the latest C++ draft, they are not marked as deprecated. Can anyone remember what we decided to do? Is this a bug in the spec or a bug in my memory?
deferred in June 2011 to the next RTF
The C++ "Mapping of PortableServer Dynamic Implementation Routine" states that "If DynamicImplementation::_this() is invoked outside of the context of a request invocation on a target object being served by the DSI servant, it raises the PortableServer::WrongPolicy exception". This conflicts with the behaviour of _this() in static skeletons as de- fined in "Skeleton Operations". In particular, this means that DSI servants cannot be implicitly acti- vated, and therefore, the choice of DSI vs. static skeleton is not trans- parent to the application integrator. Is there any rationale behind this?
deferred in June 2011 to the next RTF
page 1-23 says: The T* constructor creates a T_var that, when destroyed, will delete the storage pointed to by the T* parameter. The parameter to this constructor should never be a null pointer. Compliant implementations are not required to detect null pointers passed to this constructor. So, I can't explicitly initialize with null: T_var tv = 0; This seems strange, seeing that the default constructor does initialize with null. Also, the spec doesn't say anything about assignment. Is the following legal? T_var tv = ...; tv = 0; I don't understand the restriction. What's the motivation for disallowing this? Especially for String_var, the prohibition against null null seems rather draconian. For example, I may be using a temporary local String_var for exception safety and then, at some point, decide to assign null to it to force an early deallocation of the string instead of having to create a separate scope to achieve this. At any rate, we should clarify so that, whatever the eventual decision is, the text for the assignment operator agrees with the text for the constructor.
Section 1.17.11 of ptc/2000-01-02 says that DataInputStream & DataOutputStream are mapped according to the normal valuetype mappings. This mapping results in operations that are at best cumbersome to use in marshalling sequences of primitive types: Operations read_xxx_array and write_xxx_array are defined, taking argments of type CORBA::xxxSeq. These are obviously intended to be sufficient for marshalling all defined sequences of the corresponding primitive type xxx. However, the c++ mapping for sequences requires that each distinctly declared sequence type be unique and separately overloadable. This guarantees that a marshaller attempting to marshal an sequence of primitive other than CORBA::xxxSeq will not be able to pass that sequence to the corresponding read_xxx_array and write_xxx_array operations. Instead, code must be written to bypass strict typing. To fix this, either the mappings for DataInputStream and DataOutputStream need to be non-standard, the mapping of sequences needs to change, or the mapping of CORBA::xxxSeq needs to change to something special.
deferred in June 2011 to the next RTF
in the resolution to issue 863, we decided to get rid of the read-only restriction for parameters. However, we forgot to remove a few snippets. Page 1-110, table, case 3: Remove the following text: Following the completion of a request, the caller is not allowed to modify any values in the returned storage--to do so, the caller must first copy the returned instance into a new instance, then modify the new instance. Page 1-110, table, case 6: Remove the following text: Following completion of a request, the caller is not allowed to modify any values in the returned storage--to do so, the caller must first copy the returned array instance into a new array instance, then modify the new instance.
deferred in June 2011 to the next RTF
the spec is currently not terribly clear about the server's responsibilities
when throwing an exception from an operation that has a variable-length
out param.
The intent of the spec is that the server is responsible for deleting
the memory it allocated to an out param before it throws an exception:
// Correct implementation
void
Foo_impl::
op(CORBA::String_out out_p) throw(CORBA::SystemException)
{
CORBA::String_var tmp = CORBA::string_dup("Hello");
bar(); // bar() may throw
out_p = tmp._retn(); // No leak, even if bar() throws
}
// Incorrect implementation
void
Foo_impl::
op(CORBA::String_out out_p) throw(CORBA::SystemException)
{
out_p = CORBA::string_dup("Hello");
bar(); // Leak if bar() throws
}
However, the spec never states this clearly. In fact, it sort of says
the opposite. On page 1-110, table item 3:
To maintain local/remote transparency, the caller must always
release the returned storage, regardless of whether the callee
is located in the same address space as the caller or is located
in a different address space.
There is no mention here of what should happen in the presence of exceptions.
I think it would be nice to clarify that the skeleton will never look
at an out param in the presence of exceptions and that the operation
implementation is responsible for deallocating memory in this case.
deferred in June 2011 to the next RTF
quite some time ago, we added the _var_type and _ptr_type definitions to proxies to make it easier to write templates. Similarly, we have the _whatever_seq typedefs for recursive structs and unions, to avoid problems with anonymous types. What's missing at the moment is a similar feature for _var types. When I'm writing a template that does it's job in terms of _var types, I also quite often want to do something to the underlying target type of the _var. However, I can't do that unless I pass in an extra template parameter (which, in turn, doesn't always work if I also want to use STL standard binders and such...) So, why not add a typedef for the target type to every _var type?
deferred in June 2011 to the next RTF
quite some time ago, we added the _var_type and _ptr_type definitions to proxies to make it easier to write templates. Similarly, we have the _whatever_seq typedefs for recursive structs and unions, to avoid problems with anonymous types. What's missing at the moment is a similar feature for _var types. When I'm writing a template that does it's job in terms of _var types, I also quite often want to do something to the underlying target type of the _var. However, I can't do that unless I pass in an extra template parameter (which, in turn, doesn't always work if I also want to use STL standard binders and such...) So, why not add a typedef for the target type to every _var type?
The mapping is currently a bit ambiguous about the insertion/extraction operators for Any. It says: Assuming that boolean, char, and octet all map the C++ type unsigned char, the private and unimplemented operator<<= and operator>>= functions for unsigned char will cause a compile-time error if straight insertion or extraction of any of the boolean, char, or octet types is attempted. This is ambiguous. It is not clear what is qualified by the first part of the sentence "Assuming that...". It could qualify all of the paragraph, in which case the interpretation is: Only on platform where these three types indeed map to the same C++ type will it be necessary to have these unimplemented operators. // C++ Octet oct = 040; Any any; any <<= oct; // this line will not compile any <<= Any::from_octet(oct); // but this one will This is unambiguous, but it doesn't make it clear whether this will be the case for all mapping implementations, or only those where the IDL types map to ambiguous C++ types. It is important to note that the previous example is only one possible implementation for these helpers, not a mandated one. Other compliant implementations are possible, such as providing them via in-lined static any member functions if boolean, char, and octet are in fact mapped to distinct C++ types. All compliant C++ mapping implementations must provide these helpers, however, for purposes of portability. Again, this is slightly ambiguous because, even though it requires the presence of the helpers, it doesn't make any statement about whether the prohibition of the direct insertion operators is mandatory for all implementations. I would suggest to clarify the text to state that direct insertion/extraction of Bool, Octet, and Char must fail with a compile-time error, regardless of how these types are mapped.
deferred in June 2011 to the next RTF
The semantics for insertion of a valuetype into an Any are unclear. (Note, this is related to issue 2531 in the IDL-to-Java RTF. It is also related to orb_revision issue 3205.) In section 1.16.2 of ptc/2000-01-02, two forms of insertion are defined: copying and non-copying. The non-copying form is described as: "The noncopying valuetype insertion consumes the valuetype pointed to by the pointer that T** points to. After insertion, the caller may not access the valuetype instance pointed to by the pointer that T* points to. The caller maintains ownership of the storage for the pointed-to-T* itself." There is no specific description of the copying form specific to valuetypes, so the generic description must apply: "For the copying version of operator<<=, the lifetime of the value in the any is independent of the lifetime of the value passed to operator<<=. The implementation of the any may not store its value as a reference or pointer to the value passed to operator<<=." One possible interpretation (1) is that the copying form should be implemented via a call to the _copy_value virtual function, while the non-copying form should simply retain the provided pointer (without calling _add_ref) and eventually call _remove_ref when done with it. If so, what is the significance of the rule about the caller not continuing to use the pointer? It it only that it has lost a reference count, and may continue using the pointer if it has another reference count? Or does this imply that continued access to the value is forbidden regardless of reference count? Another possible interpretation (2) is that the description is nonsense, and that the non-copying form should use _add_ref and the copying form should use _copy_value. In this interpretation the caller would be free to continue using the original pointer and would be obligated to _remove_ref it eventually. This seems like a more practical interpretation, but is inconsistent with usage for other non-copying insertions. Suggested Resolution: Replace the paragraph on non-copying insertion of valuetypes (quoted above) with: "The noncopying valuetype insertion takes ownership of one reference count to the valuetype pointed to by the pointer that T** points to. After insertion, the caller should treat the pointer as if _remove_ref had been called on it. The caller maintains ownership of the storage for the pointed-to-T* itself." "For copying valuetype insertion, the lifetime of the value in the any is independent of the lifetime of the value provided. The implementation of the any shall duplicate the value using the virtual function _copy_value or an equivalent mechanism. The caller retains ownership of the T* pointer and remains obliged to call _remove_ref on it."
deferred in June 2011 to the next RTF
The C++ language mapping does not specify what criterion should be used to
determine the validity of a typesafe extraction from an Any.
The closest it ever comes is the statement in 1.16.3:
"In this case, the version of operator>>= for type Long must be able to
determine whether the Any truly does contain a value of type Long...".
There are two obvious candidates: the equal and equivalent operations of
TypeCode.
Proposed resolution:
Replace the first sentence of 1.16.3:
"To allow type-safe retrieval of a value from
an any, the mapping provides the following
operators for each OMG IDL type T:"
with:
To allow type-safe retrieval of a value
from an Any, the mapping provides an
operator>>= for each OMG IDL type T.
Each such operator returns a boolean
indicating success or failure, and if
successful, makes the value of the any
available via a user supplied argument.
The success of the operation is determined
by applying the {equal | equivalent}
operation to the typecode of the any and
the typecode of the target type.
The exact form of operator>>= varies
according to the type T as follows:
The choice of {equal | equivalent} needs to be discussed. I believe there
are valid arguments for each.deferred in June 2011 to the next RTF
Currently there is Any extraction with widening to Object, and AbstractBase. It seems useful to also have one that widens to ValueBase.
Question: Is it legal to do the following if I use a C++ mapping that uses C++ exceptions instead of using CORBA::Environment to handle errors? CORBA::Environment my_env; The spec says (page 114): The C++-PIDL specification differs from the C-PIDL specification as follows: [...] Supports a default constructor that initializes it to hold no exception information. However, the class definition that follows does *not* show the default constructor. So, the text disagrees with the class definition that is shown because "supports a default constructor" does not have a "may" or "might", so the text would appear to make the default constructor mandatory for *both* EH and non-EH mappings.
deferred in June 2011 to the next RTF
I believe that the CORBA::release and CORBA::is_nil
functions that take a POA_ptr argument do not
reference the proper scope:
1.41.11 release and is_nil
// C++
namespace CORBA {
...
void release(POA_ptr);
...
Boolean is_nil(POA_ptr);
...
}
Should be:
1.41.11 release and is_nil
// C++
namespace CORBA {
...
void release(PortableServer::POA_ptr);
...
Boolean is_nil(PortableServer::POA_ptr);
...
}
I don't see in the specification where the scope
of POA_ptr is explicitly defined. But, I believe
that the correct definition of POA_ptr is in the
PortableServer namespace (i.e. the enclosing scope
of the POA class).
Then again I can't find anything in the specification
that asserts that any Foo_ptr type must go in the
immediately enclosing class or namespace containing
the Foo type. :-/
Also, if POA_ptr is in PortableServer when an ORB is
mapping of modules to classes the definition of the
above release and is_nil functions in the CORBA class
will be impossible.
So I feel compelled to ask:
Do we really need to have release and is_nil functions
for types outside of the CORBA module?
deferred in June 2011 to the next RTF
Page 1-153, section 1.41.2: String_var has: operator char*(); operator const char*() const; What is missing here is: operator char*&(); Without that, a String_var cannot be passed as an inout param.
Why is it that String_var contains the following? operator char *(); The mapping never passes strings as a char *. The only parameter passing signatures are const char * for in params, char * & for inout params, and String_out for out params. It seems that this operator is redundant? The only reason I can think of for it having been added are sloppy signatures (such as old implementations of strcpy or some such, which sometimes used char * instead of const char *). However, wouldn't it be better to remove operator char *() from String_var and force a cast for such broken function signatures?
CORBA::Fixed should have a to_string() member function to allow an
explicit conversion to a string. Otherwise the only way to get a string
version of the information in a fixed is via a string stream, which can
be awkward.
namespace CORBA {
class Fixed {
public:
...
char *to_string();
...
};
}
The caller of Fixed::to_string() must deallocate the return value by
calling CORBA::string_free or assigning it to a String_var.
what should _default_POA() return if the default ORB was never initialized? The spec doesn't say...
deferred in June 2011 to the next RTF
with 2.3, we got rid of all the C/C++ pseudo code for the DII and replaced
it with IDL. Unfortunately, this has broken something in the C++ mapping...
In the 2.0 spec, we had:
pseudo interface ORB {
typedef sequence<Request> RequestSeq;
// ...
};
With 2.3, we changed this to:
module CORBA {
// ...
typedef sequence<Request> RequestSeq;
// ...
};
Unfortunately, the C++ mapping still shows the (now incorrect) definition
from CORBA 2.0 in Section 1.33.1.
In addition, the C++ mapping shows in Section 1.33.2:
class ORB {
public:
class RequestSeq {...};
// ...
};
But then, in Section 1.41.21:
class ORB {
public:
typedef sequence<Request_ptr> RequestSeq;
// ...
};
The latter definition isn't C++...
So, we have several issues here:
1) How can we fix the C++ mapping to be in line with the core?
I'm toying with the idea of saying that RequestSeq is defined
in the CORBA namespace, with a typedef for backward compatibility
in the ORB interface. But I'm not sure what will break with
this kind of aliasing (repository IDs might change unexpectedly?)
2) Section 1.41.21 should be changed to show legal C++.
3) Depending on the resolution to this issue, both 1.33.2 and
1.41.21 will probably need updating to reflect the resolution.
deferred in June 2011 to the next RTF
The current requirement that the default implementations of _add_ref
and _remove_ref in ServantBase do nothing creates several problems:
1. The text in the C++ mapping that states that _remove_ref
must be called on a servant means nothing unless the ref
counting mix-in was used by the servant author.
2. The intended semantics of _var types as "smart pointers"
is upheld only if the servant author goes to the extra
step of using the ref counting mix-in.
3. In many places the C++ mapping explicitly or implicitly
states that _var types will recover memory for the application
developer:
1.3.1:
Client code frequently will use the object reference
variable type (A_var) because a variable will
automatically release its object reference when it is
deallocated or when assigned a new object reference.
1.3.6:
When a _var is passed as an out parameter, any
previous value it refers to must be implicitly
released.
In addition, there are many places in the C++ mapping where
the specification of _var types for arrays, structs, strings,
sequences, type Any, type codes, value types, value boxes,
value factories, etc. guarantees that the memory will be
reclaimed when the _var goes out of scope. This makes it
easy for users to believe that all _var types will release
storage for the objects that point to.
Benefits of Proposed Resolution:
Users can depend on ORB's to manage servant memory by default
rather than by exception.
Specification text that promises or implies automatic memory
reclamation need not change.
Existing user code will still compile.
Resolution:
Revised Text:
Replace the text in section 1.36.1 beginning with the sentence:
Servant instances may implement reference counting to prevent
themselves from being destroyed while the application is
still using them.
and section 1.36.2 in its entirety with:
Servant instances may implement reference counting to prevent
themselves from being destroyed while the application is still
using them. Servant reference counting is performed using the
_add_ref and _remove_ref functions declared in ServantBase. The
default implementations of _add_ref and _remove_ref supplied by
ServantBase provide true reference counting. An instance of a
servant class derived from ServantBase initially has a reference
count of one. Invoking _add_ref on the servant instance
increases its reference count by one. Invoking _remove_ref on
the servant instance decreases its reference count by one; if the
resulting reference count equals zero, _remove_ref invokes delete
on its this pointer in order to destroy the servant. For ORBs
that operate in multi-threaded environments, the implementations
of _add_ref and _remove_ref that the ServantBase class provides
shall be thread-safe.
ServantBase supports copy construction and the default assignment
operation. Copy construction always sets the reference count of
the new servant instance to one. The default assignment
implementation merely returns *this and does not affect the
reference count.
For servants that require that servants are not reference
counted, these functions are virtual and thus may be overridden
by derived servant classes. A default mix-in class is also
provided to remove the reference counting in the PortableServer
namespace; please see Section 1.36.2, "Servant No Reference
Counting Mix-In," on page 1-??? for more details. Details
concerning POA and application responsibilities with respect to
reference counting can be found in Section 1.36.4, "Servant
Memory Management Considerations," on page 1-???.
Note that for applications that depended on the the
RefCountServantBase provided in previous revisions of this
specification ORBs must provide a default implementation of this
mix-in class in the PortableServer namespace that essentially
does nothing:
// C++
namespace PortableServer
{
class RefCountServantBase : public virtual ServantBase
{
public:
~RefCountServantBase();
protected:
RefCountServantBase(const RefCountServantBase&);
RefCountServantBase& operator=(const RefCountServantBase&);
private:
// ...other implementation details...
};
}
1.36.2 Servant No Reference Counting Mix-In
The PortableServer namespace also provides a standard servant
mix-in class to remove the reference counting:
// C++
namespace PortableServer
{
class NoRefCountServantBase : public virtual ServantBase
{
public:
~NoRefCountServantBase();
virtual void _add_ref() {}
virtual void _remove_ref() {}
protected:
NoRefCountServantBase() {}
NoRefCountServantBase(const NoRefCountServantBase&) {}
NoRefCountServantBase& operator=(const NoRefCountServantBase&);
private:
// ...other implementation details...
};
}
The NoRefCountServantBase mix-in class overrides the inherited
_add_ref and _remove_ref functions it inherits from ServantBase,
in order to override and remove the default reference counting in
ServantBase.I have the following questions to IDL - C++ mapping CORBA 2.3 (concerning valueboxes). Can somebody give me an answer? 1. I assume that valueboxes T as a special kind of valuetypes also need in C++ the T_var and the T_out types and the T_out types will be used in function signatures for IDL out-parameters. Is it true? 2. The mapping for strings and wstrings requires a definition of C++ operators << and >> to allow a use of strings (wstrings) with the c++ iostreams. What about valueboxes of strings (wstrings) - chapter 1.17.7.4? Is it required to define (in C++) the operators <<, >> to use T_var and T_out with C++ iostreams, where T is a type for a valuebox T of string (wstring)?
deferred in June 2011 to the next RTF
The June 99 version of the C++ mapping doesn't mention ORB::destroy(). It should.
deferred in June 2011 to the next RTF
On page 1-119, the spec says the following about _create_request() and _create_request2(): [...] the ORB requires: - a target object reference - an operation name - a list of arguments (optional) ^^^^^^^^^^ - a place to put the result (optional) ^^^^^^^^^^ - a place to put any returned exceptions - a Context (optional) ^^^^^^^^^^ - a list of the user-defined exceptions that can be thrown (optional) ^^^^^^^^^^ - a list of Context strings that must be sent with the operation (optional) ^^^^^^^^^^ Note all the "optional" remarks. It's not clear what "optional" actually means. We have two cases for these parameters: - Arguments, user exceptions, and IDL contexts are *sequences*. - Result and context are object references. Two questions: - What does it mean for a sequence parameter to be "optional"? That I can pass a null pointer or that I can pass an empty sequence? I assume that an empty sequence is meant, but the spec doesn't say that. - What does it mean for a reference parameter to be "optional"? That I can pass a nil reference or that I must pass a reference to some dummy object that indicates that the value really isn't there? Where this is particularly annoying is for the return value. (The "result" parameter to _create_request()): - If I can pass a nil reference, no problem. This could be interpreted to mean the same thing as a void return type. - If I can't pass a nil reference, what should I pass? Obviously, it would have to be a reference to a valid NamedValue object. But how do I create that NamedValue object? I can call ORB::create_named_value(), but what should I do then? CORBA::NamedValue_var result; orb->create_named_value(result); At this point, I have a NamedValue containing an Any with tk_null (because that's what the Any default constructor creates). However, to correctly indicate that the operation I want to call has a void return type, I have to make a NamedValue that contains an Any with tk_void. But, how do I achieve that? I can't use one of the Any inserters to turn the TypeCode in the Any into tk_void, and I can't use the type() member of the Any because I can't change the type of an Any if it isn't consistent with the TypeCode that's already there... Even worse, the NamedValue doesn't seem to make sense as the return value at all. For one, it has a name attribute. - What is the value of that name for a return value? - How would I set that string after having create the NamedValue by calling create_named_value()? - What is the value of that string once I have called create_named_value()? Second, the NamedValue contains a flags attribute. - What is the value of that flags attribute for a return value? None of ARG_IN, ARG_INOUT, or ARG_OUT make sense. (One could argue that ARG_OUT could be used, but I think that sucks...) - How would I set that flag on the NamedValue I have just created? The mapping for NamedValue only offers accessor but no modifiers, so I can't set the value of the flag. - What is the value of the flag once I have called create_named_value()? It seems that the easiest way to fix the problem is to state that, if a parameter isn't needed, this is indicated by an empty sequence for lists, and by a nil reference for objects. However, the problems around create_named_value() and appear to be more serious. How should we fix those?
deferred in June 2011 to the next RTF
The second version of _create_request() accepts two context lists:
void Object::_create_request(
Context_ptr ctx, // <===
const char * operation,
NVList_ptr arg_list,
NamedValue_ptr result,
ExceptionList_ptr,
ContextList_ptr, // <===
Request_out request,
Flags req_flags
);
The spec then says:
The ContextList differs from the Context in that the former supplies
only the context strings whose values are to be looked up and sent
with the request invocation (if applicable), while the latter
is where those values are obtained.
So, I *think* (but I'm not sure), this means to say that:
- The Context parameter points at a tree of context objects.
- The ContextList pointer points at an object that contains
a sequence of strings.
- The ContextList determines which context values are to be
picked out of the tree pointed at by the Context parameter and
to be sent with the invocation.
If that is the intended interpretation, it's very difficult to discern
from the words in the spec now. I think this needs clarification.
Questions:
- What happens if the ContextList contains the name of a context
variable that isn't available in the context tree?
- What happens if I have a non-empty context list but a nil
context tree?
Also, looking at the ContextList interface:
pseudo interface ContextList {
readonly attribute unsigned long count;
void add(in string ctxt);
string item(in unsigned long index) raises(Bounds);
void remove(in unsigned long index) raises(Bounds);
};
There is no further documentation on this. Some questions:
- As far as I can see, this interface is meant to maintain a
simple sequence of strings. So, why not simply use a string
sequence?
- At what position does add() add the item? Presumably at the tail,
but that isn't stated.
- How can I replace the value of string at a certain position?
It looks like I can't do that at all because there is no
random-access modifier.
This seems insanely complex.
Suggestion: We should
- add words to make it clear how the context parameters work
- consider overloading _create_request() yet again to use
an ordinary string sequence
- deprecate the ContextList pseudo interface
Or, we could drop support for IDL context altogether (but I suspect we
can't get away with that ;-)
The definition for Exception in the current spec is:
// C++
class Exception
{
public:
virtual ~Exception();
virtual void _raise() const = 0;
virtual const char * _name() const;
virtual const char * _rep_id() const;
};
Why aren't _rep_id() and _name() pure virtual?Rationale for Rejection Making these operations pure virtual would make things harder for implementations that share the code for both user and system exceptions.
Incorporate Messaging changes relevant to the C++ mapping, as shown in orbos/98-05-05 pages 115 and 116 together with any changes made to them by the Messaging RTF, into the IDL-C++ mapping chapter.
deferred in June 2011 to the next RTF
I took a closer look at orbos/99-07-01 to see how I'd have to implement local objects. Several questions came to my mind: 1) what happens if you invoke CORBA::Object::_duplicate on a LocalObject? - does it call _add_ref on the local object (as the spec seems to say in 4.1.2)? - is it allowed to return a copy of the object? 2) how is memory handling done on existing interfaces? 4.1.5 defines a list of interfaces that are changed to local interfaces e.g. CORBA::Current. How are they supposed to support proper memory handling when the default implementations of _add_ref/_remove_ref do nothing? 3) local interfaces can be implemented by the application programmer, e.g. PortableInterceptors. - what happens if my _duplicate operation on CORBA::Object creates a copy (which is legal) and my implemenation of the local interface contains some state? This mapping creates more problems than it solves. It breaks at least one of the basic rules of OO design: base classes must not know about subclasses. Also disabling some methods that are valid on CORBA::Object (e.g. is_a) is a hint for bad design. Why not take the same interface 'inheritance' approach as with value types?
- Require the IDL compiler to generate if necessary conversion functions that transparently convert pointers to local objects to _ptrs. - We do not introduce any special mapping for interfaces that used to be non-local such as the ServantManagers; older code that implemented them using servants will have to be updated. - The ref-counting text was borrowed from the POA ServantBase
The third bullet of 1.17.9 states that a POA skeleton class is generated for valuetypes that support interfaces, but is silent about whether a _tie template is also generated. Proposal: Add the following to the end of the third bullet in 1.17.9: "No tie skeleton class is generated for the valuetype because the tie for the inherited class can be used instead."
From orbos/99-07-01 (is there a more up-to-date version with the C++
mapping?)
---
namespace CORBA
{
class LocalObject
: public virtual Object
{
protected:
LocalObject();
~LocalObject();
public:
virtual void _add_ref();
virtual void _remove_ref();
// pseudo operations not shown...
};
};
Member functions and any data members needed to implement the Object
pseudo-operations and any other ORB support functions must also be
supplied but are not shown.
_add_ref
The _add_ref member function is called when the reference is duplicated.
A default implementation is provided that does nothing. A derived
implementation may use this operation to maintain a reference count.
_remove_ref
The _remove_ref member function is called when the reference is
released. A default implementation is provided that does nothing. A
derived implementation may use this operation to maintain a reference
count, and delete the object when the count becomes zero.
---
This implies that by default a LocalObject will not be reference
counted. That seems counter-intuitive. What was the intention here? It
seems that every application I can think of will want reference counted
local objects -- however, to get this at present the application developer
either has to implement the reference counting themselves or inherit
off some proprietary interface.
Is the definition of CORBA::Object given the C++ specificaton intended to be normative? If so then the C++ mapping given in the components spec won't work since it's clear that LocalObject is supposed to override the various methods provided on CORBA::Object.
Given valuetype WStringValue wstring; is there any requirement to have stream inserters and extractors for the boxed value type itself? The spec is currently silent on this issue. Should the following work? WStringValue ws; cin >> ws; cout << ws;
deferred in June 2011 to the next RTF
formal/99-07-41 in section 1.36.3 includes the following code:
---------------- cut here ----------------
class ServantBase_var {
public:
~ServantBase_var ()
{
if (_ptr != 0) _ptr->_remove_ref ();
}
ServantBase_var& operator=(ServantBase* p)
{
if (_ptr != 0) _ptr->_remove_ref ();
_ptr = p;
return *this;
}
ServantBase*& out()
{
if (_ptr != 0) _ptr->_remove_ref ();
_ptr = 0;
return _ptr;
}
};
---------------- cut here ----------------
unfortunately this code is not exception safe: if
_remove_ref() throws the class is left in an inconsistent state (for
out() and operator=). The fact that the destructor can potentially
throw exceptions makes it extremely hard for application developers to
write exception safe classes.
A better implementation could be:
---------------- cut here ----------------
class ServanBase_var
{
ServantBase_var& operator=(ServantBase* p)
{
if (p == _ptr) return *this;
ServanBase_var tmp (p);
std::swap (p._ptr, p);
return *this;
}
ServantBase*& out()
{
if (_ptr != 0) _ptr->_remove_ref ();
_ptr = 0;
return _ptr;
}
};
---------------- cut here ----------------
The implementation above also prevents silly mistakes like:
ServantBase_var foo = ...;
foo = foo.in ();
The destructor is a little trickier:
---------------- cut here ----------------
ServantBase_var::~ServantBase_var ()
{
// do not propagate exceptions out of the destructor
try {
if (_ptr != 0) _ptr->_remove_ref ();
}
catch (...)
{
}
}
---------------- cut here ----------------
Event better would be to add some throw spec to _remove_ref()
and _add_ref(). The spec is, as far as I can tell, silent in this
respect, thus those operations can throw anything. This is
unfortunate because it makes it harder to write exception-safe code,
both for application developers and ORB implementors alike.
the spec talks about backward compatibility with the C mapping in a number of places: - 1.1.14 - at the beginning of 1.7 - in the footnote on page 1-29 - at the end of 1.10 - at the end of 1.12 - at the beginning of 1.13.3 - at the end of 1.16.10 - at the end of 1.20 - at the end of 1.23 - at the beginning of 1.26 - 1.31.3 - 1.42.1 Binary compatibility with the C mapping has never existed and never will. Proposal: Remove all mention of the C mapping from the above places.
About two or three years ago, we decided to deprecate the read-only nature of in params on the server side, and out params and return values on the client side. The second-last para of 1.13.2 still contains a remnant that we forgot to clean up back then: As with other out and return values, out and return sequences must not be assigned to by the caller without first copying them. I would suggest to modify this sentence to read: For a sequence passed to an operation as an in parameter, the operation must not assign to the sequence if its release flag is false and the sequence has variable-length elements. For a sequence passed to a client as an out parameter or return value, the client must not assign to the sequence if its release flag is false and the sequence has variable-length elements. This captures more correctly the intent and the semantics of the release flag (because assigning to a sequence with the release flag set to true is perfectly OK).
The text added by the CCM spec that describes LocalObject has no
information on how to portably create a local object reference. Since
we have ORB services, like the Security or Transaction service which
must create local object references, and since we have a goal that these
services should be portable as source code between ORBs, we need a
portable way to create a local object reference.
Proposal:
Add a static _create_reference() member function to local object
interface classes:
// IDL
local interface I { ... };
// C++
... I_ptr;
class I : ... {
public:
I_ptr _create_reference(I *);
};
A programmer can then create a new local object reference portably:
class MyI : public I, public CORBA::LocalObject {
...
};
I_var new_i = I::_create_reference(new MyI());In CORBA C++ 2.4 and before, the exception specification of generated POA skeleton member functions is CORBA::SystemException plus the mapped C++ class for exceptions specified in the raise expression of the corresponding IDL operation [see CORBA C++ 2.4 paragraph 23.27]. As a result, a servant programmer needs to convert any exception other than those in the exception specification to one in the exception specification -- else the C++ runtime will call std::unexpected() if an unexpected exception is thrown. This makes exception handling on the server-side quite painful: for example if a servant programmer calls operator new(), s/he's supposed to catch std::bad_alloc and convert it to CORBA::NO_MEMORY. Similarly, if s/he uses any of the ISO C++ libraries, s/he's supposed to convert the std::exception objects raised by the library into CORBA::SystemExceptions, or user-defined IDL exceptions. Given that C++ compilers provide more and more features of ISO C++, in particular the standard libraries, this is a real world issue! Proposal ======== Add std::exception in the exception specification of generated POA-skeleton member functions. The POA (or POA skeleton) implementation is responsible to perform the following conversions: std::bad_alloc to CORBA::NO_MEMORY other std::exception to CORBA::UNKNOWN (see 3.17.1.1 in CORBA 2.3 core) Source-code backward-compatibility ---------------------------------- I propose to make exception specifications in generated skeletons a bit less restrictive than they were in CORBA C++ 2.4 (and before). C++ servants written with the CORBA C++ 2.4 (and before) mapping do not require any change -- their exception specifications will be more restrictive than required by the new mapping, which is perfectly correct. Interoperability ---------------- It does not affect interoperability: only CORBA exceptions go on the wire. An ORB-mediated operation can only raise a CORBA::SystemException or a user-defined IDL exception. Alternative Mapping for C++ Dialects ------------------------------------ Unfortunately, not all C++ compilers comply (or almost comply) with ISO C++. With such a "C++ compiler", the ORB/POA implementation will behave as in CORBA C++ 2.4 (i.e. no std::exception is the exception specification). Or maybe we can allow the ORB/POA to add an implementation-dependent class in the generated exception specifications? *Portable* user-written servants will simply include CORBA::SystemException (or something more restrictive) in their exception specifications.
The definition of the _downcast operation generated for valuetypes is unclear about whether it increments the reference count of the valuetype before returning the downcasted pointer. I assume by the fact that it is called _downcast rather than _narrow that it should not increment the reference count. Proposal: Add the following text to the end of the last paragraph in 1.17.3: "The _downcast function does not increment the reference count of the valuetype."
Details: This section (entitled 1.16.10 The Any Class) refers the reader to the full definition of the Any class. However, it provides the page number and section heading of itself -- it is self referential. Suggested Correction: The reference should refer to the section on page 1-150 (entitled 1.41.5 The Any Class)
The Object::get_domain_managers() operation is a transmissible operation with CORBA 2.3. Does ServantBase need anything added to handle this or is this managed internally by the ORB/POA?
deferred in June 2011 to the next RTF
In the first para of section 1.3.1, we still have a sentence about the deprecated Ref names for object references. Those have been deprecated for a *long* time now. Proposal: Remove the sentence beginning with "For historical reasons, the type ARef..."
The C++ mapping says in section 1.10: An OMG IDL struct maps to C++ struct, with each OMG IDL struct member mapped to a corresponding member of the C++ struct. This doesn't say that the order of the struct members in C++ must be the same as in the IDL. Without that guarantee, code that compares pointers to members is non-portable. We need a requirement to preserve the order here.
I recently got a query from a customer. Basically, they have a CORBA system
that interfaces to some legacy library. Lots of structures are being passed
back and forth, many of which contain strings; these need to be passed
as char * or as std::string, depending on where they go.
So, the customer defined conversion functions that correctly copied a
std::string or char * into and out of a string member (using string_dup()
or whatever, as appropriate). The problem is that they have to use
an undefined type name as the type of the parameter. For example:
void copy(const std::string & from, CORBA::string_mgr & to);
Of course, "string_mgr" is a mapping-internal type name and therefore the
code is non-portable.
I don't see an easy work-around that would be within the current mapping.
I could use a function that accepts a reference to a struct instead of
the string inside the struct, but that then means that I need a different
function for each structure type. Or I can write macros that are specific
to each ORB to handle it (but that is truly ugly and breaks if the vendor
decides to tinker with the internals of their mapping).
One way around it all would be to require a typedef to be generated for
string members. For example:
// IDL
struct Foo {
string s;
};
// C++
namespace CORBA {
// ...
class string_mgr { /* ... */ }; // Mapping-internal class
typedef string_mgr string_member; // New standard name
};
struct Foo {
CORBA::string_mgr s; // Mapping-internal type name
};
This would allow me to portably pass a string member to a function because
the mapping would guarantee the existence of a type named "string_member"
(or whatever name we can settle on).
void copy(const std::string & from, CORBA::string_member & to);
(Depending on the mapping implementation, there may be similar issues for
other types, such as references or arrays. If there are such mappings,
we'd need typedefs for those too.)
Basically, wherever a type name that is internal to the mapping can appear,
we end up with this kind of problem -- I can't pass a value of that type
because I don't know the type name. I'd like to fix that, if possible.
Rationale for Rejection Making these operations pure virtual would make things harder for imple-mentations that share the code for both user and system exceptions.
The current specification of the local mapping requires the
implementation to enforce the "localness" of the object. This was very
similar to the (old) java mapping. The inheritance heirarchy is as
follows
CORBA::LocalObject : CORBA::Object
abstract MyLocalObject : CORBA::Object
MyLocalObjectImpl : MyLocalObject, CORBA::LocalObject
The problem here is that there is no way for the ORB or the code
generators to enforce the last inheritance. And I am not even sure how
an ORB can detect the following case
MyLocalObjectImpl : MyLocalObject
which I suspect would be a very common error.
Proposal:
Fix the mapping to have the following heirarchy.
CORBA::LocalObject : CORBA::Object
abstract MyLocalObject : CORBA::LocalObject <===== Difference is here
MyLocalObjectImpl : MyLocalObject <== and here
Now an _is_a("IDL:omg.org/CORBA/LocalObject:1.0") is guaranteed to give
a correct answer and it is enforced by the IDL compilers.
This is also backward source compatible.the mapping says in section 1.1.2:
To avoid C++ compilation problems, every use in OMG IDL of a
C++ keyword as an identifier is mapped into the same name preceded
by the prefix "_cxx_." For example, an IDL interface named "try"
would be named "_cxx_try" when its name is mapped into C++.
For consistency, this rule also applies to identifiers that
are derived from IDL identifiers. For example, an IDL interface
"try" generates the names "_cxx_try_var" and "cxx_try_ptr,"
^^^^^^^^^^^
that is, the IDL compiler behaves as if the interface were
names "cxx_try" and then applies the normal mapping rules.
^ ^^^^^^^
Four issues here:
1) I think we have a typo at the first place I highlighed. I
believe it should be "_cxx_try_ptr". (The leading underscore
is missing in the text as it stands now.)
2) Typo: It should be '...were *named* "cxx_try"', not
'... were *names* "cxx_try"'
3) To state that the compiler behaves is if the interface were
named "cxx_try" doesn't explain where the additional leading
underscore comes from because we get _cxx_*, not cxx_*
for the mapped identifiers.
Unfortunately, changing this sentence to state that the compiler
behaves as if the interface were named "_cxx_try" won't fix
it, because the leading underscore would be dropped by the
IDL keyword escape mechanism.
4) The explanations are insufficient:
interface try {};
This will result in "_cxx_try" as the interface name. But what
about the generated _tc_ type code constant? It could be:
a) _cxx_tc_try
This mapping would be consistent with the statement that
the "_cxx_" is a *prefix*.
b) _cxx__tc_try
Same as above but, given that, normally, the _tc_ type code
constants already start with an underscore, the escaped
mapping results in a double underscore.
c) _tc_cxx_try
This mapping would be consistent with the directive to map
as if the type were named "cxx_try".
d) _tc__cxx_try
Same as above but preserves the underscore for both the
"_tc_" and the "_cxx_", resulting in a double underscore.
To me, interpretation (d) seems the most natural and intuitive because
it preserves the leading "_tc_" for all type code constants (including ones
for identifiers that are C++ keywords). Also, if the mapping of the type
is to "_cxx_try", then it makes sense to have the double underscore because
that is consistent and doesn't make an exception to the rule of "use
"_tc_" for type code constants and "_cxx_" for IDL identifiers that are
C++ keywords."
Proposal:
Rewrite the above para to read:
To avoid C++ compilation problems, every use in OMG IDL of a
C++ keyword as an identifier is mapped into the same name preceded
by the prefix "_cxx_." For example, an IDL interface named "try"
would be named "_cxx_try" when its name is mapped into C++.
For consistency, this rule also applies to identifiers that
are derived from IDL identifiers. For example, an IDL interface
"try" generates the names "_cxx_try_var," "_cxx_try_ptr,"
and "_tc__cxx_try".
On page 1-3 of the mapping, it says: For more information about CORBA compliance, refer to the Preface, "Definition of CORBA Compliance" on page viii. That preface hasn't existed for a long time now. Proposal: Strike this sentence.
he spec shows on page 1-13:
class A_var {
public:
// ...
operator const A_ptr&() const { return ptr_; }
operator A_ptr&() { return ptr_; }
// ...
};
The conversion operator is overloaded for const and non-const.
Now, two issues here:
1) It seems that "const A_ptr &" as the return type for the
first operator is wrong because it really means
"A * const", not "const A *". So, if anything, I think it
would have to be written as
operator const A * &() const { return ptr_; }
2) But why provide a const version of the conversion operator
at all? Object references are never passed with a const
qualifier, so why provide this conversion operator? I think
it could simply be deleted without affecting anything.
Proposal: Delete the const version of the conversion operator.
Opinions?
Resolution:
Replace
operator const A_ptr&() const { return ptr_; }
by
operator A_ptr() const { return ptr_; }
Suppose we have:
typedef fixed<4,3> FT;
interface I {
FT op();
};
Suppose the server does:
FT
I_impl::
op() throw(CORBA::SystemException)
{
double d = 1.0/3.0;
return CORBA::Fixed(d);
}
There are lots more digits in the return value than what is expected by the
client. What should be returned to the client. The rounded value? The
truncated value?
Similarly, what if we have:
double d = 10000000;
return CORBA::Fixed(d);
Do we return 9.999 to the client (which is the best we can do in this case)?
Of course, it is the responsibility of the programmer to make sure that
nonsense such as the second case doesn't happen. But the spec has to say
what happens if it does happen ;-)
Also, the first case will be very common -- what should happen in this case?
deferred in June 2011 to the next RTF
implementing support for wchar/wstring I ran into some potential problems with the UTF-8 encoding for the IDL 'char' type. Lets suppose we have a C++ server with a native single-byte code set like ISO 8859-1. The Code Set Conversion specification states that UTF-8 is the fallback code set for 'char'. -> a client could decide to send characters in UTF-8 encoding. What happens on the server side with UTF-8 encoded characters that use more than 1 byte and thus don't fit into the single byte character as specified by the C++ mapping for IDL type 'char'?
deferred in June 2011 to the next RTF
In the latest C++ mapping including RTF report changes (ptc/01-06-07) I see no mention of a mapping for CORBA::LocalObject. CORBA 2.4.x 3.7.6.2 states that this is to be specified in each language mapping. How does it get mapped and, in particular, what are it's memory management semantics and relevant methods?
The ORB interface destroy() operation defined in the core CORBA 2.3 spec seems to be missing from the associated C++ language mapping.
PortableServer::ValueRefCountBase derives from both CORBA::ValueBase and PortableServer::ServantBase. This create a problem because ValueBase contains virtual ValueBase * _add_ref() = 0; but ServantBase contains virtual void _add_ref(); The easy fix would appear to be to change the ValueBase version to return void. Anyone see a problem with this? (I don't understand why the ValueBase version currently returns a ValueBase * anyway. Any subtle reason for this that I am not aware of?)
Section 1.31.3 says: - In the C mapping, set_one_value used strings, while others used NamedValues containg any. Even though implementations need only support strings as values, the signatures now uniformly allow alternatives. I would suggest to delete the entire bullet point. In particular, the notion of allowing alternative data types as propery values for contexts doesn't work because the receiver expects a sequence of strings with an even number of elements; if anything but a string sequence is sent, the receiver has no chance of unmarshaling it.
The addition amounts to a set of typedefs that would facilitate template
programming, added to each C++ skeleton class created for an IDL interface,
and analogous to the typedefs that already exist in the mapping for the stub
side. Say we have an IDL file
module foo
{
interface bar {};
};
Then in generated code we're talking about something like:
namespace POA_foo
{
class bar
{
public:
typedef foo::bar _stub_type;
typedef foo::bar_ptr _stub_ptr_type;
typedef foo::bar_var _stub_var_type;
.
.
.
};
};
deferred in June 2011 to the next RTF
in ptc/01-06-07, 1.34.1, several operations seem to be missing in the Object interface, e. g. get_client_policy() get_policy_overrides() validate_connection() These are also missing in the Object C++ class, 1.34.2. create_request2() is also missing here.
Resolution: In 1.34.1, update the Object IDL to match the (pseudo) IDL in ptc/03-01-10. Add the corresponding C++ member functions to the C++ class in 1.34.2.
Just as we prohibited direct extraction from any any into a _var type due to the perils of memory management problems, we ought to prohibit extracting into _out types of variable sized structured types for the same reason
deferred in June 2011 to the next RTF
Name: Bruce McIntosh
Company: Boeing Australia
mailFrom: bruce.mcintosh@boeing.com
Notification: Yes
Specification: C++ Language Mapping
Section: 1.36.2
FormalNumber: ptc/01-06-07
Version: Proposed Available Revision
RevisionDate: 01/26/2002
Page: 1-136
The example given has a couple of small typographical problems: (1) the function signature specifies a void return type, but returns a Foo* (2) the function returns "foo_servant->this;" which I think should be "return foo_servant->_this();"
Perhaps the example should read:
Foo* some_function (/*...*/) { Servant_var<Foo_impl> foo_servant = new Foo_impl; foo_servant->do_something(); // might throw... some_poa->activate_object_with_id(...); return foo_servant->_this(); }
C++ programmers will often want to use strings as
object identifiers, the C++ mapping provides several conversion
functions that convert strings to ObjectId and vice-versa:"
The purpose is so the programmer can pick an arbitrary natural language
string and use it as an ObjectId, not so that the programmer can
generate a randomly unreadable string out of a binary ObjectId.
[...] the C++ mapping provides several conversion functions
that convert strings to ObjectId and viceversa:
[...]
If conversion of an ObjectId to a string would result in
illegal characters in the string (such as a NUL), the first two
functions throw the CORBA::BAD_PARAM exception.
The conversion algorithm is not specified, and the ORB is free to
choose whatever encoding it likes for its Object IDs. (Object IDs
in stringified form need not be moved across address spaces (or,
at least, not across ORB boundaries), so having a proprietary
encoding is perfectly OK.)
deferred in June 2011 to the next RTF
a discussion in comp.object.corba pointed out the difficulty
of testing whether a T_var has been initialized. There is
no _is_null() member function or some such. As a result,
calling operator->() appears to be the only way to test
whether a T_var is initialized:
if (T_var.operator->())
// It's initialized...
Not exactly elegant, but workable. However, the following
words in the spec get in the way:
"The overloaded operator-> returns the T* held by the T_var,
but retains ownership of it. Compliant applications may not
call this function unless the T_var has been initialized with a
valid non-null T* or T_var."
These words forbid me to call operator->() until after the
T_var has been initialized, meaning that there is no portable
and compliant way to test whether a T_var is nil. I think
what was meant here is that
"Compliant applications may not *dereference the return value
of this function* unless the T_var has been initialized with a
valid non-null T* or T_var."
BTW -- using operator->() to test for null is a bit obscure.
We could add a _is_null() member to T_var for this. But,
given the versioning confustion we'd cause and the fact
that adding the member provides only marginal benefit,
I think it may be better to leave things as they are. (But
we should fix the description of operator->(), of course.)Resolution: accept the proposal
There seems to be only two choices: 1. Accept that changing interfaces to local breaks old code that implemented POA interfaces using servants. Not wonderful, but I can live with it, since the source code changes are evident and fixed in a straightforward fashion. 2. Try to come up with a scheme where local objects can be implemented either by using LocalObject or by the traditional servant route. This is more specification work, but cleaner, and I an live with it too. While we are at it, we should make sure that any other CORBA 3.0 changes are properly reflected in the C++ mapping as well.
The bit that defines the mapping of local interfaces to C++ seems to be missing from the specification (ptc/99-10-09 has a change > based on the CCM specification, which does not appear in > ptc/01-06-07. )
So that means we do not have a standard C++ mapping for even CORBA 2.6, or 2.5 etc. let alone 3.0..... Sigh. So CORBA has pretty much become a single implementation language show.... Oh well. Any idea how soon this can be fixed? Or is this one of those that will take until the next decade to fix?:-) Perhaps we need to bring Bernard, the current chair into the loop (He should be on the cxx list and hence should come across this message. I wonder what C++ implementations of 2.6 are actually doing
The Core issue that adds get_orb to CORBA::Object has passed. It would be good if you were to initiate an issue in the C++ RTF to make the necessary changes in the C++ pseudo-object mapping section for Object to incorporate this new operation. While you are at it you might also wish to throw in the get_component operation, which was added by the Components specification, and is yet to get into the C++ mapping chapter (I think). These might be way easier tor esolve than some of the weightier issues that you have been struggling with, since these have very straightforward and non-controversial resolutions
This e-mail addresses three CORBA C++ Revision Task Force issues:
3796
3797
4530
It also addresses section 6.10.2 of your book, "Advanced CORBA
Programming with C++" ((C) 1999).
Starting with 6.10.2 of your book, p. 164, you show an example where a
CORBA::String_var is implicitly converted to 'const char *' in a
function call, with the conversion operators as defined on p. 157 (sect.
6.10).
However, the C++ language won't choose the 'const char *() const'
operator as you (and I) would think. Instead, since the String_var
isn't const in the call's scope, the 'char *()' (i.e., non-const)
operator is chosen.
Aparently, the conversion path
String_var -> char * -> const char *
Is considered "better" than the conversion path we'd expect, namely
String_var -> const String_var -> const char *
Further, updating String_var with the resolutions of Issues 3796 and
3797 (as found in http://cgi.omg.org/issues/cxx_revision.html), namely
removing 'operator char *()' and adding 'operator char *&()' now leads
to the conversion path
String_var -> char *& -> const char *
The 'const char *' operator is still bypassed, and with 'operator char
*&()' in the picture, it seems trouble is more likely.
For reference, take a look at the USENET newsgroup comp.std.c++, the
thread of "Subject: Implicit conversion of g++", starting 2000/03/02 (I
know that long URL's don't e-mail well, but...
http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&threadm=p6qr
9dsxi04.fsf%40informatik.hu-berlin.de&rnum=1&prev=/groups%3Fhl%3Den%26lr
%3D%26ie%3DUTF-8%26oe%3DUTF-8%26selm%3Dp6qr9dsxi04.fsf%2540informatik.hu
-berlin.de)
For reference, I've attached a little source-code. Imagine that the
class is String_var. This program produces identical results under two
compilers:
- Microsoft's Visual C++ 6.0 (SP3)
- CygWin's gcc v3.2
Though the String_var implementations I've seen aren't adversely
affected, I wanted to bring this compiler behavior to your attention. I
think the CORBA & C++ folks should eventually know, too, since CORBA and
C++ seem to miss each other here.
Resolution: Add const char * operator() to String_var
The question is about 99-07-41.pdf, as far as I know the latest C++ mapping specification. "1.41.5 Any Class" prescribes "Boolean operator>>=(const Any&, const char*&);" for unbounded strings, and "1.16.3 Extraction from any" says that unbounded strings are extracted by value. This seems to be contradictory: I seem to remember that const char* cannot be delete'd, though I don't find it in ISO/IEC 14882:1998(E). But, regardless of anything imposed by C++, the current mapping precludes a safe technique like (safe as in exception-proof): >> String_var theString; if(!(theAny>>=theString.out())){ ... } << I therefore propose that the mapping be changed to "Boolean operator>>=(const Any&, char*&);". This seems to work all right on my implementation (RayORB), for gcc 3.2 (MS VC++ 6.0 doesn't seem to care one way or the other, but I suppose that is wrong, although I'm not entirely sure).
deferred in June 2011 to the next RTF
1.9.1 says: "The copy constructor deep-copies any data pointed to by the T_var constructor parameter. This copy will be destroyed when the T_var is destroyed or when a new value is assigned to it. Compliant implementations may, but are not required to, utilize some form of reference counting to avoid such copies." and "The normal assignment operator deep-copies any data pointed to by the T_var assignment parameter. This copy will be destroyed when the T_var is destroyed or when a new value is assigned to it. Assigning a null pointer to a T_var is legal and results in deallocation of the data pointed to by the T_var." So my question is, is it legal to use ValueBase::_add_ref() and _remove_ref() instead of _copy_value() in this instance when T_var is representing a valuetype?
deferred in June 2011 to the next RTF
Since the Any constructor from type code, void* value and boolean release flag has been eliminated, there is no longer any portable way to create an OUT argument for a DII request, without also assigning a value to it. I propose either a constructor from type code or changing the behavior of the type code set method to always succeed if the Any's TCKind is tk_null.
deferred in June 2011 to the next RTF
Footnote 11 on page 1-48 of the 1.1 version of the C++ language mapping states that sequence _var classes don't have a const version of "operator []". The justification in the footnote is incorrect. This footnote should be removed, and the operator provided, since it otherwise prevents accessing sequence members through a const reference to a sequence _var.
deferred in June 2011 to the next RTF
The second-to-last paragraph of section 1.17.10.3 says "For valuetypes that have no operations or initializers, a concrete type-specific factory class is generated whose implementation of the create_for_unmarshal function simply constructs an instance of the OBV_ class for the valuetype using new and the default constructor." As specified, that requires the generation of invalid C++. The OBV_ class is abstract since it does not have implementations of the ValueBase reference counting functions. Perhaps the intention is that the OBV_ classes in such cases should derive from DefaultValueRefCountBase. However, the wording and explanation in section 1.17.6 explicitly forbids this: "Note that it is the application-supplied concrete valuetype classes that must derive from these mix-in classes, not the valuetype classes generated by the IDL compiler." One solution that avoids the problem, and avoids restricting the application's use of the OBV_ classes is to generate yet another class that derives from both the OBV_ class and DefaultValueRefCountBase, for instantiation by the _init class's create_for_unmarshal function.
deferred in June 2011 to the next RTF
Althrough I report my issue as a C++ issue, actually it is a common issue for other languages also. In current CORBA standard, a activated CORBA Servant object in the POA is shared by all the clients. But in many applications, a client connects to the server and calls some CORBA object methods to create a lot of connection related CORBA objects. Normally, the client will call "destroy" method of these CORBA object to destroy them before existing. But if the client exists abnormally, these created CORBA object will never be destroyed and never be used by any client. We can call this kind of CORBA object as "floating" CORBA object. The CORBA server application runs longer, the "floating" CORBA objects becomes more. And eventually, these "floating" CORBA objects will consume all the memory resources/CPU resources, then the CORBA server crashes and has to be restarted. The "floating" CORBA objects problem at the server side is not easy to be solved. For this problem, if the CORBA standard provides a method to solve it, the CORBA server will run more robust. Actually, the underlying network connection broken can be detected very effectively and rapidly. The CORBA server just simply ignores the network connection lost event and does not pass it to activated CORBA object even if the CORBA object is connection related object because current CORBA standard thinks that all the CORBA objects in the server are shared to all clients. If the server can notify the network connection lost event to the connection related CORBA objects, the developper can do the clean job on it. A simple method can solve the "floating" CORBA object problem. It is not required to add any new interface or data structure to current orb.idl. It is just required to add some new language mapping methods at server side only. I will give an example in C++ to show this simple method. A IShared,IConnSpec and IOtherConnectionSpec interfaces are defined below: interface IOtherConnectionSpec { ... } interface IConnectionSpec { IOtherConnectionSpec someMethod(); } interface IShared { IConnectionSpec createConnSpec( in string param ); }; These interfaces will be used in this example. 1) the IShared will be shared by all the clients, it is activated like this: SharedImpl sharedImpl( ... ); ... sharedImpl._this(); 2) add new mapping method for the "POA_IShared::createConnSpec()" like this: IConnectionSpec_ptr POA_IShared::createConnSpec( char* param, const ConnectionContext& connCtx ); In this method, a parameter named ConnectionContext that represents the connection between the client and server is added. This method has a default implementation like this: IConnectionSpec_ptr POA_IShared::createConnSpec( const char* param, const ConnectionContext& connCtx ){ //just ignore the connCtx like the current CORBA standard defines return createConnSpec( param ); } 3) If the user wants to create a connection related object, he/she must overload the "IConnectionSpec_ptr createConnSpec( char* param, const ConnectionContext& connCtx )" method and active the object with "this_( const ConnectionContext& connCtx )" method: IConnectionSpec_ptr POA_IShared::createConnSpec( const char* param, const ConnectionContext& connCtx ){ ... IConnectionSpec *connSpecImpl = new IConnectionSpec( ... ); ... //use the connection related active method return connSpecImpl->this_( connCtx ); } in this method, the user uses the "this_( const ConnectionContext& connCtx)" method instead of the old "this()"" method to active the CORBA object. This activated CORBA object becomes a connection related object instead of shared object. Note: User can use the "this_( const ConnectionContext& connCtx)" method to active a shared object also. At this time, the ConnectionContext is a global variable "NO_CONNECTION_CONTEXT". 4) add a new mapping method named "getConnectionContext()" for every CORBA object. const ConnectionContext& IShared::getConnectionContext(); const ConnectionContext& POA_IConnectionSpec::getConnectionContext(); In this way, the IConnectionSpec can create and activate any other connection related CORBA object like this: IOtherConnectionSpec_ptr POA_IConnectionSpec::someMethod() { ... OtherConnectionSpecImpl *otherConnSpecImpl = new OtherConnectionSpecImpl(...); ... return otherConnSpecImpl->this_( getConnectionContext() ); //or ? //return otherConnSpecImpl->this_( this ); } 5) add a new mapping method named "connectionLost()" for every CORBA object. When the network connection is lost, the CORBA server should find all the CORBA object associated with this network connection and call their "connectionLost()" method. The "connectionLost()" and its default implementation is listed below: void POA_IConnectionSpec::connectionLost() { //just delete this connection related object simply delete this; } void POA_IOtherConnectionSpec::connectionLost() { //just delete this connection related object simply delete this; } Because the SharedImpl object that created in the 1) step does not assicate with any connection, its "connectionLost()" method will not be called for ever.
deferred in June 2011 to the next RTF
In section 4.5.4 it says: Unlike _duplicate, the parameter to _narrow is a reference of an object of any interface type (Object_ptr). If the actual (runtime) type of the parameter object can be widened to the requested interface’s type, then _narrow will return a valid object reference; it should say (widened to narrowed) Unlike _duplicate, the parameter to _narrow is a reference of an object of any interface type (Object_ptr). If the actual (runtime) type of the parameter object can be narrowed to the requested interface’s type, then _narrow will return a valid object reference;
I was looking at the OMG IDL to C++ mapping specification, specifically
page 123 and came across the below. It looks to me that their
implementation in the spec is NOT correct. Shouldn't the swap function
take the "tmp" Servant_var?
Servant_var& operator=(Servant* p)
{
if (_ptr != p) {
Servant_var<Servant> tmp = p;
swap(_ptr, p);
}
return *this;
}
Servant_var&
operator=(const Servant_var& b)
{
if (_ptr != b._ptr) {
Servant_var<Servant> tmp = b;
swap(_ptr, b._ptr);
}
return *this;
}
The spec defines: // C++ class Seq_var; class Seq { public: typedef Seq_var _var_type; // ... }; We propose to extend this to the following to make it possible to write more generic C++ code. // C++ class Seq_var; class Seq_out; class Seq { public: typedef Seq_var _var_type; typedef Seq_out _out_type: typedef ::CORBA::ULong _size_type; // ... };
the C++ mapping should explicitly list operator == and operator != in the examples and text. If it is not allowed to use ==/!= the methods should be declared private
The C++ keywords in section 4.47 should be updated and extended with the addition of C++0x
To really support template meta programming the inteface should deliver a typedef _out_type besides the already defined _ptr_type and _var_type
To really support template meta programming the valuetype classes should deliver a typedef _out_type besides the _ptr_type and _var_type which are proposed to be added as part of issue 1794
The Object::get_policy returns a Policy in IDL, not a Policy_ptr, that is the C++ return value
In IDL it gives:
// IDL
valuetype V {
factory create_bool(boolean b);
factory create_(char c);
factory create_(octet o);
factory create_(short s, string p);
...
};
But it should be
// IDL
valuetype V {
factory create_bool(boolean b);
factory create_char(char c);
factory create_octet(octet o);
factory create_other(short s, string p);
...
};need an _unchecked_narrow static operation that is similar to the _narrow. It will take in an object pointer but unlike _narrow will not check for compatibility before creating a new object reference.