@@ -85,7 +85,7 @@ static TokenResult tryField(TokenExecutor exec, Class<?> clazz, String member, b
8585 if (isInst ) {
8686 exec .pop ();
8787 }
88- exec .push (convert (result ));
88+ exec .push (convert (exec . interpreter , result ));
8989 return TokenResult .PASS ;
9090 }
9191 catch (Exception e ) {
@@ -112,7 +112,7 @@ static TokenResult tryExecutable(TokenExecutor exec, Class<?> clazz, List<Execut
112112
113113 for (int i = 0 ; i < params ; ++i ) {
114114 Object obj = nativize (elems [i ], types [i ]);
115- if (obj == null && !NullElement . INSTANCE .equals (elems [i ])) {
115+ if (obj == null && !exec . interpreter . builtIn . nullElement .equals (elems [i ])) {
116116 continue outer ;
117117 }
118118 else {
@@ -130,7 +130,7 @@ static TokenResult tryExecutable(TokenExecutor exec, Class<?> clazz, List<Execut
130130 }
131131 exec .pop (count );
132132 if (result != null ) {
133- exec .push (convert (result ));
133+ exec .push (convert (exec . interpreter , result ));
134134 }
135135 return TokenResult .PASS ;
136136 }
@@ -186,7 +186,7 @@ static int compareExecutables(Executable a, Executable b) {
186186 }
187187
188188 static Object nativize (@ NonNull Element elem , Type type ) {
189- if (NullElement . INSTANCE .equals (elem )) {
189+ if (elem . interpreter . builtIn . nullElement .equals (elem )) {
190190 return null ;
191191 }
192192 else if (type instanceof Class ) {
@@ -390,7 +390,7 @@ static class Tracker {
390390
391391 static <T > T tracked (@ NonNull Element elem , Function <@ NonNull Element , T > mapper , Tracker tracker ) {
392392 T result = mapper .apply (elem );
393- if (result == null && !NullElement . INSTANCE .equals (elem )) {
393+ if (result == null && !elem . interpreter . builtIn . nullElement .equals (elem )) {
394394 tracker .flag = true ;
395395 }
396396 return result ;
@@ -400,54 +400,55 @@ static Object trackedNativize(@NonNull Element elem, Type type, Tracker tracker)
400400 return tracked (elem , y -> nativize (y , type ), tracker );
401401 }
402402
403- static @ NonNull Element convert (Object obj ) {
403+ static @ NonNull Element convert (Interpreter interpreter , Object obj ) {
404404 if (obj == null ) {
405- return NullElement . INSTANCE ;
405+ return interpreter . builtIn . nullElement ;
406406 }
407407 else if (obj instanceof Byte ) {
408- return new IntElement ((Byte ) obj );
408+ return new IntElement (interpreter , (Byte ) obj );
409409 }
410410 else if (obj instanceof Short ) {
411- return new IntElement ((Short ) obj );
411+ return new IntElement (interpreter , (Short ) obj );
412412 }
413413 else if (obj instanceof Integer ) {
414- return new IntElement ((Integer ) obj );
414+ return new IntElement (interpreter , (Integer ) obj );
415415 }
416416 else if (obj instanceof Long ) {
417- return new IntElement ((Long ) obj );
417+ return new IntElement (interpreter , (Long ) obj );
418418 }
419419 else if (obj instanceof BigInteger ) {
420- return new IntElement ((BigInteger ) obj );
420+ return new IntElement (interpreter , (BigInteger ) obj );
421421 }
422422 else if (obj instanceof Boolean ) {
423- return new BoolElement ((Boolean ) obj );
423+ return new BoolElement (interpreter , (Boolean ) obj );
424424 }
425425 else if (obj instanceof Float ) {
426- return new FloatElement (((Float ) obj ).doubleValue ());
426+ return new FloatElement (interpreter , ((Float ) obj ).doubleValue ());
427427 }
428428 else if (obj instanceof Double ) {
429- return new FloatElement ((Double ) obj );
429+ return new FloatElement (interpreter , (Double ) obj );
430430 }
431431 else if (obj instanceof Character ) {
432- return new CharElement ((Character ) obj );
432+ return new CharElement (interpreter , (Character ) obj );
433433 }
434434 else if (obj instanceof String ) {
435- return new StringElement ((String ) obj );
435+ return new StringElement (interpreter , (String ) obj );
436436 }
437437 else if (obj instanceof List ) {
438- return new ListElement (((List <?>) obj ).stream ().map (NativeImpl :: convert ));
438+ return new ListElement (interpreter , ((List <?>) obj ).stream ().map (x -> convert ( interpreter , x ) ));
439439 }
440440 else if (obj .getClass ().isArray ()) {
441- return new ListElement (IntStream .range (0 , Array .getLength (obj )).mapToObj (x -> NativeImpl .convert (Array .get (obj , x ))));
441+ return new ListElement (interpreter , IntStream .range (0 , Array .getLength (obj )).mapToObj (x -> NativeImpl .convert (interpreter , Array .get (obj , x ))));
442442 }
443443 else if (obj instanceof Set ) {
444- return new SetElement (Helpers .map ((Set <?>) obj , NativeImpl :: convert ));
444+ return new SetElement (interpreter , Helpers .map ((Set <?>) obj , x -> convert ( interpreter , x ) ));
445445 }
446446 else if (obj instanceof Map ) {
447- return new DictElement (Helpers .map ((Map <?, ?>) obj , NativeImpl ::convert , NativeImpl ::convert ), false );
447+ Function <Object , @ NonNull Element > convert = x -> convert (interpreter , x );
448+ return new DictElement (interpreter , Helpers .map ((Map <?, ?>) obj , convert , convert ), false );
448449 }
449450 else {
450- return new NativeElement (obj );
451+ return new NativeElement (interpreter , obj );
451452 }
452453 }
453454}
0 commit comments