Skip to content

Commit 0463243

Browse files
committed
[GR-34365] Module#attr_* methods now return an array of method names (#2498)
PullRequest: truffleruby/2969
2 parents 67ee8b0 + 7a0c098 commit 0463243

File tree

7 files changed

+26
-16
lines changed

7 files changed

+26
-16
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Compatibility:
1515
* Implement `rb_sprintf` in our format compiler to provide consistent formatting across C standard libraries.
1616
* Update `defined?` to return frozen strings (#2450).
1717
* Use compensated summation for `{Array,Enumerable}#sum` when floating point values are included.
18+
* `Module#attr_*` methods now return an array of method names (#2498, @gogainda).
1819

1920
Performance:
2021

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fails:Module#attr_accessor returns nil
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fails:Module#attr_reader returns nil

spec/tags/core/module/attr_tags.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fails:Module#attr returns nil
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fails:Module#attr_writer returns nil

spec/truffleruby.mspec

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ class MSpecScript
9696
spec/ruby/core/mutex/owned_spec.rb
9797
spec/ruby/core/fiber/raise_spec.rb
9898
spec/ruby/core/process/status/wait_spec.rb
99+
spec/ruby/core/module/attr_spec.rb
100+
spec/ruby/core/module/attr_reader_spec.rb
101+
spec/ruby/core/module/attr_writer_spec.rb
102+
spec/ruby/core/module/attr_accessor_spec.rb
99103
]
100104

101105
set :tags_patterns, [

src/main/java/org/truffleruby/core/module/ModuleNodes.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -439,16 +439,17 @@ enum Accessor {
439439
BOTH
440440
}
441441

442-
protected void generateAccessor(Frame callerFrame, RubyModule module, Object[] names, Accessor accessor,
443-
RootCallTarget target) {
442+
protected Object[] generateAccessors(Frame callerFrame, RubyModule module, Object[] names,
443+
Accessor accessor, RootCallTarget target) {
444444
needCallerFrame(callerFrame, target);
445445
final Visibility visibility = DeclarationContext
446446
.findVisibilityCheckSelfAndDefaultDefinee(module, callerFrame);
447-
createAccessors(module, names, accessor, visibility);
447+
return createAccessors(module, names, accessor, visibility);
448448
}
449449

450450
@TruffleBoundary
451-
private void createAccessors(RubyModule module, Object[] names, Accessor accessor, Visibility visibility) {
451+
private Object[] createAccessors(RubyModule module, Object[] names, Accessor accessor,
452+
Visibility visibility) {
452453
final Node currentNode = getNode();
453454
final SourceSection sourceSection;
454455
if (currentNode != null) {
@@ -457,19 +458,22 @@ private void createAccessors(RubyModule module, Object[] names, Accessor accesso
457458
sourceSection = CoreLibrary.UNAVAILABLE_SOURCE_SECTION;
458459
}
459460

461+
Object[] generatedMethods = accessor == BOTH ? new Object[names.length * 2] : new Object[names.length];
462+
int i = 0;
460463
for (Object nameObject : names) {
461464
final String name = NameToJavaStringNode.getUncached().execute(nameObject);
462465
if (accessor == BOTH) {
463-
createAccessor(module, name, READER, visibility, sourceSection);
464-
createAccessor(module, name, WRITER, visibility, sourceSection);
466+
generatedMethods[i++] = createAccessor(module, name, READER, visibility, sourceSection);
467+
generatedMethods[i++] = createAccessor(module, name, WRITER, visibility, sourceSection);
465468
} else {
466-
createAccessor(module, name, accessor, visibility, sourceSection);
469+
generatedMethods[i++] = createAccessor(module, name, accessor, visibility, sourceSection);
467470
}
468471
}
472+
return generatedMethods;
469473
}
470474

471475
@TruffleBoundary
472-
private void createAccessor(RubyModule module, String name, Accessor accessor, Visibility visibility,
476+
private RubySymbol createAccessor(RubyModule module, String name, Accessor accessor, Visibility visibility,
473477
SourceSection sourceSection) {
474478
assert accessor != BOTH;
475479
final Arity arity = accessor == READER ? Arity.NO_ARGUMENTS : Arity.ONE_REQUIRED;
@@ -516,6 +520,7 @@ private void createAccessor(RubyModule module, String name, Accessor accessor, V
516520
nil);
517521

518522
module.fields.addMethod(getContext(), this, method);
523+
return getLanguage().getSymbol(method.getName());
519524
}
520525
}
521526

@@ -534,8 +539,7 @@ protected Object attr(
534539
setter = false;
535540
}
536541

537-
generateAccessor(callerFrame, module, names, setter ? BOTH : READER, target);
538-
return nil;
542+
return createArray(generateAccessors(callerFrame, module, names, setter ? BOTH : READER, target));
539543
}
540544

541545
@TruffleBoundary
@@ -554,8 +558,7 @@ public abstract static class AttrAccessorNode extends GenerateAccessorNode {
554558
@Specialization
555559
protected Object attrAccessor(
556560
Frame callerFrame, RubyModule module, Object[] names, Object block, RootCallTarget target) {
557-
generateAccessor(callerFrame, module, names, BOTH, target);
558-
return nil;
561+
return createArray(generateAccessors(callerFrame, module, names, BOTH, target));
559562
}
560563
}
561564

@@ -565,8 +568,7 @@ public abstract static class AttrReaderNode extends GenerateAccessorNode {
565568
@Specialization
566569
protected Object attrReader(
567570
Frame callerFrame, RubyModule module, Object[] names, Object block, RootCallTarget target) {
568-
generateAccessor(callerFrame, module, names, READER, target);
569-
return nil;
571+
return createArray(generateAccessors(callerFrame, module, names, READER, target));
570572
}
571573
}
572574

@@ -576,8 +578,7 @@ public abstract static class AttrWriterNode extends GenerateAccessorNode {
576578
@Specialization
577579
protected Object attrWriter(
578580
Frame callerFrame, RubyModule module, Object[] names, Object block, RootCallTarget target) {
579-
generateAccessor(callerFrame, module, names, WRITER, target);
580-
return nil;
581+
return createArray(generateAccessors(callerFrame, module, names, WRITER, target));
581582
}
582583
}
583584

0 commit comments

Comments
 (0)