diff options
author | Benoit Foucher <benoit@zeroc.com> | 2022-07-21 15:50:11 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-21 15:50:11 +0200 |
commit | 12825a7def26d6d58868adf3bd86808319a018d1 (patch) | |
tree | b55a1551df5a2b809b3fd0e7e6fae94b53c59740 /cpp/src | |
parent | Bump terser from 5.14.1 to 5.14.2 in /js (#1385) (diff) | |
download | ice-12825a7def26d6d58868adf3bd86808319a018d1.tar.bz2 ice-12825a7def26d6d58868adf3bd86808319a018d1.tar.xz ice-12825a7def26d6d58868adf3bd86808319a018d1.zip |
Matlab performance improvements (#1382)
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/slice2matlab/Main.cpp | 122 |
1 files changed, 96 insertions, 26 deletions
diff --git a/cpp/src/slice2matlab/Main.cpp b/cpp/src/slice2matlab/Main.cpp index a9dd90591f1..681664126b6 100644 --- a/cpp/src/slice2matlab/Main.cpp +++ b/cpp/src/slice2matlab/Main.cpp @@ -530,7 +530,7 @@ defaultValue(const DataMemberPtr& m) } else if(m->optional()) { - return "Ice.Unset"; + return "IceInternal.UnsetI.Instance"; } else { @@ -878,7 +878,7 @@ parseComment(const ContainedPtr& p) doc.overview.push_back(l); } - enum State { StateMisc, StateParam, StateThrows, StateReturn, StateDeprecated }; + enum State { StateMisc, StateParam, StateThrows, StateReturn, StateDeprecated, StateSee }; State state = StateMisc; string name; const string ws = " \t"; @@ -926,6 +926,7 @@ parseComment(const ContainedPtr& p) { if(!line.empty()) { + state = StateSee; doc.seeAlso.push_back(line); } } @@ -997,6 +998,11 @@ parseComment(const ContainedPtr& p) doc.deprecateReason.push_back(l); break; } + case StateSee: + { + doc.seeAlso.push_back(l); + break; + } } } } @@ -1603,6 +1609,8 @@ private: void unmarshalStruct(IceUtilInternal::Output&, const StructPtr&, const string&); void convertStruct(IceUtilInternal::Output&, const StructPtr&, const string&); + void writeBaseClassArrayParams(IceUtilInternal::Output&, const MemberInfoList&, bool); + const string _dir; }; @@ -1744,7 +1752,19 @@ CodeVisitor::visitClassDefStart(const ClassDefPtr& p) // // Constructor // - if(!allMembers.empty()) + if(allMembers.empty()) + { + out << nl << "function " << self << " = " << name << spar << "noInit" << epar; + out.inc(); + out << nl << "if nargin == 1 && ne(noInit, IceInternal.NoInit.Instance)"; + out.inc(); + out << nl << "narginchk(0,0);"; + out.dec(); + out << nl << "end"; + out.dec(); + out << nl << "end"; + } + else { vector<string> allNames; for(MemberInfoList::const_iterator q = allMembers.begin(); q != allMembers.end(); ++q) @@ -1753,33 +1773,59 @@ CodeVisitor::visitClassDefStart(const ClassDefPtr& p) } out << nl << "function " << self << " = " << name << spar << allNames << epar; out.inc(); - out << nl << "if nargin == 0"; - out.inc(); - for(MemberInfoList::const_iterator q = allMembers.begin(); q != allMembers.end(); ++q) - { - out << nl << q->fixedName << " = " << defaultValue(q->dataMember) << ';'; - } - out.dec(); - out << nl << "end"; if(base) { - out << nl << self << " = " << self << "@" << getAbsolute(base) << spar; + out << nl << "if nargin == 0"; + out.inc(); for(MemberInfoList::const_iterator q = allMembers.begin(); q != allMembers.end(); ++q) { - if(q->inherited) + out << nl << q->fixedName << " = " << defaultValue(q->dataMember) << ';'; + } + writeBaseClassArrayParams(out, allMembers, false); + out.dec(); + out << nl << "elseif eq(" << allMembers.begin()->fixedName << ", IceInternal.NoInit.Instance)"; + out.inc(); + writeBaseClassArrayParams(out, allMembers, true); + out.dec(); + out << nl << "else"; + out.inc(); + writeBaseClassArrayParams(out, allMembers, false); + out.dec(); + out << nl << "end;"; + + out << nl << self << " = " << self << "@" << getAbsolute(base) << "(v{:});"; + + out << nl << "if ne(" << allMembers.begin()->fixedName << ", IceInternal.NoInit.Instance)"; + out.inc(); + for (MemberInfoList::const_iterator q = allMembers.begin(); q != allMembers.end(); ++q) + { + if (!q->inherited) { - out << q->fixedName; + out << nl << self << "." << q->fixedName << " = " << q->fixedName << ';'; } } - out << epar << ';'; + out.dec(); + out << nl << "end"; } - for(MemberInfoList::const_iterator q = allMembers.begin(); q != allMembers.end(); ++q) + else { - if(!q->inherited) + out << nl << "if nargin == 0"; + out.inc(); + for(MemberInfoList::const_iterator q = allMembers.begin(); q != allMembers.end(); ++q) + { + out << nl << self << "." << q->fixedName << " = " << defaultValue(q->dataMember) << ';'; + } + out.dec(); + out << nl << "elseif ne(" << allMembers.begin()->fixedName << ", IceInternal.NoInit.Instance)"; + out.inc(); + for (MemberInfoList::const_iterator q = allMembers.begin(); q != allMembers.end(); ++q) { out << nl << self << "." << q->fixedName << " = " << q->fixedName << ';'; } + out.dec(); + out << nl << "end;"; } + out.dec(); out << nl << "end"; } @@ -3024,18 +3070,18 @@ CodeVisitor::visitStructStart(const StructPtr& p) string self = name == "obj" ? "this" : "obj"; out << nl << "function " << self << " = " << name << spar << memberNames << epar; out.inc(); - out << nl << "if nargin > 0"; + out << nl << "if nargin == 0"; out.inc(); - for(vector<string>::const_iterator q = memberNames.begin(); q != memberNames.end(); ++q) + for(DataMemberList::const_iterator q = members.begin(); q != members.end(); ++q) { - out << nl << self << "." << *q << " = " << *q << ';'; + out << nl << self << "." << fixStructMember((*q)->name()) << " = " << defaultValue(*q) << ';'; } out.dec(); - out << nl << "else"; + out << nl << "elseif ne(" << fixStructMember((*members.begin())->name()) << ", IceInternal.NoInit.Instance)"; out.inc(); - for(DataMemberList::const_iterator q = members.begin(); q != members.end(); ++q) + for(vector<string>::const_iterator q = memberNames.begin(); q != memberNames.end(); ++q) { - out << nl << self << "." << fixStructMember((*q)->name()) << " = " << defaultValue(*q) << ';'; + out << nl << self << "." << *q << " = " << *q << ';'; } out.dec(); out << nl << "end"; @@ -3070,7 +3116,7 @@ CodeVisitor::visitStructStart(const StructPtr& p) out.inc(); out << nl << "function r = ice_read(is)"; out.inc(); - out << nl << "r = " << abs << "();"; + out << nl << "r = " << abs << "(IceInternal.NoInit.Instance);"; unmarshalStruct(out, p, "r"); out.dec(); out << nl << "end"; @@ -4668,8 +4714,9 @@ CodeVisitor::unmarshalStruct(IceUtilInternal::Output& out, const StructPtr& p, c string m = fixStructMember((*q)->name()); if(isClass((*q)->type())) { - out << nl << v << "." << m << " = IceInternal.ValueHolder();"; - unmarshal(out, "is", "@(v_) " + v + "." + m + ".set(v_)", (*q)->type(), false, 0); + out << nl << m << "_ = IceInternal.ValueHolder();"; + out << nl << v << "." << m << " = " << m << "_;"; + unmarshal(out, "is", "@(v_) " + m + "_.set(v_)", (*q)->type(), false, 0); } else { @@ -4697,6 +4744,29 @@ CodeVisitor::convertStruct(IceUtilInternal::Output& out, const StructPtr& p, con } } +void +CodeVisitor::writeBaseClassArrayParams(IceUtilInternal::Output& out, const MemberInfoList& members, bool noInit) +{ + out << nl << "v = { "; + bool first = true; + for(MemberInfoList::const_iterator q = members.begin(); q != members.end(); ++q) + { + if(q->inherited) + { + if(first) + { + out << (noInit ? "IceInternal.NoInit.Instance" : q->fixedName); + first = false; + } + else + { + out << ", " << (noInit ? "[]" : q->fixedName); + } + } + } + out << " };"; +} + namespace { |