The Portability Addendum section below contains resolutions of certain Portability related items that could not be resolved in the Portability RTF due to logistical problems and were moved to the Core RTF for finalizing their adoption.
A companion set of chapter drafts with the editing changes are being produced by Jishnu Mukerji, incorporating changes from this RTF and the other RTFs (Interop, Portability, OBV, IDL to Java and Java to IDL), that impact chapters 1 through 6, and 8. Changes from this RTF that impact chapter 13 will be editorially incorporated into that chapter by the editor of the Interop RTF (Tom Rutt). Changes from this RTF that impact Chapter 7 will be editorially incorporated into that chapter by the editor of the Portability RTF (Dan Frantz). The changes to the Time Service chapter will be editorially incorporated by Jishnu Mukerji
The new version of these document will be available by August 20, 1998. First drafts for review and comment will be available by August 10th.
Issue 116: Typecodes
for recursive sequences (orb_revision)
Issue 128: ServerRequest::op_def()
(orb_revision)
Issue 156: Apparent
error in CORBA 2.0 Interoperability (orb_revision)
Issue 300: Recursive
sequence TypeCodes (orb_revision)
Issue 396: 4.2.1 create_request
Paragraph 8 - comment (orb_revision)
Issue 397: 4.2.2 add_arg
Paragraph 5-comment (orb_revision)
Issue 399: 4.6 Context
Object Operations, Para 2 - objection (orb_revision)
Issue 400: 4.3.1 sen3
- comment 23 - comment (orb_revision)
Issue 402: 4.6.2 set_on_value
Paragraph 2 - objection (orb_revision)
Issue 403: 4.6.3 set_values
(orb_revision)
Issue 404: 4.6.4 get_values
Paragraph 2 - objection (orb_revision)
Issue 405: 4.6.4 get_values
Paragraph 4 - objection (orb_revision)
Issue 406: 4.6.4 get_values
Paragraph 5 - objection (orb_revision)
Issue 408: 4.6.5 delete_values
Paragraph 3 - objection (orb_revision)
Issue 409: 4.6.7 delete
Paragraph 4 - objection (orb_revision)
Issue 429: 6.5.4 Container
Paragraph 10 - comment (orb_revision)
Issue 430: 6.5.4 Container
Paragraph 11 - comment (orb_revision)
Issue 431: 6.5.4 Container
Paragraph 12 - comment (orb_revision)
Issue 435: 6.5.6 Repository
Paragraph 4 - comment (orb_revision)
Issue 437: 6.5.8 ConstantDef
Interface Paragraph 2 - comment (orb_revision)
Issue 438: 6.5.10
StructDef Last paragraph - comment (orb_revision)
Issue 439: 6.5.11
UnionDef Last Paragraph - comment (orb_revision)
Issue 440: 6.5.20
AttributeDef Paragraph 2 - comment (orb_revision)
Issue 443: 6.6.1 OMG
IDL Format Paragraph 5 - comment (orb_revision)
Issue 444: 6.6.4 Pragma
Directives for RepositoryId Para 1 - objection (orb_revision)
Issue 446: 6.7.1 The
TypeCode Interface All Paragraphs - objection (orb_revision)
Issue 447: 6.7.1 The
Type Code Interface Paragraph 4 - comment (orb_revision)
Issue 472: Version
in Contained and RepositoryId formats (orb_revision)
Issue 473: Version
in Contained and RepositoryId formats (orb_revision)
Issue 545: Enums and
enumerators (orb_revision)
Issue 568: inherit
vs. include (orb_revision)
Issue 571: Question
about IDL grammar (orb_revision)
Issue 595: Section
16.7: only C++ mapping defines string_free and string_dup (orb_revision)
Issue 596: request()
should be added to IDL (section 17.13.2) (orb_revision)
Issue 604: Section
7.2: get_implementation function (orb_revision)
Issue 609: TCKind
enum should be updated (orb_revision)
Issue 610: create_exception()
is declared outside any interface scope (orb_revision)
Issue 611: Syntax
for basic types must be updated (orb_revision)
Issue 623: Section
7.8: editorial (orb_revision)
Issue 624: Section
3.7.2: take new IDL type extensions into account (orb_revision)
Issue 641: Do identifiers
and keywords clash if they differ in case? (orb_revision)
Issue 665: TypeCode
equality (orb_revision)
Issue 666: Native
types with respect to typecodes, DII, DSI,Interface Reposit. (orb_revision)
Issue 724: Non ASCII
alphabetics in IDL identifiers (orb_revision)
Issue 725: Octet and
enum constants (orb_revision)
Issue 726: Figure
2-2 in CORBA 2.0 and CORBA 2.1 (orb_revision)
Issue 753: Inheriting
exceptions in IDL (orb_revision)
Issue 754: Minor bug
in 2.1 spec (orb_revision)
Issue 776: CORBA 2.1
IR Structdef typo (orb_revision)
Issue 783: IDL types
are ambiguous with inheritance (orb_revision)
Issue 884: Appendix
B lists incorrect CORBA Components IDs (orb_revision)
Issue 903: Ambiguity
in non_existent() specification (orb_revision)
Issue 910: #pragma
processing (orb_revision)
Issue 912: Inheritance
of Exceptions (orb_revision)
Issue 913: defined_in
member of ModuleDescription for top-level module (orb_revision)
Issue 916: Resetting
#pragma prefix? (orb_revision)
Issue 918: CORBA::Contained::describe()
underspecified (orb_revision)
Issue 992: CORBA 2.2
- "native" and the interface repository (orb_revision)
Issue 999: #pragma
prefix issue (orb_revision)
Issue 1054: Marshalling
is_equivalent (orb_revision)
Issue 1066: Fixed
point constant typo in 2.2 (orb_revision)
Issue 1067: Wide
character and wide string literals (orb_revision)
Issue 1068: Fixed
point constants issue (orb_revision)
Issue 1071: Type
of fixed point quotients (orb_revision)
Issue 1074: Typo
in type code section (13.3.4) (orb_revision)
Issue 1086: How to
deal with object identity (orb_revision)
Issue 1087: IDl "module"
construct - IDL files (orb_revision)
Issue 1088: ORB_init
(orb_revision)
Issue 1091: Editorial
issue, chapter 8 (orb_revision)
Issue 1094: Indentation
on page 4-4 (orb_revision)
Issue 1146: Semantics
and standard exceptions (orb_revision)
Issue 1241: / in
prefix pragma? (orb_revision)
Issue 1258: Type
code constants are not defined/mentioned in OBV spec (obv-rtf)
Issue 1394: Typos
in IR IDL in spec (01) (orb_revision)
Issue 1395: Typos
in IR IDL in Specification (02) (orb_revision)
Issue 1396: Typos
in IR IDL in Specification (03) (orb_revision)
Issue 1397: Typos
in IR IDL in Specification (04) (orb_revision)
Issue 1398: Typos
in IR IDL in Specification (050 (orb_revision)
Issue 1422: Does
the DII support the standard object operations? (orb_revision)
Issue 1541: Type
code typos (as only one issue) (orb_revision)
Issue 1542: Type
code operations under-specified (orb_revision)
Issue 1543: Type
code parameter ordering (orb_revision)
Issue 1545: Type
codes cannot describe all unions (orb_revision)
Issue 1612: Description
of Wide String type (orb_revision)
Issue 1688: Illegal
IDL in CosTime module (orb_revision)
The create_recursive_sequence_tc operation is used to create TypeCodes
describing recursive sequences. The result of this operation is used
in
constructing other types, with the offset parameter determining which
enclosing TypeCode describes the elements of this sequence. For
instance, to construct a TypeCode for the following OMG IDL structure,
the offset used when creating its sequence TypeCode would be one:
struct foo {
long value;
sequence <foo> chain;
};
with:
The create_recursive_sequence_tc operation is used to create TypeCodes
describing recursive sequences that are members of structs or unions.
The result of this operation should be used as the typecode in the
StructMemberSeq or UnionMemberSeq arguments of the create_struct_tc
or
create_union_tc operations. The offset parameter specifies which
enclosing struct or union is the target of the recursion, with the
value
one indicating the most immediate enclosing struct or union, and larger
values indicating successive enclosing struct or unions. For
example,
the offset would be one for the following IDL structure:
struct foo {
long value;
sequence <foo> chain;
};
Once the recursive sequence TypeCode has been properly embedded in its
enclosing TypeCodes, it will function as a normal sequence TypeCode.
Invoking operations on the recursive sequence TypeCode before it has
been embedded in the required number of enclosing TypeCodes will result
in undefined behavior.
Actions taken: Incorporate proposed text in 2.3 and close issue
September 13, 1996: Received issue
Section 5.6.5 delete_values
CORBA::BAD_PARAM
if attribute is an empty string.
CORBA::BAD_CONTEXT if no
matching attributes to be deleted
were found.
Section 5.6.7 delete
CORBA::BAD_PARAM
if there are one or more child context objects and the
CTX_DELETE_DESCENDENT flag is not set
Actions to be taken: incorporate change in 2.3 and close issues 404,
406, 407, 408, 409
November 26, 1996: received issue
"Conforming IDL compilers may support additional non-standard pragmas,
but must not refuse to compile IDL source containing non-standard
pragmas that are not understood by the compiler."
Actions taken: Incorporate proposed text in 2.3 and close issue.
November 26, 1996: received issue
--------------------------------------------------------------------------------
In section 3.8.2 following to the paragraph describing the any type:
An any logically contains a TypeCode (see 8.7) and a value that is
described by the TypeCode. Each IDL language mapping provides
operations that allow programers to insert and access the TypeCode
and
value contained in an any.
--------------------------------------------------------------------------------
Add the following operations to the TypeCode interface definition in
both sections 8.7 and 8.8, right after the equal operation:
...
interface TypeCode {
...
boolean equivalent(in TypeCode
tc);
TypeCode get_compact_typecode();
....
};
--------------------------------------------------------------------------------
Add the following text to section 8.7 right after the description of
the
equal operation:
The equivalent operation is used by the ORB when determining type
equivalence for values stored in an IDL any. TypeCodes are considered
equivalent based on the following semantics:
a) if the result of the kind operation on either TypeCode is tk_alias,
recursively replace the TypeCode with the result of calling
content_type, until the kind is no longer tk_alias.
b) If results of the kind operation on each typecode differ, equivalent
returns false.
c) If the id operation is valid for the TypeCode kind, equivalent
returns true if the results of id for both TypeCodes are non-empty
strings and both strings are equal. If both ids are non-empty
but are
not equal, then equivalent returns false. If either or both id
is an
empty string, or the TypeCode kind does not support the id operation,
equivalent will perform a structural comparison of the TypeCodes by
comparing the results of the other TypeCode operations in steps d
through g. The structural comparison only calls operations that
are
valid for the given TypeCode kind. If any of these operations
do not
return equal results, then equivalent returns false. If all comparisons
are equal, equivalent returns true.
d) The results of the name and member_name operations are ignored
and
not compared.
e) The results of the member_count, default_index, length, digits and scale operations are compared.
f) The results of the member_label operation for each member index
of a
union TypeCode are compared for equality. Note that this means
that
unions whose members are not defined in the same order are not
considered structurally equivalent.
g) The results of the discriminator_type and member_type operations
for each member index, and
the result of the content_type operation are compared by recursively
calling equivalent.
Applications that need to distinguish between a type and different
aliases of that type can supplement equivalent by directly invoking
the
id operation and comparing the results.
The get_compact_typecode operation strips out all optional name &
member
name fields, but it leaves all alias typecodes intact.
--------------------------------------------------------------------------------
Add the following operation to the Repository interface in section 8.5.6
as well as section 8.8, right after the lookup_id operation:
interface Repository {
...
TypeCode get_canonical_typecode(in
TypeCode tc);
};
--------------------------------------------------------------------------------
Add the following paragraph to section 8.8, right after the description
of the lookup_id operation:
The get_canonical_typecode operation looks up the TypeCode in the
Interface Repository and returns an equivalent TypeCode that includes
all repository ids, names, and member_names. If the top level
TypeCode
does not contain a RepositoryId, such as array and sequence TypeCodes,
or TypeCodes from older ORBs, or if it contains a RepositoryId that
is not
found in the target Repository, then a new TypeCode is constructed
by
recursively calling get_canonical_typecode on each member TypeCode
of
the original TypeCode.
--------------------------------------------------------------------------------
Change the last paragraph of the description of the DynAny::assign
operation, section 7.2.3 to:
If an invalid DynAny object is passed (a DynAny with a typecode that
is
not equivalent or doesn't contain a meaningful value), the Invalid
exception is returned.
--------------------------------------------------------------------------------
Change the last paragraph of the description of the DynAny::from_any
operation, section 7.2.3 to:
If an invalid any is passed (an any with a typecode that is not
equivalent, or hasn't been assigned a value) the Invalid exception
is
returned.
--------------------------------------------------------------------------------
Add the following paragraph right after the third paragraph of
description of the "Accessing a value of some basic type in a DynAny
object" in section 7.2.3:
A type is consistent for inserting or extracting a value if its TypeCode
is equivalent to the TypeCode contained in the DynAny.
--------------------------------------------------------------------------------
Add the following paragraph to the description of the
DynAny::current_component operation in section 7.2.3, right after the
first paragraph:
The TypeCode of the component DynAny is the corresponding member_type
or
component_type of the TypeCode of the parent DynAny.
--------------------------------------------------------------------------------
Actions to be taken: incorporate changes in 2.3 and close issue.
August 11, 1997: received issue
May 12, 1998: issue moved from port-rtf to orb_revision
Here are the proposed extensions to allow native types in the IR.
Our
current position on DII/DSI with native types is
that it should not be allowed.
The proposed IR changes are as follows:
Revised Text:
A new definition kind is added called dk_Native:
enum DefinitionKind {
dk_none, dk_all,
dk_Attribute, dk_Constant, dk_Exception, dk_Interface,
dk_Module, dk_Operation, dk_Typedef,
dk_Alias, dk_Struct, dk_Union, dk_Enum,
dk_Primitive, dk_String, dk_Sequence, dk_Array,
dk_Repository, dk_Wstring, dk_Fixed,
// OBV dks go here
dk_Native // value = 23 accomodating OBV changes
};
A new create operation is added, called create_native:
module CORBA {
...
interface NativeDef;
interface Container: IRObject
{
....
NativeDef create_native(
in RepositoryId id,
in Identifier name,
in VersionSpec version
);
...
};
...
};
A new interface called NativeDef is also added, which defines
no additional operations.
module CORBA {
...
interface NativeDef: TypedefDef
{
};
...
};
Additional changes to incorporate the tk_native typecode:
1. In section 8.7.1 add tk_native to the declaration of enum TCKind as the last tk.
2. Add tk_native to the list of tks in comment that apply to the id() and the name() operations in their IDL declaration.
3. In the fourth para following the IDL in Section 8.7.1, the para that begins "The id operation...", in the first sentence, replace the phrase "alias, and exception" by the phrase "alias, exception and native".
4. In the fifth para following the IDL in Section 8.7.1, the para that begins "The name operation...", in the first sentence, replace the phrase "alias, and exception" by the phrase "alias, exception and native".
5. In table 8-1 add the line:
native native-id native-name
6. In Section 8.7.3, section 8.8, and section 4.1 append the following
to the ORB interface IDL:
TypeCode create_native_tc(
in RepositoryId id,
in Identifier name
);
7. Add tk_native to table 13-2 and add associated text in Chapter 13.
Actions to be taken: Incorporate proposed text and close issue.
August 11, 1997: received issue
May 12, 1998: issue moved from port-rtf to orb_revision
Section 3.2 last paragraph: Replace the paragraph with the following:
"OMG IDL uses the ASCII character set, except for string literals
and character literals, which use the ISO Latin-1 (8859.1) character
set. The ISO Latin-1 character set is divided into alphabetic
characters (letters)
digits, graphic characters, the space (blank) character, and formatting
characters.
Table 3-2 shows the ISO Latin-1 alphabetic characters; upper and lower
case
equivalences are paired. The ASCII alphabetic characters
are shown in the left-hand column of Table 3-2."
Section 3.2.3: First Paragraph: replace by:
"An identifier is an arbitrarily long sequence of the ASCII alphabetic, digit, and underscore ("_") characters. The first character must be ASCII alphabetic. All characters are significant."
Section 3.2.3 bullet list: Remove the second bullet item.
Actions taken: Incorporate proposed changes and close issue
September 17, 1997: received issue
Add
<const_type> ::=
| <octet_type>
to the existing alternatives. There is no need to make a change
for enums here because <scoped_name> is already a legal alternative.
Similarly, we need not make a change to the productions for <const_exp>,
because <primary_expr> already permits a <scoped_name> as the
value
of a constant.
Page 3-18:
Add the same <octet_type> alternative to the production for
<const_type>.
Section 3.7.2, page 3-20:
Change the first sentence to read:
The <scoped_name> in the
<const_type> production must be a
previously defined name
of an <integer_type>, <char_type>,
<wide_char_type>, <boolean_type>,
<floating_pt_type>,
<fixed_pt_const_type>,
<string_type>, <wide_string_type>,
<octet_type>, or <enum_type>
constant.
[ While we are at it, there is a typo in <wide_ char_type> -- there
is
an extraneous space here that needs to be deleted. ]
End of section 3.7.2:
Add the following text to the end of the section:
An octet constant can be
defined using an integer literal
or an integer constant expression,
for example:
const octet O1 = 0x1;
const long L = 3;
const octet O2 = 5 + L;
Values for an octet constant
outside the range 0 - 255 shall
cause a compile-time error.
An enum constant can only
be defined using a scoped name for the
enumerator. The scoped name
is resolved using the normal
scope resolution rules (XREF).
For example:
enum Color { red, green,
blue };
const Color FAVOURITE_COLOR
= red;
module M {
enum Size { small, medium, large };
};
const M::Size MYSIZE = M::medium;
The constant name for the
RHS of an enumerated constant definition
must denote one of the enumerators
defined for the enumerated
type of the constant. For
example:
const Color col = red;
// is OK but
const Color another = M::medium;
// is an error
Actions to be taken: Incorporate change and close issue
September 17, 1997: received issue
The fundamental reason why multiple inheritence can work for
interfaces, but not for exceptions is that interfaces are abstract,
without any
visible data storage, but exceptions are concrete types with visible
data storage. To allow multiple inheritence of exceptions when
mapping to
a language like C, would require that the exception layout be explicitly
visible to the programmer, using a mechanism similar to C++ handling
of virtual base classes. This solution would be very messy and
make
programming with exceptions very difficult for those languages.
Revised Text:
Actions taken: Propose close issue with no change with the above
explanation.
October 23, 1997: received issue
Change Production 80 to remove <fixed_pt_type> as a valid parameter type:
<param_type_spec> ::= <base_type_spec>
| <string_type>
| <wide_string_type>
| <fixed_pt_type>
| <scoped_name>
Also add the missing production on page 3-19:
<fixed_pt_const_type> ::= "fixed"
Rational:
Leaving this in causes problems with the C++ binding in the same way
that the grammar from CORBA 1.1 and earlier had problems with
sequences and arrays as parameters. This is also likely to cause
problems with the Ada binding, since each fixed point declaration is
mapped to a distinct Ada type.
Part 2: Fix the grammar for fixed point constants [Resolves #1066]
Change the first paragraph of section 3.7.2 to read:
The <scoped_name> in the <const_type> production must be a previously
defined name of an <integer_type>, <char_type>, <wide_ char_type>,
<boolean_type>, <floating_pt_type>, <string_type>, or
<wide_string_type> constant.
Also, change the "3000.00" in the example of fixed point digits and
scale to "3000.00D".
Rational:
Fixed point constants are defined using the syntax "fixed", not
"fixed<d,s>", while fixed point types are defined using the later
syntax. So there is no way for a <scoped_name> to refer to
a
<fixed_pt_const_type>.
Part 3: Modify the paragraph at the top of 3-21 to read:
A quotient may have an arbitrary number of decimal places, denoted by
a scale of s inf . The computation proceeds pairwise, with the usual
rules for left-to-right association, operator precedence, and
parentheses. All intermediate computations should be performed using
double precision (i.e. 62 digit) arithmetic. If an individual
computation between a pair of fixed-point literals actually generates
more than 31 significant digits, then a 31-digit result is retained
as
follows:
Rational: This change is to make sure that all IDL compilers
calculate the results of fixed-point constants the same way, so as
not
to break interoperability.
Part 4: Reword the description of Fixed Type in section 3.8.3 to be:
The fixed data type represents a fixed-point decimal number of up to
31 significant digits. The scale factor is a non-negative integer less
than or equal to the total number of digits (note that constants with
effectively negative scale, such as 10000, are always permitted).
The fixed data type will be mapped to the native fixed point
capability of a programming language, if available. If there
is not a
native fixed point type, then the IDL mapping for that language will
a
fixed point data type. Applications that use the IDL fixed point
type
across multiple programming languages must take in to account
differences between the languages in handling rounding, overflow, and
arithmetic precision.
Rational:
If these values of scale are not universally supported by language
bindings, then they are not portable, and so should not be supported
by IDL.
The Smalltalk, Ada, Cobol and Java languages already contain a native
fixed point facility. To define a separate IDL fixed point capability
for these languages would be redundant and interfere with integrating
legacy code.
Revised Text:
1. Change Production 80 to remove <fixed_pt_type> as a valid parameter
type:
<param_type_spec> ::= <base_type_spec>
| <string_type>
| <wide_string_type>
| <fixed_pt_type>
| <scoped_name>
Also add the missing production on page 3-19:
<fixed_pt_const_type> ::= "fixed"
2. Change the first paragraph of section 3.7.2 to read:
The <scoped_name> in the <const_type> production must be a previously
defined name of an <integer_type>, <char_type>, <wide_ char_type>,
<boolean_type>, <floating_pt_type>, <string_type>, or
<wide_string_type> constant.
Also, change the "3000.00" in the example of fixed point digits and
scale to "3000.00D".
3. Modify the paragraph at the top of 3-21 to read:
A quotient may have an arbitrary number of decimal places, denoted by
a scale of s inf . The computation proceeds pairwise, with the usual
rules for left-to-right association, operator precedence, and
parentheses. All intermediate computations should be performed using
double precision (i.e. 62 digit) arithmetic. If an individual
computation between a pair of fixed-point literals actually generates
more than 31 significant digits, then a 31-digit result is retained
as
follows:
4. Reword the description of Fixed Type in section 3.8.3 to be:
The fixed data type represents a fixed-point decimal number of up to
31 significant digits. The scale factor is a non-negative integer less
than or equal to the total number of digits (note that constants with
effectively negative scale, such as 10000, are always permitted).
The fixed data type will be mapped to the native fixed point
capability of a programming language, if available. If there
is not a
native fixed point type, then the IDL mapping for that language will
a
fixed point data type. Applications that use the IDL fixed point
type
across multiple programming languages must take in to account
differences between the languages in handling rounding, overflow, and
arithmetic precision.
Actions to be taken: incorporate changes in 2.3 and close this
issue and 1066.
October 21, 1997: received issue
Insert the following para after para 1:
Probing for object non-existence
may require contacting
the ORB that implements
the target object. If an attempt
to contact the target object
fails and therefore, no reliable
determination can be made,
non_existent raises whatever exception
was raised by the remote
ORB to the application code. This is
necessary to enable an application
to distinguish between the
true, false, and indeterminate
cases.
Actions to be taken: incorporate revised text and close issue.
January 13, 1998: received issue
The fundamental reason why multiple inheritence can work for
interfaces, but not for exceptions is that interfaces are abstract,
without any
visible data storage, but exceptions are concrete types with visible
data storage. To allow multiple inheritence of exceptions when
mapping to
a language like C, would require that the exception layout be explicitly
visible to the programmer, using a mechanism similar to C++ handling
of virtual base classes. This solution would be very messy and
make
programming with exceptions very difficult for those languages.
Revised Text:
Actions taken: Prpose close issue with above resolution and no change.
January 22, 1998: received issue
However, a Container that is not a Contained, i.e. a Repository, does not have any id attribute and presumably, thus, has no RepositoryId. For instance, there is no way to get the RepositoryId of a Repository, if it had one (which I presume it does not). That is, id is an attribute of Contained, not of Container.
This problem occurs not only for ModuleDef, but also for InterfaceDef, TypeDef, ExceptionDef, ConstantDef, i.e. things that can be placed in the top level Repository.
Probably the simplest fix would be to declare that the repositoryID
of the Repository is an empty
string and use that value for the defined_in field of the Def
structures.
Revised Text:
Add the following paragraph immediately following the first paragraph
of section 8.5.6 pp 8-16
"Since Repository derives only from Container and not from Contained, it does not have a RopositoryId associated with it. By default it is deemed to have the RepositoryId "" (the empty string) for purposes of assigning a value to the defined_in field of the definition structure of ModuleDef, InterfaceDef, TypeDef, ExceptionDef and ConstantDef that are contained immediately in the Repository object".
Actions to be taken: Incorporate change in 2.3 and close issue
January 21, 1998: received issue
" The 'kind' field of the returned Description struct shall give the DefinitionKind for the most derived type of the object."
Append after the last sentence of the same paragraph: "The kind field in this must contain dk_attribute and not the kind of any IRObject from which the attribute object is derived. For example returning dk_all would be an error."
Actions to be taken: incorporate proposed change in 2.3 and close
issue.
January 25, 1998: received issue
Add the following text at the end of the intro to section 8.6 (before
section 8.6.1:
Since new repository ID formats may be added from time to time,
compliant IDL compilers must accept any string value
of the form
"<format>:<string>" provided as the argument
to the id pragma and
use it as the repository ID. The OMG maintains
a registry of
allocated format identifiers. The <format>
part of the ID may not
contain a colon (:) character.
The version and prefix pragmas only affect default
repository IDs
that are generated by the IDL compiler using the
IDL format.
Change the last sentence of para 1 in section 8.6.4 to read:
An IDL compiler must interpret these annotations as specified.
Add the following text at the end of "The ID Pragma":
The <id> must be a repository ID of the form described in 8.6.
If an attempt is made to
assign a repository ID to the same
IDL construct a second time,
a compile-time diagnostic shall
be emitted, regardless of
whether the second ID is in conflict or not:
interface A {};
#pragma ID A "IDL:A:1.1"
#pragma ID A "IDL:X:1.1"
// Compile-time error
interface B {};
#pragma ID B "IDL:BB:1.1"
#pragma ID B "IDL:BB:1.1"
// Compile-time error
It is also an error to apply
an ID to a forward-declared interface
and then later assign the
same or a different ID to that interface.
Para 1 of 8.6.4 says:
The pragma directives can
be used with the OMG IDL, DCE UUID, and
LOCAL formats.
Change this to:
The prefix and version pragma directives only apply to IDL formats.
Replace the last sentence of the para following the first example of
8.6.4,
"The Prefix Pragma" with the following text:
The specified prefix applies
to RepositoryIds generated after
the pragma until the end
of the current scope is reached or
another prefix pragma is
encountered. An IDL file forms a scope
for this purpose, so a prefix
resets to the previous prefix
at the end of the scope
of an included file:
// A.idl
#pragma prefix "A"
interface A {};
// B.idl
#pragma prefix "B"
#include "A.idl"
interface B {};
The repository IDs for interfaces A and B in this case are:
IDL:A/A:1.0
IDL:B/B:1.0
Similarly, a prefix in an
including file does not affect the
prefix of an included file:
// C.idl
interface C {};
// D.idl
#pragma prefix "D"
#include "C.idl"
interface D {};
The repository IDs for interface C and D in this case are:
IDL:C:1.0
IDL:D/D:1.0
If an included file does
not contain a #pragma prefix, the
current prefix implicitly
resets to the empty prefix:
// E.idl
interface E {};
// F.idl
module M {
#include <E.idl>
};
The repository IDs for module M and interface E in this case are:
IDL:M:1.0
IDL:E:1.0
If a #include directive appears
at non-global scope and the included
file contains a prefix pragma,
the included file's prefix takes
precedence, for example:
// A.idl
#pragma prefix "A"
interface A {};
// B.idl
#pragma prefix "B"
module M {
#include "A.idl"
};
The repository ID for module M and interface A in this case are:
IDL:B/M:1.0
IDL:A/A:1.0
Attempts to assign a prefix
to a forward-declared interface and
a different prefix to that
interface later result in a compile-time
diagnostic:
#pragma prefix "A"
interface A;
// Forward decl.
#pragma prefix "B"
interface A;
// Compile-time error
#pragma prefix "C"
interface A {
// Compile-time error
void op();
};
A prefix pragma of the form
#pragma prefix ""
resets the prefix to the empty string. For example:
#pragma prefix "X"
interface X {};
#pragma prefix ""
interface Y {};
The repository IDs for interface X and Y in this case are:
IDL:X/X:1.0
IDL:Y:1.0
If a specification contains
both a prefix pragma and an ID or version
pragma, the prefix pragma
does not affect the repository ID for
an ID pragma, but does affect
the repository ID for a version pragma:
#pragma prefix "A"
interface A {};
interface B {};
interface C {};
#pragma ID B "IDL:myB:1.0"
#pragma version C 9.9
The repository IDs for this specification are
IDL:A/A:1.0
IDL:myB:1.0
IDL:A/C:9.9
A #pragma prefix must appear
before the beginning of an IDL
definition. Placing a #pragma
prefix elsewhere has undefined
behavior, for example:
interface Bar
#pragma prefix "foo"
// Undefined behavior
{
// ...
}
Add the following text to the end of "The Version Pragma" on page 8-33:
If an attempt is made to
change the version of a repository ID
that was specifed with an
ID pragma, a compliant compiler shall
emit a diagnostic:
interface A {};
#pragma ID A "IDL:myA:1.1"
#pragma version A 9.9
// Compile-time error
If an attempt is made to
assign a version to the same
IDL construct a second time,
a compile-time diagnostic shall
be emitted, regardless of
whether the second version is in
conflict or not:
interface A {};
#pragma version A 1.1
#pragma version A 2.2
// Compile-time error
interface B {};
#pragma version B 1.1
#pragma version B 1.1
// Compile-time error
Action to be taken: Incorporate text as above and close issues 910, 916, 999
1) The section about *character*
literals talks about wide *string*
literals,
but the section about *string* literals says nothing
about
wide string literals.
Character
and wide character literals should be discussed in
the section
on character literals, and string and wide string
literals
should be discussed in the section on string literals.
2) The last sentence doesn't
make sense. It says that literals
are limited
to ISO 8859-1, but that identifiers are limited
to ISO
8859-1.
Also, with
the identifier change to ASCII letters, digits, and
underscores,
this no longer applies.
3) If wide character and
string literals are exactly like normal
literals,
the tokenizer becomes context-sensitive. This is
a Bad
Thing (TM).
Here is the proposal:
Revised Text:
In section 3.2.5
Change the last para of "Character Literals" to read:
Wide character literals have an L prefix, for example:
const wchar C1 = L'X';
Attempts to assign a wide
character literal to a non-wide character
constant or to assign a
non-wide character literal to a wide
character constant result
in a compile-time diagnostic.
Both wide and non-wide character
literals must be specified using
characters from the ISO
8859-1 character set.
Add the following text to the end of the "String Literals" section:
Wide string literals have an L prefix, for example:
const wstring S1 = L"Hello";
Attempts to assign a wide
string literal to a non-wide string
constant or to assign a
non-wide string literal to a wide
string constant result in
a compile-time diagnostic.
Both wide and non-wide string
literals must be specified using
characters from the ISO
8859-1 character set.
A wide string literal shall
not contain the wide character with
value zero.
Actions to be taken taken: Incorporate change and close issue.
March 18, 1998: received issue
The text is quite clear about the mechanism for assigning digits and
scale to fixed point constants. This part of the text only addresses
how the IDL compiler evaluates arithmetic expressions involving fixed
point literals at compile time and is not intended to define how fixed
point arithmetic works in various programming languages at run time.
Revised Text:
Actions to be taken: close no change
March 18, 1998: received issue
The text is quite clear about the mechanism for assigning digits and
scale to fixed point constants. This part of the text only addresses
how the IDL compiler evaluates arithmetic expressions involving fixed
point literals at compile time and is not intended to define how fixed
point arithmetic works in various programming languages at run time.
Revised Text:
Actions to be taken: close no change
March 19, 1998: received issue
The only restriction with most (all?) current IDL compilers is that
all of the IDL must be compiled at once. In practice, that's not
hard to achieve.
No change needed in specification.
Revised Text:
Actions taken: Close no change
March 20, 1998: received issue
The following provides explanations
as to the conditions
in which each exception
is raised by an ORB. The list of conditions
is not exhaustive because
the number of possible failure conditions
for a particular ORB is
too large to enumerate as well as
implementation-dependent.
The current text already explains OBJECT_NOT_EXIST and the transaction
exceptions. Add the following text to cover the remaining exceptions:
- UNKNOWN
This exception is raised if an operation implementation throws
a non-CORBA exception (such as an exception specific to the
implementation's programming language), or if an operation raises
a user exception that does not appear in the operation's raises
expression. UNKNOWN is also raised if the server returns a system
exception that is unknown to the client. (This can happen if
the server
uses a later version of CORBA than the client and new system
exceptions
have been added to the later version.)
- BAD_PARAM
A parameter passed to a call is out of range or otherwise considered
illegal.
An ORB may raise this exception if null values or null pointers
are passed
to an operation (for language mappings where the concept of
a null pointers
or null values applies). BAD_PARAM can also be raised as a result
of client
generating requests with incorrect parameters using the DII.
- NO_MEMORY
The ORB run time has run out of memory.
- IMP_LIMIT
This exception indicates that an implementation limit was exceeded
in the
ORB run time. For example, an ORB may reach the maximum number
of
references it can can hold simultaneously in an address space,
the size
of a parameter may have exceeded the allowed maximum, or an
ORB may
impose a maximum on the number of clients or servers that can
run
simultaneously.
- COMM_FAILURE
This exception is raised if communication is lost while an operation
is in progress, after the request was sent by the client, but
before
the reply from the server has been returned to the client.
- INV_OBJREF
This exception indicates that an object reference is internally
malformed. For example, the repository ID may have incorrect
syntax
or the addressing information may be invalid. This exception
is
raised by ORB::string_to_object if the passed string does not
decode
correctly.
An ORB may choose to detect calls via nil references (but is
not obliged to do detect them). INV_OBJREF is used to indicate
this.
- NO_PERMISSION
An invocation failed because the caller has insufficient privileges.
- INTERNAL
This exception indicates an interal failure in an ORB, for example,
if an ORB has detected corruption of its internal data structures.
- MARSHAL
A request or reply from the network is structurally invalid.
This error
typically indicates a bug in either the client-side or server-side
run
time. For example, if a reply from the server indicates that
the message
contains 1000 bytes, but the actual message is shorter or longer
than
1000 bytes, the ORB raises this exception. MARSHAL can also
be caused
by using the DII or DSI incorrectly, for example, if the type
of the
actual parameters sent does not agree with IDL signature of
an operation.
- INITIALIZE
An ORB has encountered a failure during its initialization, such
as failure
to acquire networking resources or detecting a configuration
error.
- NO_IMPLEMENT
This exception indicates that even though the operation that
was invoked
exists (it has an IDL definition), no implementation for that
operation
exists. NO_IMPLEMENT can, for example, be raised by an ORB if
a client
asks for an object's type definition from the interface repository,
but
no interface repository is provided by the ORB.
- BAD_TYPECODE
The ORB has encounted a malformed type code (for example, a type
code
with an invalid TCKind value).
- BAD_OPERATION
This indicates that an object reference denotes an existing object,
but that
the object does not support the operation that was invoked.
- NO_RESOURCES
The ORB has encountered some general resource limitation. For
example, the
run time may have reached the maximum permissible number of
open connections.
- NO_RESPONSE
This exception is raised if a client attempts to retrieve the
result of
a deferred synchronous call, but the response for the request
is not
yet available.
- PERSIST_STORE
This exception indicates a persistent storage failure, for example,
failure to establish a database connection or corruption of
a database.
- BAD_INV_ORDER
This exception indicates that the caller has invoked operations
in the
wrong order. For example, it can be raised by an ORB if an application
makes an ORB-related call without having correctly initialized
the ORB
first.
- TRANSIENT
TRANSIENT indicates that the ORB attempted to reach an object
and failed. It is not an indication that an object does not
exist.
Instead, it simply means that no further determination of an
object's
status was possible because it could not be reached.
- FREE_MEM
The ORB failed in an attempt to free dynamic memory, for example
because
of heap corruption or memory segments being locked.
- INV_IDENT
This exception indicates that an IDL identifier is syntactically
invalid.
It may be raised if, for example, an identifier passed to the
interface
repository does not conform to IDL identifier syntax, or if
an illegal
operation name is used with the DII.
- INV_FLAG
An invalid flag was passed to an operation (for example, when
creating
a DII request).
- INTF_REPOS
An ORB raises this exception if it cannot reach the interface
repository,
or some other failure relating to the interface repository is
detected.
- BAD_CONTEXT
An operation may raise this exception if a client invokes the
operation
but the passed context does not contain the context values required
by the operation.
- OBJ_ADAPTER
This exception typically indicates an administrative mismatch.
For example, a server may have made an attempt to register itself
with an implementation repository under a name that is already
in
use, or is unknown to the repository. OBJ_ADAPTER is also raised
by the POA to indicate problems with application-supplied servant
managers.
- DATA_CONVERSION
This exception is raised if an ORB cannot convert the representation
of
data as marshaled into its native representation or vice-versa.
For example,
DATA_CONVERSION can be raised if wide character codeset conversion
fails,
or if an ORB cannot convert floating point values between different
representations.
Actions to be taken: incorporate changes as above in 2.3 and close
issue
April 16, 1998: received issue
June 25, 1998: moved from port-rtf to orb_revision
Replace the first paragraph of 8.7.2 with:
For IDL type declarations, the IDL compiler produces (if asked) a declaration
of a TypeCode
constant. See the language mapping rules for more information about
the
names of the generated TypeCode constants. TypeCode constants
include
tk_alias definitions wherever an IDL typedef is referenced. These
constants can be used with the dynamic invocation interface and other
routines that require TypeCodes.
The predefined TypeCode constants, named according to the C language
mapping, are:
TC_null
TC_void
TC_short
TC_long
TC_longlong
TC_ushort
TC_ulong
TC_ulonglong
TC_float
TC_double
TC_longdouble
TC_boolean
TC_char
TC_wchar
TC_octet
TC_any
TC_TypeCode
TC_Object = tk_objref { Object }
TC_string= tk_string { 0 } // unbounded
TC_wstring = tk_wstring{0} mmmmm/// unbounded
Actions to be taken: incorporate change in 2.3 and close
April 28, 1998: received issue
The implicit object reference operations non_existent, is_a, get_interface and (deprecated) get_implementation may be invoked using DII. No other implicit object reference operations may be invoked via DII.
To create a request for any one of these allowed implicit object reference operations, create_request must be passed the name of the operation with a "_" prepended, in the parameter "operation". For example to create a DII request for "is_a", the name passed to create_request must be "_is_a". If the name of an implicit operation that is not ivocable through DII is passed to create_request with a "_" prepended, create_request shall raise a BAD_PARAM exception. For example if "_is_equivalent" is passed to create_request as the "operation" parameter will cause create_request to raise the BAD_PARAM exception.
Actions to be taken: Incorporate new text and close issue.
(1) From TypeCode PIDL on Page 8-37
// deprecated interface
long param_count ();
any parameter (in long index) raises (Bounds);
(2) remove the text begining with "The deprecated param_count and parameter operations..." at the top of page 8-39 and ending just before section 8.7.2 on page 8-40.
Actions to be taken taken: Fix and close in 2.3
June 24, 1998: received issue
1) In para 6 page 8-39 insert the following after the second sentence:
"For example, the member count of a structure with three members is
three."
The second half of this issue namely origin of index is addressed in 1543.
Actions to be taken: incorporate proposed change in 2.3 and close
June 24, 1998: received issue
"The order in which members are presented in the intrface repository is the same as the order in which they appeared in the IDL specification, and this ordering determines the index value for each member. The first member has index value 0. For example for a structure definition:
struct example {
short
member1;
short
member2;
long
member3;
};
member1 has index = 0, member2 has index = 1, and member3 has index = 2."
Actions to be taken: incorporate proposed change in 2.3 and close
June 24, 1998: received issue
"Wstring
The wstring data type represents a sequence of wchar, except the
wide character null. The type wstring is similar to that of type string,
except that
its element type is wchar instead of char. The actual length of a wstring
is set at run-time
and, if the bounded form is used, must be less than or equal to the
bound.
The syntax for defining a wstring is:
<wide_string_type> ::=
"wstring" "<" <positive_int_const> ">" | "wstring"
"
Actions to be taken: Incorporate new text and close issue
June 29, 1998: received issue
"in UTO uto"
to:
"in CosTime::UTO uto"
2. Change the 5th line on the same page from:
"in UTO uto"
to:
"in CosTime::UTO uto"
3. On page 14-22 in the IDL declaration for interface UTO make the following changes:
i. In declaration of operation compare_time change the type of the last parameter from "UTO" to "CosTime::UTO".
ii. In declaration of the operation time_to_interval change the name of the parameter from "UTO" to "CosTime::UTO".
Actions to be taken: Incorporate changes in Time Service chapter
and close issue.
This operation destroys the POA and all descendant POAs. All
descendant POAs are destroyed (recursively) before the destruction
of
the containing POA. The POA so destroyed (that is, the POA with
its
name) may be re-created later in the same process. (This differs
from
the POAManager::deactivate operation that does not allow a re-creation
of its associated POA in the same process. After a deactivate,
re-creation is allowed only if the POA is later destroyed.)
When destroy is called the POA will behave as follows:
1. The POA will call destroy on all of its immediate descendants.
2. After all descendant POAs have been destroyed and their servants
etherealized, the POA will continue to process requests
until there
are no requests executing in the POA. The apparent
destruction of
the POA will occur only after all executing requests in
the
POA have completed. After destruction has become apparent,
the POA
may be recreated via either an AdapterActivator or a call
to
create_POA.
3. If the etherealize_objects parameter is TRUE, the POA has the RETAIN
policy, and a servant manager is registered with the POA,
the
etherealize operation on the servant manager will be called
for each
active object in the Active Object Map. The apparent
destruction of
the POA occurs before any calls to etherealize are made.
Thus, for
example, an etherealize method that attempts to invoke
operations
on the POA will receive the OBJECT_NOT_EXIST exception.
Once
apparent destruction has occurred, the POA behaves as
if its
POAManager is in the holding state until destruction is
complete.
Thus, for example, an invocation of create_POA() with
the same
name will block until POA destruction has finished.
{editorial note - below I have merged text from these two issues and
the relevant text from issue 1428 because they change the same text.
If one of these resolutions fails, we will need to edit the following
text)
The wait_for_completion parameter is handled as follows:
- If wait_for_completion is TRUE and the current
thread is not in an invocation context dispatched from
some
POA belonging to the same ORB as this POA,
the destroy operation will return only after all active
requests
have completed and all invocations of etherealize have
completed.
- If wait_for_completion is TRUE and the current thread is in
an
invocation context dispatched from some POA belonging
to the
same ORB as this POA, then the BAD_INV_ORDER
exception is thrown and POA destruction does not occur.
- If wait_for_completion is FALSE, the destroy operation
destroys the POA and its children but does not wait for
active
requests to complete nor for etherealization to occur.
If destroy is called multiple times before destruction is
complete (because there are active requests), the
etherealize_objects parameter will only apply to the first
call of destroy. Subsequent calls with conflicting
etherealize_objects settings will use the value of the
etherealize_objects from the first call. The wait_for_completion
parameter will be handled as defined above for each individual
call (some callers may choose to block, while others may not).
Replace the second sentence in the paragraph of section 4.9.4,
page 4-20, which begins with "If the wait_for_completion ..."
with the following:
"If the wait_for_completion parameter is TRUE and the current
thread is not in an invocation context dispatched by this ORB, this
operation blocks until all ORB processing (including request
processing and object deactivation or other operations associated
with object adapters) has completed. If the wait_for_completion
parameter is TRUE and the current thread is in an invocation context
dispatched by this ORB, then the BAD_INV_ORDER exception is thrown."
Replace the phrase "If the parameter is TRUE" in the 2nd
paragraph, 2nd sentence of the hold_requests description in
Section 9.3.2, page 9-18, with the phrase "If the parameter
is TRUE and the current thread is not in an invocation context
dispatched by some POA belonging to the same ORB as this POA".
Add the sentence "If the parameter
is TRUE and the current thread is in an invocation context
dispatched by some POA belonging to the same ORB as this POA
then the BAD_INV_ORDER exception is raised and the state is not changed."
Replace the phrase "If the parameter is TRUE" in the 2nd
paragraph, 2nd sentence of the discard_requests description in
Section 9.3.2, page 9-18, with the phrase "If the parameter
is TRUE and the current thread is not in an invocation context
dispatched by some POA belonging to the same ORB as this POA".
Add the sentenence "If the parameter
is TRUE and the current thread is in an invocation context
dispatched by some POA belonging to the same ORB as this POA then
the BAD_INV_ORDER exception is raised
and the state is not changed." to the end of the paragraph.
Replace the phrase "If the parameter is TRUE" in the 3rd
paragraph, 2nd sentence of the deactivate description in
Section 9.3.2, page 9-18, with the phrase "If the parameter
is TRUE and the current thread is not in an invocation context
dispatched by some POA belonging to the same ORB as this POA".
Add the sentenence "If the parameter
is TRUE and the current thread is in an invocation context dispatched
by some POA belonging to the same ORB as this POA then the
BAD_INV_ORDER exception is raised and the
state is not changed." to the end of the paragraph.
(editorial note- I changed the text for POA::destroy in the
resolution of issues 1408 and 1409 above, so it is not shown
here but a similar change to the above is necessary.
I also felt that 1409 raised an issue which also affects
POAManager::deactivate, so the following change is also
proposed)
Add the following paragraph to the end of the description of
deactivate in section 9.3.2, page 9-19.
"If deactivate is called multiple times before destruction is
complete (because there are active requests), the
etherealize_objects parameter will only apply to the first
call of deactivate, subsequent calls with conflicting
etherealize_objects settings will use the value of the
etherealize_objects from the first call. The wait_for_completion
parameter will be handled as defined above for each individual
call (some callers may choose to block, while others may not)."
This operation causes the ObjectId specified in the oid parameter
to be deactivated. An ObjectId which has been deactivated continues
to process requests until there are no active requests for that
ObjectId. A deactivated ObjectId is removed from the Active Object
Map when all requests executing for that ObjectId have completed. If
a
servant manager is associated with the POA,
ServantActivator::etherealize will be invoked with the oid and the
associated servant after the ObjectId has been removed from the Active
Object Map. Reactivation for the ObjectId blocks until etherealization
(if necessary) is complete. This includes implicit activation
(as
described in "etherealize" on page 9-23) and explicit activation via
POA::activate_object_with_id(). Once an ObjectId has been removed from
the Active Object Map and etherealized (if necessary) it may then be
reactivated through the usual mechanisms.
The operation does not wait for requests or etherealization to
complete and always returns immediately after deactivating the
ObjectId.