summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2022-07-21 15:50:11 +0200
committerGitHub <noreply@github.com>2022-07-21 15:50:11 +0200
commit12825a7def26d6d58868adf3bd86808319a018d1 (patch)
treeb55a1551df5a2b809b3fd0e7e6fae94b53c59740 /cpp/src
parentBump terser from 5.14.1 to 5.14.2 in /js (#1385) (diff)
downloadice-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.cpp122
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
{