From 9af1937a713860a1be45097a37d963747a98b6ef Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Tue, 14 Jul 2015 14:08:28 +0300 Subject: [PATCH 01/48] first step of switch to opal --- Gemfile | 24 +----- Gemfile.lock | 101 +++--------------------- app/main/controllers/main_controller.rb | 36 --------- config.ru | 15 +++- lib/debugger.rb | 8 ++ {app/main/lib => lib}/main_view.rb | 8 +- {app/main/lib => lib}/object_view.rb | 4 +- {app/main/lib => lib}/registers_view.rb | 6 +- {app/main/lib => lib}/space_view.rb | 14 ++-- 9 files changed, 47 insertions(+), 169 deletions(-) delete mode 100644 app/main/controllers/main_controller.rb create mode 100644 lib/debugger.rb rename {app/main/lib => lib}/main_view.rb (84%) rename {app/main/lib => lib}/object_view.rb (85%) rename {app/main/lib => lib}/registers_view.rb (69%) rename {app/main/lib => lib}/space_view.rb (89%) diff --git a/Gemfile b/Gemfile index a4ca92c..7402aee 100644 --- a/Gemfile +++ b/Gemfile @@ -1,19 +1,7 @@ source 'https://rubygems.org' -gem 'volt', :path => "../volt" -# volt uses mongo as the default data store. -gem 'volt-mongo', '~> 0.1.0' - -# The following gem's are optional for themeing -# Twitter bootstrap -gem 'volt-bootstrap', '~> 0.0.10' - -# Asset compilation gems, they will be required when needed. -gem 'csso-rails', '~> 0.3.4', require: false -gem 'uglifier', '>= 2.4.0', require: false - -gem 'opal-pixi' , :path => "../opal-pixi" +gem 'opal-browser' #gem "salama" , "0.2" , :path => "../salama" @@ -32,13 +20,3 @@ group :test do gem 'chromedriver2-helper', '~> 0.0.8' gem 'poltergeist', '~> 1.5.0' end - -# Server for MRI -platform :mri, :mingw do - # The implementation of ReadWriteLock in Volt uses concurrent ruby and ext helps performance. - gem 'concurrent-ruby-ext', '~> 0.8.0' - - # Thin is the default volt server, Puma is also supported - gem 'thin', '~> 1.6.0' - gem 'bson_ext', '~> 1.9.0' -end diff --git a/Gemfile.lock b/Gemfile.lock index 35feb20..f9f0671 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,9 +1,3 @@ -PATH - remote: ../opal-pixi - specs: - opal-pixi (0.1.0) - opal (~> 0.7.0) - PATH remote: ../parslet specs: @@ -27,30 +21,9 @@ PATH salama-reader (0.2.0) parslet (~> 1.7.0) -PATH - remote: ../volt - specs: - volt (0.9.4) - bcrypt (~> 3.1.9) - bundler (>= 1.5) - concurrent-ruby (= 0.8.0) - configurations (~> 2.0.0.pre) - faye-websocket (~> 0.9.2) - listen (~> 3.0.1) - opal (~> 0.7.2) - pry (~> 0.10.1) - rack (~> 1.5.0) - sass (~> 3.2.5) - sprockets-sass (~> 1.0.0) - thor (~> 0.19.0) - GEM remote: https://rubygems.org/ specs: - bcrypt (3.1.10) - bson (1.9.2) - bson_ext (1.9.2) - bson (~> 1.9.2) capybara (2.4.4) mime-types (>= 1.16) nokogiri (>= 1.3.3) @@ -62,58 +35,33 @@ GEM chromedriver2-helper (0.0.8) nokogiri cliver (0.3.2) - coderay (1.1.0) - concurrent-ruby (0.8.0) - ref (~> 1.0, >= 1.0.5) - concurrent-ruby-ext (0.8.0) - concurrent-ruby (~> 0.8.0) - configurations (2.0.0) - csso-rails (0.3.4) - execjs (>= 1) - daemons (1.2.3) diff-lcs (1.2.5) - eventmachine (1.0.7) - execjs (2.5.2) - faye-websocket (0.9.2) - eventmachine (>= 0.12.0) - websocket-driver (>= 0.5.1) ffi (1.9.10) hike (1.2.3) - json (1.8.3) - listen (3.0.2) - rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9) - method_source (0.8.2) mime-types (2.6.1) mini_portile (0.6.2) - mongo (1.9.2) - bson (~> 1.9.2) multi_json (1.11.2) nokogiri (1.6.6.2) mini_portile (~> 0.6.0) - opal (0.7.2) + opal (0.8.0.rc3) hike (~> 1.2) sourcemap (~> 0.1.0) - sprockets (>= 2.2.3, < 3.0.0) - tilt (~> 1.4) + sprockets (~> 3.1) + tilt (>= 1.4) + opal-browser (0.1.0.beta1) + opal (>= 0.5.5) + paggio opal-rspec (0.4.3) opal (>= 0.7.0, < 0.9) + paggio (0.2.4) poltergeist (1.5.1) capybara (~> 2.1) cliver (~> 0.3.1) multi_json (~> 1.0) websocket-driver (>= 0.2.0) - pry (0.10.1) - coderay (~> 1.1.0) - method_source (~> 0.8.1) - slop (~> 3.4) - rack (1.5.5) + rack (1.6.4) rack-test (0.6.3) rack (>= 1.0) - rb-fsevent (0.9.5) - rb-inotify (0.9.5) - ffi (>= 0.5.0) - ref (1.0.5) rspec (3.2.0) rspec-core (~> 3.2.0) rspec-expectations (~> 3.2.0) @@ -128,34 +76,15 @@ GEM rspec-support (~> 3.2.0) rspec-support (3.2.2) rubyzip (1.1.7) - sass (3.2.19) selenium-webdriver (2.43.0) childprocess (~> 0.5) multi_json (~> 1.0) rubyzip (~> 1.0) websocket (~> 1.0) - slop (3.6.0) sourcemap (0.1.1) - sprockets (2.12.4) - hike (~> 1.2) - multi_json (~> 1.0) + sprockets (3.2.0) rack (~> 1.0) - tilt (~> 1.1, != 1.3.0) - sprockets-sass (1.0.3) - sprockets (~> 2.0) - tilt (~> 1.1) - thin (1.6.3) - daemons (~> 1.0, >= 1.0.9) - eventmachine (~> 1.0) - rack (~> 1.0) - thor (0.19.1) - tilt (1.4.1) - uglifier (2.7.1) - execjs (>= 0.3.0) - json (>= 1.8.0) - volt-bootstrap (0.0.10) - volt-mongo (0.1.1) - mongo (~> 1.9.0) + tilt (2.0.1) websocket (1.2.2) websocket-driver (0.5.4) websocket-extensions (>= 0.1.0) @@ -167,12 +96,9 @@ PLATFORMS ruby DEPENDENCIES - bson_ext (~> 1.9.0) capybara (~> 2.4.2) chromedriver2-helper (~> 0.0.8) - concurrent-ruby-ext (~> 0.8.0) - csso-rails (~> 0.3.4) - opal-pixi! + opal-browser opal-rspec (~> 0.4.2) parslet! poltergeist (~> 1.5.0) @@ -181,8 +107,3 @@ DEPENDENCIES salama-object-file! salama-reader! selenium-webdriver (~> 2.43.0) - thin (~> 1.6.0) - uglifier (>= 2.4.0) - volt! - volt-bootstrap (~> 0.0.10) - volt-mongo (~> 0.1.0) diff --git a/app/main/controllers/main_controller.rb b/app/main/controllers/main_controller.rb deleted file mode 100644 index e56388f..0000000 --- a/app/main/controllers/main_controller.rb +++ /dev/null @@ -1,36 +0,0 @@ -# By default Volt generates this controller for your Main component -require "salama" - -if RUBY_PLATFORM == 'opal' - require "main/lib/main_view" -end - -Virtual::Machine.boot - -module Main - class MainController < Volt::ModelController - - def index - MainView.new() - end - - def about - - end - - private - - # The main template contains a #template binding that shows another - # template. This is the path to that template. It may change based - # on the params._component, params._controller, and params._action values. - def main_path - "#{params._component || 'main'}/#{params._controller || 'main'}/#{params._action || 'index'}" - end - - # Determine if the current nav component is the active one by looking - # at the first part of the url against the href attribute. - def active_tab? - url.path.split('/')[1] == attrs.href.split('/')[1] - end - end -end diff --git a/config.ru b/config.ru index 38c084f..f3d09ef 100644 --- a/config.ru +++ b/config.ru @@ -1,4 +1,11 @@ -# Run via rack server -require 'bundler/setup' -require 'volt/server' -run Volt::Server.new.app +require 'bundler' +Bundler.require + +require "opal" +Opal.use_gem("salama") + +run Opal::Server.new { |s| + s.main = 'debugger' + s.append_path 'lib' + s.debug = true +} diff --git a/lib/debugger.rb b/lib/debugger.rb new file mode 100644 index 0000000..9d35f24 --- /dev/null +++ b/lib/debugger.rb @@ -0,0 +1,8 @@ + +require "opal" + +require "main_view" + +Virtual::Machine.boot + +MainView.new() diff --git a/app/main/lib/main_view.rb b/lib/main_view.rb similarity index 84% rename from app/main/lib/main_view.rb rename to lib/main_view.rb index 46deb20..2c1a521 100644 --- a/app/main/lib/main_view.rb +++ b/lib/main_view.rb @@ -1,4 +1,4 @@ -require 'opal/pixi' +require 'browser' require 'native' require "salama" @@ -9,18 +9,18 @@ require_relative "space_view" class MainView def initialize - @container = PIXI::Container.new + @canvas = Browser::Canvas.new height = `window.innerHeight` width = `window.innerWidth` - renderer = PIXI::WebGLRenderer.new( width - 100 , height - 100, {"backgroundColor" => 0xFFFFFF}) + body = Native(`window.document.body`) # bit of a hack as it assumes index's structure html_con = body.firstElementChild html_con.insertBefore renderer.view , html_con.lastElementChild registers = RegisterView.new(height - 150) - @container.add_child registers + @canvas.add_child registers ParseTask.parse(1).then do |result| is = Ast::Expression.from_basic(result) diff --git a/app/main/lib/object_view.rb b/lib/object_view.rb similarity index 85% rename from app/main/lib/object_view.rb rename to lib/object_view.rb index 6e1a5fe..41b3644 100644 --- a/app/main/lib/object_view.rb +++ b/lib/object_view.rb @@ -5,8 +5,8 @@ class ObjectView def initialize o super() - self.text = PIXI::Text.new("no") - self.text.position = PIXI::Point.new( rand(1000) , rand(550)) + self.text = Text.new("no") + self.text.position = Point.new( rand(1000) , rand(550)) puts "NO O " unless o self.object = o self.text.text = short diff --git a/app/main/lib/registers_view.rb b/lib/registers_view.rb similarity index 69% rename from app/main/lib/registers_view.rb rename to lib/registers_view.rb index d469f5b..092729b 100644 --- a/app/main/lib/registers_view.rb +++ b/lib/registers_view.rb @@ -1,5 +1,5 @@ -class RegisterView < PIXI::Container +class RegisterView @@register_names = (0..8).collect {|i| "r#{i}"} @@ -8,8 +8,8 @@ class RegisterView < PIXI::Container @registers = {} x = 0 @@register_names.each do |name| - reg = PIXI::Text.new( name ) - reg.position = PIXI::Point.new x , at_y + reg = Text.new( name ) + reg.position = Point.new x , at_y x += reg.width + 20 @registers[name] = reg self.add_child reg diff --git a/app/main/lib/space_view.rb b/lib/space_view.rb similarity index 89% rename from app/main/lib/space_view.rb rename to lib/space_view.rb index a1df8f0..9795124 100644 --- a/app/main/lib/space_view.rb +++ b/lib/space_view.rb @@ -1,7 +1,7 @@ require "math" -PIXI::Point.class_eval do +Point.class_eval do alias_native :y= def add point @@ -21,7 +21,7 @@ PIXI::Point.class_eval do end end -class SpaceView < PIXI::Graphics +class SpaceView < Graphics include Sof::Util def initialize @@ -77,7 +77,7 @@ class SpaceView < PIXI::Graphics f = 0.01 if f < 0.01 f = f / 100 #puts "force #{f}" - PIXI::Point.new( dir_x / f , dir_y / f) + Point.new( dir_x / f , dir_y / f) end def update_positions @@ -91,10 +91,10 @@ class SpaceView < PIXI::Graphics view.position.add force( view.position , v.position ) end offset = 0.0 - view.position.add force( view.position , PIXI::Point.new(view.position.x , -offset) ) - view.position.add force( view.position , PIXI::Point.new(-offset , view.position.y) ) - view.position.add force( view.position , PIXI::Point.new(view.position.x , 550 + offset) ) - view.position.add force( view.position , PIXI::Point.new(1000 + offset , view.position.y) ) + view.position.add force( view.position , Point.new(view.position.x , -offset) ) + view.position.add force( view.position , Point.new(-offset , view.position.y) ) + view.position.add force( view.position , Point.new(view.position.x , 550 + offset) ) + view.position.add force( view.position , Point.new(1000 + offset , view.position.y) ) end end From 7d2120fdd5f37f0e9229275fa075df5776ec8dcf Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Tue, 14 Jul 2015 14:10:11 +0300 Subject: [PATCH 02/48] removing more volt --- app/main/assets/css/app.css.scss | 1 - app/main/assets/images/bunny.png | Bin 237 -> 0 bytes app/main/assets/js/pixi.js | 27488 ---------------- app/main/config/dependencies.rb | 8 - app/main/config/initializers/boot.rb | 10 - app/main/config/initializers/client/phaser.rb | 0 app/main/config/routes.rb | 7 - app/main/models/user.rb | 12 - app/main/tasks/parse_task.rb | 11 - app/main/views/main/about.html | 7 - app/main/views/main/index.html | 4 - app/main/views/main/main.html | 27 - 12 files changed, 27575 deletions(-) delete mode 100644 app/main/assets/css/app.css.scss delete mode 100644 app/main/assets/images/bunny.png delete mode 100644 app/main/assets/js/pixi.js delete mode 100644 app/main/config/dependencies.rb delete mode 100644 app/main/config/initializers/boot.rb delete mode 100644 app/main/config/initializers/client/phaser.rb delete mode 100644 app/main/config/routes.rb delete mode 100644 app/main/models/user.rb delete mode 100644 app/main/tasks/parse_task.rb delete mode 100644 app/main/views/main/about.html delete mode 100644 app/main/views/main/index.html delete mode 100644 app/main/views/main/main.html diff --git a/app/main/assets/css/app.css.scss b/app/main/assets/css/app.css.scss deleted file mode 100644 index f64375c..0000000 --- a/app/main/assets/css/app.css.scss +++ /dev/null @@ -1 +0,0 @@ -// Place your apps css here \ No newline at end of file diff --git a/app/main/assets/images/bunny.png b/app/main/assets/images/bunny.png deleted file mode 100644 index a773287d02c7494731828bea29a224aa27b47bb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4TA!3HE_(td6OQd>M-978G?-(GFxbTZ^=Npy_8 zoO&d5&cV4di<$}|>YO@abU8R>e!ST#ueGn-BhBEeU+uBSRZ{1FSMu>cva&ACn8%@2 zA|>_y^?XMwkM*sYva&@WO}{KvHp+rN48(4Q{);lxaPkSR@{ENu#Yvhyw>T! zAC5=i>B(Q)6MI_ucL`|nD=1zR*rK2`r%ft~|EPo@|E>S+XE#e+sy<_-;UFP?>6yu^ lC;@Y+ziof)*k|wg$L%G2ug$kR(hcZ-22WQ%mvv4FO#mAHTEGAR diff --git a/app/main/assets/js/pixi.js b/app/main/assets/js/pixi.js deleted file mode 100644 index 321d673..0000000 --- a/app/main/assets/js/pixi.js +++ /dev/null @@ -1,27488 +0,0 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.PIXI = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= arr.length) { - callback(); - } - } - } - }; - async.forEach = async.each; - - async.eachSeries = function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length) { - return callback(); - } - var completed = 0; - var iterate = function () { - iterator(arr[completed], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed >= arr.length) { - callback(); - } - else { - iterate(); - } - } - }); - }; - iterate(); - }; - async.forEachSeries = async.eachSeries; - - async.eachLimit = function (arr, limit, iterator, callback) { - var fn = _eachLimit(limit); - fn.apply(null, [arr, iterator, callback]); - }; - async.forEachLimit = async.eachLimit; - - var _eachLimit = function (limit) { - - return function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length || limit <= 0) { - return callback(); - } - var completed = 0; - var started = 0; - var running = 0; - - (function replenish () { - if (completed >= arr.length) { - return callback(); - } - - while (running < limit && started < arr.length) { - started += 1; - running += 1; - iterator(arr[started - 1], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - running -= 1; - if (completed >= arr.length) { - callback(); - } - else { - replenish(); - } - } - }); - } - })(); - }; - }; - - - var doParallel = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.each].concat(args)); - }; - }; - var doParallelLimit = function(limit, fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [_eachLimit(limit)].concat(args)); - }; - }; - var doSeries = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.eachSeries].concat(args)); - }; - }; - - - var _asyncMap = function (eachfn, arr, iterator, callback) { - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - if (!callback) { - eachfn(arr, function (x, callback) { - iterator(x.value, function (err) { - callback(err); - }); - }); - } else { - var results = []; - eachfn(arr, function (x, callback) { - iterator(x.value, function (err, v) { - results[x.index] = v; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - async.map = doParallel(_asyncMap); - async.mapSeries = doSeries(_asyncMap); - async.mapLimit = function (arr, limit, iterator, callback) { - return _mapLimit(limit)(arr, iterator, callback); - }; - - var _mapLimit = function(limit) { - return doParallelLimit(limit, _asyncMap); - }; - - // reduce only has a series version, as doing reduce in parallel won't - // work in many situations. - async.reduce = function (arr, memo, iterator, callback) { - async.eachSeries(arr, function (x, callback) { - iterator(memo, x, function (err, v) { - memo = v; - callback(err); - }); - }, function (err) { - callback(err, memo); - }); - }; - // inject alias - async.inject = async.reduce; - // foldl alias - async.foldl = async.reduce; - - async.reduceRight = function (arr, memo, iterator, callback) { - var reversed = _map(arr, function (x) { - return x; - }).reverse(); - async.reduce(reversed, memo, iterator, callback); - }; - // foldr alias - async.foldr = async.reduceRight; - - var _filter = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.filter = doParallel(_filter); - async.filterSeries = doSeries(_filter); - // select alias - async.select = async.filter; - async.selectSeries = async.filterSeries; - - var _reject = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (!v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.reject = doParallel(_reject); - async.rejectSeries = doSeries(_reject); - - var _detect = function (eachfn, arr, iterator, main_callback) { - eachfn(arr, function (x, callback) { - iterator(x, function (result) { - if (result) { - main_callback(x); - main_callback = function () {}; - } - else { - callback(); - } - }); - }, function (err) { - main_callback(); - }); - }; - async.detect = doParallel(_detect); - async.detectSeries = doSeries(_detect); - - async.some = function (arr, iterator, main_callback) { - async.each(arr, function (x, callback) { - iterator(x, function (v) { - if (v) { - main_callback(true); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(false); - }); - }; - // any alias - async.any = async.some; - - async.every = function (arr, iterator, main_callback) { - async.each(arr, function (x, callback) { - iterator(x, function (v) { - if (!v) { - main_callback(false); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(true); - }); - }; - // all alias - async.all = async.every; - - async.sortBy = function (arr, iterator, callback) { - async.map(arr, function (x, callback) { - iterator(x, function (err, criteria) { - if (err) { - callback(err); - } - else { - callback(null, {value: x, criteria: criteria}); - } - }); - }, function (err, results) { - if (err) { - return callback(err); - } - else { - var fn = function (left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - var remainingTasks = keys.length - if (!remainingTasks) { - return callback(); - } - - var results = {}; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - remainingTasks-- - _each(listeners.slice(0), function (fn) { - fn(); - }); - }; - - addListener(function () { - if (!remainingTasks) { - var theCallback = callback; - // prevent final callback from calling itself if it errors - callback = function () {}; - - theCallback(null, results); - } - }); - - _each(keys, function (k) { - var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]]; - var taskCallback = function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - if (err) { - var safeResults = {}; - _each(_keys(results), function(rkey) { - safeResults[rkey] = results[rkey]; - }); - safeResults[k] = args; - callback(err, safeResults); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - results[k] = args; - async.setImmediate(taskComplete); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && results.hasOwnProperty(x)); - }, true) && !results.hasOwnProperty(k); - }; - if (ready()) { - task[task.length - 1](taskCallback, results); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback, results); - } - }; - addListener(listener); - } - }); - }; - - async.retry = function(times, task, callback) { - var DEFAULT_TIMES = 5; - var attempts = []; - // Use defaults if times not passed - if (typeof times === 'function') { - callback = task; - task = times; - times = DEFAULT_TIMES; - } - // Make sure times is a number - times = parseInt(times, 10) || DEFAULT_TIMES; - var wrappedTask = function(wrappedCallback, wrappedResults) { - var retryAttempt = function(task, finalAttempt) { - return function(seriesCallback) { - task(function(err, result){ - seriesCallback(!err || finalAttempt, {err: err, result: result}); - }, wrappedResults); - }; - }; - while (times) { - attempts.push(retryAttempt(task, !(times-=1))); - } - async.series(attempts, function(done, data){ - data = data[data.length - 1]; - (wrappedCallback || callback)(data.err, data.result); - }); - } - // If a callback is passed, run this as a controll flow - return callback ? wrappedTask() : wrappedTask - }; - - async.waterfall = function (tasks, callback) { - callback = callback || function () {}; - if (!_isArray(tasks)) { - var err = new Error('First argument to waterfall must be an array of functions'); - return callback(err); - } - if (!tasks.length) { - return callback(); - } - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback.apply(null, arguments); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.setImmediate(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - var _parallel = function(eachfn, tasks, callback) { - callback = callback || function () {}; - if (_isArray(tasks)) { - eachfn.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - eachfn.each(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.parallel = function (tasks, callback) { - _parallel({ map: async.map, each: async.each }, tasks, callback); - }; - - async.parallelLimit = function(tasks, limit, callback) { - _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback); - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (_isArray(tasks)) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.eachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.doWhilst = function (iterator, test, callback) { - iterator(function (err) { - if (err) { - return callback(err); - } - var args = Array.prototype.slice.call(arguments, 1); - if (test.apply(null, args)) { - async.doWhilst(iterator, test, callback); - } - else { - callback(); - } - }); - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.doUntil = function (iterator, test, callback) { - iterator(function (err) { - if (err) { - return callback(err); - } - var args = Array.prototype.slice.call(arguments, 1); - if (!test.apply(null, args)) { - async.doUntil(iterator, test, callback); - } - else { - callback(); - } - }); - }; - - async.queue = function (worker, concurrency) { - if (concurrency === undefined) { - concurrency = 1; - } - function _insert(q, data, pos, callback) { - if (!q.started){ - q.started = true; - } - if (!_isArray(data)) { - data = [data]; - } - if(data.length == 0) { - // call drain immediately if there are no tasks - return async.setImmediate(function() { - if (q.drain) { - q.drain(); - } - }); - } - _each(data, function(task) { - var item = { - data: task, - callback: typeof callback === 'function' ? callback : null - }; - - if (pos) { - q.tasks.unshift(item); - } else { - q.tasks.push(item); - } - - if (q.saturated && q.tasks.length === q.concurrency) { - q.saturated(); - } - async.setImmediate(q.process); - }); - } - - var workers = 0; - var q = { - tasks: [], - concurrency: concurrency, - saturated: null, - empty: null, - drain: null, - started: false, - paused: false, - push: function (data, callback) { - _insert(q, data, false, callback); - }, - kill: function () { - q.drain = null; - q.tasks = []; - }, - unshift: function (data, callback) { - _insert(q, data, true, callback); - }, - process: function () { - if (!q.paused && workers < q.concurrency && q.tasks.length) { - var task = q.tasks.shift(); - if (q.empty && q.tasks.length === 0) { - q.empty(); - } - workers += 1; - var next = function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - if (q.drain && q.tasks.length + workers === 0) { - q.drain(); - } - q.process(); - }; - var cb = only_once(next); - worker(task.data, cb); - } - }, - length: function () { - return q.tasks.length; - }, - running: function () { - return workers; - }, - idle: function() { - return q.tasks.length + workers === 0; - }, - pause: function () { - if (q.paused === true) { return; } - q.paused = true; - q.process(); - }, - resume: function () { - if (q.paused === false) { return; } - q.paused = false; - q.process(); - } - }; - return q; - }; - - async.priorityQueue = function (worker, concurrency) { - - function _compareTasks(a, b){ - return a.priority - b.priority; - }; - - function _binarySearch(sequence, item, compare) { - var beg = -1, - end = sequence.length - 1; - while (beg < end) { - var mid = beg + ((end - beg + 1) >>> 1); - if (compare(item, sequence[mid]) >= 0) { - beg = mid; - } else { - end = mid - 1; - } - } - return beg; - } - - function _insert(q, data, priority, callback) { - if (!q.started){ - q.started = true; - } - if (!_isArray(data)) { - data = [data]; - } - if(data.length == 0) { - // call drain immediately if there are no tasks - return async.setImmediate(function() { - if (q.drain) { - q.drain(); - } - }); - } - _each(data, function(task) { - var item = { - data: task, - priority: priority, - callback: typeof callback === 'function' ? callback : null - }; - - q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item); - - if (q.saturated && q.tasks.length === q.concurrency) { - q.saturated(); - } - async.setImmediate(q.process); - }); - } - - // Start with a normal queue - var q = async.queue(worker, concurrency); - - // Override push to accept second parameter representing priority - q.push = function (data, priority, callback) { - _insert(q, data, priority, callback); - }; - - // Remove unshift function - delete q.unshift; - - return q; - }; - - async.cargo = function (worker, payload) { - var working = false, - tasks = []; - - var cargo = { - tasks: tasks, - payload: payload, - saturated: null, - empty: null, - drain: null, - drained: true, - push: function (data, callback) { - if (!_isArray(data)) { - data = [data]; - } - _each(data, function(task) { - tasks.push({ - data: task, - callback: typeof callback === 'function' ? callback : null - }); - cargo.drained = false; - if (cargo.saturated && tasks.length === payload) { - cargo.saturated(); - } - }); - async.setImmediate(cargo.process); - }, - process: function process() { - if (working) return; - if (tasks.length === 0) { - if(cargo.drain && !cargo.drained) cargo.drain(); - cargo.drained = true; - return; - } - - var ts = typeof payload === 'number' - ? tasks.splice(0, payload) - : tasks.splice(0, tasks.length); - - var ds = _map(ts, function (task) { - return task.data; - }); - - if(cargo.empty) cargo.empty(); - working = true; - worker(ds, function () { - working = false; - - var args = arguments; - _each(ts, function (data) { - if (data.callback) { - data.callback.apply(null, args); - } - }); - - process(); - }); - }, - length: function () { - return tasks.length; - }, - running: function () { - return working; - } - }; - return cargo; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _each(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - - async.memoize = function (fn, hasher) { - var memo = {}; - var queues = {}; - hasher = hasher || function (x) { - return x; - }; - var memoized = function () { - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - var key = hasher.apply(null, args); - if (key in memo) { - async.nextTick(function () { - callback.apply(null, memo[key]); - }); - } - else if (key in queues) { - queues[key].push(callback); - } - else { - queues[key] = [callback]; - fn.apply(null, args.concat([function () { - memo[key] = arguments; - var q = queues[key]; - delete queues[key]; - for (var i = 0, l = q.length; i < l; i++) { - q[i].apply(null, arguments); - } - }])); - } - }; - memoized.memo = memo; - memoized.unmemoized = fn; - return memoized; - }; - - async.unmemoize = function (fn) { - return function () { - return (fn.unmemoized || fn).apply(null, arguments); - }; - }; - - async.times = function (count, iterator, callback) { - var counter = []; - for (var i = 0; i < count; i++) { - counter.push(i); - } - return async.map(counter, iterator, callback); - }; - - async.timesSeries = function (count, iterator, callback) { - var counter = []; - for (var i = 0; i < count; i++) { - counter.push(i); - } - return async.mapSeries(counter, iterator, callback); - }; - - async.seq = function (/* functions... */) { - var fns = arguments; - return function () { - var that = this; - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - async.reduce(fns, args, function (newargs, fn, cb) { - fn.apply(that, newargs.concat([function () { - var err = arguments[0]; - var nextargs = Array.prototype.slice.call(arguments, 1); - cb(err, nextargs); - }])) - }, - function (err, results) { - callback.apply(that, [err].concat(results)); - }); - }; - }; - - async.compose = function (/* functions... */) { - return async.seq.apply(null, Array.prototype.reverse.call(arguments)); - }; - - var _applyEach = function (eachfn, fns /*args...*/) { - var go = function () { - var that = this; - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - return eachfn(fns, function (fn, cb) { - fn.apply(that, args.concat([cb])); - }, - callback); - }; - if (arguments.length > 2) { - var args = Array.prototype.slice.call(arguments, 2); - return go.apply(this, args); - } - else { - return go; - } - }; - async.applyEach = doParallel(_applyEach); - async.applyEachSeries = doSeries(_applyEach); - - async.forever = function (fn, callback) { - function next(err) { - if (err) { - if (callback) { - return callback(err); - } - throw err; - } - fn(next); - } - next(); - }; - - // Node.js - if (typeof module !== 'undefined' && module.exports) { - module.exports = async; - } - // AMD / RequireJS - else if (typeof define !== 'undefined' && define.amd) { - define([], function () { - return async; - }); - } - // included directly via - <% end %> - - <% css_files.each do |css_file| %> - - <% end %> - - - - - diff --git a/config/initializers/boot_salama.rb b/config/initializers/boot_salama.rb deleted file mode 100644 index b83f91a..0000000 --- a/config/initializers/boot_salama.rb +++ /dev/null @@ -1,3 +0,0 @@ -#require "salama" - -Virtual::Machine.boot diff --git a/lib/main_view.rb b/lib/main_view.rb index 2c1a521..be68244 100644 --- a/lib/main_view.rb +++ b/lib/main_view.rb @@ -1,6 +1,7 @@ require 'browser' require 'native' require "salama" +require "point" require_relative "registers_view" require_relative "object_view" diff --git a/lib/parse_task.rb b/lib/parse_task.rb new file mode 100644 index 0000000..de612cb --- /dev/null +++ b/lib/parse_task.rb @@ -0,0 +1,11 @@ +require "salama-reader" + +class ParseTask + def parse(num) + string_input = '"Hello again".putstring()' + parser = Parser::Salama.new + out = parser.parse(string_input) + parts = Parser::Transform.new.apply(out) + parts.to_basic + end +end diff --git a/lib/point.rb b/lib/point.rb new file mode 100644 index 0000000..12bfec7 --- /dev/null +++ b/lib/point.rb @@ -0,0 +1,7 @@ +class Point + def initialize x = 0 , y = 0 + @x = x + @y = y + end + attr_accessor :x , :y +end diff --git a/lib/space_view.rb b/lib/space_view.rb index 9795124..e77b417 100644 --- a/lib/space_view.rb +++ b/lib/space_view.rb @@ -21,7 +21,7 @@ Point.class_eval do end end -class SpaceView < Graphics +class SpaceView include Sof::Util def initialize From a49ef347ff53d48dee02a40e180fd925494e59ee Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Tue, 14 Jul 2015 16:03:06 +0300 Subject: [PATCH 04/48] more opal changes --- Gemfile | 2 +- Gemfile.lock | 12 ++++++++---- config.ru | 13 ++++++++++++- lib/debugger.rb | 2 +- lib/main_view.rb | 22 +++++++++++++++------- 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/Gemfile b/Gemfile index 7402aee..9eae1a3 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source 'https://rubygems.org' -gem 'opal-browser' +gem 'opal-browser' , :path => "../opal-browser" #gem "salama" , "0.2" , :path => "../salama" diff --git a/Gemfile.lock b/Gemfile.lock index f9f0671..4b15662 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,10 @@ +PATH + remote: ../opal-browser + specs: + opal-browser (0.2.0.beta1) + opal + paggio + PATH remote: ../parslet specs: @@ -48,9 +55,6 @@ GEM sourcemap (~> 0.1.0) sprockets (~> 3.1) tilt (>= 1.4) - opal-browser (0.1.0.beta1) - opal (>= 0.5.5) - paggio opal-rspec (0.4.3) opal (>= 0.7.0, < 0.9) paggio (0.2.4) @@ -98,7 +102,7 @@ PLATFORMS DEPENDENCIES capybara (~> 2.4.2) chromedriver2-helper (~> 0.0.8) - opal-browser + opal-browser! opal-rspec (~> 0.4.2) parslet! poltergeist (~> 1.5.0) diff --git a/config.ru b/config.ru index f3d09ef..ff3b732 100644 --- a/config.ru +++ b/config.ru @@ -1,11 +1,22 @@ require 'bundler' Bundler.require +require_relative "lib/parse_task" require "opal" Opal.use_gem("salama") -run Opal::Server.new { |s| +class DebugServer < Opal::Server + def call(env) + if( env["REQUEST_PATH"] == "/tasks.json") + [200, { 'Content-Type' => 'text/json' }, [ParseTask.new.parse(1).to_json]] + else + super(env) + end + end +end +run DebugServer.new { |s| s.main = 'debugger' s.append_path 'lib' + s.source_map = true s.debug = true } diff --git a/lib/debugger.rb b/lib/debugger.rb index 9d35f24..186a704 100644 --- a/lib/debugger.rb +++ b/lib/debugger.rb @@ -1,6 +1,6 @@ require "opal" - +require "opal-parser" require "main_view" Virtual::Machine.boot diff --git a/lib/main_view.rb b/lib/main_view.rb index be68244..b1492dc 100644 --- a/lib/main_view.rb +++ b/lib/main_view.rb @@ -1,4 +1,7 @@ + require 'browser' +require 'browser/canvas' +require 'browser/http' require 'native' require "salama" require "point" @@ -11,6 +14,18 @@ class MainView def initialize @canvas = Browser::Canvas.new + @canvas.element.width = 1000 + @canvas.element.height = 500 + Browser::HTTP.get "/tasks.json" do + on :success do |res| + is = Ast::Expression.from_basic(res.json) + Virtual::Compiler.compile( is , Virtual.machine.space.get_main ) + Virtual.machine.run_before Virtual::Machine::FIRST_PASS + end + end + @canvas.append_to($document.body) + end + def no height = `window.innerHeight` width = `window.innerWidth` @@ -23,13 +38,6 @@ class MainView registers = RegisterView.new(height - 150) @canvas.add_child registers - ParseTask.parse(1).then do |result| - is = Ast::Expression.from_basic(result) - Virtual::Compiler.compile( is , Virtual.machine.space.get_main ) - Virtual.machine.run_before Virtual::Machine::FIRST_PASS - end.fail do |error| - raise "Error: #{error}" - end space = SpaceView.new @container.add_child space From 4257bc446ff8d744f8e0aadffc4ae7eb0508a627 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Wed, 19 Aug 2015 22:34:39 +0200 Subject: [PATCH 05/48] fix, was outdated --- Gemfile | 3 ++- Gemfile.lock | 21 +++++++++++++-------- config.ru | 3 ++- lib/debugger.rb | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/Gemfile b/Gemfile index 9eae1a3..49820b4 100644 --- a/Gemfile +++ b/Gemfile @@ -1,13 +1,14 @@ source 'https://rubygems.org' -gem 'opal-browser' , :path => "../opal-browser" +gem 'opal-browser' #gem "salama" , "0.2" , :path => "../salama" gem "parslet" , path: "../parslet" gem "salama" , path: "../salama" gem "salama-reader" , path: "../salama-reader" +gem "salama-arm" , path: "../salama-arm" gem "salama-object-file" , path: "../salama-object-file" diff --git a/Gemfile.lock b/Gemfile.lock index 4b15662..a9b960d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,10 +1,3 @@ -PATH - remote: ../opal-browser - specs: - opal-browser (0.2.0.beta1) - opal - paggio - PATH remote: ../parslet specs: @@ -17,6 +10,11 @@ PATH salama-object-file (~> 0.2) salama-reader (~> 0.2) +PATH + remote: ../salama-arm + specs: + salama-arm (0.0.1) + PATH remote: ../salama-object-file specs: @@ -55,6 +53,9 @@ GEM sourcemap (~> 0.1.0) sprockets (~> 3.1) tilt (>= 1.4) + opal-browser (0.2.0) + opal + paggio opal-rspec (0.4.3) opal (>= 0.7.0, < 0.9) paggio (0.2.4) @@ -102,12 +103,16 @@ PLATFORMS DEPENDENCIES capybara (~> 2.4.2) chromedriver2-helper (~> 0.0.8) - opal-browser! + opal-browser opal-rspec (~> 0.4.2) parslet! poltergeist (~> 1.5.0) rspec (~> 3.2.0) salama! + salama-arm! salama-object-file! salama-reader! selenium-webdriver (~> 2.43.0) + +BUNDLED WITH + 1.10.5 diff --git a/config.ru b/config.ru index ff3b732..96f8e30 100644 --- a/config.ru +++ b/config.ru @@ -4,6 +4,7 @@ require_relative "lib/parse_task" require "opal" Opal.use_gem("salama") +Opal.use_gem("salama-arm") class DebugServer < Opal::Server def call(env) @@ -18,5 +19,5 @@ run DebugServer.new { |s| s.main = 'debugger' s.append_path 'lib' s.source_map = true - s.debug = true + s.debug = false } diff --git a/lib/debugger.rb b/lib/debugger.rb index 186a704..8ba94c4 100644 --- a/lib/debugger.rb +++ b/lib/debugger.rb @@ -3,6 +3,6 @@ require "opal" require "opal-parser" require "main_view" -Virtual::Machine.boot +Virtual.machine.boot MainView.new() From 3c959fecb207681d1e45909b74de5af30244dc6b Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Thu, 20 Aug 2015 00:53:20 +0200 Subject: [PATCH 06/48] initial steps --- lib/class_view.rb | 25 +++++++++++++++++++++++++ lib/debugger.rb | 2 -- lib/main_view.rb | 40 +++++++++++++++++++--------------------- 3 files changed, 44 insertions(+), 23 deletions(-) create mode 100644 lib/class_view.rb diff --git a/lib/class_view.rb b/lib/class_view.rb new file mode 100644 index 0000000..458efac --- /dev/null +++ b/lib/class_view.rb @@ -0,0 +1,25 @@ +class ClassView + + def initialize + +# page._classes!.clear + all = [] + Virtual.machine.space.classes.each do |name , claz| + next if [:Kernel,:Module,:MetaClass,:BinaryCode].index name + all << name + end + all.sort.each do |name| +# c = Volt::Model.new :name => name +# page._classes << c + end + end + + def variables(clas_model) + layout = Virtual.machine.space.get_class_by_name(clas_model._name).object_layout + vars = [] + layout.object_instance_names.each do |name| + vars.push name + end + vars + end +end diff --git a/lib/debugger.rb b/lib/debugger.rb index 8ba94c4..f1290dd 100644 --- a/lib/debugger.rb +++ b/lib/debugger.rb @@ -3,6 +3,4 @@ require "opal" require "opal-parser" require "main_view" -Virtual.machine.boot - MainView.new() diff --git a/lib/main_view.rb b/lib/main_view.rb index b1492dc..e57e891 100644 --- a/lib/main_view.rb +++ b/lib/main_view.rb @@ -1,35 +1,34 @@ require 'browser' -require 'browser/canvas' -require 'browser/http' require 'native' require "salama" -require "point" +require "interpreter/interpreter" -require_relative "registers_view" -require_relative "object_view" -require_relative "space_view" +require_relative "class_view" +#require_relative "registers_view" +#require_relative "object_view" +#require_relative "space_view" class MainView def initialize - @canvas = Browser::Canvas.new - @canvas.element.width = 1000 - @canvas.element.height = 500 - Browser::HTTP.get "/tasks.json" do - on :success do |res| - is = Ast::Expression.from_basic(res.json) - Virtual::Compiler.compile( is , Virtual.machine.space.get_main ) - Virtual.machine.run_before Virtual::Machine::FIRST_PASS - end - end - @canvas.append_to($document.body) + machine = Virtual.machine.boot + code = Ast::OperatorExpression.new("+", Ast::IntegerExpression.new(2),Ast::IntegerExpression.new(5)) + Virtual::Compiler.compile( code , machine.space.get_main ) + machine.run_before "Register::CallImplementation" + @interpreter = Interpreter::Interpreter.new + draw + end + + def draw + DOM { + div.info { + span.red "I'm all cooked up." + } + }.append_to($document.body) end def no - height = `window.innerHeight` - width = `window.innerWidth` - body = Native(`window.document.body`) # bit of a hack as it assumes index's structure html_con = body.firstElementChild @@ -51,5 +50,4 @@ class MainView end - attr_reader :container end From bb5caa9bf14af401a1099064e28b1a4f02e2de83 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Thu, 20 Aug 2015 00:53:39 +0200 Subject: [PATCH 07/48] speed up by 50 using men cache --- config.ru | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config.ru b/config.ru index 96f8e30..04e0e34 100644 --- a/config.ru +++ b/config.ru @@ -3,6 +3,8 @@ Bundler.require require_relative "lib/parse_task" require "opal" +require 'opal-browser' + Opal.use_gem("salama") Opal.use_gem("salama-arm") @@ -18,6 +20,7 @@ end run DebugServer.new { |s| s.main = 'debugger' s.append_path 'lib' - s.source_map = true +# s.source_map = true s.debug = false + s.sprockets.cache = Sprockets::Cache::MemoryStore.new(5000) } From e7e85b8d7378cd9121a268735e8498a17ed8ccca Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Thu, 20 Aug 2015 02:14:33 +0200 Subject: [PATCH 08/48] revived the styles --- Gemfile | 3 +- Gemfile.lock | 5 ++++ assets/css/app.css.scss | 59 ++++++++++++++++++++++++++++++++++++++++ assets/css/menu.css.scss | 59 ++++++++++++++++++++++++++++++++++++++++ config.ru | 5 ++++ index.html.erb | 11 ++++++++ 6 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 assets/css/app.css.scss create mode 100644 assets/css/menu.css.scss create mode 100644 index.html.erb diff --git a/Gemfile b/Gemfile index 49820b4..5934f94 100644 --- a/Gemfile +++ b/Gemfile @@ -10,7 +10,8 @@ gem "salama" , path: "../salama" gem "salama-reader" , path: "../salama-reader" gem "salama-arm" , path: "../salama-arm" gem "salama-object-file" , path: "../salama-object-file" - +gem "sass" +gem "susy" group :test do # Testing dependencies diff --git a/Gemfile.lock b/Gemfile.lock index a9b960d..03f374a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -81,6 +81,7 @@ GEM rspec-support (~> 3.2.0) rspec-support (3.2.2) rubyzip (1.1.7) + sass (3.4.16) selenium-webdriver (2.43.0) childprocess (~> 0.5) multi_json (~> 1.0) @@ -89,6 +90,8 @@ GEM sourcemap (0.1.1) sprockets (3.2.0) rack (~> 1.0) + susy (2.2.5) + sass (>= 3.3.0, < 3.5) tilt (2.0.1) websocket (1.2.2) websocket-driver (0.5.4) @@ -112,7 +115,9 @@ DEPENDENCIES salama-arm! salama-object-file! salama-reader! + sass selenium-webdriver (~> 2.43.0) + susy BUNDLED WITH 1.10.5 diff --git a/assets/css/app.css.scss b/assets/css/app.css.scss new file mode 100644 index 0000000..e70efba --- /dev/null +++ b/assets/css/app.css.scss @@ -0,0 +1,59 @@ +// Place your apps css here +@import "susy"; + + +$susy: ( + columns: 24 , + gutter-position: split , +); + +.debugger-view { @include container(90%); } + +.classes { + @include span(3); +} + +.one-class { + margin: 10px; +} +.file-view { + @include span(4); + margin: span(1); +} + +.source-view { @include span(6); } + +.block-view { + @include span(4); + margin-right: span(2); + height: 200px; +} + +.status-view { + @include span(2 at 22); +} + +.registers-view { + @include span(20 at 3); +} + +.register-view { + @include gallery(4); + margin-top: 10px; +} + +.field { + @include span(5) +} + +.value { + @include span(18) +} + +.value-head { + background-color: #C5FFD9; +} + +.bright { + background-color: orange ; +} diff --git a/assets/css/menu.css.scss b/assets/css/menu.css.scss new file mode 100644 index 0000000..78dc9f5 --- /dev/null +++ b/assets/css/menu.css.scss @@ -0,0 +1,59 @@ +body { + font-family: arial, helvetica, serif; +} + +#nav, #nav ul { /* all lists */ + padding: 0; + margin: 0; + list-style: none; + float : left; + width : 10em; + /*border around submenu goes here*/ + -moz-border-radius: 8px; + -webkit-border-radius: 8px; + background:#fff; + border:1px solid #C3D46A +} + +#nav li { /* all list items */ + position : relative; + float : left; + line-height : 1.25em; + width: 9em; +} + +#nav li ul { /* second-level lists */ + position : absolute; + left: -999em; + margin-left : 10.05em; + margin-top : -1.35em; +} + +#nav li ul ul { /* third-and-above-level lists */ + left: -999em; +} + +#nav li a , li span { + padding-left: 0.5em; + width : 9.5em; + display : block; + color : black; + font-weight : bold; + text-decoration : none; + background-color : white; + -moz-border-radius: 7px; + -webkit-border-radius: 7px; +} + +#nav li a:hover { + color : white; + background-color : #F6C739; +} + +#nav li:hover ul ul, #nav li:hover ul ul ul { + left: -999em; +} + +#nav li:hover ul, #nav li li:hover ul, #nav li li li:hover ul { /* lists nested under hovered list items */ + left: auto; +} diff --git a/config.ru b/config.ru index 04e0e34..96da32b 100644 --- a/config.ru +++ b/config.ru @@ -1,5 +1,7 @@ require 'bundler' Bundler.require +require 'tilt/erb' + require_relative "lib/parse_task" require "opal" @@ -20,7 +22,10 @@ end run DebugServer.new { |s| s.main = 'debugger' s.append_path 'lib' + s.append_path 'assets' # s.source_map = true s.debug = false + + s.index_path = "index.html.erb" s.sprockets.cache = Sprockets::Cache::MemoryStore.new(5000) } diff --git a/index.html.erb b/index.html.erb new file mode 100644 index 0000000..8cd7ba7 --- /dev/null +++ b/index.html.erb @@ -0,0 +1,11 @@ + + + + Debugger + + + + + <%= javascript_include_tag "debugger" %> + + From ef60cbdc4540b05f9bc18405009f0cf12d550e44 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Thu, 20 Aug 2015 14:48:45 +0200 Subject: [PATCH 09/48] introduce base classes --- lib/class_view.rb | 25 ++++++++++++++++++++++++- lib/element_view.rb | 6 ++++++ lib/list_view.rb | 9 +++++++++ lib/main_view.rb | 11 +++++++---- 4 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 lib/element_view.rb create mode 100644 lib/list_view.rb diff --git a/lib/class_view.rb b/lib/class_view.rb index 458efac..7dc921f 100644 --- a/lib/class_view.rb +++ b/lib/class_view.rb @@ -1,4 +1,4 @@ -class ClassView +class ClassView < ListView def initialize @@ -22,4 +22,27 @@ class ClassView end vars end + + def draw + div.classes do + h4 {"Classes"} + ul.nav do + #{{page._classes.each do |clas| }} + li do + a { "me "} + # {{ clas._name }} + # {{ unless variables(clas).empty? }} + #
    + # {{variables(clas).each do |var| }} + #
  • + # {{var}} + #
  • + # {{ end }} + #
