23
23
import java .util .concurrent .ConcurrentHashMap ;
24
24
import java .util .concurrent .ConcurrentMap ;
25
25
26
+ import com .oracle .truffle .api .object .Shape ;
26
27
import org .jcodings .specific .USASCIIEncoding ;
27
28
import org .jcodings .transcode .EConvFlags ;
28
29
import org .truffleruby .Layouts ;
@@ -319,16 +320,12 @@ public CoreLibrary(RubyContext context) {
319
320
// Create the cyclic classes and modules
320
321
321
322
classClass = ClassNodes .createClassClass (context );
322
- classClass .instanceShape = language .classShape ;
323
323
324
- basicObjectClass = ClassNodes .createBootClass (context , classClass , Nil .INSTANCE , "BasicObject" );
325
- basicObjectClass .instanceShape = language .basicObjectShape ;
326
-
327
- objectClass = ClassNodes .createBootClass (context , classClass , basicObjectClass , "Object" );
328
- objectClass .instanceShape = language .basicObjectShape ;
329
-
330
- moduleClass = ClassNodes .createBootClass (context , classClass , objectClass , "Module" );
331
- moduleClass .instanceShape = language .moduleShape ;
324
+ basicObjectClass = ClassNodes
325
+ .createBootClass (context , classClass , Nil .INSTANCE , "BasicObject" , language .basicObjectShape );
326
+ objectClass = ClassNodes
327
+ .createBootClass (context , classClass , basicObjectClass , "Object" , language .basicObjectShape );
328
+ moduleClass = ClassNodes .createBootClass (context , classClass , objectClass , "Module" , language .moduleShape );
332
329
333
330
// Close the cycles
334
331
// Set superclass of Class to Module
@@ -343,8 +340,7 @@ public CoreLibrary(RubyContext context) {
343
340
// Create Exception classes
344
341
345
342
// Exception
346
- exceptionClass = defineClass ("Exception" );
347
- exceptionClass .instanceShape = RubyLanguage .exceptionShape ;
343
+ exceptionClass = defineClass ("Exception" , RubyLanguage .exceptionShape );
348
344
349
345
// fatal
350
346
defineClass (exceptionClass , "fatal" );
@@ -384,14 +380,11 @@ public CoreLibrary(RubyContext context) {
384
380
defineClass (ioErrorClass , "EOFError" );
385
381
386
382
// StandardError > NameError
387
- nameErrorClass = defineClass (standardErrorClass , "NameError" );
388
- nameErrorClass .instanceShape = RubyLanguage .nameErrorShape ;
389
- noMethodErrorClass = defineClass (nameErrorClass , "NoMethodError" );
390
- noMethodErrorClass .instanceShape = RubyLanguage .noMethodErrorShape ;
383
+ nameErrorClass = defineClass (standardErrorClass , "NameError" , RubyLanguage .nameErrorShape );
384
+ noMethodErrorClass = defineClass (nameErrorClass , "NoMethodError" , RubyLanguage .noMethodErrorShape );
391
385
392
386
// StandardError > SystemCallError
393
- systemCallErrorClass = defineClass (standardErrorClass , "SystemCallError" );
394
- systemCallErrorClass .instanceShape = RubyLanguage .systemCallErrorShape ;
387
+ systemCallErrorClass = defineClass (standardErrorClass , "SystemCallError" , RubyLanguage .systemCallErrorShape );
395
388
396
389
errnoModule = defineModule ("Errno" );
397
390
@@ -424,66 +417,49 @@ public CoreLibrary(RubyContext context) {
424
417
425
418
// Classes defined in Object
426
419
427
- arrayClass = defineClass ("Array" );
428
- arrayClass .instanceShape = RubyLanguage .arrayShape ;
429
- bindingClass = defineClass ("Binding" );
430
- bindingClass .instanceShape = RubyLanguage .bindingShape ;
431
- RubyClass conditionVariableClass = defineClass ("ConditionVariable" );
432
- conditionVariableClass .instanceShape = RubyLanguage .conditionVariableShape ;
420
+ arrayClass = defineClass ("Array" , RubyLanguage .arrayShape );
421
+ bindingClass = defineClass ("Binding" , RubyLanguage .bindingShape );
422
+ defineClass ("ConditionVariable" , RubyLanguage .conditionVariableShape );
433
423
defineClass ("Data" ); // Needed by Socket::Ifaddr and defined in core MRI
434
424
dirClass = defineClass ("Dir" );
435
- encodingClass = defineClass ("Encoding" );
436
- encodingClass .instanceShape = RubyLanguage .encodingShape ;
425
+ encodingClass = defineClass ("Encoding" , RubyLanguage .encodingShape );
437
426
falseClass = defineClass ("FalseClass" );
438
- fiberClass = defineClass ("Fiber" );
439
- fiberClass .instanceShape = RubyLanguage .fiberShape ;
427
+ fiberClass = defineClass ("Fiber" , RubyLanguage .fiberShape );
440
428
defineModule ("FileTest" );
441
- hashClass = defineClass ("Hash" );
442
- hashClass .instanceShape = RubyLanguage .hashShape ;
443
- matchDataClass = defineClass ("MatchData" );
444
- matchDataClass .instanceShape = RubyLanguage .matchDataShape ;
445
- methodClass = defineClass ("Method" );
446
- methodClass .instanceShape = RubyLanguage .methodShape ;
447
- RubyClass mutexClass = defineClass ("Mutex" );
448
- mutexClass .instanceShape = RubyLanguage .mutexShape ;
429
+ hashClass = defineClass ("Hash" , RubyLanguage .hashShape );
430
+ matchDataClass = defineClass ("MatchData" , RubyLanguage .matchDataShape );
431
+ methodClass = defineClass ("Method" , RubyLanguage .methodShape );
432
+ defineClass ("Mutex" , RubyLanguage .mutexShape );
449
433
nilClass = defineClass ("NilClass" );
450
- procClass = defineClass ("Proc" );
451
- procClass .instanceShape = RubyLanguage .procShape ;
434
+ procClass = defineClass ("Proc" , RubyLanguage .procShape );
452
435
453
436
processModule = defineModule ("Process" );
454
- RubyClass queueClass = defineClass ("Queue" );
455
- queueClass .instanceShape = RubyLanguage .queueShape ;
456
- RubyClass sizedQueueClass = defineClass (queueClass , "SizedQueue" );
457
- sizedQueueClass .instanceShape = RubyLanguage .sizedQueueShape ;
458
- rangeClass = defineClass ("Range" );
459
- rangeClass .instanceShape = RubyLanguage .objectRangeShape ;
460
-
461
- regexpClass = defineClass ("Regexp" );
462
- regexpClass .instanceShape = RubyLanguage .regexpShape ;
463
- stringClass = defineClass ("String" );
464
- stringClass .instanceShape = RubyLanguage .stringShape ;
437
+ RubyClass queueClass = defineClass ("Queue" , RubyLanguage .queueShape );
438
+ defineClass (queueClass , "SizedQueue" , RubyLanguage .sizedQueueShape );
439
+ rangeClass = defineClass ("Range" , RubyLanguage .objectRangeShape );
440
+
441
+ regexpClass = defineClass ("Regexp" , RubyLanguage .regexpShape );
442
+ stringClass = defineClass ("String" , RubyLanguage .stringShape );
465
443
symbolClass = defineClass ("Symbol" );
466
444
467
- threadClass = defineClass ("Thread" );
445
+ threadClass = defineClass ("Thread" , RubyLanguage . threadShape );
468
446
DynamicObjectLibrary .getUncached ().put (threadClass , "@report_on_exception" , true );
469
447
DynamicObjectLibrary .getUncached ().put (threadClass , "@abort_on_exception" , false );
470
- threadClass .instanceShape = RubyLanguage .threadShape ;
471
448
472
449
RubyClass threadBacktraceClass = defineClass (threadClass , objectClass , "Backtrace" );
473
- threadBacktraceLocationClass = defineClass (threadBacktraceClass , objectClass , "Location" );
474
- threadBacktraceLocationClass .instanceShape = RubyLanguage .threadBacktraceLocationShape ;
475
- RubyClass timeClass = defineClass ("Time" );
476
- timeClass .instanceShape = RubyLanguage .timeShape ;
450
+ threadBacktraceLocationClass = defineClass (
451
+ threadBacktraceClass ,
452
+ objectClass ,
453
+ "Location" ,
454
+ RubyLanguage .threadBacktraceLocationShape );
455
+ defineClass ("Time" , RubyLanguage .timeShape );
477
456
trueClass = defineClass ("TrueClass" );
478
- unboundMethodClass = defineClass ("UnboundMethod" );
479
- unboundMethodClass .instanceShape = RubyLanguage .unboundMethodShape ;
480
- ioClass = defineClass ("IO" );
481
- ioClass .instanceShape = RubyLanguage .ioShape ;
457
+ unboundMethodClass = defineClass ("UnboundMethod" , RubyLanguage .unboundMethodShape );
458
+ ioClass = defineClass ("IO" , RubyLanguage .ioShape );
482
459
defineClass (ioClass , "File" );
483
460
structClass = defineClass ("Struct" );
484
461
485
- final RubyClass tracePointClass = defineClass ("TracePoint" );
486
- tracePointClass .instanceShape = RubyLanguage .tracePointShape ;
462
+ defineClass ("TracePoint" , RubyLanguage .tracePointShape );
487
463
488
464
// Modules
489
465
@@ -494,8 +470,7 @@ public CoreLibrary(RubyContext context) {
494
470
defineModule ("Math" );
495
471
objectSpaceModule = defineModule ("ObjectSpace" );
496
472
497
- weakMapClass = defineClass (objectSpaceModule , objectClass , "WeakMap" );
498
- weakMapClass .instanceShape = RubyLanguage .weakMapShape ;
473
+ weakMapClass = defineClass (objectSpaceModule , objectClass , "WeakMap" , RubyLanguage .weakMapShape );
499
474
500
475
// The rest
501
476
@@ -505,11 +480,13 @@ public CoreLibrary(RubyContext context) {
505
480
encodingErrorClass ,
506
481
"UndefinedConversionError" );
507
482
508
- encodingConverterClass = defineClass (encodingClass , objectClass , "Converter" );
509
- encodingConverterClass .instanceShape = RubyLanguage .encodingConverterShape ;
483
+ encodingConverterClass = defineClass (
484
+ encodingClass ,
485
+ objectClass ,
486
+ "Converter" ,
487
+ RubyLanguage .encodingConverterShape );
510
488
final RubyModule truffleRubyModule = defineModule ("TruffleRuby" );
511
- RubyClass atomicReferenceClass = defineClass (truffleRubyModule , objectClass , "AtomicReference" );
512
- atomicReferenceClass .instanceShape = RubyLanguage .atomicReferenceShape ;
489
+ defineClass (truffleRubyModule , objectClass , "AtomicReference" , RubyLanguage .atomicReferenceShape );
513
490
truffleModule = defineModule ("Truffle" );
514
491
truffleInternalModule = defineModule (truffleModule , "Internal" );
515
492
graalErrorClass = defineClass (truffleModule , exceptionClass , "GraalError" );
@@ -559,33 +536,31 @@ public CoreLibrary(RubyContext context) {
559
536
defineModule (truffleModule , "ReadlineHistory" );
560
537
truffleThreadOperationsModule = defineModule (truffleModule , "ThreadOperations" );
561
538
defineModule (truffleModule , "WeakRefOperations" );
562
- handleClass = defineClass (truffleModule , objectClass , "Handle" );
563
- handleClass .instanceShape = RubyLanguage .handleShape ;
539
+ handleClass = defineClass (truffleModule , objectClass , "Handle" , RubyLanguage .handleShape );
564
540
warningModule = defineModule ("Warning" );
565
541
566
- bigDecimalClass = defineClass (numericClass , "BigDecimal" );
567
- bigDecimalClass .instanceShape = RubyLanguage .bigDecimalShape ;
542
+ bigDecimalClass = defineClass (numericClass , "BigDecimal" , RubyLanguage .bigDecimalShape );
568
543
bigDecimalOperationsModule = defineModule (truffleModule , "BigDecimalOperations" );
569
544
570
545
truffleFFIModule = defineModule (truffleModule , "FFI" );
571
546
RubyClass truffleFFIAbstractMemoryClass = defineClass (truffleFFIModule , objectClass , "AbstractMemory" );
572
- truffleFFIPointerClass = defineClass (truffleFFIModule , truffleFFIAbstractMemoryClass , "Pointer" );
573
- truffleFFIPointerClass .instanceShape = RubyLanguage .truffleFFIPointerShape ;
547
+ truffleFFIPointerClass = defineClass (
548
+ truffleFFIModule ,
549
+ truffleFFIAbstractMemoryClass ,
550
+ "Pointer" ,
551
+ RubyLanguage .truffleFFIPointerShape );
574
552
truffleFFINullPointerErrorClass = defineClass (truffleFFIModule , runtimeErrorClass , "NullPointerError" );
575
553
576
554
truffleTypeModule = defineModule (truffleModule , "Type" );
577
555
578
- byteArrayClass = defineClass (truffleModule , objectClass , "ByteArray" );
579
- byteArrayClass .instanceShape = RubyLanguage .byteArrayShape ;
556
+ byteArrayClass = defineClass (truffleModule , objectClass , "ByteArray" , RubyLanguage .byteArrayShape );
580
557
defineClass (truffleModule , objectClass , "StringData" );
581
558
defineClass (encodingClass , objectClass , "Transcoding" );
582
- randomizerClass = defineClass (truffleModule , objectClass , "Randomizer" );
583
- randomizerClass .instanceShape = RubyLanguage .randomizerShape ;
559
+ randomizerClass = defineClass (truffleModule , objectClass , "Randomizer" , RubyLanguage .randomizerShape );
584
560
585
561
// Standard library
586
562
587
- digestClass = defineClass (truffleModule , basicObjectClass , "Digest" );
588
- digestClass .instanceShape = RubyLanguage .digestShape ;
563
+ digestClass = defineClass (truffleModule , basicObjectClass , "Digest" , RubyLanguage .digestShape );
589
564
590
565
// Include the core modules
591
566
@@ -781,12 +756,24 @@ private RubyClass defineClass(String name) {
781
756
return defineClass (objectClass , name );
782
757
}
783
758
759
+ private RubyClass defineClass (String name , Shape instanceShape ) {
760
+ return defineClass (objectClass , name , instanceShape );
761
+ }
762
+
784
763
private RubyClass defineClass (RubyClass superclass , String name ) {
785
- return ClassNodes .createInitializedRubyClass (context , null , objectClass , superclass , name );
764
+ return defineClass (superclass , name , superclass .instanceShape );
765
+ }
766
+
767
+ private RubyClass defineClass (RubyClass superclass , String name , Shape instanceShape ) {
768
+ return ClassNodes .createInitializedRubyClass (context , null , objectClass , superclass , name , instanceShape );
786
769
}
787
770
788
771
private RubyClass defineClass (RubyModule lexicalParent , RubyClass superclass , String name ) {
789
- return ClassNodes .createInitializedRubyClass (context , null , lexicalParent , superclass , name );
772
+ return defineClass (lexicalParent , superclass , name , superclass .instanceShape );
773
+ }
774
+
775
+ private RubyClass defineClass (RubyModule lexicalParent , RubyClass superclass , String name , Shape instanceShape ) {
776
+ return ClassNodes .createInitializedRubyClass (context , null , lexicalParent , superclass , name , instanceShape );
790
777
}
791
778
792
779
private RubyModule defineModule (String name ) {
0 commit comments