Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions core/src/main/java/org/jruby/RubyBasicObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -1331,6 +1331,20 @@ public List<Variable<Object>> getVariableList() {
return list;
}

/**
* @see IRubyObject#getMarshalVariableList()
*/
public List<Variable<Object>> getMarshalVariableList() {
Map<String, VariableAccessor> ivarAccessors = metaClass.getVariableAccessorsForRead();
ArrayList<Variable<Object>> list = new ArrayList<>(ivarAccessors.size());
for (Map.Entry<String, VariableAccessor> entry : ivarAccessors.entrySet()) {
Object value = entry.getValue().get(this);
if (value == null || !(value instanceof Serializable)) continue;
list.add(new VariableEntry<>(entry.getKey(), value));
}
return list;
}

/**
* Gets a name list of all variables in this object.
*/
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/org/jruby/RubyClass.java
Original file line number Diff line number Diff line change
Expand Up @@ -1269,7 +1269,7 @@ public void marshalTo(Ruby runtime, Object obj, RubyClass type, MarshalStream ma
IRubyObject object = (IRubyObject) obj;

marshalStream.registerLinkTarget(object);
marshalStream.dumpVariables(object.getVariableList());
marshalStream.dumpVariables(object.getMarshalVariableList());
}

@Override
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/org/jruby/RubyException.java
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ public static RubyClass createExceptionClass(Ruby runtime) {
public void marshalTo(Ruby runtime, RubyException exc, RubyClass type,
MarshalStream marshalStream) throws IOException {
marshalStream.registerLinkTarget(exc);
List<Variable<Object>> attrs = exc.getVariableList();
List<Variable<Object>> attrs = exc.getMarshalVariableList();
attrs.add(new VariableEntry<>("mesg", exc.getMessage()));
attrs.add(new VariableEntry<>("bt", exc.getBacktrace()));
marshalStream.dumpVariables(attrs);
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/org/jruby/RubyProcess.java
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ public void marshalTo(Ruby runtime, Object obj, RubyClass type,
RubyStatus status = (RubyStatus) obj;

marshalStream.registerLinkTarget(status);
List<Variable<Object>> attrs = status.getVariableList();
List<Variable<Object>> attrs = status.getMarshalVariableList();

attrs.add(new VariableEntry("status", runtime.newFixnum(status.status)));
attrs.add(new VariableEntry("pid", runtime.newFixnum(status.pid)));
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/org/jruby/RubyRange.java
Original file line number Diff line number Diff line change
Expand Up @@ -1143,7 +1143,7 @@ public void marshalTo(Ruby runtime, Object obj, RubyClass type,
RubyRange range = (RubyRange) obj;

marshalStream.registerLinkTarget(range);
List<Variable<Object>> attrs = range.getVariableList();
List<Variable<Object>> attrs = range.getMarshalVariableList();

attrs.add(new VariableEntry<Object>("excl", range.isExclusive ? runtime.getTrue() : runtime.getFalse()));
attrs.add(new VariableEntry<Object>("begin", range.begin));
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/org/jruby/RubySystemCallError.java
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ public void marshalTo(Ruby runtime, Object obj, RubyClass type,
RubySystemCallError exc = (RubySystemCallError) obj;
marshalStream.registerLinkTarget(exc);

List<Variable<Object>> attrs = exc.getVariableList();
List<Variable<Object>> attrs = exc.getMarshalVariableList();
attrs.add(new VariableEntry<Object>(
"mesg", exc.message == null ? runtime.getNil() : exc.message));
attrs.add(new VariableEntry<Object>("errno", exc.errno));
Expand Down
7 changes: 7 additions & 0 deletions core/src/main/java/org/jruby/runtime/builtin/IRubyObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,13 @@ static IRubyObject[] array(int length) {
*/
List<Variable<Object>> getVariableList();

/**
* @return a list of all marshalable variables (ivar/cvar/constant/internal)
*/
default List<Variable<Object>> getMarshalVariableList() {
return getVariableList();
}

//
// INSTANCE VARIABLE METHODS
//
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ private List<Variable<Object>> getVariables(IRubyObject value) throws IOExceptio
// object has instance vars and isn't a class, get a snapshot to be marshalled
// and output the ivar header here

variables = value.getVariableList();
variables = value.getMarshalVariableList();

// check if any of those variables were actually set
if (variables.size() > 0 || shouldMarshalEncoding(value)) {
Expand Down Expand Up @@ -380,7 +380,7 @@ private void userCommon(IRubyObject value, CacheEntry entry) throws IOException

List<Variable<Object>> variables = null;
if (marshaled.hasVariables()) {
variables = marshaled.getVariableList();
variables = marshaled.getMarshalVariableList();
if (variables.size() > 0) {
write(TYPE_IVAR);
} else {
Expand Down
6 changes: 6 additions & 0 deletions spec/ruby/core/marshal/dump_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,12 @@ def obj.foo; end
obj = MarshalSpec::BasicObjectSubWithRespondToFalse.new
Marshal.dump(obj).should == "\x04\bo:2MarshalSpec::BasicObjectSubWithRespondToFalse\x00"
end

it "dumps without marshaling any attached finalizer" do
obj = Object.new
ObjectSpace.define_finalizer(obj, &:itself)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI this causes:

1)
Marshal.dump with an Object dumps without marshaling any attached finalizer ERROR
ArgumentError: Can't create Binding from C level Proc
/home/eregon/code/rubyspec/core/marshal/dump_spec.rb:464:in `define_finalizer'
/home/eregon/code/rubyspec/core/marshal/dump_spec.rb:464:in `block (3 levels) in <top (required)>'
/home/eregon/code/rubyspec/core/marshal/dump_spec.rb:6:in `<top (required)>'
[| | ==================100%================== | 00:00:00]      0F      1E 

on CRuby 3.0+. Just on 2.7 it seems to work.
I modified the spec a bit to make it work on all CRuby versions: ruby/spec@d44cd79

Marshal.load(Marshal.dump(obj)).class.should == Object
end
end

describe "with a Range" do
Expand Down