本文整理汇总了C++中MVM_exception_throw_adhoc函数的典型用法代码示例。如果您正苦于以下问题:C++ MVM_exception_throw_adhoc函数的具体用法?C++ MVM_exception_throw_adhoc怎么用?C++ MVM_exception_throw_adhoc使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了MVM_exception_throw_adhoc函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: callback_handler
//.........这里部分代码省略.........
args[i - 1].n64 = *(double *)cb_args[i - 1];
break;
case MVM_NATIVECALL_ARG_ASCIISTR:
case MVM_NATIVECALL_ARG_UTF8STR:
case MVM_NATIVECALL_ARG_UTF16STR:
args[i - 1].o = MVM_nativecall_make_str(tc, type, typeinfo, *(char **)cb_args[i - 1]);
MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o));
num_roots++;
break;
case MVM_NATIVECALL_ARG_CSTRUCT:
args[i - 1].o = MVM_nativecall_make_cstruct(tc, type, *(void **)cb_args[i - 1]);
MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o));
num_roots++;
break;
case MVM_NATIVECALL_ARG_CPPSTRUCT:
args[i - 1].o = MVM_nativecall_make_cppstruct(tc, type, *(void **)cb_args[i - 1]);
MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o));
num_roots++;
break;
case MVM_NATIVECALL_ARG_CPOINTER:
args[i - 1].o = MVM_nativecall_make_cpointer(tc, type, *(void **)cb_args[i - 1]);
MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o));
num_roots++;
break;
case MVM_NATIVECALL_ARG_CARRAY:
args[i - 1].o = MVM_nativecall_make_carray(tc, type, *(void **)cb_args[i - 1]);
MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o));
num_roots++;
break;
case MVM_NATIVECALL_ARG_CUNION:
args[i - 1].o = MVM_nativecall_make_cunion(tc, type, *(void **)cb_args[i - 1]);
MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o));
num_roots++;
break;
case MVM_NATIVECALL_ARG_CALLBACK:
/* TODO: A callback -return- value means that we have a C method
* that needs to be wrapped similarly to a is native(...) Perl 6
* sub. */
/* XXX do something with the function pointer: *(void **)cb_args[i - 1] */
args[i - 1].o = type;
MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o));
num_roots++;
case MVM_NATIVECALL_ARG_UCHAR:
args[i - 1].i64 = *(unsigned char *)cb_args[i - 1];
break;
case MVM_NATIVECALL_ARG_USHORT:
args[i - 1].i64 = *(unsigned short *)cb_args[i - 1];
break;
case MVM_NATIVECALL_ARG_UINT:
args[i - 1].i64 = *(unsigned int *)cb_args[i - 1];
break;
case MVM_NATIVECALL_ARG_ULONG:
args[i - 1].i64 = *(unsigned long *)cb_args[i - 1];
break;
case MVM_NATIVECALL_ARG_ULONGLONG:
args[i - 1].i64 = *(unsigned long long *)cb_args[i - 1];
break;
default:
MVM_telemetry_interval_stop(tc, interval_id, "nativecall callback handler failed");
MVM_exception_throw_adhoc(tc,
"Internal error: unhandled libffi callback argument type");
}
}
/* Call into a nested interpreter (since we already are in one). Need to
* save a bunch of state around each side of this. */
cid.invokee = data->target;
cid.args = args;
cid.cs = data->cs;
{
MVMuint8 **backup_interp_cur_op = tc->interp_cur_op;
MVMuint8 **backup_interp_bytecode_start = tc->interp_bytecode_start;
MVMRegister **backup_interp_reg_base = tc->interp_reg_base;
MVMCompUnit **backup_interp_cu = tc->interp_cu;
MVMFrame *backup_cur_frame = MVM_frame_force_to_heap(tc, tc->cur_frame);
MVMFrame *backup_thread_entry_frame = tc->thread_entry_frame;
void **backup_jit_return_address = tc->jit_return_address;
tc->jit_return_address = NULL;
MVMROOT2(tc, backup_cur_frame, backup_thread_entry_frame, {
MVMuint32 backup_mark = MVM_gc_root_temp_mark(tc);
jmp_buf backup_interp_jump;
memcpy(backup_interp_jump, tc->interp_jump, sizeof(jmp_buf));
tc->cur_frame->return_value = &res;
tc->cur_frame->return_type = MVM_RETURN_OBJ;
MVM_interp_run(tc, callback_invoke, &cid);
tc->interp_cur_op = backup_interp_cur_op;
tc->interp_bytecode_start = backup_interp_bytecode_start;
tc->interp_reg_base = backup_interp_reg_base;
tc->interp_cu = backup_interp_cu;
tc->cur_frame = backup_cur_frame;
tc->current_frame_nr = backup_cur_frame->sequence_nr;
tc->thread_entry_frame = backup_thread_entry_frame;
tc->jit_return_address = backup_jit_return_address;
memcpy(tc->interp_jump, backup_interp_jump, sizeof(jmp_buf));
MVM_gc_root_temp_mark_reset(tc, backup_mark);
});
}
示例2: MVM_file_stat
MVMint64 MVM_file_stat(MVMThreadContext *tc, MVMString *filename, MVMint64 status, MVMint32 use_lstat) {
MVMint64 r = -1;
switch (status) {
case MVM_STAT_EXISTS:
r = MVM_file_exists(tc, filename, use_lstat);
break;
case MVM_STAT_FILESIZE: {
char * const a = MVM_string_utf8_encode_C_string(tc, filename);
uv_fs_t req;
if ((use_lstat
? uv_fs_lstat(tc->loop, &req, a, NULL)
: uv_fs_stat(tc->loop, &req, a, NULL)
) < 0) {
MVM_free(a);
MVM_exception_throw_adhoc(tc, "Failed to stat file: %s", uv_strerror(req.result));
}
MVM_free(a);
r = req.statbuf.st_size;
break;
}
case MVM_STAT_ISDIR:
r = (file_info(tc, filename, use_lstat).st_mode & S_IFMT) == S_IFDIR;
break;
case MVM_STAT_ISREG:
r = (file_info(tc, filename, use_lstat).st_mode & S_IFMT) == S_IFREG;
break;
case MVM_STAT_ISDEV: {
const int mode = file_info(tc, filename, use_lstat).st_mode;
#ifdef _WIN32
r = mode & S_IFMT == S_IFCHR;
#else
r = (mode & S_IFMT) == S_IFCHR || (mode & S_IFMT) == S_IFBLK;
#endif
break;
}
case MVM_STAT_CREATETIME:
r = file_info(tc, filename, use_lstat).st_ctim.tv_sec;
break;
case MVM_STAT_ACCESSTIME:
r = file_info(tc, filename, use_lstat).st_atim.tv_sec;
break;
case MVM_STAT_MODIFYTIME:
r = file_info(tc, filename, use_lstat).st_mtim.tv_sec;
break;
case MVM_STAT_CHANGETIME:
r = file_info(tc, filename, use_lstat).st_ctim.tv_sec;
break;
/* case MVM_STAT_BACKUPTIME: r = -1; break; */
case MVM_STAT_UID:
r = file_info(tc, filename, use_lstat).st_uid;
break;
case MVM_STAT_GID:
r = file_info(tc, filename, use_lstat).st_gid;
break;
case MVM_STAT_ISLNK:
r = (file_info(tc, filename, 1).st_mode & S_IFMT) == S_IFLNK;
break;
case MVM_STAT_PLATFORM_DEV:
r = file_info(tc, filename, use_lstat).st_dev;
break;
case MVM_STAT_PLATFORM_INODE:
r = file_info(tc, filename, use_lstat).st_ino;
break;
case MVM_STAT_PLATFORM_MODE:
r = file_info(tc, filename, use_lstat).st_mode;
break;
case MVM_STAT_PLATFORM_NLINKS:
r = file_info(tc, filename, use_lstat).st_nlink;
break;
case MVM_STAT_PLATFORM_DEVTYPE:
r = file_info(tc, filename, use_lstat).st_rdev;
break;
case MVM_STAT_PLATFORM_BLOCKSIZE:
r = file_info(tc, filename, use_lstat).st_blksize;
break;
case MVM_STAT_PLATFORM_BLOCKS:
r = file_info(tc, filename, use_lstat).st_blocks;
//.........这里部分代码省略.........
示例3: flush
/* Flushes the file handle. */
static void flush(MVMThreadContext *tc, MVMOSHandle *h){
MVMIOFileData *data = (MVMIOFileData *)h->body.data;
uv_fs_t req;
if (uv_fs_fsync(tc->loop, &req, data->fd, NULL) < 0 )
MVM_exception_throw_adhoc(tc, "Failed to flush filehandle: %s", uv_strerror(req.result));
}
示例4: MVM_file_copy
/* copy a file from one to another */
void MVM_file_copy(MVMThreadContext *tc, MVMString *src, MVMString * dest) {
/* TODO: on Windows we can use the CopyFile API, which is probaly
more efficient, not to mention easier to use. */
uv_fs_t req;
char * a, * b;
uv_file in_fd = -1, out_fd = -1;
MVMuint64 size, offset;
a = MVM_string_utf8_c8_encode_C_string(tc, src);
b = MVM_string_utf8_c8_encode_C_string(tc, dest);
/* If the file cannot be stat(), there is little point in going any further. */
if (uv_fs_stat(tc->loop, &req, a, NULL) < 0)
goto failure;
size = req.statbuf.st_size;
in_fd = uv_fs_open(tc->loop, &req, (const char *)a, O_RDONLY, 0, NULL);
if (in_fd < 0) {
goto failure;
}
out_fd = uv_fs_open(tc->loop, &req, (const char *)b, O_WRONLY | O_CREAT | O_TRUNC, DEFAULT_MODE, NULL);
if (out_fd < 0) {
goto failure;
}
offset = 0;
do {
/* sendfile() traditionally takes offset as a pointer argument
* used a both input and output. libuv deviates by making
* offset an integer and returning the number of bytes
* sent. So it is necessary to add these explicitly. */
MVMint64 sent = uv_fs_sendfile(tc->loop, &req, out_fd, in_fd, offset, size - offset, NULL);
if (sent < 0) {
goto failure;
}
offset += sent;
} while (offset < size);
/* Cleanup */
if(uv_fs_close(tc->loop, &req, in_fd, NULL) < 0) {
goto failure;
}
in_fd = -1;
if (uv_fs_close(tc->loop, &req, out_fd, NULL) < 0) {
goto failure;
}
MVM_free(b);
MVM_free(a);
return;
failure: {
/* First get the error, since it may be overwritten further on. */
const char * error = uv_strerror(req.result);
/* Basic premise: dealing with all failure cases is hard.
* So to simplify, a and b are allocated in all conditions.
* Also to simplify, in_fd are nonnegative if open, negative
* otherwise. */
MVM_free(b);
MVM_free(a);
/* If any of these fail there is nothing
* further to do, since we're already failing */
if (in_fd >= 0)
uv_fs_close(tc->loop, &req, in_fd, NULL);
if (out_fd >= 0)
uv_fs_close(tc->loop, &req, out_fd, NULL);
/* This function only throws adhoc errors, so the message is for
* progammer eyes only */
MVM_exception_throw_adhoc(tc, "Failed to copy file: %s", error);
}
}
示例5: set_encoding
/* Sets the encoding used for string-based I/O. */
static void set_encoding(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 encoding) {
MVMIOFileData *data = (MVMIOFileData *)h->body.data;
if (data->ds)
MVM_exception_throw_adhoc(tc, "Too late to change handle encoding");
data->encoding = encoding;
}
示例6: index_mapping_and_flat_list
/* Locates all of the attributes. Puts them onto a flattened, ordered
* list of attributes (populating the passed flat_list). Also builds
* the index mapping for doing named lookups. Note index is not related
* to the storage position. */
static MVMObject * index_mapping_and_flat_list(MVMThreadContext *tc, MVMObject *mro, MVMCPPStructREPRData *repr_data) {
MVMInstance *instance = tc->instance;
MVMObject *flat_list, *class_list, *attr_map_list;
MVMint32 num_classes, i, current_slot = 0;
MVMCPPStructNameMap *result;
MVMint32 mro_idx = MVM_repr_elems(tc, mro);
MVM_gc_root_temp_push(tc, (MVMCollectable **)&mro);
flat_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type);
MVM_gc_root_temp_push(tc, (MVMCollectable **)&flat_list);
class_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type);
MVM_gc_root_temp_push(tc, (MVMCollectable **)&class_list);
attr_map_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type);
MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_map_list);
/* Walk through the parents list. */
while (mro_idx)
{
/* Get current class in MRO. */
MVMObject *type_info = MVM_repr_at_pos_o(tc, mro, --mro_idx);
MVMObject *current_class = MVM_repr_at_pos_o(tc, type_info, 0);
/* Get its local parents; make sure we're not doing MI. */
MVMObject *parents = MVM_repr_at_pos_o(tc, type_info, 2);
MVMint32 num_parents = MVM_repr_elems(tc, parents);
if (num_parents <= 1) {
/* Get attributes and iterate over them. */
MVMObject *attributes = MVM_repr_at_pos_o(tc, type_info, 1);
MVMIter * const attr_iter = (MVMIter *)MVM_iter(tc, attributes);
MVMObject *attr_map = NULL;
if (MVM_iter_istrue(tc, attr_iter)) {
MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_iter);
attr_map = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_hash_type);
MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_map);
}
while (MVM_iter_istrue(tc, attr_iter)) {
MVMObject *current_slot_obj = MVM_repr_box_int(tc, MVM_hll_current(tc)->int_box_type, current_slot);
MVMObject *attr, *name_obj;
MVMString *name;
MVM_repr_shift_o(tc, (MVMObject *)attr_iter);
/* Get attribute. */
attr = MVM_iterval(tc, attr_iter);
/* Get its name. */
name_obj = MVM_repr_at_key_o(tc, attr, instance->str_consts.name);
name = MVM_repr_get_str(tc, name_obj);
MVM_repr_bind_key_o(tc, attr_map, name, current_slot_obj);
current_slot++;
/* Push attr onto the flat list. */
MVM_repr_push_o(tc, flat_list, attr);
}
if (attr_map) {
MVM_gc_root_temp_pop_n(tc, 2);
}
/* Add to class list and map list. */
MVM_repr_push_o(tc, class_list, current_class);
MVM_repr_push_o(tc, attr_map_list, attr_map);
}
else {
MVM_exception_throw_adhoc(tc,
"CPPStruct representation does not support multiple inheritance");
}
}
MVM_gc_root_temp_pop_n(tc, 4);
/* We can now form the name map. */
num_classes = MVM_repr_elems(tc, class_list);
result = (MVMCPPStructNameMap *) MVM_malloc(sizeof(MVMCPPStructNameMap) * (1 + num_classes));
for (i = 0; i < num_classes; i++) {
result[i].class_key = MVM_repr_at_pos_o(tc, class_list, i);
result[i].name_map = MVM_repr_at_pos_o(tc, attr_map_list, i);
}
/* set the end to be NULL, it's useful for iteration. */
result[i].class_key = NULL;
repr_data->name_to_index_mapping = result;
return flat_list;
}
示例7: deserialize_extop_records
/* Loads the extension op records. */
static MVMExtOpRecord * deserialize_extop_records(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs) {
MVMExtOpRecord *extops;
MVMuint32 num = rs->expected_extops;
MVMuint8 *pos;
MVMuint32 i;
if (num == 0)
return NULL;
extops = MVM_calloc(num, sizeof *extops);
pos = rs->extop_seg;
for (i = 0; i < num; i++) {
MVMuint32 name_idx;
MVMuint16 operand_bytes = 0;
MVMuint8 *operand_descriptor = extops[i].operand_descriptor;
/* Read name string index. */
ensure_can_read(tc, cu, rs, pos, 4);
name_idx = read_int32(pos, 0);
pos += 4;
/* Lookup name string. */
if (name_idx >= cu->body.num_strings) {
cleanup_all(tc, rs);
MVM_exception_throw_adhoc(tc,
"String heap index beyond end of string heap");
}
extops[i].name = cu->body.strings[name_idx];
/* Read operand descriptor. */
ensure_can_read(tc, cu, rs, pos, 8);
memcpy(operand_descriptor, pos, 8);
pos += 8;
/* Validate operand descriptor.
* TODO: Unify with validation in MVM_ext_register_extop? */
{
MVMuint8 j = 0;
for(; j < 8; j++) {
MVMuint8 flags = operand_descriptor[j];
if (!flags)
break;
switch (flags & MVM_operand_rw_mask) {
case MVM_operand_literal:
goto check_literal;
case MVM_operand_read_reg:
case MVM_operand_write_reg:
operand_bytes += 2;
goto check_reg;
case MVM_operand_read_lex:
case MVM_operand_write_lex:
operand_bytes += 4;
goto check_reg;
default:
goto fail;
}
check_literal:
switch (flags & MVM_operand_type_mask) {
case MVM_operand_int8:
operand_bytes += 1;
continue;
case MVM_operand_int16:
operand_bytes += 2;
continue;
case MVM_operand_int32:
operand_bytes += 4;
continue;
case MVM_operand_int64:
operand_bytes += 8;
continue;
case MVM_operand_num32:
operand_bytes += 4;
continue;
case MVM_operand_num64:
operand_bytes += 8;
continue;
case MVM_operand_str:
operand_bytes += 2;
continue;
case MVM_operand_coderef:
operand_bytes += 2;
continue;
case MVM_operand_ins:
//.........这里部分代码省略.........
示例8: die_no_attrs
static void die_no_attrs(MVMThreadContext *tc, const char *repr_name, const char *debug_name) {
MVM_exception_throw_adhoc(tc,
"This representation (%s) does not support attribute storage (for type %s)", repr_name, debug_name);
}
示例9: MVM_repr_get_by_id
/* Gets a representation by ID. */
const MVMREPROps * MVM_repr_get_by_id(MVMThreadContext *tc, MVMuint32 id) {
if (id >= tc->instance->num_reprs)
MVM_exception_throw_adhoc(tc, "REPR lookup by invalid ID %" PRIu32, id);
return tc->instance->repr_list[id]->repr;
}
示例10: MVM_nativecall_invoke
MVMObject * MVM_nativecall_invoke(MVMThreadContext *tc, MVMObject *res_type,
MVMObject *site, MVMObject *args) {
MVMObject *result = NULL;
char **free_strs = NULL;
void **free_rws = NULL;
MVMint16 num_strs = 0;
MVMint16 num_rws = 0;
MVMint16 i;
/* Get native call body, so we can locate the call info. Read out all we
* shall need, since later we may allocate a result and and move it. */
MVMNativeCallBody *body = MVM_nativecall_get_nc_body(tc, site);
MVMint16 num_args = body->num_args;
MVMint16 *arg_types = body->arg_types;
MVMint16 ret_type = body->ret_type;
void *entry_point = body->entry_point;
/* Create and set up call VM. */
DCCallVM *vm = dcNewCallVM(8192);
dcMode(vm, body->convention);
/* Process arguments. */
for (i = 0; i < num_args; i++) {
MVMObject *value = MVM_repr_at_pos_o(tc, args, i);
switch (arg_types[i] & MVM_NATIVECALL_ARG_TYPE_MASK) {
case MVM_NATIVECALL_ARG_CHAR:
handle_arg("integer", cont_i, DCchar, i64, dcArgChar, MVM_nativecall_unmarshal_char);
break;
case MVM_NATIVECALL_ARG_SHORT:
handle_arg("integer", cont_i, DCshort, i64, dcArgShort, MVM_nativecall_unmarshal_short);
break;
case MVM_NATIVECALL_ARG_INT:
handle_arg("integer", cont_i, DCint, i64, dcArgInt, MVM_nativecall_unmarshal_int);
break;
case MVM_NATIVECALL_ARG_LONG:
handle_arg("integer", cont_i, DClong, i64, dcArgLong, MVM_nativecall_unmarshal_long);
break;
case MVM_NATIVECALL_ARG_LONGLONG:
handle_arg("integer", cont_i, DClonglong, i64, dcArgLongLong, MVM_nativecall_unmarshal_longlong);
break;
case MVM_NATIVECALL_ARG_FLOAT:
handle_arg("number", cont_n, DCfloat, n64, dcArgFloat, MVM_nativecall_unmarshal_float);
break;
case MVM_NATIVECALL_ARG_DOUBLE:
handle_arg("number", cont_n, DCdouble, n64, dcArgDouble, MVM_nativecall_unmarshal_double);
break;
case MVM_NATIVECALL_ARG_ASCIISTR:
case MVM_NATIVECALL_ARG_UTF8STR:
case MVM_NATIVECALL_ARG_UTF16STR:
{
MVMint16 free = 0;
char *str = MVM_nativecall_unmarshal_string(tc, value, arg_types[i], &free);
if (free) {
if (!free_strs)
free_strs = (char**)MVM_malloc(num_args * sizeof(char *));
free_strs[num_strs] = str;
num_strs++;
}
dcArgPointer(vm, str);
}
break;
case MVM_NATIVECALL_ARG_CSTRUCT:
dcArgPointer(vm, MVM_nativecall_unmarshal_cstruct(tc, value));
break;
case MVM_NATIVECALL_ARG_CPOINTER:
dcArgPointer(vm, MVM_nativecall_unmarshal_cpointer(tc, value));
break;
case MVM_NATIVECALL_ARG_CARRAY:
dcArgPointer(vm, MVM_nativecall_unmarshal_carray(tc, value));
break;
case MVM_NATIVECALL_ARG_CUNION:
dcArgPointer(vm, MVM_nativecall_unmarshal_cunion(tc, value));
break;
case MVM_NATIVECALL_ARG_VMARRAY:
dcArgPointer(vm, MVM_nativecall_unmarshal_vmarray(tc, value));
break;
case MVM_NATIVECALL_ARG_CALLBACK:
dcArgPointer(vm, unmarshal_callback(tc, value, body->arg_info[i]));
break;
case MVM_NATIVECALL_ARG_UCHAR:
handle_arg("integer", cont_i, DCuchar, i64, dcArgChar, MVM_nativecall_unmarshal_uchar);
break;
case MVM_NATIVECALL_ARG_USHORT:
handle_arg("integer", cont_i, DCushort, i64, dcArgShort, MVM_nativecall_unmarshal_ushort);
break;
case MVM_NATIVECALL_ARG_UINT:
handle_arg("integer", cont_i, DCuint, i64, dcArgInt, MVM_nativecall_unmarshal_uint);
break;
case MVM_NATIVECALL_ARG_ULONG:
handle_arg("integer", cont_i, DCulong, i64, dcArgLong, MVM_nativecall_unmarshal_ulong);
break;
case MVM_NATIVECALL_ARG_ULONGLONG:
handle_arg("integer", cont_i, DCulonglong, i64, dcArgLongLong, MVM_nativecall_unmarshal_ulonglong);
break;
default:
MVM_exception_throw_adhoc(tc, "Internal error: unhandled dyncall argument type");
}
}
/* Call and process return values. */
//.........这里部分代码省略.........
示例11: get_string_key
MVM_STATIC_INLINE MVMString * get_string_key(MVMThreadContext *tc, MVMObject *key) {
if (!key || REPR(key)->ID != MVM_REPR_ID_MVMString || !IS_CONCRETE(key))
MVM_exception_throw_adhoc(tc, "MVMHash representation requires MVMString keys");
return (MVMString *)key;
}
示例12: callback_handler
static char callback_handler(DCCallback *cb, DCArgs *cb_args, DCValue *cb_result, MVMNativeCallback *data) {
CallbackInvokeData cid;
MVMint32 num_roots, i;
MVMRegister res;
/* Build a callsite and arguments buffer. */
MVMThreadContext *tc = data->tc;
MVMRegister *args = MVM_malloc(data->num_types * sizeof(MVMRegister));
num_roots = 0;
for (i = 1; i < data->num_types; i++) {
MVMObject *type = data->types[i];
MVMint16 typeinfo = data->typeinfos[i];
switch (typeinfo & MVM_NATIVECALL_ARG_TYPE_MASK) {
case MVM_NATIVECALL_ARG_CHAR:
args[i - 1].i64 = dcbArgChar(cb_args);
break;
case MVM_NATIVECALL_ARG_SHORT:
args[i - 1].i64 = dcbArgShort(cb_args);
break;
case MVM_NATIVECALL_ARG_INT:
args[i - 1].i64 = dcbArgInt(cb_args);
break;
case MVM_NATIVECALL_ARG_LONG:
args[i - 1].i64 = dcbArgLong(cb_args);
break;
case MVM_NATIVECALL_ARG_LONGLONG:
args[i - 1].i64 = dcbArgLongLong(cb_args);
break;
case MVM_NATIVECALL_ARG_FLOAT:
args[i - 1].n64 = dcbArgFloat(cb_args);
break;
case MVM_NATIVECALL_ARG_DOUBLE:
args[i - 1].n64 = dcbArgDouble(cb_args);
break;
case MVM_NATIVECALL_ARG_ASCIISTR:
case MVM_NATIVECALL_ARG_UTF8STR:
case MVM_NATIVECALL_ARG_UTF16STR:
args[i - 1].o = MVM_nativecall_make_str(tc, type, typeinfo,
(char *)dcbArgPointer(cb_args));
MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o));
num_roots++;
break;
case MVM_NATIVECALL_ARG_CSTRUCT:
args[i - 1].o = MVM_nativecall_make_cstruct(tc, type,
dcbArgPointer(cb_args));
MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o));
num_roots++;
break;
case MVM_NATIVECALL_ARG_CPOINTER:
args[i - 1].o = MVM_nativecall_make_cpointer(tc, type,
dcbArgPointer(cb_args));
MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o));
num_roots++;
break;
case MVM_NATIVECALL_ARG_CARRAY:
args[i - 1].o = MVM_nativecall_make_carray(tc, type,
dcbArgPointer(cb_args));
MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o));
num_roots++;
break;
case MVM_NATIVECALL_ARG_CUNION:
args[i - 1].o = MVM_nativecall_make_cunion(tc, type,
dcbArgPointer(cb_args));
MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o));
num_roots++;
break;
case MVM_NATIVECALL_ARG_CALLBACK:
/* TODO: A callback -return- value means that we have a C method
* that needs to be wrapped similarly to a is native(...) Perl 6
* sub. */
dcbArgPointer(cb_args);
args[i - 1].o = type;
MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o));
num_roots++;
case MVM_NATIVECALL_ARG_UCHAR:
args[i - 1].i64 = dcbArgUChar(cb_args);
break;
case MVM_NATIVECALL_ARG_USHORT:
args[i - 1].i64 = dcbArgUShort(cb_args);
break;
case MVM_NATIVECALL_ARG_UINT:
args[i - 1].i64 = dcbArgUInt(cb_args);
break;
case MVM_NATIVECALL_ARG_ULONG:
args[i - 1].i64 = dcbArgULong(cb_args);
break;
case MVM_NATIVECALL_ARG_ULONGLONG:
args[i - 1].i64 = dcbArgULongLong(cb_args);
break;
default:
MVM_exception_throw_adhoc(tc,
"Internal error: unhandled dyncall callback argument type");
}
}
/* Call into a nested interpreter (since we already are in one). Need to
* save a bunch of state around each side of this. */
cid.invokee = data->target;
cid.args = args;
cid.cs = data->cs;
//.........这里部分代码省略.........
示例13: MVM_io_syncstream_seek
/* Cannot seek a TTY of named pipe (could fake the forward case, probably). */
void MVM_io_syncstream_seek(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 offset, MVMint64 whence) {
MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data;
MVM_exception_throw_adhoc(tc, "Cannot seek this kind of handle");
}
示例14: MVM_io_syncstream_truncate
/* Cannot truncate a stream. */
void MVM_io_syncstream_truncate(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 bytes) {
MVM_exception_throw_adhoc(tc, "Cannot truncate this kind of handle");
}
示例15: MVM_spesh_codegen
/* Generate bytecode from a spesh graph. */
MVMSpeshCode * MVM_spesh_codegen(MVMThreadContext *tc, MVMSpeshGraph *g) {
MVMSpeshCode *res;
MVMSpeshBB *bb;
MVMint32 i, hanlen;
/* Initialize writer state. */
SpeshWriterState *ws = MVM_malloc(sizeof(SpeshWriterState));
ws->bytecode_pos = 0;
ws->bytecode_alloc = 1024;
ws->bytecode = MVM_malloc(ws->bytecode_alloc);
ws->bb_offsets = MVM_malloc(g->num_bbs * sizeof(MVMint32));
ws->num_fixups = 0;
ws->alloc_fixups = 64;
ws->fixup_locations = MVM_malloc(ws->alloc_fixups * sizeof(MVMint32));
ws->fixup_bbs = MVM_malloc(ws->alloc_fixups * sizeof(MVMSpeshBB *));
for (i = 0; i < g->num_bbs; i++)
ws->bb_offsets[i] = -1;
/* Create copy of handlers, and -1 all offsets so we can catch missing
* updates. */
hanlen = g->num_handlers * sizeof(MVMFrameHandler);
if (hanlen) {
ws->handlers = MVM_malloc(hanlen);
memcpy(ws->handlers, g->handlers, hanlen);
for (i = 0; i < g->sf->body.num_handlers; i++) {
ws->handlers[i].start_offset = -1;
ws->handlers[i].end_offset = -1;
ws->handlers[i].goto_offset = -1;
}
}
else {
ws->handlers = NULL;
}
/* -1 all the deopt targets, so we'll easily catch those that don't get
* mapped if we try to use them. Same for inlines. */
for (i = 0; i < g->num_deopt_addrs; i++)
g->deopt_addrs[i * 2 + 1] = -1;
for (i = 0; i < g->num_inlines; i++) {
g->inlines[i].start = -1;
g->inlines[i].end = -1;
}
/* Write out each of the basic blocks, in linear order. Skip the first,
* dummy, block. */
bb = g->entry->linear_next;
while (bb) {
ws->bb_offsets[bb->idx] = ws->bytecode_pos;
write_instructions(tc, g, ws, bb);
bb = bb->linear_next;
}
/* Fixup labels we were too early for. */
for (i = 0; i < ws->num_fixups; i++)
*((MVMuint32 *)(ws->bytecode + ws->fixup_locations[i])) =
ws->bb_offsets[ws->fixup_bbs[i]->idx];
/* Ensure all handlers got fixed up. */
for (i = 0; i < g->sf->body.num_handlers; i++) {
if (ws->handlers[i].start_offset == -1 ||
ws->handlers[i].end_offset == -1 ||
ws->handlers[i].goto_offset == -1)
MVM_exception_throw_adhoc(tc, "Spesh: failed to fix up handlers (%d, %d, %d)",
(int)ws->handlers[i].start_offset,
(int)ws->handlers[i].end_offset,
(int)ws->handlers[i].goto_offset);
}
/* Ensure all inlines got fixed up. */
for (i = 0; i < g->num_inlines; i++)
if (g->inlines[i].start == -1 || g->inlines[i].end == -1)
MVM_exception_throw_adhoc(tc, "Spesh: failed to fix up inline %d", i);
/* Produce result data structure. */
res = MVM_malloc(sizeof(MVMSpeshCode));
res->bytecode = ws->bytecode;
res->bytecode_size = ws->bytecode_pos;
res->handlers = ws->handlers;
/* Cleanup. */
MVM_free(ws->bb_offsets);
MVM_free(ws->fixup_locations);
MVM_free(ws->fixup_bbs);
MVM_free(ws);
return res;
}