Revision: 1501 http://trac.macosforge.org/projects/ruby/changeset/1501 Author: lsansonetti@apple.com Date: 2009-04-28 15:53:43 -0700 (Tue, 28 Apr 2009) Log Message: ----------- when passing a Pointer object as '^', compare the encoding types and raise TypeError if necessary Modified Paths: -------------- MacRuby/branches/experimental/roxor.cpp MacRuby/branches/experimental/spec/macruby/objc_method_spec.rb Modified: MacRuby/branches/experimental/roxor.cpp =================================================================== --- MacRuby/branches/experimental/roxor.cpp 2009-04-28 05:53:14 UTC (rev 1500) +++ MacRuby/branches/experimental/roxor.cpp 2009-04-28 22:53:43 UTC (rev 1501) @@ -273,6 +273,7 @@ Function *newOpaqueFunc; Function *getStructFieldsFunc; Function *getOpaqueDataFunc; + Function *getPointerPtrFunc; Function *checkArityFunc; Function *setStructFunc; Function *newRangeFunc; @@ -363,6 +364,7 @@ rb_vm_bs_boxed_t *bs_boxed); Value *compile_get_opaque_data(Value *val, rb_vm_bs_boxed_t *bs_boxed, Value *slot); + Value *compile_get_cptr(Value *val, const char *type, Value *slot); void compile_check_arity(Value *given, Value *requested); void compile_set_struct(Value *rcv, int field, Value *val); @@ -698,6 +700,7 @@ newOpaqueFunc = NULL; getStructFieldsFunc = NULL; getOpaqueDataFunc = NULL; + getPointerPtrFunc = NULL; checkArityFunc = NULL; setStructFunc = NULL; newRangeFunc = NULL; @@ -5070,24 +5073,19 @@ *ocval = (float)rval_to_double(rval); } -static void *rb_pointer_get_data(VALUE rcv); +static void *rb_pointer_get_data(VALUE rcv, const char *type); extern "C" -void -rb_vm_rval_to_cptr(VALUE rval, void **cptr) +void * +rb_vm_rval_to_cptr(VALUE rval, const char *type, void **cptr) { if (NIL_P(rval)) { *cptr = NULL; } else { - if (!rb_obj_is_kind_of(rval, rb_cPointer)) { - rb_raise(rb_eTypeError, - "expected instance of Pointer, got `%s' (%s)", - RSTRING_PTR(rb_inspect(rval)), - rb_obj_classname(rval)); - } - *cptr = rb_pointer_get_data(rval); + *cptr = rb_pointer_get_data(rval, type); } + return *cptr; } static inline long @@ -5229,11 +5227,27 @@ params.push_back(compile_const_pointer(bs_boxed)); params.push_back(slot); - return CallInst::Create(getOpaqueDataFunc, params.begin(), params.end(), - "", bb); + return compile_protected_call(getOpaqueDataFunc, params); } Value * +RoxorCompiler::compile_get_cptr(Value *val, const char *type, Value *slot) +{ + if (getPointerPtrFunc == NULL) { + getPointerPtrFunc = cast<Function>(module->getOrInsertFunction( + "rb_vm_rval_to_cptr", + PtrTy, RubyObjTy, PtrTy, PtrPtrTy, NULL)); + } + + std::vector<Value *> params; + params.push_back(val); + params.push_back(compile_const_pointer(sel_registerName(type))); + params.push_back(new BitCastInst(slot, PtrPtrTy, "", bb)); + + return compile_protected_call(getPointerPtrFunc, params); +} + +Value * RoxorCompiler::compile_conversion_to_c(const char *type, Value *val, Value *slot) { @@ -5357,7 +5371,7 @@ return compile_get_opaque_data(val, bs_boxed, slot); } - func_name = "rb_vm_rval_to_cptr"; + return compile_get_cptr(val, type, slot); } break; } @@ -9137,11 +9151,26 @@ } static void * -rb_pointer_get_data(VALUE rcv) +rb_pointer_get_data(VALUE rcv, const char *type) { + if (!rb_obj_is_kind_of(rcv, rb_cPointer)) { + rb_raise(rb_eTypeError, + "expected instance of Pointer, got `%s' (%s)", + RSTRING_PTR(rb_inspect(rcv)), + rb_obj_classname(rcv)); + } + rb_vm_pointer_t *ptr; Data_Get_Struct(rcv, rb_vm_pointer_t, ptr); + assert(*type == _C_PTR); + if (strcmp(RSTRING_PTR(ptr->type), type + 1) != 0) { + rb_raise(rb_eTypeError, + "expected instance of Pointer of type `%s', got `%s'", + RSTRING_PTR(ptr->type), + type + 1); + } + return ptr->val; } Modified: MacRuby/branches/experimental/spec/macruby/objc_method_spec.rb =================================================================== --- MacRuby/branches/experimental/spec/macruby/objc_method_spec.rb 2009-04-28 05:53:14 UTC (rev 1500) +++ MacRuby/branches/experimental/spec/macruby/objc_method_spec.rb 2009-04-28 22:53:43 UTC (rev 1501) @@ -372,9 +372,12 @@ @o.methodAcceptingIntPtr(p).should == 1 p[0].should == 43 + lambda { @o.methodAcceptingIntPtr(Pointer.new(:uint)) }.should raise_error(TypeError) lambda { @o.methodAcceptingIntPtr(123) }.should raise_error(TypeError) @o.methodAcceptingIntPtr2(nil).should == 1 + + lambda { @o.methodAcceptingIntPtr2(Pointer.new(:uint)) }.should raise_error(TypeError) end it "accepting an 'id *' should be given a Pointer object and receive the pointer as expected" do @@ -383,9 +386,12 @@ @o.methodAcceptingObjectPtr(p).should == 1 p[0].should == NSObject + lambda { @o.methodAcceptingObjectPtr(Pointer.new(:int)) }.should raise_error(TypeError) lambda { @o.methodAcceptingObjectPtr(123) }.should raise_error(TypeError) @o.methodAcceptingObjectPtr2(nil).should == 1 + + lambda { @o.methodAcceptingObjectPtr2(Pointer.new(:int)) }.should raise_error(TypeError) end it "accepting an 'NSRect *' should be given a Pointer object and receive the pointer as expected" do @@ -397,8 +403,11 @@ p[0].size.width.should == 44 p[0].size.height.should == 45 + lambda { @o.methodAcceptingNSRectPtr(Pointer.new(NSPoint.type)) }.should raise_error(TypeError) lambda { @o.methodAcceptingNSRectPtr(123) }.should raise_error(TypeError) @o.methodAcceptingNSRectPtr2(nil).should == 1 + + lambda { @o.methodAcceptingNSRectPtr2(Pointer.new(NSPoint.type)) }.should raise_error(TypeError) end end
participants (1)
-
source_changes@macosforge.org