Mercurial > repos > tabletprog
comparison jsbackend.js @ 20:bf03c9f0dd55
Initial work on proper property support
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 25 Mar 2012 16:52:11 -0700 |
parents | 132c7756860e |
children | 6c8ae6b47ab5 |
comparison
equal
deleted
inserted
replaced
19:132c7756860e | 20:bf03c9f0dd55 |
---|---|
73 } | 73 } |
74 var args = this.args.slice(0, this.args.length); | 74 var args = this.args.slice(0, this.args.length); |
75 if (this.receiver) { | 75 if (this.receiver) { |
76 args.splice(0, 0, this.receiver); | 76 args.splice(0, 0, this.receiver); |
77 } | 77 } |
78 console.log(this); | |
79 console.log('Checking symbol table for ' + name); | |
78 var funinfo = this.symbols.find(name); | 80 var funinfo = this.symbols.find(name); |
79 if (!funinfo) { | 81 if (!funinfo || funinfo.def instanceof setter) { |
80 var receiver = args[0]; | 82 var receiver = args[0]; |
81 args.splice(0, 1); | 83 args.splice(0, 1); |
82 for (var i in args) { | 84 for (var i in args) { |
83 args[i] = args[i].toJS(); | 85 args[i] = args[i].toJS(); |
84 } | 86 } |
85 return receiver.toJS(true) + '.' + (new symbol(name, this.symbols)).toJS() + '(' + args.join(', ') + ')'; | 87 var rJS = receiver.toJS(true); |
88 var jsName = (new symbol(name, this.symbols)).toJS(); | |
89 if ((name[name.length-1] == '!' && args.length == 1) || (funinfo && funinfo.def instanceof setter)) { | |
90 return '(' + rJS + '.' + jsName + ' = ' + args[0] + ', ' + rJS + ')' | |
91 } else { | |
92 return rJS + '.' + jsName + '(' + args.join(', ') + ')'; | |
93 } | |
86 } | 94 } |
95 var ret = ''; | |
87 switch(funinfo.type) | 96 switch(funinfo.type) |
88 { | 97 { |
89 case 'self': | 98 case 'self': |
90 if (args.length < funinfo.def.args.length || funinfo.def.args[0].name != 'self') { | 99 if (args.length < funinfo.def.args.length || funinfo.def.args[0].name != 'self') { |
91 var receiver = new symbol('self', this.symbols); | 100 var receiver = new symbol('self', this.symbols); |
92 } else { | 101 } else { |
93 var receiver = args[0]; | 102 var receiver = args[0]; |
94 args.splice(0, 1); | 103 args.splice(0, 1); |
95 } | 104 } |
96 for (var i in args) { | 105 ret = receiver.toJS(true) + '.'; |
97 args[i] = args[i].toJS(); | 106 break; |
98 } | |
99 return receiver.toJS(true) + '.' + (new symbol(name, this.symbols)).toJS() + '(' + args.join(', ') + ')'; | |
100 case 'parent': | 107 case 'parent': |
101 var ret = 'this'; | 108 ret = 'this'; |
102 for (var i = 0; i < funinfo.depth; ++i) { | 109 for (var i = 0; i < funinfo.depth; ++i) { |
103 ret += '.parent'; | 110 ret += '.parent'; |
104 } | 111 } |
105 for (var i in args) { | 112 break; |
106 args[i] = args[i].toJS(); | |
107 } | |
108 ret += (new symbol(name, this.symbols)).toJS() + '(' + args.join(', ') + ')'; | |
109 return ret; | |
110 case 'local': | |
111 case 'upvar': | |
112 case 'foreign': | |
113 for (var i in args) { | |
114 args[i] = args[i].toJS(); | |
115 } | |
116 return (new symbol(name, this.symbols)).toJS() + '(' + args.join(', ') + ')'; | |
117 } | 113 } |
114 for (var i in args) { | |
115 args[i] = args[i].toJS(); | |
116 } | |
117 return ret + (new symbol(name, this.symbols)).toJS() + '(' + args.join(', ') + ')'; | |
118 } | 118 } |
119 | 119 |
120 object.prototype.toJS = function() { | 120 object.prototype.toJS = function() { |
121 var messages = this.messages; | 121 var messages = this.messages; |
122 var compiled = [] | 122 var compiled = [] |