[pypy-commit] pypy default: some inlining decorators (instead of function attributes)
cfbolz
pypy.commits at gmail.com
Mon Sep 26 02:13:20 EDT 2016
Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch:
Changeset: r87385:3bdb1ace723f
Date: 2016-09-26 08:12 +0200
http://bitbucket.org/pypy/pypy/changeset/3bdb1ace723f/
Log: some inlining decorators (instead of function attributes)
diff --git a/pypy/interpreter/executioncontext.py b/pypy/interpreter/executioncontext.py
--- a/pypy/interpreter/executioncontext.py
+++ b/pypy/interpreter/executioncontext.py
@@ -2,7 +2,7 @@
from pypy.interpreter.error import OperationError, get_cleared_operation_error
from rpython.rlib.unroll import unrolling_iterable
from rpython.rlib.objectmodel import specialize
-from rpython.rlib import jit, rgc
+from rpython.rlib import jit, rgc, objectmodel
TICK_COUNTER_STEP = 100
@@ -131,6 +131,7 @@
if self.gettrace() is not None:
self._trace(frame, 'return', w_retval)
+ @objectmodel.always_inline
def bytecode_trace(self, frame, decr_by=TICK_COUNTER_STEP):
"Trace function called before each bytecode."
# this is split into a fast path and a slower path that is
@@ -139,7 +140,6 @@
actionflag = self.space.actionflag
if actionflag.decrement_ticker(decr_by) < 0:
actionflag.action_dispatcher(self, frame) # slow path
- bytecode_trace._always_inline_ = True
def _run_finalizers_now(self):
# Tests only: run the actions now, to ensure that the
@@ -147,6 +147,7 @@
# pypy.tool.pytest.apptest.
self.space.actionflag.action_dispatcher(self, None)
+ @objectmodel.always_inline
def bytecode_only_trace(self, frame):
"""
Like bytecode_trace() but doesn't invoke any other events besides the
@@ -156,7 +157,6 @@
self.gettrace() is None):
return
self.run_trace_func(frame)
- bytecode_only_trace._always_inline_ = True
@jit.unroll_safe
def run_trace_func(self, frame):
@@ -203,13 +203,13 @@
d.instr_prev_plus_one = frame.last_instr + 1
+ @objectmodel.try_inline
def bytecode_trace_after_exception(self, frame):
"Like bytecode_trace(), but without increasing the ticker."
actionflag = self.space.actionflag
self.bytecode_only_trace(frame)
if actionflag.get_ticker() < 0:
actionflag.action_dispatcher(self, frame) # slow path
- bytecode_trace_after_exception._always_inline_ = 'try'
# NB. this function is not inlined right now. backendopt.inline would
# need some improvements to handle this case, but it's not really an
# issue
@@ -456,6 +456,7 @@
periodic_actions = unrolling_iterable(self._periodic_actions)
@jit.unroll_safe
+ @objectmodel.dont_inline
def action_dispatcher(ec, frame):
# periodic actions (first reset the bytecode counter)
self.reset_ticker(self.checkinterval_scaled)
@@ -477,7 +478,6 @@
action._fired = False
action.perform(ec, frame)
- action_dispatcher._dont_inline_ = True
self.action_dispatcher = action_dispatcher
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -6,7 +6,8 @@
from rpython.rlib import jit, rstackovf
from rpython.rlib.debug import check_nonneg
-from rpython.rlib.objectmodel import we_are_translated
+from rpython.rlib.objectmodel import (we_are_translated, always_inline,
+ dont_inline)
from rpython.rlib.rarithmetic import r_uint, intmask
from rpython.tool.sourcetools import func_with_new_name
@@ -483,20 +484,20 @@
# of oparg failed to produce an integer which is annotated as non-neg
check_nonneg(oparg)
+ @always_inline
def LOAD_FAST(self, varindex, next_instr):
# access a local variable directly
w_value = self.locals_cells_stack_w[varindex]
if w_value is None:
self._load_fast_failed(varindex)
self.pushvalue(w_value)
- LOAD_FAST._always_inline_ = True
+ @dont_inline
def _load_fast_failed(self, varindex):
varname = self.getlocalvarname(varindex)
raise oefmt(self.space.w_UnboundLocalError,
"local variable '%s' referenced before assignment",
varname)
- _load_fast_failed._dont_inline_ = True
def LOAD_CONST(self, constindex, next_instr):
w_const = self.getconstant_w(constindex)
@@ -888,6 +889,7 @@
return
self.LOAD_GLOBAL(nameindex, next_instr) # fall-back
+ @always_inline
def _load_global(self, varname):
w_value = self.space.finditem_str(self.get_w_globals(), varname)
if w_value is None:
@@ -896,16 +898,15 @@
if w_value is None:
self._load_global_failed(varname)
return w_value
- _load_global._always_inline_ = True
+ @dont_inline
def _load_global_failed(self, varname):
raise oefmt(self.space.w_NameError,
"global name '%s' is not defined", varname)
- _load_global_failed._dont_inline_ = True
+ @always_inline
def LOAD_GLOBAL(self, nameindex, next_instr):
self.pushvalue(self._load_global(self.getname_u(nameindex)))
- LOAD_GLOBAL._always_inline_ = True
def DELETE_FAST(self, varindex, next_instr):
if self.locals_cells_stack_w[varindex] is None:
@@ -939,6 +940,7 @@
self.pushvalue(space.newlist([], sizehint=length_hint))
self.pushvalue(last_val)
+ @always_inline
def LOAD_ATTR(self, nameindex, next_instr):
"obj.attributename"
w_obj = self.popvalue()
@@ -949,7 +951,6 @@
w_attributename = self.getname_w(nameindex)
w_value = self.space.getattr(w_obj, w_attributename)
self.pushvalue(w_value)
- LOAD_ATTR._always_inline_ = True
@jit.unroll_safe
def cmp_exc_match(self, w_1, w_2):
diff --git a/pypy/module/_csv/interp_reader.py b/pypy/module/_csv/interp_reader.py
--- a/pypy/module/_csv/interp_reader.py
+++ b/pypy/module/_csv/interp_reader.py
@@ -1,4 +1,5 @@
from rpython.rlib.rstring import StringBuilder
+from rpython.rlib import objectmodel
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.error import OperationError, oefmt
from pypy.interpreter.gateway import unwrap_spec
@@ -25,12 +26,12 @@
def iter_w(self):
return self.space.wrap(self)
+ @objectmodel.dont_inline
def error(self, msg):
space = self.space
w_module = space.getbuiltinmodule('_csv')
w_error = space.getattr(w_module, space.wrap('Error'))
raise oefmt(w_error, "line %d: %s", self.line_num, msg)
- error._dont_inline_ = True
def add_char(self, field_builder, c):
assert field_builder is not None
diff --git a/pypy/module/_csv/interp_writer.py b/pypy/module/_csv/interp_writer.py
--- a/pypy/module/_csv/interp_writer.py
+++ b/pypy/module/_csv/interp_writer.py
@@ -1,4 +1,5 @@
from rpython.rlib.rstring import StringBuilder
+from rpython.rlib import objectmodel
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.error import OperationError
from pypy.interpreter.typedef import TypeDef, interp2app
@@ -21,12 +22,12 @@
special += dialect.quotechar
self.special_characters = special
+ @objectmodel.dont_inline
def error(self, msg):
space = self.space
w_module = space.getbuiltinmodule('_csv')
w_error = space.getattr(w_module, space.wrap('Error'))
raise OperationError(w_error, space.wrap(msg))
- error._dont_inline_ = True
def writerow(self, w_fields):
"""Construct and write a CSV record from a sequence of fields.
diff --git a/pypy/module/_lsprof/interp_lsprof.py b/pypy/module/_lsprof/interp_lsprof.py
--- a/pypy/module/_lsprof/interp_lsprof.py
+++ b/pypy/module/_lsprof/interp_lsprof.py
@@ -7,7 +7,7 @@
from pypy.interpreter.typedef import (TypeDef, GetSetProperty,
interp_attrproperty)
from rpython.rlib import jit
-from rpython.rlib.objectmodel import we_are_translated
+from rpython.rlib.objectmodel import we_are_translated, always_inline
from rpython.rlib.rtimer import read_timestamp, _is_64_bit
from rpython.rtyper.lltypesystem import rffi, lltype
from rpython.translator.tool.cbuild import ExternalCompilationInfo
@@ -256,7 +256,7 @@
return w_frame.wrap_string(space)
return w_frame # actually a PyCode object
-
+ at always_inline
def prepare_spec(space, w_arg):
if isinstance(w_arg, Method):
return (w_arg.w_function, w_arg.w_class)
@@ -264,8 +264,6 @@
return (w_arg, None)
else:
return (None, space.type(w_arg))
-prepare_spec._always_inline_ = True
-
def lsprof_call(space, w_self, frame, event, w_arg):
assert isinstance(w_self, W_Profiler)
diff --git a/pypy/module/_pypyjson/interp_decoder.py b/pypy/module/_pypyjson/interp_decoder.py
--- a/pypy/module/_pypyjson/interp_decoder.py
+++ b/pypy/module/_pypyjson/interp_decoder.py
@@ -1,6 +1,6 @@
import sys
from rpython.rlib.rstring import StringBuilder
-from rpython.rlib.objectmodel import specialize
+from rpython.rlib.objectmodel import specialize, always_inline
from rpython.rlib import rfloat, runicode
from rpython.rtyper.lltypesystem import lltype, rffi
from pypy.interpreter.error import oefmt
@@ -188,6 +188,7 @@
self.pos = i
return self.space.call_function(self.space.w_int, self.space.wrap(s))
+ @always_inline
def parse_integer(self, i):
"Parse a decimal number with an optional minus sign"
sign = 1
@@ -218,7 +219,6 @@
# overflowed
ovf_maybe = (count >= OVF_DIGITS)
return i, ovf_maybe, sign * intval
- parse_integer._always_inline_ = True
def decode_array(self, i):
w_list = self.space.newlist([])
diff --git a/pypy/module/_pypyjson/targetjson.py b/pypy/module/_pypyjson/targetjson.py
--- a/pypy/module/_pypyjson/targetjson.py
+++ b/pypy/module/_pypyjson/targetjson.py
@@ -6,7 +6,7 @@
import time
from pypy.interpreter.error import OperationError
from pypy.module._pypyjson.interp_decoder import loads
-from rpython.rlib.objectmodel import specialize
+from rpython.rlib.objectmodel import specialize, dont_inline
## MSG = open('msg.json').read()
@@ -69,11 +69,11 @@
assert isinstance(w_x, W_String)
return w_x.strval
+ @dont_inline
def call_method(self, obj, name, arg):
assert name == 'append'
assert isinstance(obj, W_List)
obj.listval.append(arg)
- call_method._dont_inline_ = True
def call_function(self, w_func, *args_w):
return self.w_None # XXX
diff --git a/pypy/module/mmap/interp_mmap.py b/pypy/module/mmap/interp_mmap.py
--- a/pypy/module/mmap/interp_mmap.py
+++ b/pypy/module/mmap/interp_mmap.py
@@ -2,7 +2,7 @@
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.typedef import TypeDef
from pypy.interpreter.gateway import interp2app, unwrap_spec
-from rpython.rlib import rmmap, rarithmetic
+from rpython.rlib import rmmap, rarithmetic, objectmodel
from rpython.rlib.buffer import Buffer
from rpython.rlib.rmmap import RValueError, RTypeError, RMMapError
from rpython.rlib.rstring import StringBuilder
@@ -316,6 +316,7 @@
self.w_error = space.new_exception_class("mmap.error",
space.w_EnvironmentError)
+ at objectmodel.dont_inline
def mmap_error(space, e):
if isinstance(e, RValueError):
return OperationError(space.w_ValueError, space.wrap(e.message))
diff --git a/pypy/module/select/interp_select.py b/pypy/module/select/interp_select.py
--- a/pypy/module/select/interp_select.py
+++ b/pypy/module/select/interp_select.py
@@ -2,6 +2,7 @@
from rpython.rlib import _rsocket_rffi as _c, rpoll
from rpython.rtyper.lltypesystem import lltype, rffi
+from rpython.rlib import objectmodel
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.error import OperationError, oefmt, wrap_oserror
@@ -91,7 +92,7 @@
# ____________________________________________________________
-
+ at objectmodel.always_inline # get rid of the tuple result
def _build_fd_set(space, list_w, ll_list, nfds):
_c.FD_ZERO(ll_list)
fdlist = []
@@ -105,7 +106,6 @@
_c.FD_SET(fd, ll_list)
fdlist.append(fd)
return fdlist, nfds
-_build_fd_set._always_inline_ = True # get rid of the tuple result
def _unbuild_fd_set(space, list_w, fdlist, ll_list, reslist_w):
More information about the pypy-commit
mailing list