From 70fe77ca34d51d189d218f4f3d89781c4e186691 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 25 Apr 2013 15:28:37 +0800 Subject: [PATCH] Return object instead of function for remote object type. --- renderer/api/lib/remote.coffee | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/renderer/api/lib/remote.coffee b/renderer/api/lib/remote.coffee index 2ae0b9a..0c61853 100644 --- a/renderer/api/lib/remote.coffee +++ b/renderer/api/lib/remote.coffee @@ -6,42 +6,44 @@ generateFromPainObject = (plain) -> else if plain.type is 'error' throw new Error('Remote Error: ' + plain.value) - # A shadow class to represent the remote object. - class RemoteObject - constructor: () -> - if @constructor == RemoteObject - # Constructor call. - obj = ipc.sendChannelSync 'ATOM_INTERNAL_CONSTRUCTOR', plain.id, Array::slice.call(arguments) + ret = {} + if plain.type is 'function' + # A shadow class to represent the remote function object. + ret = + class RemoteObject + constructor: -> + if @constructor == RemoteObject + # Constructor call. + obj = ipc.sendChannelSync 'ATOM_INTERNAL_CONSTRUCTOR', plain.id, Array::slice.call(arguments) - # Returning object in constructor will replace constructed object - # with the returned object. - # http://stackoverflow.com/questions/1978049/what-values-can-a-constructor-return-to-avoid-returning-this - return generateFromPainObject obj - else - # Function call. - ret = ipc.sendChannelSync 'ATOM_INTERNAL_FUNCTION_CALL', plain.id, Array::slice.call(arguments) - generateFromPainObject ret + # Returning object in constructor will replace constructed object + # with the returned object. + # http://stackoverflow.com/questions/1978049/what-values-can-a-constructor-return-to-avoid-returning-this + return generateFromPainObject obj + else + # Function call. + ret = ipc.sendChannelSync 'ATOM_INTERNAL_FUNCTION_CALL', plain.id, Array::slice.call(arguments) + return generateFromPainObject ret - # Polulate shadow members. + # Polulate delegate members. for member in plain.members do (member) -> if member.type is 'function' - RemoteObject[member.name] = -> + ret[member.name] = -> # Call member function. ret = ipc.sendChannelSync 'ATOM_INTERNAL_MEMBER_CALL', plain.id, member.name, Array::slice.call(arguments) generateFromPainObject ret else - RemoteObject.__defineSetter__ member.name, (value) -> + ret.__defineSetter__ member.name, (value) -> # Set member data. ipc.sendChannelSync 'ATOM_INTERNAL_MEMBER_SET', plain.id, member.name, value - undefined - RemoteObject.__defineGetter__ member.name, -> + ret.__defineGetter__ member.name, -> # Get member data. ret = ipc.sendChannelSync 'ATOM_INTERNAL_MEMBER_GET', plain.id, member.name generateFromPainObject ret - RemoteObject + ret exports.require = (module) -> plain = ipc.sendChannelSync 'ATOM_INTERNAL_REQUIRE', module -- 2.7.4