Debug.locate_references(ob) failed when ob has a getter or setter

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Debug.locate_references(ob) failed when ob has a getter or setter

郭雪松-2
***One ref found. -> from object 0x18f6f2b0 offset 189096
  **In variable _father
  **In storage for inherit 0
  **Block: 0x18f6f2b0  Type: object  Refs: 4
  **Parent identifier: 8
  **Program id: 66102
  **Object variables:
  ** rtt: mixed     name: _disabled             off:  352  value: 0
  ** rtt: mixed     name: _init_disabled        off:  368  value: 0
  ** rtt: PIKE_T_GET_SET  name: disabled              off: -65406  value: /hom
e/peterpan/Pike-v7.8.352-spearpatched/src/svalue.c:2048: Fatal error:
Invalid type 32 in svalue at 0x7fff5358f180.
Pike was in GC stage -1 when this fatal occured.

pike version is Pike v7.8 release 352
& nbsp;
I looked into the source, and saw the following:
 
#define IS_INVALID_TYPE(T)                                              \
  ((T > MAX_TYPE && T < T_OBJ_INDEX && T != T_VOID) || T >
 T_ARRAY_LVALUE)
 
When T==PIKE_T_GET_SET (the value is 32), IS_INVALID_TYPE(T) returned true and debug_svalue_type_error was called that cause fatal error.



Guo Xuesong
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: Debug.locate_references(ob) failed when ob has a getter or setter

Henrik Grubbström-2
On Sun, 1 Jan 2012, ¹ùÑ©ËÉ wrote:

> ***One ref found. -> from object 0x18f6f2b0 offset 189096
[...]
> Invalid type 32 in svalue at 0x7fff5358f180.
> Pike was in GC stage -1 when this fatal occured.

Fatals are never good.

> pike version is Pike v7.8 release 352
>
> I looked into the source, and saw the following:
>
> #define IS_INVALID_TYPE(T)                                              \
>  ((T > MAX_TYPE && T < T_OBJ_INDEX && T != T_VOID) || T > T_ARRAY_LVALUE)
>
> When T==PIKE_T_GET_SET (the value is 32), IS_INVALID_TYPE(T) returned
> true and debug_svalue_type_error was called that cause fatal error.

Yes, but check_svalue_type() should typically not be called with
PIKE_T_GET_SET svalues to begin with, so the bug is probably
somewhere else.

Unfortunately I'm not able to reproduce the error with a trivial testcase,
so I would appreciate if you could provide one.

> Guo Xuesong

Thanks, and a happy new year.

--
Henrik Grubbström [hidden email]
Roxen Internet Software AB
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

RE: Debug.locate_references(ob) failed when ob has a getter or setter

郭雪松-2
this testcase should work:
 
class B{
}
class A{
 object p;
 mixed `foo()
 {
 }
}
void main()
{
 object b=B();
 object a=A();
 a->p=b;
 Debug.locate_references(b);
}

locate_references will print:
 
...
  ** rtt: PIKE_T_GET_SET  name: foo                   off: -65534  value: ...
 
When it try to print the value of foo, pike crashed.

Guo Xuesong
 
> Date: Sun, 1 Jan 2012 15:55:55 +0100

> From: [hidden email]
> To: [hidden email]
> CC: [hidden email]
> Subject: Re: Debug.locate_references(ob) failed when ob has a getter or setter
>
> On Sun, 1 Jan 2012, ¹ùÑ©ËÉ wrote:
>
> > ***One ref found. -> from object 0x18f6f2b0 offset 189096
> [...]
> > Invalid type 32 in svalue at 0x7fff5358f180.
> > Pike was in GC stage -1 when this fatal occured.
>
> Fatals are never good.
>
> > pike version is Pike v7.8 release 352
> >
> > I looked into the source, and saw the following:
> >
> > #define IS_INVALID_TYPE(T) \
> > ((T > MAX_TYPE && T < T_OBJ_INDEX && T != T_VOID) || T > T_ARRAY_LVALUE)
> >
> > When T==PIKE_T_GET_SET (the value is 32), IS_INVALID_TYPE(T) returned
> > true and debug_svalue_type_error was called that cause fatal error.
>
> Yes, but check_svalue_type() should typically not be called with
> PIKE_T_GET_SET svalues to begin with, so the bug is probably
> somewhere else.
>
> Unfortunately I'm not able to reproduce the error with a trivial testcase,
> so I would appreciate if you could provide one.
>
> > Guo Xuesong
>
> Thanks, and a happy new year.
>
> --
> Henrik Grubbström [hidden email]
> Roxen Internet Software AB
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

RE: Debug.locate_references(ob) failed when ob has a getter or setter

Henrik Grubbström-2
On Mon, 2 Jan 2012,  wrote:

> this testcase should work:
[...]

Thanks, now I could reproduce the problem.

> locate_references will print:
>
> ...
>  ** rtt: PIKE_T_GET_SET  name: foo                   off: -65534  value: ...
>
> When it try to print the value of foo, pike crashed.

The bug seems to have been fixed in gc.c:1.340:

commit 9e9e5b3dc6496ab1a69f6b40f787e43716e1f6a7
Author: Martin Stjernholm <[hidden email]>
Date:   Mon Dec 14 00:22:34 2009 +0100

     Fixed support for externs, getters and setters in low_describe_something.

     Rev: src/gc.c:1.340

ie Fixed in Pike 7.8.384 and later.

> Guo Xuesong

Thanks,

--
Henrik Grubbström [hidden email]
Roxen Internet Software AB
Loading...