Initial import
This commit is contained in:
59
third_party/duktape/duk_hthread_alloc.c
vendored
Normal file
59
third_party/duktape/duk_hthread_alloc.c
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* duk_hthread allocation and freeing.
|
||||
*/
|
||||
|
||||
#include "third_party/duktape/duk_internal.h"
|
||||
|
||||
/*
|
||||
* Allocate initial stacks for a thread. Note that 'thr' must be reachable
|
||||
* as a garbage collection may be triggered by the allocation attempts.
|
||||
* Returns zero (without leaking memory) if init fails.
|
||||
*/
|
||||
|
||||
DUK_INTERNAL duk_bool_t duk_hthread_init_stacks(duk_heap *heap, duk_hthread *thr) {
|
||||
duk_size_t alloc_size;
|
||||
duk_size_t i;
|
||||
|
||||
DUK_ASSERT(heap != NULL);
|
||||
DUK_ASSERT(thr != NULL);
|
||||
DUK_ASSERT(thr->valstack == NULL);
|
||||
DUK_ASSERT(thr->valstack_end == NULL);
|
||||
DUK_ASSERT(thr->valstack_alloc_end == NULL);
|
||||
DUK_ASSERT(thr->valstack_bottom == NULL);
|
||||
DUK_ASSERT(thr->valstack_top == NULL);
|
||||
DUK_ASSERT(thr->callstack_curr == NULL);
|
||||
|
||||
/* valstack */
|
||||
DUK_ASSERT(DUK_VALSTACK_API_ENTRY_MINIMUM <= DUK_VALSTACK_INITIAL_SIZE);
|
||||
alloc_size = sizeof(duk_tval) * DUK_VALSTACK_INITIAL_SIZE;
|
||||
thr->valstack = (duk_tval *) DUK_ALLOC(heap, alloc_size);
|
||||
if (!thr->valstack) {
|
||||
goto fail;
|
||||
}
|
||||
duk_memzero(thr->valstack, alloc_size);
|
||||
thr->valstack_end = thr->valstack + DUK_VALSTACK_API_ENTRY_MINIMUM;
|
||||
thr->valstack_alloc_end = thr->valstack + DUK_VALSTACK_INITIAL_SIZE;
|
||||
thr->valstack_bottom = thr->valstack;
|
||||
thr->valstack_top = thr->valstack;
|
||||
|
||||
for (i = 0; i < DUK_VALSTACK_INITIAL_SIZE; i++) {
|
||||
DUK_TVAL_SET_UNDEFINED(&thr->valstack[i]);
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
||||
fail:
|
||||
DUK_FREE(heap, thr->valstack);
|
||||
DUK_ASSERT(thr->callstack_curr == NULL);
|
||||
|
||||
thr->valstack = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* For indirect allocs. */
|
||||
|
||||
DUK_INTERNAL void *duk_hthread_get_valstack_ptr(duk_heap *heap, void *ud) {
|
||||
duk_hthread *thr = (duk_hthread *) ud;
|
||||
DUK_UNREF(heap);
|
||||
return (void *) thr->valstack;
|
||||
}
|
||||
Reference in New Issue
Block a user