Duktape

Duktape is an embeddable Javascript engine, with a focus on portability and compact footprint.

Duktape is easy to integrate into a C/C++ project: add duktape.c and duktape.h to your build, and use the Duktape API to call Ecmascript functions from C code and vice versa.

Main features:

Current status:

(See Getting started for a more detailed introduction.)

1 Add to build

Add Duktape C source and header to your build. Any build system can be used. The distributable contains an example Makefile for reference. In the simplest case:

$ gcc -o test test.c duktape.c -lm
$ ./test
Hello world!

2 Initialize a context

Initialize and use Duktape somewhere in your program:

/* test.c */
#include "duktape.h"

int main(int argc, char *argv[]) {
  duk_context *ctx = duk_create_heap_default();
  duk_eval_string(ctx, "print('Hello world!');");
  duk_destroy_heap(ctx);
  return 0;
}

3 Add C function bindings

To call a C function from Ecmascript code, first declare your C function:

int adder(duk_context *ctx) {
  int i;
  int n = duk_get_top(ctx);  /* #args */
  double res = 0.0;

  for (i = 0; i < n; i++) {
    res += duk_to_number(ctx, i);
  }

  duk_push_number(ctx, res);
  return 1;  /* one return value */
}

Register your function e.g. into the global object:

duk_push_global_object(ctx);
duk_push_c_function(ctx, adder, DUK_VARARGS);
duk_put_prop_string(ctx, -2 /*idx:global*/, "adder");
duk_pop(ctx);  /* pop global */

You can then call your function from Ecmascript code:

duk_eval_string(ctx, "print('2+3=' + adder(2, 3));");
duk_pop(ctx);  /* pop eval result */