40
40
*/
41
41
package com .oracle .graal .python .builtins .modules ;
42
42
43
- import com .ibm .icu .lang .UCharacter ;
44
-
45
- import static com .oracle .graal .python .runtime .exception .PythonErrorType .TypeError ;
46
43
import static com .oracle .graal .python .runtime .exception .PythonErrorType .ValueError ;
47
44
48
45
import java .text .Normalizer ;
49
46
import java .util .List ;
50
47
48
+ import com .ibm .icu .lang .UCharacter ;
49
+ import com .ibm .icu .lang .UProperty ;
50
+ import com .oracle .graal .python .annotations .ArgumentClinic ;
51
51
import com .oracle .graal .python .builtins .Builtin ;
52
52
import com .oracle .graal .python .builtins .CoreFunctions ;
53
53
import com .oracle .graal .python .builtins .PythonBuiltinClassType ;
54
54
import com .oracle .graal .python .builtins .PythonBuiltins ;
55
55
import com .oracle .graal .python .builtins .objects .PNone ;
56
56
import com .oracle .graal .python .builtins .objects .object .PythonObject ;
57
- import com .oracle .graal .python .builtins .objects .str .PString ;
58
57
import com .oracle .graal .python .builtins .objects .type .PythonBuiltinClass ;
59
58
import com .oracle .graal .python .nodes .ErrorMessages ;
60
- import com .oracle .graal .python .nodes .function .PythonBuiltinNode ;
61
- import com .oracle .graal .python .nodes .util .CannotCastException ;
62
- import com .oracle .graal .python .nodes .util .CastToJavaStringNode ;
59
+ import com .oracle .graal .python .nodes .function .PythonBuiltinBaseNode ;
60
+ import com .oracle .graal .python .nodes .function .builtins .PythonBinaryClinicBuiltinNode ;
61
+ import com .oracle .graal .python .nodes .function .builtins .PythonUnaryClinicBuiltinNode ;
62
+ import com .oracle .graal .python .nodes .function .builtins .clinic .ArgumentClinicProvider ;
63
63
import com .oracle .graal .python .runtime .PythonCore ;
64
- import com .oracle .truffle .api .CompilerDirectives ;
65
64
import com .oracle .truffle .api .CompilerDirectives .TruffleBoundary ;
66
65
import com .oracle .truffle .api .dsl .Cached ;
67
- import com .oracle .truffle .api .dsl .Fallback ;
68
66
import com .oracle .truffle .api .dsl .GenerateNodeFactory ;
69
67
import com .oracle .truffle .api .dsl .NodeFactory ;
70
68
import com .oracle .truffle .api .dsl .Specialization ;
71
69
72
70
@ CoreFunctions (defineModule = "unicodedata" )
73
71
public class UnicodeDataModuleBuiltins extends PythonBuiltins {
74
72
@ Override
75
- protected List <? extends NodeFactory <? extends PythonBuiltinNode >> getNodeFactories () {
73
+ protected List <? extends NodeFactory <? extends PythonBuiltinBaseNode >> getNodeFactories () {
76
74
return UnicodeDataModuleBuiltinsFactory .getFactories ();
77
75
}
78
76
@@ -175,9 +173,11 @@ public void initialize(PythonCore core) {
175
173
}
176
174
177
175
// unicodedata.normalize(form, unistr)
178
- @ Builtin (name = "normalize" , minNumOfPositionalArgs = 2 )
176
+ @ Builtin (name = "normalize" , minNumOfPositionalArgs = 2 , parameterNames = {"form" , "unistr" })
177
+ @ ArgumentClinic (name = "form" , conversion = ArgumentClinic .ClinicConversion .String )
178
+ @ ArgumentClinic (name = "unistr" , conversion = ArgumentClinic .ClinicConversion .String )
179
179
@ GenerateNodeFactory
180
- public abstract static class NormalizeNode extends PythonBuiltinNode {
180
+ public abstract static class NormalizeNode extends PythonBinaryClinicBuiltinNode {
181
181
@ TruffleBoundary
182
182
protected Normalizer .Form getForm (String form ) {
183
183
try {
@@ -198,25 +198,18 @@ public String normalize(@SuppressWarnings("unused") String form, String unistr,
198
198
return Normalizer .normalize (unistr , cachedNormForm );
199
199
}
200
200
201
- @ Specialization (guards = {"form.equals(cachedForm)" }, limit = "4" )
202
- public String normalize (String form , PString unistr ,
203
- @ Cached ("form" ) String cachedForm ,
204
- @ Cached CastToJavaStringNode castToJavaStringNode ,
205
- @ Cached ("getForm(cachedForm)" ) Normalizer .Form cachedNormForm ) {
206
- try {
207
- return normalize (form , castToJavaStringNode .execute (unistr ), cachedForm , cachedNormForm );
208
- } catch (CannotCastException e ) {
209
- CompilerDirectives .transferToInterpreterAndInvalidate ();
210
- throw new IllegalStateException ("should not be reached" );
211
- }
201
+ @ Override
202
+ protected ArgumentClinicProvider getArgumentClinic () {
203
+ return UnicodeDataModuleBuiltinsClinicProviders .NormalizeNodeClinicProviderGen .INSTANCE ;
212
204
}
213
-
214
205
}
215
206
216
207
// unicodedata.is_normalized(form, unistr)
217
- @ Builtin (name = "is_normalized" , minNumOfPositionalArgs = 2 )
208
+ @ Builtin (name = "is_normalized" , minNumOfPositionalArgs = 2 , parameterNames = {"form" , "unistr" })
209
+ @ ArgumentClinic (name = "form" , conversion = ArgumentClinic .ClinicConversion .String )
210
+ @ ArgumentClinic (name = "unistr" , conversion = ArgumentClinic .ClinicConversion .String )
218
211
@ GenerateNodeFactory
219
- public abstract static class IsNormalizedNode extends PythonBuiltinNode {
212
+ public abstract static class IsNormalizedNode extends PythonBinaryClinicBuiltinNode {
220
213
@ TruffleBoundary
221
214
protected Normalizer .Form getForm (String form ) {
222
215
try {
@@ -237,36 +230,25 @@ public boolean isNormalized(@SuppressWarnings("unused") String form, String unis
237
230
return Normalizer .isNormalized (unistr , cachedNormForm );
238
231
}
239
232
240
- @ Specialization (guards = {"form.equals(cachedForm)" }, limit = "4" )
241
- public boolean normalize (String form , PString unistr ,
242
- @ Cached ("form" ) String cachedForm ,
243
- @ Cached CastToJavaStringNode castToJavaStringNode ,
244
- @ Cached ("getForm(cachedForm)" ) Normalizer .Form cachedNormForm ) {
245
- try {
246
- return isNormalized (form , castToJavaStringNode .execute (unistr ), cachedForm , cachedNormForm );
247
- } catch (CannotCastException e ) {
248
- CompilerDirectives .transferToInterpreterAndInvalidate ();
249
- throw new IllegalStateException ("should not be reached" );
250
- }
233
+ @ Override
234
+ protected ArgumentClinicProvider getArgumentClinic () {
235
+ return UnicodeDataModuleBuiltinsClinicProviders .IsNormalizedNodeClinicProviderGen .INSTANCE ;
251
236
}
252
237
}
253
238
254
- // unicodedata.name(char, defaultValue)
255
- @ Builtin (name = "name" , minNumOfPositionalArgs = 1 , maxNumOfPositionalArgs = 2 )
239
+ // unicodedata.name(chr, default)
240
+ @ Builtin (name = "name" , minNumOfPositionalArgs = 1 , parameterNames = {"chr" , "default" })
241
+ @ ArgumentClinic (name = "chr" , conversion = ArgumentClinic .ClinicConversion .CodePoint , defaultValue = "-1" )
256
242
@ GenerateNodeFactory
257
- public abstract static class NameNode extends PythonBuiltinNode {
243
+ public abstract static class NameNode extends PythonBinaryClinicBuiltinNode {
258
244
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 );
245
+ @ Specialization
246
+ public Object name (int cp , Object defaultValue ) {
265
247
if ((0xe000 <= cp && cp <= 0xf8ff ) || (0xF0000 <= cp && cp <= 0xFFFFD ) || (0x100000 <= cp && cp <= 0x10FFFD )) {
266
248
// do not populate names from private use areas
267
249
throw raise (ValueError , ErrorMessages .NO_SUCH_NAME );
268
250
}
269
- String result = UCharacter . getName (cp );
251
+ String result = getName (cp );
270
252
if (result == null ) {
271
253
if (defaultValue == PNone .NO_VALUE ) {
272
254
throw raise (ValueError , ErrorMessages .NO_SUCH_NAME );
@@ -276,26 +258,48 @@ protected Object getName(String chr, Object defaultValue) {
276
258
return result ;
277
259
}
278
260
261
+ @ TruffleBoundary
262
+ private static String getName (int cp ) {
263
+ return UCharacter .getName (cp );
264
+ }
265
+
266
+ @ Override
267
+ protected ArgumentClinicProvider getArgumentClinic () {
268
+ return UnicodeDataModuleBuiltinsClinicProviders .NameNodeClinicProviderGen .INSTANCE ;
269
+ }
270
+ }
271
+
272
+ // unicodedata.bidirectional(char)
273
+ @ Builtin (name = "bidirectional" , minNumOfPositionalArgs = 1 , numOfPositionalOnlyArgs = 1 , parameterNames = {"chr" })
274
+ @ ArgumentClinic (name = "chr" , conversion = ArgumentClinic .ClinicConversion .CodePoint , defaultValue = "-1" )
275
+ @ GenerateNodeFactory
276
+ public abstract static class BidirectionalNode extends PythonUnaryClinicBuiltinNode {
279
277
@ Specialization
280
- public Object name (String chr , Object defaultValue ) {
281
- return getName (chr , defaultValue );
278
+ @ TruffleBoundary
279
+ static String bidirectional (int chr ) {
280
+ return UCharacter .getPropertyValueName (UProperty .BIDI_CLASS , UCharacter .getDirection (chr ), UProperty .NameChoice .SHORT );
282
281
}
283
282
283
+ @ Override
284
+ protected ArgumentClinicProvider getArgumentClinic () {
285
+ return UnicodeDataModuleBuiltinsClinicProviders .BidirectionalNodeClinicProviderGen .INSTANCE ;
286
+ }
287
+ }
288
+
289
+ // unicodedata.category(char)
290
+ @ Builtin (name = "category" , minNumOfPositionalArgs = 1 , numOfPositionalOnlyArgs = 1 , parameterNames = {"chr" })
291
+ @ ArgumentClinic (name = "chr" , conversion = ArgumentClinic .ClinicConversion .CodePoint , defaultValue = "-1" )
292
+ @ GenerateNodeFactory
293
+ public abstract static class CategoryNode extends PythonUnaryClinicBuiltinNode {
284
294
@ 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 );
295
+ @ TruffleBoundary
296
+ static String category (int chr ) {
297
+ return UCharacter .getPropertyValueName (UProperty .GENERAL_CATEGORY , UCharacter .getType (chr ), UProperty .NameChoice .SHORT );
294
298
}
295
299
296
- @ Fallback
297
- public Object name ( Object chr , @ SuppressWarnings ( "unused" ) Object defaultValue ) {
298
- throw raise ( TypeError , ErrorMessages . ARG_MUST_BE_UNICODE , "name()" , 1 , chr ) ;
300
+ @ Override
301
+ protected ArgumentClinicProvider getArgumentClinic ( ) {
302
+ return UnicodeDataModuleBuiltinsClinicProviders . CategoryNodeClinicProviderGen . INSTANCE ;
299
303
}
300
304
}
301
305
}
0 commit comments