[macruby-changes] [1491] MacRuby/branches/experimental/roxor.cpp
source_changes at macosforge.org
source_changes at macosforge.org
Sun Apr 26 01:26:48 PDT 2009
Revision: 1491
http://trac.macosforge.org/projects/ruby/changeset/1491
Author: lsansonetti at apple.com
Date: 2009-04-26 01:26:47 -0700 (Sun, 26 Apr 2009)
Log Message:
-----------
support float/double FFI types + fixed a problem when calling the stub with arguments (this will be optimized later, though)
Modified Paths:
--------------
MacRuby/branches/experimental/roxor.cpp
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-04-26 02:25:59 UTC (rev 1490)
+++ MacRuby/branches/experimental/roxor.cpp 2009-04-26 08:26:47 UTC (rev 1491)
@@ -9346,6 +9346,12 @@
if (strcmp(typestr, "ulong_long") == 0) {
return "Q";
}
+ if (strcmp(typestr, "float") == 0) {
+ return "f";
+ }
+ if (strcmp(typestr, "double") == 0) {
+ return "d";
+ }
if (strcmp(typestr, "string") == 0) {
return "*";
}
@@ -9361,7 +9367,8 @@
RoxorCompiler::compile_ffi_function(void *stub, void *imp, int argc)
{
// VALUE func(VALUE rcv, SEL sel, VALUE arg1, VALUE arg2, ...) {
- // return stub(imp, arg2, arg1, ...);
+ // VALUE *argv = alloca(...);
+ // return stub(imp, argc, argv);
// }
std::vector<const Type *> f_types;
f_types.push_back(RubyObjTy);
@@ -9385,11 +9392,26 @@
params.push_back(compile_const_pointer(imp));
stub_types.push_back(PtrTy);
- // Following arguments are the given arguments.
- for (int i = 0; i < argc; i++) {
- params.push_back(arg++);
- stub_types.push_back(RubyObjTy);
+ // Second argument is arity;
+ params.push_back(ConstantInt::get(Type::Int32Ty, argc));
+ stub_types.push_back(Type::Int32Ty);
+
+ // Third is an array of arguments.
+ Value *argv;
+ if (argc == 0) {
+ argv = compile_const_pointer(NULL);
}
+ else {
+ argv = new AllocaInst(RubyObjTy, ConstantInt::get(Type::Int32Ty, argc),
+ "", bb);
+ for (int i = 0; i < argc; i++) {
+ Value *index = ConstantInt::get(Type::Int32Ty, i);
+ Value *slot = GetElementPtrInst::Create(argv, index, "", bb);
+ new StoreInst(arg++, slot, "", bb);
+ }
+ }
+ params.push_back(argv);
+ stub_types.push_back(RubyObjPtrTy);
// Cast the given stub using the correct function signature.
FunctionType *stub_ft = FunctionType::get(RubyObjTy, stub_types, false);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090426/9d74abb4/attachment-0001.html>
More information about the macruby-changes
mailing list