// Automatically generated wrapper file 
// Generated by scripts/build_jsfunctions.py

#include "jswrapper.h"
#include "src/jswrap_pin.h"
#include "src/jswrap_functions.h"
#include "src/jswrap_modules.h"
#include "src/jswrap_process.h"
#include "src/jswrap_interactive.h"
#include "src/jswrap_json.h"
#include "src/jswrap_object.h"
#include "src/jswrap_string.h"
#include "src/jswrap_array.h"
#include "src/jswrap_arraybuffer.h"
#include "src/jswrap_serial.h"
#include "src/jswrap_spi_i2c.h"
#include "src/jswrap_onewire.h"
#include "src/jswrap_io.h"
#include "libs/jswrap_math.h"

#if( 'q\0\0\0' & 'q' )
  #error( "architecture is big-endian. need to test and make sure this still works" )
#endif
// beware big endian!
#define CH2(a,b) ( ((b)<<8) | (a) )
#define CH4(a,b,c,d) ( ((d)<<24) | ((c)<<16) | ((b)<<8) | (a) )
#define CMP2(var, a,b) ((*(unsigned short*)&var)==CH2(a,b))
#define CMP3(var, a,b,c) (((*(unsigned int*)&var)&0x00FFFFFF)==CH4(a,b,c,0))
#define CMP4(var, a,b,c,d) ((*(unsigned int*)&var)==CH4(a,b,c,d))