+ end + end + end + end + end + end diff --git a/lib/element_view.rb b/lib/element_view.rb new file mode 100644 index 0000000..a8bdad9 --- /dev/null +++ b/lib/element_view.rb @@ -0,0 +1,6 @@ +class ElementView + + def initialize + + end +end diff --git a/lib/list_view.rb b/lib/list_view.rb new file mode 100644 index 0000000..5d7930e --- /dev/null +++ b/lib/list_view.rb @@ -0,0 +1,9 @@ +require "element_view" + +class ListView < ElementView + + def initialize + + end + +end diff --git a/lib/main_view.rb b/lib/main_view.rb index e57e891..4010f52 100644 --- a/lib/main_view.rb +++ b/lib/main_view.rb @@ -3,13 +3,13 @@ require 'browser' require 'native' require "salama" require "interpreter/interpreter" - +require "list_view" require_relative "class_view" #require_relative "registers_view" #require_relative "object_view" #require_relative "space_view" -class MainView +class MainView < ListView def initialize machine = Virtual.machine.boot @@ -17,15 +17,18 @@ class MainView Virtual::Compiler.compile( code , machine.space.get_main ) machine.run_before "Register::CallImplementation" @interpreter = Interpreter::Interpreter.new + @parent = $document.body + puts @parent.parent.name draw end def draw - DOM { + node = DOM { div.info { span.red "I'm all cooked up." } - }.append_to($document.body) + } + node.append_to(@parent) end def no From ef1235d3e80028dff5425a1ef63fd94c71b1b25d Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Thu, 20 Aug 2015 16:07:44 +0200 Subject: [PATCH 10/48] small preparations --- lib/class_view.rb | 31 +++++++++++++++---------------- lib/element_view.rb | 2 +- lib/list_view.rb | 2 +- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/lib/class_view.rb b/lib/class_view.rb index 7dc921f..f58d629 100644 --- a/lib/class_view.rb +++ b/lib/class_view.rb @@ -24,22 +24,21 @@ class ClassView < ListView end def draw - div.classes do - h4 {"Classes"} - ul.nav do - #{{page._classes.each do |clas| }} - li do - a { "me "} - # {{ clas._name }} - # {{ unless variables(clas).empty? }} - #
    - # {{variables(clas).each do |var| }} - #
  • - # {{var}} - #
  • - # {{ end }} - #
