Removed time and added a hash based on filename, line and column for creating a unique struct id

This commit is contained in:
enurlyx 2014-06-14 17:10:51 +02:00
commit 788cfb3f59

View file

@ -19,7 +19,7 @@
import import
os, llstream, renderer, clex, idents, strutils, pegs, ast, astalgo, msgs, os, llstream, renderer, clex, idents, strutils, pegs, ast, astalgo, msgs,
options, strtabs, times options, strtabs, hashes
type type
TParserFlag = enum TParserFlag = enum
@ -691,11 +691,6 @@ proc parseField(p: var TParser, kind: TNodeKind): PNode =
else: result = mangledIdent(p.tok.s, p) else: result = mangledIdent(p.tok.s, p)
getTok(p, result) getTok(p, result)
proc getNewModuleWideId(): int =
var id {.global.} = 0
id.inc
id
proc structPragmas(p: TParser, name: PNode, origName: string): PNode = proc structPragmas(p: TParser, name: PNode, origName: string): PNode =
assert name.kind == nkIdent assert name.kind == nkIdent
result = newNodeP(nkPragmaExpr, p) result = newNodeP(nkPragmaExpr, p)
@ -708,15 +703,18 @@ proc structPragmas(p: TParser, name: PNode, origName: string): PNode =
if pragmas.len > 0: addSon(result, pragmas) if pragmas.len > 0: addSon(result, pragmas)
else: addSon(result, ast.emptyNode) else: addSon(result, ast.emptyNode)
proc hashPosition(p: TParser): string =
let lineInfo = parLineInfo(p)
let fileInfo = fileInfos[lineInfo.fileIndex]
result = $hash(fileInfo.shortName & "_" & $lineInfo.line & "_" & $lineInfo.col).uint
proc parseInnerStruct(p: var TParser, stmtList: PNode, isUnion: bool): PNode = proc parseInnerStruct(p: var TParser, stmtList: PNode, isUnion: bool): PNode =
getTok(p, nil) getTok(p, nil)
if p.tok.xkind != pxCurlyLe: if p.tok.xkind != pxCurlyLe:
parMessage(p, errUser, "Expected '{' but found '" & $(p.tok[]) & "'") parMessage(p, errUser, "Expected '{' but found '" & $(p.tok[]) & "'")
let time = getTime().int let structName = if isUnion: "INNER_C_UNION_" & p.hashPosition
let id = getNewModuleWideId() else: "INNER_C_STRUCT_" & p.hashPosition
let structName = if isUnion: "INNER_C_UNION_" & $time & "_" & $id
else: "INNER_C_STRUCT_" & $time & "_" & $id
let typeSection = newNodeP(nkTypeSection, p) let typeSection = newNodeP(nkTypeSection, p)
let newStruct = newNodeP(nkObjectTy, p) let newStruct = newNodeP(nkObjectTy, p)
var pragmas = ast.emptyNode var pragmas = ast.emptyNode
@ -751,10 +749,9 @@ proc parseStructBody(p: var TParser, stmtList: PNode, isUnion: bool,
backtrackContext(p) backtrackContext(p)
baseTyp = parseInnerStruct(p, stmtList, gotUnion) baseTyp = parseInnerStruct(p, stmtList, gotUnion)
if p.tok.xkind == pxSemiColon: if p.tok.xkind == pxSemiColon:
let id = getNewModuleWideId()
let def = newNodeP(nkIdentDefs, p) let def = newNodeP(nkIdentDefs, p)
var t = pointer(p, baseTyp) var t = pointer(p, baseTyp)
let i = fieldIdent("ano_" & $id, p) let i = fieldIdent("ano_" & p.hashPosition, p)
t = parseTypeSuffix(p, t) t = parseTypeSuffix(p, t)
addSon(def, i, t, ast.emptyNode) addSon(def, i, t, ast.emptyNode)
addSon(result, def) addSon(result, def)