JsVar *jswHandleFunctionCall(JsVar *parent, JsVar *parentName, const char *name) {
  if (parent) {
    // ------------------------------------------ METHODS ON OBJECT
    if (CMP4(name[0],'c','l','o','n') && CMP2(name[4],'e','\0')) {
      // Object.clone  (src/jswrap_object.c)
      jspParseEmptyFunction();
      JsVar *_r = jswrap_object_clone(parent);
      return _r;
    } else if (CMP4(name[0],'e','m','i','t') && name[4]=='\0') {
      // Object.emit  (src/jswrap_object.c)
      JsVar *event, *v1, *v2;
      jspParseFunction(0, &event, &v1, &v2, 0);
      jswrap_object_emit(parent, event, v1, v2);
      jsvUnLock(event);
      jsvUnLock(v1);
      jsvUnLock(v2);
      return 0;
    } else if (CMP4(name[0],'l','e','n','g') && CMP3(name[4],'t','h','\0')) {
      // Object.length  (src/jswrap_object.c)
      jspParseVariableName();
      JsVar *_r = jswrap_object_length(parent);
      return _r;
    } else if (CMP3(name[0],'o','n','\0')) {
      // Object.on  (src/jswrap_object.c)
      JsVar *event, *listener;
      jspParseFunction(0, &event, &listener, 0, 0);
      jswrap_object_on(parent, event, listener);
      jsvUnLock(event);
      jsvUnLock(listener);
      return 0;
    } else if (CMP4(name[0],'r','e','m','o') && CMP4(name[4],'v','e','A','l') && CMP4(name[8],'l','L','i','s') && CMP4(name[12],'t','e','n','e') && CMP3(name[16],'r','s','\0')) {
      // Object.removeAllListeners  (src/jswrap_object.c)
      JsVar *event = jspParseSingleFunction();
      jswrap_object_removeAllListeners(parent, event);
      jsvUnLock(event);
      return 0;
    } else if (CMP4(name[0],'t','o','S','t') && CMP4(name[4],'r','i','n','g') && name[8]=='\0') {
      // Object.toString  (src/jswrap_object.c)
      JsVar *radix = jspParseSingleFunction();
      JsVar *_r = jswrap_object_toString(parent, radix);
      jsvUnLock(radix);
      return _r;
    }
    // ------------------------------------------ INSTANCE + STATIC METHODS
    if (CMP4(parent->varData.str[0],'p','r','o','c') && CMP4(parent->varData.str[4],'e','s','s','\0')) {
      if (CMP4(name[0],'m','e','m','o') && CMP3(name[4],'r','y','\0')) {
        // process.memory  (src/jswrap_process.c)
        jspParseEmptyFunction();
        JsVar *_r = jswrap_process_memory();
        return _r;
      } else if (CMP4(name[0],'e','n','v','\0')) {
        // process.env  (src/jswrap_process.c)
        jspParseVariableName();
        JsVar *_r = jswrap_process_env();
        return _r;
      } else if (CMP4(name[0],'v','e','r','s') && CMP4(name[4],'i','o','n','\0')) {
        // process.version  (src/jswrap_process.c)
        jspParseVariableName();
        JsVar *_r = jsvNewFromString(JS_VERSION);
        return _r;
      }
    }
    if (CMP4(parent->varData.str[0],'O','b','j','e') && CMP3(parent->varData.str[4],'c','t','\0')) {
      if (CMP4(name[0],'k','e','y','s') && name[4]=='\0') {
        // Object.keys  (src/jswrap_object.c)
        JsVar *object = jspParseSingleFunction();
        JsVar *_r = jswrap_object_keys(object);
        jsvUnLock(object);
        return _r;
      }
    }
    if (jsvIsFunction(parent)) {
      if (CMP4(name[0],'a','p','p','l') && CMP2(name[4],'y','\0')) {
        // Function.apply  (src/jswrap_object.c)
        JsVar *this, *args;
        jspParseFunction(0, &this, &args, 0, 0);
        JsVar *_r = jswrap_function_apply(parent, this, args);
        jsvUnLock(this);
        jsvUnLock(args);
        return _r;
      } else if (CMP4(name[0],'c','a','l','l') && name[4]=='\0') {
        // Function.call  (src/jswrap_object.c)
        JsVar *this, *a, *b, *c, *d;
        jspParseFunction8(0, &this, &a, &b, &c, &d, 0, 0, 0);
        JsVar *_r = jswrap_function_call(parent, this, a, b, c, d);
        jsvUnLock(this);
        jsvUnLock(a);
        jsvUnLock(b);
        jsvUnLock(c);
        jsvUnLock(d);
        return _r;
      } else if (CMP4(name[0],'r','e','p','l') && CMP4(name[4],'a','c','e','W') && CMP4(name[8],'i','t','h','\0')) {
        // Function.replaceWith  (src/jswrap_object.c)
        JsVar *newFunc = jspParseSingleFunction();
        jswrap_function_replaceWith(parent, newFunc);
        jsvUnLock(newFunc);
        return 0;
      }
    }
    if (CMP4(parent->varData.str[0],'M','o','d','u') && CMP4(parent->varData.str[4],'l','e','s','\0')) {
      if (CMP4(name[0],'a','d','d','C') && CMP4(name[4],'a','c','h','e') && CMP2(name[8],'d','\0')) {
        // Modules.addCached  (src/jswrap_modules.c)
        JsVar *id, *sourcecode;
        jspParseFunction(0, &id, &sourcecode, 0, 0);
        jswrap_modules_addCached(id, sourcecode);
        jsvUnLock(id);
        jsvUnLock(sourcecode);
        return 0;
      } else if (CMP4(name[0],'r','e','m','o') && CMP2(name[4],'v','e')) {
        if (CMP4(name[6],'A','l','l','C') && CMP4(name[10],'a','c','h','e') && CMP2(name[14],'d','\0')) {
          // Modules.removeAllCached  (src/jswrap_modules.c)
          jspParseEmptyFunction();
          jswrap_modules_removeAllCached();
          return 0;
        } else if (CMP4(name[6],'C','a','c','h') && CMP3(name[10],'e','d','\0')) {
          // Modules.removeCached  (src/jswrap_modules.c)
          JsVar *id = jspParseSingleFunction();
          jswrap_modules_removeCached(id);
          jsvUnLock(id);
          return 0;
        }
      } else if (CMP4(name[0],'g','e','t','C') && CMP4(name[4],'a','c','h','e') && CMP2(name[8],'d','\0')) {
        // Modules.getCached  (src/jswrap_modules.c)
        jspParseEmptyFunction();
        JsVar *_r = jswrap_modules_getCached();
        return _r;
      }
    }
    if (jsvIsArrayBuffer(parent) && parent->varData.arraybuffer.type!=ARRAYBUFFERVIEW_ARRAYBUFFER) {
      if (CMP4(name[0],'i','n','t','e') && CMP4(name[4],'r','p','o','l') && CMP3(name[8],'a','t','e')) {
        if (CMP3(name[11],'2','d','\0')) {
          // ArrayBufferView.interpolate2d  (src/jswrap_arraybuffer.c)
          JsVar *width, *x, *y;
          jspParseFunction(0, &width, &x, &y, 0);
          JsVar *_r = jsvNewFromFloat(jswrap_arraybufferview_interpolate2d(parent, jsvGetIntegerAndUnLock(width), jsvGetFloatAndUnLock(x), jsvGetFloatAndUnLock(y)));
          return _r;
        } else if (name[11]==0) {
          // ArrayBufferView.interpolate  (src/jswrap_arraybuffer.c)
          JsVar *index = jspParseSingleFunction();
          JsVar *_r = jsvNewFromFloat(jswrap_arraybufferview_interpolate(parent, jsvGetFloatAndUnLock(index)));
          return _r;
        }
      } else if (name[0]=='b') {
        if (CMP3(name[1],'y','t','e')) {
          if (CMP4(name[4],'L','e','n','g') && CMP3(name[8],'t','h','\0')) {
            // ArrayBufferView.byteLength  (src/jswrap_arraybuffer.c)
            jspParseVariableName();
            JsVar *_r = jsvNewFromInteger(parent->varData.arraybuffer.length * JSV_ARRAYBUFFER_GET_SIZE(parent->varData.arraybuffer.type));
            return _r;
          } else if (CMP4(name[4],'O','f','f','s') && CMP3(name[8],'e','t','\0')) {
            // ArrayBufferView.byteOffset  (src/jswrap_arraybuffer.c)
            jspParseVariableName();
            JsVar *_r = jsvNewFromInteger(parent->varData.arraybuffer.byteOffset);
            return _r;
          }
        } else if (CMP4(name[1],'u','f','f','e') && CMP2(name[5],'r','\0')) {
          // ArrayBufferView.buffer  (src/jswrap_arraybuffer.c)
          jspParseVariableName();
          JsVar *_r = jsvLock(parent->firstChild);
          return _r;
        }
      }
    }
    if (jsvIsPin(parent)) {
      if (CMP4(name[0],'s','e','t','\0')) {
        // Pin.set  (src/jswrap_pin.c)
        jspParseEmptyFunction();
        jswrap_pin_set(parent);
        return 0;
      } else if (CMP2(name[0],'r','e')) {
        if (CMP3(name[2],'a','d','\0')) {
          // Pin.read  (src/jswrap_pin.c)
          jspParseEmptyFunction();
          JsVar *_r = jsvNewFromBool(jswrap_pin_read(parent));
          return _r;
        } else if (CMP4(name[2],'s','e','t','\0')) {
          // Pin.reset  (src/jswrap_pin.c)
          jspParseEmptyFunction();
          jswrap_pin_reset(parent);
          return 0;
        }
      } else if (CMP4(name[0],'w','r','i','t') && name[4]=='e') {
        if (CMP4(name[5],'A','t','T','i') && CMP3(name[9],'m','e','\0')) {
          // Pin.writeAtTime  (src/jswrap_pin.c)
          JsVar *value, *time;
          jspParseFunction(0, &value, &time, 0, 0);
          jswrap_pin_writeAtTime(parent, jsvGetBoolAndUnLock(value), jsvGetFloatAndUnLock(time));
          return 0;
        } else if (name[5]==0) {
          // Pin.write  (src/jswrap_pin.c)
          JsVar *value = jspParseSingleFunction();
          jswrap_pin_write(parent, jsvGetBoolAndUnLock(value));
          return 0;
        }
      }
    }
    if (jsvIsString(parent)) {
      if (CMP4(name[0],'i','n','d','e') && CMP4(name[4],'x','O','f','\0')) {
        // String.indexOf  (src/jswrap_string.c)
        JsVar *substring = jspParseSingleFunction();
        JsVar *_r = jsvNewFromInteger(jswrap_string_indexOf(parent, substring));
        jsvUnLock(substring);
        return _r;
      } else if (CMP4(name[0],'c','h','a','r')) {
        if (CMP3(name[4],'A','t','\0')) {
          // String.charAt  (src/jswrap_string.c)
          JsVar *pos = jspParseSingleFunction();
          JsVar *_r = jswrap_string_charAt(parent, jsvGetIntegerAndUnLock(pos));
          return _r;
        } else if (CMP4(name[4],'C','o','d','e') && CMP3(name[8],'A','t','\0')) {
          // String.charCodeAt  (src/jswrap_string.c)
          JsVar *pos = jspParseSingleFunction();
          JsVar *_r = jsvNewFromInteger(jswrap_string_charCodeAt(parent, jsvGetIntegerAndUnLock(pos)));
          return _r;
        }
      } else if (name[0]=='s') {
        if (CMP4(name[1],'p','l','i','t') && name[5]=='\0') {
          // String.split  (src/jswrap_string.c)
          JsVar *separator = jspParseSingleFunction();
          JsVar *_r = jswrap_string_split(parent, separator);
          jsvUnLock(separator);
          return _r;
        } else if (CMP4(name[1],'u','b','s','t') && name[5]=='r') {
          if (CMP4(name[6],'i','n','g','\0')) {
            // String.substring  (src/jswrap_string.c)
            JsVar *start, *end;
            jspParseFunction(0, &start, &end, 0, 0);
            JsVar *_r = jswrap_string_substring(parent, jsvGetIntegerAndUnLock(start), end);
            jsvUnLock(end);
            return _r;
          } else if (name[6]==0) {
            // String.substr  (src/jswrap_string.c)
            JsVar *start, *len;
            jspParseFunction(0, &start, &len, 0, 0);
            JsVar *_r = jswrap_string_substr(parent, jsvGetIntegerAndUnLock(start), len);
            jsvUnLock(len);
            return _r;
          }
        }
      }
    }
    if (CMP4(parent->varData.str[0],'M','a','t','h') && parent->varData.str[4]=='\0') {
      if (name[0]=='a') {
        if (CMP4(name[1],'c','o','s','\0')) {
          // Math.acos  (libs/jswrap_math.c)
          JsVar *x = jspParseSingleFunction();
          JsVar *_r = jsvNewFromFloat(acos(jsvGetFloatAndUnLock(x)));
          return _r;
        } else if (CMP3(name[1],'b','s','\0')) {
          // Math.abs  (libs/jswrap_math.c)
          JsVar *x = jspParseSingleFunction();
          JsVar *_r = jsvNewFromFloat(jswrap_math_abs(jsvGetFloatAndUnLock(x)));
          return _r;
        } else if (CMP4(name[1],'s','i','n','\0')) {
          // Math.asin  (libs/jswrap_math.c)
          JsVar *x = jspParseSingleFunction();
          JsVar *_r = jsvNewFromFloat(asin(jsvGetFloatAndUnLock(x)));
          return _r;
        } else if (CMP3(name[1],'t','a','n')) {
          if (CMP2(name[4],'2','\0')) {
            // Math.atan2  (libs/jswrap_math.c)
            JsVar *y, *x;
            jspParseFunction(0, &y, &x, 0, 0);
            JsVar *_r = jsvNewFromFloat(atan2(jsvGetFloatAndUnLock(y), jsvGetFloatAndUnLock(x)));
            return _r;
          } else if (name[4]==0) {
            // Math.atan  (libs/jswrap_math.c)
            JsVar *x = jspParseSingleFunction();
            JsVar *_r = jsvNewFromFloat(atan(jsvGetFloatAndUnLock(x)));
            return _r;
          }
        }
      } else if (name[0]=='c') {
        if (CMP4(name[1],'e','i','l','\0')) {
          // Math.ceil  (libs/jswrap_math.c)
          JsVar *x = jspParseSingleFunction();
          JsVar *_r = jsvNewFromFloat(ceil(jsvGetFloatAndUnLock(x)));
          return _r;
        } else if (CMP4(name[1],'l','i','p','\0')) {
          // Math.clip  (libs/jswrap_math.c)
          JsVar *x, *min, *max;
          jspParseFunction(0, &x, &min, &max, 0);
          JsVar *_r = jsvNewFromFloat(jswrap_math_clip(jsvGetFloatAndUnLock(x), jsvGetFloatAndUnLock(min), jsvGetFloatAndUnLock(max)));
          return _r;
        } else if (CMP3(name[1],'o','s','\0')) {
          // Math.cos  (libs/jswrap_math.c)
          JsVar *theta = jspParseSingleFunction();
          JsVar *_r = jsvNewFromFloat(sin(jsvGetFloat(theta) + (3.14159265359/2.0)));
          jsvUnLock(theta);
          return _r;
        }
      } else if (CMP2(name[0],'E','\0')) {
        // Math.E  (libs/jswrap_math.c)
        jspParseVariableName();
        JsVar *_r = jsvNewFromFloat(2.71828182846);
        return _r;
      } else if (CMP4(name[0],'p','o','w','\0')) {
        // Math.pow  (libs/jswrap_math.c)
        JsVar *x, *y;
        jspParseFunction(0, &x, &y, 0, 0);
        JsVar *_r = jsvNewFromFloat(jswrap_math_pow(jsvGetFloatAndUnLock(x), jsvGetFloatAndUnLock(y)));
        return _r;
      } else if (CMP4(name[0],'f','l','o','o') && CMP2(name[4],'r','\0')) {
        // Math.floor  (libs/jswrap_math.c)
        JsVar *x = jspParseSingleFunction();
        JsVar *_r = jsvNewFromFloat(floor(jsvGetFloatAndUnLock(x)));
        return _r;
      } else if (CMP4(name[0],'l','o','g','\0')) {
        // Math.log  (libs/jswrap_math.c)
        JsVar *x = jspParseSingleFunction();
        JsVar *_r = jsvNewFromFloat(log(jsvGetFloatAndUnLock(x)));
        return _r;
      } else if (CMP3(name[0],'P','I','\0')) {
        // Math.PI  (libs/jswrap_math.c)
        jspParseVariableName();
        JsVar *_r = jsvNewFromFloat(3.14159265359);
        return _r;
      } else if (name[0]=='s') {
        if (CMP3(name[1],'i','n','\0')) {
          // Math.sin  (libs/jswrap_math.c)
          JsVar *theta = jspParseSingleFunction();
          JsVar *_r = jsvNewFromFloat(sin(jsvGetFloatAndUnLock(theta)));
          return _r;
        } else if (CMP4(name[1],'q','r','t','\0')) {
          // Math.sqrt  (libs/jswrap_math.c)
          JsVar *x = jspParseSingleFunction();
          JsVar *_r = jsvNewFromFloat(jswrap_math_pow(jsvGetFloat(x),0.5));
          jsvUnLock(x);
          return _r;
        }
      } else if (name[0]=='r') {
        if (CMP4(name[1],'a','n','d','o') && CMP2(name[5],'m','\0')) {
          // Math.random  (libs/jswrap_math.c)
          jspParseEmptyFunction();
          JsVar *_r = jsvNewFromFloat((JsVarFloat)rand() / (JsVarFloat)RAND_MAX);
          return _r;
        } else if (CMP4(name[1],'o','u','n','d') && name[5]=='\0') {
          // Math.round  (libs/jswrap_math.c)
          JsVar *x = jspParseSingleFunction();
          JsVar *_r = jsvNewFromInteger((JsVarInt)round(jsvGetFloatAndUnLock(x)));
          return _r;
        }
      } else if (CMP4(name[0],'w','r','a','p') && name[4]=='\0') {
        // Math.wrap  (libs/jswrap_math.c)
        JsVar *x, *max;
        jspParseFunction(0, &x, &max, 0, 0);
        JsVar *_r = jsvNewFromFloat(wrapAround(jsvGetFloatAndUnLock(x), jsvGetFloatAndUnLock(max)));
        return _r;
      } else if (CMP4(name[0],'e','x','p','\0')) {
        // Math.exp  (libs/jswrap_math.c)
        JsVar *x = jspParseSingleFunction();
        JsVar *_r = jsvNewFromFloat(exp(jsvGetFloatAndUnLock(x)));
        return _r;
      }
    }
    if (CMP4(parent->varData.str[0],'D','o','u','b') && CMP3(parent->varData.str[4],'l','e','\0')) {
      if (CMP4(name[0],'d','o','u','b') && CMP4(name[4],'l','e','T','o') && CMP4(name[8],'I','n','t','B') && CMP4(name[12],'i','t','s','\0')) {
        // Double.doubleToIntBits  (libs/jswrap_math.c)
        JsVar *x = jspParseSingleFunction();
        JsVar *_r = jsvNewFromInteger(*(JsVarInt*)&x);
        jsvUnLock(x);
        return _r;
      }
    }
    if (jsvIsArray(parent)) {
      if (CMP4(name[0],'c','o','n','t') && CMP4(name[4],'a','i','n','s') && name[8]=='\0') {
        // Array.contains  (src/jswrap_array.c)
        JsVar *value = jspParseSingleFunction();
        JsVar *_r = jsvNewFromBool(jswrap_array_contains(parent, value));
        jsvUnLock(value);
        return _r;
      } else if (CMP4(name[0],'f','o','r','E') && CMP4(name[4],'a','c','h','\0')) {
        // Array.forEach  (src/jswrap_array.c)
        JsVar *function, *thisArg;
        jspParseFunction(0, &function, &thisArg, 0, 0);
        jswrap_array_forEach(parent, function, thisArg);
        jsvUnLock(function);
        jsvUnLock(thisArg);
        return 0;
      } else if (CMP4(name[0],'i','n','d','e') && CMP4(name[4],'x','O','f','\0')) {
        // Array.indexOf  (src/jswrap_array.c)
        JsVar *value = jspParseSingleFunction();
        JsVar *_r = jswrap_array_indexOf(parent, value);
        jsvUnLock(value);
        return _r;
      } else if (CMP4(name[0],'j','o','i','n') && name[4]=='\0') {
        // Array.join  (src/jswrap_array.c)
        JsVar *separator = jspParseSingleFunction();
        JsVar *_r = jswrap_array_join(parent, separator);
        jsvUnLock(separator);
        return _r;
      } else if (CMP4(name[0],'m','a','p','\0')) {
        // Array.map  (src/jswrap_array.c)
        JsVar *function, *thisArg;
        jspParseFunction(0, &function, &thisArg, 0, 0);
        JsVar *_r = jswrap_array_map(parent, function, thisArg);
        jsvUnLock(function);
        jsvUnLock(thisArg);
        return _r;
      } else if (name[0]=='p') {
        if (CMP4(name[1],'u','s','h','\0')) {
          // Array.push  (src/jswrap_array.c)
          JsVar *value = jspParseSingleFunction();
          JsVar *_r = jsvNewFromInteger(jsvArrayPush(parent, value));
          jsvUnLock(value);
          return _r;
        } else if (CMP3(name[1],'o','p','\0')) {
          // Array.pop  (src/jswrap_array.c)
          jspParseEmptyFunction();
          JsVar *_r = jsvArrayPop(parent);
          return _r;
        }
      } else if (name[0]=='s') {
        if (CMP4(name[1],'p','l','i','c') && CMP2(name[5],'e','\0')) {
          // Array.splice  (src/jswrap_array.c)
          JsVar *index, *howMany, *element1, *element2, *element3, *element4, *element5, *element6;
          jspParseFunction8(0, &index, &howMany, &element1, &element2, &element3, &element4, &element5, &element6);
          JsVar *_r = jswrap_array_splice(parent, jsvGetIntegerAndUnLock(index), howMany, element1, element2, element3, element4, element5, element6);
          jsvUnLock(howMany);
          jsvUnLock(element1);
          jsvUnLock(element2);
          jsvUnLock(element3);
          jsvUnLock(element4);
          jsvUnLock(element5);
          jsvUnLock(element6);
          return _r;
        } else if (CMP4(name[1],'l','i','c','e') && name[5]=='\0') {
          // Array.slice  (src/jswrap_array.c)
          JsVar *start, *end;
          jspParseFunction(0, &start, &end, 0, 0);
          JsVar *_r = jswrap_array_slice(parent, start, end);
          jsvUnLock(start);
          jsvUnLock(end);
          return _r;
        }
      }
    }
    if (CMP4(parent->varData.str[0],'c','o','n','s') && CMP4(parent->varData.str[4],'o','l','e','\0')) {
      if (CMP4(name[0],'l','o','g','\0')) {
        // console.log  (src/jswrap_interactive.c)
        JsVar *text = jspParseFunctionAsArray();
        if (!text) return 0; // if parse error
        jswrap_interface_print(text);
        jsvUnLock(text);
        return 0;
      }
    }
    if (CMP4(parent->varData.str[0],'J','S','O','N') && parent->varData.str[4]=='\0') {
      if (CMP4(name[0],'p','a','r','s') && CMP2(name[4],'e','\0')) {
        // JSON.parse  (src/jswrap_json.c)
        JsVar *string = jspParseSingleFunction();
        JsVar *_r = jswrap_json_parse(string);
        jsvUnLock(string);
        return _r;
      } else if (CMP4(name[0],'s','t','r','i') && CMP4(name[4],'n','g','i','f') && CMP2(name[8],'y','\0')) {
        // JSON.stringify  (src/jswrap_json.c)
        JsVar *data = jspParseSingleFunction();
        JsVar *_r = jswrap_json_stringify(data);
        jsvUnLock(data);
        return _r;
      }
    }
    if (CMP4(parent->varData.str[0],'S','t','r','i') && CMP3(parent->varData.str[4],'n','g','\0')) {
      if (CMP4(name[0],'f','r','o','m') && CMP4(name[4],'C','h','a','r') && CMP4(name[8],'C','o','d','e') && name[12]=='\0') {
        // String.fromCharCode  (src/jswrap_string.c)
        JsVar *code = jspParseSingleFunction();
        JsVar *_r = jswrap_string_fromCharCode(jsvGetIntegerAndUnLock(code));
        return _r;
      }
    }
    if (CMP4(parent->varData.str[0],'I','n','t','e') && CMP4(parent->varData.str[4],'g','e','r','\0')) {
      if (CMP4(name[0],'v','a','l','u') && CMP4(name[4],'e','O','f','\0')) {
        // Integer.valueOf  (libs/jswrap_math.c)
        JsVar *character = jspParseSingleFunction();
        JsVar *_r = jsvNewFromInteger(jswrap_integer_valueOf(character));
        jsvUnLock(character);
        return _r;
      }
    }
    // ------------------------------------------ INSTANCE METHODS WE MUST CHECK CONSTRUCTOR FOR
    JsVar *constructorName = jsvIsObject(parent)?jsvSkipOneNameAndUnLock(jsvFindChildFromString(parent, JSPARSE_CONSTRUCTOR_VAR, false)):0;
    if (constructorName && jsvIsName(constructorName)) {
    if (CMP4(constructorName->varData.str[0],'S','e','r','i') && CMP3(constructorName->varData.str[4],'a','l','\0')) {
      jsvUnLock(constructorName);constructorName=0;
          if (CMP4(name[0],'p','r','i','n') && name[4]=='t') {
            if (CMP3(name[5],'l','n','\0')) {
              // Serial.println  (src/jswrap_serial.c)
              JsVar *string = jspParseSingleFunction();
              jswrap_serial_println(parent, string);
              jsvUnLock(string);
              return 0;
            } else if (name[5]==0) {
              // Serial.print  (src/jswrap_serial.c)
              JsVar *string = jspParseSingleFunction();
              jswrap_serial_print(parent, string);
              jsvUnLock(string);
              return 0;
            }
          } else if (CMP3(name[0],'s','e','t')) {
            if (CMP4(name[3],'C','o','n','s') && CMP4(name[7],'o','l','e','\0')) {
              // Serial.setConsole  (src/jswrap_serial.c)
              jspParseEmptyFunction();
              jsiSetConsoleDevice(jsiGetDeviceFromClass(parent));
              return 0;
            } else if (CMP3(name[3],'u','p','\0')) {
              // Serial.setup  (src/jswrap_serial.c)
              JsVar *baudrate, *options;
              jspParseFunction(0, &baudrate, &options, 0, 0);
              jswrap_serial_setup(parent, jsvGetIntegerAndUnLock(baudrate), options);
              jsvUnLock(options);
              return 0;
            }
          } else if (CMP4(name[0],'o','n','D','a') && CMP3(name[4],'t','a','\0')) {
            // Serial.onData  (src/jswrap_serial.c)
            JsVar *function;
            jspParseFunction(0|JSP_NOSKIP_A, &function, 0, 0, 0);
            jswrap_serial_onData(parent, function);
            jsvUnLock(function);
            return 0;
          } else if (CMP4(name[0],'w','r','i','t') && CMP2(name[4],'e','\0')) {
            // Serial.write  (src/jswrap_serial.c)
            JsVar *data = jspParseSingleFunction();
            jswrap_serial_write(parent, data);
            jsvUnLock(data);
            return 0;
          }
    } else if (CMP4(constructorName->varData.str[0],'O','n','e','W') && CMP4(constructorName->varData.str[4],'i','r','e','\0')) {
      jsvUnLock(constructorName);constructorName=0;
          if (name[0]=='s') {
            if (CMP4(name[1],'k','i','p','\0')) {
              // OneWire.skip  (src/jswrap_onewire.c)
              jspParseEmptyFunction();
              jswrap_onewire_skip(parent);
              return 0;
            } else if (name[1]=='e') {
              if (CMP4(name[2],'a','r','c','h') && name[6]=='\0') {
                // OneWire.search  (src/jswrap_onewire.c)
                jspParseEmptyFunction();
                JsVar *_r = jswrap_onewire_search(parent);
                return _r;
              } else if (CMP4(name[2],'l','e','c','t') && name[6]=='\0') {
                // OneWire.select  (src/jswrap_onewire.c)
                JsVar *rom = jspParseSingleFunction();
                jswrap_onewire_select(parent, jsvGetIntegerAndUnLock(rom));
                return 0;
              }
            }
          } else if (CMP2(name[0],'r','e')) {
            if (CMP3(name[2],'a','d','\0')) {
              // OneWire.read  (src/jswrap_onewire.c)
              jspParseEmptyFunction();
              JsVar *_r = jsvNewFromInteger(jswrap_onewire_read(parent));
              return _r;
            } else if (CMP4(name[2],'s','e','t','\0')) {
              // OneWire.reset  (src/jswrap_onewire.c)
              jspParseEmptyFunction();
              JsVar *_r = jsvNewFromBool(jswrap_onewire_reset(parent));
              return _r;
            }
          } else if (CMP4(name[0],'w','r','i','t') && CMP2(name[4],'e','\0')) {
            // OneWire.write  (src/jswrap_onewire.c)
            JsVar *data, *power;
            jspParseFunction(0, &data, &power, 0, 0);
            jswrap_onewire_write(parent, jsvGetIntegerAndUnLock(data), jsvGetBoolAndUnLock(power));
            return 0;
          }
    } else if (CMP4(constructorName->varData.str[0],'I','2','C','\0')) {
      jsvUnLock(constructorName);constructorName=0;
          if (CMP4(name[0],'s','e','t','u') && CMP2(name[4],'p','\0')) {
            // I2C.setup  (src/jswrap_spi_i2c.c)
            JsVar *options = jspParseSingleFunction();
            jswrap_i2c_setup(parent, options);
            jsvUnLock(options);
            return 0;
          } else if (CMP4(name[0],'r','e','a','d') && CMP4(name[4],'F','r','o','m') && name[8]=='\0') {
            // I2C.readFrom  (src/jswrap_spi_i2c.c)
            JsVar *address, *quantity;
            jspParseFunction(0, &address, &quantity, 0, 0);
            JsVar *_r = jswrap_i2c_readFrom(parent, jsvGetIntegerAndUnLock(address), jsvGetIntegerAndUnLock(quantity));
            return _r;
          } else if (CMP4(name[0],'w','r','i','t') && CMP4(name[4],'e','T','o','\0')) {
            // I2C.writeTo  (src/jswrap_spi_i2c.c)
            JsVar *address, *data;
            jspParseFunction(0, &address, &data, 0, 0);
            jswrap_i2c_writeTo(parent, jsvGetIntegerAndUnLock(address), data);
            jsvUnLock(data);
            return 0;
          }
    } else if (CMP4(constructorName->varData.str[0],'S','P','I','\0')) {
      jsvUnLock(constructorName);constructorName=0;
          if (CMP2(name[0],'s','e')) {
            if (CMP4(name[2],'t','u','p','\0')) {
              // SPI.setup  (src/jswrap_spi_i2c.c)
              JsVar *options = jspParseSingleFunction();
              jswrap_spi_setup(parent, options);
              jsvUnLock(options);
              return 0;
            } else if (CMP2(name[2],'n','d')) {
              if (CMP4(name[4],'8','b','i','t') && name[8]=='\0') {
                // SPI.send8bit  (src/jswrap_spi_i2c.c)
                JsVar *data, *bit0, *bit1, *nss_pin;
                jspParseFunction(0, &data, &bit0, &bit1, &nss_pin);
                jswrap_spi_send8bit(parent, data, jsvGetIntegerAndUnLock(bit0), jsvGetIntegerAndUnLock(bit1), jshGetPinFromVarAndUnLock(nss_pin));
                jsvUnLock(data);
                return 0;
              } else if (CMP4(name[4],'4','b','i','t') && name[8]=='\0') {
                // SPI.send4bit  (src/jswrap_spi_i2c.c)
                JsVar *data, *bit0, *bit1, *nss_pin;
                jspParseFunction(0, &data, &bit0, &bit1, &nss_pin);
                jswrap_spi_send4bit(parent, data, jsvGetIntegerAndUnLock(bit0), jsvGetIntegerAndUnLock(bit1), jshGetPinFromVarAndUnLock(nss_pin));
                jsvUnLock(data);
                return 0;
              } else if (name[4]==0) {
                // SPI.send  (src/jswrap_spi_i2c.c)
                JsVar *data, *nss_pin;
                jspParseFunction(0, &data, &nss_pin, 0, 0);
                JsVar *_r = jswrap_spi_send(parent, data, jshGetPinFromVarAndUnLock(nss_pin));
                jsvUnLock(data);
                return _r;
              }
            }
          }
    } else 
      jsvUnLock(constructorName);
    }
  } else { /* if (!parent) */
    // ------------------------------------------ FUNCTIONS
    // Handle pin names - eg LED1 or D5 (this is hardcoded in build_jsfunctions.py)
    Pin pin = jshGetPinFromString(name);
    if (pin != PIN_UNDEFINED) {
      jspParseVariableName();
      return jsvNewFromPin(pin);
    }
    if (name[0]=='a') {
      if (CMP4(name[1],'r','g','u','m') && CMP4(name[5],'e','n','t','s') && name[9]=='\0') {
        // arguments  (src/jswrap_functions.c)
        jspParseVariableName();
        JsVar *_r = jswrap_arguments();
        return _r;
      } else if (CMP4(name[1],'n','a','l','o') && name[5]=='g') {
        if (CMP4(name[6],'R','e','a','d') && name[10]=='\0') {
          // analogRead  (src/jswrap_io.c)
          JsVar *pin = jspParseSingleFunction();
          JsVar *_r = jsvNewFromFloat(jshPinAnalog(jshGetPinFromVarAndUnLock(pin)));
          return _r;
        } else if (CMP4(name[6],'W','r','i','t') && CMP2(name[10],'e','\0')) {
          // analogWrite  (src/jswrap_io.c)
          JsVar *pin, *value, *options;
          jspParseFunction(0, &pin, &value, &options, 0);
          jswrap_io_analogWrite(jshGetPinFromVarAndUnLock(pin), jsvGetFloatAndUnLock(value), options);
          jsvUnLock(options);
          return 0;
        }
      }
    } else if (CMP4(name[0],'A','r','r','a') && name[4]=='y') {
      if (CMP4(name[5],'B','u','f','f') && CMP3(name[9],'e','r','\0')) {
        // ArrayBuffer.ArrayBuffer  (src/jswrap_arraybuffer.c)
        JsVar *byteLength = jspParseSingleFunction();
        JsVar *_r = jswrap_arraybuffer_constructor(jsvGetIntegerAndUnLock(byteLength));
        return _r;
      } else if (name[5]==0) {
        // Array.Array  (src/jswrap_array.c)
        JsVar *args = jspParseFunctionAsArray();
        if (!args) return 0; // if parse error
        JsVar *_r = jswrap_array_constructor(args);
        jsvUnLock(args);
        return _r;
      }
    } else if (name[0]=='c') {
      if (CMP4(name[1],'h','a','n','g') && CMP4(name[5],'e','I','n','t') && CMP4(name[9],'e','r','v','a') && CMP2(name[13],'l','\0')) {
        // changeInterval  (src/jswrap_io.c)
        JsVar *id, *time;
        jspParseFunction(0, &id, &time, 0, 0);
        jswrap_interface_changeInterval(id, jsvGetFloatAndUnLock(time));
        jsvUnLock(id);
        return 0;
      } else if (CMP4(name[1],'l','e','a','r')) {
        if (CMP4(name[5],'I','n','t','e') && CMP4(name[9],'r','v','a','l') && name[13]=='\0') {
          // clearInterval  (src/jswrap_io.c)
          JsVar *id = jspParseSingleFunction();
          jswrap_interface_clearInterval(id);
          jsvUnLock(id);
          return 0;
        } else if (CMP4(name[5],'T','i','m','e') && CMP4(name[9],'o','u','t','\0')) {
          // clearTimeout  (src/jswrap_io.c)
          JsVar *id = jspParseSingleFunction();
          jswrap_interface_clearTimeout(id);
          jsvUnLock(id);
          return 0;
        } else if (CMP4(name[5],'W','a','t','c') && CMP2(name[9],'h','\0')) {
          // clearWatch  (src/jswrap_io.c)
          JsVar *id = jspParseSingleFunction();
          jswrap_interface_clearWatch(id);
          jsvUnLock(id);
          return 0;
        }
      }
    } else if (name[0]=='e') {
      if (CMP4(name[1],'c','h','o','\0')) {
        // echo  (src/jswrap_interactive.c)
        JsVar *echoOn = jspParseSingleFunction();
        jswrap_interface_echo(jsvGetBoolAndUnLock(echoOn));
        return 0;
      } else if (CMP4(name[1],'d','i','t','\0')) {
        // edit  (src/jswrap_interactive.c)
        JsVar *funcName;
        jspParseFunction(0|JSP_NOSKIP_A, &funcName, 0, 0, 0);
        jswrap_interface_edit(funcName);
        jsvUnLock(funcName);
        return 0;
      } else if (CMP4(name[1],'v','a','l','\0')) {
        // eval  (src/jswrap_functions.c)
        JsVar *code = jspParseSingleFunction();
        JsVar *_r = jswrap_eval(code);
        jsvUnLock(code);
        return _r;
      }
    } else if (name[0]=='d') {
      if (CMP4(name[1],'i','g','i','t') && CMP2(name[5],'a','l')) {
        if (CMP4(name[7],'P','u','l','s') && CMP2(name[11],'e','\0')) {
          // digitalPulse  (src/jswrap_io.c)
          JsVar *pin, *value, *time;
          jspParseFunction(0, &pin, &value, &time, 0);
          jswrap_io_digitalPulse(jshGetPinFromVarAndUnLock(pin), jsvGetBoolAndUnLock(value), jsvGetFloatAndUnLock(time));
          return 0;
        } else if (CMP4(name[7],'R','e','a','d') && name[11]=='\0') {
          // digitalRead  (src/jswrap_io.c)
          JsVar *pin = jspParseSingleFunction();
          JsVar *_r = jsvNewFromInteger(jswrap_io_digitalRead(pin));
          jsvUnLock(pin);
          return _r;
        } else if (CMP4(name[7],'W','r','i','t') && CMP2(name[11],'e','\0')) {
          // digitalWrite  (src/jswrap_io.c)
          JsVar *pin, *value;
          jspParseFunction(0, &pin, &value, 0, 0);
          jswrap_io_digitalWrite(pin, jsvGetIntegerAndUnLock(value));
          jsvUnLock(pin);
          return 0;
        }
      } else if (CMP4(name[1],'u','m','p','\0')) {
        // dump  (src/jswrap_interactive.c)
        jspParseEmptyFunction();
        jsiDumpState();
        return 0;
      }
    } else if (CMP3(name[0],'g','e','t')) {
      if (CMP4(name[3],'S','e','r','i') && CMP3(name[7],'a','l','\0')) {
        // getSerial  (src/jswrap_interactive.c)
        jspParseEmptyFunction();
        JsVar *_r = jswrap_interface_getSerial();
        return _r;
      } else if (CMP4(name[3],'T','i','m','e') && name[7]=='\0') {
        // getTime  (src/jswrap_interactive.c)
        jspParseEmptyFunction();
        JsVar *_r = jsvNewFromFloat((JsVarFloat)jshGetSystemTime() / (JsVarFloat)jshGetTimeFromMilliseconds(1000));
        return _r;
      }
    } else if (CMP4(name[0],'F','l','o','a') && name[4]=='t') {
      if (CMP4(name[5],'3','2','A','r') && CMP4(name[9],'r','a','y','\0')) {
        // Float32Array.Float32Array  (src/jswrap_arraybuffer.c)
        JsVar *arr, *byteOffset, *length;
        jspParseFunction(0, &arr, &byteOffset, &length, 0);
        JsVar *_r = jswrap_typedarray_constructor(ARRAYBUFFERVIEW_FLOAT32, arr, jsvGetInteger(byteOffset), jsvGetInteger(length));
        jsvUnLock(arr);
        jsvUnLock(byteOffset);
        jsvUnLock(length);
        return _r;
      } else if (CMP4(name[5],'6','4','A','r') && CMP4(name[9],'r','a','y','\0')) {
        // Float64Array.Float64Array  (src/jswrap_arraybuffer.c)
        JsVar *arr, *byteOffset, *length;
        jspParseFunction(0, &arr, &byteOffset, &length, 0);
        JsVar *_r = jswrap_typedarray_constructor(ARRAYBUFFERVIEW_FLOAT64, arr, jsvGetInteger(byteOffset), jsvGetInteger(length));
        jsvUnLock(arr);
        jsvUnLock(byteOffset);
        jsvUnLock(length);
        return _r;
      }
    } else if (name[0]=='S') {
      if (CMP2(name[1],'P','I')) {
        if (CMP2(name[3],'1','\0')) {
          // Object SPI1  (src/jswrap_spi_i2c.c)
          #if SPIS>=1
          jspParseVariableName();
          return jspNewObject(jsiGetParser(), "SPI1", "SPI");
          #endif //SPIS>=1
        } else if (CMP2(name[3],'3','\0')) {
          // Object SPI3  (src/jswrap_spi_i2c.c)
          #if SPIS>=3
          jspParseVariableName();
          return jspNewObject(jsiGetParser(), "SPI3", "SPI");
          #endif //SPIS>=3
        } else if (CMP2(name[3],'2','\0')) {
          // Object SPI2  (src/jswrap_spi_i2c.c)
          #if SPIS>=2
          jspParseVariableName();
          return jspNewObject(jsiGetParser(), "SPI2", "SPI");
          #endif //SPIS>=2
        }
      } else if (CMP4(name[1],'e','r','i','a') && name[5]=='l') {
        if (CMP2(name[6],'1','\0')) {
          // Object Serial1  (src/jswrap_serial.c)
          #if USARTS>=1
          jspParseVariableName();
          return jspNewObject(jsiGetParser(), "Serial1", "Serial");
          #endif //USARTS>=1
        } else if (CMP2(name[6],'3','\0')) {
          // Object Serial3  (src/jswrap_serial.c)
          #if USARTS>=3
          jspParseVariableName();
          return jspNewObject(jsiGetParser(), "Serial3", "Serial");
          #endif //USARTS>=3
        } else if (CMP2(name[6],'2','\0')) {
          // Object Serial2  (src/jswrap_serial.c)
          #if USARTS>=2
          jspParseVariableName();
          return jspNewObject(jsiGetParser(), "Serial2", "Serial");
          #endif //USARTS>=2
        } else if (CMP2(name[6],'5','\0')) {
          // Object Serial5  (src/jswrap_serial.c)
          #if USARTS>=5
          jspParseVariableName();
          return jspNewObject(jsiGetParser(), "Serial5", "Serial");
          #endif //USARTS>=5
        } else if (CMP2(name[6],'4','\0')) {
          // Object Serial4  (src/jswrap_serial.c)
          #if USARTS>=4
          jspParseVariableName();
          return jspNewObject(jsiGetParser(), "Serial4", "Serial");
          #endif //USARTS>=4
        } else if (CMP2(name[6],'6','\0')) {
          // Object Serial6  (src/jswrap_serial.c)
          #if USARTS>=6
          jspParseVariableName();
          return jspNewObject(jsiGetParser(), "Serial6", "Serial");
          #endif //USARTS>=6
        }
      } else if (CMP4(name[1],'t','r','i','n') && CMP2(name[5],'g','\0')) {
        // String.String  (src/jswrap_string.c)
        JsVar *str = jspParseSingleFunction();
        JsVar *_r = jswrap_string_constructor(str);
        jsvUnLock(str);
        return _r;
      }
    } else if (CMP4(name[0],'l','o','a','d') && name[4]=='\0') {
      // load  (src/jswrap_interactive.c)
      jspParseEmptyFunction();
      jsiSetTodo(TODO_FLASH_LOAD);
      return 0;
    } else if (CMP4(name[0],'O','n','e','W') && CMP4(name[4],'i','r','e','\0')) {
      // OneWire.OneWire  (src/jswrap_onewire.c)
      JsVar *pin = jspParseSingleFunction();
      JsVar *_r = jswrap_onewire_constructor(jshGetPinFromVarAndUnLock(pin));
      return _r;
    } else if (CMP4(name[0],'N','a','N','\0')) {
      // NaN  (libs/jswrap_math.c)
      jspParseVariableName();
      JsVar *_r = jsvNewFromFloat(NAN);
      return _r;
    } else if (name[0]=='p') {
      if (CMP4(name[1],'a','r','s','e')) {
        if (CMP4(name[5],'I','n','t','\0')) {
          // parseInt  (src/jswrap_functions.c)
          JsVar *string, *radix;
          jspParseFunction(0, &string, &radix, 0, 0);
          JsVar *_r = jswrap_parseInt(string, radix);
          jsvUnLock(string);
          jsvUnLock(radix);
          return _r;
        } else if (CMP4(name[5],'F','l','o','a') && CMP2(name[9],'t','\0')) {
          // parseFloat  (src/jswrap_functions.c)
          JsVar *string = jspParseSingleFunction();
          JsVar *_r = jsvNewFromFloat(jswrap_parseFloat(string));
          jsvUnLock(string);
          return _r;
        }
      } else if (CMP4(name[1],'i','n','M','o') && CMP3(name[5],'d','e','\0')) {
        // pinMode  (src/jswrap_io.c)
        JsVar *pin, *mode;
        jspParseFunction(0, &pin, &mode, 0, 0);
        jswrap_io_pinMode(jshGetPinFromVarAndUnLock(pin), mode);
        jsvUnLock(mode);
        return 0;
      } else if (CMP4(name[1],'r','i','n','t') && name[5]=='\0') {
        // print  (src/jswrap_interactive.c)
        JsVar *text = jspParseFunctionAsArray();
        if (!text) return 0; // if parse error
        jswrap_interface_print(text);
        jsvUnLock(text);
        return 0;
      } else if (CMP3(name[1],'e','e','k')) {
        if (CMP3(name[4],'1','6','\0')) {
          // peek16  (src/jswrap_io.c)
          JsVar *addr = jspParseSingleFunction();
          JsVar *_r = jsvNewFromInteger((JsVarInt)*(unsigned short*)jsvGetInteger(addr));
          jsvUnLock(addr);
          return _r;
        } else if (CMP2(name[4],'8','\0')) {
          // peek8  (src/jswrap_io.c)
          JsVar *addr = jspParseSingleFunction();
          JsVar *_r = jsvNewFromInteger((JsVarInt)*(unsigned char*)jsvGetInteger(addr));
          jsvUnLock(addr);
          return _r;
        } else if (CMP3(name[4],'3','2','\0')) {
          // peek32  (src/jswrap_io.c)
          JsVar *addr = jspParseSingleFunction();
          JsVar *_r = jsvNewFromInteger((JsVarInt)*(unsigned int*)jsvGetInteger(addr));
          jsvUnLock(addr);
          return _r;
        }
      } else if (CMP3(name[1],'o','k','e')) {
        if (CMP3(name[4],'1','6','\0')) {
          // poke16  (src/jswrap_io.c)
          JsVar *addr, *value;
          jspParseFunction(0, &addr, &value, 0, 0);
          (*(unsigned short*)jsvGetInteger(addr)) = (unsigned short)jsvGetInteger(value);
          jsvUnLock(addr);
          jsvUnLock(value);
          return 0;
        } else if (CMP2(name[4],'8','\0')) {
          // poke8  (src/jswrap_io.c)
          JsVar *addr, *value;
          jspParseFunction(0, &addr, &value, 0, 0);
          (*(unsigned char*)jsvGetInteger(addr)) = (unsigned char)jsvGetInteger(value);
          jsvUnLock(addr);
          jsvUnLock(value);
          return 0;
        } else if (CMP3(name[4],'3','2','\0')) {
          // poke32  (src/jswrap_io.c)
          JsVar *addr, *value;
          jspParseFunction(0, &addr, &value, 0, 0);
          (*(unsigned int*)jsvGetInteger(addr)) = (unsigned int)jsvGetInteger(value);
          jsvUnLock(addr);
          jsvUnLock(value);
          return 0;
        }
      }
    } else if (name[0]=='s') {
      if (CMP4(name[1],'a','v','e','\0')) {
        // save  (src/jswrap_interactive.c)
        jspParseEmptyFunction();
        jsiSetTodo(TODO_FLASH_SAVE);
        return 0;
      } else if (CMP2(name[1],'e','t')) {
        if (CMP4(name[3],'B','u','s','y') && CMP4(name[7],'I','n','d','i') && CMP4(name[11],'c','a','t','o') && CMP2(name[15],'r','\0')) {
          // setBusyIndicator  (src/jswrap_interactive.c)
          JsVar *pin = jspParseSingleFunction();
          jswrap_interface_setBusyIndicator(pin);
          jsvUnLock(pin);
          return 0;
        } else if (CMP4(name[3],'D','e','e','p') && CMP4(name[7],'S','l','e','e') && CMP2(name[11],'p','\0')) {
          // setDeepSleep  (src/jswrap_interactive.c)
          JsVar *sleep = jspParseSingleFunction();
          jswrap_interface_setDeepSleep(jsvGetBoolAndUnLock(sleep));
          return 0;
        } else if (CMP4(name[3],'I','n','t','e') && CMP4(name[7],'r','v','a','l') && name[11]=='\0') {
          // setInterval  (src/jswrap_io.c)
          JsVar *function, *timeout;
          jspParseFunction(0|JSP_NOSKIP_A, &function, &timeout, 0, 0);
          JsVar *_r = jswrap_interface_setInterval(function, jsvGetFloatAndUnLock(timeout));
          jsvUnLock(function);
          return _r;
        } else if (CMP4(name[3],'S','l','e','e') && CMP4(name[7],'p','I','n','d') && CMP4(name[11],'i','c','a','t') && CMP3(name[15],'o','r','\0')) {
          // setSleepIndicator  (src/jswrap_interactive.c)
          JsVar *pin = jspParseSingleFunction();
          jswrap_interface_setSleepIndicator(pin);
          jsvUnLock(pin);
          return 0;
        } else if (CMP4(name[3],'T','i','m','e') && CMP4(name[7],'o','u','t','\0')) {
          // setTimeout  (src/jswrap_io.c)
          JsVar *function, *timeout;
          jspParseFunction(0|JSP_NOSKIP_A, &function, &timeout, 0, 0);
          JsVar *_r = jswrap_interface_setTimeout(function, jsvGetFloatAndUnLock(timeout));
          jsvUnLock(function);
          return _r;
        } else if (CMP4(name[3],'W','a','t','c') && CMP2(name[7],'h','\0')) {
          // setWatch  (src/jswrap_io.c)
          JsVar *function, *pin, *options;
          jspParseFunction(0|JSP_NOSKIP_A, &function, &pin, &options, 0);
          JsVar *_r = jswrap_interface_setWatch(function, jshGetPinFromVarAndUnLock(pin), options);
          jsvUnLock(function);
          jsvUnLock(options);
          return _r;
        }
      }
    } else if (CMP2(name[0],'r','e')) {
      if (CMP4(name[2],'q','u','i','r') && CMP2(name[6],'e','\0')) {
        // require  (src/jswrap_modules.c)
        JsVar *moduleName = jspParseSingleFunction();
        JsVar *_r = jswrap_require(moduleName);
        jsvUnLock(moduleName);
        return _r;
      } else if (CMP4(name[2],'s','e','t','\0')) {
        // reset  (src/jswrap_interactive.c)
        jspParseEmptyFunction();
        jsiSetTodo(TODO_RESET);
        return 0;
      }
    } else if (name[0]=='U') {
      if (CMP3(name[1],'i','n','t')) {
        if (CMP4(name[4],'1','6','A','r') && CMP4(name[8],'r','a','y','\0')) {
          // Uint16Array.Uint16Array  (src/jswrap_arraybuffer.c)
          JsVar *arr, *byteOffset, *length;
          jspParseFunction(0, &arr, &byteOffset, &length, 0);
          JsVar *_r = jswrap_typedarray_constructor(ARRAYBUFFERVIEW_UINT16, arr, jsvGetInteger(byteOffset), jsvGetInteger(length));
          jsvUnLock(arr);
          jsvUnLock(byteOffset);
          jsvUnLock(length);
          return _r;
        } else if (CMP4(name[4],'8','A','r','r') && CMP3(name[8],'a','y','\0')) {
          // Uint8Array.Uint8Array  (src/jswrap_arraybuffer.c)
          JsVar *arr, *byteOffset, *length;
          jspParseFunction(0, &arr, &byteOffset, &length, 0);
          JsVar *_r = jswrap_typedarray_constructor(ARRAYBUFFERVIEW_UINT8, arr, jsvGetInteger(byteOffset), jsvGetInteger(length));
          jsvUnLock(arr);
          jsvUnLock(byteOffset);
          jsvUnLock(length);
          return _r;
        } else if (CMP4(name[4],'3','2','A','r') && CMP4(name[8],'r','a','y','\0')) {
          // Uint32Array.Uint32Array  (src/jswrap_arraybuffer.c)
          JsVar *arr, *byteOffset, *length;
          jspParseFunction(0, &arr, &byteOffset, &length, 0);
          JsVar *_r = jswrap_typedarray_constructor(ARRAYBUFFERVIEW_UINT32, arr, jsvGetInteger(byteOffset), jsvGetInteger(length));
          jsvUnLock(arr);
          jsvUnLock(byteOffset);
          jsvUnLock(length);
          return _r;
        }
      } else if (CMP3(name[1],'S','B','\0')) {
        // Object USB  (src/jswrap_serial.c)
        #if defined(USB)
        jspParseVariableName();
        return jspNewObject(jsiGetParser(), "USB", "Serial");
        #endif //defined(USB)
      }
    } else if (CMP4(name[0],'t','r','a','c') && CMP2(name[4],'e','\0')) {
      // trace  (src/jswrap_interactive.c)
      JsVar *root;
      jspParseFunction(0|JSP_NOSKIP_A, &root, 0, 0, 0);
      jswrap_interface_trace(root);
      jsvUnLock(root);
      return 0;
    } else if (name[0]=='I') {
      if (CMP2(name[1],'2','C')) {
        if (CMP2(name[3],'1','\0')) {
          // Object I2C1  (src/jswrap_spi_i2c.c)
          #if I2CS>=1
          jspParseVariableName();
          return jspNewObject(jsiGetParser(), "I2C1", "I2C");
          #endif //I2CS>=1
        } else if (CMP2(name[3],'3','\0')) {
          // Object I2C3  (src/jswrap_spi_i2c.c)
          #if I2CS>=3
          jspParseVariableName();
          return jspNewObject(jsiGetParser(), "I2C3", "I2C");
          #endif //I2CS>=3
        } else if (CMP2(name[3],'2','\0')) {
          // Object I2C2  (src/jswrap_spi_i2c.c)
          #if I2CS>=2
          jspParseVariableName();
          return jspNewObject(jsiGetParser(), "I2C2", "I2C");
          #endif //I2CS>=2
        }
      } else if (CMP2(name[1],'n','t')) {
        if (CMP4(name[3],'1','6','A','r') && CMP4(name[7],'r','a','y','\0')) {
          // Int16Array.Int16Array  (src/jswrap_arraybuffer.c)
          JsVar *arr, *byteOffset, *length;
          jspParseFunction(0, &arr, &byteOffset, &length, 0);
          JsVar *_r = jswrap_typedarray_constructor(ARRAYBUFFERVIEW_INT16, arr, jsvGetInteger(byteOffset), jsvGetInteger(length));
          jsvUnLock(arr);
          jsvUnLock(byteOffset);
          jsvUnLock(length);
          return _r;
        } else if (CMP4(name[3],'8','A','r','r') && CMP3(name[7],'a','y','\0')) {
          // Int8Array.Int8Array  (src/jswrap_arraybuffer.c)
          JsVar *arr, *byteOffset, *length;
          jspParseFunction(0, &arr, &byteOffset, &length, 0);
          JsVar *_r = jswrap_typedarray_constructor(ARRAYBUFFERVIEW_INT8, arr, jsvGetInteger(byteOffset), jsvGetInteger(length));
          jsvUnLock(arr);
          jsvUnLock(byteOffset);
          jsvUnLock(length);
          return _r;
        } else if (CMP4(name[3],'3','2','A','r') && CMP4(name[7],'r','a','y','\0')) {
          // Int32Array.Int32Array  (src/jswrap_arraybuffer.c)
          JsVar *arr, *byteOffset, *length;
          jspParseFunction(0, &arr, &byteOffset, &length, 0);
          JsVar *_r = jswrap_typedarray_constructor(ARRAYBUFFERVIEW_INT32, arr, jsvGetInteger(byteOffset), jsvGetInteger(length));
          jsvUnLock(arr);
          jsvUnLock(byteOffset);
          jsvUnLock(length);
          return _r;
        }
      }
    }
  }
  return JSW_HANDLEFUNCTIONCALL_UNHANDLED;
}


