Skip to content

Commit f6b9ceb

Browse files
comiuscopybara-github
authored andcommitted
Fix NPE in default value typechecks
PiperOrigin-RevId: 747495719 Change-Id: Ia0049e7ed25ee173abc20b3716243a902b210d70
1 parent 61be2d6 commit f6b9ceb

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import net.starlark.java.syntax.TokenKind;
5151
import net.starlark.java.syntax.UnaryOperatorExpression;
5252
import net.starlark.java.types.StarlarkType;
53+
import net.starlark.java.types.Types.CallableType;
5354

5455
final class Eval {
5556

@@ -167,6 +168,7 @@ private static StarlarkFunction newFunction(StarlarkThread.Frame fr, Resolver.Fu
167168
Object[] defaults = null;
168169
int nparams =
169170
rfn.getParameters().size() - (rfn.hasKwargs() ? 1 : 0) - (rfn.hasVarargs() ? 1 : 0);
171+
CallableType functionType = rfn.getFunctionType();
170172
for (int i = 0; i < nparams; i++) {
171173
Expression expr = rfn.getParameters().get(i).getDefaultValue();
172174
if (expr == null && defaults == null) {
@@ -179,14 +181,16 @@ private static StarlarkFunction newFunction(StarlarkThread.Frame fr, Resolver.Fu
179181
defaults[i - (nparams - defaults.length)] = defaultValue;
180182

181183
// Typecheck the default value
182-
StarlarkType parameterType = rfn.getFunctionType().getParameterTypeByPos(i);
183-
if (!TypeChecker.isValueSubtypeOf(defaultValue, parameterType)) {
184-
throw Starlark.errorf(
185-
"%s(): parameter '%s' has default value of type '%s', declares '%s'",
186-
rfn.getName(),
187-
rfn.getParameterNames().get(i),
188-
TypeChecker.type(defaultValue),
189-
parameterType);
184+
if (functionType != null) {
185+
StarlarkType parameterType = functionType.getParameterTypeByPos(i);
186+
if (!TypeChecker.isValueSubtypeOf(defaultValue, parameterType)) {
187+
throw Starlark.errorf(
188+
"%s(): parameter '%s' has default value of type '%s', declares '%s'",
189+
rfn.getName(),
190+
rfn.getParameterNames().get(i),
191+
TypeChecker.type(defaultValue),
192+
parameterType);
193+
}
190194
}
191195
}
192196
if (defaults == null) {

src/test/java/net/starlark/java/eval/TypeCheckTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ public void lambdaDoesntFail() throws Exception {
6767
"def f(a: None):", //
6868
" x = lambda y: 1",
6969
" x(1)",
70+
" y = lambda y = 1: 1",
71+
" y(1)",
7072
"f(None)");
7173
}
7274

0 commit comments

Comments
 (0)