[gjs] coverage: Use global bootstrap to add JS coverage code



commit 9b0beff7f6d31127ca9c9a622a0ffe6754a19deb
Author: Philip Chimento <philip chimento gmail com>
Date:   Sat Sep 9 17:17:09 2017 -0700

    coverage: Use global bootstrap to add JS coverage code
    
    This takes advantage of the new bootstrap stage of
    gjs_define_global_properties() to run the JS coverage code in the
    coverage compartment.
    
    This moves imports.coverage to imports._bootstrap.coverage, which makes
    sense because the code in imports.coverage was not useful for GJS
    scripts.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=777724

 gjs/coverage.cpp                     |   84 ++-------------------------------
 installed-tests/js/testCoverage.js   |    2 +-
 modules/{ => _bootstrap}/coverage.js |    0
 modules/modules.gresource.xml        |    2 +-
 4 files changed, 8 insertions(+), 80 deletions(-)
---
diff --git a/gjs/coverage.cpp b/gjs/coverage.cpp
index 4f9c7f2..d79fad3 100644
--- a/gjs/coverage.cpp
+++ b/gjs/coverage.cpp
@@ -1268,59 +1268,6 @@ gjs_coverage_init(GjsCoverage *self)
 }
 
 static bool
-gjs_context_eval_file_in_compartment(GjsContext      *context,
-                                     const char      *filename,
-                                     JS::HandleObject compartment_object,
-                                     GError         **error)
-{
-    char  *script = NULL;
-    gsize script_len = 0;
-
-    GFile *file = g_file_new_for_commandline_arg(filename);
-
-    if (!g_file_load_contents(file,
-                              NULL,
-                              &script,
-                              &script_len,
-                              NULL,
-                              error)) {
-        g_object_unref(file);
-        return false;
-    }
-
-    g_object_unref(file);
-
-    int start_line_number = 1;
-    const char *stripped_script = gjs_strip_unix_shebang(script, &script_len,
-                                                         &start_line_number);
-
-    JSContext *js_context = (JSContext *) gjs_context_get_native_context(context);
-
-    JSAutoCompartment compartment(js_context, compartment_object);
-
-    JS::CompileOptions options(js_context);
-    options.setUTF8(true)
-           .setFileAndLine(filename, start_line_number)
-           .setSourceIsLazy(true);
-    JS::RootedScript compiled_script(js_context);
-    if (!JS::Compile(js_context, options, stripped_script, script_len,
-                     &compiled_script))
-        return false;
-
-    JS::RootedValue dummy_rval(js_context);
-    if (!JS::CloneAndExecuteScript(js_context, compiled_script, &dummy_rval)) {
-        g_free(script);
-        gjs_log_exception(js_context);
-        g_set_error(error, GJS_ERROR, GJS_ERROR_FAILED, "Failed to evaluate %s", filename);
-        return false;
-    }
-
-    g_free(script);
-
-    return true;
-}
-
-static bool
 coverage_log(JSContext *context,
              unsigned   argc,
              JS::Value *vp)
@@ -1546,10 +1493,8 @@ gjs_inject_value_into_coverage_compartment(GjsCoverage     *coverage,
 static bool
 bootstrap_coverage(GjsCoverage *coverage)
 {
-    static const char  *coverage_script = "resource:///org/gnome/gjs/modules/coverage.js";
     GjsCoveragePrivate *priv = (GjsCoveragePrivate *) gjs_coverage_get_instance_private(coverage);
     GBytes             *cache_bytes = NULL;
-    GError             *error = NULL;
 
     JSContext *context = (JSContext *) gjs_context_get_native_context(priv->context);
     JSAutoRequest ar(context);
@@ -1562,33 +1507,16 @@ bootstrap_coverage(GjsCoverage *coverage)
     {
         JSAutoCompartment compartment(context, debugger_compartment);
         JS::RootedObject debuggeeWrapper(context, debuggee);
-        if (!JS_WrapObject(context, &debuggeeWrapper)) {
-            gjs_throw(context, "Failed to wrap debugeee");
+        if (!JS_WrapObject(context, &debuggeeWrapper))
             return false;
-        }
 
         JS::RootedValue debuggeeWrapperValue(context, JS::ObjectValue(*debuggeeWrapper));
         if (!JS_SetProperty(context, debugger_compartment, "debuggee",
-                            debuggeeWrapperValue)) {
-            gjs_throw(context, "Failed to set debuggee property");
+                            debuggeeWrapperValue) ||
+            !JS_DefineFunctions(context, debugger_compartment, coverage_funcs) ||
+            !gjs_define_global_properties(context, debugger_compartment,
+                                          "coverage"))
             return false;
-        }
-
-        if (!gjs_define_global_properties(context, debugger_compartment,
-                                          "default")) {
-            gjs_throw(context, "Failed to define global properties on debugger "
-                      "compartment");
-            return false;
-        }
-
-        if (!JS_DefineFunctions(context, debugger_compartment, &coverage_funcs[0]))
-            g_error("Failed to init coverage");
-
-        if (!gjs_context_eval_file_in_compartment(priv->context,
-                                                  coverage_script,
-                                                  debugger_compartment,
-                                                  &error))
-            g_error("Failed to eval coverage script: %s\n", error->message);
 
         JS::RootedObject coverage_statistics_constructor(context);
         JS::RootedId coverage_statistics_name(context,
@@ -1629,7 +1557,7 @@ bootstrap_coverage(GjsCoverage *coverage)
                                                coverage_statistics_constructor_args);
 
         if (!coverage_statistics) {
-            gjs_throw(context, "Failed to create coverage_statitiscs object");
+            gjs_throw(context, "Failed to create coverage_statistics object");
             return false;
         }
 
diff --git a/installed-tests/js/testCoverage.js b/installed-tests/js/testCoverage.js
index 049f60a..f0b4d39 100644
--- a/installed-tests/js/testCoverage.js
+++ b/installed-tests/js/testCoverage.js
@@ -1,4 +1,4 @@
-const Coverage = imports.coverage;
+const Coverage = imports._bootstrap.coverage;
 
 describe('Coverage.expressionLinesForAST', function () {
     let testTable = {
diff --git a/modules/coverage.js b/modules/_bootstrap/coverage.js
similarity index 100%
rename from modules/coverage.js
rename to modules/_bootstrap/coverage.js
diff --git a/modules/modules.gresource.xml b/modules/modules.gresource.xml
index 9ffa492..724adb4 100644
--- a/modules/modules.gresource.xml
+++ b/modules/modules.gresource.xml
@@ -2,6 +2,7 @@
 <gresources>
   <gresource prefix="/org/gnome/gjs">
     <file>modules/_bootstrap/default.js</file>
+    <file>modules/_bootstrap/coverage.js</file>
 
     <file>modules/tweener/equations.js</file>
     <file>modules/tweener/tweener.js</file>
@@ -13,7 +14,6 @@
     <file>modules/overrides/Gtk.js</file>
 
     <file>modules/cairo.js</file>
-    <file>modules/coverage.js</file>
     <file>modules/gettext.js</file>
     <file>modules/lang.js</file>
     <file>modules/_legacy.js</file>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]