From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32136 invoked by alias); 20 Oct 2009 13:45:55 -0000 Mailing-List: contact archer-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: List-Id: Received: (qmail 32108 invoked by uid 22791); 20 Oct 2009 13:45:52 -0000 X-SWARE-Spam-Status: No, hits=-2.5 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: sourceware.org Message-ID: <4ADDBEFF.4080805@redhat.com> Date: Tue, 20 Oct 2009 13:45:00 -0000 From: Phil Muldoon User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.4pre) Gecko/20090922 Fedora/3.0-2.7.b4.fc11 Lightning/1.0pre Thunderbird/3.0b4 MIME-Version: 1.0 To: Project Archer Subject: [patch] Fix python/10805 Content-Type: multipart/mixed; boundary="------------090109080706020300070200" X-SW-Source: 2009-q4/txt/msg00016.txt.bz2 This is a multi-part message in MIME format. --------------090109080706020300070200 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 786 This patch fixes python/10805. When fields were being constructed, the convert_fields function was not checking if the type was a class before determining if it was a base class. Added a check to gate this behaviour. Additionally, I started a testsuite for Python types. This suite only tests for this regression, but it can be expanded later, in separate efforts. Cheers, Phil -- ChangeLog 2009-10-20 Phil Muldoon PR python/10805 * python/py-type.c (convert_field): Check for TYPE_CODE_CLASS before calling TYPE_N_BASECLASSES. Testsuite ChangeLog 2009-10-20 Phil Muldoon PR python/10805 * gdb.python/py-type.exp: New file. * gdb.python/py-type.c: New file. * Makefile.in: Add py-type. --------------090109080706020300070200 Content-Type: text/plain; name="pr10805.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pr10805.patch" Content-length: 6325 diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index f512248..d830e43 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -177,7 +177,10 @@ convert_field (struct type *type, int field) if (PyObject_SetAttrString (result, "artificial", arg) < 0) goto failarg; - arg = field < TYPE_N_BASECLASSES (type) ? Py_True : Py_False; + if (TYPE_CODE (type) == TYPE_CODE_CLASS) + arg = field < TYPE_N_BASECLASSES (type) ? Py_True : Py_False; + else + arg = Py_False; Py_INCREF (arg); if (PyObject_SetAttrString (result, "is_base_class", arg) < 0) goto failarg; diff --git a/gdb/testsuite/gdb.python/Makefile.in b/gdb/testsuite/gdb.python/Makefile.in index ca5cdc7..3e81bd3 100644 --- a/gdb/testsuite/gdb.python/Makefile.in +++ b/gdb/testsuite/gdb.python/Makefile.in @@ -1,7 +1,7 @@ VPATH = @srcdir@ srcdir = @srcdir@ -EXECUTABLES = py-value py-prettyprint py-template +EXECUTABLES = py-type py-value py-prettyprint py-template all info install-info dvi install uninstall installcheck check: @echo "Nothing to be done for $@..." diff --git a/gdb/testsuite/gdb.python/py-type.c b/gdb/testsuite/gdb.python/py-type.c index e69de29..a2d1bb8 100644 --- a/gdb/testsuite/gdb.python/py-type.c +++ b/gdb/testsuite/gdb.python/py-type.c @@ -0,0 +1,48 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2009 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +struct s +{ + int a; + int b; +}; + +#ifdef __cplusplus +class C +{ + public: + int c; + int d; +}; +#endif + +int +main () +{ + int ar[2] = {1,2}; + struct s st; +#ifdef __cplusplus + C c; + c.c = 1; + c.d = 2; +#endif + + st.a = 3; + st.b = 5; + + return 0; /* break to inspect struct and array. */ +} diff --git a/gdb/testsuite/gdb.python/py-type.exp b/gdb/testsuite/gdb.python/py-type.exp index e69de29..de2612f 100644 --- a/gdb/testsuite/gdb.python/py-type.exp +++ b/gdb/testsuite/gdb.python/py-type.exp @@ -0,0 +1,104 @@ +# Copyright (C) 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file is part of the GDB testsuite. It tests the mechanism +# of exposing types to Python. + +if $tracelevel then { + strace $tracelevel +} + +set testfile "py-type" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +# Build inferior to language specification. +proc build_inferior {lang} { + global srcdir subdir srcfile binfile testfile hex + + if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "debug $lang"] != "" } { + untested "Couldn't compile ${srcfile} in $lang mode" + return -1 + } +} + +# Restart GDB, set breakpoint and run to that breakpoint. +proc restart_gdb {bp} { + global srcdir subdir srcfile binfile testfile hex + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} + + if ![runto_main ] then { + perror "couldn't run to breakpoint" + return + } + + gdb_breakpoint [gdb_get_line_number $bp] + gdb_continue_to_breakpoint $bp +} + + +# Run a command in GDB, and report a failure if a Python exception is thrown. +# If report_pass is true, report a pass if no exception is thrown. +proc gdb_py_test_silent_cmd {cmd name report_pass} { + global gdb_prompt + + gdb_test_multiple $cmd $name { + -re "Traceback.*$gdb_prompt $" { fail $name } + -re "$gdb_prompt $" { if $report_pass { pass $name } } + } +} + +proc test_fields {lang} { + global gdb_prompt + + if {$lang == "c++"} { + # Test usage with a class + gdb_py_test_silent_cmd "print c" "print value" 1 + gdb_py_test_silent_cmd "python c = gdb.history (0)" "get value from history" 1 + gdb_py_test_silent_cmd "python fields = c.type.fields()" "get fields" 1 + gdb_test "python print len(fields)" "2" "Check number of fields" + gdb_test "python print fields\[0\].name" "c" "Check class field c name" + gdb_test "python print fields\[1\].name" "d" "Check class field d name" + } + + # Test normal fields usage in structs. + gdb_py_test_silent_cmd "print st" "print value" 1 + gdb_py_test_silent_cmd "python st = gdb.history (0)" "get value from history" 1 + gdb_py_test_silent_cmd "python fields = st.type.fields()" "get fields" 1 + gdb_test "python print len(fields)" "2" "Check number of fields" + gdb_test "python print fields\[0\].name" "a" "Check structure field a name" + gdb_test "python print fields\[1\].name" "b" "Check structure field b name" + + # Test regression PR python/10805 + gdb_py_test_silent_cmd "print ar" "print value" 1 + gdb_py_test_silent_cmd "python ar = gdb.history (0)" "get value from history" 1 + gdb_test "python fields = ar.type.fields()" + gdb_test "python print len(fields)" "1" "Check the number of fields" + gdb_test "python print fields\[0\].type" "" "Check array field type" +} + +# Perform C Tests. +build_inferior "c" +restart_gdb "break to inspect struct and array." +test_fields "c" + +# Perform C++ Tests. +build_inferior "c++" +restart_gdb "break to inspect struct and array." +test_fields "c++" --------------090109080706020300070200--