Skip to content

Commit d263105

Browse files
author
kristofer.karlsson
committed
added an optimized array type, preliminary script engine support, fixed gsub bug
1 parent a7316ac commit d263105

File tree

16 files changed

+678
-137
lines changed

16 files changed

+678
-137
lines changed

build.xml

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@
115115
<exclude name="testsuite/bin/**" />
116116
<exclude name="testsuite/coverage/**" />
117117

118-
<include name="contrib/annotation/**" />
119-
<exclude name="contrib/annotation/bin/**" />
118+
<include name="contrib/j2se-util/**" />
119+
<exclude name="contrib/j2se-util/bin/**" />
120120

121121
<include name="contrib/JavaLuac/include/**" />
122122
<include name="contrib/JavaLuac/jni_src/**" />
@@ -129,6 +129,10 @@
129129
<include name="contrib/midlet-interpreter/src/**" />
130130
<include name="contrib/midlet-interpreter/build.xml" />
131131

132+
<include name="contrib/j2se-interpreter/src/**" />
133+
<include name="contrib/j2se-interpreter/run.sh" />
134+
<include name="contrib/j2se-interpreter/build.xml" />
135+
132136
<exclude name="**/.svn/**" />
133137
</fileset>
134138
</zip>
@@ -144,6 +148,20 @@
144148
</java>
145149
</target>
146150

151+
<target name="luac">
152+
<fail unless="input" message="Syntax: ant luac -Dinput=&lt;file> -Doutput=&lt;file2>" />
153+
<fail unless="output" message="Syntax: ant luac -Dinput=&lt;file> -Doutput=&lt;file2>" />
154+
<available property="exists" file="${input}" />
155+
<fail unless="exists" message="${input} not found." />
156+
<java classname="LuaC" fork="true" dir="${basedir}">
157+
<classpath location="${instrumented.dir}" />
158+
<classpath refid="test.classpath" />
159+
160+
<arg value="${input}" />
161+
<arg value="${output}" />
162+
</java>
163+
</target>
164+
147165
<!-- Test stuff -->
148166
<target name="compile-test" depends="setup, compile" description="Compile test classes">
149167
<javac
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
se.krka.kahlua.scriptengine.KahluaEngineFactory
2+

contrib/j2se-util/src/se/krka/kahlua/integration/processor/LuaDebugDataProcessor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ of this software and associated documentation files (the "Software"), to deal
2222

2323
package se.krka.kahlua.integration.processor;
2424

25+
import se.krka.kahlua.vm.LuaException;
26+
2527
import se.krka.kahlua.integration.expose.ReturnValues;
2628

