Skip to content

Commit

Permalink
Revert "Revert "Merge pull request #3917 from jruby/truffle_readline""
Browse files Browse the repository at this point in the history
This reverts commit 005ec3d.
  • Loading branch information
nirvdrum committed Dec 12, 2016
1 parent 21d7db5 commit 11b8b9a
Show file tree
Hide file tree
Showing 21 changed files with 892 additions and 3 deletions.
76 changes: 76 additions & 0 deletions lib/ruby/truffle/truffle/readline.rb
@@ -0,0 +1,76 @@
# Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. This
# code is released under a tri EPL/GPL/LGPL license. You can use it,
# redistribute it and/or modify it under the terms of the:
#
# Eclipse Public License version 1.0
# GNU General Public License version 2
# GNU Lesser General Public License version 2.1

Readline = Truffle::Readline

module Readline

HISTORY = Object.new
VERSION = 'JLine wrapper'

module_function

%i[
basic_quote_characters
basic_quote_characters=
completer_quote_characters
completer_quote_characters=
completer_word_break_characters
completer_word_break_characters=
completion_append_character
completion_append_character=
completion_case_fold
completion_case_fold=
completion_proc
completion_proc=
emacs_editing_mode
emacs_editing_mode?
filename_quote_characters
filename_quote_characters=
point=
pre_input_hook
pre_input_hook=
redisplay
set_screen_size
special_prefixes
special_prefixes=
vi_editing_mode
vi_editing_mode?
set_screen_size
].each do |method_name|
define_method(method_name) do
raise NotImplementedError.new("#{method_name}() function is unimplemented on this machine")
end
end

def input=(input)
# TODO (nirvdrum 20-May-16): This should do something functional.
nil
end

def output=(output)
# TODO (nirvdrum 20-May-16): This should do something functional.
nil
end

end

class << Readline::HISTORY

include Enumerable
include Truffle::ReadlineHistory

def empty?
size == 0
end

def to_s
'HISTORY'
end

end
10 changes: 7 additions & 3 deletions mx.jruby/suite.py
Expand Up @@ -145,6 +145,13 @@ def mavenLib(mavenDep, sha1, sourceSha1, license):
"e2c76a19f00128bb1806207e2989139bfb45f49d",
"201985f0f15af95f03494ab9ef0400e849090d6c",
"MIT"),

"JLINE": mavenLib(
"jline:jline:2.11",
"9504d5e2da5d78237239c5226e8200ec21182040",
"ef2539b992e5605be966b6db7cfc83930f0da39b",
"BSD-simplified"
)
},

