summaryrefslogtreecommitdiff
path: root/parse
AgeCommit message (Collapse)Author
2017-11-05Accept the globalness of file.Ori Bernstein
2017-10-31Loop uniformly in export.Ori Bernstein
2017-10-29Cosmetic tweakOri Bernstein
2017-10-29Fix traits when exported cross-namespaces.Ori Bernstein
2017-10-23Remove debug printf.Ori Bernstein
2017-10-23Propagate hiddenness properly across usefile merges.Ori Bernstein
2017-10-21Set the ns on impl decls to match the impl ns.Ori Bernstein
2017-10-21Don't bungle trait merging and exporting.Ori Bernstein
2017-10-19Push the env before specializing the proto type.Ori Bernstein
2017-10-19If we haven't installed the proto, use the one we have.Ori Bernstein
2017-10-18Look up the proto before attaching the gimpls.Ori Bernstein
This means we don't lose the gimpls when they come from a file other than the one they're implemented in.
2017-10-06Don't spuriously constrain types.Ori Bernstein
2017-10-05tysearch before checking for freshen requirement.Ori Bernstein
2017-09-23Remove obsolete assert.Ori Bernstein
2017-09-22Fix trait lookup for nested pointers.Ori Bernstein
2017-09-22Remove 'in' token.Ori Bernstein
It's now available as a variable name.
2017-09-16Fix occurs check.Ori Bernstein
Fixes bug #145. Thanks Milo (iitalics on github).
2017-09-05Fix traits on named types.Ori Bernstein
Erm.
2017-09-02Fix export tagging of traits.Ori Bernstein
Sometimes, traits would not get tagged for export transitively.
2017-09-02Unjank trait resolution.Ori Bernstein
2017-09-02'in' is now a warning.Ori Bernstein
2017-08-26Make internal functions static.Ori Bernstein
2017-08-26...The line that fixes things should probably get committed.Ori Bernstein
2017-08-26It's not an lvalue.Ori Bernstein
2017-08-26Add monotonically increasing equality check.Ori Bernstein
Because unlike the bit sets, nothing gets removed from here, we should either converge on equality, or error out.
2017-08-23Check constraints correctly on typarams.Ori Bernstein
2017-08-23Resolve types in match rank.Ori Bernstein
2017-08-22Clean up usefile cruft.Ori Bernstein
2017-08-22Remove dead code/comments.Ori Bernstein
2017-08-21The indexes with should be numbers as well as intsfixtraitsOri Bernstein
2017-08-21Clean up dial+plan9.myrOri Bernstein
2017-08-20Fix a few bugs.Ori Bernstein
2017-08-20Fix trait shit.Ori Bernstein
2017-08-19File is already global.Ori Bernstein
Let's use it.
2017-08-13Remove dead debug code.Ori Bernstein
2017-08-13Types are also equal with flipflopping.Ori Bernstein
If we have types a -> b -> ptr -> a, and b -> a -> ptr -> b, there are cases where the two types can end up on different branches, so we end up flipflopping between avisited and bvisited containing the type we want.
2017-08-13If a trait is specialized over a generic, it's generic too.Ori Bernstein
2017-08-08Bring back enforced namespaces.Ori Bernstein
It turns out that people actually like being forced to type the full names. Go figure. It does have the benefit of adding pressure to keep package names short. Eventually, we'll probably grow the ability to alias a package at import. We'll see how that goes. This reverts commit c5245eaa80064b77186fa286f8e5e8bca73309ab.
2017-08-07Failing to load a usefile isn't a crash.Ori Bernstein
Exit with a sane message.
2017-08-02Disallow types of the form `type t = t`.Ori Bernstein
This is an infinite loop, and is not meaningful.
2017-07-31Move array size checking to verification.Ori Bernstein
We don't necessarily know the type of the array index until after substituting, so things like sizeof() or constant folding may not work.
2017-07-31Handle empty array sizes correctly.Ori Bernstein
The size parameter *may* be null.
2017-07-30Add hook into frontend for sizeof() folding.Ori Bernstein
Before, code like: const f = { var buf: byte[sizeof(int)] } would crash us, because `sizeof` would not get folded. A slightly subtle point: muse doens't install a hook here, but since it's already handling processed usefiles, the array sizes should already be prefolded for its viewing pleasure.
2017-07-29Don't use tyhash for scoping.Ori Bernstein
Soon enough, it's going to use a strict equality comparison, so that params from different scopes will be considered different. It's a step towards deduping.
2017-07-29Eliminate the deduptab.Ori Bernstein
tydedup does the job.
2017-07-29Finally do a by-scope comparison of generic types.Ori Bernstein
This should clear the way for better deduplication.
2017-07-29Automatic variablesOri Bernstein
Hello, I wrote this patch to start a conversation about resource management in Myrddin. ~ Introduction ~~~~~~~~~~~~~~ The patch attached provides a hopefully life-improving and surely non-invasive mechanism to handle resources that have block-limited lifetimes: automatic variables. This resource-management scheme can be found in multiple languages today. For example, C++ calls destructors automatically at the end of the scope of a variable; similarly, Rust automatically calls user-defined code when a variable's scope ends; finally, also related is Go's defer statement which ensures that resource-releasing code is called at the end of a function. ~ Description ~~~~~~~~~~~~~ The idea is that every "binder" of the language (var/const/ fn args/match) offers the possibility to mark the variables it binds as "automatic" using the 'auto' keyword. An automatic variable must be of a type that implements the new builtin 'disposable' trait below. When the scope of a variable 'v' marked as automatic ends, '__dispose__(v)' is called. That's it. trait disposable @a = __dispose__ : (val : @a -> void) ;; ~ Example Programs ~~~~~~~~~~~~~~~~~~ The language modification is shown in action in the program below. use std impl disposable int = __dispose__ = {x std.put("__dispose__({})\n", x) } ;; const g = {auto x -> x++ - 1 } const main = { var auto i, auto j = 42 for i = 1; i < 6; i=i+1 var auto z : int = 2*i if i == 3 std.put("z = {} -- cont\n", z) continue ;; std.put("z = {}\n", z) if i/2 == 2 var auto inner : int = 1234 break ;; ;; i = g(321) } The output of the previous test program is: 1: z = 2 2: __dispose__(2) 3: z = 4 4: __dispose__(4) 5: z = 6 -- cont 6: __dispose__(6) 7: z = 8 8: __dispose__(1234) 9: __dispose__(8) 10: __dispose__(322) 11: __dispose__(42) 12: __dispose__(320) Some important remarks: * Unlike Go, __dispose__ is called as soon as the scope of a variable ends, not at the end of the function. In particular, the variable 'z' in the example is always disposed of before starting the next iteration. (An iteration ends the loop body block.) * __dispose__ is called in reverse order of declaration This allows variables to depend on resources of variables already in scope. * Regardless of how a block is exited (fallthrough, break, continue, return), variables of the blocks left are disposed of in reverse order and exactly once. * As line 10 of the output shows, the __dispose__ calls happen "after" the return statement of the function. (It happens after the post-increment, so x's value when it is disposed of is 322.) The following example shows that, using an ad hoc type, it is possible to execute arbitrary code at the end of a scope. type defer = (-> void) impl disposable defer = __dispose__ = {f: defer; f()} ;; const foobar = {... const auto _dummy = ({ std.put("Bye!\n") }: defer) ... } ~ Discussion ~~~~~~~~~~~~ Multiple alternatives exist for resource management, and hopefully this mail starts an interesting debate. According to me, here are the pros and cons of the current proposal: - PROS - * Opt-in * Backward compatible * Simple * The spirit of C's original auto * It has an implementation - CONS - * No safety guarantees/compiler checks whatsoever * Syntactic pollution: 'auto' keyword, 'disposable' trait Finally, note that the current patch does not implement auto support for variables bound in match statements. This will come in a followup patch if there is sufficient interest. Also, the patch does not provide proper support (or proper errors) for gotos and labels.
2017-07-28Fix error message for generics in non-generic decls.Ori Bernstein
2017-07-27std.change std.name std.lookup std.rules.Ori Bernstein
std.no std.on std.every std.name std.you std.use. The rules for an un-namespaced name now are as follows: 1) Attempt to look up a name in the current file. 2) Check all namespaces for a unique name. If the name is not globally unique, give an error.
2017-07-26Be stricter about declarations in function types.Ori Bernstein
stupid shit like: const foo : (bar : baz, blah, here -> void) should not miscompile any more.