Compare commits

...
Sign in to create a new pull request.

4 commits

Author SHA1 Message Date
Joey Yakimowich-Payne
8c763fc4d3 Add type identifier as ignored too 2020-05-06 07:21:34 -06:00
Joey Yakimowich-Payne
baaba7881b Add comment, potentially fix linux test 2020-05-06 07:20:29 -06:00
Joey Yakimowich-Payne
0ff18278f0 Add multiple pointer support 2020-05-05 20:36:02 -06:00
Joey Yakimowich-Payne
e69aafa40d Fix pointer issue and test 2020-05-05 14:47:42 -06:00
5 changed files with 75 additions and 51 deletions

View file

@ -8,17 +8,6 @@ import "."/treesitter/api
import "."/[comphelp, exprparser, globals, getters, tshelp]
proc getPtrType*(str: string): string =
result = case str:
of "cchar":
"cstring"
of "object":
"pointer"
of "FILE":
"File"
else:
str
proc getOverrideOrSkip(gState: State, node: TSNode, origname: string, kind: NimSymKind): PNode =
# Check if symbol `origname` of `kind` and `origname` has any cOverride defined
# and use that if present
@ -117,7 +106,7 @@ proc newConstDef(gState: State, node: TSNode, fname = "", fval = ""): PNode =
if not maybeTyNode.isNil:
let name = maybeTyNode.getName()
case name
of "type_descriptor", "sized_type_specifier":
of "type_descriptor", "sized_type_specifier", "primitive_type", "type_identifier":
discard
else:
# Can't do gState.parseCExpression(root) here for some reason?
@ -405,43 +394,6 @@ proc newXIdent(gState: State, node: TSNode, kind = nskType, fname = "", pragmas:
else:
gecho &"# $1 '{origname}' is duplicate, skipped" % getKeyword(kind)
proc newPtrTree(gState: State, count: int, typ: PNode): PNode =
# Create nkPtrTy tree depending on count
#
# Reduce by 1 if Nim type available for ptr X - e.g. ptr cchar = cstring
result = typ
var
count = count
if typ.kind == nkIdent:
let
tname = typ.ident.s
ptname = getPtrType(tname)
if tname != ptname:
# If Nim type available, use that ident
result = gState.getIdent(ptname, typ.info, exported = false)
# One ptr reduced
count -= 1
if count > 0:
# Nested nkPtrTy(typ) depending on count
#
# [ptr ...] typ
#
# nkPtrTy(
# nkPtrTy(
# typ
# )
# )
var
nresult = newNode(nkPtrTy)
parent = nresult
child: PNode
for i in 1 ..< count:
child = newNode(nkPtrTy)
parent.add child
parent = child
parent.add result
result = nresult
proc newArrayTree(gState: State, node: TSNode, typ, size: PNode = nil): PNode =
# Create nkBracketExpr tree depending on input
#

View file

@ -15,4 +15,52 @@ proc parseString*(gState: State, str: string): PNode =
str, gState.identCache, gState.config, errorHandler = handleError
)
except:
decho getCurrentExceptionMsg()
decho getCurrentExceptionMsg()
proc getPtrType*(str: string): string =
result = case str:
of "cchar":
"cstring"
of "object":
"pointer"
of "FILE":
"File"
else:
str
proc newPtrTree*(gState: State, count: int, typ: PNode): PNode =
# Create nkPtrTy tree depending on count
#
# Reduce by 1 if Nim type available for ptr X - e.g. ptr cchar = cstring
result = typ
var
count = count
if typ.kind == nkIdent:
let
tname = typ.ident.s
ptname = getPtrType(tname)
if tname != ptname:
# If Nim type available, use that ident
result = gState.getIdent(ptname, typ.info, exported = false)
# One ptr reduced
count -= 1
if count > 0:
# Nested nkPtrTy(typ) depending on count
#
# [ptr ...] typ
#
# nkPtrTy(
# nkPtrTy(
# typ
# )
# )
var
nresult = newNode(nkPtrTy)
parent = nresult
child: PNode
for i in 1 ..< count:
child = newNode(nkPtrTy)
parent.add child
parent = child
parent.add result
result = nresult

View file

@ -548,7 +548,26 @@ proc processTSNode(gState: State, node: TSNode, typeofNode: var PNode): PNode =
# Input -> true, false
# Output -> true, false
result = gState.parseString(node.val)
of "type_descriptor", "sized_type_specifier":
of "type_descriptor":
# Input => int*
# (type_descriptor 1 2 4 "int*"
# (type_identifier 1 2 3 "int")
# (abstract_pointer_declarator 1 3 1 "*")
# )
#
# Output => ptr int
#
# nkPtrTy(
# nkIdent("int")
# )
let pointerDecl = node.anyChildInTree("abstract_pointer_declarator")
if pointerDecl.isNil:
result = gState.processTSNode(node[0], typeofNode)
else:
let pointerCount = pointerDecl.getXCount("abstract_pointer_declarator")
result = gState.newPtrTree(pointerCount, gState.processTSNode(node[0], typeofNode))
of "sized_type_specifier", "primitive_type", "type_identifier":
# Input -> int, unsigned int, long int, etc
# Output -> cint, cuint, clong, etc
let ty = getType(node.val)

View file

@ -20,6 +20,8 @@ extern "C" {
#define COERCE 645635634896ull + 35436
#define COERCE2 645635634896 + 35436ul
#define BINEXPR ~(-(1u << !-1)) ^ (10 >> 1)
#define POINTEREXPR (int*)0
#define POINTERPOINTERPOINTEREXPR (int***)0
#define BOOL true
#define MATHEXPR (1 + 2/3*20 - 100)
#define ANDEXPR (100 & 11000)

View file

@ -150,6 +150,9 @@ assert SHL1 == (1.uint shl 1)
assert SHL2 == (1.uint shl 2)
assert SHL3 == (1.uint shl 3)
assert typeof(POINTEREXPR) is (ptr cint)
assert typeof(POINTERPOINTERPOINTEREXPR) is (ptr ptr ptr cint)
assert ALLSHL == (SHL1 or SHL2 or SHL3)
assert A0 is object