2729
import se.krka.kahlua.integration.annotations.LuaConstructor;
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package se.krka.kahlua.scriptengine;
2+
3+
import se.krka.kahlua.vm.LuaClosure;
4+
5+
import java.io.IOException;
6+
7+
import se.krka.kahlua.luaj.compiler.LuaCompiler;
8+
9+
import se.krka.kahlua.vm.LuaState;
10+
11+
import java.io.Reader;
12+
import javax.script.Bindings;
13+
import javax.script.ScriptContext;
14+
import javax.script.ScriptEngineFactory;
15+
import javax.script.ScriptException;
16+
17+
import javax.script.ScriptEngine;
18+
19+
public class KahluaEngine implements ScriptEngine {
20+
21+
private final LuaState state;
22+
private final ScriptEngineFactory factory;
23+
24+
public KahluaEngine(ScriptEngineFactory factory) {
25+
this.factory = factory;
26+
state = new LuaState();
27+
}
28+
29+
@Override
30+
public Bindings createBindings() {
31+
// TODO Auto-generated method stub
32+
return null;
33+
}
34+
35+
@Override
36+
public Object eval(String script) throws ScriptException {
37+
try {
38+
LuaClosure closure = LuaCompiler.loadstring(script, "stdin", state.getEnvironment());
39+
return state.call(closure, null);
40+
} catch (IOException e) {
41+
throw new ScriptException(e);
42+
} catch (RuntimeException e) {
43+
throw new ScriptException(e);
44+
}
45+
}
46+
47+
@Override
48+
public Object eval(Reader reader) throws ScriptException {
49+
try {
50+
LuaClosure closure = LuaCompiler.loadis(reader, "stdin", state.getEnvironment());
51+
return state.call(closure, null);
52+
} catch (IOException e) {
53+
throw new ScriptException(e);
54+
} catch (RuntimeException e) {
55+
throw new ScriptException(e);
56+
}
57+
}
58+
59+
@Override
60+
public Object eval(String script, ScriptContext context) throws ScriptException {
61+
return eval(script);
62+
}
63+
64+
@Override
65+
public Object eval(Reader reader, ScriptContext context)
66+
throws ScriptException {
67+
return eval(reader);
68+
}
69+
70+
@Override
71+
public Object eval(String script, Bindings n) throws ScriptException {
72+
return eval(script);
73+
}
74+
75+
@Override
76+
public Object eval(Reader reader, Bindings n) throws ScriptException {
77+
return eval(reader);
78+
}
79+
80+
@Override
81+
public Object get(String key) {
82+
return state.tableGet(state.getEnvironment(), key);
83+
}
84+
85+
@Override
86+
public void put(String key, Object value) {
87+
state.tableSet(state.getEnvironment(), key, value);
88+
}
89+
90+
@Override
91+
public Bindings getBindings(int scope) {
92+
return null;
93+
}
94+
95+
@Override
96+
public ScriptContext getContext() {
97+
return null;
98+
}
99+
100+
@Override
101+
public ScriptEngineFactory getFactory() {
102+
return factory;
103+
}
104+
105+
@Override
106+
public void setBindings(Bindings bindings, int scope) {
107+
}
108+
109+
@Override
110+
public void setContext(ScriptContext context) {
111+
}
112+
113+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package se.krka.kahlua.scriptengine;
2+
3+
import java.util.Collections;
4+
5+
import java.util.ArrayList;
6+
7+
import java.util.List;
8+
import javax.script.ScriptEngine;
9+
10+
import javax.script.ScriptEngineFactory;
11+
12+
public class KahluaEngineFactory implements ScriptEngineFactory {
13+
14+
private final List<String> extensions = new ArrayList<String>();
15+
private final List<String> names = new ArrayList<String>();
16+
public KahluaEngineFactory() {
17+
extensions.add("lua");
18+
extensions.add("lbc");
19+
names.add("kahlua");
20+
names.add("lua");
21+
}
22+
23+
24+
@Override
25+
public String getEngineName() {
26+
return "kahlua";
27+
}
28+
29+
@Override
30+
public String getEngineVersion() {
31+
return "0.1";
32+
}
33+
34+
@Override
35+
public List<String> getExtensions() {
36+
return extensions;
37+
}
38+
39+
@Override
40+
public String getLanguageName() {
41+
return "Lua";
42+
}
43+
44+
@Override
45+
public String getLanguageVersion() {
46+
return "5.1";
47+
}
48+
49+
@Override
50+
public String getMethodCallSyntax(String obj, String m, String... args) {
51+
StringBuilder stringBuilder = new StringBuilder();
52+
stringBuilder.append(obj);
53+
stringBuilder.append(":");
54+
stringBuilder.append(m);
55+
stringBuilder.append("(");
56+
boolean first = true;
57+
for (String s: args) {
58+
if (first) {
59+
first = false;
60+
} else {
61+
stringBuilder.append(", ");
62+
}
63+
stringBuilder.append(s);
64+
}
65+
stringBuilder.append(")");
66+
return stringBuilder.toString();
67+
}
68+
69+
@Override
70+
public List<String> getMimeTypes() {
71+
return Collections.EMPTY_LIST;
72+
}
73+
74+
@Override
75+
public List<String> getNames() {
76+
return names;
77+
}
78+
79+
@Override
80+
public String getOutputStatement(String toDisplay) {
81+
return "print(" + toDisplay + ")";
82+
}
83+
84+
@Override
85+
public Object getParameter(String key) {
86+
return null;
87+
}
88+
89+
@Override
90+
public String getProgram(String... statements) {
91+
StringBuilder builder = new StringBuilder();
92+
for (String s: statements) {
93+
builder.append(s).append(";");
94+
}
95+
return builder.toString();
96+
}
97+
98+
@Override
99+
public ScriptEngine getScriptEngine() {
100+
return new KahluaEngine(this);
101+
}
102+
103+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package se.krka.kahlua.scriptengine;
2+
3+
import javax.script.ScriptException;
4+
5+
import javax.script.ScriptEngineFactory;
6+
7+
import org.junit.Test;
8+
9+
import javax.script.ScriptEngine;
10+
11+
import javax.script.ScriptEngineManager;
12+
13+
import static junit.framework.TestCase.*;
14+
15+
public class ScriptEngineTest {
16+
17+
@Test
18+
public void testScriptEngine() throws ScriptException {
19+
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
20+
21+
ScriptEngine engine = scriptEngineManager.getEngineByName("kahlua");
22+
assertNotNull("Kahlua engine is not installed", engine);
23+
Object eval = engine.eval("return 1*2*3*4*5*6");
24+
assertEquals(eval, 720.0);
25+
}
26+
}

src/org/luaj/kahluafork/compiler/LexState.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,10 @@
2222
package org.luaj.kahluafork.compiler;
2323

2424
import java.io.IOException;
25-
import java.io.InputStream;
25+
import java.io.Reader;
2626
import java.io.UnsupportedEncodingException;
2727
import java.util.Hashtable;
28-
2928
import org.luaj.kahluafork.compiler.FuncState.BlockCnt;
30-
3129
import se.krka.kahlua.vm.LuaException;
3230
import se.krka.kahlua.vm.LuaPrototype;
3331

@@ -131,7 +129,7 @@ public void set(Token other) {
131129
final Token t = new Token(); /* current token */
132130
final Token lookahead = new Token(); /* look ahead token */
133131
FuncState fs; /* `FuncState' is private to the parser */
134-
InputStream z; /* input stream */
132+
Reader z; /* input stream */
135133
byte[] buff; /* buffer for tokens */
136134
int nbuff; /* length of buffer */
137135
String source; /* current source name */
@@ -189,7 +187,7 @@ private boolean isspace(int c) {
189187
return (c <= ' ');
190188
}
191189

192-
public static LuaPrototype compile(int firstByte, InputStream z, String name) {
190+
public static LuaPrototype compile(int firstByte, Reader z, String name) {
193191
LexState lexstate = new LexState(z);
194192
FuncState funcstate = new FuncState();
195193
// lexstate.buff = buff;
@@ -208,7 +206,7 @@ public static LuaPrototype compile(int firstByte, InputStream z, String name) {
208206
return funcstate.f;
209207
}
210208

211-
public LexState(InputStream stream) {
209+
public LexState(Reader stream) {
212210
this.z = stream;
213211
this.buff = new byte[32];
214212
}
@@ -327,7 +325,7 @@ void inclinenumber() {
327325
syntaxerror("chunk has too many lines");
328326
}
329327

330-
void setinput(int firstByte, InputStream z, String source ) {
328+
void setinput(int firstByte, Reader z, String source ) {
331329
this.decpoint = '.';
332330
this.lookahead.token = TK_EOS; /* no look-ahead token */
333331
this.z = z;

src/se/krka/kahlua/luaj/compiler/LuaCompiler.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ of this software and associated documentation files (the "Software"), to deal
2222

2323
package se.krka.kahlua.luaj.compiler;
2424

25+
import java.io.InputStreamReader;
26+
27+
import java.io.Reader;
28+
2529
import java.io.ByteArrayInputStream;
2630
import java.io.IOException;
2731
import java.io.InputStream;
@@ -110,8 +114,12 @@ private int loadstring(LuaCallFrame callFrame, int nArguments) {
110114
}
111115

112116
public static LuaClosure loadis(InputStream inputStream, String name, LuaTable environment) throws IOException {
117+
return loadis(new InputStreamReader(inputStream), name, environment);
118+
}
119+
120+
public static LuaClosure loadis(Reader reader, String name, LuaTable environment) throws IOException {
113121
BaseLib.luaAssert(name != null, "no name given the compilation unit");
114-
return new LuaClosure(LexState.compile(inputStream.read(), inputStream, name), environment);
122+
return new LuaClosure(LexState.compile(reader.read(), reader, name), environment);
115123
}
116124

117125
public static LuaClosure loadstring(String source, String name, LuaTable environment) throws IOException {

0 commit comments

Comments
 (0)