class_t class_of(tree_t t) { switch (tree_kind(t)) { case T_VAR_DECL: return C_VARIABLE; case T_SIGNAL_DECL: return C_SIGNAL; case T_CONST_DECL: return C_CONSTANT; case T_PORT_DECL: return tree_class(t); case T_ENUM_LIT: case T_GENVAR: case T_ALIAS: case T_FIELD_DECL: return C_DEFAULT; case T_UNIT_DECL: return C_UNITS; case T_ARCH: return C_ARCHITECTURE; case T_FUNC_DECL: case T_FUNC_BODY: return C_FUNCTION; case T_PROC_DECL: case T_PROC_BODY: return C_PROCEDURE; case T_ENTITY: return C_ENTITY; case T_TYPE_DECL: return C_TYPE; case T_FILE_DECL: return C_FILE; case T_PROCESS: case T_BLOCK: case T_FOR: return C_LABEL; case T_COMPONENT: return C_COMPONENT; case T_REF: return class_of(tree_ref(t)); case T_ARRAY_REF: case T_ARRAY_SLICE: case T_RECORD_REF: return class_of(tree_value(t)); case T_PACKAGE: return C_PACKAGE; case T_LIBRARY: return C_LIBRARY; case T_ELAB: return C_ELAB; default: fatal("missing class_of for %s", tree_kind_str(tree_kind(t))); } }
Value StandardObject::slot_value(Value arg) { if (!symbolp(arg)) return signal_type_error(arg, S_symbol); Layout * layout = this->layout(); if (!layout) return signal_lisp_error("No layout for instance."); if (layout->is_invalid()) { // Update instance. layout = update_layout(); } Value value; long index = layout->slot_index(arg); if (index >= 0) { value = iref(index); } else { // not an instance slot Value location = layout->shared_slot_location(arg); if (location == NIL) { // slot-missing return current_thread()->execute(the_symbol(S_slot_missing)->function(), class_of(), make_value(this), arg, S_slot_value); } value = cdr(location); } if (value == UNBOUND_VALUE) { Thread * const thread = current_thread(); value = thread->execute(the_symbol(S_slot_unbound)->function(), class_of(), make_value(this), arg); thread->clear_values(); } return value; }
/* * Label: class id + polarity */ void print_label(FILE *f, elabel_t l) { char sgn; if (l < 0) { if (l == null_label) { fputs("null_label", f); } else { fprintf(f, "LABEL%"PRId32, l); } } else { fprintf(f, "C!%"PRId32, class_of(l)); sgn = is_pos_label(l) ? '+' : '-'; fputc(sgn, f); } }
void StandardObject::set_slot_value(Value arg1, Value arg2) { if (!symbolp(arg1)) { signal_type_error(arg1, S_symbol); return; } Layout * layout = this->layout(); if (!layout) { signal_lisp_error("No layout for instance."); return; } if (layout->is_invalid()) { // Update instance. layout = update_layout(); } long index = layout->slot_index(arg1); if (index >= 0) { iset(index, arg2); } else { // not an instance slot Value location = layout->shared_slot_location(arg1); if (location != NIL) SYS_setcdr(location, arg2); else { // slot-missing current_thread()->execute(the_symbol(S_slot_missing)->function(), class_of(), make_value(this), arg1, S_setf, arg2); } } }
// type_of Val type_of(Val x) { return class_of(x)->Decode<Class>()->m_name; } // type_of