"projects": {
Expand Down Expand Up @@ -225,9 +232,6 @@ def mavenLib(mavenDep, sha1, sourceSha1, license):
"jruby-truffle",
"jruby-truffle-ruby",
],
"exclude": [
"truffle:JLINE",
],
"distDependencies": [
"truffle:TRUFFLE_API",
"truffle:TRUFFLE_DEBUG",
Expand Down
@@ -0,0 +1,2 @@
fails:Readline.basic_quote_characters returns not nil
fails:Readline.basic_quote_characters= returns the passed string
@@ -0,0 +1,2 @@
fails:Readline.completer_quote_characters returns nil
fails:Readline.completer_quote_characters= returns the passed string
@@ -0,0 +1,2 @@
fails:Readline.completer_word_break_characters returns nil
fails:Readline.completer_word_break_characters= returns the passed string
@@ -0,0 +1,2 @@
fails:Readline.completion_append_character returns not nil
fails:Readline.completion_append_character= returns the first character of the passed string
@@ -0,0 +1,2 @@
fails:Readline.completion_case_fold returns nil
fails:Readline.completion_case_fold= returns the passed boolean
3 changes: 3 additions & 0 deletions spec/truffle/tags/library/readline/completion_proc_tags.txt
@@ -0,0 +1,3 @@
fails:Readline.completion_proc returns nil
fails:Readline.completion_proc= returns the passed Proc
fails:Readline.completion_proc= returns an ArgumentError if not given an Proc or #call
@@ -0,0 +1 @@
fails:Readline.emacs_editing_mode returns nil
@@ -0,0 +1,2 @@
fails:Readline.filename_quote_characters returns nil
fails:Readline.filename_quote_characters= returns the passed string
@@ -0,0 +1 @@
fails:Readline.vi_editing_mode returns nil
1 change: 1 addition & 0 deletions spec/truffle/truffle.mspec
Expand Up @@ -159,6 +159,7 @@ class MSpecScript
MSpec.disable_feature :continuation_library
MSpec.disable_feature :fork
MSpec.enable_feature :encoding
MSpec.enable_feature :readline

set :files, get(:language) + get(:core) + get(:library) + get(:truffle)
end
Expand Down
8 changes: 8 additions & 0 deletions truffle/src/main/java/org/jruby/truffle/RubyContext.java
Expand Up @@ -49,6 +49,7 @@
import org.jruby.truffle.platform.NativePlatform;
import org.jruby.truffle.platform.NativePlatformFactory;
import org.jruby.truffle.stdlib.CoverageManager;
import org.jruby.truffle.stdlib.readline.ConsoleHolder;
import org.jruby.truffle.tools.InstrumentationServerManager;
import org.jruby.truffle.tools.callgraph.CallGraph;
import org.jruby.truffle.tools.callgraph.SimpleWriter;
Expand Down Expand Up @@ -103,6 +104,7 @@ public class RubyContext extends ExecutionContext {
private final CallGraph callGraph;
private final PrintStream debugStandardOut;
private final CoverageManager coverageManager;
private final ConsoleHolder consoleHolder;

private final Object classVariableDefinitionLock = new Object();

Expand Down Expand Up @@ -201,6 +203,8 @@ public RubyContext(TruffleLanguage.Env env) {

coreLibrary.initializePostBoot();

consoleHolder = new ConsoleHolder();

// Share once everything is loaded
if (options.SHARED_OBJECTS_ENABLED && options.SHARED_OBJECTS_FORCE) {
sharedObjects.startSharing();
Expand Down Expand Up @@ -481,4 +485,8 @@ public void setSyntaxCheckInputStream(InputStream syntaxCheckInputStream) {
this.syntaxCheckInputStream = syntaxCheckInputStream;
}

public ConsoleHolder getConsoleHolder() {
return consoleHolder;
}

}
7 changes: 7 additions & 0 deletions truffle/src/main/java/org/jruby/truffle/core/CoreLibrary.java
Expand Up @@ -136,6 +136,8 @@
import org.jruby.truffle.stdlib.psych.PsychParserNodesFactory;
import org.jruby.truffle.stdlib.psych.YAMLEncoding;
import org.jruby.truffle.platform.Platform;
import org.jruby.truffle.stdlib.readline.ReadlineHistoryNodesFactory;
import org.jruby.truffle.stdlib.readline.ReadlineNodesFactory;

import java.io.File;
import java.io.IOException;
Expand Down Expand Up @@ -600,6 +602,8 @@ public CoreLibrary(RubyContext context) {
defineModule(truffleModule, "Process");
defineModule(truffleModule, "Binding");
defineModule(truffleModule, "POSIX");
defineModule(truffleModule, "Readline");
defineModule(truffleModule, "ReadlineHistory");
psychModule = defineModule("Psych");
psychParserClass = defineClass(psychModule, objectClass, "Parser");
final DynamicObject psychHandlerClass = defineClass(psychModule, objectClass, "Handler");
Expand Down Expand Up @@ -744,6 +748,8 @@ public void addCoreMethods(PrimitiveManager primitiveManager) {
QueueNodesFactory.getFactories(),
RandomizerPrimitiveNodesFactory.getFactories(),
RangeNodesFactory.getFactories(),
ReadlineNodesFactory.getFactories(),
ReadlineHistoryNodesFactory.getFactories(),
RegexpNodesFactory.getFactories(),
RubiniusTypeNodesFactory.getFactories(),
SizedQueueNodesFactory.getFactories(),
Expand Down Expand Up @@ -1099,6 +1105,7 @@ public void initializePostBoot() {
throw new TruffleFatalException("couldn't load the post-boot code", e);
}
}

}

private void initializeEncodings() {
Expand Down
@@ -0,0 +1,50 @@
/*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*/
package org.jruby.truffle.core.cast;

import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.language.NotProvided;
import org.jruby.truffle.language.RubyNode;

/**
* Take a Symbol or some object accepting #to_str
* and convert it to a Java String and defaults to
* the given value if not provided.
*/
@NodeChild(value = "value", type = RubyNode.class)
public abstract class NameToJavaStringWithDefaultNode extends RubyNode {

private final String defaultValue;
@Child private NameToJavaStringNode toJavaStringNode;

public NameToJavaStringWithDefaultNode(RubyContext context, SourceSection sourceSection, String defaultValue) {
super(context, sourceSection);
this.defaultValue = defaultValue;
toJavaStringNode = NameToJavaStringNodeGen.create(null);
}

public abstract String executeString(VirtualFrame frame, Object value);

@Specialization
public String doDefault(VirtualFrame frame, NotProvided value) {
return toJavaStringNode.executeToJavaString(frame, defaultValue);
}

@Specialization(guards = "wasProvided(value)")
public String doProvided(VirtualFrame frame, Object value) {
return toJavaStringNode.executeToJavaString(frame, value);
}


}
Expand Up @@ -280,6 +280,11 @@ public DynamicObject negativeLengthError(int length, Node currentNode) {
return indexError(StringUtils.format("negative length (%d)", length), currentNode);
}

@TruffleBoundary
public DynamicObject indexErrorInvalidIndex(Node currentNode) {
return indexError("invalid index", currentNode);
}

// LocalJumpError

@TruffleBoundary
Expand Down
Expand Up @@ -20,6 +20,7 @@ public class CoreStrings {
public final CoreString CANT_COMPRESS_NEGATIVE;
public final CoreString CLASS;
public final CoreString CLASS_VARIABLE;
public final CoreString EMPTY_STRING;
public final CoreString EXPRESSION;
public final CoreString FALSE;
public final CoreString GLOBAL_VARIABLE;
Expand Down Expand Up @@ -50,6 +51,7 @@ public CoreStrings(RubyContext context) {
CANT_COMPRESS_NEGATIVE = new CoreString(context, "can't compress negative numbers");
CLASS = new CoreString(context, "class");
CLASS_VARIABLE = new CoreString(context, "class variable");
EMPTY_STRING = new CoreString(context, "");
EXPRESSION = new CoreString(context, "expression");
FALSE = new CoreString(context, "false");
GLOBAL_VARIABLE = new CoreString(context, "global-variable");
Expand Down
Expand Up @@ -20,6 +20,7 @@
import com.oracle.truffle.api.source.SourceSection;
import jnr.ffi.provider.MemoryManager;
import org.jcodings.Encoding;
import org.jcodings.specific.UTF8Encoding;
import org.jruby.truffle.Layouts;
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.core.CoreLibrary;
Expand Down Expand Up @@ -114,6 +115,10 @@ protected DynamicObject getSymbol(Rope name) {
return getContext().getSymbolTable().getSymbol(name);
}

protected Encoding getDefaultInternalEncoding() {
return getContext().getEncodingManager().getDefaultInternalEncoding();
}

protected DynamicObject createString(ByteList bytes) {
return StringOperations.createString(getContext(), bytes);
}
Expand Down
@@ -0,0 +1,88 @@
/*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*
* This code is modified from the Readline JRuby extension module
* implementation with the following header:
*
* Version: EPL 1.0/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Eclipse Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.eclipse.org/legal/epl-v10.html
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* Copyright (C) 2006 Ola Bini <ola@ologix.com>
* Copyright (C) 2006 Damian Steer <pldms@mac.com>
* Copyright (C) 2008 Joseph LaFata <joe@quibb.org>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the EPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the EPL, the GPL or the LGPL.
*/
package org.jruby.truffle.stdlib.readline;

import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import jline.console.ConsoleReader;
import jline.console.completer.Completer;
import jline.console.history.History;
import jline.console.history.MemoryHistory;

import java.io.IOException;

public class ConsoleHolder {

private final ConsoleReader readline;
private final Completer currentCompleter;
private final History history;

@TruffleBoundary
public ConsoleHolder() {
try {
readline = new ConsoleReader();
} catch (IOException e) {
throw new UnsupportedOperationException("Couldn't initialize readline", e);
}

readline.setHistoryEnabled(false);
readline.setPaginationEnabled(true);
readline.setBellEnabled(true);

currentCompleter = new ReadlineNodes.RubyFileNameCompleter();
readline.addCompleter(currentCompleter);

history = new MemoryHistory();
readline.setHistory(history);
}

public ConsoleReader getReadline() {
return readline;
}

public Completer getCurrentCompleter() {
return currentCompleter;
}

public History getHistory() {
return history;
}

}

0 comments on commit 11b8b9a

Please sign in to comment.