Skip to content

Commit a8befe8

Browse files
committed
Implement unicodedata.digit and unicodedata.decimal
1 parent 9f3e804 commit a8befe8

File tree

3 files changed

+61
-2
lines changed

3 files changed

+61
-2
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ test.test_unicodedata.NormalizationTest.test_edge_cases @ darwin-arm64,darwin-x8
33
test.test_unicodedata.NormalizationTest.test_normalization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64
44
test.test_unicodedata.UnicodeFunctionsTest.test_category @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64
55
test.test_unicodedata.UnicodeFunctionsTest.test_combining @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64
6-
test.test_unicodedata.UnicodeFunctionsTest.test_decimal @ darwin-x86_64
6+
test.test_unicodedata.UnicodeFunctionsTest.test_decimal @ darwin-x86_64,linux-x86_64
77
test.test_unicodedata.UnicodeFunctionsTest.test_decomposition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64
8-
test.test_unicodedata.UnicodeFunctionsTest.test_digit @ darwin-x86_64
8+
test.test_unicodedata.UnicodeFunctionsTest.test_digit @ darwin-x86_64,linux-x86_64
99
test.test_unicodedata.UnicodeFunctionsTest.test_east_asian_width @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64
1010
test.test_unicodedata.UnicodeFunctionsTest.test_east_asian_width_9_0_changes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64
1111
test.test_unicodedata.UnicodeFunctionsTest.test_east_asian_width_unassigned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,4 +442,61 @@ protected ArgumentClinicProvider getArgumentClinic() {
442442
return UnicodeDataModuleBuiltinsClinicProviders.EastAsianWidthNodeClinicProviderGen.INSTANCE;
443443
}
444444
}
445+
446+
@Builtin(name = "digit", minNumOfPositionalArgs = 1, parameterNames = {"chr", "default"})
447+
@ArgumentClinic(name = "chr", conversion = ArgumentClinic.ClinicConversion.CodePoint)
448+
@GenerateNodeFactory
449+
abstract static class DigitNode extends PythonBinaryClinicBuiltinNode {
450+
@Specialization
451+
@TruffleBoundary
452+
static Object digit(int codepoint, Object def,
453+
@Bind Node inliningTarget) {
454+
int numericProperty = UCharacter.getIntPropertyValue(codepoint, UProperty.NUMERIC_TYPE);
455+
if (numericProperty != 0 && (numericProperty & (UCharacter.NumericType.DIGIT | UCharacter.NumericType.DECIMAL)) != 0) {
456+
int value = UCharacter.getNumericValue(codepoint);
457+
if (value >= 0) {
458+
return value;
459+
}
460+
}
461+
if (def != PNone.NO_VALUE) {
462+
return def;
463+
} else {
464+
throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.NOT_A_DIGIT);
465+
}
466+
}
467+
468+
@Override
469+
protected ArgumentClinicProvider getArgumentClinic() {
470+
return UnicodeDataModuleBuiltinsClinicProviders.DigitNodeClinicProviderGen.INSTANCE;
471+
}
472+
}
473+
474+
@Builtin(name = "decimal", minNumOfPositionalArgs = 1, parameterNames = {"chr", "default"})
475+
@ArgumentClinic(name = "chr", conversion = ArgumentClinic.ClinicConversion.CodePoint)
476+
@GenerateNodeFactory
477+
abstract static class DecimalNode extends PythonBinaryClinicBuiltinNode {
478+
@Specialization
479+
@TruffleBoundary
480+
static Object decimal(int codepoint, Object def,
481+
@Bind Node inliningTarget) {
482+
int numericProperty = UCharacter.getIntPropertyValue(codepoint, UProperty.NUMERIC_TYPE);
483+
if (numericProperty != 0 && (numericProperty & UCharacter.NumericType.DECIMAL) != 0) {
484+
int value = UCharacter.getNumericValue(codepoint);
485+
if (value >= 0) {
486+
return value;
487+
}
488+
}
489+
if (def != PNone.NO_VALUE) {
490+
return def;
491+
} else {
492+
throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.NOT_A_DECIMAL);
493+
}
494+
}
495+
496+
@Override
497+
protected ArgumentClinicProvider getArgumentClinic() {
498+
return UnicodeDataModuleBuiltinsClinicProviders.DecimalNodeClinicProviderGen.INSTANCE;
499+
}
500+
}
501+
445502
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,4 +1624,6 @@ public abstract class ErrorMessages {
16241624
public static final TruffleString TYPE_EXC_TB_OF_THROW_IS_DEPRECATED = tsLiteral("the (type, exc, tb) signature of throw() is deprecated, use the single-arg signature instead.");
16251625
public static final TruffleString PRECISION_TOO_LARGE = tsLiteral("precision too large");
16261626
public static final TruffleString DIM_MEMORY_HAS_NO_LENGTH = tsLiteral("0-dim memory has no length");
1627+
public static final TruffleString NOT_A_DIGIT = tsLiteral("not a digit");
1628+
public static final TruffleString NOT_A_DECIMAL = tsLiteral("not a decimal");
16271629
}

0 commit comments

Comments
 (0)