Skip to content

Commit bdf7806

Browse files
committed
Checked object allocs, voluntary GC check tweak
1 parent 37c1664 commit bdf7806

12 files changed

Lines changed: 133 additions & 142 deletions

src-input/duk_api_bytecode.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ static duk_uint8_t *duk__load_func(duk_context *ctx, duk_uint8_t *p, duk_uint8_t
586586
*/
587587
duk_hdecenv *new_env;
588588

589-
new_env = duk_hdecenv_alloc(thr->heap,
589+
new_env = duk_hdecenv_alloc(thr,
590590
DUK_HOBJECT_FLAG_EXTENSIBLE |
591591
DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV));
592592
DUK_ASSERT(new_env != NULL);

src-input/duk_api_heap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ DUK_EXTERNAL void duk_set_global_object(duk_context *ctx) {
161161
* same (initial) built-ins.
162162
*/
163163

164-
h_env = duk_hobjenv_alloc(thr->heap,
164+
h_env = duk_hobjenv_alloc(thr,
165165
DUK_HOBJECT_FLAG_EXTENSIBLE |
166166
DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV));
167167
DUK_ASSERT(h_env != NULL);

src-input/duk_api_stack.c

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3972,10 +3972,8 @@ DUK_INTERNAL duk_hobject *duk_push_object_helper(duk_context *ctx, duk_uint_t ho
39723972

39733973
DUK__CHECK_SPACE();
39743974

3975-
h = duk_hobject_alloc(thr->heap, hobject_flags_and_class);
3976-
if (DUK_UNLIKELY(h == NULL)) {
3977-
DUK_ERROR_ALLOC_FAILED(thr);
3978-
}
3975+
h = duk_hobject_alloc(thr, hobject_flags_and_class);
3976+
DUK_ASSERT(h != NULL);
39793977

39803978
DUK_DDD(DUK_DDDPRINT("created object with flags: 0x%08lx", (unsigned long) h->hdr.h_flags));
39813979

@@ -4033,10 +4031,8 @@ DUK_EXTERNAL duk_idx_t duk_push_array(duk_context *ctx) {
40334031
DUK_HOBJECT_FLAG_EXOTIC_ARRAY |
40344032
DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAY);
40354033

4036-
obj = duk_harray_alloc(thr->heap, flags);
4037-
if (DUK_UNLIKELY(obj == NULL)) {
4038-
DUK_ERROR_ALLOC_FAILED(thr);
4039-
}
4034+
obj = duk_harray_alloc(thr, flags);
4035+
DUK_ASSERT(obj != NULL);
40404036

40414037
/* XXX: since prototype is NULL, could save a check */
40424038
DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, (duk_hobject *) obj, thr->builtins[DUK_BIDX_ARRAY_PROTOTYPE]);
@@ -4092,13 +4088,11 @@ DUK_EXTERNAL duk_idx_t duk_push_thread_raw(duk_context *ctx, duk_uint_t flags) {
40924088

40934089
DUK__CHECK_SPACE();
40944090

4095-
obj = duk_hthread_alloc(thr->heap,
4091+
obj = duk_hthread_alloc(thr,
40964092
DUK_HOBJECT_FLAG_EXTENSIBLE |
40974093
DUK_HOBJECT_FLAG_THREAD |
40984094
DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_THREAD));
4099-
if (DUK_UNLIKELY(obj == NULL)) {
4100-
DUK_ERROR_ALLOC_FAILED(thr);
4101-
}
4095+
DUK_ASSERT(obj != NULL);
41024096
obj->state = DUK_HTHREAD_STATE_INACTIVE;
41034097
#if defined(DUK_USE_ROM_STRINGS)
41044098
/* Nothing to initialize, strs[] is in ROM. */
@@ -4157,7 +4151,7 @@ DUK_INTERNAL duk_hcompfunc *duk_push_hcompfunc(duk_context *ctx) {
41574151
* DUK_HOBJECT_FLAG_CONSRUCTABLE flag cleared here.
41584152
*/
41594153

4160-
obj = duk_hcompfunc_alloc(thr->heap,
4154+
obj = duk_hcompfunc_alloc(thr,
41614155
DUK_HOBJECT_FLAG_EXTENSIBLE |
41624156
DUK_HOBJECT_FLAG_COMPFUNC |
41634157
DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION));
@@ -4199,10 +4193,8 @@ DUK_LOCAL duk_idx_t duk__push_c_function_raw(duk_context *ctx, duk_c_function fu
41994193
goto api_error;
42004194
}
42014195

4202-
obj = duk_hnatfunc_alloc(thr->heap, flags);
4203-
if (DUK_UNLIKELY(obj == NULL)) {
4204-
DUK_ERROR_ALLOC_FAILED(thr);
4205-
}
4196+
obj = duk_hnatfunc_alloc(thr, flags);
4197+
DUK_ASSERT(obj != NULL);
42064198

42074199
obj->func = func;
42084200
obj->nargs = func_nargs;
@@ -4319,10 +4311,8 @@ DUK_INTERNAL duk_hbufobj *duk_push_bufobj_raw(duk_context *ctx, duk_uint_t hobje
43194311

43204312
DUK__CHECK_SPACE();
43214313

4322-
obj = duk_hbufobj_alloc(thr->heap, hobject_flags_and_class);
4323-
if (DUK_UNLIKELY(obj == NULL)) {
4324-
DUK_ERROR_ALLOC_FAILED(thr);
4325-
}
4314+
obj = duk_hbufobj_alloc(thr, hobject_flags_and_class);
4315+
DUK_ASSERT(obj != NULL);
43264316

43274317
DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, (duk_hobject *) obj, thr->builtins[prototype_bidx]);
43284318
DUK_ASSERT_HBUFOBJ_VALID(obj);

src-input/duk_bi_global.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ DUK_INTERNAL duk_ret_t duk_bi_global_object_eval(duk_context *ctx) {
522522
act_lex_env = act->lex_env;
523523
act = NULL; /* invalidated */
524524

525-
new_env = duk_hdecenv_alloc(thr->heap,
525+
new_env = duk_hdecenv_alloc(thr,
526526
DUK_HOBJECT_FLAG_EXTENSIBLE |
527527
DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV));
528528
DUK_ASSERT(new_env != NULL);

src-input/duk_heap.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,13 @@ typedef void *(*duk_mem_getptr)(duk_heap *heap, void *ud);
212212
#define DUK_REALLOC_INDIRECT(heap,cb,ud,newsize) duk_heap_mem_realloc_indirect((heap), (cb), (ud), (newsize))
213213
#define DUK_FREE(heap,ptr) duk_heap_mem_free((heap), (ptr))
214214

215+
/*
216+
* Checked allocation, relative to a thread
217+
*/
218+
219+
#define DUK_ALLOC_CHECKED(thr,size) duk_heap_mem_alloc_checked((thr), (size))
220+
#define DUK_ALLOC_CHECKED_ZEROED(thr,size) duk_heap_mem_alloc_checked_zeroed((thr), (size))
221+
215222
/*
216223
* Memory constants
217224
*/
@@ -522,6 +529,8 @@ DUK_INTERNAL_DECL void duk_default_free_function(void *udata, void *ptr);
522529

523530
DUK_INTERNAL_DECL void *duk_heap_mem_alloc(duk_heap *heap, duk_size_t size);
524531
DUK_INTERNAL_DECL void *duk_heap_mem_alloc_zeroed(duk_heap *heap, duk_size_t size);
532+
DUK_INTERNAL_DECL void *duk_heap_mem_alloc_checked(duk_hthread *thr, duk_size_t size);
533+
DUK_INTERNAL_DECL void *duk_heap_mem_alloc_checked_zeroed(duk_hthread *thr, duk_size_t size);
525534
DUK_INTERNAL_DECL void *duk_heap_mem_realloc(duk_heap *heap, void *ptr, duk_size_t newsize);
526535
DUK_INTERNAL_DECL void *duk_heap_mem_realloc_indirect(duk_heap *heap, duk_mem_getptr cb, void *ud, duk_size_t newsize);
527536
DUK_INTERNAL_DECL void duk_heap_mem_free(duk_heap *heap, void *ptr);

src-input/duk_heap_alloc.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -436,11 +436,11 @@ DUK_LOCAL duk_bool_t duk__init_heap_thread(duk_heap *heap) {
436436
duk_hthread *thr;
437437

438438
DUK_DD(DUK_DDPRINT("heap init: alloc heap thread"));
439-
thr = duk_hthread_alloc(heap,
440-
DUK_HOBJECT_FLAG_EXTENSIBLE |
441-
DUK_HOBJECT_FLAG_THREAD |
442-
DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_THREAD));
443-
if (!thr) {
439+
thr = duk_hthread_alloc_unchecked(heap,
440+
DUK_HOBJECT_FLAG_EXTENSIBLE |
441+
DUK_HOBJECT_FLAG_THREAD |
442+
DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_THREAD));
443+
if (thr == NULL) {
444444
DUK_D(DUK_DPRINT("failed to alloc heap_thread"));
445445
return 0;
446446
}
@@ -962,8 +962,8 @@ duk_heap *duk_heap_alloc(duk_alloc_function alloc_func,
962962

963963
DUK_DD(DUK_DDPRINT("HEAP: INIT HEAP OBJECT"));
964964
DUK_ASSERT(res->heap_thread != NULL);
965-
res->heap_object = duk_hobject_alloc(res, DUK_HOBJECT_FLAG_EXTENSIBLE |
966-
DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT));
965+
res->heap_object = duk_hobject_alloc_unchecked(res, DUK_HOBJECT_FLAG_EXTENSIBLE |
966+
DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT));
967967
if (res->heap_object == NULL) {
968968
goto failed;
969969
}

src-input/duk_heap_memory.c

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
#if defined(DUK_USE_VOLUNTARY_GC)
1616
#define DUK__VOLUNTARY_PERIODIC_GC(heap) do { \
17-
if (--(heap)->mark_and_sweep_trigger_counter < 0) { \
17+
if (DUK_UNLIKELY(--(heap)->mark_and_sweep_trigger_counter < 0)) { \
1818
duk__run_voluntary_gc(heap); \
1919
} \
2020
} while (0)
@@ -68,7 +68,7 @@ DUK_INTERNAL void *duk_heap_mem_alloc(duk_heap *heap, duk_size_t size) {
6868
}
6969
#endif
7070
res = heap->alloc_func(heap->heap_udata, size);
71-
if (res || size == 0) {
71+
if (DUK_LIKELY(res || size == 0)) {
7272
/* for zero size allocations NULL is allowed */
7373
return res;
7474
}
@@ -132,6 +132,30 @@ DUK_INTERNAL void *duk_heap_mem_alloc_zeroed(duk_heap *heap, duk_size_t size) {
132132
return res;
133133
}
134134

135+
DUK_INTERNAL void *duk_heap_mem_alloc_checked(duk_hthread *thr, duk_size_t size) {
136+
void *res;
137+
138+
DUK_ASSERT(thr != NULL);
139+
res = duk_heap_mem_alloc(thr->heap, size);
140+
if (DUK_LIKELY(res != NULL || size == 0)) {
141+
return res;
142+
}
143+
DUK_ERROR_ALLOC_FAILED(thr);
144+
return NULL;
145+
}
146+
147+
DUK_INTERNAL void *duk_heap_mem_alloc_checked_zeroed(duk_hthread *thr, duk_size_t size) {
148+
void *res;
149+
150+
DUK_ASSERT(thr != NULL);
151+
res = duk_heap_mem_alloc_zeroed(thr->heap, size);
152+
if (DUK_LIKELY(res != NULL || size == 0)) {
153+
return res;
154+
}
155+
DUK_ERROR_ALLOC_FAILED(thr);
156+
return NULL;
157+
}
158+
135159
/*
136160
* Reallocate memory with garbage collection
137161
*/
@@ -165,7 +189,7 @@ DUK_INTERNAL void *duk_heap_mem_realloc(duk_heap *heap, void *ptr, duk_size_t ne
165189
}
166190
#endif
167191
res = heap->realloc_func(heap->heap_udata, ptr, newsize);
168-
if (res || newsize == 0) {
192+
if (DUK_LIKELY(res || newsize == 0)) {
169193
/* for zero size allocations NULL is allowed */
170194
return res;
171195
}
@@ -247,7 +271,7 @@ DUK_INTERNAL void *duk_heap_mem_realloc_indirect(duk_heap *heap, duk_mem_getptr
247271
}
248272
#endif
249273
res = heap->realloc_func(heap->heap_udata, cb(heap, ud), newsize);
250-
if (res || newsize == 0) {
274+
if (DUK_LIKELY(res || newsize == 0)) {
251275
/* for zero size allocations NULL is allowed */
252276
return res;
253277
}

src-input/duk_hobject.h

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -815,19 +815,18 @@ DUK_INTERNAL_DECL duk_uint8_t duk_class_number_to_stridx[32];
815815
*/
816816

817817
/* alloc and init */
818-
DUK_INTERNAL_DECL duk_hobject *duk_hobject_alloc(duk_heap *heap, duk_uint_t hobject_flags);
819-
#if 0 /* unused */
820-
DUK_INTERNAL_DECL duk_hobject *duk_hobject_alloc_checked(duk_hthread *thr, duk_uint_t hobject_flags);
821-
#endif
822-
DUK_INTERNAL_DECL duk_harray *duk_harray_alloc(duk_heap *heap, duk_uint_t hobject_flags);
823-
DUK_INTERNAL_DECL duk_hcompfunc *duk_hcompfunc_alloc(duk_heap *heap, duk_uint_t hobject_flags);
824-
DUK_INTERNAL_DECL duk_hnatfunc *duk_hnatfunc_alloc(duk_heap *heap, duk_uint_t hobject_flags);
818+
DUK_INTERNAL_DECL duk_hobject *duk_hobject_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags);
819+
DUK_INTERNAL_DECL duk_hobject *duk_hobject_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
820+
DUK_INTERNAL_DECL duk_harray *duk_harray_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
821+
DUK_INTERNAL_DECL duk_hcompfunc *duk_hcompfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
822+
DUK_INTERNAL_DECL duk_hnatfunc *duk_hnatfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
825823
#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
826-
DUK_INTERNAL_DECL duk_hbufobj *duk_hbufobj_alloc(duk_heap *heap, duk_uint_t hobject_flags);
824+
DUK_INTERNAL_DECL duk_hbufobj *duk_hbufobj_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
827825
#endif
828-
DUK_INTERNAL_DECL duk_hthread *duk_hthread_alloc(duk_heap *heap, duk_uint_t hobject_flags);
829-
DUK_INTERNAL_DECL duk_hdecenv *duk_hdecenv_alloc(duk_heap *heap, duk_uint_t hobject_flags);
830-
DUK_INTERNAL_DECL duk_hobjenv *duk_hobjenv_alloc(duk_heap *heap, duk_uint_t hobject_flags);
826+
DUK_INTERNAL_DECL duk_hthread *duk_hthread_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags);
827+
DUK_INTERNAL_DECL duk_hthread *duk_hthread_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
828+
DUK_INTERNAL_DECL duk_hdecenv *duk_hdecenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
829+
DUK_INTERNAL_DECL duk_hobjenv *duk_hobjenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
831830

832831
/* resize */
833832
DUK_INTERNAL_DECL void duk_hobject_realloc_props(duk_hthread *thr,

0 commit comments

Comments
 (0)