Skip to content

Commit

Permalink
Arity-split Kernel and IO#print
Browse files Browse the repository at this point in the history
  • Loading branch information
headius committed May 21, 2024
1 parent e219d35 commit 309ef8d
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 13 deletions.
98 changes: 87 additions & 11 deletions core/src/main/java/org/jruby/RubyIO.java
Original file line number Diff line number Diff line change
Expand Up @@ -1823,37 +1823,113 @@ public IRubyObject print(ThreadContext context, IRubyObject[] args) {
return print(context, this, args);
}

@JRubyMethod(reads = LASTLINE)
public IRubyObject print(ThreadContext context) {
return print0(context, this);
}

@JRubyMethod(reads = LASTLINE)
public IRubyObject print(ThreadContext context, IRubyObject arg0) {
return print1(context, this, arg0);
}

@JRubyMethod(reads = LASTLINE)
public IRubyObject print(ThreadContext context, IRubyObject arg0, IRubyObject arg1) {
return print2(context, this, arg0, arg1);
}

@JRubyMethod(reads = LASTLINE)
public IRubyObject print(ThreadContext context, IRubyObject arg0, IRubyObject arg1, IRubyObject arg2) {
return print3(context, this, arg0, arg1, arg2);
}

/**
* Print some objects to the stream.
*
* MRI: rb_io_print
*/
public static IRubyObject print(ThreadContext context, IRubyObject out, IRubyObject[] args) {
switch (args.length) {
case 0:
return print0(context, out);
case 1:
return print1(context, out, args[0]);
case 2:
return print2(context, out, args[0], args[1]);
case 3:
return print3(context, out, args[0], args[1], args[2]);
}

Ruby runtime = context.runtime;
int i;
IRubyObject line;
int argc = args.length;
IRubyObject outputFS = runtime.getGlobalVariables().get("$,");

/* if no argument given, print `$_' */
if (argc == 0) {
argc = 1;
line = context.getLastLine();
args = new IRubyObject[]{line};
}
if (argc > 1 && !outputFS.isNil()) {
boolean fieldSeparatorNotNil = !outputFS.isNil();
if (fieldSeparatorNotNil) {
runtime.getWarnings().warnDeprecated("$, is set to non-nil value");
}
for (i=0; i<argc; i++) {
if (!outputFS.isNil() && i>0) {
if (fieldSeparatorNotNil && i>0) {
write(context, out, outputFS);
}
write(context, out, args[i]);
}
IRubyObject outputRS = runtime.getGlobalVariables().get("$\\");
if (argc > 0 && !outputRS.isNil()) {

writeRecordSeparator(context, out);

return context.nil;
}

public static IRubyObject print0(ThreadContext context, IRubyObject out) {
return print1(context, out, context.getLastLine());
}

public static IRubyObject print1(ThreadContext context, IRubyObject out, IRubyObject arg1) {
write(context, out, arg1);

writeRecordSeparator(context, out);

return context.nil;
}

private static void writeRecordSeparator(ThreadContext context, IRubyObject out) {
IRubyObject outputRS = context.runtime.getGlobalVariables().get("$\\");
if (!outputRS.isNil()) {
write(context, out, outputRS);
}
}

public static IRubyObject print2(ThreadContext context, IRubyObject out, IRubyObject arg0, IRubyObject arg1) {
Ruby runtime = context.runtime;

IRubyObject outputFS = runtime.getGlobalVariables().get("$,");
boolean fieldSeparatorNotNil = !outputFS.isNil();
if (fieldSeparatorNotNil) runtime.getWarnings().warnDeprecated("$, is set to non-nil value");

write(context, out, arg0);
if (fieldSeparatorNotNil) write(context, out, outputFS);
write(context, out, arg1);

writeRecordSeparator(context, out);

return context.nil;
}

public static IRubyObject print3(ThreadContext context, IRubyObject out, IRubyObject arg0, IRubyObject arg1, IRubyObject arg2) {
Ruby runtime = context.runtime;

IRubyObject outputFS = runtime.getGlobalVariables().get("$,");
boolean fieldSeparatorNotNil = !outputFS.isNil();
if (fieldSeparatorNotNil) runtime.getWarnings().warnDeprecated("$, is set to non-nil value");

write(context, out, arg0);
if (fieldSeparatorNotNil) write(context, out, outputFS);
write(context, out, arg1);
if (fieldSeparatorNotNil) write(context, out, outputFS);
write(context, out, arg2);

writeRecordSeparator(context, out);

return context.nil;
}
Expand Down
23 changes: 21 additions & 2 deletions core/src/main/java/org/jruby/RubyKernel.java
Original file line number Diff line number Diff line change
Expand Up @@ -743,10 +743,29 @@ public static IRubyObject puts(ThreadContext context, IRubyObject recv, IRubyObj
}

// rb_f_print
@JRubyMethod(module = true, visibility = PRIVATE, reads = LASTLINE)
public static IRubyObject print(ThreadContext context, IRubyObject recv) {
return RubyIO.print0(context, context.runtime.getGlobalVariables().get("$>"));
}

@JRubyMethod(module = true, visibility = PRIVATE, reads = LASTLINE)
public static IRubyObject print(ThreadContext context, IRubyObject recv, IRubyObject arg0) {
return RubyIO.print1(context, context.runtime.getGlobalVariables().get("$>"), arg0);
}

@JRubyMethod(module = true, visibility = PRIVATE, reads = LASTLINE)
public static IRubyObject print(ThreadContext context, IRubyObject recv, IRubyObject arg0, IRubyObject arg1) {
return RubyIO.print2(context, context.runtime.getGlobalVariables().get("$>"), arg0, arg1);
}

@JRubyMethod(module = true, visibility = PRIVATE, reads = LASTLINE)
public static IRubyObject print(ThreadContext context, IRubyObject recv, IRubyObject arg0, IRubyObject arg1, IRubyObject arg2) {
return RubyIO.print3(context, context.runtime.getGlobalVariables().get("$>"), arg0, arg1, arg2);
}

@JRubyMethod(rest = true, module = true, visibility = PRIVATE, reads = LASTLINE)
public static IRubyObject print(ThreadContext context, IRubyObject recv, IRubyObject[] args) {
RubyIO.print(context, context.runtime.getGlobalVariables().get("$>"), args);
return context.nil;
return RubyIO.print(context, context.runtime.getGlobalVariables().get("$>"), args);
}

// rb_f_printf
Expand Down

0 comments on commit 309ef8d

Please sign in to comment.