Skip to content

Constructors and initializers, BigNumberLib 1.0.4.0, BETA 1010 screenshots, and examples.bat in one IDE per lane - #247

Merged
KubaO merged 29 commits into
twinbasic:mainfrom
KubaO:staging
Oct 20, 2026
Merged

KubaO merged 29 commits into
twinbasic:mainfrom
KubaO:staging

Conversation

@KubaO

@KubaO KubaO commented Oct 20, 2026

Copy link
Copy Markdown
Collaborator

Adds the constructor and initializer pages, moves BigNumberLib back to Contributed on 1.0.4.0, retakes the IDE screenshots on BETA 1010, and makes examples.bat reuse one IDE per lane.

  • Constructors and initializers: Classes-and-Modules compares Class_Initialize and Sub New, says where each comes from and when to use each. Inheritance gains Constructors in Derived Classes (which base constructor runs, Base.New first and on every path, chaining through every level, Class_Terminate order, COM creation). Inline-Initialization says what an initializer can call and read. Samples are check_run; behaviour probed on BETA 1010, with COM creation through a compiled ActiveX DLL from VBScript.
  • BigNumberLib 1.0.4.0: fixes the four defects that made it Experimental, so it is back under Contributed Packages and in the book. 17 new overflow test cases; WIP.BigNumberLib.md records an unconfirmed AssignDivision defect near the library's capacity.
  • IDE screenshots: 209 pictures retaken on BETA 1010, both themes, with SVGs. The IDE Building chapter's 14 pictures come from six new shoot_docs setups. shoot_docs captures until two captures agree or one equals the file, so a rerun leaves every picture unchanged.
  • String: an unassigned fixed-length string holds Chr(0), not spaces (reported by launcher-re 21).
  • Defects queued (3, BETA 1010):
    • A 64-bit build converts a negative zero to "-0" in CStr, Str$, Format$, & and Debug.Print; a 32-bit build and VB6 give "0". Reproducer with eleven test cases and a VB6 side, WARNING on CStr, Str and Format.
    • A class field initializer that reads another field of its class compiles, then fails the build with a codegen error.
    • A module-level initializer that reads another module's variable leaves every module-level variable at 0 in an IDE run; the exe is right.
  • Harness: examples.bat opens project after project in one IDE per lane (about 2 s a switch; --fresh for one per project), and a batch that meets its limit is a finding, not the end of the run. waitForCompile ends at the 300 ms quiet instead of the 1 Hz tail (0.94 s median), also for a project whose embedded package has errors; break-into's restart wait drops from 6.05 s to 1.1 s. A --keep run's folder survives the next sweep.
  • WinReg: its 21 samples are no longer marked check_build, since under four lanes its template's compile outruns the 10 s limit.
  • impexp and tbbroker: modules renamed and split (Program.twin, JsonMember, Broker*, BrokerHost) so tblaunch can compile the rest under its own Sub Main. Impexp.PackTree packs the tree an ImpexpSource gives; import of the VB package takes 72 ms, from 146 ms, with the same bytes. impexp.py sorts names by UTF-16 code unit and matches Packages in ASCII case only, as the other two editions do, and the parity check gains the two commands that catch each.