- end + div.classes do + h4 {"Classes"} + ul.nav do + #{{page._classes.each do |clas| }} + li do + a { "me "} + # {{ clas._name }} + # {{ unless variables(clas).empty? }} + #
    + # {{variables(clas).each do |var| }} + #
  • + # {{var}} + #
  • + # {{ end }} + #
end end end diff --git a/lib/element_view.rb b/lib/element_view.rb index a8bdad9..93fa30c 100644 --- a/lib/element_view.rb +++ b/lib/element_view.rb @@ -1,6 +1,6 @@ class ElementView def initialize - + @element = nil end end diff --git a/lib/list_view.rb b/lib/list_view.rb index 5d7930e..225ffe8 100644 --- a/lib/list_view.rb +++ b/lib/list_view.rb @@ -3,7 +3,7 @@ require "element_view" class ListView < ElementView def initialize - + @elements = [] end end From 1f7c06d6260c1e0d31dca65acc25f52899c1642d Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Thu, 20 Aug 2015 16:13:57 +0200 Subject: [PATCH 11/48] add some explanation and use github gem versions --- Gemfile | 12 ++++----- Gemfile.lock | 63 ++++++++++++++++++++++++++++-------------------- lib/main_view.rb | 15 +++++++++--- 3 files changed, 55 insertions(+), 35 deletions(-) diff --git a/Gemfile b/Gemfile index 5934f94..6b804c0 100644 --- a/Gemfile +++ b/Gemfile @@ -1,15 +1,15 @@ source 'https://rubygems.org' - +gem "opal" , :github => "opal/opal" gem 'opal-browser' #gem "salama" , "0.2" , :path => "../salama" -gem "parslet" , path: "../parslet" -gem "salama" , path: "../salama" -gem "salama-reader" , path: "../salama-reader" -gem "salama-arm" , path: "../salama-arm" -gem "salama-object-file" , path: "../salama-object-file" +gem "parslet" , github: "salama/parslet" +gem "salama" , github: "salama/salama" +gem "salama-reader" , github: "salama/salama-reader" +gem "salama-arm" , github: "salama/salama-arm" +gem "salama-object-file" , github: "salama/salama-object-file" gem "sass" gem "susy" diff --git a/Gemfile.lock b/Gemfile.lock index 03f374a..683fe11 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,31 +1,46 @@ -PATH - remote: ../parslet +GIT + remote: git://github.com/opal/opal.git + revision: c604685071f8560d3357044683a99b80b210a99b + specs: + opal (0.9.0.dev) + hike (~> 1.2) + sourcemap (~> 0.1.0) + sprockets (~> 3.1) + tilt (>= 1.4) + +GIT + remote: git://github.com/salama/parslet.git + revision: d4a6444ae01d5688bbb1e8aa27647eb7db1d34a7 specs: parslet (1.7.0) -PATH - remote: ../salama +GIT + remote: git://github.com/salama/salama-arm.git + revision: 0bd5091e3f284ecf040e0086a41d2449cd5afb7a + specs: + salama-arm (0.0.1) + +GIT + remote: git://github.com/salama/salama-object-file.git + revision: fbae6a02764dbe97e01e4833f9ffffe09879b100 + specs: + salama-object-file (0.2.0) + +GIT + remote: git://github.com/salama/salama-reader.git + revision: 841592c667acea1e796f950851262e6938b231bc + specs: + salama-reader (0.2.0) + parslet (~> 1.7.0) + +GIT + remote: git://github.com/salama/salama.git + revision: c039f3d6e6a89a5e66fbcb37f4fb02646fe9d5d6 specs: salama (0.2.0) salama-object-file (~> 0.2) salama-reader (~> 0.2) -PATH - remote: ../salama-arm - specs: - salama-arm (0.0.1) - -PATH - remote: ../salama-object-file - specs: - salama-object-file (0.2.0) - -PATH - remote: ../salama-reader - specs: - salama-reader (0.2.0) - parslet (~> 1.7.0) - GEM remote: https://rubygems.org/ specs: @@ -48,11 +63,6 @@ GEM multi_json (1.11.2) nokogiri (1.6.6.2) mini_portile (~> 0.6.0) - opal (0.8.0.rc3) - hike (~> 1.2) - sourcemap (~> 0.1.0) - sprockets (~> 3.1) - tilt (>= 1.4) opal-browser (0.2.0) opal paggio @@ -88,7 +98,7 @@ GEM rubyzip (~> 1.0) websocket (~> 1.0) sourcemap (0.1.1) - sprockets (3.2.0) + sprockets (3.3.2) rack (~> 1.0) susy (2.2.5) sass (>= 3.3.0, < 3.5) @@ -106,6 +116,7 @@ PLATFORMS DEPENDENCIES capybara (~> 2.4.2) chromedriver2-helper (~> 0.0.8) + opal! opal-browser opal-rspec (~> 0.4.2) parslet! diff --git a/lib/main_view.rb b/lib/main_view.rb index 4010f52..38896e3 100644 --- a/lib/main_view.rb +++ b/lib/main_view.rb @@ -13,8 +13,17 @@ class MainView < ListView def initialize machine = Virtual.machine.boot - code = Ast::OperatorExpression.new("+", Ast::IntegerExpression.new(2),Ast::IntegerExpression.new(5)) - Virtual::Compiler.compile( code , machine.space.get_main ) + + # compile_main includes the parse + # parsing generates an ast as seen below and then compiles it. + machine.compile_main "2 + 5" + + # so the code above is functionally equivalent to the one below, minus the parse + # When the ast expression is given all works, so pretty sure it is the parse that fails + + # code = Ast::OperatorExpression.new("+", Ast::IntegerExpression.new(2),Ast::IntegerExpression.new(5)) + # Virtual::Compiler.compile( code , machine.space.get_main ) + machine.run_before "Register::CallImplementation" @interpreter = Interpreter::Interpreter.new @parent = $document.body @@ -25,7 +34,7 @@ class MainView < ListView def draw node = DOM { div.info { - span.red "I'm all cooked up." + span.red "Ready to start." } } node.append_to(@parent) From 87c649c6223045aa27a1c469902c7294dd11bb52 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Thu, 20 Aug 2015 19:40:47 +0200 Subject: [PATCH 12/48] put the classes back on the screen --- lib/class_view.rb | 49 ++++++++++++++++++++++----------------------- lib/debugger.rb | 3 ++- lib/element_view.rb | 4 ++++ lib/list_view.rb | 13 +++++++++++- lib/main_view.rb | 21 ++++++++++--------- 5 files changed, 53 insertions(+), 37 deletions(-) diff --git a/lib/class_view.rb b/lib/class_view.rb index f58d629..0c0d6b1 100644 --- a/lib/class_view.rb +++ b/lib/class_view.rb @@ -1,17 +1,13 @@ -class ClassView < ListView +class ClassView < ElementView - def initialize - -# page._classes!.clear - all = [] + def initialize interpreter + @interpreter = interpreter + @classes = [] Virtual.machine.space.classes.each do |name , claz| next if [:Kernel,:Module,:MetaClass,:BinaryCode].index name - all << name - end - all.sort.each do |name| -# c = Volt::Model.new :name => name -# page._classes << c + @classes << name end + @classes.sort! end def variables(clas_model) @@ -24,24 +20,27 @@ class ClassView < ListView end def draw - div.classes do - h4 {"Classes"} - ul.nav do - #{{page._classes.each do |clas| }} - li do - a { "me "} - # {{ clas._name }} - # {{ unless variables(clas).empty? }} - #
    - # {{variables(clas).each do |var| }} - #
  • - # {{var}} - #
  • - # {{ end }} - #
