27
27
28
28
import static com .oracle .graal .python .builtins .PythonBuiltinClassType .IndentationError ;
29
29
import static com .oracle .graal .python .builtins .PythonBuiltinClassType .TabError ;
30
+ import static com .oracle .graal .python .builtins .objects .exception .SyntaxErrorBuiltins .SYNTAX_ERROR_ATTR_FACTORY ;
30
31
import static com .oracle .graal .python .nodes .BuiltinNames .MODULES ;
31
32
import static com .oracle .graal .python .nodes .BuiltinNames .PRINT ;
32
33
import static com .oracle .graal .python .nodes .SpecialAttributeNames .__PACKAGE__ ;
45
46
import java .util .regex .Matcher ;
46
47
import java .util .regex .Pattern ;
47
48
48
- import com .oracle .graal .python .builtins .objects .exception .SystemExitBuiltins ;
49
49
import org .graalvm .nativeimage .ImageInfo ;
50
50
51
51
import com .oracle .graal .python .PythonLanguage ;
160
160
import com .oracle .graal .python .builtins .modules .zlib .ZlibCompressBuiltins ;
161
161
import com .oracle .graal .python .builtins .modules .zlib .ZlibDecompressBuiltins ;
162
162
import com .oracle .graal .python .builtins .objects .NotImplementedBuiltins ;
163
- import com .oracle .graal .python .builtins .objects .PNone ;
164
163
import com .oracle .graal .python .builtins .objects .array .ArrayBuiltins ;
165
164
import com .oracle .graal .python .builtins .objects .bool .BoolBuiltins ;
166
165
import com .oracle .graal .python .builtins .objects .bytes .ByteArrayBuiltins ;
180
179
import com .oracle .graal .python .builtins .objects .ellipsis .EllipsisBuiltins ;
181
180
import com .oracle .graal .python .builtins .objects .enumerate .EnumerateBuiltins ;
182
181
import com .oracle .graal .python .builtins .objects .exception .BaseExceptionBuiltins ;
182
+ import com .oracle .graal .python .builtins .objects .exception .ImportErrorBuiltins ;
183
+ import com .oracle .graal .python .builtins .objects .exception .OsErrorBuiltins ;
183
184
import com .oracle .graal .python .builtins .objects .exception .PBaseException ;
185
+ import com .oracle .graal .python .builtins .objects .exception .StopIterationBuiltins ;
186
+ import com .oracle .graal .python .builtins .objects .exception .SyntaxErrorBuiltins ;
187
+ import com .oracle .graal .python .builtins .objects .exception .SystemExitBuiltins ;
188
+ import com .oracle .graal .python .builtins .objects .exception .UnicodeDecodeErrorBuiltins ;
189
+ import com .oracle .graal .python .builtins .objects .exception .UnicodeEncodeErrorBuiltins ;
190
+ import com .oracle .graal .python .builtins .objects .exception .UnicodeErrorBuiltins ;
191
+ import com .oracle .graal .python .builtins .objects .exception .UnicodeTranslateErrorBuiltins ;
184
192
import com .oracle .graal .python .builtins .objects .floats .FloatBuiltins ;
185
193
import com .oracle .graal .python .builtins .objects .floats .PFloat ;
186
194
import com .oracle .graal .python .builtins .objects .foreign .ForeignObjectBuiltins ;
@@ -342,9 +350,11 @@ private static String[] initializeCoreFiles() {
342
350
// add service loader defined python file extensions
343
351
if (!ImageInfo .inImageRuntimeCode ()) {
344
352
ServiceLoader <PythonBuiltins > providers = ServiceLoader .load (PythonBuiltins .class , Python3Core .class .getClassLoader ());
353
+ PythonOS currentOs = PythonOS .getPythonOS ();
345
354
for (PythonBuiltins builtin : providers ) {
346
355
CoreFunctions annotation = builtin .getClass ().getAnnotation (CoreFunctions .class );
347
- if (!annotation .pythonFile ().isEmpty ()) {
356
+ if (!annotation .pythonFile ().isEmpty () &&
357
+ (annotation .os () == PythonOS .PLATFORM_ANY || annotation .os () == currentOs )) {
348
358
coreFiles .add (annotation .pythonFile ());
349
359
}
350
360
}
@@ -374,6 +384,16 @@ private static String[] initializeCoreFiles() {
374
384
c = null ;
375
385
}
376
386
387
+ private static void filterBuiltins (List <PythonBuiltins > builtins ) {
388
+ PythonOS currentOs = PythonOS .getPythonOS ();
389
+ for (PythonBuiltins builtin : builtins ) {
390
+ CoreFunctions annotation = builtin .getClass ().getAnnotation (CoreFunctions .class );
391
+ if (annotation .os () != PythonOS .PLATFORM_ANY && annotation .os () != currentOs ) {
392
+ builtins .remove (builtin );
393
+ }
394
+ }
395
+ }
396
+
377
397
private static PythonBuiltins [] initializeBuiltins (boolean nativeAccessAllowed ) {
378
398
List <PythonBuiltins > builtins = new ArrayList <>(Arrays .asList (
379
399
new BuiltinConstructors (),
@@ -452,6 +472,14 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
452
472
new WarningsModuleBuiltins (),
453
473
// exceptions
454
474
new SystemExitBuiltins (),
475
+ new ImportErrorBuiltins (),
476
+ new StopIterationBuiltins (),
477
+ new SyntaxErrorBuiltins (),
478
+ new OsErrorBuiltins (),
479
+ new UnicodeErrorBuiltins (),
480
+ new UnicodeEncodeErrorBuiltins (),
481
+ new UnicodeDecodeErrorBuiltins (),
482
+ new UnicodeTranslateErrorBuiltins (),
455
483
456
484
// io
457
485
new IOModuleBuiltins (),
@@ -625,6 +653,7 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
625
653
builtins .add (builtin );
626
654
}
627
655
}
656
+ filterBuiltins (builtins );
628
657
return builtins .toArray (new PythonBuiltins [builtins .size ()]);
629
658
}
630
659
@@ -762,7 +791,7 @@ public final void postInitialize() {
762
791
763
792
for (PythonBuiltins builtin : builtins ) {
764
793
CoreFunctions annotation = builtin .getClass ().getAnnotation (CoreFunctions .class );
765
- if (annotation .isEager ()) {
794
+ if (annotation .isEager () || annotation . extendClasses (). length != 0 ) {
766
795
builtin .postInitialize (this );
767
796
}
768
797
}
@@ -792,6 +821,11 @@ public final PythonModule getBuiltins() {
792
821
return builtinsModule ;
793
822
}
794
823
824
+ public final void registerTypeInBuiltins (String name , PythonBuiltinClassType type ) {
825
+ assert builtinsModule != null : "builtins module was not yet initialized: cannot register type" ;
826
+ builtinsModule .setAttribute (name , lookupType (type ));
827
+ }
828
+
795
829
public final PythonModule getSysModule () {
796
830
return sysModule ;
797
831
}
@@ -1056,16 +1090,13 @@ public final RuntimeException raiseInvalidSyntax(PythonParser.ErrorType type, No
1056
1090
break ;
1057
1091
}
1058
1092
instance = factory ().createBaseException (cls , message , arguments );
1093
+ final Object [] excAttrs = SYNTAX_ERROR_ATTR_FACTORY .create ();
1059
1094
SourceSection section = location .getSourceSection ();
1060
1095
Source source = section .getSource ();
1061
1096
String path = source .getPath ();
1062
- instance .setAttribute ("filename" , path != null ? path : source .getName () != null ? source .getName () : "<string>" );
1063
- // Not very nice. This counts on the implementation in traceback.py where if the value of
1064
- // text attribute
1065
- // is NONE, then the line is not printed
1066
- instance .setAttribute ("text" , section .isAvailable () ? source .getCharacters (section .getStartLine ()) : PNone .NONE );
1067
- instance .setAttribute ("lineno" , section .getStartLine ());
1068
- instance .setAttribute ("offset" , section .getStartColumn ());
1097
+ excAttrs [SyntaxErrorBuiltins .IDX_FILENAME ] = (path != null ) ? path : source .getName () != null ? source .getName () : "<string>" ;
1098
+ excAttrs [SyntaxErrorBuiltins .IDX_LINENO ] = section .getStartLine ();
1099
+ excAttrs [SyntaxErrorBuiltins .IDX_OFFSET ] = section .getStartColumn ();
1069
1100
String msg = "invalid syntax" ;
1070
1101
if (type == PythonParser .ErrorType .Print ) {
1071
1102
CharSequence line = source .getCharacters (section .getStartLine ());
@@ -1086,7 +1117,12 @@ public final RuntimeException raiseInvalidSyntax(PythonParser.ErrorType type, No
1086
1117
} else if (message != null ) {
1087
1118
msg = (new ErrorMessageFormatter ()).format (message , arguments );
1088
1119
}
1089
- instance .setAttribute ("msg" , msg );
1120
+ // Not very nice. This counts on the implementation in traceback.py where if the value of
1121
+ // text attribute is NONE, then the line is not printed
1122
+ final String text = section .isAvailable () ? source .getCharacters (section .getStartLine ()).toString () : null ;
1123
+ excAttrs [SyntaxErrorBuiltins .IDX_MSG ] = msg ;
1124
+ excAttrs [SyntaxErrorBuiltins .IDX_TEXT ] = text ;
1125
+ instance .setExceptionAttributes (excAttrs );
1090
1126
throw PException .fromObject (instance , location , PythonOptions .isPExceptionWithJavaStacktrace (getLanguage ()));
1091
1127
}
1092
1128
0 commit comments