Skip to content

Commit 6b2db36

Browse files
committed
Process.argv0 and the initial value of $0 should be frozen
* Also ensure Process.argv0 is set also when embedded.
1 parent b10ae00 commit 6b2db36

File tree

5 files changed

+23
-28
lines changed

5 files changed

+23
-28
lines changed

spec/tags/core/process/argv0_tags.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
slow:Process.argv0 is the path given as the main script and the same as __FILE__
2-
fails:Process.argv0 returns a frozen object

src/main/java/org/truffleruby/RubyContext.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747
import org.truffleruby.core.array.ArrayOperations;
4848
import org.truffleruby.core.array.RubyArray;
4949
import org.truffleruby.core.encoding.EncodingManager;
50+
import org.truffleruby.core.encoding.Encodings;
51+
import org.truffleruby.core.encoding.TStringUtils;
5052
import org.truffleruby.core.exception.CoreExceptions;
5153
import org.truffleruby.core.fiber.FiberManager;
5254
import org.truffleruby.core.hash.PreInitializationManager;
@@ -58,7 +60,7 @@
5860
import org.truffleruby.core.objectspace.ObjectSpaceManager;
5961
import org.truffleruby.core.proc.ProcOperations;
6062
import org.truffleruby.core.proc.RubyProc;
61-
import org.truffleruby.core.string.RubyString;
63+
import org.truffleruby.core.string.ImmutableRubyString;
6264
import org.truffleruby.core.symbol.RubySymbol;
6365
import org.truffleruby.core.thread.ThreadManager;
6466
import org.truffleruby.core.time.GetTimeZoneNode;
@@ -160,7 +162,7 @@ public class RubyContext {
160162
private final AssumedValue<Boolean> warningCategoryDeprecated;
161163
private final AssumedValue<Boolean> warningCategoryExperimental;
162164

163-
private RubyString scriptName;
165+
private ImmutableRubyString mainScriptName;
164166

165167
private static final ContextReference<RubyContext> REFERENCE = ContextReference.create(RubyLanguage.class);
166168

@@ -764,11 +766,17 @@ public GlobalVariableStorage getGlobalVariableStorage(int index) {
764766
return globalVariablesArray.get(index);
765767
}
766768

767-
public void setScriptName(RubyString name) {
768-
this.scriptName = name;
769+
public void initializeMainScriptName(String mainScriptName) {
770+
ImmutableRubyString mainScriptString = language.getFrozenStringLiteral(TStringUtils.utf8TString(mainScriptName),
771+
Encodings.UTF_8);
772+
773+
int index = language.getGlobalVariableIndex("$0");
774+
getGlobalVariableStorage(index).setValueInternal(mainScriptString);
775+
776+
this.mainScriptName = mainScriptString;
769777
}
770778

771-
public RubyString getScriptName() {
772-
return this.scriptName;
779+
public ImmutableRubyString getMainScriptName() {
780+
return this.mainScriptName;
773781
}
774782
}

src/main/java/org/truffleruby/core/CoreLibrary.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424

2525
import com.oracle.truffle.api.RootCallTarget;
2626
import com.oracle.truffle.api.exception.AbstractTruffleException;
27-
import com.oracle.truffle.api.strings.TruffleString;
2827
import org.graalvm.collections.Pair;
2928
import org.jcodings.transcode.EConvFlags;
3029
import org.truffleruby.RubyContext;
@@ -47,7 +46,6 @@
4746
import org.truffleruby.core.numeric.BigIntegerOps;
4847
import org.truffleruby.core.numeric.RubyBignum;
4948
import org.truffleruby.core.string.TStringWithEncoding;
50-
import org.truffleruby.core.string.RubyString;
5149
import org.truffleruby.debug.BindingLocalVariablesObject;
5250
import org.truffleruby.debug.GlobalVariablesObject;
5351
import org.truffleruby.debug.TopScopeObject;
@@ -817,15 +815,7 @@ private void afterLoadCoreLibrary() {
817815
findGlobalVariableStorage();
818816

819817
// Initialize $0 so it is set to a String as RubyGems expect, also when not run from the RubyLauncher
820-
// NOTE(norswap, Nov. 2nd 2020): Okay for language access to be slow, currently only used during initialization.
821-
RubyString dollarZeroValue = new RubyString(
822-
stringClass,
823-
language.stringShape,
824-
false,
825-
TruffleString.fromCodePointUncached('-', TruffleString.Encoding.US_ASCII),
826-
Encodings.US_ASCII);
827-
int index = language.getGlobalVariableIndex("$0");
828-
context.getGlobalVariableStorage(index).setValueInternal(dollarZeroValue);
818+
context.initializeMainScriptName("-");
829819

830820
topLevelBinding = (RubyBinding) objectClass.fields
831821
.getConstant("TOPLEVEL_BINDING")

src/main/java/org/truffleruby/core/ProcessNodes.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import org.truffleruby.annotations.Primitive;
1515
import org.truffleruby.builtins.CoreMethodArrayArgumentsNode;
1616
import org.truffleruby.builtins.PrimitiveArrayArgumentsNode;
17-
import org.truffleruby.core.string.RubyString;
17+
import org.truffleruby.core.string.ImmutableRubyString;
1818
import org.truffleruby.core.symbol.RubySymbol;
1919

2020
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -31,8 +31,8 @@ public abstract class ProcessNodes {
3131
public abstract static class Argv0Node extends CoreMethodArrayArgumentsNode {
3232

3333
@Specialization
34-
protected RubyString argv0() {
35-
return getContext().getScriptName();
34+
protected ImmutableRubyString argv0() {
35+
return getContext().getMainScriptName();
3636
}
3737

3838
}

src/main/java/org/truffleruby/language/TruffleBootNodes.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -170,23 +170,23 @@ private void setArgvGlobals() {
170170

171171
private RubySource loadMainSourceSettingDollarZero(String kind, String toExecute) {
172172
final RubySource rubySource;
173-
final RubyString dollarZeroValue;
173+
final String mainScriptName;
174174
final MainLoader mainLoader = new MainLoader(getContext(), getLanguage());
175175
try {
176176
switch (kind) {
177177
case "FILE":
178178
rubySource = mainLoader.loadFromFile(getContext().getEnv(), this, toExecute);
179-
dollarZeroValue = utf8(toExecute);
179+
mainScriptName = toExecute;
180180
break;
181181

182182
case "STDIN":
183183
rubySource = mainLoader.loadFromStandardIn(this, "-");
184-
dollarZeroValue = utf8("-");
184+
mainScriptName = "-";
185185
break;
186186

187187
case "INLINE":
188188
rubySource = mainLoader.loadFromCommandLineArgument(toExecute);
189-
dollarZeroValue = utf8("-e");
189+
mainScriptName = "-e";
190190
break;
191191

192192
default:
@@ -197,9 +197,7 @@ private RubySource loadMainSourceSettingDollarZero(String kind, String toExecute
197197
}
198198
assert RubyLanguage.MIME_TYPE_MAIN_SCRIPT.equals(rubySource.getSource().getMimeType());
199199

200-
int index = getLanguage().getGlobalVariableIndex("$0");
201-
getContext().getGlobalVariableStorage(index).setValueInternal(dollarZeroValue);
202-
getContext().setScriptName(dollarZeroValue);
200+
getContext().initializeMainScriptName(mainScriptName);
203201

204202
return rubySource;
205203
}

0 commit comments

Comments
 (0)