diff options
Diffstat (limited to 'engines/glk/glulxe/accel.cpp')
-rw-r--r-- | engines/glk/glulxe/accel.cpp | 1010 |
1 files changed, 526 insertions, 484 deletions
diff --git a/engines/glk/glulxe/accel.cpp b/engines/glk/glulxe/accel.cpp index 929c6ab461..1d0b9e5db4 100644 --- a/engines/glk/glulxe/accel.cpp +++ b/engines/glk/glulxe/accel.cpp @@ -41,581 +41,623 @@ namespace Glulxe { #define ARG_IF_GIVEN(argv, argc, ix) ((argc > ix) ? (ARG(argv, argc, ix)) : 0) acceleration_func Glulxe::accel_find_func(uint index) { - switch (index) { - case 0: return nullptr; // 0 always means no acceleration - case 1: return &Glulxe::func_1_z__region; - case 2: return &Glulxe::func_2_cp__tab; - case 3: return &Glulxe::func_3_ra__pr; - case 4: return &Glulxe::func_4_rl__pr; - case 5: return &Glulxe::func_5_oc__cl; - case 6: return &Glulxe::func_6_rv__pr; - case 7: return &Glulxe::func_7_op__pr; - case 8: return &Glulxe::func_8_cp__tab; - case 9: return &Glulxe::func_9_ra__pr; - case 10: return &Glulxe::func_10_rl__pr; - case 11: return &Glulxe::func_11_oc__cl; - case 12: return &Glulxe::func_12_rv__pr; - case 13: return &Glulxe::func_13_op__pr; - } - return nullptr; + switch (index) { + case 0: + return nullptr; // 0 always means no acceleration + case 1: + return &Glulxe::func_1_z__region; + case 2: + return &Glulxe::func_2_cp__tab; + case 3: + return &Glulxe::func_3_ra__pr; + case 4: + return &Glulxe::func_4_rl__pr; + case 5: + return &Glulxe::func_5_oc__cl; + case 6: + return &Glulxe::func_6_rv__pr; + case 7: + return &Glulxe::func_7_op__pr; + case 8: + return &Glulxe::func_8_cp__tab; + case 9: + return &Glulxe::func_9_ra__pr; + case 10: + return &Glulxe::func_10_rl__pr; + case 11: + return &Glulxe::func_11_oc__cl; + case 12: + return &Glulxe::func_12_rv__pr; + case 13: + return &Glulxe::func_13_op__pr; + } + return nullptr; } acceleration_func Glulxe::accel_get_func(uint addr) { - int bucknum; - accelentry_t *ptr; - - if (!accelentries) - return nullptr; - - bucknum = (addr % ACCEL_HASH_SIZE); - for (ptr = accelentries[bucknum]; ptr; ptr = ptr->next) { - if (ptr->addr == addr) - return ptr->func; - } - return nullptr; + int bucknum; + accelentry_t *ptr; + + if (!accelentries) + return nullptr; + + bucknum = (addr % ACCEL_HASH_SIZE); + for (ptr = accelentries[bucknum]; ptr; ptr = ptr->next) { + if (ptr->addr == addr) + return ptr->func; + } + return nullptr; } void Glulxe::accel_iterate_funcs(void (*func)(uint index, uint addr)) { - int bucknum; - accelentry_t *ptr; - - if (!accelentries) - return; - - for (bucknum=0; bucknum<ACCEL_HASH_SIZE; bucknum++) { - for (ptr = accelentries[bucknum]; ptr; ptr = ptr->next) { - if (ptr->func) { - func(ptr->index, ptr->addr); - } - } - } + int bucknum; + accelentry_t *ptr; + + if (!accelentries) + return; + + for (bucknum = 0; bucknum < ACCEL_HASH_SIZE; bucknum++) { + for (ptr = accelentries[bucknum]; ptr; ptr = ptr->next) { + if (ptr->func) { + func(ptr->index, ptr->addr); + } + } + } } void Glulxe::accel_set_func(uint index, uint addr) { - int bucknum; - accelentry_t *ptr; - int functype; - acceleration_func new_func = nullptr; - - /* Check the Glulx type identifier byte. */ - functype = Mem1(addr); - if (functype != 0xC0 && functype != 0xC1) { - fatal_error_i("Attempt to accelerate non-function.", addr); - } - - if (!accelentries) { - accelentries = (accelentry_t **)glulx_malloc(ACCEL_HASH_SIZE - * sizeof(accelentry_t *)); - if (!accelentries) - fatal_error("Cannot malloc acceleration table."); - for (bucknum=0; bucknum<ACCEL_HASH_SIZE; bucknum++) - accelentries[bucknum] = nullptr; - } - - new_func = accel_find_func(index); - /* Might be nullptr, if the index is zero or not recognized. */ - - bucknum = (addr % ACCEL_HASH_SIZE); - for (ptr = accelentries[bucknum]; ptr; ptr = ptr->next) { - if (ptr->addr == addr) - break; - } - if (!ptr) { - if (!new_func) { - return; /* no need for a new entry */ - } - ptr = (accelentry_t *)glulx_malloc(sizeof(accelentry_t)); - if (!ptr) - fatal_error("Cannot malloc acceleration entry."); - ptr->addr = addr; - ptr->index = 0; - ptr->func = nullptr; - ptr->next = accelentries[bucknum]; - accelentries[bucknum] = ptr; - } - - ptr->index = index; - ptr->func = new_func; + int bucknum; + accelentry_t *ptr; + int functype; + acceleration_func new_func = nullptr; + + /* Check the Glulx type identifier byte. */ + functype = Mem1(addr); + if (functype != 0xC0 && functype != 0xC1) { + fatal_error_i("Attempt to accelerate non-function.", addr); + } + + if (!accelentries) { + accelentries = (accelentry_t **)glulx_malloc(ACCEL_HASH_SIZE + * sizeof(accelentry_t *)); + if (!accelentries) + fatal_error("Cannot malloc acceleration table."); + for (bucknum = 0; bucknum < ACCEL_HASH_SIZE; bucknum++) + accelentries[bucknum] = nullptr; + } + + new_func = accel_find_func(index); + /* Might be nullptr, if the index is zero or not recognized. */ + + bucknum = (addr % ACCEL_HASH_SIZE); + for (ptr = accelentries[bucknum]; ptr; ptr = ptr->next) { + if (ptr->addr == addr) + break; + } + if (!ptr) { + if (!new_func) { + return; /* no need for a new entry */ + } + ptr = (accelentry_t *)glulx_malloc(sizeof(accelentry_t)); + if (!ptr) + fatal_error("Cannot malloc acceleration entry."); + ptr->addr = addr; + ptr->index = 0; + ptr->func = nullptr; + ptr->next = accelentries[bucknum]; + accelentries[bucknum] = ptr; + } + + ptr->index = index; + ptr->func = new_func; } void Glulxe::accel_set_param(uint index, uint val) { - switch (index) { - case 0: classes_table = val; break; - case 1: indiv_prop_start = val; break; - case 2: class_metaclass = val; break; - case 3: object_metaclass = val; break; - case 4: routine_metaclass = val; break; - case 5: string_metaclass = val; break; - case 6: self = val; break; - case 7: num_attr_bytes = val; break; - case 8: cpv__start = val; break; - } + switch (index) { + case 0: + classes_table = val; + break; + case 1: + indiv_prop_start = val; + break; + case 2: + class_metaclass = val; + break; + case 3: + object_metaclass = val; + break; + case 4: + routine_metaclass = val; + break; + case 5: + string_metaclass = val; + break; + case 6: + self = val; + break; + case 7: + num_attr_bytes = val; + break; + case 8: + cpv__start = val; + break; + } } uint Glulxe::accel_get_param_count() const { - return 9; + return 9; } uint Glulxe::accel_get_param(uint index) const { - switch (index) { - case 0: return classes_table; - case 1: return indiv_prop_start; - case 2: return class_metaclass; - case 3: return object_metaclass; - case 4: return routine_metaclass; - case 5: return string_metaclass; - case 6: return self; - case 7: return num_attr_bytes; - case 8: return cpv__start; - default: return 0; - } + switch (index) { + case 0: + return classes_table; + case 1: + return indiv_prop_start; + case 2: + return class_metaclass; + case 3: + return object_metaclass; + case 4: + return routine_metaclass; + case 5: + return string_metaclass; + case 6: + return self; + case 7: + return num_attr_bytes; + case 8: + return cpv__start; + default: + return 0; + } } void Glulxe::accel_error(const char *msg) { - glk_put_char('\n'); - glk_put_string(msg); - glk_put_char('\n'); + glk_put_char('\n'); + glk_put_string(msg); + glk_put_char('\n'); } int Glulxe::obj_in_class(uint obj) { - // This checks whether obj is contained in Class, not whether it is a member of Class - return (Mem4(obj + 13 + num_attr_bytes) == class_metaclass); + // This checks whether obj is contained in Class, not whether it is a member of Class + return (Mem4(obj + 13 + num_attr_bytes) == class_metaclass); } uint Glulxe::get_prop(uint obj, uint id) { - uint cla = 0; - uint prop; - uint call_argv[2]; - - if (id & 0xFFFF0000) { - cla = Mem4(classes_table+((id & 0xFFFF) * 4)); - ARG(call_argv, 2, 0) = obj; - ARG(call_argv, 2, 1) = cla; - if (func_5_oc__cl(2, call_argv) == 0) - return 0; - - id >>= 16; - obj = cla; - } - - ARG(call_argv, 2, 0) = obj; - ARG(call_argv, 2, 1) = id; - prop = func_2_cp__tab(2, call_argv); - if (prop == 0) - return 0; - - if (obj_in_class(obj) && (cla == 0)) { - if ((id < indiv_prop_start) || (id >= indiv_prop_start+8)) - return 0; - } - - if (Mem4(self) != obj) { - if (Mem1(prop + 9) & 1) - return 0; - } - return prop; + uint cla = 0; + uint prop; + uint call_argv[2]; + + if (id & 0xFFFF0000) { + cla = Mem4(classes_table + ((id & 0xFFFF) * 4)); + ARG(call_argv, 2, 0) = obj; + ARG(call_argv, 2, 1) = cla; + if (func_5_oc__cl(2, call_argv) == 0) + return 0; + + id >>= 16; + obj = cla; + } + + ARG(call_argv, 2, 0) = obj; + ARG(call_argv, 2, 1) = id; + prop = func_2_cp__tab(2, call_argv); + if (prop == 0) + return 0; + + if (obj_in_class(obj) && (cla == 0)) { + if ((id < indiv_prop_start) || (id >= indiv_prop_start + 8)) + return 0; + } + + if (Mem4(self) != obj) { + if (Mem1(prop + 9) & 1) + return 0; + } + return prop; } uint Glulxe::get_prop_new(uint obj, uint id) { - uint cla = 0; - uint prop; - uint call_argv[2]; - - if (id & 0xFFFF0000) { - cla = Mem4(classes_table+((id & 0xFFFF) * 4)); - ARG(call_argv, 2, 0) = obj; - ARG(call_argv, 2, 1) = cla; - if (func_11_oc__cl(2, call_argv) == 0) - return 0; - - id >>= 16; - obj = cla; - } - - ARG(call_argv, 2, 0) = obj; - ARG(call_argv, 2, 1) = id; - prop = func_8_cp__tab(2, call_argv); - if (prop == 0) - return 0; - - if (obj_in_class(obj) && (cla == 0)) { - if ((id < indiv_prop_start) || (id >= indiv_prop_start+8)) - return 0; - } - - if (Mem4(self) != obj) { - if (Mem1(prop + 9) & 1) - return 0; - } - return prop; + uint cla = 0; + uint prop; + uint call_argv[2]; + + if (id & 0xFFFF0000) { + cla = Mem4(classes_table + ((id & 0xFFFF) * 4)); + ARG(call_argv, 2, 0) = obj; + ARG(call_argv, 2, 1) = cla; + if (func_11_oc__cl(2, call_argv) == 0) + return 0; + + id >>= 16; + obj = cla; + } + + ARG(call_argv, 2, 0) = obj; + ARG(call_argv, 2, 1) = id; + prop = func_8_cp__tab(2, call_argv); + if (prop == 0) + return 0; + + if (obj_in_class(obj) && (cla == 0)) { + if ((id < indiv_prop_start) || (id >= indiv_prop_start + 8)) + return 0; + } + + if (Mem4(self) != obj) { + if (Mem1(prop + 9) & 1) + return 0; + } + return prop; } uint Glulxe::func_1_z__region(uint argc, uint *argv) { - uint addr; - uint tb; - - if (argc < 1) - return 0; - - addr = ARG(argv, argc, 0); - if (addr < 36) - return 0; - if (addr >= endmem) - return 0; - - tb = Mem1(addr); - if (tb >= 0xE0) { - return 3; - } - if (tb >= 0xC0) { - return 2; - } - if (tb >= 0x70 && tb <= 0x7F && addr >= ramstart) { - return 1; - } - return 0; + uint addr; + uint tb; + + if (argc < 1) + return 0; + + addr = ARG(argv, argc, 0); + if (addr < 36) + return 0; + if (addr >= endmem) + return 0; + + tb = Mem1(addr); + if (tb >= 0xE0) { + return 3; + } + if (tb >= 0xC0) { + return 2; + } + if (tb >= 0x70 && tb <= 0x7F && addr >= ramstart) { + return 1; + } + return 0; } uint Glulxe::func_2_cp__tab(uint argc, uint *argv) { - uint obj; - uint id; - uint otab, max; - - obj = ARG_IF_GIVEN(argv, argc, 0); - id = ARG_IF_GIVEN(argv, argc, 1); - - if (func_1_z__region(1, &obj) != 1) { - accel_error("[** Programming error: tried to find the \".\" of (something) **]"); - return 0; - } - - otab = Mem4(obj + 16); - if (!otab) - return 0; - - max = Mem4(otab); - otab += 4; - /* @binarysearch id 2 otab 10 max 0 0 res; */ - return binary_search(id, 2, otab, 10, max, 0, 0); + uint obj; + uint id; + uint otab, max; + + obj = ARG_IF_GIVEN(argv, argc, 0); + id = ARG_IF_GIVEN(argv, argc, 1); + + if (func_1_z__region(1, &obj) != 1) { + accel_error("[** Programming error: tried to find the \".\" of (something) **]"); + return 0; + } + + otab = Mem4(obj + 16); + if (!otab) + return 0; + + max = Mem4(otab); + otab += 4; + /* @binarysearch id 2 otab 10 max 0 0 res; */ + return binary_search(id, 2, otab, 10, max, 0, 0); } uint Glulxe::func_3_ra__pr(uint argc, uint *argv) { - uint obj; - uint id; - uint prop; + uint obj; + uint id; + uint prop; - obj = ARG_IF_GIVEN(argv, argc, 0); - id = ARG_IF_GIVEN(argv, argc, 1); + obj = ARG_IF_GIVEN(argv, argc, 0); + id = ARG_IF_GIVEN(argv, argc, 1); - prop = get_prop(obj, id); - if (prop == 0) - return 0; + prop = get_prop(obj, id); + if (prop == 0) + return 0; - return Mem4(prop + 4); + return Mem4(prop + 4); } uint Glulxe::func_4_rl__pr(uint argc, uint *argv) { - uint obj; - uint id; - uint prop; + uint obj; + uint id; + uint prop; - obj = ARG_IF_GIVEN(argv, argc, 0); - id = ARG_IF_GIVEN(argv, argc, 1); + obj = ARG_IF_GIVEN(argv, argc, 0); + id = ARG_IF_GIVEN(argv, argc, 1); - prop = get_prop(obj, id); - if (prop == 0) - return 0; + prop = get_prop(obj, id); + if (prop == 0) + return 0; - return 4 * Mem2(prop + 2); + return 4 * Mem2(prop + 2); } uint Glulxe::func_5_oc__cl(uint argc, uint *argv) { - uint obj; - uint cla; - uint zr, prop, inlist, inlistlen, jx; - - obj = ARG_IF_GIVEN(argv, argc, 0); - cla = ARG_IF_GIVEN(argv, argc, 1); - - zr = func_1_z__region(1, &obj); - if (zr == 3) - return (cla == string_metaclass) ? 1 : 0; - if (zr == 2) - return (cla == routine_metaclass) ? 1 : 0; - if (zr != 1) - return 0; - - if (cla == class_metaclass) { - if (obj_in_class(obj)) - return 1; - if (obj == class_metaclass) - return 1; - if (obj == string_metaclass) - return 1; - if (obj == routine_metaclass) - return 1; - if (obj == object_metaclass) - return 1; - return 0; - } - if (cla == object_metaclass) { - if (obj_in_class(obj)) - return 0; - if (obj == class_metaclass) - return 0; - if (obj == string_metaclass) - return 0; - if (obj == routine_metaclass) - return 0; - if (obj == object_metaclass) - return 0; - return 1; - } - if ((cla == string_metaclass) || (cla == routine_metaclass)) - return 0; - - if (!obj_in_class(cla)) { - accel_error("[** Programming error: tried to apply 'ofclass' with non-class **]"); - return 0; - } - - prop = get_prop(obj, 2); - if (prop == 0) - return 0; - - inlist = Mem4(prop + 4); - if (inlist == 0) - return 0; - - inlistlen = Mem2(prop + 2); - for (jx = 0; jx < inlistlen; jx++) { - if (Mem4(inlist + (4 * jx)) == cla) - return 1; - } - return 0; + uint obj; + uint cla; + uint zr, prop, inlist, inlistlen, jx; + + obj = ARG_IF_GIVEN(argv, argc, 0); + cla = ARG_IF_GIVEN(argv, argc, 1); + + zr = func_1_z__region(1, &obj); + if (zr == 3) + return (cla == string_metaclass) ? 1 : 0; + if (zr == 2) + return (cla == routine_metaclass) ? 1 : 0; + if (zr != 1) + return 0; + + if (cla == class_metaclass) { + if (obj_in_class(obj)) + return 1; + if (obj == class_metaclass) + return 1; + if (obj == string_metaclass) + return 1; + if (obj == routine_metaclass) + return 1; + if (obj == object_metaclass) + return 1; + return 0; + } + if (cla == object_metaclass) { + if (obj_in_class(obj)) + return 0; + if (obj == class_metaclass) + return 0; + if (obj == string_metaclass) + return 0; + if (obj == routine_metaclass) + return 0; + if (obj == object_metaclass) + return 0; + return 1; + } + if ((cla == string_metaclass) || (cla == routine_metaclass)) + return 0; + + if (!obj_in_class(cla)) { + accel_error("[** Programming error: tried to apply 'ofclass' with non-class **]"); + return 0; + } + + prop = get_prop(obj, 2); + if (prop == 0) + return 0; + + inlist = Mem4(prop + 4); + if (inlist == 0) + return 0; + + inlistlen = Mem2(prop + 2); + for (jx = 0; jx < inlistlen; jx++) { + if (Mem4(inlist + (4 * jx)) == cla) + return 1; + } + return 0; } uint Glulxe::func_6_rv__pr(uint argc, uint *argv) { - uint id; - uint addr; + uint id; + uint addr; - id = ARG_IF_GIVEN(argv, argc, 1); + id = ARG_IF_GIVEN(argv, argc, 1); - addr = func_3_ra__pr(argc, argv); + addr = func_3_ra__pr(argc, argv); - if (addr == 0) { - if ((id > 0) && (id < indiv_prop_start)) - return Mem4(cpv__start + (4 * id)); + if (addr == 0) { + if ((id > 0) && (id < indiv_prop_start)) + return Mem4(cpv__start + (4 * id)); - accel_error("[** Programming error: tried to read (something) **]"); - return 0; - } + accel_error("[** Programming error: tried to read (something) **]"); + return 0; + } - return Mem4(addr); + return Mem4(addr); } uint Glulxe::func_7_op__pr(uint argc, uint *argv) { - uint obj; - uint id; - uint zr; - - obj = ARG_IF_GIVEN(argv, argc, 0); - id = ARG_IF_GIVEN(argv, argc, 1); - - zr = func_1_z__region(1, &obj); - if (zr == 3) { - /* print is INDIV_PROP_START+6 */ - if (id == indiv_prop_start+6) - return 1; - /* print_to_array is INDIV_PROP_START+7 */ - if (id == indiv_prop_start+7) - return 1; - return 0; - } - if (zr == 2) { - /* call is INDIV_PROP_START+5 */ - return ((id == indiv_prop_start+5) ? 1 : 0); - } - if (zr != 1) - return 0; - - if ((id >= indiv_prop_start) && (id < indiv_prop_start+8)) { - if (obj_in_class(obj)) - return 1; - } - - return ((func_3_ra__pr(argc, argv)) ? 1 : 0); + uint obj; + uint id; + uint zr; + + obj = ARG_IF_GIVEN(argv, argc, 0); + id = ARG_IF_GIVEN(argv, argc, 1); + + zr = func_1_z__region(1, &obj); + if (zr == 3) { + /* print is INDIV_PROP_START+6 */ + if (id == indiv_prop_start + 6) + return 1; + /* print_to_array is INDIV_PROP_START+7 */ + if (id == indiv_prop_start + 7) + return 1; + return 0; + } + if (zr == 2) { + /* call is INDIV_PROP_START+5 */ + return ((id == indiv_prop_start + 5) ? 1 : 0); + } + if (zr != 1) + return 0; + + if ((id >= indiv_prop_start) && (id < indiv_prop_start + 8)) { + if (obj_in_class(obj)) + return 1; + } + + return ((func_3_ra__pr(argc, argv)) ? 1 : 0); } uint Glulxe::func_8_cp__tab(uint argc, uint *argv) { - uint obj; - uint id; - uint otab, max; - - obj = ARG_IF_GIVEN(argv, argc, 0); - id = ARG_IF_GIVEN(argv, argc, 1); - - if (func_1_z__region(1, &obj) != 1) { - accel_error("[** Programming error: tried to find the \".\" of (something) **]"); - return 0; - } - - otab = Mem4(obj + 4*(3+(int)(num_attr_bytes/4))); - if (!otab) - return 0; - - max = Mem4(otab); - otab += 4; - /* @binarysearch id 2 otab 10 max 0 0 res; */ - return binary_search(id, 2, otab, 10, max, 0, 0); + uint obj; + uint id; + uint otab, max; + + obj = ARG_IF_GIVEN(argv, argc, 0); + id = ARG_IF_GIVEN(argv, argc, 1); + + if (func_1_z__region(1, &obj) != 1) { + accel_error("[** Programming error: tried to find the \".\" of (something) **]"); + return 0; + } + + otab = Mem4(obj + 4 * (3 + (int)(num_attr_bytes / 4))); + if (!otab) + return 0; + + max = Mem4(otab); + otab += 4; + /* @binarysearch id 2 otab 10 max 0 0 res; */ + return binary_search(id, 2, otab, 10, max, 0, 0); } uint Glulxe::func_9_ra__pr(uint argc, uint *argv) { - uint obj; - uint id; - uint prop; + uint obj; + uint id; + uint prop; - obj = ARG_IF_GIVEN(argv, argc, 0); - id = ARG_IF_GIVEN(argv, argc, 1); + obj = ARG_IF_GIVEN(argv, argc, 0); + id = ARG_IF_GIVEN(argv, argc, 1); - prop = get_prop_new(obj, id); - if (prop == 0) - return 0; + prop = get_prop_new(obj, id); + if (prop == 0) + return 0; - return Mem4(prop + 4); + return Mem4(prop + 4); } uint Glulxe::func_10_rl__pr(uint argc, uint *argv) { - uint obj; - uint id; - uint prop; + uint obj; + uint id; + uint prop; - obj = ARG_IF_GIVEN(argv, argc, 0); - id = ARG_IF_GIVEN(argv, argc, 1); + obj = ARG_IF_GIVEN(argv, argc, 0); + id = ARG_IF_GIVEN(argv, argc, 1); - prop = get_prop_new(obj, id); - if (prop == 0) - return 0; + prop = get_prop_new(obj, id); + if (prop == 0) + return 0; - return 4 * Mem2(prop + 2); + return 4 * Mem2(prop + 2); } uint Glulxe::func_11_oc__cl(uint argc, uint *argv) { - uint obj; - uint cla; - uint zr, prop, inlist, inlistlen, jx; - - obj = ARG_IF_GIVEN(argv, argc, 0); - cla = ARG_IF_GIVEN(argv, argc, 1); - - zr = func_1_z__region(1, &obj); - if (zr == 3) - return (cla == string_metaclass) ? 1 : 0; - if (zr == 2) - return (cla == routine_metaclass) ? 1 : 0; - if (zr != 1) - return 0; - - if (cla == class_metaclass) { - if (obj_in_class(obj)) - return 1; - if (obj == class_metaclass) - return 1; - if (obj == string_metaclass) - return 1; - if (obj == routine_metaclass) - return 1; - if (obj == object_metaclass) - return 1; - return 0; - } - if (cla == object_metaclass) { - if (obj_in_class(obj)) - return 0; - if (obj == class_metaclass) - return 0; - if (obj == string_metaclass) - return 0; - if (obj == routine_metaclass) - return 0; - if (obj == object_metaclass) - return 0; - return 1; - } - if ((cla == string_metaclass) || (cla == routine_metaclass)) - return 0; - - if (!obj_in_class(cla)) { - accel_error("[** Programming error: tried to apply 'ofclass' with non-class **]"); - return 0; - } - - prop = get_prop_new(obj, 2); - if (prop == 0) - return 0; - - inlist = Mem4(prop + 4); - if (inlist == 0) - return 0; - - inlistlen = Mem2(prop + 2); - for (jx = 0; jx < inlistlen; jx++) { - if (Mem4(inlist + (4 * jx)) == cla) - return 1; - } - return 0; + uint obj; + uint cla; + uint zr, prop, inlist, inlistlen, jx; + + obj = ARG_IF_GIVEN(argv, argc, 0); + cla = ARG_IF_GIVEN(argv, argc, 1); + + zr = func_1_z__region(1, &obj); + if (zr == 3) + return (cla == string_metaclass) ? 1 : 0; + if (zr == 2) + return (cla == routine_metaclass) ? 1 : 0; + if (zr != 1) + return 0; + + if (cla == class_metaclass) { + if (obj_in_class(obj)) + return 1; + if (obj == class_metaclass) + return 1; + if (obj == string_metaclass) + return 1; + if (obj == routine_metaclass) + return 1; + if (obj == object_metaclass) + return 1; + return 0; + } + if (cla == object_metaclass) { + if (obj_in_class(obj)) + return 0; + if (obj == class_metaclass) + return 0; + if (obj == string_metaclass) + return 0; + if (obj == routine_metaclass) + return 0; + if (obj == object_metaclass) + return 0; + return 1; + } + if ((cla == string_metaclass) || (cla == routine_metaclass)) + return 0; + + if (!obj_in_class(cla)) { + accel_error("[** Programming error: tried to apply 'ofclass' with non-class **]"); + return 0; + } + + prop = get_prop_new(obj, 2); + if (prop == 0) + return 0; + + inlist = Mem4(prop + 4); + if (inlist == 0) + return 0; + + inlistlen = Mem2(prop + 2); + for (jx = 0; jx < inlistlen; jx++) { + if (Mem4(inlist + (4 * jx)) == cla) + return 1; + } + return 0; } uint Glulxe::func_12_rv__pr(uint argc, uint *argv) { - uint id; - uint addr; + uint id; + uint addr; - id = ARG_IF_GIVEN(argv, argc, 1); + id = ARG_IF_GIVEN(argv, argc, 1); - addr = func_9_ra__pr(argc, argv); + addr = func_9_ra__pr(argc, argv); - if (addr == 0) { - if ((id > 0) && (id < indiv_prop_start)) - return Mem4(cpv__start + (4 * id)); + if (addr == 0) { + if ((id > 0) && (id < indiv_prop_start)) + return Mem4(cpv__start + (4 * id)); - accel_error("[** Programming error: tried to read (something) **]"); - return 0; - } + accel_error("[** Programming error: tried to read (something) **]"); + return 0; + } - return Mem4(addr); + return Mem4(addr); } uint Glulxe::func_13_op__pr(uint argc, uint *argv) { - uint obj; - uint id; - uint zr; - - obj = ARG_IF_GIVEN(argv, argc, 0); - id = ARG_IF_GIVEN(argv, argc, 1); - - zr = func_1_z__region(1, &obj); - if (zr == 3) { - /* print is INDIV_PROP_START+6 */ - if (id == indiv_prop_start+6) - return 1; - /* print_to_array is INDIV_PROP_START+7 */ - if (id == indiv_prop_start+7) - return 1; - return 0; - } - if (zr == 2) { - /* call is INDIV_PROP_START+5 */ - return ((id == indiv_prop_start+5) ? 1 : 0); - } - if (zr != 1) - return 0; - - if ((id >= indiv_prop_start) && (id < indiv_prop_start+8)) { - if (obj_in_class(obj)) - return 1; - } - - return ((func_9_ra__pr(argc, argv)) ? 1 : 0); + uint obj; + uint id; + uint zr; + + obj = ARG_IF_GIVEN(argv, argc, 0); + id = ARG_IF_GIVEN(argv, argc, 1); + + zr = func_1_z__region(1, &obj); + if (zr == 3) { + /* print is INDIV_PROP_START+6 */ + if (id == indiv_prop_start + 6) + return 1; + /* print_to_array is INDIV_PROP_START+7 */ + if (id == indiv_prop_start + 7) + return 1; + return 0; + } + if (zr == 2) { + /* call is INDIV_PROP_START+5 */ + return ((id == indiv_prop_start + 5) ? 1 : 0); + } + if (zr != 1) + return 0; + + if ((id >= indiv_prop_start) && (id < indiv_prop_start + 8)) { + if (obj_in_class(obj)) + return 1; + } + + return ((func_9_ra__pr(argc, argv)) ? 1 : 0); } } // End of namespace Glulxe |