@@ -2,7 +2,6 @@ package org.jetbrains.kotlinx.jupyter.api
2
2
3
3
import java.lang.reflect.Field
4
4
import kotlin.reflect.KProperty
5
- import kotlin.reflect.KProperty1
6
5
import kotlin.reflect.jvm.isAccessible
7
6
8
7
interface VariableState {
@@ -34,20 +33,21 @@ data class VariableStateImpl(
34
33
try {
35
34
value.toString()
36
35
} catch (e: Throwable ) {
36
+ if (e is StackOverflowError ) {
37
+ isRecursive = true
38
+ }
37
39
" ${value::class .simpleName} : [exception thrown: $e ]"
38
40
}
39
41
}
40
42
}
41
43
override var isRecursive: Boolean = false
42
- private var isLargeForString: Boolean = false
43
44
44
- private val valCache = VariableStateCache <Result <Any ?>> (
45
- {
46
- oldValue, newValue ->
45
+ private val valCache = VariableStateCache <Result <Any ?>>(
46
+ { oldValue, newValue ->
47
47
oldValue.getOrNull() != = newValue.getOrNull()
48
48
},
49
49
{
50
- property.asAccessible { prop ->
50
+ property.asAccessible(scriptInstance) { prop ->
51
51
try {
52
52
Result .success(prop.get(scriptInstance))
53
53
} catch (ex: Throwable ) {
@@ -63,75 +63,49 @@ data class VariableStateImpl(
63
63
}
64
64
}
65
65
66
- override val stringValue: String? get() = stringCache.get ()
66
+ override val stringValue: String? get() = stringCache.getOrNull ()
67
67
68
68
override val value: Result <Any ?> get() = valCache.get()
69
69
70
70
companion object {
71
- private fun <T : KProperty < * >, R > T .asAccessible (action : (T ) -> R ): R {
72
- val wasAccessible = isAccessible
71
+ private fun <R > Field .asAccessible (instance : Any , action : (Field ) -> R ): R {
72
+ val wasAccessible = this .canAccess(instance)
73
73
isAccessible = true
74
74
val res = action(this )
75
75
isAccessible = wasAccessible
76
76
return res
77
77
}
78
78
}
79
- private val customDelegate = DependentLazyDelegate {
80
- fun getRecursiveObjectName (): String {
81
- val kClassName = cachedValue.getOrNull()!! ::class .simpleName
82
- return " $kClassName : recursive structure"
83
- }
84
- if (cachedValue.getOrNull() == null ) {
85
- return @DependentLazyDelegate null
86
- }
87
- handleIfRecursiveStructure()
88
- try {
89
- cachedValue.getOrNull().toString()
90
- isRecursive = false
91
- isLargeForString = false
92
- } catch (e: VirtualMachineError ) {
93
- when (e) {
94
- is StackOverflowError -> {
95
- isRecursive = true
96
- }
97
- is OutOfMemoryError -> {
98
- isLargeForString = true
99
- }
100
- else -> {
101
- return @DependentLazyDelegate null
102
- }
103
- }
104
- }
105
- }
106
79
107
- private class VariableStateCache <T >(
108
- val equalityChecker : (T , T ) -> Boolean = { x, y -> x == y },
109
- val calculate : (T ? ) -> T
110
- ) {
111
- private var cachedVal: T ? = null
112
- private var shouldRenew: Boolean = true
80
+ private class VariableStateCache <T >(
81
+ val equalityChecker : (T , T ) -> Boolean = { x, y -> x == y },
82
+ val calculate : (T ? ) -> T
83
+ ) {
84
+ private var cachedVal: T ? = null
85
+ private var shouldRenew: Boolean = true
113
86
114
- fun getOrNull (): T ? {
115
- return if (shouldRenew) {
116
- calculate(cachedVal).also {
117
- cachedVal = it
118
- shouldRenew = false
87
+ fun getOrNull (): T ? {
88
+ return if (shouldRenew) {
89
+ calculate(cachedVal).also {
90
+ cachedVal = it
91
+ shouldRenew = false
92
+ }
93
+ } else {
94
+ cachedVal
119
95
}
120
- } else {
121
- cachedVal
122
96
}
123
- }
124
97
125
- fun get (): T = getOrNull()!!
98
+ fun get (): T = getOrNull()!!
126
99
127
- fun update () {
128
- shouldRenew = true
129
- }
100
+ fun update () {
101
+ shouldRenew = true
102
+ }
130
103
131
- fun forceUpdate (): Boolean {
132
- val oldVal = getOrNull()
133
- update()
134
- val newVal = get()
135
- return oldVal != null && equalityChecker(oldVal, newVal)
104
+ fun forceUpdate (): Boolean {
105
+ val oldVal = getOrNull()
106
+ update()
107
+ val newVal = get()
108
+ return oldVal != null && equalityChecker(oldVal, newVal)
109
+ }
136
110
}
137
111
}
0 commit comments