void _ejs_error_init(ejsval global) { ejsval toString = _ejs_function_new_native (_ejs_null, _ejs_atom_toString, (EJSClosureFunc)_ejs_Error_prototype_toString); _ejs_gc_add_root (&toString); #define EJS_ADD_NATIVE_ERROR_TYPE(err) EJS_MACRO_START \ _ejs_##err = _ejs_function_new_without_proto (_ejs_null, _ejs_atom_##err, (EJSClosureFunc)_ejs_##err##_impl); \ _ejs_object_setprop (global, _ejs_atom_##err, _ejs_##err); \ _ejs_##err##_prototype = _ejs_object_new(_ejs_null, &_ejs_Object_specops); \ _ejs_object_setprop (_ejs_##err, _ejs_atom_prototype, _ejs_##err##_prototype); \ _ejs_object_define_value_property (_ejs_##err##_prototype, _ejs_atom_constructor, _ejs_##err,\ EJS_PROP_NOT_ENUMERABLE | EJS_PROP_CONFIGURABLE | EJS_PROP_WRITABLE); \ \ _ejs_object_setprop (_ejs_##err##_prototype, _ejs_atom_name, _ejs_atom_##err); \ _ejs_object_setprop (_ejs_##err##_prototype, _ejs_atom_toString, toString); \ \ EJS_INSTALL_SYMBOL_FUNCTION_FLAGS (_ejs_##err, create, _ejs_Error_create, EJS_PROP_NOT_ENUMERABLE); \ EJS_MACRO_END EJS_ADD_NATIVE_ERROR_TYPE(Error); EJS_ADD_NATIVE_ERROR_TYPE(EvalError); EJS_ADD_NATIVE_ERROR_TYPE(RangeError); EJS_ADD_NATIVE_ERROR_TYPE(ReferenceError); EJS_ADD_NATIVE_ERROR_TYPE(SyntaxError); EJS_ADD_NATIVE_ERROR_TYPE(TypeError); EJS_ADD_NATIVE_ERROR_TYPE(URIError); _ejs_gc_remove_root (&toString); }
void _ejs_require_init(ejsval global) { _ejs_require = _ejs_function_new_native (_ejs_null, _ejs_atom_require, _ejs_require_impl); _ejs_object_setprop (global, _ejs_atom_require, _ejs_require); int i; for (i = 0; i < num_builtin_modules; i ++) { builtin_module_map[i].cached_exports = _ejs_null; } i = 0; while (1) { if (!_ejs_external_module_require_map[i].name) break; _ejs_external_module_require_map[i].cached_exports = _ejs_null; i++; } i = 0; while (1) { if (!_ejs_require_map[i].name) break; _ejs_require_map[i].cached_exports = _ejs_null; i++; } }
void _ejs_iterator_init_proto() { _ejs_gc_add_root (&_ejs_Generator_prototype); _ejs_Iterator_prototype = _ejs_object_new(_ejs_Object_prototype, &_ejs_Object_specops); ejsval _iterator = _ejs_function_new_native (_ejs_null, _ejs_Symbol_iterator, _ejs_Iterator_prototype_iterator); _ejs_object_define_value_property (_ejs_Iterator_prototype, _ejs_Symbol_iterator, _iterator, EJS_PROP_NOT_ENUMERABLE); }
ejsval _ejs_arguments_new (int numElements, ejsval* args) { size_t value_size = sizeof(EJSArguments) + numElements * sizeof(ejsval); EJSBool ool_buffer = EJS_FALSE; if (value_size > 2048) { value_size = sizeof(EJSArguments); ool_buffer = EJS_TRUE; } EJSArguments* arguments = _ejs_gc_new_obj(EJSArguments, value_size); _ejs_init_object ((EJSObject*)arguments, _ejs_Arguments__proto__, &_ejs_Arguments_specops); ejsval O = OBJECT_TO_EJSVAL((EJSObject*)arguments); // 7. Perform DefinePropertyOrThrow(obj, @@iterator, PropertyDescriptor {[[Value]]:%ArrayProto_values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}) ejsval _values = _ejs_function_new_native (_ejs_null, _ejs_atom_values, _ejs_Array_prototype_values); _ejs_object_define_value_property (O, _ejs_Symbol_iterator, _values, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_WRITABLE | EJS_PROP_CONFIGURABLE); ejsval thrower = _ejs_function_new_native (_ejs_null, _ejs_undefined, ThrowTypeError); // 8. Perform DefinePropertyOrThrow(obj, "caller", PropertyDescriptor {[[Get]]: %ThrowTypeError%, [[Set]]: %ThrowTypeError%, [[Enumerable]]: false, [[Configurable]]: false}). _ejs_object_define_accessor_property(O, _ejs_atom_caller, thrower, thrower, EJS_PROP_FLAGS_GETTER_SET | EJS_PROP_FLAGS_SETTER_SET | EJS_PROP_NOT_ENUMERABLE | EJS_PROP_NOT_CONFIGURABLE); // 9. Perform DefinePropertyOrThrow(obj, "callee", PropertyDescriptor {[[Get]]: %ThrowTypeError%, [[Set]]: %ThrowTypeError%, [[Enumerable]]: false, [[Configurable]]: false}). _ejs_object_define_accessor_property(O, _ejs_atom_callee, thrower, thrower, EJS_PROP_FLAGS_GETTER_SET | EJS_PROP_FLAGS_SETTER_SET | EJS_PROP_NOT_ENUMERABLE | EJS_PROP_NOT_CONFIGURABLE); arguments->argc = numElements; if (ool_buffer) { arguments->args = (ejsval*)calloc(numElements, sizeof (ejsval)); EJS_ARGUMENTS_SET_HAS_OOL_BUFFER(arguments); } else { arguments->args = (ejsval*)((char*)arguments + sizeof(EJSArguments)); } memmove (arguments->args, args, sizeof(ejsval) * numElements); return OBJECT_TO_EJSVAL(arguments); }
void _ejs_set_init(ejsval global) { _ejs_Set = _ejs_function_new_without_proto (_ejs_null, _ejs_atom_Set, (EJSClosureFunc)_ejs_Set_impl); _ejs_object_setprop (global, _ejs_atom_Set, _ejs_Set); _ejs_gc_add_root (&_ejs_Set_prototype); _ejs_Set_prototype = _ejs_set_new (); _ejs_object_setprop (_ejs_Set, _ejs_atom_prototype, _ejs_Set_prototype); #define OBJ_METHOD(x) EJS_INSTALL_ATOM_FUNCTION(_ejs_Set, x, _ejs_Set_##x) #define PROTO_METHOD(x) EJS_INSTALL_ATOM_FUNCTION_FLAGS(_ejs_Set_prototype, x, _ejs_Set_prototype_##x, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_WRITABLE | EJS_PROP_CONFIGURABLE) #define PROTO_GETTER(x) EJS_INSTALL_ATOM_GETTER(_ejs_Set_prototype, x, _ejs_Set_prototype_get_##x) PROTO_METHOD(add); PROTO_METHOD(clear); PROTO_METHOD(delete); PROTO_METHOD(entries); PROTO_METHOD(forEach); PROTO_METHOD(has); PROTO_GETTER(size); // expand PROTO_METHOD(values) here so that we can install the function for both keys and @@iterator below ejsval _values = _ejs_function_new_native (_ejs_null, _ejs_atom_values, (EJSClosureFunc)_ejs_Set_prototype_values); _ejs_object_define_value_property (_ejs_Set_prototype, _ejs_atom_values, _values, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_FLAGS_WRITABLE | EJS_PROP_CONFIGURABLE); _ejs_object_define_value_property (_ejs_Set_prototype, _ejs_atom_keys, _values, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_WRITABLE | EJS_PROP_CONFIGURABLE); _ejs_object_define_value_property (_ejs_Set_prototype, _ejs_Symbol_iterator, _values, EJS_PROP_NOT_ENUMERABLE); _ejs_object_define_value_property (_ejs_Set_prototype, _ejs_Symbol_toStringTag, _ejs_atom_Set, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_NOT_WRITABLE | EJS_PROP_CONFIGURABLE); EJS_INSTALL_SYMBOL_FUNCTION_FLAGS (_ejs_Set, create, _ejs_Set_create, EJS_PROP_NOT_ENUMERABLE); #undef OBJ_METHOD #undef PROTO_METHOD _ejs_SetIterator = _ejs_function_new_without_proto (_ejs_null, _ejs_atom_Set, (EJSClosureFunc)_ejs_SetIterator_impl); _ejs_gc_add_root (&_ejs_SetIterator_prototype); _ejs_SetIterator_prototype = _ejs_set_iterator_new(_ejs_Set_prototype, EJS_SET_ITER_KIND_VALUE); EJSVAL_TO_OBJECT(_ejs_SetIterator_prototype)->proto = _ejs_Object_prototype; _ejs_object_define_value_property (_ejs_SetIterator, _ejs_atom_prototype, _ejs_SetIterator_prototype, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_NOT_CONFIGURABLE | EJS_PROP_NOT_WRITABLE); _ejs_object_define_value_property (_ejs_SetIterator_prototype, _ejs_atom_constructor, _ejs_SetIterator, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_CONFIGURABLE | EJS_PROP_WRITABLE); #define PROTO_ITER_METHOD(x) EJS_INSTALL_ATOM_FUNCTION_FLAGS (_ejs_SetIterator_prototype, x, _ejs_SetIterator_prototype_##x, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_WRITABLE | EJS_PROP_CONFIGURABLE) PROTO_ITER_METHOD(next); #undef PROTO_ITER_METHOD }
void _ejs_init(int argc, char** argv) { // process class inheritance _ejs_init_classes(); // initialize our atoms before anything else _ejs_init_static_strings(); _ejs_gc_init(); _ejs_exception_init(); // initialization or ECMA262 builtins _ejs_gc_add_root (&_ejs_global); _ejs_global = _ejs_object_new (_ejs_null, &_ejs_Object_specops); _ejs_nan = NUMBER_TO_EJSVAL(nan("7734")); _ejs_object_setprop (_ejs_global, _ejs_atom_undefined, _ejs_undefined); _ejs_object_setprop (_ejs_global, _ejs_atom_NaN, _ejs_nan); _ejs_object_setprop (_ejs_global, _ejs_atom_Infinity, _ejs_Infinity); _ejs_object_setprop (_ejs_global, _ejs_atom_eval, _ejs_function_new_native (_ejs_undefined, _ejs_atom_eval, _ejs_eval)); _ejs_object_init_proto(); _ejs_function_init(_ejs_global); _ejs_object_init(_ejs_global); _ejs_symbol_init(_ejs_global); _ejs_error_init(_ejs_global); _ejs_arguments_init(_ejs_global); _ejs_array_init(_ejs_global); _ejs_boolean_init (_ejs_global); _ejs_string_init(_ejs_global); _ejs_number_init(_ejs_global); _ejs_regexp_init(_ejs_global); _ejs_date_init(_ejs_global); _ejs_json_init(_ejs_global); _ejs_math_init(_ejs_global); // ES6 bits _ejs_proxy_init(_ejs_global); _ejs_map_init(_ejs_global); _ejs_set_init(_ejs_global); _ejs_typedarrays_init(_ejs_global); #if IOS _ejs_webgl_init(_ejs_global); #endif #define GLOBAL_METHOD(x) EJS_MACRO_START \ _ejs_##x = _ejs_function_new_native (_ejs_null, _ejs_atom_##x, (EJSClosureFunc)_ejs_##x##_impl); \ _ejs_object_setprop (_ejs_global, _ejs_atom_##x, _ejs_##x); \ EJS_MACRO_END GLOBAL_METHOD(isNaN); GLOBAL_METHOD(isFinite); GLOBAL_METHOD(parseInt); GLOBAL_METHOD(parseFloat); GLOBAL_METHOD(decodeURI); GLOBAL_METHOD(decodeURIComponent); GLOBAL_METHOD(encodeURI); GLOBAL_METHOD(encodeURIComponent); #undef GLOBAL_METHOD // the node-like api we support in order for our driver to // function. this should really be a separate opt-in .a/.so. _ejs_require_init(_ejs_global); _ejs_console_init(_ejs_global); _ejs_process_init(_ejs_global, argc, argv); _ejs_xmlhttprequest_init(_ejs_global); // a special global (__ejs) under which we can stuff other // semi-useful runtime features, like a call to force a GC. the // compiler also uses the presence of __ejs to disable // buggy/nonfunctional code (like those that use regexps) ejsval _ejs_ejs_global = _ejs_object_new (_ejs_null, &_ejs_Object_specops); _ejs_object_setprop (_ejs_global, _ejs_atom___ejs, _ejs_ejs_global); _ejs_GC_init(_ejs_ejs_global); _ejs_gc_allocate_oom_exceptions(); }