##// END OF EJS Templates
rust-pyo3: simplified API to get core Index references...
rust-pyo3: simplified API to get core Index references Given the amount of conversion and arcane internal detail, it is easier for the caller and makes a better separation of concerns to just introduce a new unsafe helper. It is actually possible that it would be safe, and we can decide about that later. Actually the reason given in the `cpython` crate for unsafety of the `try_borrow()` method is the following: ``` // try_borrow() and try_borrow_mut() are unsafe because self.data may // have a function returning the inner &'static reference. // If T is &'static U, its lifetime can be easily coerced to &'a U, but // how could we do that for Whatever<'static> in general? ``` Given that we coerce the Index reference to the GIL lifetime and that it is unlikely that the inner data would contain a function returning the a `'static` reference, it is possible that it is actually even safe.

File last commit:

r52756:f4733654 default
r53311:23370710 default
Show More
mpatch.py
51 lines | 1.5 KiB | text/x-python | PythonLexer
Yuya Nishihara
cffi: split modules from pure...
r32512 # mpatch.py - CFFI implementation of mpatch.c
#
# Copyright 2016 Maciej Fijalkowski <fijall@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
Matt Harbison
typing: add `from __future__ import annotations` to most files...
r52756 from __future__ import annotations
Yuya Nishihara
cffi: split modules from pure...
r32512
Matt Harbison
typing: add type hints to mpatch implementations...
r50494 from typing import List
Yuya Nishihara
cffi: split modules from pure...
r32512 from ..pure.mpatch import *
from ..pure.mpatch import mpatchError # silence pyflakes
Matt Harbison
typing: disable import error warnings that are already handled...
r47543 from . import _mpatch # pytype: disable=import-error
Yuya Nishihara
cffi: split modules from pure...
r32512
ffi = _mpatch.ffi
lib = _mpatch.lib
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 @ffi.def_extern()
def cffi_get_next_item(arg, pos):
all, bins = ffi.from_handle(arg)
Manuel Jacob
cffi: pass C type and attribute names as str instead of bytes
r52683 container = ffi.new("struct mpatch_flist*[1]")
Manuel Jacob
cffi: pass bytes instead of str to ffi.new("char[]", …)...
r52685 to_pass = ffi.new("char[]", bytes(bins[pos]))
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 all.append(to_pass)
r = lib.mpatch_decode(to_pass, len(to_pass) - 1, container)
if r < 0:
return ffi.NULL
return container[0]
Yuya Nishihara
cffi: split modules from pure...
r32512
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
typing: add type hints to mpatch implementations...
r50494 def patches(text: bytes, bins: List[bytes]) -> bytes:
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 lgt = len(bins)
all = []
if not lgt:
return text
arg = (all, bins)
Augie Fackler
formatting: blacken the codebase...
r43346 patch = lib.mpatch_fold(ffi.new_handle(arg), lib.cffi_get_next_item, 0, lgt)
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 if not patch:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise mpatchError(b"cannot decode chunk")
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 outlen = lib.mpatch_calcsize(len(text), patch)
if outlen < 0:
lib.mpatch_lfree(patch)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise mpatchError(b"inconsistency detected")
Manuel Jacob
cffi: pass C type and attribute names as str instead of bytes
r52683 buf = ffi.new("char[]", outlen)
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 if lib.mpatch_apply(buf, text, len(text), patch) < 0:
lib.mpatch_lfree(patch)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise mpatchError(b"error applying patches")
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 res = ffi.buffer(buf, outlen)[:]
lib.mpatch_lfree(patch)
return res