398 compiler codeError: encodedLiteral, ' expected' at: positionVar. |
398 compiler codeError: encodedLiteral, ' expected' at: positionVar. |
399 compiler dedent. |
399 compiler dedent. |
400 compiler add: '].'. |
400 compiler add: '].'. |
401 ! |
401 ! |
402 |
402 |
|
403 visitMappedActionNode: node |
|
404 | blockNode blockBody | |
|
405 |
|
406 blockNode := node block ast copy. |
|
407 blockBody := blockNode body. |
|
408 |
|
409 "Block return value is return value of last statement. |
|
410 So if the method is not inline, make last statement a return. |
|
411 if the method is inline, make it assignment to retvalVar." |
|
412 compiler currentMethod isInline ifTrue:[ |
|
413 | assignment | |
|
414 |
|
415 assignment := RBAssignmentNode variable: (RBVariableNode named: self retvalVar) value: blockBody statements last. |
|
416 blockBody replaceNode: blockBody statements last withNode: assignment. |
|
417 ] ifFalse:[ |
|
418 | return | |
|
419 |
|
420 return := RBReturnNode value: blockBody statements last. |
|
421 blockBody replaceNode: blockBody statements last withNode: return. |
|
422 ]. |
|
423 |
|
424 compiler codeStoreValueOf: [ self visit: node child ] intoVariable: self retvalVar. |
|
425 compiler codeIf: 'error' then: [ |
|
426 compiler codeReturn: 'failure'. |
|
427 ] else: [ |
|
428 "First, extract mapped elements to variable..." |
|
429 blockNode arguments withIndexDo:[ :arg :idx | |
|
430 compiler allocateTemporaryVariableNamed: arg name. |
|
431 compiler codeAssign: (self retvalVar , ' at: ', idx printString) to: arg name. |
|
432 compiler add: '.'. |
|
433 ]. |
|
434 compiler code: blockBody. |
|
435 ] |
|
436 |
|
437 "Created: / 02-06-2015 / 17:28:55 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
438 "Modified: / 03-06-2015 / 06:10:09 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
439 ! |
|
440 |
403 visitMessagePredicateNode: node |
441 visitMessagePredicateNode: node |
404 compiler add: '(context peek ', node message, ') ifFalse: ['. |
442 compiler add: '(context peek ', node message, ') ifFalse: ['. |
405 compiler codeError: 'predicate not found'. |
443 compiler codeError: 'predicate not found'. |
406 compiler add: '] ifTrue: [ '. |
444 compiler add: '] ifTrue: [ '. |
407 compiler codeReturn: ' context next'. |
445 compiler codeReturn: ' context next'. |