void print_exception(VM *vm, VALUE result) { // TODO: fprintf to stderr and teach dump_titled to optionally fprintf to stderr too printf("====== Exception of type '%s' ======\n", obj_to_cstring(NGS_TYPE_NAME(NORMAL_TYPE_INSTANCE_TYPE(result)))); // TODO: maybe macro to iterate attributes VALUE fields = NGS_TYPE_FIELDS(NORMAL_TYPE_INSTANCE_TYPE(result)); HASH_OBJECT_ENTRY *e; for(e=HASH_HEAD(fields); e; e=e->insertion_order_next) { if(obj_is_of_type(ARRAY_ITEMS(NORMAL_TYPE_INSTANCE_FIELDS(result))[GET_INT(e->val)], vm->Backtrace)) { printf("=== [ backtrace ] ===\n"); // Backtrace.frames = [{"closure": ..., "ip": ...}, ...] VALUE backtrace = ARRAY_ITEMS(NORMAL_TYPE_INSTANCE_FIELDS(result))[GET_INT(e->val)]; VALUE frames; assert(get_normal_type_instace_attribute(backtrace, make_string("frames"), &frames) == METHOD_OK); unsigned int i; for(i = 0; i < OBJ_LEN(frames); i++) { VALUE frame, resolved_ip, ip; frame = ARRAY_ITEMS(frames)[i]; H(ip, frame, "ip"); resolved_ip = resolve_ip(vm, (IP)(GET_INT(ip) - 1)); if(IS_HASH(resolved_ip)) { VALUE file, first_line, first_column, last_line, last_column; HASH_OBJECT_ENTRY *closure_entry; char *closure_name = "<anonymous>"; H(file, resolved_ip, "file"); H(first_line, resolved_ip, "first_line"); H(first_column, resolved_ip, "first_column"); H(last_line, resolved_ip, "last_line"); H(last_column, resolved_ip, "last_column"); closure_entry = get_hash_key(frame, make_string("closure")); if(closure_entry && IS_CLOSURE(closure_entry->val) && (IS_HASH(CLOSURE_OBJ_ATTRS(closure_entry->val)))) { HASH_OBJECT_ENTRY *name_entry; name_entry = get_hash_key(CLOSURE_OBJ_ATTRS(closure_entry->val), make_string("name")); if(name_entry) { closure_name = obj_to_cstring(name_entry->val); } } // TODO: fix types printf("[Frame #%u] %s:%d:%d - %d:%d [in %s]\n", i, obj_to_cstring(file), (int) GET_INT(first_line), (int) GET_INT(first_column), (int) GET_INT(last_line), (int) GET_INT(last_column), closure_name); } else { printf("[Frame #%u] (no source location)\n", i); } } continue; } if(obj_is_of_type(ARRAY_ITEMS(NORMAL_TYPE_INSTANCE_FIELDS(result))[GET_INT(e->val)], vm->Exception)) { assert(IS_STRING(e->key)); printf("---8<--- %s - start ---8<---\n", obj_to_cstring(e->key)); print_exception(vm, ARRAY_ITEMS(NORMAL_TYPE_INSTANCE_FIELDS(result))[GET_INT(e->val)]); printf("---8<--- %s - end ---8<---\n", obj_to_cstring(e->key)); continue; } if(IS_STRING(e->key)) { dump_titled(obj_to_cstring(e->key), ARRAY_ITEMS(NORMAL_TYPE_INSTANCE_FIELDS(result))[GET_INT(e->val)]); } else { // Should not happen dump_titled("attribute key", e->key); dump_titled("attribute value", ARRAY_ITEMS(NORMAL_TYPE_INSTANCE_FIELDS(result))[GET_INT(e->val)]); } } }
void QSerialPortProbe::detect() { QStringList ports = QSerial::list(); devices.clear(); foreach(const QString &port, ports) { Device device(port); if (device.detect(defaultSetups, ARRAY_ITEMS(defaultSetups))) { devices.push_back(device); } }
METHOD_RESULT get_normal_type_instace_attribute(VALUE obj, VALUE attr, VALUE *result) { VALUE ut; HASH_OBJECT_ENTRY *e; size_t n; ut = NORMAL_TYPE_INSTANCE_TYPE(obj); e = get_hash_key(NGS_TYPE_FIELDS(ut), attr); if(!e) { return METHOD_EXCEPTION; } n = GET_INT(e->val); if(n >= OBJ_LEN(NORMAL_TYPE_INSTANCE_FIELDS(obj))) { return METHOD_EXCEPTION; } *result = ARRAY_ITEMS(NORMAL_TYPE_INSTANCE_FIELDS(obj))[n]; if(IS_UNDEF(*result)) { return METHOD_EXCEPTION; } return METHOD_OK; }
VALUE make_normal_type(VALUE name) { VALUE ret; NGS_TYPE *t; t = NGS_MALLOC(sizeof(*t)); assert(t); SET_OBJ(ret, t); OBJ_TYPE_NUM(ret) = T_TYPE; NGS_TYPE_NAME(ret) = name; NGS_TYPE_FIELDS(ret) = make_hash(8); // Hash: name->index NGS_TYPE_CONSTRUCTORS(ret) = make_array(1); NGS_TYPE_PARENTS(ret) = make_array(0); VALUE ctr = make_normal_type_constructor(ret); ARRAY_ITEMS(NGS_TYPE_CONSTRUCTORS(ret))[0] = ctr; return ret; }