EncodedJSValue JSC_HOST_CALL regExpProtoFuncTest(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); if (!thisValue.inherits(&RegExpObject::s_info)) return throwVMTypeError(exec); JSValue arg = exec->argument(0); RegExpObject* reg = asRegExpObject(thisValue); JSValue result = jsBoolean(reg->test(exec, arg.toString(exec))); #ifdef ARTEMIS if (arg.isSymbolic()) { result.makeSymbolic(new Symbolic::StringRegexSubmatch((Symbolic::StringExpression*)arg.asSymbolic(), new std::string(reg->regExp()->pattern().ascii().data())), exec->globalData()); } #endif return JSValue::encode(result); }
bool dumpIfTerminal(JSValue value) { if (!value.isCell()) { dumpImmediate(value); return true; } if (value.isString()) { UString str = asString(value)->value(m_exec); dumpString(str); return true; } if (value.isNumber()) { write(DoubleTag); write(value.asNumber()); return true; } if (value.isObject() && asObject(value)->inherits(&DateInstance::s_info)) { write(DateTag); write(asDateInstance(value)->internalNumber()); return true; } if (isArray(value)) return false; // Object cannot be serialized because the act of walking the object creates new objects if (value.isObject() && asObject(value)->inherits(&JSNavigator::s_info)) { fail(); write(NullTag); return true; } if (value.isObject()) { JSObject* obj = asObject(value); if (obj->inherits(&JSFile::s_info)) { write(FileTag); write(toFile(obj)); return true; } if (obj->inherits(&JSFileList::s_info)) { FileList* list = toFileList(obj); write(FileListTag); unsigned length = list->length(); write(length); for (unsigned i = 0; i < length; i++) write(list->item(i)); return true; } if (obj->inherits(&JSBlob::s_info)) { write(BlobTag); Blob* blob = toBlob(obj); write(blob->url()); write(blob->type()); write(blob->size()); return true; } if (obj->inherits(&JSImageData::s_info)) { ImageData* data = toImageData(obj); write(ImageDataTag); write(data->width()); write(data->height()); write(data->data()->length()); write(data->data()->data()->data(), data->data()->length()); return true; } if (obj->inherits(&RegExpObject::s_info)) { RegExpObject* regExp = asRegExpObject(obj); char flags[3]; int flagCount = 0; if (regExp->regExp()->global()) flags[flagCount++] = 'g'; if (regExp->regExp()->ignoreCase()) flags[flagCount++] = 'i'; if (regExp->regExp()->multiline()) flags[flagCount++] = 'm'; write(RegExpTag); write(regExp->regExp()->pattern()); write(UString(flags, flagCount)); return true; } if (obj->inherits(&JSMessagePort::s_info)) { ObjectPool::iterator index = m_transferredMessagePorts.find(obj); if (index != m_transferredMessagePorts.end()) { write(MessagePortReferenceTag); uint32_t i = index->second; write(i); return true; } return false; } CallData unusedData; if (getCallData(value, unusedData) == CallTypeNone) return false; } // Any other types are expected to serialize as null. write(NullTag); return true; }