Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

walt-plugin-syntax-closure

ballercat20MIT0.2.12

Walt Syntax Closures

wasm, wast, javascript, webassembly, compiler

readme

Walt Plugin Closures

This is a reference implementation of Closures plugin for the Walt WebAssembly Compiler.

Syntax

type Func = () => i32;
// New GenericType "Lambda<Type>"
type Closure = Lambda<Func>;

// Closures require a table, because closure calls are indirect_call
const table: Table = { initial: 1, element: 'anyfunc' };

function getClosure(): Closure {
  const x: i32 = 0;
  // Closures can be defined with arrow function syntax
  return (): i32 => {
    x += 1;
    return x;
  };
}

export function run(): i32 {
  const closure: Closure = getClosure();
  closure();
  closure();
  return closure(); // 3
}

Install

npm install walt-plugin-syntax-closure

API

import { compile } from 'walt-compiler';
import { plugin, imports } from 'walt-plugin-syntax-closure';

// .walt source with closures
const source = `...`;

// compiler options
const options = {
  extensions: [plugin],
};

// Closures require an additional import for support. It's provided by the plugin
Promise.resolve(imports(options, compile))
  .then(closureImports =>
    WebAssembly.instantiate(compile(source, options).buffer(), closureImports)
  )
  .then(mod => mod.instance.exports.run());

CLI

N/A

Reference

This plugin is meant to act as a reference example of plugins for the Walt compiler. To demonstrate this it extends the grammar(syntax), the semantic parser as well as provides a "side-module" import for it's run-time features.

Grammar

The plugin adds an additional Node type Closure and makes it a valid Expression type. For the full grammar see the Grammar File.

Semantic Parser

This plugin extends the semantic parser by parsing the new syntax down to the supported AST format of the core compiler. See the main plugin source for how the semantic parser is extended.

Imports

Ths plugin provides a run-time import for closure support. The following header is added to every module using closures.

// Start Closure Imports Header
import {
  __closure_malloc: ClosureGeti32,
  __closure_free: ClosureFree,
  __closure_get_i32: ClosureGeti32,
  __closure_get_f32: ClosureGetf32,
  __closure_get_i64: ClosureGeti64,
  __closure_get_f64: ClosureGetf64,
  __closure_set_i32: ClosureSeti32,
  __closure_set_f32: ClosureSetf32,
  __closure_set_i64: ClosureSeti64,
  __closure_set_f64: ClosureSetf64
} from 'walt-plugin-closure';
type ClosureFree = (i32) => void;
type ClosureGeti32 = (i32) => i32;
type ClosureGetf32 = (i32) => f32;
type ClosureGeti64 = (i32) => i64;
type ClosureGetf64 = (i32) => f64; type ClosureSeti32 = (i32, i32) => void;
type ClosureSetf32 = (i32, f32) => void;
type ClosureSeti64 = (i32, i64) => void;
type ClosureSetf64 = (i32, f64) => void;
// End Closure Imports Header

Note: There is no memory cleanup in the reference implementation of the imports.

Note: You may provide your own import object under walt-plugin-closure as long as it matches the API above. The buit-in import provided by plugin isn't required.

changelog

Changelog

[0.12.0] - Sep 2018

  • Improve documentation
  • Add flow types to plugins
  • Add 'signature' to scope chains

[0.11.0] - Sep 2018

  • Split out Closures into a plugin
  • Improve plugin architecture
  • Add Rollup plugin for Walt Grammar
  • Add shared rollup configuration

[0.10.0] - Sep 2018

  • Replace parser with nearley project
  • Implement Plugin API
  • Convert all syntax to EBNF grammar
  • Convert most syntax validation to be powered by grammar

[0.2.1]

Added

  • Unary (-) operator (#6)

Changed

  • Animation demo to use unary(-) and pointers

Fixed

  • Object pointer parsing in Function arguments
  • Animation demo, missing types

[0.2.0]

Added

  • sizeof
  • typecasts (1 : f32), (0.5 : i32) etc.
  • top-level typecasts for expressions
  • type promotions in math expressions
  • type safety and warnings in binary expressions
  • Canvas example
  • Increment/decrement and assign +=/-=
  • basic support for the break keyword
  • node mapper

Changed

  • Cleaned up type parser
  • Debug type literal info

Removed

  • Unary ++/--

Fixed

  • Array indexing into user types and arrays of buit-ins
  • Many incorrectly name type conversion opcodes
  • Loop condition code
  • Cleaned up tons of build warnings
  • Tests, false positive tests.
  • Coverage improvements
  • Corrected float memory load encodings

[0.1.0]

Added

  • Stand-Alone .walt example files
  • Object literals generated into the binary
  • Object literal .walt example

Changed

  • Improved Type parser, generator
  • Array Type declaration are now required
  • Split generator into it's own src/generator/ namespace

Removed

  • parser/generator.js The generator should be it's own entity

Fixed

  • User defined object literal type parser

[0.0.2] - 2017-10-15

Added

  • CHANGELOG.md
  • Memory pre-defined type
  • Object literal syntax parser. Memory only see memory example
  • Single line comments

Changed

  • Memory type must be explicitly defined before memory can be used
  • Arrays can be indexed on any i32 offset

Removed

  • new keyword support
  • Implicit import of memory

Misc

  • A lot o f cleanup
  • Coverage improvements
  • Improved expression parser

[0.0.1]

Added

  • Everything