summaryrefslogtreecommitdiff
path: root/Cython/Compiler/UtilNodes.py
diff options
context:
space:
mode:
Diffstat (limited to 'Cython/Compiler/UtilNodes.py')
-rw-r--r--Cython/Compiler/UtilNodes.py49
1 files changed, 39 insertions, 10 deletions
diff --git a/Cython/Compiler/UtilNodes.py b/Cython/Compiler/UtilNodes.py
index c41748ace..81d3038ea 100644
--- a/Cython/Compiler/UtilNodes.py
+++ b/Cython/Compiler/UtilNodes.py
@@ -10,7 +10,7 @@ from . import Nodes
from . import ExprNodes
from .Nodes import Node
from .ExprNodes import AtomicExprNode
-from .PyrexTypes import c_ptr_type
+from .PyrexTypes import c_ptr_type, c_bint_type
class TempHandle(object):
@@ -45,7 +45,7 @@ class TempRefNode(AtomicExprNode):
def calculate_result_code(self):
result = self.handle.temp
- if result is None: result = "<error>" # might be called and overwritten
+ if result is None: result = "<error>" # might be called and overwritten
return result
def generate_result_code(self, code):
@@ -122,8 +122,7 @@ class ResultRefNode(AtomicExprNode):
self.may_hold_none = may_hold_none
if expression is not None:
self.pos = expression.pos
- if hasattr(expression, "type"):
- self.type = expression.type
+ self.type = getattr(expression, "type", None)
if pos is not None:
self.pos = pos
if type is not None:
@@ -144,13 +143,17 @@ class ResultRefNode(AtomicExprNode):
def update_expression(self, expression):
self.expression = expression
- if hasattr(expression, "type"):
- self.type = expression.type
+ type = getattr(expression, "type", None)
+ if type:
+ self.type = type
+
+ def analyse_target_declaration(self, env):
+ pass # OK - we can assign to this
def analyse_types(self, env):
if self.expression is not None:
if not self.expression.type:
- self.expression = self.expression.analyse_types(env)
+ self.expression = self.expression.analyse_types(env)
self.type = self.expression.type
return self
@@ -175,7 +178,7 @@ class ResultRefNode(AtomicExprNode):
return self.expression.may_be_none()
if self.type is not None:
return self.type.is_pyobject
- return True # play safe
+ return True # play it safe
def is_simple(self):
return True
@@ -233,7 +236,10 @@ class LetNodeMixin:
if self._result_in_temp:
self.temp = self.temp_expression.result()
else:
- self.temp_expression.make_owned_reference(code)
+ if self.temp_type.is_memoryviewslice:
+ self.temp_expression.make_owned_memoryviewslice(code)
+ else:
+ self.temp_expression.make_owned_reference(code)
self.temp = code.funcstate.allocate_temp(
self.temp_type, manage_ref=True)
code.putln("%s = %s;" % (self.temp, self.temp_expression.result()))
@@ -246,7 +252,7 @@ class LetNodeMixin:
self.temp_expression.generate_disposal_code(code)
self.temp_expression.free_temps(code)
else:
- if self.temp_type.is_pyobject:
+ if self.temp_type.needs_refcounting:
code.put_decref_clear(self.temp, self.temp_type)
code.funcstate.release_temp(self.temp)
@@ -354,6 +360,29 @@ class TempResultFromStatNode(ExprNodes.ExprNode):
self.body = self.body.analyse_expressions(env)
return self
+ def may_be_none(self):
+ return self.result_ref.may_be_none()
+
def generate_result_code(self, code):
self.result_ref.result_code = self.result()
self.body.generate_execution_code(code)
+
+ def generate_function_definitions(self, env, code):
+ self.body.generate_function_definitions(env, code)
+
+
+class HasGilNode(AtomicExprNode):
+ """
+ Simple node that evaluates to 0 or 1 depending on whether we're
+ in a nogil context
+ """
+ type = c_bint_type
+
+ def analyse_types(self, env):
+ return self
+
+ def generate_result_code(self, code):
+ self.has_gil = code.funcstate.gil_owned
+
+ def calculate_result_code(self):
+ return "1" if self.has_gil else "0"