digitalmars.D.bugs - [Issue 4021] New: [CTFE] AA rehash
- d-bugmail puremagic.com (31/31) Mar 28 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4021
- d-bugmail puremagic.com (52/52) Apr 08 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4021
- d-bugmail puremagic.com (84/84) Apr 08 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4021
- d-bugmail puremagic.com (11/11) Aug 26 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4021
- d-bugmail puremagic.com (13/13) Aug 03 2011 http://d.puremagic.com/issues/show_bug.cgi?id=4021
http://d.puremagic.com/issues/show_bug.cgi?id=4021
Summary: [CTFE] AA rehash
Product: D
Version: future
Platform: x86
OS/Version: Windows
Status: NEW
Keywords: rejects-valid
Severity: normal
Priority: P2
Component: DMD
AssignedTo: nobody puremagic.com
ReportedBy: bearophile_hugs eml.cc
This program, with dmd 2.042:
int foo() {
int[int] aa = [1: 1];
aa.rehash;
return 1;
}
enum _ = foo();
void main() {}
Generates the errors:
...\dmd\src\druntime\import\object.di(318): Error: cannot evaluate
_aaRehash(&this.p,(& D12TypeInfo_Hii6__initZ)) at compile time
test.d(3): Error: cannot evaluate aa.rehash() at compile time
test.d(6): Error: cannot evaluate foo() at compile time
test.d(6): Error: cannot evaluate foo() at compile time
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 28 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4021
Michael Rynn <y0uf00bar gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |y0uf00bar gmail.com
---
Regarding calls to _aaRehash(aaA* paa, TypeInfo keyti) from the .rehash
property. The D 2.042 passes to aaRehash a TypeInfo instance that is
inconsistent with other internal calls to it by _aaGet .rehash passes the AA
typeinfo, while _aaGet passes the key TypeInfo.
private char* cstr(string s)
{
char[] buf = new char[s.length+1];
uint slen = s.length;
for(int si = 0; si < slen; si++)
{
buf[si] = s[si];
}
buf[slen] = 0;
return buf.ptr;
}
void* _aaRehash(AA* paa, TypeInfo keyti)
{
BB newb;
//**************** stick these lines in, and you will see what I mean.., and
might be motivated to fix it soon.
TypeInfo origti = paa.a.keyti;
if (origti != keyti)
{
printf("wrong ti - need %s, not %s\n", cstr(origti.toString()),
cstr(keyti.toString()));
}
//****************
More explanation ad nauseum.
_aaGet calls _aaRehash with the keyti it got (which is really the TypeInfo of
the key), and caches it in struct BB. _d_assocarrayliteralT also figures out
and caches the key TypeInfo from the TypeInfo_AssociativeArray.
_aaRehash is written so that it must use same key TypeInfo as aaGet, and
_d_assocarrayliteralT, in the keyti.compare, otherwise, keys may end up
differently ordered after a rehash, and subsequent searches may fail. I was
very puzzled when this happened when testing .rehash. This bug has been present
for some time now, so maybe .rehash is not frequently used.
When .rehash is called from D code, and _aaRehash is called with the TypeInfo
of the AA , presumed to be a TypeInfo_AssociativeArray, and not that of the
key.
This is just a bit more evidence that the AA C interface is old and rickety.
It could at least be made more consistent, and less dangerously redundent.
_aaRehash should not need a TypeInfo passed to it at all. It already has the
correct keyti in struct BB, if there has been any entries added.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 08 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4021
---
// I feel obliged to submit a version of function _aaRehash that ignores the
TypeInfo passed to it, to make the keyti argument redundent. (
druntime/src/rt/aaA.d).
void* _aaRehash(AA* paa, TypeInfo keyti)
{
BB newb;
TypeInfo origti;
void _aaRehash_x(aaA* olde)
{
while (1)
{
auto left = olde.left;
auto right = olde.right;
olde.left = null;
olde.right = null;
aaA *e;
//printf("rehash %p\n", olde);
auto key_hash = olde.hash;
size_t i = key_hash % newb.b.length;
auto pe = &newb.b[i];
while ((e = *pe) !is null)
{
//printf("\te = %p, e.left = %p, e.right = %p\n", e, e.left,
e.right);
assert(e.left != e);
assert(e.right != e);
if (key_hash == e.hash)
{
auto c = origti.compare(olde + 1, e + 1);
assert(c != 0);
pe = (c < 0) ? &e.left : &e.right;
}
else
pe = (key_hash < e.hash) ? &e.left : &e.right;
}
*pe = olde;
if (right)
{
if (!left)
{ olde = right;
continue;
}
_aaRehash_x(right);
}
if (!left)
break;
olde = left;
}
}
//printf("Rehash\n");
if (paa.a)
{
auto aa = paa.a;
auto len = _aaLen(*paa);
if (len)
{
size_t i;
origti = aa.keyti;
for (i = 0; i < prime_list.length - 1; i++)
{
if (len <= prime_list[i])
break;
}
len = prime_list[i];
newb.b = new aaA*[len];
foreach (e; aa.b)
{
if (e)
_aaRehash_x(e);
}
delete aa.b;
newb.nodes = aa.nodes;
newb.keyti = aa.keyti;
}
*paa.a = newb;
_aaBalance(paa);
}
return (*paa).a;
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 08 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4021 With dmd 2.048 the error message is a little different: ...\dmd\src\druntime\import\object.di(354): Error: _aaRehash cannot be interpreted at compile time, because it has no available source code test.d(3): Error: cannot evaluate aa.rehash() at compile time test.d(6): Error: cannot evaluate foo() at compile time test.d(6): Error: cannot evaluate foo() at compile time -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 26 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4021
Walter Bright <bugzilla digitalmars.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
CC| |bugzilla digitalmars.com
Resolution| |FIXED
17:15:06 PDT ---
https://github.com/D-Programming-Language/dmd/commit/9318dc44c3e9aa75907966b9fd122c0cc6700891
https://github.com/D-Programming-Language/dmd/commit/571661646ca420aa4c3fb348e86e35ed8faae624
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Aug 03 2011









d-bugmail puremagic.com 