本文整理汇总了C++中MVM_panic函数的典型用法代码示例。如果您正苦于以下问题:C++ MVM_panic函数的具体用法?C++ MVM_panic怎么用?C++ MVM_panic使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了MVM_panic函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: references_str
MVMObject * references_str(MVMThreadContext *tc, MVMHeapSnapshot *s) {
/* Produces ; separated sequences of:
* kind,idx,to
* All of which are integers.
*/
MVMObject *result;
size_t buffer_size = 10 * s->num_references;
size_t buffer_pos = 0;
char *buffer = MVM_malloc(buffer_size);
MVMuint64 i;
for (i = 0; i < s->num_references; i++) {
char tmp[128];
int item_chars = snprintf(tmp, 128, "%"PRIu64",%"PRIu64",%"PRIu64";",
s->references[i].description & ((1 << MVM_SNAPSHOT_REF_KIND_BITS) - 1),
s->references[i].description >> MVM_SNAPSHOT_REF_KIND_BITS,
s->references[i].collectable_index);
if (item_chars < 0)
MVM_panic(1, "Failed to save reference in heap snapshot");
if (buffer_pos + item_chars >= buffer_size) {
buffer_size += 4096;
buffer = MVM_realloc(buffer, buffer_size);
}
memcpy(buffer + buffer_pos, tmp, item_chars);
buffer_pos += item_chars;
}
if (buffer_pos > 1)
buffer[buffer_pos - 1] = 0; /* Cut off the trailing ; for ease of parsing */
buffer[buffer_pos] = 0;
result = box_s(tc, vmstr(tc, buffer));
MVM_free(buffer);
return result;
}
示例2: types_str
MVMObject * types_str(MVMThreadContext *tc, MVMHeapSnapshotCollection *col) {
/* Produces ; separated sequences of:
* repr_string_index,type_name_string_index
* Both of which are integers.
*/
MVMObject *result;
size_t buffer_size = 10 * col->num_types;
size_t buffer_pos = 0;
char *buffer = MVM_malloc(buffer_size);
MVMuint64 i;
for (i = 0; i < col->num_types; i++) {
char tmp[256];
int item_chars = snprintf(tmp, 256,
"%"PRIu64",%"PRIu64";",
col->types[i].repr_name,
col->types[i].type_name);
if (item_chars < 0)
MVM_panic(1, "Failed to save type in heap snapshot");
if (buffer_pos + item_chars >= buffer_size) {
buffer_size += 4096;
buffer = MVM_realloc(buffer, buffer_size);
}
memcpy(buffer + buffer_pos, tmp, item_chars);
buffer_pos += item_chars;
}
if (buffer_pos > 1)
buffer[buffer_pos - 1] = 0; /* Cut off the trailing ; for ease of parsing */
buffer[buffer_pos] = 0;
result = box_s(tc, vmstr(tc, buffer));
MVM_free(buffer);
return result;
}
示例3: push_work_to_thread_in_tray
/* Adds a chunk of work to another thread's in-tray. */
static void push_work_to_thread_in_tray(MVMThreadContext *tc, MVMuint32 target, MVMGCPassedWork *work) {
MVMint32 j;
MVMGCPassedWork * volatile *target_tray;
/* Locate the thread to pass the work to. */
MVMThreadContext *target_tc = NULL;
if (target == 1) {
/* It's going to the main thread. */
target_tc = tc->instance->main_thread;
}
else {
MVMThread *t = (MVMThread *)MVM_load(&tc->instance->threads);
do {
if (t->body.tc && t->body.tc->thread_id == target) {
target_tc = t->body.tc;
break;
}
} while ((t = t->body.next));
if (!target_tc)
MVM_panic(MVM_exitcode_gcnursery, "Internal error: invalid thread ID in GC work pass");
}
/* Pass the work, chaining any other in-tray entries for the thread
* after us. */
target_tray = &target_tc->gc_in_tray;
while (1) {
MVMGCPassedWork *orig = *target_tray;
work->next = orig;
if (MVM_casptr(target_tray, orig, work) == orig)
return;
}
}
示例4: page_mode_to_prot_mode
void *MVM_platform_alloc_pages(size_t size, int page_mode)
{
int prot_mode = page_mode_to_prot_mode(page_mode);
void * allocd = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, prot_mode);
if (!allocd)
MVM_panic(1, "MVM_platform_alloc_pages failed: %d", GetLastError());
return allocd;
}
示例5: set_ref_from
/* Sets the current reference "from" collectable. */
static void set_ref_from(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMuint64 col_idx) {
/* The references should be contiguous, so if this collectable already
* has any, something's wrong. */
if (ss->hs->collectables[col_idx].num_refs)
MVM_panic(1, "Heap snapshot corruption: can not add non-contiguous refs");
ss->ref_from = col_idx;
ss->hs->collectables[col_idx].refs_start = ss->hs->num_references;
}
示例6: run_handler
static void run_handler(MVMThreadContext *tc, LocatedHandler lh, MVMObject *ex_obj) {
switch (lh.handler->action) {
case MVM_EX_ACTION_GOTO:
unwind_to_frame(tc, lh.frame);
*tc->interp_cur_op = *tc->interp_bytecode_start + lh.handler->goto_offset;
break;
case MVM_EX_ACTION_INVOKE: {
/* Create active handler record. */
MVMActiveHandler *ah = malloc(sizeof(MVMActiveHandler));
/* Find frame to invoke. */
MVMObject *handler_code = MVM_frame_find_invokee(tc,
lh.frame->work[lh.handler->block_reg].o);
/* Ensure we have an exception object. */
/* TODO: Can make one up. */
if (ex_obj == NULL)
MVM_panic(1, "Exception object creation NYI");
/* Install active handler record. */
ah->frame = lh.frame;
ah->handler = lh.handler;
ah->ex_obj = ex_obj;
ah->next_handler = tc->active_handlers;
tc->active_handlers = ah;
/* Set up special return to unwinding after running the
* handler. */
tc->cur_frame->return_value = NULL;
tc->cur_frame->return_type = MVM_RETURN_VOID;
tc->cur_frame->special_return = unwind_after_handler;
tc->cur_frame->special_return_data = ah;
/* Inovke the handler frame and return to runloop. */
STABLE(handler_code)->invoke(tc, handler_code, &no_arg_callsite,
tc->cur_frame->args);
break;
}
default:
MVM_panic(1, "Unimplemented handler action");
}
}
示例7: cleanup_active_handler
/* Cleans up an active handler record if we unwind over it. */
static void cleanup_active_handler(MVMThreadContext *tc, void *sr_data) {
/* Get active handler; sanity check (though it's possible other cases
* should be supported). */
MVMActiveHandler *ah = (MVMActiveHandler *)sr_data;
if (tc->active_handlers != ah)
MVM_panic(1, "Trying to unwind over wrong handler");
/* Clean up. */
tc->active_handlers = ah->next_handler;
MVM_frame_dec_ref(tc, ah->frame);
free(ah);
}
示例8: run_handler
static void run_handler(MVMThreadContext *tc, LocatedHandler lh, MVMObject *ex_obj, MVMuint32 category) {
switch (lh.handler->action) {
case MVM_EX_ACTION_GOTO:
if (lh.jit_handler) {
void **labels = lh.frame->spesh_cand->jitcode->labels;
MVMuint8 *pc = lh.frame->spesh_cand->jitcode->bytecode;
lh.frame->jit_entry_label = labels[lh.jit_handler->goto_label];
MVM_frame_unwind_to(tc, lh.frame, pc, 0, NULL);
} else {
MVM_frame_unwind_to(tc, lh.frame, NULL, lh.handler->goto_offset, NULL);
}
break;
case MVM_EX_ACTION_INVOKE: {
/* Create active handler record. */
MVMActiveHandler *ah = MVM_malloc(sizeof(MVMActiveHandler));
MVMFrame *cur_frame = tc->cur_frame;
MVMObject *handler_code;
/* Ensure we have an exception object. */
if (ex_obj == NULL) {
ex_obj = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTException);
((MVMException *)ex_obj)->body.category = category;
}
/* Find frame to invoke. */
handler_code = MVM_frame_find_invokee(tc, lh.frame->work[lh.handler->block_reg].o, NULL);
/* Install active handler record. */
ah->frame = MVM_frame_inc_ref(tc, lh.frame);
ah->handler = lh.handler;
ah->jit_handler = lh.jit_handler;
ah->ex_obj = ex_obj;
ah->next_handler = tc->active_handlers;
tc->active_handlers = ah;
/* Set up special return to unwinding after running the
* handler. */
cur_frame->return_value = (MVMRegister *)&tc->last_handler_result;
cur_frame->return_type = MVM_RETURN_OBJ;
cur_frame->special_return = unwind_after_handler;
cur_frame->special_unwind = cleanup_active_handler;
cur_frame->special_return_data = ah;
/* Invoke the handler frame and return to runloop. */
STABLE(handler_code)->invoke(tc, handler_code, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS),
cur_frame->args);
break;
}
default:
MVM_panic(1, "Unimplemented handler action");
}
}
示例9: MVM_spesh_arg_guard_add
/* Takes a pointer to a guard set. Replaces it with a guard set that also
* includes a guard for the specified type tuple (passed with callsite to
* know how many types are involved), and resolving to the specified spesh
* candidate index. Any previous guard set will be scheduled for freeing at
* the next safepoint. */
void MVM_spesh_arg_guard_add(MVMThreadContext *tc, MVMSpeshArgGuard **orig,
MVMCallsite *cs, MVMSpeshStatsType *types,
MVMuint32 candidate) {
MVMSpeshArgGuard *new_guard = copy_and_extend(tc, *orig, max_new_nodes(cs, types));
if (!try_add_guard(tc, new_guard, cs, types, candidate))
MVM_panic(1, "Spesh arg guard: trying to add duplicate result for same guard");
if (*orig) {
MVMSpeshArgGuard *prev = *orig;
*orig = new_guard;
MVM_spesh_arg_guard_destroy(tc, prev, 1);
}
else {
*orig = new_guard;
}
}
示例10: unwind_after_handler
/* Unwinds after a handler. */
void unwind_after_handler(MVMThreadContext *tc, void *sr_data) {
/* Get active handler; sanity check (though it's possible other cases
* should be supported). */
MVMActiveHandler *ah = (MVMActiveHandler *)sr_data;
if (tc->active_handlers != ah)
MVM_panic(1, "Trying to unwind from wrong handler");
tc->active_handlers = ah->next_handler;
/* Do the unwinding as needed. */
unwind_to_frame(tc, ah->frame);
*tc->interp_cur_op = *tc->interp_bytecode_start + ah->handler->goto_offset;
/* Clean up. */
free(ah);
}
示例11: MVM_frame_unwind_to
void MVM_frame_unwind_to(MVMThreadContext *tc, MVMFrame *frame, MVMuint8 *abs_addr,
MVMuint32 rel_addr, MVMObject *return_value) {
while (tc->cur_frame != frame) {
if (tc->cur_frame->static_info->body.has_exit_handler &&
!(tc->cur_frame->flags & MVM_FRAME_FLAG_EXIT_HAND_RUN)) {
/* We're unwinding a frame with an exit handler. Thus we need to
* pause the unwind, run the exit handler, and keep enough info
* around in order to finish up the unwind afterwards. */
MVMFrame *caller = tc->cur_frame->caller;
MVMHLLConfig *hll = MVM_hll_current(tc);
MVMObject *handler;
if (!caller)
MVM_exception_throw_adhoc(tc, "Entry point frame cannot have an exit handler");
if (tc->cur_frame == tc->thread_entry_frame)
MVM_exception_throw_adhoc(tc, "Thread entry point frame cannot have an exit handler");
MVM_args_setup_thunk(tc, NULL, MVM_RETURN_VOID, &exit_arg_callsite);
tc->cur_frame->args[0].o = tc->cur_frame->code_ref;
tc->cur_frame->args[1].o = NULL;
tc->cur_frame->special_return = continue_unwind;
{
MVMUnwindData *ud = malloc(sizeof(MVMUnwindData));
ud->frame = frame;
ud->abs_addr = abs_addr;
ud->rel_addr = rel_addr;
if (return_value)
MVM_exception_throw_adhoc(tc, "return_value + exit_handler case NYI");
tc->cur_frame->special_return_data = ud;
}
tc->cur_frame->flags |= MVM_FRAME_FLAG_EXIT_HAND_RUN;
handler = MVM_frame_find_invokee(tc, hll->exit_handler, NULL);
STABLE(handler)->invoke(tc, handler, &exit_arg_callsite, tc->cur_frame->args);
return;
}
else {
/* No exit handler, so just remove the frame. */
if (!remove_one_frame(tc, 1))
MVM_panic(1, "Internal error: Unwound entire stack and missed handler");
}
}
if (abs_addr)
*tc->interp_cur_op = abs_addr;
else if (rel_addr)
*tc->interp_cur_op = *tc->interp_bytecode_start + rel_addr;
if (return_value)
MVM_args_set_result_obj(tc, return_value, 1);
}
示例12: get_type_check_node
/* Resolves or inserts a node for testing the curernt type loaded into the
* test buffer. If it needs to insert a new node, it chains it on to the
* end of the existing set of type tests. */
static MVMuint32 get_type_check_node(MVMThreadContext *tc, MVMSpeshArgGuard *ag,
MVMuint32 base_node, MVMObject *type, MVMuint8 concrete) {
MVMuint32 current_node = ag->nodes[base_node].yes;
MVMuint32 have_fixup_node = 0;
MVMuint32 fixup_node;
while (current_node != 0) {
MVMSpeshArgGuardNode *agn = &(ag->nodes[current_node]);
if (agn->op == MVM_SPESH_GUARD_OP_STABLE_CONC) {
/* If it matches, we've found it. */
if (concrete && agn->st == type->st)
return current_node;
/* Otherwise, treat this as the working fixup node, and take
* the no branch. */
fixup_node = current_node;
have_fixup_node = 1;
current_node = agn->no;
}
else if (agn->op == MVM_SPESH_GUARD_OP_STABLE_TYPE) {
/* If it matches, we've found it. */
if (!concrete && agn->st == type->st)
return current_node;
/* Otherwise, treat this as the working fixup node, and take
* the no branch. */
fixup_node = current_node;
have_fixup_node = 1;
current_node = agn->no;
}
else {
/* We only expect type matching nodes at the top level. */
MVM_panic(1, "Spesh arg guard: unexpected type structure in tree");
}
}
/* If we get here, we need to add a node for this callsite. */
ag->nodes[ag->used_nodes].op = concrete
? MVM_SPESH_GUARD_OP_STABLE_CONC
: MVM_SPESH_GUARD_OP_STABLE_TYPE;
ag->nodes[ag->used_nodes].st = type->st;
ag->nodes[ag->used_nodes].yes = 0;
ag->nodes[ag->used_nodes].no = 0;
if (have_fixup_node)
ag->nodes[fixup_node].no = ag->used_nodes;
else
ag->nodes[base_node].yes = ag->used_nodes;
return ag->used_nodes++;
}
示例13: MVM_gc_mark_thread_blocked
/* Called by a thread to indicate it is about to enter a blocking operation.
* This tells any thread that is coordinating a GC run that this thread will
* be unable to participate. */
void MVM_gc_mark_thread_blocked(MVMThreadContext *tc) {
/* This may need more than one attempt. */
while (1) {
/* Try to set it from running to unable - the common case. */
if (MVM_cas(&tc->gc_status, MVMGCStatus_NONE,
MVMGCStatus_UNABLE) == MVMGCStatus_NONE)
return;
/* The only way this can fail is if another thread just decided we're to
* participate in a GC run. */
if (MVM_load(&tc->gc_status) == MVMGCStatus_INTERRUPT)
MVM_gc_enter_from_interrupt(tc);
else
MVM_panic(MVM_exitcode_gcorch, "Invalid GC status observed; aborting");
}
}
示例14: search_for_handler_from
/* Searches for a handler of the specified category, relative to the given
* starting frame, searching according to the chosen mode. */
static LocatedHandler search_for_handler_from(MVMThreadContext *tc, MVMFrame *f,
MVMuint8 mode, MVMuint32 cat, MVMObject *payload) {
LocatedHandler lh;
lh.frame = NULL;
lh.handler = NULL;
lh.jit_handler = NULL;
lh.handler_out_of_dynamic_scope = 0;
switch (mode) {
case MVM_EX_THROW_LEX_CALLER:
f = f->caller;
while (f && f->static_info->body.is_thunk)
f = f->caller;
/* And now we've gone down a caller, it's just lexical... */
case MVM_EX_THROW_LEX:
while (f != NULL) {
if (search_frame_handlers(tc, f, MVM_EX_THROW_LEX, cat, payload, &lh)) {
if (in_caller_chain(tc, f))
lh.frame = f;
else
lh.handler_out_of_dynamic_scope = 1;
return lh;
}
f = f->outer;
}
return lh;
case MVM_EX_THROW_DYN:
while (f != NULL) {
if (search_frame_handlers(tc, f, mode, cat, payload, &lh)) {
lh.frame = f;
return lh;
}
f = f->caller;
}
return lh;
case MVM_EX_THROW_LEXOTIC:
while (f != NULL) {
lh = search_for_handler_from(tc, f, MVM_EX_THROW_LEX, cat, payload);
if (lh.frame != NULL)
return lh;
f = f->caller;
}
return lh;
default:
MVM_panic(1, "Unhandled exception throw mode %d", (int)mode);
}
}
示例15: run_gc
static void run_gc(MVMThreadContext *tc, MVMuint8 what_to_do) {
MVMuint8 gen;
MVMuint32 i, n;
#if MVM_GC_DEBUG
if (tc->in_spesh)
MVM_panic(1, "Must not GC when in the specializer/JIT\n");
#endif
/* Decide nursery or full collection. */
gen = tc->instance->gc_full_collect ? MVMGCGenerations_Both : MVMGCGenerations_Nursery;
/* Do GC work for ourselves and any work threads. */
for (i = 0, n = tc->gc_work_count ; i < n; i++) {
MVMThreadContext *other = tc->gc_work[i].tc;
tc->gc_work[i].limit = other->nursery_alloc;
GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : starting collection for thread %d\n",
other->thread_id);
other->gc_promoted_bytes = 0;
MVM_gc_collect(other, (other == tc ? what_to_do : MVMGCWhatToDo_NoInstance), gen);
}
/* Wait for everybody to agree we're done. */
finish_gc(tc, gen, what_to_do == MVMGCWhatToDo_All);
/* Now we're all done, it's safe to finalize any objects that need it. */
/* XXX TODO explore the feasability of doing this in a background
* finalizer/destructor thread and letting the main thread(s) continue
* on their merry way(s). */
for (i = 0, n = tc->gc_work_count ; i < n; i++) {
MVMThreadContext *other = tc->gc_work[i].tc;
/* The thread might've been destroyed */
if (!other)
continue;
/* Contribute this thread's promoted bytes. */
MVM_add(&tc->instance->gc_promoted_bytes_since_last_full, other->gc_promoted_bytes);
/* Collect nursery. */
GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE,
"Thread %d run %d : collecting nursery uncopied of thread %d\n",
other->thread_id);
MVM_gc_collect_free_nursery_uncopied(other, tc->gc_work[i].limit);
}
}