[pypy-commit] pypy applevel-builder: Started on an app level UnicodeBuilder.
alex_gaynor
noreply at buildbot.pypy.org
Wed Jun 22 00:29:18 CEST 2011
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: applevel-builder
Changeset: r45049:85bcf78b805b
Date: 2011-06-21 15:33 -0700
http://bitbucket.org/pypy/pypy/changeset/85bcf78b805b/
Log: Started on an app level UnicodeBuilder.
diff --git a/pypy/module/__pypy__/__init__.py b/pypy/module/__pypy__/__init__.py
--- a/pypy/module/__pypy__/__init__.py
+++ b/pypy/module/__pypy__/__init__.py
@@ -3,6 +3,14 @@
from pypy.interpreter.mixedmodule import MixedModule
from pypy.module.imp.importing import get_pyc_magic
+
+class BuildersModule(MixedModule):
+ appleveldefs = {}
+
+ interpleveldefs = {
+ "UnicodeBuilder": "interp_builders.W_UnicodeBuilder",
+ }
+
class Module(MixedModule):
appleveldefs = {
}
@@ -19,6 +27,10 @@
'lookup_special' : 'interp_magic.lookup_special',
}
+ submodules = {
+ "builders": BuildersModule,
+ }
+
def setup_after_space_initialization(self):
"""NOT_RPYTHON"""
if not self.space.config.translating:
diff --git a/pypy/module/__pypy__/interp_builders.py b/pypy/module/__pypy__/interp_builders.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/__pypy__/interp_builders.py
@@ -0,0 +1,45 @@
+from pypy.interpreter.baseobjspace import Wrappable
+from pypy.interpreter.error import OperationError
+from pypy.interpreter.gateway import interp2app, unwrap_spec
+from pypy.interpreter.typedef import TypeDef
+from pypy.rlib.rstring import UnicodeBuilder
+
+
+class W_UnicodeBuilder(Wrappable):
+ def __init__(self, space, size):
+ if size == -1:
+ self.builder = UnicodeBuilder()
+ else:
+ self.builder = UnicodeBuilder(size)
+ self.done = False
+
+ def _check_done(self, space):
+ if self.done:
+ raise OperationError(space.w_ValueError, space.wrap("Can't operate on a done builder"))
+
+ @unwrap_spec(size=int)
+ def descr__new__(space, w_subtype, size=-1):
+ return W_UnicodeBuilder(space, size)
+
+ @unwrap_spec(s=unicode)
+ def descr_append(self, space, s):
+ self._check_done(space)
+ if len(s) == 1:
+ self.builder.append(s[0])
+ else:
+ self.builder.append(s)
+
+ def descr_build(self, space):
+ self._check_done(space)
+ w_s = space.wrap(self.builder.build())
+ self.done = True
+ return w_s
+
+
+W_UnicodeBuilder.typedef = TypeDef("UnicodeBuilder",
+ __new__ = interp2app(W_UnicodeBuilder.descr__new__.im_func),
+
+ append = interp2app(W_UnicodeBuilder.descr_append),
+ build = interp2app(W_UnicodeBuilder.descr_build),
+)
+W_UnicodeBuilder.typedef.acceptable_as_base_class = False
\ No newline at end of file
diff --git a/pypy/module/__pypy__/test/test_builders.py b/pypy/module/__pypy__/test/test_builders.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/__pypy__/test/test_builders.py
@@ -0,0 +1,25 @@
+from pypy.conftest import gettestobjspace
+
+
+class AppTestBuilders(object):
+ def setup_class(cls):
+ cls.space = gettestobjspace(usemodules=['__pypy__'])
+
+ def test_simple(self):
+ from __pypy__.builders import UnicodeBuilder
+ b = UnicodeBuilder()
+ b.append(u"abc")
+ b.append(u"123")
+ b.append(u"1")
+ s = b.build()
+ assert s == u"abc1231"
+ raises(ValueError, b.build)
+ raises(ValueError, b.append, u"123")
+
+ def test_preallocate(self):
+ from __pypy__.builders import UnicodeBuilder
+ b = UnicodeBuilder(10)
+ b.append(u"abc")
+ b.append(u"123")
+ s = b.build()
+ assert s == u"abc123"
\ No newline at end of file
diff --git a/pypy/module/pypyjit/policy.py b/pypy/module/pypyjit/policy.py
--- a/pypy/module/pypyjit/policy.py
+++ b/pypy/module/pypyjit/policy.py
@@ -14,7 +14,8 @@
modname, _ = modname.split('.', 1)
if modname in ['pypyjit', 'signal', 'micronumpy', 'math', 'exceptions',
'imp', 'sys', 'array', '_ffi', 'itertools', 'operator',
- 'posix', '_socket', '_sre', '_lsprof', '_weakref']:
+ 'posix', '_socket', '_sre', '_lsprof', '_weakref',
+ '__pypy__']:
return True
return False
More information about the pypy-commit
mailing list