is_name = 1
skip_assignment_decref = False
+ entry = None
def create_analysed_rvalue(pos, env, entry):
node = NameNode(pos)
def analyse_as_module(self, env):
# Try to interpret this as a reference to a cimported module.
# Returns the module scope, or None.
- entry = env.lookup(self.name)
+ entry = self.entry
+ if not entry:
+ entry = env.lookup(self.name)
if entry and entry.as_module:
return entry.as_module
return None
def analyse_as_extension_type(self, env):
# Try to interpret this as a reference to an extension type.
# Returns the extension type, or None.
- entry = env.lookup(self.name)
+ entry = self.entry
+ if not entry:
+ entry = env.lookup(self.name)
if entry and entry.is_type and entry.type.is_extension_type:
return entry.type
else:
return None
def analyse_target_declaration(self, env):
- self.entry = env.lookup_here(self.name)
+ if not self.entry:
+ self.entry = env.lookup_here(self.name)
if not self.entry:
self.entry = env.declare_var(self.name, py_object_type, self.pos)
env.control_flow.set_state(self.pos, (self.name, 'initalized'), True)
if self.entry.is_pyglobal and self.entry.is_member:
env.use_utility_code(type_cache_invalidation_code)
- def analyse_types(self, env, entry=None):
- if entry is None:
- entry = env.lookup(self.name)
- self.entry = entry
+ def analyse_types(self, env):
+ if self.entry is None:
+ self.entry = env.lookup(self.name)
if not self.entry:
self.entry = env.declare_builtin(self.name, self.pos)
if not self.entry:
from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform
from ParseTreeTransforms import CreateClosureClasses, MarkClosureVisitor, DecoratorTransform
from Optimize import FlattenInListTransform, SwitchTransform, OptimizeRefcounting
+ from CodeGeneration import AnchorTemps
from Buffer import BufferTransform
from ModuleNode import check_c_classes
BufferTransform(context),
SwitchTransform(),
OptimizeRefcounting(context),
+# AnchorTemps(context),
# CreateClosureClasses(context),
create_generate_code(context, options, result)
]
def redeclared(self, pos):
error(pos, "'%s' does not match previous declaration" % self.name)
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:
# name string Unqualified name