Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update local bindings (multiple value, typespec, patterns) fixes issues #35 & #246 #322

Merged
merged 35 commits into from Aug 13, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
090ee61
Add binding pred/patterns and use argument list for optional typed id…
Apr 25, 2012
27dddf5
Remove predicate from localbinding code.
Apr 25, 2012
45f2d6c
Local binding typespec/patternvars parsed correctly.
Apr 26, 2012
27f8d00
Add VAR variadic assignment, typespec, patternvars.
May 3, 2012
8299981
Change multi into count.
May 3, 2012
ca40051
Debugging ref bindings
May 3, 2012
d712078
Remove ref debug (not the issue - appears to be exceptions broken)
May 3, 2012
f8cab41
Remove more debugging stuff from codegen
May 3, 2012
14afc23
Update evalBinding
May 3, 2012
c997dda
Merge branch 'mathlib' into bindings
May 3, 2012
e87c5de
Merge branch 'master' into bindings
May 3, 2012
539b2c0
Debugging
May 5, 2012
ea0e2b7
debugging
May 5, 2012
04d7da2
Debugging
May 9, 2012
6a62bd3
debugging stuff
May 20, 2012
1ff5f8e
Merge remote-tracking branch 'upstream/master' into bindings
May 28, 2012
c27bbb5
Bindings updates
Jul 15, 2012
4de1bc2
Merge branch 'master' into bindings
Aug 2, 2012
c5d6a40
replace swtich in codegenbinding
Aug 3, 2012
70bb75f
Bindings
Aug 5, 2012
31305c3
Binding typespec checking implemented for 'var' only
Aug 8, 2012
1fc96ab
Typespec & binding patterns - all tests pass
Aug 9, 2012
b348c60
Rework binding analysis
Aug 9, 2012
6fd1727
Add variadic ref/forward bindings
Aug 9, 2012
59d3ad3
Remove whitespace
Aug 9, 2012
9f2353d
Merge remote-tracking branch 'upstream/master' into bindings
Aug 9, 2012
7f4a2bf
Remove some debug msgs
Aug 10, 2012
e40f03a
Update evaluator bindings
Aug 10, 2012
2b7a03b
Remove blah from test
Aug 10, 2012
ef8e522
Fix binding eval and clone
Aug 10, 2012
42a8b19
Fix codegen missing inline stuff
Aug 10, 2012
7059108
Tidy up some whitespace
Aug 10, 2012
1621e73
Add variadic binding test
Aug 10, 2012
fed1697
Update variadic binding test output
Aug 10, 2012
72a83a0
Update bindings test to show inferred types.
Aug 11, 2012
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 85 additions & 18 deletions compiler/src/analyzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -620,7 +620,6 @@ MultiPValuePtr analyzeExpr(ExprPtr expr, EnvPtr env)
static MultiPValuePtr analyzeExpr2(ExprPtr expr, EnvPtr env)
{
LocationContext loc(expr->location);

switch (expr->exprKind) {

case BOOL_LITERAL : {
Expand Down Expand Up @@ -855,7 +854,7 @@ MultiPValuePtr analyzeStaticObject(ObjectPtr x)
TypePtr t = staticType(x);
return new MultiPValue(PVData(t, true));
}
evaluateToplevelPredicate(y->patternVars, y->predicate, y->env);
evaluatePredicate(y->patternVars, y->predicate, y->env);
return analyzeExpr(y->expr, y->env);
}

Expand Down Expand Up @@ -1019,7 +1018,7 @@ MultiPValuePtr analyzeGVarInstance(GVarInstancePtr x)
}
}
x->analyzing = true;
evaluateToplevelPredicate(x->gvar->patternVars, x->gvar->predicate, x->env);
evaluatePredicate(x->gvar->patternVars, x->gvar->predicate, x->env);
PVData pv = analyzeOne(x->expr, x->env);
x->analyzing = false;
if (!pv.ok())
Expand Down Expand Up @@ -1493,7 +1492,7 @@ MultiPValuePtr analyzeAliasIndexing(GlobalAliasPtr x,
varParams->add(params->values[i]);
addLocal(bodyEnv, x->varParam, varParams.ptr());
}
evaluateToplevelPredicate(x->patternVars, x->predicate, bodyEnv);
evaluatePredicate(x->patternVars, x->predicate, bodyEnv);
AnalysisCachingDisabler disabler;
return analyzeExpr(x->expr, bodyEnv);
}
Expand Down Expand Up @@ -2103,7 +2102,7 @@ static EnvPtr analyzeStatementExpressionStatements(vector<StatementPtr> const &s
StatementAnalysis analyzeStatement(StatementPtr stmt, EnvPtr env, AnalysisContext* ctx)
{
LocationContext loc(stmt->location);

switch (stmt->stmtKind) {

case BLOCK : {
Expand Down Expand Up @@ -2296,31 +2295,99 @@ void initializeStaticForClones(StaticForPtr x, unsigned count)
EnvPtr analyzeBinding(BindingPtr x, EnvPtr env)
{
LocationContext loc(x->location);

switch (x->bindingKind) {

case VAR :
case REF :
case FORWARD : {
MultiPValuePtr right = analyzeMulti(x->values, env, x->names.size());
if (!right)
return NULL;
if (right->size() != x->names.size())
arityMismatchError(x->names.size(), right->size());
EnvPtr env2 = new Env(env);
for (unsigned i = 0; i < right->size(); ++i) {
PVData const &pv = right->values[i];
addLocal(env2, x->names[i], new PValue(pv.type, false));

vector<TypePtr> key;
vector<PatternCellPtr> cells;
vector<MultiPatternCellPtr> multiCells;

MultiPValuePtr mpv = analyzeMulti(x->values, env, x->args.size());
if (!mpv)
return NULL;

for (unsigned i = 0; i < mpv->size(); ++i) {
PVData const &pv = mpv->values[i];
key.push_back(pv.type);
}

if (x->varg.ptr()) {
if (key.size() < x->args.size())
arityMismatchError(x->args.size(), key.size());
}
else {
if (x->args.size() != key.size())
arityMismatchError(x->args.size(), key.size());
}

const vector<PatternVar> &pvars = x->patternVars;
EnvPtr patternEnv = new Env(env);
initializePatternEnv(patternEnv, pvars, cells, multiCells);

const vector<FormalArgPtr> &formalArgs = x->args;
for (unsigned i = 0; i < formalArgs.size(); ++i) {
FormalArgPtr y = formalArgs[i];
if (y->type.ptr())
if (!unifyPatternObj(evaluateOnePattern(y->type, patternEnv), key[i].ptr()))
matchBindingError(new MatchBindingError(i, key[i], y));
}

if (x->varg.ptr() && x->varg->type.ptr()) {
ExprPtr unpack = new Unpack(x->varg->type.ptr());
unpack->location = x->varg->type->location;
MultiStaticPtr types = new MultiStatic();
for (unsigned i = formalArgs.size(); i < key.size(); ++i)
types->add(key[i].ptr());
if (!unifyMulti(evaluateMultiPattern(new ExprList(unpack), patternEnv), types))
matchBindingError(new MatchMultiBindingError(formalArgs.size(), types, x->varg));
}

EnvPtr staticEnv = new Env(env);
for (unsigned i = 0; i < pvars.size(); ++i) {
if (pvars[i].isMulti) {
MultiStaticPtr ms = derefDeep(multiCells[i].ptr());
if (!ms)
error(pvars[i].name, "unbound pattern variable");
addLocal(staticEnv, pvars[i].name, ms.ptr());
x->patternTypes.push_back(ms.ptr());
}
else {
ObjectPtr v = derefDeep(cells[i].ptr());
if (!v)
error(pvars[i].name, "unbound pattern variable");
addLocal(staticEnv, pvars[i].name, v.ptr());
x->patternTypes.push_back(v.ptr());
}
}

evaluatePredicate(x->patternVars, x->predicate, staticEnv);

EnvPtr env2 = new Env(staticEnv);
for (unsigned i = 0; i < formalArgs.size(); ++i) {
FormalArgPtr y = formalArgs[i];
addLocal(env2, y->name, new PValue(key[i], false));
}
if (x->varg.ptr()) {
MultiPValuePtr varArgs = new MultiPValue();
for (unsigned i = formalArgs.size(); i < key.size(); ++i) {
PVData parg(key[i], false);
varArgs->values.push_back(parg);
}
addLocal(env2, x->varg->name, varArgs.ptr());
}

return env2;
}

case ALIAS : {
ensureArity(x->names, 1);
ensureArity(x->args, 1);
ensureArity(x->values->exprs, 1);
EnvPtr env2 = new Env(env);
ExprPtr y = foreignExpr(env, x->values->exprs[0]);
addLocal(env2, x->names[0], y.ptr());
addLocal(env2, x->args[0]->name, y.ptr());
return env2;
}

Expand Down
63 changes: 52 additions & 11 deletions compiler/src/clay.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -384,19 +384,19 @@ enum ObjectKind {
INSTANCE,
OVERLOAD,
PROCEDURE,
ENUMERATION,
ENUMERATION, // -- 20
ENUM_MEMBER,
GLOBAL_VARIABLE,
EXTERNAL_PROCEDURE,
EXTERNAL_ARG,
EXTERNAL_VARIABLE,
EXTERNAL_VARIABLE, // -- 25
EVAL_TOPLEVEL,

GLOBAL_ALIAS,

IMPORT,
MODULE_DECLARATION,
MODULE_HOLDER,
MODULE_HOLDER, // -- 30
MODULE,

ENV,
Expand All @@ -405,7 +405,7 @@ enum ObjectKind {

TYPE,

PATTERN,
PATTERN, // -- 35
MULTI_PATTERN,

VALUE_HOLDER,
Expand Down Expand Up @@ -1437,15 +1437,34 @@ enum BindingKind {
FORWARD
};

struct PatternVar;

struct Binding : public Statement {
int bindingKind;
vector<IdentifierPtr> names;
vector<PatternVar> patternVars;
vector<ObjectPtr> patternTypes;
ExprPtr predicate;
vector<FormalArgPtr> args;
FormalArgPtr varg;
ExprListPtr values;

Binding(int bindingKind,
const vector<FormalArgPtr> &args,
ExprListPtr values)
: Statement(BINDING), bindingKind(bindingKind),
args(args), values(values) {}
Binding(int bindingKind,
const vector<IdentifierPtr> &names,
ExprListPtr values)
const vector<PatternVar> &patternVars,
const vector<ObjectPtr> &patternTypes,
ExprPtr predicate,
const vector<FormalArgPtr> &args,
FormalArgPtr varg,
ExprListPtr values)
: Statement(BINDING), bindingKind(bindingKind),
names(names), values(values) {}
patternVars(patternVars),
predicate(predicate),
args(args), varg(varg),
values(values) {}
};

struct Assignment : public Statement {
Expand Down Expand Up @@ -1914,7 +1933,6 @@ struct Overload : public TopLevelItem {
bool nameIsPattern;
vector<PatternCellPtr> cells;
vector<MultiPatternCellPtr> multiCells;
EnvPtr patternEnv;
PatternPtr callablePattern;
vector<PatternPtr> argPatterns;
MultiPatternPtr varArgPattern;
Expand Down Expand Up @@ -3195,7 +3213,9 @@ enum MatchCode {
MATCH_ARITY_ERROR,
MATCH_ARGUMENT_ERROR,
MATCH_MULTI_ARGUMENT_ERROR,
MATCH_PREDICATE_ERROR
MATCH_PREDICATE_ERROR,
MATCH_BINDING_ERROR,
MATCH_MULTI_BINDING_ERROR
};

struct MatchResult : public Object {
Expand Down Expand Up @@ -3268,6 +3288,26 @@ struct MatchPredicateError : public MatchResult {
: MatchResult(MATCH_PREDICATE_ERROR), predicateExpr(predicateExpr) {}
};

struct MatchBindingError : public MatchResult {
unsigned argIndex;
TypePtr type;
FormalArgPtr arg;
MatchBindingError(unsigned argIndex, TypePtr type, FormalArgPtr arg)
: MatchResult(MATCH_BINDING_ERROR), argIndex(argIndex),
type(type), arg(arg) {}
};

struct MatchMultiBindingError : public MatchResult {
unsigned argIndex;
MultiStaticPtr types;
FormalArgPtr varArg;
MatchMultiBindingError(unsigned argIndex, MultiStaticPtr types, FormalArgPtr varArg)
: MatchResult(MATCH_MULTI_BINDING_ERROR),
argIndex(argIndex), types(types), varArg(varArg) {}
};

void initializePatternEnv(EnvPtr patternEnv, const vector<PatternVar> &pvars, vector<PatternCellPtr> &cells, vector<MultiPatternCellPtr> &multiCells);

MatchResultPtr matchInvoke(OverloadPtr overload,
ObjectPtr callable,
const vector<TypePtr> &argsKey);
Expand Down Expand Up @@ -3374,6 +3414,7 @@ InvokeEntry* lookupInvokeEntry(ObjectPtr callable,
const vector<ValueTempness> &argsTempness,
MatchFailureError &failures);

void matchBindingError(MatchResultPtr result);
void matchFailureLog(MatchFailureError const &err);
void matchFailureError(MatchFailureError const &err);

Expand Down Expand Up @@ -3590,7 +3631,7 @@ TypePtr evaluateType(ExprPtr expr, EnvPtr env);
void evaluateMultiType(ExprListPtr exprs, EnvPtr env, vector<TypePtr> &out);
IdentifierPtr evaluateIdentifier(ExprPtr expr, EnvPtr env);
bool evaluateBool(ExprPtr expr, EnvPtr env);
void evaluateToplevelPredicate(const vector<PatternVar> &patternVars,
void evaluatePredicate(const vector<PatternVar> &patternVars,
ExprPtr expr, EnvPtr env);

ValueHolderPtr intToValueHolder(int x);
Expand Down
16 changes: 13 additions & 3 deletions compiler/src/clone.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ void clone(const vector<PatternVar> &x, vector<PatternVar> &out)
out = x;
}

void clone(const vector<ObjectPtr> &x, vector<ObjectPtr> &out)
{
out = x;
}

void clone(const vector<IdentifierPtr> &x, vector<IdentifierPtr> &out)
{
for (unsigned i = 0; i < x.size(); ++i)
Expand Down Expand Up @@ -278,9 +283,14 @@ StatementPtr clone(StatementPtr x)

case BINDING : {
Binding *y = (Binding *)x.ptr();
vector<IdentifierPtr> names;
clone(y->names, names);
out = new Binding(y->bindingKind, names, clone(y->values));
vector<FormalArgPtr> args;
vector<PatternVar> patternVars;
vector<ObjectPtr> patternTypes;
clone(y->args, args);
clone(y->patternVars, patternVars);
clone(y->patternTypes, patternTypes);
out = new Binding(y->bindingKind, patternVars, patternTypes, cloneOpt(y->predicate),
args, cloneOpt(y->varg), clone(y->values));
break;
}

Expand Down
Loading