• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1    /* Copyright (C) 2008 The Android Open Source Project
2     *
3     * Licensed under the Apache License, Version 2.0 (the "License");
4     * you may not use this file except in compliance with the License.
5     * You may obtain a copy of the License at
6     *
7     * http://www.apache.org/licenses/LICENSE-2.0
8     *
9     * Unless required by applicable law or agreed to in writing, software
10     * distributed under the License is distributed on an "AS IS" BASIS,
11     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12     * See the License for the specific language governing permissions and
13     * limitations under the License.
14     */
15 
16    /*
17     * The class loader will associate with each method a 32-bit info word
18     * (jniArgInfo) to support JNI calls.  The high order 4 bits of this word
19     * are the same for all targets, while the lower 28 are used for hints to
20     * allow accelerated JNI bridge transfers.
21     *
22     * jniArgInfo (32-bit int) layout:
23     *
24     *    SRRRHHHH HHHHHHHH HHHHHHHH HHHHHHHH
25     *
26     *    S - if set, ignore the hints and do things the hard way (scan signature)
27     *    R - return-type enumeration
28     *    H - target-specific hints (see below for details)
29     *
30     * This function produces IA32-specific hints for the standard 32-bit 386 ABI.
31     * All arguments have 32-bit alignment.  Padding is not an issue.
32     *
33     * IA32 ABI JNI hint format
34     *
35     *       ZZZZ ZZZZZZZZ AAAAAAAA AAAAAAAA
36     *
37     *   Z - reserved, must be 0
38     *   A - size of variable argument block in 32-bit words (note - does not
39     *       include JNIEnv or clazz)
40     *
41     * For the 386 ABI, valid hints should always be generated.
42     */
43 
44 
45 #include "Dalvik.h"
46 #include "libdex/DexClass.h"
47 #include <stdlib.h>
48 #include <stddef.h>
49 #include <sys/stat.h>
50 
dvmPlatformInvokeHints(const DexProto * proto)51 u4 dvmPlatformInvokeHints(const DexProto* proto)  {
52 
53 const char* sig = dexProtoGetShorty(proto);
54 unsigned int wordCount = 0;
55 char sigByte;
56 
57  while (1) {
58 
59    /*
60     * Move past return type; dereference sigByte
61     */
62 
63     sigByte = *(++sig);
64     if (sigByte == '\0') { break; }
65     ++wordCount;
66 
67     if (sigByte == 'D' || sigByte == 'J') {
68       ++wordCount;
69     }
70  }
71 
72 /*
73  * Check for Dex file limitation and return
74  */
75 
76  if (wordCount > 0xFFFF) { return DALVIK_JNI_NO_ARG_INFO; }
77  return wordCount;
78 
79 }
80