Refactor Type to be an int
Some checks failed
Publish Image / publish (push) Waiting to run
Test / build (push) Waiting to run
Build / build (push) Has been cancelled

This commit is contained in:
Chuck Smith
2024-03-29 11:01:15 -04:00
parent f65d7bfb1c
commit 12d43c9835
58 changed files with 164 additions and 132 deletions

View File

@@ -495,9 +495,9 @@ func (vm *VM) Run() error {
func (vm *VM) executeSetItem(left, index, value object.Object) error {
switch {
case left.Type() == object.ARRAY_OBJ && index.Type() == object.INTEGER_OBJ:
case left.Type() == object.ArrayType && index.Type() == object.IntegerType:
return vm.executeArraySetItem(left, index, value)
case left.Type() == object.HASH_OBJ:
case left.Type() == object.HashType:
return vm.executeHashSetItem(left, index, value)
default:
return fmt.Errorf(
@@ -509,15 +509,15 @@ func (vm *VM) executeSetItem(left, index, value object.Object) error {
func (vm *VM) executeGetItem(left, index object.Object) error {
switch {
case left.Type() == object.STRING_OBJ && index.Type() == object.INTEGER_OBJ:
case left.Type() == object.StringType && index.Type() == object.IntegerType:
return vm.executeStringGetItem(left, index)
case left.Type() == object.STRING_OBJ && index.Type() == object.STRING_OBJ:
case left.Type() == object.StringType && index.Type() == object.StringType:
return vm.executeStringIndex(left, index)
case left.Type() == object.ARRAY_OBJ && index.Type() == object.INTEGER_OBJ:
case left.Type() == object.ArrayType && index.Type() == object.IntegerType:
return vm.executeArrayGetItem(left, index)
case left.Type() == object.HASH_OBJ:
case left.Type() == object.HashType:
return vm.executeHashGetItem(left, index)
case left.Type() == object.MODULE_OBJ:
case left.Type() == object.ModuleType:
return vm.executeHashGetItem(left.(*object.Module).Attrs, index)
default:
return fmt.Errorf(
@@ -653,7 +653,7 @@ func (vm *VM) executeBinaryOperation(op code.Opcode) error {
switch {
// {"a": 1} + {"b": 2}
case op == code.OpAdd && left.Type() == object.HASH_OBJ && right.Type() == object.HASH_OBJ:
case op == code.OpAdd && left.Type() == object.HashType && right.Type() == object.HashType:
leftVal := left.(*object.Hash).Pairs
rightVal := right.(*object.Hash).Pairs
pairs := make(map[object.HashKey]object.HashPair)
@@ -666,7 +666,7 @@ func (vm *VM) executeBinaryOperation(op code.Opcode) error {
return vm.push(&object.Hash{Pairs: pairs})
// [1] + [2]
case op == code.OpAdd && left.Type() == object.ARRAY_OBJ && right.Type() == object.ARRAY_OBJ:
case op == code.OpAdd && left.Type() == object.ArrayType && right.Type() == object.ArrayType:
leftVal := left.(*object.Array).Elements
rightVal := right.(*object.Array).Elements
elements := make([]object.Object, len(leftVal)+len(rightVal))
@@ -674,7 +674,7 @@ func (vm *VM) executeBinaryOperation(op code.Opcode) error {
return vm.push(&object.Array{Elements: elements})
// [1] * 3
case op == code.OpMul && left.Type() == object.ARRAY_OBJ && right.Type() == object.INTEGER_OBJ:
case op == code.OpMul && left.Type() == object.ArrayType && right.Type() == object.IntegerType:
leftVal := left.(*object.Array).Elements
rightVal := int(right.(*object.Integer).Value)
elements := leftVal
@@ -683,7 +683,7 @@ func (vm *VM) executeBinaryOperation(op code.Opcode) error {
}
return vm.push(&object.Array{Elements: elements})
// 3 * [1]
case op == code.OpMul && left.Type() == object.INTEGER_OBJ && right.Type() == object.ARRAY_OBJ:
case op == code.OpMul && left.Type() == object.IntegerType && right.Type() == object.ArrayType:
leftVal := int(left.(*object.Integer).Value)
rightVal := right.(*object.Array).Elements
elements := rightVal
@@ -693,21 +693,21 @@ func (vm *VM) executeBinaryOperation(op code.Opcode) error {
return vm.push(&object.Array{Elements: elements})
// " " * 4
case op == code.OpMul && left.Type() == object.STRING_OBJ && right.Type() == object.INTEGER_OBJ:
case op == code.OpMul && left.Type() == object.StringType && right.Type() == object.IntegerType:
leftVal := left.(*object.String).Value
rightVal := right.(*object.Integer).Value
return vm.push(&object.String{Value: strings.Repeat(leftVal, int(rightVal))})
// 4 * " "
case op == code.OpMul && left.Type() == object.INTEGER_OBJ && right.Type() == object.STRING_OBJ:
case op == code.OpMul && left.Type() == object.IntegerType && right.Type() == object.StringType:
leftVal := left.(*object.Integer).Value
rightVal := right.(*object.String).Value
return vm.push(&object.String{Value: strings.Repeat(rightVal, int(leftVal))})
case leftType == object.BOOLEAN_OBJ && rightType == object.BOOLEAN_OBJ:
case leftType == object.BooleanType && rightType == object.BooleanType:
return vm.executeBinaryBooleanOperation(op, left, right)
case leftType == object.INTEGER_OBJ && rightType == object.INTEGER_OBJ:
case leftType == object.IntegerType && rightType == object.IntegerType:
return vm.executeBinaryIntegerOperation(op, left, right)
case leftType == object.STRING_OBJ && rightType == object.STRING_OBJ:
case leftType == object.StringType && rightType == object.StringType:
return vm.executeBinaryStringOperation(op, left, right)
default:
return fmt.Errorf("unsupported types for binary operation: %s %s", leftType, rightType)