summaryrefslogtreecommitdiff
path: root/javascript
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2015-08-11 14:45:34 +0200
committerDaniel Silverstone <dsilvers@digital-scurf.org>2015-08-11 14:45:59 +0200
commit1af1ab1c3c969a078c28d522205b6f84661368e1 (patch)
treefdd30af1bba69f212d89987e20c8bed93719f329 /javascript
parent45ced343af841f6a785554a7dde41a99a3a67185 (diff)
downloadnetsurf-1af1ab1c3c969a078c28d522205b6f84661368e1.tar.gz
netsurf-1af1ab1c3c969a078c28d522205b6f84661368e1.tar.bz2
Add a variant of dukky_instanceof which can take an index
Diffstat (limited to 'javascript')
-rw-r--r--javascript/dukky.c31
-rw-r--r--javascript/dukky.h1
2 files changed, 32 insertions, 0 deletions
diff --git a/javascript/dukky.c b/javascript/dukky.c
index 6c8c531fe..3e70b02fd 100644
--- a/javascript/dukky.c
+++ b/javascript/dukky.c
@@ -37,6 +37,37 @@
#include <dom/dom.h>
+
+duk_bool_t
+dukky_instanceof_at(duk_context *ctx, duk_idx_t _idx, const char *klass)
+{
+ duk_idx_t idx = duk_normalize_index(ctx, _idx);
+ /* ... ??? */
+ if (!duk_check_type(ctx, idx, DUK_TYPE_OBJECT)) {
+ return false;
+ }
+ /* ... obj */
+ duk_get_global_string(ctx, "\xFF\xFFNETSURF_DUKTAPE_PROTOTYPES");
+ /* ... obj protos */
+ duk_get_prop_string(ctx, idx, klass);
+ /* ... obj protos goalproto */
+ duk_get_prototype(ctx, idx);
+ /* ... obj protos goalproto proto? */
+ while (!duk_is_undefined(ctx, -1)) {
+ if (duk_strict_equals(ctx, -1, -2)) {
+ duk_pop_3(ctx);
+ return true;
+ }
+ duk_get_prototype(ctx, -1);
+ /* ... obj protos goalproto proto proto? */
+ duk_replace(ctx, -2);
+ /* ... obj protos goalproto proto? */
+ }
+ duk_pop_3(ctx);
+ /* ... obj */
+ return false;
+}
+
static duk_ret_t dukky_populate_object(duk_context *ctx)
{
/* ... obj args protoname nargs */
diff --git a/javascript/dukky.h b/javascript/dukky.h
index abe21ba35..f484e3a13 100644
--- a/javascript/dukky.h
+++ b/javascript/dukky.h
@@ -28,5 +28,6 @@ duk_ret_t dukky_create_object(duk_context *ctx, const char *name, int args);
duk_bool_t dukky_push_node_stacked(duk_context *ctx);
duk_bool_t dukky_push_node(duk_context *ctx, struct dom_node *node);
void dukky_inject_not_ctr(duk_context *ctx, int idx, const char *name);
+duk_bool_t dukky_instanceof_at(duk_context *ctx, duk_idx_t _idx, const char *klass);
#endif