From 1f52ffc4745b45677652ff36b9d6ee7202c2e54f Mon Sep 17 00:00:00 2001 From: Daeyeon Jeong Date: Thu, 25 Nov 2021 17:44:36 +0900 Subject: [PATCH] LWNode_Release_211125_a0a51e9 Change-Id: I9f3a7943f3afad669201a7ec8f2b139da44ad506 --- .gitignore | 1 + configure.py | 10 + lib/internal/bootstrap/pre_execution.js | 6 +- lib/internal/lwnode/setup.js | 88 + lib/internal/process/per_thread.js | 53 +- .../deps/escargot/build/config.cmake | 4 +- .../escargotshim/deps/escargot/src/Escargot.h | 34 +- .../deps/escargot/src/api/EscargotPublic.cpp | 44 +- .../deps/escargot/src/api/EscargotPublic.h | 82 +- .../src/builtins/BuiltinArrayBuffer.cpp | 146 +- .../escargot/src/builtins/BuiltinAtomics.cpp | 8 +- .../escargot/src/builtins/BuiltinObject.cpp | 17 +- .../escargot/src/builtins/BuiltinReflect.cpp | 24 +- .../escargot/src/builtins/BuiltinRegExp.cpp | 2 +- .../src/builtins/BuiltinSharedArrayBuffer.cpp | 77 +- .../escargot/src/builtins/BuiltinString.cpp | 4 +- .../deps/escargot/src/debugger/Debugger.cpp | 2 +- .../escargot/src/interpreter/ByteCode.cpp | 35 +- .../deps/escargot/src/interpreter/ByteCode.h | 20 +- .../src/interpreter/ByteCodeInterpreter.cpp | 4 +- .../src/interpreter/ByteCodeInterpreter.h | 4 +- .../deps/escargot/src/parser/CodeBlock.h | 2 +- .../deps/escargot/src/parser/Lexer.cpp | 11 + .../deps/escargot/src/parser/Lexer.h | 4 +- .../escargot/src/parser/ParserStringView.h | 2 - .../src/parser/esprima_cpp/esprima.cpp | 94 +- .../escargot/src/parser/esprima_cpp/esprima.h | 1 + .../deps/escargot/src/runtime/ArrayBuffer.h | 14 + .../src/runtime/ArrayBufferObject.cpp | 40 +- .../escargot/src/runtime/ArrayBufferObject.h | 3 +- .../escargot/src/runtime/BackingStore.cpp | 52 +- .../deps/escargot/src/runtime/BackingStore.h | 88 +- .../deps/escargot/src/runtime/Context.h | 1 - .../deps/escargot/src/runtime/DateObject.cpp | 5 - .../deps/escargot/src/runtime/EncodedValue.h | 4 +- .../escargot/src/runtime/ExecutionPauser.h | 4 +- .../escargot/src/runtime/FunctionObject.cpp | 210 +- .../escargot/src/runtime/FunctionObject.h | 2 +- .../escargot/src/runtime/FunctionTemplate.cpp | 4 +- .../escargot/src/runtime/GeneratorObject.h | 4 +- .../deps/escargot/src/runtime/Global.cpp | 17 + .../deps/escargot/src/runtime/Object.cpp | 49 +- .../src/runtime/ObjectStructurePropertyName.h | 12 +- .../escargot/src/runtime/ObjectTemplate.cpp | 68 +- .../deps/escargot/src/runtime/Platform.h | 6 + .../deps/escargot/src/runtime/PromiseObject.h | 2 +- .../deps/escargot/src/runtime/SetObject.h | 2 +- .../src/runtime/SharedArrayBufferObject.cpp | 34 +- .../src/runtime/SharedArrayBufferObject.h | 3 +- .../escargot/src/runtime/StaticStrings.cpp | 3 + .../deps/escargot/src/runtime/StaticStrings.h | 8 + .../deps/escargot/src/runtime/String.h | 7 +- .../deps/escargot/src/runtime/Template.cpp | 48 +- .../deps/escargot/src/runtime/Template.h | 90 +- .../deps/escargot/src/runtime/VMInstance.cpp | 20 +- .../deps/escargot/src/shell/Shell.cpp | 5 + .../deps/escargot/src/util/Util.h | 5 +- .../third_party/GCutil/bdwgc/include/gc_cpp.h | 25 +- .../third_party/GCutil/bdwgc/os_dep.c | 18 + .../third_party/GCutil/bdwgc/reclaim.c | 2 + .../GCutil/windows/GCutil/config.h | 17 +- .../deps/escargot/third_party/libbf/cutils.c | 6 +- .../deps/escargot/third_party/libbf/cutils.h | 89 +- .../wasm/wabt/third_party/gtest/.clang-format | 4 - .../wasm/wabt/third_party/gtest/.gitignore | 84 - .../wasm/wabt/third_party/gtest/BUILD.bazel | 179 - .../wabt/third_party/gtest/CMakeLists.txt | 36 - .../wabt/third_party/gtest/CONTRIBUTING.md | 142 - .../wasm/wabt/third_party/gtest/LICENSE | 28 - .../wasm/wabt/third_party/gtest/README.md | 134 - .../wasm/wabt/third_party/gtest/WORKSPACE | 23 - .../wasm/wabt/third_party/gtest/appveyor.yml | 154 - .../third_party/gtest/ci/build-linux-bazel.sh | 37 - .../third_party/gtest/ci/build-platformio.sh | 2 - .../wabt/third_party/gtest/ci/env-linux.sh | 41 - .../wasm/wabt/third_party/gtest/ci/env-osx.sh | 47 - .../third_party/gtest/ci/get-nprocessors.sh | 48 - .../third_party/gtest/ci/install-linux.sh | 49 - .../wabt/third_party/gtest/ci/install-osx.sh | 40 - .../gtest/ci/install-platformio.sh | 5 - .../wabt/third_party/gtest/ci/log-config.sh | 51 - .../wasm/wabt/third_party/gtest/ci/travis.sh | 44 - .../gtest/googlemock/CMakeLists.txt | 233 - .../third_party/gtest/googlemock/CONTRIBUTORS | 40 - .../wabt/third_party/gtest/googlemock/LICENSE | 28 - .../third_party/gtest/googlemock/README.md | 44 - .../gtest/googlemock/cmake/gmock.pc.in | 11 - .../gtest/googlemock/cmake/gmock_main.pc.in | 11 - .../gtest/googlemock/docs/cheat_sheet.md | 781 -- .../gtest/googlemock/docs/cook_book.md | 4270 ------ .../gtest/googlemock/docs/for_dummies.md | 700 - .../gtest/googlemock/docs/gmock_faq.md | 396 - .../googlemock/include/gmock/gmock-actions.h | 1142 -- .../include/gmock/gmock-cardinalities.h | 157 - .../include/gmock/gmock-function-mocker.h | 253 - .../include/gmock/gmock-generated-actions.h | 1884 --- .../gmock/gmock-generated-actions.h.pump | 627 - .../gmock/gmock-generated-function-mockers.h | 752 - .../gmock-generated-function-mockers.h.pump | 227 - .../include/gmock/gmock-generated-matchers.h | 1097 -- .../gmock/gmock-generated-matchers.h.pump | 346 - .../googlemock/include/gmock/gmock-matchers.h | 4568 ------ .../include/gmock/gmock-more-actions.h | 162 - .../include/gmock/gmock-more-matchers.h | 92 - .../include/gmock/gmock-nice-strict.h | 215 - .../include/gmock/gmock-spec-builders.h | 1985 --- .../gtest/googlemock/include/gmock/gmock.h | 101 - .../include/gmock/internal/custom/README.md | 16 - .../internal/custom/gmock-generated-actions.h | 10 - .../custom/gmock-generated-actions.h.pump | 12 - .../gmock/internal/custom/gmock-matchers.h | 36 - .../gmock/internal/custom/gmock-port.h | 39 - .../gmock/internal/gmock-internal-utils.h | 513 - .../include/gmock/internal/gmock-port.h | 87 - .../include/gmock/internal/gmock-pp.h | 317 - .../googlemock/scripts/fuse_gmock_files.py | 240 - .../googlemock/scripts/generator/LICENSE | 203 - .../gtest/googlemock/scripts/generator/README | 34 - .../scripts/generator/README.cppclean | 115 - .../scripts/generator/cpp/__init__.py | 0 .../googlemock/scripts/generator/cpp/ast.py | 1736 --- .../scripts/generator/cpp/gmock_class.py | 227 - .../scripts/generator/cpp/gmock_class_test.py | 466 - .../scripts/generator/cpp/keywords.py | 59 - .../scripts/generator/cpp/tokenize.py | 287 - .../googlemock/scripts/generator/cpp/utils.py | 41 - .../googlemock/scripts/generator/gmock_gen.py | 31 - .../gtest/googlemock/scripts/gmock-config.in | 303 - .../gtest/googlemock/scripts/gmock_doctor.py | 640 - .../gtest/googlemock/scripts/upload.py | 1387 -- .../gtest/googlemock/scripts/upload_gmock.py | 78 - .../gtest/googlemock/src/gmock-all.cc | 46 - .../googlemock/src/gmock-cardinalities.cc | 155 - .../googlemock/src/gmock-internal-utils.cc | 200 - .../gtest/googlemock/src/gmock-matchers.cc | 462 - .../googlemock/src/gmock-spec-builders.cc | 888 -- .../third_party/gtest/googlemock/src/gmock.cc | 213 - .../gtest/googlemock/src/gmock_main.cc | 65 - .../gtest/googletest/CMakeLists.txt | 328 - .../third_party/gtest/googletest/CONTRIBUTORS | 37 - .../wabt/third_party/gtest/googletest/LICENSE | 28 - .../third_party/gtest/googletest/README.md | 244 - .../gtest/googletest/cmake/Config.cmake.in | 9 - .../gtest/googletest/cmake/gtest.pc.in | 10 - .../gtest/googletest/cmake/gtest_main.pc.in | 11 - .../googletest/cmake/internal_utils.cmake | 358 - .../gtest/googletest/cmake/libgtest.la.in | 21 - .../gtest/googletest/docs/advanced.md | 2567 ---- .../third_party/gtest/googletest/docs/faq.md | 753 - .../gtest/googletest/docs/pkgconfig.md | 141 - .../gtest/googletest/docs/primer.md | 567 - .../gtest/googletest/docs/pump_manual.md | 190 - .../gtest/googletest/docs/samples.md | 22 - .../include/gtest/gtest-death-test.h | 343 - .../googletest/include/gtest/gtest-matchers.h | 750 - .../googletest/include/gtest/gtest-message.h | 218 - .../include/gtest/gtest-param-test.h | 503 - .../googletest/include/gtest/gtest-printers.h | 928 -- .../googletest/include/gtest/gtest-spi.h | 238 - .../include/gtest/gtest-test-part.h | 184 - .../include/gtest/gtest-typed-test.h | 330 - .../gtest/googletest/include/gtest/gtest.h | 2478 ---- .../include/gtest/gtest_pred_impl.h | 359 - .../googletest/include/gtest/gtest_prod.h | 61 - .../include/gtest/internal/custom/README.md | 56 - .../gtest/internal/custom/gtest-port.h | 37 - .../gtest/internal/custom/gtest-printers.h | 42 - .../include/gtest/internal/custom/gtest.h | 37 - .../internal/gtest-death-test-internal.h | 304 - .../include/gtest/internal/gtest-filepath.h | 211 - .../include/gtest/internal/gtest-internal.h | 1380 -- .../include/gtest/internal/gtest-param-util.h | 883 -- .../include/gtest/internal/gtest-port-arch.h | 107 - .../include/gtest/internal/gtest-port.h | 2231 --- .../include/gtest/internal/gtest-string.h | 171 - .../include/gtest/internal/gtest-type-util.h | 3335 ----- .../gtest/internal/gtest-type-util.h.pump | 302 - .../gtest/googletest/samples/prime_tables.h | 126 - .../gtest/googletest/samples/sample1.cc | 66 - .../gtest/googletest/samples/sample1.h | 41 - .../googletest/samples/sample10_unittest.cc | 139 - .../googletest/samples/sample1_unittest.cc | 151 - .../gtest/googletest/samples/sample2.cc | 54 - .../gtest/googletest/samples/sample2.h | 81 - .../googletest/samples/sample2_unittest.cc | 107 - .../gtest/googletest/samples/sample3-inl.h | 172 - .../googletest/samples/sample3_unittest.cc | 149 - .../gtest/googletest/samples/sample4.cc | 54 - .../gtest/googletest/samples/sample4.h | 53 - .../googletest/samples/sample4_unittest.cc | 53 - .../googletest/samples/sample5_unittest.cc | 196 - .../googletest/samples/sample6_unittest.cc | 224 - .../googletest/samples/sample7_unittest.cc | 117 - .../googletest/samples/sample8_unittest.cc | 154 - .../googletest/samples/sample9_unittest.cc | 156 - .../gtest/googletest/scripts/common.py | 83 - .../googletest/scripts/fuse_gtest_files.py | 253 - .../googletest/scripts/gen_gtest_pred_impl.py | 730 - .../gtest/googletest/scripts/gtest-config.in | 274 - .../gtest/googletest/scripts/pump.py | 855 -- .../gtest/googletest/scripts/release_docs.py | 158 - .../gtest/googletest/scripts/upload.py | 1387 -- .../gtest/googletest/scripts/upload_gtest.py | 78 - .../gtest/googletest/src/gtest-all.cc | 48 - .../gtest/googletest/src/gtest-death-test.cc | 1653 --- .../gtest/googletest/src/gtest-filepath.cc | 379 - .../gtest/googletest/src/gtest-internal-inl.h | 1211 -- .../gtest/googletest/src/gtest-matchers.cc | 97 - .../gtest/googletest/src/gtest-port.cc | 1399 -- .../gtest/googletest/src/gtest-printers.cc | 442 - .../gtest/googletest/src/gtest-test-part.cc | 104 - .../gtest/googletest/src/gtest-typed-test.cc | 118 - .../third_party/gtest/googletest/src/gtest.cc | 6177 -------- .../gtest/googletest/src/gtest_main.cc | 47 - .../wasm/wabt/third_party/gtest/library.json | 59 - .../wabt/third_party/gtest/platformio.ini | 31 - .../wasm/wabt/third_party/ply/.gitignore | 9 - .../wasm/wabt/third_party/ply/ANNOUNCE | 40 - .../wasm/wabt/third_party/ply/CHANGES | 1343 -- .../wasm/wabt/third_party/ply/MANIFEST.in | 8 - .../wasm/wabt/third_party/ply/README.md | 273 - .../wasm/wabt/third_party/ply/TODO | 16 - .../wabt/third_party/ply/doc/internal.html | 874 -- .../wasm/wabt/third_party/ply/doc/makedoc.py | 194 - .../wasm/wabt/third_party/ply/doc/ply.html | 3459 ----- .../wabt/third_party/ply/example/BASIC/README | 79 - .../third_party/ply/example/BASIC/basic.py | 71 - .../third_party/ply/example/BASIC/basiclex.py | 74 - .../third_party/ply/example/BASIC/basiclog.py | 79 - .../ply/example/BASIC/basinterp.py | 441 - .../third_party/ply/example/BASIC/basparse.py | 424 - .../third_party/ply/example/BASIC/dim.bas | 14 - .../third_party/ply/example/BASIC/func.bas | 5 - .../third_party/ply/example/BASIC/gcd.bas | 22 - .../third_party/ply/example/BASIC/gosub.bas | 13 - .../third_party/ply/example/BASIC/hello.bas | 4 - .../third_party/ply/example/BASIC/linear.bas | 17 - .../third_party/ply/example/BASIC/maxsin.bas | 12 - .../third_party/ply/example/BASIC/powers.bas | 13 - .../third_party/ply/example/BASIC/rand.bas | 4 - .../third_party/ply/example/BASIC/sales.bas | 20 - .../third_party/ply/example/BASIC/sears.bas | 18 - .../third_party/ply/example/BASIC/sqrt1.bas | 5 - .../third_party/ply/example/BASIC/sqrt2.bas | 4 - .../ply/example/GardenSnake/GardenSnake.py | 709 - .../ply/example/GardenSnake/README | 5 - .../wasm/wabt/third_party/ply/example/README | 10 - .../wabt/third_party/ply/example/ansic/README | 2 - .../third_party/ply/example/ansic/clex.py | 164 - .../third_party/ply/example/ansic/cparse.py | 864 -- .../wabt/third_party/ply/example/calc/calc.py | 107 - .../third_party/ply/example/calcdebug/calc.py | 113 - .../third_party/ply/example/calceof/calc.py | 115 - .../third_party/ply/example/classcalc/calc.py | 157 - .../wabt/third_party/ply/example/cleanup.sh | 2 - .../ply/example/closurecalc/calc.py | 130 - .../third_party/ply/example/hedit/hedit.py | 48 - .../ply/example/newclasscalc/calc.py | 160 - .../third_party/ply/example/optcalc/README | 9 - .../third_party/ply/example/optcalc/calc.py | 119 - .../third_party/ply/example/unicalc/calc.py | 117 - .../wabt/third_party/ply/example/yply/README | 41 - .../wabt/third_party/ply/example/yply/ylex.py | 112 - .../third_party/ply/example/yply/yparse.py | 217 - .../wabt/third_party/ply/example/yply/yply.py | 53 - .../wasm/wabt/third_party/ply/ply/__init__.py | 5 - .../wasm/wabt/third_party/ply/ply/cpp.py | 908 -- .../wasm/wabt/third_party/ply/ply/ctokens.py | 133 - .../wasm/wabt/third_party/ply/ply/lex.py | 1097 -- .../wasm/wabt/third_party/ply/ply/yacc.py | 3471 ----- .../wasm/wabt/third_party/ply/ply/ygen.py | 74 - .../wasm/wabt/third_party/ply/setup.cfg | 2 - .../wasm/wabt/third_party/ply/setup.py | 31 - .../wabt/third_party/testsuite/.gitignore | 2 - .../third_party/testsuite/Contributing.md | 8 - .../wasm/wabt/third_party/testsuite/LICENSE | 202 - .../wasm/wabt/third_party/testsuite/README.md | 18 - .../wabt/third_party/testsuite/address.wast | 610 - .../wabt/third_party/testsuite/align.wast | 866 -- .../third_party/testsuite/binary-leb128.wast | 1001 -- .../wabt/third_party/testsuite/binary.wast | 993 -- .../wabt/third_party/testsuite/block.wast | 1491 -- .../wasm/wabt/third_party/testsuite/br.wast | 657 - .../wabt/third_party/testsuite/br_if.wast | 665 - .../wabt/third_party/testsuite/br_table.wast | 1628 --- .../wasm/wabt/third_party/testsuite/call.wast | 518 - .../third_party/testsuite/call_indirect.wast | 971 -- .../wabt/third_party/testsuite/comments.wast | Bin 701 -> 0 bytes .../wabt/third_party/testsuite/const.wast | 1061 -- .../third_party/testsuite/conversions.wast | 702 - .../wabt/third_party/testsuite/custom.wast | 120 - .../wasm/wabt/third_party/testsuite/data.wast | 458 - .../wasm/wabt/third_party/testsuite/elem.wast | 442 - .../third_party/testsuite/endianness.wast | 217 - .../wabt/third_party/testsuite/exports.wast | 230 - .../third_party/testsuite/extract-parts.sh | 35 - .../wasm/wabt/third_party/testsuite/f32.wast | 2533 ---- .../third_party/testsuite/f32_bitwise.wast | 376 - .../wabt/third_party/testsuite/f32_cmp.wast | 2422 ---- .../wasm/wabt/third_party/testsuite/f64.wast | 2533 ---- .../third_party/testsuite/f64_bitwise.wast | 376 - .../wabt/third_party/testsuite/f64_cmp.wast | 2422 ---- .../wasm/wabt/third_party/testsuite/fac.wast | 109 - .../third_party/testsuite/float_exprs.wast | 2570 ---- .../third_party/testsuite/float_literals.wast | 507 - .../third_party/testsuite/float_memory.wast | 157 - .../third_party/testsuite/float_misc.wast | 678 - .../wabt/third_party/testsuite/forward.wast | 20 - .../wasm/wabt/third_party/testsuite/func.wast | 961 -- .../wabt/third_party/testsuite/func_ptrs.wast | 106 - .../wabt/third_party/testsuite/global.wast | 599 - .../wasm/wabt/third_party/testsuite/i32.wast | 976 -- .../wasm/wabt/third_party/testsuite/i64.wast | 485 - .../wasm/wabt/third_party/testsuite/if.wast | 1550 -- .../wabt/third_party/testsuite/imports.wast | 644 - .../third_party/testsuite/inline-module.wast | 1 - .../wabt/third_party/testsuite/int_exprs.wast | 350 - .../third_party/testsuite/int_literals.wast | 151 - .../wabt/third_party/testsuite/labels.wast | 328 - .../third_party/testsuite/left-to-right.wast | 233 - .../wabt/third_party/testsuite/linking.wast | 388 - .../wasm/wabt/third_party/testsuite/load.wast | 567 - .../wabt/third_party/testsuite/local_get.wast | 226 - .../wabt/third_party/testsuite/local_set.wast | 362 - .../wabt/third_party/testsuite/local_tee.wast | 639 - .../wasm/wabt/third_party/testsuite/loop.wast | 785 -- .../wabt/third_party/testsuite/memory.wast | 242 - .../third_party/testsuite/memory_grow.wast | 355 - .../testsuite/memory_redundancy.wast | 65 - .../third_party/testsuite/memory_size.wast | 85 - .../third_party/testsuite/memory_trap.wast | 270 - .../wabt/third_party/testsuite/names.wast | 1107 -- .../wasm/wabt/third_party/testsuite/nop.wast | 426 - .../proposals/annotations/annotations.wast | 195 - .../bulk-memory-operations/binary.wast | 1090 -- .../bulk-memory-operations/bulk.wast | 351 - .../bulk-memory-operations/custom.wast | 130 - .../bulk-memory-operations/data.wast | 345 - .../bulk-memory-operations/elem.wast | 433 - .../bulk-memory-operations/imports.wast | 593 - .../bulk-memory-operations/linking.wast | 395 - .../bulk-memory-operations/memory_copy.wast | 5577 -------- .../bulk-memory-operations/memory_fill.wast | 685 - .../bulk-memory-operations/memory_init.wast | 967 -- .../bulk-memory-operations/table_copy.wast | 1595 --- .../bulk-memory-operations/table_init.wast | 1776 --- .../exception-handling/binary-leb128.wast | 964 -- .../proposals/exception-handling/binary.wast | 1545 -- .../exception-handling/br_table.wast | 1619 --- .../proposals/exception-handling/bulk.wast | 351 - .../exception-handling/call_indirect.wast | 1017 -- .../proposals/exception-handling/custom.wast | 130 - .../proposals/exception-handling/data.wast | 345 - .../proposals/exception-handling/elem.wast | 468 - .../proposals/exception-handling/exports.wast | 196 - .../proposals/exception-handling/global.wast | 507 - .../proposals/exception-handling/imports.wast | 605 - .../proposals/exception-handling/linking.wast | 453 - .../exception-handling/memory_copy.wast | 5578 -------- .../exception-handling/memory_fill.wast | 686 - .../exception-handling/memory_grow.wast | 379 - .../exception-handling/memory_init.wast | 967 -- .../exception-handling/ref_func.wast | 115 - .../exception-handling/ref_is_null.wast | 58 - .../exception-handling/ref_null.wast | 10 - .../proposals/exception-handling/select.wast | 492 - .../exception-handling/table-sub.wast | 21 - .../proposals/exception-handling/table.wast | 54 - .../exception-handling/table_copy.wast | 3082 ---- .../exception-handling/table_fill.wast | 153 - .../exception-handling/table_get.wast | 88 - .../exception-handling/table_grow.wast | 173 - .../exception-handling/table_init.wast | 2143 --- .../exception-handling/table_set.wast | 119 - .../exception-handling/table_size.wast | 86 - .../exception-handling/unreached-invalid.wast | 710 - .../function-references/binary-leb128.wast | 964 -- .../proposals/function-references/binary.wast | 1546 -- .../function-references/br_on_null.wast | 75 - .../function-references/br_table.wast | 1693 --- .../proposals/function-references/bulk.wast | 351 - .../function-references/call_indirect.wast | 1017 -- .../function-references/call_ref.wast | 193 - .../proposals/function-references/custom.wast | 130 - .../proposals/function-references/data.wast | 345 - .../proposals/function-references/elem.wast | 468 - .../function-references/exports.wast | 196 - .../proposals/function-references/func.wast | 948 -- .../function-references/func_bind.wast | 529 - .../proposals/function-references/global.wast | 507 - .../proposals/function-references/if.wast | 1550 -- .../function-references/imports.wast | 605 - .../proposals/function-references/let.wast | 302 - .../function-references/linking.wast | 627 - .../function-references/memory_copy.wast | 5578 -------- .../function-references/memory_fill.wast | 686 - .../function-references/memory_grow.wast | 379 - .../function-references/memory_init.wast | 967 -- .../proposals/function-references/ref.wast | 80 - .../function-references/ref_as_non_null.wast | 46 - .../function-references/ref_func.wast | 115 - .../function-references/ref_is_null.wast | 85 - .../function-references/ref_null.wast | 14 - .../function-references/return_call_ref.wast | 351 - .../proposals/function-references/select.wast | 519 - .../function-references/table-sub.wast | 32 - .../proposals/function-references/table.wast | 70 - .../function-references/table_copy.wast | 3082 ---- .../function-references/table_fill.wast | 153 - .../function-references/table_get.wast | 88 - .../function-references/table_grow.wast | 173 - .../function-references/table_init.wast | 2143 --- .../function-references/table_set.wast | 119 - .../function-references/table_size.wast | 86 - .../function-references/type-equivalence.wast | 447 - .../unreached-invalid.wast | 706 - .../testsuite/proposals/memory64/address.wast | 610 - .../proposals/memory64/address64.wast | 582 - .../testsuite/proposals/memory64/align64.wast | 866 -- .../proposals/memory64/binary-leb128.wast | 1001 -- .../testsuite/proposals/memory64/binary.wast | 993 -- .../proposals/memory64/endianness64.wast | 217 - .../proposals/memory64/float_memory64.wast | 157 - .../testsuite/proposals/memory64/load64.wast | 567 - .../testsuite/proposals/memory64/memory.wast | 242 - .../proposals/memory64/memory64.wast | 188 - .../proposals/memory64/memory_grow64.wast | 95 - .../memory64/memory_redundancy64.wast | 65 - .../proposals/memory64/memory_trap64.wast | 269 - .../reference-types/binary-leb128.wast | 964 -- .../proposals/reference-types/binary.wast | 1545 -- .../proposals/reference-types/br_table.wast | 1619 --- .../proposals/reference-types/bulk.wast | 351 - .../reference-types/call_indirect.wast | 1017 -- .../proposals/reference-types/custom.wast | 130 - .../proposals/reference-types/data.wast | 345 - .../proposals/reference-types/elem.wast | 468 - .../proposals/reference-types/exports.wast | 196 - .../proposals/reference-types/global.wast | 513 - .../proposals/reference-types/imports.wast | 605 - .../proposals/reference-types/linking.wast | 453 - .../reference-types/memory_copy.wast | 5578 -------- .../reference-types/memory_fill.wast | 686 - .../reference-types/memory_grow.wast | 379 - .../reference-types/memory_init.wast | 967 -- .../proposals/reference-types/ref_func.wast | 115 - .../reference-types/ref_is_null.wast | 58 - .../proposals/reference-types/ref_null.wast | 10 - .../proposals/reference-types/select.wast | 492 - .../proposals/reference-types/table-sub.wast | 21 - .../proposals/reference-types/table.wast | 54 - .../proposals/reference-types/table_copy.wast | 3082 ---- .../proposals/reference-types/table_fill.wast | 153 - .../proposals/reference-types/table_get.wast | 88 - .../proposals/reference-types/table_grow.wast | 173 - .../proposals/reference-types/table_init.wast | 2143 --- .../proposals/reference-types/table_set.wast | 119 - .../proposals/reference-types/table_size.wast | 86 - .../reference-types/unreached-invalid.wast | 710 - .../proposals/simd/simd_address.wast | 157 - .../testsuite/proposals/simd/simd_align.wast | 355 - .../proposals/simd/simd_bit_shift.wast | 1104 -- .../proposals/simd/simd_bitwise.wast | 812 -- .../proposals/simd/simd_boolean.wast | 1058 -- .../testsuite/proposals/simd/simd_const.wast | 1664 --- .../proposals/simd/simd_conversions.wast | 899 -- .../testsuite/proposals/simd/simd_f32x4.wast | 2407 ---- .../proposals/simd/simd_f32x4_arith.wast | 5476 -------- .../proposals/simd/simd_f32x4_cmp.wast | 8167 ----------- .../proposals/simd/simd_f32x4_pmin_pmax.wast | 11676 ---------------- .../proposals/simd/simd_f32x4_rounding.wast | 424 - .../testsuite/proposals/simd/simd_f64x2.wast | 2459 ---- .../proposals/simd/simd_f64x2_arith.wast | 5483 -------- .../proposals/simd/simd_f64x2_cmp.wast | 8337 ----------- .../proposals/simd/simd_f64x2_pmin_pmax.wast | 11676 ---------------- .../proposals/simd/simd_f64x2_rounding.wast | 424 - .../proposals/simd/simd_i16x8_arith.wast | 634 - .../proposals/simd/simd_i16x8_arith2.wast | 610 - .../proposals/simd/simd_i16x8_cmp.wast | 1901 --- .../simd_i16x8_extadd_pairwise_i8x16.wast | 68 - .../simd/simd_i16x8_extmul_i8x16.wast | 404 - .../simd/simd_i16x8_q15mulr_sat_s.wast | 110 - .../proposals/simd/simd_i16x8_sat_arith.wast | 742 - .../proposals/simd/simd_i32x4_arith.wast | 634 - .../proposals/simd/simd_i32x4_arith2.wast | 494 - .../proposals/simd/simd_i32x4_cmp.wast | 1920 --- .../proposals/simd/simd_i32x4_dot_i16x8.wast | 110 - .../simd_i32x4_extadd_pairwise_i16x8.wast | 68 - .../simd/simd_i32x4_extmul_i16x8.wast | 404 - .../simd/simd_i32x4_trunc_sat_f32x4.wast | 239 - .../simd/simd_i32x4_trunc_sat_f64x2.wast | 239 - .../proposals/simd/simd_i64x2_arith.wast | 652 - .../proposals/simd/simd_i64x2_arith2.wast | 78 - .../proposals/simd/simd_i64x2_cmp.wast | 414 - .../simd/simd_i64x2_extmul_i32x4.wast | 404 - .../proposals/simd/simd_i8x16_arith.wast | 426 - .../proposals/simd/simd_i8x16_arith2.wast | 713 - .../proposals/simd/simd_i8x16_cmp.wast | 1847 --- .../proposals/simd/simd_i8x16_sat_arith.wast | 718 - .../simd/simd_int_to_int_extend.wast | 599 - .../testsuite/proposals/simd/simd_lane.wast | 1265 -- .../testsuite/proposals/simd/simd_load.wast | 188 - .../proposals/simd/simd_load16_lane.wast | 211 - .../proposals/simd/simd_load32_lane.wast | 143 - .../proposals/simd/simd_load64_lane.wast | 97 - .../proposals/simd/simd_load8_lane.wast | 299 - .../proposals/simd/simd_load_extend.wast | 384 - .../proposals/simd/simd_load_splat.wast | 261 - .../proposals/simd/simd_load_zero.wast | 154 - .../testsuite/proposals/simd/simd_splat.wast | 430 - .../testsuite/proposals/simd/simd_store.wast | 166 - .../proposals/simd/simd_store16_lane.wast | 299 - .../proposals/simd/simd_store32_lane.wast | 199 - .../proposals/simd/simd_store64_lane.wast | 131 - .../proposals/simd/simd_store8_lane.wast | 427 - .../proposals/tail-call/return_call.wast | 202 - .../tail-call/return_call_indirect.wast | 511 - .../testsuite/proposals/threads/atomic.wast | 539 - .../testsuite/proposals/threads/exports.wast | 205 - .../testsuite/proposals/threads/imports.wast | 605 - .../testsuite/proposals/threads/memory.wast | 246 - .../wabt/third_party/testsuite/return.wast | 479 - .../wabt/third_party/testsuite/select.wast | 487 - .../testsuite/skip-stack-guard-page.wast | 2284 --- .../wabt/third_party/testsuite/stack.wast | 239 - .../wabt/third_party/testsuite/start.wast | 105 - .../wabt/third_party/testsuite/store.wast | 417 - .../wabt/third_party/testsuite/switch.wast | 150 - .../wabt/third_party/testsuite/table.wast | 54 - .../wabt/third_party/testsuite/token.wast | 10 - .../wabt/third_party/testsuite/traps.wast | 91 - .../wasm/wabt/third_party/testsuite/type.wast | 50 - .../third_party/testsuite/unreachable.wast | 304 - .../testsuite/unreached-invalid.wast | 709 - .../wabt/third_party/testsuite/unwind.wast | 267 - .../third_party/testsuite/update-testsuite.sh | 161 - .../testsuite/utf8-custom-section-id.wast | 1792 --- .../testsuite/utf8-import-field.wast | 2672 ---- .../testsuite/utf8-import-module.wast | 2672 ---- .../testsuite/utf8-invalid-encoding.wast | 176 - .../wasm/wabt/third_party/uvwasi/.gitignore | 66 - .../wabt/third_party/uvwasi/CMakeLists.txt | 127 - .../wasm/wabt/third_party/uvwasi/LICENSE | 21 - .../wasm/wabt/third_party/uvwasi/README.md | 2456 ---- .../wabt/third_party/uvwasi/include/uvwasi.h | 274 - .../third_party/uvwasi/include/wasi_serdes.h | 145 - .../third_party/uvwasi/include/wasi_types.h | 324 - .../wasm/wabt/third_party/uvwasi/src/clocks.c | 195 - .../wasm/wabt/third_party/uvwasi/src/clocks.h | 13 - .../wasm/wabt/third_party/uvwasi/src/debug.h | 15 - .../wabt/third_party/uvwasi/src/fd_table.c | 450 - .../wabt/third_party/uvwasi/src/fd_table.h | 70 - .../third_party/uvwasi/src/path_resolver.c | 488 - .../third_party/uvwasi/src/path_resolver.h | 19 - .../wabt/third_party/uvwasi/src/poll_oneoff.c | 267 - .../wabt/third_party/uvwasi/src/poll_oneoff.h | 60 - .../wabt/third_party/uvwasi/src/uv_mapping.c | 273 - .../wabt/third_party/uvwasi/src/uv_mapping.h | 16 - .../wasm/wabt/third_party/uvwasi/src/uvwasi.c | 2501 ---- .../third_party/uvwasi/src/uvwasi_alloc.h | 11 - .../wabt/third_party/uvwasi/src/wasi_rights.c | 62 - .../wabt/third_party/uvwasi/src/wasi_rights.h | 104 - .../wabt/third_party/uvwasi/src/wasi_serdes.c | 259 - .../wabt/third_party/wasm-c-api/.gitignore | 2 - .../wabt/third_party/wasm-c-api/Dockerfile | 18 - .../wasm/wabt/third_party/wasm-c-api/LICENSE | 202 - .../wasm/wabt/third_party/wasm-c-api/Makefile | 306 - .../wabt/third_party/wasm-c-api/README.md | 112 - .../third_party/wasm-c-api/example/callback.c | 168 - .../wasm-c-api/example/callback.cc | 145 - .../wasm-c-api/example/callback.wasm | Bin 102 -> 0 bytes .../wasm-c-api/example/callback.wat | 10 - .../third_party/wasm-c-api/example/finalize.c | 109 - .../wasm-c-api/example/finalize.cc | 103 - .../wasm-c-api/example/finalize.wasm | Bin 75 -> 0 bytes .../wasm-c-api/example/finalize.wat | 5 - .../third_party/wasm-c-api/example/global.c | 232 - .../third_party/wasm-c-api/example/global.cc | 196 - .../wasm-c-api/example/global.wasm | Bin 576 -> 0 bytes .../third_party/wasm-c-api/example/global.wat | 27 - .../third_party/wasm-c-api/example/hello.c | 108 - .../third_party/wasm-c-api/example/hello.cc | 91 - .../third_party/wasm-c-api/example/hello.wasm | Bin 71 -> 0 bytes .../third_party/wasm-c-api/example/hello.wat | 4 - .../third_party/wasm-c-api/example/hostref.c | 269 - .../third_party/wasm-c-api/example/hostref.cc | 232 - .../wasm-c-api/example/hostref.wasm | Bin 231 -> 0 bytes .../wasm-c-api/example/hostref.wat | 24 - .../third_party/wasm-c-api/example/memory.c | 222 - .../third_party/wasm-c-api/example/memory.cc | 172 - .../wasm-c-api/example/memory.wasm | Bin 146 -> 0 bytes .../third_party/wasm-c-api/example/memory.wat | 11 - .../third_party/wasm-c-api/example/multi.c | 157 - .../third_party/wasm-c-api/example/multi.cc | 118 - .../third_party/wasm-c-api/example/multi.wasm | Bin 81 -> 0 bytes .../third_party/wasm-c-api/example/multi.wat | 7 - .../third_party/wasm-c-api/example/reflect.c | 169 - .../third_party/wasm-c-api/example/reflect.cc | 138 - .../wasm-c-api/example/reflect.wasm | Bin 124 -> 0 bytes .../wasm-c-api/example/reflect.wat | 6 - .../wasm-c-api/example/serialize.c | 123 - .../wasm-c-api/example/serialize.cc | 103 - .../wasm-c-api/example/serialize.wasm | Bin 71 -> 0 bytes .../wasm-c-api/example/serialize.wat | 4 - .../third_party/wasm-c-api/example/start.c | 105 - .../third_party/wasm-c-api/example/start.cc | 88 - .../third_party/wasm-c-api/example/start.wasm | Bin 48 -> 0 bytes .../third_party/wasm-c-api/example/start.wat | 4 - .../third_party/wasm-c-api/example/table.c | 213 - .../third_party/wasm-c-api/example/table.cc | 192 - .../third_party/wasm-c-api/example/table.wasm | Bin 139 -> 0 bytes .../third_party/wasm-c-api/example/table.wat | 12 - .../third_party/wasm-c-api/example/threads.c | 153 - .../third_party/wasm-c-api/example/threads.cc | 124 - .../wasm-c-api/example/threads.wasm | Bin 84 -> 0 bytes .../wasm-c-api/example/threads.wat | 5 - .../third_party/wasm-c-api/example/trap.c | 155 - .../third_party/wasm-c-api/example/trap.cc | 126 - .../third_party/wasm-c-api/example/trap.wasm | Bin 105 -> 0 bytes .../third_party/wasm-c-api/example/trap.wat | 5 - .../third_party/wasm-c-api/include/wasm.h | 704 - .../third_party/wasm-c-api/include/wasm.hh | 746 - .../0001-BUILD.gn-add-wasm-v8-lowlevel.patch | 28 - .../third_party/wasm-c-api/src/wasm-bin.cc | 570 - .../third_party/wasm-c-api/src/wasm-bin.hh | 25 - .../wabt/third_party/wasm-c-api/src/wasm-c.cc | 1019 -- .../wasm-c-api/src/wasm-v8-lowlevel.cc | 443 - .../wasm-c-api/src/wasm-v8-lowlevel.hh | 79 - .../third_party/wasm-c-api/src/wasm-v8.cc | 2177 --- .../escargot/third_party/yarr/WTFBridge.h | 3 +- .../deps/escargot/tools/check_tidy.py | 2 +- .../deps/escargot/tools/debugger/debugger.py | 7 +- .../tools/debugger/tests/do_break_no_arg.cmd | 5 + .../debugger/tests/do_break_no_arg.expected | 13 + .../do_pending_breakpoints_unavailable.cmd | 9 + ...o_pending_breakpoints_unavailable.expected | 18 + .../deps/escargot/tools/run-tests.py | 2 +- lwnode/code/escargotshim/escargotshim.gyp | 1 - .../code/escargotshim/src/api-environment.cc | 3 +- lwnode/code/escargotshim/src/api-scripts.cc | 15 + .../escargotshim/src/api-serialization.cc | 93 +- lwnode/code/escargotshim/src/api-template.cc | 94 +- lwnode/code/escargotshim/src/api.h | 1 - lwnode/code/escargotshim/src/api/es-helper.cc | 37 +- lwnode/code/escargotshim/src/api/es-helper.h | 4 +- .../code/escargotshim/src/api/extra-data.cc | 2 +- lwnode/code/escargotshim/src/api/extra-data.h | 18 +- lwnode/code/escargotshim/src/api/isolate.cc | 49 +- lwnode/code/escargotshim/src/api/object.cc | 12 +- .../code/escargotshim/src/api/serializer.cc | 320 - lwnode/code/escargotshim/src/api/serializer.h | 60 - .../escargotshim/src/lwnode/lwnode-loader.cc | 8 +- lwnode/code/escargotshim/src/lwnode/lwnode.cc | 2 - node.gyp | 1 + packaging/lwnode.spec | 2 +- 655 files changed, 1418 insertions(+), 335796 deletions(-) create mode 100644 lib/internal/lwnode/setup.js delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/.clang-format delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/.gitignore delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/BUILD.bazel delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/CMakeLists.txt delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/CONTRIBUTING.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/LICENSE delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/README.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/WORKSPACE delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/appveyor.yml delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/build-linux-bazel.sh delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/build-platformio.sh delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/env-linux.sh delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/env-osx.sh delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/get-nprocessors.sh delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/install-linux.sh delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/install-osx.sh delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/install-platformio.sh delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/log-config.sh delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/travis.sh delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/CMakeLists.txt delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/CONTRIBUTORS delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/LICENSE delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/README.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/cmake/gmock.pc.in delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/cmake/gmock_main.pc.in delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/cheat_sheet.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/cook_book.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/for_dummies.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/gmock_faq.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-actions.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-cardinalities.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-function-mocker.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-actions.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-actions.h.pump delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-matchers.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-matchers.h.pump delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-matchers.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-more-actions.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-more-matchers.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-nice-strict.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-spec-builders.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/internal/custom/README.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/internal/custom/gmock-matchers.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/internal/custom/gmock-port.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/internal/gmock-internal-utils.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/internal/gmock-port.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/internal/gmock-pp.h delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/fuse_gmock_files.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/generator/LICENSE delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/generator/README delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/generator/README.cppclean delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/generator/cpp/__init__.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/generator/cpp/ast.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/generator/cpp/gmock_class.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/generator/cpp/gmock_class_test.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/generator/cpp/keywords.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/generator/cpp/tokenize.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/generator/cpp/utils.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/generator/gmock_gen.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/gmock-config.in delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/gmock_doctor.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/upload.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/scripts/upload_gmock.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/src/gmock-all.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/src/gmock-cardinalities.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/src/gmock-internal-utils.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/src/gmock-matchers.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/src/gmock-spec-builders.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/src/gmock.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/src/gmock_main.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/CMakeLists.txt delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/CONTRIBUTORS delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/LICENSE delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/README.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/cmake/Config.cmake.in delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/cmake/gtest.pc.in delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/cmake/gtest_main.pc.in delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/cmake/internal_utils.cmake delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/cmake/libgtest.la.in delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/docs/advanced.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/docs/faq.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/docs/pkgconfig.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/docs/primer.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/docs/pump_manual.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/docs/samples.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/gtest-death-test.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/gtest-matchers.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/gtest-message.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/gtest-param-test.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/gtest-printers.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/gtest-spi.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/gtest-test-part.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/gtest-typed-test.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/gtest.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/gtest_pred_impl.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/gtest_prod.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/internal/custom/README.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/internal/custom/gtest-port.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/internal/custom/gtest-printers.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/internal/custom/gtest.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/internal/gtest-death-test-internal.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/internal/gtest-filepath.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/internal/gtest-internal.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/internal/gtest-param-util.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/internal/gtest-port-arch.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/internal/gtest-port.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/internal/gtest-string.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/internal/gtest-type-util.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/include/gtest/internal/gtest-type-util.h.pump delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/prime_tables.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample1.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample1.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample10_unittest.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample1_unittest.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample2.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample2.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample2_unittest.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample3-inl.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample3_unittest.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample4.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample4.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample4_unittest.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample5_unittest.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample6_unittest.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample7_unittest.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample8_unittest.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/samples/sample9_unittest.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/scripts/common.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/scripts/fuse_gtest_files.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/scripts/gen_gtest_pred_impl.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/scripts/gtest-config.in delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/scripts/pump.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/scripts/release_docs.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/scripts/upload.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/scripts/upload_gtest.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/src/gtest-all.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/src/gtest-death-test.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/src/gtest-filepath.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/src/gtest-internal-inl.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/src/gtest-matchers.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/src/gtest-port.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/src/gtest-printers.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/src/gtest-test-part.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/src/gtest-typed-test.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/src/gtest.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googletest/src/gtest_main.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/library.json delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/platformio.ini delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/.gitignore delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/ANNOUNCE delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/CHANGES delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/MANIFEST.in delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/README.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/TODO delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/doc/internal.html delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/doc/makedoc.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/doc/ply.html delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/README delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/basic.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/basiclex.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/basiclog.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/basinterp.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/basparse.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/dim.bas delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/func.bas delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/gcd.bas delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/gosub.bas delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/hello.bas delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/linear.bas delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/maxsin.bas delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/powers.bas delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/rand.bas delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/sales.bas delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/sears.bas delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/sqrt1.bas delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/BASIC/sqrt2.bas delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/GardenSnake/GardenSnake.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/GardenSnake/README delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/README delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/ansic/README delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/ansic/clex.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/ansic/cparse.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/calc/calc.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/calcdebug/calc.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/calceof/calc.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/classcalc/calc.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/cleanup.sh delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/closurecalc/calc.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/hedit/hedit.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/newclasscalc/calc.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/optcalc/README delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/optcalc/calc.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/unicalc/calc.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/yply/README delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/yply/ylex.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/yply/yparse.py delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/example/yply/yply.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/ply/__init__.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/ply/cpp.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/ply/ctokens.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/ply/lex.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/ply/yacc.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/ply/ygen.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/setup.cfg delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/ply/setup.py delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/.gitignore delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/Contributing.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/LICENSE delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/README.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/address.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/align.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/binary-leb128.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/binary.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/block.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/br.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/br_if.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/br_table.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/call.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/call_indirect.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/comments.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/const.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/conversions.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/custom.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/data.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/elem.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/endianness.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/exports.wast delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/extract-parts.sh delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/f32.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/f32_bitwise.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/f32_cmp.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/f64.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/f64_bitwise.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/f64_cmp.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/fac.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/float_exprs.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/float_literals.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/float_memory.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/float_misc.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/forward.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/func.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/func_ptrs.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/global.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/i32.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/i64.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/if.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/imports.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/inline-module.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/int_exprs.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/int_literals.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/labels.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/left-to-right.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/linking.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/load.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/local_get.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/local_set.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/local_tee.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/loop.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/memory.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/memory_grow.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/memory_redundancy.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/memory_size.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/memory_trap.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/names.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/nop.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/annotations/annotations.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/bulk-memory-operations/binary.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/bulk-memory-operations/bulk.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/bulk-memory-operations/custom.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/bulk-memory-operations/data.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/bulk-memory-operations/elem.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/bulk-memory-operations/imports.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/bulk-memory-operations/linking.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/bulk-memory-operations/memory_copy.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/bulk-memory-operations/memory_fill.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/bulk-memory-operations/memory_init.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/bulk-memory-operations/table_copy.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/bulk-memory-operations/table_init.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/binary-leb128.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/binary.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/br_table.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/bulk.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/call_indirect.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/custom.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/data.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/elem.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/exports.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/global.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/imports.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/linking.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/memory_copy.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/memory_fill.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/memory_grow.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/memory_init.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/ref_func.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/ref_is_null.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/ref_null.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/select.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/table-sub.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/table.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/table_copy.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/table_fill.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/table_get.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/table_grow.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/table_init.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/table_set.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/table_size.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/exception-handling/unreached-invalid.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/binary-leb128.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/binary.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/br_on_null.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/br_table.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/bulk.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/call_indirect.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/call_ref.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/custom.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/data.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/elem.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/exports.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/func.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/func_bind.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/global.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/if.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/imports.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/let.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/linking.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/memory_copy.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/memory_fill.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/memory_grow.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/memory_init.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/ref.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/ref_as_non_null.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/ref_func.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/ref_is_null.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/ref_null.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/return_call_ref.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/select.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/table-sub.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/table.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/table_copy.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/table_fill.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/table_get.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/table_grow.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/table_init.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/table_set.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/table_size.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/type-equivalence.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/function-references/unreached-invalid.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/memory64/address.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/memory64/address64.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/memory64/align64.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/memory64/binary-leb128.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/memory64/binary.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/memory64/endianness64.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/memory64/float_memory64.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/memory64/load64.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/memory64/memory.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/memory64/memory64.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/memory64/memory_grow64.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/memory64/memory_redundancy64.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/memory64/memory_trap64.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/binary-leb128.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/binary.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/br_table.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/bulk.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/call_indirect.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/custom.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/data.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/elem.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/exports.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/global.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/imports.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/linking.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/memory_copy.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/memory_fill.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/memory_grow.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/memory_init.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/ref_func.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/ref_is_null.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/ref_null.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/select.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/table-sub.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/table.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/table_copy.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/table_fill.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/table_get.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/table_grow.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/table_init.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/table_set.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/table_size.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/reference-types/unreached-invalid.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_address.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_align.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_bit_shift.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_bitwise.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_boolean.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_const.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_conversions.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_f32x4.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_f32x4_arith.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_f32x4_cmp.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_f32x4_pmin_pmax.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_f32x4_rounding.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_f64x2.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_f64x2_arith.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_f64x2_cmp.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_f64x2_pmin_pmax.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_f64x2_rounding.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i16x8_arith.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i16x8_arith2.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i16x8_cmp.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i16x8_extadd_pairwise_i8x16.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i16x8_extmul_i8x16.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i16x8_q15mulr_sat_s.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i16x8_sat_arith.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i32x4_arith.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i32x4_arith2.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i32x4_cmp.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i32x4_dot_i16x8.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i32x4_extadd_pairwise_i16x8.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i32x4_extmul_i16x8.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i32x4_trunc_sat_f32x4.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i32x4_trunc_sat_f64x2.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i64x2_arith.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i64x2_arith2.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i64x2_cmp.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i64x2_extmul_i32x4.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i8x16_arith.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i8x16_arith2.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i8x16_cmp.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_i8x16_sat_arith.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_int_to_int_extend.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_lane.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_load.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_load16_lane.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_load32_lane.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_load64_lane.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_load8_lane.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_load_extend.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_load_splat.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_load_zero.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_splat.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_store.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_store16_lane.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_store32_lane.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_store64_lane.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/simd/simd_store8_lane.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/tail-call/return_call.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/tail-call/return_call_indirect.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/threads/atomic.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/threads/exports.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/threads/imports.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/proposals/threads/memory.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/return.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/select.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/skip-stack-guard-page.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/stack.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/start.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/store.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/switch.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/table.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/token.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/traps.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/type.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/unreachable.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/unreached-invalid.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/unwind.wast delete mode 100755 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/update-testsuite.sh delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/utf8-custom-section-id.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/utf8-import-field.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/utf8-import-module.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/testsuite/utf8-invalid-encoding.wast delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/.gitignore delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/CMakeLists.txt delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/LICENSE delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/README.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/include/uvwasi.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/include/wasi_serdes.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/include/wasi_types.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/clocks.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/clocks.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/debug.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/fd_table.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/fd_table.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/path_resolver.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/path_resolver.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/poll_oneoff.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/poll_oneoff.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/uv_mapping.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/uv_mapping.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/uvwasi.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/uvwasi_alloc.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/wasi_rights.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/wasi_rights.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/uvwasi/src/wasi_serdes.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/.gitignore delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/Dockerfile delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/LICENSE delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/Makefile delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/README.md delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/callback.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/callback.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/callback.wasm delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/callback.wat delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/finalize.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/finalize.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/finalize.wasm delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/finalize.wat delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/global.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/global.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/global.wasm delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/global.wat delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/hello.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/hello.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/hello.wasm delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/hello.wat delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/hostref.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/hostref.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/hostref.wasm delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/hostref.wat delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/memory.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/memory.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/memory.wasm delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/memory.wat delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/multi.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/multi.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/multi.wasm delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/multi.wat delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/reflect.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/reflect.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/reflect.wasm delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/reflect.wat delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/serialize.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/serialize.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/serialize.wasm delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/serialize.wat delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/start.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/start.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/start.wasm delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/start.wat delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/table.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/table.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/table.wasm delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/table.wat delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/threads.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/threads.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/threads.wasm delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/threads.wat delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/trap.c delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/trap.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/trap.wasm delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/example/trap.wat delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/include/wasm.h delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/include/wasm.hh delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/patch/0001-BUILD.gn-add-wasm-v8-lowlevel.patch delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/src/wasm-bin.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/src/wasm-bin.hh delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/src/wasm-c.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/src/wasm-v8-lowlevel.cc delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/src/wasm-v8-lowlevel.hh delete mode 100644 lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/wasm-c-api/src/wasm-v8.cc create mode 100644 lwnode/code/escargotshim/deps/escargot/tools/debugger/tests/do_break_no_arg.cmd create mode 100644 lwnode/code/escargotshim/deps/escargot/tools/debugger/tests/do_break_no_arg.expected create mode 100644 lwnode/code/escargotshim/deps/escargot/tools/debugger/tests/do_pending_breakpoints_unavailable.cmd create mode 100644 lwnode/code/escargotshim/deps/escargot/tools/debugger/tests/do_pending_breakpoints_unavailable.expected delete mode 100644 lwnode/code/escargotshim/src/api/serializer.cc delete mode 100644 lwnode/code/escargotshim/src/api/serializer.h diff --git a/.gitignore b/.gitignore index 3e830e9..a237d38 100644 --- a/.gitignore +++ b/.gitignore @@ -144,6 +144,7 @@ __pycache__ *~ # === lwnode === +.circleci/gbs.conf kuep_net_signer.sh bdwgcUsage.dat diff --git a/configure.py b/configure.py index 074fdec..34800a3 100755 --- a/configure.py +++ b/configure.py @@ -167,6 +167,12 @@ def get_lwnode_gyp_options(): options.verbose = False return args + +def configure_lwnode(o): + o['variables']['javascript_engine'] = 'escargot' if options.engine == 'escargot' else 'v8' + if options.engine == 'escargot' : + o['variables']['lwnode_external_builtin_script'] = b(options.enable_external_builtin_script) + o['variables']['lwnode_reload_script'] = b(options.enable_reload_script) # end of @lwnode # Options should be in alphabetical order but keep --prefix at the top, @@ -1904,6 +1910,10 @@ configure_intl(output) configure_static(output) configure_inspector(output) configure_section_file(output) +# @lwnode +configure_lwnode(output) +# end of @lwnode + # Forward OSS-Fuzz settings output['variables']['ossfuzz'] = b(options.ossfuzz) diff --git a/lib/internal/bootstrap/pre_execution.js b/lib/internal/bootstrap/pre_execution.js index 9689e2a..6826b52 100644 --- a/lib/internal/bootstrap/pre_execution.js +++ b/lib/internal/bootstrap/pre_execution.js @@ -66,7 +66,11 @@ function prepareMainThreadExecution(expandArgv1 = false) { initializeClusterIPC(); initializeDeprecations(); - initializeWASI(); + + if (process.lwnode.isEnabledFeature('WASI')) { + initializeWASI(); + } + initializeCJSLoader(); initializeESMLoader(); diff --git a/lib/internal/lwnode/setup.js b/lib/internal/lwnode/setup.js new file mode 100644 index 0000000..284add2 --- /dev/null +++ b/lib/internal/lwnode/setup.js @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2021-present Samsung Electronics Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const useEscargot = process.config.variables.javascript_engine == "escargot"; +const isDebugBuild = + process.config.target_defaults.default_configuration == "Debug"; + +// @note using `process.features` is considerable +const disabledFeatures = new Set(["WASI"]); + +// @note 'binding' is process module binding +function createProcessEntry(binding) { + function _internalLog(...args) { + if (binding.print) { + binding.print.apply(null, args); + } + } + + return { + _print: (...args) => { + _internalLog.apply(null, arguments); + }, + _ptr: (...args) => { + if (isDebugBuild && binding.print) { + binding.print.ptr.apply(null, args); + } + }, + _stack: (...args) => { + if (isDebugBuild && binding.print) { + binding.print.stack.apply(null, args); + } + }, + PssUsage: (...args) => { + if (binding.PssUsage) { + return binding.PssUsage.apply(null, args); + } + }, + PssSwapUsage: (...args) => { + if (binding.PssSwapUsage) { + return binding.PssSwapUsage.apply(null, args); + } + }, + RssUsage: (...args) => { + if (binding.PssUsage) { + return binding.RssUsage.apply(null, args); + } + }, + MemSnapshot: (...args) => { + if (binding.MemSnapshot) { + return binding.MemSnapshot.apply(null, args); + } + }, + isReloadScriptEnabled: () => { + return !!binding.CreateReloadableSourceFromFile; + }, + CreateReloadableSourceFromFile: (...args) => { + if (binding.CreateReloadableSourceFromFile) { + return binding.CreateReloadableSourceFromFile.apply(null, args); + } + }, + isEnabledFeature: (name) => { + if (useEscargot == false) { + return true; + } + + let enabled = !disabledFeatures.has(name); + _internalLog(`feature '${name}': ${enabled}`); + return enabled; + }, + }; +} + +module.exports = { + createProcessEntry, +}; diff --git a/lib/internal/process/per_thread.js b/lib/internal/process/per_thread.js index 4fa7167..d02fc48 100644 --- a/lib/internal/process/per_thread.js +++ b/lib/internal/process/per_thread.js @@ -35,6 +35,9 @@ const { const format = require('internal/util/inspect').format; const constants = internalBinding('constants').os.signals; +// @lwnode +const lwnodeSetup = require('internal/lwnode/setup'); + function assert(x, msg) { if (!x) throw new ERR_ASSERTION(msg || 'assertion error'); } @@ -225,55 +228,9 @@ function wrapProcessMethods(binding) { }; } - // @lwnode - const lwnode = { - _print: (...args) => { - if (binding.print) { - binding.print.apply(null, args); - } - }, - _ptr: (...args) => { - if (binding.print) { - binding.print.ptr.apply(null, args); - } - }, - _stack: (...args) => { - if (binding.print) { - binding.print.stack.apply(null, args); - } - }, - PssUsage: (...args) => { - if (binding.PssUsage) { - return binding.PssUsage.apply(null, args); - } - }, - PssSwapUsage: (...args) => { - if (binding.PssSwapUsage) { - return binding.PssSwapUsage.apply(null, args); - } - }, - RssUsage: (...args) => { - if (binding.PssUsage) { - return binding.RssUsage.apply(null, args); - } - }, - MemSnapshot: (...args) => { - if (binding.MemSnapshot) { - return binding.MemSnapshot.apply(null, args); - } - }, - isReloadScriptEnabled: () => { - return !!(binding.CreateReloadableSourceFromFile); - }, - CreateReloadableSourceFromFile: (...args) => { - if (binding.CreateReloadableSourceFromFile) { - return binding.CreateReloadableSourceFromFile.apply(null, args); - } - }, - }; - return { - lwnode, + // @lwnode + lwnode: lwnodeSetup.createProcessEntry(binding), _rawDebug, hrtime, hrtimeBigInt, diff --git a/lwnode/code/escargotshim/deps/escargot/build/config.cmake b/lwnode/code/escargotshim/deps/escargot/build/config.cmake index 2030425..ee7f7ee 100644 --- a/lwnode/code/escargotshim/deps/escargot/build/config.cmake +++ b/lwnode/code/escargotshim/deps/escargot/build/config.cmake @@ -135,7 +135,9 @@ IF (ESCARGOT_LIBICU_SUPPORT) ENDIF() ENDIF() -IF (${ESCARGOT_HOST} STREQUAL "tizen_obs") +IF (ESCARGOT_USE_CUSTOM_LOGGING) + SET (ESCARGOT_DEFINITIONS ${ESCARGOT_DEFINITIONS} -DESCARGOT_USE_CUSTOM_LOGGING) +ELSEIF (${ESCARGOT_HOST} STREQUAL "tizen_obs") PKG_CHECK_MODULES (DLOG REQUIRED dlog) SET (ESCARGOT_LIBRARIES ${ESCARGOT_LIBRARIES} ${DLOG_LIBRARIES}) SET (ESCARGOT_INCDIRS ${ESCARGOT_INCDIRS} ${DLOG_INCLUDE_DIRS}) diff --git a/lwnode/code/escargotshim/deps/escargot/src/Escargot.h b/lwnode/code/escargotshim/deps/escargot/src/Escargot.h index 657b182..91a1d87 100755 --- a/lwnode/code/escargotshim/deps/escargot/src/Escargot.h +++ b/lwnode/code/escargotshim/deps/escargot/src/Escargot.h @@ -135,9 +135,6 @@ #if defined(COMPILER_MSVC) #define strncasecmp _strnicmp #define strcasecmp _stricmp -#ifndef NDEBUG -#define _ITERATOR_DEBUG_LEVEL 0 -#endif #endif #ifndef ATTRIBUTE_NO_SANITIZE_ADDRESS @@ -179,6 +176,21 @@ #define NOMINMAX #endif +/* +we need to mark enum as unsigned if needs. +because processing enum in msvc is little different + +ex) enum Type { A, B }; +struct Foo { Type type: 1; }; +Foo f; f.type = 1; +if (f.type == Type::B) { puts("failed in msvc."); } +*/ +#if defined(COMPILER_MSVC) +#define ENSURE_ENUM_UNSIGNED : unsigned int +#else +#define ENSURE_ENUM_UNSIGNED +#endif + #if defined(COMPILER_GCC) || defined(COMPILER_CLANG) #define HAVE_BUILTIN_ATOMIC_FUNCTIONS #endif @@ -223,6 +235,10 @@ #include #include +#if defined(COMPILER_MSVC) +#include +#endif + #if defined(ENABLE_THREADING) #include #include @@ -316,6 +332,17 @@ typedef int32_t UChar32; #define FALSE 0 #endif +#ifdef ESCARGOT_USE_CUSTOM_LOGGING +// use customized logging +#include +namespace Escargot { +void customEscargotInfoLogger(const char* format, ...); +void customEscargotErrorLogger(const char* format, ...); +} // namespace Escargot +#define ESCARGOT_LOG_INFO(...) ::Escargot::customEscargotInfoLogger(__VA_ARGS__); +#define ESCARGOT_LOG_ERROR(...) ::Escargot::customEscargotErrorLogger(__VA_ARGS__); +#else +// use default logging #define ESCARGOT_LOG_INFO(...) fprintf(stdout, __VA_ARGS__); #define ESCARGOT_LOG_ERROR(...) fprintf(stderr, __VA_ARGS__); @@ -332,6 +359,7 @@ typedef int32_t UChar32; #define ESCARGOT_LOG_INFO(...) dlog_print(DLOG_INFO, "Escargot", __VA_ARGS__); #define ESCARGOT_LOG_ERROR(...) dlog_print(DLOG_ERROR, "Escargot", __VA_ARGS__); #endif +#endif #ifndef CRASH #define CRASH ASSERT_NOT_REACHED diff --git a/lwnode/code/escargotshim/deps/escargot/src/api/EscargotPublic.cpp b/lwnode/code/escargotshim/deps/escargot/src/api/EscargotPublic.cpp index 1bb2310..759802e 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/api/EscargotPublic.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/api/EscargotPublic.cpp @@ -183,6 +183,18 @@ public: m_platform->deallocateThreadLocalCustomData(); } +#ifdef ESCARGOT_USE_CUSTOM_LOGGING + virtual void customInfoLogger(const char* format, va_list arg) override + { + m_platform->customInfoLogger(format, arg); + } + + virtual void customErrorLogger(const char* format, va_list arg) override + { + m_platform->customErrorLogger(format, arg); + } +#endif + private: PlatformRef* m_platform; }; @@ -235,7 +247,7 @@ void* PlatformRef::threadLocalCustomData() return ThreadLocal::customData(); } -bool thread_local Globals::g_globalsInited = false; +thread_local bool g_globalsInited; void Globals::initialize(PlatformRef* platform) { // initialize global value or context including thread-local variables @@ -570,7 +582,7 @@ StringRef* StringRef::createFromAlreadyAllocatedBufferToCompressibleString(VMIns } #else -StringRef* StringRef::createFromUTF8ToCompressibleString(VMInstanceRef* instance, const char* s, size_t len) +StringRef* StringRef::createFromUTF8ToCompressibleString(VMInstanceRef* instance, const char* s, size_t len, bool maybeASCII) { ESCARGOT_LOG_ERROR("If you want to use this function, you should enable string compression"); RELEASE_ASSERT_NOT_REACHED(); @@ -3438,25 +3450,25 @@ FinalizationRegistryObjectRef* FinalizationRegistryObjectRef::create(ExecutionSt return toRef(new FinalizationRegistryObject(*toImpl(state), toImpl(cleanupCallback), toImpl(realm))); } -void TemplateRef::set(const TemplatePropertyNameRef& name, ValueRef* data, bool isWritable, bool isEnumerable, bool isConfigurable) +void TemplateRef::set(ValueRef* propertyName, ValueRef* data, bool isWritable, bool isEnumerable, bool isConfigurable) { - toImpl(this)->set(TemplatePropertyName(toImpl(name.value())), toImpl(data), isWritable, isEnumerable, isConfigurable); + toImpl(this)->set(toImpl(propertyName), toImpl(data), isWritable, isEnumerable, isConfigurable); } -void TemplateRef::set(const TemplatePropertyNameRef& name, TemplateRef* data, bool isWritable, bool isEnumerable, bool isConfigurable) +void TemplateRef::set(ValueRef* propertyName, TemplateRef* data, bool isWritable, bool isEnumerable, bool isConfigurable) { - toImpl(this)->set(TemplatePropertyName(toImpl(name.value())), toImpl(data), isWritable, isEnumerable, isConfigurable); + toImpl(this)->set(toImpl(propertyName), toImpl(data), isWritable, isEnumerable, isConfigurable); } -void TemplateRef::setAccessorProperty(const TemplatePropertyNameRef& name, OptionalRef getter, OptionalRef setter, bool isEnumerable, bool isConfigurable) +void TemplateRef::setAccessorProperty(ValueRef* propertyName, OptionalRef getter, OptionalRef setter, bool isEnumerable, bool isConfigurable) { Optional getterImpl(toImpl(getter.get())); Optional setterImpl(toImpl(setter.get())); - toImpl(this)->setAccessorProperty(TemplatePropertyName(toImpl(name.value())), getterImpl, setterImpl, isEnumerable, isConfigurable); + toImpl(this)->setAccessorProperty(toImpl(propertyName), getterImpl, setterImpl, isEnumerable, isConfigurable); } -void TemplateRef::setNativeDataAccessorProperty(const TemplatePropertyNameRef& name, ObjectRef::NativeDataAccessorPropertyGetter getter, ObjectRef::NativeDataAccessorPropertySetter setter, +void TemplateRef::setNativeDataAccessorProperty(ValueRef* propertyName, ObjectRef::NativeDataAccessorPropertyGetter getter, ObjectRef::NativeDataAccessorPropertySetter setter, bool isWritable, bool isEnumerable, bool isConfigurable, bool actsLikeJSGetterSetter) { ObjectRef::NativeDataAccessorPropertyData* publicData = new ObjectRef::NativeDataAccessorPropertyData(isWritable, isEnumerable, isConfigurable, getter, setter); @@ -3480,10 +3492,10 @@ void TemplateRef::setNativeDataAccessorProperty(const TemplatePropertyNameRef& n }; } - toImpl(this)->setNativeDataAccessorProperty(TemplatePropertyName(toImpl(name.value())), innerData, publicData); + toImpl(this)->setNativeDataAccessorProperty(toImpl(propertyName), innerData, publicData); } -void TemplateRef::setNativeDataAccessorProperty(const TemplatePropertyNameRef& name, ObjectRef::NativeDataAccessorPropertyData* publicData, bool actsLikeJSGetterSetter) +void TemplateRef::setNativeDataAccessorProperty(ValueRef* propertyName, ObjectRef::NativeDataAccessorPropertyData* publicData, bool actsLikeJSGetterSetter) { ObjectPropertyNativeGetterSetterData* innerData = new ObjectPropertyNativeGetterSetterData(publicData->m_isWritable, publicData->m_isEnumerable, publicData->m_isConfigurable, [](ExecutionState& state, Object* self, const Value& receiver, const EncodedValue& privateDataFromObjectPrivateArea) -> Value { @@ -3505,17 +3517,17 @@ void TemplateRef::setNativeDataAccessorProperty(const TemplatePropertyNameRef& n }; } - toImpl(this)->setNativeDataAccessorProperty(TemplatePropertyName(toImpl(name.value())), innerData, publicData); + toImpl(this)->setNativeDataAccessorProperty(toImpl(propertyName), innerData, publicData); } -bool TemplateRef::has(const TemplatePropertyNameRef& name) +bool TemplateRef::has(ValueRef* propertyName) { - return toImpl(this)->has(TemplatePropertyName(toImpl(name.value()))); + return toImpl(this)->has(toImpl(propertyName)); } -bool TemplateRef::remove(const TemplatePropertyNameRef& name) +bool TemplateRef::remove(ValueRef* propertyName) { - return toImpl(this)->remove(TemplatePropertyName(toImpl(name.value()))); + return toImpl(this)->remove(toImpl(propertyName)); } ObjectRef* TemplateRef::instantiate(ContextRef* ctx) diff --git a/lwnode/code/escargotshim/deps/escargot/src/api/EscargotPublic.h b/lwnode/code/escargotshim/deps/escargot/src/api/EscargotPublic.h index c0d35a8..8b92c20 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/api/EscargotPublic.h +++ b/lwnode/code/escargotshim/deps/escargot/src/api/EscargotPublic.h @@ -125,8 +125,6 @@ ESCARGOT_REF_LIST(DECLARE_REF_CLASS); #undef DECLARE_REF_CLASS class ESCARGOT_EXPORT Globals { - static thread_local bool g_globalsInited; - public: // Escargot has thread-independent Globals. // Users should call initialize, finalize once in the main program @@ -533,7 +531,7 @@ inline auto applyTupleIntoArgumentsOfVariadicTemplateFunction(F&& f, T&& t) class ESCARGOT_EXPORT Evaluator { public: - struct LOC { + struct ESCARGOT_EXPORT LOC { size_t line; size_t column; size_t index; @@ -546,7 +544,7 @@ public: } }; - struct StackTraceData { + struct ESCARGOT_EXPORT StackTraceData { StringRef* src; StringRef* sourceCode; LOC loc; @@ -558,7 +556,7 @@ public: StackTraceData(); }; - struct EvaluatorResult { + struct ESCARGOT_EXPORT EvaluatorResult { EvaluatorResult(); EvaluatorResult(const EvaluatorResult& src); const EvaluatorResult& operator=(EvaluatorResult& src); @@ -912,7 +910,7 @@ public: // don't store this sturct or string buffer // this is only for temporary access - struct StringBufferAccessDataRef { + struct ESCARGOT_EXPORT StringBufferAccessDataRef { bool has8BitContent; size_t length; const void* buffer; @@ -1314,7 +1312,7 @@ public: PublicFunctionIndex = 0, }; - struct NativeFunctionInfo { + struct ESCARGOT_EXPORT NativeFunctionInfo { bool m_isStrict; bool m_isConstructor; AtomicStringRef* m_name; @@ -1482,7 +1480,7 @@ public: DotAll = 1 << 5, }; - struct RegexMatchResult { + struct ESCARGOT_EXPORT RegexMatchResult { struct RegexMatchResultPiece { unsigned m_start, m_end; }; @@ -1703,40 +1701,22 @@ public: static FinalizationRegistryObjectRef* create(ExecutionStateRef* state, ObjectRef* cleanupCallback, ContextRef* realm); }; -class ESCARGOT_EXPORT TemplatePropertyNameRef { -public: - TemplatePropertyNameRef(StringRef* name = StringRef::emptyString()) - : m_ptr(name) - { - } - TemplatePropertyNameRef(SymbolRef* name) - : m_ptr(name) - { - } - - PointerValueRef* value() const - { - return m_ptr; - } - -private: - PointerValueRef* m_ptr; -}; - // don't modify template after instantiate object // it is not intented operation +// Note) only String or Symbol type is allowed for `propertyName` +// because TemplateRef is set without ExecutionStateRef, so property name conversion is impossible. class ESCARGOT_EXPORT TemplateRef { public: - void set(const TemplatePropertyNameRef& name, ValueRef* data, bool isWritable, bool isEnumerable, bool isConfigurable); - void set(const TemplatePropertyNameRef& name, TemplateRef* data, bool isWritable, bool isEnumerable, bool isConfigurable); - void setAccessorProperty(const TemplatePropertyNameRef& name, OptionalRef getter, OptionalRef setter, bool isEnumerable, bool isConfigurable); - void setNativeDataAccessorProperty(const TemplatePropertyNameRef& name, ObjectRef::NativeDataAccessorPropertyGetter getter, ObjectRef::NativeDataAccessorPropertySetter setter, + void set(ValueRef* propertyName, ValueRef* data, bool isWritable, bool isEnumerable, bool isConfigurable); + void set(ValueRef* propertyName, TemplateRef* data, bool isWritable, bool isEnumerable, bool isConfigurable); + void setAccessorProperty(ValueRef* propertyName, OptionalRef getter, OptionalRef setter, bool isEnumerable, bool isConfigurable); + void setNativeDataAccessorProperty(ValueRef* propertyName, ObjectRef::NativeDataAccessorPropertyGetter getter, ObjectRef::NativeDataAccessorPropertySetter setter, bool isWritable, bool isEnumerable, bool isConfigurable, bool actsLikeJSGetterSetter = false); - void setNativeDataAccessorProperty(const TemplatePropertyNameRef& name, ObjectRef::NativeDataAccessorPropertyData* data, bool actsLikeJSGetterSetter = false); + void setNativeDataAccessorProperty(ValueRef* propertyName, ObjectRef::NativeDataAccessorPropertyData* data, bool actsLikeJSGetterSetter = false); - bool has(const TemplatePropertyNameRef& name); + bool has(ValueRef* propertyName); // return true if removed - bool remove(const TemplatePropertyNameRef& name); + bool remove(ValueRef* propertyName); ObjectRef* instantiate(ContextRef* ctx); bool didInstantiate(); @@ -1748,10 +1728,10 @@ public: void* instanceExtraData(); }; -typedef OptionalRef (*TemplateNamedPropertyHandlerGetterCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data, const TemplatePropertyNameRef& propertyName); +typedef OptionalRef (*TemplateNamedPropertyHandlerGetterCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data, ValueRef* propertyName); // if intercepted you may returns non-empty value. // the returned value will be use futuer operation(you can return true, or false) -typedef OptionalRef (*TemplateNamedPropertyHandlerSetterCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data, const TemplatePropertyNameRef& propertyName, ValueRef* value); +typedef OptionalRef (*TemplateNamedPropertyHandlerSetterCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data, ValueRef* propertyName, ValueRef* value); enum TemplatePropertyAttribute { TemplatePropertyAttributeNotExist = 1 << 0, TemplatePropertyAttributeExist = 1 << 1, @@ -1759,16 +1739,15 @@ enum TemplatePropertyAttribute { TemplatePropertyAttributeEnumerable = 1 << 3, TemplatePropertyAttributeConfigurable = 1 << 4, }; -typedef TemplatePropertyAttribute (*TemplateNamedPropertyHandlerQueryCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data, const TemplatePropertyNameRef& propertyName); +typedef TemplatePropertyAttribute (*TemplateNamedPropertyHandlerQueryCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data, ValueRef* propertyName); // if intercepted you may returns non-empty value. // the returned value will be use futuer operation(you can return true, or false) -typedef OptionalRef (*TemplateNamedPropertyHandlerDeleteCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data, const TemplatePropertyNameRef& propertyName); -typedef GCManagedVector TemplateNamedPropertyHandlerEnumerationCallbackResultVector; -typedef TemplateNamedPropertyHandlerEnumerationCallbackResultVector (*TemplateNamedPropertyHandlerEnumerationCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data); +typedef OptionalRef (*TemplateNamedPropertyHandlerDeleteCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data, ValueRef* propertyName); +typedef ValueVectorRef* (*TemplateNamedPropertyHandlerEnumerationCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data); // if intercepted you may returns non-empty value. // the returned value will be use futuer operation(you can return true, or false) -typedef OptionalRef (*TemplateNamedPropertyHandlerDefineOwnPropertyCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data, const TemplatePropertyNameRef& propertyName, const ObjectPropertyDescriptorRef& desc); -typedef OptionalRef (*TemplateNamedPropertyHandlerGetPropertyDescriptorCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data, const TemplatePropertyNameRef& propertyName); +typedef OptionalRef (*TemplateNamedPropertyHandlerDefineOwnPropertyCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data, ValueRef* propertyName, const ObjectPropertyDescriptorRef& desc); +typedef OptionalRef (*TemplateNamedPropertyHandlerGetPropertyDescriptorCallback)(ExecutionStateRef* state, ObjectRef* self, ValueRef* receiver, void* data, ValueRef* propertyName); struct ESCARGOT_EXPORT ObjectTemplateNamedPropertyHandlerData { TemplateNamedPropertyHandlerGetterCallback getter; @@ -1846,7 +1825,7 @@ public: class ESCARGOT_EXPORT ScriptParserRef { public: - struct InitializeScriptResult { + struct ESCARGOT_EXPORT InitializeScriptResult { bool isSuccessful() { return script.hasValue(); @@ -1910,7 +1889,7 @@ public: // Module // client needs cache module map - struct LoadModuleResult { + struct ESCARGOT_EXPORT LoadModuleResult { LoadModuleResult(ScriptRef* result); LoadModuleResult(ErrorObjectRef::Code errorCode, StringRef* errorMessage); @@ -1947,6 +1926,19 @@ public: // do nothing } +#ifdef ESCARGOT_USE_CUSTOM_LOGGING + // default custom logger + virtual void customInfoLogger(const char* format, va_list arg) + { + vfprintf(stdout, format, arg); + } + + virtual void customErrorLogger(const char* format, va_list arg) + { + vfprintf(stderr, format, arg); + } +#endif + void* threadLocalCustomData(); }; diff --git a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinArrayBuffer.cpp b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinArrayBuffer.cpp index 409c084..719300e 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinArrayBuffer.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinArrayBuffer.cpp @@ -34,11 +34,24 @@ static Value builtinArrayBufferConstructor(ExecutionState& state, Value thisValu } uint64_t byteLength = argv[0].toIndex(state); - if (byteLength == Value::InvalidIndexValue) { + if (UNLIKELY(byteLength == Value::InvalidIndexValue)) { ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, state.context()->staticStrings().ArrayBuffer.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_FirstArgumentInvalidLength); } - return ArrayBufferObject::allocateArrayBuffer(state, newTarget.value(), byteLength); + Optional maxByteLength; + // Let requestedMaxByteLength be ? GetArrayBufferMaxByteLengthOption(options). + if (UNLIKELY((argc > 1) && argv[1].isObject())) { + Object* options = argv[1].asObject(); + Value maxLengthValue = options->get(state, ObjectPropertyName(state.context()->staticStrings().maxByteLength)).value(state, options); + if (!maxLengthValue.isUndefined()) { + maxByteLength = maxLengthValue.toIndex(state); + if (UNLIKELY((maxByteLength.value() == Value::InvalidIndexValue) || (byteLength > maxByteLength.value()))) { + ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, state.context()->staticStrings().ArrayBuffer.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_FirstArgumentInvalidLength); + } + } + } + + return ArrayBufferObject::allocateArrayBuffer(state, newTarget.value(), byteLength, maxByteLength); } // https://www.ecma-international.org/ecma-262/10.0/#sec-arraybuffer.isview @@ -56,40 +69,94 @@ static Value builtinArrayBufferIsView(ExecutionState& state, Value thisValue, si return Value(false); } -// https://www.ecma-international.org/ecma-262/10.0/#sec-get-arraybuffer.prototype.bytelength + +#define RESOLVE_THIS_BINDING_TO_ARRAYBUFFER(NAME, OBJ, BUILT_IN_METHOD) \ + if (UNLIKELY(!thisValue.isObject() || !thisValue.asObject()->isArrayBuffer() || thisValue.asObject()->isSharedArrayBufferObject())) { \ + ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, state.context()->staticStrings().OBJ.string(), true, state.context()->staticStrings().BUILT_IN_METHOD.string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); \ + } \ + \ + ArrayBuffer* NAME = thisValue.asObject()->asArrayBuffer(); + +// https://262.ecma-international.org/#sec-get-arraybuffer.prototype.bytelength static Value builtinArrayBufferByteLengthGetter(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) { - if (!thisValue.isObject() || !thisValue.asObject()->isArrayBufferObject()) { - ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, state.context()->staticStrings().ArrayBuffer.string(), true, state.context()->staticStrings().getbyteLength.string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); - } + RESOLVE_THIS_BINDING_TO_ARRAYBUFFER(obj, ArrayBuffer, getbyteLength); - ArrayBufferObject* obj = thisValue.asObject()->asArrayBufferObject(); -#if defined(ENABLE_THREADING) - if (obj->isSharedArrayBufferObject()) { - ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, state.context()->staticStrings().ArrayBuffer.string(), true, state.context()->staticStrings().getbyteLength.string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); + if (obj->isDetachedBuffer()) { + return Value(0); } -#endif + + return Value(obj->byteLength()); +} + +static Value builtinArrayBufferMaxByteLengthGetter(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) +{ + RESOLVE_THIS_BINDING_TO_ARRAYBUFFER(obj, ArrayBuffer, getmaxByteLength); if (obj->isDetachedBuffer()) { return Value(0); } + if (obj->isResizableArrayBuffer()) { + return Value(obj->maxByteLength()); + } + return Value(obj->byteLength()); } -// https://www.ecma-international.org/ecma-262/10.0/#sec-arraybuffer.prototype.slice -static Value builtinArrayBufferSlice(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) +static Value builtinArrayBufferResizableGetter(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) { - if (!thisValue.isObject() || !thisValue.asObject()->isArrayBufferObject()) { - ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, state.context()->staticStrings().ArrayBuffer.string(), true, state.context()->staticStrings().slice.string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); + RESOLVE_THIS_BINDING_TO_ARRAYBUFFER(obj, ArrayBuffer, getresizable); + + return Value(obj->isResizableArrayBuffer()); +} + +static Value builtinArrayBufferResize(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) +{ + RESOLVE_THIS_BINDING_TO_ARRAYBUFFER(obj, ArrayBuffer, resize); + obj->throwTypeErrorIfDetached(state); + + if (!obj->isResizableArrayBuffer()) { + ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, state.context()->staticStrings().ArrayBuffer.string(), true, state.context()->staticStrings().resize.string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); } - ArrayBufferObject* obj = thisValue.asObject()->asArrayBufferObject(); -#if defined(ENABLE_THREADING) - if (obj->isSharedArrayBufferObject()) { - ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, state.context()->staticStrings().ArrayBuffer.string(), true, state.context()->staticStrings().slice.string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); + double newByteLength = argv[0].toInteger(state); + if (newByteLength < 0 || newByteLength > obj->maxByteLength()) { + ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, state.context()->staticStrings().ArrayBuffer.string(), true, state.context()->staticStrings().resize.string(), ErrorObject::Messages::GlobalObject_FirstArgumentInvalidLength); } -#endif + + obj->backingStore()->resize(static_cast(newByteLength)); + + return Value(); +} + +static Value builtinArrayBufferTransfer(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) +{ + RESOLVE_THIS_BINDING_TO_ARRAYBUFFER(obj, ArrayBuffer, transfer); + obj->throwTypeErrorIfDetached(state); + + double newByteLength = obj->byteLength(); + if (argc > 0 && !argv[0].isUndefined()) { + newByteLength = argv[0].toInteger(state); + } + + Value arguments[] = { Value(newByteLength) }; + ArrayBuffer* newValue = Object::construct(state, state.context()->globalObject()->arrayBuffer(), 1, arguments).asObject()->asArrayBuffer(); + + // Let copyLength be min(newByteLength, O.[[ArrayBufferByteLength]]). + // Perform CopyDataBlockBytes(toBlock, 0, fromBlock, 0, copyLength). + newValue->fillData(obj->data(), std::min(newByteLength, static_cast(obj->byteLength()))); + + obj->asArrayBufferObject()->detachArrayBuffer(); + + return newValue; +} + +// https://262.ecma-international.org/#sec-arraybuffer.prototype.slice +static Value builtinArrayBufferSlice(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) +{ + RESOLVE_THIS_BINDING_TO_ARRAYBUFFER(obj, ArrayBuffer, slice); + obj->throwTypeErrorIfDetached(state); double len = obj->byteLength(); @@ -102,11 +169,11 @@ static Value builtinArrayBufferSlice(ExecutionState& state, Value thisValue, siz Value constructor = obj->speciesConstructor(state, state.context()->globalObject()->arrayBuffer()); Value arguments[] = { Value(newLen) }; Object* newValue = Object::construct(state, constructor, 1, arguments).toObject(state); - if (!newValue->isArrayBufferObject()) { + if (!newValue->isArrayBuffer()) { ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, state.context()->staticStrings().ArrayBuffer.string(), true, state.context()->staticStrings().slice.string(), "%s: return value of constructor ArrayBuffer is not valid ArrayBuffer"); } - ArrayBufferObject* newObject = newValue->asArrayBufferObject(); + ArrayBuffer* newObject = newValue->asArrayBuffer(); newObject->throwTypeErrorIfDetached(state); if (newObject == obj) { @@ -153,17 +220,36 @@ void GlobalObject::installArrayBuffer(ExecutionState& state) ObjectPropertyDescriptor(Value(strings->ArrayBuffer.string()), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::ConfigurablePresent))); { - JSGetterSetter gs( + JSGetterSetter speciesGS( new NativeFunctionObject(state, NativeFunctionInfo(strings->getSymbolSpecies, builtinSpeciesGetter, 0, NativeFunctionInfo::Strict)), Value(Value::EmptyValue)); - ObjectPropertyDescriptor desc(gs, ObjectPropertyDescriptor::ConfigurablePresent); - m_arrayBuffer->defineOwnPropertyThrowsException(state, ObjectPropertyName(state.context()->vmInstance()->globalSymbols().species), desc); + ObjectPropertyDescriptor speciesDesc(speciesGS, ObjectPropertyDescriptor::ConfigurablePresent); + m_arrayBuffer->defineOwnPropertyThrowsException(state, ObjectPropertyName(state.context()->vmInstance()->globalSymbols().species), speciesDesc); + + JSGetterSetter byteLengthGS( + new NativeFunctionObject(state, NativeFunctionInfo(strings->getbyteLength, builtinArrayBufferByteLengthGetter, 0, NativeFunctionInfo::Strict)), + Value(Value::EmptyValue)); + ObjectPropertyDescriptor byteLengthDesc(byteLengthGS, ObjectPropertyDescriptor::ConfigurablePresent); + m_arrayBufferPrototype->defineOwnProperty(state, ObjectPropertyName(strings->byteLength), byteLengthDesc); + + JSGetterSetter maxByteLengthGS( + new NativeFunctionObject(state, NativeFunctionInfo(strings->getmaxByteLength, builtinArrayBufferMaxByteLengthGetter, 0, NativeFunctionInfo::Strict)), + Value(Value::EmptyValue)); + ObjectPropertyDescriptor maxByteLengthDesc(maxByteLengthGS, ObjectPropertyDescriptor::ConfigurablePresent); + m_arrayBufferPrototype->defineOwnProperty(state, ObjectPropertyName(strings->maxByteLength), maxByteLengthDesc); + + JSGetterSetter resizableGS( + new NativeFunctionObject(state, NativeFunctionInfo(strings->getresizable, builtinArrayBufferResizableGetter, 0, NativeFunctionInfo::Strict)), + Value(Value::EmptyValue)); + ObjectPropertyDescriptor resizableDesc(resizableGS, ObjectPropertyDescriptor::ConfigurablePresent); + m_arrayBufferPrototype->defineOwnProperty(state, ObjectPropertyName(strings->resizable), resizableDesc); } - JSGetterSetter gs( - new NativeFunctionObject(state, NativeFunctionInfo(strings->getbyteLength, builtinArrayBufferByteLengthGetter, 0, NativeFunctionInfo::Strict)), - Value(Value::EmptyValue)); - ObjectPropertyDescriptor byteLengthDesc(gs, ObjectPropertyDescriptor::ConfigurablePresent); - m_arrayBufferPrototype->defineOwnProperty(state, ObjectPropertyName(strings->byteLength), byteLengthDesc); + m_arrayBufferPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->resize), + ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->resize, builtinArrayBufferResize, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent))); + + m_arrayBufferPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->transfer), + ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->transfer, builtinArrayBufferTransfer, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent))); + m_arrayBufferPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->slice), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->slice, builtinArrayBufferSlice, 2, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent))); diff --git a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinAtomics.cpp b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinAtomics.cpp index 9845f1a..88a2834 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinAtomics.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinAtomics.cpp @@ -27,14 +27,14 @@ #include "runtime/BigInt.h" #include "runtime/Platform.h" -#if !defined(HAVE_BUILTIN_ATOMIC_FUNCTIONS) && !defined(ENABLE_ATOMICS_GLOBAL_LOCK) -#error "without builtin atomic functions, we need to atomics global lock for implementing atomics builtin" -#endif - namespace Escargot { #if defined(ENABLE_THREADING) +#if !defined(HAVE_BUILTIN_ATOMIC_FUNCTIONS) && !defined(ENABLE_ATOMICS_GLOBAL_LOCK) +#error "without builtin atomic functions, we need to atomics global lock for implementing atomics builtin" +#endif + enum class AtomicBinaryOps : uint8_t { ADD, AND, diff --git a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinObject.cpp b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinObject.cpp index c2ce374..a92d786 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinObject.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinObject.cpp @@ -159,15 +159,14 @@ static Value builtinObjectToString(ExecutionState& state, Value thisValue, size_ static Value builtinObjectHasOwn(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) { Object* obj = argv[0].toObject(state); - Value key = argv[1].toPropertyKey(state); - return Value(obj->hasOwnProperty(state, ObjectPropertyName(state, key))); + return Value(obj->hasOwnProperty(state, ObjectPropertyName(state, argv[1]))); } static Value builtinObjectHasOwnProperty(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) { - Value key = argv[0].toPrimitive(state, Value::PrimitiveTypeHint::PreferString); + ObjectPropertyName key(state, argv[0]); Object* obj = thisValue.toObject(state); - return Value(obj->hasOwnProperty(state, ObjectPropertyName(state, key))); + return Value(obj->hasOwnProperty(state, key)); } static Value objectDefineProperties(ExecutionState& state, Value object, Value properties) @@ -289,13 +288,13 @@ static Value builtinObjectIsPrototypeOf(ExecutionState& state, Value thisValue, static Value builtinObjectPropertyIsEnumerable(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) { // Let P be toPropertyKey(V). - Value P = argv[0].toPropertyKey(state); + ObjectPropertyName P(state, argv[0]); // Let O be the result of calling ToObject passing the this value as the argument. RESOLVE_THIS_BINDING_TO_OBJECT(O, Object, propertyIsEnumerable); // Let desc be the result of calling the [[GetOwnProperty]] internal method of O with argument name. - ObjectGetResult desc = O->getOwnProperty(state, ObjectPropertyName(state, P)); + ObjectGetResult desc = O->getOwnProperty(state, P); // If desc is undefined, return false. if (!desc.hasValue()) @@ -425,12 +424,10 @@ static Value builtinObjectGetOwnPropertyDescriptor(ExecutionState& state, Value { // Let obj be ToObject(O). Object* O = argv[0].toObject(state); - // Let key be ? ToPropertyKey(P). - Value key = argv[1].toPropertyKey(state); // Let desc be ? obj.[[GetOwnProperty]](key). // Return FromPropertyDescriptor(desc). - return O->getOwnPropertyDescriptor(state, ObjectPropertyName(state, key)); + return O->getOwnPropertyDescriptor(state, ObjectPropertyName(state, argv[1])); } // https://262.ecma-international.org/#sec-object.getownpropertydescriptors @@ -449,7 +446,7 @@ static Value builtinObjectGetOwnPropertyDescriptors(ExecutionState& state, Value return descriptors; } -enum class GetOwnPropertyKeysType { +enum class GetOwnPropertyKeysType : unsigned { String, Symbol }; diff --git a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinReflect.cpp b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinReflect.cpp index 4efa5cf..e385e84 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinReflect.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinReflect.cpp @@ -86,13 +86,13 @@ static Value builtinReflectDefineProperty(ExecutionState& state, Value thisValue } // 2. Let key be ToPropertyKey(propertyKey). - Value key = argv[1].toPropertyKey(state); + ObjectPropertyName key(state, argv[1]); // 3. Let desc be ToPropertyDescriptor(attributes). ObjectPropertyDescriptor desc(state, argv[2].asObject()); // 6. Return target.[[DefineOwnProperty]](key, desc). - return Value(target.asObject()->defineOwnProperty(state, ObjectPropertyName(state, key), desc)); + return Value(target.asObject()->defineOwnProperty(state, key, desc)); } // https://www.ecma-international.org/ecma-262/6.0/#sec-reflect.deleteproperty @@ -107,10 +107,10 @@ static Value builtinReflectDeleteProperty(ExecutionState& state, Value thisValue } // 2. Let key be ToPropertyKey(propertyKey). - Value key = argv[1].toPropertyKey(state); + ObjectPropertyName key(state, argv[1]); // 4. Return target.[[Delete]](key). - return Value(target.asObject()->deleteOwnProperty(state, ObjectPropertyName(state, key))); + return Value(target.asObject()->deleteOwnProperty(state, key)); } // https://www.ecma-international.org/ecma-262/6.0/#sec-reflect.get @@ -125,14 +125,14 @@ static Value builtinReflectGet(ExecutionState& state, Value thisValue, size_t ar } // 2. Let key be ToPropertyKey(propertyKey). - Value key = argv[1].toPropertyKey(state); + ObjectPropertyName key(state, argv[1]); // 4. If receiver is not present, then // 4.a. Let receiver be target. Value receiver = argc > 2 ? argv[2] : target; // 5. Return target.[[Get]](key, receiver). - return target.asObject()->get(state, ObjectPropertyName(state, key)).value(state, receiver); + return target.asObject()->get(state, key).value(state, receiver); } // https://www.ecma-international.org/ecma-262/6.0/#sec-reflect.getownpropertydescriptor @@ -147,10 +147,10 @@ static Value builtinReflectGetOwnPropertyDescriptor(ExecutionState& state, Value } // 2. Let key be ToPropertyKey(propertyKey). - Value key = argv[1].toPropertyKey(state); + ObjectPropertyName key(state, argv[1]); // 4. Let desc be target.[[GetOwnProperty]](key). - ObjectGetResult desc = target.asObject()->getOwnProperty(state, ObjectPropertyName(state, key)); + ObjectGetResult desc = target.asObject()->getOwnProperty(state, key); // 6. Return FromPropertyDescriptor(desc). return desc.fromPropertyDescriptor(state, target.asObject()); @@ -183,10 +183,10 @@ static Value builtinReflectHas(ExecutionState& state, Value thisValue, size_t ar } // 2. Let key be ToPropertyKey(propertyKey). - Value key = argv[1].toPropertyKey(state); + ObjectPropertyName key(state, argv[1]); // 4. Return target.[[HasProperty]](key). - return Value(target.asObject()->hasProperty(state, ObjectPropertyName(state, key))); + return Value(target.asObject()->hasProperty(state, key)); } // https://www.ecma-international.org/ecma-262/6.0/#sec-reflect.isextensible @@ -249,14 +249,14 @@ static Value builtinReflectSet(ExecutionState& state, Value thisValue, size_t ar } // 2. Let key be ToPropertyKey(propertyKey). - Value key = argv[1].toPropertyKey(state); + ObjectPropertyName key(state, argv[1]); // 4. If receiver is not present, then // 4.a. Let receiver be target. Value receiver = argc > 3 ? argv[3] : target; // 5. Return target.[[Set]](key, V, receiver). - return Value(target.asObject()->set(state, ObjectPropertyName(state, key), argv[2], receiver)); + return Value(target.asObject()->set(state, key, argv[2], receiver)); } // https://www.ecma-international.org/ecma-262/6.0/#sec-reflect.setprototypeof diff --git a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinRegExp.cpp b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinRegExp.cpp index a502f88..0c339ec 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinRegExp.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinRegExp.cpp @@ -429,7 +429,7 @@ static Value builtinRegExpReplace(ExecutionState& state, Value thisValue, size_t } size_t resultSize = results.size(); - for (uint i = 0; i < resultSize; i++) { + for (size_t i = 0; i < resultSize; i++) { Object* result = results[i].toObject(state); size_t nCaptures = result->get(state, ObjectPropertyName(state.context()->staticStrings().length)).value(state, result).toLength(state) - 1; diff --git a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinSharedArrayBuffer.cpp b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinSharedArrayBuffer.cpp index 335ddd1..75355b7 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinSharedArrayBuffer.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinSharedArrayBuffer.cpp @@ -40,27 +40,58 @@ static Value builtinSharedArrayBufferConstructor(ExecutionState& state, Value th ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, state.context()->staticStrings().SharedArrayBuffer.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_FirstArgumentInvalidLength); } - return SharedArrayBufferObject::allocateSharedArrayBuffer(state, newTarget.value(), byteLength); + Optional maxByteLength; + // Let requestedMaxByteLength be ? GetArrayBufferMaxByteLengthOption(options). + if (UNLIKELY((argc > 1) && argv[1].isObject())) { + Object* options = argv[1].asObject(); + Value maxLengthValue = options->get(state, ObjectPropertyName(state.context()->staticStrings().maxByteLength)).value(state, options); + if (!maxLengthValue.isUndefined()) { + maxByteLength = maxLengthValue.toIndex(state); + if (UNLIKELY((maxByteLength.value() == Value::InvalidIndexValue) || (byteLength > maxByteLength.value()))) { + ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, state.context()->staticStrings().SharedArrayBuffer.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_InvalidArrayLength); + } + } + } + + return SharedArrayBufferObject::allocateSharedArrayBuffer(state, newTarget.value(), byteLength, maxByteLength); } +#define RESOLVE_THIS_BINDING_TO_SHAREDARRAYBUFFER(NAME, OBJ, BUILT_IN_METHOD) \ + if (UNLIKELY(!thisValue.isObject() || !thisValue.asObject()->isSharedArrayBufferObject())) { \ + ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, state.context()->staticStrings().OBJ.string(), true, state.context()->staticStrings().BUILT_IN_METHOD.string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); \ + } \ + \ + SharedArrayBufferObject* NAME = thisValue.asObject()->asSharedArrayBufferObject(); + // https://262.ecma-international.org/#sec-get-sharedarraybuffer.prototype.bytelength static Value builtinSharedArrayBufferByteLengthGetter(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) { - if (!thisValue.isObject() || !thisValue.asObject()->isSharedArrayBufferObject()) { - ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, state.context()->staticStrings().SharedArrayBuffer.string(), true, state.context()->staticStrings().getbyteLength.string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); + RESOLVE_THIS_BINDING_TO_SHAREDARRAYBUFFER(obj, SharedArrayBuffer, getbyteLength); + return Value(obj->byteLength()); +} + +static Value builtinSharedArrayBufferMaxByteLengthGetter(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) +{ + RESOLVE_THIS_BINDING_TO_SHAREDARRAYBUFFER(obj, SharedArrayBuffer, getmaxByteLength); + + if (obj->isResizableArrayBuffer()) { + return Value(obj->maxByteLength()); } - SharedArrayBufferObject* obj = thisValue.asObject()->asSharedArrayBufferObject(); + return Value(obj->byteLength()); } +static Value builtinSharedArrayBufferGrowableGetter(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) +{ + RESOLVE_THIS_BINDING_TO_SHAREDARRAYBUFFER(obj, SharedArrayBuffer, getgrowable); + return Value(obj->isResizableArrayBuffer()); +} + // https://262.ecma-international.org/#sec-sharedarraybuffer.prototype.slice static Value builtinSharedArrayBufferSlice(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional newTarget) { - if (!thisValue.isObject() || !thisValue.asObject()->isSharedArrayBufferObject()) { - ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, state.context()->staticStrings().SharedArrayBuffer.string(), true, state.context()->staticStrings().slice.string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); - } + RESOLVE_THIS_BINDING_TO_SHAREDARRAYBUFFER(O, SharedArrayBuffer, slice); - SharedArrayBufferObject* O = thisValue.asObject()->asSharedArrayBufferObject(); double len = O->byteLength(); double relativeStart = argv[0].toInteger(state); size_t first = (relativeStart < 0) ? std::max(len + relativeStart, 0.0) : std::min(relativeStart, len); @@ -111,17 +142,31 @@ void GlobalObject::installSharedArrayBuffer(ExecutionState& state) ObjectPropertyDescriptor(Value(strings->SharedArrayBuffer.string()), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::ConfigurablePresent))); { - JSGetterSetter gs( + JSGetterSetter speciesGS( new NativeFunctionObject(state, NativeFunctionInfo(strings->getSymbolSpecies, builtinSpeciesGetter, 0, NativeFunctionInfo::Strict)), Value(Value::EmptyValue)); - ObjectPropertyDescriptor desc(gs, ObjectPropertyDescriptor::ConfigurablePresent); - m_sharedArrayBuffer->defineOwnPropertyThrowsException(state, ObjectPropertyName(state.context()->vmInstance()->globalSymbols().species), desc); + ObjectPropertyDescriptor speciesDesc(speciesGS, ObjectPropertyDescriptor::ConfigurablePresent); + m_sharedArrayBuffer->defineOwnPropertyThrowsException(state, ObjectPropertyName(state.context()->vmInstance()->globalSymbols().species), speciesDesc); + + JSGetterSetter byteLengthGS( + new NativeFunctionObject(state, NativeFunctionInfo(strings->getbyteLength, builtinSharedArrayBufferByteLengthGetter, 0, NativeFunctionInfo::Strict)), + Value(Value::EmptyValue)); + ObjectPropertyDescriptor byteLengthDesc(byteLengthGS, ObjectPropertyDescriptor::ConfigurablePresent); + m_sharedArrayBufferPrototype->defineOwnProperty(state, ObjectPropertyName(strings->byteLength), byteLengthDesc); + + JSGetterSetter maxByteLengthGS( + new NativeFunctionObject(state, NativeFunctionInfo(strings->getmaxByteLength, builtinSharedArrayBufferMaxByteLengthGetter, 0, NativeFunctionInfo::Strict)), + Value(Value::EmptyValue)); + ObjectPropertyDescriptor maxByteLengthDesc(maxByteLengthGS, ObjectPropertyDescriptor::ConfigurablePresent); + m_sharedArrayBufferPrototype->defineOwnProperty(state, ObjectPropertyName(strings->maxByteLength), maxByteLengthDesc); + + JSGetterSetter growableGS( + new NativeFunctionObject(state, NativeFunctionInfo(strings->getgrowable, builtinSharedArrayBufferGrowableGetter, 0, NativeFunctionInfo::Strict)), + Value(Value::EmptyValue)); + ObjectPropertyDescriptor growableDesc(growableGS, ObjectPropertyDescriptor::ConfigurablePresent); + m_sharedArrayBufferPrototype->defineOwnProperty(state, ObjectPropertyName(strings->growable), growableDesc); } - JSGetterSetter gs( - new NativeFunctionObject(state, NativeFunctionInfo(strings->getbyteLength, builtinSharedArrayBufferByteLengthGetter, 0, NativeFunctionInfo::Strict)), - Value(Value::EmptyValue)); - ObjectPropertyDescriptor byteLengthDesc(gs, ObjectPropertyDescriptor::ConfigurablePresent); - m_sharedArrayBufferPrototype->defineOwnProperty(state, ObjectPropertyName(strings->byteLength), byteLengthDesc); + m_sharedArrayBufferPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->slice), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->slice, builtinSharedArrayBufferSlice, 2, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent))); diff --git a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinString.cpp b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinString.cpp index 7770a9e..db66350 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinString.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/builtins/BuiltinString.cpp @@ -88,7 +88,7 @@ static Value builtinStringIndexOf(ExecutionState& state, Value thisValue, size_t pos = val.toInteger(state); } if (pos == std::numeric_limits::infinity() || std::isnan(pos)) { - pos = std::numeric_limits::quiet_NaN(); + return Value(-1); } if (pos == -std::numeric_limits::infinity()) { pos = 0; @@ -603,7 +603,7 @@ static Value builtinStringReplaceAll(ExecutionState& state, Value thisValue, siz StringBuilder builder; String* replacement = String::emptyString; // For each element p of matchPositions, do - for (uint i = 0; i < matchPositions.size(); i++) { + for (size_t i = 0; i < matchPositions.size(); i++) { size_t p = matchPositions[i]; builder.appendSubString(string, endOfLastMatch, p); // If functionalReplace is true, then diff --git a/lwnode/code/escargotshim/deps/escargot/src/debugger/Debugger.cpp b/lwnode/code/escargotshim/deps/escargot/src/debugger/Debugger.cpp index 07daaf2..6ffdf5d 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/debugger/Debugger.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/debugger/Debugger.cpp @@ -836,7 +836,7 @@ bool Debugger::processIncomingMessages(ExecutionState* state, ByteCodeBlock* byt break; } m_pendingWait = buffer[1]; - return false; + return true; } case ESCARGOT_DEBUGGER_PENDING_RESUME: { if (!m_waitForResume || length != 1) { diff --git a/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCode.cpp b/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCode.cpp index 18a1947..bd88650 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCode.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCode.cpp @@ -114,6 +114,24 @@ ByteCodeBlock::ByteCodeBlock() // This constructor is used to allocate a ByteCodeBlock on the stack } +static void clearByteCodeBlock(ByteCodeBlock* self) +{ +#ifdef ESCARGOT_DEBUGGER + Debugger* debugger = self->m_codeBlock->context()->debugger(); + if (debugger && debugger->enabled()) { + debugger->releaseFunction(self->m_code.data()); + } +#endif + self->m_code.clear(); + self->m_numeralLiteralData.clear(); + self->m_jumpFlowRecordData.clear(); + + if (!self->m_isOwnerMayFreed) { + auto& v = self->m_codeBlock->context()->vmInstance()->compiledByteCodeBlocks(); + v.erase(std::find(v.begin(), v.end(), self)); + } +} + ByteCodeBlock::ByteCodeBlock(InterpretedCodeBlock* codeBlock) : m_shouldClearStack(false) , m_isOwnerMayFreed(false) @@ -125,22 +143,7 @@ ByteCodeBlock::ByteCodeBlock(InterpretedCodeBlock* codeBlock) v.push_back(this); GC_REGISTER_FINALIZER_NO_ORDER(this, [](void* obj, void*) { ByteCodeBlock* self = (ByteCodeBlock*)obj; - -#ifdef ESCARGOT_DEBUGGER - Debugger* debugger = self->m_codeBlock->context()->debugger(); - if (debugger && debugger->enabled()) { - debugger->releaseFunction(self->m_code.data()); - } -#endif /* ESCARGOT_DEBUGGER */ - - self->m_code.clear(); - self->m_numeralLiteralData.clear(); - self->m_jumpFlowRecordData.clear(); - - if (!self->m_isOwnerMayFreed) { - auto& v = self->m_codeBlock->context()->vmInstance()->compiledByteCodeBlocks(); - v.erase(std::find(v.begin(), v.end(), self)); - } + clearByteCodeBlock(self); }, nullptr, nullptr, nullptr); } diff --git a/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCode.h b/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCode.h index 1f6cdda..1082a73 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCode.h +++ b/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCode.h @@ -173,7 +173,7 @@ struct ByteCodeLOC { } }; -#if defined(NDEBUG) && defined(ESCARGOT_32) +#if defined(NDEBUG) && defined(ESCARGOT_32) && !defined(COMPILER_MSVC) #define BYTECODE_SIZE_CHECK_IN_32BIT(codeName, size) COMPILE_ASSERT(sizeof(codeName) == size, ""); #else #define BYTECODE_SIZE_CHECK_IN_32BIT(CodeName, Size) @@ -262,7 +262,7 @@ public: class MetaPropertyOperation : public ByteCode { public: - enum Type { + enum Type ENSURE_ENUM_UNSIGNED { NewTarget, ImportMeta }; @@ -437,7 +437,7 @@ public: class InitializeClass : public ByteCode { public: - enum Stage { + enum Stage ENSURE_ENUM_UNSIGNED { CreateClass, SetFieldSize, InitField, @@ -708,7 +708,7 @@ BYTECODE_SIZE_CHECK_IN_32BIT(SuperReference, sizeof(size_t) * 2); class ComplexSetObjectOperation : public ByteCode { public: - enum Type { + enum Type ENSURE_ENUM_UNSIGNED { Super, Private, PrivateWithoutOuterClass @@ -757,7 +757,7 @@ public: class ComplexGetObjectOperation : public ByteCode { public: - enum Type { + enum Type ENSURE_ENUM_UNSIGNED { Super, Private, PrivateWithoutOuterClass @@ -1884,7 +1884,7 @@ public: class CallFunctionComplexCase : public ByteCode { public: - enum Kind { + enum Kind ENSURE_ENUM_UNSIGNED { WithSpreadElement, MayBuiltinApply, MayBuiltinEval, @@ -1980,7 +1980,7 @@ public: class ExecutionPause : public ByteCode { public: - enum Reason { + enum Reason ENSURE_ENUM_UNSIGNED { Yield, Await, GeneratorsInitialize @@ -2303,7 +2303,7 @@ public: class IteratorOperation : public ByteCode { public: - enum Operation { + enum Operation ENSURE_ENUM_UNSIGNED { GetIterator, IteratorClose, IteratorBind, @@ -2505,7 +2505,7 @@ public: class OpenLexicalEnvironment : public ByteCode { public: - enum Kind { + enum Kind ENSURE_ENUM_UNSIGNED { WithStatement, ResumeExecution }; @@ -2617,7 +2617,7 @@ public: class TaggedTemplateOperation : public ByteCode { public: - enum Operation { + enum Operation ENSURE_ENUM_UNSIGNED { TestCacheOperation, FillCacheOperation }; diff --git a/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCodeInterpreter.cpp b/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCodeInterpreter.cpp index 8677775..baf1684 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCodeInterpreter.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCodeInterpreter.cpp @@ -2821,7 +2821,7 @@ NEVER_INLINE void ByteCodeInterpreter::initializeClassOperation(ExecutionState& } else { if (!heritagePresent) { Value argv[] = { String::emptyString, String::emptyString }; - auto functionSource = FunctionObject::createFunctionSourceFromScriptSource(state, state.context()->staticStrings().constructor, 1, &argv[0], argv[1], true, false, false, false, false); + auto functionSource = FunctionObject::createFunctionSourceFromScriptSource(state, state.context()->staticStrings().constructor, 1, &argv[0], argv[1], true, false, false, false, true); functionSource.codeBlock->setAsClassConstructor(); constructor = new ScriptClassConstructorFunctionObject(state, constructorParent.asObject(), functionSource.codeBlock, functionSource.outerEnvironment, proto, @@ -2829,7 +2829,7 @@ NEVER_INLINE void ByteCodeInterpreter::initializeClassOperation(ExecutionState& } else { Value argv[] = { state.context()->staticStrings().lazyDotDotDotArgs().string(), state.context()->staticStrings().lazySuperDotDotDotArgs().string() }; - auto functionSource = FunctionObject::createFunctionSourceFromScriptSource(state, state.context()->staticStrings().constructor, 1, &argv[0], argv[1], true, false, false, true, false); + auto functionSource = FunctionObject::createFunctionSourceFromScriptSource(state, state.context()->staticStrings().constructor, 1, &argv[0], argv[1], true, false, false, true, true); functionSource.codeBlock->setAsClassConstructor(); functionSource.codeBlock->setAsDerivedClassConstructor(); constructor = new ScriptClassConstructorFunctionObject(state, constructorParent.asObject(), diff --git a/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCodeInterpreter.h b/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCodeInterpreter.h index 12f96b2..f644331 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCodeInterpreter.h +++ b/lwnode/code/escargotshim/deps/escargot/src/interpreter/ByteCodeInterpreter.h @@ -90,14 +90,14 @@ private: static void instanceOfOperation(ExecutionState& state, BinaryInstanceOfOperation* code, Value* registerFile); static void deleteOperation(ExecutionState& state, LexicalEnvironment* env, UnaryDelete* code, Value* registerFile, ByteCodeBlock* byteCodeBlock); static void templateOperation(ExecutionState& state, LexicalEnvironment* env, TemplateOperation* code, Value* registerFile); - enum BitwiseOperationKind { + enum BitwiseOperationKind : unsigned { And, Or, Xor, }; static Value bitwiseOperationSlowCase(ExecutionState& state, const Value& a, const Value& b, BitwiseOperationKind kind); static Value bitwiseNotOperationSlowCase(ExecutionState& state, const Value& a); - enum ShiftOperationKind { + enum ShiftOperationKind : unsigned { Left, SignedRight, UnsignedRight, diff --git a/lwnode/code/escargotshim/deps/escargot/src/parser/CodeBlock.h b/lwnode/code/escargotshim/deps/escargot/src/parser/CodeBlock.h index e9e05ac..d4e5380 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/parser/CodeBlock.h +++ b/lwnode/code/escargotshim/deps/escargot/src/parser/CodeBlock.h @@ -212,7 +212,7 @@ public: bool m_isStackAllocated : 1; bool m_isMutable : 1; bool m_isGlobalLexicalVariable : 1; - enum DeclarationType { + enum DeclarationType ENSURE_ENUM_UNSIGNED { VarDeclared, LexicallyDeclared, }; diff --git a/lwnode/code/escargotshim/deps/escargot/src/parser/Lexer.cpp b/lwnode/code/escargotshim/deps/escargot/src/parser/Lexer.cpp index 2ee4fc0..2bb89e3 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/parser/Lexer.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/parser/Lexer.cpp @@ -686,6 +686,17 @@ Scanner::Scanner(::Escargot::Context* escargotContext, ::Escargot::esprima::Pars // trackComment = false; } +void Scanner::resetSource(StringView code) +{ + this->source = ParserStringView(code, 0, code.length()); + this->sourceAsNormalView = code; + this->sourceCodeAccessData = code.bufferAccessData(); + this->length = code.length(); + this->index = 0; + this->lineNumber = 1; + this->lineStart = 0; +} + void Scanner::skipSingleLine() { while (!this->eof()) { diff --git a/lwnode/code/escargotshim/deps/escargot/src/parser/Lexer.h b/lwnode/code/escargotshim/deps/escargot/src/parser/Lexer.h index cf99489..a29e1ad 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/parser/Lexer.h +++ b/lwnode/code/escargotshim/deps/escargot/src/parser/Lexer.h @@ -31,7 +31,7 @@ struct ParserContext; namespace EscargotLexer { -enum Token { +enum Token : uint8_t { EOFToken, IdentifierToken, BooleanLiteralToken, @@ -512,6 +512,8 @@ public: // Scanner always allocated on the stack MAKE_STACK_ALLOCATED(); + void resetSource(StringView code); + ScanState saveState() { return ScanState(this->index, this->lineNumber, this->lineStart); diff --git a/lwnode/code/escargotshim/deps/escargot/src/parser/ParserStringView.h b/lwnode/code/escargotshim/deps/escargot/src/parser/ParserStringView.h index 5c3338e..253cc51 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/parser/ParserStringView.h +++ b/lwnode/code/escargotshim/deps/escargot/src/parser/ParserStringView.h @@ -159,8 +159,6 @@ protected: m_bufferData.buffer = ((char16_t*)srcData.buffer) + start; } } - -private: }; } // namespace Escargot diff --git a/lwnode/code/escargotshim/deps/escargot/src/parser/esprima_cpp/esprima.cpp b/lwnode/code/escargotshim/deps/escargot/src/parser/esprima_cpp/esprima.cpp index 1a3a218..3f55c01 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/parser/esprima_cpp/esprima.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/parser/esprima_cpp/esprima.cpp @@ -251,6 +251,12 @@ public: this->setMarkers(startLoc); } + void resetSource(StringView code) + { + this->scanner->resetSource(code); + this->setMarkers(ExtendedNodeLOC(1, 0, 0)); + } + bool inGlobalSourceCodeParsing() { return !this->isParsingSingleFunction && this->currentScopeContext->m_nodeType == ASTNodeType::Program; @@ -5118,9 +5124,6 @@ public: return this->finalize(node, builder.createFunctionDeclarationNode(subCodeBlockIndex, fnName)); } - MetaNode paramsStart = this->createNode(); - this->expect(LeftParenthesis); - // https://www.ecma-international.org/ecma-262/10.0/#sec-web-compat-functiondeclarationinstantiation bool isTopScope = this->currentScopeContext->m_functionBodyBlockIndex == this->lexicalBlockIndex; if (!isTopScope) { @@ -5187,6 +5190,9 @@ public: } this->insertUsingName(fnName); + // parameter list + this->expect(LeftParenthesis); + BEGIN_FUNCTION_SCANNING(fnName); if (!isTopScope) { @@ -5322,7 +5328,7 @@ public: return this->finalize(node, builder.createFunctionExpressionNode(subCodeBlockIndex, fnName)); } - MetaNode paramsStart = this->createNode(); + // parameter list this->expect(LeftParenthesis); BEGIN_FUNCTION_SCANNING(fnName); @@ -6899,6 +6905,43 @@ public: return this->finalize(node, builder.createFunctionNode(params, body, std::move(this->numeralLiteralVector))); } + + template + void simpleSyntaxCheckFunctionParameters(ASTBuilder& builder) + { + this->expect(LeftParenthesis); + + Scanner::SmallScannerResult firstRestricted; + ParseFormalParametersResult formalParameters; + + this->parseFormalParameters(builder, formalParameters, &firstRestricted); + + if (this->startMarker.index < this->scanner->length) { + this->throwUnexpectedToken(this->lookahead); + } + } + + template + void simpleSyntaxCheckFunctionBody(ASTBuilder& builder) + { + ASTStatementContainer body = builder.createStatementContainer(); + + this->expect(LeftBrace); + this->parseDirectivePrologues(builder, body); + + while (this->startMarker.index < this->scanner->length) { + if (this->match(RightBrace)) { + break; + } + this->parseStatementListItem(builder); + } + + this->expect(RightBrace); + + if (this->startMarker.index < this->scanner->length) { + this->throwUnexpectedToken(this->lookahead); + } + } }; ProgramNode* parseProgram(::Escargot::Context* ctx, StringView source, ASTClassInfo* outerClassInfo, bool isModule, bool strictFromOutside, @@ -6983,5 +7026,48 @@ ASTClassInfo* generateClassInfoFrom(::Escargot::Context* ctx, InterpretedCodeBlo return ret; } +void simpleSyntaxCheckFunctionElements(::Escargot::Context* ctx, String* parameters, String* body, bool isStrict, bool isGenerator, bool isAsync) +{ + // this method simply checks that each parameter and body has valid format + // other checks like duplicated parameter namkes are checked through initializeScript method + + // GC should be disabled during the syntax check process + ASSERT(GC_is_disabled()); + ASSERT(ctx->astAllocator().isInitialized()); + + Parser parser(ctx, StringView(parameters), nullptr, false, SIZE_MAX); +#if defined(ESCARGOT_SMALL_CONFIG) + NodeGenerator checker(ctx->astAllocator(), false); +#else + SyntaxChecker checker; +#endif + + parser.trackUsingNames = false; + parser.context->inFunctionBody = true; + parser.context->allowLexicalDeclaration = true; + parser.context->allowSuperCall = true; + parser.context->allowSuperProperty = true; + parser.context->allowNewTarget = true; + parser.context->allowYield = isGenerator; + parser.context->await = isAsync; + parser.context->strict = isStrict; + + parser.pushScopeContext(new (ctx->astAllocator()) ASTScopeContext(ctx->astAllocator(), isStrict)); + + Parser::ParserBlockContext blockContext; + parser.openBlock(blockContext); + + // check parameters + parser.simpleSyntaxCheckFunctionParameters(checker); + + // reset source to function body before checking the body string + parser.resetSource(StringView(body)); + + // check body + parser.simpleSyntaxCheckFunctionBody(checker); + + parser.closeBlock(blockContext); +} + } // namespace esprima } // namespace Escargot diff --git a/lwnode/code/escargotshim/deps/escargot/src/parser/esprima_cpp/esprima.h b/lwnode/code/escargotshim/deps/escargot/src/parser/esprima_cpp/esprima.h index 9a4ac86..a2cf516 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/parser/esprima_cpp/esprima.h +++ b/lwnode/code/escargotshim/deps/escargot/src/parser/esprima_cpp/esprima.h @@ -70,6 +70,7 @@ FunctionNode* parseSingleFunction(::Escargot::Context* ctx, InterpretedCodeBlock ASTClassInfo* generateClassInfoFrom(::Escargot::Context* ctx, InterpretedCodeBlock* codeBlock); +void simpleSyntaxCheckFunctionElements(::Escargot::Context* ctx, String* parameters, String* body, bool isStrict, bool isGenerator, bool isAsync); } // namespace esprima } // namespace Escargot diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/ArrayBuffer.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/ArrayBuffer.h index 2ade782..adaf3ec 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/ArrayBuffer.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/ArrayBuffer.h @@ -73,6 +73,12 @@ public: return 0; } + ALWAYS_INLINE size_t maxByteLength() + { + ASSERT(m_backingStore && m_backingStore->isResizable()); + return m_backingStore->maxByteLength(); + } + // $24.1.1.6 Value getValueFromBuffer(ExecutionState& state, size_t byteindex, TypedArrayType type, bool isLittleEndian = true); @@ -84,6 +90,14 @@ public: return (data() == nullptr); } + ALWAYS_INLINE bool isResizableArrayBuffer() const + { + if (LIKELY(m_backingStore)) { + return m_backingStore->isResizable(); + } + return false; + } + ALWAYS_INLINE void throwTypeErrorIfDetached(ExecutionState& state) { if (UNLIKELY(isDetachedBuffer())) { diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/ArrayBufferObject.cpp b/lwnode/code/escargotshim/deps/escargot/src/runtime/ArrayBufferObject.cpp index ae8dd4a..8c0dbe1 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/ArrayBufferObject.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/ArrayBufferObject.cpp @@ -25,20 +25,33 @@ namespace Escargot { -ArrayBufferObject* ArrayBufferObject::allocateArrayBuffer(ExecutionState& state, Object* constructor, uint64_t byteLength) +ArrayBufferObject* ArrayBufferObject::allocateArrayBuffer(ExecutionState& state, Object* constructor, uint64_t byteLength, Optional maxByteLength) { // https://www.ecma-international.org/ecma-262/10.0/#sec-allocatearraybuffer Object* proto = Object::getPrototypeFromConstructor(state, constructor, [](ExecutionState& state, Context* constructorRealm) -> Object* { return constructorRealm->globalObject()->arrayBufferPrototype(); }); - if (byteLength >= ArrayBuffer::maxArrayBufferSize) { + if (UNLIKELY(byteLength >= ArrayBuffer::maxArrayBufferSize)) { ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, state.context()->staticStrings().ArrayBuffer.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_InvalidArrayBufferSize); } ArrayBufferObject* obj = new ArrayBufferObject(state, proto); - obj->allocateBuffer(state, byteLength); + if (UNLIKELY(maxByteLength.hasValue())) { + ASSERT(byteLength <= maxByteLength.value()); + uint64_t maxLength = maxByteLength.value(); + if (UNLIKELY(maxLength >= ArrayBuffer::maxArrayBufferSize)) { + ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, state.context()->staticStrings().ArrayBuffer.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_InvalidArrayBufferSize); + } + + // allocate default resizable non-shared BackingStore + obj->allocateResizableBuffer(state, byteLength, maxLength); + return obj; + } + + // allocate default non-shared BackingStore + obj->allocateBuffer(state, byteLength); return obj; } @@ -85,6 +98,27 @@ void ArrayBufferObject::allocateBuffer(ExecutionState& state, size_t byteLength) m_backingStore = BackingStore::createDefaultNonSharedBackingStore(byteLength); } +void ArrayBufferObject::allocateResizableBuffer(ExecutionState& state, size_t byteLength, size_t maxByteLength) +{ + detachArrayBuffer(); + + ASSERT(byteLength <= maxByteLength); + ASSERT(maxByteLength < ArrayBuffer::maxArrayBufferSize); + + const size_t ratio = std::max((size_t)GC_get_free_space_divisor() / 6, (size_t)1); + if (maxByteLength > (GC_get_heap_size() / ratio)) { + size_t n = 0; + size_t times = maxByteLength / (GC_get_heap_size() / ratio) / 3; + do { + GC_gcollect_and_unmap(); + n += 1; + } while (n < times); + GC_invoke_finalizers(); + } + + m_backingStore = BackingStore::createDefaultResizableNonSharedBackingStore(byteLength, maxByteLength); +} + void ArrayBufferObject::attachBuffer(BackingStore* backingStore) { // BackingStore should not be Shared Data Block diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/ArrayBufferObject.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/ArrayBufferObject.h index 54d1202..b34b08a 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/ArrayBufferObject.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/ArrayBufferObject.h @@ -32,10 +32,11 @@ public: explicit ArrayBufferObject(ExecutionState& state); explicit ArrayBufferObject(ExecutionState& state, Object* proto); - static ArrayBufferObject* allocateArrayBuffer(ExecutionState& state, Object* constructor, uint64_t byteLength); + static ArrayBufferObject* allocateArrayBuffer(ExecutionState& state, Object* constructor, uint64_t byteLength, Optional maxByteLength = Optional()); static ArrayBufferObject* cloneArrayBuffer(ExecutionState& state, ArrayBuffer* srcBuffer, size_t srcByteOffset, uint64_t srcLength, Object* constructor); void allocateBuffer(ExecutionState& state, size_t bytelength); + void allocateResizableBuffer(ExecutionState& state, size_t bytelength, size_t maxByteLength); void attachBuffer(BackingStore* backingStore); void detachArrayBuffer(); diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/BackingStore.cpp b/lwnode/code/escargotshim/deps/escargot/src/runtime/BackingStore.cpp index 34cbb01..93974fd 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/BackingStore.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/BackingStore.cpp @@ -38,6 +38,14 @@ BackingStore* BackingStore::createDefaultNonSharedBackingStore(size_t byteLength byteLength, backingStorePlatformDeleter, nullptr, true); } +BackingStore* BackingStore::createDefaultResizableNonSharedBackingStore(size_t byteLength, size_t maxByteLength) +{ + // Resizable BackingStore is allocated by Platform only + return new NonSharedBackingStore( + Global::platform()->onMallocArrayBufferObjectDataBuffer(byteLength), + byteLength, backingStorePlatformDeleter, maxByteLength, true); +} + BackingStore* BackingStore::createNonSharedBackingStore(void* data, size_t byteLength, BackingStoreDeleterCallback callback, void* callbackData) { return new NonSharedBackingStore(data, byteLength, callback, callbackData, false); @@ -49,6 +57,7 @@ NonSharedBackingStore::NonSharedBackingStore(void* data, size_t byteLength, Back , m_deleter(callback) , m_deleterData(callbackData) , m_isAllocatedByPlatform(isAllocatedByPlatform) + , m_isResizable(false) { GC_REGISTER_FINALIZER_NO_ORDER(this, [](void* obj, void*) { NonSharedBackingStore* self = (NonSharedBackingStore*)obj; @@ -57,6 +66,23 @@ NonSharedBackingStore::NonSharedBackingStore(void* data, size_t byteLength, Back nullptr, nullptr, nullptr); } +NonSharedBackingStore::NonSharedBackingStore(void* data, size_t byteLength, BackingStoreDeleterCallback callback, size_t maxByteLength, bool isAllocatedByPlatform) + : m_data(data) + , m_byteLength(byteLength) + , m_deleter(callback) + , m_maxByteLength(maxByteLength) + , m_isAllocatedByPlatform(isAllocatedByPlatform) + , m_isResizable(true) +{ + ASSERT(isAllocatedByPlatform); + + GC_REGISTER_FINALIZER_NO_ORDER(this, [](void* obj, void*) { + NonSharedBackingStore* self = (NonSharedBackingStore*)obj; + self->m_deleter(self->m_data, self->m_maxByteLength, nullptr); + }, + nullptr, nullptr, nullptr); +} + void* NonSharedBackingStore::operator new(size_t size) { static MAY_THREAD_LOCAL bool typeInited = false; @@ -71,6 +97,17 @@ void* NonSharedBackingStore::operator new(size_t size) return GC_MALLOC_EXPLICITLY_TYPED(size, descr); } +void NonSharedBackingStore::resize(size_t newByteLength) +{ + ASSERT(m_isResizable && newByteLength <= m_maxByteLength); + + if (m_byteLength < newByteLength) { + memset(static_cast(m_data) + m_byteLength, 0, newByteLength - m_byteLength); + } + + m_byteLength = newByteLength; +} + void NonSharedBackingStore::reallocate(size_t newByteLength) { if (m_byteLength == newByteLength) { @@ -101,6 +138,14 @@ BackingStore* BackingStore::createDefaultSharedBackingStore(size_t byteLength) return new SharedBackingStore(sharedInfo); } +BackingStore* BackingStore::createDefaultGrowableSharedBackingStore(size_t byteLength, size_t maxByteLength) +{ + SharedDataBlockInfo* sharedInfo = new GrowableSharedDataBlockInfo( + Global::platform()->onMallocArrayBufferObjectDataBuffer(maxByteLength), + byteLength, maxByteLength); + return new SharedBackingStore(sharedInfo); +} + BackingStore* BackingStore::createSharedBackingStore(SharedDataBlockInfo* sharedInfo) { ASSERT(sharedInfo->hasValidReference()); @@ -113,7 +158,12 @@ void SharedDataBlockInfo::deref() auto oldValue = m_refCount.fetch_sub(1); if (oldValue == 1) { - Global::platform()->onFreeArrayBufferObjectDataBuffer(m_data, m_byteLength); + if (isGrowable()) { + Global::platform()->onFreeArrayBufferObjectDataBuffer(m_data, maxByteLength()); + } else { + Global::platform()->onFreeArrayBufferObjectDataBuffer(m_data, m_byteLength); + } + m_data = nullptr; m_byteLength = 0; diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/BackingStore.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/BackingStore.h index c6e8185..6891731 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/BackingStore.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/BackingStore.h @@ -29,10 +29,12 @@ using BackingStoreDeleterCallback = void (*)(void* data, size_t length, void* de class BackingStore : public gc { public: static BackingStore* createDefaultNonSharedBackingStore(size_t byteLength); + static BackingStore* createDefaultResizableNonSharedBackingStore(size_t byteLength, size_t maxByteLength); static BackingStore* createNonSharedBackingStore(void* data, size_t byteLength, BackingStoreDeleterCallback callback, void* callbackData); #if defined(ENABLE_THREADING) static BackingStore* createDefaultSharedBackingStore(size_t byteLength); + static BackingStore* createDefaultGrowableSharedBackingStore(size_t byteLength, size_t maxByteLength); // SharedBackingStore is newly created by sharing with already created one static BackingStore* createSharedBackingStore(SharedDataBlockInfo* sharedInfo); #endif @@ -41,9 +43,25 @@ public: virtual bool isShared() const = 0; virtual void* data() const = 0; virtual size_t byteLength() const = 0; + virtual size_t maxByteLength() const = 0; virtual void* deleterData() const = 0; - virtual SharedDataBlockInfo* sharedDataBlockInfo() const = 0; - virtual void reallocate(size_t newByteLength) = 0; + virtual bool isResizable() const = 0; + + virtual SharedDataBlockInfo* sharedDataBlockInfo() const + { + ASSERT_NOT_REACHED(); + return nullptr; + } + + virtual void resize(size_t newByteLength) + { + ASSERT_NOT_REACHED(); + } + + virtual void reallocate(size_t newByteLength) + { + ASSERT_NOT_REACHED(); + } void* operator new(size_t size) = delete; void* operator new[](size_t size) = delete; @@ -68,17 +86,23 @@ public: return m_byteLength; } + virtual size_t maxByteLength() const override + { + ASSERT(m_isResizable); + return m_maxByteLength; + } + virtual void* deleterData() const override { return m_deleterData; } - virtual SharedDataBlockInfo* sharedDataBlockInfo() const override + virtual bool isResizable() const override { - ASSERT_NOT_REACHED(); - return nullptr; + return m_isResizable; } + virtual void resize(size_t newByteLength) override; virtual void reallocate(size_t newByteLength) override; void* operator new(size_t size); @@ -86,12 +110,17 @@ public: private: NonSharedBackingStore(void* data, size_t byteLength, BackingStoreDeleterCallback callback, void* callbackData, bool isAllocatedByPlatform); + NonSharedBackingStore(void* data, size_t byteLength, BackingStoreDeleterCallback callback, size_t maxByteLength, bool isAllocatedByPlatform); void* m_data; size_t m_byteLength; BackingStoreDeleterCallback m_deleter; - void* m_deleterData; + union { + void* m_deleterData; + size_t m_maxByteLength; + }; bool m_isAllocatedByPlatform; + bool m_isResizable; }; #if defined(ENABLE_THREADING) @@ -104,6 +133,19 @@ public: { } + virtual ~SharedDataBlockInfo() {} + + virtual bool isGrowable() const + { + return false; + } + + virtual size_t maxByteLength() const + { + ASSERT_NOT_REACHED(); + return 0; + } + void* data() const { ASSERT(hasValidReference()); @@ -128,12 +170,34 @@ public: return (m_refCount.load() > 0); } -private: +protected: void* m_data; size_t m_byteLength; std::atomic m_refCount; }; +class GrowableSharedDataBlockInfo : public SharedDataBlockInfo { +public: + GrowableSharedDataBlockInfo(void* data, size_t byteLength, size_t maxByteLength) + : SharedDataBlockInfo(data, byteLength) + , m_maxByteLength(maxByteLength) + { + } + + virtual bool isGrowable() const override + { + return true; + } + + virtual size_t maxByteLength() const override + { + return m_maxByteLength; + } + +private: + size_t m_maxByteLength; +}; + class SharedBackingStore : public BackingStore { friend class BackingStore; @@ -155,6 +219,12 @@ public: return m_sharedDataBlockInfo->byteLength(); } + virtual size_t maxByteLength() const override + { + ASSERT(!!m_sharedDataBlockInfo && m_sharedDataBlockInfo->hasValidReference()); + return m_sharedDataBlockInfo->maxByteLength(); + } + virtual void* deleterData() const override { ASSERT_NOT_REACHED(); @@ -167,9 +237,9 @@ public: return m_sharedDataBlockInfo; } - virtual void reallocate(size_t newByteLength) override + virtual bool isResizable() const override { - ASSERT_NOT_REACHED(); + return m_sharedDataBlockInfo->isGrowable(); } void* operator new(size_t size); diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/Context.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/Context.h index e7b055c..72433ad 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/Context.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/Context.h @@ -24,7 +24,6 @@ #include "runtime/GlobalObject.h" #include "runtime/RegExpObject.h" #include "runtime/StaticStrings.h" -#include "runtime/String.h" namespace Escargot { diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/DateObject.cpp b/lwnode/code/escargotshim/deps/escargot/src/runtime/DateObject.cpp index b6a5e23..a78743b 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/DateObject.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/DateObject.cpp @@ -368,11 +368,6 @@ inline bool isASCIISpace(char c) return c <= ' ' && (c == ' ' || (c <= 0xD && c >= 0x9)); } -inline bool isASCIIDigit(char c) -{ - return c >= '0' && c <= '9'; -} - inline static void skipSpacesAndComments(const char*& s) { int nesting = 0; diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/EncodedValue.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/EncodedValue.h index f344902..5e76b2a 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/EncodedValue.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/EncodedValue.h @@ -134,10 +134,10 @@ const int kSmiValueSize = PlatformSmiTagging::kSmiValueSize; #if defined(ESCARGOT_64) && defined(ESCARGOT_USE_32BIT_IN_64BIT) #define HAS_SMI_TAG(value) \ - ((reinterpret_cast((long int)value) & ::Escargot::EncodedValueImpl::kSmiTagMask) == ::Escargot::EncodedValueImpl::kSmiTag) + ((static_cast((long int)value) & ::Escargot::EncodedValueImpl::kSmiTagMask) == ::Escargot::EncodedValueImpl::kSmiTag) #else #define HAS_SMI_TAG(value) \ - ((reinterpret_cast(value) & ::Escargot::EncodedValueImpl::kSmiTagMask) == ::Escargot::EncodedValueImpl::kSmiTag) + ((static_cast(value) & ::Escargot::EncodedValueImpl::kSmiTagMask) == ::Escargot::EncodedValueImpl::kSmiTag) #endif } // namespace EncodedValueImpl diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/ExecutionPauser.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/ExecutionPauser.h index 9acd7ae..bb98851 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/ExecutionPauser.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/ExecutionPauser.h @@ -38,13 +38,13 @@ public: ExecutionPauser(ExecutionState& state, Object* sourceObject, ExecutionState* executionState, Value* registerFile, ByteCodeBlock* blk); - enum PauseReason { + enum PauseReason : unsigned { Yield, Await, GeneratorsInitialize }; - enum ResumeState { + enum ResumeState : unsigned { Normal, Throw, Return diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/FunctionObject.cpp b/lwnode/code/escargotshim/deps/escargot/src/runtime/FunctionObject.cpp index 581f6dd..c06ce08 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/FunctionObject.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/FunctionObject.cpp @@ -75,180 +75,160 @@ FunctionObject::FunctionObject(ObjectStructure* structure, ObjectPropertyValueVe { } -FunctionObject::FunctionSource FunctionObject::createFunctionSourceFromScriptSource(ExecutionState& state, AtomicString functionName, size_t argumentValueArrayCount, Value* argumentValueArray, Value bodyString, bool useStrict, bool isGenerator, bool isAsync, bool allowSuperCall, bool findSrcName) +FunctionObject::FunctionSource FunctionObject::createFunctionSourceFromScriptSource(ExecutionState& state, AtomicString functionName, size_t argCount, Value* argArray, Value bodyValue, bool useStrict, bool isGenerator, bool isAsync, bool allowSuperCall, bool isInternalSource) { - StringBuilder src, srcToTest; + StringBuilder src, parameters; if (useStrict) { src.appendString("'use strict'; "); } if (isGenerator && isAsync) { src.appendString("async function* "); - srcToTest.appendString("async function* "); } else if (isGenerator) { src.appendString("function* "); - srcToTest.appendString("function* "); } else if (isAsync) { src.appendString("async function "); - srcToTest.appendString("async function "); } else { src.appendString("function "); - srcToTest.appendString("function "); } + // function name src.appendString(functionName.string()); - src.appendString("("); - srcToTest.appendString(functionName.string()); - srcToTest.appendString("("); - for (size_t i = 0; i < argumentValueArrayCount; i++) { - String* p = argumentValueArray[i].toString(state); - src.appendString(p); - srcToTest.appendString(p); - if (i != argumentValueArrayCount - 1) { - src.appendString(","); - srcToTest.appendString(","); - - for (size_t j = 0; j < p->length(); j++) { - char16_t c = p->charAt(j); - if (c == '}' || c == '{' || c == ')' || c == '(') { - ErrorObject::throwBuiltinError(state, ErrorObject::SyntaxError, "there is a script parse error in parameter name"); - } + { + // function parameters + parameters.appendString("("); + for (size_t i = 0; i < argCount; i++) { + String* p = argArray[i].toString(state); + parameters.appendString(p); + if (i != argCount - 1) { + parameters.appendString(","); } } + parameters.appendString("\n)"); } - GC_disable(); - - try { - srcToTest.appendString("\n) { }"); - String* cur = srcToTest.finalize(&state); - esprima::parseProgram(state.context(), StringView(cur, 0, cur->length()), nullptr, false, false, false, SIZE_MAX, false, false, true, true); - - // reset ASTAllocator - state.context()->astAllocator().reset(); - GC_enable(); - } catch (esprima::Error* orgError) { - // reset ASTAllocator - state.context()->astAllocator().reset(); - GC_enable(); - - delete orgError; - - ErrorObject::throwBuiltinError(state, ErrorObject::SyntaxError, "there is a script parse error in parameter name"); - } - - String* source = bodyString.toString(state); - - auto data = source->bufferAccessData(); + String* parameterStr = parameters.finalize(&state); + String* originBodyStr = bodyValue.toString(state); + String* scriptSource = nullptr; - for (size_t i = 0; i < data.length; i++) { - char16_t c; - if (data.has8BitContent) { - c = ((LChar*)data.buffer)[i]; - } else { - c = ((char16_t*)data.buffer)[i]; - } - if (c == '{') { - break; - } else if (c == '}') { - ErrorObject::throwBuiltinError(state, ErrorObject::SyntaxError, "there is unbalanced braces(}) in Function Constructor input"); - } - } - - String* scriptSource; #if defined(ENABLE_RELOADABLE_STRING) - if (UNLIKELY(source->isReloadableString())) { - src.appendString("\n) {\n"); - String* head = src.finalize(&state); + if (UNLIKELY(originBodyStr->isReloadableString())) { + src.appendString(parameterStr); + src.appendString(" {\n"); + + String* headStr = src.finalize(&state); - bool is8Bit = head->has8BitContent() && source->has8BitContent(); + bool is8Bit = headStr->has8BitContent() && originBodyStr->has8BitContent(); const char tail[] = "\n}"; class ReloadableStringData : public gc { public: - ReloadableStringData(String* head, ReloadableString* source) + ReloadableStringData(String* head, ReloadableString* body) : m_head(head) - , m_source(source) + , m_body(body) , m_dest(nullptr) { } String* m_head; - ReloadableString* m_source; + ReloadableString* m_body; ReloadableString* m_dest; }; - ReloadableStringData* data = new ReloadableStringData(head, source->asReloadableString()); + ReloadableStringData* data = new ReloadableStringData(headStr, originBodyStr->asReloadableString()); - scriptSource = new ReloadableString(state.context()->vmInstance(), is8Bit, head->length() + source->length() + sizeof(tail) - 1, + scriptSource = new ReloadableString(state.context()->vmInstance(), is8Bit, headStr->length() + originBodyStr->length() + sizeof(tail) - 1, data, [](void* callbackData) -> void* { ReloadableStringData* data = reinterpret_cast(callbackData); bool is8Bit = data->m_dest->has8BitContent(); - char* dest = reinterpret_cast(malloc((data->m_dest->length() + 1) * (is8Bit ? 1 : 2))); - char* ptr = dest; + char* dest = reinterpret_cast(malloc((data->m_dest->length()) * (is8Bit ? 1 : 2))); - auto fillDestBuffer = [](char* ptr, String* src, bool is8Bit) -> char* { - auto bad = src->bufferAccessData(); - if (is8Bit) { - for (size_t i = 0; i < bad.length; i ++) { - ptr[i] = bad.charAt(i); + auto headAccessData = data->m_head->bufferAccessData(); + auto bodyAccessData = data->m_body->bufferAccessData(); + + if (is8Bit) { + ASSERT(headAccessData.has8BitContent && bodyAccessData.has8BitContent); + char* ptr = dest; + memcpy(ptr, headAccessData.bufferAs8Bit, headAccessData.length); + ptr += headAccessData.length; + memcpy(ptr, bodyAccessData.bufferAs8Bit, bodyAccessData.length); + ptr += bodyAccessData.length; + ptr[0] = '\n'; + ptr[1] = '}'; + } else { + char16_t* ptr = reinterpret_cast(dest); + if (headAccessData.has8BitContent) { + for (size_t i = 0; i < headAccessData.length; i++) { + ptr[i] = headAccessData.charAt(i); } - ptr += bad.length; } else { - char16_t* ptrAs16 = (char16_t*)ptr; - for (size_t i = 0; i < bad.length; i++) { - ptrAs16[i] = bad.charAt(i); - } - ptr += (bad.length * 2); + memcpy(ptr, headAccessData.bufferAs16Bit, headAccessData.length * 2); } - return ptr; - }; - - ptr = fillDestBuffer(ptr, data->m_head, is8Bit); - ptr = fillDestBuffer(ptr, data->m_source, is8Bit); - // unload original source immediately - data->m_source->unload(); + ptr += headAccessData.length; - const char tail[] = "\n}"; - size_t tailLength = sizeof(tail) - 1; - if (is8Bit) { - for (size_t i = 0; i < tailLength; i ++) { - ptr[i] = tail[i]; - } - ptr += tailLength; - } else { - char16_t* ptrAs16 = (char16_t*)ptr; - for (size_t i = 0; i < tailLength; i ++) { - ptrAs16[i] = tail[i]; + if (bodyAccessData.has8BitContent) { + for (size_t i = 0; i < bodyAccessData.length; i++) { + ptr[i] = bodyAccessData.charAt(i); + } + } else { + memcpy(ptr, bodyAccessData.bufferAs16Bit, bodyAccessData.length * 2); } - ptr += (tailLength * 2); - } + ptr += bodyAccessData.length; - *ptr = 0; - if (!is8Bit) { - ptr++; - *ptr = 0; + ptr[0] = '\n'; + ptr[1] = '}'; } + // unload original body source immediately + // set nullptr to unload body string + bodyAccessData.buffer = nullptr; + data->m_body->unload(); return dest; }, [](void* memoryPtr, void* callbackData) { free(memoryPtr); }); data->m_dest = scriptSource->asReloadableString(); - - } else { + } else +#endif + { + StringBuilder body; + body.appendString(" {\n"); + body.appendString(originBodyStr); + body.appendString("\n}"); + String* bodyStr = body.finalize(&state); + +#if defined(ESCARGOT_ENABLE_TEST) + // simple syntax check for dynamic generated function except internal source + // to check rare erratic formats e.g. Function('){ function foo(', '}') + // this check is enabled only for test mode because it requires double-parsing which may affect the overall performance + if (!isInternalSource) { + GC_disable(); + try { + esprima::simpleSyntaxCheckFunctionElements(state.context(), parameterStr, bodyStr, useStrict, isGenerator, isAsync); + + // reset ASTAllocator + state.context()->astAllocator().reset(); + GC_enable(); + } catch (esprima::Error* syntaxError) { + String* errorMessage = syntaxError->message; + // reset ASTAllocator + state.context()->astAllocator().reset(); + GC_enable(); + delete syntaxError; + + ErrorObject::throwBuiltinError(state, ErrorObject::SyntaxError, errorMessage); + } + } #endif - src.appendString("\n) {\n"); - src.appendString(source); - src.appendString("\n}"); + + src.appendString(parameterStr); + src.appendString(bodyStr); scriptSource = src.finalize(&state); -#if defined(ENABLE_RELOADABLE_STRING) } -#endif ScriptParser parser(state.context()); String* srcName = String::emptyString; - // find srcName through outer script - if (findSrcName) { + // find srcName through outer script except internal source + if (!isInternalSource) { auto script = state.resolveOuterScript(); if (script) { srcName = script->srcName(); diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/FunctionObject.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/FunctionObject.h index b9f16a7..78a3cc3 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/FunctionObject.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/FunctionObject.h @@ -107,7 +107,7 @@ public: InterpretedCodeBlock* codeBlock; LexicalEnvironment* outerEnvironment; }; - static FunctionSource createFunctionSourceFromScriptSource(ExecutionState& state, AtomicString functionName, size_t argumentValueArrayCount, Value* argumentValueArray, Value bodyString, bool useStrict, bool isGenerator, bool isAsync, bool allowSuperCall, bool findSrcName = true); + static FunctionSource createFunctionSourceFromScriptSource(ExecutionState& state, AtomicString functionName, size_t argCount, Value* argArray, Value bodyString, bool useStrict, bool isGenerator, bool isAsync, bool allowSuperCall, bool isInternalSource = false); protected: FunctionObject(ExecutionState& state, Object* proto, size_t defaultSpace); // function for derived classes. derived class MUST initlize member variable of FunctionObject. diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/FunctionTemplate.cpp b/lwnode/code/escargotshim/deps/escargot/src/runtime/FunctionTemplate.cpp index c237032..30a1e0b 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/FunctionTemplate.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/FunctionTemplate.cpp @@ -180,8 +180,8 @@ Object* FunctionTemplate::instantiate(Context* ctx) Object* functionPrototype = nullptr; if (m_isConstructor) { // [prototype, name, length] - if (!m_prototypeTemplate->has(ctx->staticStrings().constructor)) { - m_prototypeTemplate->set(ctx->staticStrings().constructor, Value(), true, false, true); + if (!m_prototypeTemplate->has(ctx->staticStrings().constructor.string())) { + m_prototypeTemplate->set(ctx->staticStrings().constructor.string(), Value(), true, false, true); } ObjectPropertyValue baseValues[3]; diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/GeneratorObject.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/GeneratorObject.h index 5931811..9c09dc5 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/GeneratorObject.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/GeneratorObject.h @@ -32,7 +32,7 @@ class GeneratorObject : public Object { friend class ExecutionPauser; public: - enum GeneratorState { + enum GeneratorState : unsigned { SuspendedStart, SuspendedYield, Executing, @@ -40,7 +40,7 @@ public: CompletedThrow, }; - enum GeneratorAbruptType { + enum GeneratorAbruptType : unsigned { Return, Throw }; diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/Global.cpp b/lwnode/code/escargotshim/deps/escargot/src/runtime/Global.cpp index 46f8e99..7691b06 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/Global.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/Global.cpp @@ -100,4 +100,21 @@ Global::Waiter* Global::waiter(void* blockAddress) } #endif +#ifdef ESCARGOT_USE_CUSTOM_LOGGING +void customEscargotInfoLogger(const char* format, ...) +{ + va_list arg; + va_start(arg, format); + Global::platform()->customInfoLogger(format, arg); + va_end(arg); +} + +void customEscargotErrorLogger(const char* format, ...) +{ + va_list arg; + va_start(arg, format); + Global::platform()->customErrorLogger(format, arg); + va_end(arg); +} +#endif } // namespace Escargot diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/Object.cpp b/lwnode/code/escargotshim/deps/escargot/src/runtime/Object.cpp index 56ce9fc..873e57c 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/Object.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/Object.cpp @@ -38,6 +38,22 @@ namespace Escargot { COMPILE_ASSERT(OBJECT_PROPERTY_NAME_UINT32_VIAS == (OBJECT_PROPERTY_NAME_ATOMIC_STRING_VIAS << 1), ""); COMPILE_ASSERT(OBJECT_PROPERTY_NAME_UINT32_VIAS <= (1 << 3), ""); +ObjectStructurePropertyName::ObjectStructurePropertyName() + : m_data(((size_t)AtomicString().string()) | OBJECT_PROPERTY_NAME_ATOMIC_STRING_VIAS) +{ +} + +ObjectStructurePropertyName::ObjectStructurePropertyName(const Value& value) +{ + // accept string or symbol value only + ASSERT(value.isString() || value.isSymbol()); + if (value.isString()) { + m_data = reinterpret_cast(value.asString()); + } else { + m_data = reinterpret_cast(value.asSymbol()); + } +} + ObjectStructurePropertyName::ObjectStructurePropertyName(ExecutionState& state, const Value& valueIn) { Value value = valueIn.toPrimitive(state, Value::PreferString); @@ -2035,25 +2051,30 @@ void Object::addFinalizer(ObjectFinalizer fn, void* data) if (!rareData()->m_isFinalizerRegistered) { rareData()->m_isFinalizerRegistered = true; +#define FINALIZER_CALLBACK() \ + Object* self = (Object*)obj; \ + auto r = self->ensureObjectExtendedExtraData(); \ + for (size_t i = 0; i < r->m_finalizer.size(); i++) { \ + r->m_finalizer[i].first(self, r->m_finalizer[i].second); \ + } + #ifndef NDEBUG GC_finalization_proc of = nullptr; void* od = nullptr; -#endif - - GC_REGISTER_FINALIZER_NO_ORDER(this, [](void* obj, void*) { - Object* self = (Object*)obj; - auto r = self->ensureObjectExtendedExtraData(); - for (size_t i = 0; i < r->m_finalizer.size(); i++) { - r->m_finalizer[i].first(self, r->m_finalizer[i].second); - } - }, -#ifdef NDEBUG - nullptr, nullptr, nullptr); -#else - nullptr, &of, &od); -#endif + GC_REGISTER_FINALIZER_NO_ORDER( + this, [](void* obj, void*) { + FINALIZER_CALLBACK() + }, + nullptr, &of, &od); ASSERT(!of); ASSERT(!od); +#else + GC_REGISTER_FINALIZER_NO_ORDER( + this, [](void* obj, void*) { + FINALIZER_CALLBACK() + }, + nullptr, nullptr, nullptr); +#endif } r->m_finalizer.pushBack(std::make_pair(fn, data)); } diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/ObjectStructurePropertyName.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/ObjectStructurePropertyName.h index d47d51c..d841493 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/ObjectStructurePropertyName.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/ObjectStructurePropertyName.h @@ -25,13 +25,17 @@ namespace Escargot { +class Template; + #define OBJECT_PROPERTY_NAME_ATOMIC_STRING_VIAS 1 class ObjectStructurePropertyName { + friend Template; + public: ObjectStructurePropertyName(const AtomicString& atomicString) { - m_data = ((size_t)atomicString.string() + OBJECT_PROPERTY_NAME_ATOMIC_STRING_VIAS); + m_data = ((size_t)atomicString.string()) | OBJECT_PROPERTY_NAME_ATOMIC_STRING_VIAS; ASSERT(m_data); } @@ -40,7 +44,10 @@ public: m_data = (size_t)symbol; } + ObjectStructurePropertyName(); + // same as `ToPropertyKey` https://262.ecma-international.org/#sec-topropertykey ObjectStructurePropertyName(ExecutionState& state, const Value& value); + size_t hashValue() const { if (LIKELY(hasAtomicString())) { @@ -170,6 +177,9 @@ public: private: size_t m_data; + // used only for Template case + ObjectStructurePropertyName(const Value& value); + protected: ALWAYS_INLINE bool hasSymbol() const { diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/ObjectTemplate.cpp b/lwnode/code/escargotshim/deps/escargot/src/runtime/ObjectTemplate.cpp index 6f09b92..a48947d 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/ObjectTemplate.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/ObjectTemplate.cpp @@ -58,35 +58,16 @@ public: { } - static TemplatePropertyNameRef toTemplatePropertyNameRef(const ObjectPropertyName& P) - { - auto name = P.objectStructurePropertyName(); - ASSERT(name.isPlainString() || name.isSymbol()); - if (name.isPlainString()) { - return TemplatePropertyNameRef(toRef(name.plainString())); - } - return TemplatePropertyNameRef(toRef(name.symbol())); - } - - static ObjectPropertyName toObjectPropertyName(ExecutionState& state, const TemplatePropertyNameRef& nameRef) - { - if (nameRef.value()->isString()) { - return ObjectPropertyName(state, Value(toImpl(nameRef.value()->asString()))); - } else { - return ObjectPropertyName(toImpl(nameRef.value()->asSymbol())); - } - } - virtual ObjectGetResult getOwnProperty(ExecutionState& state, const ObjectPropertyName& P) override { if (!P.isIndexString() && m_data->getter) { OptionalRef ret(m_data->getter(toRef(&state), toRef(this), toRef(this), m_data->data, - TemplatePropertyNameRef(toTemplatePropertyNameRef(P)))); + toRef(P.toPropertyKeyValue()))); if (ret) { if (m_data->query) { auto attr = m_data->query(toRef(&state), toRef(this), toRef(this), m_data->data, - TemplatePropertyNameRef(toTemplatePropertyNameRef(P))); + toRef(P.toPropertyKeyValue())); return ObjectGetResult(toImpl(ret.value()), attr & TemplatePropertyAttribute::TemplatePropertyAttributeWritable, attr & TemplatePropertyAttribute::TemplatePropertyAttributeEnumerable, attr & TemplatePropertyAttribute::TemplatePropertyAttributeConfigurable); } else { return ObjectGetResult(toImpl(ret.value()), true, true, true); @@ -100,7 +81,7 @@ public: { if (m_data->descriptor) { auto ret = m_data->descriptor(toRef(&state), toRef(this), toRef(this), m_data->data, - TemplatePropertyNameRef(toTemplatePropertyNameRef(P))); + toRef(P.toPropertyKeyValue())); if (ret.hasValue()) { return toImpl(ret.value()); } else { @@ -115,12 +96,12 @@ public: { if (!P.isIndexString()) { if (m_data->definer) { - auto ret = m_data->definer(toRef(&state), toRef(this), toRef(this), m_data->data, TemplatePropertyNameRef(toTemplatePropertyNameRef(P)), ObjectPropertyDescriptorRef((void*)&desc)); + auto ret = m_data->definer(toRef(&state), toRef(this), toRef(this), m_data->data, toRef(P.toPropertyKeyValue()), ObjectPropertyDescriptorRef((void*)&desc)); if (ret.hasValue()) { return ret.value()->toBoolean(toRef(&state)); } } else if (m_data->setter && desc.isValuePresent() && desc.isWritable() && desc.isEnumerable() && desc.isConfigurable()) { - auto ret = m_data->setter(toRef(&state), toRef(this), toRef(this), m_data->data, TemplatePropertyNameRef(toTemplatePropertyNameRef(P)), toRef(desc.value())); + auto ret = m_data->setter(toRef(&state), toRef(this), toRef(this), m_data->data, toRef(P.toPropertyKeyValue()), toRef(desc.value())); if (ret.hasValue()) { return ret.value()->toBoolean(toRef(&state)); } @@ -133,7 +114,7 @@ public: { if (m_data->query) { auto attr = m_data->query(toRef(&state), toRef(this), toRef(this), m_data->data, - TemplatePropertyNameRef(toTemplatePropertyNameRef(propertyName))); + toRef(propertyName.toPropertyKeyValue())); return attr & TemplatePropertyAttributeExist; } return Object::hasOwnProperty(state, propertyName); @@ -143,7 +124,7 @@ public: { if (m_data->query) { auto attr = m_data->query(toRef(&state), toRef(this), toRef(this), m_data->data, - TemplatePropertyNameRef(toTemplatePropertyNameRef(P))); + toRef(P.toPropertyKeyValue())); if (attr & TemplatePropertyAttributeExist) { bool isWritable = attr & TemplatePropertyAttribute::TemplatePropertyAttributeWritable; bool isEnumerable = attr & TemplatePropertyAttribute::TemplatePropertyAttributeEnumerable; @@ -152,7 +133,7 @@ public: Value v; if (m_data->getter) { OptionalRef ret = (m_data->getter(toRef(&state), toRef(this), toRef(this), m_data->data, - TemplatePropertyNameRef(toTemplatePropertyNameRef(P)))); + toRef(P.toPropertyKeyValue()))); if (ret) { v = toImpl(ret.value()); } @@ -163,7 +144,7 @@ public: } } else if (m_data->getter) { OptionalRef ret = (m_data->getter(toRef(&state), toRef(this), toRef(this), m_data->data, - TemplatePropertyNameRef(toTemplatePropertyNameRef(P)))); + toRef(P.toPropertyKeyValue()))); if (ret) { return ObjectGetResult(toImpl(ret.value()), true, true, true); } @@ -176,7 +157,7 @@ public: { if (m_data->deleter) { auto ret = m_data->deleter(toRef(&state), toRef(this), toRef(this), m_data->data, - TemplatePropertyNameRef(toTemplatePropertyNameRef(P))); + toRef(P.toPropertyKeyValue())); if (ret.hasValue()) { return ret.value()->toBoolean(toRef(&state)); } @@ -189,26 +170,26 @@ public: if (m_data->enumerator) { auto ret = m_data->enumerator(toRef(&state), toRef(this), toRef(this), m_data->data); if (m_data->query) { - for (size_t i = 0; i < ret.size(); i++) { - if (shouldSkipSymbolKey && ret[i].value()->isSymbol()) { + for (size_t i = 0; i < ret->size(); i++) { + if (shouldSkipSymbolKey && ret->at(i)->isSymbol()) { continue; } auto attr = m_data->query(toRef(&state), toRef(this), toRef(this), m_data->data, - TemplatePropertyNameRef(ret[i])); + ret->at(i)); ObjectStructurePropertyDescriptor desc = ObjectStructurePropertyDescriptor::createDataDescriptor( (ObjectStructurePropertyDescriptor::PresentAttribute)( ((attr & TemplatePropertyAttribute::TemplatePropertyAttributeWritable) ? ObjectStructurePropertyDescriptor::WritablePresent : 0) | ((attr & TemplatePropertyAttribute::TemplatePropertyAttributeEnumerable) ? ObjectStructurePropertyDescriptor::EnumerablePresent : 0) | ((attr & TemplatePropertyAttribute::TemplatePropertyAttributeConfigurable) ? ObjectStructurePropertyDescriptor::ConfigurablePresent : 0))); - callback(state, this, toObjectPropertyName(state, ret[i]), desc, data); + callback(state, this, ObjectPropertyName(state, toImpl(ret->at(i))), desc, data); } } else { - for (size_t i = 0; i < ret.size(); i++) { - if (shouldSkipSymbolKey && ret[i].value()->isSymbol()) { + for (size_t i = 0; i < ret->size(); i++) { + if (shouldSkipSymbolKey && ret->at(i)->isSymbol()) { continue; } ObjectStructurePropertyDescriptor desc = ObjectStructurePropertyDescriptor::createDataDescriptor(); - callback(state, this, toObjectPropertyName(state, ret[i]), desc, data); + callback(state, this, ObjectPropertyName(state, toImpl(ret->at(i))), desc, data); } } } @@ -219,12 +200,12 @@ public: { if (!P.isIndexString()) { OptionalRef ret(m_data->getter(toRef(&state), toRef(this), toRef(receiver), m_data->data, - TemplatePropertyNameRef(toTemplatePropertyNameRef(P)))); + toRef(P.toPropertyKeyValue()))); if (ret) { if (m_data->query) { auto attr = m_data->query(toRef(&state), toRef(this), toRef(receiver), m_data->data, - TemplatePropertyNameRef(toTemplatePropertyNameRef(P))); + toRef(P.toPropertyKeyValue())); return ObjectGetResult(toImpl(ret.value()), attr & TemplatePropertyAttribute::TemplatePropertyAttributeWritable, attr & TemplatePropertyAttribute::TemplatePropertyAttributeEnumerable, attr & TemplatePropertyAttribute::TemplatePropertyAttributeConfigurable); } else { return ObjectGetResult(toImpl(ret.value()), true, true, true); @@ -237,7 +218,7 @@ public: virtual bool set(ExecutionState& state, const ObjectPropertyName& P, const Value& v, const Value& receiver) override { if (m_data->setter && !P.isIndexString()) { - auto ret = m_data->setter(toRef(&state), toRef(this), toRef(receiver), m_data->data, TemplatePropertyNameRef(toTemplatePropertyNameRef(P)), toRef(v)); + auto ret = m_data->setter(toRef(&state), toRef(this), toRef(receiver), m_data->data, toRef(P.toPropertyKeyValue()), toRef(v)); if (ret.hasValue()) { return ret.value()->toBoolean(toRef(&state)); } @@ -313,8 +294,15 @@ bool ObjectTemplate::installTo(Context* ctx, Object* target) size_t propertyCount = sender->self->m_properties.size(); auto properties = sender->self->m_properties; for (size_t i = 0; i < propertyCount; i++) { - ObjectPropertyName name(properties[i].first.toObjectStructurePropertyName(sender->ctx)); + auto propertyNameValue = properties[i].first.toValue(); + ObjectStructurePropertyName name; + if (propertyNameValue.isString()) { + name = ObjectStructurePropertyName(AtomicString(state, propertyNameValue.asString())); + } else { + ASSERT(propertyNameValue.isSymbol()); + name = ObjectStructurePropertyName(propertyNameValue.asSymbol()); + } auto a = properties[i].second.presentAttributes(); int attr = 0; diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/Platform.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/Platform.h index 98fc653..9eae39b 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/Platform.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/Platform.h @@ -53,6 +53,12 @@ public: // ThreadLocal custom data (g_customData) virtual void* allocateThreadLocalCustomData() = 0; virtual void deallocateThreadLocalCustomData() = 0; + +#ifdef ESCARGOT_USE_CUSTOM_LOGGING + // customized logging + virtual void customInfoLogger(const char* format, va_list arg) = 0; + virtual void customErrorLogger(const char* format, va_list arg) = 0; +#endif }; } // namespace Escargot diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/PromiseObject.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/PromiseObject.h index 0b3e904..fc8580f 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/PromiseObject.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/PromiseObject.h @@ -78,7 +78,7 @@ public: class PromiseObject : public Object { public: - enum PromiseState { + enum PromiseState : size_t { Pending, FulFilled, Rejected diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/SetObject.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/SetObject.h index 7f7df38..5774029 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/SetObject.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/SetObject.h @@ -65,7 +65,7 @@ private: class SetIteratorObject : public IteratorObject { public: - enum Type { + enum Type : unsigned { TypeKey, TypeValue, TypeKeyValue diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/SharedArrayBufferObject.cpp b/lwnode/code/escargotshim/deps/escargot/src/runtime/SharedArrayBufferObject.cpp index b8a0ca9..5f523e4 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/SharedArrayBufferObject.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/SharedArrayBufferObject.cpp @@ -46,6 +46,26 @@ SharedArrayBufferObject::SharedArrayBufferObject(ExecutionState& state, Object* m_backingStore = BackingStore::createDefaultSharedBackingStore(byteLength); } +SharedArrayBufferObject::SharedArrayBufferObject(ExecutionState& state, Object* proto, size_t byteLength, size_t maxByteLength) + : ArrayBuffer(state, proto) +{ + ASSERT(byteLength <= maxByteLength); + ASSERT(maxByteLength < ArrayBuffer::maxArrayBufferSize); + + const size_t ratio = std::max((size_t)GC_get_free_space_divisor() / 6, (size_t)1); + if (maxByteLength > (GC_get_heap_size() / ratio)) { + size_t n = 0; + size_t times = maxByteLength / (GC_get_heap_size() / ratio) / 3; + do { + GC_gcollect_and_unmap(); + n += 1; + } while (n < times); + GC_invoke_finalizers(); + } + + m_backingStore = BackingStore::createDefaultGrowableSharedBackingStore(byteLength, maxByteLength); +} + SharedArrayBufferObject::SharedArrayBufferObject(ExecutionState& state, Object* proto, BackingStore* backingStore) : ArrayBuffer(state, proto) { @@ -61,17 +81,27 @@ SharedArrayBufferObject::SharedArrayBufferObject(ExecutionState& state, Object* m_backingStore = BackingStore::createSharedBackingStore(sharedInfo); } -SharedArrayBufferObject* SharedArrayBufferObject::allocateSharedArrayBuffer(ExecutionState& state, Object* constructor, uint64_t byteLength) +SharedArrayBufferObject* SharedArrayBufferObject::allocateSharedArrayBuffer(ExecutionState& state, Object* constructor, uint64_t byteLength, Optional maxByteLength) { // https://262.ecma-international.org/#sec-allocatesharedarraybuffer Object* proto = Object::getPrototypeFromConstructor(state, constructor, [](ExecutionState& state, Context* constructorRealm) -> Object* { return constructorRealm->globalObject()->sharedArrayBufferPrototype(); }); - if (byteLength >= ArrayBuffer::maxArrayBufferSize) { + if (UNLIKELY(byteLength >= ArrayBuffer::maxArrayBufferSize)) { ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, state.context()->staticStrings().SharedArrayBuffer.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_InvalidArrayBufferSize); } + if (UNLIKELY(maxByteLength.hasValue())) { + ASSERT(byteLength <= maxByteLength.value()); + uint64_t maxLength = maxByteLength.value(); + if (UNLIKELY(maxLength >= ArrayBuffer::maxArrayBufferSize)) { + ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, state.context()->staticStrings().SharedArrayBuffer.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_InvalidArrayBufferSize); + } + + return new SharedArrayBufferObject(state, proto, byteLength, maxLength); + } + return new SharedArrayBufferObject(state, proto, byteLength); } diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/SharedArrayBufferObject.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/SharedArrayBufferObject.h index eff0073..a5d2d8e 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/SharedArrayBufferObject.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/SharedArrayBufferObject.h @@ -29,10 +29,11 @@ namespace Escargot { class SharedArrayBufferObject : public ArrayBuffer { public: SharedArrayBufferObject(ExecutionState& state, Object* proto, size_t byteLength); + SharedArrayBufferObject(ExecutionState& state, Object* proto, size_t byteLength, size_t maxByteLength); SharedArrayBufferObject(ExecutionState& state, Object* proto, BackingStore* backingStore); SharedArrayBufferObject(ExecutionState& state, Object* proto, SharedDataBlockInfo* sharedInfo); - static SharedArrayBufferObject* allocateSharedArrayBuffer(ExecutionState& state, Object* constructor, uint64_t byteLength); + static SharedArrayBufferObject* allocateSharedArrayBuffer(ExecutionState& state, Object* constructor, uint64_t byteLength, Optional maxByteLength); virtual bool isSharedArrayBufferObject() const override { diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/StaticStrings.cpp b/lwnode/code/escargotshim/deps/escargot/src/runtime/StaticStrings.cpp index 45c4bce..a3203e2 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/StaticStrings.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/StaticStrings.cpp @@ -120,6 +120,9 @@ void StaticStrings::initStaticStrings() INIT_STATIC_STRING(get__proto__, "get __proto__"); INIT_STATIC_STRING(getbyteLength, "get byteLength"); INIT_STATIC_STRING(getbyteOffset, "get byteOffset"); + INIT_STATIC_STRING(getgrowable, "get growable"); + INIT_STATIC_STRING(getmaxByteLength, "get maxByteLength"); + INIT_STATIC_STRING(getresizable, "get resizable"); INIT_STATIC_STRING(intlDotCollator, "Intl.Collator"); INIT_STATIC_STRING(intlDotDisplayNames, "Intl.DisplayNames"); INIT_STATIC_STRING(intlDotListFormat, "Intl.ListFormat"); diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/StaticStrings.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/StaticStrings.h index 2a44996..201edab 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/StaticStrings.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/StaticStrings.h @@ -270,6 +270,7 @@ namespace Escargot { F(global) \ F(globalThis) \ F(groups) \ + F(growable) \ F(has) \ F(hasInstance) \ F(hasOwn) \ @@ -321,6 +322,7 @@ namespace Escargot { F(match) \ F(matchAll) \ F(max) \ + F(maxByteLength) \ F(maximize) \ F(message) \ F(min) \ @@ -364,6 +366,8 @@ namespace Escargot { F(repeat) \ F(replace) \ F(replaceAll) \ + F(resizable) \ + F(resize) \ F(resolve) \ F(resolvedOptions) \ F(reverse) \ @@ -455,6 +459,7 @@ namespace Escargot { F(toTimeString) \ F(toUTCString) \ F(toUpperCase) \ + F(transfer) \ F(trim) \ F(trimEnd) \ F(trimLeft) \ @@ -905,6 +910,9 @@ public: AtomicString get__proto__; AtomicString getbyteLength; AtomicString getbyteOffset; + AtomicString getgrowable; + AtomicString getmaxByteLength; + AtomicString getresizable; AtomicString intlDotCollator; AtomicString intlDotDisplayNames; AtomicString intlDotListFormat; diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/String.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/String.h index b630aa2..c5c13a9 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/String.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/String.h @@ -88,6 +88,9 @@ public: }; struct StringBufferAccessData { + // should be allocated on the stack + MAKE_STACK_ALLOCATED(); + bool has8BitContent; size_t length; union { @@ -658,10 +661,6 @@ public: { return gc::operator new(size, p); } - void* operator new(size_t, void* ptr) - { - return ptr; - } void* operator new[](size_t size) = delete; }; diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/Template.cpp b/lwnode/code/escargotshim/deps/escargot/src/runtime/Template.cpp index 751f5bb..9a2f7f7 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/Template.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/Template.cpp @@ -23,30 +23,23 @@ namespace Escargot { -ObjectStructurePropertyName TemplatePropertyName::toObjectStructurePropertyName(Context* c) -{ - if (m_ptr->isString()) { - return ObjectStructurePropertyName(AtomicString(c, m_ptr->asString())); - } else { - return ObjectStructurePropertyName(m_ptr->asSymbol()); - } -} - -bool Template::has(const TemplatePropertyName& name) +bool Template::has(const Value& propertyName) { + ObjectStructurePropertyName pName(propertyName); for (size_t i = 0; i < m_properties.size(); i++) { - if (m_properties[i].first == name) { + if (m_properties[i].first == pName) { return true; } } return false; } -bool Template::remove(const TemplatePropertyName& name) +bool Template::remove(const Value& propertyName) { ASSERT(m_cachedObjectStructure.m_objectStructure == nullptr); + ObjectStructurePropertyName pName(propertyName); for (size_t i = 0; i < m_properties.size(); i++) { - if (m_properties[i].first == name) { + if (m_properties[i].first == pName) { m_properties.erase(i); return true; } @@ -54,25 +47,25 @@ bool Template::remove(const TemplatePropertyName& name) return false; } -void Template::set(const TemplatePropertyName& name, const TemplateData& data, bool isWritable, bool isEnumerable, bool isConfigurable) +void Template::set(const Value& propertyName, const TemplateData& data, bool isWritable, bool isEnumerable, bool isConfigurable) { ASSERT(m_cachedObjectStructure.m_objectStructure == nullptr); - remove(name); - m_properties.pushBack(std::make_pair(name, TemplatePropertyData(data, isWritable, isEnumerable, isConfigurable))); + remove(propertyName); + m_properties.pushBack(std::make_pair(ObjectStructurePropertyName(propertyName), TemplatePropertyData(data, isWritable, isEnumerable, isConfigurable))); } -void Template::setAccessorProperty(const TemplatePropertyName& name, Optional getter, Optional setter, bool isEnumerable, bool isConfigurable) +void Template::setAccessorProperty(const Value& propertyName, Optional getter, Optional setter, bool isEnumerable, bool isConfigurable) { ASSERT(m_cachedObjectStructure.m_objectStructure == nullptr); - remove(name); - m_properties.pushBack(std::make_pair(name, TemplatePropertyData(getter, setter, isEnumerable, isConfigurable))); + remove(propertyName); + m_properties.pushBack(std::make_pair(ObjectStructurePropertyName(propertyName), TemplatePropertyData(getter, setter, isEnumerable, isConfigurable))); } -void Template::setNativeDataAccessorProperty(const TemplatePropertyName& name, ObjectPropertyNativeGetterSetterData* nativeGetterSetterData, void* privateData) +void Template::setNativeDataAccessorProperty(const Value& propertyName, ObjectPropertyNativeGetterSetterData* nativeGetterSetterData, void* privateData) { ASSERT(m_cachedObjectStructure.m_objectStructure == nullptr); - remove(name); - m_properties.pushBack(std::make_pair(name, TemplatePropertyData(nativeGetterSetterData, privateData))); + remove(propertyName); + m_properties.pushBack(std::make_pair(ObjectStructurePropertyName(propertyName), TemplatePropertyData(nativeGetterSetterData, privateData))); } void Template::addNativeDataAccessorProperties(Template* other) @@ -106,7 +99,16 @@ Template::CachedObjectStructure Template::constructObjectStructure(Context* ctx, bool isInlineNonCacheable = false; for (size_t i = baseItemCount; i < propertyCount; i++) { auto propertyIndex = i - baseItemCount; - auto propertyName = m_properties[propertyIndex].first.toObjectStructurePropertyName(ctx); + auto propertyNameValue = m_properties[propertyIndex].first.toValue(); + + ObjectStructurePropertyName propertyName; + if (propertyNameValue.isString()) { + propertyName = ObjectStructurePropertyName(AtomicString(ctx, propertyNameValue.asString())); + } else { + ASSERT(propertyNameValue.isSymbol()); + propertyName = ObjectStructurePropertyName(propertyNameValue.asSymbol()); + } + if (!hasIndexStringAsPropertyName) { hasIndexStringAsPropertyName |= propertyName.isIndexString(); } diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/Template.h b/lwnode/code/escargotshim/deps/escargot/src/runtime/Template.h index 009ab4f..78d66c7 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/Template.h +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/Template.h @@ -30,81 +30,6 @@ class Template; class ObjectTemplate; class FunctionTemplate; -class TemplatePropertyName { -public: - TemplatePropertyName(const AtomicString& s) - : m_ptr(s.string()) - { - } - - TemplatePropertyName(String* s) - : m_ptr(s) - { - } - - TemplatePropertyName(Symbol* s) - : m_ptr(s) - { - } - - TemplatePropertyName(PointerValue* s) - : m_ptr(s) - { - ASSERT(s->isString() || s->isSymbol()); - } - - ObjectStructurePropertyName toObjectStructurePropertyName(Context* c); - - bool equals(const TemplatePropertyName& src) - { - // fast path - if (m_ptr == src.m_ptr) { - return true; - } - - if (m_ptr->isSymbol() || src.m_ptr->isSymbol()) { - return false; - } - - return m_ptr->asString()->equals(src.m_ptr->asString()); - } - - bool operator==(const TemplatePropertyName& src) - { - return equals(src); - } - - bool operator!=(const TemplatePropertyName& src) - { - return !equals(src); - } - - bool isString() - { - return m_ptr->isString(); - } - - String* asString() - { - ASSERT(isString()); - return m_ptr->asString(); - } - - bool isSymbol() - { - return m_ptr->isString(); - } - - Symbol* asSymbol() - { - ASSERT(isSymbol()); - return m_ptr->asSymbol(); - } - -private: - PointerValue* m_ptr; -}; - class TemplateData : public gc { friend class Template; @@ -136,15 +61,17 @@ private: // don't modify template after create object // it is not intented operation +// Note) only String or Symbol type is allowed for `propertyName` +// otherwise, it will abort class Template : public gc { public: - void set(const TemplatePropertyName& name, const TemplateData& data, bool isWritable, bool isEnumerable, bool isConfigurable); - void setAccessorProperty(const TemplatePropertyName& name, Optional getter, Optional setter, bool isEnumerable, bool isConfigurable); - void setNativeDataAccessorProperty(const TemplatePropertyName& name, ObjectPropertyNativeGetterSetterData* nativeGetterSetterData, void* privateData); + void set(const Value& propertyName, const TemplateData& data, bool isWritable, bool isEnumerable, bool isConfigurable); + void setAccessorProperty(const Value& propertyName, Optional getter, Optional setter, bool isEnumerable, bool isConfigurable); + void setNativeDataAccessorProperty(const Value& propertyName, ObjectPropertyNativeGetterSetterData* nativeGetterSetterData, void* privateData); - bool has(const TemplatePropertyName& name); + bool has(const Value& propertyName); // return true if removed - bool remove(const TemplatePropertyName& name); + bool remove(const Value& propertyName); void setInstanceExtraData(void* ptr) { @@ -341,7 +268,8 @@ protected: }; static_assert(sizeof(TemplatePropertyData) == sizeof(size_t) * 3, ""); - Vector, GCUtil::gc_malloc_allocator>> m_properties; + // internally, property name is stored as ObjectStructurePropertyName because it only requires the size of `size_t` (4 or 8 bytes) which is memory-efficient + Vector, GCUtil::gc_malloc_allocator>> m_properties; void* m_instanceExtraData; CachedObjectStructure m_cachedObjectStructure; }; diff --git a/lwnode/code/escargotshim/deps/escargot/src/runtime/VMInstance.cpp b/lwnode/code/escargotshim/deps/escargot/src/runtime/VMInstance.cpp index c2b8671..ddf605b 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/runtime/VMInstance.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/runtime/VMInstance.cpp @@ -35,7 +35,22 @@ #include "codecache/CodeCache.h" #endif +#if defined(OS_WINDOWS) +#include +#include +NT_TIB* getTIB() +{ +#ifdef _M_IX86 + return (NT_TIB*)__readfsdword(0x18); +#elif _M_AMD64 + return (NT_TIB*)__readgsqword(0x30); +#else +#error unsupported architecture +#endif +} +#else #include +#endif namespace Escargot { @@ -345,6 +360,9 @@ VMInstance::VMInstance(const char* locale, const char* timezone, const char* bas }, nullptr, nullptr, nullptr); +#if defined(OS_WINDOWS) + m_stackStartAddress = getTIB()->StackBase; +#else pthread_attr_t attr; RELEASE_ASSERT(pthread_getattr_np(pthread_self(), &attr) == 0); @@ -354,7 +372,7 @@ VMInstance::VMInstance(const char* locale, const char* timezone, const char* bas #ifdef STACK_GROWS_DOWN m_stackStartAddress = (char*)m_stackStartAddress + size; #endif - +#endif // test stack base property aligned RELEASE_ASSERT(((size_t)m_stackStartAddress) % sizeof(size_t) == 0); diff --git a/lwnode/code/escargotshim/deps/escargot/src/shell/Shell.cpp b/lwnode/code/escargotshim/deps/escargot/src/shell/Shell.cpp index 2e9cf06..08a9c30 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/shell/Shell.cpp +++ b/lwnode/code/escargotshim/deps/escargot/src/shell/Shell.cpp @@ -24,8 +24,13 @@ #include #include +#if defined(_MSC_VER) +#include +#define realpath(N, R) _fullpath((R), (N), _MAX_PATH) +#else #include #include +#endif #include "api/EscargotPublic.h" #include "malloc.h" diff --git a/lwnode/code/escargotshim/deps/escargot/src/util/Util.h b/lwnode/code/escargotshim/deps/escargot/src/util/Util.h index 103b0ed..3816631 100644 --- a/lwnode/code/escargotshim/deps/escargot/src/util/Util.h +++ b/lwnode/code/escargotshim/deps/escargot/src/util/Util.h @@ -55,7 +55,7 @@ inline void* currentStackPointer() inline void* currentStackPointer() { volatile int temp; - return &temp; + return (void*)&temp; } #else #error @@ -115,9 +115,6 @@ private: uint64_t m_start; const char* m_msg; }; -} // namespace Escargot - -namespace Escargot { namespace detail { diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/bdwgc/include/gc_cpp.h b/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/bdwgc/include/gc_cpp.h index a6d9a2d..388cb8e 100644 --- a/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/bdwgc/include/gc_cpp.h +++ b/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/bdwgc/include/gc_cpp.h @@ -332,6 +332,7 @@ inline void* operator new(size_t size, GC_NS_QUALIFY(GCPlacement) gcp, } # endif +# ifdef GC_OVERRIDE_GLOBAL_NEW_DELETE inline void* operator new(size_t size) { void* obj = GC_MALLOC_UNCOLLECTABLE(size); @@ -343,20 +344,20 @@ inline void* operator new(size_t size, GC_NS_QUALIFY(GCPlacement) gcp, { GC_FREE(obj); } - -# if __cplusplus > 201103L // C++14 - inline void operator delete(void* obj, size_t size) GC_NOEXCEPT { - (void)size; // size is ignored - GC_FREE(obj); - } - -# if defined(GC_OPERATOR_NEW_ARRAY) - inline void operator delete[](void* obj, size_t size) GC_NOEXCEPT { - (void)size; +# if __cplusplus > 201103L // C++14 + inline void operator delete(void* obj, size_t size) GC_NOEXCEPT { + (void)size; // size is ignored GC_FREE(obj); } -# endif -# endif // C++14 + +# if defined(GC_OPERATOR_NEW_ARRAY) + inline void operator delete[](void* obj, size_t size) GC_NOEXCEPT { + (void)size; + GC_FREE(obj); + } +# endif +# endif // C++14 +# endif #endif #ifdef _MSC_VER diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/bdwgc/os_dep.c b/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/bdwgc/os_dep.c index 8e32054..bfce3a9 100644 --- a/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/bdwgc/os_dep.c +++ b/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/bdwgc/os_dep.c @@ -798,9 +798,25 @@ GC_INNER MAY_THREAD_LOCAL size_t GC_page_size = 0; if (buf.State != MEM_COMMIT) return(0); return(buf.RegionSize); } +#if defined(_M_IX86) || defined(_M_AMD64) + STATIC NT_TIB *read_tib() + { +# ifdef _M_IX86 + return (NT_TIB *)__readfsdword(0x18); +# elif _M_AMD64 + return (NT_TIB *)__readgsqword(0x30); +# else +# error unsupported architecture +# endif + } +#endif GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb) { +#if defined(_M_IX86) || defined(_M_AMD64) + sb -> mem_base = read_tib()->StackBase; + return GC_SUCCESS; +#else ptr_t trunc_sp; word size; @@ -815,6 +831,8 @@ GC_INNER MAY_THREAD_LOCAL size_t GC_page_size = 0; GC_ASSERT(size != 0); sb -> mem_base = trunc_sp + size; return GC_SUCCESS; +#endif + } # else /* CYGWIN32 */ /* An alternate version for Cygwin (adapted from Dave Korn's */ diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/bdwgc/reclaim.c b/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/bdwgc/reclaim.c index 4147b02..0eaabcb 100644 --- a/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/bdwgc/reclaim.c +++ b/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/bdwgc/reclaim.c @@ -736,7 +736,9 @@ GC_API void GC_CALL GC_dump_for_graph(const char* log_file_name, { struct Print_stats_escargot pstats; size_t peak_rss; +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) struct rusage ru; +#endif pstats.number_of_blocks = 0; pstats.total_bytes = 0; diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/windows/GCutil/config.h b/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/windows/GCutil/config.h index 039cd1c..4f0e5d2 100644 --- a/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/windows/GCutil/config.h +++ b/lwnode/code/escargotshim/deps/escargot/third_party/GCutil/windows/GCutil/config.h @@ -40,7 +40,7 @@ /* #undef GC_FREEBSD_THREADS */ /* Define to include support for gcj. */ -#define GC_GCJ_SUPPORT 1 +/* #define GC_GCJ_SUPPORT 1 */ /* Define to support GNU pthreads. */ /* #undef GC_GNU_THREADS */ @@ -91,13 +91,13 @@ /* #undef GC_USE_DLOPEN_WRAP */ /* The major version number of this GC release. */ -#define GC_VERSION_MAJOR 7 +#define GC_VERSION_MAJOR 8 /* The micro version number of this GC release. */ -#define GC_VERSION_MICRO 0 +#define GC_VERSION_MICRO 4 /* The minor version number of this GC release. */ -#define GC_VERSION_MINOR 5 +#define GC_VERSION_MINOR 0 /* Define to support pthreads-win32 or winpthreads. */ /* #undef GC_WIN32_PTHREADS */ @@ -250,7 +250,7 @@ #define USE_WINALLOC 1 /* Version number of package */ -#define VERSION "7.5.0" +#define VERSION "8.0.4" /* The POSIX feature macro. */ /* #undef _POSIX_C_SOURCE */ @@ -261,6 +261,13 @@ /* Required define if using POSIX threads. */ /* #undef _REENTRANT */ +#define ALL_INTERIOR_POINTERS 0 +#define GC_DONT_REGISTER_MAIN_STATIC_DATA 1 +#define GC_ENABLE_SUSPEND_THREAD 1 +#define GC_NO_THREADS_DISCOVERY 1 +#define IGNORE_DYNAMIC_LOADING 1 +#define JAVA_FINALIZATION 1 + /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/libbf/cutils.c b/lwnode/code/escargotshim/deps/escargot/third_party/libbf/cutils.c index a02fb76..bdc7904 100644 --- a/lwnode/code/escargotshim/deps/escargot/third_party/libbf/cutils.c +++ b/lwnode/code/escargotshim/deps/escargot/third_party/libbf/cutils.c @@ -166,7 +166,11 @@ int dbuf_putstr(DynBuf *s, const char *str) return dbuf_put(s, (const uint8_t *)str, strlen(str)); } -int __attribute__((format(printf, 2, 3))) dbuf_printf(DynBuf *s, +int +#if !defined(_MSC_VER) + __attribute__((format(printf, 2, 3))) +#endif + dbuf_printf(DynBuf *s, const char *fmt, ...) { va_list ap; diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/libbf/cutils.h b/lwnode/code/escargotshim/deps/escargot/third_party/libbf/cutils.h index 31f7cd8..653588a 100644 --- a/lwnode/code/escargotshim/deps/escargot/third_party/libbf/cutils.h +++ b/lwnode/code/escargotshim/deps/escargot/third_party/libbf/cutils.h @@ -31,11 +31,19 @@ /* set if CPU is big endian */ #undef WORDS_BIGENDIAN +#if defined(_MSC_VER) +#define likely(x) (x) +#define unlikely(x) (x) +#define force_inline __forceinline +#define no_inline __declspec(noinline) +#define __maybe_unused +#else #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #define force_inline inline __attribute__((always_inline)) #define no_inline __attribute__((noinline)) #define __maybe_unused __attribute__((unused)) +#endif #define xglue(x, y) x ## y #define glue(x, y) xglue(x, y) @@ -111,6 +119,63 @@ static inline int64_t min_int64(int64_t a, int64_t b) return b; } +#if defined(_MSC_VER) +#include +static inline int __builtin_ctz(unsigned x) +{ + unsigned long ret; + _BitScanForward(&ret, x); + return (int)ret; +} + +static inline int __builtin_ctzll(unsigned long long x) +{ +#if LIMB_BITS == 64 + unsigned long ret; + _BitScanForward64(&ret, x); + return (int)ret; +#else + int count = 0; + if (!x) + return CHAR_BIT * sizeof x; + for (count = 0; + (count < CHAR_BIT * sizeof x - 32 + && !(x & 0xffffffffU)); + count += 32) + x = x >> 31 >> 1; + return count + __builtin_ctz(x); +#endif +} + +static inline int __builtin_clz(unsigned x) +{ + unsigned long ret; + _BitScanReverse(&ret, x); + return (int)(31 ^ ret); +} + +static inline int __builtin_clzll(unsigned long long x) +{ +#if LIMB_BITS == 64 + unsigned long ret; + _BitScanReverse64(&ret, x); + return (int)(63 ^ ret); +#else + int count; + unsigned int l32; + if (!x) + return CHAR_BIT * sizeof x; + for (count = 0; + (l32 = ((x >> (sizeof(unsigned long long) * CHAR_BIT - 32)) + & 0xffffffffU), + count < CHAR_BIT * sizeof x - 32 && !l32); + count += 32) + x = x << 31 << 1; + return count + __builtin_clz(l32); +#endif +} +#endif + /* WARNING: undefined if a = 0 */ static inline int clz32(unsigned int a) { @@ -135,6 +200,21 @@ static inline int ctz64(uint64_t a) return __builtin_ctzll(a); } +#if defined(_MSC_VER) +#pragma pack(push, 1) +struct packed_u64 { + uint64_t v; +}; + +struct packed_u32 { + uint32_t v; +}; + +struct packed_u16 { + uint16_t v; +}; +#pragma pack(pop) +#else struct __attribute__((packed)) packed_u64 { uint64_t v; }; @@ -146,7 +226,7 @@ struct __attribute__((packed)) packed_u32 { struct __attribute__((packed)) packed_u16 { uint16_t v; }; - +#endif static inline uint64_t get_u64(const uint8_t *tab) { return ((const struct packed_u64 *)tab)->v; @@ -262,8 +342,11 @@ static inline int dbuf_put_u64(DynBuf *s, uint64_t val) { return dbuf_put(s, (uint8_t *)&val, 8); } -int __attribute__((format(printf, 2, 3))) dbuf_printf(DynBuf *s, - const char *fmt, ...); +int +#if !defined(_MSC_VER) +__attribute__((format(printf, 2, 3))) +#endif +dbuf_printf(DynBuf *s, const char *fmt, ...); void dbuf_free(DynBuf *s); static inline BOOL dbuf_error(DynBuf *s) { return s->error; diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/.clang-format b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/.clang-format deleted file mode 100644 index 5b9bfe6..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/.clang-format +++ /dev/null @@ -1,4 +0,0 @@ -# Run manually to reformat a file: -# clang-format -i --style=file -Language: Cpp -BasedOnStyle: Google diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/.gitignore b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/.gitignore deleted file mode 100644 index f08cb72..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/.gitignore +++ /dev/null @@ -1,84 +0,0 @@ -# Ignore CI build directory -build/ -xcuserdata -cmake-build-debug/ -.idea/ -bazel-bin -bazel-genfiles -bazel-googletest -bazel-out -bazel-testlogs -# python -*.pyc - -# Visual Studio files -.vs -*.sdf -*.opensdf -*.VC.opendb -*.suo -*.user -_ReSharper.Caches/ -Win32-Debug/ -Win32-Release/ -x64-Debug/ -x64-Release/ - -# Ignore autoconf / automake files -Makefile.in -aclocal.m4 -configure -build-aux/ -autom4te.cache/ -googletest/m4/libtool.m4 -googletest/m4/ltoptions.m4 -googletest/m4/ltsugar.m4 -googletest/m4/ltversion.m4 -googletest/m4/lt~obsolete.m4 -googlemock/m4 - -# Ignore generated directories. -googlemock/fused-src/ -googletest/fused-src/ - -# macOS files -.DS_Store -googletest/.DS_Store -googletest/xcode/.DS_Store - -# Ignore cmake generated directories and files. -CMakeFiles -CTestTestfile.cmake -Makefile -cmake_install.cmake -googlemock/CMakeFiles -googlemock/CTestTestfile.cmake -googlemock/Makefile -googlemock/cmake_install.cmake -googlemock/gtest -/bin -/googlemock/gmock.dir -/googlemock/gmock_main.dir -/googlemock/RUN_TESTS.vcxproj.filters -/googlemock/RUN_TESTS.vcxproj -/googlemock/INSTALL.vcxproj.filters -/googlemock/INSTALL.vcxproj -/googlemock/gmock_main.vcxproj.filters -/googlemock/gmock_main.vcxproj -/googlemock/gmock.vcxproj.filters -/googlemock/gmock.vcxproj -/googlemock/gmock.sln -/googlemock/ALL_BUILD.vcxproj.filters -/googlemock/ALL_BUILD.vcxproj -/lib -/Win32 -/ZERO_CHECK.vcxproj.filters -/ZERO_CHECK.vcxproj -/RUN_TESTS.vcxproj.filters -/RUN_TESTS.vcxproj -/INSTALL.vcxproj.filters -/INSTALL.vcxproj -/googletest-distribution.sln -/CMakeCache.txt -/ALL_BUILD.vcxproj.filters -/ALL_BUILD.vcxproj diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/BUILD.bazel b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/BUILD.bazel deleted file mode 100644 index 9b48aee..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/BUILD.bazel +++ /dev/null @@ -1,179 +0,0 @@ -# Copyright 2017 Google Inc. -# All Rights Reserved. -# -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Bazel Build for Google C++ Testing Framework(Google Test) - -load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") - -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -config_setting( - name = "windows", - constraint_values = ["@bazel_tools//platforms:windows"], -) - -config_setting( - name = "has_absl", - values = {"define": "absl=1"}, -) - -# Library that defines the FRIEND_TEST macro. -cc_library( - name = "gtest_prod", - hdrs = ["googletest/include/gtest/gtest_prod.h"], - includes = ["googletest/include"], -) - -# Google Test including Google Mock -cc_library( - name = "gtest", - srcs = glob( - include = [ - "googletest/src/*.cc", - "googletest/src/*.h", - "googletest/include/gtest/**/*.h", - "googlemock/src/*.cc", - "googlemock/include/gmock/**/*.h", - ], - exclude = [ - "googletest/src/gtest-all.cc", - "googletest/src/gtest_main.cc", - "googlemock/src/gmock-all.cc", - "googlemock/src/gmock_main.cc", - ], - ), - hdrs = glob([ - "googletest/include/gtest/*.h", - "googlemock/include/gmock/*.h", - ]), - copts = select({ - ":windows": [], - "//conditions:default": ["-pthread"], - }), - defines = select({ - ":has_absl": ["GTEST_HAS_ABSL=1"], - "//conditions:default": [], - }), - features = select({ - ":windows": ["windows_export_all_symbols"], - "//conditions:default": [], - }), - includes = [ - "googlemock", - "googlemock/include", - "googletest", - "googletest/include", - ], - linkopts = select({ - ":windows": [], - "//conditions:default": ["-pthread"], - }), - deps = select({ - ":has_absl": [ - "@com_google_absl//absl/debugging:failure_signal_handler", - "@com_google_absl//absl/debugging:stacktrace", - "@com_google_absl//absl/debugging:symbolize", - "@com_google_absl//absl/strings", - "@com_google_absl//absl/types:optional", - "@com_google_absl//absl/types:variant", - ], - "//conditions:default": [], - }), -) - -cc_library( - name = "gtest_main", - srcs = ["googlemock/src/gmock_main.cc"], - features = select({ - ":windows": ["windows_export_all_symbols"], - "//conditions:default": [], - }), - deps = [":gtest"], -) - -# The following rules build samples of how to use gTest. -cc_library( - name = "gtest_sample_lib", - srcs = [ - "googletest/samples/sample1.cc", - "googletest/samples/sample2.cc", - "googletest/samples/sample4.cc", - ], - hdrs = [ - "googletest/samples/prime_tables.h", - "googletest/samples/sample1.h", - "googletest/samples/sample2.h", - "googletest/samples/sample3-inl.h", - "googletest/samples/sample4.h", - ], - features = select({ - ":windows": ["windows_export_all_symbols"], - "//conditions:default": [], - }), -) - -cc_test( - name = "gtest_samples", - size = "small", - # All Samples except: - # sample9 (main) - # sample10 (main and takes a command line option and needs to be separate) - srcs = [ - "googletest/samples/sample1_unittest.cc", - "googletest/samples/sample2_unittest.cc", - "googletest/samples/sample3_unittest.cc", - "googletest/samples/sample4_unittest.cc", - "googletest/samples/sample5_unittest.cc", - "googletest/samples/sample6_unittest.cc", - "googletest/samples/sample7_unittest.cc", - "googletest/samples/sample8_unittest.cc", - ], - linkstatic = 0, - deps = [ - "gtest_sample_lib", - ":gtest_main", - ], -) - -cc_test( - name = "sample9_unittest", - size = "small", - srcs = ["googletest/samples/sample9_unittest.cc"], - deps = [":gtest"], -) - -cc_test( - name = "sample10_unittest", - size = "small", - srcs = ["googletest/samples/sample10_unittest.cc"], - deps = [":gtest"], -) diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/CMakeLists.txt b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/CMakeLists.txt deleted file mode 100644 index f11bbb5..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Note: CMake support is community-based. The maintainers do not use CMake -# internally. - -cmake_minimum_required(VERSION 2.8.8) - -if (POLICY CMP0048) - cmake_policy(SET CMP0048 NEW) -endif (POLICY CMP0048) - -project(googletest-distribution) -set(GOOGLETEST_VERSION 1.10.0) - -if (CMAKE_VERSION VERSION_LESS "3.1") - add_definitions(-std=c++11) -else() - set(CMAKE_CXX_STANDARD 11) - set(CMAKE_CXX_STANDARD_REQUIRED ON) - if(NOT CYGWIN) - set(CMAKE_CXX_EXTENSIONS OFF) - endif() -endif() - -enable_testing() - -include(CMakeDependentOption) -include(GNUInstallDirs) - -#Note that googlemock target already builds googletest -option(BUILD_GMOCK "Builds the googlemock subproject" ON) -option(INSTALL_GTEST "Enable installation of googletest. (Projects embedding googletest may want to turn this OFF.)" ON) - -if(BUILD_GMOCK) - add_subdirectory( googlemock ) -else() - add_subdirectory( googletest ) -endif() diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/CONTRIBUTING.md b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/CONTRIBUTING.md deleted file mode 100644 index 30c8d89..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/CONTRIBUTING.md +++ /dev/null @@ -1,142 +0,0 @@ -# How to become a contributor and submit your own code - -## Contributor License Agreements - -We'd love to accept your patches! Before we can take them, we have to jump a -couple of legal hurdles. - -Please fill out either the individual or corporate Contributor License Agreement -(CLA). - -* If you are an individual writing original source code and you're sure you - own the intellectual property, then you'll need to sign an - [individual CLA](https://developers.google.com/open-source/cla/individual). -* If you work for a company that wants to allow you to contribute your work, - then you'll need to sign a - [corporate CLA](https://developers.google.com/open-source/cla/corporate). - -Follow either of the two links above to access the appropriate CLA and -instructions for how to sign and return it. Once we receive it, we'll be able to -accept your pull requests. - -## Are you a Googler? - -If you are a Googler, please make an attempt to submit an internal change rather -than a GitHub Pull Request. If you are not able to submit an internal change a -PR is acceptable as an alternative. - -## Contributing A Patch - -1. Submit an issue describing your proposed change to the - [issue tracker](https://github.com/google/googletest). -2. Please don't mix more than one logical change per submittal, because it - makes the history hard to follow. If you want to make a change that doesn't - have a corresponding issue in the issue tracker, please create one. -3. Also, coordinate with team members that are listed on the issue in question. - This ensures that work isn't being duplicated and communicating your plan - early also generally leads to better patches. -4. If your proposed change is accepted, and you haven't already done so, sign a - Contributor License Agreement (see details above). -5. Fork the desired repo, develop and test your code changes. -6. Ensure that your code adheres to the existing style in the sample to which - you are contributing. -7. Ensure that your code has an appropriate set of unit tests which all pass. -8. Submit a pull request. - -## The Google Test and Google Mock Communities - -The Google Test community exists primarily through the -[discussion group](http://groups.google.com/group/googletestframework) and the -GitHub repository. Likewise, the Google Mock community exists primarily through -their own [discussion group](http://groups.google.com/group/googlemock). You are -definitely encouraged to contribute to the discussion and you can also help us -to keep the effectiveness of the group high by following and promoting the -guidelines listed here. - -### Please Be Friendly - -Showing courtesy and respect to others is a vital part of the Google culture, -and we strongly encourage everyone participating in Google Test development to -join us in accepting nothing less. Of course, being courteous is not the same as -failing to constructively disagree with each other, but it does mean that we -should be respectful of each other when enumerating the 42 technical reasons -that a particular proposal may not be the best choice. There's never a reason to -be antagonistic or dismissive toward anyone who is sincerely trying to -contribute to a discussion. - -Sure, C++ testing is serious business and all that, but it's also a lot of fun. -Let's keep it that way. Let's strive to be one of the friendliest communities in -all of open source. - -As always, discuss Google Test in the official GoogleTest discussion group. You -don't have to actually submit code in order to sign up. Your participation -itself is a valuable contribution. - -## Style - -To keep the source consistent, readable, diffable and easy to merge, we use a -fairly rigid coding style, as defined by the -[google-styleguide](https://github.com/google/styleguide) project. All patches -will be expected to conform to the style outlined -[here](https://google.github.io/styleguide/cppguide.html). Use -[.clang-format](https://github.com/google/googletest/blob/master/.clang-format) -to check your formatting - -## Requirements for Contributors - -If you plan to contribute a patch, you need to build Google Test, Google Mock, -and their own tests from a git checkout, which has further requirements: - -* [Python](https://www.python.org/) v2.3 or newer (for running some of the - tests and re-generating certain source files from templates) -* [CMake](https://cmake.org/) v2.6.4 or newer - -## Developing Google Test and Google Mock - -This section discusses how to make your own changes to the Google Test project. - -### Testing Google Test and Google Mock Themselves - -To make sure your changes work as intended and don't break existing -functionality, you'll want to compile and run Google Test and GoogleMock's own -tests. For that you can use CMake: - - mkdir mybuild - cd mybuild - cmake -Dgtest_build_tests=ON -Dgmock_build_tests=ON ${GTEST_REPO_DIR} - -To choose between building only Google Test or Google Mock, you may modify your -cmake command to be one of each - - cmake -Dgtest_build_tests=ON ${GTEST_DIR} # sets up Google Test tests - cmake -Dgmock_build_tests=ON ${GMOCK_DIR} # sets up Google Mock tests - -Make sure you have Python installed, as some of Google Test's tests are written -in Python. If the cmake command complains about not being able to find Python -(`Could NOT find PythonInterp (missing: PYTHON_EXECUTABLE)`), try telling it -explicitly where your Python executable can be found: - - cmake -DPYTHON_EXECUTABLE=path/to/python ... - -Next, you can build Google Test and / or Google Mock and all desired tests. On -\*nix, this is usually done by - - make - -To run the tests, do - - make test - -All tests should pass. - -### Regenerating Source Files - -Some of Google Test's source files are generated from templates (not in the C++ -sense) using a script. For example, the file -include/gtest/internal/gtest-type-util.h.pump is used to generate -gtest-type-util.h in the same directory. - -You don't need to worry about regenerating the source files unless you need to -modify them. You would then modify the corresponding `.pump` files and run the -'[pump.py](googletest/scripts/pump.py)' generator script. See the -[Pump Manual](googletest/docs/pump_manual.md). diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/LICENSE b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/LICENSE deleted file mode 100644 index 1941a11..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2008, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/README.md b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/README.md deleted file mode 100644 index 5b417fa..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/README.md +++ /dev/null @@ -1,134 +0,0 @@ -# Google Test - -#### OSS Builds Status: - -[![Build Status](https://api.travis-ci.org/google/googletest.svg?branch=master)](https://travis-ci.org/google/googletest) -[![Build status](https://ci.appveyor.com/api/projects/status/4o38plt0xbo1ubc8/branch/master?svg=true)](https://ci.appveyor.com/project/GoogleTestAppVeyor/googletest/branch/master) - -### Future Plans - -#### 1.8.x Release: - -[the 1.8.x](https://github.com/google/googletest/releases/tag/release-1.8.1) is -the last release that works with pre-C++11 compilers. The 1.8.x will not accept -any requests for any new features and any bugfix requests will only be accepted -if proven "critical" - -#### Post 1.8.x: - -On-going work to improve/cleanup/pay technical debt. When this work is completed -there will be a 1.9.x tagged release - -#### Post 1.9.x - -Post 1.9.x googletest will follow -[Abseil Live at Head philosophy](https://abseil.io/about/philosophy) - -## Welcome to **Google Test**, Google's C++ test framework! - -This repository is a merger of the formerly separate GoogleTest and GoogleMock -projects. These were so closely related that it makes sense to maintain and -release them together. - -Please subscribe to the mailing list at googletestframework@googlegroups.com for -questions, discussions, and development. - -### Getting started: - -The information for **Google Test** is available in the -[Google Test Primer](googletest/docs/primer.md) documentation. - -**Google Mock** is an extension to Google Test for writing and using C++ mock -classes. See the separate [Google Mock documentation](googlemock/README.md). - -More detailed documentation for googletest is in its interior -[googletest/README.md](googletest/README.md) file. - -## Features - -* An [xUnit](https://en.wikipedia.org/wiki/XUnit) test framework. -* Test discovery. -* A rich set of assertions. -* User-defined assertions. -* Death tests. -* Fatal and non-fatal failures. -* Value-parameterized tests. -* Type-parameterized tests. -* Various options for running the tests. -* XML test report generation. - -## Platforms - -Google test has been used on a variety of platforms: - -* Linux -* Mac OS X -* Windows -* Cygwin -* MinGW -* Windows Mobile -* Symbian -* PlatformIO - -## Who Is Using Google Test? - -In addition to many internal projects at Google, Google Test is also used by the -following notable projects: - -* The [Chromium projects](http://www.chromium.org/) (behind the Chrome browser - and Chrome OS). -* The [LLVM](http://llvm.org/) compiler. -* [Protocol Buffers](https://github.com/google/protobuf), Google's data - interchange format. -* The [OpenCV](http://opencv.org/) computer vision library. -* [tiny-dnn](https://github.com/tiny-dnn/tiny-dnn): header only, - dependency-free deep learning framework in C++11. - -## Related Open Source Projects - -[GTest Runner](https://github.com/nholthaus/gtest-runner) is a Qt5 based -automated test-runner and Graphical User Interface with powerful features for -Windows and Linux platforms. - -[Google Test UI](https://github.com/ospector/gtest-gbar) is test runner that -runs your test binary, allows you to track its progress via a progress bar, and -displays a list of test failures. Clicking on one shows failure text. Google -Test UI is written in C#. - -[GTest TAP Listener](https://github.com/kinow/gtest-tap-listener) is an event -listener for Google Test that implements the -[TAP protocol](https://en.wikipedia.org/wiki/Test_Anything_Protocol) for test -result output. If your test runner understands TAP, you may find it useful. - -[gtest-parallel](https://github.com/google/gtest-parallel) is a test runner that -runs tests from your binary in parallel to provide significant speed-up. - -[GoogleTest Adapter](https://marketplace.visualstudio.com/items?itemName=DavidSchuldenfrei.gtest-adapter) -is a VS Code extension allowing to view Google Tests in a tree view, and -run/debug your tests. - -## Requirements - -Google Test is designed to have fairly minimal requirements to build and use -with your projects, but there are some. If you notice any problems on your -platform, please notify -[googletestframework@googlegroups.com](https://groups.google.com/forum/#!forum/googletestframework). -Patches for fixing them are welcome! - -### Build Requirements - -These are the base requirements to build and use Google Test from a source -package: - -* [Bazel](https://bazel.build/) or [CMake](https://cmake.org/). NOTE: Bazel is - the build system that googletest is using internally and tests against. - CMake is community-supported. - -* a C++11-standard-compliant compiler - -## Contributing change - -Please read the [`CONTRIBUTING.md`](CONTRIBUTING.md) for details on how to -contribute to this project. - -Happy testing! diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/WORKSPACE b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/WORKSPACE deleted file mode 100644 index 2289bdb..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/WORKSPACE +++ /dev/null @@ -1,23 +0,0 @@ -workspace(name = "com_google_googletest") - -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -# Abseil -http_archive( - name = "com_google_absl", - urls = ["https://github.com/abseil/abseil-cpp/archive/master.zip"], - strip_prefix = "abseil-cpp-master", -) - -http_archive( - name = "rules_cc", - strip_prefix = "rules_cc-master", - urls = ["https://github.com/bazelbuild/rules_cc/archive/master.zip"], -) - -http_archive( - name = "rules_python", - strip_prefix = "rules_python-master", - urls = ["https://github.com/bazelbuild/rules_python/archive/master.zip"], -) - diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/appveyor.yml b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/appveyor.yml deleted file mode 100644 index a58b768..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/appveyor.yml +++ /dev/null @@ -1,154 +0,0 @@ -version: '{build}' - -os: Visual Studio 2015 - -environment: - matrix: - - compiler: msvc-15-seh - generator: "Visual Studio 15 2017" - build_system: cmake - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - - - compiler: msvc-15-seh - generator: "Visual Studio 15 2017 Win64" - build_system: cmake - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - enabled_on_pr: yes - - - compiler: msvc-15-seh - build_system: bazel - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - enabled_on_pr: yes - - - compiler: msvc-14-seh - build_system: cmake - generator: "Visual Studio 14 2015" - enabled_on_pr: yes - - - compiler: msvc-14-seh - build_system: cmake - generator: "Visual Studio 14 2015 Win64" - - - compiler: gcc-6.3.0-posix - build_system: cmake - generator: "MinGW Makefiles" - cxx_path: 'C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin' - enabled_on_pr: yes - -configuration: - - Debug - -build: - verbosity: minimal - -install: -- ps: | - Write-Output "Compiler: $env:compiler" - Write-Output "Generator: $env:generator" - Write-Output "Env:Configuation: $env:configuration" - Write-Output "Env: $env" - if (-not (Test-Path env:APPVEYOR_PULL_REQUEST_NUMBER)) { - Write-Output "This is *NOT* a pull request build" - } else { - Write-Output "This is a pull request build" - if (-not (Test-Path env:enabled_on_pr) -or $env:enabled_on_pr -ne "yes") { - Write-Output "PR builds are *NOT* explicitly enabled" - } - } - - # install Bazel - if ($env:build_system -eq "bazel") { - appveyor DownloadFile https://github.com/bazelbuild/bazel/releases/download/0.28.1/bazel-0.28.1-windows-x86_64.exe -FileName bazel.exe - } - - if ($env:build_system -eq "cmake") { - # git bash conflicts with MinGW makefiles - if ($env:generator -eq "MinGW Makefiles") { - $env:path = $env:path.replace("C:\Program Files\Git\usr\bin;", "") - if ($env:cxx_path -ne "") { - $env:path += ";$env:cxx_path" - } - } - } - -before_build: -- ps: | - $env:root=$env:APPVEYOR_BUILD_FOLDER - Write-Output "env:root: $env:root" - -build_script: -- ps: | - # Only enable some builds for pull requests, the AppVeyor queue is too long. - if ((Test-Path env:APPVEYOR_PULL_REQUEST_NUMBER) -And (-not (Test-Path env:enabled_on_pr) -or $env:enabled_on_pr -ne "yes")) { - return - } else { - # special case - build with Bazel - if ($env:build_system -eq "bazel") { - & $env:root\bazel.exe build -c opt //:gtest_samples - if ($LastExitCode -eq 0) { # bazel writes to StdErr and PowerShell interprets it as an error - $host.SetShouldExit(0) - } else { # a real error - throw "Exec: $ErrorMessage" - } - return - } - } - # by default build with CMake - md _build -Force | Out-Null - cd _build - - $conf = if ($env:generator -eq "MinGW Makefiles") {"-DCMAKE_BUILD_TYPE=$env:configuration"} else {"-DCMAKE_CONFIGURATION_TYPES=Debug;Release"} - # Disable test for MinGW (gtest tests fail, gmock tests can not build) - $gtest_build_tests = if ($env:generator -eq "MinGW Makefiles") {"-Dgtest_build_tests=OFF"} else {"-Dgtest_build_tests=ON"} - $gmock_build_tests = if ($env:generator -eq "MinGW Makefiles") {"-Dgmock_build_tests=OFF"} else {"-Dgmock_build_tests=ON"} - & cmake -G "$env:generator" $conf -Dgtest_build_samples=ON $gtest_build_tests $gmock_build_tests .. - if ($LastExitCode -ne 0) { - throw "Exec: $ErrorMessage" - } - $cmake_parallel = if ($env:generator -eq "MinGW Makefiles") {"-j2"} else {"/m"} - & cmake --build . --config $env:configuration -- $cmake_parallel - if ($LastExitCode -ne 0) { - throw "Exec: $ErrorMessage" - } - - -skip_commits: - files: - - '**/*.md' - -test_script: -- ps: | - # Only enable some builds for pull requests, the AppVeyor queue is too long. - if ((Test-Path env:APPVEYOR_PULL_REQUEST_NUMBER) -And (-not (Test-Path env:enabled_on_pr) -or $env:enabled_on_pr -ne "yes")) { - return - } - if ($env:build_system -eq "bazel") { - # special case - testing with Bazel - & $env:root\bazel.exe test //:gtest_samples - if ($LastExitCode -eq 0) { # bazel writes to StdErr and PowerShell interprets it as an error - $host.SetShouldExit(0) - } else { # a real error - throw "Exec: $ErrorMessage" - } - } - if ($env:build_system -eq "cmake") { - # built with CMake - test with CTest - if ($env:generator -eq "MinGW Makefiles") { - return # No test available for MinGW - } - - & ctest -C $env:configuration --timeout 600 --output-on-failure - if ($LastExitCode -ne 0) { - throw "Exec: $ErrorMessage" - } - } - -artifacts: - - path: '_build/CMakeFiles/*.log' - name: logs - - path: '_build/Testing/**/*.xml' - name: test_results - - path: 'bazel-testlogs/**/test.log' - name: test_logs - - path: 'bazel-testlogs/**/test.xml' - name: test_results diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/build-linux-bazel.sh b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/build-linux-bazel.sh deleted file mode 100755 index ae8fb75..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/build-linux-bazel.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2017 Google Inc. -# All Rights Reserved. -# -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -set -e - -bazel version -bazel build --curses=no //...:all -bazel test --curses=no //...:all -bazel test --curses=no //...:all --define absl=1 diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/build-platformio.sh b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/build-platformio.sh deleted file mode 100644 index 1d7658d..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/build-platformio.sh +++ /dev/null @@ -1,2 +0,0 @@ -# run PlatformIO builds -platformio run diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/env-linux.sh b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/env-linux.sh deleted file mode 100755 index 37800d6..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/env-linux.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2017 Google Inc. -# All Rights Reserved. -# -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# -# This file should be sourced, and not executed as a standalone script. -# - -# TODO() - we can check if this is being sourced using $BASH_VERSION and $BASH_SOURCE[0] != ${0}. - -if [ "${TRAVIS_OS_NAME}" = "linux" ]; then - if [ "$CXX" = "g++" ]; then export CXX="g++-4.9" CC="gcc-4.9"; fi - if [ "$CXX" = "clang++" ]; then export CXX="clang++-3.9" CC="clang-3.9"; fi -fi diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/env-osx.sh b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/env-osx.sh deleted file mode 100755 index 9c421e1..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/env-osx.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2017 Google Inc. -# All Rights Reserved. -# -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# -# This file should be sourced, and not executed as a standalone script. -# - -# TODO() - we can check if this is being sourced using $BASH_VERSION and $BASH_SOURCE[0] != ${0}. -# - -if [ "${TRAVIS_OS_NAME}" = "osx" ]; then - if [ "$CXX" = "clang++" ]; then - # $PATH needs to be adjusted because the llvm tap doesn't install the - # package to /usr/local/bin, etc, like the gcc tap does. - # See: https://github.com/Homebrew/legacy-homebrew/issues/29733 - clang_version=3.9 - export PATH="/usr/local/opt/llvm@${clang_version}/bin:$PATH"; - fi -fi diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/get-nprocessors.sh b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/get-nprocessors.sh deleted file mode 100755 index 43635e7..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/get-nprocessors.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2017 Google Inc. -# All Rights Reserved. -# -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# This file is typically sourced by another script. -# if possible, ask for the precise number of processors, -# otherwise take 2 processors as reasonable default; see -# https://docs.travis-ci.com/user/speeding-up-the-build/#Makefile-optimization -if [ -x /usr/bin/getconf ]; then - NPROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN) -else - NPROCESSORS=2 -fi - -# as of 2017-09-04 Travis CI reports 32 processors, but GCC build -# crashes if parallelized too much (maybe memory consumption problem), -# so limit to 4 processors for the time being. -if [ $NPROCESSORS -gt 4 ] ; then - echo "$0:Note: Limiting processors to use by make from $NPROCESSORS to 4." - NPROCESSORS=4 -fi diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/install-linux.sh b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/install-linux.sh deleted file mode 100755 index 05e2cb2..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/install-linux.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2017 Google Inc. -# All Rights Reserved. -# -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -set -eu - -if [ "${TRAVIS_OS_NAME}" != linux ]; then - echo "Not a Linux build; skipping installation" - exit 0 -fi - - -if [ "${TRAVIS_SUDO}" = "true" ]; then - echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | \ - sudo tee /etc/apt/sources.list.d/bazel.list - curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add - - sudo apt-get update && sudo apt-get install -y bazel gcc-4.9 g++-4.9 clang-3.9 -elif [ "${CXX}" = "clang++" ]; then - # Use ccache, assuming $HOME/bin is in the path, which is true in the Travis build environment. - ln -sf /usr/bin/ccache $HOME/bin/${CXX}; - ln -sf /usr/bin/ccache $HOME/bin/${CC}; -fi diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/install-osx.sh b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/install-osx.sh deleted file mode 100755 index cc47508..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/install-osx.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2017 Google Inc. -# All Rights Reserved. -# -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -set -eu - -if [ "${TRAVIS_OS_NAME}" != "osx" ]; then - echo "Not a macOS build; skipping installation" - exit 0 -fi - -brew update -brew install ccache gcc@4.9 diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/install-platformio.sh b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/install-platformio.sh deleted file mode 100644 index 4d7860a..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/install-platformio.sh +++ /dev/null @@ -1,5 +0,0 @@ -# install PlatformIO -sudo pip install -U platformio - -# update PlatformIO -platformio update diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/log-config.sh b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/log-config.sh deleted file mode 100755 index 5fef119..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/log-config.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2017 Google Inc. -# All Rights Reserved. -# -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -set -e - -# ccache on OS X needs installation first -# reset ccache statistics -ccache --zero-stats - -echo PATH=${PATH} - -echo "Compiler configuration:" -echo CXX=${CXX} -echo CC=${CC} -echo CXXFLAGS=${CXXFLAGS} - -echo "C++ compiler version:" -${CXX} --version || echo "${CXX} does not seem to support the --version flag" -${CXX} -v || echo "${CXX} does not seem to support the -v flag" - -echo "C compiler version:" -${CC} --version || echo "${CXX} does not seem to support the --version flag" -${CC} -v || echo "${CXX} does not seem to support the -v flag" diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/travis.sh b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/travis.sh deleted file mode 100755 index 9ff3bad..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/ci/travis.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env sh -set -evx - -. ci/get-nprocessors.sh - -# if possible, ask for the precise number of processors, -# otherwise take 2 processors as reasonable default; see -# https://docs.travis-ci.com/user/speeding-up-the-build/#Makefile-optimization -if [ -x /usr/bin/getconf ]; then - NPROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN) -else - NPROCESSORS=2 -fi -# as of 2017-09-04 Travis CI reports 32 processors, but GCC build -# crashes if parallelized too much (maybe memory consumption problem), -# so limit to 4 processors for the time being. -if [ $NPROCESSORS -gt 4 ] ; then - echo "$0:Note: Limiting processors to use by make from $NPROCESSORS to 4." - NPROCESSORS=4 -fi -# Tell make to use the processors. No preceding '-' required. -MAKEFLAGS="j${NPROCESSORS}" -export MAKEFLAGS - -env | sort - -# Set default values to OFF for these variables if not specified. -: "${NO_EXCEPTION:=OFF}" -: "${NO_RTTI:=OFF}" -: "${COMPILER_IS_GNUCXX:=OFF}" - -mkdir build || true -cd build -cmake -Dgtest_build_samples=ON \ - -Dgtest_build_tests=ON \ - -Dgmock_build_tests=ON \ - -Dcxx_no_exception=$NO_EXCEPTION \ - -Dcxx_no_rtti=$NO_RTTI \ - -DCMAKE_COMPILER_IS_GNUCXX=$COMPILER_IS_GNUCXX \ - -DCMAKE_CXX_FLAGS=$CXX_FLAGS \ - -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ - .. -make -CTEST_OUTPUT_ON_FAILURE=1 make test diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/CMakeLists.txt b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/CMakeLists.txt deleted file mode 100644 index d32b70b..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/CMakeLists.txt +++ /dev/null @@ -1,233 +0,0 @@ -######################################################################## -# Note: CMake support is community-based. The maintainers do not use CMake -# internally. -# -# CMake build script for Google Mock. -# -# To run the tests for Google Mock itself on Linux, use 'make test' or -# ctest. You can select which tests to run using 'ctest -R regex'. -# For more options, run 'ctest --help'. - -option(gmock_build_tests "Build all of Google Mock's own tests." OFF) - -# A directory to find Google Test sources. -if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/gtest/CMakeLists.txt") - set(gtest_dir gtest) -else() - set(gtest_dir ../googletest) -endif() - -# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build(). -include("${gtest_dir}/cmake/hermetic_build.cmake" OPTIONAL) - -if (COMMAND pre_project_set_up_hermetic_build) - # Google Test also calls hermetic setup functions from add_subdirectory, - # although its changes will not affect things at the current scope. - pre_project_set_up_hermetic_build() -endif() - -######################################################################## -# -# Project-wide settings - -# Name of the project. -# -# CMake files in this project can refer to the root source directory -# as ${gmock_SOURCE_DIR} and to the root binary directory as -# ${gmock_BINARY_DIR}. -# Language "C" is required for find_package(Threads). -if (CMAKE_VERSION VERSION_LESS 3.0) - project(gmock CXX C) -else() - cmake_policy(SET CMP0048 NEW) - project(gmock VERSION ${GOOGLETEST_VERSION} LANGUAGES CXX C) -endif() -cmake_minimum_required(VERSION 2.6.4) - -if (COMMAND set_up_hermetic_build) - set_up_hermetic_build() -endif() - -# Instructs CMake to process Google Test's CMakeLists.txt and add its -# targets to the current scope. We are placing Google Test's binary -# directory in a subdirectory of our own as VC compilation may break -# if they are the same (the default). -add_subdirectory("${gtest_dir}" "${gmock_BINARY_DIR}/${gtest_dir}") - - -# These commands only run if this is the main project -if(CMAKE_PROJECT_NAME STREQUAL "gmock" OR CMAKE_PROJECT_NAME STREQUAL "googletest-distribution") - # BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to - # make it prominent in the GUI. - option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF) -else() - mark_as_advanced(gmock_build_tests) -endif() - -# Although Google Test's CMakeLists.txt calls this function, the -# changes there don't affect the current scope. Therefore we have to -# call it again here. -config_compiler_and_linker() # from ${gtest_dir}/cmake/internal_utils.cmake - -# Adds Google Mock's and Google Test's header directories to the search path. -set(gmock_build_include_dirs - "${gmock_SOURCE_DIR}/include" - "${gmock_SOURCE_DIR}" - "${gtest_SOURCE_DIR}/include" - # This directory is needed to build directly from Google Test sources. - "${gtest_SOURCE_DIR}") -include_directories(${gmock_build_include_dirs}) - -######################################################################## -# -# Defines the gmock & gmock_main libraries. User tests should link -# with one of them. - -# Google Mock libraries. We build them using more strict warnings than what -# are used for other targets, to ensure that Google Mock can be compiled by -# a user aggressive about warnings. -if (MSVC) - cxx_library(gmock - "${cxx_strict}" - "${gtest_dir}/src/gtest-all.cc" - src/gmock-all.cc) - - cxx_library(gmock_main - "${cxx_strict}" - "${gtest_dir}/src/gtest-all.cc" - src/gmock-all.cc - src/gmock_main.cc) -else() - cxx_library(gmock "${cxx_strict}" src/gmock-all.cc) - target_link_libraries(gmock PUBLIC gtest) - cxx_library(gmock_main "${cxx_strict}" src/gmock_main.cc) - target_link_libraries(gmock_main PUBLIC gmock) -endif() -# If the CMake version supports it, attach header directory information -# to the targets for when we are part of a parent build (ie being pulled -# in via add_subdirectory() rather than being a standalone build). -if (DEFINED CMAKE_VERSION AND NOT "${CMAKE_VERSION}" VERSION_LESS "2.8.11") - target_include_directories(gmock SYSTEM INTERFACE - "$" - "$/${CMAKE_INSTALL_INCLUDEDIR}>") - target_include_directories(gmock_main SYSTEM INTERFACE - "$" - "$/${CMAKE_INSTALL_INCLUDEDIR}>") -endif() - -######################################################################## -# -# Install rules -install_project(gmock gmock_main) - -######################################################################## -# -# Google Mock's own tests. -# -# You can skip this section if you aren't interested in testing -# Google Mock itself. -# -# The tests are not built by default. To build them, set the -# gmock_build_tests option to ON. You can do it by running ccmake -# or specifying the -Dgmock_build_tests=ON flag when running cmake. - -if (gmock_build_tests) - # This must be set in the root directory for the tests to be run by - # 'make test' or ctest. - enable_testing() - - if (WIN32) - file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/$/RunTest.ps1" - CONTENT -"$project_bin = \"${CMAKE_BINARY_DIR}/bin/$\" -$env:Path = \"$project_bin;$env:Path\" -& $args") - elseif (MINGW OR CYGWIN) - file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/RunTest.ps1" - CONTENT -"$project_bin = (cygpath --windows ${CMAKE_BINARY_DIR}/bin) -$env:Path = \"$project_bin;$env:Path\" -& $args") - endif() - - if (MINGW OR CYGWIN) - if (CMAKE_VERSION VERSION_LESS "2.8.12") - add_compile_options("-Wa,-mbig-obj") - else() - add_definitions("-Wa,-mbig-obj") - endif() - endif() - - ############################################################ - # C++ tests built with standard compiler flags. - - cxx_test(gmock-actions_test gmock_main) - cxx_test(gmock-cardinalities_test gmock_main) - cxx_test(gmock_ex_test gmock_main) - cxx_test(gmock-function-mocker_test gmock_main) - cxx_test(gmock-generated-actions_test gmock_main) - cxx_test(gmock-generated-function-mockers_test gmock_main) - cxx_test(gmock-generated-matchers_test gmock_main) - cxx_test(gmock-internal-utils_test gmock_main) - cxx_test(gmock-matchers_test gmock_main) - cxx_test(gmock-more-actions_test gmock_main) - cxx_test(gmock-nice-strict_test gmock_main) - cxx_test(gmock-port_test gmock_main) - cxx_test(gmock-spec-builders_test gmock_main) - cxx_test(gmock_link_test gmock_main test/gmock_link2_test.cc) - cxx_test(gmock_test gmock_main) - - if (DEFINED GTEST_HAS_PTHREAD) - cxx_test(gmock_stress_test gmock) - endif() - - # gmock_all_test is commented to save time building and running tests. - # Uncomment if necessary. - # cxx_test(gmock_all_test gmock_main) - - ############################################################ - # C++ tests built with non-standard compiler flags. - - if (MSVC) - cxx_library(gmock_main_no_exception "${cxx_no_exception}" - "${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc) - - cxx_library(gmock_main_no_rtti "${cxx_no_rtti}" - "${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc) - - else() - cxx_library(gmock_main_no_exception "${cxx_no_exception}" src/gmock_main.cc) - target_link_libraries(gmock_main_no_exception PUBLIC gmock) - - cxx_library(gmock_main_no_rtti "${cxx_no_rtti}" src/gmock_main.cc) - target_link_libraries(gmock_main_no_rtti PUBLIC gmock) - endif() - cxx_test_with_flags(gmock-more-actions_no_exception_test "${cxx_no_exception}" - gmock_main_no_exception test/gmock-more-actions_test.cc) - - cxx_test_with_flags(gmock_no_rtti_test "${cxx_no_rtti}" - gmock_main_no_rtti test/gmock-spec-builders_test.cc) - - cxx_shared_library(shared_gmock_main "${cxx_default}" - "${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc) - - # Tests that a binary can be built with Google Mock as a shared library. On - # some system configurations, it may not possible to run the binary without - # knowing more details about the system configurations. We do not try to run - # this binary. To get a more robust shared library coverage, configure with - # -DBUILD_SHARED_LIBS=ON. - cxx_executable_with_flags(shared_gmock_test_ "${cxx_default}" - shared_gmock_main test/gmock-spec-builders_test.cc) - set_target_properties(shared_gmock_test_ - PROPERTIES - COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1") - - ############################################################ - # Python tests. - - cxx_executable(gmock_leak_test_ test gmock_main) - py_test(gmock_leak_test) - - cxx_executable(gmock_output_test_ test gmock) - py_test(gmock_output_test) -endif() diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/CONTRIBUTORS b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/CONTRIBUTORS deleted file mode 100644 index 6e9ae36..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/CONTRIBUTORS +++ /dev/null @@ -1,40 +0,0 @@ -# This file contains a list of people who've made non-trivial -# contribution to the Google C++ Mocking Framework project. People -# who commit code to the project are encouraged to add their names -# here. Please keep the list sorted by first names. - -Benoit Sigoure -Bogdan Piloca -Chandler Carruth -Dave MacLachlan -David Anderson -Dean Sturtevant -Gene Volovich -Hal Burch -Jeffrey Yasskin -Jim Keller -Joe Walnes -Jon Wray -Keir Mierle -Keith Ray -Kostya Serebryany -Lev Makhlis -Manuel Klimek -Mario Tanev -Mark Paskin -Markus Heule -Matthew Simmons -Mike Bland -Neal Norwitz -Nermin Ozkiranartli -Owen Carlsen -Paneendra Ba -Paul Menage -Piotr Kaminski -Russ Rufer -Sverre Sundsdal -Takeshi Yoshino -Vadim Berman -Vlad Losev -Wolfgang Klier -Zhanyong Wan diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/LICENSE b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/LICENSE deleted file mode 100644 index 1941a11..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2008, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/README.md b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/README.md deleted file mode 100644 index 183fdb8..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# Googletest Mocking (gMock) Framework - -### Overview - -Google's framework for writing and using C++ mock classes. It can help you -derive better designs of your system and write better tests. - -It is inspired by: - -* [jMock](http://www.jmock.org/), -* [EasyMock](http://www.easymock.org/), and -* [Hamcrest](http://code.google.com/p/hamcrest/), - -and designed with C++'s specifics in mind. - -gMock: - -- provides a declarative syntax for defining mocks, -- can define partial (hybrid) mocks, which are a cross of real and mock - objects, -- handles functions of arbitrary types and overloaded functions, -- comes with a rich set of matchers for validating function arguments, -- uses an intuitive syntax for controlling the behavior of a mock, -- does automatic verification of expectations (no record-and-replay needed), -- allows arbitrary (partial) ordering constraints on function calls to be - expressed, -- lets a user extend it by defining new matchers and actions. -- does not use exceptions, and -- is easy to learn and use. - -Details and examples can be found here: - -* [gMock for Dummies](docs/for_dummies.md) -* [Legacy gMock FAQ](docs/gmock_faq.md) -* [gMock Cookbook](docs/cook_book.md) -* [gMock Cheat Sheet](docs/cheat_sheet.md) - -Please note that code under scripts/generator/ is from the [cppclean -project](http://code.google.com/p/cppclean/) and under the Apache -License, which is different from Google Mock's license. - -Google Mock is a part of -[Google Test C++ testing framework](http://github.com/google/googletest/) and a -subject to the same requirements. diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/cmake/gmock.pc.in b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/cmake/gmock.pc.in deleted file mode 100644 index 08e0454..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/cmake/gmock.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=${pcfiledir}/../.. -libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ -includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ - -Name: gmock -Description: GoogleMock (without main() function) -Version: @PROJECT_VERSION@ -URL: https://github.com/google/googletest -Requires: gtest -Libs: -L${libdir} -lgmock @CMAKE_THREAD_LIBS_INIT@ -Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@ diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/cmake/gmock_main.pc.in b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/cmake/gmock_main.pc.in deleted file mode 100644 index b22fe61..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/cmake/gmock_main.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=${pcfiledir}/../.. -libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ -includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ - -Name: gmock_main -Description: GoogleMock (with main() function) -Version: @PROJECT_VERSION@ -URL: https://github.com/google/googletest -Requires: gmock -Libs: -L${libdir} -lgmock_main @CMAKE_THREAD_LIBS_INIT@ -Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@ diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/cheat_sheet.md b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/cheat_sheet.md deleted file mode 100644 index 850963a..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/cheat_sheet.md +++ /dev/null @@ -1,781 +0,0 @@ -## gMock Cheat Sheet - - - - - -### Defining a Mock Class - -#### Mocking a Normal Class {#MockClass} - -Given - -```cpp -class Foo { - ... - virtual ~Foo(); - virtual int GetSize() const = 0; - virtual string Describe(const char* name) = 0; - virtual string Describe(int type) = 0; - virtual bool Process(Bar elem, int count) = 0; -}; -``` - -(note that `~Foo()` **must** be virtual) we can define its mock as - -```cpp -#include "gmock/gmock.h" - -class MockFoo : public Foo { - ... - MOCK_METHOD(int, GetSize, (), (const, override)); - MOCK_METHOD(string, Describe, (const char* name), (override)); - MOCK_METHOD(string, Describe, (int type), (override)); - MOCK_METHOD(bool, Process, (Bar elem, int count), (override)); -}; -``` - -To create a "nice" mock, which ignores all uninteresting calls, a "naggy" mock, -which warns on all uninteresting calls, or a "strict" mock, which treats them as -failures: - -```cpp -using ::testing::NiceMock; -using ::testing::NaggyMock; -using ::testing::StrictMock; - -NiceMock nice_foo; // The type is a subclass of MockFoo. -NaggyMock naggy_foo; // The type is a subclass of MockFoo. -StrictMock strict_foo; // The type is a subclass of MockFoo. -``` - -**Note:** A mock object is currently naggy by default. We may make it nice by -default in the future. - -#### Mocking a Class Template {#MockTemplate} - -Class templates can be mocked just like any class. - -To mock - -```cpp -template -class StackInterface { - ... - virtual ~StackInterface(); - virtual int GetSize() const = 0; - virtual void Push(const Elem& x) = 0; -}; -``` - -(note that all member functions that are mocked, including `~StackInterface()` -**must** be virtual). - -```cpp -template -class MockStack : public StackInterface { - ... - MOCK_METHOD(int, GetSize, (), (const, override)); - MOCK_METHOD(void, Push, (const Elem& x), (override)); -}; -``` - -#### Specifying Calling Conventions for Mock Functions - -If your mock function doesn't use the default calling convention, you can -specify it by adding `Calltype(convention)` to `MOCK_METHOD`'s 4th parameter. -For example, - -```cpp - MOCK_METHOD(bool, Foo, (int n), (Calltype(STDMETHODCALLTYPE))); - MOCK_METHOD(int, Bar, (double x, double y), - (const, Calltype(STDMETHODCALLTYPE))); -``` - -where `STDMETHODCALLTYPE` is defined by `` on Windows. - -### Using Mocks in Tests {#UsingMocks} - -The typical work flow is: - -1. Import the gMock names you need to use. All gMock symbols are in the - `testing` namespace unless they are macros or otherwise noted. -2. Create the mock objects. -3. Optionally, set the default actions of the mock objects. -4. Set your expectations on the mock objects (How will they be called? What - will they do?). -5. Exercise code that uses the mock objects; if necessary, check the result - using googletest assertions. -6. When a mock object is destructed, gMock automatically verifies that all - expectations on it have been satisfied. - -Here's an example: - -```cpp -using ::testing::Return; // #1 - -TEST(BarTest, DoesThis) { - MockFoo foo; // #2 - - ON_CALL(foo, GetSize()) // #3 - .WillByDefault(Return(1)); - // ... other default actions ... - - EXPECT_CALL(foo, Describe(5)) // #4 - .Times(3) - .WillRepeatedly(Return("Category 5")); - // ... other expectations ... - - EXPECT_EQ("good", MyProductionFunction(&foo)); // #5 -} // #6 -``` - -### Setting Default Actions {#OnCall} - -gMock has a **built-in default action** for any function that returns `void`, -`bool`, a numeric value, or a pointer. In C++11, it will additionally returns -the default-constructed value, if one exists for the given type. - -To customize the default action for functions with return type *`T`*: - -```cpp -using ::testing::DefaultValue; - -// Sets the default value to be returned. T must be CopyConstructible. -DefaultValue::Set(value); -// Sets a factory. Will be invoked on demand. T must be MoveConstructible. -// T MakeT(); -DefaultValue::SetFactory(&MakeT); -// ... use the mocks ... -// Resets the default value. -DefaultValue::Clear(); -``` - -Example usage: - -```cpp - // Sets the default action for return type std::unique_ptr to - // creating a new Buzz every time. - DefaultValue>::SetFactory( - [] { return MakeUnique(AccessLevel::kInternal); }); - - // When this fires, the default action of MakeBuzz() will run, which - // will return a new Buzz object. - EXPECT_CALL(mock_buzzer_, MakeBuzz("hello")).Times(AnyNumber()); - - auto buzz1 = mock_buzzer_.MakeBuzz("hello"); - auto buzz2 = mock_buzzer_.MakeBuzz("hello"); - EXPECT_NE(nullptr, buzz1); - EXPECT_NE(nullptr, buzz2); - EXPECT_NE(buzz1, buzz2); - - // Resets the default action for return type std::unique_ptr, - // to avoid interfere with other tests. - DefaultValue>::Clear(); -``` - -To customize the default action for a particular method of a specific mock -object, use `ON_CALL()`. `ON_CALL()` has a similar syntax to `EXPECT_CALL()`, -but it is used for setting default behaviors (when you do not require that the -mock method is called). See [here](cook_book.md#UseOnCall) for a more detailed -discussion. - -```cpp -ON_CALL(mock-object, method(matchers)) - .With(multi-argument-matcher) ? - .WillByDefault(action); -``` - -### Setting Expectations {#ExpectCall} - -`EXPECT_CALL()` sets **expectations** on a mock method (How will it be called? -What will it do?): - -```cpp -EXPECT_CALL(mock-object, method (matchers)?) - .With(multi-argument-matcher) ? - .Times(cardinality) ? - .InSequence(sequences) * - .After(expectations) * - .WillOnce(action) * - .WillRepeatedly(action) ? - .RetiresOnSaturation(); ? -``` - -For each item above, `?` means it can be used at most once, while `*` means it -can be used any number of times. - -In order to pass, `EXPECT_CALL` must be used before the calls are actually made. - -The `(matchers)` is a comma-separated list of matchers that correspond to each -of the arguments of `method`, and sets the expectation only for calls of -`method` that matches all of the matchers. - -If `(matchers)` is omitted, the expectation is the same as if the matchers were -set to anything matchers (for example, `(_, _, _, _)` for a four-arg method). - -If `Times()` is omitted, the cardinality is assumed to be: - -* `Times(1)` when there is neither `WillOnce()` nor `WillRepeatedly()`; -* `Times(n)` when there are `n` `WillOnce()`s but no `WillRepeatedly()`, where - `n` >= 1; or -* `Times(AtLeast(n))` when there are `n` `WillOnce()`s and a - `WillRepeatedly()`, where `n` >= 0. - -A method with no `EXPECT_CALL()` is free to be invoked *any number of times*, -and the default action will be taken each time. - -### Matchers {#MatcherList} - - - -A **matcher** matches a *single* argument. You can use it inside `ON_CALL()` or -`EXPECT_CALL()`, or use it to validate a value directly using two macros: - - -| Macro | Description | -| :----------------------------------- | :------------------------------------ | -| `EXPECT_THAT(actual_value, matcher)` | Asserts that `actual_value` matches `matcher`. | -| `ASSERT_THAT(actual_value, matcher)` | The same as `EXPECT_THAT(actual_value, matcher)`, except that it generates a **fatal** failure. | - - -Built-in matchers (where `argument` is the function argument, e.g. -`actual_value` in the example above, or when used in the context of -`EXPECT_CALL(mock_object, method(matchers))`, the arguments of `method`) are -divided into several categories: - -#### Wildcard - -Matcher | Description -:-------------------------- | :----------------------------------------------- -`_` | `argument` can be any value of the correct type. -`A()` or `An()` | `argument` can be any value of type `type`. - -#### Generic Comparison - - -| Matcher | Description | -| :--------------------- | :-------------------------------------------------- | -| `Eq(value)` or `value` | `argument == value` | -| `Ge(value)` | `argument >= value` | -| `Gt(value)` | `argument > value` | -| `Le(value)` | `argument <= value` | -| `Lt(value)` | `argument < value` | -| `Ne(value)` | `argument != value` | -| `IsFalse()` | `argument` evaluates to `false` in a Boolean context. | -| `IsTrue()` | `argument` evaluates to `true` in a Boolean context. | -| `IsNull()` | `argument` is a `NULL` pointer (raw or smart). | -| `NotNull()` | `argument` is a non-null pointer (raw or smart). | -| `Optional(m)` | `argument` is `optional<>` that contains a value matching `m`. | -| `VariantWith(m)` | `argument` is `variant<>` that holds the alternative of type T with a value matching `m`. | -| `Ref(variable)` | `argument` is a reference to `variable`. | -| `TypedEq(value)` | `argument` has type `type` and is equal to `value`. You may need to use this instead of `Eq(value)` when the mock function is overloaded. | - - -Except `Ref()`, these matchers make a *copy* of `value` in case it's modified or -destructed later. If the compiler complains that `value` doesn't have a public -copy constructor, try wrap it in `ByRef()`, e.g. -`Eq(ByRef(non_copyable_value))`. If you do that, make sure `non_copyable_value` -is not changed afterwards, or the meaning of your matcher will be changed. - -#### Floating-Point Matchers {#FpMatchers} - - -| Matcher | Description | -| :------------------------------- | :--------------------------------- | -| `DoubleEq(a_double)` | `argument` is a `double` value approximately equal to `a_double`, treating two NaNs as unequal. | -| `FloatEq(a_float)` | `argument` is a `float` value approximately equal to `a_float`, treating two NaNs as unequal. | -| `NanSensitiveDoubleEq(a_double)` | `argument` is a `double` value approximately equal to `a_double`, treating two NaNs as equal. | -| `NanSensitiveFloatEq(a_float)` | `argument` is a `float` value approximately equal to `a_float`, treating two NaNs as equal. | - - -The above matchers use ULP-based comparison (the same as used in googletest). -They automatically pick a reasonable error bound based on the absolute value of -the expected value. `DoubleEq()` and `FloatEq()` conform to the IEEE standard, -which requires comparing two NaNs for equality to return false. The -`NanSensitive*` version instead treats two NaNs as equal, which is often what a -user wants. - - -| Matcher | Description | -| :------------------------------------------------ | :----------------------- | -| `DoubleNear(a_double, max_abs_error)` | `argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as unequal. | -| `FloatNear(a_float, max_abs_error)` | `argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as unequal. | -| `NanSensitiveDoubleNear(a_double, max_abs_error)` | `argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as equal. | -| `NanSensitiveFloatNear(a_float, max_abs_error)` | `argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as equal. | - - -#### String Matchers - -The `argument` can be either a C string or a C++ string object: - - -| Matcher | Description | -| :---------------------- | :------------------------------------------------- | -| `ContainsRegex(string)` | `argument` matches the given regular expression. | -| `EndsWith(suffix)` | `argument` ends with string `suffix`. | -| `HasSubstr(string)` | `argument` contains `string` as a sub-string. | -| `MatchesRegex(string)` | `argument` matches the given regular expression with the match starting at the first character and ending at the last character. | -| `StartsWith(prefix)` | `argument` starts with string `prefix`. | -| `StrCaseEq(string)` | `argument` is equal to `string`, ignoring case. | -| `StrCaseNe(string)` | `argument` is not equal to `string`, ignoring case. | -| `StrEq(string)` | `argument` is equal to `string`. | -| `StrNe(string)` | `argument` is not equal to `string`. | - - -`ContainsRegex()` and `MatchesRegex()` take ownership of the `RE` object. They -use the regular expression syntax defined -[here](../../googletest/docs/advanced.md#regular-expression-syntax). -`StrCaseEq()`, `StrCaseNe()`, `StrEq()`, and `StrNe()` work for wide strings as -well. - -#### Container Matchers - -Most STL-style containers support `==`, so you can use `Eq(expected_container)` -or simply `expected_container` to match a container exactly. If you want to -write the elements in-line, match them more flexibly, or get more informative -messages, you can use: - - -| Matcher | Description | -| :---------------------------------------- | :------------------------------- | -| `BeginEndDistanceIs(m)` | `argument` is a container whose `begin()` and `end()` iterators are separated by a number of increments matching `m`. E.g. `BeginEndDistanceIs(2)` or `BeginEndDistanceIs(Lt(2))`. For containers that define a `size()` method, `SizeIs(m)` may be more efficient. | -| `ContainerEq(container)` | The same as `Eq(container)` except that the failure message also includes which elements are in one container but not the other. | -| `Contains(e)` | `argument` contains an element that matches `e`, which can be either a value or a matcher. | -| `Each(e)` | `argument` is a container where *every* element matches `e`, which can be either a value or a matcher. | -| `ElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, where the *i*-th element matches `ei`, which can be a value or a matcher. | -| `ElementsAreArray({e0, e1, ..., en})`, `ElementsAreArray(a_container)`, `ElementsAreArray(begin, end)`, `ElementsAreArray(array)`, or `ElementsAreArray(array, count)` | The same as `ElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, iterator range, or C-style array. | -| `IsEmpty()` | `argument` is an empty container (`container.empty()`). | -| `IsSubsetOf({e0, e1, ..., en})`, `IsSubsetOf(a_container)`, `IsSubsetOf(begin, end)`, `IsSubsetOf(array)`, or `IsSubsetOf(array, count)` | `argument` matches `UnorderedElementsAre(x0, x1, ..., xk)` for some subset `{x0, x1, ..., xk}` of the expected matchers. | -| `IsSupersetOf({e0, e1, ..., en})`, `IsSupersetOf(a_container)`, `IsSupersetOf(begin, end)`, `IsSupersetOf(array)`, or `IsSupersetOf(array, count)` | Some subset of `argument` matches `UnorderedElementsAre(`expected matchers`)`. | -| `Pointwise(m, container)`, `Pointwise(m, {e0, e1, ..., en})` | `argument` contains the same number of elements as in `container`, and for all i, (the i-th element in `argument`, the i-th element in `container`) match `m`, which is a matcher on 2-tuples. E.g. `Pointwise(Le(), upper_bounds)` verifies that each element in `argument` doesn't exceed the corresponding element in `upper_bounds`. See more detail below. | -| `SizeIs(m)` | `argument` is a container whose size matches `m`. E.g. `SizeIs(2)` or `SizeIs(Lt(2))`. | -| `UnorderedElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, and under *some* permutation of the elements, each element matches an `ei` (for a different `i`), which can be a value or a matcher. | -| `UnorderedElementsAreArray({e0, e1, ..., en})`, `UnorderedElementsAreArray(a_container)`, `UnorderedElementsAreArray(begin, end)`, `UnorderedElementsAreArray(array)`, or `UnorderedElementsAreArray(array, count)` | The same as `UnorderedElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, iterator range, or C-style array. | -| `UnorderedPointwise(m, container)`, `UnorderedPointwise(m, {e0, e1, ..., en})` | Like `Pointwise(m, container)`, but ignores the order of elements. | -| `WhenSorted(m)` | When `argument` is sorted using the `<` operator, it matches container matcher `m`. E.g. `WhenSorted(ElementsAre(1, 2, 3))` verifies that `argument` contains elements 1, 2, and 3, ignoring order. | -| `WhenSortedBy(comparator, m)` | The same as `WhenSorted(m)`, except that the given comparator instead of `<` is used to sort `argument`. E.g. `WhenSortedBy(std::greater(), ElementsAre(3, 2, 1))`. | - - -**Notes:** - -* These matchers can also match: - 1. a native array passed by reference (e.g. in `Foo(const int (&a)[5])`), - and - 2. an array passed as a pointer and a count (e.g. in `Bar(const T* buffer, - int len)` -- see [Multi-argument Matchers](#MultiArgMatchers)). -* The array being matched may be multi-dimensional (i.e. its elements can be - arrays). -* `m` in `Pointwise(m, ...)` should be a matcher for `::std::tuple` - where `T` and `U` are the element type of the actual container and the - expected container, respectively. For example, to compare two `Foo` - containers where `Foo` doesn't support `operator==`, one might write: - - ```cpp - using ::std::get; - MATCHER(FooEq, "") { - return std::get<0>(arg).Equals(std::get<1>(arg)); - } - ... - EXPECT_THAT(actual_foos, Pointwise(FooEq(), expected_foos)); - ``` - -#### Member Matchers - - -| Matcher | Description | -| :------------------------------ | :----------------------------------------- | -| `Field(&class::field, m)` | `argument.field` (or `argument->field` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_. | -| `Key(e)` | `argument.first` matches `e`, which can be either a value or a matcher. E.g. `Contains(Key(Le(5)))` can verify that a `map` contains a key `<= 5`. | -| `Pair(m1, m2)` | `argument` is an `std::pair` whose `first` field matches `m1` and `second` field matches `m2`. | -| `Property(&class::property, m)` | `argument.property()` (or `argument->property()` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_. | - - -#### Matching the Result of a Function, Functor, or Callback - - -| Matcher | Description | -| :--------------- | :------------------------------------------------ | -| `ResultOf(f, m)` | `f(argument)` matches matcher `m`, where `f` is a function or functor. | - - -#### Pointer Matchers - - -| Matcher | Description | -| :------------------------ | :---------------------------------------------- | -| `Pointee(m)` | `argument` (either a smart pointer or a raw pointer) points to a value that matches matcher `m`. | -| `WhenDynamicCastTo(m)` | when `argument` is passed through `dynamic_cast()`, it matches matcher `m`. | - - - - - - -#### Multi-argument Matchers {#MultiArgMatchers} - -Technically, all matchers match a *single* value. A "multi-argument" matcher is -just one that matches a *tuple*. The following matchers can be used to match a -tuple `(x, y)`: - -Matcher | Description -:------ | :---------- -`Eq()` | `x == y` -`Ge()` | `x >= y` -`Gt()` | `x > y` -`Le()` | `x <= y` -`Lt()` | `x < y` -`Ne()` | `x != y` - -You can use the following selectors to pick a subset of the arguments (or -reorder them) to participate in the matching: - - -| Matcher | Description | -| :------------------------- | :---------------------------------------------- | -| `AllArgs(m)` | Equivalent to `m`. Useful as syntactic sugar in `.With(AllArgs(m))`. | -| `Args(m)` | The tuple of the `k` selected (using 0-based indices) arguments matches `m`, e.g. `Args<1, 2>(Eq())`. | - - -#### Composite Matchers - -You can make a matcher from one or more other matchers: - - -| Matcher | Description | -| :------------------------------- | :-------------------------------------- | -| `AllOf(m1, m2, ..., mn)` | `argument` matches all of the matchers `m1` to `mn`. | -| `AllOfArray({m0, m1, ..., mn})`, `AllOfArray(a_container)`, `AllOfArray(begin, end)`, `AllOfArray(array)`, or `AllOfArray(array, count)` | The same as `AllOf()` except that the matchers come from an initializer list, STL-style container, iterator range, or C-style array. | -| `AnyOf(m1, m2, ..., mn)` | `argument` matches at least one of the matchers `m1` to `mn`. | -| `AnyOfArray({m0, m1, ..., mn})`, `AnyOfArray(a_container)`, `AnyOfArray(begin, end)`, `AnyOfArray(array)`, or `AnyOfArray(array, count)` | The same as `AnyOf()` except that the matchers come from an initializer list, STL-style container, iterator range, or C-style array. | -| `Not(m)` | `argument` doesn't match matcher `m`. | - - - - -#### Adapters for Matchers - - -| Matcher | Description | -| :---------------------- | :------------------------------------ | -| `MatcherCast(m)` | casts matcher `m` to type `Matcher`. | -| `SafeMatcherCast(m)` | [safely casts](cook_book.md#casting-matchers) matcher `m` to type `Matcher`. | -| `Truly(predicate)` | `predicate(argument)` returns something considered by C++ to be true, where `predicate` is a function or functor. | - - -`AddressSatisfies(callback)` and `Truly(callback)` take ownership of `callback`, -which must be a permanent callback. - -#### Using Matchers as Predicates {#MatchersAsPredicatesCheat} - - -| Matcher | Description | -| :---------------------------- | :------------------------------------------ | -| `Matches(m)(value)` | evaluates to `true` if `value` matches `m`. You can use `Matches(m)` alone as a unary functor. | -| `ExplainMatchResult(m, value, result_listener)` | evaluates to `true` if `value` matches `m`, explaining the result to `result_listener`. | -| `Value(value, m)` | evaluates to `true` if `value` matches `m`. | - - -#### Defining Matchers - - -| Matcher | Description | -| :----------------------------------- | :------------------------------------ | -| `MATCHER(IsEven, "") { return (arg % 2) == 0; }` | Defines a matcher `IsEven()` to match an even number. | -| `MATCHER_P(IsDivisibleBy, n, "") { *result_listener << "where the remainder is " << (arg % n); return (arg % n) == 0; }` | Defines a macher `IsDivisibleBy(n)` to match a number divisible by `n`. | -| `MATCHER_P2(IsBetween, a, b, std::string(negation ? "isn't" : "is") + " between " + PrintToString(a) + " and " + PrintToString(b)) { return a <= arg && arg <= b; }` | Defines a matcher `IsBetween(a, b)` to match a value in the range [`a`, `b`]. | - - -**Notes:** - -1. The `MATCHER*` macros cannot be used inside a function or class. -2. The matcher body must be *purely functional* (i.e. it cannot have any side - effect, and the result must not depend on anything other than the value - being matched and the matcher parameters). -3. You can use `PrintToString(x)` to convert a value `x` of any type to a - string. - -### Actions {#ActionList} - -**Actions** specify what a mock function should do when invoked. - -#### Returning a Value - - -| | | -| :-------------------------- | :-------------------------------------------- | -| `Return()` | Return from a `void` mock function. | -| `Return(value)` | Return `value`. If the type of `value` is different to the mock function's return type, `value` is converted to the latter type at the time the expectation is set, not when the action is executed. | -| `ReturnArg()` | Return the `N`-th (0-based) argument. | -| `ReturnNew(a1, ..., ak)` | Return `new T(a1, ..., ak)`; a different object is created each time. | -| `ReturnNull()` | Return a null pointer. | -| `ReturnPointee(ptr)` | Return the value pointed to by `ptr`. | -| `ReturnRef(variable)` | Return a reference to `variable`. | -| `ReturnRefOfCopy(value)` | Return a reference to a copy of `value`; the copy lives as long as the action. | - - -#### Side Effects - - -| | | -| :--------------------------------- | :-------------------------------------- | -| `Assign(&variable, value)` | Assign `value` to variable. | -| `DeleteArg()` | Delete the `N`-th (0-based) argument, which must be a pointer. | -| `SaveArg(pointer)` | Save the `N`-th (0-based) argument to `*pointer`. | -| `SaveArgPointee(pointer)` | Save the value pointed to by the `N`-th (0-based) argument to `*pointer`. | -| `SetArgReferee(value)` | Assign value to the variable referenced by the `N`-th (0-based) argument. | -| `SetArgPointee(value)` | Assign `value` to the variable pointed by the `N`-th (0-based) argument. | -| `SetArgumentPointee(value)` | Same as `SetArgPointee(value)`. Deprecated. Will be removed in v1.7.0. | -| `SetArrayArgument(first, last)` | Copies the elements in source range [`first`, `last`) to the array pointed to by the `N`-th (0-based) argument, which can be either a pointer or an iterator. The action does not take ownership of the elements in the source range. | -| `SetErrnoAndReturn(error, value)` | Set `errno` to `error` and return `value`. | -| `Throw(exception)` | Throws the given exception, which can be any copyable value. Available since v1.1.0. | - - -#### Using a Function, Functor, or Lambda as an Action - -In the following, by "callable" we mean a free function, `std::function`, -functor, or lambda. - - -| | | -| :---------------------------------- | :------------------------------------- | -| `f` | Invoke f with the arguments passed to the mock function, where f is a callable. | -| `Invoke(f)` | Invoke `f` with the arguments passed to the mock function, where `f` can be a global/static function or a functor. | -| `Invoke(object_pointer, &class::method)` | Invoke the method on the object with the arguments passed to the mock function. | -| `InvokeWithoutArgs(f)` | Invoke `f`, which can be a global/static function or a functor. `f` must take no arguments. | -| `InvokeWithoutArgs(object_pointer, &class::method)` | Invoke the method on the object, which takes no arguments. | -| `InvokeArgument(arg1, arg2, ..., argk)` | Invoke the mock function's `N`-th (0-based) argument, which must be a function or a functor, with the `k` arguments. | - - -The return value of the invoked function is used as the return value of the -action. - -When defining a callable to be used with `Invoke*()`, you can declare any unused -parameters as `Unused`: - -```cpp -using ::testing::Invoke; -double Distance(Unused, double x, double y) { return sqrt(x*x + y*y); } -... -EXPECT_CALL(mock, Foo("Hi", _, _)).WillOnce(Invoke(Distance)); -``` - -`Invoke(callback)` and `InvokeWithoutArgs(callback)` take ownership of -`callback`, which must be permanent. The type of `callback` must be a base -callback type instead of a derived one, e.g. - -```cpp - BlockingClosure* done = new BlockingClosure; - ... Invoke(done) ...; // This won't compile! - - Closure* done2 = new BlockingClosure; - ... Invoke(done2) ...; // This works. -``` - -In `InvokeArgument(...)`, if an argument needs to be passed by reference, -wrap it inside `ByRef()`. For example, - -```cpp -using ::testing::ByRef; -using ::testing::InvokeArgument; -... -InvokeArgument<2>(5, string("Hi"), ByRef(foo)) -``` - -calls the mock function's #2 argument, passing to it `5` and `string("Hi")` by -value, and `foo` by reference. - -#### Default Action - - -| Matcher | Description | -| :------------ | :----------------------------------------------------- | -| `DoDefault()` | Do the default action (specified by `ON_CALL()` or the built-in one). | - - -**Note:** due to technical reasons, `DoDefault()` cannot be used inside a -composite action - trying to do so will result in a run-time error. - - - -#### Composite Actions - - -| | | -| :----------------------------- | :------------------------------------------ | -| `DoAll(a1, a2, ..., an)` | Do all actions `a1` to `an` and return the result of `an` in each invocation. The first `n - 1` sub-actions must return void. | -| `IgnoreResult(a)` | Perform action `a` and ignore its result. `a` must not return void. | -| `WithArg(a)` | Pass the `N`-th (0-based) argument of the mock function to action `a` and perform it. | -| `WithArgs(a)` | Pass the selected (0-based) arguments of the mock function to action `a` and perform it. | -| `WithoutArgs(a)` | Perform action `a` without any arguments. | - - -#### Defining Actions - - - - - - - -
`struct SumAction {`
-  `template `
-  `T operator()(T x, Ty) { return x + y; }`
- `};` -
Defines a generic functor that can be used as an action summing its - arguments.
- - -| | | -| :--------------------------------- | :-------------------------------------- | -| `ACTION(Sum) { return arg0 + arg1; }` | Defines an action `Sum()` to return the sum of the mock function's argument #0 and #1. | -| `ACTION_P(Plus, n) { return arg0 + n; }` | Defines an action `Plus(n)` to return the sum of the mock function's argument #0 and `n`. | -| `ACTION_Pk(Foo, p1, ..., pk) { statements; }` | Defines a parameterized action `Foo(p1, ..., pk)` to execute the given `statements`. | - - -The `ACTION*` macros cannot be used inside a function or class. - -### Cardinalities {#CardinalityList} - -These are used in `Times()` to specify how many times a mock function will be -called: - - -| | | -| :---------------- | :----------------------------------------------------- | -| `AnyNumber()` | The function can be called any number of times. | -| `AtLeast(n)` | The call is expected at least `n` times. | -| `AtMost(n)` | The call is expected at most `n` times. | -| `Between(m, n)` | The call is expected between `m` and `n` (inclusive) times. | -| `Exactly(n) or n` | The call is expected exactly `n` times. In particular, the call should never happen when `n` is 0. | - - -### Expectation Order - -By default, the expectations can be matched in *any* order. If some or all -expectations must be matched in a given order, there are two ways to specify it. -They can be used either independently or together. - -#### The After Clause {#AfterClause} - -```cpp -using ::testing::Expectation; -... -Expectation init_x = EXPECT_CALL(foo, InitX()); -Expectation init_y = EXPECT_CALL(foo, InitY()); -EXPECT_CALL(foo, Bar()) - .After(init_x, init_y); -``` - -says that `Bar()` can be called only after both `InitX()` and `InitY()` have -been called. - -If you don't know how many pre-requisites an expectation has when you write it, -you can use an `ExpectationSet` to collect them: - -```cpp -using ::testing::ExpectationSet; -... -ExpectationSet all_inits; -for (int i = 0; i < element_count; i++) { - all_inits += EXPECT_CALL(foo, InitElement(i)); -} -EXPECT_CALL(foo, Bar()) - .After(all_inits); -``` - -says that `Bar()` can be called only after all elements have been initialized -(but we don't care about which elements get initialized before the others). - -Modifying an `ExpectationSet` after using it in an `.After()` doesn't affect the -meaning of the `.After()`. - -#### Sequences {#UsingSequences} - -When you have a long chain of sequential expectations, it's easier to specify -the order using **sequences**, which don't require you to given each expectation -in the chain a different name. *All expected calls* in the same sequence must -occur in the order they are specified. - -```cpp -using ::testing::Return; -using ::testing::Sequence; -Sequence s1, s2; -... -EXPECT_CALL(foo, Reset()) - .InSequence(s1, s2) - .WillOnce(Return(true)); -EXPECT_CALL(foo, GetSize()) - .InSequence(s1) - .WillOnce(Return(1)); -EXPECT_CALL(foo, Describe(A())) - .InSequence(s2) - .WillOnce(Return("dummy")); -``` - -says that `Reset()` must be called before *both* `GetSize()` *and* `Describe()`, -and the latter two can occur in any order. - -To put many expectations in a sequence conveniently: - -```cpp -using ::testing::InSequence; -{ - InSequence seq; - - EXPECT_CALL(...)...; - EXPECT_CALL(...)...; - ... - EXPECT_CALL(...)...; -} -``` - -says that all expected calls in the scope of `seq` must occur in strict order. -The name `seq` is irrelevant. - -### Verifying and Resetting a Mock - -gMock will verify the expectations on a mock object when it is destructed, or -you can do it earlier: - -```cpp -using ::testing::Mock; -... -// Verifies and removes the expectations on mock_obj; -// returns true if and only if successful. -Mock::VerifyAndClearExpectations(&mock_obj); -... -// Verifies and removes the expectations on mock_obj; -// also removes the default actions set by ON_CALL(); -// returns true if and only if successful. -Mock::VerifyAndClear(&mock_obj); -``` - -You can also tell gMock that a mock object can be leaked and doesn't need to be -verified: - -```cpp -Mock::AllowLeak(&mock_obj); -``` - -### Mock Classes - -gMock defines a convenient mock class template - -```cpp -class MockFunction { - public: - MOCK_METHOD(R, Call, (A1, ..., An)); -}; -``` - -See this [recipe](cook_book.md#using-check-points) for one application of it. - -### Flags - - -| Flag | Description | -| :----------------------------- | :---------------------------------------- | -| `--gmock_catch_leaked_mocks=0` | Don't report leaked mock objects as failures. | -| `--gmock_verbose=LEVEL` | Sets the default verbosity level (`info`, `warning`, or `error`) of Google Mock messages. | - diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/cook_book.md b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/cook_book.md deleted file mode 100644 index ea55ab3..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/cook_book.md +++ /dev/null @@ -1,4270 +0,0 @@ -# gMock Cookbook - - - -You can find recipes for using gMock here. If you haven't yet, please read -[this](for_dummies.md) first to make sure you understand the basics. - -**Note:** gMock lives in the `testing` name space. For readability, it is -recommended to write `using ::testing::Foo;` once in your file before using the -name `Foo` defined by gMock. We omit such `using` statements in this section for -brevity, but you should do it in your own code. - -## Creating Mock Classes - -Mock classes are defined as normal classes, using the `MOCK_METHOD` macro to -generate mocked methods. The macro gets 3 or 4 parameters: - -```cpp -class MyMock { - public: - MOCK_METHOD(ReturnType, MethodName, (Args...)); - MOCK_METHOD(ReturnType, MethodName, (Args...), (Specs...)); -}; -``` - -The first 3 parameters are simply the method declaration, split into 3 parts. -The 4th parameter accepts a closed list of qualifiers, which affect the -generated method: - -* **`const`** - Makes the mocked method a `const` method. Required if - overriding a `const` method. -* **`override`** - Marks the method with `override`. Recommended if overriding - a `virtual` method. -* **`noexcept`** - Marks the method with `noexcept`. Required if overriding a - `noexcept` method. -* **`Calltype(...)`** - Sets the call type for the method (e.g. to - `STDMETHODCALLTYPE`), useful in Windows. - -### Dealing with unprotected commas - -Unprotected commas, i.e. commas which are not surrounded by parentheses, prevent -`MOCK_METHOD` from parsing its arguments correctly: - -```cpp {.bad} -class MockFoo { - public: - MOCK_METHOD(std::pair, GetPair, ()); // Won't compile! - MOCK_METHOD(bool, CheckMap, (std::map, bool)); // Won't compile! -}; -``` - -Solution 1 - wrap with parentheses: - -```cpp {.good} -class MockFoo { - public: - MOCK_METHOD((std::pair), GetPair, ()); - MOCK_METHOD(bool, CheckMap, ((std::map), bool)); -}; -``` - -Note that wrapping a return or argument type with parentheses is, in general, -invalid C++. `MOCK_METHOD` removes the parentheses. - -Solution 2 - define an alias: - -```cpp {.good} -class MockFoo { - public: - using BoolAndInt = std::pair; - MOCK_METHOD(BoolAndInt, GetPair, ()); - using MapIntDouble = std::map; - MOCK_METHOD(bool, CheckMap, (MapIntDouble, bool)); -}; -``` - -### Mocking Private or Protected Methods - -You must always put a mock method definition (`MOCK_METHOD`) in a `public:` -section of the mock class, regardless of the method being mocked being `public`, -`protected`, or `private` in the base class. This allows `ON_CALL` and -`EXPECT_CALL` to reference the mock function from outside of the mock class. -(Yes, C++ allows a subclass to change the access level of a virtual function in -the base class.) Example: - -```cpp -class Foo { - public: - ... - virtual bool Transform(Gadget* g) = 0; - - protected: - virtual void Resume(); - - private: - virtual int GetTimeOut(); -}; - -class MockFoo : public Foo { - public: - ... - MOCK_METHOD(bool, Transform, (Gadget* g), (override)); - - // The following must be in the public section, even though the - // methods are protected or private in the base class. - MOCK_METHOD(void, Resume, (), (override)); - MOCK_METHOD(int, GetTimeOut, (), (override)); -}; -``` - -### Mocking Overloaded Methods - -You can mock overloaded functions as usual. No special attention is required: - -```cpp -class Foo { - ... - - // Must be virtual as we'll inherit from Foo. - virtual ~Foo(); - - // Overloaded on the types and/or numbers of arguments. - virtual int Add(Element x); - virtual int Add(int times, Element x); - - // Overloaded on the const-ness of this object. - virtual Bar& GetBar(); - virtual const Bar& GetBar() const; -}; - -class MockFoo : public Foo { - ... - MOCK_METHOD(int, Add, (Element x), (override)); - MOCK_METHOD(int, Add, (int times, Element x), (override)); - - MOCK_METHOD(Bar&, GetBar, (), (override)); - MOCK_METHOD(const Bar&, GetBar, (), (const, override)); -}; -``` - -**Note:** if you don't mock all versions of the overloaded method, the compiler -will give you a warning about some methods in the base class being hidden. To -fix that, use `using` to bring them in scope: - -```cpp -class MockFoo : public Foo { - ... - using Foo::Add; - MOCK_METHOD(int, Add, (Element x), (override)); - // We don't want to mock int Add(int times, Element x); - ... -}; -``` - -### Mocking Class Templates - -You can mock class templates just like any class. - -```cpp -template -class StackInterface { - ... - // Must be virtual as we'll inherit from StackInterface. - virtual ~StackInterface(); - - virtual int GetSize() const = 0; - virtual void Push(const Elem& x) = 0; -}; - -template -class MockStack : public StackInterface { - ... - MOCK_METHOD(int, GetSize, (), (override)); - MOCK_METHOD(void, Push, (const Elem& x), (override)); -}; -``` - -### Mocking Non-virtual Methods {#MockingNonVirtualMethods} - -gMock can mock non-virtual functions to be used in Hi-perf dependency -injection. - -In this case, instead of sharing a common base class with the real class, your -mock class will be *unrelated* to the real class, but contain methods with the -same signatures. The syntax for mocking non-virtual methods is the *same* as -mocking virtual methods (just don't add `override`): - -```cpp -// A simple packet stream class. None of its members is virtual. -class ConcretePacketStream { - public: - void AppendPacket(Packet* new_packet); - const Packet* GetPacket(size_t packet_number) const; - size_t NumberOfPackets() const; - ... -}; - -// A mock packet stream class. It inherits from no other, but defines -// GetPacket() and NumberOfPackets(). -class MockPacketStream { - public: - MOCK_METHOD(const Packet*, GetPacket, (size_t packet_number), (const)); - MOCK_METHOD(size_t, NumberOfPackets, (), (const)); - ... -}; -``` - -Note that the mock class doesn't define `AppendPacket()`, unlike the real class. -That's fine as long as the test doesn't need to call it. - -Next, you need a way to say that you want to use `ConcretePacketStream` in -production code, and use `MockPacketStream` in tests. Since the functions are -not virtual and the two classes are unrelated, you must specify your choice at -*compile time* (as opposed to run time). - -One way to do it is to templatize your code that needs to use a packet stream. -More specifically, you will give your code a template type argument for the type -of the packet stream. In production, you will instantiate your template with -`ConcretePacketStream` as the type argument. In tests, you will instantiate the -same template with `MockPacketStream`. For example, you may write: - -```cpp -template -void CreateConnection(PacketStream* stream) { ... } - -template -class PacketReader { - public: - void ReadPackets(PacketStream* stream, size_t packet_num); -}; -``` - -Then you can use `CreateConnection()` and -`PacketReader` in production code, and use -`CreateConnection()` and `PacketReader` in -tests. - -```cpp - MockPacketStream mock_stream; - EXPECT_CALL(mock_stream, ...)...; - .. set more expectations on mock_stream ... - PacketReader reader(&mock_stream); - ... exercise reader ... -``` - -### Mocking Free Functions - -It's possible to use gMock to mock a free function (i.e. a C-style function or a -static method). You just need to rewrite your code to use an interface (abstract -class). - -Instead of calling a free function (say, `OpenFile`) directly, introduce an -interface for it and have a concrete subclass that calls the free function: - -```cpp -class FileInterface { - public: - ... - virtual bool Open(const char* path, const char* mode) = 0; -}; - -class File : public FileInterface { - public: - ... - virtual bool Open(const char* path, const char* mode) { - return OpenFile(path, mode); - } -}; -``` - -Your code should talk to `FileInterface` to open a file. Now it's easy to mock -out the function. - -This may seem like a lot of hassle, but in practice you often have multiple -related functions that you can put in the same interface, so the per-function -syntactic overhead will be much lower. - -If you are concerned about the performance overhead incurred by virtual -functions, and profiling confirms your concern, you can combine this with the -recipe for [mocking non-virtual methods](#MockingNonVirtualMethods). - -### Old-Style `MOCK_METHODn` Macros - -Before the generic `MOCK_METHOD` macro was introduced, mocks where created using -a family of macros collectively called `MOCK_METHODn`. These macros are still -supported, though migration to the new `MOCK_METHOD` is recommended. - -The macros in the `MOCK_METHODn` family differ from `MOCK_METHOD`: - -* The general structure is `MOCK_METHODn(MethodName, ReturnType(Args))`, - instead of `MOCK_METHOD(ReturnType, MethodName, (Args))`. -* The number `n` must equal the number of arguments. -* When mocking a const method, one must use `MOCK_CONST_METHODn`. -* When mocking a class template, the macro name must be suffixed with `_T`. -* In order to specify the call type, the macro name must be suffixed with - `_WITH_CALLTYPE`, and the call type is the first macro argument. - -Old macros and their new equivalents: - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simple
Old `MOCK_METHOD1(Foo, bool(int))`
New `MOCK_METHOD(bool, Foo, (int))`
Const Method
Old -`MOCK_CONST_METHOD1(Foo, bool(int))`
New -`MOCK_METHOD(bool, Foo, (int), (const))`
Method in a Class Template
Old `MOCK_METHOD1_T(Foo, bool(int))`
New -`MOCK_METHOD(bool, Foo, (int))`
Const Method in a Class Template
Old - `MOCK_CONST_METHOD1_T(Foo, bool(int))`
New - `MOCK_METHOD(bool, Foo, (int), (const))`
Method with Call Type
Old -`MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))`
New `MOCK_METHOD(bool, Foo, (int), -(Calltype(STDMETHODCALLTYPE)))`
Const Method with Call Type
Old `MOCK_CONST_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))`
New `MOCK_METHOD(bool, Foo, (int), (const, -Calltype(STDMETHODCALLTYPE)))`
Method with Call Type in a Class Template
Old `MOCK_METHOD1_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, -bool(int))`
New `MOCK_METHOD(bool, Foo, (int), -(Calltype(STDMETHODCALLTYPE)))`
Const Method with Call Type in a Class Template
Old `MOCK_CONST_METHOD1_T_WITH_CALLTYPE(STDMETHODCALLTYPE, -Foo, bool(int))`
New `MOCK_METHOD(bool, Foo, -(int), (const, Calltype(STDMETHODCALLTYPE)))`
- -### The Nice, the Strict, and the Naggy {#NiceStrictNaggy} - -If a mock method has no `EXPECT_CALL` spec but is called, we say that it's an -"uninteresting call", and the default action (which can be specified using -`ON_CALL()`) of the method will be taken. Currently, an uninteresting call will -also by default cause gMock to print a warning. (In the future, we might remove -this warning by default.) - -However, sometimes you may want to ignore these uninteresting calls, and -sometimes you may want to treat them as errors. gMock lets you make the decision -on a per-mock-object basis. - -Suppose your test uses a mock class `MockFoo`: - -```cpp -TEST(...) { - MockFoo mock_foo; - EXPECT_CALL(mock_foo, DoThis()); - ... code that uses mock_foo ... -} -``` - -If a method of `mock_foo` other than `DoThis()` is called, you will get a -warning. However, if you rewrite your test to use `NiceMock` instead, -you can suppress the warning: - -```cpp -using ::testing::NiceMock; - -TEST(...) { - NiceMock mock_foo; - EXPECT_CALL(mock_foo, DoThis()); - ... code that uses mock_foo ... -} -``` - -`NiceMock` is a subclass of `MockFoo`, so it can be used wherever -`MockFoo` is accepted. - -It also works if `MockFoo`'s constructor takes some arguments, as -`NiceMock` "inherits" `MockFoo`'s constructors: - -```cpp -using ::testing::NiceMock; - -TEST(...) { - NiceMock mock_foo(5, "hi"); // Calls MockFoo(5, "hi"). - EXPECT_CALL(mock_foo, DoThis()); - ... code that uses mock_foo ... -} -``` - -The usage of `StrictMock` is similar, except that it makes all uninteresting -calls failures: - -```cpp -using ::testing::StrictMock; - -TEST(...) { - StrictMock mock_foo; - EXPECT_CALL(mock_foo, DoThis()); - ... code that uses mock_foo ... - - // The test will fail if a method of mock_foo other than DoThis() - // is called. -} -``` - -NOTE: `NiceMock` and `StrictMock` only affects *uninteresting* calls (calls of -*methods* with no expectations); they do not affect *unexpected* calls (calls of -methods with expectations, but they don't match). See -[Understanding Uninteresting vs Unexpected Calls](#uninteresting-vs-unexpected). - -There are some caveats though (I dislike them just as much as the next guy, but -sadly they are side effects of C++'s limitations): - -1. `NiceMock` and `StrictMock` only work for mock methods - defined using the `MOCK_METHOD` macro **directly** in the `MockFoo` class. - If a mock method is defined in a **base class** of `MockFoo`, the "nice" or - "strict" modifier may not affect it, depending on the compiler. In - particular, nesting `NiceMock` and `StrictMock` (e.g. - `NiceMock >`) is **not** supported. -2. `NiceMock` and `StrictMock` may not work correctly if the - destructor of `MockFoo` is not virtual. We would like to fix this, but it - requires cleaning up existing tests. http://b/28934720 tracks the issue. -3. During the constructor or destructor of `MockFoo`, the mock object is *not* - nice or strict. This may cause surprises if the constructor or destructor - calls a mock method on `this` object. (This behavior, however, is consistent - with C++'s general rule: if a constructor or destructor calls a virtual - method of `this` object, that method is treated as non-virtual. In other - words, to the base class's constructor or destructor, `this` object behaves - like an instance of the base class, not the derived class. This rule is - required for safety. Otherwise a base constructor may use members of a - derived class before they are initialized, or a base destructor may use - members of a derived class after they have been destroyed.) - -Finally, you should be **very cautious** about when to use naggy or strict -mocks, as they tend to make tests more brittle and harder to maintain. When you -refactor your code without changing its externally visible behavior, ideally you -shouldn't need to update any tests. If your code interacts with a naggy mock, -however, you may start to get spammed with warnings as the result of your -change. Worse, if your code interacts with a strict mock, your tests may start -to fail and you'll be forced to fix them. Our general recommendation is to use -nice mocks (not yet the default) most of the time, use naggy mocks (the current -default) when developing or debugging tests, and use strict mocks only as the -last resort. - -### Simplifying the Interface without Breaking Existing Code {#SimplerInterfaces} - -Sometimes a method has a long list of arguments that is mostly uninteresting. -For example: - -```cpp -class LogSink { - public: - ... - virtual void send(LogSeverity severity, const char* full_filename, - const char* base_filename, int line, - const struct tm* tm_time, - const char* message, size_t message_len) = 0; -}; -``` - -This method's argument list is lengthy and hard to work with (the `message` -argument is not even 0-terminated). If we mock it as is, using the mock will be -awkward. If, however, we try to simplify this interface, we'll need to fix all -clients depending on it, which is often infeasible. - -The trick is to redispatch the method in the mock class: - -```cpp -class ScopedMockLog : public LogSink { - public: - ... - virtual void send(LogSeverity severity, const char* full_filename, - const char* base_filename, int line, const tm* tm_time, - const char* message, size_t message_len) { - // We are only interested in the log severity, full file name, and - // log message. - Log(severity, full_filename, std::string(message, message_len)); - } - - // Implements the mock method: - // - // void Log(LogSeverity severity, - // const string& file_path, - // const string& message); - MOCK_METHOD(void, Log, - (LogSeverity severity, const string& file_path, - const string& message)); -}; -``` - -By defining a new mock method with a trimmed argument list, we make the mock -class more user-friendly. - -This technique may also be applied to make overloaded methods more amenable to -mocking. For example, when overloads have been used to implement default -arguments: - -```cpp -class MockTurtleFactory : public TurtleFactory { - public: - Turtle* MakeTurtle(int length, int weight) override { ... } - Turtle* MakeTurtle(int length, int weight, int speed) override { ... } - - // the above methods delegate to this one: - MOCK_METHOD(Turtle*, DoMakeTurtle, ()); -}; -``` - -This allows tests that don't care which overload was invoked to avoid specifying -argument matchers: - -```cpp -ON_CALL(factory, DoMakeTurtle) - .WillByDefault(MakeMockTurtle()); -``` - -### Alternative to Mocking Concrete Classes - -Often you may find yourself using classes that don't implement interfaces. In -order to test your code that uses such a class (let's call it `Concrete`), you -may be tempted to make the methods of `Concrete` virtual and then mock it. - -Try not to do that. - -Making a non-virtual function virtual is a big decision. It creates an extension -point where subclasses can tweak your class' behavior. This weakens your control -on the class because now it's harder to maintain the class invariants. You -should make a function virtual only when there is a valid reason for a subclass -to override it. - -Mocking concrete classes directly is problematic as it creates a tight coupling -between the class and the tests - any small change in the class may invalidate -your tests and make test maintenance a pain. - -To avoid such problems, many programmers have been practicing "coding to -interfaces": instead of talking to the `Concrete` class, your code would define -an interface and talk to it. Then you implement that interface as an adaptor on -top of `Concrete`. In tests, you can easily mock that interface to observe how -your code is doing. - -This technique incurs some overhead: - -* You pay the cost of virtual function calls (usually not a problem). -* There is more abstraction for the programmers to learn. - -However, it can also bring significant benefits in addition to better -testability: - -* `Concrete`'s API may not fit your problem domain very well, as you may not - be the only client it tries to serve. By designing your own interface, you - have a chance to tailor it to your need - you may add higher-level - functionalities, rename stuff, etc instead of just trimming the class. This - allows you to write your code (user of the interface) in a more natural way, - which means it will be more readable, more maintainable, and you'll be more - productive. -* If `Concrete`'s implementation ever has to change, you don't have to rewrite - everywhere it is used. Instead, you can absorb the change in your - implementation of the interface, and your other code and tests will be - insulated from this change. - -Some people worry that if everyone is practicing this technique, they will end -up writing lots of redundant code. This concern is totally understandable. -However, there are two reasons why it may not be the case: - -* Different projects may need to use `Concrete` in different ways, so the best - interfaces for them will be different. Therefore, each of them will have its - own domain-specific interface on top of `Concrete`, and they will not be the - same code. -* If enough projects want to use the same interface, they can always share it, - just like they have been sharing `Concrete`. You can check in the interface - and the adaptor somewhere near `Concrete` (perhaps in a `contrib` - sub-directory) and let many projects use it. - -You need to weigh the pros and cons carefully for your particular problem, but -I'd like to assure you that the Java community has been practicing this for a -long time and it's a proven effective technique applicable in a wide variety of -situations. :-) - -### Delegating Calls to a Fake {#DelegatingToFake} - -Some times you have a non-trivial fake implementation of an interface. For -example: - -```cpp -class Foo { - public: - virtual ~Foo() {} - virtual char DoThis(int n) = 0; - virtual void DoThat(const char* s, int* p) = 0; -}; - -class FakeFoo : public Foo { - public: - char DoThis(int n) override { - return (n > 0) ? '+' : - (n < 0) ? '-' : '0'; - } - - void DoThat(const char* s, int* p) override { - *p = strlen(s); - } -}; -``` - -Now you want to mock this interface such that you can set expectations on it. -However, you also want to use `FakeFoo` for the default behavior, as duplicating -it in the mock object is, well, a lot of work. - -When you define the mock class using gMock, you can have it delegate its default -action to a fake class you already have, using this pattern: - -```cpp -class MockFoo : public Foo { - public: - // Normal mock method definitions using gMock. - MOCK_METHOD(char, DoThis, (int n), (override)); - MOCK_METHOD(void, DoThat, (const char* s, int* p), (override)); - - // Delegates the default actions of the methods to a FakeFoo object. - // This must be called *before* the custom ON_CALL() statements. - void DelegateToFake() { - ON_CALL(*this, DoThis).WillByDefault([this](int n) { - return fake_.DoThis(n); - }); - ON_CALL(*this, DoThat).WillByDefault([this](const char* s, int* p) { - fake_.DoThat(s, p); - }); - } - - private: - FakeFoo fake_; // Keeps an instance of the fake in the mock. -}; -``` - -With that, you can use `MockFoo` in your tests as usual. Just remember that if -you don't explicitly set an action in an `ON_CALL()` or `EXPECT_CALL()`, the -fake will be called upon to do it.: - -```cpp -using ::testing::_; - -TEST(AbcTest, Xyz) { - MockFoo foo; - - foo.DelegateToFake(); // Enables the fake for delegation. - - // Put your ON_CALL(foo, ...)s here, if any. - - // No action specified, meaning to use the default action. - EXPECT_CALL(foo, DoThis(5)); - EXPECT_CALL(foo, DoThat(_, _)); - - int n = 0; - EXPECT_EQ('+', foo.DoThis(5)); // FakeFoo::DoThis() is invoked. - foo.DoThat("Hi", &n); // FakeFoo::DoThat() is invoked. - EXPECT_EQ(2, n); -} -``` - -**Some tips:** - -* If you want, you can still override the default action by providing your own - `ON_CALL()` or using `.WillOnce()` / `.WillRepeatedly()` in `EXPECT_CALL()`. -* In `DelegateToFake()`, you only need to delegate the methods whose fake - implementation you intend to use. - -* The general technique discussed here works for overloaded methods, but - you'll need to tell the compiler which version you mean. To disambiguate a - mock function (the one you specify inside the parentheses of `ON_CALL()`), - use [this technique](#SelectOverload); to disambiguate a fake function (the - one you place inside `Invoke()`), use a `static_cast` to specify the - function's type. For instance, if class `Foo` has methods `char DoThis(int - n)` and `bool DoThis(double x) const`, and you want to invoke the latter, - you need to write `Invoke(&fake_, static_cast(&FakeFoo::DoThis))` instead of `Invoke(&fake_, &FakeFoo::DoThis)` - (The strange-looking thing inside the angled brackets of `static_cast` is - the type of a function pointer to the second `DoThis()` method.). - -* Having to mix a mock and a fake is often a sign of something gone wrong. - Perhaps you haven't got used to the interaction-based way of testing yet. Or - perhaps your interface is taking on too many roles and should be split up. - Therefore, **don't abuse this**. We would only recommend to do it as an - intermediate step when you are refactoring your code. - -Regarding the tip on mixing a mock and a fake, here's an example on why it may -be a bad sign: Suppose you have a class `System` for low-level system -operations. In particular, it does file and I/O operations. And suppose you want -to test how your code uses `System` to do I/O, and you just want the file -operations to work normally. If you mock out the entire `System` class, you'll -have to provide a fake implementation for the file operation part, which -suggests that `System` is taking on too many roles. - -Instead, you can define a `FileOps` interface and an `IOOps` interface and split -`System`'s functionalities into the two. Then you can mock `IOOps` without -mocking `FileOps`. - -### Delegating Calls to a Real Object - -When using testing doubles (mocks, fakes, stubs, and etc), sometimes their -behaviors will differ from those of the real objects. This difference could be -either intentional (as in simulating an error such that you can test the error -handling code) or unintentional. If your mocks have different behaviors than the -real objects by mistake, you could end up with code that passes the tests but -fails in production. - -You can use the *delegating-to-real* technique to ensure that your mock has the -same behavior as the real object while retaining the ability to validate calls. -This technique is very similar to the [delegating-to-fake](#DelegatingToFake) -technique, the difference being that we use a real object instead of a fake. -Here's an example: - -```cpp -using ::testing::AtLeast; - -class MockFoo : public Foo { - public: - MockFoo() { - // By default, all calls are delegated to the real object. - ON_CALL(*this, DoThis).WillByDefault([this](int n) { - return real_.DoThis(n); - }); - ON_CALL(*this, DoThat).WillByDefault([this](const char* s, int* p) { - real_.DoThat(s, p); - }); - ... - } - MOCK_METHOD(char, DoThis, ...); - MOCK_METHOD(void, DoThat, ...); - ... - private: - Foo real_; -}; - -... - MockFoo mock; - EXPECT_CALL(mock, DoThis()) - .Times(3); - EXPECT_CALL(mock, DoThat("Hi")) - .Times(AtLeast(1)); - ... use mock in test ... -``` - -With this, gMock will verify that your code made the right calls (with the right -arguments, in the right order, called the right number of times, etc), and a -real object will answer the calls (so the behavior will be the same as in -production). This gives you the best of both worlds. - -### Delegating Calls to a Parent Class - -Ideally, you should code to interfaces, whose methods are all pure virtual. In -reality, sometimes you do need to mock a virtual method that is not pure (i.e, -it already has an implementation). For example: - -```cpp -class Foo { - public: - virtual ~Foo(); - - virtual void Pure(int n) = 0; - virtual int Concrete(const char* str) { ... } -}; - -class MockFoo : public Foo { - public: - // Mocking a pure method. - MOCK_METHOD(void, Pure, (int n), (override)); - // Mocking a concrete method. Foo::Concrete() is shadowed. - MOCK_METHOD(int, Concrete, (const char* str), (override)); -}; -``` - -Sometimes you may want to call `Foo::Concrete()` instead of -`MockFoo::Concrete()`. Perhaps you want to do it as part of a stub action, or -perhaps your test doesn't need to mock `Concrete()` at all (but it would be -oh-so painful to have to define a new mock class whenever you don't need to mock -one of its methods). - -The trick is to leave a back door in your mock class for accessing the real -methods in the base class: - -```cpp -class MockFoo : public Foo { - public: - // Mocking a pure method. - MOCK_METHOD(void, Pure, (int n), (override)); - // Mocking a concrete method. Foo::Concrete() is shadowed. - MOCK_METHOD(int, Concrete, (const char* str), (override)); - - // Use this to call Concrete() defined in Foo. - int FooConcrete(const char* str) { return Foo::Concrete(str); } -}; -``` - -Now, you can call `Foo::Concrete()` inside an action by: - -```cpp -... - EXPECT_CALL(foo, Concrete).WillOnce([&foo](const char* str) { - return foo.FooConcrete(str); - }); -``` - -or tell the mock object that you don't want to mock `Concrete()`: - -```cpp -... - ON_CALL(foo, Concrete).WillByDefault([&foo](const char* str) { - return foo.FooConcrete(str); - }); -``` - -(Why don't we just write `{ return foo.Concrete(str); }`? If you do that, -`MockFoo::Concrete()` will be called (and cause an infinite recursion) since -`Foo::Concrete()` is virtual. That's just how C++ works.) - -## Using Matchers - -### Matching Argument Values Exactly - -You can specify exactly which arguments a mock method is expecting: - -```cpp -using ::testing::Return; -... - EXPECT_CALL(foo, DoThis(5)) - .WillOnce(Return('a')); - EXPECT_CALL(foo, DoThat("Hello", bar)); -``` - -### Using Simple Matchers - -You can use matchers to match arguments that have a certain property: - -```cpp -using ::testing::NotNull; -using ::testing::Return; -... - EXPECT_CALL(foo, DoThis(Ge(5))) // The argument must be >= 5. - .WillOnce(Return('a')); - EXPECT_CALL(foo, DoThat("Hello", NotNull())); - // The second argument must not be NULL. -``` - -A frequently used matcher is `_`, which matches anything: - -```cpp - EXPECT_CALL(foo, DoThat(_, NotNull())); -``` - - -### Combining Matchers {#CombiningMatchers} - -You can build complex matchers from existing ones using `AllOf()`, -`AllOfArray()`, `AnyOf()`, `AnyOfArray()` and `Not()`: - -```cpp -using ::testing::AllOf; -using ::testing::Gt; -using ::testing::HasSubstr; -using ::testing::Ne; -using ::testing::Not; -... - // The argument must be > 5 and != 10. - EXPECT_CALL(foo, DoThis(AllOf(Gt(5), - Ne(10)))); - - // The first argument must not contain sub-string "blah". - EXPECT_CALL(foo, DoThat(Not(HasSubstr("blah")), - NULL)); -``` - -### Casting Matchers {#SafeMatcherCast} - -gMock matchers are statically typed, meaning that the compiler can catch your -mistake if you use a matcher of the wrong type (for example, if you use `Eq(5)` -to match a `string` argument). Good for you! - -Sometimes, however, you know what you're doing and want the compiler to give you -some slack. One example is that you have a matcher for `long` and the argument -you want to match is `int`. While the two types aren't exactly the same, there -is nothing really wrong with using a `Matcher` to match an `int` - after -all, we can first convert the `int` argument to a `long` losslessly before -giving it to the matcher. - -To support this need, gMock gives you the `SafeMatcherCast(m)` function. It -casts a matcher `m` to type `Matcher`. To ensure safety, gMock checks that -(let `U` be the type `m` accepts : - -1. Type `T` can be *implicitly* cast to type `U`; -2. When both `T` and `U` are built-in arithmetic types (`bool`, integers, and - floating-point numbers), the conversion from `T` to `U` is not lossy (in - other words, any value representable by `T` can also be represented by `U`); - and -3. When `U` is a reference, `T` must also be a reference (as the underlying - matcher may be interested in the address of the `U` value). - -The code won't compile if any of these conditions isn't met. - -Here's one example: - -```cpp -using ::testing::SafeMatcherCast; - -// A base class and a child class. -class Base { ... }; -class Derived : public Base { ... }; - -class MockFoo : public Foo { - public: - MOCK_METHOD(void, DoThis, (Derived* derived), (override)); -}; - -... - MockFoo foo; - // m is a Matcher we got from somewhere. - EXPECT_CALL(foo, DoThis(SafeMatcherCast(m))); -``` - -If you find `SafeMatcherCast(m)` too limiting, you can use a similar function -`MatcherCast(m)`. The difference is that `MatcherCast` works as long as you -can `static_cast` type `T` to type `U`. - -`MatcherCast` essentially lets you bypass C++'s type system (`static_cast` isn't -always safe as it could throw away information, for example), so be careful not -to misuse/abuse it. - -### Selecting Between Overloaded Functions {#SelectOverload} - -If you expect an overloaded function to be called, the compiler may need some -help on which overloaded version it is. - -To disambiguate functions overloaded on the const-ness of this object, use the -`Const()` argument wrapper. - -```cpp -using ::testing::ReturnRef; - -class MockFoo : public Foo { - ... - MOCK_METHOD(Bar&, GetBar, (), (override)); - MOCK_METHOD(const Bar&, GetBar, (), (const, override)); -}; - -... - MockFoo foo; - Bar bar1, bar2; - EXPECT_CALL(foo, GetBar()) // The non-const GetBar(). - .WillOnce(ReturnRef(bar1)); - EXPECT_CALL(Const(foo), GetBar()) // The const GetBar(). - .WillOnce(ReturnRef(bar2)); -``` - -(`Const()` is defined by gMock and returns a `const` reference to its argument.) - -To disambiguate overloaded functions with the same number of arguments but -different argument types, you may need to specify the exact type of a matcher, -either by wrapping your matcher in `Matcher()`, or using a matcher whose -type is fixed (`TypedEq`, `An()`, etc): - -```cpp -using ::testing::An; -using ::testing::Matcher; -using ::testing::TypedEq; - -class MockPrinter : public Printer { - public: - MOCK_METHOD(void, Print, (int n), (override)); - MOCK_METHOD(void, Print, (char c), (override)); -}; - -TEST(PrinterTest, Print) { - MockPrinter printer; - - EXPECT_CALL(printer, Print(An())); // void Print(int); - EXPECT_CALL(printer, Print(Matcher(Lt(5)))); // void Print(int); - EXPECT_CALL(printer, Print(TypedEq('a'))); // void Print(char); - - printer.Print(3); - printer.Print(6); - printer.Print('a'); -} -``` - -### Performing Different Actions Based on the Arguments - -When a mock method is called, the *last* matching expectation that's still -active will be selected (think "newer overrides older"). So, you can make a -method do different things depending on its argument values like this: - -```cpp -using ::testing::_; -using ::testing::Lt; -using ::testing::Return; -... - // The default case. - EXPECT_CALL(foo, DoThis(_)) - .WillRepeatedly(Return('b')); - // The more specific case. - EXPECT_CALL(foo, DoThis(Lt(5))) - .WillRepeatedly(Return('a')); -``` - -Now, if `foo.DoThis()` is called with a value less than 5, `'a'` will be -returned; otherwise `'b'` will be returned. - -### Matching Multiple Arguments as a Whole - -Sometimes it's not enough to match the arguments individually. For example, we -may want to say that the first argument must be less than the second argument. -The `With()` clause allows us to match all arguments of a mock function as a -whole. For example, - -```cpp -using ::testing::_; -using ::testing::Ne; -using ::testing::Lt; -... - EXPECT_CALL(foo, InRange(Ne(0), _)) - .With(Lt()); -``` - -says that the first argument of `InRange()` must not be 0, and must be less than -the second argument. - -The expression inside `With()` must be a matcher of type -`Matcher< ::std::tuple >`, where `A1`, ..., `An` are the types of -the function arguments. - -You can also write `AllArgs(m)` instead of `m` inside `.With()`. The two forms -are equivalent, but `.With(AllArgs(Lt()))` is more readable than `.With(Lt())`. - -You can use `Args(m)` to match the `n` selected arguments (as a -tuple) against `m`. For example, - -```cpp -using ::testing::_; -using ::testing::AllOf; -using ::testing::Args; -using ::testing::Lt; -... - EXPECT_CALL(foo, Blah) - .With(AllOf(Args<0, 1>(Lt()), Args<1, 2>(Lt()))); -``` - -says that `Blah` will be called with arguments `x`, `y`, and `z` where `x < y < -z`. Note that in this example, it wasn't necessary specify the positional -matchers. - -As a convenience and example, gMock provides some matchers for 2-tuples, -including the `Lt()` matcher above. See [here](#MultiArgMatchers) for the -complete list. - -Note that if you want to pass the arguments to a predicate of your own (e.g. -`.With(Args<0, 1>(Truly(&MyPredicate)))`), that predicate MUST be written to -take a `::std::tuple` as its argument; gMock will pass the `n` selected -arguments as *one* single tuple to the predicate. - -### Using Matchers as Predicates - -Have you noticed that a matcher is just a fancy predicate that also knows how to -describe itself? Many existing algorithms take predicates as arguments (e.g. -those defined in STL's `` header), and it would be a shame if gMock -matchers were not allowed to participate. - -Luckily, you can use a matcher where a unary predicate functor is expected by -wrapping it inside the `Matches()` function. For example, - -```cpp -#include -#include - -using ::testing::Matches; -using ::testing::Ge; - -vector v; -... -// How many elements in v are >= 10? -const int count = count_if(v.begin(), v.end(), Matches(Ge(10))); -``` - -Since you can build complex matchers from simpler ones easily using gMock, this -gives you a way to conveniently construct composite predicates (doing the same -using STL's `` header is just painful). For example, here's a -predicate that's satisfied by any number that is >= 0, <= 100, and != 50: - -```cpp -using testing::AllOf; -using testing::Ge; -using testing::Le; -using testing::Matches; -using testing::Ne; -... -Matches(AllOf(Ge(0), Le(100), Ne(50))) -``` - -### Using Matchers in googletest Assertions - -Since matchers are basically predicates that also know how to describe -themselves, there is a way to take advantage of them in googletest assertions. -It's called `ASSERT_THAT` and `EXPECT_THAT`: - -```cpp - ASSERT_THAT(value, matcher); // Asserts that value matches matcher. - EXPECT_THAT(value, matcher); // The non-fatal version. -``` - -For example, in a googletest test you can write: - -```cpp -#include "gmock/gmock.h" - -using ::testing::AllOf; -using ::testing::Ge; -using ::testing::Le; -using ::testing::MatchesRegex; -using ::testing::StartsWith; - -... - EXPECT_THAT(Foo(), StartsWith("Hello")); - EXPECT_THAT(Bar(), MatchesRegex("Line \\d+")); - ASSERT_THAT(Baz(), AllOf(Ge(5), Le(10))); -``` - -which (as you can probably guess) executes `Foo()`, `Bar()`, and `Baz()`, and -verifies that: - -* `Foo()` returns a string that starts with `"Hello"`. -* `Bar()` returns a string that matches regular expression `"Line \\d+"`. -* `Baz()` returns a number in the range [5, 10]. - -The nice thing about these macros is that *they read like English*. They -generate informative messages too. For example, if the first `EXPECT_THAT()` -above fails, the message will be something like: - -```cpp -Value of: Foo() - Actual: "Hi, world!" -Expected: starts with "Hello" -``` - -**Credit:** The idea of `(ASSERT|EXPECT)_THAT` was borrowed from Joe Walnes' -Hamcrest project, which adds `assertThat()` to JUnit. - -### Using Predicates as Matchers - -gMock provides a [built-in set](#MatcherList) of matchers. In case you find them -lacking, you can use an arbitrary unary predicate function or functor as a -matcher - as long as the predicate accepts a value of the type you want. You do -this by wrapping the predicate inside the `Truly()` function, for example: - -```cpp -using ::testing::Truly; - -int IsEven(int n) { return (n % 2) == 0 ? 1 : 0; } -... - // Bar() must be called with an even number. - EXPECT_CALL(foo, Bar(Truly(IsEven))); -``` - -Note that the predicate function / functor doesn't have to return `bool`. It -works as long as the return value can be used as the condition in in statement -`if (condition) ...`. - - - -### Matching Arguments that Are Not Copyable - -When you do an `EXPECT_CALL(mock_obj, Foo(bar))`, gMock saves away a copy of -`bar`. When `Foo()` is called later, gMock compares the argument to `Foo()` with -the saved copy of `bar`. This way, you don't need to worry about `bar` being -modified or destroyed after the `EXPECT_CALL()` is executed. The same is true -when you use matchers like `Eq(bar)`, `Le(bar)`, and so on. - -But what if `bar` cannot be copied (i.e. has no copy constructor)? You could -define your own matcher function or callback and use it with `Truly()`, as the -previous couple of recipes have shown. Or, you may be able to get away from it -if you can guarantee that `bar` won't be changed after the `EXPECT_CALL()` is -executed. Just tell gMock that it should save a reference to `bar`, instead of a -copy of it. Here's how: - -```cpp -using ::testing::ByRef; -using ::testing::Eq; -using ::testing::Lt; -... - // Expects that Foo()'s argument == bar. - EXPECT_CALL(mock_obj, Foo(Eq(ByRef(bar)))); - - // Expects that Foo()'s argument < bar. - EXPECT_CALL(mock_obj, Foo(Lt(ByRef(bar)))); -``` - -Remember: if you do this, don't change `bar` after the `EXPECT_CALL()`, or the -result is undefined. - -### Validating a Member of an Object - -Often a mock function takes a reference to object as an argument. When matching -the argument, you may not want to compare the entire object against a fixed -object, as that may be over-specification. Instead, you may need to validate a -certain member variable or the result of a certain getter method of the object. -You can do this with `Field()` and `Property()`. More specifically, - -```cpp -Field(&Foo::bar, m) -``` - -is a matcher that matches a `Foo` object whose `bar` member variable satisfies -matcher `m`. - -```cpp -Property(&Foo::baz, m) -``` - -is a matcher that matches a `Foo` object whose `baz()` method returns a value -that satisfies matcher `m`. - -For example: - - -| Expression | Description | -| :--------------------------- | :--------------------------------------- | -| `Field(&Foo::number, Ge(3))` | Matches `x` where `x.number >= 3`. | -| `Property(&Foo::name, StartsWith("John "))` | Matches `x` where `x.name()` starts with `"John "`. | - - -Note that in `Property(&Foo::baz, ...)`, method `baz()` must take no argument -and be declared as `const`. - -BTW, `Field()` and `Property()` can also match plain pointers to objects. For -instance, - -```cpp -using ::testing::Field; -using ::testing::Ge; -... -Field(&Foo::number, Ge(3)) -``` - -matches a plain pointer `p` where `p->number >= 3`. If `p` is `NULL`, the match -will always fail regardless of the inner matcher. - -What if you want to validate more than one members at the same time? Remember -that there are [`AllOf()` and `AllOfArray()`](#CombiningMatchers). - -Finally `Field()` and `Property()` provide overloads that take the field or -property names as the first argument to include it in the error message. This -can be useful when creating combined matchers. - -```cpp -using ::testing::AllOf; -using ::testing::Field; -using ::testing::Matcher; -using ::testing::SafeMatcherCast; - -Matcher IsFoo(const Foo& foo) { - return AllOf(Field("some_field", &Foo::some_field, foo.some_field), - Field("other_field", &Foo::other_field, foo.other_field), - Field("last_field", &Foo::last_field, foo.last_field)); -} -``` - -### Validating the Value Pointed to by a Pointer Argument - -C++ functions often take pointers as arguments. You can use matchers like -`IsNull()`, `NotNull()`, and other comparison matchers to match a pointer, but -what if you want to make sure the value *pointed to* by the pointer, instead of -the pointer itself, has a certain property? Well, you can use the `Pointee(m)` -matcher. - -`Pointee(m)` matches a pointer if and only if `m` matches the value the pointer -points to. For example: - -```cpp -using ::testing::Ge; -using ::testing::Pointee; -... - EXPECT_CALL(foo, Bar(Pointee(Ge(3)))); -``` - -expects `foo.Bar()` to be called with a pointer that points to a value greater -than or equal to 3. - -One nice thing about `Pointee()` is that it treats a `NULL` pointer as a match -failure, so you can write `Pointee(m)` instead of - -```cpp -using ::testing::AllOf; -using ::testing::NotNull; -using ::testing::Pointee; -... - AllOf(NotNull(), Pointee(m)) -``` - -without worrying that a `NULL` pointer will crash your test. - -Also, did we tell you that `Pointee()` works with both raw pointers **and** -smart pointers (`std::unique_ptr`, `std::shared_ptr`, etc)? - -What if you have a pointer to pointer? You guessed it - you can use nested -`Pointee()` to probe deeper inside the value. For example, -`Pointee(Pointee(Lt(3)))` matches a pointer that points to a pointer that points -to a number less than 3 (what a mouthful...). - -### Testing a Certain Property of an Object - -Sometimes you want to specify that an object argument has a certain property, -but there is no existing matcher that does this. If you want good error -messages, you should [define a matcher](#NewMatchers). If you want to do it -quick and dirty, you could get away with writing an ordinary function. - -Let's say you have a mock function that takes an object of type `Foo`, which has -an `int bar()` method and an `int baz()` method, and you want to constrain that -the argument's `bar()` value plus its `baz()` value is a given number. Here's -how you can define a matcher to do it: - -```cpp -using ::testing::Matcher; -using ::testing::MatcherInterface; -using ::testing::MatchResultListener; - -class BarPlusBazEqMatcher : public MatcherInterface { - public: - explicit BarPlusBazEqMatcher(int expected_sum) - : expected_sum_(expected_sum) {} - - bool MatchAndExplain(const Foo& foo, - MatchResultListener* /* listener */) const override { - return (foo.bar() + foo.baz()) == expected_sum_; - } - - void DescribeTo(::std::ostream* os) const override { - *os << "bar() + baz() equals " << expected_sum_; - } - - void DescribeNegationTo(::std::ostream* os) const override { - *os << "bar() + baz() does not equal " << expected_sum_; - } - private: - const int expected_sum_; -}; - -Matcher BarPlusBazEq(int expected_sum) { - return MakeMatcher(new BarPlusBazEqMatcher(expected_sum)); -} - -... - EXPECT_CALL(..., DoThis(BarPlusBazEq(5)))...; -``` - -### Matching Containers - -Sometimes an STL container (e.g. list, vector, map, ...) is passed to a mock -function and you may want to validate it. Since most STL containers support the -`==` operator, you can write `Eq(expected_container)` or simply -`expected_container` to match a container exactly. - -Sometimes, though, you may want to be more flexible (for example, the first -element must be an exact match, but the second element can be any positive -number, and so on). Also, containers used in tests often have a small number of -elements, and having to define the expected container out-of-line is a bit of a -hassle. - -You can use the `ElementsAre()` or `UnorderedElementsAre()` matcher in such -cases: - -```cpp -using ::testing::_; -using ::testing::ElementsAre; -using ::testing::Gt; -... - MOCK_METHOD(void, Foo, (const vector& numbers), (override)); -... - EXPECT_CALL(mock, Foo(ElementsAre(1, Gt(0), _, 5))); -``` - -The above matcher says that the container must have 4 elements, which must be 1, -greater than 0, anything, and 5 respectively. - -If you instead write: - -```cpp -using ::testing::_; -using ::testing::Gt; -using ::testing::UnorderedElementsAre; -... - MOCK_METHOD(void, Foo, (const vector& numbers), (override)); -... - EXPECT_CALL(mock, Foo(UnorderedElementsAre(1, Gt(0), _, 5))); -``` - -It means that the container must have 4 elements, which (under some permutation) -must be 1, greater than 0, anything, and 5 respectively. - -As an alternative you can place the arguments in a C-style array and use -`ElementsAreArray()` or `UnorderedElementsAreArray()` instead: - -```cpp -using ::testing::ElementsAreArray; -... - // ElementsAreArray accepts an array of element values. - const int expected_vector1[] = {1, 5, 2, 4, ...}; - EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector1))); - - // Or, an array of element matchers. - Matcher expected_vector2[] = {1, Gt(2), _, 3, ...}; - EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector2))); -``` - -In case the array needs to be dynamically created (and therefore the array size -cannot be inferred by the compiler), you can give `ElementsAreArray()` an -additional argument to specify the array size: - -```cpp -using ::testing::ElementsAreArray; -... - int* const expected_vector3 = new int[count]; - ... fill expected_vector3 with values ... - EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector3, count))); -``` - -Use `Pair` when comparing maps or other associative containers. - -```cpp -using testing::ElementsAre; -using testing::Pair; -... - std::map m = {{"a", 1}, {"b", 2}, {"c", 3}}; - EXPECT_THAT(m, ElementsAre(Pair("a", 1), Pair("b", 2), Pair("c", 3))); -``` - -**Tips:** - -* `ElementsAre*()` can be used to match *any* container that implements the - STL iterator pattern (i.e. it has a `const_iterator` type and supports - `begin()/end()`), not just the ones defined in STL. It will even work with - container types yet to be written - as long as they follows the above - pattern. -* You can use nested `ElementsAre*()` to match nested (multi-dimensional) - containers. -* If the container is passed by pointer instead of by reference, just write - `Pointee(ElementsAre*(...))`. -* The order of elements *matters* for `ElementsAre*()`. If you are using it - with containers whose element order are undefined (e.g. `hash_map`) you - should use `WhenSorted` around `ElementsAre`. - -### Sharing Matchers - -Under the hood, a gMock matcher object consists of a pointer to a ref-counted -implementation object. Copying matchers is allowed and very efficient, as only -the pointer is copied. When the last matcher that references the implementation -object dies, the implementation object will be deleted. - -Therefore, if you have some complex matcher that you want to use again and -again, there is no need to build it everytime. Just assign it to a matcher -variable and use that variable repeatedly! For example, - -```cpp -using ::testing::AllOf; -using ::testing::Gt; -using ::testing::Le; -using ::testing::Matcher; -... - Matcher in_range = AllOf(Gt(5), Le(10)); - ... use in_range as a matcher in multiple EXPECT_CALLs ... -``` - -### Matchers must have no side-effects {#PureMatchers} - -WARNING: gMock does not guarantee when or how many times a matcher will be -invoked. Therefore, all matchers must be *purely functional*: they cannot have -any side effects, and the match result must not depend on anything other than -the matcher's parameters and the value being matched. - -This requirement must be satisfied no matter how a matcher is defined (e.g., if -it is one of the standard matchers, or a custom matcher). In particular, a -matcher can never call a mock function, as that will affect the state of the -mock object and gMock. - -## Setting Expectations - -### Knowing When to Expect {#UseOnCall} - - - -**`ON_CALL`** is likely the *single most under-utilized construct* in gMock. - -There are basically two constructs for defining the behavior of a mock object: -`ON_CALL` and `EXPECT_CALL`. The difference? `ON_CALL` defines what happens when -a mock method is called, but doesn't imply any expectation on the method -being called. `EXPECT_CALL` not only defines the behavior, but also sets an -expectation that the method will be called with the given arguments, for the -given number of times (and *in the given order* when you specify the order -too). - -Since `EXPECT_CALL` does more, isn't it better than `ON_CALL`? Not really. Every -`EXPECT_CALL` adds a constraint on the behavior of the code under test. Having -more constraints than necessary is *baaad* - even worse than not having enough -constraints. - -This may be counter-intuitive. How could tests that verify more be worse than -tests that verify less? Isn't verification the whole point of tests? - -The answer lies in *what* a test should verify. **A good test verifies the -contract of the code.** If a test over-specifies, it doesn't leave enough -freedom to the implementation. As a result, changing the implementation without -breaking the contract (e.g. refactoring and optimization), which should be -perfectly fine to do, can break such tests. Then you have to spend time fixing -them, only to see them broken again the next time the implementation is changed. - -Keep in mind that one doesn't have to verify more than one property in one test. -In fact, **it's a good style to verify only one thing in one test.** If you do -that, a bug will likely break only one or two tests instead of dozens (which -case would you rather debug?). If you are also in the habit of giving tests -descriptive names that tell what they verify, you can often easily guess what's -wrong just from the test log itself. - -So use `ON_CALL` by default, and only use `EXPECT_CALL` when you actually intend -to verify that the call is made. For example, you may have a bunch of `ON_CALL`s -in your test fixture to set the common mock behavior shared by all tests in the -same group, and write (scarcely) different `EXPECT_CALL`s in different `TEST_F`s -to verify different aspects of the code's behavior. Compared with the style -where each `TEST` has many `EXPECT_CALL`s, this leads to tests that are more -resilient to implementational changes (and thus less likely to require -maintenance) and makes the intent of the tests more obvious (so they are easier -to maintain when you do need to maintain them). - -If you are bothered by the "Uninteresting mock function call" message printed -when a mock method without an `EXPECT_CALL` is called, you may use a `NiceMock` -instead to suppress all such messages for the mock object, or suppress the -message for specific methods by adding `EXPECT_CALL(...).Times(AnyNumber())`. DO -NOT suppress it by blindly adding an `EXPECT_CALL(...)`, or you'll have a test -that's a pain to maintain. - -### Ignoring Uninteresting Calls - -If you are not interested in how a mock method is called, just don't say -anything about it. In this case, if the method is ever called, gMock will -perform its default action to allow the test program to continue. If you are not -happy with the default action taken by gMock, you can override it using -`DefaultValue::Set()` (described [here](#DefaultValue)) or `ON_CALL()`. - -Please note that once you expressed interest in a particular mock method (via -`EXPECT_CALL()`), all invocations to it must match some expectation. If this -function is called but the arguments don't match any `EXPECT_CALL()` statement, -it will be an error. - -### Disallowing Unexpected Calls - -If a mock method shouldn't be called at all, explicitly say so: - -```cpp -using ::testing::_; -... - EXPECT_CALL(foo, Bar(_)) - .Times(0); -``` - -If some calls to the method are allowed, but the rest are not, just list all the -expected calls: - -```cpp -using ::testing::AnyNumber; -using ::testing::Gt; -... - EXPECT_CALL(foo, Bar(5)); - EXPECT_CALL(foo, Bar(Gt(10))) - .Times(AnyNumber()); -``` - -A call to `foo.Bar()` that doesn't match any of the `EXPECT_CALL()` statements -will be an error. - -### Understanding Uninteresting vs Unexpected Calls {#uninteresting-vs-unexpected} - -*Uninteresting* calls and *unexpected* calls are different concepts in gMock. -*Very* different. - -A call `x.Y(...)` is **uninteresting** if there's *not even a single* -`EXPECT_CALL(x, Y(...))` set. In other words, the test isn't interested in the -`x.Y()` method at all, as evident in that the test doesn't care to say anything -about it. - -A call `x.Y(...)` is **unexpected** if there are *some* `EXPECT_CALL(x, -Y(...))`s set, but none of them matches the call. Put another way, the test is -interested in the `x.Y()` method (therefore it explicitly sets some -`EXPECT_CALL` to verify how it's called); however, the verification fails as the -test doesn't expect this particular call to happen. - -**An unexpected call is always an error,** as the code under test doesn't behave -the way the test expects it to behave. - -**By default, an uninteresting call is not an error,** as it violates no -constraint specified by the test. (gMock's philosophy is that saying nothing -means there is no constraint.) However, it leads to a warning, as it *might* -indicate a problem (e.g. the test author might have forgotten to specify a -constraint). - -In gMock, `NiceMock` and `StrictMock` can be used to make a mock class "nice" or -"strict". How does this affect uninteresting calls and unexpected calls? - -A **nice mock** suppresses uninteresting call *warnings*. It is less chatty than -the default mock, but otherwise is the same. If a test fails with a default -mock, it will also fail using a nice mock instead. And vice versa. Don't expect -making a mock nice to change the test's result. - -A **strict mock** turns uninteresting call warnings into errors. So making a -mock strict may change the test's result. - -Let's look at an example: - -```cpp -TEST(...) { - NiceMock mock_registry; - EXPECT_CALL(mock_registry, GetDomainOwner("google.com")) - .WillRepeatedly(Return("Larry Page")); - - // Use mock_registry in code under test. - ... &mock_registry ... -} -``` - -The sole `EXPECT_CALL` here says that all calls to `GetDomainOwner()` must have -`"google.com"` as the argument. If `GetDomainOwner("yahoo.com")` is called, it -will be an unexpected call, and thus an error. *Having a nice mock doesn't -change the severity of an unexpected call.* - -So how do we tell gMock that `GetDomainOwner()` can be called with some other -arguments as well? The standard technique is to add a "catch all" `EXPECT_CALL`: - -```cpp - EXPECT_CALL(mock_registry, GetDomainOwner(_)) - .Times(AnyNumber()); // catches all other calls to this method. - EXPECT_CALL(mock_registry, GetDomainOwner("google.com")) - .WillRepeatedly(Return("Larry Page")); -``` - -Remember that `_` is the wildcard matcher that matches anything. With this, if -`GetDomainOwner("google.com")` is called, it will do what the second -`EXPECT_CALL` says; if it is called with a different argument, it will do what -the first `EXPECT_CALL` says. - -Note that the order of the two `EXPECT_CALL`s is important, as a newer -`EXPECT_CALL` takes precedence over an older one. - -For more on uninteresting calls, nice mocks, and strict mocks, read -["The Nice, the Strict, and the Naggy"](#NiceStrictNaggy). - -### Ignoring Uninteresting Arguments {#ParameterlessExpectations} - -If your test doesn't care about the parameters (it only cares about the number -or order of calls), you can often simply omit the parameter list: - -```cpp - // Expect foo.Bar( ... ) twice with any arguments. - EXPECT_CALL(foo, Bar).Times(2); - - // Delegate to the given method whenever the factory is invoked. - ON_CALL(foo_factory, MakeFoo) - .WillByDefault(&BuildFooForTest); -``` - -This functionality is only available when a method is not overloaded; to prevent -unexpected behavior it is a compilation error to try to set an expectation on a -method where the specific overload is ambiguous. You can work around this by -supplying a [simpler mock interface](#SimplerInterfaces) than the mocked class -provides. - -This pattern is also useful when the arguments are interesting, but match logic -is substantially complex. You can leave the argument list unspecified and use -SaveArg actions to [save the values for later verification](#SaveArgVerify). If -you do that, you can easily differentiate calling the method the wrong number of -times from calling it with the wrong arguments. - -### Expecting Ordered Calls {#OrderedCalls} - -Although an `EXPECT_CALL()` statement defined earlier takes precedence when -gMock tries to match a function call with an expectation, by default calls don't -have to happen in the order `EXPECT_CALL()` statements are written. For example, -if the arguments match the matchers in the third `EXPECT_CALL()`, but not those -in the first two, then the third expectation will be used. - -If you would rather have all calls occur in the order of the expectations, put -the `EXPECT_CALL()` statements in a block where you define a variable of type -`InSequence`: - -```cpp -using ::testing::_; -using ::testing::InSequence; - - { - InSequence s; - - EXPECT_CALL(foo, DoThis(5)); - EXPECT_CALL(bar, DoThat(_)) - .Times(2); - EXPECT_CALL(foo, DoThis(6)); - } -``` - -In this example, we expect a call to `foo.DoThis(5)`, followed by two calls to -`bar.DoThat()` where the argument can be anything, which are in turn followed by -a call to `foo.DoThis(6)`. If a call occurred out-of-order, gMock will report an -error. - -### Expecting Partially Ordered Calls {#PartialOrder} - -Sometimes requiring everything to occur in a predetermined order can lead to -brittle tests. For example, we may care about `A` occurring before both `B` and -`C`, but aren't interested in the relative order of `B` and `C`. In this case, -the test should reflect our real intent, instead of being overly constraining. - -gMock allows you to impose an arbitrary DAG (directed acyclic graph) on the -calls. One way to express the DAG is to use the [After](#AfterClause) clause of -`EXPECT_CALL`. - -Another way is via the `InSequence()` clause (not the same as the `InSequence` -class), which we borrowed from jMock 2. It's less flexible than `After()`, but -more convenient when you have long chains of sequential calls, as it doesn't -require you to come up with different names for the expectations in the chains. -Here's how it works: - -If we view `EXPECT_CALL()` statements as nodes in a graph, and add an edge from -node A to node B wherever A must occur before B, we can get a DAG. We use the -term "sequence" to mean a directed path in this DAG. Now, if we decompose the -DAG into sequences, we just need to know which sequences each `EXPECT_CALL()` -belongs to in order to be able to reconstruct the original DAG. - -So, to specify the partial order on the expectations we need to do two things: -first to define some `Sequence` objects, and then for each `EXPECT_CALL()` say -which `Sequence` objects it is part of. - -Expectations in the same sequence must occur in the order they are written. For -example, - -```cpp -using ::testing::Sequence; -... - Sequence s1, s2; - - EXPECT_CALL(foo, A()) - .InSequence(s1, s2); - EXPECT_CALL(bar, B()) - .InSequence(s1); - EXPECT_CALL(bar, C()) - .InSequence(s2); - EXPECT_CALL(foo, D()) - .InSequence(s2); -``` - -specifies the following DAG (where `s1` is `A -> B`, and `s2` is `A -> C -> D`): - -```text - +---> B - | - A ---| - | - +---> C ---> D -``` - -This means that A must occur before B and C, and C must occur before D. There's -no restriction about the order other than these. - -### Controlling When an Expectation Retires - -When a mock method is called, gMock only considers expectations that are still -active. An expectation is active when created, and becomes inactive (aka -*retires*) when a call that has to occur later has occurred. For example, in - -```cpp -using ::testing::_; -using ::testing::Sequence; -... - Sequence s1, s2; - - EXPECT_CALL(log, Log(WARNING, _, "File too large.")) // #1 - .Times(AnyNumber()) - .InSequence(s1, s2); - EXPECT_CALL(log, Log(WARNING, _, "Data set is empty.")) // #2 - .InSequence(s1); - EXPECT_CALL(log, Log(WARNING, _, "User not found.")) // #3 - .InSequence(s2); -``` - -as soon as either #2 or #3 is matched, #1 will retire. If a warning `"File too -large."` is logged after this, it will be an error. - -Note that an expectation doesn't retire automatically when it's saturated. For -example, - -```cpp -using ::testing::_; -... - EXPECT_CALL(log, Log(WARNING, _, _)); // #1 - EXPECT_CALL(log, Log(WARNING, _, "File too large.")); // #2 -``` - -says that there will be exactly one warning with the message `"File too -large."`. If the second warning contains this message too, #2 will match again -and result in an upper-bound-violated error. - -If this is not what you want, you can ask an expectation to retire as soon as it -becomes saturated: - -```cpp -using ::testing::_; -... - EXPECT_CALL(log, Log(WARNING, _, _)); // #1 - EXPECT_CALL(log, Log(WARNING, _, "File too large.")) // #2 - .RetiresOnSaturation(); -``` - -Here #2 can be used only once, so if you have two warnings with the message -`"File too large."`, the first will match #2 and the second will match #1 - -there will be no error. - -## Using Actions - -### Returning References from Mock Methods - -If a mock function's return type is a reference, you need to use `ReturnRef()` -instead of `Return()` to return a result: - -```cpp -using ::testing::ReturnRef; - -class MockFoo : public Foo { - public: - MOCK_METHOD(Bar&, GetBar, (), (override)); -}; -... - MockFoo foo; - Bar bar; - EXPECT_CALL(foo, GetBar()) - .WillOnce(ReturnRef(bar)); -... -``` - -### Returning Live Values from Mock Methods - -The `Return(x)` action saves a copy of `x` when the action is created, and -always returns the same value whenever it's executed. Sometimes you may want to -instead return the *live* value of `x` (i.e. its value at the time when the -action is *executed*.). Use either `ReturnRef()` or `ReturnPointee()` for this -purpose. - -If the mock function's return type is a reference, you can do it using -`ReturnRef(x)`, as shown in the previous recipe ("Returning References from Mock -Methods"). However, gMock doesn't let you use `ReturnRef()` in a mock function -whose return type is not a reference, as doing that usually indicates a user -error. So, what shall you do? - -Though you may be tempted, DO NOT use `ByRef()`: - -```cpp -using testing::ByRef; -using testing::Return; - -class MockFoo : public Foo { - public: - MOCK_METHOD(int, GetValue, (), (override)); -}; -... - int x = 0; - MockFoo foo; - EXPECT_CALL(foo, GetValue()) - .WillRepeatedly(Return(ByRef(x))); // Wrong! - x = 42; - EXPECT_EQ(42, foo.GetValue()); -``` - -Unfortunately, it doesn't work here. The above code will fail with error: - -```text -Value of: foo.GetValue() - Actual: 0 -Expected: 42 -``` - -The reason is that `Return(*value*)` converts `value` to the actual return type -of the mock function at the time when the action is *created*, not when it is -*executed*. (This behavior was chosen for the action to be safe when `value` is -a proxy object that references some temporary objects.) As a result, `ByRef(x)` -is converted to an `int` value (instead of a `const int&`) when the expectation -is set, and `Return(ByRef(x))` will always return 0. - -`ReturnPointee(pointer)` was provided to solve this problem specifically. It -returns the value pointed to by `pointer` at the time the action is *executed*: - -```cpp -using testing::ReturnPointee; -... - int x = 0; - MockFoo foo; - EXPECT_CALL(foo, GetValue()) - .WillRepeatedly(ReturnPointee(&x)); // Note the & here. - x = 42; - EXPECT_EQ(42, foo.GetValue()); // This will succeed now. -``` - -### Combining Actions - -Want to do more than one thing when a function is called? That's fine. `DoAll()` -allow you to do sequence of actions every time. Only the return value of the -last action in the sequence will be used. - -```cpp -using ::testing::_; -using ::testing::DoAll; - -class MockFoo : public Foo { - public: - MOCK_METHOD(bool, Bar, (int n), (override)); -}; -... - EXPECT_CALL(foo, Bar(_)) - .WillOnce(DoAll(action_1, - action_2, - ... - action_n)); -``` - -### Verifying Complex Arguments {#SaveArgVerify} - -If you want to verify that a method is called with a particular argument but the -match criteria is complex, it can be difficult to distinguish between -cardinality failures (calling the method the wrong number of times) and argument -match failures. Similarly, if you are matching multiple parameters, it may not -be easy to distinguishing which argument failed to match. For example: - -```cpp - // Not ideal: this could fail because of a problem with arg1 or arg2, or maybe - // just the method wasn't called. - EXPECT_CALL(foo, SendValues(_, ElementsAre(1, 4, 4, 7), EqualsProto( ... ))); -``` - -You can instead save the arguments and test them individually: - -```cpp - EXPECT_CALL(foo, SendValues) - .WillOnce(DoAll(SaveArg<1>(&actual_array), SaveArg<2>(&actual_proto))); - ... run the test - EXPECT_THAT(actual_array, ElementsAre(1, 4, 4, 7)); - EXPECT_THAT(actual_proto, EqualsProto( ... )); -``` - -### Mocking Side Effects {#MockingSideEffects} - -Sometimes a method exhibits its effect not via returning a value but via side -effects. For example, it may change some global state or modify an output -argument. To mock side effects, in general you can define your own action by -implementing `::testing::ActionInterface`. - -If all you need to do is to change an output argument, the built-in -`SetArgPointee()` action is convenient: - -```cpp -using ::testing::_; -using ::testing::SetArgPointee; - -class MockMutator : public Mutator { - public: - MOCK_METHOD(void, Mutate, (bool mutate, int* value), (override)); - ... -} -... - MockMutator mutator; - EXPECT_CALL(mutator, Mutate(true, _)) - .WillOnce(SetArgPointee<1>(5)); -``` - -In this example, when `mutator.Mutate()` is called, we will assign 5 to the -`int` variable pointed to by argument #1 (0-based). - -`SetArgPointee()` conveniently makes an internal copy of the value you pass to -it, removing the need to keep the value in scope and alive. The implication -however is that the value must have a copy constructor and assignment operator. - -If the mock method also needs to return a value as well, you can chain -`SetArgPointee()` with `Return()` using `DoAll()`, remembering to put the -`Return()` statement last: - -```cpp -using ::testing::_; -using ::testing::Return; -using ::testing::SetArgPointee; - -class MockMutator : public Mutator { - public: - ... - MOCK_METHOD(bool, MutateInt, (int* value), (override)); -} -... - MockMutator mutator; - EXPECT_CALL(mutator, MutateInt(_)) - .WillOnce(DoAll(SetArgPointee<0>(5), - Return(true))); -``` - -Note, however, that if you use the `ReturnOKWith()` method, it will override the -values provided by `SetArgPointee()` in the response parameters of your function -call. - -If the output argument is an array, use the `SetArrayArgument(first, last)` -action instead. It copies the elements in source range `[first, last)` to the -array pointed to by the `N`-th (0-based) argument: - -```cpp -using ::testing::NotNull; -using ::testing::SetArrayArgument; - -class MockArrayMutator : public ArrayMutator { - public: - MOCK_METHOD(void, Mutate, (int* values, int num_values), (override)); - ... -} -... - MockArrayMutator mutator; - int values[5] = {1, 2, 3, 4, 5}; - EXPECT_CALL(mutator, Mutate(NotNull(), 5)) - .WillOnce(SetArrayArgument<0>(values, values + 5)); -``` - -This also works when the argument is an output iterator: - -```cpp -using ::testing::_; -using ::testing::SetArrayArgument; - -class MockRolodex : public Rolodex { - public: - MOCK_METHOD(void, GetNames, (std::back_insert_iterator>), - (override)); - ... -} -... - MockRolodex rolodex; - vector names; - names.push_back("George"); - names.push_back("John"); - names.push_back("Thomas"); - EXPECT_CALL(rolodex, GetNames(_)) - .WillOnce(SetArrayArgument<0>(names.begin(), names.end())); -``` - -### Changing a Mock Object's Behavior Based on the State - -If you expect a call to change the behavior of a mock object, you can use -`::testing::InSequence` to specify different behaviors before and after the -call: - -```cpp -using ::testing::InSequence; -using ::testing::Return; - -... - { - InSequence seq; - EXPECT_CALL(my_mock, IsDirty()) - .WillRepeatedly(Return(true)); - EXPECT_CALL(my_mock, Flush()); - EXPECT_CALL(my_mock, IsDirty()) - .WillRepeatedly(Return(false)); - } - my_mock.FlushIfDirty(); -``` - -This makes `my_mock.IsDirty()` return `true` before `my_mock.Flush()` is called -and return `false` afterwards. - -If the behavior change is more complex, you can store the effects in a variable -and make a mock method get its return value from that variable: - -```cpp -using ::testing::_; -using ::testing::SaveArg; -using ::testing::Return; - -ACTION_P(ReturnPointee, p) { return *p; } -... - int previous_value = 0; - EXPECT_CALL(my_mock, GetPrevValue) - .WillRepeatedly(ReturnPointee(&previous_value)); - EXPECT_CALL(my_mock, UpdateValue) - .WillRepeatedly(SaveArg<0>(&previous_value)); - my_mock.DoSomethingToUpdateValue(); -``` - -Here `my_mock.GetPrevValue()` will always return the argument of the last -`UpdateValue()` call. - -### Setting the Default Value for a Return Type {#DefaultValue} - -If a mock method's return type is a built-in C++ type or pointer, by default it -will return 0 when invoked. Also, in C++ 11 and above, a mock method whose -return type has a default constructor will return a default-constructed value by -default. You only need to specify an action if this default value doesn't work -for you. - -Sometimes, you may want to change this default value, or you may want to specify -a default value for types gMock doesn't know about. You can do this using the -`::testing::DefaultValue` class template: - -```cpp -using ::testing::DefaultValue; - -class MockFoo : public Foo { - public: - MOCK_METHOD(Bar, CalculateBar, (), (override)); -}; - - -... - Bar default_bar; - // Sets the default return value for type Bar. - DefaultValue::Set(default_bar); - - MockFoo foo; - - // We don't need to specify an action here, as the default - // return value works for us. - EXPECT_CALL(foo, CalculateBar()); - - foo.CalculateBar(); // This should return default_bar. - - // Unsets the default return value. - DefaultValue::Clear(); -``` - -Please note that changing the default value for a type can make you tests hard -to understand. We recommend you to use this feature judiciously. For example, -you may want to make sure the `Set()` and `Clear()` calls are right next to the -code that uses your mock. - -### Setting the Default Actions for a Mock Method - -You've learned how to change the default value of a given type. However, this -may be too coarse for your purpose: perhaps you have two mock methods with the -same return type and you want them to have different behaviors. The `ON_CALL()` -macro allows you to customize your mock's behavior at the method level: - -```cpp -using ::testing::_; -using ::testing::AnyNumber; -using ::testing::Gt; -using ::testing::Return; -... - ON_CALL(foo, Sign(_)) - .WillByDefault(Return(-1)); - ON_CALL(foo, Sign(0)) - .WillByDefault(Return(0)); - ON_CALL(foo, Sign(Gt(0))) - .WillByDefault(Return(1)); - - EXPECT_CALL(foo, Sign(_)) - .Times(AnyNumber()); - - foo.Sign(5); // This should return 1. - foo.Sign(-9); // This should return -1. - foo.Sign(0); // This should return 0. -``` - -As you may have guessed, when there are more than one `ON_CALL()` statements, -the newer ones in the order take precedence over the older ones. In other words, -the **last** one that matches the function arguments will be used. This matching -order allows you to set up the common behavior in a mock object's constructor or -the test fixture's set-up phase and specialize the mock's behavior later. - -Note that both `ON_CALL` and `EXPECT_CALL` have the same "later statements take -precedence" rule, but they don't interact. That is, `EXPECT_CALL`s have their -own precedence order distinct from the `ON_CALL` precedence order. - -### Using Functions/Methods/Functors/Lambdas as Actions {#FunctionsAsActions} - -If the built-in actions don't suit you, you can use an existing callable -(function, `std::function`, method, functor, lambda as an action. - - - -```cpp -using ::testing::_; using ::testing::Invoke; - -class MockFoo : public Foo { - public: - MOCK_METHOD(int, Sum, (int x, int y), (override)); - MOCK_METHOD(bool, ComplexJob, (int x), (override)); -}; - -int CalculateSum(int x, int y) { return x + y; } -int Sum3(int x, int y, int z) { return x + y + z; } - -class Helper { - public: - bool ComplexJob(int x); -}; - -... - MockFoo foo; - Helper helper; - EXPECT_CALL(foo, Sum(_, _)) - .WillOnce(&CalculateSum) - .WillRepeatedly(Invoke(NewPermanentCallback(Sum3, 1))); - EXPECT_CALL(foo, ComplexJob(_)) - .WillOnce(Invoke(&helper, &Helper::ComplexJob)); - .WillRepeatedly([](int x) { return x > 0; }); - - foo.Sum(5, 6); // Invokes CalculateSum(5, 6). - foo.Sum(2, 3); // Invokes Sum3(1, 2, 3). - foo.ComplexJob(10); // Invokes helper.ComplexJob(10). - foo.ComplexJob(-1); // Invokes the inline lambda. -``` - -The only requirement is that the type of the function, etc must be *compatible* -with the signature of the mock function, meaning that the latter's arguments can -be implicitly converted to the corresponding arguments of the former, and the -former's return type can be implicitly converted to that of the latter. So, you -can invoke something whose type is *not* exactly the same as the mock function, -as long as it's safe to do so - nice, huh? - -**`Note:`{.escaped}** - -* The action takes ownership of the callback and will delete it when the - action itself is destructed. -* If the type of a callback is derived from a base callback type `C`, you need - to implicitly cast it to `C` to resolve the overloading, e.g. - - ```cpp - using ::testing::Invoke; - ... - ResultCallback* is_ok = ...; - ... Invoke(is_ok) ...; // This works. - - BlockingClosure* done = new BlockingClosure; - ... Invoke(implicit_cast(done)) ...; // The cast is necessary. - ``` - -### Using Functions with Extra Info as Actions - -The function or functor you call using `Invoke()` must have the same number of -arguments as the mock function you use it for. Sometimes you may have a function -that takes more arguments, and you are willing to pass in the extra arguments -yourself to fill the gap. You can do this in gMock using callbacks with -pre-bound arguments. Here's an example: - -```cpp -using ::testing::Invoke; - -class MockFoo : public Foo { - public: - MOCK_METHOD(char, DoThis, (int n), (override)); -}; - -char SignOfSum(int x, int y) { - const int sum = x + y; - return (sum > 0) ? '+' : (sum < 0) ? '-' : '0'; -} - -TEST_F(FooTest, Test) { - MockFoo foo; - - EXPECT_CALL(foo, DoThis(2)) - .WillOnce(Invoke(NewPermanentCallback(SignOfSum, 5))); - EXPECT_EQ('+', foo.DoThis(2)); // Invokes SignOfSum(5, 2). -} -``` - -### Invoking a Function/Method/Functor/Lambda/Callback Without Arguments - -`Invoke()` is very useful for doing actions that are more complex. It passes the -mock function's arguments to the function, etc being invoked such that the -callee has the full context of the call to work with. If the invoked function is -not interested in some or all of the arguments, it can simply ignore them. - -Yet, a common pattern is that a test author wants to invoke a function without -the arguments of the mock function. `Invoke()` allows her to do that using a -wrapper function that throws away the arguments before invoking an underlining -nullary function. Needless to say, this can be tedious and obscures the intent -of the test. - -`InvokeWithoutArgs()` solves this problem. It's like `Invoke()` except that it -doesn't pass the mock function's arguments to the callee. Here's an example: - -```cpp -using ::testing::_; -using ::testing::InvokeWithoutArgs; - -class MockFoo : public Foo { - public: - MOCK_METHOD(bool, ComplexJob, (int n), (override)); -}; - -bool Job1() { ... } -bool Job2(int n, char c) { ... } - -... - MockFoo foo; - EXPECT_CALL(foo, ComplexJob(_)) - .WillOnce(InvokeWithoutArgs(Job1)) - .WillOnce(InvokeWithoutArgs(NewPermanentCallback(Job2, 5, 'a'))); - - foo.ComplexJob(10); // Invokes Job1(). - foo.ComplexJob(20); // Invokes Job2(5, 'a'). -``` - -**`Note:`{.escaped}** - -* The action takes ownership of the callback and will delete it when the - action itself is destructed. -* If the type of a callback is derived from a base callback type `C`, you need - to implicitly cast it to `C` to resolve the overloading, e.g. - - ```cpp - using ::testing::InvokeWithoutArgs; - ... - ResultCallback* is_ok = ...; - ... InvokeWithoutArgs(is_ok) ...; // This works. - - BlockingClosure* done = ...; - ... InvokeWithoutArgs(implicit_cast(done)) ...; - // The cast is necessary. - ``` - -### Invoking an Argument of the Mock Function - -Sometimes a mock function will receive a function pointer, a functor (in other -words, a "callable") as an argument, e.g. - -```cpp -class MockFoo : public Foo { - public: - MOCK_METHOD(bool, DoThis, (int n, (ResultCallback1* callback)), - (override)); -}; -``` - -and you may want to invoke this callable argument: - -```cpp -using ::testing::_; -... - MockFoo foo; - EXPECT_CALL(foo, DoThis(_, _)) - .WillOnce(...); - // Will execute callback->Run(5), where callback is the - // second argument DoThis() receives. -``` - -NOTE: The section below is legacy documentation from before C++ had lambdas: - -Arghh, you need to refer to a mock function argument but C++ has no lambda -(yet), so you have to define your own action. :-( Or do you really? - -Well, gMock has an action to solve *exactly* this problem: - -```cpp -InvokeArgument(arg_1, arg_2, ..., arg_m) -``` - -will invoke the `N`-th (0-based) argument the mock function receives, with -`arg_1`, `arg_2`, ..., and `arg_m`. No matter if the argument is a function -pointer, a functor, or a callback. gMock handles them all. - -With that, you could write: - -```cpp -using ::testing::_; -using ::testing::InvokeArgument; -... - EXPECT_CALL(foo, DoThis(_, _)) - .WillOnce(InvokeArgument<1>(5)); - // Will execute callback->Run(5), where callback is the - // second argument DoThis() receives. -``` - -What if the callable takes an argument by reference? No problem - just wrap it -inside `ByRef()`: - -```cpp - ... - MOCK_METHOD(bool, Bar, - ((ResultCallback2* callback)), - (override)); - ... - using ::testing::_; - using ::testing::ByRef; - using ::testing::InvokeArgument; - ... - MockFoo foo; - Helper helper; - ... - EXPECT_CALL(foo, Bar(_)) - .WillOnce(InvokeArgument<0>(5, ByRef(helper))); - // ByRef(helper) guarantees that a reference to helper, not a copy of it, - // will be passed to the callback. -``` - -What if the callable takes an argument by reference and we do **not** wrap the -argument in `ByRef()`? Then `InvokeArgument()` will *make a copy* of the -argument, and pass a *reference to the copy*, instead of a reference to the -original value, to the callable. This is especially handy when the argument is a -temporary value: - -```cpp - ... - MOCK_METHOD(bool, DoThat, (bool (*f)(const double& x, const string& s)), - (override)); - ... - using ::testing::_; - using ::testing::InvokeArgument; - ... - MockFoo foo; - ... - EXPECT_CALL(foo, DoThat(_)) - .WillOnce(InvokeArgument<0>(5.0, string("Hi"))); - // Will execute (*f)(5.0, string("Hi")), where f is the function pointer - // DoThat() receives. Note that the values 5.0 and string("Hi") are - // temporary and dead once the EXPECT_CALL() statement finishes. Yet - // it's fine to perform this action later, since a copy of the values - // are kept inside the InvokeArgument action. -``` - -### Ignoring an Action's Result - -Sometimes you have an action that returns *something*, but you need an action -that returns `void` (perhaps you want to use it in a mock function that returns -`void`, or perhaps it needs to be used in `DoAll()` and it's not the last in the -list). `IgnoreResult()` lets you do that. For example: - -```cpp -using ::testing::_; -using ::testing::DoAll; -using ::testing::IgnoreResult; -using ::testing::Return; - -int Process(const MyData& data); -string DoSomething(); - -class MockFoo : public Foo { - public: - MOCK_METHOD(void, Abc, (const MyData& data), (override)); - MOCK_METHOD(bool, Xyz, (), (override)); -}; - - ... - MockFoo foo; - EXPECT_CALL(foo, Abc(_)) - // .WillOnce(Invoke(Process)); - // The above line won't compile as Process() returns int but Abc() needs - // to return void. - .WillOnce(IgnoreResult(Process)); - EXPECT_CALL(foo, Xyz()) - .WillOnce(DoAll(IgnoreResult(DoSomething), - // Ignores the string DoSomething() returns. - Return(true))); -``` - -Note that you **cannot** use `IgnoreResult()` on an action that already returns -`void`. Doing so will lead to ugly compiler errors. - -### Selecting an Action's Arguments {#SelectingArgs} - -Say you have a mock function `Foo()` that takes seven arguments, and you have a -custom action that you want to invoke when `Foo()` is called. Trouble is, the -custom action only wants three arguments: - -```cpp -using ::testing::_; -using ::testing::Invoke; -... - MOCK_METHOD(bool, Foo, - (bool visible, const string& name, int x, int y, - (const map>), double& weight, double min_weight, - double max_wight)); -... -bool IsVisibleInQuadrant1(bool visible, int x, int y) { - return visible && x >= 0 && y >= 0; -} -... - EXPECT_CALL(mock, Foo) - .WillOnce(Invoke(IsVisibleInQuadrant1)); // Uh, won't compile. :-( -``` - -To please the compiler God, you need to define an "adaptor" that has the same -signature as `Foo()` and calls the custom action with the right arguments: - -```cpp -using ::testing::_; -using ::testing::Invoke; -... -bool MyIsVisibleInQuadrant1(bool visible, const string& name, int x, int y, - const map, double>& weight, - double min_weight, double max_wight) { - return IsVisibleInQuadrant1(visible, x, y); -} -... - EXPECT_CALL(mock, Foo) - .WillOnce(Invoke(MyIsVisibleInQuadrant1)); // Now it works. -``` - -But isn't this awkward? - -gMock provides a generic *action adaptor*, so you can spend your time minding -more important business than writing your own adaptors. Here's the syntax: - -```cpp -WithArgs(action) -``` - -creates an action that passes the arguments of the mock function at the given -indices (0-based) to the inner `action` and performs it. Using `WithArgs`, our -original example can be written as: - -```cpp -using ::testing::_; -using ::testing::Invoke; -using ::testing::WithArgs; -... - EXPECT_CALL(mock, Foo) - .WillOnce(WithArgs<0, 2, 3>(Invoke(IsVisibleInQuadrant1))); // No need to define your own adaptor. -``` - -For better readability, gMock also gives you: - -* `WithoutArgs(action)` when the inner `action` takes *no* argument, and -* `WithArg(action)` (no `s` after `Arg`) when the inner `action` takes - *one* argument. - -As you may have realized, `InvokeWithoutArgs(...)` is just syntactic sugar for -`WithoutArgs(Invoke(...))`. - -Here are more tips: - -* The inner action used in `WithArgs` and friends does not have to be - `Invoke()` -- it can be anything. -* You can repeat an argument in the argument list if necessary, e.g. - `WithArgs<2, 3, 3, 5>(...)`. -* You can change the order of the arguments, e.g. `WithArgs<3, 2, 1>(...)`. -* The types of the selected arguments do *not* have to match the signature of - the inner action exactly. It works as long as they can be implicitly - converted to the corresponding arguments of the inner action. For example, - if the 4-th argument of the mock function is an `int` and `my_action` takes - a `double`, `WithArg<4>(my_action)` will work. - -### Ignoring Arguments in Action Functions - -The [selecting-an-action's-arguments](#SelectingArgs) recipe showed us one way -to make a mock function and an action with incompatible argument lists fit -together. The downside is that wrapping the action in `WithArgs<...>()` can get -tedious for people writing the tests. - -If you are defining a function (or method, functor, lambda, callback) to be used -with `Invoke*()`, and you are not interested in some of its arguments, an -alternative to `WithArgs` is to declare the uninteresting arguments as `Unused`. -This makes the definition less cluttered and less fragile in case the types of -the uninteresting arguments change. It could also increase the chance the action -function can be reused. For example, given - -```cpp - public: - MOCK_METHOD(double, Foo, double(const string& label, double x, double y), - (override)); - MOCK_METHOD(double, Bar, (int index, double x, double y), (override)); -``` - -instead of - -```cpp -using ::testing::_; -using ::testing::Invoke; - -double DistanceToOriginWithLabel(const string& label, double x, double y) { - return sqrt(x*x + y*y); -} -double DistanceToOriginWithIndex(int index, double x, double y) { - return sqrt(x*x + y*y); -} -... - EXPECT_CALL(mock, Foo("abc", _, _)) - .WillOnce(Invoke(DistanceToOriginWithLabel)); - EXPECT_CALL(mock, Bar(5, _, _)) - .WillOnce(Invoke(DistanceToOriginWithIndex)); -``` - -you could write - -```cpp -using ::testing::_; -using ::testing::Invoke; -using ::testing::Unused; - -double DistanceToOrigin(Unused, double x, double y) { - return sqrt(x*x + y*y); -} -... - EXPECT_CALL(mock, Foo("abc", _, _)) - .WillOnce(Invoke(DistanceToOrigin)); - EXPECT_CALL(mock, Bar(5, _, _)) - .WillOnce(Invoke(DistanceToOrigin)); -``` - -### Sharing Actions - -Just like matchers, a gMock action object consists of a pointer to a ref-counted -implementation object. Therefore copying actions is also allowed and very -efficient. When the last action that references the implementation object dies, -the implementation object will be deleted. - -If you have some complex action that you want to use again and again, you may -not have to build it from scratch everytime. If the action doesn't have an -internal state (i.e. if it always does the same thing no matter how many times -it has been called), you can assign it to an action variable and use that -variable repeatedly. For example: - -```cpp -using ::testing::Action; -using ::testing::DoAll; -using ::testing::Return; -using ::testing::SetArgPointee; -... - Action set_flag = DoAll(SetArgPointee<0>(5), - Return(true)); - ... use set_flag in .WillOnce() and .WillRepeatedly() ... -``` - -However, if the action has its own state, you may be surprised if you share the -action object. Suppose you have an action factory `IncrementCounter(init)` which -creates an action that increments and returns a counter whose initial value is -`init`, using two actions created from the same expression and using a shared -action will exhibit different behaviors. Example: - -```cpp - EXPECT_CALL(foo, DoThis()) - .WillRepeatedly(IncrementCounter(0)); - EXPECT_CALL(foo, DoThat()) - .WillRepeatedly(IncrementCounter(0)); - foo.DoThis(); // Returns 1. - foo.DoThis(); // Returns 2. - foo.DoThat(); // Returns 1 - Blah() uses a different - // counter than Bar()'s. -``` - -versus - -```cpp -using ::testing::Action; -... - Action increment = IncrementCounter(0); - EXPECT_CALL(foo, DoThis()) - .WillRepeatedly(increment); - EXPECT_CALL(foo, DoThat()) - .WillRepeatedly(increment); - foo.DoThis(); // Returns 1. - foo.DoThis(); // Returns 2. - foo.DoThat(); // Returns 3 - the counter is shared. -``` - -### Testing Asynchronous Behavior - -One oft-encountered problem with gMock is that it can be hard to test -asynchronous behavior. Suppose you had a `EventQueue` class that you wanted to -test, and you created a separate `EventDispatcher` interface so that you could -easily mock it out. However, the implementation of the class fired all the -events on a background thread, which made test timings difficult. You could just -insert `sleep()` statements and hope for the best, but that makes your test -behavior nondeterministic. A better way is to use gMock actions and -`Notification` objects to force your asynchronous test to behave synchronously. - -```cpp -using ::testing::DoAll; -using ::testing::InvokeWithoutArgs; -using ::testing::Return; - -class MockEventDispatcher : public EventDispatcher { - MOCK_METHOD(bool, DispatchEvent, (int32), (override)); -}; - -ACTION_P(Notify, notification) { - notification->Notify(); -} - -TEST(EventQueueTest, EnqueueEventTest) { - MockEventDispatcher mock_event_dispatcher; - EventQueue event_queue(&mock_event_dispatcher); - - const int32 kEventId = 321; - Notification done; - EXPECT_CALL(mock_event_dispatcher, DispatchEvent(kEventId)) - .WillOnce(Notify(&done)); - - event_queue.EnqueueEvent(kEventId); - done.WaitForNotification(); -} -``` - -In the example above, we set our normal gMock expectations, but then add an -additional action to notify the `Notification` object. Now we can just call -`Notification::WaitForNotification()` in the main thread to wait for the -asynchronous call to finish. After that, our test suite is complete and we can -safely exit. - -Note: this example has a downside: namely, if the expectation is not satisfied, -our test will run forever. It will eventually time-out and fail, but it will -take longer and be slightly harder to debug. To alleviate this problem, you can -use `WaitForNotificationWithTimeout(ms)` instead of `WaitForNotification()`. - -## Misc Recipes on Using gMock - -### Mocking Methods That Use Move-Only Types - -C++11 introduced *move-only types*. A move-only-typed value can be moved from -one object to another, but cannot be copied. `std::unique_ptr` is probably -the most commonly used move-only type. - -Mocking a method that takes and/or returns move-only types presents some -challenges, but nothing insurmountable. This recipe shows you how you can do it. -Note that the support for move-only method arguments was only introduced to -gMock in April 2017; in older code, you may find more complex -[workarounds](#LegacyMoveOnly) for lack of this feature. - -Let’s say we are working on a fictional project that lets one post and share -snippets called “buzzes”. Your code uses these types: - -```cpp -enum class AccessLevel { kInternal, kPublic }; - -class Buzz { - public: - explicit Buzz(AccessLevel access) { ... } - ... -}; - -class Buzzer { - public: - virtual ~Buzzer() {} - virtual std::unique_ptr MakeBuzz(StringPiece text) = 0; - virtual bool ShareBuzz(std::unique_ptr buzz, int64_t timestamp) = 0; - ... -}; -``` - -A `Buzz` object represents a snippet being posted. A class that implements the -`Buzzer` interface is capable of creating and sharing `Buzz`es. Methods in -`Buzzer` may return a `unique_ptr` or take a `unique_ptr`. Now we -need to mock `Buzzer` in our tests. - -To mock a method that accepts or returns move-only types, you just use the -familiar `MOCK_METHOD` syntax as usual: - -```cpp -class MockBuzzer : public Buzzer { - public: - MOCK_METHOD(std::unique_ptr, MakeBuzz, (StringPiece text), (override)); - MOCK_METHOD(bool, ShareBuzz, (std::unique_ptr buzz, int64_t timestamp), - (override)); -}; -``` - -Now that we have the mock class defined, we can use it in tests. In the -following code examples, we assume that we have defined a `MockBuzzer` object -named `mock_buzzer_`: - -```cpp - MockBuzzer mock_buzzer_; -``` - -First let’s see how we can set expectations on the `MakeBuzz()` method, which -returns a `unique_ptr`. - -As usual, if you set an expectation without an action (i.e. the `.WillOnce()` or -`.WillRepeatedly()` clause), when that expectation fires, the default action for -that method will be taken. Since `unique_ptr<>` has a default constructor that -returns a null `unique_ptr`, that’s what you’ll get if you don’t specify an -action: - -```cpp - // Use the default action. - EXPECT_CALL(mock_buzzer_, MakeBuzz("hello")); - - // Triggers the previous EXPECT_CALL. - EXPECT_EQ(nullptr, mock_buzzer_.MakeBuzz("hello")); -``` - -If you are not happy with the default action, you can tweak it as usual; see -[Setting Default Actions](#OnCall). - -If you just need to return a pre-defined move-only value, you can use the -`Return(ByMove(...))` action: - -```cpp - // When this fires, the unique_ptr<> specified by ByMove(...) will - // be returned. - EXPECT_CALL(mock_buzzer_, MakeBuzz("world")) - .WillOnce(Return(ByMove(MakeUnique(AccessLevel::kInternal)))); - - EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("world")); -``` - -Note that `ByMove()` is essential here - if you drop it, the code won’t compile. - -Quiz time! What do you think will happen if a `Return(ByMove(...))` action is -performed more than once (e.g. you write `... -.WillRepeatedly(Return(ByMove(...)));`)? Come think of it, after the first time -the action runs, the source value will be consumed (since it’s a move-only -value), so the next time around, there’s no value to move from -- you’ll get a -run-time error that `Return(ByMove(...))` can only be run once. - -If you need your mock method to do more than just moving a pre-defined value, -remember that you can always use a lambda or a callable object, which can do -pretty much anything you want: - -```cpp - EXPECT_CALL(mock_buzzer_, MakeBuzz("x")) - .WillRepeatedly([](StringPiece text) { - return MakeUnique(AccessLevel::kInternal); - }); - - EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("x")); - EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("x")); -``` - -Every time this `EXPECT_CALL` fires, a new `unique_ptr` will be created -and returned. You cannot do this with `Return(ByMove(...))`. - -That covers returning move-only values; but how do we work with methods -accepting move-only arguments? The answer is that they work normally, although -some actions will not compile when any of method's arguments are move-only. You -can always use `Return`, or a [lambda or functor](#FunctionsAsActions): - -```cpp - using ::testing::Unused; - - EXPECT_CALL(mock_buzzer_, ShareBuzz(NotNull(), _)).WillOnce(Return(true)); - EXPECT_TRUE(mock_buzzer_.ShareBuzz(MakeUnique(AccessLevel::kInternal)), - 0); - - EXPECT_CALL(mock_buzzer_, ShareBuzz(_, _)).WillOnce( - [](std::unique_ptr buzz, Unused) { return buzz != nullptr; }); - EXPECT_FALSE(mock_buzzer_.ShareBuzz(nullptr, 0)); -``` - -Many built-in actions (`WithArgs`, `WithoutArgs`,`DeleteArg`, `SaveArg`, ...) -could in principle support move-only arguments, but the support for this is not -implemented yet. If this is blocking you, please file a bug. - -A few actions (e.g. `DoAll`) copy their arguments internally, so they can never -work with non-copyable objects; you'll have to use functors instead. - -#### Legacy workarounds for move-only types {#LegacyMoveOnly} - -Support for move-only function arguments was only introduced to gMock in April -2017. In older code, you may encounter the following workaround for the lack of -this feature (it is no longer necessary - we're including it just for -reference): - -```cpp -class MockBuzzer : public Buzzer { - public: - MOCK_METHOD(bool, DoShareBuzz, (Buzz* buzz, Time timestamp)); - bool ShareBuzz(std::unique_ptr buzz, Time timestamp) override { - return DoShareBuzz(buzz.get(), timestamp); - } -}; -``` - -The trick is to delegate the `ShareBuzz()` method to a mock method (let’s call -it `DoShareBuzz()`) that does not take move-only parameters. Then, instead of -setting expectations on `ShareBuzz()`, you set them on the `DoShareBuzz()` mock -method: - -```cpp - MockBuzzer mock_buzzer_; - EXPECT_CALL(mock_buzzer_, DoShareBuzz(NotNull(), _)); - - // When one calls ShareBuzz() on the MockBuzzer like this, the call is - // forwarded to DoShareBuzz(), which is mocked. Therefore this statement - // will trigger the above EXPECT_CALL. - mock_buzzer_.ShareBuzz(MakeUnique(AccessLevel::kInternal), 0); -``` - -### Making the Compilation Faster - -Believe it or not, the *vast majority* of the time spent on compiling a mock -class is in generating its constructor and destructor, as they perform -non-trivial tasks (e.g. verification of the expectations). What's more, mock -methods with different signatures have different types and thus their -constructors/destructors need to be generated by the compiler separately. As a -result, if you mock many different types of methods, compiling your mock class -can get really slow. - -If you are experiencing slow compilation, you can move the definition of your -mock class' constructor and destructor out of the class body and into a `.cc` -file. This way, even if you `#include` your mock class in N files, the compiler -only needs to generate its constructor and destructor once, resulting in a much -faster compilation. - -Let's illustrate the idea using an example. Here's the definition of a mock -class before applying this recipe: - -```cpp -// File mock_foo.h. -... -class MockFoo : public Foo { - public: - // Since we don't declare the constructor or the destructor, - // the compiler will generate them in every translation unit - // where this mock class is used. - - MOCK_METHOD(int, DoThis, (), (override)); - MOCK_METHOD(bool, DoThat, (const char* str), (override)); - ... more mock methods ... -}; -``` - -After the change, it would look like: - -```cpp -// File mock_foo.h. -... -class MockFoo : public Foo { - public: - // The constructor and destructor are declared, but not defined, here. - MockFoo(); - virtual ~MockFoo(); - - MOCK_METHOD(int, DoThis, (), (override)); - MOCK_METHOD(bool, DoThat, (const char* str), (override)); - ... more mock methods ... -}; -``` - -and - -```cpp -// File mock_foo.cc. -#include "path/to/mock_foo.h" - -// The definitions may appear trivial, but the functions actually do a -// lot of things through the constructors/destructors of the member -// variables used to implement the mock methods. -MockFoo::MockFoo() {} -MockFoo::~MockFoo() {} -``` - -### Forcing a Verification - -When it's being destroyed, your friendly mock object will automatically verify -that all expectations on it have been satisfied, and will generate googletest -failures if not. This is convenient as it leaves you with one less thing to -worry about. That is, unless you are not sure if your mock object will be -destroyed. - -How could it be that your mock object won't eventually be destroyed? Well, it -might be created on the heap and owned by the code you are testing. Suppose -there's a bug in that code and it doesn't delete the mock object properly - you -could end up with a passing test when there's actually a bug. - -Using a heap checker is a good idea and can alleviate the concern, but its -implementation is not 100% reliable. So, sometimes you do want to *force* gMock -to verify a mock object before it is (hopefully) destructed. You can do this -with `Mock::VerifyAndClearExpectations(&mock_object)`: - -```cpp -TEST(MyServerTest, ProcessesRequest) { - using ::testing::Mock; - - MockFoo* const foo = new MockFoo; - EXPECT_CALL(*foo, ...)...; - // ... other expectations ... - - // server now owns foo. - MyServer server(foo); - server.ProcessRequest(...); - - // In case that server's destructor will forget to delete foo, - // this will verify the expectations anyway. - Mock::VerifyAndClearExpectations(foo); -} // server is destroyed when it goes out of scope here. -``` - -**Tip:** The `Mock::VerifyAndClearExpectations()` function returns a `bool` to -indicate whether the verification was successful (`true` for yes), so you can -wrap that function call inside a `ASSERT_TRUE()` if there is no point going -further when the verification has failed. - -### Using Check Points {#UsingCheckPoints} - -Sometimes you may want to "reset" a mock object at various check points in your -test: at each check point, you verify that all existing expectations on the mock -object have been satisfied, and then you set some new expectations on it as if -it's newly created. This allows you to work with a mock object in "phases" whose -sizes are each manageable. - -One such scenario is that in your test's `SetUp()` function, you may want to put -the object you are testing into a certain state, with the help from a mock -object. Once in the desired state, you want to clear all expectations on the -mock, such that in the `TEST_F` body you can set fresh expectations on it. - -As you may have figured out, the `Mock::VerifyAndClearExpectations()` function -we saw in the previous recipe can help you here. Or, if you are using -`ON_CALL()` to set default actions on the mock object and want to clear the -default actions as well, use `Mock::VerifyAndClear(&mock_object)` instead. This -function does what `Mock::VerifyAndClearExpectations(&mock_object)` does and -returns the same `bool`, **plus** it clears the `ON_CALL()` statements on -`mock_object` too. - -Another trick you can use to achieve the same effect is to put the expectations -in sequences and insert calls to a dummy "check-point" function at specific -places. Then you can verify that the mock function calls do happen at the right -time. For example, if you are exercising code: - -```cpp - Foo(1); - Foo(2); - Foo(3); -``` - -and want to verify that `Foo(1)` and `Foo(3)` both invoke `mock.Bar("a")`, but -`Foo(2)` doesn't invoke anything. You can write: - -```cpp -using ::testing::MockFunction; - -TEST(FooTest, InvokesBarCorrectly) { - MyMock mock; - // Class MockFunction has exactly one mock method. It is named - // Call() and has type F. - MockFunction check; - { - InSequence s; - - EXPECT_CALL(mock, Bar("a")); - EXPECT_CALL(check, Call("1")); - EXPECT_CALL(check, Call("2")); - EXPECT_CALL(mock, Bar("a")); - } - Foo(1); - check.Call("1"); - Foo(2); - check.Call("2"); - Foo(3); -} -``` - -The expectation spec says that the first `Bar("a")` must happen before check -point "1", the second `Bar("a")` must happen after check point "2", and nothing -should happen between the two check points. The explicit check points make it -easy to tell which `Bar("a")` is called by which call to `Foo()`. - -### Mocking Destructors - -Sometimes you want to make sure a mock object is destructed at the right time, -e.g. after `bar->A()` is called but before `bar->B()` is called. We already know -that you can specify constraints on the [order](#OrderedCalls) of mock function -calls, so all we need to do is to mock the destructor of the mock function. - -This sounds simple, except for one problem: a destructor is a special function -with special syntax and special semantics, and the `MOCK_METHOD` macro doesn't -work for it: - -```cpp -MOCK_METHOD(void, ~MockFoo, ()); // Won't compile! -``` - -The good news is that you can use a simple pattern to achieve the same effect. -First, add a mock function `Die()` to your mock class and call it in the -destructor, like this: - -```cpp -class MockFoo : public Foo { - ... - // Add the following two lines to the mock class. - MOCK_METHOD(void, Die, ()); - virtual ~MockFoo() { Die(); } -}; -``` - -(If the name `Die()` clashes with an existing symbol, choose another name.) Now, -we have translated the problem of testing when a `MockFoo` object dies to -testing when its `Die()` method is called: - -```cpp - MockFoo* foo = new MockFoo; - MockBar* bar = new MockBar; - ... - { - InSequence s; - - // Expects *foo to die after bar->A() and before bar->B(). - EXPECT_CALL(*bar, A()); - EXPECT_CALL(*foo, Die()); - EXPECT_CALL(*bar, B()); - } -``` - -And that's that. - -### Using gMock and Threads {#UsingThreads} - -In a **unit** test, it's best if you could isolate and test a piece of code in a -single-threaded context. That avoids race conditions and dead locks, and makes -debugging your test much easier. - -Yet most programs are multi-threaded, and sometimes to test something we need to -pound on it from more than one thread. gMock works for this purpose too. - -Remember the steps for using a mock: - -1. Create a mock object `foo`. -2. Set its default actions and expectations using `ON_CALL()` and - `EXPECT_CALL()`. -3. The code under test calls methods of `foo`. -4. Optionally, verify and reset the mock. -5. Destroy the mock yourself, or let the code under test destroy it. The - destructor will automatically verify it. - -If you follow the following simple rules, your mocks and threads can live -happily together: - -* Execute your *test code* (as opposed to the code being tested) in *one* - thread. This makes your test easy to follow. -* Obviously, you can do step #1 without locking. -* When doing step #2 and #5, make sure no other thread is accessing `foo`. - Obvious too, huh? -* #3 and #4 can be done either in one thread or in multiple threads - anyway - you want. gMock takes care of the locking, so you don't have to do any - - unless required by your test logic. - -If you violate the rules (for example, if you set expectations on a mock while -another thread is calling its methods), you get undefined behavior. That's not -fun, so don't do it. - -gMock guarantees that the action for a mock function is done in the same thread -that called the mock function. For example, in - -```cpp - EXPECT_CALL(mock, Foo(1)) - .WillOnce(action1); - EXPECT_CALL(mock, Foo(2)) - .WillOnce(action2); -``` - -if `Foo(1)` is called in thread 1 and `Foo(2)` is called in thread 2, gMock will -execute `action1` in thread 1 and `action2` in thread 2. - -gMock does *not* impose a sequence on actions performed in different threads -(doing so may create deadlocks as the actions may need to cooperate). This means -that the execution of `action1` and `action2` in the above example *may* -interleave. If this is a problem, you should add proper synchronization logic to -`action1` and `action2` to make the test thread-safe. - -Also, remember that `DefaultValue` is a global resource that potentially -affects *all* living mock objects in your program. Naturally, you won't want to -mess with it from multiple threads or when there still are mocks in action. - -### Controlling How Much Information gMock Prints - -When gMock sees something that has the potential of being an error (e.g. a mock -function with no expectation is called, a.k.a. an uninteresting call, which is -allowed but perhaps you forgot to explicitly ban the call), it prints some -warning messages, including the arguments of the function, the return value, and -the stack trace. Hopefully this will remind you to take a look and see if there -is indeed a problem. - -Sometimes you are confident that your tests are correct and may not appreciate -such friendly messages. Some other times, you are debugging your tests or -learning about the behavior of the code you are testing, and wish you could -observe every mock call that happens (including argument values, the return -value, and the stack trace). Clearly, one size doesn't fit all. - -You can control how much gMock tells you using the `--gmock_verbose=LEVEL` -command-line flag, where `LEVEL` is a string with three possible values: - -* `info`: gMock will print all informational messages, warnings, and errors - (most verbose). At this setting, gMock will also log any calls to the - `ON_CALL/EXPECT_CALL` macros. It will include a stack trace in - "uninteresting call" warnings. -* `warning`: gMock will print both warnings and errors (less verbose); it will - omit the stack traces in "uninteresting call" warnings. This is the default. -* `error`: gMock will print errors only (least verbose). - -Alternatively, you can adjust the value of that flag from within your tests like -so: - -```cpp - ::testing::FLAGS_gmock_verbose = "error"; -``` - -If you find gMock printing too many stack frames with its informational or -warning messages, remember that you can control their amount with the -`--gtest_stack_trace_depth=max_depth` flag. - -Now, judiciously use the right flag to enable gMock serve you better! - -### Gaining Super Vision into Mock Calls - -You have a test using gMock. It fails: gMock tells you some expectations aren't -satisfied. However, you aren't sure why: Is there a typo somewhere in the -matchers? Did you mess up the order of the `EXPECT_CALL`s? Or is the code under -test doing something wrong? How can you find out the cause? - -Won't it be nice if you have X-ray vision and can actually see the trace of all -`EXPECT_CALL`s and mock method calls as they are made? For each call, would you -like to see its actual argument values and which `EXPECT_CALL` gMock thinks it -matches? If you still need some help to figure out who made these calls, how -about being able to see the complete stack trace at each mock call? - -You can unlock this power by running your test with the `--gmock_verbose=info` -flag. For example, given the test program: - -```cpp -#include "gmock/gmock.h" - -using testing::_; -using testing::HasSubstr; -using testing::Return; - -class MockFoo { - public: - MOCK_METHOD(void, F, (const string& x, const string& y)); -}; - -TEST(Foo, Bar) { - MockFoo mock; - EXPECT_CALL(mock, F(_, _)).WillRepeatedly(Return()); - EXPECT_CALL(mock, F("a", "b")); - EXPECT_CALL(mock, F("c", HasSubstr("d"))); - - mock.F("a", "good"); - mock.F("a", "b"); -} -``` - -if you run it with `--gmock_verbose=info`, you will see this output: - -```shell -[ RUN ] Foo.Bar - -foo_test.cc:14: EXPECT_CALL(mock, F(_, _)) invoked -Stack trace: ... - -foo_test.cc:15: EXPECT_CALL(mock, F("a", "b")) invoked -Stack trace: ... - -foo_test.cc:16: EXPECT_CALL(mock, F("c", HasSubstr("d"))) invoked -Stack trace: ... - -foo_test.cc:14: Mock function call matches EXPECT_CALL(mock, F(_, _))... - Function call: F(@0x7fff7c8dad40"a",@0x7fff7c8dad10"good") -Stack trace: ... - -foo_test.cc:15: Mock function call matches EXPECT_CALL(mock, F("a", "b"))... - Function call: F(@0x7fff7c8dada0"a",@0x7fff7c8dad70"b") -Stack trace: ... - -foo_test.cc:16: Failure -Actual function call count doesn't match EXPECT_CALL(mock, F("c", HasSubstr("d")))... - Expected: to be called once - Actual: never called - unsatisfied and active -[ FAILED ] Foo.Bar -``` - -Suppose the bug is that the `"c"` in the third `EXPECT_CALL` is a typo and -should actually be `"a"`. With the above message, you should see that the actual -`F("a", "good")` call is matched by the first `EXPECT_CALL`, not the third as -you thought. From that it should be obvious that the third `EXPECT_CALL` is -written wrong. Case solved. - -If you are interested in the mock call trace but not the stack traces, you can -combine `--gmock_verbose=info` with `--gtest_stack_trace_depth=0` on the test -command line. - - - -### Running Tests in Emacs - -If you build and run your tests in Emacs using the `M-x google-compile` command -(as many googletest users do), the source file locations of gMock and googletest -errors will be highlighted. Just press `` on one of them and you'll be -taken to the offending line. Or, you can just type `C-x`` to jump to the next -error. - -To make it even easier, you can add the following lines to your `~/.emacs` file: - -```text -(global-set-key "\M-m" 'google-compile) ; m is for make -(global-set-key [M-down] 'next-error) -(global-set-key [M-up] '(lambda () (interactive) (next-error -1))) -``` - -Then you can type `M-m` to start a build (if you want to run the test as well, -just make sure `foo_test.run` or `runtests` is in the build command you supply -after typing `M-m`), or `M-up`/`M-down` to move back and forth between errors. - -## Extending gMock - -### Writing New Matchers Quickly {#NewMatchers} - -WARNING: gMock does not guarantee when or how many times a matcher will be -invoked. Therefore, all matchers must be functionally pure. See -[this section](#PureMatchers) for more details. - -The `MATCHER*` family of macros can be used to define custom matchers easily. -The syntax: - -```cpp -MATCHER(name, description_string_expression) { statements; } -``` - -will define a matcher with the given name that executes the statements, which -must return a `bool` to indicate if the match succeeds. Inside the statements, -you can refer to the value being matched by `arg`, and refer to its type by -`arg_type`. - -The *description string* is a `string`-typed expression that documents what the -matcher does, and is used to generate the failure message when the match fails. -It can (and should) reference the special `bool` variable `negation`, and should -evaluate to the description of the matcher when `negation` is `false`, or that -of the matcher's negation when `negation` is `true`. - -For convenience, we allow the description string to be empty (`""`), in which -case gMock will use the sequence of words in the matcher name as the -description. - -For example: - -```cpp -MATCHER(IsDivisibleBy7, "") { return (arg % 7) == 0; } -``` - -allows you to write - -```cpp - // Expects mock_foo.Bar(n) to be called where n is divisible by 7. - EXPECT_CALL(mock_foo, Bar(IsDivisibleBy7())); -``` - -or, - -```cpp - using ::testing::Not; - ... - // Verifies that two values are divisible by 7. - EXPECT_THAT(some_expression, IsDivisibleBy7()); - EXPECT_THAT(some_other_expression, Not(IsDivisibleBy7())); -``` - -If the above assertions fail, they will print something like: - -```shell - Value of: some_expression - Expected: is divisible by 7 - Actual: 27 - ... - Value of: some_other_expression - Expected: not (is divisible by 7) - Actual: 21 -``` - -where the descriptions `"is divisible by 7"` and `"not (is divisible by 7)"` are -automatically calculated from the matcher name `IsDivisibleBy7`. - -As you may have noticed, the auto-generated descriptions (especially those for -the negation) may not be so great. You can always override them with a `string` -expression of your own: - -```cpp -MATCHER(IsDivisibleBy7, - absl::StrCat(negation ? "isn't" : "is", " divisible by 7")) { - return (arg % 7) == 0; -} -``` - -Optionally, you can stream additional information to a hidden argument named -`result_listener` to explain the match result. For example, a better definition -of `IsDivisibleBy7` is: - -```cpp -MATCHER(IsDivisibleBy7, "") { - if ((arg % 7) == 0) - return true; - - *result_listener << "the remainder is " << (arg % 7); - return false; -} -``` - -With this definition, the above assertion will give a better message: - -```shell - Value of: some_expression - Expected: is divisible by 7 - Actual: 27 (the remainder is 6) -``` - -You should let `MatchAndExplain()` print *any additional information* that can -help a user understand the match result. Note that it should explain why the -match succeeds in case of a success (unless it's obvious) - this is useful when -the matcher is used inside `Not()`. There is no need to print the argument value -itself, as gMock already prints it for you. - -NOTE: The type of the value being matched (`arg_type`) is determined by the -context in which you use the matcher and is supplied to you by the compiler, so -you don't need to worry about declaring it (nor can you). This allows the -matcher to be polymorphic. For example, `IsDivisibleBy7()` can be used to match -any type where the value of `(arg % 7) == 0` can be implicitly converted to a -`bool`. In the `Bar(IsDivisibleBy7())` example above, if method `Bar()` takes an -`int`, `arg_type` will be `int`; if it takes an `unsigned long`, `arg_type` will -be `unsigned long`; and so on. - -### Writing New Parameterized Matchers Quickly - -Sometimes you'll want to define a matcher that has parameters. For that you can -use the macro: - -```cpp -MATCHER_P(name, param_name, description_string) { statements; } -``` - -where the description string can be either `""` or a `string` expression that -references `negation` and `param_name`. - -For example: - -```cpp -MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } -``` - -will allow you to write: - -```cpp - EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); -``` - -which may lead to this message (assuming `n` is 10): - -```shell - Value of: Blah("a") - Expected: has absolute value 10 - Actual: -9 -``` - -Note that both the matcher description and its parameter are printed, making the -message human-friendly. - -In the matcher definition body, you can write `foo_type` to reference the type -of a parameter named `foo`. For example, in the body of -`MATCHER_P(HasAbsoluteValue, value)` above, you can write `value_type` to refer -to the type of `value`. - -gMock also provides `MATCHER_P2`, `MATCHER_P3`, ..., up to `MATCHER_P10` to -support multi-parameter matchers: - -```cpp -MATCHER_Pk(name, param_1, ..., param_k, description_string) { statements; } -``` - -Please note that the custom description string is for a particular *instance* of -the matcher, where the parameters have been bound to actual values. Therefore -usually you'll want the parameter values to be part of the description. gMock -lets you do that by referencing the matcher parameters in the description string -expression. - -For example, - -```cpp -using ::testing::PrintToString; -MATCHER_P2(InClosedRange, low, hi, - absl::StrFormat("%s in range [%s, %s]", negation ? "isn't" : "is", - PrintToString(low), PrintToString(hi))) { - return low <= arg && arg <= hi; -} -... -EXPECT_THAT(3, InClosedRange(4, 6)); -``` - -would generate a failure that contains the message: - -```shell - Expected: is in range [4, 6] -``` - -If you specify `""` as the description, the failure message will contain the -sequence of words in the matcher name followed by the parameter values printed -as a tuple. For example, - -```cpp - MATCHER_P2(InClosedRange, low, hi, "") { ... } - ... - EXPECT_THAT(3, InClosedRange(4, 6)); -``` - -would generate a failure that contains the text: - -```shell - Expected: in closed range (4, 6) -``` - -For the purpose of typing, you can view - -```cpp -MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } -``` - -as shorthand for - -```cpp -template -FooMatcherPk -Foo(p1_type p1, ..., pk_type pk) { ... } -``` - -When you write `Foo(v1, ..., vk)`, the compiler infers the types of the -parameters `v1`, ..., and `vk` for you. If you are not happy with the result of -the type inference, you can specify the types by explicitly instantiating the -template, as in `Foo(5, false)`. As said earlier, you don't get to -(or need to) specify `arg_type` as that's determined by the context in which the -matcher is used. - -You can assign the result of expression `Foo(p1, ..., pk)` to a variable of type -`FooMatcherPk`. This can be useful when composing -matchers. Matchers that don't have a parameter or have only one parameter have -special types: you can assign `Foo()` to a `FooMatcher`-typed variable, and -assign `Foo(p)` to a `FooMatcherP`-typed variable. - -While you can instantiate a matcher template with reference types, passing the -parameters by pointer usually makes your code more readable. If, however, you -still want to pass a parameter by reference, be aware that in the failure -message generated by the matcher you will see the value of the referenced object -but not its address. - -You can overload matchers with different numbers of parameters: - -```cpp -MATCHER_P(Blah, a, description_string_1) { ... } -MATCHER_P2(Blah, a, b, description_string_2) { ... } -``` - -While it's tempting to always use the `MATCHER*` macros when defining a new -matcher, you should also consider implementing `MatcherInterface` or using -`MakePolymorphicMatcher()` instead (see the recipes that follow), especially if -you need to use the matcher a lot. While these approaches require more work, -they give you more control on the types of the value being matched and the -matcher parameters, which in general leads to better compiler error messages -that pay off in the long run. They also allow overloading matchers based on -parameter types (as opposed to just based on the number of parameters). - -### Writing New Monomorphic Matchers - -A matcher of argument type `T` implements `::testing::MatcherInterface` and -does two things: it tests whether a value of type `T` matches the matcher, and -can describe what kind of values it matches. The latter ability is used for -generating readable error messages when expectations are violated. - -The interface looks like this: - -```cpp -class MatchResultListener { - public: - ... - // Streams x to the underlying ostream; does nothing if the ostream - // is NULL. - template - MatchResultListener& operator<<(const T& x); - - // Returns the underlying ostream. - ::std::ostream* stream(); -}; - -template -class MatcherInterface { - public: - virtual ~MatcherInterface(); - - // Returns true if and only if the matcher matches x; also explains the match - // result to 'listener'. - virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; - - // Describes this matcher to an ostream. - virtual void DescribeTo(::std::ostream* os) const = 0; - - // Describes the negation of this matcher to an ostream. - virtual void DescribeNegationTo(::std::ostream* os) const; -}; -``` - -If you need a custom matcher but `Truly()` is not a good option (for example, -you may not be happy with the way `Truly(predicate)` describes itself, or you -may want your matcher to be polymorphic as `Eq(value)` is), you can define a -matcher to do whatever you want in two steps: first implement the matcher -interface, and then define a factory function to create a matcher instance. The -second step is not strictly needed but it makes the syntax of using the matcher -nicer. - -For example, you can define a matcher to test whether an `int` is divisible by 7 -and then use it like this: - -```cpp -using ::testing::MakeMatcher; -using ::testing::Matcher; -using ::testing::MatcherInterface; -using ::testing::MatchResultListener; - -class DivisibleBy7Matcher : public MatcherInterface { - public: - bool MatchAndExplain(int n, - MatchResultListener* /* listener */) const override { - return (n % 7) == 0; - } - - void DescribeTo(::std::ostream* os) const override { - *os << "is divisible by 7"; - } - - void DescribeNegationTo(::std::ostream* os) const override { - *os << "is not divisible by 7"; - } -}; - -Matcher DivisibleBy7() { - return MakeMatcher(new DivisibleBy7Matcher); -} - -... - EXPECT_CALL(foo, Bar(DivisibleBy7())); -``` - -You may improve the matcher message by streaming additional information to the -`listener` argument in `MatchAndExplain()`: - -```cpp -class DivisibleBy7Matcher : public MatcherInterface { - public: - bool MatchAndExplain(int n, - MatchResultListener* listener) const override { - const int remainder = n % 7; - if (remainder != 0) { - *listener << "the remainder is " << remainder; - } - return remainder == 0; - } - ... -}; -``` - -Then, `EXPECT_THAT(x, DivisibleBy7());` may generate a message like this: - -```shell -Value of: x -Expected: is divisible by 7 - Actual: 23 (the remainder is 2) -``` - -### Writing New Polymorphic Matchers - -You've learned how to write your own matchers in the previous recipe. Just one -problem: a matcher created using `MakeMatcher()` only works for one particular -type of arguments. If you want a *polymorphic* matcher that works with arguments -of several types (for instance, `Eq(x)` can be used to match a *`value`* as long -as `value == x` compiles -- *`value`* and `x` don't have to share the same -type), you can learn the trick from `testing/base/public/gmock-matchers.h` but -it's a bit involved. - -Fortunately, most of the time you can define a polymorphic matcher easily with -the help of `MakePolymorphicMatcher()`. Here's how you can define `NotNull()` as -an example: - -```cpp -using ::testing::MakePolymorphicMatcher; -using ::testing::MatchResultListener; -using ::testing::PolymorphicMatcher; - -class NotNullMatcher { - public: - // To implement a polymorphic matcher, first define a COPYABLE class - // that has three members MatchAndExplain(), DescribeTo(), and - // DescribeNegationTo(), like the following. - - // In this example, we want to use NotNull() with any pointer, so - // MatchAndExplain() accepts a pointer of any type as its first argument. - // In general, you can define MatchAndExplain() as an ordinary method or - // a method template, or even overload it. - template - bool MatchAndExplain(T* p, - MatchResultListener* /* listener */) const { - return p != NULL; - } - - // Describes the property of a value matching this matcher. - void DescribeTo(std::ostream* os) const { *os << "is not NULL"; } - - // Describes the property of a value NOT matching this matcher. - void DescribeNegationTo(std::ostream* os) const { *os << "is NULL"; } -}; - -// To construct a polymorphic matcher, pass an instance of the class -// to MakePolymorphicMatcher(). Note the return type. -PolymorphicMatcher NotNull() { - return MakePolymorphicMatcher(NotNullMatcher()); -} - -... - - EXPECT_CALL(foo, Bar(NotNull())); // The argument must be a non-NULL pointer. -``` - -**Note:** Your polymorphic matcher class does **not** need to inherit from -`MatcherInterface` or any other class, and its methods do **not** need to be -virtual. - -Like in a monomorphic matcher, you may explain the match result by streaming -additional information to the `listener` argument in `MatchAndExplain()`. - -### Writing New Cardinalities - -A cardinality is used in `Times()` to tell gMock how many times you expect a -call to occur. It doesn't have to be exact. For example, you can say -`AtLeast(5)` or `Between(2, 4)`. - -If the [built-in set](cheat_sheet.md#CardinalityList) of cardinalities doesn't -suit you, you are free to define your own by implementing the following -interface (in namespace `testing`): - -```cpp -class CardinalityInterface { - public: - virtual ~CardinalityInterface(); - - // Returns true if and only if call_count calls will satisfy this cardinality. - virtual bool IsSatisfiedByCallCount(int call_count) const = 0; - - // Returns true if and only if call_count calls will saturate this - // cardinality. - virtual bool IsSaturatedByCallCount(int call_count) const = 0; - - // Describes self to an ostream. - virtual void DescribeTo(std::ostream* os) const = 0; -}; -``` - -For example, to specify that a call must occur even number of times, you can -write - -```cpp -using ::testing::Cardinality; -using ::testing::CardinalityInterface; -using ::testing::MakeCardinality; - -class EvenNumberCardinality : public CardinalityInterface { - public: - bool IsSatisfiedByCallCount(int call_count) const override { - return (call_count % 2) == 0; - } - - bool IsSaturatedByCallCount(int call_count) const override { - return false; - } - - void DescribeTo(std::ostream* os) const { - *os << "called even number of times"; - } -}; - -Cardinality EvenNumber() { - return MakeCardinality(new EvenNumberCardinality); -} - -... - EXPECT_CALL(foo, Bar(3)) - .Times(EvenNumber()); -``` - -### Writing New Actions Quickly {#QuickNewActions} - -If the built-in actions don't work for you, you can easily define your own one. -Just define a functor class with a (possibly templated) call operator, matching -the signature of your action. - -```cpp -struct Increment { - template - T operator()(T* arg) { - return ++(*arg); - } -} -``` - -The same approach works with stateful functors (or any callable, really): - -``` -struct MultiplyBy { - template - T operator()(T arg) { return arg * multiplier; } - - int multiplier; -} - -// Then use: -// EXPECT_CALL(...).WillOnce(MultiplyBy{7}); -``` - -#### Legacy macro-based Actions - -Before C++11, the functor-based actions were not supported; the old way of -writing actions was through a set of `ACTION*` macros. We suggest to avoid them -in new code; they hide a lot of logic behind the macro, potentially leading to -harder-to-understand compiler errors. Nevertheless, we cover them here for -completeness. - -By writing - -```cpp -ACTION(name) { statements; } -``` - -in a namespace scope (i.e. not inside a class or function), you will define an -action with the given name that executes the statements. The value returned by -`statements` will be used as the return value of the action. Inside the -statements, you can refer to the K-th (0-based) argument of the mock function as -`argK`. For example: - -```cpp -ACTION(IncrementArg1) { return ++(*arg1); } -``` - -allows you to write - -```cpp -... WillOnce(IncrementArg1()); -``` - -Note that you don't need to specify the types of the mock function arguments. -Rest assured that your code is type-safe though: you'll get a compiler error if -`*arg1` doesn't support the `++` operator, or if the type of `++(*arg1)` isn't -compatible with the mock function's return type. - -Another example: - -```cpp -ACTION(Foo) { - (*arg2)(5); - Blah(); - *arg1 = 0; - return arg0; -} -``` - -defines an action `Foo()` that invokes argument #2 (a function pointer) with 5, -calls function `Blah()`, sets the value pointed to by argument #1 to 0, and -returns argument #0. - -For more convenience and flexibility, you can also use the following pre-defined -symbols in the body of `ACTION`: - -`argK_type` | The type of the K-th (0-based) argument of the mock function -:-------------- | :----------------------------------------------------------- -`args` | All arguments of the mock function as a tuple -`args_type` | The type of all arguments of the mock function as a tuple -`return_type` | The return type of the mock function -`function_type` | The type of the mock function - -For example, when using an `ACTION` as a stub action for mock function: - -```cpp -int DoSomething(bool flag, int* ptr); -``` - -we have: - -Pre-defined Symbol | Is Bound To ------------------- | --------------------------------- -`arg0` | the value of `flag` -`arg0_type` | the type `bool` -`arg1` | the value of `ptr` -`arg1_type` | the type `int*` -`args` | the tuple `(flag, ptr)` -`args_type` | the type `std::tuple` -`return_type` | the type `int` -`function_type` | the type `int(bool, int*)` - -#### Legacy macro-based parameterized Actions - -Sometimes you'll want to parameterize an action you define. For that we have -another macro - -```cpp -ACTION_P(name, param) { statements; } -``` - -For example, - -```cpp -ACTION_P(Add, n) { return arg0 + n; } -``` - -will allow you to write - -```cpp -// Returns argument #0 + 5. -... WillOnce(Add(5)); -``` - -For convenience, we use the term *arguments* for the values used to invoke the -mock function, and the term *parameters* for the values used to instantiate an -action. - -Note that you don't need to provide the type of the parameter either. Suppose -the parameter is named `param`, you can also use the gMock-defined symbol -`param_type` to refer to the type of the parameter as inferred by the compiler. -For example, in the body of `ACTION_P(Add, n)` above, you can write `n_type` for -the type of `n`. - -gMock also provides `ACTION_P2`, `ACTION_P3`, and etc to support multi-parameter -actions. For example, - -```cpp -ACTION_P2(ReturnDistanceTo, x, y) { - double dx = arg0 - x; - double dy = arg1 - y; - return sqrt(dx*dx + dy*dy); -} -``` - -lets you write - -```cpp -... WillOnce(ReturnDistanceTo(5.0, 26.5)); -``` - -You can view `ACTION` as a degenerated parameterized action where the number of -parameters is 0. - -You can also easily define actions overloaded on the number of parameters: - -```cpp -ACTION_P(Plus, a) { ... } -ACTION_P2(Plus, a, b) { ... } -``` - -### Restricting the Type of an Argument or Parameter in an ACTION - -For maximum brevity and reusability, the `ACTION*` macros don't ask you to -provide the types of the mock function arguments and the action parameters. -Instead, we let the compiler infer the types for us. - -Sometimes, however, we may want to be more explicit about the types. There are -several tricks to do that. For example: - -```cpp -ACTION(Foo) { - // Makes sure arg0 can be converted to int. - int n = arg0; - ... use n instead of arg0 here ... -} - -ACTION_P(Bar, param) { - // Makes sure the type of arg1 is const char*. - ::testing::StaticAssertTypeEq(); - - // Makes sure param can be converted to bool. - bool flag = param; -} -``` - -where `StaticAssertTypeEq` is a compile-time assertion in googletest that -verifies two types are the same. - -### Writing New Action Templates Quickly - -Sometimes you want to give an action explicit template parameters that cannot be -inferred from its value parameters. `ACTION_TEMPLATE()` supports that and can be -viewed as an extension to `ACTION()` and `ACTION_P*()`. - -The syntax: - -```cpp -ACTION_TEMPLATE(ActionName, - HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), - AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } -``` - -defines an action template that takes *m* explicit template parameters and *n* -value parameters, where *m* is in [1, 10] and *n* is in [0, 10]. `name_i` is the -name of the *i*-th template parameter, and `kind_i` specifies whether it's a -`typename`, an integral constant, or a template. `p_i` is the name of the *i*-th -value parameter. - -Example: - -```cpp -// DuplicateArg(output) converts the k-th argument of the mock -// function to type T and copies it to *output. -ACTION_TEMPLATE(DuplicateArg, - // Note the comma between int and k: - HAS_2_TEMPLATE_PARAMS(int, k, typename, T), - AND_1_VALUE_PARAMS(output)) { - *output = T(::std::get(args)); -} -``` - -To create an instance of an action template, write: - -```cpp -ActionName(v1, ..., v_n) -``` - -where the `t`s are the template arguments and the `v`s are the value arguments. -The value argument types are inferred by the compiler. For example: - -```cpp -using ::testing::_; -... - int n; - EXPECT_CALL(mock, Foo).WillOnce(DuplicateArg<1, unsigned char>(&n)); -``` - -If you want to explicitly specify the value argument types, you can provide -additional template arguments: - -```cpp -ActionName(v1, ..., v_n) -``` - -where `u_i` is the desired type of `v_i`. - -`ACTION_TEMPLATE` and `ACTION`/`ACTION_P*` can be overloaded on the number of -value parameters, but not on the number of template parameters. Without the -restriction, the meaning of the following is unclear: - -```cpp - OverloadedAction(x); -``` - -Are we using a single-template-parameter action where `bool` refers to the type -of `x`, or a two-template-parameter action where the compiler is asked to infer -the type of `x`? - -### Using the ACTION Object's Type - -If you are writing a function that returns an `ACTION` object, you'll need to -know its type. The type depends on the macro used to define the action and the -parameter types. The rule is relatively simple: - -| Given Definition | Expression | Has Type | -| ----------------------------- | ------------------- | --------------------- | -| `ACTION(Foo)` | `Foo()` | `FooAction` | -| `ACTION_TEMPLATE(Foo,` | `Foo()` : t_m>` : -: `AND_0_VALUE_PARAMS())` : : : -| `ACTION_P(Bar, param)` | `Bar(int_value)` | `BarActionP` | -| `ACTION_TEMPLATE(Bar,` | `Bar` | `FooActionP` : -: `AND_1_VALUE_PARAMS(p1))` : : : -| `ACTION_P2(Baz, p1, p2)` | `Baz(bool_value,` | `BazActionP2` : -| `ACTION_TEMPLATE(Baz,` | `Baz` | `FooActionP2` : -: `AND_2_VALUE_PARAMS(p1, p2))` : `int_value)` : : -| ... | ... | ... | - -Note that we have to pick different suffixes (`Action`, `ActionP`, `ActionP2`, -and etc) for actions with different numbers of value parameters, or the action -definitions cannot be overloaded on the number of them. - -### Writing New Monomorphic Actions {#NewMonoActions} - -While the `ACTION*` macros are very convenient, sometimes they are -inappropriate. For example, despite the tricks shown in the previous recipes, -they don't let you directly specify the types of the mock function arguments and -the action parameters, which in general leads to unoptimized compiler error -messages that can baffle unfamiliar users. They also don't allow overloading -actions based on parameter types without jumping through some hoops. - -An alternative to the `ACTION*` macros is to implement -`::testing::ActionInterface`, where `F` is the type of the mock function in -which the action will be used. For example: - -```cpp -template -class ActionInterface { - public: - virtual ~ActionInterface(); - - // Performs the action. Result is the return type of function type - // F, and ArgumentTuple is the tuple of arguments of F. - // - - // For example, if F is int(bool, const string&), then Result would - // be int, and ArgumentTuple would be ::std::tuple. - virtual Result Perform(const ArgumentTuple& args) = 0; -}; -``` - -```cpp -using ::testing::_; -using ::testing::Action; -using ::testing::ActionInterface; -using ::testing::MakeAction; - -typedef int IncrementMethod(int*); - -class IncrementArgumentAction : public ActionInterface { - public: - int Perform(const ::std::tuple& args) override { - int* p = ::std::get<0>(args); // Grabs the first argument. - return *p++; - } -}; - -Action IncrementArgument() { - return MakeAction(new IncrementArgumentAction); -} - -... - EXPECT_CALL(foo, Baz(_)) - .WillOnce(IncrementArgument()); - - int n = 5; - foo.Baz(&n); // Should return 5 and change n to 6. -``` - -### Writing New Polymorphic Actions {#NewPolyActions} - -The previous recipe showed you how to define your own action. This is all good, -except that you need to know the type of the function in which the action will -be used. Sometimes that can be a problem. For example, if you want to use the -action in functions with *different* types (e.g. like `Return()` and -`SetArgPointee()`). - -If an action can be used in several types of mock functions, we say it's -*polymorphic*. The `MakePolymorphicAction()` function template makes it easy to -define such an action: - -```cpp -namespace testing { -template -PolymorphicAction MakePolymorphicAction(const Impl& impl); -} // namespace testing -``` - -As an example, let's define an action that returns the second argument in the -mock function's argument list. The first step is to define an implementation -class: - -```cpp -class ReturnSecondArgumentAction { - public: - template - Result Perform(const ArgumentTuple& args) const { - // To get the i-th (0-based) argument, use ::std::get(args). - return ::std::get<1>(args); - } -}; -``` - -This implementation class does *not* need to inherit from any particular class. -What matters is that it must have a `Perform()` method template. This method -template takes the mock function's arguments as a tuple in a **single** -argument, and returns the result of the action. It can be either `const` or not, -but must be invokable with exactly one template argument, which is the result -type. In other words, you must be able to call `Perform(args)` where `R` is -the mock function's return type and `args` is its arguments in a tuple. - -Next, we use `MakePolymorphicAction()` to turn an instance of the implementation -class into the polymorphic action we need. It will be convenient to have a -wrapper for this: - -```cpp -using ::testing::MakePolymorphicAction; -using ::testing::PolymorphicAction; - -PolymorphicAction ReturnSecondArgument() { - return MakePolymorphicAction(ReturnSecondArgumentAction()); -} -``` - -Now, you can use this polymorphic action the same way you use the built-in ones: - -```cpp -using ::testing::_; - -class MockFoo : public Foo { - public: - MOCK_METHOD(int, DoThis, (bool flag, int n), (override)); - MOCK_METHOD(string, DoThat, (int x, const char* str1, const char* str2), - (override)); -}; - - ... - MockFoo foo; - EXPECT_CALL(foo, DoThis).WillOnce(ReturnSecondArgument()); - EXPECT_CALL(foo, DoThat).WillOnce(ReturnSecondArgument()); - ... - foo.DoThis(true, 5); // Will return 5. - foo.DoThat(1, "Hi", "Bye"); // Will return "Hi". -``` - -### Teaching gMock How to Print Your Values - -When an uninteresting or unexpected call occurs, gMock prints the argument -values and the stack trace to help you debug. Assertion macros like -`EXPECT_THAT` and `EXPECT_EQ` also print the values in question when the -assertion fails. gMock and googletest do this using googletest's user-extensible -value printer. - -This printer knows how to print built-in C++ types, native arrays, STL -containers, and any type that supports the `<<` operator. For other types, it -prints the raw bytes in the value and hopes that you the user can figure it out. -[googletest's advanced guide](../../googletest/docs/advanced.md#teaching-googletest-how-to-print-your-values) -explains how to extend the printer to do a better job at printing your -particular type than to dump the bytes. - -## Useful Mocks Created Using gMock - - - - -### Mock std::function {#MockFunction} - -`std::function` is a general function type introduced in C++11. It is a -preferred way of passing callbacks to new interfaces. Functions are copiable, -and are not usually passed around by pointer, which makes them tricky to mock. -But fear not - `MockFunction` can help you with that. - -`MockFunction` has a mock method `Call()` with the signature: - -```cpp - R Call(T1, ..., Tn); -``` - -It also has a `AsStdFunction()` method, which creates a `std::function` proxy -forwarding to Call: - -```cpp - std::function AsStdFunction(); -``` - -To use `MockFunction`, first create `MockFunction` object and set up -expectations on its `Call` method. Then pass proxy obtained from -`AsStdFunction()` to the code you are testing. For example: - -```cpp -TEST(FooTest, RunsCallbackWithBarArgument) { - // 1. Create a mock object. - MockFunction mock_function; - - // 2. Set expectations on Call() method. - EXPECT_CALL(mock_function, Call("bar")).WillOnce(Return(1)); - - // 3. Exercise code that uses std::function. - Foo(mock_function.AsStdFunction()); - // Foo's signature can be either of: - // void Foo(const std::function& fun); - // void Foo(std::function fun); - - // 4. All expectations will be verified when mock_function - // goes out of scope and is destroyed. -} -``` - -Remember that function objects created with `AsStdFunction()` are just -forwarders. If you create multiple of them, they will share the same set of -expectations. - -Although `std::function` supports unlimited number of arguments, `MockFunction` -implementation is limited to ten. If you ever hit that limit... well, your -callback has bigger problems than being mockable. :-) - - diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/for_dummies.md b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/for_dummies.md deleted file mode 100644 index e11c18d..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/for_dummies.md +++ /dev/null @@ -1,700 +0,0 @@ -## gMock for Dummies {#GMockForDummies} - - - -### What Is gMock? - -When you write a prototype or test, often it's not feasible or wise to rely on -real objects entirely. A **mock object** implements the same interface as a real -object (so it can be used as one), but lets you specify at run time how it will -be used and what it should do (which methods will be called? in which order? how -many times? with what arguments? what will they return? etc). - -**Note:** It is easy to confuse the term *fake objects* with mock objects. Fakes -and mocks actually mean very different things in the Test-Driven Development -(TDD) community: - -* **Fake** objects have working implementations, but usually take some - shortcut (perhaps to make the operations less expensive), which makes them - not suitable for production. An in-memory file system would be an example of - a fake. -* **Mocks** are objects pre-programmed with *expectations*, which form a - specification of the calls they are expected to receive. - -If all this seems too abstract for you, don't worry - the most important thing -to remember is that a mock allows you to check the *interaction* between itself -and code that uses it. The difference between fakes and mocks shall become much -clearer once you start to use mocks. - -**gMock** is a library (sometimes we also call it a "framework" to make it sound -cool) for creating mock classes and using them. It does to C++ what -jMock/EasyMock does to Java (well, more or less). - -When using gMock, - -1. first, you use some simple macros to describe the interface you want to - mock, and they will expand to the implementation of your mock class; -2. next, you create some mock objects and specify its expectations and behavior - using an intuitive syntax; -3. then you exercise code that uses the mock objects. gMock will catch any - violation to the expectations as soon as it arises. - -### Why gMock? - -While mock objects help you remove unnecessary dependencies in tests and make -them fast and reliable, using mocks manually in C++ is *hard*: - -* Someone has to implement the mocks. The job is usually tedious and - error-prone. No wonder people go great distance to avoid it. -* The quality of those manually written mocks is a bit, uh, unpredictable. You - may see some really polished ones, but you may also see some that were - hacked up in a hurry and have all sorts of ad hoc restrictions. -* The knowledge you gained from using one mock doesn't transfer to the next - one. - -In contrast, Java and Python programmers have some fine mock frameworks (jMock, -EasyMock, [Mox](http://wtf/mox), etc), which automate the creation of mocks. As -a result, mocking is a proven effective technique and widely adopted practice in -those communities. Having the right tool absolutely makes the difference. - -gMock was built to help C++ programmers. It was inspired by jMock and EasyMock, -but designed with C++'s specifics in mind. It is your friend if any of the -following problems is bothering you: - -* You are stuck with a sub-optimal design and wish you had done more - prototyping before it was too late, but prototyping in C++ is by no means - "rapid". -* Your tests are slow as they depend on too many libraries or use expensive - resources (e.g. a database). -* Your tests are brittle as some resources they use are unreliable (e.g. the - network). -* You want to test how your code handles a failure (e.g. a file checksum - error), but it's not easy to cause one. -* You need to make sure that your module interacts with other modules in the - right way, but it's hard to observe the interaction; therefore you resort to - observing the side effects at the end of the action, but it's awkward at - best. -* You want to "mock out" your dependencies, except that they don't have mock - implementations yet; and, frankly, you aren't thrilled by some of those - hand-written mocks. - -We encourage you to use gMock as - -* a *design* tool, for it lets you experiment with your interface design early - and often. More iterations lead to better designs! -* a *testing* tool to cut your tests' outbound dependencies and probe the - interaction between your module and its collaborators. - -### Getting Started - -gMock is bundled with googletest. - -### A Case for Mock Turtles - -Let's look at an example. Suppose you are developing a graphics program that -relies on a [LOGO](http://en.wikipedia.org/wiki/Logo_programming_language)-like -API for drawing. How would you test that it does the right thing? Well, you can -run it and compare the screen with a golden screen snapshot, but let's admit it: -tests like this are expensive to run and fragile (What if you just upgraded to a -shiny new graphics card that has better anti-aliasing? Suddenly you have to -update all your golden images.). It would be too painful if all your tests are -like this. Fortunately, you learned about -[Dependency Injection](http://en.wikipedia.org/wiki/Dependency_injection) and know the right thing -to do: instead of having your application talk to the system API directly, wrap -the API in an interface (say, `Turtle`) and code to that interface: - -```cpp -class Turtle { - ... - virtual ~Turtle() {}; - virtual void PenUp() = 0; - virtual void PenDown() = 0; - virtual void Forward(int distance) = 0; - virtual void Turn(int degrees) = 0; - virtual void GoTo(int x, int y) = 0; - virtual int GetX() const = 0; - virtual int GetY() const = 0; -}; -``` - -(Note that the destructor of `Turtle` **must** be virtual, as is the case for -**all** classes you intend to inherit from - otherwise the destructor of the -derived class will not be called when you delete an object through a base -pointer, and you'll get corrupted program states like memory leaks.) - -You can control whether the turtle's movement will leave a trace using `PenUp()` -and `PenDown()`, and control its movement using `Forward()`, `Turn()`, and -`GoTo()`. Finally, `GetX()` and `GetY()` tell you the current position of the -turtle. - -Your program will normally use a real implementation of this interface. In -tests, you can use a mock implementation instead. This allows you to easily -check what drawing primitives your program is calling, with what arguments, and -in which order. Tests written this way are much more robust (they won't break -because your new machine does anti-aliasing differently), easier to read and -maintain (the intent of a test is expressed in the code, not in some binary -images), and run *much, much faster*. - -### Writing the Mock Class - -If you are lucky, the mocks you need to use have already been implemented by -some nice people. If, however, you find yourself in the position to write a mock -class, relax - gMock turns this task into a fun game! (Well, almost.) - -#### How to Define It - -Using the `Turtle` interface as example, here are the simple steps you need to -follow: - -* Derive a class `MockTurtle` from `Turtle`. -* Take a *virtual* function of `Turtle` (while it's possible to - [mock non-virtual methods using templates](cook_book.md#MockingNonVirtualMethods), - it's much more involved). -* In the `public:` section of the child class, write `MOCK_METHOD();` -* Now comes the fun part: you take the function signature, cut-and-paste it - into the macro, and add two commas - one between the return type and the - name, another between the name and the argument list. -* If you're mocking a const method, add a 4th parameter containing `(const)` - (the parentheses are required). -* Since you're overriding a virtual method, we suggest adding the `override` - keyword. For const methods the 4th parameter becomes `(const, override)`, - for non-const methods just `(override)`. This isn't mandatory. -* Repeat until all virtual functions you want to mock are done. (It goes - without saying that *all* pure virtual methods in your abstract class must - be either mocked or overridden.) - -After the process, you should have something like: - -```cpp -#include "gmock/gmock.h" // Brings in gMock. - -class MockTurtle : public Turtle { - public: - ... - MOCK_METHOD(void, PenUp, (), (override)); - MOCK_METHOD(void, PenDown, (), (override)); - MOCK_METHOD(void, Forward, (int distance), (override)); - MOCK_METHOD(void, Turn, (int degrees), (override)); - MOCK_METHOD(void, GoTo, (int x, int y), (override)); - MOCK_METHOD(int, GetX, (), (const, override)); - MOCK_METHOD(int, GetY, (), (const, override)); -}; -``` - -You don't need to define these mock methods somewhere else - the `MOCK_METHOD` -macro will generate the definitions for you. It's that simple! - -#### Where to Put It - -When you define a mock class, you need to decide where to put its definition. -Some people put it in a `_test.cc`. This is fine when the interface being mocked -(say, `Foo`) is owned by the same person or team. Otherwise, when the owner of -`Foo` changes it, your test could break. (You can't really expect `Foo`'s -maintainer to fix every test that uses `Foo`, can you?) - -So, the rule of thumb is: if you need to mock `Foo` and it's owned by others, -define the mock class in `Foo`'s package (better, in a `testing` sub-package -such that you can clearly separate production code and testing utilities), put -it in a `.h` and a `cc_library`. Then everyone can reference them from their -tests. If `Foo` ever changes, there is only one copy of `MockFoo` to change, and -only tests that depend on the changed methods need to be fixed. - -Another way to do it: you can introduce a thin layer `FooAdaptor` on top of -`Foo` and code to this new interface. Since you own `FooAdaptor`, you can absorb -changes in `Foo` much more easily. While this is more work initially, carefully -choosing the adaptor interface can make your code easier to write and more -readable (a net win in the long run), as you can choose `FooAdaptor` to fit your -specific domain much better than `Foo` does. - - - -### Using Mocks in Tests - -Once you have a mock class, using it is easy. The typical work flow is: - -1. Import the gMock names from the `testing` namespace such that you can use - them unqualified (You only have to do it once per file. Remember that - namespaces are a good idea. -2. Create some mock objects. -3. Specify your expectations on them (How many times will a method be called? - With what arguments? What should it do? etc.). -4. Exercise some code that uses the mocks; optionally, check the result using - googletest assertions. If a mock method is called more than expected or with - wrong arguments, you'll get an error immediately. -5. When a mock is destructed, gMock will automatically check whether all - expectations on it have been satisfied. - -Here's an example: - -```cpp -#include "path/to/mock-turtle.h" -#include "gmock/gmock.h" -#include "gtest/gtest.h" - -using ::testing::AtLeast; // #1 - -TEST(PainterTest, CanDrawSomething) { - MockTurtle turtle; // #2 - EXPECT_CALL(turtle, PenDown()) // #3 - .Times(AtLeast(1)); - - Painter painter(&turtle); // #4 - - EXPECT_TRUE(painter.DrawCircle(0, 0, 10)); // #5 -} -``` - -As you might have guessed, this test checks that `PenDown()` is called at least -once. If the `painter` object didn't call this method, your test will fail with -a message like this: - -```text -path/to/my_test.cc:119: Failure -Actual function call count doesn't match this expectation: -Actually: never called; -Expected: called at least once. -Stack trace: -... -``` - -**Tip 1:** If you run the test from an Emacs buffer, you can hit on the -line number to jump right to the failed expectation. - -**Tip 2:** If your mock objects are never deleted, the final verification won't -happen. Therefore it's a good idea to turn on the heap checker in your tests -when you allocate mocks on the heap. You get that automatically if you use the -`gtest_main` library already. - -**Important note:** gMock requires expectations to be set **before** the mock -functions are called, otherwise the behavior is **undefined**. In particular, -you mustn't interleave `EXPECT_CALL()s` and calls to the mock functions. - -This means `EXPECT_CALL()` should be read as expecting that a call will occur -*in the future*, not that a call has occurred. Why does gMock work like that? -Well, specifying the expectation beforehand allows gMock to report a violation -as soon as it rises, when the context (stack trace, etc) is still available. -This makes debugging much easier. - -Admittedly, this test is contrived and doesn't do much. You can easily achieve -the same effect without using gMock. However, as we shall reveal soon, gMock -allows you to do *so much more* with the mocks. - -### Setting Expectations - -The key to using a mock object successfully is to set the *right expectations* -on it. If you set the expectations too strict, your test will fail as the result -of unrelated changes. If you set them too loose, bugs can slip through. You want -to do it just right such that your test can catch exactly the kind of bugs you -intend it to catch. gMock provides the necessary means for you to do it "just -right." - -#### General Syntax - -In gMock we use the `EXPECT_CALL()` macro to set an expectation on a mock -method. The general syntax is: - -```cpp -EXPECT_CALL(mock_object, method(matchers)) - .Times(cardinality) - .WillOnce(action) - .WillRepeatedly(action); -``` - -The macro has two arguments: first the mock object, and then the method and its -arguments. Note that the two are separated by a comma (`,`), not a period (`.`). -(Why using a comma? The answer is that it was necessary for technical reasons.) -If the method is not overloaded, the macro can also be called without matchers: - -```cpp -EXPECT_CALL(mock_object, non-overloaded-method) - .Times(cardinality) - .WillOnce(action) - .WillRepeatedly(action); -``` - -This syntax allows the test writer to specify "called with any arguments" -without explicitly specifying the number or types of arguments. To avoid -unintended ambiguity, this syntax may only be used for methods which are not -overloaded - -Either form of the macro can be followed by some optional *clauses* that provide -more information about the expectation. We'll discuss how each clause works in -the coming sections. - -This syntax is designed to make an expectation read like English. For example, -you can probably guess that - -```cpp -using ::testing::Return; -... -EXPECT_CALL(turtle, GetX()) - .Times(5) - .WillOnce(Return(100)) - .WillOnce(Return(150)) - .WillRepeatedly(Return(200)); -``` - -says that the `turtle` object's `GetX()` method will be called five times, it -will return 100 the first time, 150 the second time, and then 200 every time. -Some people like to call this style of syntax a Domain-Specific Language (DSL). - -**Note:** Why do we use a macro to do this? Well it serves two purposes: first -it makes expectations easily identifiable (either by `gsearch` or by a human -reader), and second it allows gMock to include the source file location of a -failed expectation in messages, making debugging easier. - -#### Matchers: What Arguments Do We Expect? - -When a mock function takes arguments, we may specify what arguments we are -expecting, for example: - -```cpp -// Expects the turtle to move forward by 100 units. -EXPECT_CALL(turtle, Forward(100)); -``` - -Oftentimes you do not want to be too specific. Remember that talk about tests -being too rigid? Over specification leads to brittle tests and obscures the -intent of tests. Therefore we encourage you to specify only what's necessary—no -more, no less. If you aren't interested in the value of an argument, write `_` -as the argument, which means "anything goes": - -```cpp -using ::testing::_; -... -// Expects that the turtle jumps to somewhere on the x=50 line. -EXPECT_CALL(turtle, GoTo(50, _)); -``` - -`_` is an instance of what we call **matchers**. A matcher is like a predicate -and can test whether an argument is what we'd expect. You can use a matcher -inside `EXPECT_CALL()` wherever a function argument is expected. `_` is a -convenient way of saying "any value". - -In the above examples, `100` and `50` are also matchers; implicitly, they are -the same as `Eq(100)` and `Eq(50)`, which specify that the argument must be -equal (using `operator==`) to the matcher argument. There are many -[built-in matchers](#MatcherList) for common types (as well as -[custom matchers](cook_book.md#NewMatchers)); for example: - -```cpp -using ::testing::Ge; -... -// Expects the turtle moves forward by at least 100. -EXPECT_CALL(turtle, Forward(Ge(100))); -``` - -If you don't care about *any* arguments, rather than specify `_` for each of -them you may instead omit the parameter list: - -```cpp -// Expects the turtle to move forward. -EXPECT_CALL(turtle, Forward); -// Expects the turtle to jump somewhere. -EXPECT_CALL(turtle, GoTo); -``` - -This works for all non-overloaded methods; if a method is overloaded, you need -to help gMock resolve which overload is expected by specifying the number of -arguments and possibly also the -[types of the arguments](cook_book.md#SelectOverload). - -#### Cardinalities: How Many Times Will It Be Called? - -The first clause we can specify following an `EXPECT_CALL()` is `Times()`. We -call its argument a **cardinality** as it tells *how many times* the call should -occur. It allows us to repeat an expectation many times without actually writing -it as many times. More importantly, a cardinality can be "fuzzy", just like a -matcher can be. This allows a user to express the intent of a test exactly. - -An interesting special case is when we say `Times(0)`. You may have guessed - it -means that the function shouldn't be called with the given arguments at all, and -gMock will report a googletest failure whenever the function is (wrongfully) -called. - -We've seen `AtLeast(n)` as an example of fuzzy cardinalities earlier. For the -list of built-in cardinalities you can use, see -[here](cheat_sheet.md#CardinalityList). - -The `Times()` clause can be omitted. **If you omit `Times()`, gMock will infer -the cardinality for you.** The rules are easy to remember: - -* If **neither** `WillOnce()` **nor** `WillRepeatedly()` is in the - `EXPECT_CALL()`, the inferred cardinality is `Times(1)`. -* If there are *n* `WillOnce()`'s but **no** `WillRepeatedly()`, where *n* >= - 1, the cardinality is `Times(n)`. -* If there are *n* `WillOnce()`'s and **one** `WillRepeatedly()`, where *n* >= - 0, the cardinality is `Times(AtLeast(n))`. - -**Quick quiz:** what do you think will happen if a function is expected to be -called twice but actually called four times? - -#### Actions: What Should It Do? - -Remember that a mock object doesn't really have a working implementation? We as -users have to tell it what to do when a method is invoked. This is easy in -gMock. - -First, if the return type of a mock function is a built-in type or a pointer, -the function has a **default action** (a `void` function will just return, a -`bool` function will return `false`, and other functions will return 0). In -addition, in C++ 11 and above, a mock function whose return type is -default-constructible (i.e. has a default constructor) has a default action of -returning a default-constructed value. If you don't say anything, this behavior -will be used. - -Second, if a mock function doesn't have a default action, or the default action -doesn't suit you, you can specify the action to be taken each time the -expectation matches using a series of `WillOnce()` clauses followed by an -optional `WillRepeatedly()`. For example, - -```cpp -using ::testing::Return; -... -EXPECT_CALL(turtle, GetX()) - .WillOnce(Return(100)) - .WillOnce(Return(200)) - .WillOnce(Return(300)); -``` - -says that `turtle.GetX()` will be called *exactly three times* (gMock inferred -this from how many `WillOnce()` clauses we've written, since we didn't -explicitly write `Times()`), and will return 100, 200, and 300 respectively. - -```cpp -using ::testing::Return; -... -EXPECT_CALL(turtle, GetY()) - .WillOnce(Return(100)) - .WillOnce(Return(200)) - .WillRepeatedly(Return(300)); -``` - -says that `turtle.GetY()` will be called *at least twice* (gMock knows this as -we've written two `WillOnce()` clauses and a `WillRepeatedly()` while having no -explicit `Times()`), will return 100 and 200 respectively the first two times, -and 300 from the third time on. - -Of course, if you explicitly write a `Times()`, gMock will not try to infer the -cardinality itself. What if the number you specified is larger than there are -`WillOnce()` clauses? Well, after all `WillOnce()`s are used up, gMock will do -the *default* action for the function every time (unless, of course, you have a -`WillRepeatedly()`.). - -What can we do inside `WillOnce()` besides `Return()`? You can return a -reference using `ReturnRef(*variable*)`, or invoke a pre-defined function, among -[others](cook_book.md#using-actions). - -**Important note:** The `EXPECT_CALL()` statement evaluates the action clause -only once, even though the action may be performed many times. Therefore you -must be careful about side effects. The following may not do what you want: - -```cpp -using ::testing::Return; -... -int n = 100; -EXPECT_CALL(turtle, GetX()) - .Times(4) - .WillRepeatedly(Return(n++)); -``` - -Instead of returning 100, 101, 102, ..., consecutively, this mock function will -always return 100 as `n++` is only evaluated once. Similarly, `Return(new Foo)` -will create a new `Foo` object when the `EXPECT_CALL()` is executed, and will -return the same pointer every time. If you want the side effect to happen every -time, you need to define a custom action, which we'll teach in the -[cook book](http://). - -Time for another quiz! What do you think the following means? - -```cpp -using ::testing::Return; -... -EXPECT_CALL(turtle, GetY()) - .Times(4) - .WillOnce(Return(100)); -``` - -Obviously `turtle.GetY()` is expected to be called four times. But if you think -it will return 100 every time, think twice! Remember that one `WillOnce()` -clause will be consumed each time the function is invoked and the default action -will be taken afterwards. So the right answer is that `turtle.GetY()` will -return 100 the first time, but **return 0 from the second time on**, as -returning 0 is the default action for `int` functions. - -#### Using Multiple Expectations {#MultiExpectations} - -So far we've only shown examples where you have a single expectation. More -realistically, you'll specify expectations on multiple mock methods which may be -from multiple mock objects. - -By default, when a mock method is invoked, gMock will search the expectations in -the **reverse order** they are defined, and stop when an active expectation that -matches the arguments is found (you can think of it as "newer rules override -older ones."). If the matching expectation cannot take any more calls, you will -get an upper-bound-violated failure. Here's an example: - -```cpp -using ::testing::_; -... -EXPECT_CALL(turtle, Forward(_)); // #1 -EXPECT_CALL(turtle, Forward(10)) // #2 - .Times(2); -``` - -If `Forward(10)` is called three times in a row, the third time it will be an -error, as the last matching expectation (#2) has been saturated. If, however, -the third `Forward(10)` call is replaced by `Forward(20)`, then it would be OK, -as now #1 will be the matching expectation. - -**Note:** Why does gMock search for a match in the *reverse* order of the -expectations? The reason is that this allows a user to set up the default -expectations in a mock object's constructor or the test fixture's set-up phase -and then customize the mock by writing more specific expectations in the test -body. So, if you have two expectations on the same method, you want to put the -one with more specific matchers **after** the other, or the more specific rule -would be shadowed by the more general one that comes after it. - -**Tip:** It is very common to start with a catch-all expectation for a method -and `Times(AnyNumber())` (omitting arguments, or with `_` for all arguments, if -overloaded). This makes any calls to the method expected. This is not necessary -for methods that are not mentioned at all (these are "uninteresting"), but is -useful for methods that have some expectations, but for which other calls are -ok. See -[Understanding Uninteresting vs Unexpected Calls](cook_book.md#uninteresting-vs-unexpected). - -#### Ordered vs Unordered Calls {#OrderedCalls} - -By default, an expectation can match a call even though an earlier expectation -hasn't been satisfied. In other words, the calls don't have to occur in the -order the expectations are specified. - -Sometimes, you may want all the expected calls to occur in a strict order. To -say this in gMock is easy: - -```cpp -using ::testing::InSequence; -... -TEST(FooTest, DrawsLineSegment) { - ... - { - InSequence seq; - - EXPECT_CALL(turtle, PenDown()); - EXPECT_CALL(turtle, Forward(100)); - EXPECT_CALL(turtle, PenUp()); - } - Foo(); -} -``` - -By creating an object of type `InSequence`, all expectations in its scope are -put into a *sequence* and have to occur *sequentially*. Since we are just -relying on the constructor and destructor of this object to do the actual work, -its name is really irrelevant. - -In this example, we test that `Foo()` calls the three expected functions in the -order as written. If a call is made out-of-order, it will be an error. - -(What if you care about the relative order of some of the calls, but not all of -them? Can you specify an arbitrary partial order? The answer is ... yes! The -details can be found [here](cook_book.md#OrderedCalls).) - -#### All Expectations Are Sticky (Unless Said Otherwise) {#StickyExpectations} - -Now let's do a quick quiz to see how well you can use this mock stuff already. -How would you test that the turtle is asked to go to the origin *exactly twice* -(you want to ignore any other instructions it receives)? - -After you've come up with your answer, take a look at ours and compare notes -(solve it yourself first - don't cheat!): - -```cpp -using ::testing::_; -using ::testing::AnyNumber; -... -EXPECT_CALL(turtle, GoTo(_, _)) // #1 - .Times(AnyNumber()); -EXPECT_CALL(turtle, GoTo(0, 0)) // #2 - .Times(2); -``` - -Suppose `turtle.GoTo(0, 0)` is called three times. In the third time, gMock will -see that the arguments match expectation #2 (remember that we always pick the -last matching expectation). Now, since we said that there should be only two -such calls, gMock will report an error immediately. This is basically what we've -told you in the [Using Multiple Expectations](#MultiExpectations) section above. - -This example shows that **expectations in gMock are "sticky" by default**, in -the sense that they remain active even after we have reached their invocation -upper bounds. This is an important rule to remember, as it affects the meaning -of the spec, and is **different** to how it's done in many other mocking -frameworks (Why'd we do that? Because we think our rule makes the common cases -easier to express and understand.). - -Simple? Let's see if you've really understood it: what does the following code -say? - -```cpp -using ::testing::Return; -... -for (int i = n; i > 0; i--) { - EXPECT_CALL(turtle, GetX()) - .WillOnce(Return(10*i)); -} -``` - -If you think it says that `turtle.GetX()` will be called `n` times and will -return 10, 20, 30, ..., consecutively, think twice! The problem is that, as we -said, expectations are sticky. So, the second time `turtle.GetX()` is called, -the last (latest) `EXPECT_CALL()` statement will match, and will immediately -lead to an "upper bound violated" error - this piece of code is not very useful! - -One correct way of saying that `turtle.GetX()` will return 10, 20, 30, ..., is -to explicitly say that the expectations are *not* sticky. In other words, they -should *retire* as soon as they are saturated: - -```cpp -using ::testing::Return; -... -for (int i = n; i > 0; i--) { - EXPECT_CALL(turtle, GetX()) - .WillOnce(Return(10*i)) - .RetiresOnSaturation(); -} -``` - -And, there's a better way to do it: in this case, we expect the calls to occur -in a specific order, and we line up the actions to match the order. Since the -order is important here, we should make it explicit using a sequence: - -```cpp -using ::testing::InSequence; -using ::testing::Return; -... -{ - InSequence s; - - for (int i = 1; i <= n; i++) { - EXPECT_CALL(turtle, GetX()) - .WillOnce(Return(10*i)) - .RetiresOnSaturation(); - } -} -``` - -By the way, the other situation where an expectation may *not* be sticky is when -it's in a sequence - as soon as another expectation that comes after it in the -sequence has been used, it automatically retires (and will never be used to -match any call). - -#### Uninteresting Calls - -A mock object may have many methods, and not all of them are that interesting. -For example, in some tests we may not care about how many times `GetX()` and -`GetY()` get called. - -In gMock, if you are not interested in a method, just don't say anything about -it. If a call to this method occurs, you'll see a warning in the test output, -but it won't be a failure. This is called "naggy" behavior; to change, see -[The Nice, the Strict, and the Naggy](cook_book.md#NiceStrictNaggy). diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/gmock_faq.md b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/gmock_faq.md deleted file mode 100644 index 214aabf..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/docs/gmock_faq.md +++ /dev/null @@ -1,396 +0,0 @@ -## Legacy gMock FAQ {#GMockFaq} - - - -### When I call a method on my mock object, the method for the real object is invoked instead. What's the problem? - -In order for a method to be mocked, it must be *virtual*, unless you use the -[high-perf dependency injection technique](#MockingNonVirtualMethods). - -### Can I mock a variadic function? - -You cannot mock a variadic function (i.e. a function taking ellipsis (`...`) -arguments) directly in gMock. - -The problem is that in general, there is *no way* for a mock object to know how -many arguments are passed to the variadic method, and what the arguments' types -are. Only the *author of the base class* knows the protocol, and we cannot look -into his or her head. - -Therefore, to mock such a function, the *user* must teach the mock object how to -figure out the number of arguments and their types. One way to do it is to -provide overloaded versions of the function. - -Ellipsis arguments are inherited from C and not really a C++ feature. They are -unsafe to use and don't work with arguments that have constructors or -destructors. Therefore we recommend to avoid them in C++ as much as possible. - -### MSVC gives me warning C4301 or C4373 when I define a mock method with a const parameter. Why? - -If you compile this using Microsoft Visual C++ 2005 SP1: - -```cpp -class Foo { - ... - virtual void Bar(const int i) = 0; -}; - -class MockFoo : public Foo { - ... - MOCK_METHOD(void, Bar, (const int i), (override)); -}; -``` - -You may get the following warning: - -```shell -warning C4301: 'MockFoo::Bar': overriding virtual function only differs from 'Foo::Bar' by const/volatile qualifier -``` - -This is a MSVC bug. The same code compiles fine with gcc, for example. If you -use Visual C++ 2008 SP1, you would get the warning: - -```shell -warning C4373: 'MockFoo::Bar': virtual function overrides 'Foo::Bar', previous versions of the compiler did not override when parameters only differed by const/volatile qualifiers -``` - -In C++, if you *declare* a function with a `const` parameter, the `const` -modifier is ignored. Therefore, the `Foo` base class above is equivalent to: - -```cpp -class Foo { - ... - virtual void Bar(int i) = 0; // int or const int? Makes no difference. -}; -``` - -In fact, you can *declare* `Bar()` with an `int` parameter, and define it with a -`const int` parameter. The compiler will still match them up. - -Since making a parameter `const` is meaningless in the method declaration, we -recommend to remove it in both `Foo` and `MockFoo`. That should workaround the -VC bug. - -Note that we are talking about the *top-level* `const` modifier here. If the -function parameter is passed by pointer or reference, declaring the pointee or -referee as `const` is still meaningful. For example, the following two -declarations are *not* equivalent: - -```cpp -void Bar(int* p); // Neither p nor *p is const. -void Bar(const int* p); // p is not const, but *p is. -``` - - - -### I can't figure out why gMock thinks my expectations are not satisfied. What should I do? - -You might want to run your test with `--gmock_verbose=info`. This flag lets -gMock print a trace of every mock function call it receives. By studying the -trace, you'll gain insights on why the expectations you set are not met. - -If you see the message "The mock function has no default action set, and its -return type has no default value set.", then try -[adding a default action](for_dummies.md#DefaultValue). Due to a known issue, -unexpected calls on mocks without default actions don't print out a detailed -comparison between the actual arguments and the expected arguments. - -### My program crashed and `ScopedMockLog` spit out tons of messages. Is it a gMock bug? - -gMock and `ScopedMockLog` are likely doing the right thing here. - -When a test crashes, the failure signal handler will try to log a lot of -information (the stack trace, and the address map, for example). The messages -are compounded if you have many threads with depth stacks. When `ScopedMockLog` -intercepts these messages and finds that they don't match any expectations, it -prints an error for each of them. - -You can learn to ignore the errors, or you can rewrite your expectations to make -your test more robust, for example, by adding something like: - -```cpp -using ::testing::AnyNumber; -using ::testing::Not; -... - // Ignores any log not done by us. - EXPECT_CALL(log, Log(_, Not(EndsWith("/my_file.cc")), _)) - .Times(AnyNumber()); -``` - -### How can I assert that a function is NEVER called? - -```cpp -using ::testing::_; -... - EXPECT_CALL(foo, Bar(_)) - .Times(0); -``` - - - -### I have a failed test where gMock tells me TWICE that a particular expectation is not satisfied. Isn't this redundant? - -When gMock detects a failure, it prints relevant information (the mock function -arguments, the state of relevant expectations, and etc) to help the user debug. -If another failure is detected, gMock will do the same, including printing the -state of relevant expectations. - -Sometimes an expectation's state didn't change between two failures, and you'll -see the same description of the state twice. They are however *not* redundant, -as they refer to *different points in time*. The fact they are the same *is* -interesting information. - -### I get a heapcheck failure when using a mock object, but using a real object is fine. What can be wrong? - -Does the class (hopefully a pure interface) you are mocking have a virtual -destructor? - -Whenever you derive from a base class, make sure its destructor is virtual. -Otherwise Bad Things will happen. Consider the following code: - -```cpp -class Base { - public: - // Not virtual, but should be. - ~Base() { ... } - ... -}; - -class Derived : public Base { - public: - ... - private: - std::string value_; -}; - -... - Base* p = new Derived; - ... - delete p; // Surprise! ~Base() will be called, but ~Derived() will not - // - value_ is leaked. -``` - -By changing `~Base()` to virtual, `~Derived()` will be correctly called when -`delete p` is executed, and the heap checker will be happy. - -### The "newer expectations override older ones" rule makes writing expectations awkward. Why does gMock do that? - -When people complain about this, often they are referring to code like: - -```cpp -using ::testing::Return; -... - // foo.Bar() should be called twice, return 1 the first time, and return - // 2 the second time. However, I have to write the expectations in the - // reverse order. This sucks big time!!! - EXPECT_CALL(foo, Bar()) - .WillOnce(Return(2)) - .RetiresOnSaturation(); - EXPECT_CALL(foo, Bar()) - .WillOnce(Return(1)) - .RetiresOnSaturation(); -``` - -The problem, is that they didn't pick the **best** way to express the test's -intent. - -By default, expectations don't have to be matched in *any* particular order. If -you want them to match in a certain order, you need to be explicit. This is -gMock's (and jMock's) fundamental philosophy: it's easy to accidentally -over-specify your tests, and we want to make it harder to do so. - -There are two better ways to write the test spec. You could either put the -expectations in sequence: - -```cpp -using ::testing::Return; -... - // foo.Bar() should be called twice, return 1 the first time, and return - // 2 the second time. Using a sequence, we can write the expectations - // in their natural order. - { - InSequence s; - EXPECT_CALL(foo, Bar()) - .WillOnce(Return(1)) - .RetiresOnSaturation(); - EXPECT_CALL(foo, Bar()) - .WillOnce(Return(2)) - .RetiresOnSaturation(); - } -``` - -or you can put the sequence of actions in the same expectation: - -```cpp -using ::testing::Return; -... - // foo.Bar() should be called twice, return 1 the first time, and return - // 2 the second time. - EXPECT_CALL(foo, Bar()) - .WillOnce(Return(1)) - .WillOnce(Return(2)) - .RetiresOnSaturation(); -``` - -Back to the original questions: why does gMock search the expectations (and -`ON_CALL`s) from back to front? Because this allows a user to set up a mock's -behavior for the common case early (e.g. in the mock's constructor or the test -fixture's set-up phase) and customize it with more specific rules later. If -gMock searches from front to back, this very useful pattern won't be possible. - -### gMock prints a warning when a function without EXPECT_CALL is called, even if I have set its behavior using ON_CALL. Would it be reasonable not to show the warning in this case? - -When choosing between being neat and being safe, we lean toward the latter. So -the answer is that we think it's better to show the warning. - -Often people write `ON_CALL`s in the mock object's constructor or `SetUp()`, as -the default behavior rarely changes from test to test. Then in the test body -they set the expectations, which are often different for each test. Having an -`ON_CALL` in the set-up part of a test doesn't mean that the calls are expected. -If there's no `EXPECT_CALL` and the method is called, it's possibly an error. If -we quietly let the call go through without notifying the user, bugs may creep in -unnoticed. - -If, however, you are sure that the calls are OK, you can write - -```cpp -using ::testing::_; -... - EXPECT_CALL(foo, Bar(_)) - .WillRepeatedly(...); -``` - -instead of - -```cpp -using ::testing::_; -... - ON_CALL(foo, Bar(_)) - .WillByDefault(...); -``` - -This tells gMock that you do expect the calls and no warning should be printed. - -Also, you can control the verbosity by specifying `--gmock_verbose=error`. Other -values are `info` and `warning`. If you find the output too noisy when -debugging, just choose a less verbose level. - -### How can I delete the mock function's argument in an action? - -If your mock function takes a pointer argument and you want to delete that -argument, you can use testing::DeleteArg() to delete the N'th (zero-indexed) -argument: - -```cpp -using ::testing::_; - ... - MOCK_METHOD(void, Bar, (X* x, const Y& y)); - ... - EXPECT_CALL(mock_foo_, Bar(_, _)) - .WillOnce(testing::DeleteArg<0>())); -``` - -### How can I perform an arbitrary action on a mock function's argument? - -If you find yourself needing to perform some action that's not supported by -gMock directly, remember that you can define your own actions using -[`MakeAction()`](#NewMonoActions) or -[`MakePolymorphicAction()`](#NewPolyActions), or you can write a stub function -and invoke it using [`Invoke()`](#FunctionsAsActions). - -```cpp -using ::testing::_; -using ::testing::Invoke; - ... - MOCK_METHOD(void, Bar, (X* p)); - ... - EXPECT_CALL(mock_foo_, Bar(_)) - .WillOnce(Invoke(MyAction(...))); -``` - -### My code calls a static/global function. Can I mock it? - -You can, but you need to make some changes. - -In general, if you find yourself needing to mock a static function, it's a sign -that your modules are too tightly coupled (and less flexible, less reusable, -less testable, etc). You are probably better off defining a small interface and -call the function through that interface, which then can be easily mocked. It's -a bit of work initially, but usually pays for itself quickly. - -This Google Testing Blog -[post](https://testing.googleblog.com/2008/06/defeat-static-cling.html) says it -excellently. Check it out. - -### My mock object needs to do complex stuff. It's a lot of pain to specify the actions. gMock sucks! - -I know it's not a question, but you get an answer for free any way. :-) - -With gMock, you can create mocks in C++ easily. And people might be tempted to -use them everywhere. Sometimes they work great, and sometimes you may find them, -well, a pain to use. So, what's wrong in the latter case? - -When you write a test without using mocks, you exercise the code and assert that -it returns the correct value or that the system is in an expected state. This is -sometimes called "state-based testing". - -Mocks are great for what some call "interaction-based" testing: instead of -checking the system state at the very end, mock objects verify that they are -invoked the right way and report an error as soon as it arises, giving you a -handle on the precise context in which the error was triggered. This is often -more effective and economical to do than state-based testing. - -If you are doing state-based testing and using a test double just to simulate -the real object, you are probably better off using a fake. Using a mock in this -case causes pain, as it's not a strong point for mocks to perform complex -actions. If you experience this and think that mocks suck, you are just not -using the right tool for your problem. Or, you might be trying to solve the -wrong problem. :-) - -### I got a warning "Uninteresting function call encountered - default action taken.." Should I panic? - -By all means, NO! It's just an FYI. :-) - -What it means is that you have a mock function, you haven't set any expectations -on it (by gMock's rule this means that you are not interested in calls to this -function and therefore it can be called any number of times), and it is called. -That's OK - you didn't say it's not OK to call the function! - -What if you actually meant to disallow this function to be called, but forgot to -write `EXPECT_CALL(foo, Bar()).Times(0)`? While one can argue that it's the -user's fault, gMock tries to be nice and prints you a note. - -So, when you see the message and believe that there shouldn't be any -uninteresting calls, you should investigate what's going on. To make your life -easier, gMock dumps the stack trace when an uninteresting call is encountered. -From that you can figure out which mock function it is, and how it is called. - -### I want to define a custom action. Should I use Invoke() or implement the ActionInterface interface? - -Either way is fine - you want to choose the one that's more convenient for your -circumstance. - -Usually, if your action is for a particular function type, defining it using -`Invoke()` should be easier; if your action can be used in functions of -different types (e.g. if you are defining `Return(*value*)`), -`MakePolymorphicAction()` is easiest. Sometimes you want precise control on what -types of functions the action can be used in, and implementing `ActionInterface` -is the way to go here. See the implementation of `Return()` in -`testing/base/public/gmock-actions.h` for an example. - -### I use SetArgPointee() in WillOnce(), but gcc complains about "conflicting return type specified". What does it mean? - -You got this error as gMock has no idea what value it should return when the -mock method is called. `SetArgPointee()` says what the side effect is, but -doesn't say what the return value should be. You need `DoAll()` to chain a -`SetArgPointee()` with a `Return()` that provides a value appropriate to the API -being mocked. - -See this [recipe](cook_book.md#mocking-side-effects) for more details and an -example. - -### I have a huge mock class, and Microsoft Visual C++ runs out of memory when compiling it. What can I do? - -We've noticed that when the `/clr` compiler flag is used, Visual C++ uses 5~6 -times as much memory when compiling a mock class. We suggest to avoid `/clr` -when compiling native C++ mocks. diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-actions.h b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-actions.h deleted file mode 100644 index f12d39b..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-actions.h +++ /dev/null @@ -1,1142 +0,0 @@ -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -// Google Mock - a framework for writing C++ mock classes. -// -// This file implements some commonly used actions. - -// GOOGLETEST_CM0002 DO NOT DELETE - -#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ -#define GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ - -#ifndef _WIN32_WCE -# include -#endif - -#include -#include -#include -#include -#include -#include - -#include "gmock/internal/gmock-internal-utils.h" -#include "gmock/internal/gmock-port.h" - -#ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable:4100) -#endif - -namespace testing { - -// To implement an action Foo, define: -// 1. a class FooAction that implements the ActionInterface interface, and -// 2. a factory function that creates an Action object from a -// const FooAction*. -// -// The two-level delegation design follows that of Matcher, providing -// consistency for extension developers. It also eases ownership -// management as Action objects can now be copied like plain values. - -namespace internal { - -// BuiltInDefaultValueGetter::Get() returns a -// default-constructed T value. BuiltInDefaultValueGetter::Get() crashes with an error. -// -// This primary template is used when kDefaultConstructible is true. -template -struct BuiltInDefaultValueGetter { - static T Get() { return T(); } -}; -template -struct BuiltInDefaultValueGetter { - static T Get() { - Assert(false, __FILE__, __LINE__, - "Default action undefined for the function return type."); - return internal::Invalid(); - // The above statement will never be reached, but is required in - // order for this function to compile. - } -}; - -// BuiltInDefaultValue::Get() returns the "built-in" default value -// for type T, which is NULL when T is a raw pointer type, 0 when T is -// a numeric type, false when T is bool, or "" when T is string or -// std::string. In addition, in C++11 and above, it turns a -// default-constructed T value if T is default constructible. For any -// other type T, the built-in default T value is undefined, and the -// function will abort the process. -template -class BuiltInDefaultValue { - public: - // This function returns true if and only if type T has a built-in default - // value. - static bool Exists() { - return ::std::is_default_constructible::value; - } - - static T Get() { - return BuiltInDefaultValueGetter< - T, ::std::is_default_constructible::value>::Get(); - } -}; - -// This partial specialization says that we use the same built-in -// default value for T and const T. -template -class BuiltInDefaultValue { - public: - static bool Exists() { return BuiltInDefaultValue::Exists(); } - static T Get() { return BuiltInDefaultValue::Get(); } -}; - -// This partial specialization defines the default values for pointer -// types. -template -class BuiltInDefaultValue { - public: - static bool Exists() { return true; } - static T* Get() { return nullptr; } -}; - -// The following specializations define the default values for -// specific types we care about. -#define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \ - template <> \ - class BuiltInDefaultValue { \ - public: \ - static bool Exists() { return true; } \ - static type Get() { return value; } \ - } - -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, ); // NOLINT -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, ""); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\0'); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed char, '\0'); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(char, '\0'); - -// There's no need for a default action for signed wchar_t, as that -// type is the same as wchar_t for gcc, and invalid for MSVC. -// -// There's also no need for a default action for unsigned wchar_t, as -// that type is the same as unsigned int for gcc, and invalid for -// MSVC. -#if GMOCK_WCHAR_T_IS_NATIVE_ -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(wchar_t, 0U); // NOLINT -#endif - -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned short, 0U); // NOLINT -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed short, 0); // NOLINT -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned int, 0U); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed int, 0); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long, 0UL); // NOLINT -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long, 0L); // NOLINT -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(UInt64, 0); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(Int64, 0); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(float, 0); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(double, 0); - -#undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_ - -} // namespace internal - -// When an unexpected function call is encountered, Google Mock will -// let it return a default value if the user has specified one for its -// return type, or if the return type has a built-in default value; -// otherwise Google Mock won't know what value to return and will have -// to abort the process. -// -// The DefaultValue class allows a user to specify the -// default value for a type T that is both copyable and publicly -// destructible (i.e. anything that can be used as a function return -// type). The usage is: -// -// // Sets the default value for type T to be foo. -// DefaultValue::Set(foo); -template -class DefaultValue { - public: - // Sets the default value for type T; requires T to be - // copy-constructable and have a public destructor. - static void Set(T x) { - delete producer_; - producer_ = new FixedValueProducer(x); - } - - // Provides a factory function to be called to generate the default value. - // This method can be used even if T is only move-constructible, but it is not - // limited to that case. - typedef T (*FactoryFunction)(); - static void SetFactory(FactoryFunction factory) { - delete producer_; - producer_ = new FactoryValueProducer(factory); - } - - // Unsets the default value for type T. - static void Clear() { - delete producer_; - producer_ = nullptr; - } - - // Returns true if and only if the user has set the default value for type T. - static bool IsSet() { return producer_ != nullptr; } - - // Returns true if T has a default return value set by the user or there - // exists a built-in default value. - static bool Exists() { - return IsSet() || internal::BuiltInDefaultValue::Exists(); - } - - // Returns the default value for type T if the user has set one; - // otherwise returns the built-in default value. Requires that Exists() - // is true, which ensures that the return value is well-defined. - static T Get() { - return producer_ == nullptr ? internal::BuiltInDefaultValue::Get() - : producer_->Produce(); - } - - private: - class ValueProducer { - public: - virtual ~ValueProducer() {} - virtual T Produce() = 0; - }; - - class FixedValueProducer : public ValueProducer { - public: - explicit FixedValueProducer(T value) : value_(value) {} - T Produce() override { return value_; } - - private: - const T value_; - GTEST_DISALLOW_COPY_AND_ASSIGN_(FixedValueProducer); - }; - - class FactoryValueProducer : public ValueProducer { - public: - explicit FactoryValueProducer(FactoryFunction factory) - : factory_(factory) {} - T Produce() override { return factory_(); } - - private: - const FactoryFunction factory_; - GTEST_DISALLOW_COPY_AND_ASSIGN_(FactoryValueProducer); - }; - - static ValueProducer* producer_; -}; - -// This partial specialization allows a user to set default values for -// reference types. -template -class DefaultValue { - public: - // Sets the default value for type T&. - static void Set(T& x) { // NOLINT - address_ = &x; - } - - // Unsets the default value for type T&. - static void Clear() { address_ = nullptr; } - - // Returns true if and only if the user has set the default value for type T&. - static bool IsSet() { return address_ != nullptr; } - - // Returns true if T has a default return value set by the user or there - // exists a built-in default value. - static bool Exists() { - return IsSet() || internal::BuiltInDefaultValue::Exists(); - } - - // Returns the default value for type T& if the user has set one; - // otherwise returns the built-in default value if there is one; - // otherwise aborts the process. - static T& Get() { - return address_ == nullptr ? internal::BuiltInDefaultValue::Get() - : *address_; - } - - private: - static T* address_; -}; - -// This specialization allows DefaultValue::Get() to -// compile. -template <> -class DefaultValue { - public: - static bool Exists() { return true; } - static void Get() {} -}; - -// Points to the user-set default value for type T. -template -typename DefaultValue::ValueProducer* DefaultValue::producer_ = nullptr; - -// Points to the user-set default value for type T&. -template -T* DefaultValue::address_ = nullptr; - -// Implement this interface to define an action for function type F. -template -class ActionInterface { - public: - typedef typename internal::Function::Result Result; - typedef typename internal::Function::ArgumentTuple ArgumentTuple; - - ActionInterface() {} - virtual ~ActionInterface() {} - - // Performs the action. This method is not const, as in general an - // action can have side effects and be stateful. For example, a - // get-the-next-element-from-the-collection action will need to - // remember the current element. - virtual Result Perform(const ArgumentTuple& args) = 0; - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionInterface); -}; - -// An Action is a copyable and IMMUTABLE (except by assignment) -// object that represents an action to be taken when a mock function -// of type F is called. The implementation of Action is just a -// std::shared_ptr to const ActionInterface. Don't inherit from Action! -// You can view an object implementing ActionInterface as a -// concrete action (including its current state), and an Action -// object as a handle to it. -template -class Action { - // Adapter class to allow constructing Action from a legacy ActionInterface. - // New code should create Actions from functors instead. - struct ActionAdapter { - // Adapter must be copyable to satisfy std::function requirements. - ::std::shared_ptr> impl_; - - template - typename internal::Function::Result operator()(Args&&... args) { - return impl_->Perform( - ::std::forward_as_tuple(::std::forward(args)...)); - } - }; - - public: - typedef typename internal::Function::Result Result; - typedef typename internal::Function::ArgumentTuple ArgumentTuple; - - // Constructs a null Action. Needed for storing Action objects in - // STL containers. - Action() {} - - // Construct an Action from a specified callable. - // This cannot take std::function directly, because then Action would not be - // directly constructible from lambda (it would require two conversions). - template , G>::value>::type> - Action(G&& fun) : fun_(::std::forward(fun)) {} // NOLINT - - // Constructs an Action from its implementation. - explicit Action(ActionInterface* impl) - : fun_(ActionAdapter{::std::shared_ptr>(impl)}) {} - - // This constructor allows us to turn an Action object into an - // Action, as long as F's arguments can be implicitly converted - // to Func's and Func's return type can be implicitly converted to F's. - template - explicit Action(const Action& action) : fun_(action.fun_) {} - - // Returns true if and only if this is the DoDefault() action. - bool IsDoDefault() const { return fun_ == nullptr; } - - // Performs the action. Note that this method is const even though - // the corresponding method in ActionInterface is not. The reason - // is that a const Action means that it cannot be re-bound to - // another concrete action, not that the concrete action it binds to - // cannot change state. (Think of the difference between a const - // pointer and a pointer to const.) - Result Perform(ArgumentTuple args) const { - if (IsDoDefault()) { - internal::IllegalDoDefault(__FILE__, __LINE__); - } - return internal::Apply(fun_, ::std::move(args)); - } - - private: - template - friend class Action; - - // fun_ is an empty function if and only if this is the DoDefault() action. - ::std::function fun_; -}; - -// The PolymorphicAction class template makes it easy to implement a -// polymorphic action (i.e. an action that can be used in mock -// functions of than one type, e.g. Return()). -// -// To define a polymorphic action, a user first provides a COPYABLE -// implementation class that has a Perform() method template: -// -// class FooAction { -// public: -// template -// Result Perform(const ArgumentTuple& args) const { -// // Processes the arguments and returns a result, using -// // std::get(args) to get the N-th (0-based) argument in the tuple. -// } -// ... -// }; -// -// Then the user creates the polymorphic action using -// MakePolymorphicAction(object) where object has type FooAction. See -// the definition of Return(void) and SetArgumentPointee(value) for -// complete examples. -template -class PolymorphicAction { - public: - explicit PolymorphicAction(const Impl& impl) : impl_(impl) {} - - template - operator Action() const { - return Action(new MonomorphicImpl(impl_)); - } - - private: - template - class MonomorphicImpl : public ActionInterface { - public: - typedef typename internal::Function::Result Result; - typedef typename internal::Function::ArgumentTuple ArgumentTuple; - - explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} - - Result Perform(const ArgumentTuple& args) override { - return impl_.template Perform(args); - } - - private: - Impl impl_; - - GTEST_DISALLOW_ASSIGN_(MonomorphicImpl); - }; - - Impl impl_; - - GTEST_DISALLOW_ASSIGN_(PolymorphicAction); -}; - -// Creates an Action from its implementation and returns it. The -// created Action object owns the implementation. -template -Action MakeAction(ActionInterface* impl) { - return Action(impl); -} - -// Creates a polymorphic action from its implementation. This is -// easier to use than the PolymorphicAction constructor as it -// doesn't require you to explicitly write the template argument, e.g. -// -// MakePolymorphicAction(foo); -// vs -// PolymorphicAction(foo); -template -inline PolymorphicAction MakePolymorphicAction(const Impl& impl) { - return PolymorphicAction(impl); -} - -namespace internal { - -// Helper struct to specialize ReturnAction to execute a move instead of a copy -// on return. Useful for move-only types, but could be used on any type. -template -struct ByMoveWrapper { - explicit ByMoveWrapper(T value) : payload(std::move(value)) {} - T payload; -}; - -// Implements the polymorphic Return(x) action, which can be used in -// any function that returns the type of x, regardless of the argument -// types. -// -// Note: The value passed into Return must be converted into -// Function::Result when this action is cast to Action rather than -// when that action is performed. This is important in scenarios like -// -// MOCK_METHOD1(Method, T(U)); -// ... -// { -// Foo foo; -// X x(&foo); -// EXPECT_CALL(mock, Method(_)).WillOnce(Return(x)); -// } -// -// In the example above the variable x holds reference to foo which leaves -// scope and gets destroyed. If copying X just copies a reference to foo, -// that copy will be left with a hanging reference. If conversion to T -// makes a copy of foo, the above code is safe. To support that scenario, we -// need to make sure that the type conversion happens inside the EXPECT_CALL -// statement, and conversion of the result of Return to Action is a -// good place for that. -// -// The real life example of the above scenario happens when an invocation -// of gtl::Container() is passed into Return. -// -template -class ReturnAction { - public: - // Constructs a ReturnAction object from the value to be returned. - // 'value' is passed by value instead of by const reference in order - // to allow Return("string literal") to compile. - explicit ReturnAction(R value) : value_(new R(std::move(value))) {} - - // This template type conversion operator allows Return(x) to be - // used in ANY function that returns x's type. - template - operator Action() const { // NOLINT - // Assert statement belongs here because this is the best place to verify - // conditions on F. It produces the clearest error messages - // in most compilers. - // Impl really belongs in this scope as a local class but can't - // because MSVC produces duplicate symbols in different translation units - // in this case. Until MS fixes that bug we put Impl into the class scope - // and put the typedef both here (for use in assert statement) and - // in the Impl class. But both definitions must be the same. - typedef typename Function::Result Result; - GTEST_COMPILE_ASSERT_( - !std::is_reference::value, - use_ReturnRef_instead_of_Return_to_return_a_reference); - static_assert(!std::is_void::value, - "Can't use Return() on an action expected to return `void`."); - return Action(new Impl(value_)); - } - - private: - // Implements the Return(x) action for a particular function type F. - template - class Impl : public ActionInterface { - public: - typedef typename Function::Result Result; - typedef typename Function::ArgumentTuple ArgumentTuple; - - // The implicit cast is necessary when Result has more than one - // single-argument constructor (e.g. Result is std::vector) and R - // has a type conversion operator template. In that case, value_(value) - // won't compile as the compiler doesn't known which constructor of - // Result to call. ImplicitCast_ forces the compiler to convert R to - // Result without considering explicit constructors, thus resolving the - // ambiguity. value_ is then initialized using its copy constructor. - explicit Impl(const std::shared_ptr& value) - : value_before_cast_(*value), - value_(ImplicitCast_(value_before_cast_)) {} - - Result Perform(const ArgumentTuple&) override { return value_; } - - private: - GTEST_COMPILE_ASSERT_(!std::is_reference::value, - Result_cannot_be_a_reference_type); - // We save the value before casting just in case it is being cast to a - // wrapper type. - R value_before_cast_; - Result value_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl); - }; - - // Partially specialize for ByMoveWrapper. This version of ReturnAction will - // move its contents instead. - template - class Impl, F> : public ActionInterface { - public: - typedef typename Function::Result Result; - typedef typename Function::ArgumentTuple ArgumentTuple; - - explicit Impl(const std::shared_ptr& wrapper) - : performed_(false), wrapper_(wrapper) {} - - Result Perform(const ArgumentTuple&) override { - GTEST_CHECK_(!performed_) - << "A ByMove() action should only be performed once."; - performed_ = true; - return std::move(wrapper_->payload); - } - - private: - bool performed_; - const std::shared_ptr wrapper_; - - GTEST_DISALLOW_ASSIGN_(Impl); - }; - - const std::shared_ptr value_; - - GTEST_DISALLOW_ASSIGN_(ReturnAction); -}; - -// Implements the ReturnNull() action. -class ReturnNullAction { - public: - // Allows ReturnNull() to be used in any pointer-returning function. In C++11 - // this is enforced by returning nullptr, and in non-C++11 by asserting a - // pointer type on compile time. - template - static Result Perform(const ArgumentTuple&) { - return nullptr; - } -}; - -// Implements the Return() action. -class ReturnVoidAction { - public: - // Allows Return() to be used in any void-returning function. - template - static void Perform(const ArgumentTuple&) { - static_assert(std::is_void::value, "Result should be void."); - } -}; - -// Implements the polymorphic ReturnRef(x) action, which can be used -// in any function that returns a reference to the type of x, -// regardless of the argument types. -template -class ReturnRefAction { - public: - // Constructs a ReturnRefAction object from the reference to be returned. - explicit ReturnRefAction(T& ref) : ref_(ref) {} // NOLINT - - // This template type conversion operator allows ReturnRef(x) to be - // used in ANY function that returns a reference to x's type. - template - operator Action() const { - typedef typename Function::Result Result; - // Asserts that the function return type is a reference. This - // catches the user error of using ReturnRef(x) when Return(x) - // should be used, and generates some helpful error message. - GTEST_COMPILE_ASSERT_(std::is_reference::value, - use_Return_instead_of_ReturnRef_to_return_a_value); - return Action(new Impl(ref_)); - } - - private: - // Implements the ReturnRef(x) action for a particular function type F. - template - class Impl : public ActionInterface { - public: - typedef typename Function::Result Result; - typedef typename Function::ArgumentTuple ArgumentTuple; - - explicit Impl(T& ref) : ref_(ref) {} // NOLINT - - Result Perform(const ArgumentTuple&) override { return ref_; } - - private: - T& ref_; - - GTEST_DISALLOW_ASSIGN_(Impl); - }; - - T& ref_; - - GTEST_DISALLOW_ASSIGN_(ReturnRefAction); -}; - -// Implements the polymorphic ReturnRefOfCopy(x) action, which can be -// used in any function that returns a reference to the type of x, -// regardless of the argument types. -template -class ReturnRefOfCopyAction { - public: - // Constructs a ReturnRefOfCopyAction object from the reference to - // be returned. - explicit ReturnRefOfCopyAction(const T& value) : value_(value) {} // NOLINT - - // This template type conversion operator allows ReturnRefOfCopy(x) to be - // used in ANY function that returns a reference to x's type. - template - operator Action() const { - typedef typename Function::Result Result; - // Asserts that the function return type is a reference. This - // catches the user error of using ReturnRefOfCopy(x) when Return(x) - // should be used, and generates some helpful error message. - GTEST_COMPILE_ASSERT_( - std::is_reference::value, - use_Return_instead_of_ReturnRefOfCopy_to_return_a_value); - return Action(new Impl(value_)); - } - - private: - // Implements the ReturnRefOfCopy(x) action for a particular function type F. - template - class Impl : public ActionInterface { - public: - typedef typename Function::Result Result; - typedef typename Function::ArgumentTuple ArgumentTuple; - - explicit Impl(const T& value) : value_(value) {} // NOLINT - - Result Perform(const ArgumentTuple&) override { return value_; } - - private: - T value_; - - GTEST_DISALLOW_ASSIGN_(Impl); - }; - - const T value_; - - GTEST_DISALLOW_ASSIGN_(ReturnRefOfCopyAction); -}; - -// Implements the polymorphic DoDefault() action. -class DoDefaultAction { - public: - // This template type conversion operator allows DoDefault() to be - // used in any function. - template - operator Action() const { return Action(); } // NOLINT -}; - -// Implements the Assign action to set a given pointer referent to a -// particular value. -template -class AssignAction { - public: - AssignAction(T1* ptr, T2 value) : ptr_(ptr), value_(value) {} - - template - void Perform(const ArgumentTuple& /* args */) const { - *ptr_ = value_; - } - - private: - T1* const ptr_; - const T2 value_; - - GTEST_DISALLOW_ASSIGN_(AssignAction); -}; - -#if !GTEST_OS_WINDOWS_MOBILE - -// Implements the SetErrnoAndReturn action to simulate return from -// various system calls and libc functions. -template -class SetErrnoAndReturnAction { - public: - SetErrnoAndReturnAction(int errno_value, T result) - : errno_(errno_value), - result_(result) {} - template - Result Perform(const ArgumentTuple& /* args */) const { - errno = errno_; - return result_; - } - - private: - const int errno_; - const T result_; - - GTEST_DISALLOW_ASSIGN_(SetErrnoAndReturnAction); -}; - -#endif // !GTEST_OS_WINDOWS_MOBILE - -// Implements the SetArgumentPointee(x) action for any function -// whose N-th argument (0-based) is a pointer to x's type. -template -struct SetArgumentPointeeAction { - A value; - - template - void operator()(const Args&... args) const { - *::std::get(std::tie(args...)) = value; - } -}; - -// Implements the Invoke(object_ptr, &Class::Method) action. -template -struct InvokeMethodAction { - Class* const obj_ptr; - const MethodPtr method_ptr; - - template - auto operator()(Args&&... args) const - -> decltype((obj_ptr->*method_ptr)(std::forward(args)...)) { - return (obj_ptr->*method_ptr)(std::forward(args)...); - } -}; - -// Implements the InvokeWithoutArgs(f) action. The template argument -// FunctionImpl is the implementation type of f, which can be either a -// function pointer or a functor. InvokeWithoutArgs(f) can be used as an -// Action as long as f's type is compatible with F. -template -struct InvokeWithoutArgsAction { - FunctionImpl function_impl; - - // Allows InvokeWithoutArgs(f) to be used as any action whose type is - // compatible with f. - template - auto operator()(const Args&...) -> decltype(function_impl()) { - return function_impl(); - } -}; - -// Implements the InvokeWithoutArgs(object_ptr, &Class::Method) action. -template -struct InvokeMethodWithoutArgsAction { - Class* const obj_ptr; - const MethodPtr method_ptr; - - using ReturnType = typename std::result_of::type; - - template - ReturnType operator()(const Args&...) const { - return (obj_ptr->*method_ptr)(); - } -}; - -// Implements the IgnoreResult(action) action. -template -class IgnoreResultAction { - public: - explicit IgnoreResultAction(const A& action) : action_(action) {} - - template - operator Action() const { - // Assert statement belongs here because this is the best place to verify - // conditions on F. It produces the clearest error messages - // in most compilers. - // Impl really belongs in this scope as a local class but can't - // because MSVC produces duplicate symbols in different translation units - // in this case. Until MS fixes that bug we put Impl into the class scope - // and put the typedef both here (for use in assert statement) and - // in the Impl class. But both definitions must be the same. - typedef typename internal::Function::Result Result; - - // Asserts at compile time that F returns void. - static_assert(std::is_void::value, "Result type should be void."); - - return Action(new Impl(action_)); - } - - private: - template - class Impl : public ActionInterface { - public: - typedef typename internal::Function::Result Result; - typedef typename internal::Function::ArgumentTuple ArgumentTuple; - - explicit Impl(const A& action) : action_(action) {} - - void Perform(const ArgumentTuple& args) override { - // Performs the action and ignores its result. - action_.Perform(args); - } - - private: - // Type OriginalFunction is the same as F except that its return - // type is IgnoredValue. - typedef typename internal::Function::MakeResultIgnoredValue - OriginalFunction; - - const Action action_; - - GTEST_DISALLOW_ASSIGN_(Impl); - }; - - const A action_; - - GTEST_DISALLOW_ASSIGN_(IgnoreResultAction); -}; - -template -struct WithArgsAction { - InnerAction action; - - // The inner action could be anything convertible to Action. - // We use the conversion operator to detect the signature of the inner Action. - template - operator Action() const { // NOLINT - Action>::type...)> - converted(action); - - return [converted](Args... args) -> R { - return converted.Perform(std::forward_as_tuple( - std::get(std::forward_as_tuple(std::forward(args)...))...)); - }; - } -}; - -template -struct DoAllAction { - private: - template - std::vector> Convert(IndexSequence) const { - return {std::get(actions)...}; - } - - public: - std::tuple actions; - - template - operator Action() const { // NOLINT - struct Op { - std::vector> converted; - Action last; - R operator()(Args... args) const { - auto tuple_args = std::forward_as_tuple(std::forward(args)...); - for (auto& a : converted) { - a.Perform(tuple_args); - } - return last.Perform(tuple_args); - } - }; - return Op{Convert(MakeIndexSequence()), - std::get(actions)}; - } -}; - -} // namespace internal - -// An Unused object can be implicitly constructed from ANY value. -// This is handy when defining actions that ignore some or all of the -// mock function arguments. For example, given -// -// MOCK_METHOD3(Foo, double(const string& label, double x, double y)); -// MOCK_METHOD3(Bar, double(int index, double x, double y)); -// -// instead of -// -// double DistanceToOriginWithLabel(const string& label, double x, double y) { -// return sqrt(x*x + y*y); -// } -// double DistanceToOriginWithIndex(int index, double x, double y) { -// return sqrt(x*x + y*y); -// } -// ... -// EXPECT_CALL(mock, Foo("abc", _, _)) -// .WillOnce(Invoke(DistanceToOriginWithLabel)); -// EXPECT_CALL(mock, Bar(5, _, _)) -// .WillOnce(Invoke(DistanceToOriginWithIndex)); -// -// you could write -// -// // We can declare any uninteresting argument as Unused. -// double DistanceToOrigin(Unused, double x, double y) { -// return sqrt(x*x + y*y); -// } -// ... -// EXPECT_CALL(mock, Foo("abc", _, _)).WillOnce(Invoke(DistanceToOrigin)); -// EXPECT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin)); -typedef internal::IgnoredValue Unused; - -// Creates an action that does actions a1, a2, ..., sequentially in -// each invocation. -template -internal::DoAllAction::type...> DoAll( - Action&&... action) { - return {std::forward_as_tuple(std::forward(action)...)}; -} - -// WithArg(an_action) creates an action that passes the k-th -// (0-based) argument of the mock function to an_action and performs -// it. It adapts an action accepting one argument to one that accepts -// multiple arguments. For convenience, we also provide -// WithArgs(an_action) (defined below) as a synonym. -template -internal::WithArgsAction::type, k> -WithArg(InnerAction&& action) { - return {std::forward(action)}; -} - -// WithArgs(an_action) creates an action that passes -// the selected arguments of the mock function to an_action and -// performs it. It serves as an adaptor between actions with -// different argument lists. -template -internal::WithArgsAction::type, k, ks...> -WithArgs(InnerAction&& action) { - return {std::forward(action)}; -} - -// WithoutArgs(inner_action) can be used in a mock function with a -// non-empty argument list to perform inner_action, which takes no -// argument. In other words, it adapts an action accepting no -// argument to one that accepts (and ignores) arguments. -template -internal::WithArgsAction::type> -WithoutArgs(InnerAction&& action) { - return {std::forward(action)}; -} - -// Creates an action that returns 'value'. 'value' is passed by value -// instead of const reference - otherwise Return("string literal") -// will trigger a compiler error about using array as initializer. -template -internal::ReturnAction Return(R value) { - return internal::ReturnAction(std::move(value)); -} - -// Creates an action that returns NULL. -inline PolymorphicAction ReturnNull() { - return MakePolymorphicAction(internal::ReturnNullAction()); -} - -// Creates an action that returns from a void function. -inline PolymorphicAction Return() { - return MakePolymorphicAction(internal::ReturnVoidAction()); -} - -// Creates an action that returns the reference to a variable. -template -inline internal::ReturnRefAction ReturnRef(R& x) { // NOLINT - return internal::ReturnRefAction(x); -} - -// Creates an action that returns the reference to a copy of the -// argument. The copy is created when the action is constructed and -// lives as long as the action. -template -inline internal::ReturnRefOfCopyAction ReturnRefOfCopy(const R& x) { - return internal::ReturnRefOfCopyAction(x); -} - -// Modifies the parent action (a Return() action) to perform a move of the -// argument instead of a copy. -// Return(ByMove()) actions can only be executed once and will assert this -// invariant. -template -internal::ByMoveWrapper ByMove(R x) { - return internal::ByMoveWrapper(std::move(x)); -} - -// Creates an action that does the default action for the give mock function. -inline internal::DoDefaultAction DoDefault() { - return internal::DoDefaultAction(); -} - -// Creates an action that sets the variable pointed by the N-th -// (0-based) function argument to 'value'. -template -internal::SetArgumentPointeeAction SetArgPointee(T x) { - return {std::move(x)}; -} - -// The following version is DEPRECATED. -template -internal::SetArgumentPointeeAction SetArgumentPointee(T x) { - return {std::move(x)}; -} - -// Creates an action that sets a pointer referent to a given value. -template -PolymorphicAction > Assign(T1* ptr, T2 val) { - return MakePolymorphicAction(internal::AssignAction(ptr, val)); -} - -#if !GTEST_OS_WINDOWS_MOBILE - -// Creates an action that sets errno and returns the appropriate error. -template -PolymorphicAction > -SetErrnoAndReturn(int errval, T result) { - return MakePolymorphicAction( - internal::SetErrnoAndReturnAction(errval, result)); -} - -#endif // !GTEST_OS_WINDOWS_MOBILE - -// Various overloads for Invoke(). - -// Legacy function. -// Actions can now be implicitly constructed from callables. No need to create -// wrapper objects. -// This function exists for backwards compatibility. -template -typename std::decay::type Invoke(FunctionImpl&& function_impl) { - return std::forward(function_impl); -} - -// Creates an action that invokes the given method on the given object -// with the mock function's arguments. -template -internal::InvokeMethodAction Invoke(Class* obj_ptr, - MethodPtr method_ptr) { - return {obj_ptr, method_ptr}; -} - -// Creates an action that invokes 'function_impl' with no argument. -template -internal::InvokeWithoutArgsAction::type> -InvokeWithoutArgs(FunctionImpl function_impl) { - return {std::move(function_impl)}; -} - -// Creates an action that invokes the given method on the given object -// with no argument. -template -internal::InvokeMethodWithoutArgsAction InvokeWithoutArgs( - Class* obj_ptr, MethodPtr method_ptr) { - return {obj_ptr, method_ptr}; -} - -// Creates an action that performs an_action and throws away its -// result. In other words, it changes the return type of an_action to -// void. an_action MUST NOT return void, or the code won't compile. -template -inline internal::IgnoreResultAction IgnoreResult(const A& an_action) { - return internal::IgnoreResultAction(an_action); -} - -// Creates a reference wrapper for the given L-value. If necessary, -// you can explicitly specify the type of the reference. For example, -// suppose 'derived' is an object of type Derived, ByRef(derived) -// would wrap a Derived&. If you want to wrap a const Base& instead, -// where Base is a base class of Derived, just write: -// -// ByRef(derived) -// -// N.B. ByRef is redundant with std::ref, std::cref and std::reference_wrapper. -// However, it may still be used for consistency with ByMove(). -template -inline ::std::reference_wrapper ByRef(T& l_value) { // NOLINT - return ::std::reference_wrapper(l_value); -} - -} // namespace testing - -#ifdef _MSC_VER -# pragma warning(pop) -#endif - - -#endif // GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-cardinalities.h b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-cardinalities.h deleted file mode 100644 index 46e01e1..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-cardinalities.h +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -// Google Mock - a framework for writing C++ mock classes. -// -// This file implements some commonly used cardinalities. More -// cardinalities can be defined by the user implementing the -// CardinalityInterface interface if necessary. - -// GOOGLETEST_CM0002 DO NOT DELETE - -#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ -#define GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ - -#include -#include -#include // NOLINT -#include "gmock/internal/gmock-port.h" -#include "gtest/gtest.h" - -GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ -/* class A needs to have dll-interface to be used by clients of class B */) - -namespace testing { - -// To implement a cardinality Foo, define: -// 1. a class FooCardinality that implements the -// CardinalityInterface interface, and -// 2. a factory function that creates a Cardinality object from a -// const FooCardinality*. -// -// The two-level delegation design follows that of Matcher, providing -// consistency for extension developers. It also eases ownership -// management as Cardinality objects can now be copied like plain values. - -// The implementation of a cardinality. -class CardinalityInterface { - public: - virtual ~CardinalityInterface() {} - - // Conservative estimate on the lower/upper bound of the number of - // calls allowed. - virtual int ConservativeLowerBound() const { return 0; } - virtual int ConservativeUpperBound() const { return INT_MAX; } - - // Returns true if and only if call_count calls will satisfy this - // cardinality. - virtual bool IsSatisfiedByCallCount(int call_count) const = 0; - - // Returns true if and only if call_count calls will saturate this - // cardinality. - virtual bool IsSaturatedByCallCount(int call_count) const = 0; - - // Describes self to an ostream. - virtual void DescribeTo(::std::ostream* os) const = 0; -}; - -// A Cardinality is a copyable and IMMUTABLE (except by assignment) -// object that specifies how many times a mock function is expected to -// be called. The implementation of Cardinality is just a std::shared_ptr -// to const CardinalityInterface. Don't inherit from Cardinality! -class GTEST_API_ Cardinality { - public: - // Constructs a null cardinality. Needed for storing Cardinality - // objects in STL containers. - Cardinality() {} - - // Constructs a Cardinality from its implementation. - explicit Cardinality(const CardinalityInterface* impl) : impl_(impl) {} - - // Conservative estimate on the lower/upper bound of the number of - // calls allowed. - int ConservativeLowerBound() const { return impl_->ConservativeLowerBound(); } - int ConservativeUpperBound() const { return impl_->ConservativeUpperBound(); } - - // Returns true if and only if call_count calls will satisfy this - // cardinality. - bool IsSatisfiedByCallCount(int call_count) const { - return impl_->IsSatisfiedByCallCount(call_count); - } - - // Returns true if and only if call_count calls will saturate this - // cardinality. - bool IsSaturatedByCallCount(int call_count) const { - return impl_->IsSaturatedByCallCount(call_count); - } - - // Returns true if and only if call_count calls will over-saturate this - // cardinality, i.e. exceed the maximum number of allowed calls. - bool IsOverSaturatedByCallCount(int call_count) const { - return impl_->IsSaturatedByCallCount(call_count) && - !impl_->IsSatisfiedByCallCount(call_count); - } - - // Describes self to an ostream - void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } - - // Describes the given actual call count to an ostream. - static void DescribeActualCallCountTo(int actual_call_count, - ::std::ostream* os); - - private: - std::shared_ptr impl_; -}; - -// Creates a cardinality that allows at least n calls. -GTEST_API_ Cardinality AtLeast(int n); - -// Creates a cardinality that allows at most n calls. -GTEST_API_ Cardinality AtMost(int n); - -// Creates a cardinality that allows any number of calls. -GTEST_API_ Cardinality AnyNumber(); - -// Creates a cardinality that allows between min and max calls. -GTEST_API_ Cardinality Between(int min, int max); - -// Creates a cardinality that allows exactly n calls. -GTEST_API_ Cardinality Exactly(int n); - -// Creates a cardinality from its implementation. -inline Cardinality MakeCardinality(const CardinalityInterface* c) { - return Cardinality(c); -} - -} // namespace testing - -GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 - -#endif // GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-function-mocker.h b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-function-mocker.h deleted file mode 100644 index cc1535c..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-function-mocker.h +++ /dev/null @@ -1,253 +0,0 @@ -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Google Mock - a framework for writing C++ mock classes. -// -// This file implements MOCK_METHOD. - -// GOOGLETEST_CM0002 DO NOT DELETE - -#ifndef THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_ // NOLINT -#define THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_ // NOLINT - -#include "gmock/gmock-generated-function-mockers.h" // NOLINT -#include "gmock/internal/gmock-pp.h" - -#define MOCK_METHOD(...) \ - GMOCK_PP_VARIADIC_CALL(GMOCK_INTERNAL_MOCK_METHOD_ARG_, __VA_ARGS__) - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_1(...) \ - GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_2(...) \ - GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_3(_Ret, _MethodName, _Args) \ - GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, ()) - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, _Spec) \ - GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Args); \ - GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Spec); \ - GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \ - GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)); \ - GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \ - GMOCK_INTERNAL_MOCK_METHOD_IMPL( \ - GMOCK_PP_NARG0 _Args, _MethodName, GMOCK_INTERNAL_HAS_CONST(_Spec), \ - GMOCK_INTERNAL_HAS_OVERRIDE(_Spec), GMOCK_INTERNAL_HAS_FINAL(_Spec), \ - GMOCK_INTERNAL_HAS_NOEXCEPT(_Spec), GMOCK_INTERNAL_GET_CALLTYPE(_Spec), \ - (GMOCK_INTERNAL_SIGNATURE(_Ret, _Args))) - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_5(...) \ - GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_6(...) \ - GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_7(...) \ - GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) - -#define GMOCK_INTERNAL_WRONG_ARITY(...) \ - static_assert( \ - false, \ - "MOCK_METHOD must be called with 3 or 4 arguments. _Ret, " \ - "_MethodName, _Args and optionally _Spec. _Args and _Spec must be " \ - "enclosed in parentheses. If _Ret is a type with unprotected commas, " \ - "it must also be enclosed in parentheses.") - -#define GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Tuple) \ - static_assert( \ - GMOCK_PP_IS_ENCLOSED_PARENS(_Tuple), \ - GMOCK_PP_STRINGIZE(_Tuple) " should be enclosed in parentheses.") - -#define GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(_N, ...) \ - static_assert( \ - std::is_function<__VA_ARGS__>::value, \ - "Signature must be a function type, maybe return type contains " \ - "unprotected comma."); \ - static_assert( \ - ::testing::tuple_size::ArgumentTuple>::value == _N, \ - "This method does not take " GMOCK_PP_STRINGIZE( \ - _N) " arguments. Parenthesize all types with unproctected commas.") - -#define GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \ - GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT, ~, _Spec) - -#define GMOCK_INTERNAL_MOCK_METHOD_IMPL(_N, _MethodName, _Constness, \ - _Override, _Final, _Noexcept, \ - _CallType, _Signature) \ - typename ::testing::internal::Function::Result \ - GMOCK_INTERNAL_EXPAND(_CallType) \ - _MethodName(GMOCK_PP_REPEAT(GMOCK_INTERNAL_PARAMETER, _Signature, _N)) \ - GMOCK_PP_IF(_Constness, const, ) GMOCK_PP_IF(_Noexcept, noexcept, ) \ - GMOCK_PP_IF(_Override, override, ) \ - GMOCK_PP_IF(_Final, final, ) { \ - GMOCK_MOCKER_(_N, _Constness, _MethodName) \ - .SetOwnerAndName(this, #_MethodName); \ - return GMOCK_MOCKER_(_N, _Constness, _MethodName) \ - .Invoke(GMOCK_PP_REPEAT(GMOCK_INTERNAL_FORWARD_ARG, _Signature, _N)); \ - } \ - ::testing::MockSpec gmock_##_MethodName( \ - GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_PARAMETER, _Signature, _N)) \ - GMOCK_PP_IF(_Constness, const, ) { \ - GMOCK_MOCKER_(_N, _Constness, _MethodName).RegisterOwner(this); \ - return GMOCK_MOCKER_(_N, _Constness, _MethodName) \ - .With(GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_ARGUMENT, , _N)); \ - } \ - ::testing::MockSpec gmock_##_MethodName( \ - const ::testing::internal::WithoutMatchers&, \ - GMOCK_PP_IF(_Constness, const, )::testing::internal::Function< \ - GMOCK_PP_REMOVE_PARENS(_Signature)>*) \ - const GMOCK_PP_IF(_Noexcept, noexcept, ) { \ - return GMOCK_PP_CAT(::testing::internal::AdjustConstness_, \ - GMOCK_PP_IF(_Constness, const, ))(this) \ - ->gmock_##_MethodName(GMOCK_PP_REPEAT( \ - GMOCK_INTERNAL_A_MATCHER_ARGUMENT, _Signature, _N)); \ - } \ - mutable ::testing::FunctionMocker \ - GMOCK_MOCKER_(_N, _Constness, _MethodName) - -#define GMOCK_INTERNAL_EXPAND(...) __VA_ARGS__ - -// Five Valid modifiers. -#define GMOCK_INTERNAL_HAS_CONST(_Tuple) \ - GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_CONST, ~, _Tuple)) - -#define GMOCK_INTERNAL_HAS_OVERRIDE(_Tuple) \ - GMOCK_PP_HAS_COMMA( \ - GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_OVERRIDE, ~, _Tuple)) - -#define GMOCK_INTERNAL_HAS_FINAL(_Tuple) \ - GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_FINAL, ~, _Tuple)) - -#define GMOCK_INTERNAL_HAS_NOEXCEPT(_Tuple) \ - GMOCK_PP_HAS_COMMA( \ - GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_NOEXCEPT, ~, _Tuple)) - -#define GMOCK_INTERNAL_GET_CALLTYPE(_Tuple) \ - GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GET_CALLTYPE_IMPL, ~, _Tuple) - -#define GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT(_i, _, _elem) \ - static_assert( \ - (GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem)) + \ - GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem)) + \ - GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem)) + \ - GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)) + \ - GMOCK_INTERNAL_IS_CALLTYPE(_elem)) == 1, \ - GMOCK_PP_STRINGIZE( \ - _elem) " cannot be recognized as a valid specification modifier."); - -// Modifiers implementation. -#define GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem) \ - GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_CONST_I_, _elem) - -#define GMOCK_INTERNAL_DETECT_CONST_I_const , - -#define GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem) \ - GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_OVERRIDE_I_, _elem) - -#define GMOCK_INTERNAL_DETECT_OVERRIDE_I_override , - -#define GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem) \ - GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_FINAL_I_, _elem) - -#define GMOCK_INTERNAL_DETECT_FINAL_I_final , - -// TODO(iserna): Maybe noexcept should accept an argument here as well. -#define GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem) \ - GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_NOEXCEPT_I_, _elem) - -#define GMOCK_INTERNAL_DETECT_NOEXCEPT_I_noexcept , - -#define GMOCK_INTERNAL_GET_CALLTYPE_IMPL(_i, _, _elem) \ - GMOCK_PP_IF(GMOCK_INTERNAL_IS_CALLTYPE(_elem), \ - GMOCK_INTERNAL_GET_VALUE_CALLTYPE, GMOCK_PP_EMPTY) \ - (_elem) - -// TODO(iserna): GMOCK_INTERNAL_IS_CALLTYPE and -// GMOCK_INTERNAL_GET_VALUE_CALLTYPE needed more expansions to work on windows -// maybe they can be simplified somehow. -#define GMOCK_INTERNAL_IS_CALLTYPE(_arg) \ - GMOCK_INTERNAL_IS_CALLTYPE_I( \ - GMOCK_PP_CAT(GMOCK_INTERNAL_IS_CALLTYPE_HELPER_, _arg)) -#define GMOCK_INTERNAL_IS_CALLTYPE_I(_arg) GMOCK_PP_IS_ENCLOSED_PARENS(_arg) - -#define GMOCK_INTERNAL_GET_VALUE_CALLTYPE(_arg) \ - GMOCK_INTERNAL_GET_VALUE_CALLTYPE_I( \ - GMOCK_PP_CAT(GMOCK_INTERNAL_IS_CALLTYPE_HELPER_, _arg)) -#define GMOCK_INTERNAL_GET_VALUE_CALLTYPE_I(_arg) \ - GMOCK_PP_CAT(GMOCK_PP_IDENTITY, _arg) - -#define GMOCK_INTERNAL_IS_CALLTYPE_HELPER_Calltype - -#define GMOCK_INTERNAL_SIGNATURE(_Ret, _Args) \ - GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_Ret), GMOCK_PP_REMOVE_PARENS, \ - GMOCK_PP_IDENTITY) \ - (_Ret)(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GET_TYPE, _, _Args)) - -#define GMOCK_INTERNAL_GET_TYPE(_i, _, _elem) \ - GMOCK_PP_COMMA_IF(_i) \ - GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_elem), GMOCK_PP_REMOVE_PARENS, \ - GMOCK_PP_IDENTITY) \ - (_elem) - -#define GMOCK_INTERNAL_PARAMETER(_i, _Signature, _) \ - GMOCK_PP_COMMA_IF(_i) \ - GMOCK_INTERNAL_ARG_O(typename, GMOCK_PP_INC(_i), \ - GMOCK_PP_REMOVE_PARENS(_Signature)) \ - gmock_a##_i - -#define GMOCK_INTERNAL_FORWARD_ARG(_i, _Signature, _) \ - GMOCK_PP_COMMA_IF(_i) \ - ::std::forward( \ - gmock_a##_i) - -#define GMOCK_INTERNAL_MATCHER_PARAMETER(_i, _Signature, _) \ - GMOCK_PP_COMMA_IF(_i) \ - GMOCK_INTERNAL_MATCHER_O(typename, GMOCK_PP_INC(_i), \ - GMOCK_PP_REMOVE_PARENS(_Signature)) \ - gmock_a##_i - -#define GMOCK_INTERNAL_MATCHER_ARGUMENT(_i, _1, _2) \ - GMOCK_PP_COMMA_IF(_i) \ - gmock_a##_i - -#define GMOCK_INTERNAL_A_MATCHER_ARGUMENT(_i, _Signature, _) \ - GMOCK_PP_COMMA_IF(_i) \ - ::testing::A() - -#define GMOCK_INTERNAL_ARG_O(_tn, _i, ...) GMOCK_ARG_(_tn, _i, __VA_ARGS__) - -#define GMOCK_INTERNAL_MATCHER_O(_tn, _i, ...) \ - GMOCK_MATCHER_(_tn, _i, __VA_ARGS__) - -#endif // THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_ diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-actions.h b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-actions.h deleted file mode 100644 index 981af78..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-actions.h +++ /dev/null @@ -1,1884 +0,0 @@ -// This file was GENERATED by command: -// pump.py gmock-generated-actions.h.pump -// DO NOT EDIT BY HAND!!! - -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -// Google Mock - a framework for writing C++ mock classes. -// -// This file implements some commonly used variadic actions. - -// GOOGLETEST_CM0002 DO NOT DELETE - -#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ -#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ - -#include -#include - -#include "gmock/gmock-actions.h" -#include "gmock/internal/gmock-port.h" - -namespace testing { -namespace internal { - -// A macro from the ACTION* family (defined later in this file) -// defines an action that can be used in a mock function. Typically, -// these actions only care about a subset of the arguments of the mock -// function. For example, if such an action only uses the second -// argument, it can be used in any mock function that takes >= 2 -// arguments where the type of the second argument is compatible. -// -// Therefore, the action implementation must be prepared to take more -// arguments than it needs. The ExcessiveArg type is used to -// represent those excessive arguments. In order to keep the compiler -// error messages tractable, we define it in the testing namespace -// instead of testing::internal. However, this is an INTERNAL TYPE -// and subject to change without notice, so a user MUST NOT USE THIS -// TYPE DIRECTLY. -struct ExcessiveArg {}; - -// A helper class needed for implementing the ACTION* macros. -template -class ActionHelper { - public: - static Result Perform(Impl* impl, const ::std::tuple<>& args) { - return impl->template gmock_PerformImpl<>(args, ExcessiveArg(), - ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), - ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), - ExcessiveArg()); - } - - template - static Result Perform(Impl* impl, const ::std::tuple& args) { - return impl->template gmock_PerformImpl(args, std::get<0>(args), - ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), - ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), - ExcessiveArg()); - } - - template - static Result Perform(Impl* impl, const ::std::tuple& args) { - return impl->template gmock_PerformImpl(args, std::get<0>(args), - std::get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), - ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), - ExcessiveArg()); - } - - template - static Result Perform(Impl* impl, const ::std::tuple& args) { - return impl->template gmock_PerformImpl(args, - std::get<0>(args), std::get<1>(args), std::get<2>(args), - ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), - ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); - } - - template - static Result Perform(Impl* impl, const ::std::tuple& args) { - return impl->template gmock_PerformImpl(args, - std::get<0>(args), std::get<1>(args), std::get<2>(args), - std::get<3>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), - ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); - } - - template - static Result Perform(Impl* impl, const ::std::tuple& args) { - return impl->template gmock_PerformImpl(args, - std::get<0>(args), std::get<1>(args), std::get<2>(args), - std::get<3>(args), std::get<4>(args), ExcessiveArg(), ExcessiveArg(), - ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); - } - - template - static Result Perform(Impl* impl, const ::std::tuple& args) { - return impl->template gmock_PerformImpl(args, - std::get<0>(args), std::get<1>(args), std::get<2>(args), - std::get<3>(args), std::get<4>(args), std::get<5>(args), - ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); - } - - template - static Result Perform(Impl* impl, const ::std::tuple& args) { - return impl->template gmock_PerformImpl(args, - std::get<0>(args), std::get<1>(args), std::get<2>(args), - std::get<3>(args), std::get<4>(args), std::get<5>(args), - std::get<6>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); - } - - template - static Result Perform(Impl* impl, const ::std::tuple& args) { - return impl->template gmock_PerformImpl(args, std::get<0>(args), std::get<1>(args), std::get<2>(args), - std::get<3>(args), std::get<4>(args), std::get<5>(args), - std::get<6>(args), std::get<7>(args), ExcessiveArg(), ExcessiveArg()); - } - - template - static Result Perform(Impl* impl, const ::std::tuple& args) { - return impl->template gmock_PerformImpl(args, std::get<0>(args), std::get<1>(args), std::get<2>(args), - std::get<3>(args), std::get<4>(args), std::get<5>(args), - std::get<6>(args), std::get<7>(args), std::get<8>(args), - ExcessiveArg()); - } - - template - static Result Perform(Impl* impl, const ::std::tuple& args) { - return impl->template gmock_PerformImpl(args, std::get<0>(args), std::get<1>(args), std::get<2>(args), - std::get<3>(args), std::get<4>(args), std::get<5>(args), - std::get<6>(args), std::get<7>(args), std::get<8>(args), - std::get<9>(args)); - } -}; - -} // namespace internal -} // namespace testing - -// The ACTION* family of macros can be used in a namespace scope to -// define custom actions easily. The syntax: -// -// ACTION(name) { statements; } -// -// will define an action with the given name that executes the -// statements. The value returned by the statements will be used as -// the return value of the action. Inside the statements, you can -// refer to the K-th (0-based) argument of the mock function by -// 'argK', and refer to its type by 'argK_type'. For example: -// -// ACTION(IncrementArg1) { -// arg1_type temp = arg1; -// return ++(*temp); -// } -// -// allows you to write -// -// ...WillOnce(IncrementArg1()); -// -// You can also refer to the entire argument tuple and its type by -// 'args' and 'args_type', and refer to the mock function type and its -// return type by 'function_type' and 'return_type'. -// -// Note that you don't need to specify the types of the mock function -// arguments. However rest assured that your code is still type-safe: -// you'll get a compiler error if *arg1 doesn't support the ++ -// operator, or if the type of ++(*arg1) isn't compatible with the -// mock function's return type, for example. -// -// Sometimes you'll want to parameterize the action. For that you can use -// another macro: -// -// ACTION_P(name, param_name) { statements; } -// -// For example: -// -// ACTION_P(Add, n) { return arg0 + n; } -// -// will allow you to write: -// -// ...WillOnce(Add(5)); -// -// Note that you don't need to provide the type of the parameter -// either. If you need to reference the type of a parameter named -// 'foo', you can write 'foo_type'. For example, in the body of -// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type -// of 'n'. -// -// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support -// multi-parameter actions. -// -// For the purpose of typing, you can view -// -// ACTION_Pk(Foo, p1, ..., pk) { ... } -// -// as shorthand for -// -// template -// FooActionPk Foo(p1_type p1, ..., pk_type pk) { ... } -// -// In particular, you can provide the template type arguments -// explicitly when invoking Foo(), as in Foo(5, false); -// although usually you can rely on the compiler to infer the types -// for you automatically. You can assign the result of expression -// Foo(p1, ..., pk) to a variable of type FooActionPk. This can be useful when composing actions. -// -// You can also overload actions with different numbers of parameters: -// -// ACTION_P(Plus, a) { ... } -// ACTION_P2(Plus, a, b) { ... } -// -// While it's tempting to always use the ACTION* macros when defining -// a new action, you should also consider implementing ActionInterface -// or using MakePolymorphicAction() instead, especially if you need to -// use the action a lot. While these approaches require more work, -// they give you more control on the types of the mock function -// arguments and the action parameters, which in general leads to -// better compiler error messages that pay off in the long run. They -// also allow overloading actions based on parameter types (as opposed -// to just based on the number of parameters). -// -// CAVEAT: -// -// ACTION*() can only be used in a namespace scope as templates cannot be -// declared inside of a local class. -// Users can, however, define any local functors (e.g. a lambda) that -// can be used as actions. -// -// MORE INFORMATION: -// -// To learn more about using these macros, please search for 'ACTION' on -// https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md - -// An internal macro needed for implementing ACTION*(). -#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\ - const args_type& args GTEST_ATTRIBUTE_UNUSED_, \ - const arg0_type& arg0 GTEST_ATTRIBUTE_UNUSED_, \ - const arg1_type& arg1 GTEST_ATTRIBUTE_UNUSED_, \ - const arg2_type& arg2 GTEST_ATTRIBUTE_UNUSED_, \ - const arg3_type& arg3 GTEST_ATTRIBUTE_UNUSED_, \ - const arg4_type& arg4 GTEST_ATTRIBUTE_UNUSED_, \ - const arg5_type& arg5 GTEST_ATTRIBUTE_UNUSED_, \ - const arg6_type& arg6 GTEST_ATTRIBUTE_UNUSED_, \ - const arg7_type& arg7 GTEST_ATTRIBUTE_UNUSED_, \ - const arg8_type& arg8 GTEST_ATTRIBUTE_UNUSED_, \ - const arg9_type& arg9 GTEST_ATTRIBUTE_UNUSED_ - -// Sometimes you want to give an action explicit template parameters -// that cannot be inferred from its value parameters. ACTION() and -// ACTION_P*() don't support that. ACTION_TEMPLATE() remedies that -// and can be viewed as an extension to ACTION() and ACTION_P*(). -// -// The syntax: -// -// ACTION_TEMPLATE(ActionName, -// HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), -// AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } -// -// defines an action template that takes m explicit template -// parameters and n value parameters. name_i is the name of the i-th -// template parameter, and kind_i specifies whether it's a typename, -// an integral constant, or a template. p_i is the name of the i-th -// value parameter. -// -// Example: -// -// // DuplicateArg(output) converts the k-th argument of the mock -// // function to type T and copies it to *output. -// ACTION_TEMPLATE(DuplicateArg, -// HAS_2_TEMPLATE_PARAMS(int, k, typename, T), -// AND_1_VALUE_PARAMS(output)) { -// *output = T(::std::get(args)); -// } -// ... -// int n; -// EXPECT_CALL(mock, Foo(_, _)) -// .WillOnce(DuplicateArg<1, unsigned char>(&n)); -// -// To create an instance of an action template, write: -// -// ActionName(v1, ..., v_n) -// -// where the ts are the template arguments and the vs are the value -// arguments. The value argument types are inferred by the compiler. -// If you want to explicitly specify the value argument types, you can -// provide additional template arguments: -// -// ActionName(v1, ..., v_n) -// -// where u_i is the desired type of v_i. -// -// ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the -// number of value parameters, but not on the number of template -// parameters. Without the restriction, the meaning of the following -// is unclear: -// -// OverloadedAction(x); -// -// Are we using a single-template-parameter action where 'bool' refers -// to the type of x, or are we using a two-template-parameter action -// where the compiler is asked to infer the type of x? -// -// Implementation notes: -// -// GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and -// GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for -// implementing ACTION_TEMPLATE. The main trick we use is to create -// new macro invocations when expanding a macro. For example, we have -// -// #define ACTION_TEMPLATE(name, template_params, value_params) -// ... GMOCK_INTERNAL_DECL_##template_params ... -// -// which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...) -// to expand to -// -// ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ... -// -// Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the -// preprocessor will continue to expand it to -// -// ... typename T ... -// -// This technique conforms to the C++ standard and is portable. It -// allows us to implement action templates using O(N) code, where N is -// the maximum number of template/value parameters supported. Without -// using it, we'd have to devote O(N^2) amount of code to implement all -// combinations of m and n. - -// Declares the template parameters. -#define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0 -#define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \ - name1) kind0 name0, kind1 name1 -#define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2) kind0 name0, kind1 name1, kind2 name2 -#define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2, kind3, name3) kind0 name0, kind1 name1, kind2 name2, \ - kind3 name3 -#define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2, kind3, name3, kind4, name4) kind0 name0, kind1 name1, \ - kind2 name2, kind3 name3, kind4 name4 -#define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2, kind3, name3, kind4, name4, kind5, name5) kind0 name0, \ - kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5 -#define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ - name6) kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \ - kind5 name5, kind6 name6 -#define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ - kind7, name7) kind0 name0, kind1 name1, kind2 name2, kind3 name3, \ - kind4 name4, kind5 name5, kind6 name6, kind7 name7 -#define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ - kind7, name7, kind8, name8) kind0 name0, kind1 name1, kind2 name2, \ - kind3 name3, kind4 name4, kind5 name5, kind6 name6, kind7 name7, \ - kind8 name8 -#define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \ - name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ - name6, kind7, name7, kind8, name8, kind9, name9) kind0 name0, \ - kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5, \ - kind6 name6, kind7 name7, kind8 name8, kind9 name9 - -// Lists the template parameters. -#define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0 -#define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \ - name1) name0, name1 -#define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2) name0, name1, name2 -#define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2, kind3, name3) name0, name1, name2, name3 -#define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2, kind3, name3, kind4, name4) name0, name1, name2, name3, \ - name4 -#define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2, kind3, name3, kind4, name4, kind5, name5) name0, name1, \ - name2, name3, name4, name5 -#define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ - name6) name0, name1, name2, name3, name4, name5, name6 -#define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ - kind7, name7) name0, name1, name2, name3, name4, name5, name6, name7 -#define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ - kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ - kind7, name7, kind8, name8) name0, name1, name2, name3, name4, name5, \ - name6, name7, name8 -#define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \ - name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ - name6, kind7, name7, kind8, name8, kind9, name9) name0, name1, name2, \ - name3, name4, name5, name6, name7, name8, name9 - -// Declares the types of value parameters. -#define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS() -#define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type -#define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) , \ - typename p0##_type, typename p1##_type -#define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , \ - typename p0##_type, typename p1##_type, typename p2##_type -#define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \ - typename p0##_type, typename p1##_type, typename p2##_type, \ - typename p3##_type -#define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \ - typename p0##_type, typename p1##_type, typename p2##_type, \ - typename p3##_type, typename p4##_type -#define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \ - typename p0##_type, typename p1##_type, typename p2##_type, \ - typename p3##_type, typename p4##_type, typename p5##_type -#define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ - p6) , typename p0##_type, typename p1##_type, typename p2##_type, \ - typename p3##_type, typename p4##_type, typename p5##_type, \ - typename p6##_type -#define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ - p6, p7) , typename p0##_type, typename p1##_type, typename p2##_type, \ - typename p3##_type, typename p4##_type, typename p5##_type, \ - typename p6##_type, typename p7##_type -#define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ - p6, p7, p8) , typename p0##_type, typename p1##_type, typename p2##_type, \ - typename p3##_type, typename p4##_type, typename p5##_type, \ - typename p6##_type, typename p7##_type, typename p8##_type -#define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ - p6, p7, p8, p9) , typename p0##_type, typename p1##_type, \ - typename p2##_type, typename p3##_type, typename p4##_type, \ - typename p5##_type, typename p6##_type, typename p7##_type, \ - typename p8##_type, typename p9##_type - -// Initializes the value parameters. -#define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\ - () -#define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\ - (p0##_type gmock_p0) : p0(::std::move(gmock_p0)) -#define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\ - (p0##_type gmock_p0, p1##_type gmock_p1) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)) -#define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\ - (p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)) -#define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\ - (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)) -#define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\ - (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)) -#define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\ - (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)) -#define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\ - (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ - p6##_type gmock_p6) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)) -#define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\ - (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ - p6##_type gmock_p6, p7##_type gmock_p7) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \ - p7(::std::move(gmock_p7)) -#define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7, p8)\ - (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ - p6##_type gmock_p6, p7##_type gmock_p7, \ - p8##_type gmock_p8) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \ - p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)) -#define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7, p8, p9)\ - (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ - p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ - p9##_type gmock_p9) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \ - p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)), \ - p9(::std::move(gmock_p9)) - -// Declares the fields for storing the value parameters. -#define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS() -#define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0; -#define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0; \ - p1##_type p1; -#define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0; \ - p1##_type p1; p2##_type p2; -#define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0; \ - p1##_type p1; p2##_type p2; p3##_type p3; -#define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \ - p4) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; -#define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \ - p5) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ - p5##_type p5; -#define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ - p6) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ - p5##_type p5; p6##_type p6; -#define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ - p5##_type p5; p6##_type p6; p7##_type p7; -#define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7, p8) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \ - p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; -#define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7, p8, p9) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \ - p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; \ - p9##_type p9; - -// Lists the value parameters. -#define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS() -#define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0 -#define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1 -#define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2 -#define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3 -#define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) p0, p1, \ - p2, p3, p4 -#define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) p0, \ - p1, p2, p3, p4, p5 -#define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ - p6) p0, p1, p2, p3, p4, p5, p6 -#define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7) p0, p1, p2, p3, p4, p5, p6, p7 -#define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7, p8) p0, p1, p2, p3, p4, p5, p6, p7, p8 -#define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7, p8, p9) p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 - -// Lists the value parameter types. -#define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS() -#define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type -#define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) , p0##_type, \ - p1##_type -#define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , p0##_type, \ - p1##_type, p2##_type -#define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \ - p0##_type, p1##_type, p2##_type, p3##_type -#define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \ - p0##_type, p1##_type, p2##_type, p3##_type, p4##_type -#define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \ - p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type -#define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ - p6) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \ - p6##_type -#define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ - p6, p7) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ - p5##_type, p6##_type, p7##_type -#define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ - p6, p7, p8) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ - p5##_type, p6##_type, p7##_type, p8##_type -#define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ - p6, p7, p8, p9) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ - p5##_type, p6##_type, p7##_type, p8##_type, p9##_type - -// Declares the value parameters. -#define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS() -#define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0 -#define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0, \ - p1##_type p1 -#define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0, \ - p1##_type p1, p2##_type p2 -#define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0, \ - p1##_type p1, p2##_type p2, p3##_type p3 -#define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \ - p4) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4 -#define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \ - p5) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ - p5##_type p5 -#define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ - p6) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ - p5##_type p5, p6##_type p6 -#define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ - p5##_type p5, p6##_type p6, p7##_type p7 -#define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7, p8) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ - p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8 -#define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7, p8, p9) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ - p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ - p9##_type p9 - -// The suffix of the class template implementing the action template. -#define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS() -#define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P -#define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2 -#define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3 -#define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4 -#define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5 -#define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6 -#define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7 -#define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7) P8 -#define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7, p8) P9 -#define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ - p7, p8, p9) P10 - -// The name of the class template implementing the action template. -#define GMOCK_ACTION_CLASS_(name, value_params)\ - GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params) - -#define ACTION_TEMPLATE(name, template_params, value_params)\ - template \ - class GMOCK_ACTION_CLASS_(name, value_params) {\ - public:\ - explicit GMOCK_ACTION_CLASS_(name, value_params)\ - GMOCK_INTERNAL_INIT_##value_params {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template \ - return_type gmock_PerformImpl(const args_type& args, \ - const arg0_type& arg0, const arg1_type& arg1, \ - const arg2_type& arg2, const arg3_type& arg3, \ - const arg4_type& arg4, const arg5_type& arg5, \ - const arg6_type& arg6, const arg7_type& arg7, \ - const arg8_type& arg8, const arg9_type& arg9) const;\ - GMOCK_INTERNAL_DEFN_##value_params\ - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(\ - new gmock_Impl(GMOCK_INTERNAL_LIST_##value_params));\ - }\ - GMOCK_INTERNAL_DEFN_##value_params\ - private:\ - GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\ - };\ - template \ - inline GMOCK_ACTION_CLASS_(name, value_params)<\ - GMOCK_INTERNAL_LIST_##template_params\ - GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\ - GMOCK_INTERNAL_DECL_##value_params) {\ - return GMOCK_ACTION_CLASS_(name, value_params)<\ - GMOCK_INTERNAL_LIST_##template_params\ - GMOCK_INTERNAL_LIST_TYPE_##value_params>(\ - GMOCK_INTERNAL_LIST_##value_params);\ - }\ - template \ - template \ - template \ - typename ::testing::internal::Function::Result\ - GMOCK_ACTION_CLASS_(name, value_params)<\ - GMOCK_INTERNAL_LIST_##template_params\ - GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl::\ - gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -#define ACTION(name)\ - class name##Action {\ - public:\ - name##Action() {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - gmock_Impl() {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template \ - return_type gmock_PerformImpl(const args_type& args, \ - const arg0_type& arg0, const arg1_type& arg1, \ - const arg2_type& arg2, const arg3_type& arg3, \ - const arg4_type& arg4, const arg5_type& arg5, \ - const arg6_type& arg6, const arg7_type& arg7, \ - const arg8_type& arg8, const arg9_type& arg9) const;\ - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(new gmock_Impl());\ - }\ - private:\ - GTEST_DISALLOW_ASSIGN_(name##Action);\ - };\ - inline name##Action name() {\ - return name##Action();\ - }\ - template \ - template \ - typename ::testing::internal::Function::Result\ - name##Action::gmock_Impl::gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -#define ACTION_P(name, p0)\ - template \ - class name##ActionP {\ - public:\ - explicit name##ActionP(p0##_type gmock_p0) : \ - p0(::std::forward(gmock_p0)) {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - explicit gmock_Impl(p0##_type gmock_p0) : \ - p0(::std::forward(gmock_p0)) {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template \ - return_type gmock_PerformImpl(const args_type& args, \ - const arg0_type& arg0, const arg1_type& arg1, \ - const arg2_type& arg2, const arg3_type& arg3, \ - const arg4_type& arg4, const arg5_type& arg5, \ - const arg6_type& arg6, const arg7_type& arg7, \ - const arg8_type& arg8, const arg9_type& arg9) const;\ - p0##_type p0;\ - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(new gmock_Impl(p0));\ - }\ - p0##_type p0;\ - private:\ - GTEST_DISALLOW_ASSIGN_(name##ActionP);\ - };\ - template \ - inline name##ActionP name(p0##_type p0) {\ - return name##ActionP(p0);\ - }\ - template \ - template \ - template \ - typename ::testing::internal::Function::Result\ - name##ActionP::gmock_Impl::gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -#define ACTION_P2(name, p0, p1)\ - template \ - class name##ActionP2 {\ - public:\ - name##ActionP2(p0##_type gmock_p0, \ - p1##_type gmock_p1) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)) {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - gmock_Impl(p0##_type gmock_p0, \ - p1##_type gmock_p1) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)) {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template \ - return_type gmock_PerformImpl(const args_type& args, \ - const arg0_type& arg0, const arg1_type& arg1, \ - const arg2_type& arg2, const arg3_type& arg3, \ - const arg4_type& arg4, const arg5_type& arg5, \ - const arg6_type& arg6, const arg7_type& arg7, \ - const arg8_type& arg8, const arg9_type& arg9) const;\ - p0##_type p0;\ - p1##_type p1;\ - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(new gmock_Impl(p0, p1));\ - }\ - p0##_type p0;\ - p1##_type p1;\ - private:\ - GTEST_DISALLOW_ASSIGN_(name##ActionP2);\ - };\ - template \ - inline name##ActionP2 name(p0##_type p0, \ - p1##_type p1) {\ - return name##ActionP2(p0, p1);\ - }\ - template \ - template \ - template \ - typename ::testing::internal::Function::Result\ - name##ActionP2::gmock_Impl::gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -#define ACTION_P3(name, p0, p1, p2)\ - template \ - class name##ActionP3 {\ - public:\ - name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)) {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)) {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template \ - return_type gmock_PerformImpl(const args_type& args, \ - const arg0_type& arg0, const arg1_type& arg1, \ - const arg2_type& arg2, const arg3_type& arg3, \ - const arg4_type& arg4, const arg5_type& arg5, \ - const arg6_type& arg6, const arg7_type& arg7, \ - const arg8_type& arg8, const arg9_type& arg9) const;\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(new gmock_Impl(p0, p1, p2));\ - }\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - private:\ - GTEST_DISALLOW_ASSIGN_(name##ActionP3);\ - };\ - template \ - inline name##ActionP3 name(p0##_type p0, \ - p1##_type p1, p2##_type p2) {\ - return name##ActionP3(p0, p1, p2);\ - }\ - template \ - template \ - template \ - typename ::testing::internal::Function::Result\ - name##ActionP3::gmock_Impl::gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -#define ACTION_P4(name, p0, p1, p2, p3)\ - template \ - class name##ActionP4 {\ - public:\ - name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, \ - p3##_type gmock_p3) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)) {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)) {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template \ - return_type gmock_PerformImpl(const args_type& args, \ - const arg0_type& arg0, const arg1_type& arg1, \ - const arg2_type& arg2, const arg3_type& arg3, \ - const arg4_type& arg4, const arg5_type& arg5, \ - const arg6_type& arg6, const arg7_type& arg7, \ - const arg8_type& arg8, const arg9_type& arg9) const;\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(new gmock_Impl(p0, p1, p2, p3));\ - }\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - private:\ - GTEST_DISALLOW_ASSIGN_(name##ActionP4);\ - };\ - template \ - inline name##ActionP4 name(p0##_type p0, p1##_type p1, p2##_type p2, \ - p3##_type p3) {\ - return name##ActionP4(p0, p1, \ - p2, p3);\ - }\ - template \ - template \ - template \ - typename ::testing::internal::Function::Result\ - name##ActionP4::gmock_Impl::gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -#define ACTION_P5(name, p0, p1, p2, p3, p4)\ - template \ - class name##ActionP5 {\ - public:\ - name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, \ - p4##_type gmock_p4) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)), \ - p4(::std::forward(gmock_p4)) {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, \ - p4##_type gmock_p4) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)), \ - p4(::std::forward(gmock_p4)) {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template \ - return_type gmock_PerformImpl(const args_type& args, \ - const arg0_type& arg0, const arg1_type& arg1, \ - const arg2_type& arg2, const arg3_type& arg3, \ - const arg4_type& arg4, const arg5_type& arg5, \ - const arg6_type& arg6, const arg7_type& arg7, \ - const arg8_type& arg8, const arg9_type& arg9) const;\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - p4##_type p4;\ - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4));\ - }\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - p4##_type p4;\ - private:\ - GTEST_DISALLOW_ASSIGN_(name##ActionP5);\ - };\ - template \ - inline name##ActionP5 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ - p4##_type p4) {\ - return name##ActionP5(p0, p1, p2, p3, p4);\ - }\ - template \ - template \ - template \ - typename ::testing::internal::Function::Result\ - name##ActionP5::gmock_Impl::gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -#define ACTION_P6(name, p0, p1, p2, p3, p4, p5)\ - template \ - class name##ActionP6 {\ - public:\ - name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)), \ - p4(::std::forward(gmock_p4)), \ - p5(::std::forward(gmock_p5)) {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)), \ - p4(::std::forward(gmock_p4)), \ - p5(::std::forward(gmock_p5)) {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template \ - return_type gmock_PerformImpl(const args_type& args, \ - const arg0_type& arg0, const arg1_type& arg1, \ - const arg2_type& arg2, const arg3_type& arg3, \ - const arg4_type& arg4, const arg5_type& arg5, \ - const arg6_type& arg6, const arg7_type& arg7, \ - const arg8_type& arg8, const arg9_type& arg9) const;\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - p4##_type p4;\ - p5##_type p5;\ - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5));\ - }\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - p4##_type p4;\ - p5##_type p5;\ - private:\ - GTEST_DISALLOW_ASSIGN_(name##ActionP6);\ - };\ - template \ - inline name##ActionP6 name(p0##_type p0, p1##_type p1, p2##_type p2, \ - p3##_type p3, p4##_type p4, p5##_type p5) {\ - return name##ActionP6(p0, p1, p2, p3, p4, p5);\ - }\ - template \ - template \ - template \ - typename ::testing::internal::Function::Result\ - name##ActionP6::gmock_Impl::gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -#define ACTION_P7(name, p0, p1, p2, p3, p4, p5, p6)\ - template \ - class name##ActionP7 {\ - public:\ - name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, \ - p6##_type gmock_p6) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)), \ - p4(::std::forward(gmock_p4)), \ - p5(::std::forward(gmock_p5)), \ - p6(::std::forward(gmock_p6)) {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ - p6##_type gmock_p6) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)), \ - p4(::std::forward(gmock_p4)), \ - p5(::std::forward(gmock_p5)), \ - p6(::std::forward(gmock_p6)) {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template \ - return_type gmock_PerformImpl(const args_type& args, \ - const arg0_type& arg0, const arg1_type& arg1, \ - const arg2_type& arg2, const arg3_type& arg3, \ - const arg4_type& arg4, const arg5_type& arg5, \ - const arg6_type& arg6, const arg7_type& arg7, \ - const arg8_type& arg8, const arg9_type& arg9) const;\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - p4##_type p4;\ - p5##_type p5;\ - p6##_type p6;\ - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5, \ - p6));\ - }\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - p4##_type p4;\ - p5##_type p5;\ - p6##_type p6;\ - private:\ - GTEST_DISALLOW_ASSIGN_(name##ActionP7);\ - };\ - template \ - inline name##ActionP7 name(p0##_type p0, p1##_type p1, \ - p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ - p6##_type p6) {\ - return name##ActionP7(p0, p1, p2, p3, p4, p5, p6);\ - }\ - template \ - template \ - template \ - typename ::testing::internal::Function::Result\ - name##ActionP7::gmock_Impl::gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -#define ACTION_P8(name, p0, p1, p2, p3, p4, p5, p6, p7)\ - template \ - class name##ActionP8 {\ - public:\ - name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6, \ - p7##_type gmock_p7) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)), \ - p4(::std::forward(gmock_p4)), \ - p5(::std::forward(gmock_p5)), \ - p6(::std::forward(gmock_p6)), \ - p7(::std::forward(gmock_p7)) {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ - p6##_type gmock_p6, \ - p7##_type gmock_p7) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)), \ - p4(::std::forward(gmock_p4)), \ - p5(::std::forward(gmock_p5)), \ - p6(::std::forward(gmock_p6)), \ - p7(::std::forward(gmock_p7)) {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template \ - return_type gmock_PerformImpl(const args_type& args, \ - const arg0_type& arg0, const arg1_type& arg1, \ - const arg2_type& arg2, const arg3_type& arg3, \ - const arg4_type& arg4, const arg5_type& arg5, \ - const arg6_type& arg6, const arg7_type& arg7, \ - const arg8_type& arg8, const arg9_type& arg9) const;\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - p4##_type p4;\ - p5##_type p5;\ - p6##_type p6;\ - p7##_type p7;\ - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5, \ - p6, p7));\ - }\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - p4##_type p4;\ - p5##_type p5;\ - p6##_type p6;\ - p7##_type p7;\ - private:\ - GTEST_DISALLOW_ASSIGN_(name##ActionP8);\ - };\ - template \ - inline name##ActionP8 name(p0##_type p0, \ - p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ - p6##_type p6, p7##_type p7) {\ - return name##ActionP8(p0, p1, p2, p3, p4, p5, \ - p6, p7);\ - }\ - template \ - template \ - template \ - typename ::testing::internal::Function::Result\ - name##ActionP8::gmock_Impl::gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -#define ACTION_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8)\ - template \ - class name##ActionP9 {\ - public:\ - name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ - p8##_type gmock_p8) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)), \ - p4(::std::forward(gmock_p4)), \ - p5(::std::forward(gmock_p5)), \ - p6(::std::forward(gmock_p6)), \ - p7(::std::forward(gmock_p7)), \ - p8(::std::forward(gmock_p8)) {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ - p6##_type gmock_p6, p7##_type gmock_p7, \ - p8##_type gmock_p8) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)), \ - p4(::std::forward(gmock_p4)), \ - p5(::std::forward(gmock_p5)), \ - p6(::std::forward(gmock_p6)), \ - p7(::std::forward(gmock_p7)), \ - p8(::std::forward(gmock_p8)) {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template \ - return_type gmock_PerformImpl(const args_type& args, \ - const arg0_type& arg0, const arg1_type& arg1, \ - const arg2_type& arg2, const arg3_type& arg3, \ - const arg4_type& arg4, const arg5_type& arg5, \ - const arg6_type& arg6, const arg7_type& arg7, \ - const arg8_type& arg8, const arg9_type& arg9) const;\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - p4##_type p4;\ - p5##_type p5;\ - p6##_type p6;\ - p7##_type p7;\ - p8##_type p8;\ - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5, \ - p6, p7, p8));\ - }\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - p4##_type p4;\ - p5##_type p5;\ - p6##_type p6;\ - p7##_type p7;\ - p8##_type p8;\ - private:\ - GTEST_DISALLOW_ASSIGN_(name##ActionP9);\ - };\ - template \ - inline name##ActionP9 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ - p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \ - p8##_type p8) {\ - return name##ActionP9(p0, p1, p2, \ - p3, p4, p5, p6, p7, p8);\ - }\ - template \ - template \ - template \ - typename ::testing::internal::Function::Result\ - name##ActionP9::gmock_Impl::gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -#define ACTION_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)\ - template \ - class name##ActionP10 {\ - public:\ - name##ActionP10(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ - p8##_type gmock_p8, \ - p9##_type gmock_p9) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)), \ - p4(::std::forward(gmock_p4)), \ - p5(::std::forward(gmock_p5)), \ - p6(::std::forward(gmock_p6)), \ - p7(::std::forward(gmock_p7)), \ - p8(::std::forward(gmock_p8)), \ - p9(::std::forward(gmock_p9)) {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ - p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ - p9##_type gmock_p9) : p0(::std::forward(gmock_p0)), \ - p1(::std::forward(gmock_p1)), \ - p2(::std::forward(gmock_p2)), \ - p3(::std::forward(gmock_p3)), \ - p4(::std::forward(gmock_p4)), \ - p5(::std::forward(gmock_p5)), \ - p6(::std::forward(gmock_p6)), \ - p7(::std::forward(gmock_p7)), \ - p8(::std::forward(gmock_p8)), \ - p9(::std::forward(gmock_p9)) {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template \ - return_type gmock_PerformImpl(const args_type& args, \ - const arg0_type& arg0, const arg1_type& arg1, \ - const arg2_type& arg2, const arg3_type& arg3, \ - const arg4_type& arg4, const arg5_type& arg5, \ - const arg6_type& arg6, const arg7_type& arg7, \ - const arg8_type& arg8, const arg9_type& arg9) const;\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - p4##_type p4;\ - p5##_type p5;\ - p6##_type p6;\ - p7##_type p7;\ - p8##_type p8;\ - p9##_type p9;\ - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5, \ - p6, p7, p8, p9));\ - }\ - p0##_type p0;\ - p1##_type p1;\ - p2##_type p2;\ - p3##_type p3;\ - p4##_type p4;\ - p5##_type p5;\ - p6##_type p6;\ - p7##_type p7;\ - p8##_type p8;\ - p9##_type p9;\ - private:\ - GTEST_DISALLOW_ASSIGN_(name##ActionP10);\ - };\ - template \ - inline name##ActionP10 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ - p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ - p9##_type p9) {\ - return name##ActionP10(p0, \ - p1, p2, p3, p4, p5, p6, p7, p8, p9);\ - }\ - template \ - template \ - template \ - typename ::testing::internal::Function::Result\ - name##ActionP10::gmock_Impl::gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -namespace testing { - - -// The ACTION*() macros trigger warning C4100 (unreferenced formal -// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in -// the macro definition, as the warnings are generated when the macro -// is expanded and macro expansion cannot contain #pragma. Therefore -// we suppress them here. -#ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable:4100) -#endif - -// Various overloads for InvokeArgument(). -// -// The InvokeArgument(a1, a2, ..., a_k) action invokes the N-th -// (0-based) argument, which must be a k-ary callable, of the mock -// function, with arguments a1, a2, ..., a_k. -// -// Notes: -// -// 1. The arguments are passed by value by default. If you need to -// pass an argument by reference, wrap it inside ByRef(). For -// example, -// -// InvokeArgument<1>(5, string("Hello"), ByRef(foo)) -// -// passes 5 and string("Hello") by value, and passes foo by -// reference. -// -// 2. If the callable takes an argument by reference but ByRef() is -// not used, it will receive the reference to a copy of the value, -// instead of the original value. For example, when the 0-th -// argument of the mock function takes a const string&, the action -// -// InvokeArgument<0>(string("Hello")) -// -// makes a copy of the temporary string("Hello") object and passes a -// reference of the copy, instead of the original temporary object, -// to the callable. This makes it easy for a user to define an -// InvokeArgument action from temporary values and have it performed -// later. - -namespace internal { -namespace invoke_argument { - -// Appears in InvokeArgumentAdl's argument list to help avoid -// accidental calls to user functions of the same name. -struct AdlTag {}; - -// InvokeArgumentAdl - a helper for InvokeArgument. -// The basic overloads are provided here for generic functors. -// Overloads for other custom-callables are provided in the -// internal/custom/callback-actions.h header. - -template -R InvokeArgumentAdl(AdlTag, F f) { - return f(); -} -template -R InvokeArgumentAdl(AdlTag, F f, A1 a1) { - return f(a1); -} -template -R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2) { - return f(a1, a2); -} -template -R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3) { - return f(a1, a2, a3); -} -template -R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4) { - return f(a1, a2, a3, a4); -} -template -R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { - return f(a1, a2, a3, a4, a5); -} -template -R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { - return f(a1, a2, a3, a4, a5, a6); -} -template -R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, - A7 a7) { - return f(a1, a2, a3, a4, a5, a6, a7); -} -template -R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, - A7 a7, A8 a8) { - return f(a1, a2, a3, a4, a5, a6, a7, a8); -} -template -R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, - A7 a7, A8 a8, A9 a9) { - return f(a1, a2, a3, a4, a5, a6, a7, a8, a9); -} -template -R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, - A7 a7, A8 a8, A9 a9, A10 a10) { - return f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); -} -} // namespace invoke_argument -} // namespace internal - -ACTION_TEMPLATE(InvokeArgument, - HAS_1_TEMPLATE_PARAMS(int, k), - AND_0_VALUE_PARAMS()) { - using internal::invoke_argument::InvokeArgumentAdl; - return InvokeArgumentAdl( - internal::invoke_argument::AdlTag(), - ::std::get(args)); -} - -ACTION_TEMPLATE(InvokeArgument, - HAS_1_TEMPLATE_PARAMS(int, k), - AND_1_VALUE_PARAMS(p0)) { - using internal::invoke_argument::InvokeArgumentAdl; - return InvokeArgumentAdl( - internal::invoke_argument::AdlTag(), - ::std::get(args), p0); -} - -ACTION_TEMPLATE(InvokeArgument, - HAS_1_TEMPLATE_PARAMS(int, k), - AND_2_VALUE_PARAMS(p0, p1)) { - using internal::invoke_argument::InvokeArgumentAdl; - return InvokeArgumentAdl( - internal::invoke_argument::AdlTag(), - ::std::get(args), p0, p1); -} - -ACTION_TEMPLATE(InvokeArgument, - HAS_1_TEMPLATE_PARAMS(int, k), - AND_3_VALUE_PARAMS(p0, p1, p2)) { - using internal::invoke_argument::InvokeArgumentAdl; - return InvokeArgumentAdl( - internal::invoke_argument::AdlTag(), - ::std::get(args), p0, p1, p2); -} - -ACTION_TEMPLATE(InvokeArgument, - HAS_1_TEMPLATE_PARAMS(int, k), - AND_4_VALUE_PARAMS(p0, p1, p2, p3)) { - using internal::invoke_argument::InvokeArgumentAdl; - return InvokeArgumentAdl( - internal::invoke_argument::AdlTag(), - ::std::get(args), p0, p1, p2, p3); -} - -ACTION_TEMPLATE(InvokeArgument, - HAS_1_TEMPLATE_PARAMS(int, k), - AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) { - using internal::invoke_argument::InvokeArgumentAdl; - return InvokeArgumentAdl( - internal::invoke_argument::AdlTag(), - ::std::get(args), p0, p1, p2, p3, p4); -} - -ACTION_TEMPLATE(InvokeArgument, - HAS_1_TEMPLATE_PARAMS(int, k), - AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) { - using internal::invoke_argument::InvokeArgumentAdl; - return InvokeArgumentAdl( - internal::invoke_argument::AdlTag(), - ::std::get(args), p0, p1, p2, p3, p4, p5); -} - -ACTION_TEMPLATE(InvokeArgument, - HAS_1_TEMPLATE_PARAMS(int, k), - AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) { - using internal::invoke_argument::InvokeArgumentAdl; - return InvokeArgumentAdl( - internal::invoke_argument::AdlTag(), - ::std::get(args), p0, p1, p2, p3, p4, p5, p6); -} - -ACTION_TEMPLATE(InvokeArgument, - HAS_1_TEMPLATE_PARAMS(int, k), - AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) { - using internal::invoke_argument::InvokeArgumentAdl; - return InvokeArgumentAdl( - internal::invoke_argument::AdlTag(), - ::std::get(args), p0, p1, p2, p3, p4, p5, p6, p7); -} - -ACTION_TEMPLATE(InvokeArgument, - HAS_1_TEMPLATE_PARAMS(int, k), - AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) { - using internal::invoke_argument::InvokeArgumentAdl; - return InvokeArgumentAdl( - internal::invoke_argument::AdlTag(), - ::std::get(args), p0, p1, p2, p3, p4, p5, p6, p7, p8); -} - -ACTION_TEMPLATE(InvokeArgument, - HAS_1_TEMPLATE_PARAMS(int, k), - AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) { - using internal::invoke_argument::InvokeArgumentAdl; - return InvokeArgumentAdl( - internal::invoke_argument::AdlTag(), - ::std::get(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); -} - -// Various overloads for ReturnNew(). -// -// The ReturnNew(a1, a2, ..., a_k) action returns a pointer to a new -// instance of type T, constructed on the heap with constructor arguments -// a1, a2, ..., and a_k. The caller assumes ownership of the returned value. -ACTION_TEMPLATE(ReturnNew, - HAS_1_TEMPLATE_PARAMS(typename, T), - AND_0_VALUE_PARAMS()) { - return new T(); -} - -ACTION_TEMPLATE(ReturnNew, - HAS_1_TEMPLATE_PARAMS(typename, T), - AND_1_VALUE_PARAMS(p0)) { - return new T(p0); -} - -ACTION_TEMPLATE(ReturnNew, - HAS_1_TEMPLATE_PARAMS(typename, T), - AND_2_VALUE_PARAMS(p0, p1)) { - return new T(p0, p1); -} - -ACTION_TEMPLATE(ReturnNew, - HAS_1_TEMPLATE_PARAMS(typename, T), - AND_3_VALUE_PARAMS(p0, p1, p2)) { - return new T(p0, p1, p2); -} - -ACTION_TEMPLATE(ReturnNew, - HAS_1_TEMPLATE_PARAMS(typename, T), - AND_4_VALUE_PARAMS(p0, p1, p2, p3)) { - return new T(p0, p1, p2, p3); -} - -ACTION_TEMPLATE(ReturnNew, - HAS_1_TEMPLATE_PARAMS(typename, T), - AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) { - return new T(p0, p1, p2, p3, p4); -} - -ACTION_TEMPLATE(ReturnNew, - HAS_1_TEMPLATE_PARAMS(typename, T), - AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) { - return new T(p0, p1, p2, p3, p4, p5); -} - -ACTION_TEMPLATE(ReturnNew, - HAS_1_TEMPLATE_PARAMS(typename, T), - AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) { - return new T(p0, p1, p2, p3, p4, p5, p6); -} - -ACTION_TEMPLATE(ReturnNew, - HAS_1_TEMPLATE_PARAMS(typename, T), - AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) { - return new T(p0, p1, p2, p3, p4, p5, p6, p7); -} - -ACTION_TEMPLATE(ReturnNew, - HAS_1_TEMPLATE_PARAMS(typename, T), - AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) { - return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8); -} - -ACTION_TEMPLATE(ReturnNew, - HAS_1_TEMPLATE_PARAMS(typename, T), - AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) { - return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); -} - -#ifdef _MSC_VER -# pragma warning(pop) -#endif - -} // namespace testing - -// Include any custom callback actions added by the local installation. -// We must include this header at the end to make sure it can use the -// declarations from this file. -#include "gmock/internal/custom/gmock-generated-actions.h" - -#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-actions.h.pump b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-actions.h.pump deleted file mode 100644 index 209603c..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-actions.h.pump +++ /dev/null @@ -1,627 +0,0 @@ -$$ -*- mode: c++; -*- -$$ This is a Pump source file. Please use Pump to convert it to -$$ gmock-generated-actions.h. -$$ -$var n = 10 $$ The maximum arity we support. -$$}} This meta comment fixes auto-indentation in editors. -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -// Google Mock - a framework for writing C++ mock classes. -// -// This file implements some commonly used variadic actions. - -// GOOGLETEST_CM0002 DO NOT DELETE - -#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ -#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ - -#include -#include - -#include "gmock/gmock-actions.h" -#include "gmock/internal/gmock-port.h" - -namespace testing { -namespace internal { - -// A macro from the ACTION* family (defined later in this file) -// defines an action that can be used in a mock function. Typically, -// these actions only care about a subset of the arguments of the mock -// function. For example, if such an action only uses the second -// argument, it can be used in any mock function that takes >= 2 -// arguments where the type of the second argument is compatible. -// -// Therefore, the action implementation must be prepared to take more -// arguments than it needs. The ExcessiveArg type is used to -// represent those excessive arguments. In order to keep the compiler -// error messages tractable, we define it in the testing namespace -// instead of testing::internal. However, this is an INTERNAL TYPE -// and subject to change without notice, so a user MUST NOT USE THIS -// TYPE DIRECTLY. -struct ExcessiveArg {}; - -// A helper class needed for implementing the ACTION* macros. -template -class ActionHelper { - public: -$range i 0..n -$for i - -[[ -$var template = [[$if i==0 [[]] $else [[ -$range j 0..i-1 - template <$for j, [[typename A$j]]> -]]]] -$range j 0..i-1 -$var As = [[$for j, [[A$j]]]] -$var as = [[$for j, [[std::get<$j>(args)]]]] -$range k 1..n-i -$var eas = [[$for k, [[ExcessiveArg()]]]] -$var arg_list = [[$if (i==0) | (i==n) [[$as$eas]] $else [[$as, $eas]]]] -$template - static Result Perform(Impl* impl, const ::std::tuple<$As>& args) { - return impl->template gmock_PerformImpl<$As>(args, $arg_list); - } - -]] -}; - -} // namespace internal -} // namespace testing - -// The ACTION* family of macros can be used in a namespace scope to -// define custom actions easily. The syntax: -// -// ACTION(name) { statements; } -// -// will define an action with the given name that executes the -// statements. The value returned by the statements will be used as -// the return value of the action. Inside the statements, you can -// refer to the K-th (0-based) argument of the mock function by -// 'argK', and refer to its type by 'argK_type'. For example: -// -// ACTION(IncrementArg1) { -// arg1_type temp = arg1; -// return ++(*temp); -// } -// -// allows you to write -// -// ...WillOnce(IncrementArg1()); -// -// You can also refer to the entire argument tuple and its type by -// 'args' and 'args_type', and refer to the mock function type and its -// return type by 'function_type' and 'return_type'. -// -// Note that you don't need to specify the types of the mock function -// arguments. However rest assured that your code is still type-safe: -// you'll get a compiler error if *arg1 doesn't support the ++ -// operator, or if the type of ++(*arg1) isn't compatible with the -// mock function's return type, for example. -// -// Sometimes you'll want to parameterize the action. For that you can use -// another macro: -// -// ACTION_P(name, param_name) { statements; } -// -// For example: -// -// ACTION_P(Add, n) { return arg0 + n; } -// -// will allow you to write: -// -// ...WillOnce(Add(5)); -// -// Note that you don't need to provide the type of the parameter -// either. If you need to reference the type of a parameter named -// 'foo', you can write 'foo_type'. For example, in the body of -// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type -// of 'n'. -// -// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P$n to support -// multi-parameter actions. -// -// For the purpose of typing, you can view -// -// ACTION_Pk(Foo, p1, ..., pk) { ... } -// -// as shorthand for -// -// template -// FooActionPk Foo(p1_type p1, ..., pk_type pk) { ... } -// -// In particular, you can provide the template type arguments -// explicitly when invoking Foo(), as in Foo(5, false); -// although usually you can rely on the compiler to infer the types -// for you automatically. You can assign the result of expression -// Foo(p1, ..., pk) to a variable of type FooActionPk. This can be useful when composing actions. -// -// You can also overload actions with different numbers of parameters: -// -// ACTION_P(Plus, a) { ... } -// ACTION_P2(Plus, a, b) { ... } -// -// While it's tempting to always use the ACTION* macros when defining -// a new action, you should also consider implementing ActionInterface -// or using MakePolymorphicAction() instead, especially if you need to -// use the action a lot. While these approaches require more work, -// they give you more control on the types of the mock function -// arguments and the action parameters, which in general leads to -// better compiler error messages that pay off in the long run. They -// also allow overloading actions based on parameter types (as opposed -// to just based on the number of parameters). -// -// CAVEAT: -// -// ACTION*() can only be used in a namespace scope as templates cannot be -// declared inside of a local class. -// Users can, however, define any local functors (e.g. a lambda) that -// can be used as actions. -// -// MORE INFORMATION: -// -// To learn more about using these macros, please search for 'ACTION' on -// https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md - -$range i 0..n -$range k 0..n-1 - -// An internal macro needed for implementing ACTION*(). -#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\ - const args_type& args GTEST_ATTRIBUTE_UNUSED_ -$for k [[, \ - const arg$k[[]]_type& arg$k GTEST_ATTRIBUTE_UNUSED_]] - - -// Sometimes you want to give an action explicit template parameters -// that cannot be inferred from its value parameters. ACTION() and -// ACTION_P*() don't support that. ACTION_TEMPLATE() remedies that -// and can be viewed as an extension to ACTION() and ACTION_P*(). -// -// The syntax: -// -// ACTION_TEMPLATE(ActionName, -// HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), -// AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } -// -// defines an action template that takes m explicit template -// parameters and n value parameters. name_i is the name of the i-th -// template parameter, and kind_i specifies whether it's a typename, -// an integral constant, or a template. p_i is the name of the i-th -// value parameter. -// -// Example: -// -// // DuplicateArg(output) converts the k-th argument of the mock -// // function to type T and copies it to *output. -// ACTION_TEMPLATE(DuplicateArg, -// HAS_2_TEMPLATE_PARAMS(int, k, typename, T), -// AND_1_VALUE_PARAMS(output)) { -// *output = T(::std::get(args)); -// } -// ... -// int n; -// EXPECT_CALL(mock, Foo(_, _)) -// .WillOnce(DuplicateArg<1, unsigned char>(&n)); -// -// To create an instance of an action template, write: -// -// ActionName(v1, ..., v_n) -// -// where the ts are the template arguments and the vs are the value -// arguments. The value argument types are inferred by the compiler. -// If you want to explicitly specify the value argument types, you can -// provide additional template arguments: -// -// ActionName(v1, ..., v_n) -// -// where u_i is the desired type of v_i. -// -// ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the -// number of value parameters, but not on the number of template -// parameters. Without the restriction, the meaning of the following -// is unclear: -// -// OverloadedAction(x); -// -// Are we using a single-template-parameter action where 'bool' refers -// to the type of x, or are we using a two-template-parameter action -// where the compiler is asked to infer the type of x? -// -// Implementation notes: -// -// GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and -// GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for -// implementing ACTION_TEMPLATE. The main trick we use is to create -// new macro invocations when expanding a macro. For example, we have -// -// #define ACTION_TEMPLATE(name, template_params, value_params) -// ... GMOCK_INTERNAL_DECL_##template_params ... -// -// which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...) -// to expand to -// -// ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ... -// -// Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the -// preprocessor will continue to expand it to -// -// ... typename T ... -// -// This technique conforms to the C++ standard and is portable. It -// allows us to implement action templates using O(N) code, where N is -// the maximum number of template/value parameters supported. Without -// using it, we'd have to devote O(N^2) amount of code to implement all -// combinations of m and n. - -// Declares the template parameters. - -$range j 1..n -$for j [[ -$range m 0..j-1 -#define GMOCK_INTERNAL_DECL_HAS_$j[[]] -_TEMPLATE_PARAMS($for m, [[kind$m, name$m]]) $for m, [[kind$m name$m]] - - -]] - -// Lists the template parameters. - -$for j [[ -$range m 0..j-1 -#define GMOCK_INTERNAL_LIST_HAS_$j[[]] -_TEMPLATE_PARAMS($for m, [[kind$m, name$m]]) $for m, [[name$m]] - - -]] - -// Declares the types of value parameters. - -$for i [[ -$range j 0..i-1 -#define GMOCK_INTERNAL_DECL_TYPE_AND_$i[[]] -_VALUE_PARAMS($for j, [[p$j]]) $for j [[, typename p$j##_type]] - - -]] - -// Initializes the value parameters. - -$for i [[ -$range j 0..i-1 -#define GMOCK_INTERNAL_INIT_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]])\ - ($for j, [[p$j##_type gmock_p$j]])$if i>0 [[ : ]]$for j, [[p$j(::std::move(gmock_p$j))]] - - -]] - -// Declares the fields for storing the value parameters. - -$for i [[ -$range j 0..i-1 -#define GMOCK_INTERNAL_DEFN_AND_$i[[]] -_VALUE_PARAMS($for j, [[p$j]]) $for j [[p$j##_type p$j; ]] - - -]] - -// Lists the value parameters. - -$for i [[ -$range j 0..i-1 -#define GMOCK_INTERNAL_LIST_AND_$i[[]] -_VALUE_PARAMS($for j, [[p$j]]) $for j, [[p$j]] - - -]] - -// Lists the value parameter types. - -$for i [[ -$range j 0..i-1 -#define GMOCK_INTERNAL_LIST_TYPE_AND_$i[[]] -_VALUE_PARAMS($for j, [[p$j]]) $for j [[, p$j##_type]] - - -]] - -// Declares the value parameters. - -$for i [[ -$range j 0..i-1 -#define GMOCK_INTERNAL_DECL_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]]) [[]] -$for j, [[p$j##_type p$j]] - - -]] - -// The suffix of the class template implementing the action template. -$for i [[ - - -$range j 0..i-1 -#define GMOCK_INTERNAL_COUNT_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]]) [[]] -$if i==1 [[P]] $elif i>=2 [[P$i]] -]] - - -// The name of the class template implementing the action template. -#define GMOCK_ACTION_CLASS_(name, value_params)\ - GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params) - -$range k 0..n-1 - -#define ACTION_TEMPLATE(name, template_params, value_params)\ - template \ - class GMOCK_ACTION_CLASS_(name, value_params) {\ - public:\ - explicit GMOCK_ACTION_CLASS_(name, value_params)\ - GMOCK_INTERNAL_INIT_##value_params {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template <$for k, [[typename arg$k[[]]_type]]>\ - return_type gmock_PerformImpl(const args_type& args[[]] -$for k [[, const arg$k[[]]_type& arg$k]]) const;\ - GMOCK_INTERNAL_DEFN_##value_params\ - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(\ - new gmock_Impl(GMOCK_INTERNAL_LIST_##value_params));\ - }\ - GMOCK_INTERNAL_DEFN_##value_params\ - private:\ - GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\ - };\ - template \ - inline GMOCK_ACTION_CLASS_(name, value_params)<\ - GMOCK_INTERNAL_LIST_##template_params\ - GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\ - GMOCK_INTERNAL_DECL_##value_params) {\ - return GMOCK_ACTION_CLASS_(name, value_params)<\ - GMOCK_INTERNAL_LIST_##template_params\ - GMOCK_INTERNAL_LIST_TYPE_##value_params>(\ - GMOCK_INTERNAL_LIST_##value_params);\ - }\ - template \ - template \ - template \ - typename ::testing::internal::Function::Result\ - GMOCK_ACTION_CLASS_(name, value_params)<\ - GMOCK_INTERNAL_LIST_##template_params\ - GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl::\ - gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -$for i - -[[ -$var template = [[$if i==0 [[]] $else [[ -$range j 0..i-1 - - template <$for j, [[typename p$j##_type]]>\ -]]]] -$var class_name = [[name##Action[[$if i==0 [[]] $elif i==1 [[P]] - $else [[P$i]]]]]] -$range j 0..i-1 -$var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]] -$var param_types_and_names = [[$for j, [[p$j##_type p$j]]]] -$var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(::std::forward(gmock_p$j))]]]]]] -$var param_field_decls = [[$for j -[[ - - p$j##_type p$j;\ -]]]] -$var param_field_decls2 = [[$for j -[[ - - p$j##_type p$j;\ -]]]] -$var params = [[$for j, [[p$j]]]] -$var param_types = [[$if i==0 [[]] $else [[<$for j, [[p$j##_type]]>]]]] -$var typename_arg_types = [[$for k, [[typename arg$k[[]]_type]]]] -$var arg_types_and_names = [[$for k, [[const arg$k[[]]_type& arg$k]]]] -$var macro_name = [[$if i==0 [[ACTION]] $elif i==1 [[ACTION_P]] - $else [[ACTION_P$i]]]] - -#define $macro_name(name$for j [[, p$j]])\$template - class $class_name {\ - public:\ - [[$if i==1 [[explicit ]]]]$class_name($ctor_param_list)$inits {}\ - template \ - class gmock_Impl : public ::testing::ActionInterface {\ - public:\ - typedef F function_type;\ - typedef typename ::testing::internal::Function::Result return_type;\ - typedef typename ::testing::internal::Function::ArgumentTuple\ - args_type;\ - [[$if i==1 [[explicit ]]]]gmock_Impl($ctor_param_list)$inits {}\ - virtual return_type Perform(const args_type& args) {\ - return ::testing::internal::ActionHelper::\ - Perform(this, args);\ - }\ - template <$typename_arg_types>\ - return_type gmock_PerformImpl(const args_type& args, [[]] -$arg_types_and_names) const;\$param_field_decls - private:\ - GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ - };\ - template operator ::testing::Action() const {\ - return ::testing::Action(new gmock_Impl($params));\ - }\$param_field_decls2 - private:\ - GTEST_DISALLOW_ASSIGN_($class_name);\ - };\$template - inline $class_name$param_types name($param_types_and_names) {\ - return $class_name$param_types($params);\ - }\$template - template \ - template <$typename_arg_types>\ - typename ::testing::internal::Function::Result\ - $class_name$param_types::gmock_Impl::gmock_PerformImpl(\ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const -]] -$$ } // This meta comment fixes auto-indentation in Emacs. It won't -$$ // show up in the generated code. - - -namespace testing { - - -// The ACTION*() macros trigger warning C4100 (unreferenced formal -// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in -// the macro definition, as the warnings are generated when the macro -// is expanded and macro expansion cannot contain #pragma. Therefore -// we suppress them here. -#ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable:4100) -#endif - -// Various overloads for InvokeArgument(). -// -// The InvokeArgument(a1, a2, ..., a_k) action invokes the N-th -// (0-based) argument, which must be a k-ary callable, of the mock -// function, with arguments a1, a2, ..., a_k. -// -// Notes: -// -// 1. The arguments are passed by value by default. If you need to -// pass an argument by reference, wrap it inside ByRef(). For -// example, -// -// InvokeArgument<1>(5, string("Hello"), ByRef(foo)) -// -// passes 5 and string("Hello") by value, and passes foo by -// reference. -// -// 2. If the callable takes an argument by reference but ByRef() is -// not used, it will receive the reference to a copy of the value, -// instead of the original value. For example, when the 0-th -// argument of the mock function takes a const string&, the action -// -// InvokeArgument<0>(string("Hello")) -// -// makes a copy of the temporary string("Hello") object and passes a -// reference of the copy, instead of the original temporary object, -// to the callable. This makes it easy for a user to define an -// InvokeArgument action from temporary values and have it performed -// later. - -namespace internal { -namespace invoke_argument { - -// Appears in InvokeArgumentAdl's argument list to help avoid -// accidental calls to user functions of the same name. -struct AdlTag {}; - -// InvokeArgumentAdl - a helper for InvokeArgument. -// The basic overloads are provided here for generic functors. -// Overloads for other custom-callables are provided in the -// internal/custom/callback-actions.h header. - -$range i 0..n -$for i -[[ -$range j 1..i - -template -R InvokeArgumentAdl(AdlTag, F f[[$for j [[, A$j a$j]]]]) { - return f([[$for j, [[a$j]]]]); -} -]] - -} // namespace invoke_argument -} // namespace internal - -$range i 0..n -$for i [[ -$range j 0..i-1 - -ACTION_TEMPLATE(InvokeArgument, - HAS_1_TEMPLATE_PARAMS(int, k), - AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]])) { - using internal::invoke_argument::InvokeArgumentAdl; - return InvokeArgumentAdl( - internal::invoke_argument::AdlTag(), - ::std::get(args)$for j [[, p$j]]); -} - -]] - -// Various overloads for ReturnNew(). -// -// The ReturnNew(a1, a2, ..., a_k) action returns a pointer to a new -// instance of type T, constructed on the heap with constructor arguments -// a1, a2, ..., and a_k. The caller assumes ownership of the returned value. -$range i 0..n -$for i [[ -$range j 0..i-1 -$var ps = [[$for j, [[p$j]]]] - -ACTION_TEMPLATE(ReturnNew, - HAS_1_TEMPLATE_PARAMS(typename, T), - AND_$i[[]]_VALUE_PARAMS($ps)) { - return new T($ps); -} - -]] - -#ifdef _MSC_VER -# pragma warning(pop) -#endif - -} // namespace testing - -// Include any custom callback actions added by the local installation. -// We must include this header at the end to make sure it can use the -// declarations from this file. -#include "gmock/internal/custom/gmock-generated-actions.h" - -#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h deleted file mode 100644 index cd95781..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h +++ /dev/null @@ -1,752 +0,0 @@ -// This file was GENERATED by command: -// pump.py gmock-generated-function-mockers.h.pump -// DO NOT EDIT BY HAND!!! - -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -// Google Mock - a framework for writing C++ mock classes. -// -// This file implements function mockers of various arities. - -// GOOGLETEST_CM0002 DO NOT DELETE - -#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ -#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ - -#include -#include - -#include "gmock/gmock-spec-builders.h" -#include "gmock/internal/gmock-internal-utils.h" - -namespace testing { -namespace internal { -// Removes the given pointer; this is a helper for the expectation setter method -// for parameterless matchers. -// -// We want to make sure that the user cannot set a parameterless expectation on -// overloaded methods, including methods which are overloaded on const. Example: -// -// class MockClass { -// MOCK_METHOD0(GetName, string&()); -// MOCK_CONST_METHOD0(GetName, const string&()); -// }; -// -// TEST() { -// // This should be an error, as it's not clear which overload is expected. -// EXPECT_CALL(mock, GetName).WillOnce(ReturnRef(value)); -// } -// -// Here are the generated expectation-setter methods: -// -// class MockClass { -// // Overload 1 -// MockSpec gmock_GetName() { ... } -// // Overload 2. Declared const so that the compiler will generate an -// // error when trying to resolve between this and overload 4 in -// // 'gmock_GetName(WithoutMatchers(), nullptr)'. -// MockSpec gmock_GetName( -// const WithoutMatchers&, const Function*) const { -// // Removes const from this, calls overload 1 -// return AdjustConstness_(this)->gmock_GetName(); -// } -// -// // Overload 3 -// const string& gmock_GetName() const { ... } -// // Overload 4 -// MockSpec gmock_GetName( -// const WithoutMatchers&, const Function*) const { -// // Does not remove const, calls overload 3 -// return AdjustConstness_const(this)->gmock_GetName(); -// } -// } -// -template -const MockType* AdjustConstness_const(const MockType* mock) { - return mock; -} - -// Removes const from and returns the given pointer; this is a helper for the -// expectation setter method for parameterless matchers. -template -MockType* AdjustConstness_(const MockType* mock) { - return const_cast(mock); -} - -} // namespace internal - -// The style guide prohibits "using" statements in a namespace scope -// inside a header file. However, the FunctionMocker class template -// is meant to be defined in the ::testing namespace. The following -// line is just a trick for working around a bug in MSVC 8.0, which -// cannot handle it if we define FunctionMocker in ::testing. -using internal::FunctionMocker; - -// GMOCK_RESULT_(tn, F) expands to the result type of function type F. -// We define this as a variadic macro in case F contains unprotected -// commas (the same reason that we use variadic macros in other places -// in this file). -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_RESULT_(tn, ...) \ - tn ::testing::internal::Function<__VA_ARGS__>::Result - -// The type of argument N of the given function type. -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_ARG_(tn, N, ...) \ - tn ::testing::internal::Function<__VA_ARGS__>::template Arg::type - -// The matcher type for argument N of the given function type. -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_MATCHER_(tn, N, ...) \ - const ::testing::Matcher& - -// The variable for mocking the given method. -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_MOCKER_(arity, constness, Method) \ - GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__) - -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_METHOD0_(tn, constness, ct, Method, ...) \ - static_assert(0 == \ - ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \ - "MOCK_METHOD must match argument count.");\ - GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ - ) constness { \ - GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method); \ - return GMOCK_MOCKER_(0, constness, Method).Invoke(); \ - } \ - ::testing::MockSpec<__VA_ARGS__> \ - gmock_##Method() constness { \ - GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this); \ - return GMOCK_MOCKER_(0, constness, Method).With(); \ - } \ - ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \ - const ::testing::internal::WithoutMatchers&, \ - constness ::testing::internal::Function<__VA_ARGS__>* ) const { \ - return ::testing::internal::AdjustConstness_##constness(this)-> \ - gmock_##Method(); \ - } \ - mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(0, constness, \ - Method) - -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_METHOD1_(tn, constness, ct, Method, ...) \ - static_assert(1 == \ - ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \ - "MOCK_METHOD must match argument count.");\ - GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ - GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1) constness { \ - GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method); \ - return GMOCK_MOCKER_(1, constness, \ - Method).Invoke(::std::forward(gmock_a1)); \ - } \ - ::testing::MockSpec<__VA_ARGS__> \ - gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1) constness { \ - GMOCK_MOCKER_(1, constness, Method).RegisterOwner(this); \ - return GMOCK_MOCKER_(1, constness, Method).With(gmock_a1); \ - } \ - ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \ - const ::testing::internal::WithoutMatchers&, \ - constness ::testing::internal::Function<__VA_ARGS__>* ) const { \ - return ::testing::internal::AdjustConstness_##constness(this)-> \ - gmock_##Method(::testing::A()); \ - } \ - mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(1, constness, \ - Method) - -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_METHOD2_(tn, constness, ct, Method, ...) \ - static_assert(2 == \ - ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \ - "MOCK_METHOD must match argument count.");\ - GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ - GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ - __VA_ARGS__) gmock_a2) constness { \ - GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method); \ - return GMOCK_MOCKER_(2, constness, \ - Method).Invoke(::std::forward(gmock_a1), \ - ::std::forward(gmock_a2)); \ - } \ - ::testing::MockSpec<__VA_ARGS__> \ - gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ - GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2) constness { \ - GMOCK_MOCKER_(2, constness, Method).RegisterOwner(this); \ - return GMOCK_MOCKER_(2, constness, Method).With(gmock_a1, gmock_a2); \ - } \ - ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \ - const ::testing::internal::WithoutMatchers&, \ - constness ::testing::internal::Function<__VA_ARGS__>* ) const { \ - return ::testing::internal::AdjustConstness_##constness(this)-> \ - gmock_##Method(::testing::A(), \ - ::testing::A()); \ - } \ - mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(2, constness, \ - Method) - -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_METHOD3_(tn, constness, ct, Method, ...) \ - static_assert(3 == \ - ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \ - "MOCK_METHOD must match argument count.");\ - GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ - GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ - __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, \ - __VA_ARGS__) gmock_a3) constness { \ - GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method); \ - return GMOCK_MOCKER_(3, constness, \ - Method).Invoke(::std::forward(gmock_a1), \ - ::std::forward(gmock_a2), \ - ::std::forward(gmock_a3)); \ - } \ - ::testing::MockSpec<__VA_ARGS__> \ - gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ - GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ - GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3) constness { \ - GMOCK_MOCKER_(3, constness, Method).RegisterOwner(this); \ - return GMOCK_MOCKER_(3, constness, Method).With(gmock_a1, gmock_a2, \ - gmock_a3); \ - } \ - ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \ - const ::testing::internal::WithoutMatchers&, \ - constness ::testing::internal::Function<__VA_ARGS__>* ) const { \ - return ::testing::internal::AdjustConstness_##constness(this)-> \ - gmock_##Method(::testing::A(), \ - ::testing::A(), \ - ::testing::A()); \ - } \ - mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(3, constness, \ - Method) - -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_METHOD4_(tn, constness, ct, Method, ...) \ - static_assert(4 == \ - ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \ - "MOCK_METHOD must match argument count.");\ - GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ - GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ - __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4) constness { \ - GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method); \ - return GMOCK_MOCKER_(4, constness, \ - Method).Invoke(::std::forward(gmock_a1), \ - ::std::forward(gmock_a2), \ - ::std::forward(gmock_a3), \ - ::std::forward(gmock_a4)); \ - } \ - ::testing::MockSpec<__VA_ARGS__> \ - gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ - GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ - GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4) constness { \ - GMOCK_MOCKER_(4, constness, Method).RegisterOwner(this); \ - return GMOCK_MOCKER_(4, constness, Method).With(gmock_a1, gmock_a2, \ - gmock_a3, gmock_a4); \ - } \ - ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \ - const ::testing::internal::WithoutMatchers&, \ - constness ::testing::internal::Function<__VA_ARGS__>* ) const { \ - return ::testing::internal::AdjustConstness_##constness(this)-> \ - gmock_##Method(::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A()); \ - } \ - mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(4, constness, \ - Method) - -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_METHOD5_(tn, constness, ct, Method, ...) \ - static_assert(5 == \ - ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \ - "MOCK_METHOD must match argument count.");\ - GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ - GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ - __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \ - __VA_ARGS__) gmock_a5) constness { \ - GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method); \ - return GMOCK_MOCKER_(5, constness, \ - Method).Invoke(::std::forward(gmock_a1), \ - ::std::forward(gmock_a2), \ - ::std::forward(gmock_a3), \ - ::std::forward(gmock_a4), \ - ::std::forward(gmock_a5)); \ - } \ - ::testing::MockSpec<__VA_ARGS__> \ - gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ - GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ - GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \ - GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5) constness { \ - GMOCK_MOCKER_(5, constness, Method).RegisterOwner(this); \ - return GMOCK_MOCKER_(5, constness, Method).With(gmock_a1, gmock_a2, \ - gmock_a3, gmock_a4, gmock_a5); \ - } \ - ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \ - const ::testing::internal::WithoutMatchers&, \ - constness ::testing::internal::Function<__VA_ARGS__>* ) const { \ - return ::testing::internal::AdjustConstness_##constness(this)-> \ - gmock_##Method(::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A()); \ - } \ - mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(5, constness, \ - Method) - -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_METHOD6_(tn, constness, ct, Method, ...) \ - static_assert(6 == \ - ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \ - "MOCK_METHOD must match argument count.");\ - GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ - GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ - __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \ - __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, \ - __VA_ARGS__) gmock_a6) constness { \ - GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method); \ - return GMOCK_MOCKER_(6, constness, \ - Method).Invoke(::std::forward(gmock_a1), \ - ::std::forward(gmock_a2), \ - ::std::forward(gmock_a3), \ - ::std::forward(gmock_a4), \ - ::std::forward(gmock_a5), \ - ::std::forward(gmock_a6)); \ - } \ - ::testing::MockSpec<__VA_ARGS__> \ - gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ - GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ - GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \ - GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \ - GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6) constness { \ - GMOCK_MOCKER_(6, constness, Method).RegisterOwner(this); \ - return GMOCK_MOCKER_(6, constness, Method).With(gmock_a1, gmock_a2, \ - gmock_a3, gmock_a4, gmock_a5, gmock_a6); \ - } \ - ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \ - const ::testing::internal::WithoutMatchers&, \ - constness ::testing::internal::Function<__VA_ARGS__>* ) const { \ - return ::testing::internal::AdjustConstness_##constness(this)-> \ - gmock_##Method(::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A()); \ - } \ - mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(6, constness, \ - Method) - -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_METHOD7_(tn, constness, ct, Method, ...) \ - static_assert(7 == \ - ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \ - "MOCK_METHOD must match argument count.");\ - GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ - GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ - __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \ - __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ - GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7) constness { \ - GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method); \ - return GMOCK_MOCKER_(7, constness, \ - Method).Invoke(::std::forward(gmock_a1), \ - ::std::forward(gmock_a2), \ - ::std::forward(gmock_a3), \ - ::std::forward(gmock_a4), \ - ::std::forward(gmock_a5), \ - ::std::forward(gmock_a6), \ - ::std::forward(gmock_a7)); \ - } \ - ::testing::MockSpec<__VA_ARGS__> \ - gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ - GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ - GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \ - GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \ - GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \ - GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7) constness { \ - GMOCK_MOCKER_(7, constness, Method).RegisterOwner(this); \ - return GMOCK_MOCKER_(7, constness, Method).With(gmock_a1, gmock_a2, \ - gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7); \ - } \ - ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \ - const ::testing::internal::WithoutMatchers&, \ - constness ::testing::internal::Function<__VA_ARGS__>* ) const { \ - return ::testing::internal::AdjustConstness_##constness(this)-> \ - gmock_##Method(::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A()); \ - } \ - mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(7, constness, \ - Method) - -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_METHOD8_(tn, constness, ct, Method, ...) \ - static_assert(8 == \ - ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \ - "MOCK_METHOD must match argument count.");\ - GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ - GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ - __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \ - __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ - GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \ - __VA_ARGS__) gmock_a8) constness { \ - GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method); \ - return GMOCK_MOCKER_(8, constness, \ - Method).Invoke(::std::forward(gmock_a1), \ - ::std::forward(gmock_a2), \ - ::std::forward(gmock_a3), \ - ::std::forward(gmock_a4), \ - ::std::forward(gmock_a5), \ - ::std::forward(gmock_a6), \ - ::std::forward(gmock_a7), \ - ::std::forward(gmock_a8)); \ - } \ - ::testing::MockSpec<__VA_ARGS__> \ - gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ - GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ - GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \ - GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \ - GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \ - GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \ - GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8) constness { \ - GMOCK_MOCKER_(8, constness, Method).RegisterOwner(this); \ - return GMOCK_MOCKER_(8, constness, Method).With(gmock_a1, gmock_a2, \ - gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8); \ - } \ - ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \ - const ::testing::internal::WithoutMatchers&, \ - constness ::testing::internal::Function<__VA_ARGS__>* ) const { \ - return ::testing::internal::AdjustConstness_##constness(this)-> \ - gmock_##Method(::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A()); \ - } \ - mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(8, constness, \ - Method) - -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_METHOD9_(tn, constness, ct, Method, ...) \ - static_assert(9 == \ - ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \ - "MOCK_METHOD must match argument count.");\ - GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ - GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ - __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \ - __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ - GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \ - __VA_ARGS__) gmock_a8, GMOCK_ARG_(tn, 9, \ - __VA_ARGS__) gmock_a9) constness { \ - GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method); \ - return GMOCK_MOCKER_(9, constness, \ - Method).Invoke(::std::forward(gmock_a1), \ - ::std::forward(gmock_a2), \ - ::std::forward(gmock_a3), \ - ::std::forward(gmock_a4), \ - ::std::forward(gmock_a5), \ - ::std::forward(gmock_a6), \ - ::std::forward(gmock_a7), \ - ::std::forward(gmock_a8), \ - ::std::forward(gmock_a9)); \ - } \ - ::testing::MockSpec<__VA_ARGS__> \ - gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ - GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ - GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \ - GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \ - GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \ - GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \ - GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \ - GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9) constness { \ - GMOCK_MOCKER_(9, constness, Method).RegisterOwner(this); \ - return GMOCK_MOCKER_(9, constness, Method).With(gmock_a1, gmock_a2, \ - gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, \ - gmock_a9); \ - } \ - ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \ - const ::testing::internal::WithoutMatchers&, \ - constness ::testing::internal::Function<__VA_ARGS__>* ) const { \ - return ::testing::internal::AdjustConstness_##constness(this)-> \ - gmock_##Method(::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A()); \ - } \ - mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(9, constness, \ - Method) - -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_METHOD10_(tn, constness, ct, Method, ...) \ - static_assert(10 == \ - ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \ - "MOCK_METHOD must match argument count.");\ - GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ - GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ - __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \ - __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ - GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \ - __VA_ARGS__) gmock_a8, GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9, \ - GMOCK_ARG_(tn, 10, __VA_ARGS__) gmock_a10) constness { \ - GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method); \ - return GMOCK_MOCKER_(10, constness, \ - Method).Invoke(::std::forward(gmock_a1), \ - ::std::forward(gmock_a2), \ - ::std::forward(gmock_a3), \ - ::std::forward(gmock_a4), \ - ::std::forward(gmock_a5), \ - ::std::forward(gmock_a6), \ - ::std::forward(gmock_a7), \ - ::std::forward(gmock_a8), \ - ::std::forward(gmock_a9), \ - ::std::forward(gmock_a10)); \ - } \ - ::testing::MockSpec<__VA_ARGS__> \ - gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ - GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ - GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ - GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \ - GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \ - GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \ - GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \ - GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \ - GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9, \ - GMOCK_MATCHER_(tn, 10, \ - __VA_ARGS__) gmock_a10) constness { \ - GMOCK_MOCKER_(10, constness, Method).RegisterOwner(this); \ - return GMOCK_MOCKER_(10, constness, Method).With(gmock_a1, gmock_a2, \ - gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9, \ - gmock_a10); \ - } \ - ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \ - const ::testing::internal::WithoutMatchers&, \ - constness ::testing::internal::Function<__VA_ARGS__>* ) const { \ - return ::testing::internal::AdjustConstness_##constness(this)-> \ - gmock_##Method(::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A(), \ - ::testing::A()); \ - } \ - mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(10, constness, \ - Method) - -#define MOCK_METHOD0(m, ...) GMOCK_METHOD0_(, , , m, __VA_ARGS__) -#define MOCK_METHOD1(m, ...) GMOCK_METHOD1_(, , , m, __VA_ARGS__) -#define MOCK_METHOD2(m, ...) GMOCK_METHOD2_(, , , m, __VA_ARGS__) -#define MOCK_METHOD3(m, ...) GMOCK_METHOD3_(, , , m, __VA_ARGS__) -#define MOCK_METHOD4(m, ...) GMOCK_METHOD4_(, , , m, __VA_ARGS__) -#define MOCK_METHOD5(m, ...) GMOCK_METHOD5_(, , , m, __VA_ARGS__) -#define MOCK_METHOD6(m, ...) GMOCK_METHOD6_(, , , m, __VA_ARGS__) -#define MOCK_METHOD7(m, ...) GMOCK_METHOD7_(, , , m, __VA_ARGS__) -#define MOCK_METHOD8(m, ...) GMOCK_METHOD8_(, , , m, __VA_ARGS__) -#define MOCK_METHOD9(m, ...) GMOCK_METHOD9_(, , , m, __VA_ARGS__) -#define MOCK_METHOD10(m, ...) GMOCK_METHOD10_(, , , m, __VA_ARGS__) - -#define MOCK_CONST_METHOD0(m, ...) GMOCK_METHOD0_(, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD1(m, ...) GMOCK_METHOD1_(, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD2(m, ...) GMOCK_METHOD2_(, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD3(m, ...) GMOCK_METHOD3_(, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD4(m, ...) GMOCK_METHOD4_(, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD5(m, ...) GMOCK_METHOD5_(, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD6(m, ...) GMOCK_METHOD6_(, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD7(m, ...) GMOCK_METHOD7_(, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD8(m, ...) GMOCK_METHOD8_(, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD9(m, ...) GMOCK_METHOD9_(, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD10(m, ...) GMOCK_METHOD10_(, const, , m, __VA_ARGS__) - -#define MOCK_METHOD0_T(m, ...) GMOCK_METHOD0_(typename, , , m, __VA_ARGS__) -#define MOCK_METHOD1_T(m, ...) GMOCK_METHOD1_(typename, , , m, __VA_ARGS__) -#define MOCK_METHOD2_T(m, ...) GMOCK_METHOD2_(typename, , , m, __VA_ARGS__) -#define MOCK_METHOD3_T(m, ...) GMOCK_METHOD3_(typename, , , m, __VA_ARGS__) -#define MOCK_METHOD4_T(m, ...) GMOCK_METHOD4_(typename, , , m, __VA_ARGS__) -#define MOCK_METHOD5_T(m, ...) GMOCK_METHOD5_(typename, , , m, __VA_ARGS__) -#define MOCK_METHOD6_T(m, ...) GMOCK_METHOD6_(typename, , , m, __VA_ARGS__) -#define MOCK_METHOD7_T(m, ...) GMOCK_METHOD7_(typename, , , m, __VA_ARGS__) -#define MOCK_METHOD8_T(m, ...) GMOCK_METHOD8_(typename, , , m, __VA_ARGS__) -#define MOCK_METHOD9_T(m, ...) GMOCK_METHOD9_(typename, , , m, __VA_ARGS__) -#define MOCK_METHOD10_T(m, ...) GMOCK_METHOD10_(typename, , , m, __VA_ARGS__) - -#define MOCK_CONST_METHOD0_T(m, ...) \ - GMOCK_METHOD0_(typename, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD1_T(m, ...) \ - GMOCK_METHOD1_(typename, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD2_T(m, ...) \ - GMOCK_METHOD2_(typename, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD3_T(m, ...) \ - GMOCK_METHOD3_(typename, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD4_T(m, ...) \ - GMOCK_METHOD4_(typename, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD5_T(m, ...) \ - GMOCK_METHOD5_(typename, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD6_T(m, ...) \ - GMOCK_METHOD6_(typename, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD7_T(m, ...) \ - GMOCK_METHOD7_(typename, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD8_T(m, ...) \ - GMOCK_METHOD8_(typename, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD9_T(m, ...) \ - GMOCK_METHOD9_(typename, const, , m, __VA_ARGS__) -#define MOCK_CONST_METHOD10_T(m, ...) \ - GMOCK_METHOD10_(typename, const, , m, __VA_ARGS__) - -#define MOCK_METHOD0_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD0_(, , ct, m, __VA_ARGS__) -#define MOCK_METHOD1_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD1_(, , ct, m, __VA_ARGS__) -#define MOCK_METHOD2_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD2_(, , ct, m, __VA_ARGS__) -#define MOCK_METHOD3_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD3_(, , ct, m, __VA_ARGS__) -#define MOCK_METHOD4_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD4_(, , ct, m, __VA_ARGS__) -#define MOCK_METHOD5_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD5_(, , ct, m, __VA_ARGS__) -#define MOCK_METHOD6_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD6_(, , ct, m, __VA_ARGS__) -#define MOCK_METHOD7_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD7_(, , ct, m, __VA_ARGS__) -#define MOCK_METHOD8_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD8_(, , ct, m, __VA_ARGS__) -#define MOCK_METHOD9_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD9_(, , ct, m, __VA_ARGS__) -#define MOCK_METHOD10_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD10_(, , ct, m, __VA_ARGS__) - -#define MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD0_(, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD1_(, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD2_(, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD3_(, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD4_(, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD5_(, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD6_(, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD7_(, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD8_(, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD9_(, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD10_(, const, ct, m, __VA_ARGS__) - -#define MOCK_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD0_(typename, , ct, m, __VA_ARGS__) -#define MOCK_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD1_(typename, , ct, m, __VA_ARGS__) -#define MOCK_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD2_(typename, , ct, m, __VA_ARGS__) -#define MOCK_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD3_(typename, , ct, m, __VA_ARGS__) -#define MOCK_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD4_(typename, , ct, m, __VA_ARGS__) -#define MOCK_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD5_(typename, , ct, m, __VA_ARGS__) -#define MOCK_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD6_(typename, , ct, m, __VA_ARGS__) -#define MOCK_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD7_(typename, , ct, m, __VA_ARGS__) -#define MOCK_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD8_(typename, , ct, m, __VA_ARGS__) -#define MOCK_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD9_(typename, , ct, m, __VA_ARGS__) -#define MOCK_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD10_(typename, , ct, m, __VA_ARGS__) - -#define MOCK_CONST_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD0_(typename, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD1_(typename, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD2_(typename, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD3_(typename, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD4_(typename, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD5_(typename, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD6_(typename, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD7_(typename, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD8_(typename, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD9_(typename, const, ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD10_(typename, const, ct, m, __VA_ARGS__) - -} // namespace testing - -#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump deleted file mode 100644 index a56e132..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump +++ /dev/null @@ -1,227 +0,0 @@ -$$ -*- mode: c++; -*- -$$ This is a Pump source file. Please use Pump to convert -$$ it to gmock-generated-function-mockers.h. -$$ -$var n = 10 $$ The maximum arity we support. -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -// Google Mock - a framework for writing C++ mock classes. -// -// This file implements function mockers of various arities. - -// GOOGLETEST_CM0002 DO NOT DELETE - -#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ -#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ - -#include -#include - -#include "gmock/gmock-spec-builders.h" -#include "gmock/internal/gmock-internal-utils.h" - -namespace testing { -namespace internal { - -$range i 0..n -// Removes the given pointer; this is a helper for the expectation setter method -// for parameterless matchers. -// -// We want to make sure that the user cannot set a parameterless expectation on -// overloaded methods, including methods which are overloaded on const. Example: -// -// class MockClass { -// MOCK_METHOD0(GetName, string&()); -// MOCK_CONST_METHOD0(GetName, const string&()); -// }; -// -// TEST() { -// // This should be an error, as it's not clear which overload is expected. -// EXPECT_CALL(mock, GetName).WillOnce(ReturnRef(value)); -// } -// -// Here are the generated expectation-setter methods: -// -// class MockClass { -// // Overload 1 -// MockSpec gmock_GetName() { ... } -// // Overload 2. Declared const so that the compiler will generate an -// // error when trying to resolve between this and overload 4 in -// // 'gmock_GetName(WithoutMatchers(), nullptr)'. -// MockSpec gmock_GetName( -// const WithoutMatchers&, const Function*) const { -// // Removes const from this, calls overload 1 -// return AdjustConstness_(this)->gmock_GetName(); -// } -// -// // Overload 3 -// const string& gmock_GetName() const { ... } -// // Overload 4 -// MockSpec gmock_GetName( -// const WithoutMatchers&, const Function*) const { -// // Does not remove const, calls overload 3 -// return AdjustConstness_const(this)->gmock_GetName(); -// } -// } -// -template -const MockType* AdjustConstness_const(const MockType* mock) { - return mock; -} - -// Removes const from and returns the given pointer; this is a helper for the -// expectation setter method for parameterless matchers. -template -MockType* AdjustConstness_(const MockType* mock) { - return const_cast(mock); -} - -} // namespace internal - -// The style guide prohibits "using" statements in a namespace scope -// inside a header file. However, the FunctionMocker class template -// is meant to be defined in the ::testing namespace. The following -// line is just a trick for working around a bug in MSVC 8.0, which -// cannot handle it if we define FunctionMocker in ::testing. -using internal::FunctionMocker; - -// GMOCK_RESULT_(tn, F) expands to the result type of function type F. -// We define this as a variadic macro in case F contains unprotected -// commas (the same reason that we use variadic macros in other places -// in this file). -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_RESULT_(tn, ...) \ - tn ::testing::internal::Function<__VA_ARGS__>::Result - -// The type of argument N of the given function type. -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_ARG_(tn, N, ...) \ - tn ::testing::internal::Function<__VA_ARGS__>::template Arg::type - -// The matcher type for argument N of the given function type. -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_MATCHER_(tn, N, ...) \ - const ::testing::Matcher& - -// The variable for mocking the given method. -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_MOCKER_(arity, constness, Method) \ - GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__) - - -$for i [[ -$range j 1..i -$var arg_as = [[$for j, [[GMOCK_ARG_(tn, $j, __VA_ARGS__) gmock_a$j]]]] -$var as = [[$for j, \ - [[::std::forward(gmock_a$j)]]]] -$var matcher_arg_as = [[$for j, \ - [[GMOCK_MATCHER_(tn, $j, __VA_ARGS__) gmock_a$j]]]] -$var matcher_as = [[$for j, [[gmock_a$j]]]] -$var anything_matchers = [[$for j, \ - [[::testing::A()]]]] -// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! -#define GMOCK_METHOD$i[[]]_(tn, constness, ct, Method, ...) \ - static_assert($i == ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, "MOCK_METHOD must match argument count.");\ - GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ - $arg_as) constness { \ - GMOCK_MOCKER_($i, constness, Method).SetOwnerAndName(this, #Method); \ - return GMOCK_MOCKER_($i, constness, Method).Invoke($as); \ - } \ - ::testing::MockSpec<__VA_ARGS__> \ - gmock_##Method($matcher_arg_as) constness { \ - GMOCK_MOCKER_($i, constness, Method).RegisterOwner(this); \ - return GMOCK_MOCKER_($i, constness, Method).With($matcher_as); \ - } \ - ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \ - const ::testing::internal::WithoutMatchers&, \ - constness ::testing::internal::Function<__VA_ARGS__>* ) const { \ - return ::testing::internal::AdjustConstness_##constness(this)-> \ - gmock_##Method($anything_matchers); \ - } \ - mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_($i, constness, Method) - - -]] -$for i [[ -#define MOCK_METHOD$i(m, ...) GMOCK_METHOD$i[[]]_(, , , m, __VA_ARGS__) - -]] - - -$for i [[ -#define MOCK_CONST_METHOD$i(m, ...) GMOCK_METHOD$i[[]]_(, const, , m, __VA_ARGS__) - -]] - - -$for i [[ -#define MOCK_METHOD$i[[]]_T(m, ...) GMOCK_METHOD$i[[]]_(typename, , , m, __VA_ARGS__) - -]] - - -$for i [[ -#define MOCK_CONST_METHOD$i[[]]_T(m, ...) \ - GMOCK_METHOD$i[[]]_(typename, const, , m, __VA_ARGS__) - -]] - - -$for i [[ -#define MOCK_METHOD$i[[]]_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD$i[[]]_(, , ct, m, __VA_ARGS__) - -]] - - -$for i [[ -#define MOCK_CONST_METHOD$i[[]]_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD$i[[]]_(, const, ct, m, __VA_ARGS__) - -]] - - -$for i [[ -#define MOCK_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD$i[[]]_(typename, , ct, m, __VA_ARGS__) - -]] - - -$for i [[ -#define MOCK_CONST_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_METHOD$i[[]]_(typename, const, ct, m, __VA_ARGS__) - -]] - -} // namespace testing - -#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-matchers.h b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-matchers.h deleted file mode 100644 index 690a57f..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-matchers.h +++ /dev/null @@ -1,1097 +0,0 @@ -// This file was GENERATED by command: -// pump.py gmock-generated-matchers.h.pump -// DO NOT EDIT BY HAND!!! - -// Copyright 2008, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Google Mock - a framework for writing C++ mock classes. -// -// This file implements some commonly used variadic matchers. - -// GOOGLETEST_CM0002 DO NOT DELETE - -#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ -#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ - -#include -#include -#include -#include -#include -#include "gmock/gmock-matchers.h" - -// The MATCHER* family of macros can be used in a namespace scope to -// define custom matchers easily. -// -// Basic Usage -// =========== -// -// The syntax -// -// MATCHER(name, description_string) { statements; } -// -// defines a matcher with the given name that executes the statements, -// which must return a bool to indicate if the match succeeds. Inside -// the statements, you can refer to the value being matched by 'arg', -// and refer to its type by 'arg_type'. -// -// The description string documents what the matcher does, and is used -// to generate the failure message when the match fails. Since a -// MATCHER() is usually defined in a header file shared by multiple -// C++ source files, we require the description to be a C-string -// literal to avoid possible side effects. It can be empty, in which -// case we'll use the sequence of words in the matcher name as the -// description. -// -// For example: -// -// MATCHER(IsEven, "") { return (arg % 2) == 0; } -// -// allows you to write -// -// // Expects mock_foo.Bar(n) to be called where n is even. -// EXPECT_CALL(mock_foo, Bar(IsEven())); -// -// or, -// -// // Verifies that the value of some_expression is even. -// EXPECT_THAT(some_expression, IsEven()); -// -// If the above assertion fails, it will print something like: -// -// Value of: some_expression -// Expected: is even -// Actual: 7 -// -// where the description "is even" is automatically calculated from the -// matcher name IsEven. -// -// Argument Type -// ============= -// -// Note that the type of the value being matched (arg_type) is -// determined by the context in which you use the matcher and is -// supplied to you by the compiler, so you don't need to worry about -// declaring it (nor can you). This allows the matcher to be -// polymorphic. For example, IsEven() can be used to match any type -// where the value of "(arg % 2) == 0" can be implicitly converted to -// a bool. In the "Bar(IsEven())" example above, if method Bar() -// takes an int, 'arg_type' will be int; if it takes an unsigned long, -// 'arg_type' will be unsigned long; and so on. -// -// Parameterizing Matchers -// ======================= -// -// Sometimes you'll want to parameterize the matcher. For that you -// can use another macro: -// -// MATCHER_P(name, param_name, description_string) { statements; } -// -// For example: -// -// MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } -// -// will allow you to write: -// -// EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); -// -// which may lead to this message (assuming n is 10): -// -// Value of: Blah("a") -// Expected: has absolute value 10 -// Actual: -9 -// -// Note that both the matcher description and its parameter are -// printed, making the message human-friendly. -// -// In the matcher definition body, you can write 'foo_type' to -// reference the type of a parameter named 'foo'. For example, in the -// body of MATCHER_P(HasAbsoluteValue, value) above, you can write -// 'value_type' to refer to the type of 'value'. -// -// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to -// support multi-parameter matchers. -// -// Describing Parameterized Matchers -// ================================= -// -// The last argument to MATCHER*() is a string-typed expression. The -// expression can reference all of the matcher's parameters and a -// special bool-typed variable named 'negation'. When 'negation' is -// false, the expression should evaluate to the matcher's description; -// otherwise it should evaluate to the description of the negation of -// the matcher. For example, -// -// using testing::PrintToString; -// -// MATCHER_P2(InClosedRange, low, hi, -// std::string(negation ? "is not" : "is") + " in range [" + -// PrintToString(low) + ", " + PrintToString(hi) + "]") { -// return low <= arg && arg <= hi; -// } -// ... -// EXPECT_THAT(3, InClosedRange(4, 6)); -// EXPECT_THAT(3, Not(InClosedRange(2, 4))); -// -// would generate two failures that contain the text: -// -// Expected: is in range [4, 6] -// ... -// Expected: is not in range [2, 4] -// -// If you specify "" as the description, the failure message will -// contain the sequence of words in the matcher name followed by the -// parameter values printed as a tuple. For example, -// -// MATCHER_P2(InClosedRange, low, hi, "") { ... } -// ... -// EXPECT_THAT(3, InClosedRange(4, 6)); -// EXPECT_THAT(3, Not(InClosedRange(2, 4))); -// -// would generate two failures that contain the text: -// -// Expected: in closed range (4, 6) -// ... -// Expected: not (in closed range (2, 4)) -// -// Types of Matcher Parameters -// =========================== -// -// For the purpose of typing, you can view -// -// MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } -// -// as shorthand for -// -// template -// FooMatcherPk -// Foo(p1_type p1, ..., pk_type pk) { ... } -// -// When you write Foo(v1, ..., vk), the compiler infers the types of -// the parameters v1, ..., and vk for you. If you are not happy with -// the result of the type inference, you can specify the types by -// explicitly instantiating the template, as in Foo(5, -// false). As said earlier, you don't get to (or need to) specify -// 'arg_type' as that's determined by the context in which the matcher -// is used. You can assign the result of expression Foo(p1, ..., pk) -// to a variable of type FooMatcherPk. This -// can be useful when composing matchers. -// -// While you can instantiate a matcher template with reference types, -// passing the parameters by pointer usually makes your code more -// readable. If, however, you still want to pass a parameter by -// reference, be aware that in the failure message generated by the -// matcher you will see the value of the referenced object but not its -// address. -// -// Explaining Match Results -// ======================== -// -// Sometimes the matcher description alone isn't enough to explain why -// the match has failed or succeeded. For example, when expecting a -// long string, it can be very helpful to also print the diff between -// the expected string and the actual one. To achieve that, you can -// optionally stream additional information to a special variable -// named result_listener, whose type is a pointer to class -// MatchResultListener: -// -// MATCHER_P(EqualsLongString, str, "") { -// if (arg == str) return true; -// -// *result_listener << "the difference: " -/// << DiffStrings(str, arg); -// return false; -// } -// -// Overloading Matchers -// ==================== -// -// You can overload matchers with different numbers of parameters: -// -// MATCHER_P(Blah, a, description_string1) { ... } -// MATCHER_P2(Blah, a, b, description_string2) { ... } -// -// Caveats -// ======= -// -// When defining a new matcher, you should also consider implementing -// MatcherInterface or using MakePolymorphicMatcher(). These -// approaches require more work than the MATCHER* macros, but also -// give you more control on the types of the value being matched and -// the matcher parameters, which may leads to better compiler error -// messages when the matcher is used wrong. They also allow -// overloading matchers based on parameter types (as opposed to just -// based on the number of parameters). -// -// MATCHER*() can only be used in a namespace scope as templates cannot be -// declared inside of a local class. -// -// More Information -// ================ -// -// To learn more about using these macros, please search for 'MATCHER' -// on -// https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md - -#define MATCHER(name, description)\ - class name##Matcher {\ - public:\ - template \ - class gmock_Impl : public ::testing::MatcherInterface<\ - GTEST_REFERENCE_TO_CONST_(arg_type)> {\ - public:\ - gmock_Impl()\ - {}\ - virtual bool MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener) const;\ - virtual void DescribeTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(false);\ - }\ - virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(true);\ - }\ - private:\ - ::std::string FormatDescription(bool negation) const {\ - ::std::string gmock_description = (description);\ - if (!gmock_description.empty()) {\ - return gmock_description;\ - }\ - return ::testing::internal::FormatMatcherDescription(\ - negation, #name, \ - ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ - ::std::tuple<>()));\ - }\ - };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl());\ - }\ - name##Matcher() {\ - }\ - private:\ - };\ - inline name##Matcher name() {\ - return name##Matcher();\ - }\ - template \ - bool name##Matcher::gmock_Impl::MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ - const - -#define MATCHER_P(name, p0, description)\ - template \ - class name##MatcherP {\ - public:\ - template \ - class gmock_Impl : public ::testing::MatcherInterface<\ - GTEST_REFERENCE_TO_CONST_(arg_type)> {\ - public:\ - explicit gmock_Impl(p0##_type gmock_p0)\ - : p0(::std::move(gmock_p0)) {}\ - virtual bool MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener) const;\ - virtual void DescribeTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(false);\ - }\ - virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(true);\ - }\ - p0##_type const p0;\ - private:\ - ::std::string FormatDescription(bool negation) const {\ - ::std::string gmock_description = (description);\ - if (!gmock_description.empty()) {\ - return gmock_description;\ - }\ - return ::testing::internal::FormatMatcherDescription(\ - negation, #name, \ - ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ - ::std::tuple(p0)));\ - }\ - };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0));\ - }\ - explicit name##MatcherP(p0##_type gmock_p0) : p0(::std::move(gmock_p0)) {\ - }\ - p0##_type const p0;\ - private:\ - };\ - template \ - inline name##MatcherP name(p0##_type p0) {\ - return name##MatcherP(p0);\ - }\ - template \ - template \ - bool name##MatcherP::gmock_Impl::MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ - const - -#define MATCHER_P2(name, p0, p1, description)\ - template \ - class name##MatcherP2 {\ - public:\ - template \ - class gmock_Impl : public ::testing::MatcherInterface<\ - GTEST_REFERENCE_TO_CONST_(arg_type)> {\ - public:\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\ - : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)) {}\ - virtual bool MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener) const;\ - virtual void DescribeTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(false);\ - }\ - virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(true);\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - private:\ - ::std::string FormatDescription(bool negation) const {\ - ::std::string gmock_description = (description);\ - if (!gmock_description.empty()) {\ - return gmock_description;\ - }\ - return ::testing::internal::FormatMatcherDescription(\ - negation, #name, \ - ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ - ::std::tuple(p0, p1)));\ - }\ - };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1));\ - }\ - name##MatcherP2(p0##_type gmock_p0, \ - p1##_type gmock_p1) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - private:\ - };\ - template \ - inline name##MatcherP2 name(p0##_type p0, \ - p1##_type p1) {\ - return name##MatcherP2(p0, p1);\ - }\ - template \ - template \ - bool name##MatcherP2::gmock_Impl::MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ - const - -#define MATCHER_P3(name, p0, p1, p2, description)\ - template \ - class name##MatcherP3 {\ - public:\ - template \ - class gmock_Impl : public ::testing::MatcherInterface<\ - GTEST_REFERENCE_TO_CONST_(arg_type)> {\ - public:\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\ - : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \ - p2(::std::move(gmock_p2)) {}\ - virtual bool MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener) const;\ - virtual void DescribeTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(false);\ - }\ - virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(true);\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - private:\ - ::std::string FormatDescription(bool negation) const {\ - ::std::string gmock_description = (description);\ - if (!gmock_description.empty()) {\ - return gmock_description;\ - }\ - return ::testing::internal::FormatMatcherDescription(\ - negation, #name, \ - ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ - ::std::tuple(p0, p1, p2)));\ - }\ - };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2));\ - }\ - name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - private:\ - };\ - template \ - inline name##MatcherP3 name(p0##_type p0, \ - p1##_type p1, p2##_type p2) {\ - return name##MatcherP3(p0, p1, p2);\ - }\ - template \ - template \ - bool name##MatcherP3::gmock_Impl::MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ - const - -#define MATCHER_P4(name, p0, p1, p2, p3, description)\ - template \ - class name##MatcherP4 {\ - public:\ - template \ - class gmock_Impl : public ::testing::MatcherInterface<\ - GTEST_REFERENCE_TO_CONST_(arg_type)> {\ - public:\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3)\ - : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \ - p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)) {}\ - virtual bool MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener) const;\ - virtual void DescribeTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(false);\ - }\ - virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(true);\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - private:\ - ::std::string FormatDescription(bool negation) const {\ - ::std::string gmock_description = (description);\ - if (!gmock_description.empty()) {\ - return gmock_description;\ - }\ - return ::testing::internal::FormatMatcherDescription(\ - negation, #name, \ - ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ - ::std::tuple(p0, \ - p1, p2, p3)));\ - }\ - };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3));\ - }\ - name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - private:\ - };\ - template \ - inline name##MatcherP4 name(p0##_type p0, p1##_type p1, p2##_type p2, \ - p3##_type p3) {\ - return name##MatcherP4(p0, \ - p1, p2, p3);\ - }\ - template \ - template \ - bool name##MatcherP4::gmock_Impl::MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ - const - -#define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\ - template \ - class name##MatcherP5 {\ - public:\ - template \ - class gmock_Impl : public ::testing::MatcherInterface<\ - GTEST_REFERENCE_TO_CONST_(arg_type)> {\ - public:\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4)\ - : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \ - p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \ - p4(::std::move(gmock_p4)) {}\ - virtual bool MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener) const;\ - virtual void DescribeTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(false);\ - }\ - virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(true);\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - private:\ - ::std::string FormatDescription(bool negation) const {\ - ::std::string gmock_description = (description);\ - if (!gmock_description.empty()) {\ - return gmock_description;\ - }\ - return ::testing::internal::FormatMatcherDescription(\ - negation, #name, \ - ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ - ::std::tuple(p0, p1, p2, p3, p4)));\ - }\ - };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4));\ - }\ - name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, \ - p4##_type gmock_p4) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - private:\ - };\ - template \ - inline name##MatcherP5 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ - p4##_type p4) {\ - return name##MatcherP5(p0, p1, p2, p3, p4);\ - }\ - template \ - template \ - bool name##MatcherP5::gmock_Impl::MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ - const - -#define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\ - template \ - class name##MatcherP6 {\ - public:\ - template \ - class gmock_Impl : public ::testing::MatcherInterface<\ - GTEST_REFERENCE_TO_CONST_(arg_type)> {\ - public:\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\ - : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \ - p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \ - p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)) {}\ - virtual bool MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener) const;\ - virtual void DescribeTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(false);\ - }\ - virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(true);\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - private:\ - ::std::string FormatDescription(bool negation) const {\ - ::std::string gmock_description = (description);\ - if (!gmock_description.empty()) {\ - return gmock_description;\ - }\ - return ::testing::internal::FormatMatcherDescription(\ - negation, #name, \ - ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ - ::std::tuple(p0, p1, p2, p3, p4, p5)));\ - }\ - };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5));\ - }\ - name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - private:\ - };\ - template \ - inline name##MatcherP6 name(p0##_type p0, p1##_type p1, p2##_type p2, \ - p3##_type p3, p4##_type p4, p5##_type p5) {\ - return name##MatcherP6(p0, p1, p2, p3, p4, p5);\ - }\ - template \ - template \ - bool name##MatcherP6::gmock_Impl::MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ - const - -#define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\ - template \ - class name##MatcherP7 {\ - public:\ - template \ - class gmock_Impl : public ::testing::MatcherInterface<\ - GTEST_REFERENCE_TO_CONST_(arg_type)> {\ - public:\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ - p6##_type gmock_p6)\ - : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \ - p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \ - p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \ - p6(::std::move(gmock_p6)) {}\ - virtual bool MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener) const;\ - virtual void DescribeTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(false);\ - }\ - virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(true);\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - private:\ - ::std::string FormatDescription(bool negation) const {\ - ::std::string gmock_description = (description);\ - if (!gmock_description.empty()) {\ - return gmock_description;\ - }\ - return ::testing::internal::FormatMatcherDescription(\ - negation, #name, \ - ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ - ::std::tuple(p0, p1, p2, p3, p4, p5, \ - p6)));\ - }\ - };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5, p6));\ - }\ - name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - private:\ - };\ - template \ - inline name##MatcherP7 name(p0##_type p0, p1##_type p1, \ - p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ - p6##_type p6) {\ - return name##MatcherP7(p0, p1, p2, p3, p4, p5, p6);\ - }\ - template \ - template \ - bool name##MatcherP7::gmock_Impl::MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ - const - -#define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\ - template \ - class name##MatcherP8 {\ - public:\ - template \ - class gmock_Impl : public ::testing::MatcherInterface<\ - GTEST_REFERENCE_TO_CONST_(arg_type)> {\ - public:\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ - p6##_type gmock_p6, p7##_type gmock_p7)\ - : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \ - p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \ - p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \ - p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)) {}\ - virtual bool MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener) const;\ - virtual void DescribeTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(false);\ - }\ - virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(true);\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - p7##_type const p7;\ - private:\ - ::std::string FormatDescription(bool negation) const {\ - ::std::string gmock_description = (description);\ - if (!gmock_description.empty()) {\ - return gmock_description;\ - }\ - return ::testing::internal::FormatMatcherDescription(\ - negation, #name, \ - ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ - ::std::tuple(p0, p1, p2, \ - p3, p4, p5, p6, p7)));\ - }\ - };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7));\ - }\ - name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6, \ - p7##_type gmock_p7) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \ - p7(::std::move(gmock_p7)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - p7##_type const p7;\ - private:\ - };\ - template \ - inline name##MatcherP8 name(p0##_type p0, \ - p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ - p6##_type p6, p7##_type p7) {\ - return name##MatcherP8(p0, p1, p2, p3, p4, p5, \ - p6, p7);\ - }\ - template \ - template \ - bool name##MatcherP8::gmock_Impl::MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ - const - -#define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\ - template \ - class name##MatcherP9 {\ - public:\ - template \ - class gmock_Impl : public ::testing::MatcherInterface<\ - GTEST_REFERENCE_TO_CONST_(arg_type)> {\ - public:\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ - p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\ - : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \ - p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \ - p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \ - p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)), \ - p8(::std::move(gmock_p8)) {}\ - virtual bool MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener) const;\ - virtual void DescribeTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(false);\ - }\ - virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(true);\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - p7##_type const p7;\ - p8##_type const p8;\ - private:\ - ::std::string FormatDescription(bool negation) const {\ - ::std::string gmock_description = (description);\ - if (!gmock_description.empty()) {\ - return gmock_description;\ - }\ - return ::testing::internal::FormatMatcherDescription(\ - negation, #name, \ - ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ - ::std::tuple(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\ - }\ - };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7, p8));\ - }\ - name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ - p8##_type gmock_p8) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \ - p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - p7##_type const p7;\ - p8##_type const p8;\ - private:\ - };\ - template \ - inline name##MatcherP9 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ - p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \ - p8##_type p8) {\ - return name##MatcherP9(p0, p1, p2, \ - p3, p4, p5, p6, p7, p8);\ - }\ - template \ - template \ - bool name##MatcherP9::gmock_Impl::MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ - const - -#define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\ - template \ - class name##MatcherP10 {\ - public:\ - template \ - class gmock_Impl : public ::testing::MatcherInterface<\ - GTEST_REFERENCE_TO_CONST_(arg_type)> {\ - public:\ - gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ - p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ - p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ - p9##_type gmock_p9)\ - : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \ - p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \ - p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \ - p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)), \ - p8(::std::move(gmock_p8)), p9(::std::move(gmock_p9)) {}\ - virtual bool MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener) const;\ - virtual void DescribeTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(false);\ - }\ - virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(true);\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - p7##_type const p7;\ - p8##_type const p8;\ - p9##_type const p9;\ - private:\ - ::std::string FormatDescription(bool negation) const {\ - ::std::string gmock_description = (description);\ - if (!gmock_description.empty()) {\ - return gmock_description;\ - }\ - return ::testing::internal::FormatMatcherDescription(\ - negation, #name, \ - ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ - ::std::tuple(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\ - }\ - };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\ - }\ - name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ - p8##_type gmock_p8, p9##_type gmock_p9) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \ - p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)), \ - p9(::std::move(gmock_p9)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - p7##_type const p7;\ - p8##_type const p8;\ - p9##_type const p9;\ - private:\ - };\ - template \ - inline name##MatcherP10 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ - p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ - p9##_type p9) {\ - return name##MatcherP10(p0, \ - p1, p2, p3, p4, p5, p6, p7, p8, p9);\ - }\ - template \ - template \ - bool name##MatcherP10::gmock_Impl::MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ - const - -#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-matchers.h.pump b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-matchers.h.pump deleted file mode 100644 index ae90917..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-generated-matchers.h.pump +++ /dev/null @@ -1,346 +0,0 @@ -$$ -*- mode: c++; -*- -$$ This is a Pump source file. Please use Pump to convert -$$ it to gmock-generated-matchers.h. -$$ -$var n = 10 $$ The maximum arity we support. -$$ }} This line fixes auto-indentation of the following code in Emacs. -// Copyright 2008, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Google Mock - a framework for writing C++ mock classes. -// -// This file implements some commonly used variadic matchers. - -// GOOGLETEST_CM0002 DO NOT DELETE - -#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ -#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ - -#include -#include -#include -#include -#include -#include "gmock/gmock-matchers.h" - -// The MATCHER* family of macros can be used in a namespace scope to -// define custom matchers easily. -// -// Basic Usage -// =========== -// -// The syntax -// -// MATCHER(name, description_string) { statements; } -// -// defines a matcher with the given name that executes the statements, -// which must return a bool to indicate if the match succeeds. Inside -// the statements, you can refer to the value being matched by 'arg', -// and refer to its type by 'arg_type'. -// -// The description string documents what the matcher does, and is used -// to generate the failure message when the match fails. Since a -// MATCHER() is usually defined in a header file shared by multiple -// C++ source files, we require the description to be a C-string -// literal to avoid possible side effects. It can be empty, in which -// case we'll use the sequence of words in the matcher name as the -// description. -// -// For example: -// -// MATCHER(IsEven, "") { return (arg % 2) == 0; } -// -// allows you to write -// -// // Expects mock_foo.Bar(n) to be called where n is even. -// EXPECT_CALL(mock_foo, Bar(IsEven())); -// -// or, -// -// // Verifies that the value of some_expression is even. -// EXPECT_THAT(some_expression, IsEven()); -// -// If the above assertion fails, it will print something like: -// -// Value of: some_expression -// Expected: is even -// Actual: 7 -// -// where the description "is even" is automatically calculated from the -// matcher name IsEven. -// -// Argument Type -// ============= -// -// Note that the type of the value being matched (arg_type) is -// determined by the context in which you use the matcher and is -// supplied to you by the compiler, so you don't need to worry about -// declaring it (nor can you). This allows the matcher to be -// polymorphic. For example, IsEven() can be used to match any type -// where the value of "(arg % 2) == 0" can be implicitly converted to -// a bool. In the "Bar(IsEven())" example above, if method Bar() -// takes an int, 'arg_type' will be int; if it takes an unsigned long, -// 'arg_type' will be unsigned long; and so on. -// -// Parameterizing Matchers -// ======================= -// -// Sometimes you'll want to parameterize the matcher. For that you -// can use another macro: -// -// MATCHER_P(name, param_name, description_string) { statements; } -// -// For example: -// -// MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } -// -// will allow you to write: -// -// EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); -// -// which may lead to this message (assuming n is 10): -// -// Value of: Blah("a") -// Expected: has absolute value 10 -// Actual: -9 -// -// Note that both the matcher description and its parameter are -// printed, making the message human-friendly. -// -// In the matcher definition body, you can write 'foo_type' to -// reference the type of a parameter named 'foo'. For example, in the -// body of MATCHER_P(HasAbsoluteValue, value) above, you can write -// 'value_type' to refer to the type of 'value'. -// -// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P$n to -// support multi-parameter matchers. -// -// Describing Parameterized Matchers -// ================================= -// -// The last argument to MATCHER*() is a string-typed expression. The -// expression can reference all of the matcher's parameters and a -// special bool-typed variable named 'negation'. When 'negation' is -// false, the expression should evaluate to the matcher's description; -// otherwise it should evaluate to the description of the negation of -// the matcher. For example, -// -// using testing::PrintToString; -// -// MATCHER_P2(InClosedRange, low, hi, -// std::string(negation ? "is not" : "is") + " in range [" + -// PrintToString(low) + ", " + PrintToString(hi) + "]") { -// return low <= arg && arg <= hi; -// } -// ... -// EXPECT_THAT(3, InClosedRange(4, 6)); -// EXPECT_THAT(3, Not(InClosedRange(2, 4))); -// -// would generate two failures that contain the text: -// -// Expected: is in range [4, 6] -// ... -// Expected: is not in range [2, 4] -// -// If you specify "" as the description, the failure message will -// contain the sequence of words in the matcher name followed by the -// parameter values printed as a tuple. For example, -// -// MATCHER_P2(InClosedRange, low, hi, "") { ... } -// ... -// EXPECT_THAT(3, InClosedRange(4, 6)); -// EXPECT_THAT(3, Not(InClosedRange(2, 4))); -// -// would generate two failures that contain the text: -// -// Expected: in closed range (4, 6) -// ... -// Expected: not (in closed range (2, 4)) -// -// Types of Matcher Parameters -// =========================== -// -// For the purpose of typing, you can view -// -// MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } -// -// as shorthand for -// -// template -// FooMatcherPk -// Foo(p1_type p1, ..., pk_type pk) { ... } -// -// When you write Foo(v1, ..., vk), the compiler infers the types of -// the parameters v1, ..., and vk for you. If you are not happy with -// the result of the type inference, you can specify the types by -// explicitly instantiating the template, as in Foo(5, -// false). As said earlier, you don't get to (or need to) specify -// 'arg_type' as that's determined by the context in which the matcher -// is used. You can assign the result of expression Foo(p1, ..., pk) -// to a variable of type FooMatcherPk. This -// can be useful when composing matchers. -// -// While you can instantiate a matcher template with reference types, -// passing the parameters by pointer usually makes your code more -// readable. If, however, you still want to pass a parameter by -// reference, be aware that in the failure message generated by the -// matcher you will see the value of the referenced object but not its -// address. -// -// Explaining Match Results -// ======================== -// -// Sometimes the matcher description alone isn't enough to explain why -// the match has failed or succeeded. For example, when expecting a -// long string, it can be very helpful to also print the diff between -// the expected string and the actual one. To achieve that, you can -// optionally stream additional information to a special variable -// named result_listener, whose type is a pointer to class -// MatchResultListener: -// -// MATCHER_P(EqualsLongString, str, "") { -// if (arg == str) return true; -// -// *result_listener << "the difference: " -/// << DiffStrings(str, arg); -// return false; -// } -// -// Overloading Matchers -// ==================== -// -// You can overload matchers with different numbers of parameters: -// -// MATCHER_P(Blah, a, description_string1) { ... } -// MATCHER_P2(Blah, a, b, description_string2) { ... } -// -// Caveats -// ======= -// -// When defining a new matcher, you should also consider implementing -// MatcherInterface or using MakePolymorphicMatcher(). These -// approaches require more work than the MATCHER* macros, but also -// give you more control on the types of the value being matched and -// the matcher parameters, which may leads to better compiler error -// messages when the matcher is used wrong. They also allow -// overloading matchers based on parameter types (as opposed to just -// based on the number of parameters). -// -// MATCHER*() can only be used in a namespace scope as templates cannot be -// declared inside of a local class. -// -// More Information -// ================ -// -// To learn more about using these macros, please search for 'MATCHER' -// on -// https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md - -$range i 0..n -$for i - -[[ -$var macro_name = [[$if i==0 [[MATCHER]] $elif i==1 [[MATCHER_P]] - $else [[MATCHER_P$i]]]] -$var class_name = [[name##Matcher[[$if i==0 [[]] $elif i==1 [[P]] - $else [[P$i]]]]]] -$range j 0..i-1 -$var template = [[$if i==0 [[]] $else [[ - - template <$for j, [[typename p$j##_type]]>\ -]]]] -$var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]] -$var impl_ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]] -$var impl_inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(::std::move(gmock_p$j))]]]]]] -$var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(::std::move(gmock_p$j))]]]]]] -$var params = [[$for j, [[p$j]]]] -$var param_types = [[$if i==0 [[]] $else [[<$for j, [[p$j##_type]]>]]]] -$var param_types_and_names = [[$for j, [[p$j##_type p$j]]]] -$var param_field_decls = [[$for j -[[ - - p$j##_type const p$j;\ -]]]] -$var param_field_decls2 = [[$for j -[[ - - p$j##_type const p$j;\ -]]]] - -#define $macro_name(name$for j [[, p$j]], description)\$template - class $class_name {\ - public:\ - template \ - class gmock_Impl : public ::testing::MatcherInterface<\ - GTEST_REFERENCE_TO_CONST_(arg_type)> {\ - public:\ - [[$if i==1 [[explicit ]]]]gmock_Impl($impl_ctor_param_list)\ - $impl_inits {}\ - virtual bool MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener) const;\ - virtual void DescribeTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(false);\ - }\ - virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ - *gmock_os << FormatDescription(true);\ - }\$param_field_decls - private:\ - ::std::string FormatDescription(bool negation) const {\ - ::std::string gmock_description = (description);\ - if (!gmock_description.empty()) {\ - return gmock_description;\ - }\ - return ::testing::internal::FormatMatcherDescription(\ - negation, #name, \ - ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ - ::std::tuple<$for j, [[p$j##_type]]>($for j, [[p$j]])));\ - }\ - };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl($params));\ - }\ - [[$if i==1 [[explicit ]]]]$class_name($ctor_param_list)$inits {\ - }\$param_field_decls2 - private:\ - };\$template - inline $class_name$param_types name($param_types_and_names) {\ - return $class_name$param_types($params);\ - }\$template - template \ - bool $class_name$param_types::gmock_Impl::MatchAndExplain(\ - GTEST_REFERENCE_TO_CONST_(arg_type) arg,\ - ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ - const -]] - - -#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ diff --git a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-matchers.h b/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-matchers.h deleted file mode 100644 index 28e188b..0000000 --- a/lwnode/code/escargotshim/deps/escargot/third_party/wasm/wabt/third_party/gtest/googlemock/include/gmock/gmock-matchers.h +++ /dev/null @@ -1,4568 +0,0 @@ -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -// Google Mock - a framework for writing C++ mock classes. -// -// This file implements some commonly used argument matchers. More -// matchers can be defined by the user implementing the -// MatcherInterface interface if necessary. -// -// See googletest/include/gtest/gtest-matchers.h for the definition of class -// Matcher, class MatcherInterface, and others. - -// GOOGLETEST_CM0002 DO NOT DELETE - -#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ -#define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ - -#include -#include -#include -#include -#include -#include -#include // NOLINT -#include -#include -#include -#include -#include -#include "gmock/internal/gmock-internal-utils.h" -#include "gmock/internal/gmock-port.h" -#include "gtest/gtest.h" - -// MSVC warning C5046 is new as of VS2017 version 15.8. -#if defined(_MSC_VER) && _MSC_VER >= 1915 -#define GMOCK_MAYBE_5046_ 5046 -#else -#define GMOCK_MAYBE_5046_ -#endif - -GTEST_DISABLE_MSC_WARNINGS_PUSH_( - 4251 GMOCK_MAYBE_5046_ /* class A needs to have dll-interface to be used by - clients of class B */ - /* Symbol involving type with internal linkage not defined */) - -namespace testing { - -// To implement a matcher Foo for type T, define: -// 1. a class FooMatcherImpl that implements the -// MatcherInterface interface, and -// 2. a factory function that creates a Matcher object from a -// FooMatcherImpl*. -// -// The two-level delegation design makes it possible to allow a user -// to write "v" instead of "Eq(v)" where a Matcher is expected, which -// is impossible if we pass matchers by pointers. It also eases -// ownership management as Matcher objects can now be copied like -// plain values. - -// A match result listener that stores the explanation in a string. -class StringMatchResultListener : public MatchResultListener { - public: - StringMatchResultListener() : MatchResultListener(&ss_) {} - - // Returns the explanation accumulated so far. - std::string str() const { return ss_.str(); } - - // Clears the explanation accumulated so far. - void Clear() { ss_.str(""); } - - private: - ::std::stringstream ss_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener); -}; - -// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION -// and MUST NOT BE USED IN USER CODE!!! -namespace internal { - -// The MatcherCastImpl class template is a helper for implementing -// MatcherCast(). We need this helper in order to partially -// specialize the implementation of MatcherCast() (C++ allows -// class/struct templates to be partially specialized, but not -// function templates.). - -// This general version is used when MatcherCast()'s argument is a -// polymorphic matcher (i.e. something that can be converted to a -// Matcher but is not one yet; for example, Eq(value)) or a value (for -// example, "hello"). -template -class MatcherCastImpl { - public: - static Matcher Cast(const M& polymorphic_matcher_or_value) { - // M can be a polymorphic matcher, in which case we want to use - // its conversion operator to create Matcher. Or it can be a value - // that should be passed to the Matcher's constructor. - // - // We can't call Matcher(polymorphic_matcher_or_value) when M is a - // polymorphic matcher because it'll be ambiguous if T has an implicit - // constructor from M (this usually happens when T has an implicit - // constructor from any type). - // - // It won't work to unconditionally implict_cast - // polymorphic_matcher_or_value to Matcher because it won't trigger - // a user-defined conversion from M to T if one exists (assuming M is - // a value). - return CastImpl(polymorphic_matcher_or_value, - std::is_convertible>{}, - std::is_convertible{}); - } - - private: - template - static Matcher CastImpl(const M& polymorphic_matcher_or_value, - std::true_type /* convertible_to_matcher */, - bool_constant) { - // M is implicitly convertible to Matcher, which means that either - // M is a polymorphic matcher or Matcher has an implicit constructor - // from M. In both cases using the implicit conversion will produce a - // matcher. - // - // Even if T has an implicit constructor from M, it won't be called because - // creating Matcher would require a chain of two user-defined conversions - // (first to create T from M and then to create Matcher from T). - return polymorphic_matcher_or_value; - } - - // M can't be implicitly converted to Matcher, so M isn't a polymorphic - // matcher. It's a value of a type implicitly convertible to T. Use direct - // initialization to create a matcher. - static Matcher CastImpl(const M& value, - std::false_type /* convertible_to_matcher */, - std::true_type /* convertible_to_T */) { - return Matcher(ImplicitCast_(value)); - } - - // M can't be implicitly converted to either Matcher or T. Attempt to use - // polymorphic matcher Eq(value) in this case. - // - // Note that we first attempt to perform an implicit cast on the value and - // only fall back to the polymorphic Eq() matcher afterwards because the - // latter calls bool operator==(const Lhs& lhs, const Rhs& rhs) in the end - // which might be undefined even when Rhs is implicitly convertible to Lhs - // (e.g. std::pair vs. std::pair). - // - // We don't define this method inline as we need the declaration of Eq(). - static Matcher CastImpl(const M& value, - std::false_type /* convertible_to_matcher */, - std::false_type /* convertible_to_T */); -}; - -// This more specialized version is used when MatcherCast()'s argument -// is already a Matcher. This only compiles when type T can be -// statically converted to type U. -template -class MatcherCastImpl > { - public: - static Matcher Cast(const Matcher& source_matcher) { - return Matcher(new Impl(source_matcher)); - } - - private: - class Impl : public MatcherInterface { - public: - explicit Impl(const Matcher& source_matcher) - : source_matcher_(source_matcher) {} - - // We delegate the matching logic to the source matcher. - bool MatchAndExplain(T x, MatchResultListener* listener) const override { - using FromType = typename std::remove_cv::type>::type>::type; - using ToType = typename std::remove_cv::type>::type>::type; - // Do not allow implicitly converting base*/& to derived*/&. - static_assert( - // Do not trigger if only one of them is a pointer. That implies a - // regular conversion and not a down_cast. - (std::is_pointer::type>::value != - std::is_pointer::type>::value) || - std::is_same::value || - !std::is_base_of::value, - "Can't implicitly convert from to "); - - return source_matcher_.MatchAndExplain(static_cast(x), listener); - } - - void DescribeTo(::std::ostream* os) const override { - source_matcher_.DescribeTo(os); - } - - void DescribeNegationTo(::std::ostream* os) const override { - source_matcher_.DescribeNegationTo(os); - } - - private: - const Matcher source_matcher_; - - GTEST_DISALLOW_ASSIGN_(Impl); - }; -}; - -// This even more specialized version is used for efficiently casting -// a matcher to its own type. -template -class MatcherCastImpl > { - public: - static Matcher Cast(const Matcher& matcher) { return matcher; } -}; - -} // namespace internal - -// In order to be safe and clear, casting between different matcher -// types is done explicitly via MatcherCast(m), which takes a -// matcher m and returns a Matcher. It compiles only when T can be -// statically converted to the argument type of m. -template -inline Matcher MatcherCast(const M& matcher) { - return internal::MatcherCastImpl::Cast(matcher); -} - -// Implements SafeMatcherCast(). -// -// FIXME: The intermediate SafeMatcherCastImpl class was introduced as a -// workaround for a compiler bug, and can now be removed. -template -class SafeMatcherCastImpl { - public: - // This overload handles polymorphic matchers and values only since - // monomorphic matchers are handled by the next one. - template - static inline Matcher Cast(const M& polymorphic_matcher_or_value) { - return internal::MatcherCastImpl::Cast(polymorphic_matcher_or_value); - } - - // This overload handles monomorphic matchers. - // - // In general, if type T can be implicitly converted to type U, we can - // safely convert a Matcher to a Matcher (i.e. Matcher is - // contravariant): just keep a copy of the original Matcher, convert the - // argument from type T to U, and then pass it to the underlying Matcher. - // The only exception is when U is a reference and T is not, as the - // underlying Matcher may be interested in the argument's address, which - // is not preserved in the conversion from T to U. - template - static inline Matcher Cast(const Matcher& matcher) { - // Enforce that T can be implicitly converted to U. - GTEST_COMPILE_ASSERT_((std::is_convertible::value), - "T must be implicitly convertible to U"); - // Enforce that we are not converting a non-reference type T to a reference - // type U. - GTEST_COMPILE_ASSERT_( - std::is_reference::value || !std::is_reference::value, - cannot_convert_non_reference_arg_to_reference); - // In case both T and U are arithmetic types, enforce that the - // conversion is not lossy. - typedef GTEST_REMOVE_REFERENCE_AND_CONST_(T) RawT; - typedef GTEST_REMOVE_REFERENCE_AND_CONST_(U) RawU; - const bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther; - const bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther; - GTEST_COMPILE_ASSERT_( - kTIsOther || kUIsOther || - (internal::LosslessArithmeticConvertible::value), - conversion_of_arithmetic_types_must_be_lossless); - return MatcherCast(matcher); - } -}; - -template -inline Matcher SafeMatcherCast(const M& polymorphic_matcher) { - return SafeMatcherCastImpl::Cast(polymorphic_matcher); -} - -// A() returns a matcher that matches any value of type T. -template -Matcher A(); - -// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION -// and MUST NOT BE USED IN USER CODE!!! -namespace internal { - -// If the explanation is not empty, prints it to the ostream. -inline void PrintIfNotEmpty(const std::string& explanation, - ::std::ostream* os) { - if (explanation != "" && os != nullptr) { - *os << ", " << explanation; - } -} - -// Returns true if the given type name is easy to read by a human. -// This is used to decide whether printing the type of a value might -// be helpful. -inline bool IsReadableTypeName(const std::string& type_name) { - // We consider a type name readable if it's short or doesn't contain - // a template or function type. - return (type_name.length() <= 20 || - type_name.find_first_of("<(") == std::string::npos); -} - -// Matches the value against the given matcher, prints the value and explains -// the match result to the listener. Returns the match result. -// 'listener' must not be NULL. -// Value cannot be passed by const reference, because some matchers take a -// non-const argument. -template -bool MatchPrintAndExplain(Value& value, const Matcher& matcher, - MatchResultListener* listener) { - if (!listener->IsInterested()) { - // If the listener is not interested, we do not need to construct the - // inner explanation. - return matcher.Matches(value); - } - - StringMatchResultListener inner_listener; - const bool match = matcher.MatchAndExplain(value, &inner_listener); - - UniversalPrint(value, listener->stream()); -#if GTEST_HAS_RTTI - const std::string& type_name = GetTypeName(); - if (IsReadableTypeName(type_name)) - *listener->stream() << " (of type " << type_name << ")"; -#endif - PrintIfNotEmpty(inner_listener.str(), listener->stream()); - - return match; -} - -// An internal helper class for doing compile-time loop on a tuple's -// fields. -template -class TuplePrefix { - public: - // TuplePrefix::Matches(matcher_tuple, value_tuple) returns true - // if and only if the first N fields of matcher_tuple matches - // the first N fields of value_tuple, respectively. - template - static bool Matches(const MatcherTuple& matcher_tuple, - const ValueTuple& value_tuple) { - return TuplePrefix::Matches(matcher_tuple, value_tuple) && - std::get(matcher_tuple).Matches(std::get(value_tuple)); - } - - // TuplePrefix::ExplainMatchFailuresTo(matchers, values, os) - // describes failures in matching the first N fields of matchers - // against the first N fields of values. If there is no failure, - // nothing will be streamed to os. - template - static void ExplainMatchFailuresTo(const MatcherTuple& matchers, - const ValueTuple& values, - ::std::ostream* os) { - // First, describes failures in the first N - 1 fields. - TuplePrefix::ExplainMatchFailuresTo(matchers, values, os); - - // Then describes the failure (if any) in the (N - 1)-th (0-based) - // field. - typename std::tuple_element::type matcher = - std::get(matchers); - typedef typename std::tuple_element::type Value; - const Value& value = std::get(values); - StringMatchResultListener listener; - if (!matcher.MatchAndExplain(value, &listener)) { - *os << " Expected arg #" << N - 1 << ": "; - std::get(matchers).DescribeTo(os); - *os << "\n Actual: "; - // We remove the reference in type Value to prevent the - // universal printer from printing the address of value, which - // isn't interesting to the user most of the time. The - // matcher's MatchAndExplain() method handles the case when - // the address is interesting. - internal::UniversalPrint(value, os); - PrintIfNotEmpty(listener.str(), os); - *os << "\n"; - } - } -}; - -// The base case. -template <> -class TuplePrefix<0> { - public: - template - static bool Matches(const MatcherTuple& /* matcher_tuple */, - const ValueTuple& /* value_tuple */) { - return true; - } - - template - static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */, - const ValueTuple& /* values */, - ::std::ostream* /* os */) {} -}; - -// TupleMatches(matcher_tuple, value_tuple) returns true if and only if -// all matchers in matcher_tuple match the corresponding fields in -// value_tuple. It is a compiler error if matcher_tuple and -// value_tuple have different number of fields or incompatible field -// types. -template -bool TupleMatches(const MatcherTuple& matcher_tuple, - const ValueTuple& value_tuple) { - // Makes sure that matcher_tuple and value_tuple have the same - // number of fields. - GTEST_COMPILE_ASSERT_(std::tuple_size::value == - std::tuple_size::value, - matcher_and_value_have_different_numbers_of_fields); - return TuplePrefix::value>::Matches(matcher_tuple, - value_tuple); -} - -// Describes failures in matching matchers against values. If there -// is no failure, nothing will be streamed to os. -template -void ExplainMatchFailureTupleTo(const MatcherTuple& matchers, - const ValueTuple& values, - ::std::ostream* os) { - TuplePrefix::value>::ExplainMatchFailuresTo( - matchers, values, os); -} - -// TransformTupleValues and its helper. -// -// TransformTupleValuesHelper hides the internal machinery that -// TransformTupleValues uses to implement a tuple traversal. -template -class TransformTupleValuesHelper { - private: - typedef ::std::tuple_size TupleSize; - - public: - // For each member of tuple 't', taken in order, evaluates '*out++ = f(t)'. - // Returns the final value of 'out' in case the caller needs it. - static OutIter Run(Func f, const Tuple& t, OutIter out) { - return IterateOverTuple()(f, t, out); - } - - private: - template - struct IterateOverTuple { - OutIter operator() (Func f, const Tup& t, OutIter out) const { - *out++ = f(::std::get(t)); - return IterateOverTuple()(f, t, out); - } - }; - template - struct IterateOverTuple { - OutIter operator() (Func /* f */, const Tup& /* t */, OutIter out) const { - return out; - } - }; -}; - -// Successively invokes 'f(element)' on each element of the tuple 't', -// appending each result to the 'out' iterator. Returns the final value -// of 'out'. -template -OutIter TransformTupleValues(Func f, const Tuple& t, OutIter out) { - return TransformTupleValuesHelper::Run(f, t, out); -} - -// Implements A(). -template -class AnyMatcherImpl : public MatcherInterface { - public: - bool MatchAndExplain(const T& /* x */, - MatchResultListener* /* listener */) const override { - return true; - } - void DescribeTo(::std::ostream* os) const override { *os << "is anything"; } - void DescribeNegationTo(::std::ostream* os) const override { - // This is mostly for completeness' safe, as it's not very useful - // to write Not(A()). However we cannot completely rule out - // such a possibility, and it doesn't hurt to be prepared. - *os << "never matches"; - } -}; - -// Implements _, a matcher that matches any value of any -// type. This is a polymorphic matcher, so we need a template type -// conversion operator to make it appearing as a Matcher for any -// type T. -class AnythingMatcher { - public: - template - operator Matcher() const { return A(); } -}; - -// Implements the polymorphic IsNull() matcher, which matches any raw or smart -// pointer that is NULL. -class IsNullMatcher { - public: - template - bool MatchAndExplain(const Pointer& p, - MatchResultListener* /* listener */) const { - return p == nullptr; - } - - void DescribeTo(::std::ostream* os) const { *os << "is NULL"; } - void DescribeNegationTo(::std::ostream* os) const { - *os << "isn't NULL"; - } -}; - -// Implements the polymorphic NotNull() matcher, which matches any raw or smart -// pointer that is not NULL. -class NotNullMatcher { - public: - template - bool MatchAndExplain(const Pointer& p, - MatchResultListener* /* listener */) const { - return p != nullptr; - } - - void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; } - void DescribeNegationTo(::std::ostream* os) const { - *os << "is NULL"; - } -}; - -// Ref(variable) matches any argument that is a reference to -// 'variable'. This matcher is polymorphic as it can match any -// super type of the type of 'variable'. -// -// The RefMatcher template class implements Ref(variable). It can -// only be instantiated with a reference type. This prevents a user -// from mistakenly using Ref(x) to match a non-reference function -// argument. For example, the following will righteously cause a -// compiler error: -// -// int n; -// Matcher m1 = Ref(n); // This won't compile. -// Matcher m2 = Ref(n); // This will compile. -template -class RefMatcher; - -template -class RefMatcher { - // Google Mock is a generic framework and thus needs to support - // mocking any function types, including those that take non-const - // reference arguments. Therefore the template parameter T (and - // Super below) can be instantiated to either a const type or a - // non-const type. - public: - // RefMatcher() takes a T& instead of const T&, as we want the - // compiler to catch using Ref(const_value) as a matcher for a - // non-const reference. - explicit RefMatcher(T& x) : object_(x) {} // NOLINT - - template - operator Matcher() const { - // By passing object_ (type T&) to Impl(), which expects a Super&, - // we make sure that Super is a super type of T. In particular, - // this catches using Ref(const_value) as a matcher for a - // non-const reference, as you cannot implicitly convert a const - // reference to a non-const reference. - return MakeMatcher(new Impl(object_)); - } - - private: - template - class Impl : public MatcherInterface { - public: - explicit Impl(Super& x) : object_(x) {} // NOLINT - - // MatchAndExplain() takes a Super& (as opposed to const Super&) - // in order to match the interface MatcherInterface. - bool MatchAndExplain(Super& x, - MatchResultListener* listener) const override { - *listener << "which is located @" << static_cast(&x); - return &x == &object_; - } - - void DescribeTo(::std::ostream* os) const override { - *os << "references the variable "; - UniversalPrinter::Print(object_, os); - } - - void DescribeNegationTo(::std::ostream* os) const override { - *os << "does not reference the variable "; - UniversalPrinter::Print(object_, os); - } - - private: - const Super& object_; - - GTEST_DISALLOW_ASSIGN_(Impl); - }; - - T& object_; - - GTEST_DISALLOW_ASSIGN_(RefMatcher); -}; - -// Polymorphic helper functions for narrow and wide string matchers. -inline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) { - return String::CaseInsensitiveCStringEquals(lhs, rhs); -} - -inline bool CaseInsensitiveCStringEquals(const wchar_t* lhs, - const wchar_t* rhs) { - return String::CaseInsensitiveWideCStringEquals(lhs, rhs); -} - -// String comparison for narrow or wide strings that can have embedded NUL -// characters. -template -bool CaseInsensitiveStringEquals(const StringType& s1, - const StringType& s2) { - // Are the heads equal? - if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) { - return false; - } - - // Skip the equal heads. - const typename StringType::value_type nul = 0; - const size_t i1 = s1.find(nul), i2 = s2.find(nul); - - // Are we at the end of either s1 or s2? - if (i1 == StringType::npos || i2 == StringType::npos) { - return i1 == i2; - } - - // Are the tails equal? - return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1)); -} - -// String matchers. - -// Implements equality-based string matchers like StrEq, StrCaseNe, and etc. -template -class StrEqualityMatcher { - public: - StrEqualityMatcher(const StringType& str, bool expect_eq, - bool case_sensitive) - : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {} - -#if GTEST_HAS_ABSL - bool MatchAndExplain(const absl::string_view& s, - MatchResultListener* listener) const { - // This should fail to compile if absl::string_view is used with wide - // strings. - const StringType& str = std::string(s); - return MatchAndExplain(str, listener); - } -#endif // GTEST_HAS_ABSL - - // Accepts pointer types, particularly: - // const char* - // char* - // const wchar_t* - // wchar_t* - template - bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { - if (s == nullptr) { - return !expect_eq_; - } - return MatchAndExplain(StringType(s), listener); - } - - // Matches anything that can convert to StringType. - // - // This is a template, not just a plain function with const StringType&, - // because absl::string_view has some interfering non-explicit constructors. - template - bool MatchAndExplain(const MatcheeStringType& s, - MatchResultListener* /* listener */) const { - const StringType& s2(s); - const bool eq = case_sensitive_ ? s2 == string_ : - CaseInsensitiveStringEquals(s2, string_); - return expect_eq_ == eq; - } - - void DescribeTo(::std::ostream* os) const { - DescribeToHelper(expect_eq_, os); - } - - void DescribeNegationTo(::std::ostream* os) const { - DescribeToHelper(!expect_eq_, os); - } - - private: - void DescribeToHelper(bool expect_eq, ::std::ostream* os) const { - *os << (expect_eq ? "is " : "isn't "); - *os << "equal to "; - if (!case_sensitive_) { - *os << "(ignoring case) "; - } - UniversalPrint(string_, os); - } - - const StringType string_; - const bool expect_eq_; - const bool case_sensitive_; - - GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher); -}; - -// Implements the polymorphic HasSubstr(substring) matcher, which -// can be used as a Matcher as long as T can be converted to a -// string. -template -class HasSubstrMatcher { - public: - explicit HasSubstrMatcher(const StringType& substring) - : substring_(substring) {} - -#if GTEST_HAS_ABSL - bool MatchAndExplain(const absl::string_view& s, - MatchResultListener* listener) const { - // This should fail to compile if absl::string_view is used with wide - // strings. - const StringType& str = std::string(s); - return MatchAndExplain(str, listener); - } -#endif // GTEST_HAS_ABSL - - // Accepts pointer types, particularly: - // const char* - // char* - // const wchar_t* - // wchar_t* - template - bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { - return s != nullptr && MatchAndExplain(StringType(s), listener); - } - - // Matches anything that can convert to StringType. - // - // This is a template, not just a plain function with const StringType&, - // because absl::string_view has some interfering non-explicit constructors. - template - bool MatchAndExplain(const MatcheeStringType& s, - MatchResultListener* /* listener */) const { - const StringType& s2(s); - return s2.find(substring_) != StringType::npos; - } - - // Describes what this matcher matches. - void DescribeTo(::std::ostream* os) const { - *os << "has substring "; - UniversalPrint(substring_, os); - } - - void DescribeNegationTo(::std::ostream* os) const { - *os << "has no substring "; - UniversalPrint(substring_, os); - } - - private: - const StringType substring_; - - GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher); -}; - -// Implements the polymorphic StartsWith(substring) matcher, which -// can be used as a Matcher as long as T can be converted to a -// string. -template -class StartsWithMatcher { - public: - explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) { - } - -#if GTEST_HAS_ABSL - bool MatchAndExplain(const absl::string_view& s, - MatchResultListener* listener) const { - // This should fail to compile if absl::string_view is used with wide - // strings. - const StringType& str = std::string(s); - return MatchAndExplain(str, listener); - } -#endif // GTEST_HAS_ABSL - - // Accepts pointer types, particularly: - // const char* - // char* - // const wchar_t* - // wchar_t* - template - bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { - return s != nullptr && MatchAndExplain(StringType(s), listener); - } - - // Matches anything that can convert to StringType. - // - // This is a template, not just a plain function with const StringType&, - // because absl::string_view has some interfering non-explicit constructors. - template - bool MatchAndExplain(const MatcheeStringType& s, - MatchResultListener* /* listener */) const { - const StringType& s2(s); - return s2.length() >= prefix_.length() && - s2.substr(0, prefix_.length()) == prefix_; - } - - void DescribeTo(::std::ostream* os) const { - *os << "starts with "; - UniversalPrint(prefix_, os); - } - - void DescribeNegationTo(::std::ostream* os) const { - *os << "doesn't start with "; - UniversalPrint(prefix_, os); - } - - private: - const StringType prefix_; - - GTEST_DISALLOW_ASSIGN_(StartsWithMatcher); -}; - -// Implements the polymorphic EndsWith(substring) matcher, which -// can be used as a Matcher as long as T can be converted to a -// string. -template -class EndsWithMatcher { - public: - explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {} - -#if GTEST_HAS_ABSL - bool MatchAndExplain(const absl::string_view& s, - MatchResultListener* listener) const { - // This should fail to compile if absl::string_view is used with wide - // strings. - const StringType& str = std::string(s); - return MatchAndExplain(str, listener); - } -#endif // GTEST_HAS_ABSL - - // Accepts pointer types, particularly: - // const char* - // char* - // const wchar_t* - // wchar_t* - template - bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { - return s != nullptr && MatchAndExplain(StringType(s), listener); - } - - // Matches anything that can convert to StringType. - // - // This is a template, not just a plain function with const StringType&, - // because absl::string_view has some interfering non-explicit constructors. - template - bool MatchAndExplain(const MatcheeStringType& s, - MatchResultListener* /* listener */) const { - const StringType& s2(s); - return s2.length() >= suffix_.length() && - s2.substr(s2.length() - suffix_.length()) == suffix_; - } - - void DescribeTo(::std::ostream* os) const { - *os << "ends with "; - UniversalPrint(suffix_, os); - } - - void DescribeNegationTo(::std::ostream* os) const { - *os << "doesn't end with "; - UniversalPrint(suffix_, os); - } - - private: - const StringType suffix_; - - GTEST_DISALLOW_ASSIGN_(EndsWithMatcher); -}; - -// Implements a matcher that compares the two fields of a 2-tuple -// using one of the ==, <=, <, etc, operators. The two fields being -// compared don't have to have the same type. -// -// The matcher defined here is polymorphic (for example, Eq() can be -// used to match a std::tuple, a std::tuple, -// etc). Therefore we use a template type conversion operator in the -// implementation. -template -class PairMatchBase { - public: - template - operator Matcher<::std::tuple>() const { - return Matcher<::std::tuple>(new Impl&>); - } - template - operator Matcher&>() const { - return MakeMatcher(new Impl&>); - } - - private: - static ::std::ostream& GetDesc(::std::ostream& os) { // NOLINT - return os << D::Desc(); - } - - template - class Impl : public MatcherInterface { - public: - bool MatchAndExplain(Tuple args, - MatchResultListener* /* listener */) const override { - return Op()(::std::get<0>(args), ::std::get<1>(args)); - } - void DescribeTo(::std::ostream* os) const override { - *os << "are " << GetDesc; - } - void DescribeNegationTo(::std::ostream* os) const override { - *os << "aren't " << GetDesc; - } - }; -}; - -class Eq2Matcher : public PairMatchBase { - public: - static const char* Desc() { return "an equal pair"; } -}; -class Ne2Matcher : public PairMatchBase { - public: - static const char* Desc() { return "an unequal pair"; } -}; -class Lt2Matcher : public PairMatchBase { - public: - static const char* Desc() { return "a pair where the first < the second"; } -}; -class Gt2Matcher : public PairMatchBase { - public: - static const char* Desc() { return "a pair where the first > the second"; } -}; -class Le2Matcher : public PairMatchBase { - public: - static const char* Desc() { return "a pair where the first <= the second"; } -}; -class Ge2Matcher : public PairMatchBase { - public: - static const char* Desc() { return "a pair where the first >= the second"; } -}; - -// Implements the Not(...) matcher for a particular argument type T. -// We do not nest it inside the NotMatcher class template, as that -// will prevent different instantiations of NotMatcher from sharing -// the same NotMatcherImpl class. -template -class NotMatcherImpl : public MatcherInterface { - public: - explicit NotMatcherImpl(const Matcher& matcher) - : matcher_(matcher) {} - - bool MatchAndExplain(const T& x, - MatchResultListener* listener) const override { - return !matcher_.MatchAndExplain(x, listener); - } - - void DescribeTo(::std::ostream* os) const override { - matcher_.DescribeNegationTo(os); - } - - void DescribeNegationTo(::std::ostream* os) const override { - matcher_.DescribeTo(os); - } - - private: - const Matcher matcher_; - - GTEST_DISALLOW_ASSIGN_(NotMatcherImpl); -}; - -// Implements the Not(m) matcher, which matches a value that doesn't -// match matcher m. -template -class NotMatcher { - public: - explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {} - - // This template type conversion operator allows Not(m) to be used - // to match any type m can match. - template - operator Matcher() const { - return Matcher(new NotMatcherImpl(SafeMatcherCast(matcher_))); - } - - private: - InnerMatcher matcher_; - - GTEST_DISALLOW_ASSIGN_(NotMatcher); -}; - -// Implements the AllOf(m1, m2) matcher for a particular argument type -// T. We do not nest it inside the BothOfMatcher class template, as -// that will prevent different instantiations of BothOfMatcher from -// sharing the same BothOfMatcherImpl class. -template -class AllOfMatcherImpl : public MatcherInterface { - public: - explicit AllOfMatcherImpl(std::vector > matchers) - : matchers_(std::move(matchers)) {} - - void DescribeTo(::std::ostream* os) const override { - *os << "("; - for (size_t i = 0; i < matchers_.size(); ++i) { - if (i != 0) *os << ") and ("; - matchers_[i].DescribeTo(os); - } - *os << ")"; - } - - void DescribeNegationTo(::std::ostream* os) const override { - *os << "("; - for (size_t i = 0; i < matchers_.size(); ++i) { - if (i != 0) *os << ") or ("; - matchers_[i].DescribeNegationTo(os); - } - *os << ")"; - } - - bool MatchAndExplain(const T& x, - MatchResultListener* listener) const override { - // If either matcher1_ or matcher2_ doesn't match x, we only need - // to explain why one of them fails. - std::string all_match_result; - - for (size_t i = 0; i < matchers_.size(); ++i) { - StringMatchResultListener slistener; - if (matchers_[i].MatchAndExplain(x, &slistener)) { - if (all_match_result.empty()) { - all_match_result = slistener.str(); - } else { - std::string result = slistener.str(); - if (!result.empty()) { - all_match_result += ", and "; - all_match_result += result; - } - } - } else { - *listener << slistener.str(); - return false; - } - } - - // Otherwise we need to explain why *both* of them match. - *listener << all_match_result; - return true; - } - - private: - const std::vector > matchers_; - - GTEST_DISALLOW_ASSIGN_(AllOfMatcherImpl); -}; - -// VariadicMatcher is used for the variadic implementation of -// AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...). -// CombiningMatcher is used to recursively combine the provided matchers -// (of type Args...). -template