Blob Blame History Raw
From a48732850420859b218c04b280a2f6c412525f0b Mon Sep 17 00:00:00 2001
From: Kalev Lember <klember@redhat.com>
Date: Tue, 15 May 2018 21:14:16 +0200
Subject: [PATCH] Revert "js: Convert scripts to UTF-16 before evaluating"

RHEL 7 libstdc++ 4.8 doesn't have <codecvt> header that gjs needs. In
order to work this around, this commit reverts the patch that introduced
the requirement.

This reverts commit bc36f39ff09629e1b4c5c54f334028d2b2f8c545.
---
 gjs/jsapi-util.cpp | 14 ++++++--------
 gjs/module.cpp     | 15 ++++++---------
 2 files changed, 12 insertions(+), 17 deletions(-)

diff --git a/gjs/jsapi-util.cpp b/gjs/jsapi-util.cpp
index ed3e6492..8b686048 100644
--- a/gjs/jsapi-util.cpp
+++ b/gjs/jsapi-util.cpp
@@ -1,58 +1,56 @@
 /* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
 /*
  * Copyright (c) 2008  litl, LLC
  * Copyright (c) 2009 Red Hat, Inc.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to
  * deal in the Software without restriction, including without limitation the
  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  * sell copies of the Software, and to permit persons to whom the Software is
  * furnished to do so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice shall be included in
  * all copies or substantial portions of the Software.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
 
 #include <config.h>
 
-#include <codecvt>
-#include <locale>
 #include "jsapi-wrapper.h"
 #include <js/GCAPI.h>
 
 #include <util/log.h>
 #include <util/glib.h>
 #include <util/misc.h>
 #include <util/error.h>
 
 #include "jsapi-class.h"
 #include "jsapi-util.h"
 #include "context-private.h"
 #include <gi/boxed.h>
 
 #include <string.h>
 #include <math.h>
 
 GQuark
 gjs_util_error_quark (void)
 {
     return g_quark_from_static_string ("gjs-util-error-quark");
 }
 
 bool
 gjs_object_get_property(JSContext             *cx,
                         JS::HandleObject       obj,
                         GjsConstString         property_name,
                         JS::MutableHandleValue value_p)
 {
     return JS_GetPropertyById(cx, obj,
                               gjs_context_get_const_string(cx, property_name),
@@ -826,58 +824,58 @@ gjs_strip_unix_shebang(const char  *script,
 bool
 gjs_eval_with_scope(JSContext             *context,
                     JS::HandleObject       object,
                     const char            *script,
                     ssize_t                script_len,
                     const char            *filename,
                     JS::MutableHandleValue retval)
 {
     int start_line_number = 1;
     JSAutoRequest ar(context);
     size_t real_len = script_len;
 
     if (script_len < 0)
         real_len = strlen(script);
 
     script = gjs_strip_unix_shebang(script,
                                     &real_len,
                                     &start_line_number);
 
     /* log and clear exception if it's set (should not be, normally...) */
     if (JS_IsExceptionPending(context)) {
         g_warning("gjs_eval_in_scope called with a pending exception");
         return false;
     }
 
     JS::RootedObject eval_obj(context, object);
     if (!eval_obj)
         eval_obj = JS_NewPlainObject(context);
 
     JS::CompileOptions options(context);
-    options.setFileAndLine(filename, start_line_number)
+    options.setUTF8(true)
+           .setFileAndLine(filename, start_line_number)
            .setSourceIsLazy(true);
 
-    std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert;
-    std::u16string utf16_string = convert.from_bytes(script);
-    JS::SourceBufferHolder buf(utf16_string.c_str(), utf16_string.size(),
-                               JS::SourceBufferHolder::NoOwnership);
+    JS::RootedScript compiled_script(context);
+    if (!JS::Compile(context, options, script, real_len, &compiled_script))
+        return false;
 
     JS::AutoObjectVector scope_chain(context);
     if (!scope_chain.append(eval_obj))
         g_error("Unable to append to vector");
 
