diff options
author | Michi Henning <michi@zeroc.com> | 2007-08-22 18:36:06 +1000 |
---|---|---|
committer | Michi Henning <michi@zeroc.com> | 2007-08-22 18:36:06 +1000 |
commit | 262f4efb87a2b19c323b3a68ceb173952f7a47ab (patch) | |
tree | d392684b469633a8812a2895761f4ec196ef1ce7 /cpp/src | |
parent | Removed two .swp files I added by mistake. (diff) | |
download | ice-262f4efb87a2b19c323b3a68ceb173952f7a47ab.tar.bz2 ice-262f4efb87a2b19c323b3a68ceb173952f7a47ab.tar.xz ice-262f4efb87a2b19c323b3a68ceb173952f7a47ab.zip |
Add new sequence mapping and updated dictionary tests to use
new sequences as well.
Still need to add tests for sequence mapping itself (not tested
yet with all relevant element types).
Diffstat (limited to 'cpp/src')
-rwxr-xr-x | cpp/src/Slice/CsUtil.cpp | 85 | ||||
-rwxr-xr-x | cpp/src/slice2cs/Gen.cpp | 206 |
2 files changed, 55 insertions, 236 deletions
diff --git a/cpp/src/Slice/CsUtil.cpp b/cpp/src/Slice/CsUtil.cpp index ca8b7bef66c..cadbcd456ac 100755 --- a/cpp/src/Slice/CsUtil.cpp +++ b/cpp/src/Slice/CsUtil.cpp @@ -165,8 +165,21 @@ Slice::CsGenerator::typeToString(const TypePtr& type) } SequencePtr seq = SequencePtr::dynamicCast(type); - if(seq && !seq->hasMetaData("clr:collection")) + if(seq) { + if(seq->hasMetaData("clr:collection")) + { + return fixId(seq->scoped()); + } + + string prefix = "clr:generic:"; + string meta; + if(seq->findMetaData(prefix, meta)) + { + string type = meta.substr(prefix.size()); + return "_System.Collections.Generic." + type + "<" + typeToString(seq->type()) + ">"; + } + return typeToString(seq->type()) + "[]"; } @@ -586,7 +599,14 @@ Slice::CsGenerator::writeSequenceMarshalUnmarshalCode(Output& out, TypePtr type = seq->type(); string typeS = typeToString(type); - bool isArray = !seq->hasMetaData("clr:collection"); + string genericPrefix = "clr:generic:"; + string genericType; + bool isGeneric = seq->findMetaData(genericPrefix, genericType); + if(isGeneric) + { + genericType = genericType.substr(genericPrefix.size()); + } + bool isArray = !isGeneric && !seq->hasMetaData("clr:collection"); string limitID = isArray ? "Length" : "Count"; BuiltinPtr builtin = BuiltinPtr::dynamicCast(type); @@ -699,14 +719,20 @@ Slice::CsGenerator::writeSequenceMarshalUnmarshalCode(Output& out, } else { - if(!isArray) + if(isArray) { - out << nl << param << " = new " << fixId(seq->scoped()) - << '(' << stream << ".read" << typeS << "Seq());"; + out << nl << param << " = " << stream << ".read" << typeS << "Seq();"; + } + else if(isGeneric) + { + // TODO: this won't work for nested sequences. + out << nl << param << " = new _System.Collections.Generic." << genericType + << "<" << typeToString(seq->type()) << ">(" << stream << ".read" << typeS << "Seq());"; } else { - out << nl << param << " = " << stream << ".read" << typeS << "Seq();"; + out << nl << param << " = new " << fixId(seq->scoped()) + << '(' << stream << ".read" << typeS << "Seq());"; } } break; @@ -986,6 +1012,10 @@ Slice::CsGenerator::writeSequenceMarshalUnmarshalCode(Output& out, { out << toArrayAlloc(typeS + "[]", "szx__"); } + else if(isGeneric) + { + out << "_System.Collections.Generic." << genericType << "<" << typeToString(seq->type()) << ">()"; + } else { out << fixId(seq->scoped()) << "(szx__)"; @@ -1188,36 +1218,6 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont) { string s = *p; - if(s.find("cs:") == 0) // TODO: remove this statement once "cs:" is a hard error. - { - if(SequencePtr::dynamicCast(cont)) - { - if(s.substr(3) == "collection") - { - cout << file << ":" << cont->line() << ": warning: `cs:' metadata prefix is deprecated; " - << "use `clr:' instead" << endl; - cont->addMetaData("clr:collection"); - } - } - else if(StructPtr::dynamicCast(cont)) - { - if(s.substr(3) == "class") - { - cout << file << ":" << cont->line() << ": warning: `cs:' metadata prefix is deprecated; " - << "use `clr:' instead" << endl; - cont->addMetaData("clr:class"); - } - } - else if(s.find("cs:attribute:") == 0) - { - ; // Do nothing, "cs:attribute:" is OK - } - else - { - cout << file << ":" << cont->line() << ": warning: ignoring invalid metadata `" << s << "'" << endl; - } - } // End TODO - string prefix = "clr:"; if(_history.count(s) == 0) { @@ -1229,8 +1229,15 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont) { continue; } + if(s.substr(prefix.size(), 8) == "generic:") + { + if(!s.substr(prefix.size() + 8).empty()) + { + continue; + } + } } - if(StructPtr::dynamicCast(cont)) + else if(StructPtr::dynamicCast(cont)) { if(s.substr(prefix.size()) == "class") { @@ -1241,14 +1248,14 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont) continue; } } - if(ClassDefPtr::dynamicCast(cont)) + else if(ClassDefPtr::dynamicCast(cont)) { if(s.substr(prefix.size()) == "property") { continue; } } - if(DictionaryPtr::dynamicCast(cont)) + else if(DictionaryPtr::dynamicCast(cont)) { if(s.substr(prefix.size()) == "DictionaryBase") { diff --git a/cpp/src/slice2cs/Gen.cpp b/cpp/src/slice2cs/Gen.cpp index 4386e506fed..116c712bd7c 100755 --- a/cpp/src/slice2cs/Gen.cpp +++ b/cpp/src/slice2cs/Gen.cpp @@ -2863,7 +2863,7 @@ Slice::Gen::TypesVisitor::visitDictionary(const DictionaryPtr& p) _out << sb; _out << nl << "return false;"; _out << eb; - _out << nl << "return Ice.Comparer.ValueEquals(this, (" << name << ")other);"; + _out << nl << "return Ice.CollectionComparer.Equals(this, (" << name << ")other);"; _out << eb; _out << sp << nl << "#endregion"; // Object members @@ -3712,96 +3712,6 @@ Slice::Gen::HelperVisitor::visitSequence(const SequencePtr& p) _out << sp << nl << "public sealed class " << name << "Helper"; _out << sb; -#if 0 - if(seqIsArray) - { - _out << nl << "public static bool ValueEquals(" << typeS << " v1__, " << typeS << " v2__)"; - _out << sb; - _out << nl << "if(object.ReferenceEquals(v1__, v2__))"; - _out << sb; - _out << nl << "return true;"; - _out << eb; - _out << nl << "if(v1__ == null || v2__ == null)"; - _out << sb; - _out << nl << "return false;"; - _out << eb; - _out << nl << "if(v1__.Length != v2__.Length)"; - _out << sb; - _out << nl << "return false;"; - _out << eb; - _out << nl << "_System.Collections.IEnumerator en2__ = v2__.GetEnumerator();"; - _out << nl << "foreach(" << typeE << " e1__ in v1__)"; - _out << sb; - _out << nl << "en2__.MoveNext();"; - - bool elmtIsValue = isValueType(p->type()); - DictionaryPtr d = DictionaryPtr::dynamicCast(p->type()); - SequencePtr seq = SequencePtr::dynamicCast(p->type()); - if(d) - { - if(!d->hasMetaData("clr:DictionaryBase")) - { - _out << nl << "if(!" << d->name() << "Helper.ValueEquals(e1__, en2__.Current))"; - _out << sb; - _out << nl << "return false;"; - _out << eb; - } - else - { - _out << nl << "if(e1__ == null)"; - _out << sb; - _out << nl << "if(en2__.Current != null;"; - _out << sb; - _out << nl << "return false;"; - _out << eb; - _out << eb; - _out << nl << "else"; - _out << sb; - _out << nl << "if(!e1__.Equals(en2__.Current))"; - _out << sb; - _out << nl << "return false;"; - _out << eb; - _out << eb; - } - } - else if(seq) - { - if(!seq->hasMetaData("clr:collection")) - { - } - else - { - } - } - else - { - if(!elmtIsValue) - { - _out << nl << "if(e1__ == null)"; - _out << sb; - _out << nl << "if(en2__.Current != null)"; - _out << sb; - _out << nl << "return false;"; - _out << eb; - _out << eb; - _out << nl << "else"; - _out << sb; - } - _out << nl << "if(!e1__.Equals(en2__.Current))"; - _out << sb; - _out << nl << "return false;"; - _out << eb; - if(!elmtIsValue) - { - _out << eb; - } - } - _out << eb; - _out << nl << "return true;"; - _out << eb; - } -#endif - // // Don't generate marshaling helpers for a sequence of a local type // @@ -3844,6 +3754,14 @@ Slice::Gen::HelperVisitor::visitSequence(const SequencePtr& p) void Slice::Gen::HelperVisitor::visitDictionary(const DictionaryPtr& p) { + // + // Don't generate helper for a dictionary containing a local type + // + if(p->isLocal()) + { + return; + } + TypePtr key = p->keyType(); TypePtr value = p->valueType(); @@ -3858,112 +3776,6 @@ Slice::Gen::HelperVisitor::visitDictionary(const DictionaryPtr& p) _out << sp << nl << "public sealed class " << p->name() << "Helper"; _out << sb; - if(isNewMapping) - { - _out << nl << "public static bool ValueEquals("; - _out.useCurrentPosAsIndent(); - _out << "_System.Collections.Generic.Dictionary<" + keyS + ", " + valueS + "> d1__,"; - _out << nl << "_System.Collections.Generic.Dictionary<" + keyS + ", " + valueS + "> d2__)"; - _out.restoreIndent(); - _out << sb; - _out << nl << "return Ice.Comparer.ValueEquals(d1__, d2__);"; -#if 0 - _out << nl << "if(object.ReferenceEquals(d1__, d2__))"; - _out << sb; - _out << nl << "return true;"; - _out << eb; - _out << nl << "if(d1__ == null || d2__ == null)"; - _out << sb; - _out << nl << "return false;"; - _out << eb; - _out << nl << "if(d1__.Count != d2__.Count)"; - _out << sb; - _out << nl << "return false;"; - _out << eb; - _out << nl << "_System.Collections.Generic.Dictionary<" << keyS << ", " << valueS << ">.KeyCollection keys1__"; - _out.inc(); - _out << nl << "= d1__.Keys;"; - _out.dec(); - _out << nl << "_System.Collections.Generic.Dictionary<" << keyS << ", " << valueS - << ">.KeyCollection.Enumerator ke2__"; - _out.inc(); - _out << nl << "= d2__.Keys.GetEnumerator();"; - _out.dec(); - _out << nl << "foreach(" << keyS << " k1__ in keys1__)"; - _out << sb; - _out << nl << "ke2__.MoveNext();"; - _out << nl << "if(!ke2__.Current.Equals(k1__))"; - _out << sb; - _out << nl << "return false;"; - _out << eb; - _out << eb; - _out << nl << "_System.Collections.Generic.Dictionary<" << keyS << ", " << valueS << ">.ValueCollection values1__"; - _out.inc(); - _out << nl << "= d1__.Values;"; - _out.dec(); - _out << nl << "_System.Collections.Generic.Dictionary<" << keyS << ", " << valueS - << ">.ValueCollection.Enumerator ve2__"; - _out.inc(); - _out << nl << "= d2__.Values.GetEnumerator();"; - _out.dec(); - _out << nl << "foreach(" << valueS << " v1__ in values1__)"; - _out << sb; - _out << nl << "ve2__.MoveNext();"; - if(isValueType(p->valueType())) - { - _out << nl << "if(!ve2__.Current.Equals(v1__))"; - _out << sb; - _out << nl << "return false;"; - _out << eb; - } - else - { - _out << nl << valueS << " v2__ = ve2__.Current;"; - _out << nl << "if(v1__ == null)"; - _out << sb; - _out << nl << "if(v2__ != null)"; - _out << sb; - _out << nl << "return false;"; - _out << eb; - _out << eb; - _out << nl << "else"; - _out << sb; - DictionaryPtr d = DictionaryPtr::dynamicCast(value); - if(d) - { - if(!d->hasMetaData("clr:DictionaryBase")) - { - _out << nl << "if(!" << fixId(d->scoped()) << "Helper.ValueEquals(v1__, v2__))"; - } - else - { - _out << nl << "if(!v1__.Equals(v2__))"; - } - } - else - { - _out << nl << "if(!v1__.Equals(v2__))"; - } - _out << sb; - _out << nl << "return false;"; - _out << eb; - _out << eb; - } - _out << eb; - _out << nl << "return true;"; - #endif - _out << eb; - } - - // - // Don't generate marshaling helpers for a dictionary containing a local type - // - if(p->isLocal()) - { - _out << eb; - return; - } - _out << sp << nl << "public static void write("; _out.useCurrentPosAsIndent(); _out << "IceInternal.BasicStream os__,"; |