本文整理汇总了Python中mx.suite函数的典型用法代码示例。如果您正苦于以下问题:Python suite函数的具体用法?Python suite怎么用?Python suite使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了suite函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Python代码示例。
示例1: testgraal
def testgraal(args):
cloneFrom = mx.get_env("GRAAL_URL")
if not cloneFrom:
cloneFrom = "http://github.com/graalvm/graal-core"
graalSuiteSubDir = mx.get_env("GRAAL_SUITE_SUBDIR")
suite = mx.suite('truffle')
suiteDir = suite.dir
workDir = join(suite.get_output_root(), 'sanitycheck')
mx.ensure_dir_exists(join(workDir, suite.name))
for f in os.listdir(suiteDir):
subDir = os.path.join(suiteDir, f)
if subDir == suite.get_output_root():
continue
src = join(suiteDir, f)
tgt = join(workDir, suite.name, f)
if isdir(src):
if exists(tgt):
shutil.rmtree(tgt)
shutil.copytree(src, tgt)
else:
shutil.copy(src, tgt)
sanityDir = join(workDir, 'sanity')
git = mx.GitConfig()
if exists(sanityDir):
git.pull(sanityDir)
else:
git.clone(cloneFrom, sanityDir)
sanitySuiteDir = sanityDir if graalSuiteSubDir is None else join(sanityDir, graalSuiteSubDir)
return mx.run_mx(['--java-home=' + mx.get_jdk().home, 'gate', '-B--force-deprecation-as-warning', '--tags', 'build,test'], sanitySuiteDir)
开发者ID:graalvm,项目名称:truffle,代码行数:32,代码来源:mx_graaltest.py
示例2: gate_ruby
def gate_ruby(tasks):
with Task('Ruby', tasks, tags=[VmGateTasks.ruby]) as t:
if t:
# Debug GR-9912 on Ruby gate runs. If debug_gr_9912 goes away the custom image building below is not required anymore and
# test_ruby can be called with the original graalvm ruby-launcher
debug_gr_9912 = 16
native_image_context, svm = graalvm_svm()
with native_image_context(svm.IMAGE_ASSERTION_FLAGS) as native_image:
ruby_bindir = join(mx_vm.graalvm_output(), 'jre', 'languages', 'ruby', 'bin')
ruby_image = native_image(['--language:ruby', '-H:Path=' + ruby_bindir, '-H:GreyToBlackObjectVisitorDiagnosticHistory=' + str(debug_gr_9912)])
truffleruby_suite = mx.suite('truffleruby')
truffleruby_suite.extensions.ruby_testdownstream_aot([ruby_image, 'spec', 'release'])
开发者ID:charig,项目名称:truffle,代码行数:12,代码来源:mx_vm_gate.py
示例3: gate_sulong
def gate_sulong(tasks):
with Task('Run SulongSuite tests as native-image', tasks, tags=[VmGateTasks.sulong]) as t:
if t:
lli = join(mx_vm.graalvm_output(), 'bin', 'lli')
sulong = mx.suite('sulong')
sulong.extensions.testLLVMImage(lli, libPath=False, unittestArgs=['--enable-timing'])
with Task('Run Sulong interop tests as native-image', tasks, tags=[VmGateTasks.sulong]) as t:
if t:
sulong = mx.suite('sulong')
native_image_context, svm = graalvm_svm()
with native_image_context(svm.IMAGE_ASSERTION_FLAGS) as native_image:
# TODO Use mx_vm.get_final_graalvm_distribution().find_single_source_location to rewire SULONG_LIBS
sulong_libs = join(mx_vm.graalvm_output(), 'jre', 'languages', 'llvm')
def distribution_paths(dname):
path_substitutions = {
'SULONG_LIBS': sulong_libs
}
return path_substitutions.get(dname, mx._get_dependency_path(dname))
mx_subst.path_substitutions.register_with_arg('path', distribution_paths)
sulong.extensions.runLLVMUnittests(functools.partial(svm.native_junit, native_image, build_args=['--language:llvm']))
开发者ID:charig,项目名称:truffle,代码行数:21,代码来源:mx_vm_gate.py
示例4: graalvm_svm
def graalvm_svm():
"""
Gives access to image building withing the GraalVM release. Requires dynamic import of substratevm.
"""
native_image_cmd = join(mx_vm.graalvm_output(), 'bin', 'native-image')
svm = mx.suite('substratevm')
if not exists(native_image_cmd) or not svm:
mx.abort("Image building not accessible in GraalVM {}. Build GraalVM with native-image support".format(mx_vm.graalvm_dist_name()))
@contextmanager
def native_image_context(common_args=None, hosted_assertions=True):
with svm.extensions.native_image_context(common_args, hosted_assertions, native_image_cmd=native_image_cmd) as native_image:
yield native_image
return native_image_context, svm.extensions
开发者ID:charig,项目名称:truffle,代码行数:13,代码来源:mx_vm_gate.py
示例5: build
def build(self):
if not self.subject.build:
mx.log("...skip build of {}".format(self.subject))
return
mx.log('...perform build of {}'.format(self.subject))
rubyDir = _suite.dir
mavenDir = os.path.join(rubyDir, 'mxbuild', 'mvn')
# HACK: since the maven executable plugin does not configure the
# java executable that is used we unfortunately need to append it to the PATH
javaHome = os.getenv('JAVA_HOME')
if javaHome:
os.environ["PATH"] = os.environ["JAVA_HOME"] + '/bin' + os.pathsep + os.environ["PATH"]
mx.logv('Setting PATH to {}'.format(os.environ["PATH"]))
mx.logv('Calling java -version')
mx.run(['java', '-version'])
# Truffle version
truffle = mx.suite('truffle')
truffle_commit = truffle.vc.parent(truffle.dir)
maven_version_arg = '-Dtruffle.version=' + truffle_commit
maven_repo_arg = '-Dmaven.repo.local=' + mavenDir
mx.run_mx(['maven-install', '--repo', mavenDir, '--only', 'TRUFFLE_API,TRUFFLE_DEBUG,TRUFFLE_DSL_PROCESSOR,TRUFFLE_TCK'], suite=truffle)
open(os.path.join(rubyDir, 'VERSION'), 'w').write('graal-vm\n')
# Build jruby-truffle
env = os.environ.copy()
env['JRUBY_BUILD_MORE_QUIET'] = 'true'
mx.run_maven(['-q', '--version', maven_repo_arg], nonZeroIsFatal=False, cwd=rubyDir, env=env)
mx.log('Building without tests')
mx.run_maven(['-q', '-DskipTests', maven_version_arg, maven_repo_arg], cwd=rubyDir, env=env)
mx.log('Building complete version')
mx.run_maven(['-q', '-Pcomplete', '-DskipTests', maven_version_arg, maven_repo_arg], cwd=rubyDir, env=env)
mx.run(['zip', '-d', 'maven/jruby-complete/target/jruby-complete-graal-vm.jar', 'META-INF/jruby.home/lib/*'], cwd=rubyDir)
mx.run(['bin/jruby', 'bin/gem', 'install', 'bundler', '-v', '1.10.6'], cwd=rubyDir)
mx.log('...finished build of {}'.format(self.subject))
开发者ID:mishin,项目名称:jruby,代码行数:48,代码来源:mx_jruby.py
示例6: build
def build(self):
if not self.subject.build:
mx.log("...skip build of {}".format(self.subject))
return
mx.log('...perform build of {}'.format(self.subject))
rubyDir = _suite.dir
# HACK: since the maven executable plugin does not configure the
# java executable that is used we unfortunately need to append it to the PATH
javaHome = os.getenv('JAVA_HOME')
if javaHome:
os.environ["PATH"] = os.environ["JAVA_HOME"] + '/bin' + os.pathsep + os.environ["PATH"]
mx.logv('Setting PATH to {}'.format(os.environ["PATH"]))
mx.logv('Calling java -version')
mx.run(['java', '-version'])
# Truffle version
truffle = mx.suite('truffle')
truffle_commit = truffle.vc.parent(truffle.dir)
mx.run_mx(['maven-install'], suite=truffle)
open(join(rubyDir, 'VERSION'), 'w').write('graal-vm\n')
# Build jruby-truffle and
mx.run(['find', '.'], nonZeroIsFatal=False, cwd=rubyDir)
mx.run_maven(['--version'], nonZeroIsFatal=False, cwd=rubyDir)
mx.log('Building without tests')
mx.run_maven(['-DskipTests', '-Dtruffle.version=' + truffle_commit], cwd=rubyDir)
mx.log('Building complete version')
mx.run_maven(['-Pcomplete', '-DskipTests', '-Dtruffle.version=' + truffle_commit], cwd=rubyDir)
mx.run(['zip', '-d', 'maven/jruby-complete/target/jruby-complete-graal-vm.jar', 'META-INF/jruby.home/lib/*'], cwd=rubyDir)
mx.run(['bin/jruby', 'bin/gem', 'install', 'bundler', '-v', '1.10.6'], cwd=rubyDir)
开发者ID:arstrt,项目名称:jruby,代码行数:41,代码来源:mx_jruby.py
示例7: print
import mx
print("****** In mx_sample.py")
def function(args=None):
print "###### In function() for target 'fun'"
_suite = mx.suite('sample')
mx.update_commands(_suite,{
'fun' : [function]}
)
开发者ID:SwapnilGaikwad,项目名称:mxTest,代码行数:11,代码来源:mx_sample.py
示例8: r_path
from os.path import join, sep
from argparse import ArgumentParser
import mx
import mx_gate
import mx_fastr_pkgs
import os
'''
This is the launchpad for all the functions available for building/running/testing/analyzing
FastR. FastR can run with or without the Graal compiler enabled. As a convenience if the
graal-core suite is detected then the use of the Graal compiler is enabled without any
additional command line options being required to the mx command, i.e. it is as if --jdk jvmci
was passed as an mx global option.
'''
_fastr_suite = mx.suite('fastr')
'''
If this is None, then we run under the standard VM in interpreted mode only.
'''
_mx_graal = mx.suite("graal-core", fatalIfMissing=False)
_r_command_project = 'com.oracle.truffle.r.engine'
_repl_command = 'com.oracle.truffle.tools.debug.shell.client.SimpleREPLClient'
_command_class_dict = {'r': _r_command_project + ".shell.RCommand",
'rscript': _r_command_project + ".shell.RscriptCommand",
'rrepl': _repl_command,
'rembed': _r_command_project + ".shell.REmbedded",
}
# benchmarking support
def r_path():
return join(_fastr_suite.dir, 'bin', 'R')
开发者ID:zlongshen,项目名称:fastr,代码行数:31,代码来源:mx_fastr.py
示例9: dirname
import os, shutil, zipfile, re, time, sys, datetime, platform
from os.path import join, exists, dirname, isdir
from argparse import ArgumentParser, REMAINDER
import StringIO
import xml.dom.minidom
import subprocess
import mx
import mx_gate
import mx_unittest
from mx_gate import Task
from mx_unittest import unittest
_suite = mx.suite('jvmci')
JVMCI_VERSION = 9
"""
Top level directory of the JDK source workspace.
"""
_jdkSourceRoot = dirname(_suite.dir)
_JVMCI_JDK_TAG = 'jvmci'
_minVersion = mx.VersionSpec('1.9')
# max version (first _unsupported_ version)
_untilVersion = None
开发者ID:mearvk,项目名称:JVM,代码行数:29,代码来源:mx_jvmci.py
示例10:
# questions.
#
# ----------------------------------------------------------------------------------------------------
import mx
import mx_vm
import mx_subst
from mx_gate import Task
import re
import subprocess
from os.path import join, exists
import functools
from contextlib import contextmanager
_suite = mx.suite('vm')
class VmGateTasks:
compiler = 'compiler'
substratevm = 'substratevm'
sulong = 'sulong'
graal_js = 'graal-js'
graal_nodejs = 'graal-nodejs'
truffleruby = 'truffleruby'
ruby = 'ruby'
fastr = 'fastr'
graalpython = 'graalpython'
integration = 'integration'
开发者ID:charig,项目名称:truffle,代码行数:29,代码来源:mx_vm_gate.py
示例11: create_asm_parser
def create_asm_parser(args=None, out=None):
"""create the inline assembly parser using antlr"""
mx.suite("truffle").extensions.create_parser("com.oracle.truffle.llvm.asm.amd64", "com.oracle.truffle.llvm.asm.amd64", "InlineAssembly", COPYRIGHT_HEADER_BSD, args, out)
开发者ID:jakre,项目名称:sulong,代码行数:3,代码来源:mx_sulong.py
示例12: deploy_binary_if_truffle_head
# GNU General Public License version 2
# GNU Lesser General Public License version 2.1
import sys
import os
import pipes
import shutil
import tarfile
from os.path import join, exists, isdir
import mx
import mx_unittest
TimeStampFile = mx.TimeStampFile
_suite = mx.suite('jruby')
rubyDists = [
'RUBY',
'RUBY-TEST'
]
def deploy_binary_if_truffle_head(args):
"""If the active branch is 'truffle-head', deploy binaries for the primary suite to remote maven repository."""
primary_branch = 'truffle-head'
active_branch = mx.VC.get_vc(_suite.dir).active_branch(_suite.dir)
if active_branch == primary_branch:
return mx.command_function('deploy-binary')(args)
else:
mx.log('The active branch is "%s". Binaries are deployed only if the active branch is "%s".' % (active_branch, primary_branch))
return 0
开发者ID:sumitmah,项目名称:jruby,代码行数:31,代码来源:mx_jruby.py
示例13: JMHRunnerToolsBenchmarkSuite
import os
from os.path import exists
import re
import mx
from mx_unittest import unittest
from mx_jackpot import jackpot
from mx_gate import Task
from urlparse import urljoin
import mx_gate
import mx_unittest
import mx_benchmark
import mx_sdk
_suite = mx.suite('tools')
class JMHRunnerToolsBenchmarkSuite(mx_benchmark.JMHRunnerBenchmarkSuite):
def name(self):
return "tools"
def group(self):
return "Graal"
def subgroup(self):
return "tools"
def extraVmArgs(self):
return ['-XX:-UseJVMCIClassLoader'] + super(JMHRunnerToolsBenchmarkSuite, self).extraVmArgs()
开发者ID:charig,项目名称:truffle,代码行数:30,代码来源:mx_tools.py
示例14: _benchmarksDirectory
def _benchmarksDirectory():
return join(os.path.abspath(join(mx.suite('sulong').dir, os.pardir)), 'sulong-benchmarks')
开发者ID:jakre,项目名称:sulong,代码行数:2,代码来源:mx_sulong_benchmarks.py
示例15: hosting_registry
suTruffleOptions = [
'-Dgraal.TruffleBackgroundCompilation=false',
'-Dgraal.TruffleTimeThreshold=1000000',
'-Dgraal.TruffleInliningMaxCallerSize=10000',
'-Dgraal.TruffleCompilationExceptionsAreFatal=true',
mx_subst.path_substitutions.substitute('-Dpolyglot.llvm.libraryPath=<path:SULONG_LIBS>'),
'-Dpolyglot.llvm.libraries=libgmp.so.10']
sulongCmdLine = suTruffleOptions + mx_sulong.getClasspathOptions() + ['-XX:-UseJVMCIClassLoader', "com.oracle.truffle.llvm.launcher.LLVMLauncher"] + ['bench.bc']
result = self.host_vm().run(cwd, sulongCmdLine + args)
# reset current Directory
os.chdir(self.currentDir)
return result
def hosting_registry(self):
return java_vm_registry
_suite = mx.suite("sulong")
native_vm_registry = VmRegistry("Native", known_host_registries=[java_vm_registry])
native_vm_registry.add_vm(GccVm('O0', ['-O0']), _suite)
native_vm_registry.add_vm(ClangVm('O0', ['-O0']), _suite)
native_vm_registry.add_vm(GccVm('O1', ['-O1']), _suite)
native_vm_registry.add_vm(ClangVm('O1', ['-O1']), _suite)
native_vm_registry.add_vm(GccVm('O2', ['-O2']), _suite)
native_vm_registry.add_vm(ClangVm('O2', ['-O2']), _suite)
native_vm_registry.add_vm(GccVm('O3', ['-O3']), _suite)
native_vm_registry.add_vm(ClangVm('O3', ['-O3']), _suite)
native_vm_registry.add_vm(SulongVm(), _suite, 10)
开发者ID:jakre,项目名称:sulong,代码行数:30,代码来源:mx_sulong_benchmarks.py
示例16: truffle_language_ensure
def truffle_language_ensure(language_flag, version=None, native_image_root=None, early_exit=False, extract=True, debug_gr_8964=False):
"""
Ensures that we have a valid suite for the given language_flag, by downloading a binary if necessary
and providing the suite distribution artifacts in the native-image directory hierachy (via symlinks).
:param language_flag: native-image language_flag whose truffle-language we want to use
:param version: if not specified and no TRUFFLE_<LANG>_VERSION set latest binary deployed master revision gets downloaded
:param native_image_root: the native_image_root directory where the the artifacts get installed to
:return: language suite for the given language_flag
"""
if not native_image_root:
native_image_root = suite_native_image_root()
version_env_var = 'TRUFFLE_' + language_flag.upper() + '_VERSION'
if not version and os.environ.has_key(version_env_var):
version = os.environ[version_env_var]
if language_flag not in flag_suitename_map:
mx.abort('No truffle-language uses language_flag \'' + language_flag + '\'')
language_dir = join('languages', language_flag)
if early_exit and exists(join(native_image_root, language_dir)):
mx.logv('Early exit mode: Language subdir \'' + language_flag + '\' exists. Skip suite.import_suite.')
return None
language_entry = flag_suitename_map[language_flag]
language_suite_name = language_entry[0]
language_repo_name = language_entry[3] if len(language_entry) > 3 else None
urlinfos = [
mx.SuiteImportURLInfo(mx_urlrewrites.rewriteurl('https://curio.ssw.jku.at/nexus/content/repositories/snapshots'),
'binary',
mx.vc_system('binary'))
]
failure_warning = None
if not version and not mx.suite(language_suite_name, fatalIfMissing=False):
# If no specific version requested use binary import of last recently deployed master version
repo_suite_name = language_repo_name if language_repo_name else language_suite_name
repo_url = mx_urlrewrites.rewriteurl('https://github.com/graalvm/{0}.git'.format(repo_suite_name))
version = mx.SuiteImport.resolve_git_branchref(repo_url, 'binary', abortOnError=False)
if not version:
failure_warning = 'Resolving \'binary\' against ' + repo_url + ' failed'
language_suite = suite.import_suite(
language_suite_name,
version=version,
urlinfos=urlinfos,
kind=None,
in_subdir=bool(language_repo_name)
)
if not language_suite:
if failure_warning:
mx.warn(failure_warning)
mx.abort('Binary suite not found and no local copy of ' + language_suite_name + ' available.')
if not extract:
if not exists(join(native_image_root, language_dir)):
mx.abort('Language subdir \'' + language_flag + '\' should already exist with extract=False')
return language_suite
language_suite_depnames = language_entry[1]
language_deps = language_suite.dists + language_suite.libs
language_deps = [dep for dep in language_deps if dep.name in language_suite_depnames]
native_image_layout(language_deps, language_dir, native_image_root, debug_gr_8964=debug_gr_8964)
language_suite_nativedistnames = language_entry[2]
language_nativedists = [dist for dist in language_suite.dists if dist.name in language_suite_nativedistnames]
native_image_extract(language_nativedists, language_dir, native_image_root)
option_properties = join(language_suite.mxDir, 'native-image.properties')
target_path = remove_existing_symlink(join(native_image_root, language_dir, 'native-image.properties'))
if exists(option_properties):
if not exists(target_path):
mx.logv('Add symlink to ' + str(option_properties))
symlink_or_copy(option_properties, target_path, debug_gr_8964=debug_gr_8964)
else:
native_image_option_properties('languages', language_flag, native_image_root)
return language_suite
开发者ID:charig,项目名称:truffle,代码行数:80,代码来源:mx_substratevm.py
示例17: gate
# Reflective access to java.lang.invoke.VarHandle*.
GRAAL_COMPILER_FLAGS += ['--add-opens', 'java.base/java.lang.invoke=ALL-UNNAMED']
# Reflective access to java.lang.Reference.referent.
GRAAL_COMPILER_FLAGS += ['--add-opens', 'java.base/java.lang.ref=ALL-UNNAMED']
# Reflective access to org.graalvm.nativeimage.impl.ImageSingletonsSupport.
GRAAL_COMPILER_FLAGS += ['--add-exports', 'org.graalvm.graal_sdk/org.graalvm.nativeimage.impl=ALL-UNNAMED']
# Reflective access to jdk.internal.ref.CleanerImpl$PhantomCleanableRef.
GRAAL_COMPILER_FLAGS += ['--add-opens', 'java.base/jdk.internal.ref=ALL-UNNAMED']
# Disable the check for JDK-8 graal version.
GRAAL_COMPILER_FLAGS += ['-Dsubstratevm.IgnoreGraalVersionCheck=true']
# Reflective access to java.net.URL.getURLStreamHandler.
GRAAL_COMPILER_FLAGS += ['--add-opens', 'java.base/java.net=ALL-UNNAMED']
IMAGE_ASSERTION_FLAGS = ['-H:+VerifyGraalGraphs', '-H:+VerifyGraalGraphEdges', '-H:+VerifyPhases']
suite = mx.suite('substratevm')
svmSuites = [suite]
orig_command_gate = mx.command_function('gate')
orig_command_build = mx.command_function('build')
gate_run = False
def gate(args):
global gate_run
gate_run = True
orig_command_gate(args)
def build(args, vm=None):
if any([opt in args for opt in ['-h', '--help']]):
orig_command_build(args, vm)
开发者ID:charig,项目名称:truffle,代码行数:31,代码来源:mx_substratevm.py
示例18: javadoc
# questions.
#
# ----------------------------------------------------------------------------------------------------
import os
import re
import subprocess
import mx
from mx_unittest import unittest
from mx_sigtest import sigtest
from mx_gate import Task
import mx_gate
_suite = mx.suite("truffle")
def javadoc(args, vm=None):
"""build the Javadoc for all API packages"""
mx.javadoc(["--unified"] + args)
def build(args, vm=None):
"""build the Java sources"""
opts2 = mx.build(["--source", "1.7"] + args)
assert len(opts2.remainder) == 0
def sl(args):
"""run an SL program"""
开发者ID:eregon,项目名称:truffle,代码行数:31,代码来源:mx_truffle.py
示例19: running
import mx
import mx_gate
import mx_fastr_pkgtest
import os
import shutil
'''
This is the launchpad for all the functions available for building/running/testing/analyzing
FastR. Ideally this code would be completely VM agnostic, i.e., be able to build/run with a variety
of VMs without change. That is currently not feasible due to the requirement that building
must use an pre-existing VM and running (for performance testing) must use a Graal-enabled VM.
It would require separate build/run steps to finesse this. However, running under a standards
VM is supported by dynamically checking if the jvmci suite is available
'''
_fastr_suite = mx.suite('fastr')
'''
If this is None, then we run under the standard VM in interpreted mode only.
Even if this is not None the global mx option --vm original forces interpreted mode
'''
_mx_jvmci = mx.suite("jvmci", fatalIfMissing=False)
class FakeJVMCI:
def get_vm(self):
# should only happen if jvmci vm selected
mx.abort('FakeJVMCI.get_vm called')
def get_jvmci_jdk(self):
return mx.get_jdk()
def build(self, args):
开发者ID:anukat2015,项目名称:fastr,代码行数:31,代码来源:mx_fastr.py
示例20: isJVMCIEnabled
import os
from os.path import join, exists, abspath
from argparse import ArgumentParser
import sanitycheck
import re
import mx
from mx_gate import Task
from sanitycheck import _noneAsEmptyList
from mx_unittest import unittest
from mx_graal_bench import dacapo
import mx_gate
import mx_unittest
_suite = mx.suite("graal-core")
_jdk = mx.get_jdk(tag="default")
assert _jdk.javaCompliance >= "1.9"
def isJVMCIEnabled(vm):
return True
_jvmciModes = {
"hosted": ["-XX:+UnlockExperimentalVMOptions", "-XX:+EnableJVMCI"],
"jit": ["-XX:+UnlockExperimentalVMOptions", "-XX:+EnableJVMCI", "-XX:+UseJVMCICompiler"],
"disabled": [],
}
开发者ID:sanzinger,项目名称:graal-core,代码行数:30,代码来源:mx_graal_9.py
注:本文中的mx.suite函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论