The Alchemist Guild’s Blog

Mac Software Development and Pascal

Browsing Posts in PascalGladiator

PascalGladiator is long overdue for a release to fix bugs and add iPhone device targets but has been delayed many months now. This is primarily because some heavy development I made to my DataBrowser class (for Warehouse) which broke many areas of PascalGladiator that are difficult to repair. In addition to that were upgrades to TObject (for TaskCard and Warehouse) which added some improvements like  modern reference counted memory, object archiving/unarchiving and some Cocoa-like dynamic method/instance variable accessing features that all need to be implemented into PascalGladiator. I should have kept the old code for compatibility with PascalGladiator because now I can’t get the project to compile! Once the overhaul is complete PascalGladiator will more robust, stable and probably be promoted to version 1.0 after all this time.

Pretty annoying and I’m not motivated to fix it but there’s too many crashes and bad memory use in PascalGladiator that must be addressed, not to mention iPhone support. I made some scripts for iPhone support already but until they’re implemented into the IDE they’re painful to use from the command line.

This releases is mainly about optimizations and highly recommended. Scrolling/selecting speeds will see a noticeable difference on larger files and a bug causing the program to get slower and slower as it ran was been fixed. I don’t know why but the POSIX regex library (from GNU) was getting “stuffed” when releasing memory probably in some caching scheme, but I don’t know if I caused this or it’s a bug. The result was files taking from 2 seconds to parse to 10 depending on how long the program was running. Instead of fighting with it I replaced all regular expressions to the PCRE library which I believe is wider supported and performance better than POSIX.

As a small bonus there is now support for Objective-C dialect which was recently introduced in FPC. Objcclass/objcprotocol/objccategory (doesn’t exist yet in FPC though) are support as well as “class” methods which are used instead of constructors. Get the latest build of FPC and enjoy!

Objective-P

No comments

Seemingly out of now where FPC now supports an impressively complete Objective-C dialect (Objective-P may we call it?) making PasCocoaKit obsolete. However, the PHP parser script used for PasCocoaKit has been used for the new headers with little modification so it wasn’t all a waste. It hasn’t even been 1 year since I developed PasCocoaKit and users were talking about a native FPC dialect so I consider this to have happened very fast and I’m quite surprised.

In coming versions of PascalGladiator I will support the new dialect in the syntax parser and start to package example programs with distribution, a feature only made possible as of 0.7 with it’s improved projects.

As far as I’m aware the key missing features are properties (from Objective-C 2.0) and Categories. At some points excessive type casting must be used to override Pascal’s strong typing conventions but this will be fixed in the future I would hope. Otherwise my tests show that the latest version is practically ready for full time development.

Very special thanks for Jonas and Dmitry for their work on the compiler and promptly fixing bugs in the first 2 weeks of release. Everyone is urged to download the latest version of FPC and test these new features so they can be made stronger.

This is the long awaited released which replaces the text editor WASTE with NSTextView using PasCocoaKit and HICocoaView API. Not only is the text editor greatly improved (especially in the performance area) but it features many other enhancements you will enjoy. All of my old code has been ported to Object-Pascal and custom HIView’s and the DataBrowser were also updated producing better results in general.

In the 8 months since releasing 0.4 there was a considerable amount of time spent developing PasCocoaKit then replace the WASTE text editor which used all throughout the program making it extremely difficult to part ways with. The end result is quite excellent though thanks to the intelligent design of NSTextView compared to WASTE. I’m very happy to say after years of very poor WASTE performance I’m rid of that thing and can start making a truly powerful editor core. Sadly however I removed code folding as it was too complicated to replace for this release but it will be ported to the new NSTextView system eventually.

As of this version PascalGladiator is becoming quite a useful tool indeed but my big regret still is that the debugger is not working 100%. Included in 0.7 are some enhancements such as a HUD display which displays symbols in the editor but other features are broken. I would have hoped more than 1 year after the initial release this feature would be working but it never got enough attention in face of these massive efforts, first code folding (big mistake, and now it’s even missing!) and now the text editor. It’s again on top of the priority list after fixing memory leaks and general stability.

