xP: further optimize JSON marshalling
This commit is contained in:
parent
9cf44aa4dd
commit
98b0a4ef3d
@ -15,6 +15,9 @@ function define_sint(size, shortname, gotype) {
|
|||||||
gotype = "int" size
|
gotype = "int" size
|
||||||
define_internal(shortname, gotype)
|
define_internal(shortname, gotype)
|
||||||
|
|
||||||
|
CodegenAppendJSON[shortname] = \
|
||||||
|
"\tb = strconv.AppendInt(b, int64(%s), 10)\n"
|
||||||
|
|
||||||
if (size == 8) {
|
if (size == 8) {
|
||||||
CodegenSerialize[shortname] = "\tdata = append(data, uint8(%s))\n"
|
CodegenSerialize[shortname] = "\tdata = append(data, uint8(%s))\n"
|
||||||
CodegenDeserialize[shortname] = \
|
CodegenDeserialize[shortname] = \
|
||||||
@ -42,6 +45,9 @@ function define_uint(size, shortname, gotype) {
|
|||||||
gotype = "uint" size
|
gotype = "uint" size
|
||||||
define_internal(shortname, gotype)
|
define_internal(shortname, gotype)
|
||||||
|
|
||||||
|
CodegenAppendJSON[shortname] = \
|
||||||
|
"\tb = strconv.AppendUint(b, uint64(%s), 10)\n"
|
||||||
|
|
||||||
# Both byte and uint8 luckily marshal as base64-encoded JSON strings.
|
# Both byte and uint8 luckily marshal as base64-encoded JSON strings.
|
||||||
if (size == 8) {
|
if (size == 8) {
|
||||||
CodegenSerialize[shortname] = "\tdata = append(data, %s)\n"
|
CodegenSerialize[shortname] = "\tdata = append(data, %s)\n"
|
||||||
@ -76,6 +82,8 @@ function codegen_begin() {
|
|||||||
define_uint("64")
|
define_uint("64")
|
||||||
|
|
||||||
define_internal("bool", "bool")
|
define_internal("bool", "bool")
|
||||||
|
CodegenAppendJSON["bool"] = \
|
||||||
|
"\tb = strconv.AppendBool(b, %s)\n"
|
||||||
CodegenSerialize["bool"] = \
|
CodegenSerialize["bool"] = \
|
||||||
"\tif %s {\n" \
|
"\tif %s {\n" \
|
||||||
"\t\tdata = append(data, 1)\n" \
|
"\t\tdata = append(data, 1)\n" \
|
||||||
@ -254,24 +262,32 @@ function codegen_enum(name, cg, gotype, fields) {
|
|||||||
delete cg[i]
|
delete cg[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function codegen_marshal(type, f, marshal) {
|
||||||
|
if (CodegenAppendJSON[type])
|
||||||
|
return sprintf(CodegenAppendJSON[type], f)
|
||||||
|
|
||||||
|
if (CodegenIsMarshaler[type])
|
||||||
|
marshal = f ".MarshalJSON()"
|
||||||
|
else
|
||||||
|
marshal = "json.Marshal(" f ")"
|
||||||
|
|
||||||
|
return \
|
||||||
|
"\tif j, err := " marshal "; err != nil {\n" \
|
||||||
|
"\t\treturn nil, err\n" \
|
||||||
|
"\t} else {\n" \
|
||||||
|
"\t\tb = append(b, j...)\n" \
|
||||||
|
"\t}\n"
|
||||||
|
}
|
||||||
|
|
||||||
function codegen_struct_field_marshal(d, cg, camel, f, marshal) {
|
function codegen_struct_field_marshal(d, cg, camel, f, marshal) {
|
||||||
camel = snaketocamel(d["name"])
|
camel = snaketocamel(d["name"])
|
||||||
f = "s." camel
|
f = "s." camel
|
||||||
|
|
||||||
# Complex types are json.Marshalers, there's no need to json.Marshal(&f).
|
# Complex types are json.Marshalers, there's no need to json.Marshal(&f).
|
||||||
if (!d["isarray"]) {
|
if (!d["isarray"]) {
|
||||||
if (CodegenIsMarshaler[d["type"]])
|
|
||||||
marshal = f ".MarshalJSON()"
|
|
||||||
else
|
|
||||||
marshal = "json.Marshal(" f ")"
|
|
||||||
|
|
||||||
append(cg, "marshal",
|
append(cg, "marshal",
|
||||||
"\tb = append(b, `,\"" decapitalize(camel) "\":`...)\n" \
|
"\tb = append(b, `,\"" decapitalize(camel) "\":`...)\n" \
|
||||||
"\tif j, err := " marshal "; err != nil {\n" \
|
codegen_marshal(d["type"], f))
|
||||||
"\t\treturn nil, err\n" \
|
|
||||||
"\t} else {\n" \
|
|
||||||
"\t\tb = append(b, j...)\n" \
|
|
||||||
"\t}\n")
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,22 +299,13 @@ function codegen_struct_field_marshal(d, cg, camel, f, marshal) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CodegenIsMarshaler[d["type"]])
|
|
||||||
marshal = f "[i].MarshalJSON()"
|
|
||||||
else
|
|
||||||
marshal = "json.Marshal(" f "[i])"
|
|
||||||
|
|
||||||
append(cg, "marshal",
|
append(cg, "marshal",
|
||||||
"\tb = append(b, `,\"" decapitalize(camel) "\":[`...)\n" \
|
"\tb = append(b, `,\"" decapitalize(camel) "\":[`...)\n" \
|
||||||
"\tfor i := 0; i < len(" f "); i++ {\n" \
|
"\tfor i := 0; i < len(" f "); i++ {\n" \
|
||||||
"\t\tif i > 0 {\n" \
|
"\t\tif i > 0 {\n" \
|
||||||
"\t\t\tb = append(b, ',')\n" \
|
"\t\t\tb = append(b, ',')\n" \
|
||||||
"\t\t}\n" \
|
"\t\t}\n" \
|
||||||
"\t\tif j, err := " marshal "; err != nil {\n" \
|
indent(codegen_marshal(d["type"], f "[i]")) \
|
||||||
"\t\t\treturn nil, err\n" \
|
|
||||||
"\t\t} else {\n" \
|
|
||||||
"\t\t\tb = append(b, j...)\n" \
|
|
||||||
"\t\t}\n" \
|
|
||||||
"\t}\n" \
|
"\t}\n" \
|
||||||
"\tb = append(b, ']')\n")
|
"\tb = append(b, ']')\n")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user