mirror of
https://github.com/Open-Argon/argon-v3.git
synced 2025-12-06 08:56:07 +00:00
add subprocess
This commit is contained in:
@@ -165,94 +165,3 @@ func isUnhashable(val any) bool {
|
||||
keytype := typeof(val)
|
||||
return keytype == "array" || keytype == "map"
|
||||
}
|
||||
|
||||
func getFromArArray(m ArObject, r ArMapGet, stack stack, stacklevel int) (any, ArErr) {
|
||||
var (
|
||||
start int = 0
|
||||
end any = nil
|
||||
step int = 1
|
||||
)
|
||||
{
|
||||
startval, err := runVal(r.args[0], stack, stacklevel+1)
|
||||
if err.EXISTS {
|
||||
return ArObject{}, err
|
||||
}
|
||||
if startval == nil {
|
||||
start = 0
|
||||
} else if typeof(startval) != "number" || !startval.(number).IsInt() {
|
||||
return ArObject{}, ArErr{
|
||||
"TypeError",
|
||||
"slice index must be an integer",
|
||||
r.line,
|
||||
r.path,
|
||||
r.code,
|
||||
true,
|
||||
}
|
||||
} else {
|
||||
start = int(startval.(number).Num().Int64())
|
||||
}
|
||||
}
|
||||
if len(r.args) > 1 {
|
||||
endval, err := runVal(r.args[1], stack, stacklevel+1)
|
||||
if err.EXISTS {
|
||||
return ArObject{}, err
|
||||
}
|
||||
if endval == nil {
|
||||
end = m.obj["length"]
|
||||
} else if typeof(endval) != "number" && !endval.(number).IsInt() {
|
||||
return ArObject{}, ArErr{
|
||||
"TypeError",
|
||||
"slice ending index must be an integer",
|
||||
r.line,
|
||||
r.path,
|
||||
r.code,
|
||||
true,
|
||||
}
|
||||
} else {
|
||||
end = int(endval.(number).Num().Int64())
|
||||
}
|
||||
}
|
||||
if len(r.args) > 2 {
|
||||
stepval, err := runVal(r.args[2], stack, stacklevel+1)
|
||||
if err.EXISTS {
|
||||
return ArObject{}, err
|
||||
}
|
||||
if stepval == nil {
|
||||
step = 1
|
||||
} else if typeof(stepval) != "number" && !stepval.(number).IsInt() {
|
||||
return ArObject{}, ArErr{
|
||||
"TypeError",
|
||||
"slice step must be an integer",
|
||||
r.line,
|
||||
r.path,
|
||||
r.code,
|
||||
true,
|
||||
}
|
||||
} else {
|
||||
step = int(stepval.(number).Num().Int64())
|
||||
}
|
||||
}
|
||||
if start < 0 {
|
||||
start = m.obj["length"].(int) + start
|
||||
}
|
||||
if _, ok := end.(int); ok && end.(int) < 0 {
|
||||
end = m.obj["length"].(int) + end.(int)
|
||||
}
|
||||
if end == nil {
|
||||
return m.obj["__value__"].([]any)[start], ArErr{}
|
||||
} else if step == 1 {
|
||||
return ArArray([]any{m.obj["__value__"].([]any)[start:end.(int)]}), ArErr{}
|
||||
} else {
|
||||
output := []any{}
|
||||
if step > 0 {
|
||||
for i := start; i < end.(int); i += step {
|
||||
output = append(output, m.obj["__value__"].([]any)[i])
|
||||
}
|
||||
} else {
|
||||
for i := end.(int) - 1; i >= start; i += step {
|
||||
output = append(output, m.obj["__value__"].([]any)[i])
|
||||
}
|
||||
}
|
||||
return ArArray(output), ArErr{}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user