Dependency
- Bug fix (#57) - Undid hack (of #46) for Context setting of VariableStdAloneAssignments - Bug fix (#54) in VariableExpression whereby global lookups failed because they used `resolveWithin()` and not `resolveBest()` Resolution - Implemented `generateNameBest(Entity)` which can generate the full absolute path of the given Entity - Added debug statements to `isDescendant(Container, Entity)` - Added a TODO for when isDescendant fails, the asserts should be removed and placed there Mapper - The `symbolLookup()` method now takes in only the Entity and provides a hash (by making use of `generateNameBest()`) DGen - Switched to using the new `symbolLookup(Entity)` in `transform()` wherever it was being used Test cases - Updated test case `simple_function_decls.t` to use a global variable reference in a VariableExpression to test the fix for #54
This commit is contained in:
parent
2a12c310a6
commit
ddea68a73d
|
@ -48,9 +48,8 @@ public final class DCodeEmitter : CodeEmitter
|
||||||
gprintln("Is ContextNull?: "~to!(string)(context is null));
|
gprintln("Is ContextNull?: "~to!(string)(context is null));
|
||||||
gprintln("Wazza contect: "~to!(string)(context.container));
|
gprintln("Wazza contect: "~to!(string)(context.container));
|
||||||
auto typedEntityVariable = context.tc.getResolver().resolveBest(context.getContainer(), varAs.varName); //TODO: Remove `auto`
|
auto typedEntityVariable = context.tc.getResolver().resolveBest(context.getContainer(), varAs.varName); //TODO: Remove `auto`
|
||||||
string typedEntityVariableName = context.tc.getResolver().generateName(context.getContainer(), typedEntityVariable);
|
|
||||||
|
|
||||||
string renamedSymbol = SymbolMapper.symbolLookup(context.getContainer(), typedEntityVariableName);
|
string renamedSymbol = SymbolMapper.symbolLookup(typedEntityVariable);
|
||||||
|
|
||||||
|
|
||||||
// If we are needed as part of a VariabvleDeclaration-with-assignment
|
// If we are needed as part of a VariabvleDeclaration-with-assignment
|
||||||
|
@ -77,7 +76,6 @@ public final class DCodeEmitter : CodeEmitter
|
||||||
Context context = varDecInstr.getContext();
|
Context context = varDecInstr.getContext();
|
||||||
|
|
||||||
Variable typedEntityVariable = cast(Variable)context.tc.getResolver().resolveBest(context.getContainer(), varDecInstr.varName); //TODO: Remove `auto`
|
Variable typedEntityVariable = cast(Variable)context.tc.getResolver().resolveBest(context.getContainer(), varDecInstr.varName); //TODO: Remove `auto`
|
||||||
string typedEntityVariableName = context.tc.getResolver().generateName(context.getContainer(), typedEntityVariable);
|
|
||||||
|
|
||||||
//NOTE: We should remove all dots from generated symbol names as it won't be valid C (I don't want to say C because
|
//NOTE: We should remove all dots from generated symbol names as it won't be valid C (I don't want to say C because
|
||||||
// a custom CodeEmitter should be allowed, so let's call it a general rule)
|
// a custom CodeEmitter should be allowed, so let's call it a general rule)
|
||||||
|
@ -86,7 +84,7 @@ public final class DCodeEmitter : CodeEmitter
|
||||||
//NOTE: We may need to create a symbol table actually and add to that and use that as these names
|
//NOTE: We may need to create a symbol table actually and add to that and use that as these names
|
||||||
//could get out of hand (too long)
|
//could get out of hand (too long)
|
||||||
// NOTE: Best would be identity-mapping Entity's to a name
|
// NOTE: Best would be identity-mapping Entity's to a name
|
||||||
string renamedSymbol = SymbolMapper.symbolLookup(context.getContainer(), varDecInstr.varName);
|
string renamedSymbol = SymbolMapper.symbolLookup(typedEntityVariable);
|
||||||
|
|
||||||
|
|
||||||
// Check to see if this declaration has an assignment attached
|
// Check to see if this declaration has an assignment attached
|
||||||
|
@ -126,9 +124,11 @@ public final class DCodeEmitter : CodeEmitter
|
||||||
Context context = fetchValueVarInstr.getContext();
|
Context context = fetchValueVarInstr.getContext();
|
||||||
|
|
||||||
Variable typedEntityVariable = cast(Variable)context.tc.getResolver().resolveBest(context.getContainer(), fetchValueVarInstr.varName); //TODO: Remove `auto`
|
Variable typedEntityVariable = cast(Variable)context.tc.getResolver().resolveBest(context.getContainer(), fetchValueVarInstr.varName); //TODO: Remove `auto`
|
||||||
string typedEntityVariableName = context.tc.getResolver().generateName(context.getContainer(), typedEntityVariable);
|
|
||||||
|
|
||||||
string renamedSymbol = SymbolMapper.symbolLookup(context.getContainer(), typedEntityVariableName);
|
//TODO: THis is giving me kak (see issue #54), it's generating name but trying to do it for the given container, relative to it
|
||||||
|
//TODO: We might need a version of generateName that is like generatenamebest (currently it acts like generatename, within)
|
||||||
|
|
||||||
|
string renamedSymbol = SymbolMapper.symbolLookup(typedEntityVariable);
|
||||||
|
|
||||||
return renamedSymbol;
|
return renamedSymbol;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,13 +24,20 @@ public final class SymbolMapper
|
||||||
// this.tc = tc;
|
// this.tc = tc;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
public static string symbolLookup(Container container, string entityNameIn)
|
/**
|
||||||
|
* Given an Entity this will generate a unique (but consistent)
|
||||||
|
* symbol name for it by taking the md5 hash of the full absolute
|
||||||
|
* path to the Entity and finally prefixing it with <code>t_</code>.
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* entityIn = The Entity to generate a hash for
|
||||||
|
*
|
||||||
|
* Returns: The symbol hash
|
||||||
|
*/
|
||||||
|
public static string symbolLookup(Entity entityIn)
|
||||||
{
|
{
|
||||||
// Firstly translate the entity name to the full absolute path
|
// Generate the absolute full path of the Entity
|
||||||
auto entity = tc.getResolver().resolveBest(container, entityNameIn); //TODO: Remove `auto`
|
string absoluteFullPath = tc.getResolver().generateNameBest(entityIn);
|
||||||
string entityNameAbsolute = tc.getResolver().generateName(tc.getModule(), entity);
|
|
||||||
|
|
||||||
gprintln("symbolLookup(): "~to!(string)(container));
|
|
||||||
|
|
||||||
// Hash the absolute path name
|
// Hash the absolute path name
|
||||||
// FIXME: Ensure these hashes are unique (use the smbyol table!)
|
// FIXME: Ensure these hashes are unique (use the smbyol table!)
|
||||||
|
@ -38,11 +45,9 @@ public final class SymbolMapper
|
||||||
import std.digest.md : md5Of;
|
import std.digest.md : md5Of;
|
||||||
|
|
||||||
// Generate the name as `_<hexOfAbsPath>`
|
// Generate the name as `_<hexOfAbsPath>`
|
||||||
string symbolName = toHexString!(LetterCase.lower)(md5Of(entityNameAbsolute));
|
string symbolName = toHexString!(LetterCase.lower)(md5Of(absoluteFullPath));
|
||||||
symbolName="t_"~symbolName;
|
symbolName="t_"~symbolName;
|
||||||
|
|
||||||
return symbolName;
|
return symbolName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -723,7 +723,7 @@ public class DNodeGenerator
|
||||||
nearestName = path;
|
nearestName = path;
|
||||||
|
|
||||||
/* Resolve the Entity */
|
/* Resolve the Entity */
|
||||||
Entity namedEntity = tc.getResolver().resolveWithin(context.getContainer(), nearestName);
|
Entity namedEntity = tc.getResolver().resolveBest(context.getContainer(), nearestName);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1284,6 +1284,7 @@ public class DNodeGenerator
|
||||||
else if(cast(VariableAssignmentStdAlone)entity)
|
else if(cast(VariableAssignmentStdAlone)entity)
|
||||||
{
|
{
|
||||||
VariableAssignmentStdAlone vAsStdAl = cast(VariableAssignmentStdAlone)entity;
|
VariableAssignmentStdAlone vAsStdAl = cast(VariableAssignmentStdAlone)entity;
|
||||||
|
vAsStdAl.setContext(context);
|
||||||
|
|
||||||
/* TODO: CHeck avriable name even */
|
/* TODO: CHeck avriable name even */
|
||||||
gprintln("YEAST ENJOYER");
|
gprintln("YEAST ENJOYER");
|
||||||
|
@ -1297,8 +1298,6 @@ public class DNodeGenerator
|
||||||
Variable variable = cast(Variable)tc.getResolver().resolveBest(c, vAsStdAl.getVariableName());
|
Variable variable = cast(Variable)tc.getResolver().resolveBest(c, vAsStdAl.getVariableName());
|
||||||
assert(variable);
|
assert(variable);
|
||||||
|
|
||||||
/* Set the context of the assignment to the Context of the Variable being assigned to */
|
|
||||||
vAsStdAl.setContext(variable.getContext());
|
|
||||||
|
|
||||||
/* Pool the variable */
|
/* Pool the variable */
|
||||||
DNode varDecDNode = pool(variable);
|
DNode varDecDNode = pool(variable);
|
||||||
|
|
|
@ -16,9 +16,48 @@ public final class Resolver
|
||||||
this.typeChecker = typeChecker;
|
this.typeChecker = typeChecker;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate the absolute full path of the given Entity
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* entity = The Entity to generate the full absolute path for
|
||||||
|
*
|
||||||
|
* Returns: The absolute full path
|
||||||
|
*/
|
||||||
|
public string generateNameBest(Entity entity)
|
||||||
|
{
|
||||||
|
string absoluteFullPath;
|
||||||
|
|
||||||
|
assert(entity);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search till we get to the top-most Container
|
||||||
|
* then generate a name relative to that with `generateName(topMostContainer, entity)`
|
||||||
|
*/
|
||||||
|
Entity parentingEntity = entity;
|
||||||
|
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
parentingEntity = cast(Entity)parentingEntity.parentOf();
|
||||||
|
|
||||||
|
if(parentingEntity.parentOf() is null)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
absoluteFullPath = generateName(cast(Container)parentingEntity, entity);
|
||||||
|
|
||||||
|
|
||||||
|
return absoluteFullPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given an Entity generate it's full path relative to a given
|
* Given an Entity generate it's full path relative to a given
|
||||||
* container
|
* container, this is akin to `generateNameWithin()` in the
|
||||||
|
* sense that it will fail if the entity prvided is not
|
||||||
|
* contained by `relativeTo` - returning null
|
||||||
*/
|
*/
|
||||||
public string generateName(Container relativeTo, Entity entity)
|
public string generateName(Container relativeTo, Entity entity)
|
||||||
{
|
{
|
||||||
|
@ -89,6 +128,7 @@ public final class Resolver
|
||||||
/* If not */
|
/* If not */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
//TODO: technically an assert should be here and the one in isDescdant removed
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -115,6 +155,10 @@ public final class Resolver
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
gprintln("c isdecsenat: "~to!(string)(c));
|
||||||
|
gprintln("currentEntity: "~to!(string)(currentEntity));
|
||||||
|
gprintln("currentEntity(parent): "~to!(string)(currentEntity.parentOf()));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Make sure this condition holds
|
* TODO: Make sure this condition holds
|
||||||
*
|
*
|
||||||
|
|
|
@ -12,6 +12,6 @@ int banana(int j)
|
||||||
{
|
{
|
||||||
int h = 64;
|
int h = 64;
|
||||||
|
|
||||||
k=1+h+apple(1, apple(2, 3));
|
k=1+h+apple(1, apple(2, 3))+k;
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue