implement bitsize pragma for bitfields

This commit is contained in:
Aman Gupta 2015-09-28 14:34:36 -07:00
commit 5e9ce88daf
5 changed files with 18 additions and 1 deletions

View file

@ -784,6 +784,7 @@ type
tab*: TStrTable # interface table for modules tab*: TStrTable # interface table for modules
of skLet, skVar, skField, skForVar: of skLet, skVar, skField, skForVar:
guard*: PSym guard*: PSym
bitsize*: BiggestInt
else: nil else: nil
magic*: TMagic magic*: TMagic
typ*: PType typ*: PType

View file

@ -441,6 +441,8 @@ proc genRecordFieldsAux(m: BModule, n: PNode,
elif fieldType.kind == tySequence: elif fieldType.kind == tySequence:
# we need to use a weak dependency here for trecursive_table. # we need to use a weak dependency here for trecursive_table.
addf(result, "$1 $2;$n", [getTypeDescWeak(m, field.loc.t, check), sname]) addf(result, "$1 $2;$n", [getTypeDescWeak(m, field.loc.t, check), sname])
elif field.bitsize != 0:
addf(result, "$1 $2:$3;$n", [getTypeDescAux(m, field.loc.t, check), sname, rope($field.bitsize)])
else: else:
# don't use fieldType here because we need the # don't use fieldType here because we need the
# tyGenericInst for C++ template support # tyGenericInst for C++ template support

View file

@ -56,7 +56,7 @@ const
wInheritable, wGensym, wInject, wRequiresInit, wUnchecked, wUnion, wPacked, wInheritable, wGensym, wInject, wRequiresInit, wUnchecked, wUnion, wPacked,
wBorrow, wGcSafe} wBorrow, wGcSafe}
fieldPragmas* = {wImportc, wExportc, wDeprecated, wExtern, fieldPragmas* = {wImportc, wExportc, wDeprecated, wExtern,
wImportCpp, wImportObjC, wError, wGuard} wImportCpp, wImportObjC, wError, wGuard, wBitsize}
varPragmas* = {wImportc, wExportc, wVolatile, wRegister, wThreadVar, wNodecl, varPragmas* = {wImportc, wExportc, wVolatile, wRegister, wThreadVar, wNodecl,
wMagic, wHeader, wDeprecated, wCompilerproc, wDynlib, wExtern, wMagic, wHeader, wDeprecated, wCompilerproc, wDynlib, wExtern,
wImportCpp, wImportObjC, wError, wNoInit, wCompileTime, wGlobal, wImportCpp, wImportObjC, wError, wNoInit, wCompileTime, wGlobal,
@ -844,6 +844,11 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: int,
if sym == nil: pragmaLockStmt(c, it) if sym == nil: pragmaLockStmt(c, it)
elif sym.typ == nil: invalidPragma(it) elif sym.typ == nil: invalidPragma(it)
else: sym.typ.lockLevel = pragmaLocks(c, it) else: sym.typ.lockLevel = pragmaLocks(c, it)
of wBitsize:
if sym == nil or sym.kind != skField or it.kind != nkExprColonExpr:
invalidPragma(it)
else:
sym.bitsize = expectIntLit(c, it)
of wGuard: of wGuard:
if sym == nil or sym.kind notin {skVar, skLet, skField}: if sym == nil or sym.kind notin {skVar, skLet, skField}:
invalidPragma(it) invalidPragma(it)

View file

@ -82,6 +82,7 @@ type
wStdIn, wStdOut, wStdErr, wStdIn, wStdOut, wStdErr,
wInOut, wByCopy, wByRef, wOneWay, wInOut, wByCopy, wByRef, wOneWay,
wBitsize,
TSpecialWords* = set[TSpecialWord] TSpecialWords* = set[TSpecialWord]
@ -168,6 +169,7 @@ const
"stdin", "stdout", "stderr", "stdin", "stdout", "stderr",
"inout", "bycopy", "byref", "oneway", "inout", "bycopy", "byref", "oneway",
"bitsize",
] ]
proc findStr*(a: openArray[string], s: string): int = proc findStr*(a: openArray[string], s: string): int =

View file

@ -0,0 +1,7 @@
type
bits* = object
flag* {.bitsize: 1.}: cint
opts* {.bitsize: 4.}: cint
var b: bits
echo b.flag