Skip to content

Commit 789d222

Browse files
committed
Fix argument checking for type.__new__
1 parent 7be1ce9 commit 789d222

File tree

3 files changed

+10
-2
lines changed

3 files changed

+10
-2
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_types.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_with_mro_entry_multiple
1515
*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_with_mro_entry_multiple_2
1616
*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_with_mro_entry_none
17+
*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_one_argument_type
1718
*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_prepare_class
1819
*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_resolve_bases
1920
*graalpython.lib-python.3.test.test_types.CoroutineTests.test_duck_coro

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
import static com.oracle.graal.python.nodes.BuiltinNames.ZIP;
6262
import static com.oracle.graal.python.nodes.ErrorMessages.ARG_MUST_NOT_BE_ZERO;
6363
import static com.oracle.graal.python.nodes.ErrorMessages.ERROR_CALLING_SET_NAME;
64+
import static com.oracle.graal.python.nodes.ErrorMessages.TAKES_EXACTLY_D_ARGUMENTS_D_GIVEN;
6465
import static com.oracle.graal.python.nodes.PGuards.isInteger;
6566
import static com.oracle.graal.python.nodes.PGuards.isNoValue;
6667
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__BASICSIZE__;
@@ -2135,9 +2136,14 @@ public abstract static class TypeNode extends PythonBuiltinNode {
21352136

21362137
@Specialization(guards = {"isNoValue(bases)", "isNoValue(dict)"})
21372138
@SuppressWarnings("unused")
2138-
static Object type(Object cls, Object obj, PNone bases, PNone dict, PKeyword[] kwds,
2139+
Object type(Object cls, Object obj, PNone bases, PNone dict, PKeyword[] kwds,
2140+
@Cached IsBuiltinClassProfile profile,
21392141
@Cached GetClassNode getClass) {
2140-
return getClass.execute(obj);
2142+
if (profile.profileClass(cls, PythonBuiltinClassType.PythonClass)) {
2143+
return getClass.execute(obj);
2144+
} else {
2145+
throw raise(TypeError, TAKES_EXACTLY_D_ARGUMENTS_D_GIVEN, "type.__new__", 3, 1);
2146+
}
21412147
}
21422148

21432149
@Specialization(guards = "isString(wName)")

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/ErrorMessages.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ public abstract class ErrorMessages {
473473
public static final String TAKES_D_POS_ARG_S_BUT_GIVEN_S = "%s() takes %d positional argument%s but %d %s given%s";
474474
public static final String TAKES_FROM_D_TO_D_POS_ARG_S_BUT_D_POS_ARG_S = "%s() takes from %d to %d positional argument%s but %d positional argument%s (and %d keyword-only argument%s) were given%s";
475475
public static final String TAKES_FROM_D_TO_D_POS_ARG_S_BUT_D_S_GIVEN_S = "%s() takes from %d to %d positional argument%s but %d %s given%s";
476+
public static final String TAKES_EXACTLY_D_ARGUMENTS_D_GIVEN = "%s() takes exactly %d arguments (%d given)";
476477
public static final String TAKES_NO_KEYWORD_ARGS = "%s takes no keyword arguments";
477478
public static final String THROW_THIRD_ARG_MUST_BE_TRACEBACK = "throw() third argument must be a traceback object";
478479
public static final String TIMEOUT_VALUE_MUST_BE_POSITIVE = "timeout value must be positive";

0 commit comments

Comments
 (0)