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 = []