jorgenschaefer / elpy

Emacs Python Development Environment
GNU General Public License v3.0
1.9k stars 261 forks source link

Tiresome errors from elpy RPC backend #1101

Closed sawan closed 7 years ago

sawan commented 7 years ago

Hi,

I'm getting heaps of the same 2 error messages while using elpy. Message is:

error in process filter: elpy-rpc--default-error-callback: Wrong type argument: stringp, nil
error in process filter: Wrong type argument: stringp, nil
error in process filter: elpy-rpc--default-error-callback: Wrong type argument: stringp, nil
error in process filter: Wrong type argument: stringp, nil
error in process filter: elpy-rpc--default-error-callback: Wrong type argument: stringp, nil
error in process filter: Wrong type argument: stringp, nil
error in process filter: elpy-rpc--default-error-callback: Wrong type argument: stringp, nil
error in process filter: Wrong type argument: stringp, nil
error in process filter: elpy-rpc--default-error-callback: Wrong type argument: stringp, nil
error in process filter: Wrong type argument: stringp, nil
error in process filter: elpy-rpc--default-error-callback: Wrong type argument: stringp, nil
error in process filter: Wrong type argument: stringp, nil
error in process filter: elpy-rpc--default-error-callback: Wrong type argument: stringp, nil
error in process filter: Wrong type argument: stringp, nil

With

M-x toggle-debug-upon-error


