Skip to content
  • Koichi Sasada's avatar
    71fee9bc
    vm_invoke_builtin_delegate with start index. · 71fee9bc
    Koichi Sasada authored
    opt_invokebuiltin_delegate and opt_invokebuiltin_delegate_leave
    invokes builtin functions with same parameters of the method.
    This technique eliminate stack push operations. However, delegation
    parameters should be completely same as given parameters.
    (e.g. `def foo(a, b, c) __builtin_foo(a, b, c)` is okay, but
    __builtin_foo(b, c) is not allowed)
    
    This patch relaxes this restriction. ISeq has a local variables
    table which includes parameters. For example, the method defined
    as `def foo(a, b, c) x=y=nil`, then local variables table contains
    [a, b, c, x, y]. If calling builtin-function with arguments which
    are sub-array of the lvar table, use opt_invokebuiltin_delegate
    instruction with start index. For example, `__builtin_foo(b, c)`,
    `__builtin_bar(c, x, y)` is okay, and so on.
    71fee9bc
    vm_invoke_builtin_delegate with start index.
    Koichi Sasada authored
    opt_invokebuiltin_delegate and opt_invokebuiltin_delegate_leave
    invokes builtin functions with same parameters of the method.
    This technique eliminate stack push operations. However, delegation
    parameters should be completely same as given parameters.
    (e.g. `def foo(a, b, c) __builtin_foo(a, b, c)` is okay, but
    __builtin_foo(b, c) is not allowed)
    
    This patch relaxes this restriction. ISeq has a local variables
    table which includes parameters. For example, the method defined
    as `def foo(a, b, c) x=y=nil`, then local variables table contains
    [a, b, c, x, y]. If calling builtin-function with arguments which
    are sub-array of the lvar table, use opt_invokebuiltin_delegate
    instruction with start index. For example, `__builtin_foo(b, c)`,
    `__builtin_bar(c, x, y)` is okay, and so on.
Loading