[pypy-svn] r66687 - pypy/branch/pyjitpl5/pypy/translator/cli
antocuni at codespeak.net
antocuni at codespeak.net
Thu Jul 30 11:41:12 CEST 2009
Author: antocuni
Date: Thu Jul 30 11:41:10 2009
New Revision: 66687
Modified:
pypy/branch/pyjitpl5/pypy/translator/cli/constant.py
pypy/branch/pyjitpl5/pypy/translator/cli/gencli.py
Log:
kill kill kill! :-)
So far there were three different ways to handle pbcs in the cli backend, but
two were just old experiments which turned to be slow, untested and maybe
half-broken. Kill them and keep only the old "StaticFieldConstGenerator"
Modified: pypy/branch/pyjitpl5/pypy/translator/cli/constant.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/translator/cli/constant.py (original)
+++ pypy/branch/pyjitpl5/pypy/translator/cli/constant.py Thu Jul 30 11:41:10 2009
@@ -49,7 +49,7 @@
# Different generators implementing different techniques for loading
# constants (Static fields, singleton fields, etc)
-class CLIBaseConstGenerator(BaseConstantGenerator):
+class CLIConstantGenerator(BaseConstantGenerator):
"""
Base of all CLI constant generators. It implements the oosupport
constant generator in terms of the CLI interface.
@@ -66,7 +66,19 @@
return gen
def _end_gen_constants(self, gen, numsteps):
- assert gen.ilasm is self.ilasm
+
+ self.ilasm.begin_function('.cctor', [], 'void', False, 'static',
+ 'specialname', 'rtspecialname', 'default')
+ self.ilasm.stderr('CONST: initialization starts', DEBUG_CONST_INIT)
+ for i in range(numsteps):
+ self.ilasm.stderr('CONST: step %d of %d' % (i, numsteps),
+ DEBUG_CONST_INIT)
+ step_name = 'step%d' % i
+ self.ilasm.call('void %s::%s()' % (CONST_CLASS, step_name))
+ self.ilasm.stderr('CONST: initialization completed', DEBUG_CONST_INIT)
+ self.ilasm.ret()
+ self.ilasm.end_function()
+
self.end_class()
def begin_class(self):
@@ -96,11 +108,6 @@
else:
return BaseConstantGenerator._create_complex_const(self, value)
-class FieldConstGenerator(CLIBaseConstGenerator):
- pass
-
-class StaticFieldConstGenerator(FieldConstGenerator):
-
# _________________________________________________________________
# OOSupport interface
@@ -127,144 +134,8 @@
gen.ilasm.ret()
gen.ilasm.end_function()
- def _end_gen_constants(self, gen, numsteps):
- self.ilasm.begin_function('.cctor', [], 'void', False, 'static',
- 'specialname', 'rtspecialname', 'default')
- self.ilasm.stderr('CONST: initialization starts', DEBUG_CONST_INIT)
- for i in range(numsteps):
- self.ilasm.stderr('CONST: step %d of %d' % (i, numsteps),
- DEBUG_CONST_INIT)
- step_name = 'step%d' % i
- self.ilasm.call('void %s::%s()' % (CONST_CLASS, step_name))
- self.ilasm.stderr('CONST: initialization completed', DEBUG_CONST_INIT)
- self.ilasm.ret()
- self.ilasm.end_function()
- super(StaticFieldConstGenerator, self)._end_gen_constants(
- gen, numsteps)
-
-class InstanceFieldConstGenerator(FieldConstGenerator):
-
- # _________________________________________________________________
- # OOSupport interface
-
- def push_constant(self, gen, const):
- # load the singleton instance
- gen.ilasm.opcode('ldsfld class %s %s::Singleton' % (CONST_CLASS, CONST_CLASS))
- gen.ilasm.opcode('ldfld %s %s::%s' % (const.get_type(), CONST_CLASS, const.name))
-
- def _push_constant_during_init(self, gen, const):
- # during initialization, we load the 'this' pointer from our
- # argument rather than the singleton argument
- gen.ilasm.opcode('ldarg.0')
- gen.ilasm.opcode('ldfld %s %s::%s' % (const.get_type(), CONST_CLASS, const.name))
-
- def _pre_store_constant(self, gen, const):
- gen.ilasm.opcode('ldarg.0')
-
- def _store_constant(self, gen, const):
- gen.ilasm.set_field((const.get_type(), CONST_CLASS, const.name))
-
- # _________________________________________________________________
- # CLI interface
-
- def _declare_const(self, gen, all_constants):
- gen.ilasm.field(const.name, const.get_type(), static=False)
-
- def _declare_step(self, gen, stepnum):
- gen.ilasm.begin_function('step%d' % stepnum, [], 'void', False)
-
- def _close_step(self, gen, stepnum):
- gen.ilasm.ret()
- gen.ilasm.end_function()
-
- def _end_gen_constants(self, gen, numsteps):
-
- ilasm = gen.ilasm
-
- ilasm.begin_function('.ctor', [], 'void', False, 'specialname', 'rtspecialname', 'instance')
- ilasm.opcode('ldarg.0')
- ilasm.call('instance void object::.ctor()')
-
- ilasm.opcode('ldarg.0')
- ilasm.opcode('stsfld class %s %s::Singleton' % (CONST_CLASS, CONST_CLASS))
-
- for i in range(numsteps):
- step_name = 'step%d' % i
- ilasm.opcode('ldarg.0')
- ilasm.call('instance void %s::%s()' % (CONST_CLASS, step_name))
- ilasm.ret()
- ilasm.end_function()
-
- # declare&init the Singleton containing the constants
- ilasm.field('Singleton', 'class %s' % CONST_CLASS, static=True)
- ilasm.begin_function('.cctor', [], 'void', False, 'static', 'specialname', 'rtspecialname', 'default')
- if SERIALIZE:
- self._serialize_ctor()
- else:
- self._plain_ctor()
- ilasm.end_function()
-
- super(StaticFieldConstGenerator, self)._end_gen_constants(gen, numsteps)
-
- def _plain_ctor(self):
- self.ilasm.new('instance void class %s::.ctor()' % CONST_CLASS)
- self.ilasm.pop()
- self.ilasm.ret()
-
- def _serialize_ctor(self):
- self.ilasm.opcode('ldstr "constants.dat"')
- self.ilasm.call('object [pypylib]pypy.runtime.Utils::Deserialize(string)')
- self.ilasm.opcode('dup')
- self.ilasm.opcode('brfalse initialize')
- self.ilasm.stderr('Constants deserialized successfully')
- self.ilasm.opcode('stsfld class %s %s::Singleton' % (CONST_CLASS, CONST_CLASS))
- self.ilasm.ret()
- self.ilasm.label('initialize')
- self.ilasm.pop()
- self.ilasm.stderr('Cannot deserialize constants... initialize them!')
- self.ilasm.new('instance void class %s::.ctor()' % CONST_CLASS)
- self.ilasm.opcode('ldstr "constants.dat"')
- self.ilasm.call('void [pypylib]pypy.runtime.Utils::Serialize(object, string)')
- self.ilasm.ret()
-
-class LazyConstGenerator(StaticFieldConstGenerator):
- def push_constant(self, ilasm, const):
- getter_name = '%s::%s' % (CONST_CLASS, 'get_%s' % const.name)
- ilasm.call('%s %s()' % (const.get_type(), getter_name))
-
- def _create_pointers(self, gen, all_constants):
- # overload to do nothing since we handle everything in lazy fashion
- pass
-
- def _initialize_data(self, gen, all_constants):
- # overload to do nothing since we handle everything in lazy fashion
- pass
-
- def _declare_const(self, gen, const):
- # Declare the field
- super(LazyConstGenerator, self)._declare_const(gen, const)
-
- # Create the method for accessing the field
- getter_name = 'get_%s' % const.name
- type_ = const.get_type()
- self.ilasm.begin_function(getter_name, [], type_, False, 'static')
- self.ilasm.load_static_constant(type_, CONST_NAMESPACE, CONST_CLASS, const.name)
- # if it's already initialized, just return it
- self.ilasm.opcode('dup')
- self.ilasm.opcode('brfalse', 'initialize')
- self.ilasm.opcode('ret')
- # else, initialize!
- self.ilasm.label('initialize')
- self.ilasm.opcode('pop') # discard the null value we know is on the stack
- const.instantiate(ilasm)
- self.ilasm.opcode('dup') # two dups because const.init pops the value at the end
- self.ilasm.opcode('dup')
- self.ilasm.store_static_constant(type_, CONST_NAMESPACE, CONST_CLASS, const.name)
- const.init(ilasm)
- self.ilasm.opcode('ret')
- self.ilasm.end_function()
# ______________________________________________________________________
# Mixins
Modified: pypy/branch/pyjitpl5/pypy/translator/cli/gencli.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/translator/cli/gencli.py (original)
+++ pypy/branch/pyjitpl5/pypy/translator/cli/gencli.py Thu Jul 30 11:41:10 2009
@@ -26,7 +26,7 @@
Database = LowLevelDatabase
log = log
- ConstantGenerator = constant.StaticFieldConstGenerator
+ ConstantGenerator = constant.CLIConstantGenerator
InstanceConst = constant.CLIInstanceConst
RecordConst = constant.CLIRecordConst
ClassConst = constant.CLIClassConst
More information about the Pypy-commit
mailing list