Skip to content

Commit 0cbb8a8

Browse files
committed
Create a new interface to allow Starlark objects to get a thread when getIndex is called.
PiperOrigin-RevId: 367454604
1 parent e376580 commit 0cbb8a8

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

src/main/java/net/starlark/java/eval/Eval.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ private static void execAugmentedAssignment(StarlarkThread.Frame fr, AssignmentS
403403
IndexExpression index = (IndexExpression) lhs;
404404
Object object = eval(fr, index.getObject());
405405
Object key = eval(fr, index.getKey());
406-
Object x = EvalUtils.index(fr.thread.mutability(), fr.thread.getSemantics(), object, key);
406+
Object x = EvalUtils.index(fr.thread, object, key);
407407
// Evaluate rhs after lhs.
408408
Object y = eval(fr, rhs);
409409
Object z = inplaceBinaryOp(fr, op, x, y);
@@ -703,7 +703,7 @@ private static Object evalIndex(StarlarkThread.Frame fr, IndexExpression index)
703703
Object object = eval(fr, index.getObject());
704704
Object key = eval(fr, index.getKey());
705705
try {
706-
return EvalUtils.index(fr.thread.mutability(), fr.thread.getSemantics(), object, key);
706+
return EvalUtils.index(fr.thread, object, key);
707707
} catch (EvalException ex) {
708708
fr.setErrorLocation(index.getLbracketLocation());
709709
throw ex;

src/main/java/net/starlark/java/eval/EvalUtils.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,9 +431,14 @@ static Object unaryOp(TokenKind op, Object x) throws EvalException {
431431
*
432432
* @throws EvalException if {@code object} is not a sequence or mapping.
433433
*/
434-
static Object index(Mutability mu, StarlarkSemantics semantics, Object object, Object key)
434+
static Object index(StarlarkThread starlarkThread, Object object, Object key)
435435
throws EvalException {
436-
if (object instanceof StarlarkIndexable) {
436+
Mutability mu = starlarkThread.mutability();
437+
StarlarkSemantics semantics = starlarkThread.getSemantics();
438+
439+
if (object instanceof StarlarkIndexable.Threaded) {
440+
return ((StarlarkIndexable.Threaded) object).getIndex(starlarkThread, semantics, key);
441+
} else if (object instanceof StarlarkIndexable) {
437442
Object result = ((StarlarkIndexable) object).getIndex(semantics, key);
438443
// TODO(bazel-team): We shouldn't have this fromJava call here. If it's needed at all,
439444
// it should go in the implementations of StarlarkIndexable#getIndex that produce non-Starlark

src/main/java/net/starlark/java/eval/StarlarkIndexable.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,20 @@ public interface StarlarkIndexable extends StarlarkValue {
3030
* convention.
3131
*/
3232
boolean containsKey(StarlarkSemantics semantics, Object key) throws EvalException;
33+
34+
/**
35+
* A variant of {@link StarlarkIndexable} that also provides a StarlarkThread instance on method
36+
* calls.
37+
*/
38+
// TODO(brandjon): Consider replacing this subinterface by changing StarlarkIndexable's methods'
39+
// signatures to take StarlarkThread in place of StarlarkSemantics.
40+
interface Threaded {
41+
/** {@see StarlarkIndexable.getIndex} */
42+
Object getIndex(StarlarkThread starlarkThread, StarlarkSemantics semantics, Object key)
43+
throws EvalException;
44+
45+
/** {@see StarlarkIndexable.containsKey} */
46+
boolean containsKey(StarlarkThread starlarkThread, StarlarkSemantics semantics, Object key)
47+
throws EvalException;
48+
}
3349
}

0 commit comments

Comments
 (0)