Commit 8fd5165e authored by Dag Sverre Seljebotn's avatar Dag Sverre Seljebotn

Support retrieving "delayed" temps before or after allocate_temps phase (dead code for now)

parent 0defd1cf
...@@ -810,6 +810,7 @@ class NameNode(AtomicExprNode): ...@@ -810,6 +810,7 @@ class NameNode(AtomicExprNode):
is_name = 1 is_name = 1
skip_assignment_decref = False skip_assignment_decref = False
entry = None
def create_analysed_rvalue(pos, env, entry): def create_analysed_rvalue(pos, env, entry):
node = NameNode(pos) node = NameNode(pos)
...@@ -845,6 +846,8 @@ class NameNode(AtomicExprNode): ...@@ -845,6 +846,8 @@ class NameNode(AtomicExprNode):
def analyse_as_module(self, env): def analyse_as_module(self, env):
# Try to interpret this as a reference to a cimported module. # Try to interpret this as a reference to a cimported module.
# Returns the module scope, or None. # Returns the module scope, or None.
entry = self.entry
if not entry:
entry = env.lookup(self.name) entry = env.lookup(self.name)
if entry and entry.as_module: if entry and entry.as_module:
return entry.as_module return entry.as_module
...@@ -853,6 +856,8 @@ class NameNode(AtomicExprNode): ...@@ -853,6 +856,8 @@ class NameNode(AtomicExprNode):
def analyse_as_extension_type(self, env): def analyse_as_extension_type(self, env):
# Try to interpret this as a reference to an extension type. # Try to interpret this as a reference to an extension type.
# Returns the extension type, or None. # Returns the extension type, or None.
entry = self.entry
if not entry:
entry = env.lookup(self.name) entry = env.lookup(self.name)
if entry and entry.is_type and entry.type.is_extension_type: if entry and entry.is_type and entry.type.is_extension_type:
return entry.type return entry.type
...@@ -860,6 +865,7 @@ class NameNode(AtomicExprNode): ...@@ -860,6 +865,7 @@ class NameNode(AtomicExprNode):
return None return None
def analyse_target_declaration(self, env): def analyse_target_declaration(self, env):
if not self.entry:
self.entry = env.lookup_here(self.name) self.entry = env.lookup_here(self.name)
if not self.entry: if not self.entry:
self.entry = env.declare_var(self.name, py_object_type, self.pos) self.entry = env.declare_var(self.name, py_object_type, self.pos)
...@@ -870,10 +876,9 @@ class NameNode(AtomicExprNode): ...@@ -870,10 +876,9 @@ class NameNode(AtomicExprNode):
if self.entry.is_pyglobal and self.entry.is_member: if self.entry.is_pyglobal and self.entry.is_member:
env.use_utility_code(type_cache_invalidation_code) env.use_utility_code(type_cache_invalidation_code)
def analyse_types(self, env, entry=None): def analyse_types(self, env):
if entry is None: if self.entry is None:
entry = env.lookup(self.name) self.entry = env.lookup(self.name)
self.entry = entry
if not self.entry: if not self.entry:
self.entry = env.declare_builtin(self.name, self.pos) self.entry = env.declare_builtin(self.name, self.pos)
if not self.entry: if not self.entry:
......
...@@ -360,6 +360,7 @@ def create_default_pipeline(context, options, result): ...@@ -360,6 +360,7 @@ def create_default_pipeline(context, options, result):
from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform
from ParseTreeTransforms import CreateClosureClasses, MarkClosureVisitor, DecoratorTransform from ParseTreeTransforms import CreateClosureClasses, MarkClosureVisitor, DecoratorTransform
from Optimize import FlattenInListTransform, SwitchTransform, OptimizeRefcounting from Optimize import FlattenInListTransform, SwitchTransform, OptimizeRefcounting
from CodeGeneration import AnchorTemps
from Buffer import BufferTransform from Buffer import BufferTransform
from ModuleNode import check_c_classes from ModuleNode import check_c_classes
...@@ -376,6 +377,7 @@ def create_default_pipeline(context, options, result): ...@@ -376,6 +377,7 @@ def create_default_pipeline(context, options, result):
BufferTransform(context), BufferTransform(context),
SwitchTransform(), SwitchTransform(),
OptimizeRefcounting(context), OptimizeRefcounting(context),
# AnchorTemps(context),
# CreateClosureClasses(context), # CreateClosureClasses(context),
create_generate_code(context, options, result) create_generate_code(context, options, result)
] ]
......
...@@ -73,6 +73,7 @@ class Node(object): ...@@ -73,6 +73,7 @@ class Node(object):
is_name = 0 is_name = 0
is_literal = 0 is_literal = 0
temps = None
# All descandants should set child_attrs to a list of the attributes # All descandants should set child_attrs to a list of the attributes
# containing nodes considered "children" in the tree. Each such attribute # containing nodes considered "children" in the tree. Each such attribute
......
...@@ -142,6 +142,15 @@ class Entry: ...@@ -142,6 +142,15 @@ class Entry:
error(pos, "'%s' does not match previous declaration" % self.name) error(pos, "'%s' does not match previous declaration" % self.name)
error(self.pos, "Previous declaration is here") error(self.pos, "Previous declaration is here")
def new_temp(type, description=""):
# Returns a temporary entry which is "floating" and not finally resolved
# before the AnchorTemps transform is run. cname will not be available on
# the temp before this transform is run. See the mentioned transform for
# more docs.
e = Entry(name="$" + description, type=type, cname="<temperror>")
e.is_variable = True
return e
class Scope: class Scope:
# name string Unqualified name # name string Unqualified name
# outer_scope Scope or None Enclosing scope # outer_scope Scope or None Enclosing scope
......
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