bool jswIsBuiltInObject(const char *name) {
  return
strcmp(name, "Pin")==0 ||
    strcmp(name, "Modules")==0 ||
    strcmp(name, "process")==0 ||
    strcmp(name, "console")==0 ||
    strcmp(name, "JSON")==0 ||
    strcmp(name, "Hardware")==0 ||
    strcmp(name, "Object")==0 ||
    strcmp(name, "Function")==0 ||
    strcmp(name, "Integer")==0 ||
    strcmp(name, "Double")==0 ||
    strcmp(name, "String")==0 ||
    strcmp(name, "Array")==0 ||
    strcmp(name, "ArrayBuffer")==0 ||
    strcmp(name, "ArrayBufferView")==0 ||
    strcmp(name, "Uint8Array")==0 ||
    strcmp(name, "Int8Array")==0 ||
    strcmp(name, "Uint16Array")==0 ||
    strcmp(name, "Int16Array")==0 ||
    strcmp(name, "Uint32Array")==0 ||
    strcmp(name, "Int32Array")==0 ||
    strcmp(name, "Float32Array")==0 ||
    strcmp(name, "Float64Array")==0 ||
    strcmp(name, "Serial")==0 ||
    strcmp(name, "SPI")==0 ||
    strcmp(name, "I2C")==0 ||
    strcmp(name, "OneWire")==0 ||
    strcmp(name, "Math")==0;
}


