Permalink
Browse files

added system.locals

  • Loading branch information...
Araq committed Mar 21, 2013
1 parent c8a73ea commit 226e5ca5985cbf335e0314d15fa5626b1d0e7066
Showing with 64 additions and 18 deletions.
  1. +14 −14 compiler/ast.nim
  2. +2 −1 compiler/semexprs.nim
  3. +29 −1 compiler/semmagic.nim
  4. +7 −0 lib/system.nim
  5. +11 −0 tests/run/tlocals.nim
  6. +0 −2 todo.txt
  7. +1 −0 web/news.txt
View
@@ -455,12 +455,12 @@ type
mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, mEnumToStr,
mAnd, mOr, mEqStr, mLeStr, mLtStr, mEqSet, mLeSet, mLtSet, mMulSet,
mPlusSet, mMinusSet, mSymDiffSet, mConStrStr, mConArrArr, mConArrT,
- mConTArr, mConTT, mSlice,
+ mConTArr, mConTT, mSlice,
mFields, mFieldPairs, mOmpParFor,
- mAppendStrCh, mAppendStrStr, mAppendSeqElem,
- mInRange, mInSet, mRepr, mExit, mSetLengthStr, mSetLengthSeq,
- mIsPartOf, mAstToStr, mRand,
- mSwap, mIsNil, mArrToSeq, mCopyStr, mCopyStrLast,
+ mAppendStrCh, mAppendStrStr, mAppendSeqElem,
+ mInRange, mInSet, mRepr, mExit, mSetLengthStr, mSetLengthSeq,
+ mIsPartOf, mAstToStr, mRand,
+ mSwap, mIsNil, mArrToSeq, mCopyStr, mCopyStrLast,
mNewString, mNewStringOfCap,
mReset,
mArray, mOpenArray, mRange, mSet, mSeq, mVarargs,
@@ -469,18 +469,18 @@ type
mUInt, mUInt8, mUInt16, mUInt32, mUInt64,
mFloat, mFloat32, mFloat64, mFloat128,
mBool, mChar, mString, mCstring,
- mPointer, mEmptySet, mIntSetBaseType, mNil, mExpr, mStmt, mTypeDesc,
+ mPointer, mEmptySet, mIntSetBaseType, mNil, mExpr, mStmt, mTypeDesc,
mVoidType, mPNimrodNode,
- mIsMainModule, mCompileDate, mCompileTime, mNimrodVersion, mNimrodMajor,
- mNimrodMinor, mNimrodPatch, mCpuEndian, mHostOS, mHostCPU, mAppType,
- mNaN, mInf, mNegInf,
+ mIsMainModule, mCompileDate, mCompileTime, mNimrodVersion, mNimrodMajor,
+ mNimrodMinor, mNimrodPatch, mCpuEndian, mHostOS, mHostCPU, mAppType,
+ mNaN, mInf, mNegInf,
mCompileOption, mCompileOptionArg,
- mNLen, mNChild, mNSetChild, mNAdd, mNAddMultiple, mNDel, mNKind,
- mNIntVal, mNFloatVal, mNSymbol, mNIdent, mNGetType, mNStrVal, mNSetIntVal,
+ mNLen, mNChild, mNSetChild, mNAdd, mNAddMultiple, mNDel, mNKind,
+ mNIntVal, mNFloatVal, mNSymbol, mNIdent, mNGetType, mNStrVal, mNSetIntVal,
mNSetFloatVal, mNSetSymbol, mNSetIdent, mNSetType, mNSetStrVal, mNLineInfo,
- mNNewNimNode, mNCopyNimNode, mNCopyNimTree, mStrToIdent, mIdentToStr,
- mNBindSym, mNCallSite,
- mEqIdent, mEqNimrodNode, mNHint, mNWarning, mNError,
+ mNNewNimNode, mNCopyNimNode, mNCopyNimTree, mStrToIdent, mIdentToStr,
+ mNBindSym, mLocals, mNCallSite,
+ mEqIdent, mEqNimrodNode, mNHint, mNWarning, mNError,
mInstantiationInfo, mGetTypeInfo
# things that we can evaluate safely at compile time, even if not asked for it:
View
@@ -25,7 +25,8 @@ proc semExprWithType(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
# do not produce another redundant error message:
#raiseRecoverableError("")
result = errorNode(c, n)
- if result.typ != nil:
+ if result.typ != nil:
+ # XXX tyGenericInst here?
if result.typ.kind == tyVar: result = newDeref(result)
else:
LocalError(n.info, errExprXHasNoType,
View
@@ -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.
@@ -73,6 +73,33 @@ proc semBindSym(c: PContext, n: PNode): PNode =
else:
LocalError(n.sons[1].info, errUndeclaredIdentifier, sl.strVal)
+proc semLocals(c: PContext, n: PNode): PNode =
+ var counter = 0
+ var tupleType = newTypeS(tyTuple, c)
+ result = newNodeIT(nkPar, n.info, tupleType)
+ tupleType.n = newNodeI(nkRecList, n.info)
+ # for now we skip openarrays ...
+ for i in countdown(c.tab.tos-1, ModuleTablePos+1):
+ for it in items(c.tab.stack[i]):
+ # XXX parameters' owners are wrong for generics; this caused some pain
+ # for closures too; we should finally fix it.
+ #if it.owner != c.p.owner: return result
+ if it.kind in skLocalVars and
+ it.typ.skipTypes({tyGenericInst, tyVar}).kind notin
+ {tyVarargs, tyOpenArray, tyTypeDesc, tyExpr, tyStmt, tyEmpty}:
+
+ var field = newSym(skField, it.name, getCurrOwner(), n.info)
+ field.typ = it.typ.skipTypes({tyGenericInst, tyVar})
+ field.position = counter
+ inc(counter)
+
+ addSon(tupleType.n, newSymNode(field))
+ addSonSkipIntLit(tupleType, field.typ)
+
+ var a = newSymNode(it, result.info)
+ if it.typ.skipTypes({tyGenericInst}).kind == tyVar: a = newDeref(a)
+ result.add(a)
+
proc semShallowCopy(c: PContext, n: PNode, flags: TExprFlags): PNode
proc magicsAfterOverloadResolution(c: PContext, n: PNode,
flags: TExprFlags): PNode =
@@ -86,5 +113,6 @@ proc magicsAfterOverloadResolution(c: PContext, n: PNode,
of mOrd: result = semOrd(c, n)
of mShallowCopy: result = semShallowCopy(c, n, flags)
of mNBindSym: result = semBindSym(c, n)
+ of mLocals: result = semLocals(c, n)
else: result = n
View
@@ -2548,3 +2548,10 @@ proc safeAdd*(x: var string, y: string) =
if x == nil: x = y
else: x.add(y)
+proc locals*(): TObject {.magic: "Locals", noSideEffect.} =
+ ## generates a tuple constructor expression listing all the local variables
+ ## in the current scope. This is quite fast as it does not rely
+ ## on any debug or runtime information. Note that in constrast to what
+ ## the official signature says, the return type is not ``TObject`` but a
+ ## tuple of a structure that depends on the current scope.
+ nil
View
@@ -0,0 +1,11 @@
+discard """
+ output: "(x: string here, a: 1, b: 3)"
+"""
+
+proc simple[T](a, b: T) =
+ var
+ x = "string here"
+ echo locals()
+
+simple(1, 3)
+
View
@@ -13,7 +13,6 @@ version 0.9.2
- acyclic vs prunable; introduce GC hints
- CGEN: ``restrict`` pragma + backend support; computed goto support
- document NimMain and check whether it works for threading
-- implement ``system.locals`` magic iterator
Bugs
@@ -27,7 +26,6 @@ Bugs
- aporia.nim(968, 5) Error: ambiguous identifier: 'DELETE' --
use a qualifier
- blocks can "export" an identifier but the CCG generates {} for them ...
-- JS gen: fix exception handling
- osproc execProcesses can deadlock if all processes fail (as experienced
in c++ mode)
- bootstrapping does not work in C++ mode
View
@@ -24,6 +24,7 @@ Library Additions
- There is a new experimental mark&sweep GC which can be faster (or much
slower) than the default GC. Enable with ``--gc:markAndSweep``.
- Added ``system.onRaise`` to support a condition system.
+- Added ``system.locals`` that provides access to a proc's locals.
- Added ``macros.quote`` for AST quasi-quoting.
- Added ``system.unsafeNew`` to support hacky variable length objects.
- ``system.fields`` and ``system.fieldPairs`` support ``object`` too; they

0 comments on commit 226e5ca

Please sign in to comment.