fix makeFieldReadersTable crash when orc enabled.
also remove duplicated readFieldIMPL template see https://github.com/status-im/nim-toml-serialization/issues/62 and https://github.com/status-im/nim-toml-serialization/issues/63
This commit is contained in:
parent
3c6afa3614
commit
4959f1f983
|
@ -188,12 +188,6 @@ template readFieldIMPL[Reader](field: type FieldTag,
|
||||||
{.gcsafe.}: # needed by Nim-1.6
|
{.gcsafe.}: # needed by Nim-1.6
|
||||||
reader.readValue GetFieldType(field)
|
reader.readValue GetFieldType(field)
|
||||||
|
|
||||||
template readFieldIMPL[Reader](field: type FieldTag,
|
|
||||||
reader: var Reader): untyped =
|
|
||||||
mixin readValue
|
|
||||||
{.gcsafe.}: # needed by Nim-1.6
|
|
||||||
reader.readValue GetFieldType(field)
|
|
||||||
|
|
||||||
template writeFieldIMPL*[Writer](writer: var Writer,
|
template writeFieldIMPL*[Writer](writer: var Writer,
|
||||||
fieldTag: type FieldTag,
|
fieldTag: type FieldTag,
|
||||||
fieldVal: auto,
|
fieldVal: auto,
|
||||||
|
@ -210,6 +204,9 @@ proc makeFieldReadersTable(RecordType, ReaderType: distinct type,
|
||||||
enumAllSerializedFields(RecordType):
|
enumAllSerializedFields(RecordType):
|
||||||
proc readField(obj: var RecordType, reader: var ReaderType)
|
proc readField(obj: var RecordType, reader: var ReaderType)
|
||||||
{.gcsafe, nimcall, raises: [SerializationError, Defect].} =
|
{.gcsafe, nimcall, raises: [SerializationError, Defect].} =
|
||||||
|
|
||||||
|
mixin readValue
|
||||||
|
|
||||||
when RecordType is tuple:
|
when RecordType is tuple:
|
||||||
const i = fieldName.parseInt
|
const i = fieldName.parseInt
|
||||||
|
|
||||||
|
@ -217,13 +214,20 @@ proc makeFieldReadersTable(RecordType, ReaderType: distinct type,
|
||||||
when RecordType is tuple:
|
when RecordType is tuple:
|
||||||
reader.readValue obj[i]
|
reader.readValue obj[i]
|
||||||
else:
|
else:
|
||||||
type F = FieldTag[RecordType, realFieldName]
|
|
||||||
# TODO: The `FieldType` coercion below is required to deal
|
# TODO: The `FieldType` coercion below is required to deal
|
||||||
# with a nim bug caused by the distinct `ssz.List` type.
|
# with a nim bug caused by the distinct `ssz.List` type.
|
||||||
# It seems to break the generics cache mechanism, which
|
# It seems to break the generics cache mechanism, which
|
||||||
# leads to an incorrect return type being reported from
|
# leads to an incorrect return type being reported from
|
||||||
# the `readFieldIMPL` function.
|
# the `readFieldIMPL` function.
|
||||||
field(obj, realFieldName) = FieldType readFieldIMPL(F, reader)
|
field(obj, realFieldName) = FieldType reader.readValue(FieldType)
|
||||||
|
|
||||||
|
when false:
|
||||||
|
# somehow this code result in crash with nim orc enabled.
|
||||||
|
# that's why we use reader.readValue
|
||||||
|
# removing FieldType coercion also prevent crash, but see above comment
|
||||||
|
type F = FieldTag[RecordType, realFieldName]
|
||||||
|
field(obj, realFieldName) = FieldType readFieldIMPL(F, reader)
|
||||||
|
|
||||||
except SerializationError as err:
|
except SerializationError as err:
|
||||||
raise err
|
raise err
|
||||||
except CatchableError as err:
|
except CatchableError as err:
|
||||||
|
|
Loading…
Reference in New Issue