void js_vm_object_delete_property (JSVirtualMachine *vm, JSObject *obj, JSSymbol prop) { unsigned int ui; /* Check if we already know this property. */ for (ui = 0; ui < obj->num_props; ui++) if (obj->props[ui].name == prop) { /* Found, remove it from our list of properties. */ obj->props[ui].name = JS_SYMBOL_NULL; obj->props[ui].value.type = JS_UNDEFINED; /* Remove its name from the hash (if present). */ if (obj->hash) { const char *name = js_vm_symname (vm, prop); hash_delete (vm, obj, name, strlen (name)); } /* All done here. */ return; } }
void js_vm_object_delete_array (JSVirtualMachine *vm, JSObject *obj, JSNode *sel) { if (sel->type == JS_INTEGER) { if (0 <= sel->u.vinteger && sel->u.vinteger < obj->num_props) { JSSymbol sym; sym = obj->props[sel->u.vinteger].name; obj->props[sel->u.vinteger].name = JS_SYMBOL_NULL; obj->props[sel->u.vinteger].value.type = JS_UNDEFINED; /* Remove its name from the hash (if present and it is not NULL). */ if (sym != JS_SYMBOL_NULL && obj->hash) { const char *name = js_vm_symname (vm, sym); hash_delete (vm, obj, name, strlen (name)); } } } else if (sel->type == JS_STRING) { int pos; if (obj->hash == NULL) hash_create (vm, obj); pos = hash_lookup (obj, (char *) sel->u.vstring->data, sel->u.vstring->len); if (pos >= 0) { /* Found it. */ obj->props[pos].name = JS_SYMBOL_NULL; obj->props[pos].value.type = JS_UNDEFINED; /* And, delete its name from the hash. */ hash_delete (vm, obj, (char *) sel->u.vstring->data, sel->u.vstring->len); } } else { sprintf (vm->error, "delete_array: illegal array index"); js_vm_error (vm); } }
/* Property proc. */ static int property (JSVirtualMachine *vm, JSBuiltinInfo *builtin_info, void *instance_context, JSSymbol property, int set, JSNode *node) { CursesCtx *ctx = builtin_info->obj_context; if (property == ctx->s_LINES) { if (set) goto immutable; node->type = JS_INTEGER; node->u.vinteger = LINES; } else if (property == ctx->s_COLS) { if (set) goto immutable; node->type = JS_INTEGER; node->u.vinteger = COLS; } else { if (!set) node->type = JS_UNDEFINED; return JS_PROPERTY_UNKNOWN; } return JS_PROPERTY_FOUND; /* * Error handling. */ immutable: sprintf (vm->error, "Curses.%s: immutable property", js_vm_symname (vm, property)); js_vm_error (vm); /* NOTREACHED. */ return 0; }
static void hash_create (JSVirtualMachine *vm, JSObject *obj) { int i; obj->hash = js_vm_alloc (vm, HASH_SIZE * sizeof (JSObjectPropHashBucket *)); memset (obj->hash, 0, HASH_SIZE * sizeof (JSObjectPropHashBucket *)); obj->hash_lengths = js_vm_alloc (vm, HASH_SIZE * sizeof (unsigned int)); memset (obj->hash_lengths, 0, HASH_SIZE * sizeof (unsigned int)); /* Insert all known properties to the hash. */ for (i = 0; i < obj->num_props; i++) if (obj->props[i].name != JS_SYMBOL_NULL) { const char *name; name = js_vm_symname (vm, obj->props[i].name); hash_insert (vm, obj, name, strlen (name), i); } }
void js_vm_object_store_property (JSVirtualMachine *vm, JSObject *obj, JSSymbol prop, JSNode *val) { unsigned int ui; JSSymbol free_slot = JS_SYMBOL_NULL; /* Check if we already know this property. */ for (ui = 0; ui < obj->num_props; ui++) if (obj->props[ui].name == prop) { JS_COPY (&obj->props[ui].value, val); return; } else if (obj->props[ui].name == JS_SYMBOL_NULL) free_slot = ui; /* Must create a new property. */ if (free_slot == JS_SYMBOL_NULL) { /* Expand our array of properties. */ obj->props = js_vm_realloc (vm, obj->props, (obj->num_props + 1) * sizeof (JSProperty)); free_slot = obj->num_props++; } obj->props[free_slot].name = prop; obj->props[free_slot].attributes = 0; JS_COPY (&obj->props[free_slot].value, val); /* Insert it to the hash (if the hash has been created). */ if (obj->hash) { const char *name; name = js_vm_symname (vm, prop); hash_insert (vm, obj, name, strlen (name), free_slot); } }
/* Property proc. */ static int property (JSVirtualMachine *vm, JSBuiltinInfo *builtin_info, void *instance_context, JSSymbol method, int set, JSNode *node) { XJSCtx *ctx = builtin_info->obj_context; XJSInstanceCtx *instance = instance_context; if (method == ctx->s_errorMessage) { char *cp = instance->interp->vm->error; if (set) goto immutable; js_vm_make_string (vm, node, cp, strlen (cp)); } else { if (!set) node->type = JS_UNDEFINED; return JS_PROPERTY_UNKNOWN; } return JS_PROPERTY_FOUND; /* * Error handling. */ immutable: sprintf (vm->error, "JS.%s: immutable property", js_vm_symname (vm, method)); js_vm_error (vm); /* NOTREACHED. */ return 0; }
/* Method proc. */ static int method (JSVirtualMachine *vm, JSBuiltinInfo *builtin_info, void *instance_context, JSSymbol method, JSNode *result_return, JSNode *args) { JSNode *n = instance_context; char buf[256]; if (method == vm->syms.s_toString) { if (n) { int radix = 10; if (args->u.vinteger == 0) ; else if (args->u.vinteger == 1) { if (args[1].type != JS_INTEGER) goto argument_type_error; radix = args[1].u.vinteger; } else goto argument_error; if (n->type == JS_INTEGER) { switch (radix) { case 8: sprintf (buf, "%o", (unsigned int) n->u.vinteger); break; case 10: sprintf (buf, "%ld", n->u.vinteger); break; case 16: sprintf (buf, "%lx", (unsigned long) n->u.vinteger); break; default: sprintf (vm->error, "Number.%s(): illegal radix %d", js_vm_symname (vm, method), radix); break; } } else if (n->type == JS_FLOAT) sprintf (buf, "%g", n->u.vfloat); else sprintf (buf, "NaN"); js_vm_make_string (vm, result_return, buf, strlen (buf)); } else { if (args->u.vinteger != 0) goto argument_error; js_vm_make_static_string (vm, result_return, "Number", 6); } } /* ********************************************************************** */ else return JS_PROPERTY_UNKNOWN; return JS_PROPERTY_FOUND; /* * Error handling. */ argument_error: sprintf (vm->error, "Number.%s(): illegal amount of arguments", js_vm_symname (vm, method)); js_vm_error (vm); argument_type_error: sprintf (vm->error, "Number.%s(): illegal argument", js_vm_symname (vm, method)); js_vm_error (vm); /* NOTREACHED */ return 0; }
/* Property proc. */ static int property (JSVirtualMachine *vm, JSBuiltinInfo *builtin_info, void *instance_context, JSSymbol property, int set, JSNode *node) { NumberCtx *ctx = builtin_info->obj_context; /* The default result type. */ node->type = JS_FLOAT; if (property == ctx->s_MAX_VALUE) { if (set) goto immutable; node->u.vfloat = DBL_MAX; } else if (property == ctx->s_MIN_VALUE) { if (set) goto immutable; node->u.vfloat = DBL_MIN; } else if (property == ctx->s_NaN) { if (set) goto immutable; node->type = JS_NAN; } else if (property == ctx->s_NEGATIVE_INFINITY) { if (set) goto immutable; node->u.vfloat = -HUGE_VAL; } else if (property == ctx->s_POSITIVE_INFINITY) { if (set) goto immutable; node->u.vfloat = HUGE_VAL; } else { if (!set) node->type = JS_UNDEFINED; return JS_PROPERTY_UNKNOWN; } return JS_PROPERTY_FOUND; /* * Error handling. */ immutable: sprintf (vm->error, "Number.%s: immutable property", js_vm_symname (vm, property)); js_vm_error (vm); /* NOTREACHED */ return 0; }
/* Method proc. */ static int method (JSVirtualMachine *vm, JSBuiltinInfo *builtin_info, void *instance_context, JSSymbol method, JSNode *result_return, JSNode *args) { CursesCtx *ctx = builtin_info->obj_context; char *cp; /* The default result. */ result_return->type = JS_BOOLEAN; result_return->u.vboolean = 1; if (method == ctx->s_addstr) { if (args->u.vinteger != 1) goto argument_error; if (args[1].type != JS_STRING) goto argument_type_error; cp = js_string_to_c_string (vm, &args[1]); addstr (cp); js_free (cp); } /* ********************************************************************** */ else if (method == ctx->s_attron) { if (args->u.vinteger != 1) goto argument_error; if (args[1].type != JS_INTEGER) goto argument_type_error; attron (args[1].u.vinteger); } /* ********************************************************************** */ else if (method == ctx->s_attroff) { if (args->u.vinteger != 1) goto argument_error; if (args[1].type != JS_INTEGER) goto argument_type_error; attroff (args[1].u.vinteger); } /* ********************************************************************** */ else if (method == ctx->s_beep) { if (args->u.vinteger != 0) goto argument_error; beep (); } /* ********************************************************************** */ else if (method == ctx->s_cbreak) { if (args->u.vinteger != 0) goto argument_error; cbreak (); } /* ********************************************************************** */ else if (method == ctx->s_clear) { if (args->u.vinteger != 0) goto argument_error; clear (); } /* ********************************************************************** */ else if (method == ctx->s_clrtobot) { if (args->u.vinteger != 0) goto argument_error; clrtobot (); } /* ********************************************************************** */ else if (method == ctx->s_clrtoeol) { if (args->u.vinteger != 0) goto argument_error; clrtoeol (); } /* ********************************************************************** */ else if (method == ctx->s_echo) { if (args->u.vinteger != 0) goto argument_error; echo (); } /* ********************************************************************** */ else if (method == ctx->s_endwin) { if (args->u.vinteger != 0) goto argument_error; endwin (); } /* ********************************************************************** */ else if (method == ctx->s_getch) { if (args->u.vinteger != 0) goto argument_error; result_return->type = JS_INTEGER; result_return->u.vinteger = getch (); } /* ********************************************************************** */ else if (method == ctx->s_initscr) { if (args->u.vinteger != 0) goto argument_error; if (initscr () == (WINDOW *) ERR) result_return->u.vboolean = 0; } /* ********************************************************************** */ else if (method == ctx->s_keypad) { if (args->u.vinteger != 1) goto argument_error; if (args[1].type != JS_BOOLEAN) goto argument_type_error; keypad (stdscr, args->u.vboolean); } /* ********************************************************************** */ else if (method == ctx->s_move) { if (args->u.vinteger != 2) goto argument_error; if (args[1].type != JS_INTEGER || args[2].type != JS_INTEGER) goto argument_type_error; move (args[1].u.vinteger, args[2].u.vinteger); } /* ********************************************************************** */ else if (method == ctx->s_mvaddstr) { if (args->u.vinteger != 3) goto argument_error; if (args[1].type != JS_INTEGER || args[2].type != JS_INTEGER || args[3].type != JS_STRING) goto argument_type_error; cp = js_string_to_c_string (vm, &args[3]); mvaddstr (args[1].u.vinteger, args[2].u.vinteger, cp); js_free (cp); } /* ********************************************************************** */ else if (method == ctx->s_mvaddsubstr) { int start, length; if (args->u.vinteger != 4 && args->u.vinteger != 5) goto argument_error; if (args[1].type != JS_INTEGER || args[2].type != JS_INTEGER || args[3].type != JS_STRING || args[4].type != JS_INTEGER) goto argument_type_error; start = args[4].u.vinteger; if (args->u.vinteger == 5) { if (args[5].type != JS_INTEGER) goto argument_type_error; length = args[5].u.vinteger; if (length < 0) length = 0; } else length = args[3].u.vstring->len; if (start < 0) start += args[3].u.vstring->len; if (start < 0) start = 0; if (start > args[3].u.vstring->len) start = args[3].u.vstring->len; if (start + length > args[3].u.vstring->len) length = args[3].u.vstring->len - start; cp = js_malloc (vm, length + 1); memcpy (cp, args[3].u.vstring->data + start, length); cp[length] = '\0'; mvaddstr (args[1].u.vinteger, args[2].u.vinteger, cp); js_free (cp); } /* ********************************************************************** */ else if (method == ctx->s_mvgetch) { if (args->u.vinteger != 2) goto argument_error; if (args[1].type != JS_INTEGER || args[2].type != JS_INTEGER) goto argument_type_error; result_return->type = JS_INTEGER; result_return->u.vinteger = mvgetch (args[1].u.vinteger, args[2].u.vinteger); } /* ********************************************************************** */ else if (method == ctx->s_nocbreak) { if (args->u.vinteger != 0) goto argument_error; nocbreak (); } /* ********************************************************************** */ else if (method == ctx->s_noecho) { if (args->u.vinteger != 0) goto argument_error; noecho (); } /* ********************************************************************** */ else if (method == ctx->s_refresh) { if (args->u.vinteger != 0) goto argument_error; refresh (); } /* ********************************************************************** */ else if (method == ctx->s_standend) { if (args->u.vinteger != 0) goto argument_error; standend (); } /* ********************************************************************** */ else if (method == ctx->s_standout) { if (args->u.vinteger != 0) goto argument_error; standout (); } /* ********************************************************************** */ else if (method == vm->syms.s_toString) { if (args->u.vinteger != 0) goto argument_error; js_vm_make_static_string (vm, result_return, "Curses", 6); } /* ********************************************************************** */ else return JS_PROPERTY_UNKNOWN; return JS_PROPERTY_FOUND; /* * Error handling. */ argument_error: sprintf (vm->error, "Curses.%s(): illegal amount of arguments", js_vm_symname (vm, method)); js_vm_error (vm); argument_type_error: sprintf (vm->error, "Curses.%s(): illegal argument", js_vm_symname (vm, method)); js_vm_error (vm); /* NOTREACHED. */ return 0; }
/* Method proc. */ static int method (JSVirtualMachine *vm, JSBuiltinInfo *builtin_info, void *instance_context, JSSymbol method, JSNode *result_return, JSNode *args) { ArrayCtx *ctx = builtin_info->obj_context; JSNode *n = instance_context; int i; /* Set the default result type. */ result_return->type = JS_UNDEFINED; if (method == ctx->s_concat) { if (args->u.vinteger != 1) goto argument_error; if (args[1].type != JS_ARRAY) goto argument_type_error; js_vm_make_array (vm, result_return, n->u.varray->length + args[1].u.varray->length); memcpy (result_return->u.varray->data, n->u.varray->data, n->u.varray->length * sizeof (JSNode)); memcpy (&result_return->u.varray->data[n->u.varray->length], args[1].u.varray->data, args[1].u.varray->length * sizeof (JSNode)); } /* ********************************************************************** */ else if (method == ctx->s_join || method == vm->syms.s_toString) { char *glue = NULL; if (method == vm->syms.s_toString) { if (args->u.vinteger != 0) goto argument_error; } else { if (args->u.vinteger == 0) ; else if (args->u.vinteger == 1) { JSNode glue_result; js_vm_to_string (vm, &args[1], &glue_result); glue = js_string_to_c_string (vm, &glue_result); } else goto argument_error; } /* Ok, ready to run. */ if (n->u.varray->length == 0) js_vm_make_static_string (vm, result_return, "", 0); else { int len; int glue_len = glue ? strlen (glue) : 1; /* Estimate the result length. */ len = (n->u.varray->length * 5 + (n->u.varray->length - 1) * glue_len); js_vm_make_string (vm, result_return, NULL, len); result_return->u.vstring->len = 0; /* Do the join. */ for (i = 0; i < n->u.varray->length; i++) { JSNode sitem; int delta; js_vm_to_string (vm, &n->u.varray->data[i], &sitem); delta = sitem.u.vstring->len; if (i + 1 < n->u.varray->length) delta += glue_len; result_return->u.vstring->data = js_vm_realloc (vm, result_return->u.vstring->data, result_return->u.vstring->len + delta); memcpy (result_return->u.vstring->data + result_return->u.vstring->len, sitem.u.vstring->data, sitem.u.vstring->len); result_return->u.vstring->len += sitem.u.vstring->len; if (i + 1 < n->u.varray->length) { if (glue) { memcpy (result_return->u.vstring->data + result_return->u.vstring->len, glue, glue_len); result_return->u.vstring->len += glue_len; } else result_return->u.vstring->data [result_return->u.vstring->len++] = ','; } } } if (glue) js_free (glue); } /* ********************************************************************** */ else if (method == ctx->s_pop) { if (args->u.vinteger != 0) goto argument_error; if (n->u.varray->length == 0) result_return->type = JS_UNDEFINED; else { JS_COPY (result_return, &n->u.varray->data[n->u.varray->length - 1]); n->u.varray->length--; } } /* ********************************************************************** */ else if (method == ctx->s_push) { int old_len; if (args->u.vinteger == 0) goto argument_error; old_len = n->u.varray->length; js_vm_expand_array (vm, n, n->u.varray->length + args->u.vinteger); for (i = 0; i < args->u.vinteger; i++) JS_COPY (&n->u.varray->data[old_len + i], &args[i + 1]); JS_COPY (result_return, &args[i]); } /* ********************************************************************** */ else if (method == ctx->s_reverse) { if (args->u.vinteger != 0) goto argument_error; for (i = 0; i < n->u.varray->length / 2; i++) { JSNode tmp; JS_COPY (&tmp, &n->u.varray->data[i]); JS_COPY (&n->u.varray->data[i], &n->u.varray->data[n->u.varray->length - i - 1]); JS_COPY (&n->u.varray->data[n->u.varray->length - i - 1], &tmp); } } /* ********************************************************************** */ else if (method == ctx->s_shift) { if (args->u.vinteger != 0) goto argument_error; if (n->u.varray->length == 0) result_return->type = JS_UNDEFINED; else { JS_COPY (result_return, &n->u.varray->data[0]); memmove (&n->u.varray->data[0], &n->u.varray->data[1], (n->u.varray->length - 1) * sizeof (JSNode)); n->u.varray->length--; } } /* ********************************************************************** */ else if (method == ctx->s_slice) { int start, end; if (args->u.vinteger < 1 || args->u.vinteger > 2) goto argument_error; if (args[1].type != JS_INTEGER) goto argument_type_error; start = args[1].u.vinteger; if (args->u.vinteger == 2) { if (args[2].type != JS_INTEGER) goto argument_type_error; end = args[2].u.vinteger; } else end = n->u.varray->length; if (end < 0) end += n->u.varray->length; if (end < 0) end = start; js_vm_make_array (vm, result_return, end - start); /* Copy items. */ for (i = 0; i < end - start; i++) JS_COPY (&result_return->u.varray->data[i], &n->u.varray->data[start + i]); } /* ********************************************************************** */ else if (method == ctx->s_splice) { unsigned int new_length; unsigned int old_length; int delta; if (args->u.vinteger < 2) goto argument_error; if (args[1].type != JS_INTEGER || args[2].type != JS_INTEGER) goto argument_type_error; if (args[2].u.vinteger == 0 && args->u.vinteger == 2) /* No deletions: must specify at least one item to insert. */ goto argument_error; old_length = new_length = n->u.varray->length; if (args[1].u.vinteger < new_length) { if (args[2].u.vinteger > new_length - args[1].u.vinteger) { args[2].u.vinteger = new_length - args[1].u.vinteger; new_length = args[1].u.vinteger; } else new_length -= args[2].u.vinteger; } else { new_length = args[1].u.vinteger; args[2].u.vinteger = 0; } new_length += args->u.vinteger - 2; if (new_length > n->u.varray->length) js_vm_expand_array (vm, n, new_length); else /* Cut the array. */ n->u.varray->length = new_length; /* Do the stuffs we must do. */ /* Create the result array. */ if (args[2].u.vinteger == 0) result_return->type = JS_UNDEFINED; else { js_vm_make_array (vm, result_return, args[2].u.vinteger); for (i = 0; i < args[2].u.vinteger; i++) JS_COPY (&result_return->u.varray->data[i], &n->u.varray->data[args[1].u.vinteger + i]); } /* Delete and move. */ delta = args->u.vinteger - 2 - args[2].u.vinteger; memmove (&n->u.varray->data[args[1].u.vinteger + args[2].u.vinteger + delta], &n->u.varray->data[args[1].u.vinteger + args[2].u.vinteger], (old_length - (args[1].u.vinteger + args[2].u.vinteger)) * sizeof (JSNode)); /* Insert. */ for (i = 0; i < args->u.vinteger - 2; i++) JS_COPY (&n->u.varray->data[args[1].u.vinteger + i], &args[i + 3]); } /* ********************************************************************** */ else if (method == ctx->s_sort) { MergesortCompFunc func; ArraySortCtx array_sort_ctx; void *func_ctx = NULL; /* Initialized to keep compiler quiet. */ if (args->u.vinteger == 0) { func = sort_default_cmp_func; func_ctx = vm; } else if (args->u.vinteger == 1) { if (args[1].type != JS_FUNC && args[1].type != JS_BUILTIN) goto argument_type_error; func = sort_js_cmp_func; /* Init context. */ array_sort_ctx.vm = vm; array_sort_ctx.func = &args[1]; /* Init the argc part of the argument vector here. */ array_sort_ctx.argv[0].type = JS_INTEGER; array_sort_ctx.argv[0].u.vinteger = 3; func_ctx = &array_sort_ctx; } else goto argument_error; mergesort_r (n->u.varray->data, n->u.varray->length, sizeof (JSNode), func, func_ctx); } /* ********************************************************************** */ else if (method == ctx->s_unshift) { int old_len; if (args->u.vinteger == 0) goto argument_error; old_len = n->u.varray->length; js_vm_expand_array (vm, n, n->u.varray->length + args->u.vinteger); memmove (&n->u.varray->data[args->u.vinteger], n->u.varray->data, old_len * sizeof (JSNode)); for (i = 0; i < args->u.vinteger; i++) JS_COPY (&n->u.varray->data[i], &args[args->u.vinteger - i]); result_return->type = JS_INTEGER; result_return->u.vinteger = n->u.varray->length; } /* ********************************************************************** */ else return JS_PROPERTY_UNKNOWN; return JS_PROPERTY_FOUND; /* * Error handling. */ argument_error: sprintf (vm->error, "Array.%s(): illegal amount of arguments", js_vm_symname (vm, method)); js_vm_error (vm); argument_type_error: sprintf (vm->error, "Array.%s(): illegal argument", js_vm_symname (vm, method)); js_vm_error (vm); /* NOTREACHED */ return 0; }
/* Method proc. */ static int method (JSVirtualMachine *vm, JSBuiltinInfo *builtin_info, void *instance_context, JSSymbol method, JSNode *result_return, JSNode *args) { XJSCtx *ctx = builtin_info->obj_context; XJSInstanceCtx *instance = instance_context; /* The default result is false. */ result_return->type = JS_BOOLEAN; result_return->u.vboolean = 0; /* * Static methods. */ if (method == vm->syms.s_toString) { if (args->u.vinteger != 0) goto argument_error; if (instance) js_vm_make_static_string (vm, result_return, "JSInterp", 8); else js_vm_make_static_string (vm, result_return, "JS", 2); } /* ********************************************************************** */ else if (instance) { /* * Instance methods. */ if (method == ctx->s_compile) { if (args->u.vinteger != 3) goto argument_error; if (args[1].type != JS_STRING || (args[2].type != JS_NULL && args[2].type != JS_STRING) || (args[3].type != JS_NULL && args[3].type != JS_STRING)) goto argument_type_error; } /* ***************************************************************** */ else if (method == ctx->s_eval) { if (args->u.vinteger != 1) goto argument_error; if (args[1].type != JS_STRING) goto argument_type_error; result_return->type = JS_BOOLEAN; result_return->u.vboolean = (js_eval_data (instance->interp, args[1].u.vstring->data, args[1].u.vstring->len) != 0); } /* ***************************************************************** */ else if (method == ctx->s_evalFile) { char *path; if (args->u.vinteger != 1) goto argument_error; if (args[1].type != JS_STRING) goto argument_type_error; path = js_string_to_c_string (vm, &args[1]); result_return->type = JS_BOOLEAN; result_return->u.vboolean = (js_eval_file (instance->interp, path) != 0); js_free (path); } /* ***************************************************************** */ else if (method == ctx->s_evalJavaScriptFile) { char *path; if (args->u.vinteger != 1) goto argument_error; if (args[1].type != JS_STRING) goto argument_type_error; path = js_string_to_c_string (vm, &args[1]); result_return->type = JS_BOOLEAN; result_return->u.vboolean = (js_eval_javascript_file (instance->interp, path) != 0); js_free (path); } /* ***************************************************************** */ else if (method == ctx->s_executeByteCodeFile) { char *path; if (args->u.vinteger != 1) goto argument_error; if (args[1].type != JS_STRING) goto argument_type_error; path = js_string_to_c_string (vm, &args[1]); result_return->type = JS_BOOLEAN; result_return->u.vboolean = (js_execute_byte_code_file (instance->interp, path) != 0); js_free (path); } /* ***************************************************************** */ else if (method == ctx->s_getVar) { char *cp; JSType value; if (args->u.vinteger != 1) goto argument_error; if (args[1].type != JS_STRING) goto argument_type_error; cp = js_string_to_c_string (vm, &args[1]); js_get_var (instance->interp, cp, &value); js_free (cp); copy_from_type_to_node (vm, result_return, &value); } /* ***************************************************************** */ else if (method == ctx->s_setVar) { char *cp; JSType value; if (args->u.vinteger != 2) goto argument_error; if (args[1].type != JS_STRING) goto argument_type_error; copy_from_node_to_type (instance->interp, &value, &args[2]); cp = js_string_to_c_string (vm, &args[1]); js_set_var (instance->interp, cp, &value); js_free (cp); result_return->type = JS_UNDEFINED; } /* ***************************************************************** */ else return JS_PROPERTY_UNKNOWN; } /* ********************************************************************** */ else return JS_PROPERTY_UNKNOWN; return JS_PROPERTY_FOUND; /* * Error handling. */ argument_error: sprintf (vm->error, "JS.%s(): illegal amount of arguments", js_vm_symname (vm, method)); js_vm_error (vm); argument_type_error: sprintf (vm->error, "JS.%s(): illegal argument", js_vm_symname (vm, method)); js_vm_error (vm); /* NOTREACHED */ return 0; }