Debugger entered--Lisp error: (wrong-type-argument stringp nil)
  signal(wrong-type-argument (stringp nil))
  elpy-rpc--default-error-callback((wrong-type-argument stringp nil))
  elpy-promise-reject([*elpy-promise* #[257 "\303 \210\301\203\304\300\"\202 \300G\nV\203\305\306\307\300\"!\202 \310!\207" [#("total_score" 0 11 (fontified t)) #[257 "\211\203\301\242\307=\204\301\240\207\306\f\300\310!BC
\311\312DC\216\313\302\303\304\305$)\207" [#("total_score" 0 11 (fontified t)) (done) #<buffer models.py<app>> #<window 3 on models.py<app>> 158385 5861 elpy-company-backend done company--preprocess-candidates funcall #[0 "?\205\n\303\211\211\207" [company-candidates company-backend company-candidates-cache nil] 3 "\n\n(fn)"] company-idle-begin company-backend company-candidates-cache] 6 "\n\n(fn CANDIDATES)"] company-minimum-prefix-length elpy-company--cache-clear elpy-company--cache-completions elpy--sort-and-strip-duplicates company-dabbrev-code candidates nil] 6 "\n\n(fn RESULT)"] elpy-rpc--default-error-callback #<buffer models.py<app>> nil] (wrong-type-argument stringp nil))
  #[257 "\301\300\"\207" [[*elpy-promise* #[257 "\303 \210\301\203\304\300\"\202 \300G\nV\203\305\306\307\300\"!\202 \310!\207" [#("total_score" 0 11 (fontified t)) #[257 "\211\203\301\242\307=\204\301\240\207\306\f\300\310!BC
\311\312DC\216\313\302\303\304\305$)\207" [#("total_score" 0 11 ...) (done) #<buffer models.py<app>> #<window 3 on models.py<app>> 158385 5861 elpy-company-backend done company--preprocess-candidates funcall #[0 "?\205\n\303\211\211\207" [company-candidates company-backend company-candidates-cache nil] 3 "\n\n(fn)"] company-idle-begin company-backend company-candidates-cache] 6 "\n\n(fn CANDIDATES)"] company-minimum-prefix-length elpy-company--cache-clear elpy-company--cache-completions elpy--sort-and-strip-duplicates company-dabbrev-code candidates nil] 6 "\n\n(fn RESULT)"] elpy-rpc--default-error-callback #<buffer models.py<app>> nil] elpy-promise-reject] 4 "\n\n(fn ERR)"]((wrong-type-argument stringp nil))
  funcall(#[257 "\301\300\"\207" [[*elpy-promise* #[257 "\303 \210\301\203\304\300\"\202 \300G\nV\203\305\306\307\300\"!\202 \310!\207" [#("total_score" 0 11 (fontified t)) #[257 "\211\203\301\242\307=\204\301\240\207\306\f\300\310!BC
\311\312DC\216\313\302\303\304\305$)\207" [#("total_score" 0 11 ...) (done) #<buffer models.py<app>> #<window 3 on models.py<app>> 158385 5861 elpy-company-backend done company--preprocess-candidates funcall #[0 "?\205\n\303\211\211\207" [company-candidates company-backend company-candidates-cache nil] 3 "\n\n(fn)"] company-idle-begin company-backend company-candidates-cache] 6 "\n\n(fn CANDIDATES)"] company-minimum-prefix-length elpy-company--cache-clear elpy-company--cache-completions elpy--sort-and-strip-duplicates company-dabbrev-code candidates nil] 6 "\n\n(fn RESULT)"] elpy-rpc--default-error-callback #<buffer models.py<app>> nil] elpy-promise-reject] 4 "\n\n(fn ERR)"] (wrong-type-argument stringp nil))
  elpy-promise-resolve([*elpy-promise* #[257 "\303 \210\301\203\304\300\"\202 \300G\nV\203\305\306\307\300\"!\202 \310!\207" [#("total_score" 0 11 (fontified t)) #[257 "\211\203\301\242\307=\204\301\240\207\306\f\300\310!BC
\311\312DC\216\313\302\303\304\305$)\207" [#("total_score" 0 11 (fontified t)) (done) #<buffer models.py<app>> #<window 3 on models.py<app>> 158385 5861 elpy-company-backend done company--preprocess-candidates funcall #[0 "?\205\n\303\211\211\207" [company-candidates company-backend company-candidates-cache nil] 3 "\n\n(fn)"] company-idle-begin company-backend company-candidates-cache] 6 "\n\n(fn CANDIDATES)"] company-minimum-prefix-length elpy-company--cache-clear elpy-company--cache-completions elpy--sort-and-strip-duplicates company-dabbrev-code candidates nil] 6 "\n\n(fn RESULT)"] elpy-rpc--default-error-callback #<buffer models.py<app>> nil] nil)
  elpy-rpc--handle-json(((id . 13) (result)))
  elpy-rpc--filter(#<process  *elpy-rpc [project:~/src/app/ python:/Users/svithlani/src/app/bin/python]*> "{\"result\": [], \"id\": 13}\n")

Elpy version is 1.14.1.

Any idea?

Sawan

jorgenschaefer commented 7 years ago

Hello, and thanks for the report! This error happens in elpy-company-backend, specifically the lambda on line 3572. I don't see where this should cause the error you see. So, not sure what is happening there.

Have you tried restarting Emacs? Do you have other packages installed?

sawan commented 7 years ago

Hi,

Ok I will try updating Emacs packages and restarting.

Sorry, what do you mean by other packages?

jorgenschaefer commented 7 years ago

Sorry, what do you mean by other packages?

We've seen problems in the past with some packages hooking into company and other such infrastructure interfaces, and breaking them slightly. It was a wild guess as to what might be happening there. :-|

sawan commented 7 years ago

Right.... any examples of what I should be looking for? I'm removing autocomplete as I type.

jorgenschaefer commented 7 years ago

Nope, sadly not. I'd suggest starting Emacs in a clean environment:

mkdir test-emacs HOME="$(pwd)/test-emacs" emacs

and installing Elpy there, to see if that works. If it does, slowly add packages.

But maybe there's a faster way. Evaluate the following form, and see if you then get a better backtrace:

(defun elpy-promise-resolve (promise value)
  "Resolve PROMISE with VALUE."
  (when (not (elpy-promise-resolved-p promise))
    (unwind-protect
        (let ((success-callback (elpy-promise-success-callback promise)))
          (when success-callback
            (with-current-buffer (elpy-promise-buffer promise)
              (funcall success-callback value))))
      (elpy-promise-set-resolved promise))))
sawan commented 7 years ago

Please find output below

Error always seems to happen when trying to trigger completions. I do get the completions but it is a very 'jerky' process: hit completion key, short pause while my continuing keystrokes have no effect, error is triggered, message is flashed, bell rings.... and then somehow completion happens and some of my typing appears.

At this point:

Debugger entered--Lisp error: (wrong-type-argument stringp nil)
  re-search-forward(nil 1800 t)
  #[0 "\304\242eV\205}\306\307\310D\311\307\312\306EDC\217\210\313y\210\212\314\304\242\315#\203R\302\203K\316 \307\317\313\320\321\322!\323\"\324\325%DC\216\326 )\262\203K\314\327\304\242\315#\210\202\303\242 \210\202)\304`\240\210\301\203\305\211\242T\240\330U\203\305\313\240\203\331\332\300!!\301V\203\333\334\335\"\210\202\207" [(22730 39045 22853 0) 0.1 nil (#[0 "\303\304!\211G Y\205\n\205\305\304\224!?\205\300\300\242B\240\207" [(nil) company-dabbrev-minimum-length company-dabbrev-ignore-invisible match-string-no-properties 0 invisible-p] 4 "\n\n(fn)"]) (1800) (0) err funcall #[0 "\300u\207" [-10000] 1 "\n\n(fn)"] error #[257 "\300\207" [nil] 2 "\n\n(fn IGNORED)"] 0 re-search-forward t match-data make-byte-code "\301\300\302\"\207" vconcat vector [set-match-data evaporate] 3 "\n\n(fn)" company-in-string-or-comment "\\s>\\|\\s!\\|\\s\"" 1 float-time time-since throw done company-time-out regexp] 8 "\n\n(fn)"]()
  funcall(#[0 "\304\242eV\205}\306\307\310D\311\307\312\306EDC\217\210\313y\210\212\314\304\242\315#\203R\302\203K\316 \307\317\313\320\321\322!\323\"\324\325%DC\216\326 )\262\203K\314\327\304\242\315#\210\202\303\242 \210\202)\304`\240\210\301\203\305\211\242T\240\330U\203\305\313\240\203\331\332\300!!\301V\203\333\334\335\"\210\202\207" [(22730 39045 22853 0) 0.1 nil (#[0 "\303\304!\211G Y\205\n\205\305\304\224!?\205\300\300\242B\240\207" [(nil) company-dabbrev-minimum-length company-dabbrev-ignore-invisible match-string-no-properties 0 invisible-p] 4 "\n\n(fn)"]) (1800) (0) err funcall #[0 "\300u\207" [-10000] 1 "\n\n(fn)"] error #[257 "\300\207" [nil] 2 "\n\n(fn IGNORED)"] 0 re-search-forward t match-data make-byte-code "\301\300\302\"\207" vconcat vector [set-match-data evaporate] 3 "\n\n(fn)" company-in-string-or-comment "\\s>\\|\\s!\\|\\s\"" 1 float-time time-since throw done company-time-out regexp] 8 "\n\n(fn)"])
  company-dabbrev--search-buffer("\\_<max_\\(\\sw\\|\\s_\\)*\\_>" 1801 nil (22730 39045 22853 0) 0.1 nil)
  company-dabbrev--search("\\_<max_\\(\\sw\\|\\s_\\)*\\_>" 0.1 (python-mode) nil)
  company-dabbrev-code(candidates #("max_" 0 4 (fontified t)))
  #[257 "\303 \210\301\203\304\300\"\202 \300G\nV\203\305\306\307\300\"!\202 \310!\207" [#("max_" 0 4 (fontified t)) #[257 "\211\203\301\242\307=\204\301\240\207\306\f\300\310!BC
\311\312DC\216\313\302\303\304\305$)\207" [#("max_" 0 4 (fontified t)) (done) #<buffer models.py<app>> #<window 3 on models.py<app>> 9359 1801 elpy-company-backend done company--preprocess-candidates funcall #[0 "?\205\n\303\211\211\207" [company-candidates company-backend company-candidates-cache nil] 3 "\n\n(fn)"] company-idle-begin company-backend company-candidates-cache] 6 "\n\n(fn CANDIDATES)"] company-minimum-prefix-length elpy-company--cache-clear elpy-company--cache-completions elpy--sort-and-strip-duplicates company-dabbrev-code candidates nil] 6 "\n\n(fn RESULT)"](nil)
  funcall(#[257 "\303 \210\301\203\304\300\"\202 \300G\nV\203\305\306\307\300\"!\202 \310!\207" [#("max_" 0 4 (fontified t)) #[257 "\211\203\301\242\307=\204\301\240\207\306\f\300\310!BC
\311\312DC\216\313\302\303\304\305$)\207" [#("max_" 0 4 (fontified t)) (done) #<buffer models.py<app>> #<window 3 on models.py<app>> 9359 1801 elpy-company-backend done company--preprocess-candidates funcall #[0 "?\205\n\303\211\211\207" [company-candidates company-backend company-candidates-cache nil] 3 "\n\n(fn)"] company-idle-begin company-backend company-candidates-cache] 6 "\n\n(fn CANDIDATES)"] company-minimum-prefix-length elpy-company--cache-clear elpy-company--cache-completions elpy--sort-and-strip-duplicates company-dabbrev-code candidates nil] 6 "\n\n(fn RESULT)"] nil)
  (save-current-buffer (set-buffer (elpy-promise-buffer promise)) (funcall success-callback value))
  (progn (save-current-buffer (set-buffer (elpy-promise-buffer promise)) (funcall success-callback value)))
  (if success-callback (progn (save-current-buffer (set-buffer (elpy-promise-buffer promise)) (funcall success-callback value))))
  (let ((success-callback (elpy-promise-success-callback promise))) (if success-callback (progn (save-current-buffer (set-buffer (elpy-promise-buffer promise)) (funcall success-callback value)))))
  (unwind-protect (let ((success-callback (elpy-promise-success-callback promise))) (if success-callback (progn (save-current-buffer (set-buffer (elpy-promise-buffer promise)) (funcall success-callback value))))) (elpy-promise-set-resolved promise))
  (progn (unwind-protect (let ((success-callback (elpy-promise-success-callback promise))) (if success-callback (progn (save-current-buffer (set-buffer (elpy-promise-buffer promise)) (funcall success-callback value))))) (elpy-promise-set-resolved promise)))
  (if (not (elpy-promise-resolved-p promise)) (progn (unwind-protect (let ((success-callback (elpy-promise-success-callback promise))) (if success-callback (progn (save-current-buffer (set-buffer ...) (funcall success-callback value))))) (elpy-promise-set-resolved promise))))
  elpy-promise-resolve([*elpy-promise* #[257 "\303 \210\301\203\304\300\"\202 \300G\nV\203\305\306\307\300\"!\202 \310!\207" [#("max_" 0 4 (fontified t)) #[257 "\211\203\301\242\307=\204\301\240\207\306\f\300\310!BC
\311\312DC\216\313\302\303\304\305$)\207" [#("max_" 0 4 (fontified t)) (done) #<buffer models.py<app>> #<window 3 on models.py<app>> 9359 1801 elpy-company-backend done company--preprocess-candidates funcall #[0 "?\205\n\303\211\211\207" [company-candidates company-backend company-candidates-cache nil] 3 "\n\n(fn)"] company-idle-begin company-backend company-candidates-cache] 6 "\n\n(fn CANDIDATES)"] company-minimum-prefix-length elpy-company--cache-clear elpy-company--cache-completions elpy--sort-and-strip-duplicates company-dabbrev-code candidates nil] 6 "\n\n(fn RESULT)"] elpy-rpc--default-error-callback #<buffer models.py<app>> nil] nil)
  elpy-rpc--handle-json(((id . 136) (result)))
  elpy-rpc--filter(#<process  *elpy-rpc [project:~/src/app/ python:/Users/svithlani/src/app/bin/python]*> "{\"result\": [], \"id\": 136}\n")
jorgenschaefer commented 7 years ago

Hm. That error happens in company-dabbrev. Elpy calls (company-dabbrev-code 'candidates "max_"), which then causes an internal error in company-mode. What version of company-mode do you have installed? Can you update that? Do you have any extension installed, or personal customizations, that affect dabbrev?

sawan commented 7 years ago

No, I have no company mode config, beyond enabling it globally.

I have the latest stable company, updated via package

Points to be noted:

  1. This error shows up in Emacs 24 on Mac OS X.
  2. Error does not show up in Emacs 25 on Windows.
  3. How about this comment? If elpy is using company internally, shouldn't it be recommending company-jedi as the backend?

I will be upgrading Emacs on my Mac to Emacs 25, will keep you posted.

sawan commented 7 years ago

Update:

I have installed Aquamacs (based on Emacs 25.1) and tried to reproduce this bug.

  1. Open a Django models.py.
  2. Go to an already defined model
  3. Define a new field:
    xx = models.

At this point, I get this error:

error in process filter: elpy-rpc--default-error-callback: Wrong type argument: stringp, nil
error in process filter: Wrong type argument: stringp, nil
  1. I M-x elpy-company-backend

After this no more errors, completions start working, navigations start working, etc.

Very strange. I do get the error once.

jorgenschaefer commented 7 years ago

company-jedi is a backend for company talking to the jedi library. Elpy provides its own backend to do this, so no, that should not be installed :-)

I do not understand this error. It happens inside company-dabbrev, and the arguments passed to company-dabbrev-code are perfectly valid. :-(

sawan commented 7 years ago

Yes, same confusion here.

The "good" news is that now on Emacs 25 on OS X, I get the error just once, after which things seem to continue fine.

I am going to try with a different port of Emacs 25 for OS X. Will report back.

Thanks for clarifying about company-jedi .

sawan commented 7 years ago

Totally fails in this Emacs, built from source:

mituharu Emacs for OS X

sawan commented 7 years ago

I get exactly the same error, only once:

error in process filter: elpy-rpc--default-error-callback: Wrong type argument: stringp, nil
error in process filter: Wrong type argument: stringp, nil

in this Emacs 25 for OS X.

I was previously using a version 24 from the same source; original report is related to that.

sawan commented 7 years ago

I spoke too soon:

I'm constantly getting this error. The experience is slightly better then before, I suspect this is because I have tried to remove autocomplete mode completely from my config.

Further, this error only seems to happen when attempting to complete things that are invalid in the Python context or there is an error in the immediate syntax.

jorgenschaefer commented 7 years ago

You could try and file this as an error to company-mode. As company functions are apparently called with correct input and the error happens there, maybe they know what's going on.

sawan commented 7 years ago

Thanks for your help so far!

dgutov commented 7 years ago

@sawan Which version of Company is this?

sawan commented 7 years ago

@dgutov

Emacs 25.1.1 (x86_64-apple-darwin13.4.0) of 2016-09-21 on builder10-9.porkrind.org
Company 0.9.2

company-backends: (elpy-company-backend elpy-company-backend company-bbdb company-nxml company-css company-eclim company-clang company-xcode company-cmake company-files
              (company-dabbrev-code company-gtags company-etags company-keywords)
              company-oddmuse company-dabbrev)

Used backend: (company-dabbrev-code company-gtags company-etags company-keywords)

Prefix: stop
Completions: none
sawan commented 7 years ago

@jorgenschaefer

Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates t)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates th)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates i)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates is)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates s)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates so)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates some)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates d)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates do)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates doc)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates docu)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates b)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates by)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates M)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates Ma)
Company: An error occurred in auto-begin
Company: backend (company-dabbrev-code company-gtags company-etags company-keywords) error "Wrong type argument: stringp, nil" with args (candidates Matc)
user-error: Cannot complete at point [4 times]

