diff --git a/src/jse/org/luaj/vm2/luajc/JavaBuilder.java b/src/jse/org/luaj/vm2/luajc/JavaBuilder.java
index 54e897e2..c4a5bcbd 100644
--- a/src/jse/org/luaj/vm2/luajc/JavaBuilder.java
+++ b/src/jse/org/luaj/vm2/luajc/JavaBuilder.java
@@ -197,7 +197,9 @@ public class JavaBuilder {
// create the fields
for ( int i=0; i
constants = new HashMap();
diff --git a/src/jse/org/luaj/vm2/luajc/JavaGen.java b/src/jse/org/luaj/vm2/luajc/JavaGen.java
index b2a7973c..9aa40af2 100644
--- a/src/jse/org/luaj/vm2/luajc/JavaGen.java
+++ b/src/jse/org/luaj/vm2/luajc/JavaGen.java
@@ -317,7 +317,6 @@ public class JavaGen {
builder.dup();
builder.dup();
builder.storeLocal(pc, a);
-// builder.createUpvalues(pc, a+3, 1);
builder.storeLocal(pc, a+3);
builder.loadLocal(pc, a+1); // limit
builder.loadLocal(pc, a+2); // step
diff --git a/src/jse/org/luaj/vm2/luajc/ProtoInfo.java b/src/jse/org/luaj/vm2/luajc/ProtoInfo.java
index d8f7bcdc..94af7867 100644
--- a/src/jse/org/luaj/vm2/luajc/ProtoInfo.java
+++ b/src/jse/org/luaj/vm2/luajc/ProtoInfo.java
@@ -434,14 +434,12 @@ public class ProtoInfo {
public boolean isUpvalueAssign(int pc, int slot) {
VarInfo v = pc<0? params[slot]: vars[slot][pc];
-// return v.upvalue != null && v.upvalue.rw;
- return v != null && v.upvalue != null;
+ return v != null && v.upvalue != null && v.upvalue.rw;
}
public boolean isUpvalueCreate(int pc, int slot) {
VarInfo v = pc<0? params[slot]: vars[slot][pc];
-// return v.upvalue != null && v.upvalue.rw && v.allocupvalue && pc == v.pc;
- return v != null && v.upvalue != null && v.allocupvalue && pc == v.pc;
+ return v != null && v.upvalue != null && v.upvalue.rw && v.allocupvalue && pc == v.pc;
}
public boolean isUpvalueRefer(int pc, int slot) {
@@ -449,12 +447,15 @@ public class ProtoInfo {
if ( pc >= 0 && vars[slot][pc] != null && vars[slot][pc].pc == pc )
pc -= 1;
VarInfo v = pc<0? params[slot]: vars[slot][pc];
-// return v.upvalue != null && v.upvalue.rw;
- return v != null && v.upvalue != null;
+ return v != null && v.upvalue != null && v.upvalue.rw;
}
public boolean isInitialValueUsed(int slot) {
VarInfo v = params[slot];
return v.isreferenced;
}
+
+ public boolean isReadWriteUpvalue(UpvalInfo u) {
+ return u.rw;
+ }
}
diff --git a/test/junit/org/luaj/vm2/FragmentsTest.java b/test/junit/org/luaj/vm2/FragmentsTest.java
index 788be216..4ec860c9 100644
--- a/test/junit/org/luaj/vm2/FragmentsTest.java
+++ b/test/junit/org/luaj/vm2/FragmentsTest.java
@@ -442,5 +442,16 @@ public class FragmentsTest extends TestSuite {
"end\n" +
"return bar()[1]");
}
+
+ public void testReadOnlyAndReadWriteUpvalues() {
+ runFragment( LuaValue.varargsOf( new LuaValue[] { LuaValue.valueOf(333), LuaValue.valueOf(222) } ),
+ "local a = 111\n" +
+ "local b = 222\n" +
+ "local c = function()\n"+
+ " a = a + b\n" +
+ " return a,b\n"+
+ "end\n" +
+ "return c()\n" );
+ }
}
}