Commit a0a851b2 authored by Stefan Behnel's avatar Stefan Behnel

minor code cleanups for metaclass patch

parent 2f58a1f9
...@@ -4593,14 +4593,14 @@ class Py3ClassNode(ExprNode): ...@@ -4593,14 +4593,14 @@ class Py3ClassNode(ExprNode):
def analyse_types(self, env): def analyse_types(self, env):
self.type = py_object_type self.type = py_object_type
self.is_temp = 1 self.is_temp = 1
env.use_utility_code(create_py3class_utility_code);
def may_be_none(self): def may_be_none(self):
return True return True
gil_message = "Constructing Python3+ class" gil_message = "Constructing Python class"
def generate_result_code(self, code): def generate_result_code(self, code):
code.globalstate.use_utility_code(create_py3class_utility_code)
cname = code.intern_identifier(self.name) cname = code.intern_identifier(self.name)
code.putln( code.putln(
'%s = __Pyx_Py3ClassCreate(%s, %s, %s, %s, %s); %s' % ( '%s = __Pyx_Py3ClassCreate(%s, %s, %s, %s, %s); %s' % (
...@@ -4643,38 +4643,19 @@ class KeywordArgsNode(ExprNode): ...@@ -4643,38 +4643,19 @@ class KeywordArgsNode(ExprNode):
if self.keyword_args: if self.keyword_args:
code.putln("%s = %s;" % (self.result(), self.keyword_args.result())) code.putln("%s = %s;" % (self.result(), self.keyword_args.result()))
code.put_incref(self.keyword_args.result(), self.keyword_args.ctype()) code.put_incref(self.keyword_args.result(), self.keyword_args.ctype())
code.put_giveref(self.keyword_args.result())
elif self.starstar_arg: elif self.starstar_arg:
code.putln( code.putln(
"%s = PyDict_Copy(%s); %s" % ( "%s = PyDict_Copy(%s); %s" % (
self.result(), self.result(),
self.starstar_arg.py_result(), self.starstar_arg.py_result(),
code.error_goto_if_null(self.result(), self.pos))) code.error_goto_if_null(self.result(), self.pos)))
code.put_gotref(self.py_result())
else: else:
code.putln( code.putln(
"%s = PyDict_New(); %s" % ( "%s = PyDict_New(); %s" % (
self.result(), self.result(),
code.error_goto_if_null(self.result(), self.pos))) code.error_goto_if_null(self.result(), self.pos)))
code.put_gotref(self.py_result()) code.put_gotref(self.py_result())
class PyClassBasesNode(ExprNode):
# Helper class that holds bases for python3 class
# Actually hack to make `bases` visible across other nondes
#
# bases ExprNode Base class tuple
subexprs = ['bases']
type = py_object_type
is_temp = True
def analyse_types(self, env):
self.bases.analyse_types(env)
def generate_result_code(self, code):
code.putln("%s = %s;" % (self.result(), self.bases.result()))
code.put_incref(self.bases.result(), self.bases.ctype())
code.put_giveref(self.bases.result())
code.put_gotref(self.py_result())
class PyClassMetaclassNode(ExprNode): class PyClassMetaclassNode(ExprNode):
# Helper class holds Python3 metaclass object # Helper class holds Python3 metaclass object
......
...@@ -2958,7 +2958,7 @@ class PyClassDefNode(ClassDefNode): ...@@ -2958,7 +2958,7 @@ class PyClassDefNode(ClassDefNode):
doc_node = None doc_node = None
if keyword_args or starstar_arg: if keyword_args or starstar_arg:
self.py3_style_class = True self.py3_style_class = True
self.bases = ExprNodes.PyClassBasesNode(pos, bases = bases) self.bases = bases
self.mkw = ExprNodes.KeywordArgsNode(pos, self.mkw = ExprNodes.KeywordArgsNode(pos,
keyword_args = keyword_args, starstar_arg = starstar_arg) keyword_args = keyword_args, starstar_arg = starstar_arg)
self.metaclass = ExprNodes.PyClassMetaclassNode(pos, mkw = self.mkw, bases = self.bases) self.metaclass = ExprNodes.PyClassMetaclassNode(pos, mkw = self.mkw, bases = self.bases)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment