void MethodBuilder::setup_scope() { llvm::Value* args = info_.args(); Value* heap_null = ConstantExpr::getNullValue(llvm::PointerType::getUnqual(vars_type)); Value* heap_pos = get_field(vars, offset::vars_on_heap); b().CreateStore(heap_null, heap_pos); Value* self = b().CreateLoad(get_field(args, offset::args_recv), "args.recv"); b().CreateStore(self, get_field(vars, offset::vars_self)); Value* mod = module; b().CreateStore(mod, get_field(vars, offset::vars_module)); Value* blk = b().CreateLoad(get_field(args, offset::args_block), "args.block"); b().CreateStore(blk, get_field(vars, offset::vars_block)); b().CreateStore(Constant::getNullValue(ls_->ptr_type("VariableScope")), get_field(vars, offset::vars_parent)); b().CreateStore(constant(cNil, obj_type), get_field(vars, offset::vars_last_match)); nil_locals(); }
void InlineMethodBuilder::setup_inline_scope(Value* self, Value* blk, Value* mod) { Value* heap_null = ConstantExpr::getNullValue(llvm::PointerType::getUnqual(vars_type)); Value* heap_pos = get_field(vars, offset::StackVariables::on_heap); b().CreateStore(heap_null, heap_pos); b().CreateStore(self, get_field(vars, offset::StackVariables::self)); b().CreateStore(mod, get_field(vars, offset::StackVariables::module)); b().CreateStore(blk, get_field(vars, offset::StackVariables::block)); b().CreateStore(Constant::getNullValue(ctx_->ptr_type("VariableScope")), get_field(vars, offset::StackVariables::parent)); b().CreateStore(constant(cNil, obj_type), get_field(vars, offset::StackVariables::last_match)); nil_locals(); }
void BlockBuilder::setup_block_scope() { b().CreateStore(ConstantExpr::getNullValue(llvm::PointerType::getUnqual(vars_type)), get_field(vars, offset::vars_on_heap)); Value* self = b().CreateLoad( get_field(block_inv, offset::blockinv_self), "invocation.self"); b().CreateStore(self, get_field(vars, offset::vars_self)); Value* inv_mod = b().CreateLoad( get_field(block_inv, offset::blockinv_module), "invocation.module"); Value* creation_mod = b().CreateLoad( get_field(block_env, offset::blockenv_module), "env.module"); Value* mod = b().CreateSelect( b().CreateICmpNE(inv_mod, ConstantExpr::getNullValue(inv_mod->getType())), inv_mod, creation_mod); module_ = mod; b().CreateStore(mod, get_field(vars, offset::vars_module)); Value* blk = b().CreateLoad(get_field(top_scope, offset::varscope_block), "args.block"); b().CreateStore(blk, get_field(vars, offset::vars_block)); // We don't use top_scope here because of nested blocks. Parent MUST be // the scope the block was created in, not the top scope for depth // variables to work. Value* be_scope = b().CreateLoad( get_field(block_env, offset::blockenv_scope), "env.scope"); b().CreateStore(be_scope, get_field(vars, offset::vars_parent)); b().CreateStore(constant(Qnil, obj_type), get_field(vars, offset::vars_last_match)); nil_locals(); }