fix delete keyword not doing anything when deleting a variable, and move length calculation to only when needed

This commit is contained in:
2024-05-30 17:03:29 +01:00
parent 5afa0b10c7
commit 7aadb812e4
5 changed files with 120 additions and 26 deletions

View File

@@ -23,7 +23,6 @@ func ArArray(arr []any) ArObject {
anymap{
"__name__": "array",
"__value__": arr,
"length": newNumber().SetUint64(uint64(len(arr))),
},
}
val.obj["__setindex__"] = builtinFunc{
@@ -68,9 +67,19 @@ func ArArray(arr []any) ArObject {
// a[0] is start
// a[1] is end
// a[2] is step
if len(a) > 3 {
if len(a) > 3 || len(a) == 0 {
return nil, ArErr{"Type Error", "expected 1 to 3 arguments, got " + fmt.Sprint(len(a)), 0, "", "", true}
}
{
if len(a) == 1 {
if typeof(a[0]) == "string" {
var name = ArValidToAny(a[0]).(string)
if name == "length" {
return newNumber().SetInt64(int64(len(arr))), ArErr{}
}
}
}
}
var (
start int = 0
end any = nil
@@ -183,7 +192,6 @@ func ArArray(arr []any) ArObject {
}
}
arr = append(arr[:num], arr[num+1:]...)
val.obj["length"] = newNumber().SetUint64(uint64(len(arr)))
val.obj["__value__"] = arr
return nil, ArErr{}
}}
@@ -198,7 +206,6 @@ func ArArray(arr []any) ArObject {
}
}
arr = append(arr, args...)
val.obj["length"] = newNumber().SetUint64(uint64(len(arr)))
val.obj["__value__"] = arr
return nil, ArErr{}
},
@@ -236,7 +243,6 @@ func ArArray(arr []any) ArObject {
}
}
arr = append(arr[:num], append(args[1:], arr[num:]...)...)
val.obj["length"] = newNumber().SetUint64(uint64(len(arr)))
val.obj["__value__"] = arr
return nil, ArErr{}
},
@@ -276,13 +282,11 @@ func ArArray(arr []any) ArObject {
}
v := arr[num]
arr = append(arr[:num], arr[num+1:]...)
val.obj["length"] = newNumber().SetUint64(uint64(len(arr)))
val.obj["__value__"] = arr
return v, ArErr{}
}
v := arr[len(arr)-1]
arr = arr[:len(arr)-1]
val.obj["length"] = newNumber().SetUint64(uint64(len(arr)))
val.obj["__value__"] = arr
return v, ArErr{}
},
@@ -298,7 +302,6 @@ func ArArray(arr []any) ArObject {
}
}
arr = []any{}
val.obj["length"] = newNumber().SetUint64(uint64(len(arr)))
val.obj["__value__"] = arr
return nil, ArErr{}
},
@@ -321,7 +324,6 @@ func ArArray(arr []any) ArObject {
}
}
arr = append(arr, args[0].(ArObject).obj["__value__"].([]any)...)
val.obj["length"] = newNumber().SetUint64(uint64(len(arr)))
val.obj["__value__"] = arr
return nil, ArErr{}
},
@@ -370,7 +372,6 @@ func ArArray(arr []any) ArObject {
}
}
arr = output
val.obj["length"] = newNumber().SetUint64(uint64(len(arr)))
val.obj["__value__"] = arr
return nil, ArErr{}
}
@@ -386,7 +387,6 @@ func ArArray(arr []any) ArObject {
}
}
arr = output
val.obj["length"] = newNumber().SetUint64(uint64(len(arr)))
val.obj["__value__"] = arr
return nil, ArErr{}
},

View File

