Pharo-dev
By thread
pharo-dev@lists.pharo.org
By month
Messages by month
- ----- 2026 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 1 participants
- 144633 messages
Browse class from playground raises a DNU
by Stephane Ducasse
Hi
I'm the only one to experience a isVariable DNU when typing a class
name and pressing command B in playground?
Example
PointCURSORHERE
[node isVariable] whileFalse: [
(node := node parent) ifNil: fallbackBlock ].
in findClassFromAST
"Try to make a class name out of the current text selection"
| node fallbackBlock className |
"Preserve original behavior - although could consider building AST
from selection"
self hasSelection ifTrue: [
^(self selection string copyWithoutAll: CharacterSet crlf) trimBoth ].
fallbackBlock := [^nil].
node := self bestNodeInTextAreaOnError: fallbackBlock.
[node isVariable] whileFalse: [
(node := node parent) ifNil: fallbackBlock ].
className := node name.
[ className first isUppercase ] whileFalse: [
(className := className allButFirst) ifEmpty: fallbackBlock ].
^className
Nov. 8, 2017
[Debugger] Is "run to here" broken?
by Stephane Ducasse
Hi
I have the following method and I have my cursor -MY CURSOR HERE-
I select the menu run to here and .... I exit the method.
:(
Is run to here working in Pharo 70?
I start to get worry about the number of bugs I get when using Pharo70.
Stef
fileOut
"File out the receiver, to a file whose name is a function of the
change-set name and a unique numeric tag."
| nameToUse |
self halt.
self class promptForDefaultChangeSetDirectoryIfNecessary.
nameToUse := (self defaultChangeSetDirectory / self name , 'cs')
nextVersion basename.
UIManager default
showWaitCursorWhile:
[
| internalStream |
internalStream := (String new: 10000) writeStream.
-MY CURSOR HERE-
internalStream
header;
timeStamp.
self fileOutPreambleOn: internalStream.
self fileOutOn: internalStream.
self fileOutPostscriptOn: internalStream.
CodeExporter
writeSourceCodeFrom: internalStream
baseName: (nameToUse copyFrom: 1 to: nameToUse size - 3)
isSt: false ]
Nov. 8, 2017
Re: [Pharo-dev] Is fileout on the change sorter working in Pharo 70?
by Stephane Ducasse
Ah thanks we should fix this.
On Wed, Nov 8, 2017 at 9:31 PM, Christian Kellermann
<ckeen(a)pestilenz.org> wrote:
> * Stephane Ducasse <stepharo.self(a)gmail.com> [171108 21:29]:
>> Hi
>>
>> I'm trying to rescue some of my work (that I cannot save in MC nor in
>> Iceberg because the system
>> does not see it - super funny).
>>
>> I can browse the change using the changesorter when I do fileout
>> the system tells me that the file it saved but I cannot find it on my disc.
>> Apparently none of the fileout is working in the changesorter. :(
>
> I have successfully filed out code with epicea but not changesorter.
>
> HTH,
>
> Christian
>
> --
> May you be peaceful, may you live in safety, may you be free from
> suffering, and may you live with ease.
>
Nov. 8, 2017
Re: [Pharo-dev] Is fileout on the change sorter working in Pharo 70?
by Christian Kellermann
* Stephane Ducasse <stepharo.self(a)gmail.com> [171108 21:29]:
> Hi
>
> I'm trying to rescue some of my work (that I cannot save in MC nor in
> Iceberg because the system
> does not see it - super funny).
>
> I can browse the change using the changesorter when I do fileout
> the system tells me that the file it saved but I cannot find it on my disc.
> Apparently none of the fileout is working in the changesorter. :(
I have successfully filed out code with epicea but not changesorter.
HTH,
Christian
--
May you be peaceful, may you live in safety, may you be free from
suffering, and may you live with ease.
Nov. 8, 2017
Re: [Pharo-dev] [IMPORTANT] Is there a bug in Tonel with category:
by Stephane Ducasse
Sven
I understand but it is SUPER strange to save the code in a format that
does not respect the syntax of the language.
I think that we should write a parser for the class definition or save
category as strings.
I do not want to have to explain to people. Yes and no this is not the
pharo syntax.
Sorry I'm fed up.
Stef
On Mon, Nov 6, 2017 at 10:25 PM, Sven Van Caekenberghe <sven(a)stfx.eu> wrote:
>
>
>> On 6 Nov 2017, at 20:52, Stephane Ducasse <stepharo.self(a)gmail.com> wrote:
>>
>> Esteban told me that this is because he uses STON for the class definition.
>> Now a simple question may be we could use a string instead of a symbol
>> because this is strange
>> to have a class definitino that does not respect Pharo syntax.
>
> It might be a bit confusing at first sight, but it is correct, IMHO.
>
> It is STON syntax, not Pharo.
>
> Yes, STON is a bit more liberal with Symbols than normal Smalltalk, but it is totally consistent with itself.
>
> STON fromString: (STON toString: #'My Strange Symbol').
> STON fromString: (STON toString: #'foo-bar').
>
> If a Symbol consists only of characters in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_./' then the Symbol does not need to be quoted in STON.
>
> I see no problem there.
>
>> Stef
>>
>> On Mon, Nov 6, 2017 at 8:15 PM, Dale Henrichs
>> <dale.henrichs(a)gemtalksystems.com> wrote:
>>>
>>>
>>> On 11/06/2017 08:23 AM, Sven Van Caekenberghe wrote:
>>>>
>>>>
>>>>> On 6 Nov 2017, at 17:13, Dale Henrichs <dale.henrichs(a)gemtalksystems.com>
>>>>> wrote:
>>>>>
>>>>>
>>>>>
>>>>> On 11/6/17 7:07 AM, Sven Van Caekenberghe wrote:
>>>>>>>
>>>>>>> On 6 Nov 2017, at 15:43, Dale Henrichs
>>>>>>> <dale.henrichs(a)gemtalksystems.com> wrote:
>>>>>>>
>>>>>>> of course with Pharo's implementation of Symbol it is not practical to
>>>>>>> use asString nor type checks - things that are not necessary in other
>>>>>>> Smalltalk implementations
>>>>>>
>>>>>> How so ?
>>>>>>
>>>>>> What is the problem with Symbol>>#asString ?
>>>>>
>>>>> I am not going to go to every field in the api that is supposed to be a
>>>>> String and add asString. There are too many places to worry about ... I
>>>>> would prefer that Pharo be ANSI compliant:)
>>>>>
>>>>> It's not just Metacello.
>>>>>
>>>>> It's an annoying issue that has to be dealt with every time a Pharo
>>>>> application is ported to another dialect of Smalltalk and an annoying
>>>>> barrier for folks running on other dialects to move their application to
>>>>> Pharo - in this case the bugs that are introduced by Pharo's behavior with
>>>>> respect to Symbols can be very hard to diagnose --
>>>>>
>>>>> Making things harder to share code between dialects is a bad thing for
>>>>> Smalltalk overall -- just another reason for non-Smalltalk programmers to
>>>>> question the whether they should use Smalltalk or not...
>>>>>
>>>>> And I don't need to hear about how Pharo is not Smalltalk:)
>>>>>
>>>>> Dale
>>>>
>>>> So there is nothing 'wrong', you just want Pharo to remain the same as
>>>> every other non-changing Smalltalk out there.
>>>
>>> Did I say that?
>>>
>>> I support the direction that Pharo is going, but I reserve the right to
>>> disagree with some of the details.
>>>
>>> This is just one detail ... nothing more nothing less ... For those of us
>>> that work in multiple dialects, it IS annoying and I take an opportunity
>>> every year or so to remind you guys of the things that I find annoying, just
>>> to keep you guys honest:)
>>>
>>>>
>>>> From one perspective you are right, it makes some cross platform porting
>>>> in either direction harder. Seaside has many rules to help portability. Not
>>>> mixing Strings and Symbol is probably one of them.
>>>
>>> ... and as I mentioned, this problem can be one of the more annoying issues
>>> to track down, when a developer is not careful ... Honestly there are two
>>> sides to the issue ... when developers use Symbols in tests to drive an API
>>> that is supposed to use Strings (this happens the most often) things break
>>> pretty quickly and the tests can be fixed pretty easily ... but when the
>>> code itself is written with mixed Symbols and Strings, the tests might
>>> actually pass after the port, and the bugs will only show up in subtle cases
>>> ... I've hit a handful of these over the years and they are hard to track
>>> down...
>>>>
>>>>
>>>> But you know very well that Pharo was started so that we would be able to
>>>> make changes, in any area or aspect of the system, without the burden of
>>>> backwards or cross platform compatibility, even if some of these changes are
>>>> taste based.
>>>
>>> Agree with your statement -- most of the changes that Pharo has made have
>>> not been difficult to accommodate, but Symbol/String is at a fundamental
>>> level and I'm not sure that it would be "illegal" to make this accommodation
>>> --- I AM pretty certain that it would cause some short term pain, but
>>> probably no more pain (and likely less pain) than is caused by trying to
>>> move an application to a new version of Pharo:)
>>>>
>>>> And I happen to like the ability to mix and match Strings and Symbols (we
>>>> discussed about this before).
>>>>
>>> I won't argue with taste, it's is simply the portability for this particular
>>> problem that I am highlighting ...
>>>
>>> Dale
>>>
>>
>
>
Nov. 8, 2017
Is fileout on the change sorter working in Pharo 70?
by Stephane Ducasse
Hi
I'm trying to rescue some of my work (that I cannot save in MC nor in
Iceberg because the system
does not see it - super funny).
I can browse the change using the changesorter when I do fileout
the system tells me that the file it saved but I cannot find it on my disc.
Apparently none of the fileout is working in the changesorter. :(
Stef
Nov. 8, 2017
Re: [Pharo-dev] ExternalAddress uniqueness (was Re: Call for help for stability and rewrite of FreeType)
by Nicolas Cellier
2017-11-08 16:10 GMT+01:00 Nicolas Cellier <
nicolas.cellier.aka.nice(a)gmail.com>:
>
>
> 2017-11-08 15:35 GMT+01:00 Nicolas Cellier <nicolas.cellier.aka.nice@
> gmail.com>:
>
>>
>>
>> 2017-11-08 14:53 GMT+01:00 Nicolas Cellier <nicolas.cellier.aka.nice@gmai
>> l.com>:
>>
>>>
>>>
>>> 2017-11-08 14:42 GMT+01:00 Nicolas Cellier <
>>> nicolas.cellier.aka.nice(a)gmail.com>:
>>>
>>>>
>>>> Ben,
>>>>
>>>> This is my fresh crash.dmp
>>>> it sounds very related to your analysis!!!
>>>>
>>>> In fact we are not freeing by ourselves, but telling libgit2 to do it...
>>>>
>>>>
>>> Oh worse than that, it sounds like git implemented its own mechanism of
>>> counted pointers...
>>> So we don't tell anything, he guesses by himself.
>>> I would search for places where we #gcallocate: or manually #free a
>>> pointer on a structure passed back by git...
>>>
>>>
>> and of course, it's not gcallocate: because this was a very old wheel...
>> It's rather somewhere in UFFI equivalent
>> FFIExternalResourceExecutor <- FFIExternalResourceManager <-
>> LGitExternalStructure autoRelease
>>
>> Among the senders, we see (tiens, tiens...):
>> LGitTree>>...
>>
>> So this is where I would search the origin of my own crash dump...
>>
>> But also (tiens, tiens...):
>> CairoFontFace>>initializeWithFreetypeFace:
>>
>> What if FreeType plugin was not the problem per se, but its usage in
>> cairo was?
>>
>> cairo_font_face_destroy ()
>> void cairo_font_face_destroy
>> (cairo_font_face_t *font_face);
>> Decreases the reference count on font_face by one. If the result is zero, *then
>> font_face and all associated resources are freed*. See
>> cairo_font_face_reference().
>> font_face :
>> a cairo_font_face_t
>>
>> Since we pass a pointer to the free type font at creation:
>>
>> fromFreetypeFace: aFace
>> | handle cairoFace |
>> handle := aFace handle pointerAt: 1.
>> cairoFace := self primFtFace: handle loadFlags: ( LoadNoHinting |
>> LoadTargetLCD | LoadNoAutohint | LoadNoBitmap).
>> ^ cairoFace initializeWithFreetypeFace: aFace
>>
>> Isn't it possible that we somehow double free the free type font too?
>>
>>
> Hmm not the exact catch but it could well be related
>
> https://www.cairographics.org/manual/cairo-FreeType-Fonts.html tells how
> to couple lifetime of the 2 data structures.
> I see that CairoFontFace retains a pointer on the FT_Face thru a dedicated
> ivar, so at least, we don't free the FT_Face twice, and we don't free it
> until we free the cairo_ft_face
>
> When finalizatoin occurs, I'm not sure that the finalization order is
> guaranteed but that does not matter.
> What matters is that the cairo_ft_face could still be referenced
> internally by cairo.
>
> So what can happen is that:
> 1) we don't reference anymore the CairoFontFace from within Smalltalk
> 2) finalization happens we call cairo_font_face_destroy ()
> 3) there is no more pointer on the FTFace from within Smalltalk (because
> we just reclaimed the CairoFontFace pointing on it)
> 4) finalization happens and we call FT_Done_Face()
>
> BUT: cairo was still using the cairo_font_face internally, (the reference
> count did not reach zero) and is now pointing on freed memory due to
> FT_Done_Face()...
>
> We should have tested the status before invoking FT_Done():
>
> status = cairo_font_face_set_user_data (font_face, &key,
> ft_face, (cairo_destroy_func_t) FT_Done_Face);
>
> That means that we would have to performa that status test in the
> finalization, and if not ready, keep a reference to both cairo_font_face
> handle ft_face handle
> But then there is no other mean than storing those reference in a safe
> place and regularly poll for readiness
> If my understanding is correct, this is absolutely garbage collector
> unfriendly!
>
>
No total misunderstanding from my side...
by setting the user data and destroy function, we are asking to
auto-release the ft_face
In which case, it's bad, because the ft_face is not ref-counted and we
might still have another pointer on it from within Smalltalk
The only way is thus to poll thru:
cairo_font_face_get_reference_count (*cairo_font_face_t
<https://www.cairographics.org/manual/cairo-cairo-font-face-t.html#cairo-fon…>
*font_face*);
If the count is 1, we can safely proceed with finalization.
Else, there is still an internal reference somewhere in cairo and bang!
I'd suggest to instrument the code with this function:
CairoFontFace class>>countReferences: handle
"
unsigned int cairo_font_face_get_reference_count
(cairo_font_face_t *font_face);
"
<primitive: #primitiveNativeCall module: #NativeBoostPlugin error:
errorCode>
^ self nbCall: #( unsigned int cairo_font_face_get_reference_count
(size_t handle))
CairoFontFace class>>reallyFinalizeResourceData: handle
"
void cairo_font_face_destroy (cairo_font_face_t
*font_face);
"
<primitive: #primitiveNativeCall module: #NativeBoostPlugin error:
errorCode>
^ self nbCall: #( void cairo_font_face_destroy (size_t handle))
CairoFontFace class>>finalizeResourceData: handle
(self countReferences: handle) = 1 ifFalse: [self halt: 'Houston, we
gonna have a pointer reference problem'].
^self reallyFinalizeResourceData: handle
If suspicion is confirmed, then we'll have to install the ref_count polling
mechanism...
>>
>>>> Stack backtrace:
>>>> [7791E43E] RtlInitializeGenericTable + 0x196 in ntdll.dll
>>>> [7791E0A3] RtlGetCompressionWorkSpaceSize + 0x7e in ntdll.dll
>>>> [751F98CD] free + 0x39 in msvcrt.dll
>>>> [6CD60D43] git_tree_cache_write + 0x2ac in libgit2.dll
>>>> [6CD62073] git_tree__free + 0x53 in libgit2.dll
>>>> [6CD1A563] git_object__free + 0x52 in libgit2.dll
>>>> [6CCD0D78] git_cached_obj_decref + 0x4c in libgit2.dll
>>>> [6CD1A7D9] git_object_free + 0x17 in libgit2.dll
>>>> [6CD1B0D3] git_tree_free + 0x11 in libgit2.dll
>>>> [6CD0BE4F] git_iterator_for_nothing + 0x8aa in libgit2.dll
>>>> [6CD0C053] git_iterator_for_nothing + 0xaae in libgit2.dll
>>>> [6CCEADEF] git_diff_file_content__clear + 0x31d in libgit2.dll
>>>> [6CCECC3F] git_diff__oid_for_entry + 0xc29 in libgit2.dll
>>>> [6CCED2B2] git_diff__oid_for_entry + 0x129c in libgit2.dll
>>>> [6CCED495] git_diff__from_iterators + 0x1db in libgit2.dll
>>>> [6CCED6DE] git_diff_tree_to_tree + 0x1e3 in libgit2.dll
>>>> [004DE7C8] ??? + 0xde7c8 in Pharo.exe
>>>> [0044FE08] ??? + 0x4fe08 in Pharo.exe
>>>> [004516A7] ??? + 0x516a7 in Pharo.exe
>>>> [00446051] ??? + 0x46051 in Pharo.exe
>>>> [0049936E] ??? + 0x9936e in Pharo.exe
>>>>
>>>>
>>>> Smalltalk stack dump:
>>>> 0xafa86c I LGitDiff>diff_tree_to_tree:repo:old_tree:new_tree:opts:
>>>> 0xe585410: a(n) LGitDiff
>>>> 0xafa8a4 M [] in LGitDiff>diffTree:toTree:options: 0xe585410: a(n)
>>>> LGitDiff
>>>> 0xafa8bc M LGitDiff(LGitExternalObject)>withReturnHandlerDo:
>>>> 0xe585410: a(n) LGitDiff
>>>> 0xafc678 I LGitDiff>diffTree:toTree:options: 0xe585410: a(n) LGitDiff
>>>> 0xafc6a4 I LGitDiff>diffTree:toTree: 0xe585410: a(n) LGitDiff
>>>> 0xafc6d0 I LGitTree>diffTo: 0xe583e00: a(n) LGitTree
>>>> 0xafc6fc M [] in IceLibgitLocalRepository>changedFilesBetween:and:
>>>> 0x1055afc0: a(n) IceLibgitLocalRepository
>>>> 0xafc720 M [] in IceLibgitLocalRepository>withRepoDo: 0x1055afc0:
>>>> a(n) IceLibgitLocalRepository
>>>> 0xafc73c M [] in LGitGlobal class>runSequence: 0xfb96188: a(n)
>>>> LGitGlobal class
>>>> 0xafc760 M [] in LGitActionSequence(DynamicVariable)>value:during:
>>>> 0x102109f8: a(n) LGitActionSequence
>>>> 0xafc780 M BlockClosure>ensure: 0xe582890: a(n) BlockClosure
>>>> 0xafc7ac I LGitActionSequence(DynamicVariable)>value:during:
>>>> 0x102109f8: a(n) LGitActionSequence
>>>> 0xafc7cc M LGitActionSequence class(DynamicVariable
>>>> class)>value:during: 0xfbb81e0: a(n) LGitActionSequence class
>>>> 0xafc7f4 I LGitGlobal class>runSequence: 0xfb96188: a(n) LGitGlobal
>>>> class
>>>> 0xafc818 I IceLibgitLocalRepository>withRepoDo: 0x1055afc0: a(n)
>>>> IceLibgitLocalRepository
>>>> 0xafc840 I IceLibgitLocalRepository>changedFilesBetween:and:
>>>> 0x1055afc0: a(n) IceLibgitLocalRepository
>>>> 0xafc874 I IceCommitInfo>changedPackagesToCommitInfo: 0x113b80e0:
>>>> a(n) IceCommitInfo
>>>> 0xafc898 I IceCommitInfo>changedPackagesTo: 0x113b80e0: a(n)
>>>> IceCommitInfo
>>>> 0xafc8c0 I IceDiff>initialElements 0xe4c48f8: a(n) IceDiff
>>>> 0xaf9664 I IceDiff(IceAbstractDiff)>elements 0xe4c48f8: a(n) IceDiff
>>>> 0xaf9684 I IceDiffChangeTreeBuilder>elements 0xe4b9c80: a(n)
>>>> IceDiffChangeTreeBuilder
>>>> 0xaf969c M [] in IceDiffChangeTreeBuilder>buildOn: 0xe4b9c80: a(n)
>>>> IceDiffChangeTreeBuilder
>>>>
>>>> Dimitris:
>>>>
>>>> I won't argument, I've learnt C in 1987, so it gave me enough time to
>>>> learn my own limits.
>>>> Working with pointers is like carrying a gun without engaging the
>>>> safety catch.
>>>> I came to think that shooting own foot was a feature ;)
>>>>
>>>> 2017-11-06 11:04 GMT+01:00 Dimitris Chloupis <kilon.alios(a)gmail.com>:
>>>>
>>>>> Its the usual case of not being able to have your cake and eat it too.
>>>>>
>>>>> If you want top performance you have to manage memory yourself plus
>>>>> the abilitiy to access thousands of C libraries is not such a bad excuse
>>>>> for a compromise. The FFI is not a problem is a solution to many problems
>>>>> and people using it its not as if Smalltalk offers them any alternative
>>>>> choice.
>>>>>
>>>>> Not to forget that Slang itself relies heavily on C, which is only the
>>>>> core of the VM and the very core of the implementation.
>>>>>
>>>>> Understanding how to work with pointers in C is pretty much
>>>>> understanding how to works with Objects in Smalltalk. Both are nuclear
>>>>> weapons that those two languages are build around. If ones does not
>>>>> understand their usage he will shoot his foot in the end.
>>>>>
>>>>> The important thing to remember is that C's goal is not the same as of
>>>>> Smalltalk. Its not there to hold your hand and make coding easy for you. C
>>>>> is there to offer low level access combined with top performance. It may
>>>>> have started as a general purpose language decades ago when coding in
>>>>> Assembly was still a pleasant experience. Nowdays C has completely replaced
>>>>> Assembly as the top performance language for low level coding.
>>>>>
>>>>> C may appear as a problematic language to a Smalltalker but only
>>>>> because he sees it from the Smalltalk point of view. The harsh reality of
>>>>> the world is that as much as one may want to shoehorn it , not everything
>>>>> can be elegantly mapped to a object. Smalltalk may be OO to the bone , but
>>>>> the world we live in, cannot afford such simple structures to accomodate of
>>>>> varied immense complexity.
>>>>>
>>>>> On the subject of pointers, the general rule of thumb is to keep
>>>>> things as simple as possible and avoide trying to do weird "magic" with
>>>>> them. There is a ton of things that C does under the hood to generate
>>>>> highly optimised machine code that can fry the brain , as the usual case
>>>>> with low level coding, so keeping it simple is the way to go.
>>>>>
>>>>> Oh and dont try to shoehorn the Live coding enviroment in debugging C
>>>>> code, as much as one may want to brag of Smalltalk's elegant debugger, C
>>>>> development tools are light years ahead in dealing with C problems.
>>>>>
>>>>> May advice to people is that if you do it via FFI first, you do it
>>>>> wrong.
>>>>>
>>>>> Do it always first with C with a powerful C IDE like Visual Studio,
>>>>> make sure your code works there and then use the UFFI. Will make life
>>>>> thousand times easier. I learned that the hard way when I was playing
>>>>> around with Pharo and shared memory.
>>>>>
>>>>> So yes having a FFI that does not help you avoid coding in C first, is
>>>>> a big plus, not a minus. Sometimes it makes sense to live outside the
>>>>> image, this is an excellent case to prove why that is a great idea. .
>>>>>
>>>>> On Mon, Nov 6, 2017 at 11:10 AM Nicolas Cellier <
>>>>> nicolas.cellier.aka.nice(a)gmail.com> wrote:
>>>>>
>>>>>> Hi Ben,
>>>>>> It's a super bad idea to copy an ExternalAddress.
>>>>>> It's common knowledge in C++ copy operator & copy constructors...
>>>>>>
>>>>>> But it's not obvious to me that you'll have double freeing (unless
>>>>>> you explicitely free the pointer by yourself).
>>>>>> If you use gcallocate: then only the original is registered for
>>>>>> magical auto-deallocation at garbage collection...
>>>>>>
>>>>>> What you will have is more somthing like dangling pointer: continue
>>>>>> to use pointer xa2->a1 when a1 was already freed.
>>>>>>
>>>>>> FFI is great, it introduces the problem of C in Smalltalk, augmented
>>>>>> with the problems of wrapping C in Smalltalk.
>>>>>>
>>>>>>
>>>>>> 2017-11-06 4:23 GMT+01:00 Ben Coman <btc(a)openinworld.com>:
>>>>>>
>>>>>>> My current employment work hours and roster have severely curtailed
>>>>>>> the time I have hacking Pharo, so I've not dug enough to be sure of my
>>>>>>> observations a few months ago, and this is from memory, but I was starting
>>>>>>> to develop a suspicion about the uniqueness of ExternalAddress(s).
>>>>>>>
>>>>>>> A while ago, in order to fix some stability issues on Windows, a
>>>>>>> guard was added somewhere that slowed down some operations. Looking into
>>>>>>> this and experimenting with removing the guard I seem to remember VM
>>>>>>> crashes due to a double-free() of an address, due to there being two
>>>>>>> ExternalAddresses holding the same external address.
>>>>>>>
>>>>>>> My intuition is that that somewhere an ExternalAddress(a1) pointing
>>>>>>> at a particular external resource address "xa1" was being copied, so we end
>>>>>>> up with ExternalAddress(a2) also pointing at "xa1", with and object b1
>>>>>>> holding a1 and object b2 holding a2. During finalization of b1,
>>>>>>> ExternalAddress a1 free()d xa1, and a1 was flagged to avoid
>>>>>>> double-free()ing. But that didn't help when b2 was finalized, since a2 had
>>>>>>> no indication that xa1 had been free()d.
>>>>>>>
>>>>>>> That is...
>>>>>>> b1-->a1-->xa1
>>>>>>> b2 := b1 copy.
>>>>>>> b2-->a2-->xa1
>>>>>>> b1 finalize a1 --> free(xa1)
>>>>>>> b2 finalize a2 --> free(xa1) --> General Protection Fault
>>>>>>>
>>>>>>> It was hard to follow this through and I didn't succeed in tracking
>>>>>>> down where such a copy might have been made, but the idea simmering in my
>>>>>>> mind since then is to propose that...
>>>>>>>
>>>>>>> ExternalAddresses be unique in the image and behave like
>>>>>>> Symbols,
>>>>>>> such that trying to copy one returns the identical object.
>>>>>>>
>>>>>>> The idea being that when b2 is finalized, a1 would notice that xa1
>>>>>>> had already been free()d and raise a Smalltalk exception rather than a
>>>>>>> general protection fault.
>>>>>>> b1-->a1-->xa1
>>>>>>> b2 := b1 copy.
>>>>>>> b2-->a1-->xa1
>>>>>>> ^^
>>>>>>> b1 finalize a1 --> free(xa1)
>>>>>>> b2 finalize a1 --> Smalltalk exception
>>>>>>>
>>>>>>>
>>>>>>> I write now in response to Stef since I vaguely remember it being
>>>>>>> Freetype related. But I also remember the issue being FFI related and
>>>>>>> Freetype is a plugin not FFI. So I'm not sure my memory is clear and
>>>>>>> perhaps I have the "wrong end of the stick" but anyway, rather than hold
>>>>>>> back longer because of that, perhaps this can stimulate some discussion and
>>>>>>> at least I learn something to clarify my understanding here.
>>>>>>>
>>>>>>> cheers -ben
>>>>>>>
>>>>>>>
>>>>>>> On Sat, Oct 28, 2017 at 4:48 PM, Stephane Ducasse <
>>>>>>> stepharo.self(a)gmail.com> wrote:
>>>>>>> >
>>>>>>> > Hi all
>>>>>>> >
>>>>>>> > I'm and I guess many of you are fedup about the instability that
>>>>>>> the
>>>>>>> > FreeType plugin produces.
>>>>>>> >
>>>>>>> > So we need help because clement and esteban are fully booked.
>>>>>>> >
>>>>>>> > We have three options:
>>>>>>> >
>>>>>>> > - drop Freetype alltogether
>>>>>>> > - rewrite the plugin
>>>>>>> > - create a binding using raffaillac sketch
>>>>>>> >
>>>>>>> > Now we need help. Who is willing to help us?
>>>>>>> > Should we try to set up a bounty?
>>>>>>> >
>>>>>>> > Stef
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>
>>>
>>
>
Nov. 8, 2017
[Pharo 7.0-dev] Build #269: 20552-Breakpoints-stay-in-the-breakpoints-browser-even-after-their-method-is-recompiled
by ci-pharo-ci-jenkins2ï¼ inria.fr
There is a new Pharo build available!
The status of the build #269 was: SUCCESS.
The Pull Request #447 was integrated: "20552-Breakpoints-stay-in-the-breakpoints-browser-even-after-their-method-is-recompiled"
Pull request url: https://github.com/pharo-project/pharo/pull/447
Issue Url: https://pharo.fogbugz.com/f/cases/20552
Build Url: https://ci.inria.fr/pharo-ci-jenkins2/job/Test%20pending%20pull%20request%2…
Nov. 8, 2017
Re: [Pharo-dev] ExternalAddress uniqueness (was Re: Call for help for stability and rewrite of FreeType)
by Nicolas Cellier
2017-11-08 15:35 GMT+01:00 Nicolas Cellier <
nicolas.cellier.aka.nice(a)gmail.com>:
>
>
> 2017-11-08 14:53 GMT+01:00 Nicolas Cellier <nicolas.cellier.aka.nice@
> gmail.com>:
>
>>
>>
>> 2017-11-08 14:42 GMT+01:00 Nicolas Cellier <nicolas.cellier.aka.nice@gmai
>> l.com>:
>>
>>>
>>> Ben,
>>>
>>> This is my fresh crash.dmp
>>> it sounds very related to your analysis!!!
>>>
>>> In fact we are not freeing by ourselves, but telling libgit2 to do it...
>>>
>>>
>> Oh worse than that, it sounds like git implemented its own mechanism of
>> counted pointers...
>> So we don't tell anything, he guesses by himself.
>> I would search for places where we #gcallocate: or manually #free a
>> pointer on a structure passed back by git...
>>
>>
> and of course, it's not gcallocate: because this was a very old wheel...
> It's rather somewhere in UFFI equivalent
> FFIExternalResourceExecutor <- FFIExternalResourceManager <-
> LGitExternalStructure autoRelease
>
> Among the senders, we see (tiens, tiens...):
> LGitTree>>...
>
> So this is where I would search the origin of my own crash dump...
>
> But also (tiens, tiens...):
> CairoFontFace>>initializeWithFreetypeFace:
>
> What if FreeType plugin was not the problem per se, but its usage in cairo
> was?
>
> cairo_font_face_destroy ()
> void cairo_font_face_destroy (cairo_font_face_t
> *font_face);
> Decreases the reference count on font_face by one. If the result is zero, *then
> font_face and all associated resources are freed*. See
> cairo_font_face_reference().
> font_face :
> a cairo_font_face_t
>
> Since we pass a pointer to the free type font at creation:
>
> fromFreetypeFace: aFace
> | handle cairoFace |
> handle := aFace handle pointerAt: 1.
> cairoFace := self primFtFace: handle loadFlags: ( LoadNoHinting |
> LoadTargetLCD | LoadNoAutohint | LoadNoBitmap).
> ^ cairoFace initializeWithFreetypeFace: aFace
>
> Isn't it possible that we somehow double free the free type font too?
>
>
Hmm not the exact catch but it could well be related
https://www.cairographics.org/manual/cairo-FreeType-Fonts.html tells how to
couple lifetime of the 2 data structures.
I see that CairoFontFace retains a pointer on the FT_Face thru a dedicated
ivar, so at least, we don't free the FT_Face twice, and we don't free it
until we free the cairo_ft_face
When finalizatoin occurs, I'm not sure that the finalization order is
guaranteed but that does not matter.
What matters is that the cairo_ft_face could still be referenced internally
by cairo.
So what can happen is that:
1) we don't reference anymore the CairoFontFace from within Smalltalk
2) finalization happens we call cairo_font_face_destroy ()
3) there is no more pointer on the FTFace from within Smalltalk (because we
just reclaimed the CairoFontFace pointing on it)
4) finalization happens and we call FT_Done_Face()
BUT: cairo was still using the cairo_font_face internally, (the reference
count did not reach zero) and is now pointing on freed memory due to
FT_Done_Face()...
We should have tested the status before invoking FT_Done():
status = cairo_font_face_set_user_data (font_face, &key,
ft_face, (cairo_destroy_func_t) FT_Done_Face);
That means that we would have to performa that status test in the
finalization, and if not ready, keep a reference to both cairo_font_face
handle ft_face handle
But then there is no other mean than storing those reference in a safe
place and regularly poll for readiness
If my understanding is correct, this is absolutely garbage collector
unfriendly!
>
>>> Stack backtrace:
>>> [7791E43E] RtlInitializeGenericTable + 0x196 in ntdll.dll
>>> [7791E0A3] RtlGetCompressionWorkSpaceSize + 0x7e in ntdll.dll
>>> [751F98CD] free + 0x39 in msvcrt.dll
>>> [6CD60D43] git_tree_cache_write + 0x2ac in libgit2.dll
>>> [6CD62073] git_tree__free + 0x53 in libgit2.dll
>>> [6CD1A563] git_object__free + 0x52 in libgit2.dll
>>> [6CCD0D78] git_cached_obj_decref + 0x4c in libgit2.dll
>>> [6CD1A7D9] git_object_free + 0x17 in libgit2.dll
>>> [6CD1B0D3] git_tree_free + 0x11 in libgit2.dll
>>> [6CD0BE4F] git_iterator_for_nothing + 0x8aa in libgit2.dll
>>> [6CD0C053] git_iterator_for_nothing + 0xaae in libgit2.dll
>>> [6CCEADEF] git_diff_file_content__clear + 0x31d in libgit2.dll
>>> [6CCECC3F] git_diff__oid_for_entry + 0xc29 in libgit2.dll
>>> [6CCED2B2] git_diff__oid_for_entry + 0x129c in libgit2.dll
>>> [6CCED495] git_diff__from_iterators + 0x1db in libgit2.dll
>>> [6CCED6DE] git_diff_tree_to_tree + 0x1e3 in libgit2.dll
>>> [004DE7C8] ??? + 0xde7c8 in Pharo.exe
>>> [0044FE08] ??? + 0x4fe08 in Pharo.exe
>>> [004516A7] ??? + 0x516a7 in Pharo.exe
>>> [00446051] ??? + 0x46051 in Pharo.exe
>>> [0049936E] ??? + 0x9936e in Pharo.exe
>>>
>>>
>>> Smalltalk stack dump:
>>> 0xafa86c I LGitDiff>diff_tree_to_tree:repo:old_tree:new_tree:opts:
>>> 0xe585410: a(n) LGitDiff
>>> 0xafa8a4 M [] in LGitDiff>diffTree:toTree:options: 0xe585410: a(n)
>>> LGitDiff
>>> 0xafa8bc M LGitDiff(LGitExternalObject)>withReturnHandlerDo:
>>> 0xe585410: a(n) LGitDiff
>>> 0xafc678 I LGitDiff>diffTree:toTree:options: 0xe585410: a(n) LGitDiff
>>> 0xafc6a4 I LGitDiff>diffTree:toTree: 0xe585410: a(n) LGitDiff
>>> 0xafc6d0 I LGitTree>diffTo: 0xe583e00: a(n) LGitTree
>>> 0xafc6fc M [] in IceLibgitLocalRepository>changedFilesBetween:and:
>>> 0x1055afc0: a(n) IceLibgitLocalRepository
>>> 0xafc720 M [] in IceLibgitLocalRepository>withRepoDo: 0x1055afc0:
>>> a(n) IceLibgitLocalRepository
>>> 0xafc73c M [] in LGitGlobal class>runSequence: 0xfb96188: a(n)
>>> LGitGlobal class
>>> 0xafc760 M [] in LGitActionSequence(DynamicVariable)>value:during:
>>> 0x102109f8: a(n) LGitActionSequence
>>> 0xafc780 M BlockClosure>ensure: 0xe582890: a(n) BlockClosure
>>> 0xafc7ac I LGitActionSequence(DynamicVariable)>value:during:
>>> 0x102109f8: a(n) LGitActionSequence
>>> 0xafc7cc M LGitActionSequence class(DynamicVariable
>>> class)>value:during: 0xfbb81e0: a(n) LGitActionSequence class
>>> 0xafc7f4 I LGitGlobal class>runSequence: 0xfb96188: a(n) LGitGlobal
>>> class
>>> 0xafc818 I IceLibgitLocalRepository>withRepoDo: 0x1055afc0: a(n)
>>> IceLibgitLocalRepository
>>> 0xafc840 I IceLibgitLocalRepository>changedFilesBetween:and:
>>> 0x1055afc0: a(n) IceLibgitLocalRepository
>>> 0xafc874 I IceCommitInfo>changedPackagesToCommitInfo: 0x113b80e0:
>>> a(n) IceCommitInfo
>>> 0xafc898 I IceCommitInfo>changedPackagesTo: 0x113b80e0: a(n)
>>> IceCommitInfo
>>> 0xafc8c0 I IceDiff>initialElements 0xe4c48f8: a(n) IceDiff
>>> 0xaf9664 I IceDiff(IceAbstractDiff)>elements 0xe4c48f8: a(n) IceDiff
>>> 0xaf9684 I IceDiffChangeTreeBuilder>elements 0xe4b9c80: a(n)
>>> IceDiffChangeTreeBuilder
>>> 0xaf969c M [] in IceDiffChangeTreeBuilder>buildOn: 0xe4b9c80: a(n)
>>> IceDiffChangeTreeBuilder
>>>
>>> Dimitris:
>>>
>>> I won't argument, I've learnt C in 1987, so it gave me enough time to
>>> learn my own limits.
>>> Working with pointers is like carrying a gun without engaging the safety
>>> catch.
>>> I came to think that shooting own foot was a feature ;)
>>>
>>> 2017-11-06 11:04 GMT+01:00 Dimitris Chloupis <kilon.alios(a)gmail.com>:
>>>
>>>> Its the usual case of not being able to have your cake and eat it too.
>>>>
>>>> If you want top performance you have to manage memory yourself plus the
>>>> abilitiy to access thousands of C libraries is not such a bad excuse for a
>>>> compromise. The FFI is not a problem is a solution to many problems and
>>>> people using it its not as if Smalltalk offers them any alternative choice.
>>>>
>>>> Not to forget that Slang itself relies heavily on C, which is only the
>>>> core of the VM and the very core of the implementation.
>>>>
>>>> Understanding how to work with pointers in C is pretty much
>>>> understanding how to works with Objects in Smalltalk. Both are nuclear
>>>> weapons that those two languages are build around. If ones does not
>>>> understand their usage he will shoot his foot in the end.
>>>>
>>>> The important thing to remember is that C's goal is not the same as of
>>>> Smalltalk. Its not there to hold your hand and make coding easy for you. C
>>>> is there to offer low level access combined with top performance. It may
>>>> have started as a general purpose language decades ago when coding in
>>>> Assembly was still a pleasant experience. Nowdays C has completely replaced
>>>> Assembly as the top performance language for low level coding.
>>>>
>>>> C may appear as a problematic language to a Smalltalker but only
>>>> because he sees it from the Smalltalk point of view. The harsh reality of
>>>> the world is that as much as one may want to shoehorn it , not everything
>>>> can be elegantly mapped to a object. Smalltalk may be OO to the bone , but
>>>> the world we live in, cannot afford such simple structures to accomodate of
>>>> varied immense complexity.
>>>>
>>>> On the subject of pointers, the general rule of thumb is to keep things
>>>> as simple as possible and avoide trying to do weird "magic" with them.
>>>> There is a ton of things that C does under the hood to generate highly
>>>> optimised machine code that can fry the brain , as the usual case with low
>>>> level coding, so keeping it simple is the way to go.
>>>>
>>>> Oh and dont try to shoehorn the Live coding enviroment in debugging C
>>>> code, as much as one may want to brag of Smalltalk's elegant debugger, C
>>>> development tools are light years ahead in dealing with C problems.
>>>>
>>>> May advice to people is that if you do it via FFI first, you do it
>>>> wrong.
>>>>
>>>> Do it always first with C with a powerful C IDE like Visual Studio,
>>>> make sure your code works there and then use the UFFI. Will make life
>>>> thousand times easier. I learned that the hard way when I was playing
>>>> around with Pharo and shared memory.
>>>>
>>>> So yes having a FFI that does not help you avoid coding in C first, is
>>>> a big plus, not a minus. Sometimes it makes sense to live outside the
>>>> image, this is an excellent case to prove why that is a great idea. .
>>>>
>>>> On Mon, Nov 6, 2017 at 11:10 AM Nicolas Cellier <
>>>> nicolas.cellier.aka.nice(a)gmail.com> wrote:
>>>>
>>>>> Hi Ben,
>>>>> It's a super bad idea to copy an ExternalAddress.
>>>>> It's common knowledge in C++ copy operator & copy constructors...
>>>>>
>>>>> But it's not obvious to me that you'll have double freeing (unless you
>>>>> explicitely free the pointer by yourself).
>>>>> If you use gcallocate: then only the original is registered for
>>>>> magical auto-deallocation at garbage collection...
>>>>>
>>>>> What you will have is more somthing like dangling pointer: continue to
>>>>> use pointer xa2->a1 when a1 was already freed.
>>>>>
>>>>> FFI is great, it introduces the problem of C in Smalltalk, augmented
>>>>> with the problems of wrapping C in Smalltalk.
>>>>>
>>>>>
>>>>> 2017-11-06 4:23 GMT+01:00 Ben Coman <btc(a)openinworld.com>:
>>>>>
>>>>>> My current employment work hours and roster have severely curtailed
>>>>>> the time I have hacking Pharo, so I've not dug enough to be sure of my
>>>>>> observations a few months ago, and this is from memory, but I was starting
>>>>>> to develop a suspicion about the uniqueness of ExternalAddress(s).
>>>>>>
>>>>>> A while ago, in order to fix some stability issues on Windows, a
>>>>>> guard was added somewhere that slowed down some operations. Looking into
>>>>>> this and experimenting with removing the guard I seem to remember VM
>>>>>> crashes due to a double-free() of an address, due to there being two
>>>>>> ExternalAddresses holding the same external address.
>>>>>>
>>>>>> My intuition is that that somewhere an ExternalAddress(a1) pointing
>>>>>> at a particular external resource address "xa1" was being copied, so we end
>>>>>> up with ExternalAddress(a2) also pointing at "xa1", with and object b1
>>>>>> holding a1 and object b2 holding a2. During finalization of b1,
>>>>>> ExternalAddress a1 free()d xa1, and a1 was flagged to avoid
>>>>>> double-free()ing. But that didn't help when b2 was finalized, since a2 had
>>>>>> no indication that xa1 had been free()d.
>>>>>>
>>>>>> That is...
>>>>>> b1-->a1-->xa1
>>>>>> b2 := b1 copy.
>>>>>> b2-->a2-->xa1
>>>>>> b1 finalize a1 --> free(xa1)
>>>>>> b2 finalize a2 --> free(xa1) --> General Protection Fault
>>>>>>
>>>>>> It was hard to follow this through and I didn't succeed in tracking
>>>>>> down where such a copy might have been made, but the idea simmering in my
>>>>>> mind since then is to propose that...
>>>>>>
>>>>>> ExternalAddresses be unique in the image and behave like Symbols,
>>>>>> such that trying to copy one returns the identical object.
>>>>>>
>>>>>> The idea being that when b2 is finalized, a1 would notice that xa1
>>>>>> had already been free()d and raise a Smalltalk exception rather than a
>>>>>> general protection fault.
>>>>>> b1-->a1-->xa1
>>>>>> b2 := b1 copy.
>>>>>> b2-->a1-->xa1
>>>>>> ^^
>>>>>> b1 finalize a1 --> free(xa1)
>>>>>> b2 finalize a1 --> Smalltalk exception
>>>>>>
>>>>>>
>>>>>> I write now in response to Stef since I vaguely remember it being
>>>>>> Freetype related. But I also remember the issue being FFI related and
>>>>>> Freetype is a plugin not FFI. So I'm not sure my memory is clear and
>>>>>> perhaps I have the "wrong end of the stick" but anyway, rather than hold
>>>>>> back longer because of that, perhaps this can stimulate some discussion and
>>>>>> at least I learn something to clarify my understanding here.
>>>>>>
>>>>>> cheers -ben
>>>>>>
>>>>>>
>>>>>> On Sat, Oct 28, 2017 at 4:48 PM, Stephane Ducasse <
>>>>>> stepharo.self(a)gmail.com> wrote:
>>>>>> >
>>>>>> > Hi all
>>>>>> >
>>>>>> > I'm and I guess many of you are fedup about the instability that the
>>>>>> > FreeType plugin produces.
>>>>>> >
>>>>>> > So we need help because clement and esteban are fully booked.
>>>>>> >
>>>>>> > We have three options:
>>>>>> >
>>>>>> > - drop Freetype alltogether
>>>>>> > - rewrite the plugin
>>>>>> > - create a binding using raffaillac sketch
>>>>>> >
>>>>>> > Now we need help. Who is willing to help us?
>>>>>> > Should we try to set up a bounty?
>>>>>> >
>>>>>> > Stef
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>
>>
>
Nov. 8, 2017
Re: [Pharo-dev] [IMPORTANT] Is there a bug in Tonel with category:
by Dale Henrichs
Poster child for the porting pain[1] of symbols and strings - from this
morning:)
The dictionary was created using symbols as the keys, but the code that
I had to change used mixed symbols and strings as keys ... and of course
I was left wondering why the class vars weren't being defined properly ...
Dale
[1]
https://github.com/GsDevKit/tonel/commit/b00565685586630452a9de3d4f90f16571…
On 11/6/17 11:15 AM, Dale Henrichs wrote:
>
>
> On 11/06/2017 08:23 AM, Sven Van Caekenberghe wrote:
>>
>>> On 6 Nov 2017, at 17:13, Dale Henrichs
>>> <dale.henrichs(a)gemtalksystems.com> wrote:
>>>
>>>
>>>
>>> On 11/6/17 7:07 AM, Sven Van Caekenberghe wrote:
>>>>> On 6 Nov 2017, at 15:43, Dale Henrichs
>>>>> <dale.henrichs(a)gemtalksystems.com> wrote:
>>>>>
>>>>> of course with Pharo's implementation of Symbol it is not
>>>>> practical to use asString nor type checks - things that are not
>>>>> necessary in other Smalltalk implementations
>>>> How so ?
>>>>
>>>> What is the problem with Symbol>>#asString ?
>>> I am not going to go to every field in the api that is supposed to
>>> be a String and add asString. There are too many places to worry
>>> about ... I would prefer that Pharo be ANSI compliant:)
>>>
>>> It's not just Metacello.
>>>
>>> It's an annoying issue that has to be dealt with every time a Pharo
>>> application is ported to another dialect of Smalltalk and an
>>> annoying barrier for folks running on other dialects to move their
>>> application to Pharo - in this case the bugs that are introduced by
>>> Pharo's behavior with respect to Symbols can be very hard to
>>> diagnose --
>>>
>>> Making things harder to share code between dialects is a bad thing
>>> for Smalltalk overall -- just another reason for non-Smalltalk
>>> programmers to question the whether they should use Smalltalk or not...
>>>
>>> And I don't need to hear about how Pharo is not Smalltalk:)
>>>
>>> Dale
>> So there is nothing 'wrong', you just want Pharo to remain the same
>> as every other non-changing Smalltalk out there.
> Did I say that?
>
> I support the direction that Pharo is going, but I reserve the right
> to disagree with some of the details.
>
> This is just one detail ... nothing more nothing less ... For those of
> us that work in multiple dialects, it IS annoying and I take an
> opportunity every year or so to remind you guys of the things that I
> find annoying, just to keep you guys honest:)
>
>>
>>  From one perspective you are right, it makes some cross platform
>> porting in either direction harder. Seaside has many rules to help
>> portability. Not mixing Strings and Symbol is probably one of them.
> ... and as I mentioned, this problem can be one of the more annoying
> issues to track down, when a developer is not careful ... Honestly
> there are two sides to the issue ... when developers use Symbols in
> tests to drive an API that is supposed to use Strings (this happens
> the most often) things break pretty quickly and the tests can be fixed
> pretty easily ... but when the code itself is written with mixed
> Symbols and Strings, the tests might actually pass after the port, and
> the bugs will only show up in subtle cases ... I've hit a handful of
> these over the years and they are hard to track down...
>>
>> But you know very well that Pharo was started so that we would be
>> able to make changes, in any area or aspect of the system, without
>> the burden of backwards or cross platform compatibility, even if some
>> of these changes are taste based.
> Agree with your statement -- most of the changes that Pharo has made
> have not been difficult to accommodate, but Symbol/String is at a
> fundamental level and I'm not sure that it would be "illegal" to make
> this accommodation --- I AM pretty certain that it would cause some
> short term pain, but probably no more pain (and likely less pain) than
> is caused by trying to move an application to a new version of Pharo:)
>> And I happen to like the ability to mix and match Strings and Symbols
>> (we discussed about this before).
>>
> I won't argue with taste, it's is simply the portability for this
> particular problem that I am highlighting ...
>
> Dale
Nov. 8, 2017