public static IRubyObject grep(ThreadContext context, IRubyObject self, final IRubyObject pattern, final Block block) {
final Ruby runtime = context.getRuntime();
final RubyArray result = runtime.newArray();
if (block.isGiven()) {
callEach(runtime, context, self, new BlockCallback() {
public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) {
ctx.setRubyFrameDelta(ctx.getRubyFrameDelta()+2);
if (pattern.callMethod(ctx, MethodIndex.OP_EQQ, "===", largs[0]).isTrue()) {
IRubyObject value = block.yield(ctx, largs[0]);
synchronized (result) {
result.append(value);
}
}
ctx.setRubyFrameDelta(ctx.getRubyFrameDelta()-2);
return runtime.getNil();
}
});
} else {
callEach(runtime, context, self, new BlockCallback() {
public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) {
if (pattern.callMethod(ctx, MethodIndex.OP_EQQ, "===", largs[0]).isTrue()) {
synchronized (result) {
result.append(largs[0]);
}