@@ -63,6 +63,8 @@ data class RuntimeObjectWrapper(
63
63
val objectInstance : Any? ,
64
64
val isRecursive : Boolean = false
65
65
) {
66
+ val computerID: String = Integer .toHexString(hashCode())
67
+
66
68
override fun equals (other : Any? ): Boolean {
67
69
if (other == null ) return objectInstance == null
68
70
if (objectInstance == null ) return false
@@ -71,13 +73,12 @@ data class RuntimeObjectWrapper(
71
73
}
72
74
73
75
override fun hashCode (): Int {
74
- return if (isRecursive) Random .hashCode () else objectInstance?.hashCode() ? : 0
76
+ return if (isRecursive) Random .nextInt () else objectInstance?.hashCode() ? : 0
75
77
}
76
78
}
77
79
78
80
fun Any?.toObjectWrapper (isRecursive : Boolean = false): RuntimeObjectWrapper = RuntimeObjectWrapper (this , isRecursive)
79
81
80
-
81
82
fun Any?.getToStringValue (isRecursive : Boolean = false): String {
82
83
return if (isRecursive) {
83
84
" ${this !! ::class .simpleName} : recursive structure"
@@ -90,6 +91,24 @@ fun Any?.getToStringValue(isRecursive: Boolean = false): String {
90
91
}
91
92
}
92
93
94
+ fun Any?.getUniqueID (isRecursive : Boolean = false): String {
95
+ return if (this != null ) {
96
+ val hashCode = if (isRecursive) {
97
+ Random .nextLong()
98
+ } else {
99
+ // ignore standard numerics
100
+ if (this !is Number && this ::class .simpleName != " int" ) {
101
+ this .hashCode()
102
+ } else {
103
+ Random .nextLong()
104
+ }
105
+ }
106
+ Integer .toHexString(hashCode.toInt())
107
+ } else {
108
+ " "
109
+ }
110
+ }
111
+
93
112
/* *
94
113
* Provides contract for using threshold-based removal heuristic.
95
114
* Every serialization-related info in [T] would be removed once [isShouldRemove] == true.
@@ -162,7 +181,13 @@ class VariablesSerializer(
162
181
null
163
182
}
164
183
} catch (ex: Exception ) { null }
165
- val serializedVersion = SerializedVariablesState (simpleTypeName, getProperString(value), true )
184
+ val stringedValue = getProperString(value)
185
+ val varID = if (value !is String ) {
186
+ value.getUniqueID(stringedValue.contains(" : recursive structure" ))
187
+ } else {
188
+ " "
189
+ }
190
+ val serializedVersion = SerializedVariablesState (simpleTypeName, stringedValue, true , varID)
166
191
val descriptors = serializedVersion.fieldDescriptor
167
192
168
193
// only for set case
@@ -180,6 +205,9 @@ class VariablesSerializer(
180
205
if (isDescriptorsNeeded) {
181
206
kProperties?.forEach { prop ->
182
207
val name = prop.name
208
+ if (name == " null" ) {
209
+ return @forEach
210
+ }
183
211
val propValue = value?.let {
184
212
try {
185
213
prop as KProperty1 <Any , * >
@@ -188,7 +216,13 @@ class VariablesSerializer(
188
216
if (prop.name == " size" ) {
189
217
if (isArray(value)) {
190
218
value as Array <* >
191
- value.size
219
+ // there might be size 10, but only one actual recursive value
220
+ val runTimeSize = value.size
221
+ if (runTimeSize > 5 && value[0 ] is List <* > && value[1 ] == null && value [2 ] == null ) {
222
+ 1
223
+ } else {
224
+ runTimeSize
225
+ }
192
226
} else {
193
227
value as Collection <* >
194
228
value.size
@@ -405,17 +439,19 @@ class VariablesSerializer(
405
439
if (! isSerializationActive || variableState == null || name == null ) return SerializedVariablesState ()
406
440
// force recursive check
407
441
variableState.stringValue
408
- return serializeVariableState(cellId, name, variableState.property, variableState.value.getOrNull(), variableState.isRecursive, isOverride)
442
+ return serializeVariableState(cellId, name, variableState.property, variableState.value.getOrNull(), variableState.isRecursive, isOverride)
409
443
}
410
444
411
445
private fun serializeVariableState (cellId : Int , name : String , property : Field ? , value : Any? , isRecursive : Boolean , isOverride : Boolean = true): SerializedVariablesState {
412
- val processedData = createSerializeVariableState(name, getSimpleTypeNameFrom(property, value), value)
413
- return doActualSerialization(cellId, processedData, value.toObjectWrapper(isRecursive), isRecursive, isOverride)
446
+ val wrapper = value.toObjectWrapper(isRecursive)
447
+ val processedData = createSerializeVariableState(name, getSimpleTypeNameFrom(property, value), wrapper)
448
+ return doActualSerialization(cellId, processedData, wrapper, isRecursive, isOverride)
414
449
}
415
450
416
451
private fun serializeVariableState (cellId : Int , name : String , property : KProperty <* >, value : Any? , isRecursive : Boolean , isOverride : Boolean = true): SerializedVariablesState {
417
- val processedData = createSerializeVariableState(name, getSimpleTypeNameFrom(property, value), value)
418
- return doActualSerialization(cellId, processedData, value.toObjectWrapper(isRecursive), isRecursive, isOverride)
452
+ val wrapper = value.toObjectWrapper(isRecursive)
453
+ val processedData = createSerializeVariableState(name, getSimpleTypeNameFrom(property, value), wrapper)
454
+ return doActualSerialization(cellId, processedData, wrapper, isRecursive, isOverride)
419
455
}
420
456
421
457
private fun doActualSerialization (cellId : Int , processedData : ProcessedSerializedVarsState , value : RuntimeObjectWrapper , isRecursive : Boolean , isOverride : Boolean = true): SerializedVariablesState {
@@ -447,7 +483,7 @@ class VariablesSerializer(
447
483
val type = processedData.propertiesType
448
484
if (type == PropertiesType .KOTLIN ) {
449
485
val kProperties = currentCellDescriptors.processedSerializedVarsToKTProperties[serializedVersion]
450
- if (kProperties?.size == 1 && kProperties.first().name == " size" ) {
486
+ if (kProperties?.size == 1 && kProperties.first().name == " size" ) {
451
487
serializedVersion.fieldDescriptor.addDescriptor(value.objectInstance, " data" )
452
488
}
453
489
iterateThroughContainerMembers(cellId, value.objectInstance, serializedVersion.fieldDescriptor, isRecursive = isRecursive, kProperties = currentCellDescriptors.processedSerializedVarsToKTProperties[serializedVersion])
@@ -626,7 +662,6 @@ class VariablesSerializer(
626
662
// descriptor.putAll(descriptorsState?.fieldDescriptor ?: emptyMap())
627
663
// }
628
664
629
-
630
665
if (seenObjectsPerCell?.containsKey(value) == false ) {
631
666
if (descriptor[name] != null ) {
632
667
seenObjectsPerCell[value] = descriptor[name]!!
@@ -642,7 +677,7 @@ class VariablesSerializer(
642
677
if (value != null ) {
643
678
value::class .simpleName
644
679
} else {
645
- value?.getToStringValue()
680
+ value?.getToStringValue()
646
681
}
647
682
}
648
683
}
@@ -666,10 +701,10 @@ class VariablesSerializer(
666
701
}
667
702
668
703
private fun createSerializeVariableState (name : String , simpleTypeName : String? , value : RuntimeObjectWrapper ): ProcessedSerializedVarsState {
669
- return doCreateSerializedVarsState(simpleTypeName, value.objectInstance)
704
+ return doCreateSerializedVarsState(simpleTypeName, value.objectInstance, value.computerID )
670
705
}
671
706
672
- private fun doCreateSerializedVarsState (simpleTypeName : String? , value : Any? ): ProcessedSerializedVarsState {
707
+ private fun doCreateSerializedVarsState (simpleTypeName : String? , value : Any? , uniqueID : String? = null ): ProcessedSerializedVarsState {
673
708
val javaClass = value?.javaClass
674
709
val membersProperties = javaClass?.declaredFields?.filter {
675
710
! (it.name.startsWith(" script$" ) || it.name.startsWith(" serialVersionUID" ))
@@ -687,8 +722,15 @@ class VariablesSerializer(
687
722
if (value != null && standardContainersUtilizer.isStandardType(type)) {
688
723
return standardContainersUtilizer.serializeContainer(type, value)
689
724
}
725
+ val stringedValue = getProperString(value)
726
+ val finalID = uniqueID
727
+ ? : if (value !is String ) {
728
+ value.getUniqueID(stringedValue.contains(" : recursive structure" ))
729
+ } else {
730
+ " "
731
+ }
690
732
691
- val serializedVariablesState = SerializedVariablesState (type, getProperString(value), isContainer)
733
+ val serializedVariablesState = SerializedVariablesState (type, getProperString(value), isContainer, ID = finalID )
692
734
693
735
return ProcessedSerializedVarsState (serializedVariablesState, membersProperties?.toTypedArray())
694
736
}
0 commit comments