Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -494,19 +494,19 @@ public ImmutableValue unpackValue()
return ValueFactory.newFloat(unpackDouble());
case STRING: {
int length = unpackRawStringHeader();
return ValueFactory.newString(readPayload(length));
return ValueFactory.newString(readPayload(length), true);
}
case BINARY: {
int length = unpackBinaryHeader();
return ValueFactory.newBinary(readPayload(length));
return ValueFactory.newBinary(readPayload(length), true);
}
case ARRAY: {
int size = unpackArrayHeader();
Value[] array = new Value[size];
for (int i = 0; i < size; i++) {
array[i] = unpackValue();
}
return ValueFactory.newArray(array);
return ValueFactory.newArray(array, true);
}
case MAP: {
int size = unpackMapHeader();
Expand All @@ -517,7 +517,7 @@ public ImmutableValue unpackValue()
kvs[i] = unpackValue();
i++;
}
return ValueFactory.newMap(kvs);
return ValueFactory.newMap(kvs, true);
}
case EXTENSION: {
ExtensionTypeHeader extHeader = unpackExtensionTypeHeader();
Expand Down
84 changes: 77 additions & 7 deletions msgpack-core/src/main/java/org/msgpack/value/ValueFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,32 @@ public static ImmutableFloatValue newFloat(double v)

public static ImmutableBinaryValue newBinary(byte[] b)
{
return new ImmutableBinaryValueImpl(b);
return newBinary(b, false);
}

public static ImmutableBinaryValue newBinary(byte[] b, boolean omitCopy)
{
if (omitCopy) {
return new ImmutableBinaryValueImpl(b);
}
else {
return new ImmutableBinaryValueImpl(Arrays.copyOf(b, b.length));
}
}

public static ImmutableBinaryValue newBinary(byte[] b, int off, int len)
{
return new ImmutableBinaryValueImpl(Arrays.copyOfRange(b, off, len));
return newBinary(b, off, len, false);
}

public static ImmutableBinaryValue newBinary(byte[] b, int off, int len, boolean omitCopy)
{
if (omitCopy && off == 0 && len == b.length) {
return new ImmutableBinaryValueImpl(b);
}
else {
return new ImmutableBinaryValueImpl(Arrays.copyOfRange(b, off, len));
}
}

public static ImmutableStringValue newString(String s)
Expand All @@ -105,9 +125,29 @@ public static ImmutableStringValue newString(byte[] b)
return new ImmutableStringValueImpl(b);
}

public static ImmutableStringValue newString(byte[] b, boolean omitCopy)
{
if (omitCopy) {
return new ImmutableStringValueImpl(b);
}
else {
return new ImmutableStringValueImpl(Arrays.copyOf(b, b.length));
}
}

public static ImmutableStringValue newString(byte[] b, int off, int len)
{
return new ImmutableStringValueImpl(Arrays.copyOfRange(b, off, len));
return newString(b, off, len, false);
}

public static ImmutableStringValue newString(byte[] b, int off, int len, boolean omitCopy)
{
if (omitCopy && off == 0 && len == b.length) {
return new ImmutableStringValueImpl(b);
}
else {
return new ImmutableStringValueImpl(Arrays.copyOfRange(b, off, len));
}
}

public static ImmutableArrayValue newArray(List<? extends Value> list)
Expand All @@ -124,7 +164,22 @@ public static ImmutableArrayValue newArray(Value... array)
if (array.length == 0) {
return ImmutableArrayValueImpl.empty();
}
return new ImmutableArrayValueImpl(Arrays.copyOf(array, array.length));
else {
return new ImmutableArrayValueImpl(Arrays.copyOf(array, array.length));
}
}

public static ImmutableArrayValue newArray(Value[] array, boolean omitCopy)
{
if (array.length == 0) {
return ImmutableArrayValueImpl.empty();
}
else if (omitCopy) {
return new ImmutableArrayValueImpl(array);
}
else {
return new ImmutableArrayValueImpl(Arrays.copyOf(array, array.length));
}
}

public static ImmutableArrayValue emptyArray()
Expand All @@ -145,15 +200,30 @@ ImmutableMapValue newMap(Map<K, V> map)
kvs[index] = pair.getValue();
index++;
}
return newMap(kvs);
return new ImmutableMapValueImpl(kvs);
}

public static ImmutableMapValue newMap(Value[] kvs)
public static ImmutableMapValue newMap(Value... kvs)
{
if (kvs.length == 0) {
return ImmutableMapValueImpl.empty();
}
return new ImmutableMapValueImpl(Arrays.copyOf(kvs, kvs.length));
else {
return new ImmutableMapValueImpl(Arrays.copyOf(kvs, kvs.length));
}
}

public static ImmutableMapValue newMap(Value[] kvs, boolean omitCopy)
{
if (kvs.length == 0) {
return ImmutableMapValueImpl.empty();
}
else if (omitCopy) {
return new ImmutableMapValueImpl(kvs);
}
else {
return new ImmutableMapValueImpl(Arrays.copyOf(kvs, kvs.length));
}
}

public static ImmutableMapValue emptyMap()
Expand Down