+ DOM do |dom| + dom.div.classes do + dom.h4 {"Classes"} + dom.ul.nav! do + @classes.each do |cl| + dom.li do + dom.a { cl } + end + end end end end end + # {{ clas._name }} + # {{ unless variables(clas).empty? }} + #
    + # {{variables(clas).each do |var| }} + #
  • + # {{var}} + #
  • + # {{ end }} + #
end diff --git a/lib/debugger.rb b/lib/debugger.rb index f1290dd..30a73cd 100644 --- a/lib/debugger.rb +++ b/lib/debugger.rb @@ -3,4 +3,5 @@ require "opal" require "opal-parser" require "main_view" -MainView.new() +view = MainView.new() +view.draw.append_to($document.body) diff --git a/lib/element_view.rb b/lib/element_view.rb index 93fa30c..ea068ad 100644 --- a/lib/element_view.rb +++ b/lib/element_view.rb @@ -3,4 +3,8 @@ class ElementView def initialize @element = nil end + + def draw + raise "implement me to return an Element" + end end diff --git a/lib/list_view.rb b/lib/list_view.rb index 225ffe8..2795835 100644 --- a/lib/list_view.rb +++ b/lib/list_view.rb @@ -2,8 +2,19 @@ require "element_view" class ListView < ElementView - def initialize + def initialize children + @children = children @elements = [] + @container_element = nil end + def draw on + @container_element = $document.create_element('div') + @elements = @children.collect do | c | + elem = c.draw(@container_element) + elem.append_to(@container_element) + elem + end + @container_element + end end diff --git a/lib/main_view.rb b/lib/main_view.rb index 38896e3..71ce6d3 100644 --- a/lib/main_view.rb +++ b/lib/main_view.rb @@ -16,29 +16,30 @@ class MainView < ListView # compile_main includes the parse # parsing generates an ast as seen below and then compiles it. - machine.compile_main "2 + 5" + # machine.compile_main "2 + 5" # so the code above is functionally equivalent to the one below, minus the parse # When the ast expression is given all works, so pretty sure it is the parse that fails - # code = Ast::OperatorExpression.new("+", Ast::IntegerExpression.new(2),Ast::IntegerExpression.new(5)) - # Virtual::Compiler.compile( code , machine.space.get_main ) + code = Ast::OperatorExpression.new("+", Ast::IntegerExpression.new(2),Ast::IntegerExpression.new(5)) + Virtual::Compiler.compile( code , machine.space.get_main ) machine.run_before "Register::CallImplementation" @interpreter = Interpreter::Interpreter.new - @parent = $document.body - puts @parent.parent.name - draw + super( [ClassView.new(@interpreter)] ) end - def draw - node = DOM { - div.info { - span.red "Ready to start." + def draww + node = DOM { |m| + Kernel.puts "DOM #{self.class}" + m.div.info { + Kernel.puts "div #{self.class}" ; "" + m.span.red @interpreter.state } } node.append_to(@parent) end + def no body = Native(`window.document.body`) From 5c60f29fbffab484d08a0653eb77c61b55dac7e8 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Thu, 20 Aug 2015 19:46:43 +0200 Subject: [PATCH 13/48] and the class instances. nice to use objects --- lib/class_view.rb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/class_view.rb b/lib/class_view.rb index 0c0d6b1..dbbeef2 100644 --- a/lib/class_view.rb +++ b/lib/class_view.rb @@ -5,9 +5,9 @@ class ClassView < ElementView @classes = [] Virtual.machine.space.classes.each do |name , claz| next if [:Kernel,:Module,:MetaClass,:BinaryCode].index name - @classes << name + @classes << claz end - @classes.sort! + @classes.sort! {|a,b| a.name <=> b.name } end def variables(clas_model) @@ -26,7 +26,14 @@ class ClassView < ElementView dom.ul.nav! do @classes.each do |cl| dom.li do - dom.a { cl } + dom.a { cl.name } + dom.ul do + cl.object_layout.object_instance_names.each do |name| + dom.li do + dom.a{ name } + end + end + end end end end From a6c22cf6e0ee9521f7cf8525c478bc980fe3fd05 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Thu, 20 Aug 2015 20:02:25 +0200 Subject: [PATCH 14/48] change to underscore in class names, for paggio --- assets/css/app.css.scss | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/assets/css/app.css.scss b/assets/css/app.css.scss index e70efba..d565da2 100644 --- a/assets/css/app.css.scss +++ b/assets/css/app.css.scss @@ -7,37 +7,37 @@ $susy: ( gutter-position: split , ); -.debugger-view { @include container(90%); } +.debugger_view { @include container(90%); } .classes { @include span(3); } -.one-class { +.one_class { margin: 10px; } -.file-view { +.file_view { @include span(4); margin: span(1); } -.source-view { @include span(6); } +.source_view { @include span(6); } -.block-view { +.block_view { @include span(4); margin-right: span(2); height: 200px; } -.status-view { +.status_view { @include span(2 at 22); } -.registers-view { +.registers_view { @include span(20 at 3); } -.register-view { +.register_view { @include gallery(4); margin-top: 10px; } @@ -50,7 +50,7 @@ $susy: ( @include span(18) } -.value-head { +.value_head { background-color: #C5FFD9; } From 0e430e8b00ad76799d27ff615ba47627edb53104 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Thu, 20 Aug 2015 20:02:40 +0200 Subject: [PATCH 15/48] cleanup of class view --- lib/class_view.rb | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/lib/class_view.rb b/lib/class_view.rb index dbbeef2..e11c215 100644 --- a/lib/class_view.rb +++ b/lib/class_view.rb @@ -10,15 +10,6 @@ class ClassView < ElementView @classes.sort! {|a,b| a.name <=> b.name } end - def variables(clas_model) - layout = Virtual.machine.space.get_class_by_name(clas_model._name).object_layout - vars = [] - layout.object_instance_names.each do |name| - vars.push name - end - vars - end - def draw DOM do |dom| dom.div.classes do @@ -40,14 +31,5 @@ class ClassView < ElementView end end end - # {{ clas._name }} - # {{ unless variables(clas).empty? }} - #
    - # {{variables(clas).each do |var| }} - #
  • - # {{var}} - #
  • - # {{ end }} - #
end From 287277ef59ce43ac3443a91fa276ca401638b62b Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Thu, 20 Aug 2015 20:03:00 +0200 Subject: [PATCH 16/48] basic status view (without updates) --- lib/main_view.rb | 3 ++- lib/point.rb | 7 ------- lib/status_view.rb | 22 ++++++++++++++++++++++ 3 files changed, 24 insertions(+), 8 deletions(-) delete mode 100644 lib/point.rb create mode 100644 lib/status_view.rb diff --git a/lib/main_view.rb b/lib/main_view.rb index 71ce6d3..e0a1214 100644 --- a/lib/main_view.rb +++ b/lib/main_view.rb @@ -5,6 +5,7 @@ require "salama" require "interpreter/interpreter" require "list_view" require_relative "class_view" +require_relative "status_view" #require_relative "registers_view" #require_relative "object_view" #require_relative "space_view" @@ -26,7 +27,7 @@ class MainView < ListView machine.run_before "Register::CallImplementation" @interpreter = Interpreter::Interpreter.new - super( [ClassView.new(@interpreter)] ) + super( [ClassView.new(@interpreter) , StatusView.new(@interpreter)] ) end def draww diff --git a/lib/point.rb b/lib/point.rb deleted file mode 100644 index 12bfec7..0000000 --- a/lib/point.rb +++ /dev/null @@ -1,7 +0,0 @@ -class Point - def initialize x = 0 , y = 0 - @x = x - @y = y - end - attr_accessor :x , :y -end diff --git a/lib/status_view.rb b/lib/status_view.rb new file mode 100644 index 0000000..7d12bfc --- /dev/null +++ b/lib/status_view.rb @@ -0,0 +1,22 @@ +class StatusView < ElementView + + def initialize interpreter + @interpreter = interpreter + end + + def draw + DOM do |dom| + dom.div.status_view do + dom.h4 {"Interpreter"} + dom.span "Instruction #{@interpreter.clock}" + dom.button { "Next"} + dom.span "State #{@interpreter.state}" + dom.br{""} + dom.span{ "Link #{@interpreter.link}"} + dom.br{"Stdout"} + dom.span { @interpreter.stdout} + end + end + end + + end From 977156ba51fc45a04171c45da9bbb3c8b4f0aea2 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Fri, 21 Aug 2015 00:37:41 +0200 Subject: [PATCH 17/48] start on block view --- assets/css/app.css.scss | 2 +- lib/blocks_view.rb | 48 +++++++++++++++++++++++++++++++++++++++++ lib/file_view.rb | 12 +++++++++++ lib/instruction_view.rb | 38 ++++++++++++++++++++++++++++++++ lib/main_view.rb | 41 ++++++----------------------------- 5 files changed, 105 insertions(+), 36 deletions(-) create mode 100644 lib/blocks_view.rb create mode 100644 lib/file_view.rb create mode 100644 lib/instruction_view.rb diff --git a/assets/css/app.css.scss b/assets/css/app.css.scss index d565da2..6320205 100644 --- a/assets/css/app.css.scss +++ b/assets/css/app.css.scss @@ -18,7 +18,7 @@ $susy: ( } .file_view { @include span(4); - margin: span(1); + margin-left: span(1); } .source_view { @include span(6); } diff --git a/lib/blocks_view.rb b/lib/blocks_view.rb new file mode 100644 index 0000000..7c7718e --- /dev/null +++ b/lib/blocks_view.rb @@ -0,0 +1,48 @@ +class BlocksView < ElementView + + def initialize interpreter + @interpreter = interpreter + @interpreter.register_event(:instruction_changed, self) + end + + def draw + DOM do |dom| + dom.div.block_view do + dom.div do + dom.h4 { method_name } + dom.h4 {"Block:#{block_name}" } + end + blocks.each do |b| + dom.div do + dom.span do # class="{{b._class_name}}"> + b.name + end + end + end + end + end + end + + def blocks + return [] unless @interpreter.instruction + codes = @interpreter.block.codes.dup + slice = codes.index(@interpreter.instruction) #- 1 + codes.shift( slice ) if slice >= 0 + codes.pop while(codes.length > 4) + codes + end + + def instruction_changed + puts "Should have done something here to redraw (blocks)" + end + + def block_name + @interpreter.block ? @interpreter.block.name : "" + end + def method_name + bl = @interpreter.block + return "" unless bl + return bl.method if bl.method.is_a? String + "#{bl.method.for_class.name}.#{bl.method.name}" + end +end diff --git a/lib/file_view.rb b/lib/file_view.rb new file mode 100644 index 0000000..6497f72 --- /dev/null +++ b/lib/file_view.rb @@ -0,0 +1,12 @@ +class FileView < ElementView + + + def draw + DOM do |dom| + dom.div.file_view do + dom.h4 {"Future"} + end + end + end + +end diff --git a/lib/instruction_view.rb b/lib/instruction_view.rb new file mode 100644 index 0000000..952543a --- /dev/null +++ b/lib/instruction_view.rb @@ -0,0 +1,38 @@ +class InstructionView + + include React::Component + required_param :interpreter + required_param :instruction + + define_state :active => "" + + before_mount do + check_active interpreter.instruction + end + + def check_active i + active! instruction == i ? "bright" : "" + + end + def instruction_changed old , ins + check_active ins + end + + def render + div :class => active do + instruction.to_s if instruction + end + end +end + + +
+

Virtual Machine Instruction

