Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion internal/vm/abbrev_bind.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func (vm *VM) installAbbrev() {

// Array#abbrev(pattern = nil) — the core extension `require "abbrev"` adds; it
// calls Abbrev.abbrev(self, pattern).
vm.cArray.define("abbrev", func(vm *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
vm.cArray.defineArgc("abbrev", -1, func(vm *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
var pattern object.Value
if len(args) > 0 {
pattern = args[0]
Expand Down
4 changes: 2 additions & 2 deletions internal/vm/actionview.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,10 @@ func (vm *VM) registerSafeBuffer() {
return object.Bool(avContains(self.(*SafeBufferVal).buf.String(), avToS(avArg(args, 0))))
})

vm.cString.define("html_safe", func(vm *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
vm.cString.defineArgc("html_safe", 0, func(vm *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return vm.newSafeBuffer(actionview.Raw(self.(*object.String).Str()))
})
vm.cString.define("html_safe?", func(_ *VM, _ object.Value, _ []object.Value, _ *Proc) object.Value {
vm.cString.defineArgc("html_safe?", 0, func(_ *VM, _ object.Value, _ []object.Value, _ *Proc) object.Value {
return object.Bool(false)
})
}
Expand Down
68 changes: 34 additions & 34 deletions internal/vm/activesupport.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,137 +290,137 @@ func (vm *VM) registerActiveSupportCoreExt() {
}

func (vm *VM) registerASString() {
d := func(name string, fn NativeFn) { vm.cString.define(name, fn) }
d := func(name string, argc int, fn NativeFn) { vm.cString.defineArgc(name, argc, fn) }
str := func(self object.Value) string { return self.(*object.String).Str() }

d("blank?", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("blank?", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return object.Bool(coreext.StringBlank(str(self)))
})
d("present?", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("present?", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return object.Bool(coreext.StringPresent(str(self)))
})
d("presence", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("presence", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
if s, ok := coreext.StringPresence(str(self)); ok {
return object.NewString(s)
}
return object.NilV
})
d("squish", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("squish", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return object.NewString(coreext.Squish(str(self)))
})
d("truncate", func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
vm.cString.define("truncate", func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
return object.NewString(coreext.Truncate(str(self), int(intArg(args[0])), "", ""))
})
d("camelize", func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
d("camelize", -1, func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
upper := true
if len(args) > 0 {
upper = camelUpper(args[0])
}
return object.NewString(vm.asInflections.Camelize(str(self), upper))
})
d("underscore", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("underscore", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return object.NewString(vm.asInflections.Underscore(str(self)))
})
d("pluralize", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("pluralize", -1, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return object.NewString(vm.asInflections.Pluralize(str(self)))
})
d("titleize", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("titleize", -1, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return object.NewString(vm.asInflections.Titleize(str(self), false))
})
d("parameterize", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("parameterize", -1, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return object.NewString(inflector.Parameterize(str(self), "-", false))
})
d("classify", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("classify", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return object.NewString(vm.asInflections.Classify(str(self)))
})
d("humanize", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("humanize", -1, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return object.NewString(vm.asInflections.Humanize(str(self), true, false))
})
d("starts_with?", func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
d("starts_with?", -1, func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
return object.Bool(coreext.StartsWith(str(self), strArg(args[0])))
})
d("ends_with?", func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
d("ends_with?", -1, func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
return object.Bool(coreext.EndsWith(str(self), strArg(args[0])))
})
}

func (vm *VM) registerASArray() {
d := func(name string, fn NativeFn) { vm.cArray.define(name, fn) }
d := func(name string, argc int, fn NativeFn) { vm.cArray.defineArgc(name, argc, fn) }
elems := func(self object.Value) []object.Value { return self.(*object.Array).Elems }

d("blank?", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("blank?", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return object.Bool(coreext.ArrayBlank(boxSlice(elems(self))))
})
d("in_groups", func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
vm.cArray.define("in_groups", func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
n := int(intArg(args[0]))
if len(args) > 1 && isFalse(args[1]) {
return rubyFromGroups(coreext.InGroupsNoFill(boxSlice(elems(self)), n))
}
return rubyFromGroups(coreext.InGroups(boxSlice(elems(self)), n, fillArg(args)))
})
d("in_groups_of", func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
vm.cArray.define("in_groups_of", func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
n := int(intArg(args[0]))
if len(args) > 1 && isFalse(args[1]) {
return rubyFromGroups(coreext.InGroupsOfNoFill(boxSlice(elems(self)), n))
}
return rubyFromGroups(coreext.InGroupsOf(boxSlice(elems(self)), n, fillArg(args)))
})
d("to_sentence", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("to_sentence", -1, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
strs := make([]any, len(elems(self)))
for i, e := range elems(self) {
strs[i] = vm.send(e, "to_s", nil, nil).(*object.String).Str()
}
return object.NewString(coreext.ToSentence(strs))
})
d("second", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("second", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return rubyFrom(coreext.Second(boxSlice(elems(self))))
})
d("third", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("third", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return rubyFrom(coreext.Third(boxSlice(elems(self))))
})
d("fourth", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("fourth", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return rubyFrom(coreext.Fourth(boxSlice(elems(self))))
})
d("fifth", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("fifth", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return rubyFrom(coreext.Fifth(boxSlice(elems(self))))
})
}

func (vm *VM) registerASHash() {
d := func(name string, fn NativeFn) { vm.cHash.define(name, fn) }
d := func(name string, argc int, fn NativeFn) { vm.cHash.defineArgc(name, argc, fn) }
h := func(self object.Value) *object.Hash { return self.(*object.Hash) }

d("blank?", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("blank?", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return object.Bool(coreext.HashBlank(hashToGo(h(self))))
})
d("deep_merge", func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
d("deep_merge", 1, func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
other := hashArg(args[0])
gh, gother := hashToGo(h(self)), hashToGo(other)
return rubyHashOrdered(coreext.DeepMerge(gh, gother), mergeOrder(h(self), other))
})
d("deep_dup", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("deep_dup", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return rubyHashOrdered(coreext.DeepDup(hashToGo(h(self))), hashGoKeys(h(self)))
})
d("symbolize_keys", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("symbolize_keys", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return rubyHashOrdered(coreext.SymbolizeKeys(hashToGo(h(self))), mapKeys(hashGoKeys(h(self)), asSymKey))
})
d("stringify_keys", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("stringify_keys", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return rubyHashOrdered(coreext.StringifyKeys(hashToGo(h(self))), mapKeys(hashGoKeys(h(self)), asStrKey))
})
d("reverse_merge", func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
d("reverse_merge", 1, func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
other := hashArg(args[0])
gh, gother := hashToGo(h(self)), hashToGo(other)
return rubyHashOrdered(coreext.ReverseMerge(gh, gother), reverseMergeOrder(h(self), other))
})
}

func (vm *VM) registerASInteger() {
d := func(name string, fn NativeFn) { vm.cInteger.define(name, fn) }
d := func(name string, argc int, fn NativeFn) { vm.cInteger.defineArgc(name, argc, fn) }

d("ordinalize", func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
d("ordinalize", 0, func(_ *VM, self object.Value, _ []object.Value, _ *Proc) object.Value {
return object.NewString(coreext.Ordinalize(int(self.(object.Integer))))
})
d("multiple_of?", func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
d("multiple_of?", 1, func(_ *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
return object.Bool(coreext.MultipleOf(int(self.(object.Integer)), int(intArg(args[0]))))
})
}
Expand Down
16 changes: 8 additions & 8 deletions internal/vm/array_edges.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ func (vm *VM) registerArrayEdges() {
// bsearch / bsearch_index share the same search; only the returned projection
// (element vs index) differs. Without a block both return an Enumerator, as MRI
// does.
vm.cArray.define("bsearch", func(vm *VM, self object.Value, _ []object.Value, blk *Proc) object.Value {
vm.cArray.defineArgc("bsearch", 0, func(vm *VM, self object.Value, _ []object.Value, blk *Proc) object.Value {
if blk == nil {
// MRI's bsearch Enumerator reports an unknown (nil) size.
return enumForSized(self, "bsearch", func(*VM) object.Value { return object.NilV })
Expand All @@ -30,7 +30,7 @@ func (vm *VM) registerArrayEdges() {
}
return object.NilV
})
vm.cArray.define("bsearch_index", func(vm *VM, self object.Value, _ []object.Value, blk *Proc) object.Value {
vm.cArray.defineArgc("bsearch_index", 0, func(vm *VM, self object.Value, _ []object.Value, blk *Proc) object.Value {
if blk == nil {
// MRI's bsearch_index Enumerator reports an unknown (nil) size.
return enumForSized(self, "bsearch_index", func(*VM) object.Value { return object.NilV })
Expand All @@ -44,7 +44,7 @@ func (vm *VM) registerArrayEdges() {
// difference keeps every element of the receiver that is eql? to no element of
// any argument array — duplicates in the receiver are preserved, exactly like a
// chained `-`.
vm.cArray.define("difference", func(vm *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
vm.cArray.defineArgc("difference", -1, func(vm *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
others := vm.toAryArgs(args)
var out []object.Value
for _, e := range self.(*object.Array).Elems {
Expand All @@ -56,7 +56,7 @@ func (vm *VM) registerArrayEdges() {
})
// union concatenates the receiver and every argument, then removes eql?
// duplicates keeping first-seen order — a multi-argument, de-duplicating `|`.
vm.cArray.define("union", func(vm *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
vm.cArray.defineArgc("union", -1, func(vm *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
others := vm.toAryArgs(args)
var out []object.Value
add := func(elems []object.Value) {
Expand All @@ -75,7 +75,7 @@ func (vm *VM) registerArrayEdges() {
// intersection keeps each element of the receiver that is eql? to some element
// of every argument array, de-duplicated in receiver order. With no arguments
// it is simply the receiver de-duplicated (like #uniq under eql?).
vm.cArray.define("intersection", func(vm *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
vm.cArray.defineArgc("intersection", -1, func(vm *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
others := vm.toAryArgs(args)
var out []object.Value
for _, e := range self.(*object.Array).Elems {
Expand All @@ -90,7 +90,7 @@ func (vm *VM) registerArrayEdges() {
})
// intersect? reports whether the receiver and the one argument array share any
// element (compared with eql?), short-circuiting on the first match.
vm.cArray.define("intersect?", func(vm *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
vm.cArray.defineArgc("intersect?", 1, func(vm *VM, self object.Value, args []object.Value, _ *Proc) object.Value {
other := vm.toAryArg(args[0])
for _, e := range self.(*object.Array).Elems {
if vm.arrayIncludesEql(other.Elems, e) {
Expand All @@ -102,7 +102,7 @@ func (vm *VM) registerArrayEdges() {

// each_index yields every valid index in order and returns the array; without a
// block it returns an Enumerator whose #size is the array length.
vm.cArray.define("each_index", func(vm *VM, self object.Value, _ []object.Value, blk *Proc) object.Value {
vm.cArray.defineArgc("each_index", 0, func(vm *VM, self object.Value, _ []object.Value, blk *Proc) object.Value {
a := self.(*object.Array)
if blk == nil {
n := len(a.Elems)
Expand All @@ -121,7 +121,7 @@ func (vm *VM) registerArrayEdges() {
// completes (an unbounded cycle only ends via break); without a block it returns
// an Enumerator whose #size is n*length, 0 for a non-positive count, or infinity
// for an unbounded cycle.
vm.cArray.define("cycle", func(vm *VM, self object.Value, args []object.Value, blk *Proc) object.Value {
vm.cArray.defineArgc("cycle", -1, func(vm *VM, self object.Value, args []object.Value, blk *Proc) object.Value {
a := self.(*object.Array)
hasN := len(args) > 0 && !object.IsNil(args[0])
if blk == nil {
Expand Down
Loading
Loading