Revision: 4151 http://trac.macosforge.org/projects/ruby/changeset/4151 Author: lsansonetti@apple.com Date: 2010-05-25 15:07:00 -0700 (Tue, 25 May 2010) Log Message: ----------- don't recognize ^v as a CF type + misc cleaning Modified Paths: -------------- MacRuby/trunk/bridgesupport.cpp MacRuby/trunk/bs.c MacRuby/trunk/bs.h MacRuby/trunk/compiler.cpp MacRuby/trunk/objc.h Modified: MacRuby/trunk/bridgesupport.cpp =================================================================== --- MacRuby/trunk/bridgesupport.cpp 2010-05-25 20:48:34 UTC (rev 4150) +++ MacRuby/trunk/bridgesupport.cpp 2010-05-25 22:07:00 UTC (rev 4151) @@ -1252,6 +1252,11 @@ case BS_ELEMENT_CFTYPE: { bs_element_cftype_t *bs_cftype = (bs_element_cftype_t *)value; + assert(bs_cftype->type[0] == _C_PTR); + if (bs_cftype->type[1] == _C_VOID) { + // Do not register ^v as a valid CFType. + break; + } std::map<std::string, bs_element_cftype_t *>::iterator iter = bs_cftypes.find(bs_cftype->type); if (iter == bs_cftypes.end()) { Modified: MacRuby/trunk/bs.c =================================================================== --- MacRuby/trunk/bs.c 2010-05-25 20:48:34 UTC (rev 4150) +++ MacRuby/trunk/bs.c 2010-05-25 22:07:00 UTC (rev 4151) @@ -1075,7 +1075,7 @@ free(fptr_args[i].type); } snprintf(new_type, sizeof(new_type), - "%c%s%c", _C_FPTR_B, tmp_type, _C_FPTR_E); + "%c%s%c", _MR_C_FPTR_B, tmp_type, _MR_C_FPTR_E); if (atom->val == BS_XML_RETVAL) { bs_element_retval_t *retval = Modified: MacRuby/trunk/bs.h =================================================================== --- MacRuby/trunk/bs.h 2010-05-25 20:48:34 UTC (rev 4150) +++ MacRuby/trunk/bs.h 2010-05-25 22:07:00 UTC (rev 4151) @@ -37,8 +37,8 @@ #include <objc/runtime.h> /* Extend objc/runtime.h and add function pointers tokens */ -#define _C_FPTR_B '<' -#define _C_FPTR_E '>' +#define _MR_C_FPTR_B '<' +#define _MR_C_FPTR_E '>' /* Attribute and element representations. * See BridgeSupport(5) for more information. Modified: MacRuby/trunk/compiler.cpp =================================================================== --- MacRuby/trunk/compiler.cpp 2010-05-25 20:48:34 UTC (rev 4150) +++ MacRuby/trunk/compiler.cpp 2010-05-25 22:07:00 UTC (rev 4151) @@ -5248,7 +5248,8 @@ { type = SkipTypeModifiers(type); - if (*type == _C_PTR && GET_CORE()->find_bs_cftype(type) != NULL) { + if (type[0] == _C_PTR && type[1] != _C_VOID + && GET_CORE()->find_bs_cftype(type) != NULL) { type = "@"; } @@ -5377,7 +5378,7 @@ } break; - case _C_FPTR_B: + case _MR_C_FPTR_B: { GlobalVariable *proc_gvar = new GlobalVariable(*RoxorCompiler::module, @@ -5395,7 +5396,7 @@ std::vector<std::string> arg_ctypes; std::vector<const Type *> arg_types; - while (*p != _C_FPTR_E) { + while (*p != _MR_C_FPTR_E) { p = GetFirstType(p, buf, buf_len); arg_ctypes.push_back(std::string(buf)); arg_types.push_back(convert_type(buf)); @@ -5606,7 +5607,8 @@ { type = SkipTypeModifiers(type); - if (*type == _C_PTR && GET_CORE()->find_bs_cftype(type) != NULL) { + if (type[0] == _C_PTR && type[1] != _C_VOID + && GET_CORE()->find_bs_cftype(type) != NULL) { type = "@"; } @@ -5826,7 +5828,7 @@ } break; - case _C_FPTR_B: + case _MR_C_FPTR_B: return PtrTy; case _C_STRUCT_B: @@ -6256,6 +6258,9 @@ arg_types.push_back(buf); } + free(buf); + buf = NULL; + // Create the function. FunctionType *ft = FunctionType::get(f_ret_type, f_types, false); Function *f = cast<Function>(module->getOrInsertFunction("", ft)); @@ -6316,9 +6321,10 @@ } // Call the Ruby implementation. - Value *ret_val = compile_protected_call(imp, params); + Instruction *ruby_call_insn = compile_protected_call(imp, params); // Convert the return value into Objective-C type (if any). + Value *ret_val = ruby_call_insn; if (f_ret_type != VoidTy) { ret_val = compile_conversion_to_c(ret_type.c_str(), ret_val, new AllocaInst(f_ret_type, "", bb)); @@ -6353,7 +6359,11 @@ rescue_invoke_bb = old_rescue_invoke_bb; #endif - free(buf); + // Now that the function is finished, we can inline the Ruby method. + if (CallInst::classof(ruby_call_insn)) { + CallInst *insn = cast<CallInst>(ruby_call_insn); + InlineFunction(insn); + } return f; } Modified: MacRuby/trunk/objc.h =================================================================== --- MacRuby/trunk/objc.h 2010-05-25 20:48:34 UTC (rev 4150) +++ MacRuby/trunk/objc.h 2010-05-25 22:07:00 UTC (rev 4151) @@ -118,30 +118,30 @@ { while (1) { switch (*type++) { + case _C_CONST: + case _C_PTR: case 'O': /* bycopy */ case 'n': /* in */ case 'o': /* out */ case 'N': /* inout */ - case 'r': /* const */ case 'V': /* oneway */ - case '^': /* pointers */ break; /* arrays */ - case '[': - return type + SubtypeUntil (type, ']') + 1; + case _C_ARY_B: + return type + SubtypeUntil (type, _C_ARY_E) + 1; /* structures */ - case '{': - return type + SubtypeUntil (type, '}') + 1; + case _C_STRUCT_B: + return type + SubtypeUntil (type, _C_STRUCT_E) + 1; /* unions */ - case '(': - return type + SubtypeUntil (type, ')') + 1; + case _C_UNION_B: + return type + SubtypeUntil (type, _C_UNION_E) + 1; /* Function pointers */ - case '<': - return type + SubtypeUntil (type, '>') + 1; + case _MR_C_FPTR_B: + return type + SubtypeUntil (type, _MR_C_FPTR_E) + 1; /* basic types */ default:
participants (1)
-
source_changes@macosforge.org