+ {{page._sources.each do |source| }} +
+ + {{source._name}} + +
+ {{end}} +
diff --git a/lib/main_view.rb b/lib/main_view.rb index e0a1214..9ac198f 100644 --- a/lib/main_view.rb +++ b/lib/main_view.rb @@ -6,6 +6,8 @@ require "interpreter/interpreter" require "list_view" require_relative "class_view" require_relative "status_view" +require_relative "file_view" +require_relative "blocks_view" #require_relative "registers_view" #require_relative "object_view" #require_relative "space_view" @@ -27,41 +29,10 @@ class MainView < ListView machine.run_before "Register::CallImplementation" @interpreter = Interpreter::Interpreter.new - super( [ClassView.new(@interpreter) , StatusView.new(@interpreter)] ) - end - - def draww - node = DOM { |m| - Kernel.puts "DOM #{self.class}" - m.div.info { - Kernel.puts "div #{self.class}" ; "" - m.span.red @interpreter.state - } - } - node.append_to(@parent) - end - - def no - - body = Native(`window.document.body`) - # bit of a hack as it assumes index's structure - html_con = body.firstElementChild - html_con.insertBefore renderer.view , html_con.lastElementChild - - registers = RegisterView.new(height - 150) - @canvas.add_child registers - - space = SpaceView.new - @container.add_child space - - animate = Proc.new do - `requestAnimationFrame(animate)` - registers.draw_me - space.draw_me - renderer.render @container - end - animate.call - + super( [ClassView.new(@interpreter) , + FileView.new , + BlocksView.new(@interpreter) , + StatusView.new(@interpreter)] ) end end From 8b743fbcd5f35bdbc0c7e3a9a81e506ebccf70f4 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Fri, 21 Aug 2015 19:07:02 +0200 Subject: [PATCH 18/48] moving functionality in the base classes for all to share --- lib/element_view.rb | 29 +++++++++++++++++++++++++++++ lib/list_view.rb | 7 ++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/lib/element_view.rb b/lib/element_view.rb index ea068ad..dfe3629 100644 --- a/lib/element_view.rb +++ b/lib/element_view.rb @@ -7,4 +7,33 @@ class ElementView def draw raise "implement me to return an Element" end + + def create_element name_class + name , clazz = name_class.split(".") + name = "div" if name.empty? + element = $document.create_element(name) + return element unless clazz + if( clazz.is_a? Array ) + clazz.each { |c| add_class_or_id( element , cl )} + else + add_class_or_id element , clazz + end + element + end + + def add_class_or_id element , class_or_id + return element unless class_or_id + if class_or_id[-1] == "!" + element.id = class_or_id[0 ... -1] + else + element.add_class class_or_id + end + element + end + + def wrap_node_with node , wrapper + node.replace_with wrapper + node.append_to wrapper + end + end diff --git a/lib/list_view.rb b/lib/list_view.rb index 2795835..6b52540 100644 --- a/lib/list_view.rb +++ b/lib/list_view.rb @@ -8,8 +8,12 @@ class ListView < ElementView @container_element = nil end + def root + "div" + end + def draw on - @container_element = $document.create_element('div') + @container_element = create_element(self.root) @elements = @children.collect do | c | elem = c.draw(@container_element) elem.append_to(@container_element) @@ -17,4 +21,5 @@ class ListView < ElementView end @container_element end + end From c49c73bb3d75f1f7d9fb953db8debb7af2cbbade Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Fri, 21 Aug 2015 19:07:27 +0200 Subject: [PATCH 19/48] starting on register view, next up events --- lib/blocks_view.rb | 10 ++++++ lib/main_view.rb | 13 ++++--- lib/object_view.rb | 81 ++++++++++++++++++++++++++++--------------- lib/registers_view.rb | 59 +++++++++++++++++++++++-------- lib/value_view.rb | 16 +++++++++ 5 files changed, 131 insertions(+), 48 deletions(-) create mode 100644 lib/value_view.rb diff --git a/lib/blocks_view.rb b/lib/blocks_view.rb index 7c7718e..0cbe012 100644 --- a/lib/blocks_view.rb +++ b/lib/blocks_view.rb @@ -46,3 +46,13 @@ class BlocksView < ElementView "#{bl.method.for_class.name}.#{bl.method.name}" end end +class BlocksModel #< Volt::ArrayModel + + def instruction_changed old , ins + self.last._class_name = "inactive" if( self.length > 0) + self << { :name => ins.to_s , :class_name => "bright" } + #puts "block #{self.length}" + self.delete_at(0) if( self.length > 5) + end + +end diff --git a/lib/main_view.rb b/lib/main_view.rb index 9ac198f..109b291 100644 --- a/lib/main_view.rb +++ b/lib/main_view.rb @@ -8,9 +8,7 @@ require_relative "class_view" require_relative "status_view" require_relative "file_view" require_relative "blocks_view" -#require_relative "registers_view" -#require_relative "object_view" -#require_relative "space_view" +require_relative "registers_view" class MainView < ListView @@ -29,10 +27,11 @@ class MainView < ListView machine.run_before "Register::CallImplementation" @interpreter = Interpreter::Interpreter.new - super( [ClassView.new(@interpreter) , - FileView.new , - BlocksView.new(@interpreter) , - StatusView.new(@interpreter)] ) + super( [ClassView.new(@interpreter) , + FileView.new , + BlocksView.new(@interpreter) , + StatusView.new(@interpreter) , + RegistersView.new(@interpreter) ] ) end end diff --git a/lib/object_view.rb b/lib/object_view.rb index 41b3644..7a54ece 100644 --- a/lib/object_view.rb +++ b/lib/object_view.rb @@ -1,38 +1,65 @@ class ObjectView - attr_accessor :text , :object , :attributes - - def initialize o - super() - self.text = Text.new("no") - self.text.position = Point.new( rand(1000) , rand(550)) - puts "NO O " unless o - self.object = o - self.text.text = short - @attributes = {} + def initialize interpreter , object_id + @object_id = object_id + @interpreter = interpreter + @interpreter.register_event(:object_changed, self) end - def short - object.class.name.split("::").last[0 .. 3] + def draw + DOM do |dom| + dom.ul.nav! :sid => @object_id do + dom.li do + dom.span {class_header(@object_id)} + end + dom.li { "  -------------------------"} + content(@value).each do |con3| + dom.li do + dom.a(:href => "#") { con3[0]} + end + end + end + end end - def is_parfait - object.class.name.split("::").first == "Parfait" - end - def set name , val - @attributes[name] = val - self.text.text = short + @attributes.length.to_s - end - def get(name) - @attributes[name] - end - def position - #raise "NONAME" unless self.text - self.text.position + def object_changed reg + reg = reg.symbol unless reg.is_a? Symbol + return unless reg == register + puts "Object changed in #{reg}" + calc_fields end - def distance to - self.position - to.position + def marker id + var = Virtual.machine.objects[id] + if var.is_a? String + str "Wo" + else + str = var.class.name.split("::").last[0,2] + end + str + " : #{id.to_s}" + end + + def class_header(id) + object = Virtual.machine.objects[id] + return "" unless object + clazz = object.class.name.split("::").last + "#{clazz}:#{id}" + end + + def content(id) + object = Virtual.machine.objects[id] + fields = [] + if object and ! object.is_a?(String) + object.get_instance_variables.each do |variable| + f = object.get_instance_variable(variable) + fields << ["#{variable} : #{marker(f.object_id)}" , f.object_id] + end + end + fields + end + + def is_object?( id ) + Virtual.machine.objects[id] != nil end end diff --git a/lib/registers_view.rb b/lib/registers_view.rb index 092729b..98994df 100644 --- a/lib/registers_view.rb +++ b/lib/registers_view.rb @@ -1,21 +1,52 @@ +require_relative "object_view" +require_relative "value_view" -class RegisterView +class RegistersView < ListView - @@register_names = (0..8).collect {|i| "r#{i}"} - - def initialize at_y - super() - @registers = {} - x = 0 - @@register_names.each do |name| - reg = Text.new( name ) - reg.position = Point.new x , at_y - x += reg.width + 20 - @registers[name] = reg - self.add_child reg + def initialize interpreter + @interpreter = interpreter + @interpreter.register_event(:register_changed, self) + kids = [] + @interpreter.registers.each do |reg , val| + kids << ValueView.new( val ) end - def draw_me + super(kids) + end + def root + "div.registers_view" + end + + def draw + list = super() + list = list.children.each do |reg| + elem = create_element("div.register_view") + wrap_node_with reg , elem + end + @container_element + end + + def register_changed reg , old , value + reg = reg.symbol unless reg.is_a? Symbol + return unless reg == register + objects_id! value + calc_fields + end + + def calc_fields + #puts "My id #{objects_id} , #{objects_id.class}" + object = Virtual.machine.objects[value] + self.fields.clear + if object and ! object.is_a?(String) + clazz = object.class.name.split("::").last + #puts "found #{clazz}" + self.fields << "#{clazz}:#{object.internal_object_length}" + self.fields << object.get_layout + object.get_instance_variables.each do |variable| + f = object.get_instance_variable(variable) + self.fields << f + end end end + end diff --git a/lib/value_view.rb b/lib/value_view.rb new file mode 100644 index 0000000..ed913e8 --- /dev/null +++ b/lib/value_view.rb @@ -0,0 +1,16 @@ +class ValueView < ElementView + + def initialize value + @value = value + end + + def draw + DOM do |dom| + dom.ul.nav! do + dom.li do + dom.a( :href => "#" ) { @value } + end + end + end + end +end From 6925a3fefa51f06658bb84cb89fb2f25ec8e8a71 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Fri, 21 Aug 2015 20:05:49 +0200 Subject: [PATCH 20/48] bit of organizing --- lib/{ => base}/element_view.rb | 0 lib/{ => base}/list_view.rb | 2 +- lib/main_view.rb | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename lib/{ => base}/element_view.rb (100%) rename lib/{ => base}/list_view.rb (92%) diff --git a/lib/element_view.rb b/lib/base/element_view.rb similarity index 100% rename from lib/element_view.rb rename to lib/base/element_view.rb diff --git a/lib/list_view.rb b/lib/base/list_view.rb similarity index 92% rename from lib/list_view.rb rename to lib/base/list_view.rb index 6b52540..f7b10f7 100644 --- a/lib/list_view.rb +++ b/lib/base/list_view.rb @@ -1,4 +1,4 @@ -require "element_view" +require_relative "element_view" class ListView < ElementView diff --git a/lib/main_view.rb b/lib/main_view.rb index 109b291..982dbe5 100644 --- a/lib/main_view.rb +++ b/lib/main_view.rb @@ -3,7 +3,7 @@ require 'browser' require 'native' require "salama" require "interpreter/interpreter" -require "list_view" +require "base/list_view" require_relative "class_view" require_relative "status_view" require_relative "file_view" From b21ca406c856ac3614a4f46f3ce048e507b27c0a Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 01:05:35 +0200 Subject: [PATCH 21/48] rename create_element to div and create to create_element --- lib/base/element_view.rb | 12 +++++++++++- lib/base/list_view.rb | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/base/element_view.rb b/lib/base/element_view.rb index dfe3629..c6999cd 100644 --- a/lib/base/element_view.rb +++ b/lib/base/element_view.rb @@ -8,10 +8,11 @@ class ElementView raise "implement me to return an Element" end - def create_element name_class + def div name_class , text = nil name , clazz = name_class.split(".") name = "div" if name.empty? element = $document.create_element(name) + element.text = text if text return element unless clazz if( clazz.is_a? Array ) clazz.each { |c| add_class_or_id( element , cl )} @@ -36,4 +37,13 @@ class ElementView node.append_to wrapper end + def create_element class_or_id , text = nil + @element = div( class_or_id , text) + end + + def add class_or_id , tex = nil + element = div( class_or_id , tex) + element.append_to @element + element + end end diff --git a/lib/base/list_view.rb b/lib/base/list_view.rb index f7b10f7..6baedd9 100644 --- a/lib/base/list_view.rb +++ b/lib/base/list_view.rb @@ -13,7 +13,7 @@ class ListView < ElementView end def draw on - @container_element = create_element(self.root) + @container_element = div(self.root) @elements = @children.collect do | c | elem = c.draw(@container_element) elem.append_to(@container_element) From 15fd4ea7c67b6175579870ebd94f75003dbf6331 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 01:06:48 +0200 Subject: [PATCH 22/48] remove some DOM usage --- lib/class_view.rb | 15 ++++- lib/space_view.rb | 159 --------------------------------------------- lib/status_view.rb | 54 ++++++++++----- 3 files changed, 50 insertions(+), 178 deletions(-) delete mode 100644 lib/space_view.rb diff --git a/lib/class_view.rb b/lib/class_view.rb index e11c215..4255ba5 100644 --- a/lib/class_view.rb +++ b/lib/class_view.rb @@ -1,4 +1,4 @@ -class ClassView < ElementView +class ClassView < ListView def initialize interpreter @interpreter = interpreter @@ -11,6 +11,19 @@ class ClassView < ElementView end def draw + create_element(".classes") << div("h4" , "Classes") + list = add("ul.nav!") + + @classes.each do |cl| + list << (div("li") << + (div( "a" , cl.name ) << + (ul = div("ul")))) + cl.object_layout.object_instance_names.each do |name| + ul << (div("li") << div("a", name )) + end + end + return @element + DOM do |dom| dom.div.classes do dom.h4 {"Classes"} diff --git a/lib/space_view.rb b/lib/space_view.rb deleted file mode 100644 index e77b417..0000000 --- a/lib/space_view.rb +++ /dev/null @@ -1,159 +0,0 @@ - -require "math" - -Point.class_eval do - alias_native :y= - - def add point - self.x += point.x - self.x = 0 if self.x < 0 - self.x = 1100 if self.x > 1100 - self.y += point.y - self.y = 0 if self.y < 0 - self.y = 550 if self.y > 550 - end - - def scale_by num - min = 0.001 - num = min if num <= min - self.x = self.x / num - self.y = self.y / num - end -end - -class SpaceView - include Sof::Util - - def initialize - super() - space = Virtual.machine.space - # just a way to get the space into a list. objects is an id => occurence mapping. - # occurence.object is the object - objects = Sof::Members.new(space).objects - @objects = objects - puts "Objects #{objects.length}" - # create a mapping from id to volt models - @view_objects = {} - - @objects.each do |i , o| - next unless o.object - view = ObjectView.new o.object - @view_objects[i] = view - add_child view.text - end - fill_attributes - end - - # should almost be called draw by now - def draw_me - update_positions - self.clear - @view_objects.each do |i , view| - self.lineStyle(4, 0xffd900, 2) - puts "v" if view.nil? - view.attributes.each do |n , v | - next if n == :id - next unless v.is_a? ObjectView - next unless v.is_parfait - puts "v2" if view.nil? - puts "0" if v.nil? - self.moveTo( view.position.x , view.position.y ) - self.lineTo( v.position.x , v.position.y ) - end - end - end - - def force from , to - dir_x = from.x - to.x - 100 - dir_x2 = dir_x * dir_x - dir_y = from.y - to.y - 100 - dir_y2 = dir_y * dir_y - if( dir_x2 < 0.1 and dir_y2 < 0.1 ) - puts "Were close" - dir_x = rand(10) - 5 - dir_y = rand(10) - 5 - end - f = dir_x * dir_x + dir_y * dir_y - f = 0.01 if f < 0.01 - f = f / 100 - #puts "force #{f}" - Point.new( dir_x / f , dir_y / f) - end - - def update_positions - @view_objects.each do |i , view| - view.attributes.each do |n , v | - next if n == :id - next unless v.is_a? ObjectView - next unless v.is_parfait - puts "v2" if view.nil? - puts "0" if v.nil? - view.position.add force( view.position , v.position ) - end - offset = 0.0 - view.position.add force( view.position , Point.new(view.position.x , -offset) ) - view.position.add force( view.position , Point.new(-offset , view.position.y) ) - view.position.add force( view.position , Point.new(view.position.x , 550 + offset) ) - view.position.add force( view.position , Point.new(1000 + offset , view.position.y) ) - end - end - - def fill_attributes - @view_objects.each do |i , view| - ob = view.object - next if is_value?(ob) - case ob.class.name - when "Array" , "Parfait::List" - fill_array view - when "Hash" , "Parfait::Dictionary" - fill_hash view - else - next if ob.class.name.include?("::") and !ob.class.name.include?("Parfait") - next if ob.class.name == "Proc" - next if ob.class.name == "String" - next if ob.class.name == "Numeric" - next if ob.class.name == "Class" - #puts "object #{ob.class.name}" - - attributes = attributes_for(ob) - attributes.each do |a| - next if a == "html_safe" - next if a == "constructor" - next if a == "toString" - next if a == "position" - val = get_value( ob , a) - if( @view_objects[val.object_id]) - val = @view_objects[val.object_id] - end - #puts "set #{a}" - view.set(a , val ) - end - superclasses = [ob.class.superclass.name] - if superclasses.include?( "Array") or superclasses.include?( "Parfait::List") - fill_array view - end - if superclasses.include?( "Hash") or superclasses.include?( "Parfait::Dictionary") - fill_hash view - end - end - end - end - - # and hash keys/values - def fill_hash hash - return - hash.each do |a,b| - next_level << a - next_level << b - end - end - # and array values - def fill_array array - return - array.each do |a| - next_level << a - end - end - - -end diff --git a/lib/status_view.rb b/lib/status_view.rb index 7d12bfc..8e3ea7d 100644 --- a/lib/status_view.rb +++ b/lib/status_view.rb @@ -1,22 +1,40 @@ class StatusView < ElementView - def initialize interpreter - @interpreter = interpreter - end + def initialize interpreter + @interpreter = interpreter + end - def draw - DOM do |dom| - dom.div.status_view do - dom.h4 {"Interpreter"} - dom.span "Instruction #{@interpreter.clock}" - dom.button { "Next"} - dom.span "State #{@interpreter.state}" - dom.br{""} - dom.span{ "Link #{@interpreter.link}"} - dom.br{"Stdout"} - dom.span { @interpreter.stdout} - end - end - end + def draw + create_element(".status_view") << + div("h4.tick" , "Interpreter" ) << + div("span" , tick_text) << + div("button.act" , "Next") << + div( "br") << + div("span.state" , state_text) << + div( "br") << + div( "span.link" , link_text) << + div( "br" , "Stdout") << + div("span.stdout") + # set up event handler + @element.at_css(".act").on("click") { @interpreter.tick } + return @element + end - end + def update + @element.at_css(".tick").text = tick_text + @link.at_css(".link").text = link_text + @stdout.at_css(".stdout").text = @interpreter.stdout + end + + def link_text + "Link #{@interpreter.link}" + end + + def state_text + "State #{@interpreter.state}" + end + + def tick_text + "Instruction #{@interpreter.clock}" + end +end From 5f2f35cbcf39d384db4fea356dc25bf15d4eb684 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 01:35:21 +0200 Subject: [PATCH 23/48] debug by environment (stop endless editing) --- config.ru | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.ru b/config.ru index 96da32b..7201a1f 100644 --- a/config.ru +++ b/config.ru @@ -24,7 +24,7 @@ run DebugServer.new { |s| s.append_path 'lib' s.append_path 'assets' # s.source_map = true - s.debug = false + s.debug = !ENV["DEBUG"].nil? s.index_path = "index.html.erb" s.sprockets.cache = Sprockets::Cache::MemoryStore.new(5000) From 0d4813df132fdd79999b1f41c05641691646f1aa Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 01:36:11 +0200 Subject: [PATCH 24/48] added separate class view and made classes view a listview --- lib/base/element_view.rb | 16 +++++++++---- lib/class_view.rb | 50 +++++++--------------------------------- lib/classes_view.rb | 43 ++++++++++++++++++++++++++++++++++ lib/main_view.rb | 4 ++-- 4 files changed, 64 insertions(+), 49 deletions(-) create mode 100644 lib/classes_view.rb diff --git a/lib/base/element_view.rb b/lib/base/element_view.rb index c6999cd..5954939 100644 --- a/lib/base/element_view.rb +++ b/lib/base/element_view.rb @@ -32,13 +32,19 @@ class ElementView element end - def wrap_node_with node , wrapper - node.replace_with wrapper - node.append_to wrapper + # wrap the @element variable with the given element + # so if wrapper ==

the new @element will be

old @element

