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; } }