Hi Markus,
this isn't by design, but it is a bug in the design of
nsDependentConcatenation. We've tried to squash it in time for Mozilla 1.0 but
unfortunately didn't make it. Right now it means two things:
1) you can't concatenate a concatenation if we can't tell it's a concatenation
by the string's type e.g.:
// XXX won't work :-(
function f(const nsAString& inStr) {
mStr = inStr + mStr;
}
f(str1 + str2);
This doesn't work because by passing the concatenation (str1+str2) into
function f you lose the type information, and the concatenation (mStr+inStr)
inside function f can't properly deal with not knowing that inStr is also a
concatenation.
// Suggested work-around:
nsAutoString myStr(str1 + str2);
f(myStr);
2) you can't have a concatenation as the right hand side of another
concatenation, e.g.:
// XXX won't work :-(
function f(const nsDependentString& inStr) {
mStr = mStr + inStr;
}
f(str1 + str2);
As a rule of thumb, don't pass a concatenation into a function.
Note that we do it in places in Mozilla code where we know we can get away
with it (for now).
Your problem is a variation of #1. Another way to work around your problem:
void test(int iteration, const nsDependentConcatenation& prefix)
{
if(iteration>10) {
nsAutoString result;
result=prefix;
return;
}
test(iteration+1, prefix+NS_LITERAL_STRING(".x"));
}
void test(int iteration, const nsAString& prefix)
{
test(iteration+1, prefix+NS_LITERAL_STRING(".x"));
}
test(0, NS_LITERAL_STRING("x"));
Or skip the nsAString version of test and use this call:
test(0, NS_LITERAL_STRING("")+NS_LITERAL_STRING("x"));
Yeah, those are kinda ugly, but it'll save you a few copies along the way.
I hope this helps,
jag
Markus Essl wrote:
> Hi!
>
> I hope this is the right newsgroup, and I hope you can answer my question:
>
> I have a problem with an nsDependentConnection when called recursivly:
>
> (result contains x.x\0\0\0\0 - but sometimes the copy itererator won't
> finish because bytes_copied is 0, and first!=last will never get true..
> (nsAlgorithm.h:91)
>
> void test_fails(int iteration, const nsAString& prefix)
> {
> if(iteration>10) {
> nsAutoString result;
> result=prefix;
> return;
> }
> test_fails(iteration+1, prefix+NS_LITERAL_STRING(".x"));
> }
>
> But this works: (result.mUStr contains "x.x.x.x.x.x.x.x.x.x.x")
>
> void test(int iteration, const nsAString& prefix)
> {
> if(iteration>10) {
> nsAutoString result;
> result=prefix;
> return;
> }
> nsAutoString string;
> string=prefix;
> test(iteration+1, string+NS_LITERAL_STRING(".x"));
> }
> test(0, NS_LITERAL_STRING("x"));
>
>
> Is this by design (i don't hope so!) or is this a bug? I couldn't find
> anything in bugzilla. BTW, I use the RC3 codebase.
>
> bye,
> Markus
>