UNPKG

amber

Version:

An implementation of the Smalltalk language that runs on top of the JS runtime.

1,444 lines (1,374 loc) 133 kB
define(["amber/boot", "amber_core/Compiler-AST", "amber_core/Compiler-Semantic", "amber_core/Kernel-Exceptions", "amber_core/Kernel-Methods", "amber_core/Kernel-Objects"], function($boot){"use strict"; if(!("nilAsValue" in $boot))$boot.nilAsValue=$boot.nilAsReceiver; var $core=$boot.api,nil=$boot.nilAsValue,$nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals; $core.addPackage("Compiler-Interpreter"); ($core.packageDescriptors||$core.packages)["Compiler-Interpreter"].innerEval = function (expr) { return eval(expr); }; ($core.packageDescriptors||$core.packages)["Compiler-Interpreter"].transport = {"type":"amd","amdNamespace":"amber_core"}; $core.addClass("AIBlockClosure", $globals.BlockClosure, ["node", "outerContext"], "Compiler-Interpreter"); //>>excludeStart("ide", pragmas.excludeIdeData); $globals.AIBlockClosure.comment="I am a special `BlockClosure` subclass used by an interpreter to interpret a block node.\x0a\x0aWhile I am polymorphic with `BlockClosure`, some methods such as `#new` will raise interpretation errors. Unlike a `BlockClosure`, my instance are not JavaScript functions.\x0a\x0aEvaluating an instance will result in interpreting the `node` instance variable (instance of `BlockNode`)."; //>>excludeEnd("ide"); $core.addMethod( $core.method({ selector: "applyTo:arguments:", protocol: "evaluating", fn: function (anObject,aCollection){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._interpreterError(); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"applyTo:arguments:",{anObject:anObject,aCollection:aCollection},$globals.AIBlockClosure)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anObject", "aCollection"], source: "applyTo: anObject arguments: aCollection\x0a\x09self interpreterError", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["interpreterError"] }), $globals.AIBlockClosure); $core.addMethod( $core.method({ selector: "compiledSource", protocol: "accessing", fn: function (){ var self=this,$self=this; return "[ AST Block closure ]"; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "compiledSource\x0a\x09\x22Unlike blocks, the receiver doesn't represent a JS function\x22\x0a\x09\x0a\x09^ '[ AST Block closure ]'", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.AIBlockClosure); $core.addMethod( $core.method({ selector: "currySelf", protocol: "converting", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._interpreterError(); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"currySelf",{},$globals.AIBlockClosure)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "currySelf\x0a\x09self interpreterError", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["interpreterError"] }), $globals.AIBlockClosure); $core.addMethod( $core.method({ selector: "initializeWithContext:node:", protocol: "initialization", fn: function (aContext,aNode){ var self=this,$self=this; $self["@node"]=aNode; $self["@outerContext"]=aContext; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aContext", "aNode"], source: "initializeWithContext: aContext node: aNode\x0a\x09node := aNode.\x0a\x09outerContext := aContext", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.AIBlockClosure); $core.addMethod( $core.method({ selector: "interpreterError", protocol: "error handling", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv($globals.ASTInterpreterError)._signal_("Method cannot be interpreted by the interpreter."); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"interpreterError",{},$globals.AIBlockClosure)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "interpreterError\x0a\x09ASTInterpreterError signal: 'Method cannot be interpreted by the interpreter.'", referencedClasses: ["ASTInterpreterError"], //>>excludeEnd("ide"); messageSends: ["signal:"] }), $globals.AIBlockClosure); $core.addMethod( $core.method({ selector: "numArgs", protocol: "accessing", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv($recv($self["@node"])._temps())._size(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"numArgs",{},$globals.AIBlockClosure)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "numArgs\x0a\x09^ node temps size", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["size", "temps"] }), $globals.AIBlockClosure); $core.addMethod( $core.method({ selector: "value", protocol: "evaluating", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $self._valueWithPossibleArguments_([]); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"value",{},$globals.AIBlockClosure)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "value\x0a\x09^ self valueWithPossibleArguments: #()", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["valueWithPossibleArguments:"] }), $globals.AIBlockClosure); $core.addMethod( $core.method({ selector: "value:", protocol: "evaluating", fn: function (anArgument){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $self._valueWithPossibleArguments_([anArgument]); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"value:",{anArgument:anArgument},$globals.AIBlockClosure)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anArgument"], source: "value: anArgument\x0a\x09^ self valueWithPossibleArguments: {anArgument}", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["valueWithPossibleArguments:"] }), $globals.AIBlockClosure); $core.addMethod( $core.method({ selector: "value:value:", protocol: "evaluating", fn: function (firstArgument,secondArgument){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $self._valueWithPossibleArguments_([firstArgument,secondArgument]); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"value:value:",{firstArgument:firstArgument,secondArgument:secondArgument},$globals.AIBlockClosure)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["firstArgument", "secondArgument"], source: "value: firstArgument value: secondArgument\x0a\x09^ self valueWithPossibleArguments: {firstArgument . secondArgument}", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["valueWithPossibleArguments:"] }), $globals.AIBlockClosure); $core.addMethod( $core.method({ selector: "value:value:value:", protocol: "evaluating", fn: function (firstArgument,secondArgument,thirdArgument){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $self._valueWithPossibleArguments_([firstArgument,secondArgument,thirdArgument]); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"value:value:value:",{firstArgument:firstArgument,secondArgument:secondArgument,thirdArgument:thirdArgument},$globals.AIBlockClosure)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["firstArgument", "secondArgument", "thirdArgument"], source: "value: firstArgument value: secondArgument value: thirdArgument\x0a\x09^ self valueWithPossibleArguments: {firstArgument . secondArgument . thirdArgument}", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["valueWithPossibleArguments:"] }), $globals.AIBlockClosure); $core.addMethod( $core.method({ selector: "valueWithPossibleArguments:", protocol: "evaluating", fn: function (aCollection){ var self=this,$self=this; var context,sequenceNode; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2,$3; context=$recv($self["@outerContext"])._newInnerContext(); $1=$recv($recv($recv($self["@node"])._dagChildren())._first())._copy(); $recv($1)._parent_(nil); sequenceNode=$recv($1)._yourself(); $recv($recv(sequenceNode)._temps())._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv(context)._defineLocal_(each); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx2.sendIdx["defineLocal:"]=1; //>>excludeEnd("ctx"); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)}); //>>excludeEnd("ctx"); })); $recv($recv($self["@node"])._parameters())._withIndexDo_((function(each,index){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); $recv(context)._defineLocal_(each); return $recv(context)._localAt_put_(each,$recv(aCollection)._at_ifAbsent_(index,(function(){ return nil; }))); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each,index:index},$ctx1,2)}); //>>excludeEnd("ctx"); })); $2=$recv(context)._interpreter(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["interpreter"]=1; //>>excludeEnd("ctx"); $recv($2)._node_(sequenceNode); $recv($2)._enterNode(); $recv($2)._proceed(); $3=$recv($self["@outerContext"])._interpreter(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["interpreter"]=2; //>>excludeEnd("ctx"); $recv($3)._setNonLocalReturnFromContext_(context); return $recv($recv(context)._interpreter())._pop(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"valueWithPossibleArguments:",{aCollection:aCollection,context:context,sequenceNode:sequenceNode},$globals.AIBlockClosure)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aCollection"], source: "valueWithPossibleArguments: aCollection\x0a\x09| context sequenceNode |\x0a\x09context := outerContext newInnerContext.\x0a\x0a\x09\x22Interpret a copy of the sequence node to avoid creating a new AIBlockClosure\x22\x0a\x09sequenceNode := node dagChildren first copy\x0a\x09\x09parent: nil;\x0a\x09\x09yourself.\x0a\x09\x09\x0a\x09\x22Define locals in the context\x22\x0a\x09sequenceNode temps do: [ :each |\x0a\x09\x09context defineLocal: each ].\x0a\x09\x09\x0a\x09\x22Populate the arguments into the context locals\x22\x09\x0a\x09node parameters withIndexDo: [ :each :index |\x0a\x09\x09context defineLocal: each.\x0a\x09\x09context localAt: each put: (aCollection at: index ifAbsent: [ nil ]) ].\x0a\x0a\x09\x22Interpret the first node of the BlockSequenceNode\x22\x0a\x09context interpreter\x0a\x09\x09node: sequenceNode;\x0a\x09\x09enterNode;\x0a\x09\x09proceed.\x0a\x09\x09\x0a\x09outerContext interpreter\x0a\x09\x09setNonLocalReturnFromContext: context.\x0a\x09\x09\x0a\x09^ context interpreter pop", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["newInnerContext", "parent:", "copy", "first", "dagChildren", "yourself", "do:", "temps", "defineLocal:", "withIndexDo:", "parameters", "localAt:put:", "at:ifAbsent:", "node:", "interpreter", "enterNode", "proceed", "setNonLocalReturnFromContext:", "pop"] }), $globals.AIBlockClosure); $core.addMethod( $core.method({ selector: "forContext:node:", protocol: "instance creation", fn: function (aContext,aNode){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=$self._new(); $recv($1)._initializeWithContext_node_(aContext,aNode); return $recv($1)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"forContext:node:",{aContext:aContext,aNode:aNode},$globals.AIBlockClosure.a$cls)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aContext", "aNode"], source: "forContext: aContext node: aNode\x0a\x09^ self new\x0a\x09\x09initializeWithContext: aContext node: aNode;\x0a\x09\x09yourself", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["initializeWithContext:node:", "new", "yourself"] }), $globals.AIBlockClosure.a$cls); $core.addClass("AIContext", $globals.MethodContext, ["outerContext", "innerContext", "pc", "locals", "selector", "index", "sendIndexes", "evaluatedSelector", "ast", "interpreter", "supercall"], "Compiler-Interpreter"); //>>excludeStart("ide", pragmas.excludeIdeData); $globals.AIContext.comment="I am like a `MethodContext`, used by the `ASTInterpreter`.\x0aUnlike a `MethodContext`, my instances are not read-only.\x0a\x0aWhen debugging, my instances are created by copying the current `MethodContext` (thisContext)"; //>>excludeEnd("ide"); $core.addMethod( $core.method({ selector: "arguments", protocol: "interpreting", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv($recv($self._ast())._arguments())._collect_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $self._localAt_ifAbsent_(each,(function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx3) { //>>excludeEnd("ctx"); return $self._error_("Argument not in context"); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx3) {$ctx3.fillBlock({},$ctx2,2)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"arguments",{},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "arguments\x0a\x09^ self ast arguments collect: [ :each |\x0a\x09\x09self localAt: each ifAbsent: [ self error: 'Argument not in context' ] ]", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["collect:", "arguments", "ast", "localAt:ifAbsent:", "error:"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "ast", protocol: "interpreting", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2,$3,$receiver; $1=$self._isBlockContext(); if($core.assert($1)){ $2=$self._outerContext(); if(($receiver = $2) == null || $receiver.a$nil){ return $2; } else { var context; context=$receiver; return $recv(context)._ast(); } } $3=$self["@ast"]; if(($receiver = $3) == null || $receiver.a$nil){ $self._initializeAST(); } else { $3; } return $self["@ast"]; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"ast",{},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "ast\x0a\x09self isBlockContext ifTrue: [ \x0a\x09\x09^ self outerContext ifNotNil: [ :context | context ast ] ].\x0a\x0a\x09ast ifNil: [ self initializeAST ].\x0a\x09^ ast", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["ifTrue:", "isBlockContext", "ifNotNil:", "outerContext", "ast", "ifNil:", "initializeAST"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "basicLocalAt:", protocol: "private", fn: function (aString){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv($self._locals())._at_(aString); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"basicLocalAt:",{aString:aString},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "basicLocalAt: aString\x0a\x09^ self locals at: aString", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["at:", "locals"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "basicLocalAt:put:", protocol: "private", fn: function (aString,anObject){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv($self._locals())._at_put_(aString,anObject); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"basicLocalAt:put:",{aString:aString,anObject:anObject},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString", "anObject"], source: "basicLocalAt: aString put: anObject\x0a\x09self locals at: aString put: anObject", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["at:put:", "locals"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "basicReceiver", protocol: "interpreting", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $self._localAt_("self"); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"basicReceiver",{},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "basicReceiver\x0a\x09^ self localAt: 'self'", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["localAt:"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "defineLocal:", protocol: "accessing", fn: function (aString){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv($self._locals())._at_put_(aString,nil); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"defineLocal:",{aString:aString},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "defineLocal: aString\x0a\x09self locals at: aString put: nil", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["at:put:", "locals"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "evaluate:on:", protocol: "evaluating", fn: function (aString,anEvaluator){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv(anEvaluator)._evaluate_context_(aString,self); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"evaluate:on:",{aString:aString,anEvaluator:anEvaluator},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString", "anEvaluator"], source: "evaluate: aString on: anEvaluator\x0a\x09^ anEvaluator evaluate: aString context: self", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["evaluate:context:"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "evaluateNode:", protocol: "evaluating", fn: function (aNode){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=$recv($globals.ASTInterpreter)._new(); $recv($1)._context_(self); $recv($1)._node_(aNode); $recv($1)._enterNode(); $recv($1)._proceed(); return $recv($1)._result(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"evaluateNode:",{aNode:aNode},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "evaluateNode: aNode\x0a\x09^ ASTInterpreter new\x0a\x09\x09context: self;\x0a\x09\x09node: aNode;\x0a\x09\x09enterNode;\x0a\x09\x09proceed;\x0a\x09\x09result", referencedClasses: ["ASTInterpreter"], //>>excludeEnd("ide"); messageSends: ["context:", "new", "node:", "enterNode", "proceed", "result"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "evaluatedSelector", protocol: "accessing", fn: function (){ var self=this,$self=this; return $self["@evaluatedSelector"]; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "evaluatedSelector\x0a\x09^ evaluatedSelector", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "evaluatedSelector:", protocol: "accessing", fn: function (aString){ var self=this,$self=this; $self["@evaluatedSelector"]=aString; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "evaluatedSelector: aString\x0a\x09evaluatedSelector := aString", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "index", protocol: "accessing", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$receiver; $1=$self["@index"]; if(($receiver = $1) == null || $receiver.a$nil){ return (0); } else { return $1; } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"index",{},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "index\x0a\x09^ index ifNil: [ 0 ]", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["ifNil:"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "index:", protocol: "accessing", fn: function (anInteger){ var self=this,$self=this; $self["@index"]=anInteger; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anInteger"], source: "index: anInteger\x0a\x09index := anInteger", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "initializeAST", protocol: "initialization", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=$self._method(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["method"]=1; //>>excludeEnd("ctx"); $self["@ast"]=$recv($1)._ast(); $recv($recv($globals.SemanticAnalyzer)._on_($recv($self._method())._methodClass()))._visit_($self["@ast"]); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"initializeAST",{},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "initializeAST\x0a\x09ast := self method ast.\x0a\x09(SemanticAnalyzer on: self method methodClass)\x0a\x09\x09visit: ast", referencedClasses: ["SemanticAnalyzer"], //>>excludeEnd("ide"); messageSends: ["ast", "method", "visit:", "on:", "methodClass"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "initializeFromMethodContext:", protocol: "initialization", fn: function (aMethodContext){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2,$3,$receiver; $self._evaluatedSelector_($recv(aMethodContext)._evaluatedSelector()); $self._index_($recv(aMethodContext)._index()); $self._sendIndexes_($recv(aMethodContext)._sendIndexes()); $self._receiver_($recv(aMethodContext)._receiver()); $self._supercall_($recv(aMethodContext)._supercall()); $self._selector_($recv(aMethodContext)._selector()); $1=$recv(aMethodContext)._outerContext(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["outerContext"]=1; //>>excludeEnd("ctx"); if(($receiver = $1) == null || $receiver.a$nil){ $1; } else { var outer; outer=$receiver; $2=$recv(outer)._methodContext(); if(($receiver = $2) == null || $receiver.a$nil){ $2; } else { $self._outerContext_($recv($self._class())._fromMethodContext_($recv(aMethodContext)._outerContext())); } $3=$recv(aMethodContext)._locals(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["locals"]=1; //>>excludeEnd("ctx"); $recv($3)._keysAndValuesDo_((function(key,value){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv($self._locals())._at_put_(key,value); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({key:key,value:value},$ctx1,3)}); //>>excludeEnd("ctx"); })); } return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"initializeFromMethodContext:",{aMethodContext:aMethodContext},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aMethodContext"], source: "initializeFromMethodContext: aMethodContext\x0a\x0a\x09self\x0a\x09\x09evaluatedSelector: aMethodContext evaluatedSelector;\x0a\x09\x09index: aMethodContext index;\x0a\x09\x09sendIndexes: aMethodContext sendIndexes;\x0a\x09\x09receiver: aMethodContext receiver;\x0a\x09\x09supercall: aMethodContext supercall;\x0a\x09\x09selector: aMethodContext selector.\x0a\x09\x09\x0a\x09aMethodContext outerContext ifNotNil: [ :outer |\x0a\x09\x09\x22If the method context is nil, the block was defined in JS, so ignore it\x22\x0a\x09\x09outer methodContext ifNotNil: [\x0a\x09\x09\x09self outerContext: (self class fromMethodContext: aMethodContext outerContext) ].\x0a\x09\x09\x09aMethodContext locals keysAndValuesDo: [ :key :value |\x0a\x09\x09\x09\x09self locals at: key put: value ] ]", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["evaluatedSelector:", "evaluatedSelector", "index:", "index", "sendIndexes:", "sendIndexes", "receiver:", "receiver", "supercall:", "supercall", "selector:", "selector", "ifNotNil:", "outerContext", "methodContext", "outerContext:", "fromMethodContext:", "class", "keysAndValuesDo:", "locals", "at:put:"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "initializeInterpreter", protocol: "initialization", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2,$receiver; $1=$recv($globals.ASTInterpreter)._new(); $recv($1)._context_(self); $self["@interpreter"]=$recv($1)._yourself(); $2=$self._innerContext(); if(($receiver = $2) == null || $receiver.a$nil){ $2; } else { $self._setupInterpreter_($self["@interpreter"]); } return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"initializeInterpreter",{},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "initializeInterpreter\x0a\x09interpreter := ASTInterpreter new\x0a\x09\x09context: self;\x0a\x09\x09yourself.\x0a\x09\x0a\x09self innerContext ifNotNil: [\x0a\x09\x09self setupInterpreter: interpreter ]", referencedClasses: ["ASTInterpreter"], //>>excludeEnd("ide"); messageSends: ["context:", "new", "yourself", "ifNotNil:", "innerContext", "setupInterpreter:"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "initializeLocals", protocol: "initialization", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self["@locals"]=$recv($globals.Dictionary)._new(); $recv($self["@locals"])._at_put_("thisContext",self); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"initializeLocals",{},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "initializeLocals\x0a\x09locals := Dictionary new.\x0a\x09locals at: 'thisContext' put: self.", referencedClasses: ["Dictionary"], //>>excludeEnd("ide"); messageSends: ["new", "at:put:"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "innerContext", protocol: "accessing", fn: function (){ var self=this,$self=this; return $self["@innerContext"]; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "innerContext\x0a\x09^ innerContext", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "innerContext:", protocol: "accessing", fn: function (anAIContext){ var self=this,$self=this; $self["@innerContext"]=anAIContext; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anAIContext"], source: "innerContext: anAIContext\x0a\x09innerContext := anAIContext", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "interpreter", protocol: "interpreting", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$receiver; $1=$self["@interpreter"]; if(($receiver = $1) == null || $receiver.a$nil){ $self._initializeInterpreter(); } else { $1; } return $self["@interpreter"]; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"interpreter",{},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "interpreter\x0a\x09interpreter ifNil: [ self initializeInterpreter ].\x0a\x09^ interpreter", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["ifNil:", "initializeInterpreter"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "interpreter:", protocol: "interpreting", fn: function (anInterpreter){ var self=this,$self=this; $self["@interpreter"]=anInterpreter; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anInterpreter"], source: "interpreter: anInterpreter\x0a\x09interpreter := anInterpreter", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "isTopContext", protocol: "testing", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv($self._innerContext())._isNil(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"isTopContext",{},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isTopContext\x0a\x09^ self innerContext isNil", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["isNil", "innerContext"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "localAt:", protocol: "accessing", fn: function (aString){ var self=this,$self=this; var context; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); context=$self._lookupContextForLocal_(aString); return $recv(context)._basicLocalAt_(aString); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"localAt:",{aString:aString,context:context},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "localAt: aString\x0a\x09\x22Lookup the local value up to the method context\x22\x0a\x0a\x09| context |\x0a\x09\x0a\x09context := self lookupContextForLocal: aString.\x0a\x09^ context basicLocalAt: aString", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["lookupContextForLocal:", "basicLocalAt:"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "localAt:ifAbsent:", protocol: "accessing", fn: function (aString,aBlock){ var self=this,$self=this; var context; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $early={}; try { context=$self._lookupContextForLocal_ifNone_(aString,(function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); throw $early=[$recv(aBlock)._value()]; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)}); //>>excludeEnd("ctx"); })); return $recv(context)._basicLocalAt_(aString); } catch(e) {if(e===$early)return e[0]; throw e} //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"localAt:ifAbsent:",{aString:aString,aBlock:aBlock,context:context},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString", "aBlock"], source: "localAt: aString ifAbsent: aBlock\x0a\x09\x22Lookup the local value up to the method context\x22\x0a\x0a\x09| context |\x0a\x09\x0a\x09context := self \x09\x0a\x09\x09lookupContextForLocal: aString \x0a\x09\x09ifNone: [ ^ aBlock value ].\x0a\x09\x0a\x09^ context basicLocalAt: aString", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["lookupContextForLocal:ifNone:", "value", "basicLocalAt:"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "localAt:put:", protocol: "accessing", fn: function (aString,anObject){ var self=this,$self=this; var context; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); context=$self._lookupContextForLocal_(aString); $recv(context)._basicLocalAt_put_(aString,anObject); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"localAt:put:",{aString:aString,anObject:anObject,context:context},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString", "anObject"], source: "localAt: aString put: anObject\x0a\x09| context |\x0a\x09\x0a\x09context := self lookupContextForLocal: aString.\x0a\x09context basicLocalAt: aString put: anObject", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["lookupContextForLocal:", "basicLocalAt:put:"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "locals", protocol: "accessing", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$receiver; $1=$self["@locals"]; if(($receiver = $1) == null || $receiver.a$nil){ $self._initializeLocals(); } else { $1; } return $self["@locals"]; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"locals",{},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "locals\x0a\x09locals ifNil: [ self initializeLocals ].\x0a\x09\x0a\x09^ locals", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["ifNil:", "initializeLocals"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "lookupContextForLocal:", protocol: "private", fn: function (aString){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $self._lookupContextForLocal_ifNone_(aString,(function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $self._variableNotFound(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"lookupContextForLocal:",{aString:aString},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "lookupContextForLocal: aString\x0a\x09\x22Lookup the context defining the local named `aString` \x0a\x09up to the method context\x22\x0a\x0a\x09^ self \x0a\x09\x09lookupContextForLocal: aString \x0a\x09\x09ifNone: [ self variableNotFound ]", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["lookupContextForLocal:ifNone:", "variableNotFound"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "lookupContextForLocal:ifNone:", protocol: "private", fn: function (aString,aBlock){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; return $recv($self._locals())._at_ifPresent_ifAbsent_(aString,(function(){ return self; }),(function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); $1=$self._outerContext(); return $recv($1)._ifNil_ifNotNil_(aBlock,(function(context){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx3) { //>>excludeEnd("ctx"); return $recv(context)._lookupContextForLocal_(aString); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx3) {$ctx3.fillBlock({context:context},$ctx2,3)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"lookupContextForLocal:ifNone:",{aString:aString,aBlock:aBlock},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString", "aBlock"], source: "lookupContextForLocal: aString ifNone: aBlock\x0a\x09\x22Lookup the context defining the local named `aString` \x0a\x09up to the method context\x22\x0a\x0a\x09^ self locals \x0a\x09\x09at: aString\x0a\x09\x09ifPresent: [ self ]\x0a\x09\x09ifAbsent: [ \x0a\x09\x09\x09self outerContext \x0a\x09\x09\x09\x09ifNil: aBlock\x0a\x09\x09\x09\x09ifNotNil: [ :context | \x0a\x09\x09\x09\x09\x09context lookupContextForLocal: aString ] ]", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["at:ifPresent:ifAbsent:", "locals", "ifNil:ifNotNil:", "outerContext", "lookupContextForLocal:"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "newInnerContext", protocol: "factory", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=$recv($self._class())._new(); $recv($1)._outerContext_(self); return $recv($1)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"newInnerContext",{},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "newInnerContext\x0a\x09^ self class new\x0a\x09\x09outerContext: self;\x0a\x09\x09yourself", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["outerContext:", "new", "class", "yourself"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "outerContext", protocol: "accessing", fn: function (){ var self=this,$self=this; return $self["@outerContext"]; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "outerContext\x0a\x09^ outerContext", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "outerContext:", protocol: "accessing", fn: function (anAIContext){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$receiver; $self["@outerContext"]=anAIContext; $1=$self["@outerContext"]; if(($receiver = $1) == null || $receiver.a$nil){ $1; } else { var context; context=$receiver; $recv(context)._innerContext_(self); } return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"outerContext:",{anAIContext:anAIContext},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anAIContext"], source: "outerContext: anAIContext\x0a\x09outerContext := anAIContext.\x0a\x09outerContext ifNotNil: [ :context | \x0a\x09\x09context innerContext: self ]", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["ifNotNil:", "innerContext:"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "receiver:", protocol: "interpreting", fn: function (anObject){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv($self._locals())._at_put_("self",anObject); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"receiver:",{anObject:anObject},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anObject"], source: "receiver: anObject\x0a\x09self locals at: 'self' put: anObject", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["at:put:", "locals"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "selector", protocol: "accessing", fn: function (){ var self=this,$self=this; return $self["@selector"]; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "selector\x0a\x09^ selector", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "selector:", protocol: "accessing", fn: function (aString){ var self=this,$self=this; $self["@selector"]=aString; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "selector: aString\x0a\x09selector := aString", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "sendIndexAt:", protocol: "accessing", fn: function (aString){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv($self._sendIndexes())._at_ifAbsent_(aString,(function(){ return (0); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"sendIndexAt:",{aString:aString},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "sendIndexAt: aString\x0a\x09^ self sendIndexes at: aString ifAbsent: [ 0 ]", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["at:ifAbsent:", "sendIndexes"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "sendIndexes", protocol: "accessing", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$receiver; $1=$self["@sendIndexes"]; if(($receiver = $1) == null || $receiver.a$nil){ return $recv($globals.Dictionary)._new(); } else { return $1; } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"sendIndexes",{},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "sendIndexes\x0a\x09^ sendIndexes ifNil: [ Dictionary new ]", referencedClasses: ["Dictionary"], //>>excludeEnd("ide"); messageSends: ["ifNil:", "new"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "sendIndexes:", protocol: "accessing", fn: function (aDictionary){ var self=this,$self=this; $self["@sendIndexes"]=aDictionary; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aDictionary"], source: "sendIndexes: aDictionary\x0a\x09sendIndexes := aDictionary", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "setupInterpreter:", protocol: "interpreting", fn: function (anInterpreter){ var self=this,$self=this; var currentNode; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2,$3,$4,$7,$6,$5,$receiver; $1=$recv($globals.ASTPCNodeVisitor)._new(); $2=$self._evaluatedSelector(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["evaluatedSelector"]=1; //>>excludeEnd("ctx"); $recv($1)._selector_($2); $recv($1)._index_($self._sendIndexAt_($self._evaluatedSelector())); $3=$self._ast(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["ast"]=1; //>>excludeEnd("ctx"); $recv($1)._visit_($3); currentNode=$recv($1)._currentNode(); $4=$recv($self._ast())._sequenceNode(); if(($receiver = $4) == null || $receiver.a$nil){ $4; } else { var sequence; sequence=$receiver; $recv($recv(sequence)._temps())._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $self._defineLocal_(each); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,2)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["do:"]=1; //>>excludeEnd("ctx"); } $recv(anInterpreter)._node_(currentNode); $7=$self._innerContext(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["innerContext"]=1; //>>excludeEnd("ctx"); $6=$recv($7)._arguments(); $5=$recv($6)._reversed(); $recv($5)._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv(anInterpreter)._push_(each); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx2.sendIdx["push:"]=1; //>>excludeEnd("ctx"); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,3)}); //>>excludeEnd("ctx"); })); $recv(anInterpreter)._push_($recv($self._innerContext())._receiver()); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"setupInterpreter:",{anInterpreter:anInterpreter,currentNode:currentNode},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anInterpreter"], source: "setupInterpreter: anInterpreter\x0a\x09| currentNode |\x0a\x09\x0a\x09\x22Retrieve the current node\x22\x0a\x09currentNode := ASTPCNodeVisitor new\x0a\x09\x09\x09selector: self evaluatedSelector;\x0a\x09\x09\x09index: (self sendIndexAt: self evaluatedSelector);\x0a\x09\x09\x09visit: self ast;\x0a\x09\x09\x09currentNode.\x0a\x09\x0a\x09\x22Define locals for the context\x22\x0a\x09self ast sequenceNode ifNotNil: [ :sequence |\x0a\x09\x09sequence temps do: [ :each |\x0a\x09\x09\x09self defineLocal: each ] ].\x0a\x09\x0a\x09anInterpreter node: currentNode.\x0a\x0a\x09\x22Push the send args and receiver to the interpreter stack\x22\x09\x0a\x09self innerContext arguments reversed do: [ :each | \x0a\x09\x09anInterpreter push: each ].\x0a\x09\x09\x0a\x09anInterpreter push: (self innerContext receiver)", referencedClasses: ["ASTPCNodeVisitor"], //>>excludeEnd("ide"); messageSends: ["selector:", "new", "evaluatedSelector", "index:", "sendIndexAt:", "visit:", "ast", "currentNode", "ifNotNil:", "sequenceNode", "do:", "temps", "defineLocal:", "node:", "reversed", "arguments", "innerContext", "push:", "receiver"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "supercall", protocol: "interpreting", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$receiver; $1=$self["@supercall"]; if(($receiver = $1) == null || $receiver.a$nil){ return false; } else { return $1; } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"supercall",{},$globals.AIContext)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "supercall\x0a\x09^ supercall ifNil: [ false ]", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["ifNil:"] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "supercall:", protocol: "interpreting", fn: function (aBoolean){ var self=this,$self=this; $self["@supercall"]=aBoolean; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aBoolean"], source: "supercall: aBoolean\x0a\x09supercall := aBoolean", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.AIContext); $core.addMethod( $core.method({ selector: "variableNotFound", protocol: "error handling", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._error_("Variable missing"); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"variableNotFound",{},