mirror of
https://github.com/frida/frida-python.git
synced 2026-11-11 10:01:27 -10:00
Compare commits
No files matched your search
@@ -1,4 +1,4 @@
|
||||
PYTHON ?= $(shell which python3 >/dev/null && echo python3 || echo python)
|
||||
PYTHON ?= $(shell command -v python3 >/dev/null && echo python3 || echo python)
|
||||
|
||||
all $(MAKECMDGOALS):
|
||||
@$(PYTHON) \
|
||||
@@ -8,7 +8,7 @@ all $(MAKECMDGOALS):
|
||||
$(MAKECMDGOALS)
|
||||
|
||||
git-submodules:
|
||||
@if [ ! -f releng/meson/meson.py ] || [ ! -f frida-bindgen/frida_bindgen_core/model.py ]; then \
|
||||
@if [ ! -f releng/meson/meson.py ] || git submodule status 2>/dev/null | grep -q '^-'; then \
|
||||
git submodule update --init --recursive --depth 1; \
|
||||
fi
|
||||
-include git-submodules
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#!/bin/sh
|
||||
|
||||
[ -z "$PYTHON" ] && PYTHON=$(which python3 >/dev/null && echo python3 || echo python)
|
||||
[ -z "$PYTHON" ] && PYTHON=$(command -v python3 >/dev/null && echo python3 || echo python)
|
||||
|
||||
cd $(dirname $0)
|
||||
|
||||
srcroot=$(pwd)
|
||||
|
||||
if [ ! -f releng/meson/meson.py ]; then
|
||||
if [ ! -f releng/meson/meson.py ] || git submodule status 2>/dev/null | grep -q '^-'; then
|
||||
git submodule update --init --recursive --depth 1 || exit $?
|
||||
fi
|
||||
|
||||
|
||||
Generated
+4
-4
@@ -9,7 +9,7 @@
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"core-js": "^3.6.5",
|
||||
"dbus-next": "frida/node-dbus-next",
|
||||
"dbus-next": "frida-forks/node-dbus-next",
|
||||
"duplexify": "^4.1.1",
|
||||
"vue": "^2.6.11",
|
||||
"vue-class-component": "^7.2.3",
|
||||
@@ -6509,7 +6509,7 @@
|
||||
},
|
||||
"node_modules/dbus-next": {
|
||||
"version": "0.9.2",
|
||||
"resolved": "git+ssh://[email protected]/frida/node-dbus-next.git#0e12559b2298c140916541f57fdf9f83cf0b7975",
|
||||
"resolved": "git+ssh://[email protected]/frida-forks/node-dbus-next.git#0e12559b2298c140916541f57fdf9f83cf0b7975",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@nornagon/put": "0.0.8",
|
||||
@@ -20437,8 +20437,8 @@
|
||||
"peer": true
|
||||
},
|
||||
"dbus-next": {
|
||||
"version": "git+ssh://[email protected]/frida/node-dbus-next.git#0e12559b2298c140916541f57fdf9f83cf0b7975",
|
||||
"from": "dbus-next@frida/node-dbus-next",
|
||||
"version": "git+ssh://[email protected]/frida-forks/node-dbus-next.git#0e12559b2298c140916541f57fdf9f83cf0b7975",
|
||||
"from": "dbus-next@frida-forks/node-dbus-next",
|
||||
"requires": {
|
||||
"@nornagon/put": "0.0.8",
|
||||
"abstract-socket": "^2.0.0",
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"core-js": "^3.6.5",
|
||||
"dbus-next": "frida/node-dbus-next",
|
||||
"dbus-next": "frida-forks/node-dbus-next",
|
||||
"duplexify": "^4.1.1",
|
||||
"vue": "^2.6.11",
|
||||
"vue-class-component": "^7.2.3",
|
||||
|
||||
+1
-1
Submodule frida-bindgen updated: df17879d92...eace04901e.
@@ -910,6 +910,9 @@ propagate_error:
|
||||
static PyObject *
|
||||
PyGObject_marshal_variant (GVariant * variant)
|
||||
{
|
||||
if (variant == NULL)
|
||||
PyFrida_RETURN_NONE;
|
||||
|
||||
switch (g_variant_classify (variant))
|
||||
{
|
||||
case G_VARIANT_CLASS_STRING:
|
||||
|
||||
@@ -436,7 +436,7 @@ def generate_aio_async_method(method: Method, model: Model) -> Optional[str]:
|
||||
if method.return_value is not None:
|
||||
call = wrap_result(call, method.return_value.type, model)
|
||||
|
||||
ret = "None" if method.return_value is None else pyi_type(method.return_value.type, model)
|
||||
ret = facade_return_type(method, model)
|
||||
|
||||
return f""" async def {method.name}({signature}) -> {ret}:
|
||||
return {call}"""
|
||||
@@ -460,7 +460,7 @@ def generate_custom_facade_method(
|
||||
body = textwrap.indent(logic.strip(), " " * 8)
|
||||
keyword = "async def" if awaitable else "def"
|
||||
|
||||
ret = "None" if method.return_value is None else pyi_type(method.return_value.type, model)
|
||||
ret = facade_return_type(method, model)
|
||||
|
||||
return f""" {keyword} {method.name}({signature}) -> {ret}:
|
||||
{body}
|
||||
@@ -667,7 +667,7 @@ def generate_py_sync_method(method: Method, model: Model) -> Optional[str]:
|
||||
if method.return_value is not None:
|
||||
call = wrap_result(call, method.return_value.type, model)
|
||||
|
||||
ret = "None" if method.return_value is None else pyi_type(method.return_value.type, model)
|
||||
ret = facade_return_type(method, model)
|
||||
|
||||
return f""" def {method.name}({facade_signature(method, params)}) -> {ret}:
|
||||
return {call}"""
|
||||
@@ -703,7 +703,7 @@ def generate_py_async_method(method: Method, model: Model) -> Optional[str]:
|
||||
if method.return_value is not None:
|
||||
call = wrap_result(call, method.return_value.type, model)
|
||||
|
||||
ret = "None" if method.return_value is None else pyi_type(method.return_value.type, model)
|
||||
ret = facade_return_type(method, model)
|
||||
|
||||
return f""" def {method.name}({signature}) -> {ret}:
|
||||
return {call}"""
|
||||
@@ -793,8 +793,8 @@ def generate_pyi_class(otype: ObjectType, model: Model) -> List[str]:
|
||||
|
||||
body = []
|
||||
|
||||
primary = primary_constructor(otype)
|
||||
if primary is not None and not primary.throws:
|
||||
primary = inline_constructor(otype)
|
||||
if primary is not None:
|
||||
params = pyi_parameters(primary.input_parameters, model)
|
||||
if params is not None:
|
||||
signature = ", ".join(["self"] + params)
|
||||
@@ -869,7 +869,13 @@ def pyi_method(method: Method, model: Model) -> Optional[str]:
|
||||
if params is None:
|
||||
return None
|
||||
signature = ", ".join(["self"] + params)
|
||||
ret = "None" if method.return_value is None else pyi_type(method.return_value.type, model)
|
||||
out = method.optional_out_parameter
|
||||
if out is not None:
|
||||
ret = f"Optional[{pyi_type(out.type, model)}]"
|
||||
elif method.return_value is None:
|
||||
ret = "None"
|
||||
else:
|
||||
ret = pyi_type(method.return_value.type, model)
|
||||
return f" def {method.name}({signature}) -> {ret}: ..."
|
||||
|
||||
|
||||
@@ -958,7 +964,9 @@ def generate_extension_c(model: Model) -> str:
|
||||
|
||||
code += generate_object_type_constructor(otype)
|
||||
for ctor in factory_constructors(otype):
|
||||
code += generate_factory_function(otype, ctor, build_constructor_marshals(ctor))
|
||||
marshals = build_constructor_marshals(ctor)
|
||||
assert marshals is not None
|
||||
code += generate_factory_function(otype, ctor, marshals)
|
||||
|
||||
return code
|
||||
|
||||
@@ -1371,6 +1379,11 @@ def generate_method(otype: ObjectType, method: Method) -> Optional[Tuple[str, st
|
||||
marshal = synchronous_method_return_marshal(method)
|
||||
if marshal is None:
|
||||
return None
|
||||
out = method.optional_out_parameter
|
||||
if out is not None:
|
||||
marshal = build_return_marshal(out.type, method.object_type.model)
|
||||
if marshal is None:
|
||||
return None
|
||||
params = []
|
||||
for param in method.input_parameters:
|
||||
sync_param = build_sync_param(param)
|
||||
@@ -1714,14 +1727,17 @@ def generate_synchronous_method(otype: ObjectType, method: Method, marshal: str,
|
||||
indent = " " * (len(otype.c_symbol_prefix) + len(method.name) + 3)
|
||||
handle = f"({otype.c_type} *) PY_GOBJECT_HANDLE (self)"
|
||||
returns_strv = method.return_value is not None and method.return_value.type.name == "utf8[]"
|
||||
out = method.optional_out_parameter
|
||||
call_arg_list = [handle] + [p.call_arg for p in params]
|
||||
if returns_strv:
|
||||
call_arg_list.append("&retval_length")
|
||||
if out is not None:
|
||||
call_arg_list.append(f"&{out.name}")
|
||||
if method.throws:
|
||||
call_arg_list.append("&error")
|
||||
call = f"{method.c_identifier} ({', '.join(call_arg_list)})"
|
||||
|
||||
if not params and not method.throws and not returns_strv:
|
||||
if not params and not method.throws and not returns_strv and out is None:
|
||||
if method.return_value is None:
|
||||
body = f" {call};\n\n PyFrida_RETURN_NONE;"
|
||||
else:
|
||||
@@ -1740,6 +1756,8 @@ static PyObject *
|
||||
decls.append(" GError * error = NULL;")
|
||||
if returns_strv:
|
||||
decls.append(" gint retval_length;")
|
||||
if out is not None:
|
||||
decls.append(f" {out_parameter_storage_type(out)} {out.name};")
|
||||
for p in params:
|
||||
decls += [f" {line}" for line in p.decl.splitlines()]
|
||||
|
||||
@@ -1754,7 +1772,15 @@ static PyObject *
|
||||
|
||||
pre = "".join(f"\n {p.pre}\n" for p in params if p.pre)
|
||||
|
||||
if method.return_value is None:
|
||||
if out is not None:
|
||||
invocation = f" gboolean found = {call};"
|
||||
success = (
|
||||
" if (found)\n"
|
||||
f" result = {marshal.format(value=out.name)};\n"
|
||||
" else\n"
|
||||
" {\n Py_IncRef (Py_None);\n result = Py_None;\n }"
|
||||
)
|
||||
elif method.return_value is None:
|
||||
invocation = f" {call};"
|
||||
success = " Py_IncRef (Py_None);\n result = Py_None;"
|
||||
elif returns_strv:
|
||||
@@ -1799,6 +1825,22 @@ static PyObject *
|
||||
"""
|
||||
|
||||
|
||||
def facade_return_type(method: Method, model: Model) -> str:
|
||||
out = method.optional_out_parameter
|
||||
if out is not None:
|
||||
return f"Optional[{pyi_type(out.type, model)}]"
|
||||
if method.return_value is None:
|
||||
return "None"
|
||||
return pyi_type(method.return_value.type, model)
|
||||
|
||||
|
||||
def out_parameter_storage_type(param: Parameter) -> str:
|
||||
"""What the caller declares: the out parameter's own type, less the pointer."""
|
||||
c = param.type.c
|
||||
assert c.endswith("*"), c
|
||||
return c[:-1].strip()
|
||||
|
||||
|
||||
def synchronous_method_return_marshal(method: Method) -> Optional[str]:
|
||||
if method.is_async or method.is_property_accessor:
|
||||
return None
|
||||
@@ -2328,8 +2370,16 @@ def primary_constructor(otype: ObjectType) -> Optional[Procedure]:
|
||||
return next((c for c in otype.constructors if c.name == "new"), otype.constructors[0])
|
||||
|
||||
|
||||
def inline_constructor(otype: ObjectType) -> Optional[Procedure]:
|
||||
"""The constructor __init__ takes; one that throws is reached as a factory instead."""
|
||||
ctor = primary_constructor(otype)
|
||||
if ctor is None or ctor.throws:
|
||||
return None
|
||||
return ctor
|
||||
|
||||
|
||||
def factory_constructors(otype: ObjectType) -> List[Procedure]:
|
||||
primary = primary_constructor(otype)
|
||||
primary = inline_constructor(otype)
|
||||
return [
|
||||
ctor
|
||||
for ctor in otype.constructors
|
||||
|
||||
@@ -17,6 +17,10 @@ class Model(core.Model):
|
||||
|
||||
|
||||
class ObjectType(core.ObjectType):
|
||||
@cached_property
|
||||
def methods(self) -> List["Method"]:
|
||||
return [m for m in super().methods if not m.out_parameters or m.optional_out_parameter is not None]
|
||||
|
||||
@cached_property
|
||||
def py_name(self) -> str:
|
||||
custom = self.customizations
|
||||
@@ -277,6 +281,7 @@ def _make_class(
|
||||
type_struct,
|
||||
parent,
|
||||
constructors,
|
||||
functions,
|
||||
methods,
|
||||
properties,
|
||||
signals,
|
||||
@@ -291,6 +296,7 @@ def _make_class(
|
||||
type_struct,
|
||||
parent,
|
||||
constructors,
|
||||
functions,
|
||||
methods,
|
||||
properties,
|
||||
signals,
|
||||
@@ -307,6 +313,7 @@ def _make_interface(
|
||||
type_struct,
|
||||
parent,
|
||||
constructors,
|
||||
functions,
|
||||
methods,
|
||||
properties,
|
||||
signals,
|
||||
@@ -320,6 +327,7 @@ def _make_interface(
|
||||
type_struct,
|
||||
parent,
|
||||
constructors,
|
||||
functions,
|
||||
methods,
|
||||
properties,
|
||||
signals,
|
||||
|
||||
+1
-1
Submodule releng updated: 963fe3826f...fe7d31dfbc.
@@ -1,6 +1,6 @@
|
||||
[wrap-git]
|
||||
url = https://github.com/frida/frida-core.git
|
||||
revision = 17.18.0
|
||||
revision = 588ac3b3ded6779f095825df5c64cab59f0c6774
|
||||
depth = 1
|
||||
|
||||
[provide]
|
||||
|
||||
Reference in new issue
Block a user