[Feature #16254] Allow `Primitive.func` style

This commit is contained in:
Nobuyoshi Nakada 2020-05-31 15:51:40 +09:00
Родитель d863f4bccd
Коммит 49f0fd21e4
2 изменённых файлов: 17 добавлений и 3 удалений

Просмотреть файл

@ -7045,7 +7045,8 @@ iseq_builtin_function_name(const enum node_type type, const NODE *recv, ID mid)
static const char prefix[] = "__builtin_"; static const char prefix[] = "__builtin_";
const size_t prefix_len = sizeof(prefix) - 1; const size_t prefix_len = sizeof(prefix) - 1;
if (type == NODE_CALL) { switch (type) {
case NODE_CALL:
if (recv) { if (recv) {
switch (nd_type(recv)) { switch (nd_type(recv)) {
case NODE_VCALL: case NODE_VCALL:
@ -7053,14 +7054,22 @@ iseq_builtin_function_name(const enum node_type type, const NODE *recv, ID mid)
return name; return name;
} }
break; break;
case NODE_CONST:
if (recv->nd_vid == rb_intern("Primitive")) {
return name;
}
break;
default: break; default: break;
} }
} }
} break;
else if (type == NODE_VCALL || type == NODE_FCALL) { case NODE_VCALL:
case NODE_FCALL:
if (UNLIKELY(strncmp(prefix, name, prefix_len) == 0)) { if (UNLIKELY(strncmp(prefix, name, prefix_len) == 0)) {
return &name[prefix_len]; return &name[prefix_len];
} }
break;
default: break;
} }
return NULL; return NULL;
} }

Просмотреть файл

@ -113,6 +113,11 @@ def collect_builtin base, tree, name, bs, inlines, params = nil
if recv if recv
func_name = nil func_name = nil
case recv.first case recv.first
when :var_ref
_, recv = recv
if recv.first == :@const and recv[1] == "Primitive"
func_name = mid.to_s
end
when :vcall when :vcall
_, recv = recv _, recv = recv
if recv.first == :@ident and recv[1] == "__builtin" if recv.first == :@ident and recv[1] == "__builtin"