From afe7ae8daa78c036948a6172da12788fa9efa7c9 Mon Sep 17 00:00:00 2001 From: Supun Setunga Date: Wed, 30 Jun 2021 08:24:53 +0530 Subject: [PATCH] Re-arrange encoding format to move types to the start --- runtime/interpreter/decode.go | 21 +++++++++++---------- runtime/interpreter/encode.go | 26 +++++++++++++------------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/runtime/interpreter/decode.go b/runtime/interpreter/decode.go index 00474f0640..c05fdaf951 100644 --- a/runtime/interpreter/decode.go +++ b/runtime/interpreter/decode.go @@ -1897,6 +1897,15 @@ func decodeDictionaryMetaInfo(v *DictionaryValue, content []byte) error { ) } + // Decode type + // TODO: store dictionary type + // Option 1: convert to sema type. - Don't have the interpreter + // Option 2: Store static type in dictionary + _, err = d.decodeStaticType() + if err != nil { + return err + } + // Lazily decode keys var keysContent []byte @@ -1939,17 +1948,9 @@ func decodeDictionaryMetaInfo(v *DictionaryValue, content []byte) error { return err } - // Decode type - // TODO: store dictionary type - // Option 1: convert to sema type. - Don't have the interpreter - // Option 2: Store static type in array - _, err = d.decodeStaticType() - if err != nil { - return err - } + keysContent = append(keysContent, valuesContent...) - //nolint:gocritic - v.entriesContent = append(keysContent, valuesContent...) + v.entriesContent = keysContent v.Type = nil return nil diff --git a/runtime/interpreter/encode.go b/runtime/interpreter/encode.go index 2ee13f00b6..a32051849a 100644 --- a/runtime/interpreter/encode.go +++ b/runtime/interpreter/encode.go @@ -853,9 +853,9 @@ func (e *EncoderV5) encodeArray( // NOTE: NEVER change, only add/increment; ensure uint64 const ( - encodedDictionaryValueKeysFieldKey uint64 = 0 - encodedDictionaryValueEntriesFieldKey uint64 = 1 - encodedDictionaryValueTypeFieldKey uint64 = 2 + encodedDictionaryValueTypeFieldKey uint64 = 0 + encodedDictionaryValueKeysFieldKey uint64 = 1 + encodedDictionaryValueEntriesFieldKey uint64 = 2 // !!! *WARNING* !!! // @@ -871,9 +871,9 @@ const dictionaryValuePathPrefix = "v" // cbor.Tag{ // Number: cborTagDictionaryValue, // Content: cborArray{ +// encodedDictionaryValueTypeFieldKey: []interface{}(type), // encodedDictionaryValueKeysFieldKey: []interface{}(keys), // encodedDictionaryValueEntriesFieldKey: []interface{}(entries), -// encodedDictionaryValueTypeFieldKey: []interface{}(type), // }, // } func (e *EncoderV5) encodeDictionaryValue( @@ -902,7 +902,7 @@ func (e *EncoderV5) encodeDictionaryValue( // Encode array head err = e.enc.EncodeRawBytes([]byte{ - // array, 2 items follow + // array, 3 items follow 0x83, }) if err != nil { @@ -912,7 +912,13 @@ func (e *EncoderV5) encodeDictionaryValue( //nolint:gocritic keysPath := append(path, dictionaryKeyPathPrefix) - // Encode keys (as array) at array index encodedDictionaryValueKeysFieldKey + // (1) Encode dictionary static type at array index encodedDictionaryValueTypeFieldKey + err = e.encodeStaticType(v.StaticType()) + if err != nil { + return err + } + + // (2) Encode keys (as array) at array index encodedDictionaryValueKeysFieldKey err = e.encodeArray(v.Keys(), keysPath, deferrals) if err != nil { return err @@ -944,7 +950,7 @@ func (e *EncoderV5) encodeDictionaryValue( entriesLength = 0 } - // Encode values (as array) at array index encodedDictionaryValueEntriesFieldKey + // (3) Encode values (as array) at array index encodedDictionaryValueEntriesFieldKey err = e.enc.EncodeArrayHead(uint64(entriesLength)) if err != nil { return err @@ -1011,12 +1017,6 @@ func (e *EncoderV5) encodeDictionaryValue( } } - // Encode dictionary static type at array index encodedDictionaryValueTypeFieldKey - err = e.encodeStaticType(v.StaticType()) - if err != nil { - return err - } - return nil }