diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2015-08-11 14:45:34 +0200 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2015-08-11 14:45:59 +0200 |
commit | 1af1ab1c3c969a078c28d522205b6f84661368e1 (patch) | |
tree | fdd30af1bba69f212d89987e20c8bed93719f329 /javascript | |
parent | 45ced343af841f6a785554a7dde41a99a3a67185 (diff) | |
download | netsurf-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.c | 31 | ||||
-rw-r--r-- | javascript/dukky.h | 1 |
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 |