bool jswIsBuiltInLibrary(const char *name) {
  return
;
}


/** Given a variable, return the basic object name of it */
const char *jswGetBasicObjectName(JsVar *var) {
  if (jsvIsFunction(var)) return "Function";
  if (jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_INT32) return "Int32Array";
  if (jsvIsString(var)) return "String";
  if (jsvIsPin(var)) return "Pin";
  if (jsvIsFloat(var)) return "Double";
  if (jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_ARRAYBUFFER) return "ArrayBuffer";
  if (jsvIsObject(var)) return "Object";
  if (jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_UINT8) return "Uint8Array";
  if (jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_UINT16) return "Uint16Array";
  if (jsvIsRoot(var)) return "Hardware";
  if (jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_FLOAT64) return "Float64Array";
  if (jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_INT8) return "Int8Array";
  if (jsvIsInt(var)) return "Integer";
  if (jsvIsArray(var)) return "Array";
  if (jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_INT16) return "Int16Array";
  if (jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_FLOAT32) return "Float32Array";
  if (jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_UINT32) return "Uint32Array";
  return 0;
}


/** Given the name of a Basic Object, eg, Uint8Array, String, etc. Return the prototype object's name - or 0. */
const char *jswGetBasicObjectPrototypeName(const char *objectName) {
  if (!strcmp(objectName, "Uint8Array")) return "ArrayBufferView";
  if (!strcmp(objectName, "Int8Array")) return "ArrayBufferView";
  if (!strcmp(objectName, "Uint16Array")) return "ArrayBufferView";
  if (!strcmp(objectName, "Int16Array")) return "ArrayBufferView";
  if (!strcmp(objectName, "Uint32Array")) return "ArrayBufferView";
  if (!strcmp(objectName, "Int32Array")) return "ArrayBufferView";
  if (!strcmp(objectName, "Float32Array")) return "ArrayBufferView";
  if (!strcmp(objectName, "Float64Array")) return "ArrayBufferView";
  return strcmp(objectName,"Object") ? "Object" : 0;
}