+ # return the new @element, which is wrapper + def wrap_element wrapper + @element = wrap_node_with @element , wrapper end - def create_element class_or_id , text = nil - @element = div( class_or_id , text) + #wrap the given node with the wappper, so for a div wrapper and a button node + # the result will be
+ def wrap_node_with node , wrapper + puts "wraps parent #{node.parent}" + node.replace_with(wrapper) if node.parent + wrapper << node end def add class_or_id , tex = nil diff --git a/lib/class_view.rb b/lib/class_view.rb index 4255ba5..e7dc45d 100644 --- a/lib/class_view.rb +++ b/lib/class_view.rb @@ -1,48 +1,14 @@ -class ClassView < ListView - - def initialize interpreter - @interpreter = interpreter - @classes = [] - Virtual.machine.space.classes.each do |name , claz| - next if [:Kernel,:Module,:MetaClass,:BinaryCode].index name - @classes << claz - end - @classes.sort! {|a,b| a.name <=> b.name } +class ClassView < ElementView + def initialize clazz + @clazz = clazz end def draw - create_element(".classes") << div("h4" , "Classes") - list = add("ul.nav!") - - @classes.each do |cl| - list << (div("li") << - (div( "a" , cl.name ) << - (ul = div("ul")))) - cl.object_layout.object_instance_names.each do |name| - ul << (div("li") << div("a", name )) - end - end - return @element - - DOM do |dom| - dom.div.classes do - dom.h4 {"Classes"} - dom.ul.nav! do - @classes.each do |cl| - dom.li do - dom.a { cl.name } - dom.ul do - cl.object_layout.object_instance_names.each do |name| - dom.li do - dom.a{ name } - end - end - end - end - end - end - end + @element = div("li") + add( "a" , @clazz.name ) << (ul = div("ul")) + @clazz.object_layout.object_instance_names.each do |name| + ul << (div("li") << div("a", name )) end + @element end - end diff --git a/lib/classes_view.rb b/lib/classes_view.rb new file mode 100644 index 0000000..f7d9cbc --- /dev/null +++ b/lib/classes_view.rb @@ -0,0 +1,43 @@ +require_relative "class_view" + +class ClassesView < ListView + + def initialize interpreter + @interpreter = interpreter + classes = [] + Virtual.machine.space.classes.each do |name , claz| + next if [:Kernel,:Module,:MetaClass,:BinaryCode].index name + classes << claz + end + classes.sort! {|a,b| a.name <=> b.name } + super( classes.collect{|c| ClassView.new(c)}) + end + + def draw + super() + wrap_element div("ul.nav!") + wrap_element( div(".classes") << div("h4" , "Classes") ) + return @element + + DOM do |dom| + dom.div.classes do + dom.h4 {"Classes"} + dom.ul.nav! do + @classes.each do |cl| + dom.li do + dom.a { cl.name } + dom.ul do + cl.object_layout.object_instance_names.each do |name| + dom.li do + dom.a{ name } + end + end + end + end + end + end + end + end + end + +end diff --git a/lib/main_view.rb b/lib/main_view.rb index 982dbe5..c0d54f0 100644 --- a/lib/main_view.rb +++ b/lib/main_view.rb @@ -4,7 +4,7 @@ require 'native' require "salama" require "interpreter/interpreter" require "base/list_view" -require_relative "class_view" +require_relative "classes_view" require_relative "status_view" require_relative "file_view" require_relative "blocks_view" @@ -27,7 +27,7 @@ class MainView < ListView machine.run_before "Register::CallImplementation" @interpreter = Interpreter::Interpreter.new - super( [ClassView.new(@interpreter) , + super( [ClassesView.new(@interpreter) , FileView.new , BlocksView.new(@interpreter) , StatusView.new(@interpreter) , From 3fa685a0bb2f4e4838b95b73db309fe584e634ce Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 01:37:15 +0200 Subject: [PATCH 25/48] assign @element explicitly (remove create_element) --- lib/base/list_view.rb | 9 ++++----- lib/registers_view.rb | 4 ++-- lib/status_view.rb | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/lib/base/list_view.rb b/lib/base/list_view.rb index 6baedd9..3c99acc 100644 --- a/lib/base/list_view.rb +++ b/lib/base/list_view.rb @@ -5,7 +5,6 @@ class ListView < ElementView def initialize children @children = children @elements = [] - @container_element = nil end def root @@ -13,13 +12,13 @@ class ListView < ElementView end def draw on - @container_element = div(self.root) + @element = div(self.root) @elements = @children.collect do | c | - elem = c.draw(@container_element) - elem.append_to(@container_element) + elem = c.draw(@element) + elem.append_to(@element) elem end - @container_element + @element end end diff --git a/lib/registers_view.rb b/lib/registers_view.rb index 98994df..94410c5 100644 --- a/lib/registers_view.rb +++ b/lib/registers_view.rb @@ -20,10 +20,10 @@ class RegistersView < ListView def draw list = super() list = list.children.each do |reg| - elem = create_element("div.register_view") + elem = div("div.register_view") wrap_node_with reg , elem end - @container_element + @element end def register_changed reg , old , value diff --git a/lib/status_view.rb b/lib/status_view.rb index 8e3ea7d..e2c73c7 100644 --- a/lib/status_view.rb +++ b/lib/status_view.rb @@ -5,7 +5,7 @@ class StatusView < ElementView end def draw - create_element(".status_view") << + @element = div(".status_view") << div("h4.tick" , "Interpreter" ) << div("span" , tick_text) << div("button.act" , "Next") << From ed2a054ca621f6d7e9f4324605fb4991b5eca52c Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 01:59:29 +0200 Subject: [PATCH 26/48] starting interpreter and getting ticks going (slowly) --- lib/base/element_view.rb | 1 - lib/blocks_view.rb | 2 +- lib/main_view.rb | 1 + lib/status_view.rb | 15 ++++++++------- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/base/element_view.rb b/lib/base/element_view.rb index 5954939..c3cfc2e 100644 --- a/lib/base/element_view.rb +++ b/lib/base/element_view.rb @@ -42,7 +42,6 @@ class ElementView #wrap the given node with the wappper, so for a div wrapper and a button node # the result will be
def wrap_node_with node , wrapper - puts "wraps parent #{node.parent}" node.replace_with(wrapper) if node.parent wrapper << node end diff --git a/lib/blocks_view.rb b/lib/blocks_view.rb index 0cbe012..31a2927 100644 --- a/lib/blocks_view.rb +++ b/lib/blocks_view.rb @@ -15,7 +15,7 @@ class BlocksView < ElementView blocks.each do |b| dom.div do dom.span do # class="{{b._class_name}}"> - b.name + b.class.name end end end diff --git a/lib/main_view.rb b/lib/main_view.rb index c0d54f0..c50ba14 100644 --- a/lib/main_view.rb +++ b/lib/main_view.rb @@ -27,6 +27,7 @@ class MainView < ListView machine.run_before "Register::CallImplementation" @interpreter = Interpreter::Interpreter.new + @interpreter.start machine.init super( [ClassesView.new(@interpreter) , FileView.new , BlocksView.new(@interpreter) , diff --git a/lib/status_view.rb b/lib/status_view.rb index e2c73c7..1fe53e3 100644 --- a/lib/status_view.rb +++ b/lib/status_view.rb @@ -6,8 +6,8 @@ class StatusView < ElementView def draw @element = div(".status_view") << - div("h4.tick" , "Interpreter" ) << - div("span" , tick_text) << + div("h4" , "Interpreter" ) << + div("span.clock" , clock_text) << div("button.act" , "Next") << div( "br") << div("span.state" , state_text) << @@ -16,14 +16,15 @@ class StatusView < ElementView div( "br" , "Stdout") << div("span.stdout") # set up event handler - @element.at_css(".act").on("click") { @interpreter.tick } + @element.at_css(".act").on("click") { self.update } return @element end def update - @element.at_css(".tick").text = tick_text - @link.at_css(".link").text = link_text - @stdout.at_css(".stdout").text = @interpreter.stdout + @interpreter.tick + @element.at_css(".clock").text = clock_text + @element.at_css(".link").text = link_text + @element.at_css(".stdout").text = @interpreter.stdout end def link_text @@ -34,7 +35,7 @@ class StatusView < ElementView "State #{@interpreter.state}" end - def tick_text + def clock_text "Instruction #{@interpreter.clock}" end end From 68f67eda54b4348d8a81bbcd6fdf9fe06684ec77 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 02:23:53 +0200 Subject: [PATCH 27/48] registers ticking, but objects not showing --- lib/base/constant_view.rb | 14 ++++++++++++++ lib/base/element_view.rb | 28 ++++++++++++++++++++++++---- lib/base/list_view.rb | 21 +++++++++++++++++---- lib/object_view.rb | 3 --- lib/registers_view.rb | 18 +++++++++++++----- 5 files changed, 68 insertions(+), 16 deletions(-) create mode 100644 lib/base/constant_view.rb diff --git a/lib/base/constant_view.rb b/lib/base/constant_view.rb new file mode 100644 index 0000000..a8ac538 --- /dev/null +++ b/lib/base/constant_view.rb @@ -0,0 +1,14 @@ +require_relative "element_view" + +class ConstantView < ElementView + + def initialize class_or_id , text = nil + @class_or_id = class_or_id + @text = text + end + + def draw + @element = div(@class_or_id , @text) + end + +end diff --git a/lib/base/element_view.rb b/lib/base/element_view.rb index c3cfc2e..48ac2d2 100644 --- a/lib/base/element_view.rb +++ b/lib/base/element_view.rb @@ -4,10 +4,20 @@ class ElementView @element = nil end + #abstract function that should return the single element that is being represented + # the element is also stored in @element def draw raise "implement me to return an Element" end + # helper function to create an element with possible classes, id and text + # The first argument is a bit haml inspired, so "tagname.classname" is the format + # but if tagname is ommited it will default to div + # also several classnames may be given + # if one of the names ends in a ! (bang) it will be assigned as the id + # second argument is optional, but if given will be added as text (content) to the newly + # created Element + # return the new Element, which is not linked into the dom at that point (see << and add*) def div name_class , text = nil name , clazz = name_class.split(".") name = "div" if name.empty? @@ -46,9 +56,19 @@ class ElementView wrapper << node end - def add class_or_id , tex = nil - element = div( class_or_id , tex) - element.append_to @element - element + # add the given element the @element + # return the div that was passed in (use << to return the @element) + def add_element div + div.append_to @element + div end + + # create a new element with class and possibly text + # add that new element to the @element + # return the newly created element + def add class_or_id , tex = nil + add_element div( class_or_id , tex) + end + + end diff --git a/lib/base/list_view.rb b/lib/base/list_view.rb index 3c99acc..9dd3c76 100644 --- a/lib/base/list_view.rb +++ b/lib/base/list_view.rb @@ -7,18 +7,31 @@ class ListView < ElementView @elements = [] end + # can be overriden to return a string that will be passed to div to create the root + # element for the list. See "div" in ElementView for possible strings def root "div" end - def draw on + # create a root node acording to the "root" function (default div) + # draw all chilren and keep the elements as @elements + # return (as per base class) the single root of the collection + def draw @element = div(self.root) @elements = @children.collect do | c | - elem = c.draw(@element) - elem.append_to(@element) - elem + add_element c.draw end @element end + # replace the child at index with the given one (second arg) + # The child must be an ElementView , which will be rendered and + # the old node will be replaces in the live dom + def replace_at index , with + old = @elements[index] + @chilren[index] = with + rendered = with.draw + @elements[index] = rendered + old.replace_with rendered + end end diff --git a/lib/object_view.rb b/lib/object_view.rb index 7a54ece..c474586 100644 --- a/lib/object_view.rb +++ b/lib/object_view.rb @@ -59,7 +59,4 @@ class ObjectView fields end - def is_object?( id ) - Virtual.machine.objects[id] != nil - end end diff --git a/lib/registers_view.rb b/lib/registers_view.rb index 94410c5..360a450 100644 --- a/lib/registers_view.rb +++ b/lib/registers_view.rb @@ -18,8 +18,8 @@ class RegistersView < ListView end def draw - list = super() - list = list.children.each do |reg| + super() + @element.children.each do |reg| elem = div("div.register_view") wrap_node_with reg , elem end @@ -28,9 +28,17 @@ class RegistersView < ListView def register_changed reg , old , value reg = reg.symbol unless reg.is_a? Symbol - return unless reg == register - objects_id! value - calc_fields + index = reg.to_s[1 .. -1 ].to_i + if( is_object? value ) + swap = ObjectView.new( value ) + else + swap = ValueView.new value + end + replace_at index , swap + end + + def is_object?( id ) + Virtual.machine.objects[id] != nil end def calc_fields From cf1d32e520231a853c7aabd63e451d6dd7bb7c77 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 02:40:19 +0200 Subject: [PATCH 28/48] objects back on screen, not updating yet --- lib/base/list_view.rb | 2 +- lib/object_view.rb | 12 +++++++----- lib/registers_view.rb | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/base/list_view.rb b/lib/base/list_view.rb index 9dd3c76..d05d54e 100644 --- a/lib/base/list_view.rb +++ b/lib/base/list_view.rb @@ -29,7 +29,7 @@ class ListView < ElementView # the old node will be replaces in the live dom def replace_at index , with old = @elements[index] - @chilren[index] = with + @children[index] = with rendered = with.draw @elements[index] = rendered old.replace_with rendered diff --git a/lib/object_view.rb b/lib/object_view.rb index c474586..1cf93a1 100644 --- a/lib/object_view.rb +++ b/lib/object_view.rb @@ -1,5 +1,5 @@ -class ObjectView +class ObjectView < ElementView def initialize interpreter , object_id @object_id = object_id @@ -8,13 +8,14 @@ class ObjectView end def draw + # todo, remove the DOM use DOM do |dom| - dom.ul.nav! :sid => @object_id do + dom.ul.nav! do # :sid => @object_id dom.li do dom.span {class_header(@object_id)} end dom.li { "  -------------------------"} - content(@value).each do |con3| + content(@object_id).each do |con3| dom.li do dom.a(:href => "#") { con3[0]} end @@ -24,9 +25,10 @@ class ObjectView end def object_changed reg - reg = reg.symbol unless reg.is_a? Symbol - return unless reg == register puts "Object changed in #{reg}" + for_object = @interpreter.get_register( reg ) + return unless for_object == @object_id + puts "Object changed #{for_object}" calc_fields end diff --git a/lib/registers_view.rb b/lib/registers_view.rb index 360a450..7c89c2e 100644 --- a/lib/registers_view.rb +++ b/lib/registers_view.rb @@ -30,7 +30,7 @@ class RegistersView < ListView reg = reg.symbol unless reg.is_a? Symbol index = reg.to_s[1 .. -1 ].to_i if( is_object? value ) - swap = ObjectView.new( value ) + swap = ObjectView.new( @interpreter, value ) else swap = ValueView.new value end From 1ad5681827c6a3efa52ae7241c400f96e754aeb7 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 17:19:07 +0200 Subject: [PATCH 29/48] remove DOM usage from object --- lib/object_view.rb | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/lib/object_view.rb b/lib/object_view.rb index 1cf93a1..a51278e 100644 --- a/lib/object_view.rb +++ b/lib/object_view.rb @@ -9,19 +9,13 @@ class ObjectView < ElementView def draw # todo, remove the DOM use - DOM do |dom| - dom.ul.nav! do # :sid => @object_id - dom.li do - dom.span {class_header(@object_id)} - end - dom.li { "  -------------------------"} - content(@object_id).each do |con3| - dom.li do - dom.a(:href => "#") { con3[0]} - end - end - end + @element = div("ul.nav!") + add( "li" ) << div("span" , class_header(@object_id) ) + @element << div("li" , "-------------------------") + content(@object_id).each do |con3| + add("li") << div("a" , con3[0]) end + return @element end def object_changed reg From b43bffc94077c2069897b2c39d234a5fba18eac2 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 17:30:27 +0200 Subject: [PATCH 30/48] remove DOM usage from blocks, make it list view --- lib/blocks_view.rb | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/lib/blocks_view.rb b/lib/blocks_view.rb index 31a2927..e80c17e 100644 --- a/lib/blocks_view.rb +++ b/lib/blocks_view.rb @@ -1,26 +1,18 @@ -class BlocksView < ElementView +#require_relative "block_view" +require_relative "base/constant_view" + +class BlocksView < ListView def initialize interpreter @interpreter = interpreter @interpreter.register_event(:instruction_changed, self) + super([ConstantView.new("div" , "Block name1") , ConstantView.new("div" , "Block name2")]) end def draw - DOM do |dom| - dom.div.block_view do - dom.div do - dom.h4 { method_name } - dom.h4 {"Block:#{block_name}" } - end - blocks.each do |b| - dom.div do - dom.span do # class="{{b._class_name}}"> - b.class.name - end - end - end - end - end + super() + wrap_element div("div.block_view") << div("h4" , "Method #{method_name}") << div("h4" , "Block:#{block_name}" ) + return @element end def blocks From b8a0e5f8a371594db50174ffd47445f7323fe6c9 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 18:37:42 +0200 Subject: [PATCH 31/48] fix blocks to change --- lib/base/list_view.rb | 9 ++++++++- lib/block_view.rb | 12 ++++++++++++ lib/blocks_view.rb | 35 ++++++++++++----------------------- lib/object_view.rb | 1 - 4 files changed, 32 insertions(+), 25 deletions(-) create mode 100644 lib/block_view.rb diff --git a/lib/base/list_view.rb b/lib/base/list_view.rb index d05d54e..41c272a 100644 --- a/lib/base/list_view.rb +++ b/lib/base/list_view.rb @@ -14,7 +14,7 @@ class ListView < ElementView end # create a root node acording to the "root" function (default div) - # draw all chilren and keep the elements as @elements + # draw all children and keep the elements as @elements # return (as per base class) the single root of the collection def draw @element = div(self.root) @@ -34,4 +34,11 @@ class ListView < ElementView @elements[index] = rendered old.replace_with rendered end + + def append view + @children << view + rendered = view.draw + @elements << rendered + @element << rendered + end end diff --git a/lib/block_view.rb b/lib/block_view.rb new file mode 100644 index 0000000..15bbd10 --- /dev/null +++ b/lib/block_view.rb @@ -0,0 +1,12 @@ +class BlockView < ElementView + + def initialize block + @block = block + end + attr_reader :block + + def draw + @element = div("div") << div("span.bright" , @block.name ) + end + +end diff --git a/lib/blocks_view.rb b/lib/blocks_view.rb index e80c17e..5b5fb6e 100644 --- a/lib/blocks_view.rb +++ b/lib/blocks_view.rb @@ -1,36 +1,35 @@ -#require_relative "block_view" -require_relative "base/constant_view" +require_relative "block_view" class BlocksView < ListView def initialize interpreter @interpreter = interpreter @interpreter.register_event(:instruction_changed, self) - super([ConstantView.new("div" , "Block name1") , ConstantView.new("div" , "Block name2")]) + super([BlockView.new(@interpreter.block)]) end def draw super() - wrap_element div("div.block_view") << div("h4" , "Method #{method_name}") << div("h4" , "Block:#{block_name}" ) + wrap_element div("div.block_view") << div("h4" , "Method #{method_name}") << div("h4" , "Block" ) return @element end - def blocks - return [] unless @interpreter.instruction - codes = @interpreter.block.codes.dup - slice = codes.index(@interpreter.instruction) #- 1 - codes.shift( slice ) if slice >= 0 - codes.pop while(codes.length > 4) - codes + def instruction_changed + return if @interpreter.block.name == active_block_name + puts "blocks changed to #{@interpreter.block.name}" + @elements.last.at_css(".bright").remove_class("bright") + append( BlockView.new(@interpreter.block) ) + remove_first if( @elements.length > 5) end - def instruction_changed - puts "Should have done something here to redraw (blocks)" + def active_block_name + @children.last.block.name end def block_name @interpreter.block ? @interpreter.block.name : "" end + def method_name bl = @interpreter.block return "" unless bl @@ -38,13 +37,3 @@ class BlocksView < ListView "#{bl.method.for_class.name}.#{bl.method.name}" end end -class BlocksModel #< Volt::ArrayModel - - def instruction_changed old , ins - self.last._class_name = "inactive" if( self.length > 0) - self << { :name => ins.to_s , :class_name => "bright" } - #puts "block #{self.length}" - self.delete_at(0) if( self.length > 5) - end - -end diff --git a/lib/object_view.rb b/lib/object_view.rb index a51278e..9a79b5d 100644 --- a/lib/object_view.rb +++ b/lib/object_view.rb @@ -8,7 +8,6 @@ class ObjectView < ElementView end def draw - # todo, remove the DOM use @element = div("ul.nav!") add( "li" ) << div("span" , class_header(@object_id) ) @element << div("li" , "-------------------------") From caa1da342c8911997c3e926429f1c8b5de75a029 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 19:28:09 +0200 Subject: [PATCH 32/48] remove the root function (pass to super now) --- lib/base/list_view.rb | 13 ++++--------- lib/blocks_view.rb | 1 - lib/registers_view.rb | 6 +----- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/lib/base/list_view.rb b/lib/base/list_view.rb index 41c272a..515ff8b 100644 --- a/lib/base/list_view.rb +++ b/lib/base/list_view.rb @@ -7,17 +7,12 @@ class ListView < ElementView @elements = [] end - # can be overriden to return a string that will be passed to div to create the root - # element for the list. See "div" in ElementView for possible strings - def root - "div" - end - - # create a root node acording to the "root" function (default div) + # create a root node acording to the tag given (default div) + # The tag name will be passed to the div function, so class and id may be set as well (see there) # draw all children and keep the elements as @elements # return (as per base class) the single root of the collection - def draw - @element = div(self.root) + def draw root = "div" + @element = div(root) @elements = @children.collect do | c | add_element c.draw end diff --git a/lib/blocks_view.rb b/lib/blocks_view.rb index 5b5fb6e..5c8e6f7 100644 --- a/lib/blocks_view.rb +++ b/lib/blocks_view.rb @@ -16,7 +16,6 @@ class BlocksView < ListView def instruction_changed return if @interpreter.block.name == active_block_name - puts "blocks changed to #{@interpreter.block.name}" @elements.last.at_css(".bright").remove_class("bright") append( BlockView.new(@interpreter.block) ) remove_first if( @elements.length > 5) diff --git a/lib/registers_view.rb b/lib/registers_view.rb index 7c89c2e..3387d79 100644 --- a/lib/registers_view.rb +++ b/lib/registers_view.rb @@ -13,12 +13,8 @@ class RegistersView < ListView super(kids) end - def root - "div.registers_view" - end - def draw - super() + super( "div.registers_view" ) @element.children.each do |reg| elem = div("div.register_view") wrap_node_with reg , elem From 7885ae93c45576c33b2f012e66434459a2cc6b7a Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 20:11:33 +0200 Subject: [PATCH 33/48] redo object view as list, introduce ref view --- lib/base/element_view.rb | 15 +++++++++++---- lib/base/list_view.rb | 2 +- lib/object_view.rb | 36 ++++++++++++------------------------ lib/ref_view.rb | 24 ++++++++++++++++++++++++ lib/value_view.rb | 2 +- 5 files changed, 49 insertions(+), 30 deletions(-) create mode 100644 lib/ref_view.rb diff --git a/lib/base/element_view.rb b/lib/base/element_view.rb index 48ac2d2..d278c06 100644 --- a/lib/base/element_view.rb +++ b/lib/base/element_view.rb @@ -56,10 +56,17 @@ class ElementView wrapper << node end - # add the given element the @element + # add the given element to the @element, at the end # return the div that was passed in (use << to return the @element) - def add_element div - div.append_to @element + def append_element div + @element << div + div + end + + # add the given element to the @element , at the front + # return the div that was passed in (use >> to return the @element) + def prepend_element div + @element >> div div end @@ -67,7 +74,7 @@ class ElementView # add that new element to the @element # return the newly created element def add class_or_id , tex = nil - add_element div( class_or_id , tex) + append_element div( class_or_id , tex) end diff --git a/lib/base/list_view.rb b/lib/base/list_view.rb index 515ff8b..2b535b9 100644 --- a/lib/base/list_view.rb +++ b/lib/base/list_view.rb @@ -14,7 +14,7 @@ class ListView < ElementView def draw root = "div" @element = div(root) @elements = @children.collect do | c | - add_element c.draw + append_element c.draw end @element end diff --git a/lib/object_view.rb b/lib/object_view.rb index 9a79b5d..aa44dc0 100644 --- a/lib/object_view.rb +++ b/lib/object_view.rb @@ -1,54 +1,42 @@ +require_relative "ref_view" -class ObjectView < ElementView +class ObjectView < ListView def initialize interpreter , object_id @object_id = object_id @interpreter = interpreter @interpreter.register_event(:object_changed, self) + super( content_elements ) end def draw - @element = div("ul.nav!") - add( "li" ) << div("span" , class_header(@object_id) ) - @element << div("li" , "-------------------------") - content(@object_id).each do |con3| - add("li") << div("a" , con3[0]) - end + @element = super("ul.nav!") + prepend_element div("li" , "-------------------------") + prepend_element div( "li" ) << div("span" , class_header(@object_id) ) return @element end - def object_changed reg + def object_changed reg , at puts "Object changed in #{reg}" for_object = @interpreter.get_register( reg ) return unless for_object == @object_id - puts "Object changed #{for_object}" - calc_fields - end + puts "Object changed #{for_object} , at #{at}" - def marker id - var = Virtual.machine.objects[id] - if var.is_a? String - str "Wo" - else - str = var.class.name.split("::").last[0,2] - end - str + " : #{id.to_s}" end def class_header(id) object = Virtual.machine.objects[id] - return "" unless object clazz = object.class.name.split("::").last - "#{clazz}:#{id}" + [clazz, id].join " : " end - def content(id) - object = Virtual.machine.objects[id] + def content_elements + object = Virtual.machine.objects[@object_id] fields = [] if object and ! object.is_a?(String) object.get_instance_variables.each do |variable| f = object.get_instance_variable(variable) - fields << ["#{variable} : #{marker(f.object_id)}" , f.object_id] + fields << RefView.new( variable , f.object_id ) end end fields diff --git a/lib/ref_view.rb b/lib/ref_view.rb new file mode 100644 index 0000000..c137dce --- /dev/null +++ b/lib/ref_view.rb @@ -0,0 +1,24 @@ +class RefView < ElementView + + def initialize name , value + @name = name + @value = value + end + + attr_accessor :value + + def draw + @element = div("li") << div("a" , "#{@name} : #{marker(@value)}" ) + end + + def marker id + var = Virtual.machine.objects[id] + if var.is_a? String + str "Wo" + else + str = var.class.name.split("::").last[0,2] + end + str + " : #{id.to_s}" + end + +end diff --git a/lib/value_view.rb b/lib/value_view.rb index ed913e8..ebd2571 100644 --- a/lib/value_view.rb +++ b/lib/value_view.rb @@ -8,7 +8,7 @@ class ValueView < ElementView DOM do |dom| dom.ul.nav! do dom.li do - dom.a( :href => "#" ) { @value } + dom.span( :href => "#" ) { @value } end end end From 83e0c8a925d997b8b51312bbacf14163a5c16122 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sat, 22 Aug 2015 21:17:32 +0200 Subject: [PATCH 34/48] now very simple to get expanding objects --- lib/object_view.rb | 6 +++--- lib/ref_view.rb | 28 +++++++++++++++++++++++++--- lib/registers_view.rb | 2 +- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/lib/object_view.rb b/lib/object_view.rb index aa44dc0..111f3be 100644 --- a/lib/object_view.rb +++ b/lib/object_view.rb @@ -2,15 +2,15 @@ require_relative "ref_view" class ObjectView < ListView - def initialize interpreter , object_id + def initialize object_id , interpreter = nil @object_id = object_id @interpreter = interpreter - @interpreter.register_event(:object_changed, self) + @interpreter.register_event(:object_changed, self) if interpreter super( content_elements ) end def draw - @element = super("ul.nav!") + @element = super(@interpreter ? "ul.nav!" : "ul") prepend_element div("li" , "-------------------------") prepend_element div( "li" ) << div("span" , class_header(@object_id) ) return @element diff --git a/lib/ref_view.rb b/lib/ref_view.rb index c137dce..d7d2493 100644 --- a/lib/ref_view.rb +++ b/lib/ref_view.rb @@ -1,16 +1,38 @@ -class RefView < ElementView +class RefView < ListView def initialize name , value @name = name @value = value + super [] + end + + attr_reader :value + + def value= val + @value = val + add_hover end - attr_accessor :value - def draw @element = div("li") << div("a" , "#{@name} : #{marker(@value)}" ) + add_hover + @element end + def add_hover + @element.on("hover"){ hover } if is_object?(@value) + end + + def is_object?( id ) + Virtual.machine.objects[id] != nil + end + + def hover + puts "hovering #{@name}" + append ObjectView.new(@value) + @element.off("hover") + end + def marker id var = Virtual.machine.objects[id] if var.is_a? String diff --git a/lib/registers_view.rb b/lib/registers_view.rb index 3387d79..4fb5002 100644 --- a/lib/registers_view.rb +++ b/lib/registers_view.rb @@ -26,7 +26,7 @@ class RegistersView < ListView reg = reg.symbol unless reg.is_a? Symbol index = reg.to_s[1 .. -1 ].to_i if( is_object? value ) - swap = ObjectView.new( @interpreter, value ) + swap = ObjectView.new( value , @interpreter ) else swap = ValueView.new value end From a56e811699df742e4afd6ea468b5201055bdba15 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sun, 23 Aug 2015 02:15:34 +0200 Subject: [PATCH 35/48] small fix and expansion to 5 level --- assets/css/menu.css.scss | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/assets/css/menu.css.scss b/assets/css/menu.css.scss index 78dc9f5..9e475d1 100644 --- a/assets/css/menu.css.scss +++ b/assets/css/menu.css.scss @@ -25,8 +25,8 @@ body { #nav li ul { /* second-level lists */ position : absolute; left: -999em; - margin-left : 10.05em; - margin-top : -1.35em; + margin-left : 10.0em; + margin-top : -2.7em; } #nav li ul ul { /* third-and-above-level lists */ @@ -50,10 +50,11 @@ body { background-color : #F6C739; } -#nav li:hover ul ul, #nav li:hover ul ul ul { +#nav li:hover ul ul, #nav li:hover ul ul ul , #nav li:hover ul ul ul ul , #nav li:hover ul ul ul ul ul{ left: -999em; } -#nav li:hover ul, #nav li li:hover ul, #nav li li li:hover ul { /* lists nested under hovered list items */ +/* lists nested under hovered list items */ +#nav li:hover ul, #nav li li:hover ul, #nav li li li:hover ul, #nav li li li li:hover ul , , #nav li li li li li:hover ul { left: auto; } From 7820c5eff0a432fdea1e3d3ef4c7f11989a828ae Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sun, 23 Aug 2015 02:16:13 +0200 Subject: [PATCH 36/48] clean of DOM --- Gemfile.lock | 4 ++-- lib/classes_view.rb | 20 -------------------- lib/value_view.rb | 8 +------- 3 files changed, 3 insertions(+), 29 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 683fe11..434b6f3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,7 +10,7 @@ GIT GIT remote: git://github.com/salama/parslet.git - revision: d4a6444ae01d5688bbb1e8aa27647eb7db1d34a7 + revision: b8bf8db20a242eb6bd8fec88027e3b2ae19276e8 specs: parslet (1.7.0) @@ -35,7 +35,7 @@ GIT GIT remote: git://github.com/salama/salama.git - revision: c039f3d6e6a89a5e66fbcb37f4fb02646fe9d5d6 + revision: df95b8b54de103523743cbfd5c46d87af84c6b09 specs: salama (0.2.0) salama-object-file (~> 0.2) diff --git a/lib/classes_view.rb b/lib/classes_view.rb index f7d9cbc..bf41d9d 100644 --- a/lib/classes_view.rb +++ b/lib/classes_view.rb @@ -18,26 +18,6 @@ class ClassesView < ListView wrap_element div("ul.nav!") wrap_element( div(".classes") << div("h4" , "Classes") ) return @element - - DOM do |dom| - dom.div.classes do - dom.h4 {"Classes"} - dom.ul.nav! do - @classes.each do |cl| - dom.li do - dom.a { cl.name } - dom.ul do - cl.object_layout.object_instance_names.each do |name| - dom.li do - dom.a{ name } - end - end - end - end - end - end - end - end end end diff --git a/lib/value_view.rb b/lib/value_view.rb index ebd2571..a2005b8 100644 --- a/lib/value_view.rb +++ b/lib/value_view.rb @@ -5,12 +5,6 @@ class ValueView < ElementView end def draw - DOM do |dom| - dom.ul.nav! do - dom.li do - dom.span( :href => "#" ) { @value } - end - end - end + @element = div("ul.nav!") << div("li") << div("span", @value) end end From 3319b0cd9844c5cc8e0bff107dfd89eee5cc30b4 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sun, 23 Aug 2015 02:16:32 +0200 Subject: [PATCH 37/48] fix the z index --- lib/class_view.rb | 4 ++-- lib/object_view.rb | 5 +++-- lib/ref_view.rb | 6 ++++-- lib/registers_view.rb | 23 ++++------------------- 4 files changed, 13 insertions(+), 25 deletions(-) diff --git a/lib/class_view.rb b/lib/class_view.rb index e7dc45d..8220292 100644 --- a/lib/class_view.rb +++ b/lib/class_view.rb @@ -4,11 +4,11 @@ class ClassView < ElementView end def draw - @element = div("li") - add( "a" , @clazz.name ) << (ul = div("ul")) + @element = div("li") << div( "a" , @clazz.name ) << (ul = div("ul")) @clazz.object_layout.object_instance_names.each do |name| ul << (div("li") << div("a", name )) end + @element.style["z-index"] = 10 @element end end diff --git a/lib/object_view.rb b/lib/object_view.rb index 111f3be..fe56d80 100644 --- a/lib/object_view.rb +++ b/lib/object_view.rb @@ -2,8 +2,9 @@ require_relative "ref_view" class ObjectView < ListView - def initialize object_id , interpreter = nil + def initialize object_id , interpreter = nil , z = nil @object_id = object_id + @z = z @interpreter = interpreter @interpreter.register_event(:object_changed, self) if interpreter super( content_elements ) @@ -36,7 +37,7 @@ class ObjectView < ListView if object and ! object.is_a?(String) object.get_instance_variables.each do |variable| f = object.get_instance_variable(variable) - fields << RefView.new( variable , f.object_id ) + fields << RefView.new( variable , f.object_id , @z ) end end fields diff --git a/lib/ref_view.rb b/lib/ref_view.rb index d7d2493..613d662 100644 --- a/lib/ref_view.rb +++ b/lib/ref_view.rb @@ -1,8 +1,9 @@ class RefView < ListView - def initialize name , value + def initialize name , value , z = nil @name = name @value = value + @z = z super [] end @@ -16,6 +17,7 @@ class RefView < ListView def draw @element = div("li") << div("a" , "#{@name} : #{marker(@value)}" ) add_hover + @element.style["z-index"] = @z if @z @element end @@ -32,7 +34,7 @@ class RefView < ListView append ObjectView.new(@value) @element.off("hover") end - + def marker id var = Virtual.machine.objects[id] if var.is_a? String diff --git a/lib/registers_view.rb b/lib/registers_view.rb index 4fb5002..6e130e2 100644 --- a/lib/registers_view.rb +++ b/lib/registers_view.rb @@ -15,7 +15,7 @@ class RegistersView < ListView def draw super( "div.registers_view" ) - @element.children.each do |reg| + @element.children.each_with_index do |reg, index| elem = div("div.register_view") wrap_node_with reg , elem end @@ -26,31 +26,16 @@ class RegistersView < ListView reg = reg.symbol unless reg.is_a? Symbol index = reg.to_s[1 .. -1 ].to_i if( is_object? value ) - swap = ObjectView.new( value , @interpreter ) + swap = ObjectView.new( value , @interpreter , 16 - index ) else swap = ValueView.new value end replace_at index , swap +# @elements[index].style["z-index"] = -index end def is_object?( id ) - Virtual.machine.objects[id] != nil - end - - def calc_fields - #puts "My id #{objects_id} , #{objects_id.class}" - object = Virtual.machine.objects[value] - self.fields.clear - if object and ! object.is_a?(String) - clazz = object.class.name.split("::").last - #puts "found #{clazz}" - self.fields << "#{clazz}:#{object.internal_object_length}" - self.fields << object.get_layout - object.get_instance_variables.each do |variable| - f = object.get_instance_variable(variable) - self.fields << f - end - end + Virtual.machine.objects[id] != nil end end From 95c4d656b3f74bcbdc2bc91d0a254297f1ee2d12 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sun, 23 Aug 2015 02:20:36 +0200 Subject: [PATCH 38/48] last DOM cleaning --- lib/class_view.rb | 2 +- lib/file_view.rb | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/class_view.rb b/lib/class_view.rb index 8220292..5257b95 100644 --- a/lib/class_view.rb +++ b/lib/class_view.rb @@ -8,7 +8,7 @@ class ClassView < ElementView @clazz.object_layout.object_instance_names.each do |name| ul << (div("li") << div("a", name )) end - @element.style["z-index"] = 10 + @element.style["z-index"] = 20 @element end end diff --git a/lib/file_view.rb b/lib/file_view.rb index 6497f72..09977dd 100644 --- a/lib/file_view.rb +++ b/lib/file_view.rb @@ -2,11 +2,7 @@ class FileView < ElementView def draw - DOM do |dom| - dom.div.file_view do - dom.h4 {"Future"} - end - end + @element = div(".file_view") << div("h4" ,"Future") end end From 167353fdf39dad866530411715e1787185842c60 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sun, 23 Aug 2015 02:28:31 +0200 Subject: [PATCH 39/48] update method name --- lib/blocks_view.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/blocks_view.rb b/lib/blocks_view.rb index 5c8e6f7..d3b1e4d 100644 --- a/lib/blocks_view.rb +++ b/lib/blocks_view.rb @@ -6,11 +6,12 @@ class BlocksView < ListView @interpreter = interpreter @interpreter.register_event(:instruction_changed, self) super([BlockView.new(@interpreter.block)]) + @method_name = method_name end def draw super() - wrap_element div("div.block_view") << div("h4" , "Method #{method_name}") << div("h4" , "Block" ) + wrap_element div("div.block_view") << div("h4.method" , @method_name) << div("h4" , "Block" ) return @element end @@ -19,6 +20,11 @@ class BlocksView < ListView @elements.last.at_css(".bright").remove_class("bright") append( BlockView.new(@interpreter.block) ) remove_first if( @elements.length > 5) + new_name = method_name + return if new_name == @method_name + @method_name = new_name + puts "changed new_name #{@method_name}" + @element.at_css(".method").text = method_name end def active_block_name From a25d292e1f9d2ef9f65c8be279e8af452d0d7c12 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Mon, 24 Aug 2015 01:44:04 +0200 Subject: [PATCH 40/48] improve style a bit --- assets/css/app.css.scss | 16 ++++++++++++++-- assets/css/menu.css.scss | 4 ++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/assets/css/app.css.scss b/assets/css/app.css.scss index 6320205..e77097c 100644 --- a/assets/css/app.css.scss +++ b/assets/css/app.css.scss @@ -31,6 +31,7 @@ $susy: ( .status_view { @include span(2 at 22); + line-height : 1.25em; } .registers_view { @@ -54,6 +55,17 @@ $susy: ( background-color: #C5FFD9; } -.bright { - background-color: orange ; +.act{ + background-color: #00B3FF; + -moz-border-radius: 7px; + -webkit-border-radius: 7px; + font-size: 100%; +} + +.bright { + padding-right: 6px; + padding-left: 6px; + background-color: #00E3FF ; + -moz-border-radius: 7px; + -webkit-border-radius: 7px; } diff --git a/assets/css/menu.css.scss b/assets/css/menu.css.scss index 9e475d1..fdd376b 100644 --- a/assets/css/menu.css.scss +++ b/assets/css/menu.css.scss @@ -47,7 +47,7 @@ body { #nav li a:hover { color : white; - background-color : #F6C739; + background-color : #98CC1F; } #nav li:hover ul ul, #nav li:hover ul ul ul , #nav li:hover ul ul ul ul , #nav li:hover ul ul ul ul ul{ @@ -55,6 +55,6 @@ body { } /* lists nested under hovered list items */ -#nav li:hover ul, #nav li li:hover ul, #nav li li li:hover ul, #nav li li li li:hover ul , , #nav li li li li li:hover ul { +#nav li:hover ul, #nav li li:hover ul, #nav li li li:hover ul, #nav li li li li:hover ul , #nav li li li li li:hover ul { left: auto; } From 516b041bed84d1b887bac4bb29ccca497e7c9712 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Mon, 24 Aug 2015 01:44:50 +0200 Subject: [PATCH 41/48] small improvements --- lib/base/element_view.rb | 2 +- lib/base/list_view.rb | 5 +++-- lib/blocks_view.rb | 1 - lib/status_view.rb | 5 +++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/base/element_view.rb b/lib/base/element_view.rb index d278c06..59b3302 100644 --- a/lib/base/element_view.rb +++ b/lib/base/element_view.rb @@ -18,7 +18,7 @@ class ElementView # second argument is optional, but if given will be added as text (content) to the newly # created Element # return the new Element, which is not linked into the dom at that point (see << and add*) - def div name_class , text = nil + def div name_class = "div" , text = nil name , clazz = name_class.split(".") name = "div" if name.empty? element = $document.create_element(name) diff --git a/lib/base/list_view.rb b/lib/base/list_view.rb index 2b535b9..b414d61 100644 --- a/lib/base/list_view.rb +++ b/lib/base/list_view.rb @@ -33,7 +33,8 @@ class ListView < ElementView def append view @children << view rendered = view.draw - @elements << rendered - @element << rendered + @elements << rendered # add to internal array + @element << rendered # add to html children + rendered end end diff --git a/lib/blocks_view.rb b/lib/blocks_view.rb index d3b1e4d..be162b5 100644 --- a/lib/blocks_view.rb +++ b/lib/blocks_view.rb @@ -23,7 +23,6 @@ class BlocksView < ListView new_name = method_name return if new_name == @method_name @method_name = new_name - puts "changed new_name #{@method_name}" @element.at_css(".method").text = method_name end diff --git a/lib/status_view.rb b/lib/status_view.rb index 1fe53e3..d524d85 100644 --- a/lib/status_view.rb +++ b/lib/status_view.rb @@ -6,10 +6,11 @@ class StatusView < ElementView def draw @element = div(".status_view") << - div("h4" , "Interpreter" ) << - div("span.clock" , clock_text) << + div("h4" , "Interpreter" ) << div("button.act" , "Next") << div( "br") << + div("span.clock" , clock_text) << + div( "br") << div("span.state" , state_text) << div( "br") << div( "span.link" , link_text) << From b3de7c9b5e003b1d2696aebcc035f74175484975 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Mon, 24 Aug 2015 01:45:33 +0200 Subject: [PATCH 42/48] implement instruction view , almost complete --- lib/instruction_view.rb | 52 +++++++++++++++++------------------------ lib/main_view.rb | 2 ++ 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/lib/instruction_view.rb b/lib/instruction_view.rb index 952543a..ac48bb6 100644 --- a/lib/instruction_view.rb +++ b/lib/instruction_view.rb @@ -1,38 +1,30 @@ -class InstructionView +require "base/constant_view" +require "base/list_view" - include React::Component - required_param :interpreter - required_param :instruction +class InstructionView < ListView - define_state :active => "" - - before_mount do - check_active interpreter.instruction + def initialize interpreter + @interpreter = interpreter + super([ConstantView.new( "span.bright" , "starting" )]) + @interpreter.register_event(:instruction_changed, self) end - def check_active i - active! instruction == i ? "bright" : "" - - end - def instruction_changed old , ins - check_active ins + def instruction_changed + @element.at_css(".bright").remove_class("bright") + instruction = append( ConstantView.new( "span.bright" , instruction_text ) ) + wrap_node_with instruction , div + remove_first if( @elements.length > 5) end - def render - div :class => active do - instruction.to_s if instruction - end + def draw + super() + wrap_node_with @elements.first , div + wrap_element div(".source_view") << div("h4" ,"Virtual Machine Instruction") + @element + end + + def instruction_text + return "" unless @interpreter.instruction + @interpreter.instruction.to_s end end - - -
-

Virtual Machine Instruction

- {{page._sources.each do |source| }} -
- - {{source._name}} - -
- {{end}} -
diff --git a/lib/main_view.rb b/lib/main_view.rb index c50ba14..17d3e5c 100644 --- a/lib/main_view.rb +++ b/lib/main_view.rb @@ -8,6 +8,7 @@ require_relative "classes_view" require_relative "status_view" require_relative "file_view" require_relative "blocks_view" +require_relative "instruction_view" require_relative "registers_view" class MainView < ListView @@ -31,6 +32,7 @@ class MainView < ListView super( [ClassesView.new(@interpreter) , FileView.new , BlocksView.new(@interpreter) , + InstructionView.new(@interpreter) , StatusView.new(@interpreter) , RegistersView.new(@interpreter) ] ) end From c5a07be6ac97c5df5df4791c83615c6fe5235401 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Mon, 24 Aug 2015 01:49:41 +0200 Subject: [PATCH 43/48] inlined mini clases --- lib/block_view.rb | 12 ------------ lib/blocks_view.rb | 14 +++++++++++++- lib/class_view.rb | 14 -------------- lib/classes_view.rb | 16 +++++++++++++++- lib/debugger.rb | 42 +++++++++++++++++++++++++++++++++++++++++- lib/main_view.rb | 40 ---------------------------------------- lib/registers_view.rb | 12 +++++++++++- lib/value_view.rb | 10 ---------- 8 files changed, 80 insertions(+), 80 deletions(-) delete mode 100644 lib/block_view.rb delete mode 100644 lib/class_view.rb delete mode 100644 lib/main_view.rb delete mode 100644 lib/value_view.rb diff --git a/lib/block_view.rb b/lib/block_view.rb deleted file mode 100644 index 15bbd10..0000000 --- a/lib/block_view.rb +++ /dev/null @@ -1,12 +0,0 @@ -class BlockView < ElementView - - def initialize block - @block = block - end - attr_reader :block - - def draw - @element = div("div") << div("span.bright" , @block.name ) - end - -end diff --git a/lib/blocks_view.rb b/lib/blocks_view.rb index be162b5..444c5f9 100644 --- a/lib/blocks_view.rb +++ b/lib/blocks_view.rb @@ -1,4 +1,3 @@ -require_relative "block_view" class BlocksView < ListView @@ -41,3 +40,16 @@ class BlocksView < ListView "#{bl.method.for_class.name}.#{bl.method.name}" end end + +class BlockView < ElementView + + def initialize block + @block = block + end + attr_reader :block + + def draw + @element = div("div") << div("span.bright" , @block.name ) + end + +end diff --git a/lib/class_view.rb b/lib/class_view.rb deleted file mode 100644 index 5257b95..0000000 --- a/lib/class_view.rb +++ /dev/null @@ -1,14 +0,0 @@ -class ClassView < ElementView - def initialize clazz - @clazz = clazz - end - - def draw - @element = div("li") << div( "a" , @clazz.name ) << (ul = div("ul")) - @clazz.object_layout.object_instance_names.each do |name| - ul << (div("li") << div("a", name )) - end - @element.style["z-index"] = 20 - @element - end -end diff --git a/lib/classes_view.rb b/lib/classes_view.rb index bf41d9d..cf9f57c 100644 --- a/lib/classes_view.rb +++ b/lib/classes_view.rb @@ -1,4 +1,3 @@ -require_relative "class_view" class ClassesView < ListView @@ -21,3 +20,18 @@ class ClassesView < ListView end end + +class ClassView < ElementView + def initialize clazz + @clazz = clazz + end + + def draw + @element = div("li") << div( "a" , @clazz.name ) << (ul = div("ul")) + @clazz.object_layout.object_instance_names.each do |name| + ul << (div("li") << div("a", name )) + end + @element.style["z-index"] = 20 + @element + end +end diff --git a/lib/debugger.rb b/lib/debugger.rb index 30a73cd..3d0bc0d 100644 --- a/lib/debugger.rb +++ b/lib/debugger.rb @@ -1,7 +1,47 @@ require "opal" require "opal-parser" -require "main_view" + + +require 'browser' +require 'native' +require "salama" +require "interpreter/interpreter" +require "base/list_view" +require_relative "classes_view" +require_relative "status_view" +require_relative "file_view" +require_relative "blocks_view" +require_relative "instruction_view" +require_relative "registers_view" + +class MainView < ListView + + def initialize + machine = Virtual.machine.boot + + # compile_main includes the parse + # parsing generates an ast as seen below and then compiles it. + # machine.compile_main "2 + 5" + + # so the code above is functionally equivalent to the one below, minus the parse + # When the ast expression is given all works, so pretty sure it is the parse that fails + + code = Ast::OperatorExpression.new("+", Ast::IntegerExpression.new(2),Ast::IntegerExpression.new(5)) + Virtual::Compiler.compile( code , machine.space.get_main ) + + machine.run_before "Register::CallImplementation" + @interpreter = Interpreter::Interpreter.new + @interpreter.start machine.init + super( [ClassesView.new(@interpreter) , + FileView.new , + BlocksView.new(@interpreter) , + InstructionView.new(@interpreter) , + StatusView.new(@interpreter) , + RegistersView.new(@interpreter) ] ) + end + +end view = MainView.new() view.draw.append_to($document.body) diff --git a/lib/main_view.rb b/lib/main_view.rb deleted file mode 100644 index 17d3e5c..0000000 --- a/lib/main_view.rb +++ /dev/null @@ -1,40 +0,0 @@ - -require 'browser' -require 'native' -require "salama" -require "interpreter/interpreter" -require "base/list_view" -require_relative "classes_view" -require_relative "status_view" -require_relative "file_view" -require_relative "blocks_view" -require_relative "instruction_view" -require_relative "registers_view" - -class MainView < ListView - - def initialize - machine = Virtual.machine.boot - - # compile_main includes the parse - # parsing generates an ast as seen below and then compiles it. - # machine.compile_main "2 + 5" - - # so the code above is functionally equivalent to the one below, minus the parse - # When the ast expression is given all works, so pretty sure it is the parse that fails - - code = Ast::OperatorExpression.new("+", Ast::IntegerExpression.new(2),Ast::IntegerExpression.new(5)) - Virtual::Compiler.compile( code , machine.space.get_main ) - - machine.run_before "Register::CallImplementation" - @interpreter = Interpreter::Interpreter.new - @interpreter.start machine.init - super( [ClassesView.new(@interpreter) , - FileView.new , - BlocksView.new(@interpreter) , - InstructionView.new(@interpreter) , - StatusView.new(@interpreter) , - RegistersView.new(@interpreter) ] ) - end - -end diff --git a/lib/registers_view.rb b/lib/registers_view.rb index 6e130e2..66ca88d 100644 --- a/lib/registers_view.rb +++ b/lib/registers_view.rb @@ -1,5 +1,4 @@ require_relative "object_view" -require_relative "value_view" class RegistersView < ListView @@ -39,3 +38,14 @@ class RegistersView < ListView end end + +class ValueView < ElementView + + def initialize value + @value = value + end + + def draw + @element = div("ul.nav!") << div("li") << div("span", @value) + end +end diff --git a/lib/value_view.rb b/lib/value_view.rb deleted file mode 100644 index a2005b8..0000000 --- a/lib/value_view.rb +++ /dev/null @@ -1,10 +0,0 @@ -class ValueView < ElementView - - def initialize value - @value = value - end - - def draw - @element = div("ul.nav!") << div("li") << div("span", @value) - end -end From 7d214e7013b293cb3f827145bb35a5ad9d0e112d Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Mon, 24 Aug 2015 02:04:07 +0200 Subject: [PATCH 44/48] finish off instruction view (+small rename) --- lib/base/list_view.rb | 18 +++++++++++++++++- lib/blocks_view.rb | 4 ++-- lib/instruction_view.rb | 4 ++-- lib/ref_view.rb | 2 +- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/lib/base/list_view.rb b/lib/base/list_view.rb index b414d61..6f81854 100644 --- a/lib/base/list_view.rb +++ b/lib/base/list_view.rb @@ -30,7 +30,23 @@ class ListView < ElementView old.replace_with rendered end - def append view + # remove the first child and element (from view) + def remove_first + remove_at 0 + end + + # remove both child and element at given position + def remove_at index + raise "insex out of bounds #{index} => #{@children.length}" if(index >= @children.length or index < 0) + @children.delete_at( index ) + element = @elements.delete_at(index) + element.remove + end + + # append a View instnace to the children array + # render it and append it to the html element + # and keep a copy in @elements + def append_view view @children << view rendered = view.draw @elements << rendered # add to internal array diff --git a/lib/blocks_view.rb b/lib/blocks_view.rb index 444c5f9..33f0875 100644 --- a/lib/blocks_view.rb +++ b/lib/blocks_view.rb @@ -17,8 +17,8 @@ class BlocksView < ListView def instruction_changed return if @interpreter.block.name == active_block_name @elements.last.at_css(".bright").remove_class("bright") - append( BlockView.new(@interpreter.block) ) - remove_first if( @elements.length > 5) + append_view( BlockView.new(@interpreter.block) ) + remove_first if( @elements.length > 6) new_name = method_name return if new_name == @method_name @method_name = new_name diff --git a/lib/instruction_view.rb b/lib/instruction_view.rb index ac48bb6..ed30aff 100644 --- a/lib/instruction_view.rb +++ b/lib/instruction_view.rb @@ -11,9 +11,9 @@ class InstructionView < ListView def instruction_changed @element.at_css(".bright").remove_class("bright") - instruction = append( ConstantView.new( "span.bright" , instruction_text ) ) + instruction = append_view( ConstantView.new( "span.bright" , instruction_text ) ) wrap_node_with instruction , div - remove_first if( @elements.length > 5) + remove_first if( @elements.length > 6) end def draw diff --git a/lib/ref_view.rb b/lib/ref_view.rb index 613d662..c403355 100644 --- a/lib/ref_view.rb +++ b/lib/ref_view.rb @@ -31,7 +31,7 @@ class RefView < ListView def hover puts "hovering #{@name}" - append ObjectView.new(@value) + append_view ObjectView.new(@value) @element.off("hover") end From 85e099382dfda271621fd83825b830f5cc68a1ab Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Mon, 24 Aug 2015 02:19:41 +0200 Subject: [PATCH 45/48] fix method update --- lib/blocks_view.rb | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/lib/blocks_view.rb b/lib/blocks_view.rb index 33f0875..ce9bb4b 100644 --- a/lib/blocks_view.rb +++ b/lib/blocks_view.rb @@ -10,27 +10,20 @@ class BlocksView < ListView def draw super() - wrap_element div("div.block_view") << div("h4.method" , @method_name) << div("h4" , "Block" ) + wrap_element div("div.block_view") << div("h4" , "Method + Block " ) << div("h4.method" , @method_name) return @element end def instruction_changed - return if @interpreter.block.name == active_block_name + new_name = method_name + unless new_name == @method_name + @method_name = new_name + @element.at_css(".method").text = method_name + end + return if @interpreter.block.object_id == @children.last.block.object_id @elements.last.at_css(".bright").remove_class("bright") append_view( BlockView.new(@interpreter.block) ) remove_first if( @elements.length > 6) - new_name = method_name - return if new_name == @method_name - @method_name = new_name - @element.at_css(".method").text = method_name - end - - def active_block_name - @children.last.block.name - end - - def block_name - @interpreter.block ? @interpreter.block.name : "" end def method_name @@ -49,7 +42,17 @@ class BlockView < ElementView attr_reader :block def draw - @element = div("div") << div("span.bright" , @block.name ) + @element = div("div") << div("span.bright" , block_name ) + end + + def method_name + return @block.method if @block.method.is_a? String + @block.method.name + end + + def block_name + return @block if @block.is_a? String + "#{method_name}.#{@block.name}" end end From ee788b350793e45093ca8a8b4d1b6b54081bcdfd Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Tue, 25 Aug 2015 09:57:08 +0200 Subject: [PATCH 46/48] add layout to object view --- lib/object_view.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/object_view.rb b/lib/object_view.rb index fe56d80..0e62cea 100644 --- a/lib/object_view.rb +++ b/lib/object_view.rb @@ -35,6 +35,7 @@ class ObjectView < ListView object = Virtual.machine.objects[@object_id] fields = [] if object and ! object.is_a?(String) + fields << RefView.new( "layout" , object.get_layout.object_id , @z ) object.get_instance_variables.each do |variable| f = object.get_instance_variable(variable) fields << RefView.new( variable , f.object_id , @z ) From 5ec7ea6d56fef9686c82f9550efbb8edc72dbd2a Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Tue, 25 Aug 2015 09:57:22 +0200 Subject: [PATCH 47/48] small fix --- lib/ref_view.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ref_view.rb b/lib/ref_view.rb index c403355..eb587d9 100644 --- a/lib/ref_view.rb +++ b/lib/ref_view.rb @@ -38,7 +38,7 @@ class RefView < ListView def marker id var = Virtual.machine.objects[id] if var.is_a? String - str "Wo" + str = "Wo" else str = var.class.name.split("::").last[0,2] end From c0bdfe149c79a25ce797bec4e9131e7d4c714503 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Tue, 25 Aug 2015 11:54:44 +0200 Subject: [PATCH 48/48] fix list and string views --- lib/object_view.rb | 7 +++++++ lib/ref_view.rb | 23 +++++++++++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/object_view.rb b/lib/object_view.rb index 0e62cea..1cd64de 100644 --- a/lib/object_view.rb +++ b/lib/object_view.rb @@ -40,6 +40,13 @@ class ObjectView < ListView f = object.get_instance_variable(variable) fields << RefView.new( variable , f.object_id , @z ) end + if( object.is_a?(Parfait::List) ) + index = 1 + object.each do | o , i| + fields << RefView.new( index.to_s , o.object_id , @z ) + index += 1 + end + end end fields end diff --git a/lib/ref_view.rb b/lib/ref_view.rb index eb587d9..e243c9f 100644 --- a/lib/ref_view.rb +++ b/lib/ref_view.rb @@ -22,11 +22,20 @@ class RefView < ListView end def add_hover + return if is_string? @element.on("hover"){ hover } if is_object?(@value) end - def is_object?( id ) - Virtual.machine.objects[id] != nil + def is_object?( ) + Virtual.machine.objects[@value] != nil + end + + def is_string?() + Virtual.machine.objects[@value].is_a? String + end + + def is_nil?() + Virtual.machine.objects[@value].nil? end def hover @@ -36,13 +45,15 @@ class RefView < ListView end def marker id - var = Virtual.machine.objects[id] - if var.is_a? String - str = "Wo" + if is_string? + str = @value + elsif is_nil? + str = "nil" else + var = Virtual.machine.objects[id] str = var.class.name.split("::").last[0,2] + str + " : #{id.to_s}" end - str + " : #{id.to_s}" end end