§1.

void Primitives::emit(inter_tree *I, inter_bookmark *IBM) {
    Primitives::emit_one(I, IBM, I"!font", I"val -> void");
    Primitives::emit_one(I, IBM, I"!stylebold", I"void -> void");
    Primitives::emit_one(I, IBM, I"!styleunderline", I"void -> void");
    Primitives::emit_one(I, IBM, I"!stylereverse", I"void -> void");
    Primitives::emit_one(I, IBM, I"!styleroman", I"void -> void");
    Primitives::emit_one(I, IBM, I"!print", I"val -> void");
    Primitives::emit_one(I, IBM, I"!printret", I"val -> void");
    Primitives::emit_one(I, IBM, I"!printchar", I"val -> void");
    Primitives::emit_one(I, IBM, I"!printname", I"val -> void");
    Primitives::emit_one(I, IBM, I"!printobj", I"val -> void");
    Primitives::emit_one(I, IBM, I"!printproperty", I"val -> void");
    Primitives::emit_one(I, IBM, I"!printnumber", I"val -> void");
    Primitives::emit_one(I, IBM, I"!printaddress", I"val -> void");
    Primitives::emit_one(I, IBM, I"!printstring", I"val -> void");
    Primitives::emit_one(I, IBM, I"!printnlnumber", I"val -> void");
    Primitives::emit_one(I, IBM, I"!printdef", I"val -> void");
    Primitives::emit_one(I, IBM, I"!printcdef", I"val -> void");
    Primitives::emit_one(I, IBM, I"!printindef", I"val -> void");
    Primitives::emit_one(I, IBM, I"!printcindef", I"val -> void");
    Primitives::emit_one(I, IBM, I"!box", I"val -> void");
    Primitives::emit_one(I, IBM, I"!push", I"val -> void");
    Primitives::emit_one(I, IBM, I"!pull", I"ref -> void");
    Primitives::emit_one(I, IBM, I"!postincrement", I"ref -> val");
    Primitives::emit_one(I, IBM, I"!preincrement", I"ref -> val");
    Primitives::emit_one(I, IBM, I"!postdecrement", I"ref -> val");
    Primitives::emit_one(I, IBM, I"!predecrement", I"ref -> val");
    Primitives::emit_one(I, IBM, I"!return", I"val -> void");
    Primitives::emit_one(I, IBM, I"!quit", I"void -> void");
    Primitives::emit_one(I, IBM, I"!restore", I"lab -> void");
    Primitives::emit_one(I, IBM, I"!spaces", I"val -> void");
    Primitives::emit_one(I, IBM, I"!break", I"void -> void");
    Primitives::emit_one(I, IBM, I"!continue", I"void -> void");
    Primitives::emit_one(I, IBM, I"!jump", I"lab -> void");
    Primitives::emit_one(I, IBM, I"!move", I"val val -> void");
    Primitives::emit_one(I, IBM, I"!remove", I"val -> void");
    Primitives::emit_one(I, IBM, I"!give", I"val val -> void");
    Primitives::emit_one(I, IBM, I"!take", I"val val -> void");
    Primitives::emit_one(I, IBM, I"!store", I"ref val -> val");
    Primitives::emit_one(I, IBM, I"!setbit", I"ref val -> void");
    Primitives::emit_one(I, IBM, I"!clearbit", I"ref val -> void");
    Primitives::emit_one(I, IBM, I"!modulo", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!random", I"val -> val");
    Primitives::emit_one(I, IBM, I"!lookup", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!lookupbyte", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!lookupref", I"val val -> ref");
    Primitives::emit_one(I, IBM, I"!not", I"val -> val");
    Primitives::emit_one(I, IBM, I"!and", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!or", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!alternative", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!alternativecase", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!bitwiseand", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!bitwiseor", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!bitwisenot", I"val -> val");
    Primitives::emit_one(I, IBM, I"!eq", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!ne", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!gt", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!ge", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!lt", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!le", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!has", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!hasnt", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!in", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!ofclass", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!sequential", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!ternarysequential", I"val val val -> val");
    Primitives::emit_one(I, IBM, I"!plus", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!minus", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!unaryminus", I"val -> val");
    Primitives::emit_one(I, IBM, I"!times", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!divide", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!if", I"val code -> void");
    Primitives::emit_one(I, IBM, I"!ifdebug", I"code -> void");
    Primitives::emit_one(I, IBM, I"!ifstrict", I"code -> void");
    Primitives::emit_one(I, IBM, I"!ifelse", I"val code code -> void");
    Primitives::emit_one(I, IBM, I"!while", I"val code -> void");
    Primitives::emit_one(I, IBM, I"!do", I"val code -> void");
    Primitives::emit_one(I, IBM, I"!for", I"val val val code -> void");
    Primitives::emit_one(I, IBM, I"!objectloop", I"ref val val code -> void");
    Primitives::emit_one(I, IBM, I"!objectloopx", I"ref val code -> void");
    Primitives::emit_one(I, IBM, I"!switch", I"val code -> void");
    Primitives::emit_one(I, IBM, I"!case", I"val code -> void");
    Primitives::emit_one(I, IBM, I"!default", I"code -> void");
    Primitives::emit_one(I, IBM, I"!indirect0v", I"val -> void");
    Primitives::emit_one(I, IBM, I"!indirect1v", I"val val -> void");
    Primitives::emit_one(I, IBM, I"!indirect2v", I"val val val -> void");
    Primitives::emit_one(I, IBM, I"!indirect3v", I"val val val val -> void");
    Primitives::emit_one(I, IBM, I"!indirect4v", I"val val val val val -> void");
    Primitives::emit_one(I, IBM, I"!indirect5v", I"val val val val val val -> void");
    Primitives::emit_one(I, IBM, I"!indirect0", I"val -> val");
    Primitives::emit_one(I, IBM, I"!indirect1", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!indirect2", I"val val val -> val");
    Primitives::emit_one(I, IBM, I"!indirect3", I"val val val val -> val");
    Primitives::emit_one(I, IBM, I"!indirect4", I"val val val val val -> val");
    Primitives::emit_one(I, IBM, I"!indirect5", I"val val val val val val -> val");
    Primitives::emit_one(I, IBM, I"!message0", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!message1", I"val val val -> val");
    Primitives::emit_one(I, IBM, I"!message2", I"val val val val -> val");
    Primitives::emit_one(I, IBM, I"!message3", I"val val val val val -> val");
    Primitives::emit_one(I, IBM, I"!callmessage0", I"val -> val");
    Primitives::emit_one(I, IBM, I"!callmessage1", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!callmessage2", I"val val val -> val");
    Primitives::emit_one(I, IBM, I"!callmessage3", I"val val val val -> val");
    Primitives::emit_one(I, IBM, I"!propertyaddress", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!propertylength", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!provides", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!propertyvalue", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!notin", I"val val -> val");
    Primitives::emit_one(I, IBM, I"!read", I"val val -> void");
    Primitives::emit_one(I, IBM, I"!inversion", I"void -> void");
}

inter_symbol *Primitives::get(inter_tree *I, inter_t bip) {
    if (I == NULL) internal_error("no tree");
    if ((bip < 1) || (bip >= MAX_BIPS)) internal_error("bip out of range");
    return Site::get_opcode(I, bip);
}

void Primitives::emit_one(inter_tree *I, inter_bookmark *IBM, text_stream *prim, text_stream *category) {
    TEMPORARY_TEXT(prim_command);
    WRITE_TO(prim_command, "primitive %S %S", prim, category);
    Produce::guard(Inter::Defn::read_construct_text(prim_command, NULL, IBM));
    inter_error_message *E = NULL;
    inter_symbol *S = Inter::Textual::find_symbol(I, NULL, Inter::Tree::global_scope(I), prim, PRIMITIVE_IST, &E);
    inter_t bip = Primitives::to_bip(I, S);
    if (bip == 0) internal_error("missing bip");
    if (bip >= MAX_BIPS) internal_error("unsafely high bip");
    Site::set_opcode(I, bip, S);
    Produce::guard(E);
    DISCARD_TEXT(prim_command);
}

int Primitives::is_indirect_interp(inter_t s) {
    if (s == INDIRECT0_BIP) return TRUE;
    if (s == INDIRECT1_BIP) return TRUE;
    if (s == INDIRECT2_BIP) return TRUE;
    if (s == INDIRECT3_BIP) return TRUE;
    if (s == INDIRECT4_BIP) return TRUE;
    if (s == INDIRECT5_BIP) return TRUE;
    return FALSE;
}

inter_t Primitives::indirect_interp(int arity) {
    switch (arity) {
        case 0: return INDIRECT0_BIP;
        case 1: return INDIRECT1_BIP;
        case 2: return INDIRECT2_BIP;
        case 3: return INDIRECT3_BIP;
        case 4: return INDIRECT4_BIP;
        case 5: return INDIRECT5_BIP;
        default: internal_error("indirect function call with too many arguments");
    }
    return 0;
}

int Primitives::is_indirectv_interp(inter_t s) {
    if (s == INDIRECT0V_BIP) return TRUE;
    if (s == INDIRECT1V_BIP) return TRUE;
    if (s == INDIRECT2V_BIP) return TRUE;
    if (s == INDIRECT3V_BIP) return TRUE;
    if (s == INDIRECT4V_BIP) return TRUE;
    if (s == INDIRECT5V_BIP) return TRUE;
    return FALSE;
}

inter_t Primitives::indirectv_interp(int arity) {
    switch (arity) {
        case 0: return INDIRECT0V_BIP;
        case 1: return INDIRECT1V_BIP;
        case 2: return INDIRECT2V_BIP;
        case 3: return INDIRECT3V_BIP;
        case 4: return INDIRECT4V_BIP;
        case 5: return INDIRECT5V_BIP;
        default: internal_error("indirectv function call with too many arguments");
    }
    return 0;
}

§2.

define MAX_BIPS 200
enum NOT_BIP from 1
enum AND_BIP
enum OR_BIP
enum ALTERNATIVE_BIP
enum ALTERNATIVECASE_BIP
enum BITWISEAND_BIP
enum BITWISEOR_BIP
enum BITWISENOT_BIP
enum EQ_BIP
enum NE_BIP
enum GT_BIP
enum GE_BIP
enum LT_BIP
enum LE_BIP
enum OFCLASS_BIP
enum HAS_BIP
enum HASNT_BIP
enum IN_BIP
enum NOTIN_BIP
enum SEQUENTIAL_BIP
enum TERNARYSEQUENTIAL_BIP
enum PLUS_BIP
enum MINUS_BIP
enum UNARYMINUS_BIP
enum TIMES_BIP
enum DIVIDE_BIP
enum MODULO_BIP
enum RANDOM_BIP
enum RETURN_BIP
enum MOVE_BIP
enum REMOVE_BIP
enum GIVE_BIP
enum TAKE_BIP
enum JUMP_BIP
enum QUIT_BIP
enum RESTORE_BIP
enum SPACES_BIP
enum BREAK_BIP
enum CONTINUE_BIP
enum STYLEROMAN_BIP
enum FONT_BIP
enum STYLEBOLD_BIP
enum STYLEUNDERLINE_BIP
enum STYLEREVERSE_BIP
enum PRINT_BIP
enum PRINTRET_BIP
enum PRINTCHAR_BIP
enum PRINTNAME_BIP
enum PRINTOBJ_BIP
enum PRINTPROPERTY_BIP
enum PRINTNUMBER_BIP
enum PRINTADDRESS_BIP
enum PRINTSTRING_BIP
enum PRINTNLNUMBER_BIP
enum PRINTDEF_BIP
enum PRINTCDEF_BIP
enum PRINTINDEF_BIP
enum PRINTCINDEF_BIP
enum BOX_BIP
enum PUSH_BIP
enum PULL_BIP
enum PREINCREMENT_BIP
enum POSTINCREMENT_BIP
enum PREDECREMENT_BIP
enum POSTDECREMENT_BIP
enum STORE_BIP
enum SETBIT_BIP
enum CLEARBIT_BIP
enum IF_BIP
enum IFDEBUG_BIP
enum IFSTRICT_BIP
enum IFELSE_BIP
enum WHILE_BIP
enum DO_BIP
enum FOR_BIP
enum OBJECTLOOP_BIP
enum OBJECTLOOPX_BIP
enum LOOKUP_BIP
enum LOOKUPBYTE_BIP
enum LOOKUPREF_BIP
enum LOOP_BIP
enum SWITCH_BIP
enum CASE_BIP
enum DEFAULT_BIP
enum INDIRECT0V_BIP
enum INDIRECT1V_BIP
enum INDIRECT2V_BIP
enum INDIRECT3V_BIP
enum INDIRECT4V_BIP
enum INDIRECT5V_BIP
enum INDIRECT0_BIP
enum INDIRECT1_BIP
enum INDIRECT2_BIP
enum INDIRECT3_BIP
enum INDIRECT4_BIP
enum INDIRECT5_BIP
enum MESSAGE0_BIP
enum MESSAGE1_BIP
enum MESSAGE2_BIP
enum MESSAGE3_BIP
enum CALLMESSAGE0_BIP
enum CALLMESSAGE1_BIP
enum CALLMESSAGE2_BIP
enum CALLMESSAGE3_BIP
enum PROPERTYADDRESS_BIP
enum PROPERTYLENGTH_BIP
enum PROVIDES_BIP
enum PROPERTYVALUE_BIP
enum READ_BIP
enum INVERSION_BIP
text_stream *Primitives::name(inter_t bip) {
    switch (bip) {
        case NOT_BIP: return I"!not";
        case AND_BIP: return I"!and";
        case OR_BIP: return I"!or";
        case ALTERNATIVE_BIP: return I"!alternative";
        case ALTERNATIVECASE_BIP: return I"!alternativecase";
        case BITWISEAND_BIP: return I"!bitwiseand";
        case BITWISEOR_BIP: return I"!bitwiseor";
        case BITWISENOT_BIP: return I"!bitwisenot";
        case EQ_BIP: return I"!eq";
        case NE_BIP: return I"!ne";
        case GT_BIP: return I"!gt";
        case GE_BIP: return I"!ge";
        case LT_BIP: return I"!lt";
        case LE_BIP: return I"!le";
        case OFCLASS_BIP: return I"!ofclass";
        case HAS_BIP: return I"!has";
        case HASNT_BIP: return I"!hasnt";
        case IN_BIP: return I"!in";
        case NOTIN_BIP: return I"!notin";
        case SEQUENTIAL_BIP: return I"!sequential";
        case TERNARYSEQUENTIAL_BIP: return I"!ternarysequential";
        case PLUS_BIP: return I"!plus";
        case MINUS_BIP: return I"!minus";
        case UNARYMINUS_BIP: return I"!unaryminus";
        case TIMES_BIP: return I"!times";
        case DIVIDE_BIP: return I"!divide";
        case MODULO_BIP: return I"!modulo";
        case RANDOM_BIP: return I"!random";
        case RETURN_BIP: return I"!return";
        case JUMP_BIP: return I"!jump";
        case GIVE_BIP: return I"!give";
        case TAKE_BIP: return I"!take";
        case MOVE_BIP: return I"!move";
        case REMOVE_BIP: return I"!remove";
        case QUIT_BIP: return I"!quit";
        case RESTORE_BIP: return I"!restore";
        case SPACES_BIP: return I"!spaces";
        case BREAK_BIP: return I"!break";
        case CONTINUE_BIP: return I"!continue";
        case FONT_BIP: return I"!font";
        case STYLEROMAN_BIP: return I"!styleroman";
        case STYLEBOLD_BIP: return I"!stylebold";
        case STYLEUNDERLINE_BIP: return I"!styleunderline";
        case STYLEREVERSE_BIP: return I"!stylereverse";
        case PRINT_BIP: return I"!print";
        case PRINTRET_BIP: return I"!printret";
        case PRINTCHAR_BIP: return I"!printchar";
        case PRINTNAME_BIP: return I"!printname";
        case PRINTOBJ_BIP: return I"!printobj";
        case PRINTPROPERTY_BIP: return I"!printproperty";
        case PRINTNUMBER_BIP: return I"!printnumber";
        case PRINTADDRESS_BIP: return I"!printaddress";
        case PRINTSTRING_BIP: return I"!printstring";
        case PRINTNLNUMBER_BIP: return I"!printnlnumber";
        case PRINTDEF_BIP: return I"!printdef";
        case PRINTCDEF_BIP: return I"!printcdef";
        case PRINTINDEF_BIP: return I"!printindef";
        case PRINTCINDEF_BIP: return I"!printcindef";
        case BOX_BIP: return I"!box";
        case PUSH_BIP: return I"!push";
        case PULL_BIP: return I"!pull";
        case PREINCREMENT_BIP: return I"!preincrement";
        case POSTINCREMENT_BIP: return I"!postincrement";
        case PREDECREMENT_BIP: return I"!predecrement";
        case POSTDECREMENT_BIP: return I"!postdecrement";
        case STORE_BIP: return I"!store";
        case SETBIT_BIP: return I"!setbit";
        case CLEARBIT_BIP: return I"!clearbit";
        case IF_BIP: return I"!if";
        case IFDEBUG_BIP: return I"!ifdebug";
        case IFSTRICT_BIP: return I"!ifstrict";
        case IFELSE_BIP: return I"!ifelse";
        case WHILE_BIP: return I"!while";
        case DO_BIP: return I"!do";
        case FOR_BIP: return I"!for";
        case OBJECTLOOP_BIP: return I"!objectloop";
        case OBJECTLOOPX_BIP: return I"!objectloopx";
        case LOOKUP_BIP: return I"!lookup";
        case LOOKUPBYTE_BIP: return I"!lookupbyte";
        case LOOKUPREF_BIP: return I"!lookupref";
        case LOOP_BIP: return I"!loop";
        case SWITCH_BIP: return I"!switch";
        case CASE_BIP: return I"!case";
        case DEFAULT_BIP: return I"!default";
        case INDIRECT0V_BIP: return I"!indirect0v";
        case INDIRECT1V_BIP: return I"!indirect1v";
        case INDIRECT2V_BIP: return I"!indirect2v";
        case INDIRECT3V_BIP: return I"!indirect3v";
        case INDIRECT4V_BIP: return I"!indirect4v";
        case INDIRECT5V_BIP: return I"!indirect5v";
        case INDIRECT0_BIP: return I"!indirect0";
        case INDIRECT1_BIP: return I"!indirect1";
        case INDIRECT2_BIP: return I"!indirect2";
        case INDIRECT3_BIP: return I"!indirect3";
        case INDIRECT4_BIP: return I"!indirect4";
        case INDIRECT5_BIP: return I"!indirect5";
        case MESSAGE0_BIP: return I"!message0";
        case MESSAGE1_BIP: return I"!message1";
        case MESSAGE2_BIP: return I"!message2";
        case MESSAGE3_BIP: return I"!message3";
        case CALLMESSAGE0_BIP: return I"!callmessage0";
        case CALLMESSAGE1_BIP: return I"!callmessage1";
        case CALLMESSAGE2_BIP: return I"!callmessage2";
        case CALLMESSAGE3_BIP: return I"!callmessage3";
        case PROPERTYADDRESS_BIP: return I"!propertyaddress";
        case PROPERTYLENGTH_BIP: return I"!propertylength";
        case PROVIDES_BIP: return I"!provides";
        case PROPERTYVALUE_BIP: return I"!propertyvalue";
        case READ_BIP: return I"!read";
        case INVERSION_BIP: return I"!inversion";
    }
    return I"<none>";
}

void Primitives::scan_tree(inter_tree *I) {
    Inter::Tree::traverse_root_only(I, Primitives::scan_visitor, NULL, PRIMITIVE_IST);
}

void Primitives::scan_visitor(inter_tree *I, inter_tree_node *P, void *v_state) {
    inter_symbol *prim_name = Inter::SymbolsTables::symbol_from_frame_data(P, DEFN_PRIM_IFLD);
    inter_t bip = Primitives::to_bip(I, prim_name);
    if (bip) Site::set_opcode(I, bip, prim_name);
}

inter_t Primitives::to_bip(inter_tree *I, inter_symbol *symb) {
    if (symb == NULL) return 0;
    int B = Inter::Symbols::read_annotation(symb, BIP_CODE_IANN);
    inter_t bip = (B > 0)?((inter_t) B):0;
    if (bip != 0) return bip;
    if (Str::eq(symb->symbol_name, I"!not")) bip = NOT_BIP;
    if (Str::eq(symb->symbol_name, I"!and")) bip = AND_BIP;
    if (Str::eq(symb->symbol_name, I"!or")) bip = OR_BIP;
    if (Str::eq(symb->symbol_name, I"!alternative")) bip = ALTERNATIVE_BIP;
    if (Str::eq(symb->symbol_name, I"!alternativecase")) bip = ALTERNATIVECASE_BIP;
    if (Str::eq(symb->symbol_name, I"!bitwiseand")) bip = BITWISEAND_BIP;
    if (Str::eq(symb->symbol_name, I"!bitwiseor")) bip = BITWISEOR_BIP;
    if (Str::eq(symb->symbol_name, I"!bitwisenot")) bip = BITWISENOT_BIP;
    if (Str::eq(symb->symbol_name, I"!eq")) bip = EQ_BIP;
    if (Str::eq(symb->symbol_name, I"!ne")) bip = NE_BIP;
    if (Str::eq(symb->symbol_name, I"!gt")) bip = GT_BIP;
    if (Str::eq(symb->symbol_name, I"!ge")) bip = GE_BIP;
    if (Str::eq(symb->symbol_name, I"!lt")) bip = LT_BIP;
    if (Str::eq(symb->symbol_name, I"!le")) bip = LE_BIP;
    if (Str::eq(symb->symbol_name, I"!ofclass")) bip = OFCLASS_BIP;
    if (Str::eq(symb->symbol_name, I"!has")) bip = HAS_BIP;
    if (Str::eq(symb->symbol_name, I"!hasnt")) bip = HASNT_BIP;
    if (Str::eq(symb->symbol_name, I"!in")) bip = IN_BIP;
    if (Str::eq(symb->symbol_name, I"!notin")) bip = NOTIN_BIP;
    if (Str::eq(symb->symbol_name, I"!sequential")) bip = SEQUENTIAL_BIP;
    if (Str::eq(symb->symbol_name, I"!ternarysequential")) bip = TERNARYSEQUENTIAL_BIP;
    if (Str::eq(symb->symbol_name, I"!plus")) bip = PLUS_BIP;
    if (Str::eq(symb->symbol_name, I"!minus")) bip = MINUS_BIP;
    if (Str::eq(symb->symbol_name, I"!unaryminus")) bip = UNARYMINUS_BIP;
    if (Str::eq(symb->symbol_name, I"!times")) bip = TIMES_BIP;
    if (Str::eq(symb->symbol_name, I"!divide")) bip = DIVIDE_BIP;
    if (Str::eq(symb->symbol_name, I"!modulo")) bip = MODULO_BIP;
    if (Str::eq(symb->symbol_name, I"!random")) bip = RANDOM_BIP;
    if (Str::eq(symb->symbol_name, I"!return")) bip = RETURN_BIP;
    if (Str::eq(symb->symbol_name, I"!jump")) bip = JUMP_BIP;
    if (Str::eq(symb->symbol_name, I"!give")) bip = GIVE_BIP;
    if (Str::eq(symb->symbol_name, I"!take")) bip = TAKE_BIP;
    if (Str::eq(symb->symbol_name, I"!move")) bip = MOVE_BIP;
    if (Str::eq(symb->symbol_name, I"!remove")) bip = REMOVE_BIP;
    if (Str::eq(symb->symbol_name, I"!quit")) bip = QUIT_BIP;
    if (Str::eq(symb->symbol_name, I"!restore")) bip = RESTORE_BIP;
    if (Str::eq(symb->symbol_name, I"!spaces")) bip = SPACES_BIP;
    if (Str::eq(symb->symbol_name, I"!break")) bip = BREAK_BIP;
    if (Str::eq(symb->symbol_name, I"!continue")) bip = CONTINUE_BIP;
    if (Str::eq(symb->symbol_name, I"!font")) bip = FONT_BIP;
    if (Str::eq(symb->symbol_name, I"!styleroman")) bip = STYLEROMAN_BIP;
    if (Str::eq(symb->symbol_name, I"!stylebold")) bip = STYLEBOLD_BIP;
    if (Str::eq(symb->symbol_name, I"!styleunderline")) bip = STYLEUNDERLINE_BIP;
    if (Str::eq(symb->symbol_name, I"!stylereverse")) bip = STYLEREVERSE_BIP;
    if (Str::eq(symb->symbol_name, I"!print")) bip = PRINT_BIP;
    if (Str::eq(symb->symbol_name, I"!printret")) bip = PRINTRET_BIP;
    if (Str::eq(symb->symbol_name, I"!printchar")) bip = PRINTCHAR_BIP;
    if (Str::eq(symb->symbol_name, I"!printname")) bip = PRINTNAME_BIP;
    if (Str::eq(symb->symbol_name, I"!printobj")) bip = PRINTOBJ_BIP;
    if (Str::eq(symb->symbol_name, I"!printproperty")) bip = PRINTPROPERTY_BIP;
    if (Str::eq(symb->symbol_name, I"!printnumber")) bip = PRINTNUMBER_BIP;
    if (Str::eq(symb->symbol_name, I"!printaddress")) bip = PRINTADDRESS_BIP;
    if (Str::eq(symb->symbol_name, I"!printstring")) bip = PRINTSTRING_BIP;
    if (Str::eq(symb->symbol_name, I"!printnlnumber")) bip = PRINTNLNUMBER_BIP;
    if (Str::eq(symb->symbol_name, I"!printdef")) bip = PRINTDEF_BIP;
    if (Str::eq(symb->symbol_name, I"!printcdef")) bip = PRINTCDEF_BIP;
    if (Str::eq(symb->symbol_name, I"!printindef")) bip = PRINTINDEF_BIP;
    if (Str::eq(symb->symbol_name, I"!printcindef")) bip = PRINTCINDEF_BIP;
    if (Str::eq(symb->symbol_name, I"!box")) bip = BOX_BIP;
    if (Str::eq(symb->symbol_name, I"!push")) bip = PUSH_BIP;
    if (Str::eq(symb->symbol_name, I"!pull")) bip = PULL_BIP;
    if (Str::eq(symb->symbol_name, I"!preincrement")) bip = PREINCREMENT_BIP;
    if (Str::eq(symb->symbol_name, I"!postincrement")) bip = POSTINCREMENT_BIP;
    if (Str::eq(symb->symbol_name, I"!predecrement")) bip = PREDECREMENT_BIP;
    if (Str::eq(symb->symbol_name, I"!postdecrement")) bip = POSTDECREMENT_BIP;
    if (Str::eq(symb->symbol_name, I"!store")) bip = STORE_BIP;
    if (Str::eq(symb->symbol_name, I"!setbit")) bip = SETBIT_BIP;
    if (Str::eq(symb->symbol_name, I"!clearbit")) bip = CLEARBIT_BIP;
    if (Str::eq(symb->symbol_name, I"!if")) bip = IF_BIP;
    if (Str::eq(symb->symbol_name, I"!ifdebug")) bip = IFDEBUG_BIP;
    if (Str::eq(symb->symbol_name, I"!ifstrict")) bip = IFSTRICT_BIP;
    if (Str::eq(symb->symbol_name, I"!ifelse")) bip = IFELSE_BIP;
    if (Str::eq(symb->symbol_name, I"!while")) bip = WHILE_BIP;
    if (Str::eq(symb->symbol_name, I"!do")) bip = DO_BIP;
    if (Str::eq(symb->symbol_name, I"!for")) bip = FOR_BIP;
    if (Str::eq(symb->symbol_name, I"!objectloop")) bip = OBJECTLOOP_BIP;
    if (Str::eq(symb->symbol_name, I"!objectloopx")) bip = OBJECTLOOPX_BIP;
    if (Str::eq(symb->symbol_name, I"!lookup")) bip = LOOKUP_BIP;
    if (Str::eq(symb->symbol_name, I"!lookupbyte")) bip = LOOKUPBYTE_BIP;
    if (Str::eq(symb->symbol_name, I"!lookupref")) bip = LOOKUPREF_BIP;
    if (Str::eq(symb->symbol_name, I"!loop")) bip = LOOP_BIP;
    if (Str::eq(symb->symbol_name, I"!switch")) bip = SWITCH_BIP;
    if (Str::eq(symb->symbol_name, I"!case")) bip = CASE_BIP;
    if (Str::eq(symb->symbol_name, I"!default")) bip = DEFAULT_BIP;
    if (Str::eq(symb->symbol_name, I"!indirect0v")) bip = INDIRECT0V_BIP;
    if (Str::eq(symb->symbol_name, I"!indirect1v")) bip = INDIRECT1V_BIP;
    if (Str::eq(symb->symbol_name, I"!indirect2v")) bip = INDIRECT2V_BIP;
    if (Str::eq(symb->symbol_name, I"!indirect3v")) bip = INDIRECT3V_BIP;
    if (Str::eq(symb->symbol_name, I"!indirect4v")) bip = INDIRECT4V_BIP;
    if (Str::eq(symb->symbol_name, I"!indirect5v")) bip = INDIRECT5V_BIP;
    if (Str::eq(symb->symbol_name, I"!indirect0")) bip = INDIRECT0_BIP;
    if (Str::eq(symb->symbol_name, I"!indirect1")) bip = INDIRECT1_BIP;
    if (Str::eq(symb->symbol_name, I"!indirect2")) bip = INDIRECT2_BIP;
    if (Str::eq(symb->symbol_name, I"!indirect3")) bip = INDIRECT3_BIP;
    if (Str::eq(symb->symbol_name, I"!indirect4")) bip = INDIRECT4_BIP;
    if (Str::eq(symb->symbol_name, I"!indirect5")) bip = INDIRECT5_BIP;
    if (Str::eq(symb->symbol_name, I"!message0")) bip = MESSAGE0_BIP;
    if (Str::eq(symb->symbol_name, I"!message1")) bip = MESSAGE1_BIP;
    if (Str::eq(symb->symbol_name, I"!message2")) bip = MESSAGE2_BIP;
    if (Str::eq(symb->symbol_name, I"!message3")) bip = MESSAGE3_BIP;
    if (Str::eq(symb->symbol_name, I"!callmessage0")) bip = CALLMESSAGE0_BIP;
    if (Str::eq(symb->symbol_name, I"!callmessage1")) bip = CALLMESSAGE1_BIP;
    if (Str::eq(symb->symbol_name, I"!callmessage2")) bip = CALLMESSAGE2_BIP;
    if (Str::eq(symb->symbol_name, I"!callmessage3")) bip = CALLMESSAGE3_BIP;
    if (Str::eq(symb->symbol_name, I"!propertyaddress")) bip = PROPERTYADDRESS_BIP;
    if (Str::eq(symb->symbol_name, I"!propertylength")) bip = PROPERTYLENGTH_BIP;
    if (Str::eq(symb->symbol_name, I"!provides")) bip = PROVIDES_BIP;
    if (Str::eq(symb->symbol_name, I"!propertyvalue")) bip = PROPERTYVALUE_BIP;
    if (Str::eq(symb->symbol_name, I"!read")) bip = READ_BIP;
    if (Str::eq(symb->symbol_name, I"!inversion")) bip = INVERSION_BIP;
    if (bip != 0) {
        Inter::Symbols::annotate_i(symb, BIP_CODE_IANN, bip);
        return bip;
    }
    return 0;
}