Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
yhara committed Jan 9, 2022
1 parent 65b0193 commit c574a17
Show file tree
Hide file tree
Showing 8 changed files with 79 additions and 57 deletions.
3 changes: 1 addition & 2 deletions builtin/class.sk
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
class Class
# (Class.new is not considered a public API)
# Called when a class object is created
def initialize(@name: String, vtable: Object, metacls_obj: Object)
def initialize(@name: String, vtable: Object, metacls_obj: Metaclass)
@specialized_classes = _initialize_rustlib(vtable, metacls_obj)
end

def <>(tyargs: Array<Class>) -> SpecializedClass
p tyargs[0]
self._specialize(tyargs)
end

Expand Down
19 changes: 10 additions & 9 deletions builtin/metaclass.sk
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
# Class of metaclasses
# see also: src/corelib/
class Metaclass : Class
def initialize(@name: String, @base_name: String)
end
# def initialize(@name: String, @base_name: String)
# end

def name -> String
if @base_name == "Metaclass"
"Metaclass"
else
"Meta:" + @base_name
end
end
# TODO
# def name -> String
# if @base_name == "Metaclass"
# "Metaclass"
# else
# "Meta:" + @base_name
# end
# end

def inspect -> String
"#<metaclass " + self.name + ">"
Expand Down
44 changes: 37 additions & 7 deletions lib/skc_codegen/src/gen_exprs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1023,12 +1023,36 @@ impl<'hir, 'run, 'ictx> CodeGen<'hir, 'run, 'ictx> {
} else {
// Create metaclass object (eg. `#<metaclass Meta:Int>`, which is
// the return value of `Int.class`)
let metacls_obj = self.allocate_sk_obj(&class_fullname("Metaclass"), "metaclass_obj");
self.build_ivar_store(
&metacls_obj,
skc_corelib::metaclass::IVAR_BASE_NAME_IDX,
self.gen_string_literal(str_literal_idx),
"@base_name",
// let metacls_obj = self.allocate_sk_obj(&class_fullname("Metaclass"), "metaclass_obj");
// self.build_ivar_store(
// &metacls_obj,
// skc_corelib::class::IVAR_NAME_IDX,
// self.gen_string_literal(str_literal_idx),
// "@name",
// );
// self.build_ivar_store(
// &metacls_obj,
// skc_corelib::metaclass::IVAR_BASE_NAME_IDX,
// self.gen_string_literal(str_literal_idx),
// "@base_name",
// );
let the_metaclass = self.gen_const_ref(&toplevel_const("Metaclass"));
let receiver = self
.llvm_type(&ty::meta("Metaclass"))
.into_pointer_type()
.const_null();
// Call `Metaclass.new`
let vtable = self
.get_vtable_of_class(&class_fullname("Metaclass"))
.as_sk_obj();
let metacls_obj = self.gen_method_func_call(
&method_fullname(&metaclass_fullname("Metaclass"), "new"),
SkObj(receiver.into()),
vec![
self.gen_string_literal(str_literal_idx),
self.bitcast(vtable, &ty::raw("Object"), "as"),
self.bitcast(the_metaclass, &ty::raw("Metaclass"), "as"),
],
);

// Create class object (eg. `#<class Int>`, which is the value of `::Int`)
Expand All @@ -1045,7 +1069,7 @@ impl<'hir, 'run, 'ictx> CodeGen<'hir, 'run, 'ictx> {
vec![
self.gen_string_literal(str_literal_idx),
self.bitcast(vtable, &ty::raw("Object"), "as"),
self.bitcast(metacls_obj, &ty::raw("Object"), "as"),
self.bitcast(metacls_obj, &ty::raw("Metaclass"), "as"),
],
);
self.bitcast(cls, clsobj_ty, "as")
Expand All @@ -1061,6 +1085,12 @@ impl<'hir, 'run, 'ictx> CodeGen<'hir, 'run, 'ictx> {
"the_metaclass",
SkClassObj(null),
);
self.build_ivar_store(
&cls_obj,
skc_corelib::class::IVAR_NAME_IDX,
self.gen_string_literal(str_literal_idx),
"@name",
);
self.build_ivar_store(
&cls_obj,
skc_corelib::metaclass::IVAR_BASE_NAME_IDX,
Expand Down
12 changes: 8 additions & 4 deletions lib/skc_rustlib/src/builtin/array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,16 +49,20 @@ pub struct SkAryIter<'ary> {
idx: usize,
}

impl<'a> Iterator for SkAryIter<'a> {
impl<'ary> Iterator for SkAryIter<'ary> {
type Item = *const ShiikaObject;

fn next(&mut self) -> Option<Self::Item> {
if self.idx >= self.sk_ary.len() {
None
} else {
let obj = array_get(self.sk_ary.dup(), SkInt::new(self.idx as i64));
self.idx += 1;
Some(obj)
unsafe {
let items_ptr = (*self.sk_ary.0).items.unbox() as *const *const ShiikaObject;
let item_ptr = items_ptr.offset(self.idx as isize);
self.idx += 1;
Some(*item_ptr)
}
//Some(obj)
}
}
}
12 changes: 0 additions & 12 deletions lib/skc_rustlib/src/builtin/class.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,18 +56,6 @@ pub struct ShiikaClass {
specialized_classes: *mut HashMap<String, *mut ShiikaClass>,
}

//#[shiika_method("Class#_vtable")]
//#[allow(non_snake_case)]
//pub extern "C" fn class__vtable(receiver: *mut ShiikaClass) -> *const u8 {
// unsafe { (*receiver).vtable }
//}

//#[shiika_method("Class#_metacls_obj")]
//#[allow(non_snake_case)]
//pub extern "C" fn class__metacls_obj(receiver: *mut ShiikaClass) -> *const ShiikaClass {
// unsafe { (*receiver).metacls_obj }
//}

#[shiika_method("Class#_initialize_rustlib")]
#[allow(non_snake_case)]
pub extern "C" fn class__initialize_rustlib(
Expand Down
6 changes: 3 additions & 3 deletions lib/skc_rustlib/src/builtin/object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ pub struct ShiikaObject {
}

impl SkObj {
pub fn new(p: *const ShiikaObject) -> SkObj {
SkObj(p)
}
// pub fn new(p: *const ShiikaObject) -> SkObj {
// SkObj(p)
// }

pub fn class(&self) -> SkClass {
unsafe { (*self.0).class_obj.dup() }
Expand Down
6 changes: 3 additions & 3 deletions lib/skc_rustlib/src/builtin/string.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ impl SkStr {
// SkStr(self.0)
// }

pub fn new(p: *const ShiikaString) -> SkStr {
SkStr(p)
}
// pub fn new(p: *const ShiikaString) -> SkStr {
// SkStr(p)
// }

fn u8ptr(&self) -> *const u8 {
unsafe { (*self.0).ptr.unbox() }
Expand Down
34 changes: 17 additions & 17 deletions tests/sk/class_hierarchy.sk
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
unless Int.name == "Int"; puts "ng Int"; end
unless Int.class.name == "Meta:Int"; puts "ng Meta:Int"; end
unless Int.class.class.name == "Metaclass"; puts "ng Int Metaclass"; end

unless Class.name == "Class"; puts "ng Class"; end
unless Class.class.name == "Meta:Class"; puts "ng Meta:Class"; end
unless Class.class.class.name == "Metaclass"; puts "ng Class Metaclass"; end

metaclass = Int.class.class
unless Metaclass == metaclass; puts "ng Metaclass"; end
unless metaclass.name == "Metaclass"; puts "ng Metaclass"; end
unless metaclass.class == Metaclass; puts "ng metaclass.class"; end

unless Array<Int>.new.class == Array<Int>; puts "ng Array<Int>"; end
unless [1].class == Array<Int>; puts "ng [1].class"; end
unless Array<Int>.name == "Array<Int>"; puts "ng Array<Int>.name"; end

#unless Int.name == "Int"; puts "ng Int"; end
#unless Int.class.name == "Meta:Int"; puts "ng Meta:Int"; end
#unless Int.class.class.name == "Metaclass"; puts "ng Int Metaclass"; end
#
#unless Class.name == "Class"; puts "ng Class"; end
#unless Class.class.name == "Meta:Class"; puts "ng Meta:Class"; end
#unless Class.class.class.name == "Metaclass"; puts "ng Class Metaclass"; end
#
#metaclass = Int.class.class
#unless Metaclass == metaclass; puts "ng Metaclass"; end
#unless metaclass.name == "Metaclass"; puts "ng Metaclass"; end
#unless metaclass.class == Metaclass; puts "ng metaclass.class"; end
#
#unless Array<Int>.new.class == Array<Int>; puts "ng Array<Int>"; end
#unless [1].class == Array<Int>; puts "ng [1].class"; end
#unless Array<Int>.name == "Array<Int>"; puts "ng Array<Int>.name"; end
#
puts "ok"

0 comments on commit c574a17

Please sign in to comment.