
#ifndef _Value_h_INCLUDED
#define _Value_h_INCLUDED

#include <stdio.h>

#include "Obj.h"

class Symbol;
class Func;
class Frame;
class Program;

class Value {				// Whole class should be inline'd
  public:
    Value(void) { }
    Value(long x) { val = x << 2 | 1; }
    long Number(void) { return  (val & 0xf0000000) ? (val >> 2 ) | 0xc0000000 : (val >> 2); }
    Value(Obj *o) { val = (long) o; }
    Obj *ObjPtr (void) { return (Obj *) val; }
    Type *ValueType (void) { return (val & 1) ? NumberType : val ? ((Obj *) val)->GetType() : NullType; }
    Value(Value *v) { val = (long) v; }	// No need to tag; we pretend it's an int for GC purposes
    Value *ValuePtr(void) { return (Value *) val; }
    void Dump();
    int False() { return (val == 1); }

  private:
    
    long val;
};

const Value nil(0);

#endif
