@@ -195,17 +195,14 @@ case class MapEntries(child: Expression) extends UnaryExpression with ExpectsInp
195195 values : String ,
196196 arrayData : String ,
197197 numElements : String ): String = {
198- val byteArraySize = ctx.freshName(" byteArraySize" )
199- val data = ctx.freshName(" byteArray" )
200198 val unsafeRow = ctx.freshName(" unsafeRow" )
201199 val unsafeArrayData = ctx.freshName(" unsafeArrayData" )
202200 val structsOffset = ctx.freshName(" structsOffset" )
203- val calculateArraySize = " UnsafeArrayData.calculateSizeOfUnderlyingByteArray"
204201 val calculateHeader = " UnsafeArrayData.calculateHeaderPortionInBytes"
205202
206203 val baseOffset = Platform .BYTE_ARRAY_OFFSET
207- val longSize = LongType .defaultSize
208- val structSize = UnsafeRow .calculateBitSetWidthInBytes(2 ) + longSize * 2
204+ val wordSize = UnsafeRow . WORD_SIZE
205+ val structSize = UnsafeRow .calculateBitSetWidthInBytes(2 ) + wordSize * 2
209206 val structSizeAsLong = structSize + " L"
210207 val keyTypeName = CodeGenerator .primitiveTypeName(childDataType.keyType)
211208 val valueTypeName = CodeGenerator .primitiveTypeName(childDataType.keyType)
@@ -223,27 +220,26 @@ case class MapEntries(child: Expression) extends UnaryExpression with ExpectsInp
223220 valueAssignment
224221 }
225222
226- s """
227- |final long $byteArraySize = $calculateArraySize( $numElements, ${longSize + structSize});
228- |if ( $byteArraySize > ${ByteArrayMethods .MAX_ROUNDED_ARRAY_LENGTH }) {
229- | ${genCodeForAnyElements(ctx, keys, values, arrayData, numElements)}
230- |} else {
231- | final int $structsOffset = $calculateHeader( $numElements) + $numElements * $longSize;
232- | final byte[] $data = new byte[(int) $byteArraySize];
233- | UnsafeArrayData $unsafeArrayData = new UnsafeArrayData();
234- | Platform.putLong( $data, $baseOffset, $numElements);
235- | $unsafeArrayData.pointTo( $data, $baseOffset, (int) $byteArraySize);
236- | UnsafeRow $unsafeRow = new UnsafeRow(2);
237- | for (int z = 0; z < $numElements; z++) {
238- | long offset = $structsOffset + z * $structSizeAsLong;
239- | $unsafeArrayData.setLong(z, (offset << 32) + $structSizeAsLong);
240- | $unsafeRow.pointTo( $data, $baseOffset + offset, $structSize);
241- | $unsafeRow.set $keyTypeName(0, ${getKey(keys)});
242- | $valueAssignmentChecked
243- | }
244- | $arrayData = $unsafeArrayData;
245- |}
246- """ .stripMargin
223+ val assignmentLoop = (byteArray : String ) =>
224+ s """
225+ |final int $structsOffset = $calculateHeader( $numElements) + $numElements * $wordSize;
226+ |UnsafeRow $unsafeRow = new UnsafeRow(2);
227+ |for (int z = 0; z < $numElements; z++) {
228+ | long offset = $structsOffset + z * $structSizeAsLong;
229+ | $unsafeArrayData.setLong(z, (offset << 32) + $structSizeAsLong);
230+ | $unsafeRow.pointTo( $byteArray, $baseOffset + offset, $structSize);
231+ | $unsafeRow.set $keyTypeName(0, ${getKey(keys)});
232+ | $valueAssignmentChecked
233+ |}
234+ | $arrayData = $unsafeArrayData;
235+ """ .stripMargin
236+
237+ ctx.createUnsafeArrayWithFallback(
238+ unsafeArrayData,
239+ numElements,
240+ structSize + wordSize,
241+ assignmentLoop,
242+ genCodeForAnyElements(ctx, keys, values, arrayData, numElements))
247243 }
248244
249245 private def genCodeForAnyElements (
@@ -258,10 +254,10 @@ case class MapEntries(child: Expression) extends UnaryExpression with ExpectsInp
258254
259255 val isValuePrimitive = CodeGenerator .isPrimitiveType(childDataType.valueType)
260256 val getValueWithCheck = if (childDataType.valueContainsNull && isValuePrimitive) {
261- s " $values.isNullAt(z) ? null : (Object) ${getValue(values)}"
262- } else {
263- getValue(values)
264- }
257+ s " $values.isNullAt(z) ? null : (Object) ${getValue(values)}"
258+ } else {
259+ getValue(values)
260+ }
265261
266262 s """
267263 |final Object[] $data = new Object[ $numElements];
0 commit comments