updated the kernel class initialization to set the superclass
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
e4a26b71be
commit
7252ee5e47
@ -3934,12 +3934,16 @@ static int execute (hcl_t* hcl)
|
|||||||
if (HCL_OBJ_GET_FLAGS_KERNEL(class_obj) == 1)
|
if (HCL_OBJ_GET_FLAGS_KERNEL(class_obj) == 1)
|
||||||
{
|
{
|
||||||
/* check if the new definition is compatible with kernel definition */
|
/* check if the new definition is compatible with kernel definition */
|
||||||
hcl_ooi_t spec, selfspec;
|
hcl_ooi_t spec, selfspec, nivars_super, nivars_super_real;
|
||||||
|
|
||||||
spec = HCL_OOP_TO_SMOOI(class_obj->spec);
|
spec = HCL_OOP_TO_SMOOI(class_obj->spec);
|
||||||
selfspec = HCL_OOP_TO_SMOOI(class_obj->selfspec);
|
selfspec = HCL_OOP_TO_SMOOI(class_obj->selfspec);
|
||||||
|
nivars_super = HCL_OOP_TO_SMOOI(class_obj->nivars_super);
|
||||||
|
nivars_super_real = HCL_IS_NIL(hcl, superclass)? 0: HCL_OOP_TO_SMOOI(((hcl_oop_class_t)superclass)->nivars_super);
|
||||||
|
#if 0
|
||||||
hcl_logbfmt (hcl, HCL_LOG_STDERR, ">>>%O c->sc=%O sc=%O b2=%d b3=%d nivars=%d ncvars=%d<<<\n", class_obj, class_obj->superclass, superclass, b2, b3, (int)HCL_CLASS_SPEC_NAMED_INSTVARS(spec), (int)HCL_CLASS_SELFSPEC_CLASSVARS(spec));
|
hcl_logbfmt (hcl, HCL_LOG_STDERR, ">>>%O c->sc=%O sc=%O b2=%d b3=%d nivars=%d ncvars=%d<<<\n", class_obj, class_obj->superclass, superclass, b2, b3, (int)HCL_CLASS_SPEC_NAMED_INSTVARS(spec), (int)HCL_CLASS_SELFSPEC_CLASSVARS(spec));
|
||||||
if (class_obj->superclass != superclass || HCL_CLASS_SPEC_NAMED_INSTVARS(spec) != b2 || HCL_CLASS_SELFSPEC_CLASSVARS(selfspec) != b3)
|
#endif
|
||||||
|
if (class_obj->superclass != superclass || HCL_CLASS_SPEC_NAMED_INSTVARS(spec) != b2 || HCL_CLASS_SELFSPEC_CLASSVARS(selfspec) != b3 || nivars_super != nivars_super_real)
|
||||||
{
|
{
|
||||||
hcl_seterrbfmt (hcl, HCL_EPERM, "incompatible redefintion of %.*js", HCL_OBJ_GET_SIZE(class_name), HCL_OBJ_GET_CHAR_SLOT(class_name));
|
hcl_seterrbfmt (hcl, HCL_EPERM, "incompatible redefintion of %.*js", HCL_OBJ_GET_SIZE(class_name), HCL_OBJ_GET_CHAR_SLOT(class_name));
|
||||||
if (do_throw_with_internal_errmsg(hcl, fetched_instruction_pointer) >= 0) break;
|
if (do_throw_with_internal_errmsg(hcl, fetched_instruction_pointer) >= 0) break;
|
||||||
|
15
lib/gc.c
15
lib/gc.c
@ -1468,6 +1468,7 @@ static int ignite_1 (hcl_t* hcl)
|
|||||||
HCL_OBJ_SET_CLASS (hcl->c_class, (hcl_oop_t)hcl->c_class);
|
HCL_OBJ_SET_CLASS (hcl->c_class, (hcl_oop_t)hcl->c_class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* create class objects except Class */
|
||||||
for (i = 0; i < HCL_COUNTOF(kernel_classes); i++)
|
for (i = 0; i < HCL_COUNTOF(kernel_classes); i++)
|
||||||
{
|
{
|
||||||
hcl_oop_class_t tmp;
|
hcl_oop_class_t tmp;
|
||||||
@ -1496,6 +1497,20 @@ static int ignite_1 (hcl_t* hcl)
|
|||||||
*(hcl_oop_class_t*)((hcl_uint8_t*)hcl + kernel_classes[i].offset) = tmp;
|
*(hcl_oop_class_t*)((hcl_uint8_t*)hcl + kernel_classes[i].offset) = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* update the superclass field */
|
||||||
|
for (i = 0; i < HCL_COUNTOF(kernel_classes); i++)
|
||||||
|
{
|
||||||
|
int skci;
|
||||||
|
skci = kernel_classes[i].superclass_kci;
|
||||||
|
if (skci >= 0)
|
||||||
|
{
|
||||||
|
hcl_oop_class_t* x, * y;
|
||||||
|
x = (hcl_oop_class_t*)((hcl_uint8_t*)hcl + kernel_classes[i].offset);
|
||||||
|
y = (hcl_oop_class_t*)((hcl_uint8_t*)hcl + kernel_classes[skci].offset);
|
||||||
|
(*x)->superclass = (hcl_oop_t)*y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* an instance of a method class stores byte codes in the trailer space.
|
/* an instance of a method class stores byte codes in the trailer space.
|
||||||
* unlike other classes with trailer size set, the size of the trailer
|
* unlike other classes with trailer size set, the size of the trailer
|
||||||
|
205
mod/core.c
205
mod/core.c
@ -48,16 +48,217 @@ static hcl_pfrc_t pf_core_get_class_name (hcl_t* hcl, hcl_mod_t* mod, hcl_ooi_t
|
|||||||
return HCL_PF_SUCCESS;
|
return HCL_PF_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static hcl_pfrc_t pf_core_size (hcl_t* hcl, hcl_mod_t* mod, hcl_ooi_t nargs)
|
||||||
|
{
|
||||||
|
hcl_oop_oop_t src;
|
||||||
|
hcl_oop_t size;
|
||||||
|
|
||||||
|
src = (hcl_oop_oop_t)HCL_STACK_GETARG(hcl, nargs, 0);
|
||||||
|
|
||||||
|
if (!HCL_OOP_IS_POINTER(src))
|
||||||
|
{
|
||||||
|
hcl_seterrbfmt (hcl, HCL_EINVAL, "source not sizable - %O", src);
|
||||||
|
return HCL_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
size = hcl_oowtoint(hcl, HCL_OBJ_GET_SIZE(src));
|
||||||
|
if (!size) return HCL_PF_FAILURE;
|
||||||
|
|
||||||
|
HCL_STACK_SETRET (hcl, nargs, size);
|
||||||
|
return HCL_PF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static hcl_pfrc_t pf_core_slice (hcl_t* hcl, hcl_mod_t* mod, hcl_ooi_t nargs)
|
||||||
|
{
|
||||||
|
hcl_oop_t src, slice, a1, a2;
|
||||||
|
hcl_ooi_t size;
|
||||||
|
hcl_ooi_t pos;
|
||||||
|
hcl_ooi_t len;
|
||||||
|
hcl_ooi_t i;
|
||||||
|
|
||||||
|
src = HCL_STACK_GETARG(hcl, nargs, 0);
|
||||||
|
a1 = HCL_STACK_GETARG(hcl, nargs, 1);
|
||||||
|
a2 = HCL_STACK_GETARG(hcl, nargs, 2);
|
||||||
|
|
||||||
|
if (!HCL_OOP_IS_POINTER(src))
|
||||||
|
{
|
||||||
|
unsliceable:
|
||||||
|
hcl_seterrbfmt (hcl, HCL_EINVAL, "source not sliceable - %O", src);
|
||||||
|
return HCL_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!HCL_OOP_IS_SMOOI(a1))
|
||||||
|
{
|
||||||
|
hcl_seterrbfmt (hcl, HCL_EINVAL, "position not numeric - %O", a1);
|
||||||
|
return HCL_PF_FAILURE;
|
||||||
|
}
|
||||||
|
if (!HCL_OOP_IS_SMOOI(a2))
|
||||||
|
{
|
||||||
|
hcl_seterrbfmt (hcl, HCL_EINVAL, "length not numeric - %O", a2);
|
||||||
|
return HCL_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
size = HCL_OBJ_GET_SIZE(src);
|
||||||
|
pos = HCL_OOP_TO_SMOOI(a1);
|
||||||
|
len = HCL_OOP_TO_SMOOI(a2);
|
||||||
|
|
||||||
|
if (pos < 0) pos = 0;
|
||||||
|
else if (pos >= size) pos = size;
|
||||||
|
if (len >= size - pos) len = size - pos;
|
||||||
|
|
||||||
|
/* TODO: check if the object is an indexable object from the class spec... */
|
||||||
|
/* use HCL_OBJ_GET_CLASS() instead of HCL_CLASSOF() as we know it's an object */
|
||||||
|
slice = hcl_instantiate(hcl, (hcl_oop_class_t)HCL_OBJ_GET_CLASS(src), HCL_NULL, len);
|
||||||
|
if (HCL_UNLIKELY(!slice)) return HCL_PF_FAILURE;
|
||||||
|
|
||||||
|
/* OR if add by the number of fixed fields??? */
|
||||||
|
switch (HCL_OBJ_GET_FLAGS_TYPE(src))
|
||||||
|
{
|
||||||
|
case HCL_OBJ_TYPE_OOP:
|
||||||
|
for (i = 0; i < len; i++) HCL_OBJ_GET_OOP_VAL(slice, i) = HCL_OBJ_GET_OOP_VAL(src, pos + i);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HCL_OBJ_TYPE_CHAR:
|
||||||
|
for (i = 0; i < len; i++) HCL_OBJ_GET_CHAR_VAL(slice, i) = HCL_OBJ_GET_CHAR_VAL(src, pos + i);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HCL_OBJ_TYPE_BYTE:
|
||||||
|
for (i = 0; i < len; i++) HCL_OBJ_GET_BYTE_VAL(slice, i) = HCL_OBJ_GET_BYTE_VAL(src, pos + i);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HCL_OBJ_TYPE_HALFWORD:
|
||||||
|
for (i = 0; i < len; i++) HCL_OBJ_GET_HALFWORD_VAL(slice, i) = HCL_OBJ_GET_HALFWORD_VAL(src, pos + i);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HCL_OBJ_TYPE_WORD:
|
||||||
|
for (i = 0; i < len; i++) HCL_OBJ_GET_WORD_VAL(slice, i) = HCL_OBJ_GET_WORD_VAL(src, pos + i);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
goto unsliceable;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
HCL_STACK_SETRET (hcl, nargs, slice);
|
||||||
|
return HCL_PF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static hcl_pfrc_t pf_core_get (hcl_t* hcl, hcl_mod_t* mod, hcl_ooi_t nargs)
|
||||||
|
{
|
||||||
|
hcl_oop_t obj, val;
|
||||||
|
hcl_oop_t pos;
|
||||||
|
hcl_oow_t index;
|
||||||
|
|
||||||
|
obj = HCL_STACK_GETARG(hcl, nargs, 0);
|
||||||
|
pos = HCL_STACK_GETARG(hcl, nargs, 1);
|
||||||
|
|
||||||
|
if (!HCL_OOP_IS_POINTER(obj))
|
||||||
|
{
|
||||||
|
unindexable:
|
||||||
|
hcl_seterrbfmt (hcl, HCL_EINVAL, "object not indexable - %O", obj);
|
||||||
|
return HCL_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!HCL_OOP_IS_SMOOI(pos))
|
||||||
|
{
|
||||||
|
hcl_seterrbfmt (hcl, HCL_EINVAL, "position not numeric - %O", pos);
|
||||||
|
return HCL_PF_FAILURE;
|
||||||
|
}
|
||||||
|
index = HCL_OOP_TO_SMOOI(pos);
|
||||||
|
if (index < 0 || index >= HCL_OBJ_GET_SIZE(obj))
|
||||||
|
{
|
||||||
|
hcl_seterrbfmt (hcl, HCL_EINVAL, "position(%O) out of range - 0 and %zu", pos, (hcl_oow_t)HCL_OBJ_GET_SIZE(obj) - 1);
|
||||||
|
return HCL_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (HCL_OBJ_GET_FLAGS_TYPE(obj))
|
||||||
|
{
|
||||||
|
case HCL_OBJ_TYPE_OOP:
|
||||||
|
val = HCL_OBJ_GET_OOP_VAL(obj, index);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HCL_OBJ_TYPE_CHAR:
|
||||||
|
{
|
||||||
|
hcl_ooch_t c;
|
||||||
|
c = HCL_OBJ_GET_CHAR_VAL(obj, index);
|
||||||
|
val = HCL_CHAR_TO_OOP(c);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case HCL_OBJ_TYPE_BYTE:
|
||||||
|
{
|
||||||
|
hcl_ooi_t b;
|
||||||
|
b = HCL_OBJ_GET_BYTE_VAL(obj, index);
|
||||||
|
val = HCL_SMOOI_TO_OOP(b);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case HCL_OBJ_TYPE_HALFWORD:
|
||||||
|
val = hcl_oowtoint(hcl, HCL_OBJ_GET_HALFWORD_VAL(obj, index));
|
||||||
|
if (HCL_UNLIKELY(!val)) return HCL_PF_FAILURE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HCL_OBJ_TYPE_WORD:
|
||||||
|
val = hcl_oowtoint(hcl, HCL_OBJ_GET_WORD_VAL(obj, index));
|
||||||
|
if (HCL_UNLIKELY(!val)) return HCL_PF_FAILURE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
goto unindexable;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
HCL_STACK_SETRET (hcl, nargs, val);
|
||||||
|
return HCL_PF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static hcl_pfrc_t pf_core_put (hcl_t* hcl, hcl_mod_t* mod, hcl_ooi_t nargs)
|
||||||
|
{
|
||||||
|
hcl_oop_t obj;
|
||||||
|
hcl_oop_t pos, val;
|
||||||
|
hcl_oow_t index;
|
||||||
|
|
||||||
|
obj = HCL_STACK_GETARG(hcl, nargs, 0);
|
||||||
|
pos = HCL_STACK_GETARG(hcl, nargs, 1);
|
||||||
|
val = HCL_STACK_GETARG(hcl, nargs, 2);
|
||||||
|
|
||||||
|
if (!HCL_OOP_IS_POINTER(obj))
|
||||||
|
{
|
||||||
|
unindexable:
|
||||||
|
hcl_seterrbfmt (hcl, HCL_EINVAL, "object not indexable - %O", obj);
|
||||||
|
return HCL_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!HCL_IS_ARRAY(hcl,obj))
|
||||||
|
{
|
||||||
|
hcl_seterrbfmt (hcl, HCL_EINVAL, "parameter not an array - %O", obj);
|
||||||
|
return HCL_PF_FAILURE;
|
||||||
|
}
|
||||||
|
if (!HCL_OOP_IS_SMOOI(pos))
|
||||||
|
{
|
||||||
|
hcl_seterrbfmt (hcl, HCL_EINVAL, "position not numeric - %O", pos);
|
||||||
|
return HCL_PF_FAILURE;
|
||||||
|
}
|
||||||
|
index = HCL_OOP_TO_SMOOI(pos);
|
||||||
|
|
||||||
|
obj->slot[index] = val;
|
||||||
|
HCL_STACK_SETRET (hcl, nargs, val);
|
||||||
|
return HCL_PF_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static hcl_pfinfo_t pfinfos[] =
|
static hcl_pfinfo_t pfinfos[] =
|
||||||
{
|
{
|
||||||
{ { 'c','l','a','s','s','_','n','a','m','e','\0' }, { HCL_PFBASE_FUNC, pf_core_get_class_name, 1, 1 } },
|
{ { 'c','l','a','s','s','_','n','a','m','e','\0' }, { HCL_PFBASE_FUNC, pf_core_get_class_name, 1, 1 } },
|
||||||
/*
|
{ { 'g','e','t','\0' }, { HCL_PFBASE_FUNC, pf_core_get, 2, 2 } },
|
||||||
{ { 'l','e','n','g','t','h','\0' }, { HCL_PFBASE_FUNC, pf_core_size, 1, 1 } },
|
{ { 'l','e','n','g','t','h','\0' }, { HCL_PFBASE_FUNC, pf_core_size, 1, 1 } },
|
||||||
|
/*
|
||||||
{ { 'n','e','w','\0' }, { HCL_PFBASE_FUNC, pf_core_new, 1, 1 } },
|
{ { 'n','e','w','\0' }, { HCL_PFBASE_FUNC, pf_core_new, 1, 1 } },
|
||||||
{ { 'p','u','t','\0' }, { HCL_PFBASE_FUNC, pf_core_put, 3, 3 } },
|
{ { 'p','u','t','\0' }, { HCL_PFBASE_FUNC, pf_core_put, 3, 3 } },
|
||||||
|
*/
|
||||||
{ { 's','i','z','e','\0' }, { HCL_PFBASE_FUNC, pf_core_size, 1, 1 } },
|
{ { 's','i','z','e','\0' }, { HCL_PFBASE_FUNC, pf_core_size, 1, 1 } },
|
||||||
{ { 's','l','i','c','e','\0' }, { HCL_PFBASE_FUNC, pf_core_slice, 3, 3 } }
|
{ { 's','l','i','c','e','\0' }, { HCL_PFBASE_FUNC, pf_core_slice, 3, 3 } }
|
||||||
*/
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
@ -10,21 +10,25 @@ class Collection :: Object {
|
|||||||
class IndexedCollection :: Collection {
|
class IndexedCollection :: Collection {
|
||||||
}
|
}
|
||||||
|
|
||||||
class FixedSizedCollection :: Collection {
|
class FixedSizedCollection :: IndexedCollection {
|
||||||
}
|
}
|
||||||
|
|
||||||
class Array :: FixedSizedCollection {
|
class Array :: FixedSizedCollection {
|
||||||
}
|
}
|
||||||
|
|
||||||
class String :: Array {
|
class String :: FixedSizedCollection {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Collection:length() {
|
fun Collection:length() {
|
||||||
return (arr.length self)
|
return (core.length self)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Collection:slice(index count) {
|
fun Collection:slice(index count) {
|
||||||
return (arr.slice self index count)
|
return (core.slice self index count)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Collection:at(index) {
|
||||||
|
return (core.get self index)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Class:name() {
|
fun Class:name() {
|
||||||
@ -50,3 +54,5 @@ fun Class:name() {
|
|||||||
|
|
||||||
|
|
||||||
printf "string length %d\n" ("aaaa":length)
|
printf "string length %d\n" ("aaaa":length)
|
||||||
|
printf "substring [%s]\n" ("abcdefghijklmn":slice 5 6)
|
||||||
|
printf "substring [%c]\n" ("abcdefghijklmn":at 14)
|
||||||
|
Loading…
Reference in New Issue
Block a user