Does this mean the elpy-company backend is not being used?

sawan commented 7 years ago

@jorgenschaefer

I got these errors when trying to complete words within a Python comment string.

When I try the above on Windows Emacs 25.1 I get completions suggesting all the variables available in the Python context i.e. it works better then expected.

Error messages above happen on Mac.

dgutov commented 7 years ago

Does this mean the elpy-company backend is not being used?

Apparently so. Can you reproduce the problem without Elpy loaded?

sawan commented 7 years ago

@dgutov

Yes I was able to reproduce this is a vanilla **scratch** buffer.

I opened and closed a quote, placed the cursor within, started typing random text and tried to get completions via C-M-i.

Company: An error occurred in auto-begin
Company: backend company-dabbrev error "Wrong type argument: stringp, nil" with args (candidates dh)
Company: An error occurred in auto-begin
Company: backend company-dabbrev error "Wrong type argument: stringp, nil" with args (candidates dhd) [3 times]
Mark set

Super super annoying.... Same config works like a charm on Windows.

dgutov commented 7 years ago

Now we're getting somewhere. Does the error remain if you uninstall and reinstall Company?

Can you reproduce it starting with emacs -Q?

sawan commented 7 years ago

@dgutov

The package system won't allow me to uninstall Company as it is a dependency in other packages.