@@ -86,7 +86,6 @@ func ArBuffer(buf []byte) ArObject {
obj: anymap{
"__name__": "buffer",
"__value__": buf,
"length": newNumber().SetInt64(int64(len(buf))),
},
}
obj.obj["__string__"] = builtinFunc{
@@ -147,7 +146,6 @@ func ArBuffer(buf []byte) ArObject {
}
}
obj.obj["__value__"] = buf
obj.obj["length"] = newNumber().SetInt64(int64(len(buf)))
return obj, ArErr{}
},
}
@@ -390,7 +388,6 @@ func ArBuffer(buf []byte) ArObject {
}
}
obj.obj["__value__"] = buf
obj.obj["length"] = newNumber().SetInt64(int64(len(buf)))
return obj, ArErr{}
},
}
@@ -464,10 +461,56 @@ func ArBuffer(buf []byte) ArObject {
}
}
obj.obj["__value__"] = buf
obj.obj["length"] = newNumber().SetInt64(int64(len(buf)))
return obj, ArErr{}
},
}
obj.obj["__getindex__"] = builtinFunc{
"__getindex__",
func(a ...any) (any, ArErr) {
if len(a) != 1 {
return nil, ArErr{
TYPE: "Type Error",
message: "expected 1 argument, got " + fmt.Sprint(len(a)),
EXISTS: true,
}
}
{
if len(a) == 1 {
if typeof(a[0]) == "string" {
var name = ArValidToAny(a[0]).(string)
if name == "length" {
return newNumber().SetInt64(int64(len(buf))), ArErr{}
}
}
}
}
poss := ArValidToAny(a[0])
if typeof(poss) != "number" {
return nil, ArErr{
TYPE: "Type Error",
message: "expected number, got " + typeof(poss),
EXISTS: true,
}
}
pos := poss.(number)
if pos.Denom().Cmp(one.Denom()) != 0 {
return nil, ArErr{
TYPE: "Type Error",
message: "position must be an integer",
EXISTS: true,
}
}
posNum := pos.Num().Int64()
if posNum < 0 || posNum >= int64(len(buf)) {
return nil, ArErr{
TYPE: "Index Error",
message: "index out of range",
EXISTS: true,
}
}
return ArByte(buf[posNum]), ArErr{}
},
}
obj.obj["remove"] = builtinFunc{
"remove",
func(a ...any) (any, ArErr) {
@@ -497,7 +540,6 @@ func ArBuffer(buf []byte) ArObject {
posNum := pos.Num().Int64()
buf = append(buf[:posNum], buf[posNum+1:]...)
obj.obj["__value__"] = buf
obj.obj["length"] = newNumber().SetInt64(int64(len(buf)))
return obj, ArErr{}
},
}

View File

@@ -10,8 +10,8 @@ var Args = os.Args[1:]
type stack = []ArObject
const VERSION = "3.0.7"
const VERSION_NUM = 5
const VERSION = "3.0.8a"
const VERSION_NUM = 6
func newscope() ArObject {
return Map(anymap{})

View File

@@ -273,6 +273,54 @@ func Map(m anymap) ArObject {
return nil, ArErr{}
},
},
"__deleteindex__": builtinFunc{
"__deleteindex__",
func(args ...any) (any, ArErr) {
if len(args) != 1 {
return nil, ArErr{
TYPE: "Type Error",
message: "expected 1 argument, got " + fmt.Sprint(len(args)),
EXISTS: true,
}
}
if isUnhashable(args[0]) {
return nil, ArErr{
TYPE: "Runtime Error",
message: "unhashable type: " + typeof(args[0]),
EXISTS: true,
}
}
key := ArValidToAny(args[0])
mutex.RLock()
if _, ok := m[key]; !ok {
mutex.RUnlock()
return nil, ArErr{
TYPE: "KeyError",
message: "key " + fmt.Sprint(key) + " not found",
EXISTS: true,
}
}
mutex.RUnlock()
listenersMutex.RLock()
if _, ok := listeners[key]; ok {
for _, v := range listeners[key] {
runCall(
call{
Callable: v,
Args: []any{},
},
stack{},
0,
)
}
}
listenersMutex.RUnlock()
mutex.Lock()
delete(m, key)
mutex.Unlock()
return nil, ArErr{}
},
},
"__getindex__": builtinFunc{
"__getindex__",
func(args ...any) (any, ArErr) {
@@ -457,6 +505,7 @@ func Map(m anymap) ArObject {
return ArArray(keys), ArErr{}
},
}
obj.obj["__Boolean__"] = builtinFunc{
"__Boolean__",
func(args ...any) (any, ArErr) {

View File

@@ -65,7 +65,6 @@ func ArString(str string) ArObject {
anymap{
"__value__": str,
"__name__": "string",
"length": newNumber().SetUint64(uint64(len(str))),
},
}
@@ -96,7 +95,6 @@ func ArString(str string) ArObject {
}
str = strings.Join([]string{str[:index], a[1].(string), str[index+1:]}, "")
obj.obj["__value__"] = str
obj.obj["length"] = newNumber().SetUint64(uint64(len(str)))
return nil, ArErr{}
}}
obj.obj["__getindex__"] = builtinFunc{
@@ -105,9 +103,19 @@ func ArString(str string) ArObject {
// a[0] is start
// a[1] is end
// a[2] is step
if len(a) > 3 {
if len(a) > 3 || len(a) == 0 {
return nil, ArErr{"Type Error", "expected 1 to 3 arguments, got " + fmt.Sprint(len(a)), 0, "", "", true}
}
{
if len(a) == 1 {
if typeof(a[0]) == "string" {
var name = ArValidToAny(a[0]).(string)
if name == "length" {
return newNumber().SetInt64(int64(len(str))), ArErr{}
}
}
}
}
var (
start int = 0
end any = nil
@@ -196,7 +204,6 @@ func ArString(str string) ArObject {
}
str = strings.Join(output, "")
obj.obj["__value__"] = str
obj.obj["length"] = newNumber().SetUint64(uint64(len(str)))
return nil, ArErr{}
}}
obj.obj["extend"] = builtinFunc{
@@ -217,7 +224,6 @@ func ArString(str string) ArObject {
}
str = strings.Join(output, "")
obj.obj["__value__"] = str
obj.obj["length"] = newNumber().SetUint64(uint64(len(str)))
return nil, ArErr{}
},
}
@@ -242,7 +248,6 @@ func ArString(str string) ArObject {
}
str = str[:index] + a[1].(string) + str[index:]
obj.obj["__value__"] = str
obj.obj["length"] = newNumber().SetUint64(uint64(len(str)))
return nil, ArErr{}
}}
obj.obj["concat"] = builtinFunc{
@@ -454,7 +459,6 @@ func ArString(str string) ArObject {
bytes[i] = b.(byte)
}
str = string(bytes)
obj.obj["length"] = newNumber().SetUint64(uint64(len(str)))
obj.obj["__value__"] = str
return nil, ArErr{}
}
@@ -474,7 +478,6 @@ func ArString(str string) ArObject {
bytes[i] = b.(byte)
}
str = string(bytes)
obj.obj["length"] = newNumber().SetUint64(uint64(len(str)))
obj.obj["__value__"] = str
return nil, ArErr{}
},