Merge pull request #3647 from rbehrends/fix-tnimtype
Fix code generation issues with TNimType.
This commit is contained in:
commit
fe8b07876c
2 changed files with 15 additions and 9 deletions
|
|
@ -61,7 +61,10 @@ type
|
||||||
## wrapped value and **must not** live longer than
|
## wrapped value and **must not** live longer than
|
||||||
## its wrapped value.
|
## its wrapped value.
|
||||||
value: pointer
|
value: pointer
|
||||||
rawType: PNimType
|
when defined(js):
|
||||||
|
rawType: PNimType
|
||||||
|
else:
|
||||||
|
rawTypePtr: pointer
|
||||||
|
|
||||||
ppointer = ptr pointer
|
ppointer = ptr pointer
|
||||||
pbyteArray = ptr array[0.. 0xffff, int8]
|
pbyteArray = ptr array[0.. 0xffff, int8]
|
||||||
|
|
@ -71,6 +74,14 @@ type
|
||||||
when defined(gogc):
|
when defined(gogc):
|
||||||
elemSize: int
|
elemSize: int
|
||||||
PGenSeq = ptr TGenericSeq
|
PGenSeq = ptr TGenericSeq
|
||||||
|
|
||||||
|
when not defined(js):
|
||||||
|
template rawType(x: Any): PNimType =
|
||||||
|
cast[PNimType](x.rawTypePtr)
|
||||||
|
|
||||||
|
template `rawType=`(x: var Any, p: PNimType) =
|
||||||
|
x.rawTypePtr = cast[pointer](p)
|
||||||
|
|
||||||
{.deprecated: [TAny: Any, TAnyKind: AnyKind].}
|
{.deprecated: [TAny: Any, TAnyKind: AnyKind].}
|
||||||
|
|
||||||
when defined(gogc):
|
when defined(gogc):
|
||||||
|
|
@ -108,7 +119,7 @@ proc selectBranch(aa: pointer, n: ptr TNimNode): ptr TNimNode =
|
||||||
else:
|
else:
|
||||||
result = n.sons[n.len]
|
result = n.sons[n.len]
|
||||||
|
|
||||||
proc newAny(value: pointer, rawType: PNimType): Any =
|
proc newAny(value: pointer, rawType: PNimType): Any {.inline.} =
|
||||||
result.value = value
|
result.value = value
|
||||||
result.rawType = rawType
|
result.rawType = rawType
|
||||||
|
|
||||||
|
|
@ -126,8 +137,7 @@ proc toAny*[T](x: var T): Any {.inline.} =
|
||||||
## constructs a ``Any`` object from `x`. This captures `x`'s address, so
|
## constructs a ``Any`` object from `x`. This captures `x`'s address, so
|
||||||
## `x` can be modified with its ``Any`` wrapper! The client needs to ensure
|
## `x` can be modified with its ``Any`` wrapper! The client needs to ensure
|
||||||
## that the wrapper **does not** live longer than `x`!
|
## that the wrapper **does not** live longer than `x`!
|
||||||
result.value = addr(x)
|
newAny(addr(x), cast[PNimType](getTypeInfo(x)))
|
||||||
result.rawType = cast[PNimType](getTypeInfo(x))
|
|
||||||
|
|
||||||
proc kind*(x: Any): AnyKind {.inline.} =
|
proc kind*(x: Any): AnyKind {.inline.} =
|
||||||
## get the type kind
|
## get the type kind
|
||||||
|
|
@ -345,7 +355,7 @@ proc `[]`*(x: Any, fieldName: string): Any =
|
||||||
result.value = x.value +!! n.offset
|
result.value = x.value +!! n.offset
|
||||||
result.rawType = n.typ
|
result.rawType = n.typ
|
||||||
elif x.rawType.kind == tyObject and x.rawType.base != nil:
|
elif x.rawType.kind == tyObject and x.rawType.base != nil:
|
||||||
return `[]`(Any(value: x.value, rawType: x.rawType.base), fieldName)
|
return `[]`(newAny(x.value, x.rawType.base), fieldName)
|
||||||
else:
|
else:
|
||||||
raise newException(ValueError, "invalid field name: " & fieldName)
|
raise newException(ValueError, "invalid field name: " & fieldName)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -418,10 +418,6 @@ typedef int assert_numbits[sizeof(NI) == sizeof(void*) && NIM_INTBITS == sizeof(
|
||||||
# define NIM_EXTERNC
|
# define NIM_EXTERNC
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* we have to tinker with TNimType as it's both part of system.nim and
|
|
||||||
typeinfo.nim but system.nim doesn't export it cleanly... */
|
|
||||||
typedef struct TNimType TNimType;
|
|
||||||
|
|
||||||
/* ---------------- platform specific includes ----------------------- */
|
/* ---------------- platform specific includes ----------------------- */
|
||||||
|
|
||||||
/* VxWorks related includes */
|
/* VxWorks related includes */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue