diff --git a/doc/api/tracing.markdown b/doc/api/tracing.markdown index 92e6809a04a..fc106ca5893 100644 --- a/doc/api/tracing.markdown +++ b/doc/api/tracing.markdown @@ -58,6 +58,21 @@ Returns an object with the following properties } ``` +### setFlagsFromString() + +Set additional V8 command line flags. Use with care; changing settings +after the VM has started may result in unpredictable behavior, including +crashes and data loss. Or it may simply do nothing. + +Usage: + +``` +// Print GC events to stdout for one minute. +var v8 = require('tracing').v8; +v8.setFlagsFromString('--trace_gc'); +setTimeout(function() { v8.setFlagsFromString('--notrace_gc'); }, 60e3); +``` + # Async Listeners diff --git a/lib/tracing.js b/lib/tracing.js index 49d0dec35c2..5e35f435911 100644 --- a/lib/tracing.js +++ b/lib/tracing.js @@ -31,6 +31,7 @@ exports._nodeInitialization = function nodeInitialization(pobj) { // Finish setting up the v8 Object. v8.getHeapStatistics = v8binding.getHeapStatistics; + v8.setFlagsFromString = v8binding.setFlagsFromString; // Part of the AsyncListener setup to share objects/callbacks with the // native layer. diff --git a/src/node_v8.cc b/src/node_v8.cc index d59e661fbdb..fa60bbee4b3 100644 --- a/src/node_v8.cc +++ b/src/node_v8.cc @@ -41,7 +41,9 @@ using v8::Local; using v8::Null; using v8::Number; using v8::Object; +using v8::String; using v8::Uint32; +using v8::V8; using v8::Value; using v8::kGCTypeAll; using v8::kGCTypeMarkSweepCompact; @@ -204,6 +206,12 @@ void StopGarbageCollectionTracking(const FunctionCallbackInfo& args) { } +void SetFlagsFromString(const FunctionCallbackInfo& args) { + String::Utf8Value flags(args[0]); + V8::SetFlagsFromString(*flags, flags.length()); +} + + void InitializeV8Bindings(Handle target, Handle unused, Handle context) { @@ -215,6 +223,7 @@ void InitializeV8Bindings(Handle target, "stopGarbageCollectionTracking", StopGarbageCollectionTracking); env->SetMethod(target, "getHeapStatistics", GetHeapStatistics); + env->SetMethod(target, "setFlagsFromString", SetFlagsFromString); } } // namespace node diff --git a/test/simple/test-v8-flags.js b/test/simple/test-v8-flags.js new file mode 100644 index 00000000000..1de36db6766 --- /dev/null +++ b/test/simple/test-v8-flags.js @@ -0,0 +1,26 @@ +// Copyright (c) 2014, StrongLoop Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +var common = require('../common'); +var assert = require('assert'); +var v8 = require('tracing').v8; +var vm = require('vm'); + +v8.setFlagsFromString('--allow_natives_syntax'); +assert(eval('%_IsSmi(42)')); +assert(vm.runInThisContext('%_IsSmi(42)')); + +v8.setFlagsFromString('--noallow_natives_syntax'); +assert.throws(function() { eval('%_IsSmi(42)') }, SyntaxError); +assert.throws(function() { vm.runInThisContext('%_IsSmi(42)') }, SyntaxError);