File: gen_jni_java.py

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (108 lines) | stat: -rw-r--r-- 3,639 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# Copyright 2023 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Codegen for GEN_JNI.java."""

import common
import java_types


def _stub_for_missing_native(sb, native):
  sb(f'public static {native.proxy_return_type.to_java()} {native.proxy_name}')
  with sb.param_list() as plist:
    plist.extend(p.to_java_declaration() for p in native.proxy_params)
  with sb.block():
    sb('throw new RuntimeException("Native method not present");\n')


def _forwarding_method(sb, jni_mode, native, target_class_name):
  sb(f'public static {native.proxy_return_type.to_java()} {native.proxy_name}')
  sb.param_list([p.to_java_declaration() for p in native.proxy_params])
  with sb.block():
    with sb.statement():
      if not native.proxy_return_type.is_void():
        sb('return ')
      if jni_mode.is_muxing:
        sb(f'{target_class_name}.{native.muxed_name}')
        with sb.param_list() as plist:
          if native.muxed_switch_num != -1:
            plist.append(str(native.muxed_switch_num))
          plist.extend(p.name for p in native.muxed_params)
      else:
        sb(f'{target_class_name}.{native.hashed_name}')
        sb.param_list([p.name for p in native.proxy_params])


def _native_method(sb, jni_mode, native):
  name = native.boundary_name(jni_mode)
  if jni_mode.is_hashing:
    sb(f'// Original name: {native.java_class.full_name_with_dots}#{native.name}\n'
       )
  elif not jni_mode.is_muxing:
    sb(f'// Hashed name: Java_J_N_{native.hashed_name}\n')
  with sb.statement():
    sb(f'public static native {native.proxy_return_type.to_java()} {name}')
    with sb.param_list() as plist:
      if jni_mode.is_muxing:
        if native.muxed_switch_num != -1:
          plist.append('int _switchNum')
        for i, p in enumerate(native.muxed_params):
          plist.append(f'{p.java_type.to_java()} p{i}')
      else:
        plist.extend(p.to_java_declaration() for p in native.proxy_params)


def generate_forwarding(jni_mode, script_name, full_gen_jni_class,
                        short_gen_jni_class, present_proxy_natives,
                        absent_proxy_natives):
  """GEN_JNI.java that forwards calls to native methods on N.java."""
  sb = common.StringBuilder()
  sb(f"""\
//
// This file was generated by {script_name}
//

package {full_gen_jni_class.package_with_dots};

public class {full_gen_jni_class.name}""")
  with sb.block():
    short_class_with_dots = short_gen_jni_class.full_name_with_dots
    for native in present_proxy_natives:
      _forwarding_method(sb, jni_mode, native, short_class_with_dots)

    for native in absent_proxy_natives:
      _stub_for_missing_native(sb, native)
  return sb.to_string()


def generate_impl(jni_mode,
                  script_name,
                  gen_jni_class,
                  boundary_proxy_natives,
                  absent_proxy_natives,
                  *,
                  whole_hash=None,
                  priority_hash=None):
  """GEN_JNI.java (or N.java) that has all "public static native" methods."""
  sb = common.StringBuilder()
  sb(f"""\
//
// This file was generated by {script_name}
//

package {gen_jni_class.package_with_dots};

public class {gen_jni_class.name}""")
  with sb.block():
    if jni_mode.is_muxing:
      sb(f"""\
public static final long WHOLE_HASH = {whole_hash}L;
public static final long PRIORITY_HASH = {priority_hash}L;

""")

    for native in boundary_proxy_natives:
      _native_method(sb, jni_mode, native)
    for native in absent_proxy_natives:
      _stub_for_missing_native(sb, native)
  return sb.to_string()