Skip to content

Instantly share code, notes, and snippets.

@headius
Created May 7, 2024 22:39
Show Gist options
  • Save headius/db73cb12296299a819b8fea17fb165e5 to your computer and use it in GitHub Desktop.
Save headius/db73cb12296299a819b8fea17fb165e5 to your computer and use it in GitHub Desktop.
Fix for jruby/jruby#8178 by only allowing a RubyArray into Argv
diff --git a/core/src/main/java/org/jruby/embed/variable/AbstractVariable.java b/core/src/main/java/org/jruby/embed/variable/AbstractVariable.java
index 46177487d7..3c5f9cb821 100644
--- a/core/src/main/java/org/jruby/embed/variable/AbstractVariable.java
+++ b/core/src/main/java/org/jruby/embed/variable/AbstractVariable.java
@@ -94,7 +94,7 @@ abstract class AbstractVariable implements BiVariable {
return (RubyObject) receiver.getRuntime().getTopSelf();
}
- protected void updateByJavaObject(final Ruby runtime, Object... values) {
+ protected synchronized void updateByJavaObject(final Ruby runtime, Object... values) {
assert values != null;
javaObject = values[0];
if (javaObject == null) {
@@ -108,7 +108,7 @@ abstract class AbstractVariable implements BiVariable {
fromRuby = false;
}
- protected void updateRubyObject(final IRubyObject rubyObject) {
+ protected synchronized void updateRubyObject(final IRubyObject rubyObject) {
if ( rubyObject == null ) return;
this.rubyObject = rubyObject;
this.javaType = null;
@@ -134,7 +134,7 @@ abstract class AbstractVariable implements BiVariable {
return name;
}
- public Object getJavaObject() {
+ public synchronized Object getJavaObject() {
if (rubyObject == null) return javaObject;
if (javaType != null) { // Java originated variables
diff --git a/core/src/main/java/org/jruby/embed/variable/Argv.java b/core/src/main/java/org/jruby/embed/variable/Argv.java
index ad8559f10c..0040990cbb 100644
--- a/core/src/main/java/org/jruby/embed/variable/Argv.java
+++ b/core/src/main/java/org/jruby/embed/variable/Argv.java
@@ -114,7 +114,7 @@ public class Argv extends AbstractVariable {
* invoked during EvalUnit#run() is executed.
*/
@Override
- public void inject() {
+ public synchronized void inject() {
final Ruby runtime = getRuntime();
final RubyArray argv = RubyArray.newArray(runtime);
@@ -141,7 +141,7 @@ public class Argv extends AbstractVariable {
* this variable in top self.
*/
@Override
- public void remove() {
+ public synchronized void remove() {
this.javaObject = new ArrayList();
inject();
}
@@ -173,7 +173,7 @@ public class Argv extends AbstractVariable {
}
// ARGV appears to require special treatment, leaving javaType intact
- protected void updateRubyObject(final IRubyObject rubyObject) {
+ protected synchronized void updateRubyObject(final IRubyObject rubyObject) {
if ( rubyObject == null ) return;
this.rubyObject = rubyObject;
}
@@ -193,7 +193,7 @@ public class Argv extends AbstractVariable {
@Override
@SuppressWarnings("unchecked")
- public Object getJavaObject() {
+ public synchronized Object getJavaObject() {
if ( rubyObject == null || ! fromRuby ) return javaObject;
final RubyArray ary = (RubyArray) rubyObject;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment