Hi Guilers,

Noticed that ECMAscript "new" syntax seemed to be broken. Here's a
patch that fixes it. I'd like to make some incremental improvements in
Guile's ECMAscript support, so if this one's welcome, expect others to
follow!


Regards,
Julian
From 16ef2df6cc206f829c3aff96b1b315ed6fb50c05 Mon Sep 17 00:00:00 2001
From: Julian Graham <jool...@undecidable.net>
Date: Tue, 13 Sep 2016 08:39:43 -0400
Subject: [PATCH] Fix tree-il code generation for ECMAscript `new' expression.

The compiler was producing `((toplevel foo))' instead of `(toplevel foo)'.
Changed to use `call' form with target type and spliced constructor
arguments.

* module/language/ecmascript/compile-tree-il.scm (comp): Replace `@impl'
  shorthand with `call' + `@implv' for better control over resulting
  tree-il.
* test-suite/tests/ecmascript.test (compiler): Add test for "new Object();"
---
 module/language/ecmascript/compile-tree-il.scm | 8 ++++----
 test-suite/tests/ecmascript.test               | 8 +++++++-
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/module/language/ecmascript/compile-tree-il.scm b/module/language/ecmascript/compile-tree-il.scm
index a9ac3e0..d61f712 100644
--- a/module/language/ecmascript/compile-tree-il.scm
+++ b/module/language/ecmascript/compile-tree-il.scm
@@ -1,6 +1,6 @@
 ;;; ECMAScript for Guile
 
-;; Copyright (C) 2009, 2011 Free Software Foundation, Inc.
+;; Copyright (C) 2009, 2011, 2016 Free Software Foundation, Inc.
 
 ;;;; This library is free software; you can redistribute it and/or
 ;;;; modify it under the terms of the GNU Lesser General Public
@@ -437,9 +437,9 @@
       ((^= ,what ,val)
        (comp `(= ,what (^ ,what ,val)) e))
       ((new ,what ,args)
-       (@impl new
-              (map (lambda (x) (comp x e))
-                   (cons what args))))
+       `(call ,(@implv new)
+              ,(comp what e)
+              ,@(map (lambda (x) (comp x e)) args)))
       ((delete (pref ,obj ,prop))
        (@impl pdel
               (comp obj e)
diff --git a/test-suite/tests/ecmascript.test b/test-suite/tests/ecmascript.test
index 96b1d66..9f2731e 100644
--- a/test-suite/tests/ecmascript.test
+++ b/test-suite/tests/ecmascript.test
@@ -1,6 +1,6 @@
 ;;;; ecmascript.test --- ECMAScript.      -*- mode: scheme; coding: utf-8; -*-
 ;;;;
-;;;; 	Copyright (C) 2010, 2011, 2013 Free Software Foundation, Inc.
+;;;; 	Copyright (C) 2010, 2011, 2013, 2016 Free Software Foundation, Inc.
 ;;;;
 ;;;; This library is free software; you can redistribute it and/or
 ;;;; modify it under the terms of the GNU Lesser General Public
@@ -83,6 +83,12 @@
   (ecompile "\"hello\";" "hello")
   (ecompile "var test = { bar: 1 };")
 
+  (pass-if "new Object;"
+    (not (not
+          (compile (call-with-input-string "new Object;" read-ecmascript)
+                   #:from 'ecmascript
+                   #:to 'tree-il)))) ; Can't reference `Object' as value here
+
   ;; FIXME: Broken!
   ;; (ecompile "[1,2,3,4].map(function(x) { return x * x; });"
   ;;           '(1 4 9 16))
-- 
2.5.0

Reply via email to