[macruby-changes] [1496] MacRuby/branches/experimental/roxor.cpp
source_changes at macosforge.org
source_changes at macosforge.org
Mon Apr 27 20:11:40 PDT 2009
Revision: 1496
http://trac.macosforge.org/projects/ruby/changeset/1496
Author: lsansonetti at apple.com
Date: 2009-04-27 20:11:40 -0700 (Mon, 27 Apr 2009)
Log Message:
-----------
more Pointer work
Modified Paths:
--------------
MacRuby/branches/experimental/roxor.cpp
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-04-28 02:23:44 UTC (rev 1495)
+++ MacRuby/branches/experimental/roxor.cpp 2009-04-28 03:11:40 UTC (rev 1496)
@@ -206,6 +206,8 @@
Function *compile_to_rval_convertor(const char *type);
Function *compile_to_ocval_convertor(const char *type);
+ const Type *convert_type(const char *type);
+
private:
const char *fname;
@@ -391,7 +393,6 @@
BasicBlock::InstListType::iterator iter);
bool unbox_ruby_constant(Value *val, VALUE *rval);
SEL mid_to_sel(ID mid, int arity);
- const Type *convert_type(const char *type);
};
llvm::Module *RoxorCompiler::module = NULL;
@@ -630,6 +631,10 @@
return ee->getTargetData()->getTypeSizeInBits(type) / 8;
}
+ size_t get_sizeof(const char *type) {
+ return get_sizeof(RoxorCompiler::shared->convert_type(type));
+ }
+
bool is_large_struct_type(const Type *type) {
return type->getTypeID() == Type::StructTyID
&& ee->getTargetData()->getTypeSizeInBits(type) > 128;
@@ -9074,8 +9079,9 @@
typedef struct {
VALUE type;
+ size_t type_size;
VALUE (*convert_to_rval)(void *);
- void (*convert_to_ocval)(VALUE rval, void **);
+ void (*convert_to_ocval)(VALUE rval, void *);
void *val;
} rb_vm_pointer_t;
@@ -9091,35 +9097,52 @@
ptr->convert_to_rval =
(VALUE (*)(void *))GET_VM()->gen_to_rval_convertor(type_str);
ptr->convert_to_ocval =
- (void (*)(VALUE, void **))GET_VM()->gen_to_ocval_convertor(type_str);
- ptr->val = NULL; // TODO
+ (void (*)(VALUE, void *))GET_VM()->gen_to_ocval_convertor(type_str);
+ ptr->type_size = GET_VM()->get_sizeof(type_str);
+ assert(ptr->type_size > 0);
+ GC_WB(&ptr->val, xmalloc(ptr->type_size));
+
return Data_Wrap_Struct(rb_cPointer, NULL, NULL, ptr);
}
+#define POINTER_VAL(ptr, idx) \
+ (void *)((char *)ptr->val + (FIX2INT(idx) * ptr->type_size))
+
static VALUE
rb_pointer_aref(VALUE rcv, SEL sel, VALUE idx)
{
- return Qnil;
+ Check_Type(idx, T_FIXNUM);
+
+ rb_vm_pointer_t *ptr;
+ Data_Get_Struct(rcv, rb_vm_pointer_t, ptr);
+
+ return ptr->convert_to_rval(POINTER_VAL(ptr, idx));
}
static VALUE
-rb_pointer_asef(VALUE rcv, SEL sel, VALUE idx, VALUE val)
+rb_pointer_aset(VALUE rcv, SEL sel, VALUE idx, VALUE val)
{
- return Qnil;
+ Check_Type(idx, T_FIXNUM);
+
+ rb_vm_pointer_t *ptr;
+ Data_Get_Struct(rcv, rb_vm_pointer_t, ptr);
+
+ ptr->convert_to_ocval(val, POINTER_VAL(ptr, idx));
+
+ return val;
}
static VALUE
rb_pointer_assign(VALUE rcv, SEL sel, VALUE val)
{
- return rb_pointer_asef(rcv, 0, FIX2INT(0), val);
+ return rb_pointer_aset(rcv, 0, FIX2INT(0), val);
}
static VALUE
rb_pointer_type(VALUE rcv, SEL sel)
{
rb_vm_pointer_t *ptr;
-
Data_Get_Struct(rcv, rb_vm_pointer_t, ptr);
return ptr->type;
@@ -9144,7 +9167,7 @@
rb_objc_define_method(rb_cPointer, "[]",
(void *)rb_pointer_aref, 1);
rb_objc_define_method(rb_cPointer, "[]=",
- (void *)rb_pointer_asef, 2);
+ (void *)rb_pointer_aset, 2);
rb_objc_define_method(rb_cPointer, "assign",
(void *)rb_pointer_assign, 1);
rb_objc_define_method(rb_cPointer, "type",
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090427/53748409/attachment.html>
More information about the macruby-changes
mailing list