/** * Creates a List from a V8Array using a deep copy. All elements * in the V8Array are released after they are accessed. However, the root * array itself is not released. * * @param array The root of the V8Array graph. * * @return A list representing a deep copy of the V8Array rooted at 'array'. */ public static List<? super Object> toList(final V8Array array) { return toList(array, DEFAULT_TYPE_ADAPTER); }
/** * Creates a List from a V8Array using a deep copy and a TypeAdapter to handle * type conversions. All elements in the V8Array are released after they are accessed. * However, the root array itself is not released. * * @param array The root of the V8Array graph. * @param adapter The {@link TypeAdapter} to use for the object conversions. * * @return A list representing a deep copy of the V8Array rooted at 'array'. */ public static List<? super Object> toList(final V8Array array, final TypeAdapter adapter) { V8Map<Object> cache = new V8Map<Object>(); try { return toList(array, cache, adapter); } finally { cache.close(); } }
private static Object getValue(final Object value, final int valueType, final V8Map<Object> cache, final TypeAdapter adapter) { Object adapterResult = adapter.adapt(valueType, value); if (TypeAdapter.DEFAULT != adapterResult) { return adapterResult; } switch (valueType) { case V8Value.INTEGER: case V8Value.DOUBLE: case V8Value.BOOLEAN: case V8Value.STRING: return value; case V8Value.V8_FUNCTION: return IGNORE; case V8Value.V8_ARRAY_BUFFER: return new ArrayBuffer((V8ArrayBuffer) value); case V8Value.V8_TYPED_ARRAY: return new TypedArray((V8TypedArray) value); case V8Value.V8_ARRAY: return toList((V8Array) value, cache, adapter); case V8Value.V8_OBJECT: return toMap((V8Object) value, cache, adapter); case V8Value.NULL: return null; case V8Value.UNDEFINED: return V8.getUndefined(); default: throw new IllegalStateException("Cannot convert type " + V8Value.getStringRepresentation(valueType)); } }
/** * Creates a List from a V8Array using a deep copy. All elements * in the V8Array are released after they are accessed. However, the root * array itself is not released. * * @param array The root of the V8Array graph. * * @return A list representing a deep copy of the V8Array rooted at 'array'. */ public static List<? super Object> toList(final V8Array array) { return toList(array, DEFAULT_TYPE_ADAPTER); }
@Test public void testNullArrayGivesEmptyMap() { List<? super Object> list = V8ObjectUtils.toList(null); assertNotNull(list); assertEquals(0, list.size()); }
@Test public void testCreateListWithFunction() { V8Array array = v8.executeArrayScript("x = [function() {return 1;}, 'foo']; x;"); List<Object> list = V8ObjectUtils.toList(array); assertEquals(1, list.size()); assertEquals("foo", list.get(0)); array.close(); }
@Test public void testCreateListFromV8Array() { V8Array array = v8.executeArrayScript("x = [1,2,3]; x"); List<? super Object> list = V8ObjectUtils.toList(array); assertEquals(3, list.size()); assertEquals(1, list.get(0)); assertEquals(2, list.get(1)); assertEquals(3, list.get(2)); array.close(); }
@Test public void testCreateListWithNullFromV8Array() { V8Array array = v8.executeArrayScript("x = [null]; x"); List<? super Object> list = V8ObjectUtils.toList(array); assertEquals(1, list.size()); assertNull(list.get(0)); array.close(); }
@Test public void testObjectNullTypeAdapter_List() { V8Array array = v8.executeArrayScript("x = [{a:{}}]; x"); List<? super Object> list = V8ObjectUtils.toList(array, new SingleTypeAdapter(V8Value.V8_OBJECT) { @Override public Object adapt(final Object value) { return null; } }); assertEquals(1, list.size()); assertNull(list.get(0)); array.close(); }
@Test public void testObjectTypeAdapter_List() { V8Array array = v8.executeArrayScript("x = [{a:{}}]; x"); List<? super Object> list = V8ObjectUtils.toList(array, new SingleTypeAdapter(V8Value.V8_OBJECT) { @Override public Object adapt(final Object value) { return "object"; } }); assertEquals(1, list.size()); assertEquals("object", list.get(0)); array.close(); }
@Test public void testIntegerTypeAdapter_List() { V8Array array = v8.executeArrayScript("x = [1, 3.14, false, 'string']; x"); List<? super Object> list = V8ObjectUtils.toList(array, new SingleTypeAdapter(V8Value.INTEGER) { @Override public Object adapt(final Object value) { return 7; } }); assertEquals(4, list.size()); assertEquals(7, list.get(0)); assertEquals(3.14, (Double) list.get(1), 0.00001); assertEquals(false, list.get(2)); assertEquals("string", list.get(3)); array.close(); }
@Test public void testStringTypeAdapter_List() { V8Array array = v8.executeArrayScript("x = [1, 3.14, false, 'string']; x"); List<? super Object> list = V8ObjectUtils.toList(array, new SingleTypeAdapter(V8Value.STRING) { @Override public Object adapt(final Object value) { return "foo"; } }); assertEquals(4, list.size()); assertEquals(1, list.get(0)); assertEquals(3.14, (Double) list.get(1), 0.00001); assertEquals(false, list.get(2)); assertEquals("foo", list.get(3)); array.close(); }
@Test public void testDoubleTypeAdapter_List() { V8Array array = v8.executeArrayScript("x = [1, 3.14, false, 'string']; x"); List<? super Object> list = V8ObjectUtils.toList(array, new SingleTypeAdapter(V8Value.DOUBLE) { @Override public Object adapt(final Object value) { return 7.7; } }); assertEquals(4, list.size()); assertEquals(1, list.get(0)); assertEquals(7.7, (Double) list.get(1), 0.00001); assertEquals(false, list.get(2)); assertEquals("string", list.get(3)); array.close(); }
@Test public void testBooleanTypeAdapter_List() { V8Array array = v8.executeArrayScript("x = [1, 3.14, false, 'string']; x"); List<? super Object> list = V8ObjectUtils.toList(array, new SingleTypeAdapter(V8Value.BOOLEAN) { @Override public Object adapt(final Object value) { return true; } }); assertEquals(4, list.size()); assertEquals(1, list.get(0)); assertEquals(3.14, (Double) list.get(1), 0.00001); assertEquals(true, list.get(2)); assertEquals("string", list.get(3)); array.close(); }
@Test public void testV8ArrayContainsSelf() { V8Array v8Array = new V8Array(v8); v8Array.push(v8Array); List<Object> list = V8ObjectUtils.toList(v8Array); assertEquals(list, list.get(0)); v8Array.close(); }
@Test public void testObjectUndefinedTypeAdapter_List() { V8Array array = v8.executeArrayScript("x = [{a:{}}]; x"); List<? super Object> list = V8ObjectUtils.toList(array, new SingleTypeAdapter(V8Value.V8_OBJECT) { @Override public Object adapt(final Object value) { return V8.getUndefined(); } }); assertEquals(1, list.size()); assertEquals(V8.getUndefined(), list.get(0)); array.close(); }
@Test public void testCreateListWithUndefinedFromV8Array() { V8Array array = v8.executeArrayScript("x = [1,2,3]; x[9] = 10; x"); List<? super Object> list = V8ObjectUtils.toList(array); assertEquals(10, list.size()); assertEquals(1, list.get(0)); assertEquals(2, list.get(1)); assertEquals(3, list.get(2)); assertTrue(((V8Value) list.get(3)).isUndefined()); assertTrue(((V8Value) list.get(4)).isUndefined()); assertTrue(((V8Value) list.get(5)).isUndefined()); assertTrue(((V8Value) list.get(6)).isUndefined()); assertTrue(((V8Value) list.get(7)).isUndefined()); assertTrue(((V8Value) list.get(8)).isUndefined()); assertEquals(10, list.get(9)); array.close(); }
@Test public void testCreateFunctionListFromV8Object() { V8Array object = v8.executeArrayScript("x = [function() {return 'a'}, function(){return 'b'}]; x"); MemoryManager memoryManager = new MemoryManager(v8); List<? super Object> list = V8ObjectUtils.toList(object, new SingleTypeAdapter(V8Value.V8_FUNCTION) { @Override public Object adapt(final Object value) { return ((V8Function) value).twin(); } }); assertEquals(2, list.size()); assertEquals("a", ((V8Function) list.get(0)).call(null, null)); assertEquals("b", ((V8Function) list.get(1)).call(null, null)); memoryManager.release(); object.close(); }
@Test public void testCloneV8Array() { V8Array list = v8.executeArrayScript("var l = [{first:'ian', last:'bull'}, {first:'sadie', last:'bull'}]; l;"); V8Array v8Object = V8ObjectUtils.toV8Array(v8, V8ObjectUtils.toList(list)); v8.add("l2", v8Object); v8.executeBooleanScript("JSON.stringify(l) === JSON.stringify(l2);"); list.close(); v8Object.close(); }
@Override public void run(final V8 runtime) { runtime.registerJavaMethod(new Sort(), "_sort"); runtime.executeVoidScript(sortAlgorithm); V8Array parameters = V8ObjectUtils.toV8Array(runtime, data); V8Array _result = runtime.executeArrayFunction("sort", parameters); result = V8ObjectUtils.toList(_result); _result.close(); parameters.close(); } });