 							if (ASSIGN_OP_LOOKUP[call.evaluatedMethod] && compiledParams.length == 2) // two params means local assignment
 							{
 								symbolName = call.evaluatedParams[0];
+								if (builtInSymbolTable.hasOwnProperty(symbolName))
+									throw new Error("Cannot assign built-in variable: " + symbolName);
+								
 								// assignment operator expects parameters like (host, ...chain, value)
 								// if there is no matching local variable and 'this' has a matching one, assign the property of 'this'
 								if (useThisScope && this && this.hasOwnProperty(symbolName) && !localSymbolTable.hasOwnProperty(symbolName))


			const builtInSymbolTable:Object = {};
			const localSymbolTable:Object = {};
			// set up Array of symbol tables in the correct scope order: local, params, function, this, global
			const allSymbolTables:Array = [
				localSymbolTable,
				symbolTable,
				builtInSymbolTable,
				null/*this*/,
				constants
			];

					// advance the evalIndex so the next parameter will be evaluated.
					call.evalIndex++;
				}
				throw new Error("unreachable");
			};
			builtInSymbolTable['__self__'] = wrapperFunction;
			
			return wrapperFunction;
		}