-    if (!JS::Evaluate(context, scope_chain, options, buf, retval))
+    if (!JS_ExecuteScript(context, scope_chain, compiled_script, retval))
         return false;
 
     gjs_schedule_gc_if_needed(context);
 
     if (JS_IsExceptionPending(context)) {
         g_warning("EvaluateScript returned true but exception was pending; "
                   "did somebody call gjs_throw() without returning false?");
         return false;
     }
 
     gjs_debug(GJS_DEBUG_CONTEXT,
               "Script evaluation succeeded");
 
     return true;
 }
diff --git a/gjs/module.cpp b/gjs/module.cpp
index cc6657a7..4b8bd40c 100644
--- a/gjs/module.cpp
+++ b/gjs/module.cpp
@@ -1,56 +1,53 @@
 /* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
 /*
  * Copyright (c) 2017  Philip Chimento <philip.chimento@gmail.com>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to
  * deal in the Software without restriction, including without limitation the
  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  * sell copies of the Software, and to permit persons to whom the Software is
  * furnished to do so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice shall be included in
  * all copies or substantial portions of the Software.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
 
-#include <codecvt>
-#include <locale>
-
 #include <gio/gio.h>
 
 #include "jsapi-util.h"
 #include "jsapi-wrapper.h"
 #include "module.h"
 #include "util/log.h"
 
 class GjsModule {
     char *m_name;
 
     GjsModule(const char *name)
     {
         m_name = g_strdup(name);
     }
 
     ~GjsModule()
     {
         g_free(m_name);
     }
 
     /* Private data accessors */
 
     static inline GjsModule *
     priv(JSObject *module)
     {
         return static_cast<GjsModule *>(JS_GetPrivate(module));
     }
 
     /* Creates a JS module object. Use instead of the class's constructor */
     static JSObject *
@@ -62,74 +59,74 @@ class GjsModule {
         return module;
     }
 
     /* Defines the empty module as a property on the importer */
     bool
     define_import(JSContext       *cx,
                   JS::HandleObject module,
                   JS::HandleObject importer,
                   JS::HandleId     name)
     {
         if (!JS_DefinePropertyById(cx, importer, name, module,
                                    GJS_MODULE_PROP_FLAGS & ~JSPROP_PERMANENT)) {
             gjs_debug(GJS_DEBUG_IMPORTER, "Failed to define '%s' in importer",
                       m_name);
             return false;
         }
 
         return true;
     }
 
     /* Carries out the actual execution of the module code */
     bool
     evaluate_import(JSContext       *cx,
                     JS::HandleObject module,
                     const char      *script,
                     size_t           script_len,
                     const char      *filename,
                     int              line_number)
     {
         JS::CompileOptions options(cx);
-        options.setFileAndLine(filename, line_number)
+        options.setUTF8(true)
+               .setFileAndLine(filename, line_number)
                .setSourceIsLazy(true);
 
-        std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert;
-        std::u16string utf16_string = convert.from_bytes(script);
-        JS::SourceBufferHolder buf(utf16_string.c_str(), utf16_string.size(),
-                                   JS::SourceBufferHolder::NoOwnership);
+        JS::RootedScript compiled_script(cx);
+        if (!JS::Compile(cx, options, script, script_len, &compiled_script))
+            return false;
 
         JS::AutoObjectVector scope_chain(cx);
         if (!scope_chain.append(module))
             g_error("Unable to append to vector");
 
         JS::RootedValue ignored_retval(cx);
-        if (!JS::Evaluate(cx, scope_chain, options, buf, &ignored_retval))
+        if (!JS_ExecuteScript(cx, scope_chain, compiled_script, &ignored_retval))
             return false;
 
         gjs_schedule_gc_if_needed(cx);
 
         gjs_debug(GJS_DEBUG_IMPORTER, "Importing module %s succeeded", m_name);
 
         return true;
     }
 
     /* Loads JS code from a file and imports it */
     bool
     import_file(JSContext       *cx,
                 JS::HandleObject module,
                 GFile           *file)
     {
         GError *error = nullptr;
         char *unowned_script;
         size_t script_len = 0;
         int start_line_number = 1;
 
         if (!(g_file_load_contents(file, nullptr, &unowned_script, &script_len,
                                    nullptr, &error))) {
             gjs_throw_g_error(cx, error);
             return false;
         }
 
         GjsAutoChar script = unowned_script;  /* steals ownership */
         g_assert(script != nullptr);
 
         const char *stripped_script =
-- 
2.17.1