[macruby-changes] [1518] MacRuby/branches/experimental
source_changes at macosforge.org
source_changes at macosforge.org
Sat May 2 20:05:50 PDT 2009
Revision: 1518
http://trac.macosforge.org/projects/ruby/changeset/1518
Author: lsansonetti at apple.com
Date: 2009-05-02 20:05:49 -0700 (Sat, 02 May 2009)
Log Message:
-----------
added support for CF types bridging
Modified Paths:
--------------
MacRuby/branches/experimental/roxor.cpp
MacRuby/branches/experimental/sample-macruby/Scripts/circle.rb
Added Paths:
-----------
MacRuby/branches/experimental/spec/macruby/cftype_spec.rb
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-05-03 01:02:45 UTC (rev 1517)
+++ MacRuby/branches/experimental/roxor.cpp 2009-05-03 03:05:49 UTC (rev 1518)
@@ -527,6 +527,7 @@
std::map<ID, bs_element_constant_t *> bs_consts;
std::map<std::string, std::map<SEL, bs_element_method_t *> *>
bs_classes_class_methods, bs_classes_instance_methods;
+ std::map<std::string, bs_element_cftype_t *> bs_cftypes;
bs_element_method_t *find_bs_method(Class klass, SEL sel);
rb_vm_bs_boxed_t *find_bs_boxed(std::string type);
@@ -5340,6 +5341,11 @@
type = SkipTypeModifiers(type);
+ if (*type == _C_PTR
+ && GET_VM()->bs_cftypes.find(type) != GET_VM()->bs_cftypes.end()) {
+ type = "@";
+ }
+
switch (*type) {
case _C_ID:
case _C_CLASS:
@@ -5596,6 +5602,11 @@
type = SkipTypeModifiers(type);
+ if (*type == _C_PTR
+ && GET_VM()->bs_cftypes.find(type) != GET_VM()->bs_cftypes.end()) {
+ type = "@";
+ }
+
switch (*type) {
case _C_VOID:
return nilVal;
@@ -5723,7 +5734,7 @@
case _C_ID:
case _C_CLASS:
- return RubyObjTy;
+ return PtrTy;
case _C_SEL:
case _C_CHARPTR:
@@ -9766,12 +9777,18 @@
case BS_ELEMENT_CFTYPE:
{
-#if 0
+
bs_element_cftype_t *bs_cftype = (bs_element_cftype_t *)value;
- st_insert(bs_cftypes, (st_data_t)bs_cftype->type,
- (st_data_t)bs_cftype);
- do_not_free = true;
-#endif
+ std::map<std::string, bs_element_cftype_t *>::iterator
+ iter = GET_VM()->bs_cftypes.find(bs_cftype->type);
+ if (iter == GET_VM()->bs_cftypes.end()) {
+ GET_VM()->bs_cftypes[bs_cftype->type] = bs_cftype;
+ do_not_free = true;
+ }
+ else {
+ rb_warning("bs: CF type `%s' already defined",
+ bs_cftype->type);
+ }
break;
}
}
Modified: MacRuby/branches/experimental/sample-macruby/Scripts/circle.rb
===================================================================
--- MacRuby/branches/experimental/sample-macruby/Scripts/circle.rb 2009-05-03 01:02:45 UTC (rev 1517)
+++ MacRuby/branches/experimental/sample-macruby/Scripts/circle.rb 2009-05-03 03:05:49 UTC (rev 1518)
@@ -2,7 +2,9 @@
framework 'Cocoa'
url = NSURL.fileURLWithPath('circle.pdf')
-pdf = CGPDFContextCreateWithURL(url, [[0, 0], [617, 792]], nil)
+prect = Pointer.new(CGRect.type)
+prect[0] = [[0, 0], [617, 792]]
+pdf = CGPDFContextCreateWithURL(url, prect, nil)
CGPDFContextBeginPage(pdf, nil)
CGContextSetRGBFillColor(pdf, 1.0, 0.0, 0.0, 1.0)
Added: MacRuby/branches/experimental/spec/macruby/cftype_spec.rb
===================================================================
--- MacRuby/branches/experimental/spec/macruby/cftype_spec.rb (rev 0)
+++ MacRuby/branches/experimental/spec/macruby/cftype_spec.rb 2009-05-03 03:05:49 UTC (rev 1518)
@@ -0,0 +1,29 @@
+require File.dirname(__FILE__) + "/spec_helper"
+FixtureCompiler.require! "method"
+
+describe "A CoreFoundation type" do
+ it "behaves like a regular Objective-C/Ruby object" do
+ o = CFBundleGetMainBundle()
+ o.class.should == NSCFType
+ o.inspect.class.should == String
+ end
+
+ it "can be passed to a C/Objective-C API" do
+ o = CFBundleGetMainBundle()
+ CFBundleIsExecutableLoaded(o).should == true
+ end
+
+ it "toll-free bridged to an Objective-C type behaves like the Objective-C version" do
+ s = CFStringCreateWithCString(nil, "foo", KCFStringEncodingUTF8)
+ s.class.should == NSString
+ s.should == 'foo'
+ CFRelease(s)
+ end
+
+ it "can be substitued with the toll-free bridged equivalent" do
+ s = CFStringCreateMutableCopy(nil, 0, "foo")
+ s.class.should == NSMutableString
+ s.should == 'foo'
+ CFRelease(s)
+ end
+end
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090502/97fca0ff/attachment-0001.html>
More information about the macruby-changes
mailing list