Skip to content

Commit 45e9520

Browse files
authored
Merge pull request jruby#8545 from enebo/alloc_again
Reduce getRuntime() and make alloc use TC
2 parents 4e8f7e3 + fb41bdc commit 45e9520

36 files changed

+242
-199
lines changed

core/src/main/java/org/jruby/MetaClass.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.jruby.util.log.Logger;
3737
import org.jruby.util.log.LoggerFactory;
3838

39+
import static org.jruby.api.Access.classClass;
3940
import static org.jruby.api.Error.typeError;
4041

4142
public final class MetaClass extends RubyClass {
@@ -46,7 +47,7 @@ public MetaClass(Ruby runtime, RubyClass superClass, IRubyObject attached) {
4647
}
4748

4849
/**
49-
* rb_class_boot for meta classes ({@link #makeMetaClass(RubyClass)})
50+
* rb_class_boot for meta classes ({@link #makeMetaClass(ThreadContext, RubyClass)})
5051
*/
5152
MetaClass(Ruby runtime, RubyClass superClass, RubyBasicObject attached) {
5253
super(runtime, superClass, false);
@@ -104,8 +105,8 @@ public boolean isSingleton() {
104105
* @return singleton-class for this (singleton) class
105106
*/
106107
@Override
107-
public RubyClass makeMetaClass(RubyClass superClass) {
108-
MetaClass klass = new MetaClass(runtime, getSuperSingletonMetaClass(), this);
108+
public RubyClass makeMetaClass(ThreadContext context, RubyClass superClass) {
109+
MetaClass klass = new MetaClass(context.runtime, getSuperSingletonMetaClass(context), this);
109110
setMetaClass(klass);
110111

111112
// Foo.singleton_class.singleton_class: #<Class:#<Class:Foo>>
@@ -115,23 +116,23 @@ public RubyClass makeMetaClass(RubyClass superClass) {
115116
return klass;
116117
}
117118

118-
private RubyClass getSuperSingletonMetaClass() {
119+
private RubyClass getSuperSingletonMetaClass(ThreadContext context) {
119120
if (attached instanceof RubyClass att) {
120121
RubyClass superClass = att.superClass();
121122
if (superClass != null) superClass = superClass.getRealClass();
122123
// #<Class:BasicObject>'s singleton class == Class.singleton_class
123124
// Context should be safe here as we never make a metaclass from a metaclass before first TC is made.
124-
var context = getRuntime().getCurrentContext();
125-
if (superClass == null) return runtime.getClassClass().singletonClass(context);
126-
return superClass.getMetaClass().singletonClass(context);
125+
return superClass == null ?
126+
classClass(context).singletonClass(context) :
127+
superClass.getMetaClass().singletonClass(context);
127128
}
128129

129130
return getSuperClass().getRealClass().getMetaClass(); // NOTE: is this correct?
130131
}
131132

132133
@Override
133-
RubyClass toSingletonClass(RubyBasicObject target) {
134-
return attached == target ? this : super.toSingletonClass(target);
134+
RubyClass toSingletonClass(ThreadContext context, RubyBasicObject target) {
135+
return attached == target ? this : super.toSingletonClass(context, target);
135136
}
136137

137138
@Override

core/src/main/java/org/jruby/Ruby.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -335,11 +335,11 @@ private Ruby(RubyInstanceConfig config) {
335335
classClass.setMetaClass(classClass);
336336
refinementClass.setMetaClass(classClass);
337337

338-
var metaClass = basicObjectClass.makeMetaClassBootstrap(classClass, classClass);
339-
metaClass = objectClass.makeMetaClassBootstrap(metaClass, classClass);
340-
metaClass = moduleClass.makeMetaClassBootstrap(metaClass, classClass);
341-
classClass.makeMetaClassBootstrap(metaClass, classClass);
342-
refinementClass.makeMetaClassBootstrap(metaClass, classClass);
338+
var metaClass = basicObjectClass.makeMetaClassBootstrap(this, classClass, classClass);
339+
metaClass = objectClass.makeMetaClassBootstrap(this, metaClass, classClass);
340+
metaClass = moduleClass.makeMetaClassBootstrap(this, metaClass, classClass);
341+
classClass.makeMetaClassBootstrap(this, metaClass, classClass);
342+
refinementClass.makeMetaClassBootstrap(this, metaClass, classClass);
343343

344344
RubyObject.finishObjectClass(objectClass);
345345
RubyModule.finishModuleClass(moduleClass);
@@ -361,9 +361,9 @@ private Ruby(RubyInstanceConfig config) {
361361

362362
// nil, true, and false all are set in TC so they need to be created above (both class and instances).
363363
// their methods are added afterward since no dispatch happens until after first TC is defined.
364-
nilClass = RubyClass.newClassBootstrap(this, objectClass, "NilClass");
365-
falseClass = RubyClass.newClassBootstrap(this, objectClass, "FalseClass");
366-
trueClass = RubyClass.newClassBootstrap(this, objectClass, "TrueClass");
364+
nilClass = RubyClass.newClassBootstrap(this, objectClass, classClass, "NilClass");
365+
falseClass = RubyClass.newClassBootstrap(this, objectClass, classClass, "FalseClass");
366+
trueClass = RubyClass.newClassBootstrap(this, objectClass, classClass, "TrueClass");
367367

368368
nilObject = new RubyNil(this, nilClass);
369369
nilPrefilledArray = new IRubyObject[NIL_PREFILLED_ARRAY_SIZE];

core/src/main/java/org/jruby/RubyArray.java

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -516,10 +516,9 @@ private void alloc(int length) {
516516

517517
private void realloc(ThreadContext context, int newLength, int valuesLength) {
518518
unpack(context);
519-
Ruby runtime = metaClass.runtime;
520-
IRubyObject[] reallocated = IRubyObject.array(validateBufferLength(runtime, newLength));
519+
IRubyObject[] reallocated = IRubyObject.array(validateBufferLength(context.runtime, newLength));
521520
if (newLength > valuesLength) {
522-
Helpers.fillNil(reallocated, valuesLength, newLength, runtime);
521+
Helpers.fillNil(reallocated, valuesLength, newLength, context.runtime);
523522
safeArrayCopy(context, values, begin, reallocated, 0, valuesLength); // elements and trailing nils
524523
} else {
525524
safeArrayCopy(context, values, begin, reallocated, 0, newLength); // ???
@@ -625,7 +624,7 @@ protected RubyArray<?> makeShared() {
625624
}
626625

627626
private RubyArray makeShared(ThreadContext context, int beg, int len, RubyClass klass) {
628-
return makeShared(context, beg, len, new RubyArray(klass.runtime, klass));
627+
return makeShared(context, beg, len, new RubyArray(context.runtime, klass));
629628
}
630629

631630
private final RubyArray makeShared(ThreadContext context, int beg, int len, RubyArray sharedArray) {
@@ -1131,7 +1130,7 @@ private void splice(ThreadContext context, int beg, int len, final RubyArray rpl
11311130
int valuesLength = values.length - begin;
11321131
if (beg >= realLength) {
11331132
len = beg + rlen;
1134-
if (len >= valuesLength) spliceRealloc(len, valuesLength);
1133+
if (len >= valuesLength) spliceRealloc(context, len, valuesLength);
11351134
try {
11361135
Helpers.fillNil(values, begin + realLength, begin + beg, context.runtime);
11371136
} catch (ArrayIndexOutOfBoundsException e) {
@@ -1141,7 +1140,7 @@ private void splice(ThreadContext context, int beg, int len, final RubyArray rpl
11411140
} else {
11421141
if (beg + len > realLength) len = realLength - beg;
11431142
int alen = realLength + rlen - len;
1144-
if (alen >= valuesLength) spliceRealloc(alen, valuesLength);
1143+
if (alen >= valuesLength) spliceRealloc(context, alen, valuesLength);
11451144

11461145
if (len != rlen) {
11471146
safeArrayCopy(context, values, begin + (beg + len), values, begin + beg + rlen, realLength - (beg + len));
@@ -1166,13 +1165,13 @@ private final void spliceOne(ThreadContext context, long beg, IRubyObject rpl) {
11661165
int valuesLength = values.length - begin;
11671166
if (beg >= realLength) {
11681167
int len = (int) beg + 1;
1169-
if (len >= valuesLength) spliceRealloc(len, valuesLength);
1170-
Helpers.fillNil(values, begin + realLength, begin + ((int) beg), metaClass.runtime);
1168+
if (len >= valuesLength) spliceRealloc(context, len, valuesLength);
1169+
Helpers.fillNil(values, begin + realLength, begin + ((int) beg), context.runtime);
11711170
realLength = len;
11721171
} else {
11731172
int len = beg > realLength ? realLength - (int) beg : 0;
11741173
int alen = realLength + 1 - len;
1175-
if (alen >= valuesLength) spliceRealloc(alen, valuesLength);
1174+
if (alen >= valuesLength) spliceRealloc(context, alen, valuesLength);
11761175

11771176
if (len == 0) {
11781177
safeArrayCopy(context, values, begin + (int) beg, values, begin + (int) beg + 1, realLength - (int) beg);
@@ -1183,33 +1182,29 @@ private final void spliceOne(ThreadContext context, long beg, IRubyObject rpl) {
11831182
safeArraySet(context, values, begin + (int) beg, rpl);
11841183
}
11851184

1186-
private void spliceRealloc(int length, int valuesLength) {
1187-
Ruby runtime = metaClass.runtime;
1188-
1189-
int tryLength = calculateBufferLength(runtime, valuesLength);
1185+
private void spliceRealloc(ThreadContext context, int length, int valuesLength) {
1186+
int tryLength = calculateBufferLength(context.runtime, valuesLength);
11901187
int len = length > tryLength ? length : tryLength;
11911188
IRubyObject[] vals = IRubyObject.array(len);
11921189
System.arraycopy(values, begin, vals, 0, realLength);
11931190

11941191
// only fill if there actually will remain trailing storage
11951192
if (len > length) {
1196-
Helpers.fillNil(vals, length, len, runtime);
1193+
Helpers.fillNil(vals, length, len, context.runtime);
11971194
}
11981195
begin = 0;
11991196
values = vals;
12001197
}
12011198

12021199
private void unshiftRealloc(ThreadContext context, int valuesLength) {
1203-
Ruby runtime = metaClass.runtime;
1204-
12051200
int newLength = valuesLength >> 1;
12061201
if (newLength < ARRAY_DEFAULT_SIZE) newLength = ARRAY_DEFAULT_SIZE;
12071202

1208-
newLength = addBufferLength(runtime, valuesLength, newLength);
1203+
newLength = addBufferLength(context.runtime, valuesLength, newLength);
12091204

12101205
IRubyObject[] vals = IRubyObject.array(newLength);
12111206
safeArrayCopy(context, values, begin, vals, 1, valuesLength);
1212-
Helpers.fillNil(vals, valuesLength + 1, newLength, runtime);
1207+
Helpers.fillNil(vals, valuesLength + 1, newLength, context.runtime);
12131208
values = vals;
12141209
begin = 0;
12151210
}
@@ -3773,11 +3768,11 @@ private void setValuesFrom(ThreadContext context, RubyHash hash) {
37733768
}
37743769
}
37753770

3776-
private void clearValues(final int from, final int to) {
3771+
private void clearValues(ThreadContext context, final int from, final int to) {
37773772
try {
3778-
Helpers.fillNil(values, begin + from, begin + to, metaClass.runtime);
3773+
Helpers.fillNil(values, begin + from, begin + to, context.runtime);
37793774
} catch (ArrayIndexOutOfBoundsException ex) {
3780-
throw concurrentModification(getRuntime().getCurrentContext(), ex);
3775+
throw concurrentModification(context, ex);
37813776
}
37823777
}
37833778

@@ -3793,7 +3788,7 @@ public IRubyObject uniq_bang(ThreadContext context) {
37933788
unpack(context);
37943789

37953790
setValuesFrom(context, hash);
3796-
clearValues(newLength, realLength);
3791+
clearValues(context, newLength, realLength);
37973792
realLength = newLength;
37983793

37993794
return this;
@@ -3814,7 +3809,7 @@ public IRubyObject uniq_bang(ThreadContext context, Block block) {
38143809
unpack(context);
38153810

38163811
setValuesFrom(context, hash);
3817-
clearValues(newLength, realLength);
3812+
clearValues(context, newLength, realLength);
38183813
realLength = newLength;
38193814

38203815
return this;
@@ -5798,7 +5793,7 @@ public boolean add(Object element) {
57985793
}
57995794

58005795
public boolean add(ThreadContext context, Object element) {
5801-
append(context, JavaUtil.convertJavaToUsableRubyObject(metaClass.runtime, element));
5796+
append(context, JavaUtil.convertJavaToUsableRubyObject(context.runtime, element));
58025797
return true;
58035798
}
58045799

core/src/main/java/org/jruby/RubyBasicObject.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -478,21 +478,26 @@ public RubyClass getSingletonClass() {
478478
// MRI: rb_singleton_class
479479
@JRubyAPI
480480
public RubyClass singletonClass(ThreadContext context) {
481-
RubyClass klass = metaClass.toSingletonClass(this);
481+
RubyClass klass = metaClass.toSingletonClass(context, this);
482482

483483
if (isFrozen()) klass.setFrozen(true);
484484

485485
return klass;
486486
}
487487

488+
@Deprecated(since = "10.0")
489+
public RubyClass makeMetaClass(RubyClass superClass) {
490+
return makeMetaClass(getCurrentContext(), superClass);
491+
}
492+
488493
/** rb_make_metaclass
489494
*
490495
* Will create a new meta class, insert this in the chain of
491496
* classes for this specific object, and return the generated meta
492497
* class.
493498
*/
494-
public RubyClass makeMetaClass(RubyClass superClass) {
495-
MetaClass klass = new MetaClass(getRuntime(), superClass, this); // rb_class_boot
499+
public RubyClass makeMetaClass(ThreadContext context, RubyClass superClass) {
500+
MetaClass klass = new MetaClass(context.runtime, superClass, this); // rb_class_boot
496501
setMetaClass(klass);
497502

498503
klass.setMetaClass(superClass.getRealClass().metaClass);
@@ -503,13 +508,13 @@ public RubyClass makeMetaClass(RubyClass superClass) {
503508
/**
504509
* This will create a new metaclass. This is only used during bootstrapping before
505510
* the initial ThreadContext is defined. Normal needs of making a metaclass should use
506-
* {@link RubyBasicObject#makeMetaClass(RubyClass)}
511+
* {@link RubyBasicObject#makeMetaClass(ThreadContext, RubyClass)}
507512
* @param superClass
508513
* @param Class
509514
* @return
510515
*/
511-
public RubyClass makeMetaClassBootstrap(RubyClass superClass, RubyClass Class) {
512-
MetaClass klass = new MetaClass(getRuntime(), superClass, Class, this); // rb_class_boot
516+
public RubyClass makeMetaClassBootstrap(Ruby runtime, RubyClass superClass, RubyClass Class) {
517+
MetaClass klass = new MetaClass(runtime, superClass, Class, this); // rb_class_boot
513518
setMetaClass(klass);
514519

515520
klass.setMetaClass(superClass.getRealClass().metaClass);
@@ -1279,7 +1284,7 @@ public IRubyObject addFinalizer(ThreadContext context, IRubyObject f) {
12791284

12801285
finalizer = new Finalizer(fixnumId);
12811286
setInternalVariable("__finalizer__", finalizer);
1282-
getRuntime().addFinalizer(finalizer);
1287+
context.runtime.addFinalizer(finalizer);
12831288
}
12841289
return finalizer.addFinalizer(context, f);
12851290
}
@@ -2471,9 +2476,10 @@ public IRubyObject singleton_method(IRubyObject name) {
24712476
* m = l.method("hello")
24722477
* m.call #=&gt; "Hello, {@literal @}iv = Fred"
24732478
*/
2479+
@Deprecated(since = "10.0")
24742480
public IRubyObject method(IRubyObject name) {
24752481
final RubySymbol symbol = TypeConverter.checkID(name);
2476-
return getMetaClass().newMethod(getRuntime().getCurrentContext(), this, symbol.idString(), null, true, null, true, true);
2482+
return getMetaClass().newMethod(getCurrentContext(), this, symbol.idString(), null, true, null, true, true);
24772483
}
24782484

24792485
@Deprecated(since = "10.0")

core/src/main/java/org/jruby/RubyBignum.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1162,7 +1162,7 @@ public IRubyObject to_f() {
11621162

11631163
@Deprecated
11641164
public IRubyObject abs() {
1165-
return abs(metaClass.runtime.getCurrentContext());
1165+
return abs(getCurrentContext());
11661166
}
11671167

11681168
/** rb_big_abs

core/src/main/java/org/jruby/RubyClass.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ public static RubyClass newClass(Ruby runtime, RubyClass superClass, String name
530530
allocator(allocator).
531531
baseName(name);
532532

533-
clazz.makeMetaClass(superClass.getMetaClass());
533+
clazz.makeMetaClass(context, superClass.getMetaClass());
534534
if (setParent) clazz.setParent(parent);
535535
parent.defineConstant(context, name, clazz);
536536
superClass.invokeInherited(context, superClass, clazz);
@@ -549,7 +549,7 @@ public static RubyClass newClass(ThreadContext context, RubyClass superClass, St
549549
RubyClass clazz = newClass(context, superClass, null).
550550
allocator(allocator).
551551
baseName(name);
552-
clazz.makeMetaClass(superClass.getMetaClass());
552+
clazz.makeMetaClass(context, superClass.getMetaClass());
553553
if (setParent) clazz.setParent(parent);
554554
parent.setConstant(context, name, clazz, file, line);
555555
superClass.invokeInherited(context, superClass, clazz);
@@ -571,7 +571,7 @@ public static RubyClass newClass(ThreadContext context, RubyClass superClass, St
571571
RubyClass clazz = newClass(context, superClass, extraCallSites).
572572
allocator(allocator).
573573
baseName(name);
574-
clazz.makeMetaClass(superClass.getMetaClass());
574+
clazz.makeMetaClass(context, superClass.getMetaClass());
575575
if (setParent) clazz.setParent(parent);
576576
parent.setConstant(context, name, clazz, BUILTIN_CONSTANT, -1);
577577
superClass.invokeInherited(context, superClass, clazz);
@@ -587,21 +587,26 @@ public static RubyClass newClass(ThreadContext context, RubyClass superClass, St
587587
* @param name the name of the new class
588588
* @return the new class.
589589
*/
590-
public static RubyClass newClassBootstrap(Ruby runtime, RubyClass Object, String name) {
590+
public static RubyClass newClassBootstrap(Ruby runtime, RubyClass Object, RubyClass Class, String name) {
591591
RubyClass clazz = new RubyClass(runtime, Object).
592592
allocator(NOT_ALLOCATABLE_ALLOCATOR).
593593
baseName(name);
594-
clazz.makeMetaClass(Object.getMetaClass());
594+
clazz.makeMetaClassBootstrap(runtime, Object.getMetaClass(), Class);
595595
Object.defineConstantBootstrap(name, clazz);
596596
return clazz;
597597
}
598598

599+
@Deprecated(since = "10.0")
600+
RubyClass toSingletonClass(RubyBasicObject target) {
601+
return toSingletonClass(getCurrentContext(), target);
602+
}
603+
599604
/**
600605
* @see #singletonClass(ThreadContext)
601606
*/
602-
RubyClass toSingletonClass(RubyBasicObject target) {
607+
RubyClass toSingletonClass(ThreadContext context, RubyBasicObject target) {
603608
// replaced after makeMetaClass with MetaClass's toSingletonClass
604-
return target.makeMetaClass(this);
609+
return target.makeMetaClass(context, this);
605610
}
606611

607612
static boolean notVisibleAndNotMethodMissing(DynamicMethod method, String name, IRubyObject caller, CallType callType) {
@@ -1066,12 +1071,12 @@ public IRubyObject initialize(ThreadContext context, IRubyObject superObject, Bl
10661071
private RubyClass initializeCommon(ThreadContext context, RubyClass superClazz, Block block) {
10671072
superClass(superClazz);
10681073
allocator = superClazz.allocator;
1069-
makeMetaClass(superClazz.getMetaClass());
1074+
makeMetaClass(context, superClazz.getMetaClass());
10701075
superClazz.addSubclass(this);
10711076

10721077
marshal = superClazz.marshal;
10731078

1074-
superClazz.invokeInherited(runtime.getCurrentContext(), superClazz, this);
1079+
superClazz.invokeInherited(context, superClazz, this);
10751080
super.initialize(context, block);
10761081

10771082
return this;
@@ -1431,7 +1436,7 @@ private void checkNotInitialized(ThreadContext context) {
14311436
*/
14321437
@Deprecated
14331438
public static void checkInheritable(IRubyObject superClass) {
1434-
checkInheritable(superClass.getRuntime().getCurrentContext(), superClass);
1439+
checkInheritable(((RubyBasicObject) superClass).getCurrentContext(), superClass);
14351440
}
14361441

14371442
public static void checkInheritable(ThreadContext context, IRubyObject superClass) {
@@ -2859,7 +2864,7 @@ public void smartDump(NewMarshal stream, ThreadContext context, NewMarshal.RubyO
28592864
// recache
28602865
CacheEntry entry = searchWithCache("respond_to?");
28612866
DynamicMethod method = entry.method;
2862-
if (!method.equals(runtime.getRespondToMethod()) && !method.isUndefined()) {
2867+
if (!method.equals(context.runtime.getRespondToMethod()) && !method.isUndefined()) {
28632868

28642869
// custom respond_to?, always do slow default marshaling
28652870
tuple = (cachedDumpMarshal = new MarshalTuple(null, MarshalType.DEFAULT_SLOW, generation));

0 commit comments

Comments
 (0)