Skip to content

Commit f3bdf95

Browse files
committed
Built-in functionality tied to interpreter instances
1 parent 02a1415 commit f3bdf95

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1030
-981
lines changed

src/dssl/NativeImpl.java

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)