本文整理汇总了C++中duk_pop函数的典型用法代码示例。如果您正苦于以下问题:C++ duk_pop函数的具体用法?C++ duk_pop怎么用?C++ duk_pop使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了duk_pop函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: duk_bi_array_prototype_iter_shared
int duk_bi_array_prototype_iter_shared(duk_context *ctx) {
int len;
int i;
int k;
int bval;
int iter_type = duk_get_magic(ctx);
duk_uint32_t res_length = 0;
/* each call this helper serves has nargs==2 */
DUK_ASSERT_TOP(ctx, 2);
len = duk__push_this_obj_len_u32(ctx);
if (!duk_is_callable(ctx, 0)) {
goto type_error;
}
/* if thisArg not supplied, behave as if undefined was supplied */
if (iter_type == DUK__ITER_MAP || iter_type == DUK__ITER_FILTER) {
duk_push_array(ctx);
} else {
duk_push_undefined(ctx);
}
/* stack[0] = callback
* stack[1] = thisArg
* stack[2] = object
* stack[3] = ToUint32(length) (unused, but avoid unnecessary pop)
* stack[4] = result array (or undefined)
*/
k = 0; /* result index for filter() */
for (i = 0; i < len; i++) {
DUK_ASSERT_TOP(ctx, 5);
if (!duk_get_prop_index(ctx, 2, i)) {
duk_pop(ctx);
continue;
}
/* The original value needs to be preserved for filter(), hence
* this funny order. We can't re-get the value because of side
* effects.
*/
duk_dup(ctx, 0);
duk_dup(ctx, 1);
duk_dup(ctx, -3);
duk_push_int(ctx, i);
duk_dup(ctx, 2); /* [ ... val callback thisArg val i obj ] */
duk_call_method(ctx, 3); /* -> [ ... val retval ] */
switch (iter_type) {
case DUK__ITER_EVERY:
bval = duk_to_boolean(ctx, -1);
if (!bval) {
/* stack top contains 'false' */
return 1;
}
break;
case DUK__ITER_SOME:
bval = duk_to_boolean(ctx, -1);
if (bval) {
/* stack top contains 'true' */
return 1;
}
break;
case DUK__ITER_FOREACH:
/* nop */
break;
case DUK__ITER_MAP:
duk_dup(ctx, -1);
duk_def_prop_index(ctx, 4, i, DUK_PROPDESC_FLAGS_WEC); /* retval to result[i] */
res_length = i + 1;
break;
case DUK__ITER_FILTER:
bval = duk_to_boolean(ctx, -1);
if (bval) {
duk_dup(ctx, -2); /* orig value */
duk_def_prop_index(ctx, 4, k, DUK_PROPDESC_FLAGS_WEC);
k++;
res_length = k;
}
break;
default:
DUK_UNREACHABLE();
break;
}
duk_pop_2(ctx);
DUK_ASSERT_TOP(ctx, 5);
}
switch (iter_type) {
case DUK__ITER_EVERY:
duk_push_true(ctx);
break;
case DUK__ITER_SOME:
duk_push_false(ctx);
break;
case DUK__ITER_FOREACH:
//.........这里部分代码省略.........
示例2: duk_bi_object_constructor_keys_shared
/* Shared helper for Object.getOwnPropertyNames() and Object.keys().
* Magic: 0=getOwnPropertyNames, 1=Object.keys.
*/
DUK_INTERNAL duk_ret_t duk_bi_object_constructor_keys_shared(duk_context *ctx) {
duk_hthread *thr = (duk_hthread *) ctx;
duk_hobject *obj;
#if defined(DUK_USE_ES6_PROXY)
duk_hobject *h_proxy_target;
duk_hobject *h_proxy_handler;
duk_hobject *h_trap_result;
duk_uarridx_t i, len, idx;
#endif
duk_small_uint_t enum_flags;
DUK_ASSERT_TOP(ctx, 1);
DUK_UNREF(thr);
obj = duk_require_hobject_or_lfunc_coerce(ctx, 0);
DUK_ASSERT(obj != NULL);
DUK_UNREF(obj);
#if defined(DUK_USE_ES6_PROXY)
if (DUK_LIKELY(!duk_hobject_proxy_check(thr,
obj,
&h_proxy_target,
&h_proxy_handler))) {
goto skip_proxy;
}
duk_push_hobject(ctx, h_proxy_handler);
if (!duk_get_prop_stridx(ctx, -1, DUK_STRIDX_OWN_KEYS)) {
/* Careful with reachability here: don't pop 'obj' before pushing
* proxy target.
*/
DUK_DDD(DUK_DDDPRINT("no ownKeys trap, get keys of target instead"));
duk_pop_2(ctx);
duk_push_hobject(ctx, h_proxy_target);
duk_replace(ctx, 0);
DUK_ASSERT_TOP(ctx, 1);
goto skip_proxy;
}
/* [ obj handler trap ] */
duk_insert(ctx, -2);
duk_push_hobject(ctx, h_proxy_target); /* -> [ obj trap handler target ] */
duk_call_method(ctx, 1 /*nargs*/); /* -> [ obj trap_result ] */
h_trap_result = duk_require_hobject(ctx, -1);
DUK_UNREF(h_trap_result);
len = (duk_uarridx_t) duk_get_length(ctx, -1);
idx = 0;
duk_push_array(ctx);
for (i = 0; i < len; i++) {
/* [ obj trap_result res_arr ] */
if (duk_get_prop_index(ctx, -2, i) && duk_is_string(ctx, -1)) {
/* XXX: for Object.keys() we should check enumerability of key */
/* [ obj trap_result res_arr propname ] */
duk_put_prop_index(ctx, -2, idx);
idx++;
} else {
duk_pop(ctx);
}
}
/* XXX: missing trap result validation for non-configurable target keys
* (must be present), for non-extensible target all target keys must be
* present and no extra keys can be present.
* http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots-ownpropertykeys
*/
/* XXX: for Object.keys() the [[OwnPropertyKeys]] result (trap result)
* should be filtered so that only enumerable keys remain. Enumerability
* should be checked with [[GetOwnProperty]] on the original object
* (i.e., the proxy in this case). If the proxy has a getOwnPropertyDescriptor
* trap, it should be triggered for every property. If the proxy doesn't have
* the trap, enumerability should be checked against the target object instead.
* We don't do any of this now, so Object.keys() and Object.getOwnPropertyNames()
* return the same result now for proxy traps. We still do clean up the trap
* result, so that Object.keys() and Object.getOwnPropertyNames() will return a
* clean array of strings without gaps.
*/
return 1;
skip_proxy:
#endif /* DUK_USE_ES6_PROXY */
DUK_ASSERT_TOP(ctx, 1);
if (duk_get_current_magic(ctx)) {
/* Object.keys */
enum_flags = DUK_ENUM_OWN_PROPERTIES_ONLY |
DUK_ENUM_NO_PROXY_BEHAVIOR;
} else {
/* Object.getOwnPropertyNames */
enum_flags = DUK_ENUM_INCLUDE_NONENUMERABLE |
DUK_ENUM_OWN_PROPERTIES_ONLY |
DUK_ENUM_NO_PROXY_BEHAVIOR;
}
return duk_hobject_get_enumerated_keys(ctx, enum_flags);
//.........这里部分代码省略.........
示例3: duk__err_augment_builtin_throw
static void duk__err_augment_builtin_throw(duk_hthread *thr, duk_hthread *thr_callstack, const char *filename, int line, int noblame_fileline, duk_hobject *obj) {
duk_context *ctx = (duk_context *) thr;
#ifdef DUK_USE_ASSERTIONS
duk_int_t entry_top;
#endif
#ifdef DUK_USE_ASSERTIONS
entry_top = duk_get_top(ctx);
#endif
DUK_ASSERT(obj != NULL);
DUK_UNREF(obj); /* unreferenced w/o tracebacks */
DUK_UNREF(ctx); /* unreferenced w/ tracebacks */
#ifdef DUK_USE_TRACEBACKS
/*
* If tracebacks are enabled, the 'tracedata' property is the only
* thing we need: 'fileName' and 'lineNumber' are virtual properties
* which use 'tracedata'.
*/
if (duk_hobject_hasprop_raw(thr, obj, DUK_HTHREAD_STRING_TRACEDATA(thr))) {
DUK_DDD(DUK_DDDPRINT("error value already has a 'tracedata' property, not modifying it"));
} else {
duk__add_traceback(thr, thr_callstack, filename, line, noblame_fileline);
}
#else
/*
* If tracebacks are disabled, 'fileName' and 'lineNumber' are added
* as plain own properties. Since Error.prototype has accessors of
* the same name, we need to define own properties directly (cannot
* just use e.g. duk_put_prop_stridx). Existing properties are not
* overwritten in case they already exist.
*/
if (filename && !noblame_fileline) {
/* FIXME: file/line is disabled in minimal builds, so disable this too
* when appropriate.
*/
duk_push_string(ctx, filename);
duk_def_prop_stridx(ctx, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_WC | DUK_PROPDESC_FLAG_NO_OVERWRITE);
duk_push_int(ctx, line);
duk_def_prop_stridx(ctx, -2, DUK_STRIDX_LINE_NUMBER, DUK_PROPDESC_FLAGS_WC | DUK_PROPDESC_FLAG_NO_OVERWRITE);
} else if (thr_callstack->callstack_top > 0) {
duk_activation *act;
duk_hobject *func;
duk_hbuffer *pc2line;
act = thr_callstack->callstack + thr_callstack->callstack_top - 1;
DUK_ASSERT(act >= thr_callstack->callstack && act < thr_callstack->callstack + thr_callstack->callstack_size);
func = act->func;
if (func) {
int pc;
duk_uint32_t line;
/* PC points to next instruction, find offending PC. Note that
* PC == 0 for native code.
*/
pc = act->pc;
if (pc > 0) {
pc--;
}
DUK_ASSERT(pc >= 0 && (double) pc < DUK_DOUBLE_2TO32); /* assume PC is at most 32 bits and non-negative */
act = NULL; /* invalidated by pushes, so get out of the way */
duk_push_hobject(ctx, func);
/* [ ... error func ] */
duk_get_prop_stridx(ctx, -1, DUK_STRIDX_FILE_NAME);
duk_def_prop_stridx(ctx, -3, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_WC | DUK_PROPDESC_FLAG_NO_OVERWRITE);
if (DUK_HOBJECT_IS_COMPILEDFUNCTION(func)) {
#if 0
duk_push_number(ctx, pc);
duk_def_prop_stridx(ctx, -3, DUK_STRIDX_PC, DUK_PROPDESC_FLAGS_WC | DUK_PROPDESC_FLAGS_NO_OVERWRITE);
#endif
duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_PC2LINE);
if (duk_is_buffer(ctx, -1)) {
pc2line = duk_get_hbuffer(ctx, -1);
DUK_ASSERT(pc2line != NULL);
DUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC(pc2line));
line = duk_hobject_pc2line_query((duk_hbuffer_fixed *) pc2line, (duk_uint_fast32_t) pc);
duk_push_number(ctx, (double) line); /* -> [ ... error func pc2line line ] */ /* FIXME: u32 */
duk_def_prop_stridx(ctx, -4, DUK_STRIDX_LINE_NUMBER, DUK_PROPDESC_FLAGS_WC | DUK_PROPDESC_FLAG_NO_OVERWRITE);
}
duk_pop(ctx);
} else {
/* Native function, no relevant lineNumber. */
}
duk_pop(ctx);
}
}
#endif /* DUK_USE_TRACEBACKS */
#ifdef DUK_USE_ASSERTIONS
DUK_ASSERT(duk_get_top(ctx) == entry_top);
#endif
}
示例4: duk_hthread_create_builtin_objects
//.........这里部分代码省略.........
duk_push_true(ctx);
break;
}
case DUK__PROP_TYPE_BOOLEAN_FALSE: {
duk_push_false(ctx);
break;
}
case DUK__PROP_TYPE_ACCESSOR: {
int natidx_getter = duk_bd_decode(bd, DUK__NATIDX_BITS);
int natidx_setter = duk_bd_decode(bd, DUK__NATIDX_BITS);
duk_c_function c_func_getter;
duk_c_function c_func_setter;
/* XXX: this is a bit awkward because there is no exposed helper
* in the API style, only this internal helper.
*/
DUK_DDDPRINT("built-in accessor property: objidx=%d, stridx=%d, getteridx=%d, setteridx=%d, flags=0x%04x",
i, stridx, natidx_getter, natidx_setter, prop_flags);
c_func_getter = duk_bi_native_functions[natidx_getter];
c_func_setter = duk_bi_native_functions[natidx_setter];
duk_push_c_function_noconstruct_nospecial(ctx, c_func_getter, 0); /* always 0 args */
duk_push_c_function_noconstruct_nospecial(ctx, c_func_setter, 1); /* always 1 arg */
/* FIXME: magic for getter/setter? */
prop_flags |= DUK_PROPDESC_FLAG_ACCESSOR; /* accessor flag not encoded explicitly */
duk_hobject_define_accessor_internal(thr,
duk_require_hobject(ctx, i),
DUK_HTHREAD_GET_STRING(thr, stridx),
duk_require_hobject(ctx, -2),
duk_require_hobject(ctx, -1),
prop_flags);
duk_pop_2(ctx); /* getter and setter, now reachable through object */
goto skip_value;
}
default: {
/* exhaustive */
DUK_UNREACHABLE();
}
}
DUK_ASSERT((prop_flags & DUK_PROPDESC_FLAG_ACCESSOR) == 0);
duk_def_prop_stridx(ctx, i, stridx, prop_flags);
skip_value:
continue; /* avoid empty label at the end of a compound statement */
}
/* native function properties */
num = duk_bd_decode(bd, DUK__NUM_FUNC_PROPS_BITS);
DUK_DDDPRINT("built-in object %d, %d function valued properties", i, num);
for (j = 0; j < num; j++) {
int stridx;
int natidx;
int c_nargs;
int c_length;
duk_int16_t magic;
duk_c_function c_func;
duk_hnativefunction *h_func;
stridx = duk_bd_decode(bd, DUK__STRIDX_BITS);
natidx = duk_bd_decode(bd, DUK__NATIDX_BITS);
c_length = duk_bd_decode(bd, DUK__LENGTH_PROP_BITS);
c_nargs = duk_bd_decode_flagged(bd, DUK__NARGS_BITS, (duk_int32_t) c_length /*def_value*/);
示例5: handle_interactive
int handle_interactive(duk_context *ctx) {
const char *prompt = "duk> ";
char *buffer = NULL;
int retval = 0;
int rc;
int got_eof = 0;
duk_eval_string(ctx, GREET_CODE(" [no readline]"));
duk_pop(ctx);
buffer = (char *) malloc(LINEBUF_SIZE);
if (!buffer) {
fprintf(stderr, "failed to allocated a line buffer\n");
fflush(stderr);
retval = -1;
goto done;
}
while (!got_eof) {
size_t idx = 0;
fwrite(prompt, 1, strlen(prompt), stdout);
fflush(stdout);
for (;;) {
int c = fgetc(stdin);
if (c == EOF) {
got_eof = 1;
break;
} else if (c == '\n') {
break;
} else if (idx >= LINEBUF_SIZE) {
fprintf(stderr, "line too long\n");
fflush(stderr);
retval = -1;
goto done;
} else {
buffer[idx++] = (char) c;
}
}
duk_push_lstring(ctx, buffer, idx);
duk_push_string(ctx, "input");
interactive_mode = 1; /* global */
rc = duk_safe_call(ctx, wrapped_compile_execute, 2 /*nargs*/, 1 /*nret*/);
if (rc != DUK_EXEC_SUCCESS) {
/* in interactive mode, write to stdout */
print_error(ctx, stdout);
retval = -1; /* an error 'taints' the execution */
} else {
duk_pop(ctx);
}
}
done:
if (buffer) {
free(buffer);
buffer = NULL;
}
return retval;
}
示例6: duk_bi_array_prototype_splice
DUK_INTERNAL duk_ret_t duk_bi_array_prototype_splice(duk_context *ctx) {
duk_idx_t nargs;
duk_uint32_t len;
duk_bool_t have_delcount;
duk_int_t item_count;
duk_int_t act_start;
duk_int_t del_count;
duk_int_t i, n;
DUK_UNREF(have_delcount);
nargs = duk_get_top(ctx);
if (nargs < 2) {
duk_set_top(ctx, 2);
nargs = 2;
have_delcount = 0;
} else {
have_delcount = 1;
}
/* XXX: len >= 0x80000000 won't work below because we need to be
* able to represent -len.
*/
len = duk__push_this_obj_len_u32_limited(ctx);
act_start = duk_to_int_clamped(ctx, 0, -((duk_int_t) len), (duk_int_t) len);
if (act_start < 0) {
act_start = len + act_start;
}
DUK_ASSERT(act_start >= 0 && act_start <= (duk_int_t) len);
#ifdef DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT
if (have_delcount) {
#endif
del_count = duk_to_int_clamped(ctx, 1, 0, len - act_start);
#ifdef DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT
} else {
/* E5.1 standard behavior when deleteCount is not given would be
* to treat it just like if 'undefined' was given, which coerces
* ultimately to 0. Real world behavior is to splice to the end
* of array, see test-bi-array-proto-splice-no-delcount.js.
*/
del_count = len - act_start;
}
#endif
DUK_ASSERT(nargs >= 2);
item_count = (duk_int_t) (nargs - 2);
DUK_ASSERT(del_count >= 0 && del_count <= (duk_int_t) len - act_start);
DUK_ASSERT(del_count + act_start <= (duk_int_t) len);
/* For now, restrict result array into 32-bit length range. */
if (((duk_double_t) len) - ((duk_double_t) del_count) + ((duk_double_t) item_count) > (duk_double_t) DUK_UINT32_MAX) {
DUK_D(DUK_DPRINT("Array.prototype.splice() would go beyond 32-bit length, throw"));
return DUK_RET_RANGE_ERROR;
}
duk_push_array(ctx);
/* stack[0] = start
* stack[1] = deleteCount
* stack[2...nargs-1] = items
* stack[nargs] = ToObject(this) -3
* stack[nargs+1] = ToUint32(length) -2
* stack[nargs+2] = result array -1
*/
DUK_ASSERT_TOP(ctx, nargs + 3);
/* Step 9: copy elements-to-be-deleted into the result array */
for (i = 0; i < del_count; i++) {
if (duk_get_prop_index(ctx, -3, (duk_uarridx_t) (act_start + i))) {
duk_xdef_prop_index_wec(ctx, -2, i); /* throw flag irrelevant (false in std alg) */
} else {
duk_pop(ctx);
}
}
duk_push_u32(ctx, (duk_uint32_t) del_count);
duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W);
/* Steps 12 and 13: reorganize elements to make room for itemCount elements */
if (item_count < del_count) {
/* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 1
* -> [ A B F G H ] (conceptual intermediate step)
* -> [ A B . F G H ] (placeholder marked)
* [ A B C F G H ] (actual result at this point, C will be replaced)
*/
DUK_ASSERT_TOP(ctx, nargs + 3);
n = len - del_count;
for (i = act_start; i < n; i++) {
if (duk_get_prop_index(ctx, -3, (duk_uarridx_t) (i + del_count))) {
duk_put_prop_index(ctx, -4, (duk_uarridx_t) (i + item_count));
} else {
duk_pop(ctx);
duk_del_prop_index(ctx, -3, (duk_uarridx_t) (i + item_count));
//.........这里部分代码省略.........
示例7: test_1
static duk_ret_t test_1(duk_context *ctx, void *udata) {
duk_size_t i, n;
char *buf;
(void) udata;
duk_set_top(ctx, 0);
duk_push_undefined(ctx);
duk_push_null(ctx);
duk_push_true(ctx);
duk_push_false(ctx);
duk_push_nan(ctx);
duk_push_number(ctx, -INFINITY);
duk_push_number(ctx, +INFINITY);
duk_push_number(ctx, -0.0);
duk_push_number(ctx, +0.0);
duk_push_int(ctx, 123);
duk_push_string(ctx, "foo");
duk_push_lstring(ctx, "foo\0bar", 7); /* internal NULs are kept */
duk_push_object(ctx);
buf = (char *) duk_push_fixed_buffer(ctx, 0);
buf = (char *) duk_push_fixed_buffer(ctx, 16);
for (i = 0; i < 16; i++) {
buf[i] = i;
}
buf = (char *) duk_push_dynamic_buffer(ctx, 0);
buf = (char *) duk_push_dynamic_buffer(ctx, 16);
for (i = 0; i < 16; i++) {
buf[i] = i;
}
duk_push_pointer(ctx, (void *) NULL);
duk_push_pointer(ctx, (void *) 0xdeadbeef);
n = duk_get_top(ctx);
printf("top: %ld\n", (long) n);
for (i = 0; i < n; i++) {
duk_int_t t1, t2;
void *ptr;
duk_size_t sz;
duk_dup(ctx, i);
t1 = duk_get_type(ctx, -1);
sz = (duk_size_t) 0xdeadbeef;
ptr = duk_to_buffer(ctx, -1, &sz);
t2 = duk_get_type(ctx, -1);
printf("index %ld, type %ld -> %ld, ptr-is-NULL %d, size %lu\n",
(long) i, (long) t1, (long) t2,
(sz == 0 ? -1 : (ptr == NULL ? 1 : 0)),
(unsigned long) sz);
dump_buffer(ctx);
duk_pop(ctx);
/* just check that this doesn't break */
duk_dup(ctx, i);
ptr = duk_to_buffer(ctx, -1, NULL);
duk_pop(ctx);
}
return 0;
}
示例8: dukzip_zip_add
static duk_ret_t dukzip_zip_add(duk_context *ctx) {
zip_fileinfo zi = {0};
int res = ZIP_OK;
zipFile archive = dukzip_zip_from_this(ctx);
const char *filename = "";
duk_int_t level = Z_DEFAULT_COMPRESSION;
duk_int_t method = Z_DEFLATED;
const char *comment = "";
int datalen = 0;
void *data = NULL;
if (duk_is_object(ctx, 0)) {
dukzip_zip_checkoptions(ctx, 0, &filename, &level, &method, &comment);
duk_get_prop_string(ctx, 0, "data");
if (duk_is_string(ctx, -1)) {
data = (void *)duk_get_lstring(ctx, -1, &datalen);
} else if (duk_is_buffer(ctx, -1) || duk_is_object(ctx, -1)) {
data = duk_require_buffer_data(ctx, -1, &datalen);
} else {
duk_error(ctx, DUK_ERR_TYPE_ERROR, "unable to write data to zip file (supported types: string, buffer)");
return -1;
}
} else {
filename = duk_require_string(ctx, 0);
if (duk_is_string(ctx, 1)) {
data = (void *)duk_get_lstring(ctx, 1, &datalen);
} else if (duk_is_buffer(ctx, 1) || duk_is_object(ctx, 1)) {
data = duk_require_buffer_data(ctx, 1, &datalen);
} else {
duk_error(ctx, DUK_ERR_TYPE_ERROR, "unable to write argument to zip file (supported types: string, buffer)");
return -1;
}
if (duk_is_number(ctx, 2)) {
level = duk_get_int(ctx, 2);
}
/* push dummy to normalize stack */
duk_push_string(ctx, "dummy");
}
res = zipOpenNewFileInZip64(archive, filename, &zi, NULL, 0, NULL, 0, comment, method, level, 1);
if (res != ZIP_OK) {
goto error;
}
res = zipWriteInFileInZip(archive, data, datalen);
if (res != ZIP_OK) {
goto error;
}
res = zipCloseFileInZip(archive);
duk_pop(ctx); /* pop buffer (or dummy) from stack */
if (res == ZIP_OK) {
duk_push_true(ctx);
} else {
duk_push_false(ctx);
}
return 1;
error:
zipCloseFileInZip(archive);
duk_error(ctx, DUK_ERR_INTERNAL_ERROR, "could not write file '%s'", filename);
return -1;
}
示例9: print_pop_error
/* in interactive mode, write to stdout */
print_pop_error(ctx, stdout);
retval = -1; /* an error 'taints' the execution */
} else {
duk_pop(ctx);
}
}
done:
if (buffer) {
free(buffer);
buffer = NULL;
}
return retval;
}
#else /* NO_READLINE */
static int handle_interactive(duk_context *ctx) {
const char *prompt = "duk> ";
char *buffer = NULL;
int retval = 0;
int rc;
duk_eval_string(ctx, GREET_CODE(""));
duk_pop(ctx);
/*
* Note: using readline leads to valgrind-reported leaks inside
* readline itself. Execute code from an input file (and not
* through stdin) for clean valgrind runs.
*/
rl_initialize();
for (;;) {
if (buffer) {
free(buffer);
buffer = NULL;
}
buffer = readline(prompt);
if (!buffer) {
break;
}
if (buffer && buffer[0] != (char) 0) {
add_history(buffer);
}
duk_push_pointer(ctx, (void *) buffer);
duk_push_uint(ctx, (duk_uint_t) strlen(buffer));
duk_push_string(ctx, "input");
interactive_mode = 1; /* global */
rc = duk_safe_call(ctx, wrapped_compile_execute, 3 /*nargs*/, 1 /*nret*/);
#if defined(DUK_CMDLINE_AJSHEAP)
ajsheap_clear_exec_timeout();
#endif
if (buffer) {
free(buffer);
buffer = NULL;
}
if (rc != DUK_EXEC_SUCCESS) {
/* in interactive mode, write to stdout */
print_pop_error(ctx, stdout);
retval = -1; /* an error 'taints' the execution */
} else {
duk_pop(ctx);
}
}
if (buffer) {
free(buffer);
buffer = NULL;
}
return retval;
}
示例10: r2plugin
static int r2plugin(duk_context *ctx) {
RLibStruct *lib_struct;
int ret = R_TRUE;
// args: type, function
const char *type = duk_require_string (ctx, 0);
if (strcmp (type, "asm")) {
eprintf ("TODO: duk.r2plugin only supports 'asm' plugins atm\n");
return R_FALSE;
}
// call function of 2nd parameter, or get object
if (duk_is_function (ctx, 1)) {
duk_push_string (ctx, "TODO"); // TODO: this must be the RAsm object to get bits, offset, ..
duk_call (ctx, 1);
duk_to_object (ctx, 1);
}
if (!duk_is_object (ctx, 1)) {
eprintf ("Expected object or function\n");
return R_FALSE;
}
duk_to_object (ctx, 1);
#define ap asm_plugin
ap = R_NEW0 (RAsmPlugin);
#define GETSTR(x,y,or) \
duk_dup_top (ctx); \
duk_get_prop_string (ctx, 1, y); \
if (or) { \
const char *str = duk_to_string (ctx, -1); \
x = mystrdup (str? str: or); \
} else { \
x = mystrdup (duk_require_string (ctx, -1)); \
} \
duk_pop (ctx);
#define GETINT(x,y,or) \
duk_dup_top (ctx); \
duk_get_prop_string (ctx, 1, y); \
if (or) { \
x = duk_is_number (ctx, -1)? \
duk_to_int (ctx, -1): or; \
} else { \
x = duk_require_int (ctx, -1); \
} \
duk_pop (ctx);
#define GETFUN(x,y) \
duk_dup_top (ctx); \
duk_get_prop_string (ctx, 1, y); \
x = duk_require_tval (ctx, 1); \
duk_pop (ctx);
// mandatory
GETSTR (ap->name, "name", NULL);
GETSTR (ap->arch, "arch", NULL);
// optional
GETSTR (ap->license, "license", "unlicensed");
GETSTR (ap->desc, "description", "JS Disasm Plugin");
GETINT (ap->bits, "bits", 32);
// mandatory unless we handle asm+disasm
ap->user = duk_require_tval (ctx, -1);
//ap->user = duk_dup_top (ctx); // clone object inside user
//GETFUN (ap->user, "disassemble");
duk_push_global_stash(ctx);
duk_get_prop_string (ctx, 1, "disassemble");
duk_put_prop_string(ctx, -2, "disfun"); // TODO: prefix plugin name somehow
ap->disassemble = duk_disasm;
duk_push_global_stash(ctx);
duk_get_prop_string (ctx, 1, "assemble");
duk_put_prop_string(ctx, -2, "asmfun"); // TODO: prefix plugin name somehow
ap->assemble = duk_assemble;
#if 0
duk_get_prop_string (ctx, 1, "disassemble");
duk_push_string (ctx, "WINRAR");
duk_call (ctx, 1);
#endif
#if 0
duk_get_prop_string (ctx, 1, "disassemble");
void *a = duk_require_tval (ctx, -1);
if (duk_is_callable (ctx, -1)) {
ut8 *b = a;
eprintf ("IS FUNCTION %02x %02x \n", b[0], b[1]);
} else eprintf ("NOT CALLABLE\n");
ap->user = a;
eprintf ("---- %p\n", a);
duk_push_string (ctx, "FUCK YOU");
//duk_dup_top(ctx);
//duk_call_method (ctx, 0);
duk_call (ctx, 1);
duk_push_tval (ctx, ap->user); // push fun
duk_push_string (ctx, "WINRAR");
duk_call (ctx, 1);
duk_pop (ctx);
#endif
// TODO: add support to assemble from js too
//ap->assemble = duk_disasm;
#define lp lib_struct
lp = R_NEW0 (RLibStruct);
//.........这里部分代码省略.........
示例11: gum_duk_kernel_read
//.........这里部分代码省略.........
case GUM_MEMORY_VALUE_U16:
duk_push_number (ctx, *((guint16 *) data));
break;
case GUM_MEMORY_VALUE_S32:
duk_push_number (ctx, *((gint32 *) data));
break;
case GUM_MEMORY_VALUE_U32:
duk_push_number (ctx, *((guint32 *) data));
break;
case GUM_MEMORY_VALUE_S64:
_gum_duk_push_int64 (ctx, *((gint64 *) data), core);
break;
case GUM_MEMORY_VALUE_U64:
_gum_duk_push_uint64 (ctx, *((guint64 *) data), core);
break;
case GUM_MEMORY_VALUE_LONG:
_gum_duk_push_int64 (ctx, *((glong *) data), core);
break;
case GUM_MEMORY_VALUE_ULONG:
_gum_duk_push_uint64 (ctx, *((gulong *) data), core);
break;
case GUM_MEMORY_VALUE_FLOAT:
duk_push_number (ctx, *((gfloat *) data));
break;
case GUM_MEMORY_VALUE_DOUBLE:
duk_push_number (ctx, *((gdouble *) data));
break;
case GUM_MEMORY_VALUE_BYTE_ARRAY:
{
buffer_data = duk_push_fixed_buffer (ctx, n_bytes_read);
memcpy (buffer_data, data, n_bytes_read);
duk_push_buffer_object (ctx, -1, 0, n_bytes_read,
DUK_BUFOBJ_ARRAYBUFFER);
duk_swap (ctx, -2, -1);
duk_pop (ctx);
break;
}
case GUM_MEMORY_VALUE_C_STRING:
{
gchar * str;
str = g_utf8_make_valid ((gchar *) data, length);
duk_push_string (ctx, str);
g_free (str);
break;
}
case GUM_MEMORY_VALUE_UTF8_STRING:
{
const gchar * end;
gchar * slice;
if (!g_utf8_validate ((gchar *) data, length, &end))
{
_gum_duk_throw (ctx, "can't decode byte 0x%02x in position %u",
(guint8) *end, (guint) (end - (gchar *) data));
}
slice = g_strndup ((gchar *) data, length);
duk_push_string (ctx, slice);
g_free (slice);
break;
}
case GUM_MEMORY_VALUE_UTF16_STRING:
{
gunichar2 * str_utf16;
gchar * str_utf8;
glong size;
str_utf16 = (gunichar2 *) data;
str_utf8 = g_utf16_to_utf8 (str_utf16, length, NULL, &size, NULL);
if (str_utf8 == NULL)
_gum_duk_throw (ctx, "invalid string");
duk_push_string (ctx, str_utf8);
g_free (str_utf8);
break;
}
default:
g_assert_not_reached ();
}
g_free (data);
}
else if (type == GUM_MEMORY_VALUE_BYTE_ARRAY)
{
duk_push_fixed_buffer (ctx, 0);
}
else
{
_gum_duk_throw (ctx, "please provide a length > 0");
}
return 1;
}
示例12: duk__error_getter_helper
//.........这里部分代码省略.........
funcname = (h_name == NULL || h_name == DUK_HTHREAD_STRING_EMPTY_STRING(thr)) ?
"[anon]" : (const char *) DUK_HSTRING_GET_DATA(h_name);
filename = duk_get_string_notsymbol(ctx, -1);
filename = filename ? filename : "";
DUK_ASSERT(funcname != NULL);
DUK_ASSERT(filename != NULL);
if (h_func == NULL) {
duk_push_sprintf(ctx, "at %s light%s%s%s%s%s",
(const char *) funcname,
(const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty),
(const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty),
(const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty),
(const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty),
(const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty));
} else if (DUK_HOBJECT_HAS_NATFUNC(h_func)) {
duk_push_sprintf(ctx, "at %s (%s) native%s%s%s%s%s",
(const char *) funcname,
(const char *) filename,
(const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty),
(const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty),
(const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty),
(const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty),
(const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty));
} else {
duk_push_sprintf(ctx, "at %s (%s:%ld)%s%s%s%s%s",
(const char *) funcname,
(const char *) filename,
(long) line,
(const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty),
(const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty),
(const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty),
(const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty),
(const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty));
}
duk_replace(ctx, -5); /* [ ... v1 v2 name filename str ] -> [ ... str v2 name filename ] */
duk_pop_3(ctx); /* -> [ ... str ] */
} else if (t == DUK_TYPE_STRING) {
const char *str_file;
/*
* __FILE__ / __LINE__ entry, here 'pc' is line number directly.
* Sometimes __FILE__ / __LINE__ is reported as the source for
* the error (fileName, lineNumber), sometimes not.
*/
/* [ ... v1(filename) v2(line+flags) ] */
/* When looking for .fileName/.lineNumber, blame compilation
* or C call site unless flagged not to do so.
*/
if (!(flags & DUK_TB_FLAG_NOBLAME_FILELINE)) {
if (output_type == DUK__OUTPUT_TYPE_FILENAME) {
duk_pop(ctx);
return 1;
} else if (output_type == DUK__OUTPUT_TYPE_LINENUMBER) {
duk_push_int(ctx, pc);
return 1;
}
}
/* Tracedata is trusted but avoid any risk of using a NULL
* for %s format because it has undefined behavior. Symbols
* don't need to be explicitly rejected as they pose no memory
* safety issues.
*/
str_file = (const char *) duk_get_string(ctx, -2);
duk_push_sprintf(ctx, "at [anon] (%s:%ld) internal",
(const char *) (str_file ? str_file : "null"), (long) pc);
duk_replace(ctx, -3); /* [ ... v1 v2 str ] -> [ ... str v2 ] */
duk_pop(ctx); /* -> [ ... str ] */
} else {
/* unknown, ignore */
duk_pop_2(ctx);
break;
}
}
if (count_func >= DUK_USE_TRACEBACK_DEPTH) {
/* Possibly truncated; there is no explicit truncation
* marker so this is the best we can do.
*/
duk_push_hstring_stridx(ctx, DUK_STRIDX_BRACKETED_ELLIPSIS);
}
}
/* [ ... this tracedata sep this str1 ... strN ] */
if (output_type != DUK__OUTPUT_TYPE_TRACEBACK) {
return 0;
} else {
/* The 'this' after 'sep' will get ToString() coerced by
* duk_join() automatically. We don't want to do that
* coercion when providing .fileName or .lineNumber (GH-254).
*/
duk_join(ctx, duk_get_top(ctx) - (idx_td + 2) /*count, not including sep*/);
return 1;
}
}
示例13: duk_bi_array_prototype_splice
int duk_bi_array_prototype_splice(duk_context *ctx) {
int nargs;
int have_delcount;
int item_count;
int len;
int act_start;
int del_count;
int i;
DUK_UNREF(have_delcount);
nargs = duk_get_top(ctx);
if (nargs < 2) {
duk_set_top(ctx, 2);
nargs = 2;
have_delcount = 0;
} else {
have_delcount = 1;
}
len = duk__push_this_obj_len_u32(ctx);
act_start = duk_to_int_clamped(ctx, 0, -len, len);
if (act_start < 0) {
act_start = len + act_start;
}
DUK_ASSERT(act_start >= 0 && act_start <= len);
#ifdef DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT
if (have_delcount) {
#endif
del_count = duk_to_int_clamped(ctx, 1, 0, len - act_start);
#ifdef DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT
} else {
/* E5.1 standard behavior when deleteCount is not given would be
* to treat it just like if 'undefined' was given, which coerces
* ultimately to 0. Real world behavior is to splice to the end
* of array, see test-bi-array-proto-splice-no-delcount.js.
*/
del_count = len - act_start;
}
#endif
DUK_ASSERT(del_count >= 0 && del_count <= len - act_start);
DUK_ASSERT(del_count + act_start <= len);
duk_push_array(ctx);
/* stack[0] = start
* stack[1] = deleteCount
* stack[2...nargs-1] = items
* stack[nargs] = ToObject(this) -3
* stack[nargs+1] = ToUint32(length) -2
* stack[nargs+2] = result array -1
*/
DUK_ASSERT_TOP(ctx, nargs + 3);
/* Step 9: copy elements-to-be-deleted into the result array */
for (i = 0; i < del_count; i++) {
if (duk_get_prop_index(ctx, -3, act_start + i)) {
duk_def_prop_index(ctx, -2, i, DUK_PROPDESC_FLAGS_WEC); /* throw flag irrelevant (false in std alg) */
} else {
duk_pop(ctx);
}
}
duk_push_int(ctx, del_count); /* FIXME: typing */
duk_def_prop_stridx(ctx, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W);
/* Steps 12 and 13: reorganize elements to make room for itemCount elements */
DUK_ASSERT(nargs >= 2);
item_count = nargs - 2;
if (item_count < del_count) {
/* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 1
* -> [ A B F G H ] (conceptual intermediate step)
* -> [ A B . F G H ] (placeholder marked)
* [ A B C F G H ] (actual result at this point, C will be replaced)
*/
DUK_ASSERT_TOP(ctx, nargs + 3);
for (i = act_start; i < len - del_count; i++) {
if (duk_get_prop_index(ctx, -3, i + del_count)) {
duk_put_prop_index(ctx, -4, i + item_count); /* FIXME: Throw */
} else {
duk_pop(ctx);
duk_del_prop_index(ctx, -3, i + item_count); /* FIXME: Throw */
}
}
DUK_ASSERT_TOP(ctx, nargs + 3);
/* loop iterator init and limit changed from standard algorithm */
for (i = len - 1; i >= len - del_count + item_count; i--) {
duk_del_prop_index(ctx, -3, i); /* FIXME: Throw */
}
DUK_ASSERT_TOP(ctx, nargs + 3);
//.........这里部分代码省略.........
示例14: duk_bi_array_prototype_concat
int duk_bi_array_prototype_concat(duk_context *ctx) {
int i, n;
int j, len;
int idx, idx_last;
duk_hobject *h;
/* XXX: the insert here is a bit expensive if there are a lot of items.
* It could also be special cased in the outermost for loop quite easily
* (as the element is dup()'d anyway).
*/
(void) duk_push_this_coercible_to_object(ctx);
duk_insert(ctx, 0);
n = duk_get_top(ctx);
duk_push_array(ctx); /* -> [ ToObject(this) item1 ... itemN arr ] */
/* NOTE: The Array special behaviors are NOT invoked by duk_def_prop_index()
* (which differs from the official algorithm). If no error is thrown, this
* doesn't matter as the length is updated at the end. However, if an error
* is thrown, the length will be unset. That shouldn't matter because the
* caller won't get a reference to the intermediate value.
*/
idx = 0;
idx_last = 0;
for (i = 0; i < n; i++) {
DUK_ASSERT_TOP(ctx, n + 1);
/* [ ToObject(this) item1 ... itemN arr ] */
duk_dup(ctx, i);
h = duk_get_hobject_with_class(ctx, -1, DUK_HOBJECT_CLASS_ARRAY);
if (!h) {
duk_def_prop_index(ctx, -2, idx++, DUK_PROPDESC_FLAGS_WEC);
idx_last = idx;
continue;
}
/* [ ToObject(this) item1 ... itemN arr item(i) ] */
/* FIXME: an array can have length higher than 32 bits; this is not handled
* correctly now (also len is signed so length above 2**31-1 will have trouble.
*/
len = duk_get_length(ctx, -1);
for (j = 0; j < len; j++) {
if (duk_get_prop_index(ctx, -1, j)) {
/* [ ToObject(this) item1 ... itemN arr item(i) item(i)[j] ] */
duk_def_prop_index(ctx, -3, idx++, DUK_PROPDESC_FLAGS_WEC);
idx_last = idx;
} else {
/* XXX: according to E5.1 Section 15.4.4.4 nonexistent trailing
* elements do not affect 'length' but test262 disagrees. Work
* as E5.1 mandates for now and don't touch idx_last.
*/
idx++;
duk_pop(ctx);
}
}
duk_pop(ctx);
}
duk_push_number(ctx, (double) idx_last);
duk_def_prop_stridx(ctx, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W);
DUK_ASSERT_TOP(ctx, n + 1);
return 1;
}
示例15: duk_bi_array_prototype_join_shared
DUK_INTERNAL duk_ret_t duk_bi_array_prototype_join_shared(duk_context *ctx) {
duk_uint32_t len, count;
duk_uint32_t idx;
duk_small_int_t to_locale_string = duk_get_current_magic(ctx);
duk_idx_t valstack_required;
/* For join(), nargs is 1. For toLocaleString(), nargs is 0 and
* setting the top essentially pushes an undefined to the stack,
* thus defaulting to a comma separator.
*/
duk_set_top(ctx, 1);
if (duk_is_undefined(ctx, 0)) {
duk_pop(ctx);
duk_push_hstring_stridx(ctx, DUK_STRIDX_COMMA);
} else {
duk_to_string(ctx, 0);
}
len = duk__push_this_obj_len_u32(ctx);
/* [ sep ToObject(this) len ] */
DUK_DDD(DUK_DDDPRINT("sep=%!T, this=%!T, len=%lu",
(duk_tval *) duk_get_tval(ctx, 0),
(duk_tval *) duk_get_tval(ctx, 1),
(unsigned long) len));
/* The extra (+4) is tight. */
valstack_required = (len >= DUK__ARRAY_MID_JOIN_LIMIT ?
DUK__ARRAY_MID_JOIN_LIMIT : len) + 4;
duk_require_stack(ctx, valstack_required);
duk_dup(ctx, 0);
/* [ sep ToObject(this) len sep ] */
count = 0;
idx = 0;
for (;;) {
if (count >= DUK__ARRAY_MID_JOIN_LIMIT || /* intermediate join to avoid valstack overflow */
idx >= len) { /* end of loop (careful with len==0) */
/* [ sep ToObject(this) len sep str0 ... str(count-1) ] */
DUK_DDD(DUK_DDDPRINT("mid/final join, count=%ld, idx=%ld, len=%ld",
(long) count, (long) idx, (long) len));
duk_join(ctx, (duk_idx_t) count); /* -> [ sep ToObject(this) len str ] */
duk_dup(ctx, 0); /* -> [ sep ToObject(this) len str sep ] */
duk_insert(ctx, -2); /* -> [ sep ToObject(this) len sep str ] */
count = 1;
}
if (idx >= len) {
/* if true, the stack already contains the final result */
break;
}
duk_get_prop_index(ctx, 1, (duk_uarridx_t) idx);
if (duk_is_null_or_undefined(ctx, -1)) {
duk_pop(ctx);
duk_push_hstring_stridx(ctx, DUK_STRIDX_EMPTY_STRING);
} else {
if (to_locale_string) {
duk_to_object(ctx, -1);
duk_get_prop_stridx(ctx, -1, DUK_STRIDX_TO_LOCALE_STRING);
duk_insert(ctx, -2); /* -> [ ... toLocaleString ToObject(val) ] */
duk_call_method(ctx, 0);
duk_to_string(ctx, -1);
} else {
duk_to_string(ctx, -1);
}
}
count++;
idx++;
}
/* [ sep ToObject(this) len sep result ] */
return 1;
}