package compiler

import (
	"encoding/gob"
	"io"

	"github.com/d5/tengo/objects"
)

type Bytecode struct {
	Instructions []byte
	Constants    []objects.Object
}

func (b *Bytecode) Decode(r io.Reader) error {
	dec := gob.NewDecoder(r)

	if err := dec.Decode(&b.Instructions); err != nil {
		return err
	}

	if err := dec.Decode(&b.Constants); err != nil {
		return err
	}

	return nil
}

func (b *Bytecode) Encode(w io.Writer) error {
	enc := gob.NewEncoder(w)

	if err := enc.Encode(b.Instructions); err != nil {
		return err
	}

	if err := enc.Encode(b.Constants); err != nil {
		return err
	}

	return nil
}

func init() {
	gob.Register(&objects.Int{})
	gob.Register(&objects.Float{})
	gob.Register(&objects.String{})
	gob.Register(&objects.Bool{})
	gob.Register(&objects.Char{})
	gob.Register(&objects.Array{})
	gob.Register(&objects.Map{})
	gob.Register(&objects.CompiledFunction{})
	gob.Register(&objects.Undefined{})
}