Exemplo n.º 1
0
bool CsInstanceOf(VM *c, value obj, value cls)
{
    //dispatch *desiredType = CsGetDispatch(cls);
    //dispatch *type = CsGetDispatch(obj);

    if(CsCObjectP(cls))
    {
        dispatch *desiredType = (dispatch *)CsCObjectValue(cls);
        dispatch *type = CsGetDispatch(obj);
        for (;;) {
            if (type == desiredType)
                break;
            if (type->baseType == desiredType)
                break;
            else if (!(type = type->proto))
                //CsTypeError(c,arg);
                return false;
        }
        return true;
    }
    else if( CsObjectP(obj) || CsCObjectP(obj) )
    {
      if(!CsObjectOrMethodP(cls))
      {
        if(c)
          CsTypeError(c,cls);
        else
          return false;
      }
      obj = CsObjectClass(obj);
      for (;;) 
      {
          if(obj == cls)
            break;
          if(!obj || obj == UNDEFINED_VALUE)
            return false;
          obj = CsObjectClass(obj);
      }
      return true;
    }
    //else 
    //    CsTypeError(c,cls); 
    return false;
}
/* writeValue - write a value */
bool write_ctx::writeValue(value v)
{
    if (v == UNDEFINED_VALUE)
        return s->put(CsFaslTagUndefined);
    else if (v == NULL_VALUE)
        return s->put(CsFaslTagNull);
    else if (v == TRUE_VALUE)
        return s->put(CsFaslTagTrue);
    else if (v == FALSE_VALUE)
        return s->put(CsFaslTagFalse);
    else if (CsCompiledCodeP(v))
        return writeCodeValue(v);
    else if (CsVectorP(v))
    {
        uint n = 0;
        if(object2id.find(v,n))
          return writeProxyValue(n);
        else
        {
          n = object2id.size();
          object2id[v] = n;
          return writeVectorValue(v);
        }
    }
    else if (CsObjectP(v))
    {
        uint n = 0;
        if(object2id.find(v,n))
          return writeProxyValue(n);
        else
        {
          n = object2id.size();
          object2id[v] = n;
          return writeObjectValue(v);
        }
    }
    else if (CsSymbolP(v))
        return writeSymbolValue(v);
    else if (CsStringP(v))
        return writeStringValue(v);
    else if (CsIntegerP(v))
        return writeIntegerValue(v);
    else if (CsFloatP(v))
        return writeFloatValue(v);
    else if (CsTupleP(v))
        return writeTupleValue(v);
    else if (CsByteVectorP(v))
        return writeByteVectorValue(v);
    else if (CsDateP(c,v))
        return writeDateValue(v);
    else if (CsColorP(v))
        return writeColorValue(v);
    else if (CsLengthP(v))
        return writeLengthValue(v);
    else if (CsAngleP(v))
        return writeAngleValue(v);
    else if (CsDurationP(v))
        return writeDurationValue(v);
    else {
#ifdef _DEBUG
        dispatch* pd = CsGetDispatch(v);
#endif
        assert(false);
        return false;
    }
}