Could not reproduce using emacs -Q ; however this is expected right? As -Q means don't load any site libraries?

dgutov commented 7 years ago

The package system won't allow me to uninstall Company as it is a dependency in other packages.

You can note all of them, uninstall them, and then reinstall after the experiment. Or, create a new "home" directory and launch Emacs with HOME=/path/to/that/directory emacs.

Could not reproduce using emacs -Q ; however this is expected right?

In that session, you can add the directory company is installed to to load-path, load the package with (require 'company), and proceed from there.

sawan commented 7 years ago

@dgutov

I tried what you suggest and was not able to reproduce this bug in an Emacs -Q session.

So it looks like this is not a company mode issue.

@jorgenschaefer any ideas?

dgutov commented 7 years ago

@sawan Try bisecting your configuration: disable some stuff, see if the error remains, if so disable something else, and so on, until you find the exact culprit.

It can take some time, but it's probably the best advice here.

sawan commented 7 years ago

@dgutov

It will have to wait a while.

I accidentally opened a file in Visual Studio Code for Mac (Free IDE) based in Javascript -- was very surprised at the smooth experience. Made me realize how 'jerky' my typing workflow has become due to the errors discussed here -- type, pause for error and bell, type again, pause for error and bell, ....

It really sucks that this doesn't work in a straightforward way. It has to be a Mac specific thing in Emacs.

dgutov commented 7 years ago

It has to be a Mac specific thing in Emacs.

It might be, but I don't think so, at least from what the company-dabbrev-code error backrace shows. The error seems basic (and fairly impossible). You might have a broken build, but in the absence of similar user complaints that seems unlikely.

jorgenschaefer commented 7 years ago

The error seems basic (and fairly impossible).

That's a good summary, really. I have no idea how this could happen at all. And I do mean on a "this code can not cause this error" level of "can't happen". :-(

Thank you, @dgutov , for helping here, by the way!

sawan commented 7 years ago

Good news!

I deleted all .elc files in my installation, restarted Emacs and it all works now!

Thank you so much @jorgenschaefer and @dgutov. Beers on me when you are in Melbourne, Australia.