Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

separate typed and untyped array/set literals, make case always use ranges #479

Merged
merged 4 commits into from
Feb 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/hexer/desugar.nim
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ proc genSetConstr(c: var Context; dest: var TokenBuf; n: var Cursor) =
skip n
else:
dest.addParLe(AconstrX, info)
#trSetType(c, dest, typ)
trSetType(c, dest, typ)
for b in bytes:
dest.addUintLit(b, info)

Expand Down
2 changes: 1 addition & 1 deletion src/hexer/duplifier.nim
Original file line number Diff line number Diff line change
Expand Up @@ -650,7 +650,7 @@ proc tr(c: var Context; n: var Cursor; e: Expects) =
DefinedX, HighX, LowX, TypeofX, UnpackX, EnumToStrX, IsMainModuleX, QuotedX,
DerefX, HderefX, AddrX, HaddrX:
trSons c, n, WantNonOwner
of DefaultObjX, DefaultTupX:
of DefaultObjX, DefaultTupX, BracketX, CurlyX:
raiseAssert "nodekind should have been eliminated in sem.nim"
of NoExpr:
case n.stmtKind
Expand Down
7 changes: 3 additions & 4 deletions src/hexer/nifcgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -858,9 +858,8 @@ proc traverseExpr(e: var EContext; c: var Cursor) =
skipParRi(e, c)
of AconstrX:
e.dest.add tagToken("aconstr", c.info)
var arrayType = e.typeCache.getType(c)
inc c
e.traverseType(arrayType, {})
traverseType(e, c)
inc nested
of OconstrX:
e.dest.add tagToken("oconstr", c.info)
Expand Down Expand Up @@ -950,7 +949,7 @@ proc traverseExpr(e: var EContext; c: var Cursor) =
e.dest.addParRi()
traverseExpr e, c
wantParRi e, c
of NewOconstrX, SetX, PlusSetX, MinusSetX, MulSetX, XorSetX, EqSetX, LeSetX, LtSetX, InSetX, CardSetX:
of NewOconstrX, SetX, PlusSetX, MinusSetX, MulSetX, XorSetX, EqSetX, LeSetX, LtSetX, InSetX, CardSetX, BracketX, CurlyX:
error e, "BUG: not eliminated: ", c
else:
e.dest.add c
Expand Down Expand Up @@ -1117,7 +1116,7 @@ proc traverseCase(e: var EContext; c: var Cursor) =
of OfS:
e.dest.add c
inc c
if c.kind == ParLe and pool.tags[c.tag] == $SetX:
if c.kind == ParLe and pool.tags[c.tag] == $RangesX:
inc c
e.add "ranges", c.info
while c.kind != ParRi:
Expand Down
6 changes: 3 additions & 3 deletions src/nifler/bridge.nim
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ proc nodeKindTranslation(k: TNodeKind): string =
of nkExprColonExpr: "kv"
of nkPar: "par"
of nkObjConstr: "obj"
of nkCurly: "set"
of nkCurly: "curly"
of nkCurlyExpr: "curlyx"
of nkBracket: "arr"
of nkBracket: "bracket"
of nkBracketExpr: "at"
of nkPragmaBlock, nkPragmaExpr: "pragmax"
of nkDotExpr: "dot"
Expand Down Expand Up @@ -342,7 +342,7 @@ proc toNif*(n, parent: PNode; c: var TranslationContext) =
of nkOfBranch:
relLineInfo(n, parent, c)
c.b.addTree("of")
c.b.addTree("set")
c.b.addTree("ranges")
for i in 0..<n.len-1:
toNif(n[i], n, c)
c.b.endTree()
Expand Down
8 changes: 4 additions & 4 deletions src/nimony/controlflow.nim
Original file line number Diff line number Diff line change
Expand Up @@ -502,9 +502,9 @@ proc trAsgn(c: var ControlFlow; n: var Cursor) =
else:
endRead c.dest