This is the biggest update since the initial release, so here is the list of changes.

  • PascalGladiator is now 10.5 and higher only. I’m very sorry about this but the new HICocoaView API which was absolutely required only exists in 10.5.
  • FINALLY! NSTextView for the text editor core. WASTE is banished to the pit once and for all.
  • Code folding is not yet implemented into NSTextView (yet) so it’s pulled
  • All DataBrowsers and custom HIViews are re-written in Object Pascal and moved out of static libraries.
  • Projects now archive their data into property lists and are much safer, plus you can edit them by hand in the project bundle.
  • New logo and application icon.
  • Single file editor for editing files without projects.
  • Directory browser for navigation folders without projects (drag folders on the application icon).
  • Search PasCocoaKit reference in library.
  • Class browser is removed (for now) and replaced with light-weight class list in the project browser.
  • Resource group now automatically finds NIB’s in your project.
  • Disk browser mode in project (the real directory structure as it exists on the hard disk).
  • Edit RTF files and use the Cocoa font panel.
  • Sweet PascalGladiator logo in the empty tab view pane.
  • Find/replace can now search any text field (i.e. console/reference).
  • If you build an application you can browse memory leaks (using “leaks”) by showing the memory leaks window in the debug menu. If you enable “MallocLeaks” in the preferences you get a stack trace for each leak.
  • The debugging has a HUD mode which sits above the tabs like in Xcode. You can still however using the main debugger window.
  • While debugging, symbols that have values are hilited in source and when clicked show their value in a contextual help tag.
  • Syntax is compiled in the background when files are saved and re-styled in any open documents.
  • Cocoa exceptions can be debugged for PasCocoa projects.
  • The editor has an XML mode for editing .plists.
  • Builds can be stopped now using the button in the console.
  • You can turn off anti-aliasing in the preferences window.
  • Recent items are now ordered properly and organized by group: document, folder and project.
  • Smart folders in the projects.
  • New batch find which lets you search by folder also.
  • Cocoa spelling is enabled and will only search comments or strings, not actual code.
  • By turning on CFLog in the debugger preferences warnings issued from CFLog will stop execution.
  • Backups! Set backup preferences then restore by selecting the version in the Editor menu or editor’s action menu in the lower toolbar. Special thank you to Richard Ward for suggesting this and giving a simple implementation idea.
  • Symbol browsers remember their selection/scroll position in between changing documents.
  • Compile files item in the project menu that lets you select interfaces which contain symbols you would like to appear in the project.
  • 10.4/10.5 have different debugger options (-g or -gw2 -Xg) when compiling.
  • Syntax themes are working again after being broken in 0.4.
  • Font and background color are enabled in syntax style preferences, don’t have too much fun!
  • The symbol menu now contains section headers for better readability.
  • Typing helpers are re-worked and now are editable using /PascalGladiator.app/Contents/Resources/Code Sense/typing helpers.plist and regular expressions
  • User notes. lines starting with @@ written to STDOUT (using writeln for example) will appear in the error console.
  • Open quickly window in the project menu which lets you open any file in the project by file name.
  • When browsing folders you can search their contents by file in the Edit > Find > Find in … menu.
  • Project backups! PascalGladiator now uses the “rsync” utility to backup and restore projects.
  • Debug in Terminal option in the Project menu. This will execute the gdb command PascalGladiator debugger uses into Terminal.app for manually debugging. This is a meant to be a “crutch” short-term solution while the graphical debugger is under development and not always working properly.
  • Target paths can be selected using navigation services and auto-resolve to their relative position.
  • You can kill the target application while running with the “kill” button in the console window.
  • New projects templates are more complete and improved.
  • Text editor improvements:
    • Macros can be assigned command-keys
    • Macros in edit menu
    • New code completion (native NSTextView feature)
    • Context sensitive spelling checking (only strings/comments are searched)
    • Regular expressions in find/replace.
    • All new Cocoa style find/replace.
    • Spelling suggestions in the contextual menu.
    • Macros can accept document text as input, offset of the cursor and text length
    • New “select” sub menu in edit menu.
    • Shifting text is improved.
    • Unlimited split views.
    • Bookmarks in the gutter.
    • Shows invisible characters.

The key features of PascalGladiator have not been documented beyond a simple mention in a list, until now!

Reference Library.

Reference LibraryThis may be my favorite feature in PascalGladiator because of the hours it saves me switching to Safari to view the Apple reference library online or digging around the interfaces. Simply by contextual clicking on a selected word (and choosing “Look up … in reference”) it will query all the Carbon interfaces for functions of type definitions that match the string and show you a preview of where it exists. This is extremely useful for checking function parameters and record fields etc…

