From 000320d223301ed13edd5683281f82bceccb59da Mon Sep 17 00:00:00 2001 From: Aidan Lee Date: Tue, 20 Aug 2024 14:28:54 +0100 Subject: [PATCH 1/5] Hash and cache parsers --- src/json2object/reader/DataBuilder.hx | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/json2object/reader/DataBuilder.hx b/src/json2object/reader/DataBuilder.hx index 7860aac..93eb139 100644 --- a/src/json2object/reader/DataBuilder.hx +++ b/src/json2object/reader/DataBuilder.hx @@ -39,13 +39,15 @@ typedef JsonType = {jtype:String, name:String, params:Array} typedef ParserInfo = {packs:Array, clsName:String} class DataBuilder { - @:persistent - private static var counter = 0; - private static var parsers = new Map(); + private static var parsers = new Map(); private static var callPosition:Null = null; private static var jcustom = ":jcustomparse"; + static function isAlive(ct:ComplexType, pos:Position):Type { + return try Context.resolveType(ct, pos) catch(e) null; + } + private static function notNull(type:Type):Type { return switch (type) { case TAbstract(_.get()=>t, p): @@ -936,9 +938,14 @@ class DataBuilder { public static function makeParser(c:BaseType, type:Type, ?base:Type=null) { if (base == null) { base = type; } - var parserMapName = base.toString(); - if (parsers.exists(parserMapName)) { - return parsers.get(parserMapName); + var parserName = c.name + "_" + haxe.crypto.Md5.encode(base.toString()); + var parser_cls = { name: parserName, pack: [], params: null, sub: null }; + + if (parsers.exists(parserName)) { + var resolved = isAlive(TPath(parser_cls), Context.currentPos()); + if (resolved != null) { + return resolved; + } } var defaultValueExpr:Expr = switch (type) { @@ -955,7 +962,6 @@ class DataBuilder { default: macro {}; } - var parserName = c.name + "_" + (counter++); var parent = {name:"BaseParser", pack:["json2object", "reader"], params:[TPType(base.toComplexType())]}; var parser = macro class $parserName extends $parent { public function new(?errors:Array=null, ?putils:json2object.PositionUtils=null, ?errorType:json2object.Error.ErrorType=json2object.Error.ErrorType.NONE) { @@ -991,7 +997,6 @@ class DataBuilder { }); } - var parser_cls = { name: parserName, pack: [], params: null, sub: null }; var getAutoExpr = macro return new $parser_cls([], putils, NONE).loadJson({value:JNull, pos:{file:"",min:0, max:1}}); var getAuto:Field = { doc: null, @@ -1080,9 +1085,9 @@ class DataBuilder { haxe.macro.Context.defineType(parser); - var constructedType = haxe.macro.Context.getType(parserName); - parsers.set(parserMapName, constructedType); - return constructedType; + parsers.set(parserName, true); + + return haxe.macro.Context.resolveType(TPath(parser_cls), Context.currentPos()); } From 11ff6339ed7cb20dabc874558a04fbe43f37fd05 Mon Sep 17 00:00:00 2001 From: Aidan Lee Date: Tue, 20 Aug 2024 15:08:03 +0100 Subject: [PATCH 2/5] Updated writers --- src/json2object/TypeUtils.hx | 4 ++++ src/json2object/reader/DataBuilder.hx | 6 +----- src/json2object/utils/schema/DataBuilder.hx | 21 +++++++++++++++----- src/json2object/writer/DataBuilder.hx | 22 +++++++++++---------- 4 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/json2object/TypeUtils.hx b/src/json2object/TypeUtils.hx index 5be4cd3..5e88ed5 100644 --- a/src/json2object/TypeUtils.hx +++ b/src/json2object/TypeUtils.hx @@ -118,5 +118,9 @@ class TypeUtils return t; } + + public static function isAlive(ct:ComplexType, pos:Position):Type { + return try Context.resolveType(ct, pos) catch(e) null; + } } #end diff --git a/src/json2object/reader/DataBuilder.hx b/src/json2object/reader/DataBuilder.hx index 93eb139..f23433c 100644 --- a/src/json2object/reader/DataBuilder.hx +++ b/src/json2object/reader/DataBuilder.hx @@ -44,10 +44,6 @@ class DataBuilder { private static var callPosition:Null = null; private static var jcustom = ":jcustomparse"; - static function isAlive(ct:ComplexType, pos:Position):Type { - return try Context.resolveType(ct, pos) catch(e) null; - } - private static function notNull(type:Type):Type { return switch (type) { case TAbstract(_.get()=>t, p): @@ -942,7 +938,7 @@ class DataBuilder { var parser_cls = { name: parserName, pack: [], params: null, sub: null }; if (parsers.exists(parserName)) { - var resolved = isAlive(TPath(parser_cls), Context.currentPos()); + var resolved = TypeUtils.isAlive(TPath(parser_cls), Context.currentPos()); if (resolved != null) { return resolved; } diff --git a/src/json2object/utils/schema/DataBuilder.hx b/src/json2object/utils/schema/DataBuilder.hx index f7b1541..790cd23 100644 --- a/src/json2object/utils/schema/DataBuilder.hx +++ b/src/json2object/utils/schema/DataBuilder.hx @@ -46,8 +46,8 @@ class DataBuilder { static var FLOAT = Context.getType("Float"); static var STRING = Context.getType("String"); - static var counter:Int = 0; - private static var writers = new Map(); + @:persistent + private static var writers = new Map(); private inline static function describe (type:JsonType, descr:Null) { return (descr == null) ? type : JTWithDescr(type, descr); @@ -413,7 +413,17 @@ class DataBuilder { } static function makeSchemaWriter(c:BaseType, type:Type, parsingType:ParsingType) { - var swriterName = c.name + "_" + (counter++); + trace(Std.string(parsingType)); + + var swriterName = c.name + "_" + haxe.crypto.Md5.encode(type.toString() + Std.string(parsingType)); + var swriter_cls = { name: swriterName, pack: [], params: null, sub: null }; + + if (writers.exists(swriterName)) { + var resolved = TypeUtils.isAlive(TPath(swriter_cls), Context.currentPos()); + if (resolved != null) { + return resolved; + } + } var definitions = new Definitions(); var obj = format(makeSchema(type, definitions), definitions, parsingType); @@ -436,8 +446,9 @@ class DataBuilder { } haxe.macro.Context.defineType(schemaWriter); - var constructedType = haxe.macro.Context.getType(swriterName); - return haxe.macro.Context.getType(swriterName); + writers.set(swriterName, true); + + return Context.resolveType(TPath(swriter_cls), Context.currentPos()); } public static function build() { diff --git a/src/json2object/writer/DataBuilder.hx b/src/json2object/writer/DataBuilder.hx index 4016a79..1d7f602 100644 --- a/src/json2object/writer/DataBuilder.hx +++ b/src/json2object/writer/DataBuilder.hx @@ -36,8 +36,7 @@ using json2object.utils.TypeTools; class DataBuilder { @:persistent - private static var counter = 0; - private static var writers = new Map(); + private static var writers = new Map(); private static var jcustom = ":jcustomwrite"; private static function notNull (type:Type) : Type { @@ -383,12 +382,16 @@ class DataBuilder { public static function makeWriter (c:BaseType, type:Type, base:Type) { if (base == null) { base = type; } - var writerMapName = base.toString(); - if (writers.exists(writerMapName)) { - return writers.get(writerMapName); - } + var writerName = c.name + "_" + haxe.crypto.Md5.encode(base.toString()); + var writer_cls = { name: writerName, pack: [], params: null, sub: null }; - var writerName = c.name + "_" + (counter++); + if (writers.exists(writerName)) { + var resolved = TypeUtils.isAlive(TPath(writer_cls), Context.currentPos()); + if (resolved != null) { + return resolved; + } + } + var writerClass = macro class $writerName { public var ignoreNullOptionals : Bool; private var shouldQuote : Bool = true; @@ -514,10 +517,9 @@ class DataBuilder { haxe.macro.Context.defineType(writerClass); - var constructedType = haxe.macro.Context.getType(writerName); - writers.set(writerMapName, constructedType); - return constructedType; + writers.set(writerName, true); + return Context.resolveType(TPath(writer_cls), Context.currentPos()); } public static function build() { From f8a033948d2ea8fbd3ef044619a52f436349d9d4 Mon Sep 17 00:00:00 2001 From: Aidan Lee Date: Tue, 20 Aug 2024 15:20:33 +0100 Subject: [PATCH 3/5] Remove debug trace --- src/json2object/utils/schema/DataBuilder.hx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/json2object/utils/schema/DataBuilder.hx b/src/json2object/utils/schema/DataBuilder.hx index 790cd23..a9093fc 100644 --- a/src/json2object/utils/schema/DataBuilder.hx +++ b/src/json2object/utils/schema/DataBuilder.hx @@ -413,8 +413,6 @@ class DataBuilder { } static function makeSchemaWriter(c:BaseType, type:Type, parsingType:ParsingType) { - trace(Std.string(parsingType)); - var swriterName = c.name + "_" + haxe.crypto.Md5.encode(type.toString() + Std.string(parsingType)); var swriter_cls = { name: swriterName, pack: [], params: null, sub: null }; From 8fd5438c9904039499547d07d69884b1ebee7aac Mon Sep 17 00:00:00 2001 From: Aidan Lee Date: Tue, 20 Aug 2024 15:20:46 +0100 Subject: [PATCH 4/5] Lazy cache std types --- src/json2object/utils/schema/DataBuilder.hx | 40 +++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/json2object/utils/schema/DataBuilder.hx b/src/json2object/utils/schema/DataBuilder.hx index a9093fc..43ce8cc 100644 --- a/src/json2object/utils/schema/DataBuilder.hx +++ b/src/json2object/utils/schema/DataBuilder.hx @@ -42,9 +42,43 @@ typedef Definitions = Map; class DataBuilder { - static var BOOL = Context.getType("Bool"); - static var FLOAT = Context.getType("Float"); - static var STRING = Context.getType("String"); + @:persistent + static var cachedBool:Type = null; + @:persistent + static var cachedFloat:Type = null; + @:persistent + static var cachedString:Type = null; + + static var BOOL(get, never):Type; + static var FLOAT(get, never):Type; + static var STRING(get, never):Type; + + static function get_BOOL() { + return switch cachedBool { + case null: + cachedBool = Context.getType("Bool"); + case cached: + cached; + } + } + + static function get_FLOAT() { + return switch cachedFloat { + case null: + cachedFloat = Context.getType("Float"); + case cached: + cached; + } + } + + static function get_STRING() { + return switch cachedString { + case null: + cachedString = Context.getType("String"); + case cached: + cached; + } + } @:persistent private static var writers = new Map(); From 8d949c12a93bdae010603af955a453458603cd47 Mon Sep 17 00:00:00 2001 From: Aidan Lee Date: Wed, 21 Aug 2024 10:10:21 +0100 Subject: [PATCH 5/5] Don't persist cached basic types --- src/json2object/utils/schema/DataBuilder.hx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/json2object/utils/schema/DataBuilder.hx b/src/json2object/utils/schema/DataBuilder.hx index 43ce8cc..47c990a 100644 --- a/src/json2object/utils/schema/DataBuilder.hx +++ b/src/json2object/utils/schema/DataBuilder.hx @@ -42,11 +42,8 @@ typedef Definitions = Map; class DataBuilder { - @:persistent static var cachedBool:Type = null; - @:persistent static var cachedFloat:Type = null; - @:persistent static var cachedString:Type = null; static var BOOL(get, never):Type;