mirror of
https://github.com/Open-Argon/argon-v3.git
synced 2025-12-06 00:46:07 +00:00
fix delete keyword not doing anything when deleting a variable, and move length calculation to only when needed
This commit is contained in:
22
src/array.go
22
src/array.go
@@ -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{}
|
||||
},
|
||||
|
||||
@@ -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{}
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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{})
|
||||
|
||||
49
src/map.go
49
src/map.go
@@ -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) {
|
||||
|
||||
@@ -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{}
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user