diff options
-rw-r--r-- | compiler/ccgtypes.nim | 18 | ||||
-rw-r--r-- | compiler/cgen.nim | 2 | ||||
-rw-r--r-- | compiler/guards.nim | 346 | ||||
-rw-r--r-- | config/nimrod.cfg | 4 | ||||
-rw-r--r-- | doc/advopt.txt | 2 | ||||
-rw-r--r-- | lib/core/macros.nim | 8 | ||||
-rw-r--r-- | lib/nimbase.h | 4 | ||||
-rw-r--r-- | lib/wrappers/lua/lauxlib.nim | 185 | ||||
-rw-r--r-- | lib/wrappers/lua/lua.nim | 328 | ||||
-rw-r--r-- | lib/wrappers/lua/lualib.nim | 38 | ||||
-rw-r--r-- | tests/reject/tnotnil1.nim | 24 | ||||
-rw-r--r-- | tests/reject/tnotnil2.nim | 24 | ||||
-rw-r--r-- | todo.txt | 1 | ||||
-rw-r--r-- | web/news.txt | 2 |
14 files changed, 658 insertions, 328 deletions
diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index 427b0ec86..88e7e264d 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -674,7 +674,7 @@ proc genProcHeader(m: BModule, prc: PSym): PRope = # ------------------ type info generation ------------------------------------- -proc genTypeInfo(m: BModule, typ: PType): PRope +proc genTypeInfo(m: BModule, t: PType): PRope proc getNimNode(m: BModule): PRope = result = ropef("$1[$2]", [m.typeNodesName, toRope(m.typeNodes)]) inc(m.typeNodes) @@ -692,7 +692,7 @@ proc isObjLackingTypeField(typ: PType): bool {.inline.} = result = (typ.kind == tyObject) and ((tfFinal in typ.flags) and (typ.sons[0] == nil) or isPureObject(typ)) -proc genTypeInfoAuxBase(m: BModule, typ: PType, name, base: PRope) = +proc genTypeInfoAuxBase(m: BModule, typ: PType, name, base: PRope) = var nimtypeKind: int #allocMemTI(m, typ, name) if isObjLackingTypeField(typ): @@ -901,21 +901,21 @@ type include ccgtrav -proc genTypeInfo(m: BModule, typ: PType): PRope = - var t = getUniqueType(typ) +proc genTypeInfo(m: BModule, t: PType): PRope = + var t = getUniqueType(t) result = ropef("NTI$1", [toRope(t.id)]) - let owner = typ.skipTypes(typedescPtrs).owner.getModule + if ContainsOrIncl(m.typeInfoMarker, t.id): + return con("(&".toRope, result, ")".toRope) + let owner = t.skipTypes(typedescPtrs).owner.getModule if owner != m.module: # make sure the type info is created in the owner module - discard genTypeInfo(owner.bmod, typ) - # refenrece the type info as extern here + discard genTypeInfo(owner.bmod, t) + # reference the type info as extern here discard cgsym(m, "TNimType") discard cgsym(m, "TNimNode") appf(m.s[cfsVars], "extern TNimType $1; /* $2 */$n", [result, toRope(typeToString(t))]) return con("(&".toRope, result, ")".toRope) - if ContainsOrIncl(m.typeInfoMarker, t.id): - return con("(&".toRope, result, ")".toRope) case t.kind of tyEmpty: result = toRope"0" of tyPointer, tyBool, tyChar, tyCString, tyString, tyInt..tyUInt64, tyVar: diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 7e782fc12..45fb9f878 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -1031,7 +1031,7 @@ proc genInitCode(m: BModule) = var procname = CStringLit(m.initProc, prc, m.module.name.s) app(prc, initFrame(m.initProc, procname, m.module.info.quotedFilename)) else: - app(prc, ~"\tvolatile TFrame F; F.len = 0;$N") + app(prc, ~"\tTFrame F; F.len = 0;$N") app(prc, genSectionStart(cpsInit)) app(prc, m.preInitProc.s(cpsInit)) diff --git a/compiler/guards.nim b/compiler/guards.nim new file mode 100644 index 000000000..6d0bf6bc6 --- /dev/null +++ b/compiler/guards.nim @@ -0,0 +1,346 @@ +# +# +# The Nimrod Compiler +# (c) Copyright 2013 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## This module implements the 'implies' relation for guards. + +import ast, astalgo, msgs, magicsys, nimsets, trees, types, renderer + +const + someEq = {mEqI, mEqI64, mEqF64, mEqEnum, mEqCh, mEqB, mEqRef, mEqProc, + mEqUntracedRef, mEqStr, mEqSet, mEqCString} + + # set excluded here as the semantics are vastly different: + someLe = {mLeI, mLeI64, mLeF64, mLeU, mLeU64, mLeEnum, + mLeCh, mLeB, mLePtr, mLeStr} + someLt = {mLtI, mLtI64, mLtF64, mLtU, mLtU64, mLtEnum, + mLtCh, mLtB, mLtPtr, mLtStr} + + someLen = {mLengthOpenArray, mLengthStr, mLengthArray, mLengthSeq} + + someIn = {mInRange, mInSet} + +proc isValue(n: PNode): bool = n.kind in {nkCharLit..nkNilLit} +proc isLocation(n: PNode): bool = not n.isValue +#n.kind in {nkSym, nkBracketExpr, nkDerefExpr, nkHiddenDeref, nkDotExpr} + +proc isLet(n: PNode): bool = + if n.kind == nkSym: + # XXX allow skResult, skVar here if not re-bound + if n.sym.kind in {skLet, skTemp, skForVar}: + result = true + elif n.sym.kind == skParam and skipTypes(n.sym.typ, + abstractInst).kind != tyVar: + result = true + +proc isLetLocation(m: PNode): bool = + var n = m + while true: + case n.kind + of nkDotExpr, nkCheckedFieldExpr, nkObjUpConv, nkObjDownConv: + n = n.sons[0] + of nkBracketExpr: + if isConstExpr(n.sons[1]) or isLet(n.sons[1]): + n = n.sons[0] + else: return + of nkHiddenStdConv, nkHiddenSubConv, nkConv: + n = n.sons[1] + else: + break + result = n.isLet + +proc neg(n: PNode): PNode = + if n.getMagic == mNot: + result = n.sons[1] + else: + result = newNodeI(nkCall, n.info, 2) + result.sons[0] = newSymNode(getSysMagic("not", mNot)) + result.sons[1] = n + +proc usefulFact(n: PNode): PNode = + case n.getMagic + of someEq+someLe+someLt: + if isLetLocation(n.sons[1]) or n.len == 3 and isLetLocation(n.sons[2]): + # XXX algebraic simplifications! 'i-1 < a.len' --> 'i < a.len+1' + result = n + of someIn, mIsNil: + if isLetLocation(n.sons[1]): + result = n + of mAnd: + let + a = usefulFact(n.sons[1]) + b = usefulFact(n.sons[2]) + if a != nil and b != nil: + result = newNodeI(nkCall, n.info, 3) + result.sons[0] = newSymNode(getSysMagic("and", mAnd)) + result.sons[1] = a + result.sons[2] = b + elif a != nil: + result = a + elif b != nil: + result = b + of mNot: + case n.sons[1].getMagic + of mNot: + # normalize 'not (not a)' into 'a': + result = usefulFact(n.sons[1].sons[1]) + of mOr: + # not (a or b) --> not a and not b + let n = n.sons[1] + let + a = usefulFact(n.sons[1]) + b = usefulFact(n.sons[2]) + if a != nil and b != nil: + result = newNodeI(nkCall, n.info, 3) + result.sons[0] = newSymNode(getSysMagic("and", mAnd)) + result.sons[1] = a.neg + result.sons[2] = b.neg + else: + let a = usefulFact(n.sons[1]) + if a != nil: result = n + of mOr: + # 'or' sucks! (p.isNil or q.isNil) --> hard to do anything + # with that knowledge... + # DeMorgan helps a little though: + # not a or not b --> not (a and b) + # (x == 3) or (y == 2) ---> not ( not (x==3) and not (y == 2)) + # not (x != 3 and y != 2) + let + a = usefulFact(n.sons[1]) + b = usefulFact(n.sons[2]) + if a != nil and b != nil: + result = newNodeI(nkCall, n.info, 3) + result.sons[0] = newSymNode(getSysMagic("and", mAnd)) + result.sons[1] = a.neg + result.sons[2] = b.neg + result = result.neg + elif n.kind == nkSym and n.sym.kind == skLet: + # consider: + # let a = 2 < x + # if a: + # ... + # We make can easily replace 'a' by '2 < x' here: + result = usefulFact(n.sym.ast) + elif n.kind == nkStmtListExpr: + result = usefulFact(n.lastSon) + +type + TModel* = seq[PNode] # the "knowledge base" + +proc addFact*(m: var TModel, n: PNode) = + let n = usefulFact(n) + if n != nil: m.add n + +proc addFactNeg*(m: var TModel, n: PNode) = addFact(m, n.neg) + +proc sameTree(a, b: PNode): bool = + result = false + if a == b: + result = true + elif (a != nil) and (b != nil) and (a.kind == b.kind): + case a.kind + of nkSym: result = a.sym == b.sym + of nkIdent: result = a.ident.id == b.ident.id + of nkCharLit..nkInt64Lit: result = a.intVal == b.intVal + of nkFloatLit..nkFloat64Lit: result = a.floatVal == b.floatVal + of nkStrLit..nkTripleStrLit: result = a.strVal == b.strVal + of nkType: result = a.typ == b.typ + of nkEmpty, nkNilLit: result = true + else: + if sonsLen(a) == sonsLen(b): + for i in countup(0, sonsLen(a) - 1): + if not sameTree(a.sons[i], b.sons[i]): return + result = true + +proc valuesUnequal(a, b: PNode): bool = + if a.isValue and b.isValue: + result = not SameValue(a, b) + +type + TImplication* = enum + impUnknown, impNo, impYes + +proc impliesEq(fact, eq: PNode): TImplication = + let (loc, val) = if isLocation(eq.sons[1]): (1, 2) else: (2, 1) + + case fact.sons[0].sym.magic + of someEq: + if sameTree(fact.sons[1], eq.sons[loc]): + # this is not correct; consider: a == b; a == 1 --> unknown! + if sameTree(fact.sons[2], eq.sons[val]): result = impYes + elif valuesUnequal(fact.sons[2], eq.sons[val]): result = impNo + elif sameTree(fact.sons[2], eq.sons[loc]): + if sameTree(fact.sons[1], eq.sons[val]): result = impYes + elif valuesUnequal(fact.sons[1], eq.sons[val]): result = impNo + of mInSet: + if sameTree(fact.sons[1], eq.sons[loc]) and isValue(eq.sons[val]): + if inSet(fact.sons[2], eq.sons[val]): result = impYes + else: result = impNo + of mIsNil: + if sameTree(fact.sons[1], eq.sons[loc]): + if eq.sons[val].kind == nkNilLit: + result = impYes + of mNot, mOr, mAnd: internalError(eq.info, "impliesEq") + else: nil + +proc impliesIsNil(fact, eq: PNode): TImplication = + case fact.sons[0].sym.magic + of someEq: + if sameTree(fact.sons[1], eq.sons[1]): + if fact.sons[2].kind == nkNilLit: result = impYes + elif sameTree(fact.sons[2], eq.sons[1]): + if fact.sons[1].kind == nkNilLit: result = impYes + of mIsNil: + if sameTree(fact.sons[1], eq.sons[1]): + result = impYes + of mNot, mOr, mAnd: internalError(eq.info, "impliesIsNil") + else: nil + +proc pred(n: PNode): PNode = + if n.kind in {nkCharLit..nkUInt64Lit} and n.intVal != low(biggestInt): + result = copyNode(n) + dec result.intVal + else: + result = n + +proc impliesGe(fact, x, c: PNode): TImplication = + InternalAssert isLocation(x) + case fact.sons[0].sym.magic + of someEq: + if sameTree(fact.sons[1], x): + if isValue(fact.sons[2]) and isValue(c): + # fact: x = 4; question x >= 56? --> true iff 4 >= 56 + if leValue(c, fact.sons[2]): result = impYes + else: result = impNo + elif sameTree(fact.sons[2], x): + if isValue(fact.sons[1]) and isValue(c): + if leValue(c, fact.sons[1]): result = impYes + else: result = impNo + of someLt: + if sameTree(fact.sons[1], x): + if isValue(fact.sons[2]) and isValue(c): + # fact: x < 4; question N <= x? --> false iff N <= 4 + if leValue(fact.sons[2], c): result = impNo + # fact: x < 4; question 2 <= x? --> we don't know + elif sameTree(fact.sons[2], x): + # fact: 3 < x; question: N-1 < x ? --> true iff N-1 <= 3 + if isValue(fact.sons[1]) and isValue(c): + if leValue(c.pred, fact.sons[1]): result = impYes + of someLe: + if sameTree(fact.sons[1], x): + if isValue(fact.sons[2]) and isValue(c): + # fact: x <= 4; question x >= 56? --> false iff 4 <= 56 + if leValue(fact.sons[2], c): result = impNo + # fact: x <= 4; question x >= 2? --> we don't know + elif sameTree(fact.sons[2], x): + # fact: 3 <= x; question: x >= 2 ? --> true iff 2 <= 3 + if isValue(fact.sons[1]) and isValue(c): + if leValue(c, fact.sons[1]): result = impYes + of mNot, mOr, mAnd: internalError(x.info, "impliesGe") + else: nil + +proc impliesLe(fact, x, c: PNode): TImplication = + if not isLocation(x): + return impliesGe(fact, c, x) + case fact.sons[0].sym.magic + of someEq: + if sameTree(fact.sons[1], x): + if isValue(fact.sons[2]) and isValue(c): + # fact: x = 4; question x <= 56? --> true iff 4 <= 56 + if leValue(fact.sons[2], c): result = impYes + else: result = impNo + elif sameTree(fact.sons[2], x): + if isValue(fact.sons[1]) and isValue(c): + if leValue(fact.sons[1], c): result = impYes + else: result = impNo + of someLt: + if sameTree(fact.sons[1], x): + if isValue(fact.sons[2]) and isValue(c): + # fact: x < 4; question x <= N? --> true iff N-1 <= 4 + if leValue(fact.sons[2], c.pred): result = impYes + # fact: x < 4; question x <= 2? --> we don't know + elif sameTree(fact.sons[2], x): + # fact: 3 < x; question: x <= 1 ? --> false iff 1 <= 3 + if isValue(fact.sons[1]) and isValue(c): + if leValue(c, fact.sons[1]): result = impNo + + of someLe: + if sameTree(fact.sons[1], x): + if isValue(fact.sons[2]) and isValue(c): + # fact: x <= 4; question x <= 56? --> true iff 4 <= 56 + if leValue(fact.sons[2], c): result = impYes + # fact: x <= 4; question x <= 2? --> we don't know + + elif sameTree(fact.sons[2], x): + # fact: 3 <= x; question: x <= 2 ? --> false iff 2 < 3 + if isValue(fact.sons[1]) and isValue(c): + if leValue(c, fact.sons[1].pred): result = impNo + + of mNot, mOr, mAnd: internalError(x.info, "impliesLe") + else: nil + +proc impliesLt(fact, x, c: PNode): TImplication = + # x < 3 same as x <= 2: + let p = c.pred + if p != c: + result = impliesLe(fact, x, p) + else: + # 4 < x same as 3 <= x + let q = x.pred + if q != x: + result = impliesLe(fact, q, c) + +proc factImplies(fact, prop: PNode, isNegation: bool): TImplication = + case fact.getMagic + of mNot: + case factImplies(fact.sons[1], prop, not isNegation) + of impUnknown: return impUnknown + of impNo: return impYes + of impYes: return impNo + of mAnd: + if not isNegation: + result = factImplies(fact.sons[1], prop, isNegation) + if result != impUnknown: return result + return factImplies(fact.sons[2], prop, isNegation) + else: + # careful! not (a and b) means not a or not b: + # a or b --> both need to imply 'prop' + let a = factImplies(fact.sons[1], prop, isNegation) + let b = factImplies(fact.sons[2], prop, isNegation) + if a == b: return a + return impUnknown + else: discard + + case prop.sons[0].sym.magic + of mNot: + case fact.factImplies(prop.sons[1], isNegation) + of impUnknown: result = impUnknown + of impNo: result = impYes + of impYes: result = impNo + of mIsNil: + result = impliesIsNil(fact, prop) + of someEq: + result = impliesEq(fact, prop) + of someLe: + result = impliesLe(fact, prop.sons[1], prop.sons[2]) + of someLt: + result = impliesLt(fact, prop.sons[1], prop.sons[2]) + else: + internalError(prop.info, "invalid proposition") + +proc doesImply*(facts: TModel, prop: PNode): TImplication = + assert prop.kind in nkCallKinds + for f in facts: + result = f.factImplies(prop, false) + if result != impUnknown: return + +proc impliesNotNil*(facts: TModel, arg: PNode): TImplication = + var x = newNodeI(nkCall, arg.info, 2) + x.sons[0] = newSymNode(getSysMagic("isNil", mIsNil)) + x.sons[1] = arg + result = doesImply(facts, x.neg) diff --git a/config/nimrod.cfg b/config/nimrod.cfg index d9075a20f..18c746213 100644 --- a/config/nimrod.cfg +++ b/config/nimrod.cfg @@ -93,10 +93,10 @@ hint[LineTooLong]=off cc = clang tlsEmulation:on gcc.options.always = "-w -fasm-blocks" - gpp.options.always = "-w -fasm-blocks" + gpp.options.always = "-w -fasm-blocks -fpermissive" @else: gcc.options.always = "-w" - gpp.options.always = "-w" + gpp.options.always = "-w -fpermissive" @end gcc.options.speed = "-O3 -fno-strict-aliasing" diff --git a/doc/advopt.txt b/doc/advopt.txt index 38461244d..3b6fafd0f 100644 --- a/doc/advopt.txt +++ b/doc/advopt.txt @@ -12,6 +12,8 @@ Advanced commands: //check checks the project for syntax and semantic //idetools compiler support for IDEs: possible options: --track:FILE,LINE,COL track a file/cursor position + --trackDirty:DIRTY_FILE,ORIG_FILE,LINE,COL + track a file, currently not saved to disk --suggest suggest all possible symbols at position --def list all possible definitions at position --context list possible invokation context diff --git a/lib/core/macros.nim b/lib/core/macros.nim index bbf970102..720b15189 100644 --- a/lib/core/macros.nim +++ b/lib/core/macros.nim @@ -390,7 +390,7 @@ proc lispRepr*(n: PNimrodNode): string {.compileTime.} = add(result, ")") -macro dumpTree*(s: stmt): stmt = echo s.treeRepr +macro dumpTree*(s: stmt): stmt {.immediate.} = echo s.treeRepr ## Accepts a block of nimrod code and prints the parsed abstract syntax ## tree using the `toTree` function. Printing is done *at compile time*. ## @@ -398,16 +398,16 @@ macro dumpTree*(s: stmt): stmt = echo s.treeRepr ## tree and to discover what kind of nodes must be created to represent ## a certain expression/statement. -macro dumpLisp*(s: stmt): stmt = echo s.lispRepr +macro dumpLisp*(s: stmt): stmt {.immediate.} = echo s.lispRepr ## Accepts a block of nimrod code and prints the parsed abstract syntax ## tree using the `toLisp` function. Printing is done *at compile time*. ## ## See `dumpTree`. -macro dumpTreeImm*(s: stmt): stmt {.immediate.} = echo s.treeRepr +macro dumpTreeImm*(s: stmt): stmt {.immediate, deprecated.} = echo s.treeRepr ## The ``immediate`` version of `dumpTree`. -macro dumpLispImm*(s: stmt): stmt {.immediate.} = echo s.lispRepr +macro dumpLispImm*(s: stmt): stmt {.immediate, deprecated.} = echo s.lispRepr ## The ``immediate`` version of `dumpLisp`. diff --git a/lib/nimbase.h b/lib/nimbase.h index f47ab4d29..af06e447d 100644 --- a/lib/nimbase.h +++ b/lib/nimbase.h @@ -437,11 +437,11 @@ struct TFrame { }; #define nimfr(proc, file) \ - volatile TFrame F; \ + TFrame F; \ F.procname = proc; F.filename = file; F.line = 0; F.len = 0; nimFrame(&F); #define nimfrs(proc, file, slots, length) \ - volatile struct {TFrame* prev;NCSTRING procname;NI line;NCSTRING filename; NI len; TVarSlot s[slots];} F; \ + struct {TFrame* prev;NCSTRING procname;NI line;NCSTRING filename; NI len; TVarSlot s[slots];} F; \ F.procname = proc; F.filename = file; F.line = 0; F.len = length; nimFrame((TFrame*)&F); #define nimln(n, file) \ diff --git a/lib/wrappers/lua/lauxlib.nim b/lib/wrappers/lua/lauxlib.nim index bcb806f74..b985858d3 100644 --- a/lib/wrappers/lua/lauxlib.nim +++ b/lib/wrappers/lua/lauxlib.nim @@ -26,9 +26,9 @@ import proc pushstring*(L: PState, s: string) # compatibilty macros -proc getn*(L: PState, n: int): int +proc getn*(L: PState, n: cint): cint # calls lua_objlen -proc setn*(L: PState, t, n: int) +proc setn*(L: PState, t, n: cint) # does nothing! type Treg*{.final.} = object @@ -37,58 +37,45 @@ type Preg* = ptr Treg -proc openlib*(L: PState, libname: cstring, lr: Preg, nup: int){.cdecl, - dynlib: lua.LIB_NAME, importc: "luaL_openlib".} -proc register*(L: PState, libname: cstring, lr: Preg){.cdecl, - dynlib: lua.LIB_NAME, importc: "luaL_register".} -proc getmetafield*(L: PState, obj: int, e: cstring): int{.cdecl, - dynlib: lua.LIB_NAME, importc: "luaL_getmetafield".} -proc callmeta*(L: PState, obj: int, e: cstring): int{.cdecl, - dynlib: LIB_NAME, importc: "luaL_callmeta".} -proc typerror*(L: PState, narg: int, tname: cstring): int{.cdecl, - dynlib: LIB_NAME, importc: "luaL_typerror".} -proc argerror*(L: PState, numarg: int, extramsg: cstring): int{.cdecl, - dynlib: LIB_NAME, importc: "luaL_argerror".} -proc checklstring*(L: PState, numArg: int, len: ptr int): cstring{.cdecl, - dynlib: LIB_NAME, importc: "luaL_checklstring".} -proc optlstring*(L: PState, numArg: int, def: cstring, len: ptr int): cstring{. - cdecl, dynlib: LIB_NAME, importc: "luaL_optlstring".} -proc checknumber*(L: PState, numArg: int): Number{.cdecl, - dynlib: LIB_NAME, importc: "luaL_checknumber".} -proc optnumber*(L: PState, nArg: int, def: Number): Number{.cdecl, - dynlib: LIB_NAME, importc: "luaL_optnumber".} -proc checkinteger*(L: PState, numArg: int): Integer{.cdecl, - dynlib: LIB_NAME, importc: "luaL_checkinteger".} -proc optinteger*(L: PState, nArg: int, def: Integer): Integer{. - cdecl, dynlib: LIB_NAME, importc: "luaL_optinteger".} -proc checkstack*(L: PState, sz: int, msg: cstring){.cdecl, - dynlib: LIB_NAME, importc: "luaL_checkstack".} -proc checktype*(L: PState, narg, t: int){.cdecl, dynlib: LIB_NAME, - importc: "luaL_checktype".} -proc checkany*(L: PState, narg: int){.cdecl, dynlib: LIB_NAME, - importc: "luaL_checkany".} -proc newmetatable*(L: PState, tname: cstring): int{.cdecl, - dynlib: LIB_NAME, importc: "luaL_newmetatable".} -proc checkudata*(L: PState, ud: int, tname: cstring): Pointer{.cdecl, - dynlib: LIB_NAME, importc: "luaL_checkudata".} -proc where*(L: PState, lvl: int){.cdecl, dynlib: LIB_NAME, - importc: "luaL_where".} -proc error*(L: PState, fmt: cstring): int{.cdecl, varargs, - dynlib: LIB_NAME, importc: "luaL_error".} -proc checkoption*(L: PState, narg: int, def: cstring, lst: cstringArray): int{. - cdecl, dynlib: LIB_NAME, importc: "luaL_checkoption".} -proc reference*(L: PState, t: int): int{.cdecl, dynlib: LIB_NAME, - importc: "luaL_ref".} -proc unref*(L: PState, t, theref: int){.cdecl, dynlib: LIB_NAME, - importc: "luaL_unref".} -proc loadfile*(L: PState, filename: cstring): int{.cdecl, - dynlib: LIB_NAME, importc: "luaL_loadfile".} -proc loadbuffer*(L: PState, buff: cstring, size: int, name: cstring): int{. - cdecl, dynlib: LIB_NAME, importc: "luaL_loadbuffer".} -proc loadstring*(L: PState, s: cstring): int{.cdecl, dynlib: LIB_NAME, - importc: "luaL_loadstring".} -proc newstate*(): PState{.cdecl, dynlib: LIB_NAME, - importc: "luaL_newstate".} + +{.push callConv: cdecl, dynlib: lua.LIB_NAME.} +{.push importc: "luaL_$1".} + +proc openlib*(L: PState, libname: cstring, lr: Preg, nup: cint) +proc register*(L: PState, libname: cstring, lr: Preg) + +proc getmetafield*(L: PState, obj: cint, e: cstring): cint +proc callmeta*(L: PState, obj: cint, e: cstring): cint +proc typerror*(L: PState, narg: cint, tname: cstring): cint +proc argerror*(L: PState, numarg: cint, extramsg: cstring): cint +proc checklstring*(L: PState, numArg: cint, len: ptr int): cstring +proc optlstring*(L: PState, numArg: cint, def: cstring, len: ptr cint): cstring +proc checknumber*(L: PState, numArg: cint): Number +proc optnumber*(L: PState, nArg: cint, def: Number): Number +proc checkinteger*(L: PState, numArg: cint): Integer +proc optinteger*(L: PState, nArg: cint, def: Integer): Integer +proc checkstack*(L: PState, sz: cint, msg: cstring) +proc checktype*(L: PState, narg, t: cint) + +proc checkany*(L: PState, narg: cint) +proc newmetatable*(L: PState, tname: cstring): cint + +proc checkudata*(L: PState, ud: cint, tname: cstring): Pointer +proc where*(L: PState, lvl: cint) +proc error*(L: PState, fmt: cstring): cint{.varargs.} +proc checkoption*(L: PState, narg: cint, def: cstring, lst: cstringArray): cint + +proc unref*(L: PState, t, theref: cint) +proc loadfile*(L: PState, filename: cstring): cint +proc loadbuffer*(L: PState, buff: cstring, size: cint, name: cstring): cint +proc loadstring*(L: PState, s: cstring): cint +proc newstate*(): PState + +{.pop.} +proc reference*(L: PState, t: cint): cint{.importc: "luaL_ref".} + +{.pop.} + proc open*(): PState # compatibility; moved from unit lua to lauxlib because it needs luaL_newstate # @@ -96,18 +83,18 @@ proc open*(): PState #** some useful macros #** =============================================================== # -proc argcheck*(L: PState, cond: bool, numarg: int, extramsg: cstring) -proc checkstring*(L: PState, n: int): cstring -proc optstring*(L: PState, n: int, d: cstring): cstring -proc checkint*(L: PState, n: int): int -proc checklong*(L: PState, n: int): int32 -proc optint*(L: PState, n: int, d: float64): int -proc optlong*(L: PState, n: int, d: float64): int32 -proc dofile*(L: PState, filename: cstring): int -proc dostring*(L: PState, str: cstring): int +proc argcheck*(L: PState, cond: bool, numarg: cint, extramsg: cstring) +proc checkstring*(L: PState, n: cint): cstring +proc optstring*(L: PState, n: cint, d: cstring): cstring +proc checkint*(L: PState, n: cint): cint +proc checklong*(L: PState, n: cint): clong +proc optint*(L: PState, n: cint, d: float64): cint +proc optlong*(L: PState, n: cint, d: float64): clong +proc dofile*(L: PState, filename: cstring): cint +proc dostring*(L: PState, str: cstring): cint proc getmetatable*(L: PState, tname: cstring) # not translated: - # #define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) + # #define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) # #** ======================================================= #** Generic Buffer manipulation @@ -119,7 +106,7 @@ const # note: this is just arbitrary, as it related to t type Buffer*{.final.} = object p*: cstring # current position in buffer - lvl*: int # number of strings in the stack (level) + lvl*: cint # number of strings in the stack (level) L*: PState buffer*: array[0..BUFFERSIZE - 1, Char] # warning: see note above about LUAL_BUFFERSIZE @@ -130,80 +117,76 @@ proc addchar*(B: PBuffer, c: Char) # compatibility only (alias for luaL_addchar) proc putchar*(B: PBuffer, c: Char) # warning: see note above about LUAL_BUFFERSIZE -proc addsize*(B: PBuffer, n: int) -proc buffinit*(L: PState, B: PBuffer){.cdecl, dynlib: LIB_NAME, - importc: "luaL_buffinit".} -proc prepbuffer*(B: PBuffer): cstring{.cdecl, dynlib: LIB_NAME, - importc: "luaL_prepbuffer".} -proc addlstring*(B: PBuffer, s: cstring, L: int){.cdecl, - dynlib: LIB_NAME, importc: "luaL_addlstring".} -proc addstring*(B: PBuffer, s: cstring){.cdecl, dynlib: LIB_NAME, - importc: "luaL_addstring".} -proc addvalue*(B: PBuffer){.cdecl, dynlib: LIB_NAME, - importc: "luaL_addvalue".} -proc pushresult*(B: PBuffer){.cdecl, dynlib: LIB_NAME, - importc: "luaL_pushresult".} -proc gsub*(L: PState, s, p, r: cstring): cstring{.cdecl, - dynlib: LIB_NAME, importc: "luaL_gsub".} -proc findtable*(L: PState, idx: int, fname: cstring, szhint: int): cstring{. - cdecl, dynlib: LIB_NAME, importc: "luaL_findtable".} +proc addsize*(B: PBuffer, n: cint) + +{.push callConv: cdecl, dynlib: lua.LIB_NAME, importc: "luaL_$1".} +proc buffinit*(L: PState, B: PBuffer) +proc prepbuffer*(B: PBuffer): cstring +proc addlstring*(B: PBuffer, s: cstring, L: cint) +proc addstring*(B: PBuffer, s: cstring) +proc addvalue*(B: PBuffer) +proc pushresult*(B: PBuffer) +proc gsub*(L: PState, s, p, r: cstring): cstring +proc findtable*(L: PState, idx: cint, fname: cstring, szhint: cint): cstring # compatibility with ref system # pre-defined references +{.pop.} + const NOREF* = - 2 REFNIL* = - 1 -proc unref*(L: PState, theref: int) -proc getref*(L: PState, theref: int) +proc unref*(L: PState, theref: cint) +proc getref*(L: PState, theref: cint) # #** Compatibility macros and functions # # implementation proc pushstring(L: PState, s: string) = - pushlstring(L, cstring(s), len(s)) + pushlstring(L, cstring(s), s.len.cint) -proc getn(L: PState, n: int): int = +proc getn(L: PState, n: cint): cint = Result = objlen(L, n) -proc setn(L: PState, t, n: int) = +proc setn(L: PState, t, n: cint) = # does nothing as this operation is deprecated nil proc open(): PState = Result = newstate() -proc dofile(L: PState, filename: cstring): int = +proc dofile(L: PState, filename: cstring): cint = Result = loadfile(L, filename) if Result == 0: Result = pcall(L, 0, MULTRET, 0) -proc dostring(L: PState, str: cstring): int = +proc dostring(L: PState, str: cstring): cint = Result = loadstring(L, str) if Result == 0: Result = pcall(L, 0, MULTRET, 0) proc getmetatable(L: PState, tname: cstring) = getfield(L, REGISTRYINDEX, tname) -proc argcheck(L: PState, cond: bool, numarg: int, extramsg: cstring) = +proc argcheck(L: PState, cond: bool, numarg: cint, extramsg: cstring) = if not cond: discard argerror(L, numarg, extramsg) -proc checkstring(L: PState, n: int): cstring = +proc checkstring(L: PState, n: cint): cstring = Result = checklstring(L, n, nil) -proc optstring(L: PState, n: int, d: cstring): cstring = +proc optstring(L: PState, n: cint, d: cstring): cstring = Result = optlstring(L, n, d, nil) -proc checkint(L: PState, n: int): int = - Result = toInt(checknumber(L, n)) +proc checkint(L: PState, n: cint): cint = + Result = cint(checknumber(L, n)) -proc checklong(L: PState, n: int): int32 = +proc checklong(L: PState, n: cint): clong = Result = int32(ToInt(checknumber(L, n))) -proc optint(L: PState, n: int, d: float64): int = - Result = int(ToInt(optnumber(L, n, d))) +proc optint(L: PState, n: cint, d: float64): cint = + Result = optnumber(L, n, d).cint -proc optlong(L: PState, n: int, d: float64): int32 = +proc optlong(L: PState, n: cint, d: float64): clong = Result = int32(ToInt(optnumber(L, n, d))) proc addchar(B: PBuffer, c: Char) = @@ -215,11 +198,11 @@ proc addchar(B: PBuffer, c: Char) = proc putchar(B: PBuffer, c: Char) = addchar(B, c) -proc addsize(B: PBuffer, n: int) = +proc addsize(B: PBuffer, n: cint) = B.p = cast[cstring](cast[int](B.p) + n) -proc unref(L: PState, theref: int) = +proc unref(L: PState, theref: cint) = unref(L, REGISTRYINDEX, theref) -proc getref(L: PState, theref: int) = +proc getref(L: PState, theref: cint) = rawgeti(L, REGISTRYINDEX, theref) diff --git a/lib/wrappers/lua/lua.nim b/lib/wrappers/lua/lua.nim index 0346c4285..153714cee 100644 --- a/lib/wrappers/lua/lua.nim +++ b/lib/wrappers/lua/lua.nim @@ -51,16 +51,16 @@ when defined(useLuajit): else: when defined(MACOSX): const - NAME* = "liblua(|5.2|5.1|5.0).dylib" - LIB_NAME* = "liblua(|5.2|5.1|5.0).dylib" + NAME* = "liblua(|5.1|5.0).dylib" + LIB_NAME* = "liblua(|5.1|5.0).dylib" elif defined(UNIX): const - NAME* = "liblua(|5.2|5.1|5.0).so(|.0)" - LIB_NAME* = "liblua(|5.2|5.1|5.0).so(|.0)" + NAME* = "liblua(|5.1|5.0).so(|.0)" + LIB_NAME* = "liblua(|5.1|5.0).so(|.0)" else: const - NAME* = "lua(|5.2|5.1|5.0).dll" - LIB_NAME* = "lua(|5.2|5.1|5.0).dll" + NAME* = "lua(|5.1|5.0).dll" + LIB_NAME* = "lua(|5.1|5.0).dll" const VERSION* = "Lua 5.1" @@ -76,7 +76,7 @@ const ENVIRONINDEX* = - 10001 GLOBALSINDEX* = - 10002 -proc upvalueindex*(I: int): int +proc upvalueindex*(I: cint): cint const # thread status; 0 is OK constYIELD* = 1 ERRRUN* = 2 @@ -86,16 +86,16 @@ const # thread status; 0 is OK type PState* = Pointer - CFunction* = proc (L: PState): int{.cdecl.} + CFunction* = proc (L: PState): cint{.cdecl.} # #** functions that read/write blocks when loading/dumping Lua chunks # type - Reader* = proc (L: PState, ud: Pointer, sz: ptr int): cstring{.cdecl.} - Writer* = proc (L: PState, p: Pointer, sz: int, ud: Pointer): int{.cdecl.} - Alloc* = proc (ud, theptr: Pointer, osize, nsize: int){.cdecl.} + Reader* = proc (L: PState, ud: Pointer, sz: ptr cint): cstring{.cdecl.} + Writer* = proc (L: PState, p: Pointer, sz: cint, ud: Pointer): cint{.cdecl.} + Alloc* = proc (ud, theptr: Pointer, osize, nsize: cint){.cdecl.} const TNONE* = - 1 @@ -112,130 +112,86 @@ const type # Type of Numbers in Lua Number* = float - Integer* = int - -proc newstate*(f: Alloc, ud: Pointer): PState{.cdecl, dynlib: NAME, - importc: "lua_newstate".} -proc close*(L: PState){.cdecl, dynlib: NAME, importc: "lua_close".} -proc newthread*(L: PState): PState{.cdecl, dynlib: NAME, - importc: "lua_newthread".} -proc atpanic*(L: PState, panicf: CFunction): CFunction{.cdecl, dynlib: NAME, - importc: "lua_atpanic".} -proc gettop*(L: PState): int{.cdecl, dynlib: NAME, importc: "lua_gettop".} -proc settop*(L: PState, idx: int){.cdecl, dynlib: NAME, importc: "lua_settop".} -proc pushvalue*(L: PState, Idx: int){.cdecl, dynlib: NAME, - importc: "lua_pushvalue".} -proc remove*(L: PState, idx: int){.cdecl, dynlib: NAME, importc: "lua_remove".} -proc insert*(L: PState, idx: int){.cdecl, dynlib: NAME, importc: "lua_insert".} -proc replace*(L: PState, idx: int){.cdecl, dynlib: NAME, importc: "lua_replace".} -proc checkstack*(L: PState, sz: int): cint{.cdecl, dynlib: NAME, - importc: "lua_checkstack".} -proc xmove*(`from`, `to`: PState, n: int){.cdecl, dynlib: NAME, - importc: "lua_xmove".} -proc isnumber*(L: PState, idx: int): cint{.cdecl, dynlib: NAME, - importc: "lua_isnumber".} -proc isstring*(L: PState, idx: int): cint{.cdecl, dynlib: NAME, - importc: "lua_isstring".} -proc iscfunction*(L: PState, idx: int): cint{.cdecl, dynlib: NAME, - importc: "lua_iscfunction".} -proc isuserdata*(L: PState, idx: int): cint{.cdecl, dynlib: NAME, - importc: "lua_isuserdata".} -proc luatype*(L: PState, idx: int): int{.cdecl, dynlib: NAME, importc: "lua_type".} -proc typename*(L: PState, tp: int): cstring{.cdecl, dynlib: NAME, - importc: "lua_typename".} -proc equal*(L: PState, idx1, idx2: int): cint{.cdecl, dynlib: NAME, - importc: "lua_equal".} -proc rawequal*(L: PState, idx1, idx2: int): cint{.cdecl, dynlib: NAME, - importc: "lua_rawequal".} -proc lessthan*(L: PState, idx1, idx2: int): cint{.cdecl, dynlib: NAME, - importc: "lua_lessthan".} -proc tonumber*(L: PState, idx: int): Number{.cdecl, dynlib: NAME, - importc: "lua_tonumber".} -proc tointeger*(L: PState, idx: int): Integer{.cdecl, dynlib: NAME, - importc: "lua_tointeger".} -proc toboolean*(L: PState, idx: int): cint{.cdecl, dynlib: NAME, - importc: "lua_toboolean".} -proc tolstring*(L: PState, idx: int, length: ptr int): cstring{.cdecl, - dynlib: NAME, importc: "lua_tolstring".} -proc objlen*(L: PState, idx: int): int{.cdecl, dynlib: NAME, - importc: "lua_objlen".} -proc tocfunction*(L: PState, idx: int): CFunction{.cdecl, dynlib: NAME, - importc: "lua_tocfunction".} -proc touserdata*(L: PState, idx: int): Pointer{.cdecl, dynlib: NAME, - importc: "lua_touserdata".} -proc tothread*(L: PState, idx: int): PState{.cdecl, dynlib: NAME, - importc: "lua_tothread".} -proc topointer*(L: PState, idx: int): Pointer{.cdecl, dynlib: NAME, - importc: "lua_topointer".} -proc pushnil*(L: PState){.cdecl, dynlib: NAME, importc: "lua_pushnil".} -proc pushnumber*(L: PState, n: Number){.cdecl, dynlib: NAME, - importc: "lua_pushnumber".} -proc pushinteger*(L: PState, n: Integer){.cdecl, dynlib: NAME, - importc: "lua_pushinteger".} -proc pushlstring*(L: PState, s: cstring, len: int){.cdecl, dynlib: NAME, - importc: "lua_pushlstring".} -proc pushstring*(L: PState, s: cstring){.cdecl, dynlib: NAME, - importc: "lua_pushstring".} -proc pushvfstring*(L: PState, fmt: cstring, argp: Pointer): cstring{.cdecl, - dynlib: NAME, importc: "lua_pushvfstring".} -proc pushfstring*(L: PState, fmt: cstring): cstring{.cdecl, varargs, - dynlib: NAME, importc: "lua_pushfstring".} -proc pushcclosure*(L: PState, fn: CFunction, n: int){.cdecl, dynlib: NAME, - importc: "lua_pushcclosure".} -proc pushboolean*(L: PState, b: cint){.cdecl, dynlib: NAME, - importc: "lua_pushboolean".} -proc pushlightuserdata*(L: PState, p: Pointer){.cdecl, dynlib: NAME, - importc: "lua_pushlightuserdata".} -proc pushthread*(L: PState){.cdecl, dynlib: NAME, importc: "lua_pushthread".} -proc gettable*(L: PState, idx: int){.cdecl, dynlib: NAME, - importc: "lua_gettable".} -proc getfield*(L: Pstate, idx: int, k: cstring){.cdecl, dynlib: NAME, - importc: "lua_getfield".} -proc rawget*(L: PState, idx: int){.cdecl, dynlib: NAME, importc: "lua_rawget".} -proc rawgeti*(L: PState, idx, n: int){.cdecl, dynlib: NAME, - importc: "lua_rawgeti".} -proc createtable*(L: PState, narr, nrec: int){.cdecl, dynlib: NAME, - importc: "lua_createtable".} -proc newuserdata*(L: PState, sz: int): Pointer{.cdecl, dynlib: NAME, - importc: "lua_newuserdata".} -proc getmetatable*(L: PState, objindex: int): int{.cdecl, dynlib: NAME, - importc: "lua_getmetatable".} -proc getfenv*(L: PState, idx: int){.cdecl, dynlib: NAME, importc: "lua_getfenv".} -proc settable*(L: PState, idx: int){.cdecl, dynlib: NAME, - importc: "lua_settable".} -proc setfield*(L: PState, idx: int, k: cstring){.cdecl, dynlib: NAME, - importc: "lua_setfield".} -proc rawset*(L: PState, idx: int){.cdecl, dynlib: NAME, importc: "lua_rawset".} -proc rawseti*(L: PState, idx, n: int){.cdecl, dynlib: NAME, - importc: "lua_rawseti".} -proc setmetatable*(L: PState, objindex: int): int{.cdecl, dynlib: NAME, - importc: "lua_setmetatable".} -proc setfenv*(L: PState, idx: int): int{.cdecl, dynlib: NAME, - importc: "lua_setfenv".} -proc call*(L: PState, nargs, nresults: int){.cdecl, dynlib: NAME, - importc: "lua_call".} -proc pcall*(L: PState, nargs, nresults, errf: int): int{.cdecl, dynlib: NAME, - importc: "lua_pcall".} -proc cpcall*(L: PState, func: CFunction, ud: Pointer): int{.cdecl, dynlib: NAME, - importc: "lua_cpcall".} -proc load*(L: PState, reader: Reader, dt: Pointer, chunkname: cstring): int{. - cdecl, dynlib: NAME, importc: "lua_load".} -proc dump*(L: PState, writer: Writer, data: Pointer): int{.cdecl, dynlib: NAME, - importc: "lua_dump".} -proc luayield*(L: PState, nresults: int): int{.cdecl, dynlib: NAME, - importc: "lua_yield".} -proc resume*(L: PState, narg: int): int{.cdecl, dynlib: NAME, - importc: "lua_resume".} -proc status*(L: PState): int{.cdecl, dynlib: NAME, importc: "lua_status".} -proc gc*(L: PState, what, data: int): int{.cdecl, dynlib: NAME, - importc: "lua_gc".} -proc error*(L: PState): int{.cdecl, dynlib: NAME, importc: "lua_error".} -proc next*(L: PState, idx: int): int{.cdecl, dynlib: NAME, importc: "lua_next".} -proc concat*(L: PState, n: int){.cdecl, dynlib: NAME, importc: "lua_concat".} -proc getallocf*(L: PState, ud: ptr Pointer): Alloc{.cdecl, dynlib: NAME, - importc: "lua_getallocf".} -proc setallocf*(L: PState, f: Alloc, ud: Pointer){.cdecl, dynlib: NAME, - importc: "lua_setallocf".} + Integer* = cint + +{.pragma: ilua, importc: "lua_$1".} + +{.push callConv: cdecl, dynlib: LibName.} +#{.push importc: "lua_$1".} + +proc newstate*(f: Alloc, ud: Pointer): PState {.ilua.} + +proc close*(L: PState){.ilua.} +proc newthread*(L: PState): PState{.ilua.} +proc atpanic*(L: PState, panicf: CFunction): CFunction{.ilua.} + +proc gettop*(L: PState): cint{.ilua.} +proc settop*(L: PState, idx: cint){.ilua.} +proc pushvalue*(L: PState, Idx: cint){.ilua.} +proc remove*(L: PState, idx: cint){.ilua.} +proc insert*(L: PState, idx: cint){.ilua.} +proc replace*(L: PState, idx: cint){.ilua.} +proc checkstack*(L: PState, sz: cint): cint{.ilua.} +proc xmove*(`from`, `to`: PState, n: cint){.ilua.} +proc isnumber*(L: PState, idx: cint): cint{.ilua.} +proc isstring*(L: PState, idx: cint): cint{.ilua.} +proc iscfunction*(L: PState, idx: cint): cint{.ilua.} +proc isuserdata*(L: PState, idx: cint): cint{.ilua.} +proc luatype*(L: PState, idx: cint): cint{.importc: "lua_type".} +proc typename*(L: PState, tp: cint): cstring{.ilua.} +proc equal*(L: PState, idx1, idx2: cint): cint{.ilua.} +proc rawequal*(L: PState, idx1, idx2: cint): cint{.ilua.} +proc lessthan*(L: PState, idx1, idx2: cint): cint{.ilua.} +proc tonumber*(L: PState, idx: cint): Number{.ilua.} +proc tointeger*(L: PState, idx: cint): Integer{.ilua.} +proc toboolean*(L: PState, idx: cint): cint{.ilua.} +proc tolstring*(L: PState, idx: cint, length: ptr cint): cstring{.ilua.} +proc objlen*(L: PState, idx: cint): cint{.ilua.} +proc tocfunction*(L: PState, idx: cint): CFunction{.ilua.} +proc touserdata*(L: PState, idx: cint): Pointer{.ilua.} +proc tothread*(L: PState, idx: cint): PState{.ilua.} +proc topointer*(L: PState, idx: cint): Pointer{.ilua.} +proc pushnil*(L: PState){.ilua.} +proc pushnumber*(L: PState, n: Number){.ilua.} +proc pushinteger*(L: PState, n: Integer){.ilua.} +proc pushlstring*(L: PState, s: cstring, len: cint){.ilua.} +proc pushstring*(L: PState, s: cstring){.ilua.} +proc pushvfstring*(L: PState, fmt: cstring, argp: Pointer): cstring{.ilua.} +proc pushfstring*(L: PState, fmt: cstring): cstring{.varargs,ilua.} +proc pushcclosure*(L: PState, fn: CFunction, n: cint){.ilua.} +proc pushboolean*(L: PState, b: cint){.ilua.} +proc pushlightuserdata*(L: PState, p: Pointer){.ilua.} +proc pushthread*(L: PState){.ilua.} +proc gettable*(L: PState, idx: cint){.ilua.} +proc getfield*(L: Pstate, idx: cint, k: cstring){.ilua.} +proc rawget*(L: PState, idx: cint){.ilua.} +proc rawgeti*(L: PState, idx, n: cint){.ilua.} +proc createtable*(L: PState, narr, nrec: cint){.ilua.} +proc newuserdata*(L: PState, sz: cint): Pointer{.ilua.} +proc getmetatable*(L: PState, objindex: cint): cint{.ilua.} +proc getfenv*(L: PState, idx: cint){.ilua.} +proc settable*(L: PState, idx: cint){.ilua.} +proc setfield*(L: PState, idx: cint, k: cstring){.ilua.} +proc rawset*(L: PState, idx: cint){.ilua.} +proc rawseti*(L: PState, idx, n: cint){.ilua.} +proc setmetatable*(L: PState, objindex: cint): cint{.ilua.} +proc setfenv*(L: PState, idx: cint): cint{.ilua.} +proc call*(L: PState, nargs, nresults: cint){.ilua.} +proc pcall*(L: PState, nargs, nresults, errf: cint): cint{.ilua.} +proc cpcall*(L: PState, func: CFunction, ud: Pointer): cint{.ilua.} +proc load*(L: PState, reader: Reader, dt: Pointer, chunkname: cstring): cint{.ilua.} +proc dump*(L: PState, writer: Writer, data: Pointer): cint{.ilua.} +proc luayield*(L: PState, nresults: cint): cint{.importc: "lua_yield".} +proc resume*(L: PState, narg: cint): cint{.ilua.} +proc status*(L: PState): cint{.ilua.} +proc gc*(L: PState, what, data: cint): cint{.ilua.} +proc error*(L: PState): cint{.ilua.} +proc next*(L: PState, idx: cint): cint{.ilua.} +proc concat*(L: PState, n: cint){.ilua.} +proc getallocf*(L: PState, ud: ptr Pointer): Alloc{.ilua.} +proc setallocf*(L: PState, f: Alloc, ud: Pointer){.ilua.} +{.pop.} + # #** Garbage-collection functions and options # @@ -256,29 +212,29 @@ const #** =============================================================== # -proc pop*(L: PState, n: int) +proc pop*(L: PState, n: cint) proc newtable*(L: Pstate) proc register*(L: PState, n: cstring, f: CFunction) proc pushcfunction*(L: PState, f: CFunction) -proc strlen*(L: Pstate, i: int): int -proc isfunction*(L: PState, n: int): bool -proc istable*(L: PState, n: int): bool -proc islightuserdata*(L: PState, n: int): bool -proc isnil*(L: PState, n: int): bool -proc isboolean*(L: PState, n: int): bool -proc isthread*(L: PState, n: int): bool -proc isnone*(L: PState, n: int): bool -proc isnoneornil*(L: PState, n: int): bool +proc strlen*(L: Pstate, i: cint): cint +proc isfunction*(L: PState, n: cint): bool +proc istable*(L: PState, n: cint): bool +proc islightuserdata*(L: PState, n: cint): bool +proc isnil*(L: PState, n: cint): bool +proc isboolean*(L: PState, n: cint): bool +proc isthread*(L: PState, n: cint): bool +proc isnone*(L: PState, n: cint): bool +proc isnoneornil*(L: PState, n: cint): bool proc pushliteral*(L: PState, s: cstring) proc setglobal*(L: PState, s: cstring) proc getglobal*(L: PState, s: cstring) -proc tostring*(L: PState, i: int): cstring +proc tostring*(L: PState, i: cint): cstring # #** compatibility macros and functions # proc getregistry*(L: PState) -proc getgccount*(L: PState): int +proc getgccount*(L: PState): cint type Chunkreader* = Reader Chunkwriter* = Writer @@ -307,18 +263,18 @@ const type TDebug*{.final.} = object # activation record - event*: int + event*: cint name*: cstring # (n) namewhat*: cstring # (n) `global', `local', `field', `method' what*: cstring # (S) `Lua', `C', `main', `tail' source*: cstring # (S) - currentline*: int # (l) - nups*: int # (u) number of upvalues - linedefined*: int # (S) - lastlinedefined*: int # (S) - short_src*: array[0..IDSIZE - 1, Char] # (S) - # private part - i_ci*: int # active function + currentline*: cint # (l) + nups*: cint # (u) number of upvalues + linedefined*: cint # (S) + lastlinedefined*: cint # (S) + short_src*: array[0.. <IDSIZE, Char] # (S) \ + # private part + i_ci*: cint # active function PDebug* = ptr TDebug Hook* = proc (L: PState, ar: PDebug){.cdecl.} @@ -329,31 +285,27 @@ type #** ====================================================================== # -proc getstack*(L: PState, level: int, ar: PDebug): int{.cdecl, dynlib: NAME, - importc: "lua_getstack".} -proc getinfo*(L: PState, what: cstring, ar: PDebug): int{.cdecl, dynlib: NAME, - importc: "lua_getinfo".} -proc getlocal*(L: PState, ar: PDebug, n: int): cstring{.cdecl, dynlib: NAME, - importc: "lua_getlocal".} -proc setlocal*(L: PState, ar: PDebug, n: int): cstring{.cdecl, dynlib: NAME, - importc: "lua_setlocal".} -proc getupvalue*(L: PState, funcindex: int, n: int): cstring{.cdecl, - dynlib: NAME, importc: "lua_getupvalue".} -proc setupvalue*(L: PState, funcindex: int, n: int): cstring{.cdecl, - dynlib: NAME, importc: "lua_setupvalue".} -proc sethook*(L: PState, func: Hook, mask: int, count: int): int{.cdecl, - dynlib: NAME, importc: "lua_sethook".} -proc gethook*(L: PState): Hook{.cdecl, dynlib: NAME, importc: "lua_gethook".} -proc gethookmask*(L: PState): int{.cdecl, dynlib: NAME, - importc: "lua_gethookmask".} -proc gethookcount*(L: PState): int{.cdecl, dynlib: NAME, - importc: "lua_gethookcount".} +{.push callConv: cdecl, dynlib: lua.LIB_NAME.} + +proc getstack*(L: PState, level: cint, ar: PDebug): cint{.ilua.} +proc getinfo*(L: PState, what: cstring, ar: PDebug): cint{.ilua.} +proc getlocal*(L: PState, ar: PDebug, n: cint): cstring{.ilua.} +proc setlocal*(L: PState, ar: PDebug, n: cint): cstring{.ilua.} +proc getupvalue*(L: PState, funcindex: cint, n: cint): cstring{.ilua.} +proc setupvalue*(L: PState, funcindex: cint, n: cint): cstring{.ilua.} +proc sethook*(L: PState, func: Hook, mask: cint, count: cint): cint{.ilua.} +proc gethook*(L: PState): Hook{.ilua.} +proc gethookmask*(L: PState): cint{.ilua.} +proc gethookcount*(L: PState): cint{.ilua.} + +{.pop.} + # implementation -proc upvalueindex(I: int): int = +proc upvalueindex(I: cint): cint = Result = GLOBALSINDEX - i -proc pop(L: PState, n: int) = +proc pop(L: PState, n: cint) = settop(L, - n - 1) proc newtable(L: PState) = @@ -366,35 +318,35 @@ proc register(L: PState, n: cstring, f: CFunction) = proc pushcfunction(L: PState, f: CFunction) = pushcclosure(L, f, 0) -proc strlen(L: PState, i: int): int = +proc strlen(L: PState, i: cint): cint = Result = objlen(L, i) -proc isfunction(L: PState, n: int): bool = +proc isfunction(L: PState, n: cint): bool = Result = luatype(L, n) == TFUNCTION -proc istable(L: PState, n: int): bool = +proc istable(L: PState, n: cint): bool = Result = luatype(L, n) == TTABLE -proc islightuserdata(L: PState, n: int): bool = +proc islightuserdata(L: PState, n: cint): bool = Result = luatype(L, n) == TLIGHTUSERDATA -proc isnil(L: PState, n: int): bool = +proc isnil(L: PState, n: cint): bool = Result = luatype(L, n) == TNIL -proc isboolean(L: PState, n: int): bool = +proc isboolean(L: PState, n: cint): bool = Result = luatype(L, n) == TBOOLEAN -proc isthread(L: PState, n: int): bool = +proc isthread(L: PState, n: cint): bool = Result = luatype(L, n) == TTHREAD -proc isnone(L: PState, n: int): bool = +proc isnone(L: PState, n: cint): bool = Result = luatype(L, n) == TNONE -proc isnoneornil(L: PState, n: int): bool = +proc isnoneornil(L: PState, n: cint): bool = Result = luatype(L, n) <= 0 proc pushliteral(L: PState, s: cstring) = - pushlstring(L, s, len(s)) + pushlstring(L, s, s.len.cint) proc setglobal(L: PState, s: cstring) = setfield(L, GLOBALSINDEX, s) @@ -402,11 +354,11 @@ proc setglobal(L: PState, s: cstring) = proc getglobal(L: PState, s: cstring) = getfield(L, GLOBALSINDEX, s) -proc tostring(L: PState, i: int): cstring = +proc tostring(L: PState, i: cint): cstring = Result = tolstring(L, i, nil) proc getregistry(L: PState) = pushvalue(L, REGISTRYINDEX) -proc getgccount(L: PState): int = +proc getgccount(L: PState): cint = Result = gc(L, GCCOUNT, 0) diff --git a/lib/wrappers/lua/lualib.nim b/lib/wrappers/lua/lualib.nim index 94f08a1f1..8c1237dde 100644 --- a/lib/wrappers/lua/lualib.nim +++ b/lib/wrappers/lua/lualib.nim @@ -32,35 +32,33 @@ const DBLIBNAME* = "debug" LOADLIBNAME* = "package" -proc open_base*(L: PState): cint{.cdecl, dynlib: LIB_NAME, - importc: "luaopen_base".} -proc open_table*(L: PState): cint{.cdecl, dynlib: LIB_NAME, - importc: "luaopen_table".} -proc open_io*(L: PState): cint{.cdecl, dynlib: LIB_NAME, importc: "luaopen_io".} -proc open_string*(L: PState): cint{.cdecl, dynlib: LIB_NAME, - importc: "luaopen_string".} -proc open_math*(L: PState): cint{.cdecl, dynlib: LIB_NAME, - importc: "luaopen_math".} -proc open_debug*(L: PState): cint{.cdecl, dynlib: LIB_NAME, - importc: "luaopen_debug".} -proc open_package*(L: PState): cint{.cdecl, dynlib: LIB_NAME, - importc: "luaopen_package".} -proc openlibs*(L: PState){.cdecl, dynlib: LIB_NAME, importc: "luaL_openlibs".} +{.pragma: ilua, importc: "lua$1".} + +{.push callConv: cdecl, dynlib: lua.LIB_NAME.} +proc open_base*(L: PState): cint{.ilua.} +proc open_table*(L: PState): cint{.ilua.} +proc open_io*(L: PState): cint{.ilua.} +proc open_string*(L: PState): cint{.ilua.} +proc open_math*(L: PState): cint{.ilua.} +proc open_debug*(L: PState): cint{.ilua.} +proc open_package*(L: PState): cint{.ilua.} +proc openlibs*(L: PState){.importc: "luaL_openlibs".} +{.pop.} proc baselibopen*(L: PState): Bool = - Result = open_base(L) != 0'i32 + open_base(L) != 0'i32 proc tablibopen*(L: PState): Bool = - Result = open_table(L) != 0'i32 + open_table(L) != 0'i32 proc iolibopen*(L: PState): Bool = - Result = open_io(L) != 0'i32 + open_io(L) != 0'i32 proc strlibopen*(L: PState): Bool = - Result = open_string(L) != 0'i32 + open_string(L) != 0'i32 proc mathlibopen*(L: PState): Bool = - Result = open_math(L) != 0'i32 + open_math(L) != 0'i32 proc dblibopen*(L: PState): Bool = - Result = open_debug(L) != 0'i32 + open_debug(L) != 0'i32 diff --git a/tests/reject/tnotnil1.nim b/tests/reject/tnotnil1.nim new file mode 100644 index 000000000..3535bbd63 --- /dev/null +++ b/tests/reject/tnotnil1.nim @@ -0,0 +1,24 @@ +discard """ + errormsg: "'y' is provably nil" + line:22 +""" + +import strutils + + +type + TObj = object + x, y: int + +proc q(x: pointer not nil) = + nil + +proc p() = + var x: pointer + let y = x + if not y.isNil: + q(y) + else: + q(y) + +p() diff --git a/tests/reject/tnotnil2.nim b/tests/reject/tnotnil2.nim new file mode 100644 index 000000000..755314e30 --- /dev/null +++ b/tests/reject/tnotnil2.nim @@ -0,0 +1,24 @@ +discard """ + errormsg: "cannot prove 'y' is not nil" + line:22 +""" + +import strutils + + +type + TObj = object + x, y: int + +proc q(x: pointer not nil) = + nil + +proc p() = + var x: pointer + let y = x + if not y.isNil or y != x: + q(y) + else: + q(y) + +p() diff --git a/todo.txt b/todo.txt index 9a3377d1c..5b9f36dcd 100644 --- a/todo.txt +++ b/todo.txt @@ -25,7 +25,6 @@ Bugs - blocks can "export" an identifier but the CCG generates {} for them ... - osproc execProcesses can deadlock if all processes fail (as experienced in c++ mode) -- bootstrapping does not work in C++ mode - result = result shr 8 for the "system()" wrapper diff --git a/web/news.txt b/web/news.txt index f5737ffa3..98d3298b9 100644 --- a/web/news.txt +++ b/web/news.txt @@ -36,6 +36,8 @@ Language Additions - Arrays can now be declared with a single integer literal ``N`` instead of a range; the range is then ``0..N-1``. +- ``macros.dumpTree`` and ``macros.dumpLisp`` have been made ``immediate``, + ``dumpTreeImm`` and ``dumpLispImm`` are now deprecated. - Added ``requiresInit`` pragma to enforce explicit initialization. |