GBWindow::GBWindow(GBView * contents, short left, short top, bool vis) : showGrowBox(false), //TODO window(nil), view(contents), visible(vis) { Rect bounds; bounds.left = left; bounds.top = top; bounds.right = left + view->PreferredWidth(); bounds.bottom = top + view->PreferredHeight(); Str255 s; ToPascalString(view->Name(), s); view->SetBounds(GBRect(0, 0, view->PreferredWidth(), view->PreferredHeight())); if ( CreateNewWindow(kDocumentWindowClass, view->Resizable() ? kWindowStandardDocumentAttributes : (kWindowCloseBoxAttribute | kWindowCollapseBoxAttribute), &bounds, &window) ) throw GBOutOfMemoryError(); SetWTitle(window, s); SetWRefCon(window, (long)this); SetWindowKind(window, kMacWindowKind); view->SetGraphics(&graphics); if ( vis ) ShowWindow(window); }
void GBStackBrain::WriteLocalMemory(GBStackAddress addr, GBStackDatum val, GBRobot * robot) { if ( addr < 1 || addr > robot->hardware.Memory() ) throw GBIndexOutOfRangeError(); if ( ! memory ) { if ( ! robot->hardware.Memory() ) return; // fail silently memory = new GBStackDatum[robot->hardware.Memory()]; if ( ! memory ) throw GBOutOfMemoryError(); } memory[addr - 1] = val; }
GBStackBrain::GBStackBrain(const GBStackBrainSpec * spc) : spec(spc), pc(spc->StartAddress()), variables(new GBStackDatum[spc->NumVariables()]), vectorVariables(new GBVector[spc->NumVectorVariables()]), stack(new GBStackDatum[kStackLimit]), stackHeight(0), returnStack(new GBStackAddress[kReturnStackLimit]), returnStackHeight(0), memory(nil), used(0), remaining(0), lastPrint(nil) { if ( ! variables || ! vectorVariables || ! stack || ! returnStack ) throw GBOutOfMemoryError(); GBSymbolIndex i; for ( i = 0; i < spc->NumVariables(); i ++ ) variables[i] = spc->ReadVariable(i); for ( i = 0; i < spc->NumVectorVariables(); i ++ ) vectorVariables[i] = spc->ReadVectorVariable(i); }