Skip to content

Commit aebcea7

Browse files
author
Brett Johnson
committed
Make progress on nested functions
1 parent 283096a commit aebcea7

File tree

2 files changed

+43
-15
lines changed

2 files changed

+43
-15
lines changed

Tests/4/test00.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@ function Y() {
1010
a = a + 1;
1111
return this;
1212
}
13+
function Start() {
14+
return X().Y();
15+
}
1316

1417
static function main() {
1518
var obj = new A();
16-
obj.X().Y();
19+
obj.Start();
1720

1821
return obj.a;
1922
}

state-manipulation.scm

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -153,21 +153,24 @@
153153
cfuncsinstance)]
154154

155155
; TODO: left off on line below
156-
;[evaled-instance (list '(classname Test) (get-instance-state (get-value-from-pair evaled-instance-pair)))]
157156
[evaled-instance (get-value-from-pair evaled-instance-pair)]
158-
;[debug (debug-func? list? evaled-instance evaled-instance-pair state name)]
159-
[evaled-state (push-variable-as-literal->state '.temp evaled-instance (get-state-from-pair evaled-instance-pair))]
160-
[dottedname (list '.temp (dotted-class-call (arglist-dot name)))]
157+
[evaled-state (push-variable-as-literal->state (find-highest-var name) evaled-instance (get-state-from-pair evaled-instance-pair))]
158+
[dottedname (list (find-highest-var name) (dotted-class-call (arglist-dot name)))]
161159
[evaled-function (eval-function-post-name-eval (dotted-class-call dottedname)
162160
args
163161
evaled-state
164162
(construct-dotted-state dottedname evaled-state)
165163
(get-current-class (construct-dotted-state dottedname evaled-state) cfuncsinstance)
166-
#t
164+
#f
167165
cfuncsinstance)]
168166
[function-return (get-value-from-pair evaled-function)]
169-
[function-state (get-state-from-pair evaled-function)])
170-
(list function-return (update-class-instance (dotted-class-instance dottedname) (extract-new-class-instance-state function-state) evaled-state))))
167+
[function-state (get-state-from-pair evaled-function)]
168+
[debg (delete-this state)]
169+
[debug2 (delete-this2 function-state)]
170+
[debug3 (delete-this (G-merge-states->state state function-state))])
171+
(cond
172+
((eq? (dotted-class-instance dottedname) '.temp) (list function-return (G-merge-states->state state function-state)))
173+
(else (list function-return (update-class-instance (dotted-class-instance dottedname) (extract-new-class-instance-state function-state) evaled-state))))))
171174
((dot-expr? name)
172175
(let* ([dottedname (arglist-dot name)]
173176
[evaled-function (eval-function-post-name-eval (dotted-class-call dottedname)
@@ -180,8 +183,30 @@
180183
[function-return (get-value-from-pair evaled-function)]
181184
[function-state (get-state-from-pair evaled-function)])
182185
(list function-return (update-class-instance (dotted-class-instance dottedname) (extract-new-class-instance-state function-state) state))))
186+
183187
(else (eval-function-post-name-eval name args state state default-currentclass #t cfuncsinstance)))))
184188

189+
190+
(define delete-this2
191+
(lambda (arg) arg))
192+
;(trace delete-this2)
193+
(define delete-this
194+
(lambda (arg) arg))
195+
;(trace delete-this)
196+
197+
(define find-highest-var
198+
(lambda (dotexpr)
199+
(cond
200+
((atom? dotexpr) '.temp)
201+
((list? (dotted-class-instance (arglist-dot dotexpr)))
202+
(cond
203+
((eq? (car (dotted-class-instance (arglist-dot dotexpr))) 'new) '.temp)
204+
(else (find-highest-var (dotted-class-instance (arglist-dot dotexpr))))))
205+
((eq? 'this (dotted-class-instance (arglist-dot dotexpr))) '.temp)
206+
((eq? 'super (dotted-class-instance (arglist-dot dotexpr))) '.temp)
207+
((eq? 'funcall (arglist-head dotexpr)) '.temp)
208+
(else (dotted-class-instance (arglist-dot dotexpr))))))
209+
185210
(define get-base-class
186211
(lambda (state cfuncsinstance)
187212
(get-value-from-pair (G-value-lookup->value_state '.class state cfuncsinstance))))
@@ -251,11 +276,8 @@
251276
function-state
252277
(G-pop-to-stack-divider->state
253278
(get-state-from-pair
254-
(delete-this
255-
evaluate-function-call))))))))
256-
(define delete-this
257-
(lambda (arg) arg))
258-
;(trace delete-this)
279+
evaluate-function-call)))))))
280+
259281
;(trace eval-function-post-name-eval)
260282
(define evaluate-actual-args-for-state
261283
(lambda (actual state cfuncsinstance)
@@ -297,7 +319,7 @@
297319
(lambda (instancename state)
298320
(append (G-get-instance-state instancename state)
299321
(G-pop-to-class-level->state state))))
300-
;(trace add-class-instance-to-state)
322+
301323

302324
(define extract-new-class-instance-state
303325
(lambda (state)
@@ -1128,6 +1150,7 @@
11281150
(lambda (orig-state mod-state)
11291151
(cond
11301152
((null? mod-state) orig-state)
1153+
((null? orig-state) '())
11311154
(else (cons (get-top-scope mod-state)
11321155
(merge (get-tail-scope orig-state)(get-tail-scope mod-state)))))))
11331156

@@ -1187,7 +1210,9 @@
11871210
(define G-eval-class-closure->state
11881211
(lambda (classname state)
11891212
(cond
1190-
((null? (G-get-class-superclass classname state)) (evaluate-closure->state classname state))
1213+
;push-variable as literal code is wrong, it produces an extra scope
1214+
;looks wrong, don't touch
1215+
((null? (G-get-class-superclass classname state)) (list (get-top-scope (evaluate-closure->state classname state))))
11911216
(else (cons (get-top-scope
11921217
(evaluate-closure->state classname state)) (G-eval-class-closure->state (G-get-class-superclass classname state) state))))))
11931218

0 commit comments

Comments
 (0)