1c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta/*
2c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta * Copyright (C) 2014 The Android Open Source Project
3c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta *
4c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta * Licensed under the Apache License, Version 2.0 (the "License");
5c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta * you may not use this file except in compliance with the License.
6c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta * You may obtain a copy of the License at
7c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta *
8c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta *      http://www.apache.org/licenses/LICENSE-2.0
9c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta *
10c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta * Unless required by applicable law or agreed to in writing, software
11c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta * distributed under the License is distributed on an "AS IS" BASIS,
12c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta * See the License for the specific language governing permissions and
14c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta * limitations under the License.
15c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta */
16c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta
17c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Guptapackage dalvik.system;
18c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta
19c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Guptaimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
20c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta
21c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta/**
22c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta * Delegate used to provide implementation of a select few native methods of {@link VMRuntime}
23c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta * <p/>
24c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta * Through the layoutlib_create tool, the original native methods of VMRuntime have been replaced
25c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta * by calls to methods of the same name in this delegate class.
26c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta */
27c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Guptapublic class VMRuntime_Delegate {
28c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta
29c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta    // Copied from libcore/libdvm/src/main/java/dalvik/system/VMRuntime
30c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta    @LayoutlibDelegate
31c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta    /*package*/ static Object newUnpaddedArray(VMRuntime runtime, Class<?> componentType,
32c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int minLength) {
33c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta        // Dalvik has 32bit pointers, the array header is 16bytes plus 4bytes for dlmalloc,
34c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta        // allocations are 8byte aligned so having 4bytes of array data avoids padding.
35c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta        if (!componentType.isPrimitive()) {
36c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int size = ((minLength & 1) == 0) ? minLength + 1 : minLength;
37c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            return java.lang.reflect.Array.newInstance(componentType, size);
38c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta        } else if (componentType == char.class) {
39c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int bytes = 20 + (2 * minLength);
40c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int alignedUpBytes = (bytes + 7) & -8;
41c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int dataBytes = alignedUpBytes - 20;
42c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int size = dataBytes / 2;
43c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            return new char[size];
44c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta        } else if (componentType == int.class) {
45c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int size = ((minLength & 1) == 0) ? minLength + 1 : minLength;
46c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            return new int[size];
47c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta        } else if (componentType == byte.class) {
48c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int bytes = 20 + minLength;
49c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int alignedUpBytes = (bytes + 7) & -8;
50c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int dataBytes = alignedUpBytes - 20;
51c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int size = dataBytes;
52c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            return new byte[size];
53c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta        } else if (componentType == boolean.class) {
54c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int bytes = 20 + minLength;
55c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int alignedUpBytes = (bytes + 7) & -8;
56c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int dataBytes = alignedUpBytes - 20;
57c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int size = dataBytes;
58c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            return new boolean[size];
59c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta        } else if (componentType == short.class) {
60c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int bytes = 20 + (2 * minLength);
61c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int alignedUpBytes = (bytes + 7) & -8;
62c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int dataBytes = alignedUpBytes - 20;
63c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int size = dataBytes / 2;
64c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            return new short[size];
65c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta        } else if (componentType == float.class) {
66c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            int size = ((minLength & 1) == 0) ? minLength + 1 : minLength;
67c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            return new float[size];
68c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta        } else if (componentType == long.class) {
69c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            return new long[minLength];
70c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta        } else if (componentType == double.class) {
71c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            return new double[minLength];
72c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta        } else {
73c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            assert componentType == void.class;
74c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta            throw new IllegalArgumentException("Can't allocate an array of void");
75c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta        }
76c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta    }
77c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta
78c501846c167bcf24abfda522a850f31ed75b983fDeepanshu Gupta}
79