{"action":"created","comment":{"url":"https://api.github.com/repos/svaarala/duktape/pulls/comments/83487484","pull_request_review_id":4331318,"id":83487484,"diff_hunk":"@@ -0,0 +1,348 @@\n+/*\n+ *  WHATWG Encoding API built-ins\n+ *\n+ *  See: https://encoding.spec.whatwg.org/\n+ */\n+\n+#include \"duk_internal.h\"\n+\n+#if defined(DUK_USE_ENCODING_BUILTINS)\n+typedef struct {\n+\tduk_uint8_t *out;\n+\tduk_codepoint_t lead;\n+} duk__encode_context;\n+\n+typedef struct {\n+\tduk_bool_t bom_seen;\n+\tduk_bool_t fatal;\n+\tduk_bool_t ignore_bom;\n+\n+\t/* UTF-8 decode state */\n+\tduk_codepoint_t codepoint;\n+\tduk_int_t needed;\n+\tduk_int_t seen;\n+\tduk_uint8_t upper;\n+\tduk_uint8_t lower;\n+} duk__decode_context;\n+\n+#define DUK__U8_CONTINUE   0  /* continue to next byte */\n+#define DUK__U8_CODEPOINT  1  /* have codepoint */\n+#define DUK__U8_ERROR      2  /* decoding error */\n+#define DUK__U8_RETRY      3  /* retry byte, constraint: RETRY > ERROR */\n+\n+DUK_LOCAL void duk__utf8_decode_init(duk__decode_context *dec_ctx) {\n+\tdec_ctx->codepoint = 0x0000L;\n+\tdec_ctx->needed = 0;\n+\tdec_ctx->seen = 0;\n+\tdec_ctx->upper = 0xbf;\n+\tdec_ctx->lower = 0x80;\n+\tdec_ctx->bom_seen = 0;\n+}\n+\n+DUK_LOCAL int duk__utf8_decode_next(duk__decode_context *dec_ctx, duk_uint8_t byte, duk_codepoint_t *cp) {\n+\t/*\n+\t *  UTF-8 algorithm based on the Encoding specification:\n+\t *  https://encoding.spec.whatwg.org/#utf-8-decoder\n+\t */\n+\n+\tif (dec_ctx->needed == 0) {\n+\t\t/* process initial byte */\n+\t\tif (byte <= 0x7f) {\n+\t\t\t/* U+0000 - U+007F, 1 byte (ASCII) */\n+\t\t\t*cp = (duk_codepoint_t) byte;\n+\t\t\treturn DUK__U8_CODEPOINT;\n+\t\t} else if (byte >= 0xc2 && byte <= 0xdf) {\n+\t\t\t/* U+0080 - U+07FF, 2 bytes */\n+\t\t\tdec_ctx->needed = 2;\n+\t\t\tdec_ctx->codepoint = byte & 0x1f;\n+\t\t\treturn DUK__U8_CONTINUE;\n+\t\t} else if (byte >= 0xe0 && byte <= 0xef) {\n+\t\t\t/* U+0800 - U+FFFF, 3 bytes */\n+\t\t\tif (byte == 0xe0) {\n+\t\t\t\tdec_ctx->lower = 0xa0;\n+\t\t\t} else if (byte == 0xed) {\n+\t\t\t\tdec_ctx->upper = 0x9f;\n+\t\t\t}\n+\t\t\tdec_ctx->needed = 2;\n+\t\t\tdec_ctx->codepoint = byte & 0xf;\n+\t\t\treturn DUK__U8_CONTINUE;\n+\t\t} else if (byte >= 0xf0 && byte <= 0xf4) {\n+\t\t\t/* U+010000 - U+10FFFF, 4 bytes */\n+\t\t\tif (byte == 0xf0) {\n+\t\t\t\tdec_ctx->lower = 0x90;\n+\t\t\t} else if (byte == 0xf4) {\n+\t\t\t\tdec_ctx->upper = 0x8f;\n+\t\t\t}\n+\t\t\tdec_ctx->needed = 3;\n+\t\t\tdec_ctx->codepoint = byte & 0x7;\n+\t\t\treturn DUK__U8_CONTINUE;\n+\t\t} else {\n+\t\t\t/* not a valid UTF-8 initial byte */\n+\t\t\treturn DUK__U8_ERROR;\n+\t\t}\n+\t} else {\n+\t\t/* process continuation byte */\n+\t\tif (byte >= dec_ctx->lower && byte <= dec_ctx->upper) {\n+\t\t\tdec_ctx->lower = 0x80;\n+\t\t\tdec_ctx->upper = 0xbf;\n+\t\t\tdec_ctx->codepoint = (dec_ctx->codepoint << 6) | (byte & 0x3f);\n+\t\t\tif (++dec_ctx->seen < dec_ctx->needed) {\n+\t\t\t\t/* need more bytes */\n+\t\t\t\treturn DUK__U8_CONTINUE;\n+\t\t\t} else {\n+\t\t\t\t/* got a codepoint */\n+\t\t\t\t*cp = dec_ctx->codepoint;\n+\t\t\t\tdec_ctx->codepoint = 0x0000L;\n+\t\t\t\tdec_ctx->needed = 0;\n+\t\t\t\tdec_ctx->seen = 0;\n+\t\t\t\treturn DUK__U8_CODEPOINT;\n+\t\t\t}\n+\t\t} else {\n+\t\t\t/* We've just seen an invalid UTF-8 continuation byte.  This might\n+\t\t\t * be the initial byte of the next character; if we return a plain\n+\t\t\t * error status and the decoder is in replacement mode, the character\n+\t\t\t * will be masked.  We still need to alert the caller to the error\n+\t\t\t * though.\n+\t\t\t */\n+\t\t\tdec_ctx->codepoint = 0x0000L;\n+\t\t\tdec_ctx->needed = 0;\n+\t\t\tdec_ctx->seen = 0;\n+\t\t\tdec_ctx->lower = 0x80;\n+\t\t\tdec_ctx->upper = 0xbf;\n+\t\t\treturn DUK__U8_RETRY;\n+\t\t}\n+\t}\n+}\n+\n+DUK_LOCAL void duk__utf8_encode_char(void *udata, duk_codepoint_t codepoint) {\n+\tduk__encode_context *enc_ctx;\n+\n+\tenc_ctx = (duk__encode_context *) udata;\n+\tif (codepoint > 0x10ffffL) {\n+\t\t/* not a valid UTF-8 codepoint */\n+\t\tenc_ctx->out += duk_unicode_encode_xutf8(DUK_UNICODE_CP_REPLACEMENT_CHARACTER, enc_ctx->out);\n+\t} else if (codepoint >= 0xd800L && codepoint <= 0xdbffL) {\n+\t\t/* high surrogate */\n+\t\tif (enc_ctx->lead != 0x0000L) {\n+\t\t\t/* consecutive high surrogates, consider first one unpaired */\n+\t\t\tenc_ctx->out += duk_unicode_encode_xutf8(DUK_UNICODE_CP_REPLACEMENT_CHARACTER, enc_ctx->out);\n+\t\t}\n+\t\tenc_ctx->lead = codepoint;\n+\t} else if (codepoint >= 0xdc00L && codepoint <= 0xdfffL) {\n+\t\t/* low surrogate */\n+\t\tif (enc_ctx->lead != 0x0000L) {\n+\t\t\tcodepoint = 0x010000L | ((enc_ctx->lead - 0xd800L) << 10) | (codepoint - 0xdc00L);\n+\t\t\tenc_ctx->out += duk_unicode_encode_xutf8(codepoint, enc_ctx->out);\n+\t\t\tenc_ctx->lead = 0x0000L;\n+\t\t} else {\n+\t\t\t/* unpaired low surrogate */\n+\t\t\tenc_ctx->out += duk_unicode_encode_xutf8(DUK_UNICODE_CP_REPLACEMENT_CHARACTER, enc_ctx->out);\n+\t\t}\n+\t} else {\n+\t\tif (enc_ctx->lead != 0x0000L) {\n+\t\t\t/* unpaired high surrogate */\n+\t\t\tenc_ctx->out += duk_unicode_encode_xutf8(DUK_UNICODE_CP_REPLACEMENT_CHARACTER, enc_ctx->out);\n+\t\t\tenc_ctx->lead = 0x0000L;\n+\t\t}\n+\t\tenc_ctx->out += duk_unicode_encode_xutf8(codepoint, enc_ctx->out);\n+\t}\n+}\n+\n+DUK_INTERNAL duk_ret_t duk_bi_textencoder_constructor(duk_context *ctx) {\n+\t/*\n+\t *  TextEncoder currently requires no persistent state, so this constructor\n+\t *  does nothing on purpose.\n+\t */\n+\n+\tif (!duk_is_constructor_call(ctx)) {\n+        duk_error(ctx, DUK_ERR_TYPE_ERROR, \"constructor must use 'new'\");\n+    }\n+\treturn 0;\n+}\n+\n+DUK_INTERNAL duk_ret_t duk_bi_textencoder_prototype_encoding_getter(duk_context *ctx) {\n+\tduk_push_string(ctx, \"utf-8\");\n+\treturn 1;\n+}\n+\n+DUK_INTERNAL duk_ret_t duk_bi_textencoder_prototype_encode(duk_context *ctx) {\n+\tduk__encode_context enc_ctx;\n+\tduk_size_t len;\n+\tduk_uint8_t *output;\n+\n+\tif (duk_get_top(ctx) >= 1) {\n+\t\tduk_dup(ctx, 0);\n+\t\tduk_to_string(ctx, -1);\n+\t} else {\n+\t\tduk_push_string(ctx, \"\");\n+\t}\n+\n+\tlen = duk_get_length(ctx, -1);\n+\tif (len >= DUK_HBUFFER_MAX_BYTELEN / 3) {\n+\t\tduk_error(ctx, DUK_ERR_TYPE_ERROR, \"input string too long\");\n+\t}\n+\n+\t/* XXX: The buffer allocation strategy here (3x input length) is quite\n+\t * inefficient.  Maybe switch to a chunk-based strategy?\n+\t */\n+\n+\toutput = (duk_uint8_t *) duk_push_dynamic_buffer(ctx, len * 3);\n+\tenc_ctx.lead = 0x0000L;\n+\tenc_ctx.out = output;\n+\tduk_decode_string(ctx, -2, duk__utf8_encode_char, (void *) &enc_ctx);\n+\tif (enc_ctx.lead != 0x0000L) {\n+\t\t/* unpaired high surrogate at end of string */\n+\t\tenc_ctx.out += duk_unicode_encode_xutf8(DUK_UNICODE_CP_REPLACEMENT_CHARACTER, enc_ctx.out);\n+\t}\n+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n+\tduk_push_buffer_object(ctx, -1, 0, (duk_size_t) (enc_ctx.out - output), DUK_BUFOBJ_UINT8ARRAY);\n+#else\n+\t/* shrink buffer to include only the encoded text */\n+\tduk_resize_buffer(ctx, -1, (duk_size_t) (enc_ctx.out - output));\n+#endif\n+\treturn 1;\n+}\n+\n+DUK_INTERNAL duk_ret_t duk_bi_textdecoder_constructor(duk_context *ctx) {\n+\tduk__decode_context *dec_ctx;\n+\tduk_bool_t fatal = 0;\n+\tduk_bool_t ignore_bom = 0;\n+\tduk_idx_t nargs;\n+\n+\tnargs = duk_get_top(ctx);\n+\tif (!duk_is_constructor_call(ctx)) {\n+        duk_error(ctx, DUK_ERR_TYPE_ERROR, \"constructor must use 'new'\");\n+    }\n+\tif (nargs >= 1) {\n+\t\t/* XXX: for now, label is ignored */\n+\t\tduk_to_string(ctx, 0);\n+\t}\n+\tif (nargs >= 2 && !duk_is_null_or_undefined(ctx, 1)) {\n+\t\tif (duk_get_prop_string(ctx, 1, \"fatal\")) {\n+\t\t\tfatal = duk_to_boolean(ctx, -1);\n+\t\t}\n+\t\tif (duk_get_prop_string(ctx, 1, \"ignoreBOM\")) {\n+\t\t\tignore_bom = duk_to_boolean(ctx, -1);\n+\t\t}\n+\t}\n+\n+\tdec_ctx = (duk__decode_context *) duk_alloc(ctx, sizeof(duk__decode_context));\n+\tdec_ctx->fatal = fatal;\n+\tdec_ctx->ignore_bom = ignore_bom;\n+\tduk__utf8_decode_init(dec_ctx);\n+\n+\tduk_push_this(ctx);\n+\tduk_push_pointer(ctx, (void *) dec_ctx);\n+\tduk_put_prop_string(ctx, -2, \"\\xff\" \"Context\");\n+\treturn 0;\n+}\n+\n+DUK_INTERNAL duk_ret_t duk_bi_textdecoder_prototype_encoding_getter(duk_context *ctx) {\n+\tduk_push_string(ctx, \"utf-8\");\n+\treturn 1;\n+}\n+\n+DUK_INTERNAL duk_ret_t duk_bi_textdecoder_prototype_fatal_getter(duk_context *ctx) {\n+\tduk__decode_context *dec_ctx;\n+\n+\tduk_push_this(ctx);\n+\tduk_get_prop_string(ctx, -1, \"\\xff\" \"Context\");","path":"src-input/duk_bi_encoding.c","position":263,"original_position":249,"commit_id":"106dcf47d504277ff76ece369881333c82192744","original_commit_id":"1177a73bb5e568f02fac656da61e8ad25f3f9c78","user":{"login":"svaarala","id":6377415,"avatar_url":"https://avatars.githubusercontent.com/u/6377415?v=3","gravatar_id":"","url":"https://api.github.com/users/svaarala","html_url":"https://github.com/svaarala","followers_url":"https://api.github.com/users/svaarala/followers","following_url":"https://api.github.com/users/svaarala/following{/other_user}","gists_url":"https://api.github.com/users/svaarala/gists{/gist_id}","starred_url":"https://api.github.com/users/svaarala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/svaarala/subscriptions","organizations_url":"https://api.github.com/users/svaarala/orgs","repos_url":"https://api.github.com/users/svaarala/repos","events_url":"https://api.github.com/users/svaarala/events{/privacy}","received_events_url":"https://api.github.com/users/svaarala/received_events","type":"User","site_admin":false},"body":"Sure, adding it to the public API would probably a good idea too. But IMO it's best to experiment with it internally first to see if it works out.","created_at":"2016-10-14T19:35:14Z","updated_at":"2016-10-14T19:35:14Z","html_url":"https://github.com/svaarala/duktape/pull/975#discussion_r83487484","pull_request_url":"https://api.github.com/repos/svaarala/duktape/pulls/975","_links":{"self":{"href":"https://api.github.com/repos/svaarala/duktape/pulls/comments/83487484"},"html":{"href":"https://github.com/svaarala/duktape/pull/975#discussion_r83487484"},"pull_request":{"href":"https://api.github.com/repos/svaarala/duktape/pulls/975"}}},"pull_request":{"url":"https://api.github.com/repos/svaarala/duktape/pulls/975","id":86098431,"html_url":"https://github.com/svaarala/duktape/pull/975","diff_url":"https://github.com/svaarala/duktape/pull/975.diff","patch_url":"https://github.com/svaarala/duktape/pull/975.patch","issue_url":"https://api.github.com/repos/svaarala/duktape/issues/975","number":975,"state":"open","locked":false,"title":"Implement WHATWG Encoding API support","user":{"login":"fatcerberus","id":4097841,"avatar_url":"https://avatars.githubusercontent.com/u/4097841?v=3","gravatar_id":"","url":"https://api.github.com/users/fatcerberus","html_url":"https://github.com/fatcerberus","followers_url":"https://api.github.com/users/fatcerberus/followers","following_url":"https://api.github.com/users/fatcerberus/following{/other_user}","gists_url":"https://api.github.com/users/fatcerberus/gists{/gist_id}","starred_url":"https://api.github.com/users/fatcerberus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fatcerberus/subscriptions","organizations_url":"https://api.github.com/users/fatcerberus/orgs","repos_url":"https://api.github.com/users/fatcerberus/repos","events_url":"https://api.github.com/users/fatcerberus/events{/privacy}","received_events_url":"https://api.github.com/users/fatcerberus/received_events","type":"User","site_admin":false},"body":"Implements #961.\r\n \r\nAdd `TextEncoder` and `TextDecoder` built-ins as described by the WHATWG Encoding specification.  For this pull, only UTF-8/CESU-8 support is implemented.  UTF-16 and all legacy encodings are left as future work.\r\n\r\nSpecification:\r\nhttps://encoding.spec.whatwg.org/#api\r\n\r\nChecklist:\r\n- [x] Implement the WHATWG Encoding API: `TextEncoder` and `TextDecoder`\r\n- [x] Config option - `DUK_USE_ENCODING_BUILTINS`\r\n- [x] Support Encoding API with bufferobjects disabled?  Bindings could then work with plain buffers instead of Uint8Arrays (out of spec).\r\n- [x] Node.js Buffer `.toString()` can share code with `TextDecoder`? => Save for later\r\n- [x] Test cases for both encode and decode\r\n- [x] Website note (Encoding API listed in features)\r\n- [x] RELEASES entry","created_at":"2016-09-21T05:03:45Z","updated_at":"2016-10-14T19:35:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"864bed4bb28f115ea24707dcfe383010302e6416","assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/svaarala/duktape/milestones/5","html_url":"https://github.com/svaarala/duktape/milestones/v2.0.0","labels_url":"https://api.github.com/repos/svaarala/duktape/milestones/5/labels","id":840957,"number":5,"title":"v2.0.0","description":"","creator":{"login":"svaarala","id":6377415,"avatar_url":"https://avatars.githubusercontent.com/u/6377415?v=3","gravatar_id":"","url":"https://api.github.com/users/svaarala","html_url":"https://github.com/svaarala","followers_url":"https://api.github.com/users/svaarala/followers","following_url":"https://api.github.com/users/svaarala/following{/other_user}","gists_url":"https://api.github.com/users/svaarala/gists{/gist_id}","starred_url":"https://api.github.com/users/svaarala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/svaarala/subscriptions","organizations_url":"https://api.github.com/users/svaarala/orgs","repos_url":"https://api.github.com/users/svaarala/repos","events_url":"https://api.github.com/users/svaarala/events{/privacy}","received_events_url":"https://api.github.com/users/svaarala/received_events","type":"User","site_admin":false},"open_issues":66,"closed_issues":176,"state":"open","created_at":"2014-10-26T15:05:37Z","updated_at":"2016-10-13T21:59:00Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/svaarala/duktape/pulls/975/commits","review_comments_url":"https://api.github.com/repos/svaarala/duktape/pulls/975/comments","review_comment_url":"https://api.github.com/repos/svaarala/duktape/pulls/comments{/number}","comments_url":"https://api.github.com/repos/svaarala/duktape/issues/975/comments","statuses_url":"https://api.github.com/repos/svaarala/duktape/statuses/106dcf47d504277ff76ece369881333c82192744","head":{"label":"fatcerberus:whatwg-encoding","ref":"whatwg-encoding","sha":"106dcf47d504277ff76ece369881333c82192744","user":{"login":"fatcerberus","id":4097841,"avatar_url":"https://avatars.githubusercontent.com/u/4097841?v=3","gravatar_id":"","url":"https://api.github.com/users/fatcerberus","html_url":"https://github.com/fatcerberus","followers_url":"https://api.github.com/users/fatcerberus/followers","following_url":"https://api.github.com/users/fatcerberus/following{/other_user}","gists_url":"https://api.github.com/users/fatcerberus/gists{/gist_id}","starred_url":"https://api.github.com/users/fatcerberus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fatcerberus/subscriptions","organizations_url":"https://api.github.com/users/fatcerberus/orgs","repos_url":"https://api.github.com/users/fatcerberus/repos","events_url":"https://api.github.com/users/fatcerberus/events{/privacy}","received_events_url":"https://api.github.com/users/fatcerberus/received_events","type":"User","site_admin":false},"repo":{"id":35036428,"name":"duktape","full_name":"fatcerberus/duktape","owner":{"login":"fatcerberus","id":4097841,"avatar_url":"https://avatars.githubusercontent.com/u/4097841?v=3","gravatar_id":"","url":"https://api.github.com/users/fatcerberus","html_url":"https://github.com/fatcerberus","followers_url":"https://api.github.com/users/fatcerberus/followers","following_url":"https://api.github.com/users/fatcerberus/following{/other_user}","gists_url":"https://api.github.com/users/fatcerberus/gists{/gist_id}","starred_url":"https://api.github.com/users/fatcerberus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fatcerberus/subscriptions","organizations_url":"https://api.github.com/users/fatcerberus/orgs","repos_url":"https://api.github.com/users/fatcerberus/repos","events_url":"https://api.github.com/users/fatcerberus/events{/privacy}","received_events_url":"https://api.github.com/users/fatcerberus/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/fatcerberus/duktape","description":"Duktape - embeddable Javascript engine with a focus on portability and compact footprint","fork":true,"url":"https://api.github.com/repos/fatcerberus/duktape","forks_url":"https://api.github.com/repos/fatcerberus/duktape/forks","keys_url":"https://api.github.com/repos/fatcerberus/duktape/keys{/key_id}","collaborators_url":"https://api.github.com/repos/fatcerberus/duktape/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/fatcerberus/duktape/teams","hooks_url":"https://api.github.com/repos/fatcerberus/duktape/hooks","issue_events_url":"https://api.github.com/repos/fatcerberus/duktape/issues/events{/number}","events_url":"https://api.github.com/repos/fatcerberus/duktape/events","assignees_url":"https://api.github.com/repos/fatcerberus/duktape/assignees{/user}","branches_url":"https://api.github.com/repos/fatcerberus/duktape/branches{/branch}","tags_url":"https://api.github.com/repos/fatcerberus/duktape/tags","blobs_url":"https://api.github.com/repos/fatcerberus/duktape/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/fatcerberus/duktape/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/fatcerberus/duktape/git/refs{/sha}","trees_url":"https://api.github.com/repos/fatcerberus/duktape/git/trees{/sha}","statuses_url":"https://api.github.com/repos/fatcerberus/duktape/statuses/{sha}","languages_url":"https://api.github.com/repos/fatcerberus/duktape/languages","stargazers_url":"https://api.github.com/repos/fatcerberus/duktape/stargazers","contributors_url":"https://api.github.com/repos/fatcerberus/duktape/contributors","subscribers_url":"https://api.github.com/repos/fatcerberus/duktape/subscribers","subscription_url":"https://api.github.com/repos/fatcerberus/duktape/subscription","commits_url":"https://api.github.com/repos/fatcerberus/duktape/commits{/sha}","git_commits_url":"https://api.github.com/repos/fatcerberus/duktape/git/commits{/sha}","comments_url":"https://api.github.com/repos/fatcerberus/duktape/comments{/number}","issue_comment_url":"https://api.github.com/repos/fatcerberus/duktape/issues/comments{/number}","contents_url":"https://api.github.com/repos/fatcerberus/duktape/contents/{+path}","compare_url":"https://api.github.com/repos/fatcerberus/duktape/compare/{base}...{head}","merges_url":"https://api.github.com/repos/fatcerberus/duktape/merges","archive_url":"https://api.github.com/repos/fatcerberus/duktape/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/fatcerberus/duktape/downloads","issues_url":"https://api.github.com/repos/fatcerberus/duktape/issues{/number}","pulls_url":"https://api.github.com/repos/fatcerberus/duktape/pulls{/number}","milestones_url":"https://api.github.com/repos/fatcerberus/duktape/milestones{/number}","notifications_url":"https://api.github.com/repos/fatcerberus/duktape/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/fatcerberus/duktape/labels{/name}","releases_url":"https://api.github.com/repos/fatcerberus/duktape/releases{/id}","deployments_url":"https://api.github.com/repos/fatcerberus/duktape/deployments","created_at":"2015-05-04T13:30:42Z","updated_at":"2016-01-11T04:56:49Z","pushed_at":"2016-10-14T14:53:47Z","git_url":"git://github.com/fatcerberus/duktape.git","ssh_url":"git@github.com:fatcerberus/duktape.git","clone_url":"https://github.com/fatcerberus/duktape.git","svn_url":"https://github.com/fatcerberus/duktape","homepage":null,"size":63675,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"svaarala:master","ref":"master","sha":"4945db032d78afb85324cd1a8fca3264838ccd3b","user":{"login":"svaarala","id":6377415,"avatar_url":"https://avatars.githubusercontent.com/u/6377415?v=3","gravatar_id":"","url":"https://api.github.com/users/svaarala","html_url":"https://github.com/svaarala","followers_url":"https://api.github.com/users/svaarala/followers","following_url":"https://api.github.com/users/svaarala/following{/other_user}","gists_url":"https://api.github.com/users/svaarala/gists{/gist_id}","starred_url":"https://api.github.com/users/svaarala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/svaarala/subscriptions","organizations_url":"https://api.github.com/users/svaarala/orgs","repos_url":"https://api.github.com/users/svaarala/repos","events_url":"https://api.github.com/users/svaarala/events{/privacy}","received_events_url":"https://api.github.com/users/svaarala/received_events","type":"User","site_admin":false},"repo":{"id":15852088,"name":"duktape","full_name":"svaarala/duktape","owner":{"login":"svaarala","id":6377415,"avatar_url":"https://avatars.githubusercontent.com/u/6377415?v=3","gravatar_id":"","url":"https://api.github.com/users/svaarala","html_url":"https://github.com/svaarala","followers_url":"https://api.github.com/users/svaarala/followers","following_url":"https://api.github.com/users/svaarala/following{/other_user}","gists_url":"https://api.github.com/users/svaarala/gists{/gist_id}","starred_url":"https://api.github.com/users/svaarala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/svaarala/subscriptions","organizations_url":"https://api.github.com/users/svaarala/orgs","repos_url":"https://api.github.com/users/svaarala/repos","events_url":"https://api.github.com/users/svaarala/events{/privacy}","received_events_url":"https://api.github.com/users/svaarala/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/svaarala/duktape","description":"Duktape - embeddable Javascript engine with a focus on portability and compact footprint","fork":false,"url":"https://api.github.com/repos/svaarala/duktape","forks_url":"https://api.github.com/repos/svaarala/duktape/forks","keys_url":"https://api.github.com/repos/svaarala/duktape/keys{/key_id}","collaborators_url":"https://api.github.com/repos/svaarala/duktape/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/svaarala/duktape/teams","hooks_url":"https://api.github.com/repos/svaarala/duktape/hooks","issue_events_url":"https://api.github.com/repos/svaarala/duktape/issues/events{/number}","events_url":"https://api.github.com/repos/svaarala/duktape/events","assignees_url":"https://api.github.com/repos/svaarala/duktape/assignees{/user}","branches_url":"https://api.github.com/repos/svaarala/duktape/branches{/branch}","tags_url":"https://api.github.com/repos/svaarala/duktape/tags","blobs_url":"https://api.github.com/repos/svaarala/duktape/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/svaarala/duktape/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/svaarala/duktape/git/refs{/sha}","trees_url":"https://api.github.com/repos/svaarala/duktape/git/trees{/sha}","statuses_url":"https://api.github.com/repos/svaarala/duktape/statuses/{sha}","languages_url":"https://api.github.com/repos/svaarala/duktape/languages","stargazers_url":"https://api.github.com/repos/svaarala/duktape/stargazers","contributors_url":"https://api.github.com/repos/svaarala/duktape/contributors","subscribers_url":"https://api.github.com/repos/svaarala/duktape/subscribers","subscription_url":"https://api.github.com/repos/svaarala/duktape/subscription","commits_url":"https://api.github.com/repos/svaarala/duktape/commits{/sha}","git_commits_url":"https://api.github.com/repos/svaarala/duktape/git/commits{/sha}","comments_url":"https://api.github.com/repos/svaarala/duktape/comments{/number}","issue_comment_url":"https://api.github.com/repos/svaarala/duktape/issues/comments{/number}","contents_url":"https://api.github.com/repos/svaarala/duktape/contents/{+path}","compare_url":"https://api.github.com/repos/svaarala/duktape/compare/{base}...{head}","merges_url":"https://api.github.com/repos/svaarala/duktape/merges","archive_url":"https://api.github.com/repos/svaarala/duktape/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/svaarala/duktape/downloads","issues_url":"https://api.github.com/repos/svaarala/duktape/issues{/number}","pulls_url":"https://api.github.com/repos/svaarala/duktape/pulls{/number}","milestones_url":"https://api.github.com/repos/svaarala/duktape/milestones{/number}","notifications_url":"https://api.github.com/repos/svaarala/duktape/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/svaarala/duktape/labels{/name}","releases_url":"https://api.github.com/repos/svaarala/duktape/releases{/id}","deployments_url":"https://api.github.com/repos/svaarala/duktape/deployments","created_at":"2014-01-12T22:16:14Z","updated_at":"2016-10-13T09:09:31Z","pushed_at":"2016-10-14T14:53:47Z","git_url":"git://github.com/svaarala/duktape.git","ssh_url":"git@github.com:svaarala/duktape.git","clone_url":"https://github.com/svaarala/duktape.git","svn_url":"https://github.com/svaarala/duktape","homepage":null,"size":77891,"stargazers_count":2404,"watchers_count":2404,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":223,"mirror_url":null,"open_issues_count":239,"forks":223,"open_issues":239,"watchers":2404,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/svaarala/duktape/pulls/975"},"html":{"href":"https://github.com/svaarala/duktape/pull/975"},"issue":{"href":"https://api.github.com/repos/svaarala/duktape/issues/975"},"comments":{"href":"https://api.github.com/repos/svaarala/duktape/issues/975/comments"},"review_comments":{"href":"https://api.github.com/repos/svaarala/duktape/pulls/975/comments"},"review_comment":{"href":"https://api.github.com/repos/svaarala/duktape/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/svaarala/duktape/pulls/975/commits"},"statuses":{"href":"https://api.github.com/repos/svaarala/duktape/statuses/106dcf47d504277ff76ece369881333c82192744"}}}}
{"actor":{"display_login":"svaarala"}}