[Webkit-unassigned] [Bug 157246] New: ES6 Function.name inferred from property names of literal objects can break some websites

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Sun May 1 08:42:04 PDT 2016


https://bugs.webkit.org/show_bug.cgi?id=157246

            Bug ID: 157246
           Summary: ES6 Function.name inferred from property names of
                    literal objects can break some websites
    Classification: Unclassified
           Product: WebKit
           Version: WebKit Nightly Build
          Hardware: Unspecified
                OS: Unspecified
            Status: NEW
          Severity: Normal
          Priority: P2
         Component: JavaScriptCore
          Assignee: webkit-unassigned at lists.webkit.org
          Reporter: mark.lam at apple.com

Specifically, the library mathjs (see http://mathjs.org and https://github.com/josdejong/mathjs) uses an idiom where it created literal objects with property names that look like this: 'number | BigNumber | Unit'.  Later, this name is used in a string to create function source code that gets eval'ed.  Since 'number | BigNumber | Unit' is not a valid function name, we get a syntax error.

The nitty gritty details:

1. mathjs uses object literals with the funky property names for its function members.  For example, 

      // helper function to type check the middle value of the array
      var middle = typed({
        'number | BigNumber | Unit': function (value) {
          return value;
        }
      });

2. mathjs' getName() uses Function.name to get the name of functions (hence, picks up the ES6 behavior):

        /**
         * Retrieve the function name from a set of functions, and check
         * whether the name of all functions match (if given)
         ...
         */
        function getName (fns) {
          var name = '';

          for (var i = 0; i < fns.length; i++) {
            var fn = fns[i];
            ...
                name = fn.name;
            ...
          return name;
        }

3. mathjs uses that name to assembler new function source code that gets eval'ed:

        /**
         * Compose a function from sub-functions each handling a single type signature.
         ...
         */
        function _typed(name, signatures) {
          ...
          // generate code for the typed function
          var code = [];
          var _name = name || '';
          ...
          code.push('function ' + _name + '(' + _args.join(', ') + ') {');
          code.push('  "use strict";');
          code.push('  var name = \'' + _name + '\';');
          code.push(node.toCode(refs, '  '));
          code.push('}');

          // generate body for the factory function
          var body = [
            refs.toCode(),
            'return ' + code.join('\n')
          ].join('\n');

          // evaluate the JavaScript code and attach function references
          var factory = (new Function(refs.name, 'createError', body));  // <========= Syntax Error right here!
          var fn = factory(refs, createError);
          ...
          return fn;
        }

Until mathjs (and any other frameworks that does similar things) and sites that uses mathjs has been updated to work with ES6, we'll need a compatibility hack to work around it.

-- 
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.webkit.org/pipermail/webkit-unassigned/attachments/20160501/b5dc11d9/attachment.html>


More information about the webkit-unassigned mailing list