proc trCaseSet(c: var ControlFlow; n: var Cursor; selector: SymId; selectorType: Cursor;
proc trCaseRanges(c: var ControlFlow; n: var Cursor; selector: SymId; selectorType: Cursor;
tjmp, fjmp: var FixupList) =
assert n.exprKind == SetX
assert n.exprKind == RangesX
inc n
var nextAttempt = Label(-1)
var nextAttemptB = Label(-1)
Expand Down Expand Up @@ -581,7 +581,7 @@ proc trCase(c: var ControlFlow; n: var Cursor; tar: Target) =
inc n
var tjmp: FixupList = @[]
var fjmp: FixupList = @[]
trCaseSet c, n, selector, selectorType, tjmp, fjmp
trCaseRanges c, n, selector, selectorType, tjmp, fjmp
for t in tjmp: c.patch t
trStmtOrExpr c, n, tar
endings.add c.jmpForw(n.info)
Expand Down Expand Up @@ -756,7 +756,7 @@ proc trExpr(c: var ControlFlow; n: var Cursor) =
UnpackX, EnumToStrX,
IsMainModuleX, DefaultObjX, DefaultTupX, PlusSetX, MinusSetX,
MulSetX, XorSetX, EqSetX, LeSetX, LtSetX, InSetX, CardSetX, EnsureMoveX,
DestroyX, DupX, CopyX, WasMovedX, SinkHookX, TraceX:
DestroyX, DupX, CopyX, WasMovedX, SinkHookX, TraceX, BracketX, CurlyX:
trExprLoop c, n
of CompilesX, DeclaredX, DefinedX, HighX, LowX, TypeofX, SizeofX:
# we want to avoid false dependencies for `sizeof(var)` as it doesn't really "use" the variable:
Expand Down
6 changes: 3 additions & 3 deletions src/nimony/enumtostr.nim
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import decls, nimony_model, semdata, sembasics
proc tagToken(tag: string; info: PackedLineInfo): PackedToken {.inline.} =
parLeToken(pool.tags.getOrIncl(tag), info)

proc genEnumToStrProcCase(c: var SemContext; enumDecl: var Cursor; symId: SymId) =
proc genEnumToStrProcCase(c: var SemContext; enumDecl: var Cursor; symId, enumSymId: SymId) =
c.dest.add tagToken("case", enumDecl.info)
c.dest.add symToken(symId, enumDecl.info)
inc enumDecl # skips enum
Expand All @@ -22,7 +22,7 @@ proc genEnumToStrProcCase(c: var SemContext; enumDecl: var Cursor; symId: SymId)
let enumDeclInfo = enumDecl.info
c.dest.add tagToken("of", enumDeclInfo)

c.dest.add tagToken("set", enumDeclInfo)
c.dest.add tagToken("ranges", enumDeclInfo)

inc enumDecl
let symId = enumDecl.symId
Expand Down Expand Up @@ -89,7 +89,7 @@ proc genEnumToStrProc*(c: var SemContext; typeDecl: var Cursor) =

c.dest.add tagToken("stmts", enumSymInfo)
var body = decl.body
genEnumToStrProcCase(c, body, paramSymId)
genEnumToStrProcCase(c, body, paramSymId, enumSymId)
c.dest.addParRi() # stmts

c.dest.addParRi() # proc
1 change: 1 addition & 0 deletions src/nimony/expreval.nim
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ proc evalBitSet*(n, typ: Cursor): seq[uint8] =
result = newSeq[uint8](s)
var n = n
inc n # skip set tag
skip n # skip set type
while n.kind != ParRi:
if n.exprKind == RangeX:
inc n
Expand Down
2 changes: 2 additions & 0 deletions src/nimony/nimony_model.nim
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ type
OconstrX = "obj"
NewOconstrX = "newobj"
TupleConstrX = "tup"
BracketX = "bracket"
CurlyX = "curly"
AconstrX = "arr"
SetX = "set"
OchoiceX = "ochoice"
Expand Down
68 changes: 61 additions & 7 deletions src/nimony/sem.nim
Original file line number Diff line number Diff line change
Expand Up @@ -3431,7 +3431,7 @@ proc semEmit(c: var SemContext; it: var Item) =
let info = it.n.info
c.dest.add parLeToken(pool.tags.getOrIncl($EmitS), info)
inc it.n
if it.n.exprKind == AconstrX:
if it.n.exprKind == BracketX:
inc it.n
while it.n.kind != ParRi:
var a = Item(n: it.n, typ: c.types.autoType)
Expand Down Expand Up @@ -3569,7 +3569,7 @@ proc semWhen(c: var SemContext; it: var Item) =

proc semCaseOfValue(c: var SemContext; it: var Item; selectorType: TypeCursor;
seen: var seq[(xint, xint)]) =
if it.n == "set":
if it.n == "ranges":
takeToken c, it.n
while it.n.kind != ParRi:
let info = it.n.info
Expand All @@ -3595,7 +3595,7 @@ proc semCaseOfValue(c: var SemContext; it: var Item; selectorType: TypeCursor;
buildErr c, info, "value already handled"
wantParRi c, it.n
else:
buildErr c, it.n.info, "`set` within `of` expected"
buildErr c, it.n.info, "`curly` within `of` expected"
skip it.n

proc semCase(c: var SemContext; it: var Item) =
Expand Down Expand Up @@ -3895,16 +3895,21 @@ proc semTypedUnaryArithmetic(c: var SemContext; it: var Item) =
wantParRi c, it.n
commonType c, it, beforeExpr, typ

proc semArrayConstr(c: var SemContext, it: var Item) =
proc semBracket(c: var SemContext, it: var Item) =
let exprStart = c.dest.len
takeToken c, it.n
let info = it.n.info
inc it.n
c.dest.addParLe(AconstrX, info)
if it.n.kind == ParRi:
# empty array
if it.typ.typeKind in {AutoT, VoidT}:
buildErr c, it.n.info, "empty array needs a specified type"
else:
c.dest.addSubtree it.typ
wantParRi c, it.n
return

let typeInsertPos = c.dest.len
var elem = Item(n: it.n, typ: c.types.autoType)
case it.typ.typeKind
of ArrayT: # , SeqT, OpenArrayT
Expand Down Expand Up @@ -3933,17 +3938,24 @@ proc semArrayConstr(c: var SemContext, it: var Item) =
let expected = it.typ
it.typ = typeToCursor(c, typeStart)
c.dest.shrink typeStart
c.dest.insert it.typ, typeInsertPos
commonType c, it, exprStart, expected

proc semSetConstr(c: var SemContext, it: var Item) =
proc semCurly(c: var SemContext, it: var Item) =
let exprStart = c.dest.len
takeToken c, it.n
let info = it.n.info
inc it.n
c.dest.addParLe(SetX, info)
if it.n.kind == ParRi:
# empty set
if it.typ.typeKind in {AutoT, VoidT}:
buildErr c, it.n.info, "empty set needs a specified type"
else:
c.dest.addSubtree it.typ
wantParRi c, it.n
return

let typeInsertPos = c.dest.len
var elem = Item(n: it.n, typ: c.types.autoType)
case it.typ.typeKind
of SetT:
Expand Down Expand Up @@ -3987,8 +3999,46 @@ proc semSetConstr(c: var SemContext, it: var Item) =
let expected = it.typ
it.typ = typeToCursor(c, typeStart)
c.dest.shrink typeStart
c.dest.insert it.typ, typeInsertPos
commonType c, it, exprStart, expected

proc semArrayConstr(c: var SemContext; it: var Item) =
let start = c.dest.len
let expected = it.typ
let info = it.n.info
takeToken c, it.n
it.typ = semLocalType(c, it.n)
# XXX type length not enforced
var elem = Item(n: it.n, typ: c.types.autoType)
if it.typ.typeKind == ArrayT:
elem.typ = it.typ
inc elem.typ
else:
c.buildErr info, "expected array type for array constructor, got: " & typeToString(it.typ)
while elem.n.kind != ParRi:
semExpr c, elem
it.n = elem.n
wantParRi c, it.n
commonType c, it, start, expected

proc semSetConstr(c: var SemContext; it: var Item) =
let start = c.dest.len
let expected = it.typ
let info = it.n.info
takeToken c, it.n
it.typ = semLocalType(c, it.n)
var elem = Item(n: it.n, typ: c.types.autoType)
if it.typ.typeKind == SetT:
elem.typ = it.typ
inc elem.typ
else:
c.buildErr info, "expected set type for set constructor, got: " & typeToString(it.typ)
while elem.n.kind != ParRi:
semExpr c, elem
it.n = elem.n
wantParRi c, it.n
commonType c, it, start, expected

proc semSuf(c: var SemContext, it: var Item) =
let exprStart = c.dest.len
takeToken c, it.n
Expand Down Expand Up @@ -5250,6 +5300,10 @@ proc semExpr(c: var SemContext; it: var Item; flags: set[SemFlag] = {}) =
semInSet c, it
of CardSetX:
semCardSet c, it
of BracketX:
semBracket c, it
of CurlyX:
semCurly c, it
of AconstrX:
semArrayConstr c, it
of SetX:
Expand Down
2 changes: 1 addition & 1 deletion src/nimony/semos.nim
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ proc filenameVal*(n: var Cursor; res: var seq[ImportedFilename]; hasError: var b
hasError = true
if suffix.len == 0:
hasError = true
of ParX, AconstrX:
of ParX, AconstrX, BracketX:
inc n
if n.kind != ParRi:
while n.kind != ParRi:
Expand Down
10 changes: 6 additions & 4 deletions src/nimony/typenav.nim
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ proc getTypeImpl(c: var TypeCache; n: Cursor): Cursor =
result = c.builtins.intType
of AddX, SubX, MulX, DivX, ModX, ShlX, ShrX, AshrX, BitandX, BitorX, BitxorX, BitnotX,
PlusSetX, MinusSetX, MulSetX, XorSetX,
CastX, ConvX, OconvX, HconvX, DconvX, OconstrX, NewOconstrX:
CastX, ConvX, OconvX, HconvX, DconvX, OconstrX, NewOconstrX, AconstrX, SetX:
result = n.firstSon
of ParX, EnsureMoveX:
result = getTypeImpl(c, n.firstSon)
Expand Down Expand Up @@ -183,7 +183,8 @@ proc getTypeImpl(c: var TypeCache; n: Cursor): Cursor =
buf.addParRi()
c.mem.add buf
result = cursorAt(c.mem[c.mem.len-1], 0)
of SetX:
of CurlyX:
# should not be encountered but keep this code for now
let elemType = getTypeImpl(c, n.firstSon)
var buf = createTokenBuf(4)
buf.add parLeToken(SetT, n.info)
Expand Down Expand Up @@ -218,14 +219,15 @@ proc getTypeImpl(c: var TypeCache; n: Cursor): Cursor =
result = field.typ
else:
result = tupType
of AconstrX:
of BracketX:
# should not be encountered but keep this code for now
let elemType = getTypeImpl(c, n.firstSon)
var buf = createTokenBuf(4)
buf.add parLeToken(ArrayT, n.info)
buf.addSubtree elemType
var n = n
var arrayLen = 0
inc n # skips AconstrX
inc n # skips BracketX
while n.kind != ParRi:
skip n
inc arrayLen
Expand Down
4 changes: 2 additions & 2 deletions tests/nimony/nosystem/tbool.nif
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@
(result :result.0 . . string.0.sys9azlf .) 23
(case e.0 ~18,1
(of
(set ~8
(ranges ~8
(false))
(stmts
(ret "false"))) ~8,1
(of
(set ~7
(ranges ~7
(true))
(stmts
(ret "true"))))
Expand Down
Loading
Loading