mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
* add vm value preparation proc * small optimization
This commit is contained in:
committed by
Andreas Rumpf
parent
12fc1dfb2c
commit
99a4fed96b
@@ -2031,12 +2031,29 @@ proc evalStaticStmt*(module: PSym; g: ModuleGraph; e: PNode, prc: PSym) =
|
||||
proc setupCompileTimeVar*(module: PSym; g: ModuleGraph; n: PNode) =
|
||||
discard evalConstExprAux(module, g, nil, n, emStaticStmt)
|
||||
|
||||
proc prepareVMValue(arg: PNode): PNode =
|
||||
## strip nkExprColonExpr from tuple values recurively. That is how
|
||||
## they are expected to be stored in the VM.
|
||||
|
||||
# Early abort without copy. No transformation takes place.
|
||||
if arg.kind in nkLiterals:
|
||||
return arg
|
||||
|
||||
result = copyNode(arg)
|
||||
if arg.kind == nkTupleConstr:
|
||||
for child in arg:
|
||||
if child.kind == nkExprColonExpr:
|
||||
result.add prepareVMValue(child[1])
|
||||
else:
|
||||
result.add prepareVMValue(child)
|
||||
else:
|
||||
for child in arg:
|
||||
result.add prepareVMValue(child)
|
||||
|
||||
proc setupMacroParam(x: PNode, typ: PType): TFullReg =
|
||||
case typ.kind
|
||||
of tyStatic:
|
||||
putIntoReg(result, x)
|
||||
#of tyTypeDesc:
|
||||
# putIntoReg(result, x)
|
||||
putIntoReg(result, prepareVMValue(x))
|
||||
else:
|
||||
result.kind = rkNode
|
||||
var n = x
|
||||
|
||||
@@ -49,3 +49,15 @@ myEnums = enumerators2()
|
||||
echo myEnums
|
||||
myEnums = enumerators3()
|
||||
echo myEnums
|
||||
|
||||
#10751
|
||||
|
||||
type Tuple = tuple
|
||||
a: string
|
||||
b: int
|
||||
|
||||
macro foo(t: static Tuple): untyped =
|
||||
doAssert t.a == "foo"
|
||||
doAssert t.b == 12345
|
||||
|
||||
foo((a: "foo", b: 12345))
|
||||
|
||||
Reference in New Issue
Block a user