aboutsummaryrefslogtreecommitdiffstats
path: root/lib/orber/src/cdr_encode.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2010-12-16 14:34:26 +0100
committerErlang/OTP <[email protected]>2010-12-16 14:34:26 +0100
commit73205a499c16781ecd064ec2446d502b3c0d01b6 (patch)
tree260a1805f06a1ecef92d03d29853dbddb0bbd803 /lib/orber/src/cdr_encode.erl
parent99e34bba1a60b262e24496cc9288b549360c6377 (diff)
parent98a66242abe688d852ec46f4298a364fc0124995 (diff)
downloadotp-73205a499c16781ecd064ec2446d502b3c0d01b6.tar.gz
otp-73205a499c16781ecd064ec2446d502b3c0d01b6.tar.bz2
otp-73205a499c16781ecd064ec2446d502b3c0d01b6.zip
Merge branch 'nick/orber/recursive_types/OTP-8868' into maint-r14
* nick/orber/recursive_types/OTP-8868: Support for recursive unions and structs. Break loop if recursive TypeCode. Added basic tests for recursive uinions and structs. Removed test code. Added partial support for recursive IDL types. Conflicts: lib/ic/doc/src/notes.xml lib/ic/vsn.mk lib/orber/vsn.mk
Diffstat (limited to 'lib/orber/src/cdr_encode.erl')
-rw-r--r--lib/orber/src/cdr_encode.erl30
1 files changed, 25 insertions, 5 deletions
diff --git a/lib/orber/src/cdr_encode.erl b/lib/orber/src/cdr_encode.erl
index 3ecb8833f5..eaf3c5b7dc 100644
--- a/lib/orber/src/cdr_encode.erl
+++ b/lib/orber/src/cdr_encode.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -815,11 +815,21 @@ enc_wstring(Env, String, MaxLength, Bytes, Len) ->
%%-----------------------------------------------------------------
%% Func: enc_union/5
%%-----------------------------------------------------------------
-enc_union(Env, {_, Label, Value}, DiscrTC, Default, TypeCodeList, Bytes, Len) ->
+enc_union(Env, {_, Label, Value}, DiscrTC, Default, TypeCodeList,
+ Bytes, Len) when is_list(TypeCodeList) ->
{ByteSequence, Len1} = enc_type(DiscrTC, Env, Label, Bytes, Len),
Label2 = stringify_enum(DiscrTC,Label),
enc_union2(Env, {Label2, Value},TypeCodeList, Default,
- ByteSequence, Len1, undefined).
+ ByteSequence, Len1, undefined);
+enc_union(Env, Value, _DiscrTC, _Default, Module, Bytes, Len) when is_atom(Module) ->
+ case catch Module:tc() of
+ {tk_union, _, _, DiscrTC, Default, ElementList} ->
+ enc_union(Env, Value, DiscrTC, Default, ElementList, Bytes, Len);
+ What ->
+ orber:dbg("[~p] ~p:enc_union(~p). Union module doesn't exist or incorrect.",
+ [?LINE, ?MODULE, What], ?DEBUG_LEVEL),
+ corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE})
+ end.
enc_union2(_Env, _What, [], Default, Bytes, Len, _) when Default < 0 ->
{Bytes, Len};
@@ -840,9 +850,19 @@ stringify_enum(_, Label) ->
%%-----------------------------------------------------------------
%% Func: enc_struct/4
%%-----------------------------------------------------------------
-enc_struct(Env, Struct, TypeCodeList, Bytes, Len) ->
+enc_struct(Env, Struct, TypeCodeList, Bytes, Len) when is_list(TypeCodeList) ->
[_Name | StructList] = tuple_to_list(Struct),
- enc_struct1(Env, StructList, TypeCodeList, Bytes, Len).
+ enc_struct1(Env, StructList, TypeCodeList, Bytes, Len);
+enc_struct(Env, Struct, Module, Bytes, Len) ->
+ [Module | StructList] = tuple_to_list(Struct),
+ case catch Module:tc() of
+ {tk_struct, _, _, TypeCodeList} ->
+ enc_struct1(Env, StructList, TypeCodeList, Bytes, Len);
+ What ->
+ orber:dbg("[~p] ~p:enc_struct([], ~p). Struct module doesn't exist or incorrect.",
+ [?LINE, ?MODULE, What], ?DEBUG_LEVEL),
+ corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE})
+ end.
enc_struct1(_Env, [], [], Bytes, Len) ->
{Bytes, Len};