jaroslav@106: /** jaroslav@106: * Back 2 Browser Bytecode Translator jaroslav@106: * Copyright (C) 2012 Jaroslav Tulach jaroslav@106: * jaroslav@106: * This program is free software: you can redistribute it and/or modify jaroslav@106: * it under the terms of the GNU General Public License as published by jaroslav@106: * the Free Software Foundation, version 2 of the License. jaroslav@106: * jaroslav@106: * This program is distributed in the hope that it will be useful, jaroslav@106: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@106: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@106: * GNU General Public License for more details. jaroslav@106: * jaroslav@106: * You should have received a copy of the GNU General Public License jaroslav@106: * along with this program. Look for COPYING file in the top folder. jaroslav@106: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@106: */ jaroslav@22: package org.apidesign.vm4brwsr; jaroslav@21: jaroslav@1532: import org.apidesign.bck2brwsr.core.JavaScriptBody; jaroslav@1532: jaroslav@21: /** jaroslav@21: * jaroslav@21: * @author Jaroslav Tulach jaroslav@21: */ jaroslav@21: public class Array { jaroslav@21: byte[] bytes = { 1 }; jaroslav@21: short[] shorts = { 2, 3 }; jaroslav@21: int[] ints = { 4, 5, 6 }; jaroslav@21: float[] floats = { 7, 8, 9, 10 }; jaroslav@21: double[][] doubles = { {11}, {12}, {13}, {14}, {15} }; jaroslav@21: char[] chars = { 'a', 'b' }; jaroslav@21: jaroslav@21: private Array() { jaroslav@21: } jaroslav@21: jaroslav@21: byte bytes() { jaroslav@21: return bytes[0]; jaroslav@21: } jaroslav@21: short shorts() { jaroslav@21: return shorts[1]; jaroslav@21: } jaroslav@21: jaroslav@32: int[] ints() { jaroslav@32: return ints; jaroslav@21: } jaroslav@21: jaroslav@21: float floats() { jaroslav@21: return floats[3]; jaroslav@21: } jaroslav@21: jaroslav@21: double doubles() { jaroslav@21: return doubles[4][0]; jaroslav@21: } jaroslav@21: jaroslav@457: static double[][] dbls = new double[1][2]; jaroslav@457: public static double twoDoubles() { jaroslav@457: return dbls[0][0] + dbls[0][0]; jaroslav@457: } jaroslav@457: jaroslav@457: static int[][] tints = new int[1][2]; jaroslav@457: public static int twoInts() { jaroslav@457: return tints[0][0] + tints[0][0]; jaroslav@457: } jaroslav@457: jaroslav@21: private static final Array[] ARR = { new Array(), new Array(), new Array() }; jaroslav@21: jtulach@128: private static Array[][] arr() { jtulach@128: Array[][] matrix = new Array[3][3]; jtulach@128: for (int i = 0; i < ARR.length; i++) { jtulach@128: matrix[i][i] = ARR[i]; jtulach@128: } jtulach@128: return matrix; jaroslav@33: } jaroslav@33: private static T[] filter(T[] in) { jaroslav@33: return in; jaroslav@33: } jaroslav@33: jaroslav@21: public static double sum() { jaroslav@1535: disableClassForName(); jaroslav@21: double sum = 0.0; jtulach@128: for (Array[] row : arr()) { jtulach@128: int indx = -1; jtulach@128: for (Array a : row) { jtulach@128: indx++; jtulach@128: if (a == null) { jtulach@128: continue; jtulach@128: } jtulach@128: sum += a.bytes(); jtulach@128: sum += a.shorts(); jtulach@128: sum += a.ints()[2]; jtulach@128: sum += a.floats(); jtulach@128: sum += filter(row)[indx].doubles(); jtulach@128: } jaroslav@21: } jaroslav@21: return sum; jaroslav@21: } jaroslav@402: private static final int[] arr = { 0, 1, 2, 3, 4, 5 }; jaroslav@402: public static int simple(boolean clone) { jaroslav@402: int[] ar; jaroslav@402: if (clone) { jaroslav@402: ar = arr.clone(); jaroslav@402: } else { jaroslav@402: ar = arr; jaroslav@402: } jaroslav@21: jaroslav@21: int sum = 0; jaroslav@402: for (int a : ar) { jtulach@128: sum += a; jaroslav@21: } jaroslav@21: return sum; jaroslav@21: } jaroslav@104: jaroslav@567: public static String objectArrayClass() { jaroslav@1535: enableClassForName(prevClassForName); jaroslav@1535: prevClassForName = null; jaroslav@1535: String s = Object[].class.getName(); jaroslav@1535: disableClassForName(); jaroslav@1535: return s; jaroslav@567: } jaroslav@567: jaroslav@571: public static boolean instanceOfArray(Object obj) { jaroslav@1534: if ("string-array".equals(obj)) { jaroslav@1534: obj = new String[] { "Ahoj" }; jaroslav@1534: } jaroslav@571: return obj instanceof Object[]; jaroslav@571: } jaroslav@571: jaroslav@1534: public static boolean castArray(int type) { jaroslav@1534: try { jaroslav@1534: Object orig = new Object(); jaroslav@1534: Object res = orig; jaroslav@1534: if (type == 0) { jaroslav@1534: Object[] arr = new Integer[1]; jaroslav@1534: String[] str = (String[]) arr; jaroslav@1534: res = str; jaroslav@1534: } jaroslav@1534: if (type == 1) { jaroslav@1534: Object[] arr = null; jaroslav@1534: String[] str = (String[]) arr; jaroslav@1534: res = str; jaroslav@1534: } jaroslav@1534: if (type == 2) { jaroslav@1534: Object[] arr = new String[1]; jaroslav@1534: String[] str = (String[]) arr; jaroslav@1534: res = str; jaroslav@1534: } jaroslav@1534: if (type == 3) { jaroslav@1534: Object[] arr = new String[1]; jaroslav@1534: CharSequence[] str = (CharSequence[]) arr; jaroslav@1534: res = str; jaroslav@1534: } jaroslav@1534: return res != orig; jaroslav@1534: } catch (ClassCastException ex) { jaroslav@1534: return false; jaroslav@1534: } jaroslav@1534: } jaroslav@1534: jaroslav@446: public static int sum(int size) { jaroslav@446: int[] arr = new int[size]; jaroslav@446: return arr[0] + arr[1]; jaroslav@446: } jaroslav@446: jaroslav@104: static void arraycopy(char[] value, int srcBegin, char[] dst, int dstBegin, int count) { jaroslav@104: while (count-- > 0) { jaroslav@104: dst[dstBegin++] = value[srcBegin++]; jaroslav@104: } jaroslav@104: } jaroslav@104: jaroslav@104: public static char copyArray() { jaroslav@104: char[] arr = { '0' }; jtulach@128: arraycopy(arr()[0][0].chars, 0, arr, 0, 1); jaroslav@104: return arr[0]; jaroslav@104: } jaroslav@807: jaroslav@1532: @JavaScriptBody(args = { }, body = jaroslav@1535: "var prev = vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2;\n" jaroslav@1535: + "if (!prev) throw 'forName not defined';\n" jaroslav@1532: + "vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2 = function(s) {\n" jaroslav@1532: + " throw 'Do not call me: ' + s;\n" jaroslav@1535: + "};\n" jaroslav@1535: + "return prev;\n") jaroslav@1535: private static Object disableClassForNameImpl() { jaroslav@1535: return null; jaroslav@1532: } jaroslav@1532: jaroslav@1535: private static void disableClassForName() { jaroslav@1535: if (prevClassForName == null) { jaroslav@1535: prevClassForName = disableClassForNameImpl(); jaroslav@1535: } jaroslav@1535: } jaroslav@1535: jaroslav@1535: @JavaScriptBody(args = { "fn" }, body = jaroslav@1535: "if (fn !== null) vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2 = fn;" jaroslav@1535: ) jaroslav@1535: private static void enableClassForName(Object fn) { jaroslav@1535: } jaroslav@1535: jaroslav@1535: private static Object prevClassForName; jaroslav@1532: public static String nameOfClonedComponent() { jaroslav@1532: disableClassForName(); jaroslav@1532: Object[] intArr = new Integer[10]; jaroslav@1532: intArr = intArr.clone(); jaroslav@1532: return intArr.getClass().getComponentType().getName(); jaroslav@1532: } jaroslav@1532: jaroslav@807: public static int multiLen() { jaroslav@807: return new int[1][0].length; jaroslav@807: } jaroslav@1702: jaroslav@1702: @JavaScriptBody(args = { "arr" }, body = jaroslav@1702: "var cnt = '';\n" + jaroslav@1702: "if (arr === null) arr = [];\n" + jaroslav@1702: "for (var i in arr) { cnt += i; }\n" + jaroslav@1702: "return cnt;\n" jaroslav@1702: ) jaroslav@1702: private static native String iterateArray(Object[] arr); jaroslav@1702: jaroslav@1702: public static String iterateArray(boolean javaArray) { jaroslav@1702: return iterateArray(javaArray ? new String[0] : null); jaroslav@1702: } jaroslav@21: }