// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include <stack> #include "src/api/api-inl.h" #include "src/builtins/builtins-utils-inl.h" #include "src/builtins/builtins.h" #include "src/debug/interface-types.h" #include "src/logging/counters.h" #include "src/logging/log.h" #include "src/objects/objects-inl.h" namespace v8 { namespace internal { // ----------------------------------------------------------------------------- // Console #define CONSOLE_METHOD_LIST … #define CONSOLE_METHOD_WITH_FORMATTER_LIST(V) … namespace { // 2.2 Formatter(args) [https://console.spec.whatwg.org/#formatter] // // This implements the formatter operation defined in the Console // specification to the degree that it makes sense for V8. That // means we primarily deal with %s, %i, %f, and %d, and any side // effects caused by the type conversions, and we preserve the %o, // %c, and %O specifiers and their parameters unchanged, and instead // leave it to the debugger front-end to make sense of those. // // Chrome also supports the non-standard bypass format specifier %_ // which just skips over the parameter. // // This implementation updates the |args| in-place with the results // from the conversion. // // The |index| describes the position of the format string within, // |args| (starting with 1, since |args| also includes the receiver), // which is different for example in case of `console.log` where it // is 1 compared to `console.assert` where it is 2. bool Formatter(Isolate* isolate, BuiltinArguments& args, int index) { … } // The closures installed on objects returned from `console.context()` // get a special builtin context with 2 slots, to hold the unique ID of // the console context and its name. enum { … }; void ConsoleCall( Isolate* isolate, const internal::BuiltinArguments& args, void (debug::ConsoleDelegate::*func)(const v8::debug::ConsoleCallArguments&, const v8::debug::ConsoleContext&)) { … } void LogTimerEvent(Isolate* isolate, BuiltinArguments args, v8::LogEventStatus se) { … } } // namespace #define CONSOLE_BUILTIN_IMPLEMENTATION … CONSOLE_METHOD_LIST #undef CONSOLE_BUILTIN_IMPLEMENTATION #define CONSOLE_BUILTIN_IMPLEMENTATION … CONSOLE_METHOD_WITH_FORMATTER_LIST(…) #undef CONSOLE_BUILTIN_IMPLEMENTATION BUILTIN(…) { … BUILTIN(…) { … BUILTIN(…) { … BUILTIN(…) { … namespace { void InstallContextFunction(Isolate* isolate, Handle<JSObject> target, const char* name, Builtin builtin, Handle<Context> context) { … } } // namespace BUILTIN(ConsoleContext) { … } #undef CONSOLE_METHOD_LIST } // namespace internal } // namespace v8