From 6541ec39e56c9c53fbabd5798ab885a9c0a8c70a Mon Sep 17 00:00:00 2001 From: Jon Parise Date: Fri, 23 Aug 2019 15:22:16 -0700 Subject: [PATCH] Only allocate _bits when necessary We were previously allocating the _bits array as part of its declaration. In many cases, we wouldn't use this memory; we would just reassign _bits in the non-default constructors and builders. Instead, we now only allocate _bits in the default Builder constructor. We also now generate a default public model constructor when package- private setters are enabled so that there's some backing storage to support those set methods. (Note that we don't currently appear to actually update _bits in those methods, which may be a separate issue.) Lastly, we no longer need to read the "_bits" array in TypeAdapter#read, so remove that case entirely. --- Examples/Java/Sources/Board.java | 19 ++------ Examples/Java/Sources/Everything.java | 19 ++------ Examples/Java/Sources/Image.java | 19 ++------ Examples/Java/Sources/Model.java | 19 ++------ Examples/Java/Sources/Pin.java | 19 ++------ Examples/Java/Sources/User.java | 19 ++------ .../Java/Sources/VariableSubtitution.java | 19 ++------ Sources/Core/JavaModelRenderer.swift | 43 ++++++++----------- 8 files changed, 38 insertions(+), 138 deletions(-) diff --git a/Examples/Java/Sources/Board.java b/Examples/Java/Sources/Board.java index b9dfb6cf..7eb12857 100644 --- a/Examples/Java/Sources/Board.java +++ b/Examples/Java/Sources/Board.java @@ -50,7 +50,7 @@ public class Board { static final private int NAME_INDEX = 8; static final private int URL_INDEX = 9; - private boolean[] _bits = new boolean[10]; + private boolean[] _bits; private Board( @Nullable String uid, @@ -223,9 +223,10 @@ public static class Builder { private @Nullable String name; private @Nullable String url; - private boolean[] _bits = new boolean[10]; + private boolean[] _bits; private Builder() { + this._bits = new boolean[10]; } private Builder(@NonNull Board model) { @@ -557,7 +558,6 @@ public Board read(@NonNull JsonReader reader) throws IOException { return null; } Builder builder = Board.builder(); - boolean[] bits = null; reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); @@ -622,24 +622,11 @@ public Board read(@NonNull JsonReader reader) throws IOException { } builder.setUrl(this.stringTypeAdapter.read(reader)); break; - case ("_bits"): - bits = new boolean[10]; - int i = 0; - reader.beginArray(); - while (reader.hasNext() && i < 10) { - bits[i] = reader.nextBoolean(); - i++; - } - reader.endArray(); - break; default: reader.skipValue(); } } reader.endObject(); - if (bits != null) { - builder._bits = bits; - } return builder.build(); } } diff --git a/Examples/Java/Sources/Everything.java b/Examples/Java/Sources/Everything.java index fddaef1d..41a8f074 100644 --- a/Examples/Java/Sources/Everything.java +++ b/Examples/Java/Sources/Everything.java @@ -222,7 +222,7 @@ public int getValue() { static final private int UNSIGNED_SHORT_ENUM_INDEX = 34; static final private int URI_PROP_INDEX = 35; - private boolean[] _bits = new boolean[36]; + private boolean[] _bits; private Everything( @Nullable List arrayProp, @@ -736,9 +736,10 @@ public static class Builder { private @Nullable EverythingUnsignedShortEnum unsignedShortEnum; private @Nullable String uriProp; - private boolean[] _bits = new boolean[36]; + private boolean[] _bits; private Builder() { + this._bits = new boolean[36]; } private Builder(@NonNull Everything model) { @@ -1799,7 +1800,6 @@ public Everything read(@NonNull JsonReader reader) throws IOException { return null; } Builder builder = Everything.builder(); - boolean[] bits = null; reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); @@ -2020,24 +2020,11 @@ public Everything read(@NonNull JsonReader reader) throws IOException { } builder.setUriProp(this.stringTypeAdapter.read(reader)); break; - case ("_bits"): - bits = new boolean[36]; - int i = 0; - reader.beginArray(); - while (reader.hasNext() && i < 36) { - bits[i] = reader.nextBoolean(); - i++; - } - reader.endArray(); - break; default: reader.skipValue(); } } reader.endObject(); - if (bits != null) { - builder._bits = bits; - } return builder.build(); } } diff --git a/Examples/Java/Sources/Image.java b/Examples/Java/Sources/Image.java index d8c691cf..ff3de848 100644 --- a/Examples/Java/Sources/Image.java +++ b/Examples/Java/Sources/Image.java @@ -33,7 +33,7 @@ public class Image { static final private int URL_INDEX = 1; static final private int WIDTH_INDEX = 2; - private boolean[] _bits = new boolean[3]; + private boolean[] _bits; private Image( @Nullable Integer height, @@ -117,9 +117,10 @@ public static class Builder { private @Nullable String url; private @Nullable Integer width; - private boolean[] _bits = new boolean[3]; + private boolean[] _bits; private Builder() { + this._bits = new boolean[3]; } private Builder(@NonNull Image model) { @@ -258,7 +259,6 @@ public Image read(@NonNull JsonReader reader) throws IOException { return null; } Builder builder = Image.builder(); - boolean[] bits = null; reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); @@ -281,24 +281,11 @@ public Image read(@NonNull JsonReader reader) throws IOException { } builder.setWidth(this.integerTypeAdapter.read(reader)); break; - case ("_bits"): - bits = new boolean[3]; - int i = 0; - reader.beginArray(); - while (reader.hasNext() && i < 3) { - bits[i] = reader.nextBoolean(); - i++; - } - reader.endArray(); - break; default: reader.skipValue(); } } reader.endObject(); - if (bits != null) { - builder._bits = bits; - } return builder.build(); } } diff --git a/Examples/Java/Sources/Model.java b/Examples/Java/Sources/Model.java index a25034b3..63569ff0 100644 --- a/Examples/Java/Sources/Model.java +++ b/Examples/Java/Sources/Model.java @@ -29,7 +29,7 @@ public class Model { static final private int ID_INDEX = 0; - private boolean[] _bits = new boolean[1]; + private boolean[] _bits; private Model( @Nullable String uid, @@ -85,9 +85,10 @@ public static class Builder { private @Nullable String uid; - private boolean[] _bits = new boolean[1]; + private boolean[] _bits; private Builder() { + this._bits = new boolean[1]; } private Builder(@NonNull Model model) { @@ -171,7 +172,6 @@ public Model read(@NonNull JsonReader reader) throws IOException { return null; } Builder builder = Model.builder(); - boolean[] bits = null; reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); @@ -182,24 +182,11 @@ public Model read(@NonNull JsonReader reader) throws IOException { } builder.setUid(this.stringTypeAdapter.read(reader)); break; - case ("_bits"): - bits = new boolean[1]; - int i = 0; - reader.beginArray(); - while (reader.hasNext() && i < 1) { - bits[i] = reader.nextBoolean(); - i++; - } - reader.endArray(); - break; default: reader.skipValue(); } } reader.endObject(); - if (bits != null) { - builder._bits = bits; - } return builder.build(); } } diff --git a/Examples/Java/Sources/Pin.java b/Examples/Java/Sources/Pin.java index 5f773c4e..1818381b 100644 --- a/Examples/Java/Sources/Pin.java +++ b/Examples/Java/Sources/Pin.java @@ -82,7 +82,7 @@ public int getValue() { static final private int URL_INDEX = 15; static final private int VISUAL_SEARCH_ATTRS_INDEX = 16; - private boolean[] _bits = new boolean[17]; + private boolean[] _bits; private Pin( @Nullable Map attribution, @@ -346,9 +346,10 @@ public static class Builder { private @Nullable String url; private @Nullable Map visualSearchAttrs; - private boolean[] _bits = new boolean[17]; + private boolean[] _bits; private Builder() { + this._bits = new boolean[17]; } private Builder(@NonNull Pin model) { @@ -874,7 +875,6 @@ public Pin read(@NonNull JsonReader reader) throws IOException { return null; } Builder builder = Pin.builder(); - boolean[] bits = null; reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); @@ -981,24 +981,11 @@ public Pin read(@NonNull JsonReader reader) throws IOException { } builder.setVisualSearchAttrs(this.map_String__Object_TypeAdapter.read(reader)); break; - case ("_bits"): - bits = new boolean[17]; - int i = 0; - reader.beginArray(); - while (reader.hasNext() && i < 17) { - bits[i] = reader.nextBoolean(); - i++; - } - reader.endArray(); - break; default: reader.skipValue(); } } reader.endObject(); - if (bits != null) { - builder._bits = bits; - } return builder.build(); } } diff --git a/Examples/Java/Sources/User.java b/Examples/Java/Sources/User.java index c8c04f22..cd830dcc 100644 --- a/Examples/Java/Sources/User.java +++ b/Examples/Java/Sources/User.java @@ -53,7 +53,7 @@ public enum UserEmailFrequency { static final private int TYPE_INDEX = 8; static final private int USERNAME_INDEX = 9; - private boolean[] _bits = new boolean[10]; + private boolean[] _bits; private User( @Nullable String bio, @@ -226,9 +226,10 @@ public static class Builder { private @Nullable String type; private @Nullable String username; - private boolean[] _bits = new boolean[10]; + private boolean[] _bits; private Builder() { + this._bits = new boolean[10]; } private Builder(@NonNull User model) { @@ -559,7 +560,6 @@ public User read(@NonNull JsonReader reader) throws IOException { return null; } Builder builder = User.builder(); - boolean[] bits = null; reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); @@ -624,24 +624,11 @@ public User read(@NonNull JsonReader reader) throws IOException { } builder.setUsername(this.stringTypeAdapter.read(reader)); break; - case ("_bits"): - bits = new boolean[10]; - int i = 0; - reader.beginArray(); - while (reader.hasNext() && i < 10) { - bits[i] = reader.nextBoolean(); - i++; - } - reader.endArray(); - break; default: reader.skipValue(); } } reader.endObject(); - if (bits != null) { - builder._bits = bits; - } return builder.build(); } } diff --git a/Examples/Java/Sources/VariableSubtitution.java b/Examples/Java/Sources/VariableSubtitution.java index f5cbb69b..7baa70e6 100644 --- a/Examples/Java/Sources/VariableSubtitution.java +++ b/Examples/Java/Sources/VariableSubtitution.java @@ -35,7 +35,7 @@ public class VariableSubtitution { static final private int MUTABLE_COPY_PROP_INDEX = 2; static final private int NEW_PROP_INDEX = 3; - private boolean[] _bits = new boolean[4]; + private boolean[] _bits; private VariableSubtitution( @Nullable Integer allocProp, @@ -134,9 +134,10 @@ public static class Builder { private @Nullable Integer mutableCopyProp; private @Nullable Integer newProp; - private boolean[] _bits = new boolean[4]; + private boolean[] _bits; private Builder() { + this._bits = new boolean[4]; } private Builder(@NonNull VariableSubtitution model) { @@ -301,7 +302,6 @@ public VariableSubtitution read(@NonNull JsonReader reader) throws IOException { return null; } Builder builder = VariableSubtitution.builder(); - boolean[] bits = null; reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); @@ -330,24 +330,11 @@ public VariableSubtitution read(@NonNull JsonReader reader) throws IOException { } builder.setNewProp(this.integerTypeAdapter.read(reader)); break; - case ("_bits"): - bits = new boolean[4]; - int i = 0; - reader.beginArray(); - while (reader.hasNext() && i < 4) { - bits[i] = reader.nextBoolean(); - i++; - } - reader.endArray(); - break; default: reader.skipValue(); } } reader.endObject(); - if (bits != null) { - builder._bits = bits; - } return builder.build(); } } diff --git a/Sources/Core/JavaModelRenderer.swift b/Sources/Core/JavaModelRenderer.swift index fd06ed6a..b5622c07 100644 --- a/Sources/Core/JavaModelRenderer.swift +++ b/Sources/Core/JavaModelRenderer.swift @@ -29,16 +29,26 @@ public struct JavaModelRenderer: JavaFileRenderer { // MARK: - Top-level Model - func renderModelConstructor() -> JavaIR.Method { + func renderModelConstructors() -> [JavaIR.Method] { let args = -->(transitiveProperties.map { param, schemaObj in self.typeFromSchema(param, schemaObj) + " " + Languages.java.snakeCaseToPropertyName(param) + "," } + ["boolean[] _bits"]) - return JavaIR.method(annotations: decorations.annotationsForConstructor(), [.private], className + "(\n" + args + "\n)") { + let publicConstructor = JavaIR.method(annotations: decorations.annotationsForConstructor(), [.public], className + "()") { + ["this._bits = new boolean[" + String(self.transitiveProperties.count) + "];"] + } + + let privateConstructor = JavaIR.method(annotations: decorations.annotationsForConstructor(), [.private], className + "(\n" + args + "\n)") { self.transitiveProperties.map { param, _ in "this." + Languages.java.snakeCaseToPropertyName(param) + " = " + Languages.java.snakeCaseToPropertyName(param) + ";" } + ["this._bits = _bits;"] } + + if params[.javaGeneratePackagePrivateSetters] == nil { + return [privateConstructor] + } else { + return [publicConstructor, privateConstructor] + } } func renderStaticTypeString() -> JavaIR.Property { @@ -79,7 +89,7 @@ public struct JavaModelRenderer: JavaFileRenderer { JavaIR.Property(annotations: Set([.serializedName(name: param)] + self.decorations.annotationsForPropertyVariable(param)), modifiers: [.private], type: self.typeFromSchema(param, schemaObj), name: Languages.java.snakeCaseToPropertyName(param), initialValue: "") } - let bits = JavaIR.Property(annotations: decorations.annotationsForVariable("_bits"), modifiers: [.private], type: "boolean[]", name: "_bits", initialValue: "new boolean[" + String(props.count) + "]") + let bits = JavaIR.Property(annotations: decorations.annotationsForVariable("_bits"), modifiers: [.private], type: "boolean[]", name: "_bits", initialValue: "") var bitmasks: [JavaIR.Property] = [] var index = 0 @@ -178,7 +188,7 @@ public struct JavaModelRenderer: JavaFileRenderer { // MARK: - Model.Builder func renderBuilderConstructors() -> [JavaIR.Method] { - let emptyConstructor = JavaIR.method([.private], "Builder()") { [] } + let emptyConstructor = JavaIR.method([.private], "Builder()") { ["this._bits = new boolean[" + String(self.transitiveProperties.count) + "];"] } let privateConstructor = JavaIR.method([.private], "Builder(@NonNull " + className + " model)") { self.transitiveProperties.map { param, _ in @@ -235,7 +245,7 @@ public struct JavaModelRenderer: JavaFileRenderer { JavaIR.Property(annotations: [], modifiers: [.private], type: self.typeFromSchema(param, schemaObj), name: Languages.java.snakeCaseToPropertyName(param), initialValue: "") } - let bits = JavaIR.Property(annotations: [], modifiers: [.private], type: "boolean[]", name: "_bits", initialValue: "new boolean[" + String(props.count) + "]") + let bits = JavaIR.Property(annotations: [], modifiers: [.private], type: "boolean[]", name: "_bits", initialValue: "") return [props, [bits]] } @@ -332,7 +342,6 @@ public struct JavaModelRenderer: JavaFileRenderer { "return null;", ] }, "Builder builder = \(className).builder();", - "boolean[] bits = null;", "reader.beginObject();", JavaIR.whileBlock(condition: "reader.hasNext()") { [ "String name = reader.nextName();", @@ -351,27 +360,10 @@ public struct JavaModelRenderer: JavaFileRenderer { "builder.set" + Languages.java.snakeCaseToCapitalizedPropertyName(param) + "(this." + typeAdapterVariableNameForType(unwrappedTypeFromSchema(param, schemaObj.schema)) + ".read(reader));", ] ) - } + [ - JavaIR.Case( - variableEquals: "\"_bits\"", - body: [ - "bits = new boolean[" + String(transitiveProperties.count) + "];", - "int i = 0;", - "reader.beginArray();", - JavaIR.whileBlock(condition: "reader.hasNext() && i < " + String(transitiveProperties.count)) { [ - "bits[i] = reader.nextBoolean();", - "i++;", - ] }, - "reader.endArray();", - ] - ), - ] + } }, ] }, "reader.endObject();", - JavaIR.ifBlock(condition: "bits != null") { [ - "builder._bits = bits;", - ] }, "return builder.build();", ] } @@ -507,8 +499,7 @@ public struct JavaModelRenderer: JavaFileRenderer { extends: decorations.class?.extends, implements: decorations.class?.implements, name: className, - methods: [ - self.renderModelConstructor(), + methods: renderModelConstructors() + [ self.renderModelBuilder(), self.renderModelToBuilder(), self.renderModelMergeFrom(),