Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r72400:0d95b46fffc3 Date: 2014-07-09 17:46 +0200 http://bitbucket.org/pypy/pypy/changeset/0d95b46fffc3/
Log: Retype the field "name" on the base object RPython class to be a regular rstr.STR instead of some null-terminated Array(Char). diff --git a/rpython/rtyper/llinterp.py b/rpython/rtyper/llinterp.py --- a/rpython/rtyper/llinterp.py +++ b/rpython/rtyper/llinterp.py @@ -42,7 +42,7 @@ return ': '.join([str(x) for x in self.args]) def type_name(etype): - return ''.join(etype.name).rstrip('\x00') + return ''.join(etype.name.chars) class LLInterpreter(object): """ low level interpreter working with concrete values. """ @@ -145,7 +145,7 @@ assert isinstance(exc, LLException) klass, inst = exc.args[0], exc.args[1] for cls in enumerate_exceptions_top_down(): - if "".join(klass.name).rstrip("\0") == cls.__name__: + if "".join(klass.name.chars) == cls.__name__: return cls raise ValueError("couldn't match exception, maybe it" " has RPython attributes like OSError?") diff --git a/rpython/rtyper/lltypesystem/rclass.py b/rpython/rtyper/lltypesystem/rclass.py --- a/rpython/rtyper/lltypesystem/rclass.py +++ b/rpython/rtyper/lltypesystem/rclass.py @@ -22,6 +22,7 @@ from rpython.rlib import objectmodel from rpython.tool.identity_dict import identity_dict from rpython.rtyper.lltypesystem.lloperation import llop +from rpython.rtyper.lltypesystem import rstr # # There is one "vtable" per user class, with the following structure: @@ -32,7 +33,7 @@ # RuntimeTypeInfo * rtti; # Signed subclassrange_min; //this is also the id of the class itself # Signed subclassrange_max; -# array { char } * name; +# RPyString * name; # struct object * instantiate(); # } # @@ -68,7 +69,7 @@ ('subclassrange_min', Signed), ('subclassrange_max', Signed), ('rtti', Ptr(RuntimeTypeInfo)), - ('name', Ptr(Array(Char))), + ('name', Ptr(rstr.STR)), ('hash', Signed), ('instantiate', Ptr(FuncType([], OBJECTPTR))), hints = {'immutable': True})) @@ -89,13 +90,6 @@ vtable = vtable.super return vtable -def alloc_array_name(name): - p = malloc(Array(Char), len(name)+1, immortal=True) - for i in range(len(name)): - p[i] = name[i] - p[len(name)] = '\x00' - return p - class ClassRepr(AbstractClassRepr): def __init__(self, rtyper, classdef): @@ -203,7 +197,7 @@ name = 'object' else: name = rsubcls.classdef.shortname - vtable.name = alloc_array_name(name) + vtable.name = rstr.string_repr.convert_const(name) if hasattr(rsubcls.classdef, 'my_instantiate_graph'): graph = rsubcls.classdef.my_instantiate_graph vtable.instantiate = self.rtyper.getcallable(graph) @@ -579,7 +573,6 @@ return hop.genop('ptr_nonzero', [vinst], resulttype=Bool) def ll_str(self, i): # doesn't work for non-gc classes! - from rpython.rtyper.lltypesystem import rstr from rpython.rtyper.lltypesystem.ll_str import ll_int2hex from rpython.rlib.rarithmetic import r_uint if not i: @@ -590,14 +583,8 @@ #uid = r_uint(cast_ptr_to_int(i)) uid = r_uint(llop.gc_id(lltype.Signed, i)) # - nameLen = len(instance.typeptr.name) - nameString = rstr.mallocstr(nameLen-1) - i = 0 - while i < nameLen - 1: - nameString.chars[i] = instance.typeptr.name[i] - i += 1 res = rstr.instance_str_prefix - res = rstr.ll_strconcat(res, nameString) + res = rstr.ll_strconcat(res, instance.typeptr.name) res = rstr.ll_strconcat(res, rstr.instance_str_infix) res = rstr.ll_strconcat(res, ll_int2hex(uid, False)) res = rstr.ll_strconcat(res, rstr.instance_str_suffix) diff --git a/rpython/rtyper/test/tool.py b/rpython/rtyper/test/tool.py --- a/rpython/rtyper/test/tool.py +++ b/rpython/rtyper/test/tool.py @@ -68,7 +68,7 @@ return fnptr._obj._callable def class_name(self, value): - return "".join(value.super.typeptr.name)[:-1] + return ''.join(value.super.typeptr.name.chars) def read_attr(self, value, attr_name): value = value._obj diff --git a/rpython/translator/c/src/debug_traceback.c b/rpython/translator/c/src/debug_traceback.c --- a/rpython/translator/c/src/debug_traceback.c +++ b/rpython/translator/c/src/debug_traceback.c @@ -66,7 +66,8 @@ void pypy_debug_catch_fatal_exception(void) { pypy_debug_traceback_print(); - fprintf(stderr, "Fatal RPython error: %s\n", - RPyFetchExceptionType()->ov_name->items); + fprintf(stderr, "Fatal RPython error: %.*s\n", + (int)(RPyFetchExceptionType()->ov_name->rs_chars.length), + RPyFetchExceptionType()->ov_name->rs_chars.items); abort(); } diff --git a/rpython/translator/c/src/exception.c b/rpython/translator/c/src/exception.c --- a/rpython/translator/c/src/exception.c +++ b/rpython/translator/c/src/exception.c @@ -16,8 +16,9 @@ long lineno, const char *functionname) { #ifdef DO_LOG_EXC - fprintf(stderr, "%s %s: %s:%ld %s\n", msg, - RPyFetchExceptionType()->ov_name->items, + fprintf(stderr, "%s %.*s: %s:%ld %s\n", msg, + (int)(RPyFetchExceptionType()->ov_name->rs_chars.length), + RPyFetchExceptionType()->ov_name->rs_chars.items, filename, lineno, functionname); #endif } _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit