• Stars
    star
    304
  • Rank 137,274 (Top 3 %)
  • Language
    JavaScript
  • License
    Other
  • Created over 8 years ago
  • Updated over 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

An implementation of continuations in JavaScript

unwinder

An implementation of continuations in JavaScript. Includes built-in support for breakpoints (implemented with continuations) and setting breakpoints on running scripts.

See this post for a deeper explanation and interactive tutorials.

This implements the paper "Exceptional Continuations in JavaScript". It started as a fork of regenerator from January 2014, so the code is outdated. However, it is useful for demos and exploring interesting patterns.

Do not build actual software with this. Not only is it an old regenerator fork, but my work on top of it is hacky. There are no tests, as I was figuring out what was even possible. You will likely hit bugs when trying to write non-trivial code against this.

With that said, fixing those bugs is usually straight-forward. Each expression needs to mark itself correcly in the state machine. Usually this is a matter of changing 1 or 2 lines of code.

There is little ES6 support, but that could be fixed by first transforming code with Babel.

Getting Started

The simplest way is to write some code in a file called program.js and compile it with ./bin/compile program.js. A file called a.out will be generated, or you can specify an output file as the second argument.

$ ./bin/compile program.js <output-file>
$ node <output-file>

There is also a browser editor included in the browser directory. Open browser/index.html to run it, and you will be able to interactively write code and set breakpoints.

Continuation API

Use callCC to capture the current continuation. It will be given to you as a function that never returns.

function foo() {
  var cont = callCC(cont => cont);
  if(typeof cont === "function") {
    cont(5);
  }
  return cont;
}

console.log(foo()); // -> 5

See this post for more interesting examples, including resumable exceptions.

Machine API

At the bottom of the generated file, you will see where the program is run by the virtual machine. This virtual machine does not interpret the code; the code is real native JavaScript. All the virtual machine does is check the behavior of the code and handle runtime information of continuations (such as frames).

Some useful methods of the VM:

  • toggleBreakpoint(line) - set/remove a breakpoint
  • continue() - resume execution
  • step() - step to the next expression
  • getTopFrame() - if paused, get the top frame
  • abort() - stop executing and clear out all state

Events (subscribe to events with vm.on):

  • paused - fired when the code stops (breakpoint, stepped, etc)
  • error - fired when an uncaught error occurs
  • resumed - fired when the code resumed from being paused
  • finish - fired when the code completes
  • cont-invoked - fired when a continuation is invoked

Contributing

I have turned off issues because I know there are many bugs in here and I do not have time to triage them. However, I welcome PRs that have a clear bugfix or purpose.

Some things I would like to see:

  • Minor bugfixes and general stability improvements

  • Clean up lib/visit.js and break up the large functions

  • Remove so much manual AST construction. It would be great to give something a string of code and generate the AST I need automatically, but without having to parse the same code each time.

  • Introduce two compiler modes: debugger and continuations. If we don't support the "debugger" mode which allows live breakpoints, we can do further optimizations and don't need to convert every single expression into the state machine. But I want this project to continue to support breakpoints, so it would be nice if we could have different compiler modes (or maybe optimization levels?)

  • Tests. Oh god help me, there are no tests.

Some things I am going to reject:

  • Major refactorings without any discussion beforehand. I don't have time to go through it.

More Repositories

1

absurd-sql

sqlite3 in ur indexeddb (hopefully a better backend soon)
JavaScript
4,172
star
2

transducers.js