Eventually I would like this feature to resemble Xcode’s with actual HTML pages from the Apple reference as well, but that is for later. For now the system is fast and does exactly what you need.

Contextual Menu.

Contextual Menu

This was nearly the entire reason I decided to make PascalGladiator instead of using Xcode - the ability to navigate symbols by contextual clicking. I’m also proud to say contextual symbol navigation is better than Xcode!

First is basic navigation, by clicking on a symbol and choosing “Go to … in myfile.pas” you jump to that symbol. If there are multiple symbols with the same name they will all be displayed.

Second, if the symbol you select in an object or class an additional item “Go to object members of …” which lets you jump to any methods of the class. Also, the item “Go to class hierarchy for …” which lets you jump to any of the super-classes of the selected class. 

Targets.

targetsPascalGladiator lets you choose an unlimited number of targets for each project. Currently supported are Applications (bundles with nibs) and Dynamic Libraries. I was working on framework and static libraries but the work was not completed after having linker/FPC problems. I will come back to this.

Targets let you specify search paths for source files, libraries and frameworks, change FPC compiler settings and specify basics like output and input locations. 

To create a new project use the action menu in the toolbar below the project browser.

Go to Symbol.

goto-symbolI got this idea from TextMate after seeing how useful it was and my own problem of always performing searches to find symbol definitions in a file. This is certainly faster and brings you exactly to the right location instead of jumping around searching.

Command-shift-T and you’re there.

 

 

Class Browser.

classbrowserThis feature needs some work but is still good for reference, but not so much navigation like was intended. Basically you get a list of all the classes in the project and upon selecting one you see the sub-classes and methods, along with a source line and file location. Good for overviewing the project and looking at method parameters.

This feature will see improvement in versions to come.

Both WebScripter and PascalGladiator’s editor share the same macro system but it has not been documented in PascalGladiator. The following explanation is modified from the WebScripter manual and please note there is no graphical editor in PascalGladiator. You can however edit the .plist manually (no problem since you’re a Mac programmer) in PascalGladiator.app/Contents/CodeSense/Pascal.macros.plist.

Topics

  • 5.0 Using Macros
  • 5.1 Using The Contextual Menu
  • 5.2 Macro Editor
  • 5.3 Macro Syntax
  • 5.4 Variables
  • 5.5 UNIX Shell Macros
  • 5.6 Output Methods

5.0 Using Macros

To invoke macros from the editor (using the contextual menu is also possible) type the macros command enclosed by [ and ] brackets (they are auto-paired by default so this is 1 key motion) and press the Tab key. Depending on the macros output method the results will be inserted into the document or otherwise.

The PHP macro shown below (with the command name func) will insert an empty function into the document and move the cursor to the proper location.

[func]

Parameters

Optionally macros support parameters which give the macro additional information and make them dynamic. Parameters are placed within ( and ) characters and separated with commas “,”. As explained in the section Macro Syntax parameters are defined as $1, $2, $3 etc… respectively. Not all macros support parameters so you should inspect the macros you intend to use in the editor window before using them. Also note that by holding the cursor over a macro in the menu and it’s syntax will be shown in a floating help window.

The example shown below expands upon the previous PHP macro but with parameters. The first parameter DoSomething is used for the functions name.

[func(DoSomething)]

 

Below is the macro definition for the previous 2 examples. More information on the syntax can be found here.

function $1 ([$2]) {
        $CURSOR
}

 

Pipes

It is possible to override the output method of a macro by using pipes (named after the UNIX feature). To use pipes insert the > character after the full command.

Consider the example below that prints the output of the link macro to the console instead of the default location.

[link(www.web-scripter.com) > console]

5.1 Using The Contextual Menu

Macros can be inserted into the open document by using the contextual menu. When using the contextual menu it will take the current selection from the document and pass it to the macro as the first parameter ($1). This has the effect of wrapping the selection with the macro (providing the macro contains the $1 parameter).

5.2 Macro Editor

No graphical macro editor in PascalGladiator for now, sorry!

5.3 Macro Syntax

Macros follow a simple syntax that is easy to learn so you can start writing macros right away.

Macros have the following syntax concepts:

  • Parameters.
  • Empty Parameter.
  • Default Values.
  • Optional Parameters.
  • Interpolated Shell Code.
  • Positioning the cursor.
  • Built-in Variables.

