Skip to content

Commit 7569dbe

Browse files
committed
Implement unicodedata.combining()
1 parent 95742bb commit 7569dbe

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_unicodedata.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,17 @@ def test_east_asian_width(self):
8888
empty_string = ""
8989
with self.assertRaisesRegex(TypeError, r"east_asian_width\(\) argument must be a unicode character, not str"):
9090
unicodedata.east_asian_width(empty_string)
91+
92+
93+
def test_combining(self):
94+
list = [1, 2, 3]
95+
with self.assertRaisesRegex(TypeError, r"combining\(\) argument must be a unicode character, not list"):
96+
unicodedata.combining(list)
97+
98+
multi_character_string = "abc"
99+
with self.assertRaisesRegex(TypeError, r"combining\(\) argument must be a unicode character, not str"):
100+
unicodedata.combining(multi_character_string)
101+
102+
empty_string = ""
103+
with self.assertRaisesRegex(TypeError, r"combining\(\) argument must be a unicode character, not str"):
104+
unicodedata.combining(empty_string)

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252

5353
import com.oracle.graal.python.builtins.objects.module.PythonModule;
5454
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
55+
import com.oracle.graal.python.nodes.util.CannotCastException;
5556
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
5657
import com.oracle.truffle.api.strings.TruffleString.CodePointAtByteIndexNode;
5758
import com.oracle.truffle.api.strings.TruffleString.CodePointLengthNode;
@@ -333,6 +334,32 @@ protected ArgumentClinicProvider getArgumentClinic() {
333334
}
334335
}
335336

337+
// unicodedata.combining(chr)
338+
@Builtin(name = "combining", minNumOfPositionalArgs = 1, numOfPositionalOnlyArgs = 1, parameterNames = {"chr"})
339+
@GenerateNodeFactory
340+
public abstract static class CombiningNode extends PythonUnaryBuiltinNode {
341+
342+
@Specialization
343+
@TruffleBoundary
344+
static Object combining(Object object,
345+
@Bind Node inliningTarget) {
346+
final TruffleString chr;
347+
348+
try {
349+
chr = CastToTruffleStringNode.getUncached().execute(inliningTarget, object);
350+
} catch (CannotCastException e) {
351+
throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.S_ARG_MUST_BE_S_NOT_P, "combining()", "a unicode character", object);
352+
}
353+
354+
if (CodePointLengthNode.getUncached().execute(chr, TS_ENCODING) != 1) {
355+
throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.S_ARG_MUST_BE_S_NOT_P, "combining()", "a unicode character", object);
356+
}
357+
358+
int codepoint = CodePointAtByteIndexNode.getUncached().execute(chr, 0, TS_ENCODING);
359+
return UCharacter.getCombiningClass(codepoint);
360+
}
361+
}
362+
336363
// unicode.east_asia_width(chr)
337364
@Builtin(name = "east_asian_width", minNumOfPositionalArgs = 1, numOfPositionalOnlyArgs = 1, parameterNames = {"chr"})
338365
@GenerateNodeFactory

graalpython/lib-graalpython/unicodedata.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,6 @@
4040
__graalpython__.import_current_as_named_module_with_delegate(
4141
module_name="unicodedata",
4242
delegate_name="_cpython_unicodedata",
43-
delegate_attributes=['ucd_3_2_0', 'combining'],
43+
delegate_attributes=['ucd_3_2_0'],
4444
wrap_methods=False,
4545
owner_globals=globals())

0 commit comments

Comments
 (0)