A small library for generalized transformation of data (inspired by Clojure's transducers)
JavaScript
1,722
star
3

blog

All the sources for my (not powered by React anymore) blog
CSS
1,223
star
4

electron-with-server-example

An example Electron app with a backend server all wired up via IPC
JavaScript
1,010
star
5

crdt-example-app

A full implementation of CRDTs using hybrid logical clocks and a demo app that uses it
JavaScript
616
star
6

css-animations.js

A library to work with CSS3 keyframe animations from javascript
JavaScript
479
star
7

backend-with-webpack

A simple server using webpack as a build tool
JavaScript
458
star
8

canvas-game-bootstrap

A starting point & tutorial for basic 2d canvas games
JavaScript
237
star
9

es6-macros

A collection of sweet.js macros that implement ES6 features for ES5
JavaScript
237
star
10

monkey-hot-loader

A webpack loader to hot reload JavaScript modules
JavaScript
171
star
11

outlet

Outlet is a simple Lisp-like programming language
JavaScript
161
star
12

jsx-reader

A JSX reader for JavaScript, powered by sweet.js.
JavaScript
148
star
13

lively

Components & state
JavaScript
145
star
14

emojiscript

EmojiScript: emotion literals, emotional algebra, and more for JavaScript
JavaScript
139
star
15

dom3d

Rendering 3d with CSS3
JavaScript
111
star
16

gambit-iphone-example

An example iphone app which uses Gambit Scheme.
Scheme
103
star
17

farmageddon

The raw, unedited source for the iOS game I wrote in Gambit Scheme back in 2010.
C
102
star
18

dcpu-lisp

A Lisp-like language that compiles to DCPU-16 assembly code
JavaScript
77
star
19

redux-experiments

A few customizations for my own projects
JavaScript
64
star
20

lljs-cloth

Cloth simulation as a large-scale test for LLJS development
JavaScript
47
star
21

sweetjs-loader

A webpack loader for sweetjs
JavaScript
47
star
22

swank-gambit

Gambit swank backend for SLIME
Scheme
40
star
23

absurd-example-project

A project to show everything needed to use absurd-sql
JavaScript
40
star
24

learning-clojurescript

All the apps I'm making to learn ClojureScript (and also have fun)
JavaScript
40
star
25

grunt-nunjucks

A grunt plugin for nunjucks.
JavaScript
38
star
26

steps

A little hack that allows you to step through JavaScript code (only in Firefox for now)
JavaScript
30
star
27

jlongster-rebuild

A rebuild of my blog w/react, CSP, and more
JavaScript
29
star
28

gulp-sweetjs

A gulp loader for sweet.js
JavaScript
26
star
29

play-react-native-opengl

An example of using React Native to control OpenGL (terrible hacky code)
JavaScript
26
star
30

sweet.js-tutorials

All the sweet.js tutorials from my blog and a working sweet.js environment
JavaScript
26
star
31

webfighter

An r-type inspired 2d game for the web
JavaScript
24
star
32

live-css-layout

A live editor for css-layout
JavaScript
20
star
33

configure-iphone

A utility shell script to help build libraries for iPhone devices.
19
star
34

objective-c-csv-parser

Objective-C CSV Parser
18
star
35

shade

A simple but optimal 3d engine
JavaScript
16
star
36

mozlando-react-workshop

Lessons for learning React.
JavaScript
15
star
37

construct.js

Simple sugar for establishing prototype-based inheritance
JavaScript
15
star
38

genetic-canvas

Implements a genetic algorithm for drawing 2d pictures
Scheme
14
star
39

tcomb-immutable-experiment

An experiment with immutable.js-backed tcomb types
JavaScript
14
star
40

outlet-machine

A register-based virtual machine for a basic Lisp
JavaScript
13
star
41

autoffi

FFI generator for Gambit Scheme
Scheme
13
star
42

ftgles

FTGL, a font rendering library, ported to OpenGLES.
C++
12
star
43

struct.js

Struct datatypes for JavaScript with a few sweet.js macros
JavaScript
12
star
44

gambit-ffi-generator

Generating Gambit-C Scheme FFI's from C header files
12
star
45

fp-workshop

A workshop to introduce functional-style programming in JavaScript
11
star
46

schemeray

A simple raytacer written in Gambit Scheme, and ported to other implementations
Scheme
11
star
47

mozilla.com

Battlegrounds for mozilla.com work (mirror of http://svn.mozilla.org/projects/mozilla.com/)
PHP
10
star
48

devrepl

A REPL for the Firefox debugger client/server
JavaScript
10
star
49

reason-http-server-example

A simple HTTP server in Reason using cohttp and built with Rebel.
10
star
50

weatherme

A simple weather web app
JavaScript
8
star
51

macro-editor

An embeddable sweet.js macro editor
JavaScript
8
star
52

flame

An experimental tile-based game
JavaScript
7
star
53

mozilla.org

A copy of the mozilla.org PHP site.
JavaScript
7
star
54

grime3d

A proof of concept for something special.
Scheme
6
star
55

OMGBUGS

Experimental nodejs-powered bugzilla interface. See the demo site at this repo's url.
JavaScript
6
star
56

perf-deets

Get those perf deets
JavaScript
6
star
57

game-engine-studies

Implementing various game engines in javascript
JavaScript
6
star
58

lljs-minecraft

Port of notch's minecraft demo to LLJS
JavaScript
5
star
59

ahoy

This is nothing.
JavaScript
5
star
60

tilt-this

A web-based builder for 3d Tilt objects (viewable by Firefox's Tilt devtool)
JavaScript
5
star
61

actual-automoto

JavaScript
5
star
62

ftgles-gambit

Gambit Scheme bindings to the FTGLES library
Scheme
4
star
63

webui

Using csuwldcat's WebComponent project to build some UI tools for webapps
JavaScript
4
star
64

relnotes

Release notes generator for Firefox releases
Python
4
star
65

lljs-editor

An experiment with live-editing LLJS code in the browser.
JavaScript
4
star
66

ff-devtools-libs

A quick experiment to help migrate to HTML
JavaScript
4
star
67

demo-cloth

A floating cloth demo with JavaScript/WebGL
JavaScript
4
star
68

channel-debugger

a firefox devtool addon for debugging channels
JavaScript
4
star
69

YPS

Yield Passing Style
JavaScript
4
star
70

entity.js

A little game experiment
JavaScript
3
star
71

spidermonkey-graphics

spidermonkey for 3d graphics and user interfaces
C
3
star
72

writing-webapps

My presentation at the Mozillas Apps Summit
JavaScript
3
star
73

strangeloop2015

Slides for my talk "Cleaning the Tar: Using React in Firefox DevTools"
JavaScript
3
star
74

tweetness

A twitter Open Web App
JavaScript
3
star
75

js-lljs-c-benchmarks

Benchmarks comparing js, lljs, and c compiled with emscripten
JavaScript
3
star
76

octave-utility

my utility code for using octave
Objective-C
3
star
77

jlongster-django

My personal site: jlongster.com
Python
3
star
78

django-basic-site

Python
3
star
79

fiber-modal-error

JavaScript
2
star
80

gollumdoc

Patches the gollum wiki to host documentation better
Ruby
2
star
81

persona.org

NodeJS project
JavaScript
2
star
82

mozilla-product-details

git svn clone http://svn.mozilla.org/libs/product-details/json/
JavaScript
2
star
83

voloweb

A site for volo
JavaScript
2
star
84

servable-branches

Manifest git branches on the filesystem to be served on the web
JavaScript
2
star
85

build-docker-mochitest

Making mochitests OK.
Makefile
2
star
86

xpcshell-unit-test

A basic xpcshell test runner that can be used outside of Firefox
JavaScript
2
star
87

libgrowth

A tiny web site that estimates the growth of your node libraries over time
JavaScript
2
star
88

my-react-native-babel-preset

JavaScript
2
star
89

onGameStart-2013

My presentation for onGameStart 2013, using websockets to connect everybody
JavaScript
2
star
90

devtool-prototype

An experiment with making a new devtool
CSS
2
star
91

actual-docs

markdown content
JavaScript
2
star
92

rn-android-input-pan

Repro for Android's panning behavior when focusing an input
Objective-C
2
star
93

jlongster.com

JavaScript
2
star
94

bugzillersearch

A quick experiment in hating iOS for nefarious research purposes.
Objective-C
2
star
95

cordova-firefoxos-plugins

A place for Mozilla to track our Cordova work
Java
2
star
96

php-product-details

Mozilla's PHP product-details library (mirror of https://svn.mozilla.org/libs/product-details)
PHP
2
star
97

services

services that I run on my computer & servers
Ruby
1
star
98

tmp-node-inspector

JavaScript
1
star
99

jlongster.github.io

HTML
1
star
100

noodleconfware

The conference software for noodleconf
JavaScript
1
star