Parameters

Parameters allow the user to send data into the macro while typing and really are what makes macros a powerful feature. Parameters take the form of the $ character followed by a number representing the index of the parameter.

      The Macro: <a href="$1">
      Typed: [link(www.apple.com)]
      Becomes: <a href="www.apple.com">

Optional Parameters

Text wrapped in [ and ] brackets (a parameter must be within the brackets also) are optional on condition that the parameter inside the brackets is not empty. This feature is useful if you want your macro to omit certain information if the user has not specified a parameter.

For example take the link macro below (for printing an HTML link) which will omit the name attribute if the second ($2) parameter is not present.

      The Macro: <a href="$1" [name="$2"]>
      Typed: [link(www.apple.com)]
      Becomes: <a href="www.apple.com">

Interpolated Shell Code

You can include shell code (explained here) into macros which execute the command like from the shell. To interpolate shell code into macros place the code inside back ticks (`).

For example this trivial macro which uses the UNIX command whoami which prints the name of the logged in user.

      The Macro: Hello world, this is `whoami`.
      Becomes: Hello world, this is macuser.

Empty Parameters

Some times you might be using a macro that contains multiple parameters and would like to use the second parameter but not the first. To tell the parser to ignore the parameter you can insert the ^ character instead of a value.

As an example we will expand on the macro shown in Optional Parameters. Note that if the empty parameter was not used the second would become the first and you would not get the results you were expecting.

[link(^,Apple.com)]

Default Values

If you leave a parameter for a macro blank a default value can be inserted instead. Default values are within { and } curly brackets and must follow directly after the parameter.

In the following example if the first parameter ($1) was omitted the text “www.domain.com” would be inserted instead.

<a href="$1{www.domain.com}" [name="$2"]>

Positioning the cursor.

If the macros output method is default then you can specify where the cursor is to be set in the document by using the $CURSOR variable.

Built-in Variables

There are a number of built-in variables that provide dynamic information which are mainly used for shell macros. Built-in variables follow the same syntax as parameters and are prefixed by the $ character.

Currently the supported variables are:

  • $FILE. The name of the current document.
  • $PATH. The absolute path of the current document.
  • $SUPPORT. The absolute path of the SharedSupport folder in the application package.

5.4 Variables

In the macro editor you can add variables which are global to all macros. Variables are useful for including dynamic values which could affect multiple macros.

To add new variables:

  • Click the popup button with the gear icon in the macro editor.
  • Select Add Variable from the menu.

 

For the following example assume you have created a variable named SERVER with the value “web-scripter.com” and defined the fictional macro connect which opens a FTP connection. Note that you should not include the dollar sign ($) before the variable name.

      The Macro: ftp_connect("$SERVER", "$1", "$2");
      Typed: [conn(user,****)]
      Becomes: ftp_connect("web-scripter.com", "user", "****");

 

Using the variable $SERVER will now insert the proper value into all macros.

5.5 UNIX Shell Macros

WebScripter allows you to script macro functionality by executing the text like a command from the shell. Using shell macros is the gateway to UNIX and will allow you to add dynamic functionality to WebScripter.

To use shell macros set the action in the macro editor to Shell and the text will be treated like that typed at the command line.

As an example take the following simple UNIX command which will take the path of the document and sort it’s contents. To make the command useful you would set the output method to replace which would override the document with the results from the command.

cat < $PATH | sort

 

The HTMLTidy integration in WebScripter is implemented as a shell macro. Here’s how the command looks:

$SUPPORT/tidy -i -q -wrap 0 -mac "$PATH"

 

Using the $SUPPORT variable it finds the tidy program in the application package, sets some options then passes the documents path in. Because the output method is replace the output overwrites the current document.

5.6 Output Methods

When editing macros you can choose from a list of output methods which control how the results from the macro are displayed.

  • Default. Output is written to the open document at the cursor offset or replacing the current the selection.
  • Popup. Output is displayed in a floating help window.
  • URL. If the output is a valid URL it is opened in the default web browser.
  • Replace. Output replaces the contents of the document.
  • Console. Output will open in a built-in terminal split view.
  • Error List. Output is displayed in list form from a built-in split view. Note that output must be formatted properly.

Formatting Error Lists

There is not error list feature is PascalGladiator.

The latest release 0.4 introduced some nasty bugs with all the changes that were made porting all the code to FPC and the code folding which really did a number on the syntax parser/text editor.  I didn’t really want to release this version but I felt if I didn’t you wouldn’t get a native Intel version that could run on 10.5 for many more months. Sorry guys!

Outstanding bugs since 0.4:

  • Sometimes files open with garble. Don’t save! Just close the file and open it again. There is a problem with WASTE and loading files in a thread.
  • Opening files while debugging crashes.
  • The debugger still causes some leaking in the regex library which causes the application to parse files very slow after the debugger has been run. The only cure is to quit the debugging sessions.
  • Breaks points are not synched properly after multiple debugging sessions. Quit the application and try again.
  • In 0.4b Compile Syntax is crashing. Just open the files and they will be compiled and saved as you go along.

With the release of 0.4 and what seems to be more bugs than fixes I have hit a cross roads. The text editor API I have been using for years instead of MLTE has proven to be obsolete and no longer suitable for development. The developer has more or less abandoned the project and there is an absolutely crippling speed bug which you have no doubt noticed. The single bug along with the terrible speeds when applying/retrieving attributes to text has cost be countless hours in the hundreds working around this and still the end result is typing in files larger than 1200+ lines is dog-slow.

The final nail in the coffin when code folding which put strain on the already fragile system and basically wrecked the editor. Even if I remove it all the hacks I made in my WASTE HIView have tampered with some basics like syntax coloring copy/pasting and the bugs are there to stay. Worst of all problems is that hidden objects had to be inserted into the text which MURDERED the editing process and was hacked to pieces to even work. I should have never implemented code folding if that was the only option.

I’m trying to release commerical grade development tools which have a text editor at the core and my system is totally broken and hundreds of hours have been poured into this obsolete technology. Depressing…

Unless I change now, I’m doomed. MLTE is just to primitive to handle what a good editor needs. Is that really all the Mac has to offer Carbon programmers? But there is one option…

With the release of 10.5 there is an HICocoaView API which allows the wrapping of a NSView into a Carbon application. I thought this was cool at first, but overlooked until my current crisis. NSTextView is a great API which is FAST and offers a great system for applying/retrieving custom attributes to text. I never considered it because it was Cocoa and thus I could not use it. My HIView WebKit view wrapper I use is based on Objective-C code that I slapped together (barely) and uses Carbon events, which works well enough. This is the only HIView based API that Apple bothered to bridge for Carbon. Shame…

I’m sorry to say the next version of PascalGladiator will not be anytime soon because I am committed to removing WASTE from my code once and for all and using HITextView, which I will be authoring using PasCocoa, all native. Also get prepared for PascalGladiator to be 10.5+ no exceptions. Code folding will need a serious overhaul which I may just omit for since I’m so sick of it. I wish the only Intel native version was more stable, next time!

The long awaited release which is Intel 10.5 compatible (requires it actually) and re-written in FPC, even compiling itself! Lots of new featuers including: code folding, typing helpers, go to symbol and smoother file loading but new crashes and bugs were introduced also due to some serious work in the editor/syntax parser and MWP -> FPC port.
I’m sorry to say at this point that this is still beta software and much under development, which means bugs and crashing. I made the terrible decision to include code folding in this release (I did this so I could test the feature for WebScripter) but it consumed a HUGE amount of time and complicated dozens of other already complicated parts of the program. In short: not worth it. The debugger is still in the same semi-functional state and I had no time to work on this area.
The next release will feature just bug/crash fixes and focus on the debugger once and for all.
Version 0.4 running on 10.5

Version 0.4 running on 10.5

Changes:
  • Code folding has been implemented into WebScripter and a language definition to work with PascalGladiator. This is a great way to get around the inherent speed bug in the text engine WASTE by closing functions you don’t need to look at.
    • Code folding is column-sensitive. That means the column in the line where the range opens, must match the closing line. The result of this is you may find your code is not folding property because the columns are not aligned and you will have to “doctor” some lines.
  • 2 new preference options to disable code folding or ignore drawing the level bars in the gutter (like Xcode).
  • Auto-pairing now respects context so commas etc… won’t be paired when typing within comments for example.
  • Because code folding introduced a few too many menu items there is now a VIEW menu freeing up the editor menu.
  • The debugger is in black and white now which helps to correct the speed problem a little.
  • The console now always keeps scrolled to the bottom (when focused).
  • There is a new UNIVERSAL compiler target in the target preferences which compiles a PPC and Intel binary, then combines them into a universal binary. Also note the universal SDK field where you can specify the SDK to link against.
  • Documents do an accurate job of remembering the selection and scrollbar position of the last saved state.
  • File info window now returns more information. 1) line count. 2) The binary type for executables (PPC, Intel or Universal) 3) The file type and 4) for libraries and frameworks a list of symbols is show (using ‘nm’ utility), but is just in text form without a way to filter results (for now).
  • If you try to build while the target application is running it will bring the application to the front.
  • Errors can be selected from the list now even if the file is not in the project but can be located by paths and related projects.
  • The file list when contextual clicking on a related project is now in alphabetical order.
  • Files now load smoothly without hanging periodically. However the styles don’t appear in sections so the file is black until loaded 100%. This is because incremental applying of styles KILLS WASTE performance.
  • There is a “Go to Symbol” command in the editor menu (command-shift-T) which lets you quickly jump to any symbol in the project instead of scrolling through long menus. After using the find function to navigate functions in large files I decided this would be better.
  • There is an application preference to set the MallocDebug library in GDB (set env DYLD_INSERT_LIBRARIES /usr/lib/libMallocDebug.A.dylib). Read the MallocDebug manual to learn about this useful tool for debugging dangerous memory scenarios.
  • Code completion is not much faster which you will notice on projects with over 2000 symbols.
  • A new simple, very useful command “Go to Cursor” in the edit menu which will bring the cursor into view if you scrolled away from it. For example, if you scroll to the top of the document to examine some record fields you hit command-option-* and go right back to where you were typing.
  • New [obj] macro which creates an empty object declaration.
  • New [conc] macro which creates”+$CURSOR+”++”. Don’t forgot the use macros, they’re cool!
  • Added new Pascal typing helpers (enable/disabled in preferences) which will auto-complete blocks like begin/end, record/end and auto-ident blocks such as: type, then, var, uses. Pretty handy or annoying, you decide.

This update focuses mainly on changes to the debugger but there are other useful updates to the editor also. However there is still a nasty bug I haven’t been able to track which causes the application to run slowly after using the debugger. I’m sorry to say the debugger STILL isn’t fully functional yet but it does work for short sessions, which after you can just quit the app (it restarts quick). I think the next version will have the debugger working correctly.

Changes:

  • You can navigate errors in the console by using command keys (in the editor menu).
  • The first error in the console is auto-selected after a build.
  • You can set a label to files (like in the Finder) in the source browser by using file info. The coloring scheme is not very good yet however.
  • Document cursor selections are remembered.
  • The text in the find window is always selected when the window is opened (via command)
  • Creating new empty files inserts a default unit template. This file can be changed at: Contents/Resources/Templates/newfile.txt
  • $INCLUDE compiler directives are shown in the symbol browser.
  • Records and class symbols are closed in the symbol browser by default to avoid clutter.
  • Dragging a file from the project browser into text will insert a {$INCLUDE } compiler directive with the files name.
  • There is a function menu in the debugger editor. However, you can still only navigate within the file being debugged.
  • Stack frames without valid locations (from library code without source files for example) are not selectable in the stack frame browser and colored grey.
  • Common value types (i.e. strings, boolean, numbers, sets etc…) are colored in the debugger.
  • File info window (thus far is basically empty) by contextual clicking on a file in the browser. This is also how you can rename folders.
  • Function arguments longer than 255 characters are now handled correctly in the debugger.
  • Compiling syntax now updates the open documents text. Additionally, in the editor menu you can compile only the open editors syntax.
  • Killing the debugger session actually kills the program running.
  • Break points are 90% but still some quirks here and there.
  • Clearing all break points command in the project menu works. It also clears break points from all related projects!
  • Global symbols from the current file are shown in the debugger. This needs more testing as of now.
  • The SELF symbol is shown in the debugger.
  • Deeply nested pointers print values. However, fields from super-classes will not print yet citing a syntax error.
  • Mangled FPC symbol names (like TTABS_CREATE_$__APPEND) are cleaned up in the debuggers stack browser and readable.
  • Debugger always scrolls the execution stopped line into view.
  • Outstanding debugger issues with speed and long symbol values have been fixed.
  • There is a Add Frameworks item in the project menu that opens a choose dialog to the system frameworks folder.