diff options
author | Araq <rumpf_a@web.de> | 2013-05-11 10:30:49 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2013-05-11 10:30:49 +0200 |
commit | 258aabba653c6f8a08b4d40416c1243398e5ff6f (patch) | |
tree | 31c002b8bac12ec93928420e2fbfb2d8b664e28e | |
parent | 1980c8930d69ec3a53bcb4da993d387269f78eab (diff) | |
download | Nim-258aabba653c6f8a08b4d40416c1243398e5ff6f.tar.gz |
todo.txt changes
-rw-r--r-- | compiler/semgnrc.nim | 5 | ||||
-rw-r--r-- | compiler/semtempl.nim | 17 | ||||
-rw-r--r-- | todo.txt | 90 |
3 files changed, 65 insertions, 47 deletions
diff --git a/compiler/semgnrc.nim b/compiler/semgnrc.nim index 8c3cef027..90e272030 100644 --- a/compiler/semgnrc.nim +++ b/compiler/semgnrc.nim @@ -72,11 +72,6 @@ proc semGenericStmtSymbol(c: PContext, n: PNode, s: PSym): PNode = else: result = n else: result = newSymNode(s, n.info) - -proc semMixinStmt(c: PContext, n: PNode, toMixin: var TIntSet): PNode = - for i in 0 .. < n.len: - toMixin.incl(considerAcc(n.sons[i]).id) - result = newNodeI(nkNilLit, n.info) proc Lookup(c: PContext, n: PNode, flags: TSemGenericFlags, ctx: var TIntSet): PNode = diff --git a/compiler/semtempl.nim b/compiler/semtempl.nim index 6b4af2a94..f88c7e3a4 100644 --- a/compiler/semtempl.nim +++ b/compiler/semtempl.nim @@ -1,7 +1,7 @@ # # # The Nimrod Compiler -# (c) Copyright 2012 Andreas Rumpf +# (c) Copyright 2013 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -89,7 +89,12 @@ proc semBindStmt(c: PContext, n: PNode, toBind: var TIntSet): PNode = for x in items(sc): toBind.incl(x.sym.id) else: illFormedAst(a) - result = newNodeI(nkNilLit, n.info) + result = newNodeI(nkEmpty, n.info) + +proc semMixinStmt(c: PContext, n: PNode, toMixin: var TIntSet): PNode = + for i in 0 .. < n.len: + toMixin.incl(considerAcc(n.sons[i]).id) + result = newNodeI(nkEmpty, n.info) proc replaceIdentBySym(n: var PNode, s: PNode) = case n.kind @@ -101,7 +106,7 @@ proc replaceIdentBySym(n: var PNode, s: PNode) = type TemplCtx {.pure, final.} = object c: PContext - toBind: TIntSet + toBind, toMixin: TIntSet owner: PSym proc getIdentNode(c: var TemplCtx, n: PNode): PNode = @@ -192,6 +197,8 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode = result = semTemplBody(c, n.sons[0]) of nkBindStmt: result = semBindStmt(c.c, n, c.toBind) + of nkMixinStmt: + result = semMixinStmt(c.c, n, c.toMixin) of nkEmpty, nkSym..nkNilLit: nil of nkIfStmt: @@ -395,6 +402,7 @@ proc semTemplateDef(c: PContext, n: PNode): PNode = n.sons[patternPos] = semPattern(c, n.sons[patternPos]) var ctx: TemplCtx ctx.toBind = initIntSet() + ctx.toMixin = initIntSet() ctx.c = c ctx.owner = s if sfDirty in s.flags: @@ -416,6 +424,8 @@ proc semTemplateDef(c: PContext, n: PNode): PNode = addInterfaceOverloadableSymAt(c, s, curScope) else: SymTabReplace(c.tab.stack[curScope], proto, s) + # XXX this seems wrong: We need to check for proto before and overwrite + # proto.ast ... if n.sons[patternPos].kind != nkEmpty: c.patterns.add(s) @@ -536,6 +546,7 @@ proc semPattern(c: PContext, n: PNode): PNode = openScope(c.tab) var ctx: TemplCtx ctx.toBind = initIntSet() + ctx.toMixin = initIntSet() ctx.c = c ctx.owner = getCurrOwner() result = flattenStmts(semPatternBody(ctx, n)) diff --git a/todo.txt b/todo.txt index 2f1105df4..d1dbf8b74 100644 --- a/todo.txt +++ b/todo.txt @@ -1,12 +1,14 @@ version 0.9.2 ============= -- FFI: - * test libffi on windows - * test: times.format with the FFI -- acyclic vs prunable; introduce GC hints -- CGEN: ``restrict`` pragma + backend support; computed goto support -- document NimMain and check whether it works for threading +- make 'bind' default for templates and introduce 'mixin'; + special rule for ``[]=`` +- ``=`` should be overloadable; requires specialization for ``=``; general + lift mechanism in the compiler is already implemented for 'fields' +- mocking support with ``tyProxy`` that does: fallback for ``.`` operator + - overloading of ``.``? Special case ``.=``? +- built-in 'getImpl' + Bugs ==== @@ -28,18 +30,15 @@ version 0.9.4 ============= - macros as type pragmas -- provide tool/API to track leaks/object counts -- hybrid GC -- use big blocks in the allocator -- implement full 'not nil' checking -- make 'bind' default for templates and introduce 'mixin'; - special rule for ``[]=`` +- implement full 'not nil' checking; range[1..3] needs the same mechanism - implicit deref for parameter matching -- ``=`` should be overloadable; requires specialization for ``=``; general - lift mechanism in the compiler is already implemented for 'fields' - lazy overloading resolution: * get rid of ``expr[typ]``, use perhaps ``static[typ]`` instead * special case ``tyStmt`` +- FFI: + * test libffi on windows + * test: times.format with the FFI +- document NimMain and check whether it works for threading version 0.9.X @@ -48,8 +47,6 @@ version 0.9.X - test&finish first class iterators: * nested iterators - implement the missing features wrt inheritance -- object pooling support for *hard* realtime systems -- improve the compiler as a service - better support for macros that rewrite procs - macros need access to types and symbols (partially implemented) - perhaps: change comment handling in the AST @@ -62,8 +59,8 @@ version 0.9.X templates that would work too: T([.ref int]) -Concurrency ------------ +Concurrency/Effect system +========================= - shared memory heap: ``shared ref`` etc. The only hard part in the GC is to "stop the world". However, it may be worthwhile to generate explicit @@ -83,21 +80,51 @@ Concurrency version 0.9.XX ============== +- document nimdoc properly finally +- make 'clamp' a magic for the range stuff +- better type syntax for functions and tuples: tuple(int, int); (int,int)->int + + +Memory safety +============= + +- object branch transitions from low(selector) are unsafe! ---> Needs a + deprecation path - object branch transitions can't work with the current 'reset'; add a 'reset' with an additional parameter --> simple: provide a 'reset(x, TObj(k: nkValue))' instead? why bother? '=' does the same. -- document nimdoc properly finally -- make 'clamp' a magic for the range stuff -- better type syntax for functions and tuples: tuple(int, int); (int,int)->int +- returning 'var T' is unsafe and needs some static analysis + + +GC +== + +- precise stack marking; embrace C++ code generation for that +- marker procs for Boehm GC +- hybrid GC +- GC: implement simple generational GC + * first version: mark black in write barrier + * second version: introduce fake roots instead of marking black + * third version: find some clever heuristic which is preferable +- acyclic vs prunable; introduce GC hints +- use big blocks in the allocator +- object pooling support for *hard* realtime systems +- provide tool/API to track leaks/object counts +- resizing of strings/sequences could take into account the memory that + is allocated + + +CGEN +==== +- codegen should use "NIM_CAST" macro and respect aliasing rules for GCC +- ``restrict`` pragma + backend support; computed goto support +- 'const' objects including case objects Not essential for 1.0.0 ======================= -- 'const' objects including case objects -- mocking support with ``tyProxy`` that does: fallback for ``.`` operator - - overloading of ``.``? Special case ``.=``? - allow implicit forward declarations of procs via a pragma (so that the wrappers can deactivate it): better solution: introduce the notion of a 'proc section' that is similar to a type section. @@ -108,28 +135,13 @@ Not essential for 1.0.0 - ``with proc `+`(x, y: T): T`` for generic code - new feature: ``distinct T with operations`` - arglist as a type (iterator chaining); variable length type lists for generics -- resizing of strings/sequences could take into account the memory that - is allocated -- codegen should use "NIM_CAST" macro and respect aliasing rules for GCC - implement marker procs for message passing - activate more thread tests - implement closures that support nesting of *procs* > 1 -- GC: implement simple generational GC - * first version: mark black in write barrier - * second version: introduce fake roots instead of marking black - * third version: find some clever heuristic which is preferable - object constructors: static check for fields if discriminator is known at compile time -GC -== - -- precise stack marking; embrace C++ code generation for that -- marker procs for Boehm GC -- implement 'mixed' GC mode - - Optimizations ============= |