本文整理汇总了C++中DUK_ASSERT函数的典型用法代码示例。如果您正苦于以下问题:C++ DUK_ASSERT函数的具体用法?C++ DUK_ASSERT怎么用?C++ DUK_ASSERT使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了DUK_ASSERT函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DUK_ASSERT
void *duk_heap_mem_alloc_checked(duk_hthread *thr, size_t size, const char *filename, int line) {
#else
void *duk_heap_mem_alloc_checked(duk_hthread *thr, size_t size) {
#endif
void *res;
DUK_ASSERT(thr != NULL);
DUK_ASSERT_DISABLE(size >= 0);
res = DUK_ALLOC(thr->heap, size);
if (!res) {
#ifdef DUK_USE_VERBOSE_ERRORS
DUK_ERROR_RAW(filename, line, thr, DUK_ERR_ALLOC_ERROR, "memory alloc failed");
#else
DUK_ERROR(thr, DUK_ERR_ALLOC_ERROR, "memory alloc failed");
#endif
}
return res;
}
示例2: duk_bi_duktape_object_fin
duk_ret_t duk_bi_duktape_object_fin(duk_context *ctx) {
(void) duk_require_hobject(ctx, 0);
if (duk_get_top(ctx) >= 2) {
/* Set: currently a finalizer is disabled by setting it to
* undefined; this does not remove the property at the moment.
* The value could be type checked to be either a function
* or something else; if something else, the property could
* be deleted.
*/
duk_set_top(ctx, 2);
(void) duk_put_prop_stridx(ctx, 0, DUK_STRIDX_INT_FINALIZER);
return 0;
} else {
/* Get. */
DUK_ASSERT(duk_get_top(ctx) == 1);
duk_get_prop_stridx(ctx, 0, DUK_STRIDX_INT_FINALIZER);
return 1;
}
}
示例3: duk_get_prototype
DUK_EXTERNAL void duk_get_prototype(duk_context *ctx, duk_idx_t index) {
duk_hthread *thr = (duk_hthread *) ctx;
duk_hobject *obj;
duk_hobject *proto;
DUK_ASSERT_CTX_VALID(ctx);
DUK_UNREF(thr);
obj = duk_require_hobject(ctx, index);
DUK_ASSERT(obj != NULL);
/* XXX: shared helper for duk_push_hobject_or_undefined()? */
proto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, obj);
if (proto) {
duk_push_hobject(ctx, proto);
} else {
duk_push_undefined(ctx);
}
}
示例4: duk_compile_raw
DUK_EXTERNAL duk_int_t duk_compile_raw(duk_context *ctx, const char *src_buffer, duk_size_t src_length, duk_uint_t flags) {
duk__compile_raw_args comp_args_alloc;
duk__compile_raw_args *comp_args = &comp_args_alloc;
DUK_ASSERT_CTX_VALID(ctx);
if ((flags & DUK_COMPILE_STRLEN) && (src_buffer != NULL)) {
/* String length is computed here to avoid multiple evaluation
* of a macro argument in the calling side.
*/
src_length = DUK_STRLEN(src_buffer);
}
comp_args->src_buffer = (const duk_uint8_t *) src_buffer;
comp_args->src_length = src_length;
comp_args->flags = flags;
/* [ ... source? filename? ] (depends on flags) */
if (flags & DUK_COMPILE_SAFE) {
duk_int_t rc;
duk_int_t nargs;
duk_int_t nrets = 1;
/* Arguments can be: [ source? filename? &comp_args] so that
* nargs is 1 to 3. Call site encodes the correct nargs count
* directly into flags.
*/
nargs = flags & 0x07;
DUK_ASSERT(nargs == ((flags & DUK_COMPILE_NOSOURCE) ? 0 : 1) +
((flags & DUK_COMPILE_NOFILENAME) ? 0 : 1));
rc = duk_safe_call(ctx, duk__do_compile, (void *) comp_args, nargs, nrets);
/* [ ... closure ] */
return rc;
}
(void) duk__do_compile(ctx, (void *) comp_args);
/* [ ... closure ] */
return DUK_EXEC_SUCCESS;
}
示例5: duk_heap_force_strtab_resize
DUK_INTERNAL void duk_heap_force_strtab_resize(duk_heap *heap) {
duk_small_uint_t prev_mark_and_sweep_base_flags;
/* Force a resize so that DELETED entries are eliminated.
* Another option would be duk__recheck_strtab_size_probe();
* but since that happens on every intern anyway, this whole
* check can now be disabled.
*/
DUK_ASSERT((heap->mark_and_sweep_base_flags & DUK_MS_FLAG_NO_STRINGTABLE_RESIZE) == 0);
prev_mark_and_sweep_base_flags = heap->mark_and_sweep_base_flags;
DUK__PREVENT_MS_SIDE_EFFECTS(heap);
#if defined(DUK_USE_STRTAB_CHAIN)
DUK_UNREF(heap);
#elif defined(DUK_USE_STRTAB_PROBE)
(void) duk__resize_strtab_probe(heap);
#endif
heap->mark_and_sweep_base_flags = prev_mark_and_sweep_base_flags;
}
示例6: duk_bi_object_prototype_is_prototype_of
duk_ret_t duk_bi_object_prototype_is_prototype_of(duk_context *ctx) {
duk_hthread *thr = (duk_hthread *) ctx;
duk_hobject *h_v;
duk_hobject *h_obj;
DUK_ASSERT_TOP(ctx, 1);
h_v = duk_get_hobject(ctx, 0);
if (!h_v) {
duk_push_false(ctx); /* XXX: tail call: return duk_push_false(ctx) */
return 1;
}
h_obj = duk_push_this_coercible_to_object(ctx);
DUK_ASSERT(h_obj != NULL);
/* E5.1 Section 15.2.4.6, step 3.a, lookup proto once before compare */
duk_push_boolean(ctx, duk_hobject_prototype_chain_contains(thr, h_v->prototype, h_obj));
return 1;
}
示例7: duk_bi_object_constructor_prevent_extensions
DUK_INTERNAL duk_ret_t duk_bi_object_constructor_prevent_extensions(duk_context *ctx) {
duk_hthread *thr = (duk_hthread *) ctx;
duk_hobject *h;
h = duk_require_hobject_or_lfunc(ctx, 0);
if (!h) {
/* Lightfunc, always success. */
return 1;
}
DUK_ASSERT(h != NULL);
DUK_HOBJECT_CLEAR_EXTENSIBLE(h);
/* A non-extensible object cannot gain any more properties,
* so this is a good time to compact.
*/
duk_hobject_compact_props(thr, h);
return 1;
}
示例8: duk_call_method
DUK_EXTERNAL void duk_call_method(duk_context *ctx, duk_idx_t nargs) {
duk_hthread *thr = (duk_hthread *) ctx;
duk_small_uint_t call_flags;
duk_idx_t idx_func;
DUK_ASSERT_CTX_VALID(ctx);
DUK_ASSERT(thr != NULL);
idx_func = duk_get_top(ctx) - nargs - 2; /* must work for nargs <= 0 */
if (idx_func < 0 || nargs < 0) {
/* note that we can't reliably pop anything here */
DUK_ERROR_TYPE_INVALID_ARGS(thr);
}
call_flags = 0; /* not protected, respect reclimit, not constructor */
duk_handle_call_unprotected(thr, /* thread */
nargs, /* num_stack_args */
call_flags); /* call_flags */
}
示例9: duk_safe_call
DUK_EXTERNAL duk_int_t duk_safe_call(duk_context *ctx, duk_safe_call_function func, duk_idx_t nargs, duk_idx_t nrets) {
duk_hthread *thr = (duk_hthread *) ctx;
duk_int_t rc;
DUK_ASSERT_CTX_VALID(ctx);
DUK_ASSERT(thr != NULL);
if (duk_get_top(ctx) < nargs || nrets < 0) {
/* See comments in duk_pcall(). */
DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_CALL_ARGS);
return DUK_EXEC_ERROR; /* unreachable */
}
rc = duk_handle_safe_call(thr, /* thread */
func, /* func */
nargs, /* num_stack_args */
nrets); /* num_stack_res */
return rc;
}
示例10: duk_err_longjmp
DUK_INTERNAL void duk_err_longjmp(duk_hthread *thr) {
DUK_ASSERT(thr != NULL);
DUK_DD(DUK_DDPRINT("longjmp error: type=%d iserror=%d value1=%!T value2=%!T",
(int) thr->heap->lj.type, (int) thr->heap->lj.iserror,
&thr->heap->lj.value1, &thr->heap->lj.value2));
#if !defined(DUK_USE_CPP_EXCEPTIONS)
/* If we don't have a jmpbuf_ptr, there is little we can do except
* cause a fatal error. The caller's expectation is that we never
* return.
*
* With C++ exceptions we now just propagate an uncaught error
* instead of invoking the fatal error handler. Because there's
* a dummy jmpbuf for C++ exceptions now, this could be changed.
*/
if (!thr->heap->lj.jmpbuf_ptr) {
DUK_D(DUK_DPRINT("uncaught error: type=%d iserror=%d value1=%!T value2=%!T",
(int) thr->heap->lj.type, (int) thr->heap->lj.iserror,
&thr->heap->lj.value1, &thr->heap->lj.value2));
#if defined(DUK_USE_PREFER_SIZE)
duk__uncaught_minimal(thr);
#else
duk__uncaught_error_aware(thr);
#endif
DUK_UNREACHABLE();
}
#endif /* DUK_USE_CPP_EXCEPTIONS */
#if defined(DUK_USE_CPP_EXCEPTIONS)
{
duk_internal_exception exc; /* dummy */
throw exc;
}
#else /* DUK_USE_CPP_EXCEPTIONS */
DUK_LONGJMP(thr->heap->lj.jmpbuf_ptr->jb);
#endif /* DUK_USE_CPP_EXCEPTIONS */
DUK_UNREACHABLE();
}
示例11: push_this_and_get_timeval_tzoffset
/* Push 'this' binding, check that it is a Date object; then push the
* internal time value. At the end, stack is: [ ... this timeval ].
* Returns the time value. Local time adjustment is done if requested.
*/
static double push_this_and_get_timeval_tzoffset(duk_context *ctx, int flags, int *out_tzoffset) {
duk_hthread *thr = (duk_hthread *) ctx;
duk_hobject *h;
double d;
int tzoffset = 0;
duk_push_this(ctx);
h = duk_get_hobject(ctx, -1); /* FIXME: getter with class check, useful in built-ins */
if (h == NULL || DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_DATE) {
DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, "expected Date");
}
duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_VALUE);
d = duk_to_number(ctx, -1);
duk_pop(ctx);
if (DUK_ISNAN(d)) {
if (flags & FLAG_NAN_TO_ZERO) {
d = 0.0;
}
if (flags & FLAG_NAN_TO_RANGE_ERROR) {
DUK_ERROR(thr, DUK_ERR_RANGE_ERROR, "Invalid Date");
}
}
/* if no NaN handling flag, may still be NaN here, but not Inf */
DUK_ASSERT(!DUK_ISINF(d));
if (flags & FLAG_LOCALTIME) {
/* Note: DST adjustment is determined using UTC time.
* If 'd' is NaN, tzoffset will be 0.
*/
tzoffset = GET_LOCAL_TZOFFSET(d); /* seconds */
d += tzoffset * 1000;
}
if (out_tzoffset) {
*out_tzoffset = tzoffset;
}
/* [ ... this ] */
return d;
}
示例12: duk__run_object_finalizers
static void duk__run_object_finalizers(duk_heap *heap) {
duk_heaphdr *curr;
duk_heaphdr *next;
#ifdef DUK_USE_DEBUG
int count = 0;
#endif
duk_hthread *thr;
DUK_DD(DUK_DDPRINT("duk__run_object_finalizers: %p", (void *) heap));
thr = duk__get_temp_hthread(heap);
DUK_ASSERT(thr != NULL);
curr = heap->finalize_list;
while (curr) {
DUK_DDD(DUK_DDDPRINT("mark-and-sweep finalize: %p", (void *) curr));
DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); /* only objects have finalizers */
DUK_ASSERT(!DUK_HEAPHDR_HAS_REACHABLE(curr)); /* flags have been already cleared */
DUK_ASSERT(!DUK_HEAPHDR_HAS_TEMPROOT(curr));
DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(curr));
DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr));
/* run the finalizer */
duk_hobject_run_finalizer(thr, (duk_hobject *) curr); /* must never longjmp */
/* mark FINALIZED, for next mark-and-sweep (will collect unless has become reachable;
* prevent running finalizer again if reachable)
*/
DUK_HEAPHDR_SET_FINALIZED(curr);
/* queue back to heap_allocated */
next = DUK_HEAPHDR_GET_NEXT(curr);
DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, curr);
curr = next;
#ifdef DUK_USE_DEBUG
count++;
#endif
}
/* finalize_list will always be processed completely */
heap->finalize_list = NULL;
#ifdef DUK_USE_DEBUG
DUK_D(DUK_DPRINT("mark-and-sweep finalize objects: %d finalizers called", count));
#endif
}
示例13: recheck_hash_size
static int recheck_hash_size(duk_heap *heap, duk_uint32_t new_used) {
duk_uint32_t new_free;
duk_uint32_t tmp1;
duk_uint32_t tmp2;
DUK_ASSERT(new_used <= heap->st_size); /* grow by at most one */
new_free = heap->st_size - new_used; /* unsigned intentionally */
/* new_free / size <= 1 / DIV <=> new_free <= size / DIV */
/* new_used / size <= 1 / DIV <=> new_used <= size / DIV */
tmp1 = heap->st_size / DUK_STRTAB_MIN_FREE_DIVISOR;
tmp2 = heap->st_size / DUK_STRTAB_MIN_USED_DIVISOR;
if (new_free <= tmp1 || new_used <= tmp2) {
/* load factor too low or high, count actually used entries and resize */
return resize_hash(heap);
} else {
return DUK_ERR_OK;
}
}
示例14: duk__recheck_strtab_size_probe
DUK_LOCAL duk_bool_t duk__recheck_strtab_size_probe(duk_heap *heap, duk_uint32_t new_used) {
duk_uint32_t new_free;
duk_uint32_t tmp1;
duk_uint32_t tmp2;
DUK_ASSERT(new_used <= heap->st_size); /* grow by at most one */
new_free = heap->st_size - new_used; /* unsigned intentionally */
/* new_free / size <= 1 / DIV <=> new_free <= size / DIV */
/* new_used / size <= 1 / DIV <=> new_used <= size / DIV */
tmp1 = heap->st_size / DUK_STRTAB_MIN_FREE_DIVISOR;
tmp2 = heap->st_size / DUK_STRTAB_MIN_USED_DIVISOR;
if (new_free <= tmp1 || new_used <= tmp2) {
/* load factor too low or high, count actually used entries and resize */
return duk__resize_strtab_probe(heap);
} else {
return 0; /* OK */
}
}
示例15: duk_bi_object_prototype_is_prototype_of
DUK_INTERNAL duk_ret_t duk_bi_object_prototype_is_prototype_of(duk_hthread *thr) {
duk_hobject *h_v;
duk_hobject *h_obj;
DUK_ASSERT_TOP(thr, 1);
h_v = duk_get_hobject(thr, 0);
if (!h_v) {
duk_push_false(thr); /* XXX: tail call: return duk_push_false(thr) */
return 1;
}
h_obj = duk_push_this_coercible_to_object(thr);
DUK_ASSERT(h_obj != NULL);
/* E5.1 Section 15.2.4.6, step 3.a, lookup proto once before compare.
* Prototype loops should cause an error to be thrown.
*/
duk_push_boolean(thr, duk_hobject_prototype_chain_contains(thr, DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_v), h_obj, 0 /*ignore_loop*/));
return 1;
}