Bugs item #2957058, was opened at 2010-02-23 01:11 Message generated for change (Settings changed) made by eighthave You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=478070&aid=2957058...
Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update.
Category: puredata Group: v0.43
Status: Open Resolution: None Priority: 7 Private: No Submitted By: Jonathan Wilkes (jancsika1)
Assigned to: Miller Puckette (millerpuckette) Summary: a pointer to [route] crashes; [route] lacks a 'pointer' type
Initial Comment: [namecanvas foo]
[traverse foo, bang( | [pointer] | [route symbol] | [print]
1) a pointer message is erroneously routed as a symbol 2) this crashes Pd 3) [route pointer] doesn't route a pointer
----------------------------------------------------------------------
Comment By: Jonathan Wilkes (jancsika1) Date: 2010-04-13 02:01
Message: Hans, The crash is caused by any object which attempts to display the output: the<crtl-4> symbol box, [set $1( -- [ ( both cause the crash as well. The [route] object is outputting a symbol message with some mutant value (I assume the selector is 'symbol' because if you hook [route] to a [vsl], for example, you get "no method for 'symbol'"
----------------------------------------------------------------------
Comment By: Hans-Christoph Steiner (eighthave) Date: 2010-04-12 23:31
Message: There are a number of "types" in pd: [symbol] [float] [list] [bang] [pointer] [trigger symbol float list bang pointer]
[route] does [route symbol float list bang] so it is inconsistent that [route pointer] would not route the "pointer" atom type, and instead route based on the "pointer" as a symbolic selector. That right there is a bug IMHO.
As for the crash, I could also reproduce it using Pd version 0.42.5-extended-20100410 or pd-gui-rewrite 0.43 on Mac OS X 10.5.8/Intel. The crash is actually in the [print], not the [route]. When I remove the [print], it doesn't crash.
----------------------------------------------------------------------
Comment By: Jonathan Wilkes (jancsika1) Date: 2010-03-01 16:58
Message: Oops, I didn't realize that when lists get distributed the atoms are interpreted, just like the [list] object classes. E.g., I though the following would output an error but it works fine: [list one two( | [select symbol]
You know, since [route list] has different behaviors depending on whether the first element is a float or symbol, the same could be done for [route pointer]-- strip the selector off of anythings, pass gpointer messages through unchanged. That way there is at least some consistency, in the sense that the selector is always being matched.
----------------------------------------------------------------------
Comment By: Nobody/Anonymous (nobody) Date: 2010-03-01 13:41
Message: Hi Jonathan,
that's not really what I meant. You can use pointers in a list-message of course ("list <pt1> <pt2> <pt3>") or [pack/unpack] many of them and so on. Even [pipe] works with pointers and lists of pointers now.
But when you strip a lone pointer from it's selector then the pointer itself could become the selector like: "list set 2"->[route list] becomes "set 2" and this will call the "set"-method of the next object. If this is a message box it will be set to "2".
But with a pointer you'd get "pointer <pt>" -> [route pointer] -> "<pt>", so now it would try to use some "<pt>" method, which is probably undefined. BTW: I guess that's what leads to the crash here. I think selectors must be symbols.
So to make use of the pointless pointer (pun intended :) one probably has to attach a selector again with [list] or [pointer] or something.
Anyway I guess we're now talking about the usefulness of route's implementation, which is debatable and led to the development of several nicer variants in GridFlow.
----------------------------------------------------------------------
Comment By: Jonathan Wilkes (jancsika1) Date: 2010-03-01 12:48
Message: Hi Frank, Is it really useless? If you send a gpointer through the following, it works:
[rewind $1( | [pointer]
That's a meta message consisting of a symbol-atom and a pointer-atom. And the pointer atom gets sent successfully to the right inlet. However, I can't currently find a way to test sending a single pointer-atom to the left inlet. (If you try to strip it with list trim you always end up with the "list" selector.)
----------------------------------------------------------------------
Comment By: Frank Barknecht (fbar) Date: 2010-03-01 07:16
Message: I meant to write:
useless just like a "gem_state" stripped of its *selector*.
----------------------------------------------------------------------
Comment By: Frank Barknecht (fbar) Date: 2010-03-01 07:15
Message: First I have to correct myself: The selector of a pointer-message is indeed "pointer", as can be seen with zexy's new rawprint object or by exploiting the error message of an object like [select] when sent a pointer which is "no method for 'pointer'".
So "route pointer" could or maybe should indeed route a "pointer" meta-message just like it can route a "gem_state" message However as [route] also strips off the selector you would be left with just the pointer that is more or less useless just like a "gem_state" stripped of its pointer cannot be used in the gem chain anymore.
----------------------------------------------------------------------
Comment By: Jonathan Wilkes (jancsika1) Date: 2010-02-28 22:11
Message: (pointer) with the g missing is what is specified in m_atom.c for displaying a pointer atom. So I assume there's a difference between a pointer message and a pointer atom.
There are two reasons to [route] pointer messages.
1) Didactic-- [route] is a common object people use to learn about the behavior of messages in Pd. It would be nice to show all the predefined message types going to different outlets, which can't currently happen because [route] doesn't differentiate between pointers and anythings.
2) Because anythings and pointers aren't differentiated, this diminishes the flexibility of an abstraction inlet. So a data-structure related abstraction that wants to take "set," "flush", "clear", and pointer messages to the left inlet and do something else with the right inlet has to add an additional inlet. The [pointer] object can differentiate between a pointer and "rewind," for example. An abstraction should be able to have the same flexibility.
----------------------------------------------------------------------
Comment By: Frank Barknecht (fbar) Date: 2010-02-25 11:37
Message: Yep, a gpointer is not simply a message composed of "pointer" and some actual pointer blob. I don't know the exact details myself and don't really understand the source code, but they seem to be something very "special" just like signals are. As you know, [print] shows them as a not very helpful "(gpointer)", but if you pass a pointer to [list prepend set]-[list trim] and into a message box: There pointers show up as "(pointer)" with the "g" missing. Anyway don't bother trying [route (pointer)], it doesn't work either. :)
In the end we probably have to accept that gpointers don't have a "printable" selector, just like audio signals don't have one. Introducing a print- and routable selector as "pointer" may be useful, or maybe it's not, as some people may already use "pointer" as a meta-message in their patches, for example to handle mouse-"pointer" events or so.
----------------------------------------------------------------------
Comment By: Jonathan Wilkes (jancsika1) Date: 2010-02-25 00:54
Message: Hm, I'm just not understanding something about gpointers-- I'd just assumed when you send a pointer message it consists of the selector "pointer" followed by the gpointer itself (gridflow's [display] seems to confirm this). But clearly something else is going on because [route pointer] doesn't currently work for gpointers, nor will [pointer] accept a gpointer that has passed through [pointer $1( (though [route] will, without crashing, and output a usable gpointer that has the selector "list").
It also seems like "pointer 1 2 3" is an unchecked case of "bad arguments to message 'pointer'". So I guess I'm saying I agree that [route pointer] should route according to the selector "pointer", I just don't understand why a gpointer wouldn't match under those conditions.
----------------------------------------------------------------------
Comment By: Frank Barknecht (fbar) Date: 2010-02-23 03:40
Message: Hi Jonathan,
I raised the priority as crashes are really serious. I disagree with your item 3), though. [route pointer] should not route GPointers, but meta-messages starting with the symbol "pointer" e.g.
[pointer 1 2 3( | [route pointer] |
It does that just fine.
----------------------------------------------------------------------
You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=478070&aid=2957058...