This commit introduces a new instruction `opt_newarray_send` which is used when there is an array literal followed by either the `hash`, `min`, or `max` method. ``` [a, b, c].hash ``` Will emit an `opt_newarray_send` instruction. This instruction falls back to a method call if the "interested" method has been monkey patched. Here are some examples of the instructions generated: ``` $ ./miniruby --dump=insns -e '[@a, @b].max' == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,12)> (catch: FALSE) 0000 getinstancevariable :@a, <is:0> ( 1)[Li] 0003 getinstancevariable :@b, <is:1> 0006 opt_newarray_send 2, :max 0009 leave $ ./miniruby --dump=insns -e '[@a, @b].min' == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,12)> (catch: FALSE) 0000 getinstancevariable :@a, <is:0> ( 1)[Li] 0003 getinstancevariable :@b, <is:1> 0006 opt_newarray_send 2, :min 0009 leave $ ./miniruby --dump=insns -e '[@a, @b].hash' == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,13)> (catch: FALSE) 0000 getinstancevariable :@a, <is:0> ( 1)[Li] 0003 getinstancevariable :@b, <is:1> 0006 opt_newarray_send 2, :hash 0009 leave ``` [Feature #18897] [ruby-core:109147] Co-authored-by: John Hawthorn <jhawthorn@github.com>
64 lines
1.4 KiB
C
64 lines
1.4 KiB
C
#ifndef INTERNAL_BOP_H /*-*-C-*-vi:se ft=c:*/
|
|
#define INTERNAL_BOP_H
|
|
|
|
#include "internal.h"
|
|
#include "ruby/internal/dllexport.h"
|
|
|
|
enum ruby_basic_operators {
|
|
BOP_PLUS,
|
|
BOP_MINUS,
|
|
BOP_MULT,
|
|
BOP_DIV,
|
|
BOP_MOD,
|
|
BOP_EQ,
|
|
BOP_EQQ,
|
|
BOP_LT,
|
|
BOP_LE,
|
|
BOP_LTLT,
|
|
BOP_AREF,
|
|
BOP_ASET,
|
|
BOP_LENGTH,
|
|
BOP_SIZE,
|
|
BOP_EMPTY_P,
|
|
BOP_NIL_P,
|
|
BOP_SUCC,
|
|
BOP_GT,
|
|
BOP_GE,
|
|
BOP_NOT,
|
|
BOP_NEQ,
|
|
BOP_MATCH,
|
|
BOP_FREEZE,
|
|
BOP_UMINUS,
|
|
BOP_MAX,
|
|
BOP_MIN,
|
|
BOP_HASH,
|
|
BOP_CALL,
|
|
BOP_AND,
|
|
BOP_OR,
|
|
BOP_CMP,
|
|
BOP_DEFAULT,
|
|
|
|
BOP_LAST_
|
|
};
|
|
|
|
RUBY_EXTERN short ruby_vm_redefined_flag[BOP_LAST_];
|
|
|
|
/* optimize insn */
|
|
#define INTEGER_REDEFINED_OP_FLAG (1 << 0)
|
|
#define FLOAT_REDEFINED_OP_FLAG (1 << 1)
|
|
#define STRING_REDEFINED_OP_FLAG (1 << 2)
|
|
#define ARRAY_REDEFINED_OP_FLAG (1 << 3)
|
|
#define HASH_REDEFINED_OP_FLAG (1 << 4)
|
|
/* #define BIGNUM_REDEFINED_OP_FLAG (1 << 5) */
|
|
#define SYMBOL_REDEFINED_OP_FLAG (1 << 6)
|
|
#define TIME_REDEFINED_OP_FLAG (1 << 7)
|
|
#define REGEXP_REDEFINED_OP_FLAG (1 << 8)
|
|
#define NIL_REDEFINED_OP_FLAG (1 << 9)
|
|
#define TRUE_REDEFINED_OP_FLAG (1 << 10)
|
|
#define FALSE_REDEFINED_OP_FLAG (1 << 11)
|
|
#define PROC_REDEFINED_OP_FLAG (1 << 12)
|
|
|
|
#define BASIC_OP_UNREDEFINED_P(op, klass) (LIKELY((ruby_vm_redefined_flag[(op)]&(klass)) == 0))
|
|
|
|
#endif
|