本文整理汇总了C++中constructEmptyArray函数的典型用法代码示例。如果您正苦于以下问题:C++ constructEmptyArray函数的具体用法?C++ constructEmptyArray怎么用?C++ constructEmptyArray使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了constructEmptyArray函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: DECLARE_THROW_SCOPE
JSValue Database::toJS(ExecState* exec) const
{
VM& vm = exec->vm();
auto scope = DECLARE_THROW_SCOPE(vm);
JSObject* result = constructEmptyObject(exec);
JSArray* bytecodes = constructEmptyArray(exec, 0);
RETURN_IF_EXCEPTION(scope, JSValue());
for (unsigned i = 0; i < m_bytecodes.size(); ++i)
bytecodes->putDirectIndex(exec, i, m_bytecodes[i].toJS(exec));
result->putDirect(vm, exec->propertyNames().bytecodes, bytecodes);
JSArray* compilations = constructEmptyArray(exec, 0);
RETURN_IF_EXCEPTION(scope, JSValue());
for (unsigned i = 0; i < m_compilations.size(); ++i)
compilations->putDirectIndex(exec, i, m_compilations[i]->toJS(exec));
result->putDirect(vm, exec->propertyNames().compilations, compilations);
JSArray* events = constructEmptyArray(exec, 0);
RETURN_IF_EXCEPTION(scope, JSValue());
for (unsigned i = 0; i < m_events.size(); ++i)
events->putDirectIndex(exec, i, m_events[i].toJS(exec));
result->putDirect(vm, exec->propertyNames().events, events);
return result;
}
开发者ID:ollie314,项目名称:webkit,代码行数:26,代码来源:ProfilerDatabase.cpp
示例2: moduleLoaderObjectRequestedModules
EncodedJSValue JSC_HOST_CALL moduleLoaderObjectRequestedModules(ExecState* exec)
{
JSModuleRecord* moduleRecord = jsDynamicCast<JSModuleRecord*>(exec->argument(0));
if (!moduleRecord)
return JSValue::encode(constructEmptyArray(exec, nullptr));
JSArray* result = constructEmptyArray(exec, nullptr, moduleRecord->requestedModules().size());
size_t i = 0;
for (auto& key : moduleRecord->requestedModules())
result->putDirectIndex(exec, i++, jsString(exec, key.get()));
return JSValue::encode(result);
}
开发者ID:rhythmkay,项目名称:webkit,代码行数:13,代码来源:ModuleLoaderObject.cpp
示例3: getJSListenerFunctions
static JSArray* getJSListenerFunctions(ExecState* exec, Document* document, const EventListenerInfo& listenerInfo)
{
JSArray* result = constructEmptyArray(exec, nullptr);
size_t handlersCount = listenerInfo.eventListenerVector.size();
for (size_t i = 0, outputIndex = 0; i < handlersCount; ++i) {
const JSEventListener* jsListener = JSEventListener::cast(listenerInfo.eventListenerVector[i].listener.get());
if (!jsListener) {
ASSERT_NOT_REACHED();
continue;
}
// Hide listeners from other contexts.
if (&jsListener->isolatedWorld() != ¤tWorld(exec))
continue;
JSObject* function = jsListener->jsFunction(document);
if (!function)
continue;
JSObject* listenerEntry = constructEmptyObject(exec);
listenerEntry->putDirect(exec->vm(), Identifier::fromString(exec, "listener"), function);
listenerEntry->putDirect(exec->vm(), Identifier::fromString(exec, "useCapture"), jsBoolean(listenerInfo.eventListenerVector[i].useCapture));
result->putDirectIndex(exec, outputIndex++, JSValue(listenerEntry));
}
return result;
}
开发者ID:biddyweb,项目名称:switch-oss,代码行数:26,代码来源:JSCommandLineAPIHostCustom.cpp
示例4: webAssemblyModuleImports
EncodedJSValue JSC_HOST_CALL webAssemblyModuleImports(ExecState* exec)
{
VM& vm = exec->vm();
auto* globalObject = exec->lexicalGlobalObject();
auto throwScope = DECLARE_THROW_SCOPE(vm);
JSWebAssemblyModule* module = jsDynamicCast<JSWebAssemblyModule*>(vm, exec->argument(0));
if (!module)
return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, "WebAssembly.Module.imports called with non WebAssembly.Module argument"_s)));
JSArray* result = constructEmptyArray(exec, nullptr, globalObject);
RETURN_IF_EXCEPTION(throwScope, { });
const auto& imports = module->moduleInformation().imports;
if (imports.size()) {
Identifier module = Identifier::fromString(exec, "module");
Identifier name = Identifier::fromString(exec, "name");
Identifier kind = Identifier::fromString(exec, "kind");
for (const Wasm::Import& imp : imports) {
JSObject* obj = constructEmptyObject(exec);
RETURN_IF_EXCEPTION(throwScope, { });
obj->putDirect(vm, module, jsString(exec, String::fromUTF8(imp.module)));
obj->putDirect(vm, name, jsString(exec, String::fromUTF8(imp.field)));
obj->putDirect(vm, kind, jsString(exec, String(makeString(imp.kind))));
result->push(exec, obj);
RETURN_IF_EXCEPTION(throwScope, { });
}
}
return JSValue::encode(result);
}
开发者ID:wolfviking0,项目名称:webcl-webkit,代码行数:31,代码来源:WebAssemblyModuleConstructor.cpp
示例5: webAssemblyModuleCustomSections
EncodedJSValue JSC_HOST_CALL webAssemblyModuleCustomSections(ExecState* exec)
{
VM& vm = exec->vm();
auto* globalObject = exec->lexicalGlobalObject();
auto throwScope = DECLARE_THROW_SCOPE(vm);
JSWebAssemblyModule* module = jsDynamicCast<JSWebAssemblyModule*>(vm, exec->argument(0));
if (!module)
return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, "WebAssembly.Module.customSections called with non WebAssembly.Module argument"_s)));
const String sectionNameString = exec->argument(1).getString(exec);
RETURN_IF_EXCEPTION(throwScope, { });
JSArray* result = constructEmptyArray(exec, nullptr, globalObject);
RETURN_IF_EXCEPTION(throwScope, { });
const auto& customSections = module->moduleInformation().customSections;
for (const Wasm::CustomSection& section : customSections) {
if (String::fromUTF8(section.name) == sectionNameString) {
auto buffer = ArrayBuffer::tryCreate(section.payload.data(), section.payload.size());
if (!buffer)
return JSValue::encode(throwException(exec, throwScope, createOutOfMemoryError(exec)));
result->push(exec, JSArrayBuffer::create(vm, globalObject->arrayBufferStructure(ArrayBufferSharingMode::Default), WTFMove(buffer)));
RETURN_IF_EXCEPTION(throwScope, { });
}
}
return JSValue::encode(result);
}
开发者ID:wolfviking0,项目名称:webcl-webkit,代码行数:30,代码来源:WebAssemblyModuleConstructor.cpp
示例6: idbKeyToJSValue
static JSValue idbKeyToJSValue(ExecState* exec, JSDOMGlobalObject* globalObject, IDBKey* key)
{
if (!key) {
// This should be undefined, not null.
// Spec: http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#idl-def-IDBKeyRange
return jsUndefined();
}
switch (key->type()) {
case IDBKey::ArrayType:
{
const IDBKey::KeyArray& inArray = key->array();
size_t size = inArray.size();
JSArray* outArray = constructEmptyArray(exec, 0, globalObject, size);
for (size_t i = 0; i < size; ++i) {
IDBKey* arrayKey = inArray.at(i).get();
outArray->putDirectIndex(exec, i, idbKeyToJSValue(exec, globalObject, arrayKey));
}
return JSValue(outArray);
}
case IDBKey::StringType:
return jsStringWithCache(exec, key->string());
case IDBKey::DateType:
return jsDateOrNull(exec, key->date());
case IDBKey::NumberType:
return jsNumber(key->number());
case IDBKey::MinType:
case IDBKey::InvalidType:
ASSERT_NOT_REACHED();
return jsUndefined();
}
ASSERT_NOT_REACHED();
return jsUndefined();
}
开发者ID:fmalita,项目名称:webkit,代码行数:35,代码来源:IDBBindingUtilities.cpp
示例7: toJS
JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, IDBKey* key)
{
if (!key)
return jsNull();
switch (key->type()) {
case IDBKey::ArrayType:
{
const IDBKey::KeyArray& inArray = key->array();
size_t size = inArray.size();
JSArray* outArray = constructEmptyArray(exec, globalObject, size);
JSGlobalData& globalData = exec->globalData();
for (size_t i = 0; i < size; ++i) {
IDBKey* arrayKey = inArray.at(i).get();
outArray->initializeIndex(globalData, i, toJS(exec, globalObject, arrayKey));
}
return JSValue(outArray);
}
case IDBKey::StringType:
return jsStringWithCache(exec, key->string());
case IDBKey::DateType:
return jsDateOrNull(exec, key->date());
case IDBKey::NumberType:
return jsNumber(key->number());
case IDBKey::MinType:
case IDBKey::InvalidType:
ASSERT_NOT_REACHED();
return jsUndefined();
}
ASSERT_NOT_REACHED();
return jsUndefined();
}
开发者ID:sanyaade-webdev,项目名称:webkit,代码行数:33,代码来源:JSIDBKeyCustom.cpp
示例8: jsUndefined
JSValue JSInjectedScriptHost::weakSetEntries(ExecState* exec)
{
if (exec->argumentCount() < 1)
return jsUndefined();
JSValue value = exec->uncheckedArgument(0);
JSWeakSet* weakSet = jsDynamicCast<JSWeakSet*>(value);
if (!weakSet)
return jsUndefined();
unsigned fetched = 0;
unsigned numberToFetch = 100;
JSValue numberToFetchArg = exec->argument(1);
double fetchDouble = numberToFetchArg.toInteger(exec);
if (fetchDouble >= 0)
numberToFetch = static_cast<unsigned>(fetchDouble);
JSArray* array = constructEmptyArray(exec, nullptr);
for (auto it = weakSet->weakMapData()->begin(); it != weakSet->weakMapData()->end(); ++it) {
JSObject* entry = constructEmptyObject(exec);
entry->putDirect(exec->vm(), Identifier::fromString(exec, "value"), it->key);
array->putDirectIndex(exec, fetched++, entry);
if (numberToFetch && fetched >= numberToFetch)
break;
}
return array;
}
开发者ID:cheekiatng,项目名称:webkit,代码行数:29,代码来源:JSInjectedScriptHost.cpp
示例9: getJSListenerFunctions
static JSArray* getJSListenerFunctions(ExecState& state, Document* document, const EventListenerInfo& listenerInfo)
{
VM& vm = state.vm();
auto scope = DECLARE_THROW_SCOPE(vm);
JSArray* result = constructEmptyArray(&state, nullptr);
RETURN_IF_EXCEPTION(scope, nullptr);
size_t handlersCount = listenerInfo.eventListenerVector.size();
for (size_t i = 0, outputIndex = 0; i < handlersCount; ++i) {
const JSEventListener* jsListener = JSEventListener::cast(&listenerInfo.eventListenerVector[i]->callback());
if (!jsListener) {
ASSERT_NOT_REACHED();
continue;
}
// Hide listeners from other contexts.
if (&jsListener->isolatedWorld() != ¤tWorld(&state))
continue;
JSObject* function = jsListener->jsFunction(document);
if (!function)
continue;
JSObject* listenerEntry = constructEmptyObject(&state);
listenerEntry->putDirect(vm, Identifier::fromString(&state, "listener"), function);
listenerEntry->putDirect(vm, Identifier::fromString(&state, "useCapture"), jsBoolean(listenerInfo.eventListenerVector[i]->useCapture()));
result->putDirectIndex(&state, outputIndex++, JSValue(listenerEntry));
}
return result;
}
开发者ID:ollie314,项目名称:webkit,代码行数:29,代码来源:JSCommandLineAPIHostCustom.cpp
示例10: DECLARE_THROW_SCOPE
void BytecodeSequence::addSequenceProperties(ExecState* exec, JSObject* result) const
{
VM& vm = exec->vm();
auto scope = DECLARE_THROW_SCOPE(vm);
JSArray* header = constructEmptyArray(exec, 0);
RETURN_IF_EXCEPTION(scope, void());
for (unsigned i = 0; i < m_header.size(); ++i)
header->putDirectIndex(exec, i, jsString(exec, String::fromUTF8(m_header[i])));
result->putDirect(vm, exec->propertyNames().header, header);
JSArray* sequence = constructEmptyArray(exec, 0);
RETURN_IF_EXCEPTION(scope, void());
for (unsigned i = 0; i < m_sequence.size(); ++i)
sequence->putDirectIndex(exec, i, m_sequence[i].toJS(exec));
result->putDirect(vm, exec->propertyNames().bytecode, sequence);
}
开发者ID:ollie314,项目名称:webkit,代码行数:16,代码来源:ProfilerBytecodeSequence.cpp
示例11: constructEmptyObject
JSValue Database::toJS(ExecState* exec) const
{
JSObject* result = constructEmptyObject(exec);
JSArray* bytecodes = constructEmptyArray(exec, 0);
for (unsigned i = 0; i < m_bytecodes.size(); ++i)
bytecodes->putDirectIndex(exec, i, m_bytecodes[i].toJS(exec));
result->putDirect(exec->vm(), exec->propertyNames().bytecodes, bytecodes);
JSArray* compilations = constructEmptyArray(exec, 0);
for (unsigned i = 0; i < m_compilations.size(); ++i)
compilations->putDirectIndex(exec, i, m_compilations[i]->toJS(exec));
result->putDirect(exec->vm(), exec->propertyNames().compilations, compilations);
return result;
}
开发者ID:aiwenlg007,项目名称:webkit,代码行数:16,代码来源:ProfilerDatabase.cpp
示例12: jsUndefined
JSValue JSInjectedScriptHost::iteratorEntries(ExecState* exec)
{
if (exec->argumentCount() < 1)
return jsUndefined();
VM& vm = exec->vm();
JSValue iterator;
JSValue value = exec->uncheckedArgument(0);
if (JSMapIterator* mapIterator = jsDynamicCast<JSMapIterator*>(value))
iterator = mapIterator->clone(exec);
else if (JSSetIterator* setIterator = jsDynamicCast<JSSetIterator*>(value))
iterator = setIterator->clone(exec);
else if (JSStringIterator* stringIterator = jsDynamicCast<JSStringIterator*>(value))
iterator = stringIterator->clone(exec);
else if (JSPropertyNameIterator* propertyNameIterator = jsDynamicCast<JSPropertyNameIterator*>(value)) {
iterator = propertyNameIterator->clone(exec);
if (UNLIKELY(vm.exception()))
return JSValue();
} else {
if (JSObject* iteratorObject = jsDynamicCast<JSObject*>(value)) {
// Array Iterators are created in JS for performance reasons. Thus the only way to know we have one is to
// look for a property that is unique to them.
if (JSValue nextIndex = iteratorObject->getDirect(vm, vm.propertyNames->builtinNames().arrayIteratorNextIndexPrivateName()))
iterator = cloneArrayIteratorObject(exec, vm, iteratorObject, nextIndex);
}
}
if (!iterator)
return jsUndefined();
unsigned numberToFetch = 5;
JSValue numberToFetchArg = exec->argument(1);
double fetchDouble = numberToFetchArg.toInteger(exec);
if (fetchDouble >= 0)
numberToFetch = static_cast<unsigned>(fetchDouble);
JSArray* array = constructEmptyArray(exec, nullptr);
if (UNLIKELY(vm.exception()))
return jsUndefined();
for (unsigned i = 0; i < numberToFetch; ++i) {
JSValue next = iteratorStep(exec, iterator);
if (UNLIKELY(vm.exception()))
break;
if (next.isFalse())
break;
JSValue nextValue = iteratorValue(exec, next);
if (UNLIKELY(vm.exception()))
break;
JSObject* entry = constructEmptyObject(exec);
entry->putDirect(exec->vm(), Identifier::fromString(exec, "value"), nextValue);
array->putDirectIndex(exec, i, entry);
}
iteratorClose(exec, iterator);
return array;
}
开发者ID:LuXiong,项目名称:webkit,代码行数:59,代码来源:JSInjectedScriptHost.cpp
示例13: constructEmptyArray
void BytecodeSequence::addSequenceProperties(ExecState* exec, JSObject* result) const
{
VM& vm = exec->vm();
JSArray* header = constructEmptyArray(exec, 0);
if (UNLIKELY(vm.exception()))
return;
for (unsigned i = 0; i < m_header.size(); ++i)
header->putDirectIndex(exec, i, jsString(exec, String::fromUTF8(m_header[i])));
result->putDirect(vm, exec->propertyNames().header, header);
JSArray* sequence = constructEmptyArray(exec, 0);
if (UNLIKELY(vm.exception()))
return;
for (unsigned i = 0; i < m_sequence.size(); ++i)
sequence->putDirectIndex(exec, i, m_sequence[i].toJS(exec));
result->putDirect(vm, exec->propertyNames().bytecode, sequence);
}
开发者ID:Comcast,项目名称:WebKitForWayland,代码行数:17,代码来源:ProfilerBytecodeSequence.cpp
示例14: constructEmptyObject
JSValue Compilation::toJS(ExecState* exec) const
{
JSObject* result = constructEmptyObject(exec);
result->putDirect(exec->vm(), exec->propertyNames().bytecodesID, jsNumber(m_bytecodes->id()));
result->putDirect(exec->vm(), exec->propertyNames().compilationKind, jsString(exec, String::fromUTF8(toCString(m_kind))));
JSArray* profiledBytecodes = constructEmptyArray(exec, 0);
for (unsigned i = 0; i < m_profiledBytecodes.size(); ++i)
profiledBytecodes->putDirectIndex(exec, i, m_profiledBytecodes[i].toJS(exec));
result->putDirect(exec->vm(), exec->propertyNames().profiledBytecodes, profiledBytecodes);
JSArray* descriptions = constructEmptyArray(exec, 0);
for (unsigned i = 0; i < m_descriptions.size(); ++i)
descriptions->putDirectIndex(exec, i, m_descriptions[i].toJS(exec));
result->putDirect(exec->vm(), exec->propertyNames().descriptions, descriptions);
JSArray* counters = constructEmptyArray(exec, 0);
for (auto it = m_counters.begin(), end = m_counters.end(); it != end; ++it) {
JSObject* counterEntry = constructEmptyObject(exec);
counterEntry->putDirect(exec->vm(), exec->propertyNames().origin, it->key.toJS(exec));
counterEntry->putDirect(exec->vm(), exec->propertyNames().executionCount, jsNumber(it->value->count()));
counters->push(exec, counterEntry);
}
result->putDirect(exec->vm(), exec->propertyNames().counters, counters);
JSArray* exitSites = constructEmptyArray(exec, 0);
for (unsigned i = 0; i < m_osrExitSites.size(); ++i)
exitSites->putDirectIndex(exec, i, m_osrExitSites[i].toJS(exec));
result->putDirect(exec->vm(), exec->propertyNames().osrExitSites, exitSites);
JSArray* exits = constructEmptyArray(exec, 0);
for (unsigned i = 0; i < m_osrExits.size(); ++i)
exits->putDirectIndex(exec, i, m_osrExits[i].toJS(exec));
result->putDirect(exec->vm(), exec->propertyNames().osrExits, exits);
result->putDirect(exec->vm(), exec->propertyNames().numInlinedGetByIds, jsNumber(m_numInlinedGetByIds));
result->putDirect(exec->vm(), exec->propertyNames().numInlinedPutByIds, jsNumber(m_numInlinedPutByIds));
result->putDirect(exec->vm(), exec->propertyNames().numInlinedCalls, jsNumber(m_numInlinedCalls));
result->putDirect(exec->vm(), exec->propertyNames().jettisonReason, jsString(exec, String::fromUTF8(toCString(m_jettisonReason))));
if (!m_additionalJettisonReason.isNull())
result->putDirect(exec->vm(), exec->propertyNames().additionalJettisonReason, jsString(exec, String::fromUTF8(m_additionalJettisonReason)));
return result;
}
开发者ID:highweb-project,项目名称:highweb-parallelwebkit,代码行数:45,代码来源:ProfilerCompilation.cpp
示例15: constructEmptyArray
JSValue OriginStack::toJS(ExecState* exec) const
{
JSArray* result = constructEmptyArray(exec, 0);
for (unsigned i = 0; i < m_stack.size(); ++i)
result->putDirectIndex(exec, i, m_stack[i].toJS(exec));
return result;
}
开发者ID:SchleunigerAG,项目名称:WinEC7_Qt5.3.1_Fixes,代码行数:9,代码来源:ProfilerOriginStack.cpp
示例16: moduleLoaderPrototypeRequestedModules
EncodedJSValue JSC_HOST_CALL moduleLoaderPrototypeRequestedModules(ExecState* exec)
{
VM& vm = exec->vm();
auto scope = DECLARE_THROW_SCOPE(vm);
JSModuleRecord* moduleRecord = jsDynamicCast<JSModuleRecord*>(vm, exec->argument(0));
if (!moduleRecord) {
scope.release();
return JSValue::encode(constructEmptyArray(exec, nullptr));
}
JSArray* result = constructEmptyArray(exec, nullptr, moduleRecord->requestedModules().size());
RETURN_IF_EXCEPTION(scope, encodedJSValue());
size_t i = 0;
for (auto& key : moduleRecord->requestedModules()) {
result->putDirectIndex(exec, i++, jsString(exec, key.get()));
RETURN_IF_EXCEPTION(scope, encodedJSValue());
}
return JSValue::encode(result);
}
开发者ID:caiolima,项目名称:webkit,代码行数:19,代码来源:ModuleLoaderPrototype.cpp
示例17: DECLARE_THROW_SCOPE
JSValue OSRExitSite::toJS(ExecState* exec) const
{
VM& vm = exec->vm();
auto scope = DECLARE_THROW_SCOPE(vm);
JSArray* result = constructEmptyArray(exec, 0);
RETURN_IF_EXCEPTION(scope, JSValue());
for (unsigned i = 0; i < m_codeAddresses.size(); ++i)
result->putDirectIndex(exec, i, jsString(exec, toString(RawPointer(m_codeAddresses[i]))));
return result;
}
开发者ID:ollie314,项目名称:webkit,代码行数:10,代码来源:ProfilerOSRExitSite.cpp
示例18: constructEmptyArray
JSValue OSRExitSite::toJS(ExecState* exec) const
{
VM& vm = exec->vm();
JSArray* result = constructEmptyArray(exec, 0);
if (UNLIKELY(vm.exception()))
return jsUndefined();
for (unsigned i = 0; i < m_codeAddresses.size(); ++i)
result->putDirectIndex(exec, i, jsString(exec, toString(RawPointer(m_codeAddresses[i]))));
return result;
}
开发者ID:Comcast,项目名称:WebKitForWayland,代码行数:10,代码来源:ProfilerOSRExitSite.cpp
示例19: constructArrayWithSizeQuirk
JSObject* constructArrayWithSizeQuirk(ExecState* exec, ArrayAllocationProfile* profile, JSGlobalObject* globalObject, JSValue length)
{
if (!length.isNumber())
return constructArray(exec, profile, globalObject, &length, 1);
uint32_t n = length.toUInt32(exec);
if (n != length.toNumber(exec))
return exec->vm().throwException(exec, createRangeError(exec, ASCIILiteral("Array size is not a small enough positive integer.")));
return constructEmptyArray(exec, profile, globalObject, n);
}
开发者ID:darionco,项目名称:JavaScriptCore-iOS,代码行数:10,代码来源:ArrayConstructor.cpp
示例20: constructEmptyArray
JSValue JSMessageEvent::ports(ExecState* exec) const
{
MessagePortArray* ports = static_cast<MessageEvent*>(impl())->ports();
if (!ports)
return constructEmptyArray(exec, globalObject());
MarkedArgumentBuffer list;
for (size_t i = 0; i < ports->size(); i++)
list.append(toJS(exec, globalObject(), (*ports)[i].get()));
return constructArray(exec, globalObject(), list);
}
开发者ID:Xertz,项目名称:EAWebKit,代码行数:11,代码来源:JSMessageEventCustom.cpp
注:本文中的constructEmptyArray函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论