@@ -1055,7 +1055,7 @@ private void attachVariables(Set<Object> seen) {
1055
1055
try {
1056
1056
vars .put (k , new Variable (o ));
1057
1057
} catch (Exception e ) {
1058
- logger .debug ("[*** attach variables ***] failed to attach graal value: {} - {}" , k , e .getMessage ());
1058
+ logger .debug ("[*** attach variables ***] ignoring non-json value: '{}' - {}" , k , e .getMessage ());
1059
1059
}
1060
1060
}
1061
1061
JS .put (k , o );
@@ -1066,7 +1066,7 @@ protected Map<String, Variable> detachVariables() {
1066
1066
Set <Object > seen = Collections .newSetFromMap (new IdentityHashMap ());
1067
1067
Map <String , Variable > detached = new HashMap (vars .size ());
1068
1068
vars .forEach ((k , v ) -> {
1069
- Object o = recurseAndDetachAndDeepClone (v .getValue (), seen );
1069
+ Object o = recurseAndDetachAndDeepClone (k , v .getValue (), seen );
1070
1070
detached .put (k , new Variable (o ));
1071
1071
});
1072
1072
return detached ;
@@ -1080,19 +1080,15 @@ protected void recurseAndAttach(String name, Object o) {
1080
1080
1081
1081
private Object recurseAndAttach (String name , Object o , Set <Object > seen ) {
1082
1082
if (o instanceof Value ) {
1083
- Value value = Value .asValue (o );
1084
1083
try {
1085
- if (value .canExecute ()) {
1086
- if (value .isMetaObject ()) { // js function
1087
- return attach (value );
1088
- } else { // java function
1089
- return value ;
1090
- }
1091
- } else { // anything else, including java-type references
1084
+ Value value = Value .asValue (o );
1085
+ if (value .canExecute () && value .isMetaObject ()) { // js function
1086
+ return attach (value );
1087
+ } else { // anything else, including java functions and java-type references
1092
1088
return value ;
1093
1089
}
1094
1090
} catch (Exception e ) {
1095
- logger .warn ("[*** attach ***] failed to attach js value: {} - {}" , name , e .getMessage ());
1091
+ logger .warn ("[*** attach ***] ignoring non-json value: '{}' - {}" , name , e .getMessage ());
1096
1092
return null ;
1097
1093
}
1098
1094
} else if (o instanceof JsFunction ) {
@@ -1130,15 +1126,15 @@ private Object recurseAndAttach(String name, Object o, Set<Object> seen) {
1130
1126
// called only by result processing of callonce / callSingle
1131
1127
protected Object recurseAndAttachAndDeepClone (Object o ) {
1132
1128
Set <Object > seen = Collections .newSetFromMap (new IdentityHashMap ());
1133
- return recurseAndAttachAndDeepClone (o , seen );
1129
+ return recurseAndAttachAndDeepClone ("" , o , seen );
1134
1130
}
1135
1131
1136
- private Object recurseAndAttachAndDeepClone (Object o , Set <Object > seen ) {
1132
+ private Object recurseAndAttachAndDeepClone (String name , Object o , Set <Object > seen ) {
1137
1133
if (o instanceof Value ) {
1138
1134
try {
1139
1135
return Value .asValue (o );
1140
1136
} catch (Exception e ) {
1141
- logger .warn ("[*** attach deep ***] failed to attach graal value: {}" , e .getMessage ());
1137
+ logger .warn ("[*** attach deep ***] ignoring non-json value: '{}' - {}" , name , e .getMessage ());
1142
1138
return null ;
1143
1139
}
1144
1140
}
@@ -1148,8 +1144,12 @@ private Object recurseAndAttachAndDeepClone(Object o, Set<Object> seen) {
1148
1144
} else if (o instanceof List ) {
1149
1145
if (seen .add (o )) {
1150
1146
List list = (List ) o ;
1151
- List copy = new ArrayList (list .size ());
1152
- list .forEach (v -> copy .add (recurseAndAttachAndDeepClone (v , seen )));
1147
+ int count = list .size ();
1148
+ List copy = new ArrayList (count );
1149
+ for (int i = 0 ; i < count ; i ++) {
1150
+ Object child = list .get (i );
1151
+ copy .add (recurseAndAttachAndDeepClone (name + "[" + i + "]" , child , seen ));
1152
+ }
1153
1153
return copy ;
1154
1154
} else {
1155
1155
return o ;
@@ -1158,7 +1158,7 @@ private Object recurseAndAttachAndDeepClone(Object o, Set<Object> seen) {
1158
1158
if (seen .add (o )) {
1159
1159
Map <String , Object > map = (Map ) o ;
1160
1160
Map <String , Object > copy = new LinkedHashMap (map .size ());
1161
- map .forEach ((k , v ) -> copy .put (k , recurseAndAttachAndDeepClone (v , seen )));
1161
+ map .forEach ((k , v ) -> copy .put (k , recurseAndAttachAndDeepClone (name + "." + k , v , seen )));
1162
1162
return copy ;
1163
1163
} else {
1164
1164
return o ;
@@ -1171,10 +1171,10 @@ private Object recurseAndAttachAndDeepClone(Object o, Set<Object> seen) {
1171
1171
// only for callonce and callSingle
1172
1172
protected Object recurseAndDetachAndDeepClone (Object o ) {
1173
1173
Set <Object > seen = Collections .newSetFromMap (new IdentityHashMap ());
1174
- return recurseAndDetachAndDeepClone (o , seen );
1174
+ return recurseAndDetachAndDeepClone ("" , o , seen );
1175
1175
}
1176
1176
1177
- private Object recurseAndDetachAndDeepClone (Object o , Set <Object > seen ) {
1177
+ private Object recurseAndDetachAndDeepClone (String name , Object o , Set <Object > seen ) {
1178
1178
if (o instanceof Value ) {
1179
1179
Value value = (Value ) o ;
1180
1180
try {
@@ -1189,15 +1189,19 @@ private Object recurseAndDetachAndDeepClone(Object o, Set<Object> seen) {
1189
1189
o = JsValue .toJava (value );
1190
1190
}
1191
1191
} catch (Exception e ) {
1192
- logger .warn ("[*** detach deep ***] unsupported value in callonce / callSingle: {}" , e .getMessage ());
1192
+ logger .warn ("[*** detach deep ***] ignoring non-json value in callonce / callSingle: '{}' - {}" , e .getMessage ());
1193
1193
return null ;
1194
1194
}
1195
1195
}
1196
1196
if (o instanceof List ) {
1197
1197
if (seen .add (o )) {
1198
1198
List list = (List ) o ;
1199
+ int count = list .size ();
1199
1200
List copy = new ArrayList (list .size ());
1200
- list .forEach (v -> copy .add (recurseAndDetachAndDeepClone (v , seen )));
1201
+ for (int i = 0 ; i < count ; i ++) {
1202
+ Object child = list .get (i );
1203
+ copy .add (recurseAndDetachAndDeepClone (name + "[" + i + "]" , child , seen ));
1204
+ }
1201
1205
return copy ;
1202
1206
} else {
1203
1207
return o ;
@@ -1206,7 +1210,7 @@ private Object recurseAndDetachAndDeepClone(Object o, Set<Object> seen) {
1206
1210
if (seen .add (o )) {
1207
1211
Map <String , Object > map = (Map ) o ;
1208
1212
Map <String , Object > copy = new LinkedHashMap (map .size ());
1209
- map .forEach ((k , v ) -> copy .put (k , recurseAndDetachAndDeepClone (v , seen )));
1213
+ map .forEach ((k , v ) -> copy .put (k , recurseAndDetachAndDeepClone (name + "." + k , v , seen )));
1210
1214
return copy ;
1211
1215
} else {
1212
1216
return o ;
@@ -1301,7 +1305,7 @@ public void setVariables(Map<String, Object> map) {
1301
1305
try {
1302
1306
setVariable (k , v );
1303
1307
} catch (Exception e ) {
1304
- logger .warn ("[*** set variables ***] skipping invalid graal value: {} - {}" , k , e .getMessage ());
1308
+ logger .warn ("[*** set variables ***] ignoring non-json value: {} - {}" , k , e .getMessage ());
1305
1309
}
1306
1310
});
1307
1311
}
0 commit comments