static void _cffi_init(void) { rpython_startup_code(); RPyGilAllocate(); if (pypy_setup_home(NULL, 1) != 0) { _cffi_init_error("pypy_setup_home() failed", ""); return; } _cffi_ready = 1; } RPY_EXPORTED int pypy_carefully_make_gil(const char *name) { /* For CFFI: this initializes the GIL and loads the home path. It can be called completely concurrently from unrelated threads. It assumes that we don't hold the GIL before (if it exists), and we don't hold it afterwards. */ _cffi_module_name = name; /* not really thread-safe, but better than nothing */ _cffi_init_once(); return (int)_cffi_ready - 1; } """ eci = ExternalCompilationInfo(separate_module_sources=[do_startup]) declare_c_function = rffi.llexternal_use_eci(eci)
return True # --- copy a few declarations from src/vmprof_stack.h --- VMPROF_CODE_TAG = 1 VMPROFSTACK = lltype.ForwardReference() PVMPROFSTACK = lltype.Ptr(VMPROFSTACK) VMPROFSTACK.become( rffi.CStruct("vmprof_stack_s", ('next', PVMPROFSTACK), ('value', lltype.Signed), ('kind', lltype.Signed))) # ---------- vmprof_tl_stack = rthread.ThreadLocalField(PVMPROFSTACK, "vmprof_tl_stack") do_use_eci = rffi.llexternal_use_eci( ExternalCompilationInfo(includes=['vmprof_stack.h'], include_dirs=[SRC])) def enter_code(unique_id): do_use_eci() s = lltype.malloc(VMPROFSTACK, flavor='raw') s.c_next = vmprof_tl_stack.get_or_make_raw() s.c_value = unique_id s.c_kind = VMPROF_CODE_TAG vmprof_tl_stack.setraw(s) return s def leave_code(s): if not we_are_translated(): assert vmprof_tl_stack.getraw() == s
import sys from rpython.rtyper.lltypesystem import rffi from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.jit.backend.x86.arch import WORD if WORD == 4: extra = ['-DPYPY_X86_CHECK_SSE2'] else: extra = [] if sys.platform != 'win32': extra = ['-msse2', '-mfpmath=sse', '-DPYPY_CPU_HAS_STANDARD_PRECISION'] + extra ensure_sse2_floats = rffi.llexternal_use_eci(ExternalCompilationInfo( compile_extra = extra, ))
import sys from rpython.rtyper.lltypesystem import rffi from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.jit.backend.x86.arch import WORD if WORD == 4: extra = ['-DPYPY_X86_CHECK_SSE2'] if sys.platform != 'win32': extra += ['-msse2', '-mfpmath=sse'] else: extra += ['/arch:SSE2'] else: extra = [] # the -m options above are always on by default on x86-64 extra = ['-DPYPY_CPU_HAS_STANDARD_PRECISION'] + extra ensure_sse2_floats = rffi.llexternal_use_eci(ExternalCompilationInfo( compile_extra = extra, ))
# --- copy a few declarations from src/vmprof_stack.h --- VMPROF_CODE_TAG = 1 VMPROFSTACK = lltype.ForwardReference() PVMPROFSTACK = lltype.Ptr(VMPROFSTACK) VMPROFSTACK.become(rffi.CStruct("vmprof_stack_s", ('next', PVMPROFSTACK), ('value', lltype.Signed), ('kind', lltype.Signed))) # ---------- vmprof_tl_stack = rthread.ThreadLocalField(PVMPROFSTACK, "vmprof_tl_stack") do_use_eci = rffi.llexternal_use_eci( ExternalCompilationInfo(includes=['vmprof_stack.h'], include_dirs = [SRC])) def enter_code(unique_id): do_use_eci() s = lltype.malloc(VMPROFSTACK, flavor='raw') s.c_next = vmprof_tl_stack.get_or_make_raw() s.c_value = unique_id s.c_kind = VMPROF_CODE_TAG vmprof_tl_stack.setraw(s) return s def leave_code(s): vmprof_tl_stack.setraw(s.c_next) lltype.free(s, flavor='raw')
return annmodel.SomeInstance(classdef, can_be_None=True) def specialize_call(self, hop): hop.exception_cannot_occur() v_ob = hop.inputarg(hop.args_r[1], arg=1) v_p = hop.genop('gc_rawrefcount_to_obj', [_unspec_ob(hop, v_ob)], resulttype = llmemory.GCREF) return _spec_p(hop, v_p) class Entry(ExtRegistryEntry): _about_ = next_dead def compute_result_annotation(self, s_OB_PTR_TYPE): from rpython.annotator import model as annmodel from rpython.rtyper.llannotation import lltype_to_annotation assert s_OB_PTR_TYPE.is_constant() return lltype_to_annotation(s_OB_PTR_TYPE.const) def specialize_call(self, hop): hop.exception_cannot_occur() v_ob = hop.genop('gc_rawrefcount_next_dead', [], resulttype = llmemory.Address) return _spec_ob(hop, v_ob) src_dir = py.path.local(__file__).dirpath() / 'src' boehm_eci = ExternalCompilationInfo( post_include_bits = [(src_dir / 'boehm-rawrefcount.h').read()], separate_module_files = [(src_dir / 'boehm-rawrefcount.c')], ) func_boehm_eci = rffi.llexternal_use_eci(boehm_eci)