KubaO added 29 commits October 20, 2026 21:37
…he sample prints its code point (reported by launcher-re 21)
…e it Experimental; back under Contributed Packages and in the book; 17 new overflow cases (silent overflow in subtraction, squaring, the modular operations, ValueOctal/ValueBinary and products near the limit; a remainder near the limit does not return); the negative-shift case accepts error 5 or a right shift (owner)
…ibrary's capacity (corrupt quotient, hang), until a second agent confirms it
…shoot_docs setups (building*), the shot fixtures, and the console's thumb pinned so a rerun is unchanged
…win, Json module renamed JsonMember, so tblaunch can compile the other modules under its own Sub Main; WIP.md says so
… in Program.twin, what differs from tblaunch in BrokerHost, so tblaunch can compile the rest unchanged; WIP.md says so; broker.test 14/14, command lines and status the same as before
…would hide VBA's Command in every project that compiles it; broker.test 14/14, command lines the same
…SCII case only, as impexp.mjs and the twinBASIC edition do, and UTF-8 to a pipe; check_impexp_parity gains the two commands that catch each
…ource gives (the disk, or tblaunch's own files) as import does, which tblaunch's Pack now calls; ToCrlf copies runs, SortOrdinal is a merge sort, ByteBuilder.Reserve does not overflow (import of the VB package 146 ms to 72 ms, same bytes); the packer folds names as Node does (U+212A in Packages); parity 23/23 with IMPEXP_EXE, --self-test 20/20
…s project after project through the page's own path (about 2 s on BETA 1010); root.loadProject over CDP is what hangs it
…st, keeps a wake that came while it read a sample, and re-polls at 50 ms while the page catches up: the 1 Hz tail (0.94 s median) becomes the 300 ms quiet
…the same compile, so a wait no longer stands still 5 s when the pair's one set of diagnostics beats id 1 (break-into's restart wait 6.05 s to 1.1 s)
…rmat$, &, Debug.Print), where a 32-bit build and VB6 give "0"; reproducer with eleven test cases and a VB6 side; WARNING on CStr, Str and Format (BETA 1010)
…ge has errors of its own: the panel rows of files the wire does not report on (unlistedRows) are added to the wire's counts, and the sample must stand unchanged for the 300 ms quiet; WinReg ends 0.3 s after its compile, not after the 5 s stand-still
…he compiler's start-up, now that the early path agrees for a package with errors of its own
…ion, tb-session.mjs: the page's openProject with the file dialog answered in the page; Safe Mode and TRACE-MODE reset before each switch; a failed switch, exit 2 or 3 starts a new IDE), --fresh for one IDE per project, and a batch that meets its limit is a finding, not the end of the run
…nd sweep_attributes mark it with .keep from the start (keepRunFolder), and the sweep of ended runs' folders (sweepRunFolders, tb-registry.mjs) leaves a marked one; a probe in example-batches covers it
…ore, and met twice its batch is not judged: since a batch that meets its limit no longer ends the run, the empty read was taken for a clean template, and a shared --fresh run blamed 17 ArrayListLib samples for the package's own TB5001 rows; two probes
…s its template's compile outruns the 10 s limit, so examples.bat could never judge them (owner); marked again when a version of WinReg compiles
…e or one equals the file, capturing on further apart for 5.5 s only within a pixel's wobble of the file; the settings setups open their project with the templates' build path, so llvmdoc1 no longer meets the user name
…aptured on for up to 5.5 s until the file shows, keeping the last two that agreed (a raster's other versions, a state still settling); the community badge clears the console's restart line itself
… as the host tells it, whatever the user's IDE window was; Rename_Box opens the box from the row's menu, since F2's key release turns the box red now and then; Controls_MultiSelect waits for the pointer readout, and e2a65dfe for every member's type
- The SVG of a picture whose PNG is not rewritten stays as it is, with its bundle: hidden
  layers differ from run to run, and an SVG on the bar came and went.
- Controls_MultiSelect moves the pointer onto Check1 after the clicks, so that its readout
  shows in Light too.
- Unsteady regions (owner): About's and the splash's two "See your logo here!" boxes (their
  gradient is dithered differently from capture to capture); the GitHub release's zip time;
  the splash's four rounded corners; a ring round each TabIndex circle of Designer_TabIndex,
  whose shadow over the grid comes out in one of two versions (formStateShot takes more
  unsteady regions).
- peRename waits for the F2 box to hold the name with its base name selected before typing:
  a rename typed early left naifrmA.tbform.
- Global search: once a search settles, every row of the results list is measured again
  (notifyChangedItem), since the list keeps a row's first height and a thumb showed over two
  results that fit.
- e2a65dfe: the IDE places the completion list at the text cursor as drawn, at the dot or
  now and then after it; the shot moves the list to where the cursor stood at the dot.
- Programs: tb-launch.ps1 can make a window on a private desktop the active one
  (activateWindow) and a capture says whether its caption is active; the program shots make
  the form active, and again when a capture finds its caption inactive.
…rived classes

Classes-and-Modules compares the two constructors (arguments, VB6/VBA,
COM clients, As New, calling them from code) and says when to use each,
with a sample of a class that has both. Inheritance gains Constructors in
Derived Classes: which base constructor runs, what a derived class's
author does for each kind of base, why a Base.New call goes first and on
every path, and the Class_Terminate order. Each page has a check_run
sample, and the behaviour was probed on BETA 1010, COM creation through a
compiled ActiveX DLL from VBScript.
Inheritance: automatic base constructor calls chain through every level;
every class's field initializers run before any constructor, so a base
constructor's Overridable call sees the derived fields set; a derived
class can be declared As New, and Class_Initialize beside Sub New() fails
with TB5073 there too; COM creation of a derived class runs the same
constructors.

Inline-Initialization: a Dim in a procedure can call anything, while a
Static, module-level or class-field initializer cannot call a procedure
of the project (TB5079/TB5027); which variables such an initializer can
read; a field that reads another field of its class fails the build.
Classes-and-Modules' ReadOnly paragraph no longer says any function can
set a field inline.

Probed on BETA 1010 with tbrun, tbrun --exe and a compiled ActiveX DLL
created from VBScript.
…module initializers in the IDE

class-field-init-reads-field: a class field initializer that reads another
field of its class compiles, then fails the build with a codegen error in
'<Class>.{fields_init}'; an IDE run leaves an arbitrary value. Reproducer
mode build.

module-init-reads-other-module-ide: one module-level initializer that reads
another module's variable leaves every module-level variable at 0 in the
IDE ([RunAfterBuild]); the exe is right. Reproducer mode run.

Both verified on BETA 1010 with bug_repro.mjs verify. Inline-Initialization
names them in an HTML comment.
Before the comparison table, a sentence says Class_Initialize is inherited
from VB6 and VBA and follows COM's rule that an object is created without
arguments, and that Sub New is twinBASIC's addition. Suggested by a reader
on Discord.
@KubaO
KubaO merged commit 760f90d into twinbasic:main Oct 20, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant