packages feed

hjs-0.2: src/HJS/Interpreter/InterpMDecl.hs~

module HJS.Interpreter.InterpMDecl where

import Control.Monad.Identity
import Control.Monad.Error
import Control.Monad.State 

import Data.Map as M

import HJS.Parser.JavaScript hiding (Object)

data Ref = Ref String | RefObj ObjId String deriving (Eq,Show,Ord)

data ObjId = ObjId Int | ObjIdNull deriving (Eq,Show,Ord)

data Undefined = Undefined deriving (Eq,Show,Ord)
data Null = Null deriving (Eq,Show,Ord)


-- Either JS source from a function or a built in function
data CallValue = CallJS [SourceElement] | CallBuiltIn (InterpM Value)

data BreakContinue = Break | Continue deriving (Show,Eq,Ord)

data ArgList = ArgList [String] | VarArgList

-- Think I should be including Ref (ie what is returned by LeftExpr) into the Value type.
type Value =  Either Int                       -- Primitive values
            ( Either String 
            ( Either Bool                              
            ( Either Undefined 
            ( Either Null 
                                               -- Internal values
            ( Either ObjId
            ( Either Ref                       -- Reference
            ( Either [ObjId]                   -- List of object ids
            ( Either CallValue                 -- Code, used 'Call' property of Function object. 
            ( Either [String]                  -- List of argument names
	    ( Either BreakContinue
              ()))))))))))


type InterpM  = ErrorT Throwable (StateT JSState Identity)

-- Execution Context = Scope chain, variable object, this object, current function
type Ctx = ([ObjId],ObjId,ObjId,ObjId)
type JSState =  ([Ctx],Map ObjId Object,(Int,Int))



data Throwable = ThrowReturn Value 
	       | ThrowBreak (Maybe String)
	       | ThrowContinue (Maybe String)
	       | ThrowException Value
	       | ThrowTypeError String
	       | ThrowInternalError String 
		 deriving Show

-- Section 8.6.2
data Object = Object {
                      idd :: ObjId,
		      prototype :: Maybe ObjId,
		      klass :: String,
		      value :: Maybe Value,
		      properties :: M.Map String (Value,[Attribute]) 
		     } deriving Show

data Attribute = ReadOnly | DontEnum | DontDelete | Internal deriving (Eq,Show)

instance Show CallValue where
   show (CallJS x) = show x
   show (CallBuiltIn _) = show "<builtin>"

instance Ord CallValue where
   compare _ _ = EQ

instance Eq CallValue where
   (==) _ _ = True