小编bch*_*ill的帖子

metaprograming String#scan和globals?

我的目标是String用其他方法替换类中的方法(这是针对研究项目).通过在String类中编写代码,这适用于许多方法

alias_method :center_OLD, :center
def center(args*)
  r = self.send(*([:center_OLD] + args))
  #do some work here 
  #return something
end
Run Code Online (Sandbox Code Playgroud)

对于某些方法,我也需要处理Proc,这没问题.但是,对于该scan方法,调用它具有从正则表达式匹配设置特殊全局变量的副作用.如文档所述,这些变量是线程和方法的本地变量.

不幸的是,一些Rails代码调用scan使用$&变量.该变量在我的scan方法版本中设置,但因为它是本地的,它不会使它回到使用该变量的原始调用者.

有没有人知道解决这个问题的方法?如果问题需要澄清,请告诉我.

如果它$&有所帮助,我到目前为止看到的变量的所有用途都在Proc传递给scan函数内部,所以我可以获得该Proc的绑定.但是,用户似乎根本无法改变$&,因此我不知道这将有多大帮助.

现行守则

class String
  alias_method :scan_OLD, :scan
  def scan(*args, &b)
    begin

      sargs = [:scan_OLD] + args

      if b.class == Proc
        r = self.send(*sargs, &b)
      else
        r = self.send(*sargs)
      end
      r

    rescue => error
      puts error.backtrace.join("\n")
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

当然,我会在返回之前做更多的事情 …

ruby metaprogramming ruby-on-rails

8
推荐指数
1
解决办法
210
查看次数

PTRACE_SINGLESTEP是如何实现的?

据我所知(我可能是错的),没有办法在x86-64系统上执行一条指令.也许您可以执行"ud2"操作码后面的指令来触发信号 - 但是您必须担心指令修改控制流并转到其他地方.

但是,如果我理解正确,ptrace()系统调用具有一个SINGLESTEP选项,它只执行一条指令.这是如何实现的?我无法想象内核有某种反汇编程序来识别它的指令和原因.那么,是否有一些我不知道的建筑功能呢?还是完全不同的东西?

linux x86 assembly x86-64

2
推荐指数
1
解决办法
496
查看次数

覆盖对main()的调用?

我正在开发一个项目,我们有几个可共享多个目标文件的可执行文件.我们希望将日志记录添加到所有可执行文件中,并且有一个库可以执行此操作.

但是,转到main()每个可执行文件的功能并添加相同的样板函数调用以启动日志记录似乎很笨拙.这意味着我们再次写同样的东西,并且在可维护性和DRY("不要重复自己")上松了一口气.如果我们能够系统地确保在调用main函数之前开始记录,那将是很好的.

我发现在libc ++中有一些函数可以调用main,也可以覆盖它们.但是,我不知道它们是什么,并想象如果我们不小心,这可能会破坏它们.有谁知道如何做到这一点?或者,如果这太过分了,还有其他关于如何进行的建议吗?

如果它有任何区别,我们正在使用带有g ++ 4.8的C++ 11.

c++ libc++

0
推荐指数
1
解决办法
103
查看次数

标签 统计

assembly ×1

c++ ×1

libc++ ×1

linux ×1

metaprogramming ×1

ruby ×1

ruby-on-rails ×1

x86 ×1

x86-64 ×1