enhanced class_enter to check indexed type between a class and a superclass
This commit is contained in:
14
lib/exec.c
14
lib/exec.c
@ -4122,6 +4122,9 @@ static int execute (hak_t* hak)
|
|||||||
|
|
||||||
if (b1 > 0)
|
if (b1 > 0)
|
||||||
{
|
{
|
||||||
|
hak_ooi_t super_spec;
|
||||||
|
hak_obj_type_t super_indexed_type;
|
||||||
|
|
||||||
HAK_STACK_POP_TO(hak, superclass); /* TODO: support more than 1 superclass later when the compiler supports more */
|
HAK_STACK_POP_TO(hak, superclass); /* TODO: support more than 1 superclass later when the compiler supports more */
|
||||||
if (!HAK_IS_CLASS(hak, superclass))
|
if (!HAK_IS_CLASS(hak, superclass))
|
||||||
{
|
{
|
||||||
@ -4129,6 +4132,17 @@ static int execute (hak_t* hak)
|
|||||||
if (do_throw_with_internal_errmsg(hak, fetched_instruction_pointer) >= 0) break;
|
if (do_throw_with_internal_errmsg(hak, fetched_instruction_pointer) >= 0) break;
|
||||||
goto oops_with_errmsg_supplement;
|
goto oops_with_errmsg_supplement;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
super_spec = HAK_OOP_TO_SMOOI(((hak_oop_class_t)superclass)->spec);
|
||||||
|
super_indexed_type = HAK_CLASS_SPEC_INDEXED_TYPE(super_spec);
|
||||||
|
if (super_indexed_type != b5)
|
||||||
|
{
|
||||||
|
/* TODO: include the class indexed type in the message .. */
|
||||||
|
hak_seterrbfmt(hak, HAK_ECALL, "incompatible %hs superclass %O with %hs class",
|
||||||
|
hak_obj_type_to_bcstr(super_indexed_type), superclass, hak_obj_type_to_bcstr(b5));
|
||||||
|
if (do_throw_with_internal_errmsg(hak, fetched_instruction_pointer) >= 0) break;
|
||||||
|
goto oops_with_errmsg_supplement;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else superclass = hak->_nil;
|
else superclass = hak->_nil;
|
||||||
|
|
||||||
|
12
lib/hak.c
12
lib/hak.c
@ -1017,3 +1017,15 @@ hak_pfbase_t* hak_findpfbase (hak_t* hak, hak_pfinfo_t* pfinfo, hak_oow_t pfcoun
|
|||||||
return HAK_NULL;
|
return HAK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const hak_bch_t* hak_obj_type_to_bcstr (hak_obj_type_t type)
|
||||||
|
{
|
||||||
|
static const hak_bch_t* names[] = {
|
||||||
|
"oop",
|
||||||
|
"char",
|
||||||
|
"byte",
|
||||||
|
"halfword",
|
||||||
|
"word",
|
||||||
|
};
|
||||||
|
|
||||||
|
return (type < HAK_COUNTOF(names))? names[type]: "";
|
||||||
|
}
|
||||||
|
@ -2097,6 +2097,10 @@ typedef int (*hak_xchg_writer_t) (
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
HAK_EXPORT const hak_bch_t* hak_obj_type_to_bcstr (
|
||||||
|
hak_obj_type_t type
|
||||||
|
);
|
||||||
|
|
||||||
HAK_EXPORT hak_t* hak_open (
|
HAK_EXPORT hak_t* hak_open (
|
||||||
hak_mmgr_t* mmgr,
|
hak_mmgr_t* mmgr,
|
||||||
hak_oow_t xtnsize,
|
hak_oow_t xtnsize,
|
||||||
|
@ -321,3 +321,28 @@ class Kuduro (a (b) c) {
|
|||||||
var d e
|
var d e
|
||||||
var(#class) b ##ERROR: syntax error - duplicate class variable name 'b'
|
var(#class) b ##ERROR: syntax error - duplicate class variable name 'b'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## TODO: some of these can be detected as an error at the compile time..
|
||||||
|
|
||||||
|
class[#b] X (a) {
|
||||||
|
fun[#ci] new() {
|
||||||
|
## the instance variable is a byte because the class is a byte-oriented class
|
||||||
|
self.a := -20 ##ERROR: exception not handled - "negative number - -20"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
X:new
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
class[#b] X (a) {
|
||||||
|
fun[#ci] new() {
|
||||||
|
## the instance variable is a byte because the class is a byte-oriented class
|
||||||
|
self.a := -20 ##ERROR: exception not handled - "negative number - -20"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Y: X { ##ERROR: exception not handled - "incompatible byte superclass X with oop class"
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user