Revision: 2782 http://trac.macosforge.org/projects/ruby/changeset/2782 Author: lsansonetti@apple.com Date: 2009-10-11 22:35:03 -0700 (Sun, 11 Oct 2009) Log Message: ----------- added support for AOT compilation of literal bignums Modified Paths: -------------- MacRuby/trunk/bignum.c MacRuby/trunk/compiler.cpp Modified: MacRuby/trunk/bignum.c =================================================================== --- MacRuby/trunk/bignum.c 2009-10-12 05:09:01 UTC (rev 2781) +++ MacRuby/trunk/bignum.c 2009-10-12 05:35:03 UTC (rev 2782) @@ -688,6 +688,14 @@ return rb_str_to_inum(str, base, base==0); } +VALUE +rb_bignum_new_retained(const char *str) +{ + VALUE v = rb_cstr2inum(str, 10); + GC_RETAIN(v); + return v; +} + const char ruby_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz"; static VALUE bigsqr(VALUE x); Modified: MacRuby/trunk/compiler.cpp =================================================================== --- MacRuby/trunk/compiler.cpp 2009-10-12 05:09:01 UTC (rev 2781) +++ MacRuby/trunk/compiler.cpp 2009-10-12 05:35:03 UTC (rev 2782) @@ -5294,6 +5294,10 @@ cast<Function>(module->getOrInsertFunction("rb_reg_new_retained", RubyObjTy, PtrTy, Int32Ty, Int32Ty, NULL)); + Function *newBignumFunc = + cast<Function>(module->getOrInsertFunction("rb_bignum_new_retained", + RubyObjTy, PtrTy, NULL)); + Function *getClassFunc = cast<Function>(module->getOrInsertFunction("objc_getClass", RubyObjTy, PtrTy, NULL)); @@ -5399,6 +5403,33 @@ } break; + case T_BIGNUM: + { + const char *bigstr = RSTRING_PTR(rb_big2str(val, 10)); + + GlobalVariable *bigstr_gvar = + compile_const_global_string(bigstr); + + std::vector<Value *> idxs; + idxs.push_back(ConstantInt::get(Int32Ty, 0)); + idxs.push_back(ConstantInt::get(Int32Ty, 0)); + Instruction *load = GetElementPtrInst::Create(bigstr_gvar, + idxs.begin(), idxs.end(), ""); + + std::vector<Value *> params; + params.push_back(load); + + Instruction *call = CallInst::Create(newBignumFunc, + params.begin(), params.end(), ""); + + Instruction *assign = new StoreInst(call, gvar, ""); + + list.insert(list.begin(), assign); + list.insert(list.begin(), call); + list.insert(list.begin(), load); + } + break; + default: if (rb_obj_is_kind_of(val, rb_cRange)) { VALUE beg = 0, end = 0;
participants (1)
-
source_changes@macosforge.org