fixes binding of overloaded procs

This commit is contained in:
Araq
2012-05-04 01:58:54 +02:00
parent 28b68d914e
commit a41bf611a0
6 changed files with 51 additions and 26 deletions

View File

@@ -118,6 +118,8 @@ const
":shock:": "icon_eek",
":?": "icon_e_confused",
":-?": "icon_e_confused",
":-/": "icon_e_confused",
"8-)": "icon_cool",
":lol:": "icon_lol",
@@ -429,9 +431,11 @@ proc setSub(p: var TRstParser, key: string, value: PRstNode) =
proc setRef(p: var TRstParser, key: string, value: PRstNode) =
var length = len(p.s.refs)
for i in countup(0, length - 1):
if key == p.s.refs[i].key:
if key == p.s.refs[i].key:
if p.s.refs[i].value.addNodes != value.addNodes:
rstMessage(p, warnRedefinitionOfLabel, key)
p.s.refs[i].value = value
rstMessage(p, warnRedefinitionOfLabel, key)
return
setlen(p.s.refs, length + 1)
p.s.refs[length].key = key

View File

@@ -749,11 +749,14 @@ proc makeDeref(n: PNode): PNode =
proc builtinFieldAccess(c: PContext, n: PNode, flags: TExprFlags): PNode =
## returns nil if it's not a built-in field access
checkSonsLen(n, 2)
# early exit for this; see tests/compile/tbindoverload.nim:
if n.sons[1].kind == nkSymChoice: return
var s = qualifiedLookup(c, n, {checkAmbiguity, checkUndeclared})
if s != nil:
return semSym(c, n, s, flags)
checkSonsLen(n, 2)
n.sons[0] = semExprWithType(c, n.sons[0], flags)
restoreOldStyleType(n.sons[0])
var i = considerAcc(n.sons[1])
@@ -830,18 +833,23 @@ proc semFieldAccess(c: PContext, n: PNode, flags: TExprFlags): PNode =
# in Nimrod. We first allow types in the semantic checking.
result = builtinFieldAccess(c, n, flags)
if result == nil:
var i = considerAcc(n.sons[1])
var f = SymTabGet(c.tab, i)
# if f != nil and f.kind == skStub: loadStub(f)
# ``loadStub`` is not correct here as we don't care for ``f`` really
if f != nil:
# BUGFIX: do not check for (f.kind in [skProc, skMethod, skIterator]) here
# This special node kind is to merge with the call handler in `semExpr`.
if n.sons[1].kind == nkSymChoice:
result = newNodeI(nkDotCall, n.info)
addSon(result, newIdentNode(i, n.info))
addSon(result, n.sons[1])
addSon(result, copyTree(n[0]))
else:
GlobalError(n.Info, errUndeclaredFieldX, i.s)
else:
var i = considerAcc(n.sons[1])
var f = SymTabGet(c.tab, i)
# if f != nil and f.kind == skStub: loadStub(f)
# ``loadStub`` is not correct here as we don't care for ``f`` really
if f != nil:
# BUGFIX: do not check for (f.kind in [skProc, skMethod, skIterator]) here
# This special node kind is to merge with the call handler in `semExpr`.
result = newNodeI(nkDotCall, n.info)
addSon(result, newIdentNode(i, n.info))
addSon(result, copyTree(n[0]))
else:
GlobalError(n.Info, errUndeclaredFieldX, i.s)
proc buildOverloadedSubscripts(n: PNode, ident: PIdent): PNode =
result = newNodeI(nkCall, n.info)

View File

@@ -608,4 +608,4 @@ Scientific computing
--------------------
* `libsvm <libsvm.html>`_
Low level wrapper for `libsvm <http://www.csie.ntu.edu.tw/~cjlin/libsvm/>`_.
Low level wrapper for `lib svm <http://www.csie.ntu.edu.tw/~cjlin/libsvm/>`_.

View File

@@ -0,0 +1,12 @@
import strtabs
template t*() =
block:
bind newStringTable
discard {"Content-Type": "text/html"}.newStringTable()
discard {:}.newStringTable
#discard {"Content-Type": "text/html"}.newStringTable()
t()

View File

@@ -1,4 +1,4 @@
Discuss Nimrod in our `forum <http://force7.de/heimdall>`_.
Discuss Nimrod in our `forum <http://forum.nimrod-code.org/>`_.
Visit our project page at GitHub: http://github.com/Araq/Nimrod.

View File

@@ -14,16 +14,6 @@ power with Python's readability and C's performance.**
Welcome to Nimrod
-----------------
.. container:: snippet
*Nimrod looks like this:*
.. code-block:: nimrod
import strutils
echo "List of ints (separate by whitespace): "
echo stdin.readLine.split.each(parseInt).max,
" is the maximum"
**Nimrod** is a new statically typed, imperative
programming language, that supports procedural, object oriented, functional
and generic programming styles while remaining simple and efficient.
@@ -37,6 +27,17 @@ focuses on the 3E: efficiency, expressiveness, elegance (in the order of
priority).
.. container:: snippet
*Nimrod looks like this:*
.. code-block:: nimrod
import strutils
echo "Type in a list of ints of ints (separate by whitespace): "
let tokens = stdin.readLine.split
echo tokens.each(parseInt).max, " is the maximum."
Nimrod is efficient
===================
@@ -67,7 +68,7 @@ Nimrod is expressive
* Modern type system with local type inference, tuples, variants,
generics, etc.
* User-defineable operators; code with new operators is often easier to read
than code which overloads built-in operators. In the code snippet, the
than code which overloads built-in operators. For example, a
``=~`` operator is defined in the ``re`` module.
* Macros can modify the abstract syntax tree at compile time.