Skip to content

Commit

Permalink
Merge pull request #5078 from 9rnsr/d_overloadApply
Browse files Browse the repository at this point in the history
Refactor: Add extern (D) overloadApply and use lambda
  • Loading branch information
yebblies committed Sep 15, 2015
2 parents e91a6ac + c1d45e1 commit 6354326
Show file tree
Hide file tree
Showing 6 changed files with 718 additions and 881 deletions.
29 changes: 7 additions & 22 deletions src/dclass.d
Original file line number Diff line number Diff line change
Expand Up @@ -34,19 +34,6 @@ import ddmd.statement;
import ddmd.target;
import ddmd.visitor;

/**********************************************************
* fd is in the vtbl[] for this class.
* Return 1 if function is hidden (not findable through search).
*/
extern (C++) int isf(void* param, Dsymbol s)
{
FuncDeclaration fd = s.isFuncDeclaration();
if (!fd)
return 0;
//printf("param = %p, fd = %p %s\n", param, fd, fd->toChars());
return cast(RootObject)param == fd;
}

struct BaseClass
{
Type type; // (before semantic processing)
Expand Down Expand Up @@ -1080,23 +1067,21 @@ public:
return false;
}
s = s.toAlias();
OverloadSet os = s.isOverloadSet();
if (os)
if (auto os = s.isOverloadSet())
{
for (size_t i = 0; i < os.a.dim; i++)
foreach (sm; os.a)
{
Dsymbol s2 = os.a[i];
FuncDeclaration f2 = s2.isFuncDeclaration();
if (f2 && overloadApply(f2, cast(void*)fd, &isf))
auto fm = sm.isFuncDeclaration();
if (overloadApply(fm, s => fd == s.isFuncDeclaration()))
return false;
}
return true;
}
else
{
FuncDeclaration fdstart = s.isFuncDeclaration();
//printf("%s fdstart = %p\n", s->kind(), fdstart);
if (overloadApply(fdstart, cast(void*)fd, &isf))
auto f = s.isFuncDeclaration();
//printf("%s fdstart = %p\n", s.kind(), fdstart);
if (overloadApply(f, s => fd == s.isFuncDeclaration()))
return false;
return !fd.parent.isTemplateMixin();
}
Expand Down
32 changes: 14 additions & 18 deletions src/declaration.d
Original file line number Diff line number Diff line change
Expand Up @@ -997,31 +997,27 @@ public:
{
if (!hasOverloads)
{
if (aliassym.isFuncDeclaration() || aliassym.isTemplateDeclaration())
if (aliassym.isFuncDeclaration() ||
aliassym.isTemplateDeclaration())
{
return aliassym;
}
}
struct ParamUniqueSym

Dsymbol result = null;
overloadApply(aliassym, (Dsymbol s)
{
extern (C++) static int fp(void* param, Dsymbol s)
if (result)
{
Dsymbol* ps = cast(Dsymbol*)param;
if (*ps)
{
*ps = null;
return 1; // ambiguous, done
}
else
{
*ps = s;
return 0;
}
result = null;
return 1; // ambiguous, done
}
}

Dsymbol result = null;
overloadApply(aliassym, &result, &ParamUniqueSym.fp);
else
{
result = s;
return 0;
}
});
return result;
}

Expand Down
Loading

0 comments on commit 6354326

Please sign in to comment.