diff options
author | dwagelaar | 2014-01-16 16:31:20 +0000 |
---|---|---|
committer | dwagelaar | 2014-01-16 16:31:20 +0000 |
commit | 3b3050be4511a2edb5a55f225fa3acedd4b3097f (patch) | |
tree | 88883a932b5d6c600b9b141c93e4ff215ef817d7 /plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m | |
parent | 0370afb3a78c13520a631d6f70798e5793e1e9cc (diff) | |
download | org.eclipse.atl-3b3050be4511a2edb5a55f225fa3acedd4b3097f.tar.gz org.eclipse.atl-3b3050be4511a2edb5a55f225fa3acedd4b3097f.tar.xz org.eclipse.atl-3b3050be4511a2edb5a55f225fa3acedd4b3097f.zip |
425904: JIT compiler wrongly wraps byte arrays as a Sequence
https://bugs.eclipse.org/bugs/show_bug.cgi?id=425904
Diffstat (limited to 'plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m')
-rw-r--r-- | plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/jit/ByteCodeSwitch.java | 28 | ||||
-rw-r--r-- | plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/util/EMFTVMUtil.java | 2 |
2 files changed, 16 insertions, 14 deletions
diff --git a/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/jit/ByteCodeSwitch.java b/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/jit/ByteCodeSwitch.java index 43d9fa1d..4fdb11e5 100644 --- a/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/jit/ByteCodeSwitch.java +++ b/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/jit/ByteCodeSwitch.java @@ -2135,20 +2135,22 @@ public class ByteCodeSwitch extends EmftvmSwitch<MethodVisitor> implements Opcod } } else if (cls.isArray()) { final Class<?> cType = cls.getComponentType(); - // Array of cType - final Label ifNull = new Label(); - dup(); // [..., array, array] - ifnull(ifNull); // jump if array == null: [..., array] if (Object.class.isAssignableFrom(cType)) { - invokeStat(Arrays.class, "asList", List.class, Object[].class); // Arrays.asList(array): [..., list] - } else { - invokeStat(JITCodeBlock.class, "asList", List.class, cls); // JITCodeBlock.asList(array): [..., list] - } - new_(LazyListOnList.class); // new LazyListOnList: [..., list, lazylist] - dup_x1(); // [..., lazylist, list, lazylist] - swap(); // [..., lazylist, lazylist, list] - invokeCons(LazyListOnList.class, List.class); // lazylist.<init>(list): [..., lazylist] - label(ifNull); + // Array of cType + final Label ifNull = new Label(); + dup(); // [..., array, array] + ifnull(ifNull); // jump if array == null: [..., array] + if (Object.class.isAssignableFrom(cType)) { + invokeStat(Arrays.class, "asList", List.class, Object[].class); // Arrays.asList(array): [..., list] + } else { + invokeStat(JITCodeBlock.class, "asList", List.class, cls); // JITCodeBlock.asList(array): [..., list] + } + new_(LazyListOnList.class); // new LazyListOnList: [..., list, lazylist] + dup_x1(); // [..., lazylist, list, lazylist] + swap(); // [..., lazylist, lazylist, list] + invokeCons(LazyListOnList.class, List.class); // lazylist.<init>(list): [..., lazylist] + label(ifNull); + } // don't wrap primitive type arrays } // [..., Object] } diff --git a/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/util/EMFTVMUtil.java b/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/util/EMFTVMUtil.java index 2e84a56f..692600e4 100644 --- a/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/util/EMFTVMUtil.java +++ b/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/util/EMFTVMUtil.java @@ -520,7 +520,7 @@ public final class EMFTVMUtil { if (Object.class.isAssignableFrom(value.getClass().getComponentType())) { return new LazyListOnList<Object>(Arrays.asList((Object[]) value)); } else { - return value; // do wrap primitive type arrays + return value; // don't wrap primitive type arrays } } assert eo == null || !(value instanceof Collection<?>); |