From 387d9a9b3aebe4c26306de2dacae4a4df2cacdab Mon Sep 17 00:00:00 2001 From: Jan Berkel Date: Thu, 28 Oct 2010 23:05:23 +0100 Subject: [PATCH] Fix stack size, history edit bug --- AndroidManifest.xml | 1 + src/org/ruboto/Script.java | 50 ++++++++++++++++++++++--- src/org/ruboto/irb/HistoryEditText.java | 2 +- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index b98287e..ce128bc 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -62,6 +62,7 @@ + diff --git a/src/org/ruboto/Script.java b/src/org/ruboto/Script.java index 1477e2c..9e92925 100644 --- a/src/org/ruboto/Script.java +++ b/src/org/ruboto/Script.java @@ -17,6 +17,7 @@ import java.util.List; import org.jruby.Ruby; +import org.jruby.runtime.builtin.IRubyObject; import org.jruby.RubyInstanceConfig; import org.jruby.exceptions.RaiseException; import org.jruby.javasupport.JavaUtil; @@ -29,12 +30,17 @@ import android.os.Environment; import android.util.Log; import android.content.res.AssetManager; +import android.os.Handler; + +import android.util.Log; + import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.impl.client.DefaultHttpClient; public class Script { public static final String UNTITLED_RB = "untitled.rb"; + public static final boolean MORE_STACK = true; private static String scriptsDir = null; private static File scriptsDirFile = null; @@ -54,6 +60,7 @@ public class Script { private Integer state = null; public static final String TAG = "RUBOTO"; //for logging + private final static Handler handler = new Handler(); /************************************************************************************************* * @@ -97,14 +104,42 @@ public static synchronized Ruby setUpJRuby(PrintStream out) { return ruby; } - public static String execute(String code) { + public static String execute(final String code) { if (!initialized) return null; - try { - return (String)ruby.evalScriptlet(code, scope).inspect().toJava(String.class); - } catch (RaiseException re) { + boolean moreStack = getGlobalVariable("$stack").isTrue(); + Log.d("Script", "moreStack=" + moreStack); + if (moreStack) { + final String[] ret = new String[1]; + + try { + Thread t = new Thread(null, null, "executor", 16*1024) { + @Override public void run() { + try { + ret[0] = ruby.evalScriptlet(code, scope).inspect().toJava(String.class).toString(); + } catch (final RaiseException e) { + handler.post(new Runnable() { + public void run() { + e.printStackTrace(ruby.getErrorStream()); + } + }); + } + } + }; + t.start(); + t.join(); + + return ret[0]; + } catch (InterruptedException e) { + return null; + } + } else { + try { + return ruby.evalScriptlet(code, scope).inspect().toJava(String.class).toString(); + } catch (RaiseException re) { re.printStackTrace(ruby.getErrorStream()); return null; - } + } + } } public static void defineGlobalConstant(String name, Object object) { @@ -114,6 +149,11 @@ public static void defineGlobalConstant(String name, Object object) { public static void defineGlobalVariable(String name, Object object) { ruby.getGlobalVariables().set(name, JavaUtil.convertJavaToRuby(ruby, object)); } + + public static IRubyObject getGlobalVariable(String name) { + return ruby.getGlobalVariables().get(name); + } + public static Ruby getRuby() { return ruby; diff --git a/src/org/ruboto/irb/HistoryEditText.java b/src/org/ruboto/irb/HistoryEditText.java index 8a50330..4a39d1d 100644 --- a/src/org/ruboto/irb/HistoryEditText.java +++ b/src/org/ruboto/irb/HistoryEditText.java @@ -90,7 +90,7 @@ public boolean onEditorAction(TextView arg0, int actionId, KeyEvent event) { for(; i < history.size(); i++) { if (history.get(i).equals(line)) { history.remove(i); - adapter.remove(adapter.getItem(i)); + // adapter.remove(adapter.getItem(i)); break; } }