Skip to content

Commit 0d66541

Browse files
committed
[GR-24012] UnicodeData module doesn't have name method.
PullRequest: graalpython/1125
2 parents a309e24 + f456457 commit 0d66541

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_aliases_names_in_pua_range
2+
*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_ascii_letters
13
*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_cjk_unified_ideographs
4+
*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_errors
25
*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_general
6+
*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_hangul_syllables
37
*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_issue16335
48
*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_misc_symbols
59
*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_named_sequences_full
10+
*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_named_sequences_names_in_pua_range
611
*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_strict_error_handling

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
*/
4141
package com.oracle.graal.python.builtins.modules;
4242

43+
import com.ibm.icu.lang.UCharacter;
44+
45+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
4346
import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
4447

4548
import java.text.Normalizer;
@@ -49,6 +52,7 @@
4952
import com.oracle.graal.python.builtins.CoreFunctions;
5053
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5154
import com.oracle.graal.python.builtins.PythonBuiltins;
55+
import com.oracle.graal.python.builtins.objects.PNone;
5256
import com.oracle.graal.python.builtins.objects.object.PythonObject;
5357
import com.oracle.graal.python.builtins.objects.str.PString;
5458
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
@@ -60,6 +64,7 @@
6064
import com.oracle.truffle.api.CompilerDirectives;
6165
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
6266
import com.oracle.truffle.api.dsl.Cached;
67+
import com.oracle.truffle.api.dsl.Fallback;
6368
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
6469
import com.oracle.truffle.api.dsl.NodeFactory;
6570
import com.oracle.truffle.api.dsl.Specialization;
@@ -245,4 +250,52 @@ public boolean normalize(String form, PString unistr,
245250
}
246251
}
247252
}
253+
254+
// unicodedata.name(char, defaultValue)
255+
@Builtin(name = "name", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2)
256+
@GenerateNodeFactory
257+
public abstract static class NameNode extends PythonBuiltinNode {
258+
259+
@TruffleBoundary
260+
protected Object getName(String chr, Object defaultValue) {
261+
if (chr.codePointCount(0, chr.length()) != 1) {
262+
throw raise(TypeError, ErrorMessages.ARG_MUST_BE_UNICODE, "name()", 1, chr);
263+
}
264+
int cp = Character.codePointAt(chr, 0);
265+
if ((0xe000 <= cp && cp <= 0xf8ff) || (0xF0000 <= cp && cp <= 0xFFFFD) || (0x100000 <= cp && cp <= 0x10FFFD)) {
266+
// do not populate names from private use areas
267+
throw raise(ValueError, ErrorMessages.NO_SUCH_NAME);
268+
}
269+
String result = UCharacter.getName(cp);
270+
if (result == null) {
271+
if (defaultValue == PNone.NO_VALUE) {
272+
throw raise(ValueError, ErrorMessages.NO_SUCH_NAME);
273+
}
274+
return defaultValue;
275+
}
276+
return result;
277+
}
278+
279+
@Specialization
280+
public Object name(String chr, Object defaultValue) {
281+
return getName(chr, defaultValue);
282+
}
283+
284+
@Specialization
285+
public Object name(PString pchr, Object defaultValue,
286+
@Cached CastToJavaStringNode castToJavaStringNode) {
287+
String chr;
288+
try {
289+
chr = castToJavaStringNode.execute(pchr);
290+
} catch (CannotCastException e) {
291+
throw CompilerDirectives.shouldNotReachHere(e);
292+
}
293+
return getName(chr, defaultValue);
294+
}
295+
296+
@Fallback
297+
public Object name(Object chr, @SuppressWarnings("unused") Object defaultValue) {
298+
throw raise(TypeError, ErrorMessages.ARG_MUST_BE_UNICODE, "name()", 1, chr);
299+
}
300+
}
248301
}

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
@@ -354,6 +354,7 @@ public abstract class ErrorMessages {
354354
public static final String NO_CURRENT_FRAME = "%s: no current frame";
355355
public static final String NO_FUNCTION_FOUND = "no function %s%s found in %s";
356356
public static final String NO_SUCH_FILE_OR_DIR = "No such file or directory: '%s:/%s'";
357+
public static final String NO_SUCH_NAME = "no such name";
357358
public static final String NONLOCAL_AND_GLOBAL = "name '%s' is nonlocal and global";
358359
public static final String NONLOCAL_AT_MODULE_LEVEL = "nonlocal declaration not allowed at module level";
359360
public static final String NON_HEX_DIGIT_FOUND = "Non-hexadecimal digit found";

0 commit comments

Comments
 (0)