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_require_init(ejsval global) { _ejs_require = _ejs_function_new_without_proto (_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_symbol_init(ejsval global) { _ejs_Symbol = _ejs_function_new_without_proto (_ejs_null, _ejs_atom_Symbol, _ejs_Symbol_impl); _ejs_object_setprop (global, _ejs_atom_Symbol, _ejs_Symbol); _ejs_gc_add_root (&_ejs_Symbol_prototype); _ejs_Symbol_prototype = _ejs_object_new(_ejs_null, &_ejs_Object_specops); // XXX _ejs_object_setprop (_ejs_Symbol, _ejs_atom_prototype, _ejs_Symbol_prototype); PROTO_METHOD(toString); PROTO_METHOD(valueOf); OBJ_METHOD(for); OBJ_METHOD(keyFor); WELL_KNOWN_SYMBOL(hasInstance); WELL_KNOWN_SYMBOL(isConcatSpreadable); WELL_KNOWN_SYMBOL(species); WELL_KNOWN_SYMBOL(iterator); WELL_KNOWN_SYMBOL(toPrimitive); WELL_KNOWN_SYMBOL(toStringTag); WELL_KNOWN_SYMBOL(unscopables); WELL_KNOWN_SYMBOL(match); WELL_KNOWN_SYMBOL(replace); WELL_KNOWN_SYMBOL(split); WELL_KNOWN_SYMBOL(search); _ejs_object_define_value_property (_ejs_Symbol_prototype, _ejs_Symbol_toStringTag, _ejs_atom_Symbol, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_NOT_WRITABLE | EJS_PROP_CONFIGURABLE); }
void _ejs_function_init(ejsval global) { trace = getenv("EJS_TRACE") != NULL; _ejs_function_init_proto(); _ejs_Function = _ejs_function_new_without_proto (_ejs_null, _ejs_atom_Function, (EJSClosureFunc)_ejs_Function_impl); _ejs_object_setprop (global, _ejs_atom_Function, _ejs_Function); // ECMA262 15.3.3.1 _ejs_object_define_value_property (_ejs_Function, _ejs_atom_prototype, _ejs_Function_prototype, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_NOT_CONFIGURABLE | EJS_PROP_NOT_WRITABLE); // ECMA262 15.3.3.2 _ejs_object_define_value_property (_ejs_Function, _ejs_atom_length, NUMBER_TO_EJSVAL(1), EJS_PROP_NOT_ENUMERABLE | EJS_PROP_NOT_CONFIGURABLE | EJS_PROP_NOT_WRITABLE); #define PROTO_METHOD(x) EJS_INSTALL_ATOM_FUNCTION_FLAGS(_ejs_Function_prototype, x, _ejs_Function_prototype_##x, EJS_PROP_NOT_ENUMERABLE) PROTO_METHOD(toString); PROTO_METHOD(apply); PROTO_METHOD(call); PROTO_METHOD(bind); #undef PROTO_METHOD }
void _ejs_promise_init(ejsval global) { _ejs_Promise = _ejs_function_new_without_proto (_ejs_null, _ejs_atom_Promise, (EJSClosureFunc)_ejs_Promise_impl); _ejs_object_setprop (global, _ejs_atom_Promise, _ejs_Promise); _ejs_gc_add_root (&_ejs_Promise_prototype); _ejs_Promise_prototype = _ejs_object_new(_ejs_null, &_ejs_Object_specops); _ejs_object_setprop (_ejs_Promise, _ejs_atom_prototype, _ejs_Promise_prototype); _ejs_object_define_value_property (_ejs_Promise_prototype, _ejs_atom_constructor, _ejs_Promise, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_CONFIGURABLE | EJS_PROP_WRITABLE); #define PROTO_METHOD(x) EJS_INSTALL_ATOM_FUNCTION_FLAGS (_ejs_Promise_prototype, x, _ejs_Promise_prototype_##x, EJS_PROP_NOT_ENUMERABLE) #define OBJ_METHOD(x) EJS_INSTALL_ATOM_FUNCTION_FLAGS (_ejs_Promise, x, _ejs_Promise_##x, EJS_PROP_NOT_ENUMERABLE) PROTO_METHOD(catch); PROTO_METHOD(then); _ejs_object_define_value_property (_ejs_Promise_prototype, _ejs_Symbol_toStringTag, _ejs_atom_Promise, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_NOT_WRITABLE | EJS_PROP_CONFIGURABLE); OBJ_METHOD(all); OBJ_METHOD(race); OBJ_METHOD(reject); OBJ_METHOD(resolve); #undef PROTO_METHOD EJS_INSTALL_SYMBOL_FUNCTION_FLAGS (_ejs_Promise, create, _ejs_Promise_create, EJS_PROP_NOT_ENUMERABLE); _ejs_gc_add_root(&_ejs_identity_function); _ejs_identity_function = _ejs_function_new_anon(_ejs_undefined, identity); _ejs_gc_add_root(&_ejs_thrower_function); _ejs_thrower_function = _ejs_function_new_anon(_ejs_undefined, thrower); }
void _ejs_weakset_init(ejsval global) { _ejs_gc_add_root (&_ejs_WeakSetData_symbol); _ejs_WeakSetData_symbol = _ejs_symbol_new(_ejs_atom_WeakSetData); _ejs_WeakSet = _ejs_function_new_without_proto (_ejs_null, _ejs_atom_WeakSet, _ejs_WeakSet_impl); _ejs_object_setprop (global, _ejs_atom_WeakSet, _ejs_WeakSet); _ejs_gc_add_root (&_ejs_WeakSet_prototype); _ejs_WeakSet_prototype = _ejs_object_new (_ejs_Object_prototype, &_ejs_Object_specops); _ejs_object_setprop (_ejs_WeakSet, _ejs_atom_prototype, _ejs_WeakSet_prototype); #define OBJ_METHOD(x) EJS_INSTALL_ATOM_FUNCTION(_ejs_WeakSet, x, _ejs_WeakSet_##x) #define PROTO_METHOD(x) EJS_INSTALL_ATOM_FUNCTION_FLAGS(_ejs_WeakSet_prototype, x, _ejs_WeakSet_prototype_##x, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_WRITABLE | EJS_PROP_CONFIGURABLE) #define PROTO_GETTER(x) EJS_INSTALL_ATOM_GETTER(_ejs_WeakSet_prototype, x, _ejs_WeakSet_prototype_get_##x) PROTO_METHOD(add); // XXX (ES6 23.4.3.2) WeakSet.prototype.constructor PROTO_METHOD(delete); PROTO_METHOD(has); _ejs_object_define_value_property (_ejs_WeakSet_prototype, _ejs_Symbol_toStringTag, _ejs_atom_WeakSet, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_NOT_WRITABLE | EJS_PROP_CONFIGURABLE); #undef OBJ_METHOD #undef PROTO_METHOD }
ejsval _ejs_function_new_utf8_without_proto (ejsval env, const char* name, EJSClosureFunc func) { ejsval function_name = _ejs_string_new_utf8 (name); ejsval rv = _ejs_function_new_without_proto (env, function_name, func); return rv; }
void _ejs_regexp_init(ejsval global) { _ejs_RegExp = _ejs_function_new_without_proto (_ejs_null, _ejs_atom_RegExp, (EJSClosureFunc)_ejs_RegExp_impl); _ejs_object_setprop (global, _ejs_atom_RegExp, _ejs_RegExp); _ejs_gc_add_root (&_ejs_RegExp_prototype); _ejs_RegExp_prototype = _ejs_object_new(_ejs_null, &_ejs_RegExp_specops); EJSRegExp* re_proto = (EJSRegExp*)EJSVAL_TO_OBJECT(_ejs_RegExp_prototype); re_proto->pattern = _ejs_string_new_utf8("(?:)"); re_proto->flags = _ejs_atom_empty; _ejs_object_setprop (_ejs_RegExp, _ejs_atom_prototype, _ejs_RegExp_prototype); #define OBJ_METHOD(x) EJS_INSTALL_ATOM_FUNCTION(_ejs_RegExp, x, _ejs_RegExp_##x) #define PROTO_METHOD(x) EJS_INSTALL_ATOM_FUNCTION(_ejs_RegExp_prototype, x, _ejs_RegExp_prototype_##x) #define PROTO_METHOD_VAL(x) EJS_INSTALL_ATOM_FUNCTION_VAL(_ejs_RegExp_prototype, x, _ejs_RegExp_prototype_##x) #define PROTO_GETTER(x) EJS_INSTALL_ATOM_GETTER(_ejs_RegExp_prototype, x, _ejs_RegExp_prototype_get_##x) _ejs_gc_add_root (&_ejs_RegExp_prototype_exec_closure); _ejs_RegExp_prototype_exec_closure = PROTO_METHOD_VAL(exec); PROTO_METHOD(test); PROTO_METHOD(toString); PROTO_GETTER(global); PROTO_GETTER(ignoreCase); PROTO_GETTER(lastIndex); PROTO_GETTER(multiline); PROTO_GETTER(source); PROTO_GETTER(sticky); PROTO_GETTER(unicode); #undef OBJ_METHOD #undef PROTO_METHOD EJS_INSTALL_SYMBOL_FUNCTION_FLAGS (_ejs_RegExp, create, _ejs_RegExp_create, EJS_PROP_NOT_ENUMERABLE); }
void _ejs_typedarrays_init(ejsval global) { #define OBJ_METHOD(t,x) EJS_INSTALL_ATOM_FUNCTION(_ejs_##t, x, _ejs_##t##_##x) #define PROTO_METHOD(t,x) EJS_INSTALL_ATOM_FUNCTION(_ejs_##t##_prototype, x, _ejs_##t##_prototype_##x) #define PROTO_METHOD_IMPL(t,x) EJS_INSTALL_ATOM_FUNCTION(_ejs_##t##_prototype, x, _ejs_##t##_prototype_##x##_impl) #define PROTO_GETTER(t,x) EJS_INSTALL_SYMBOL_GETTER(_ejs_##t##_prototype, x, _ejs_##t##_prototype_get_##x) // ArrayBuffer { _ejs_ArrayBuffer = _ejs_function_new_without_proto (_ejs_null, _ejs_atom_ArrayBuffer, (EJSClosureFunc)_ejs_ArrayBuffer_impl); _ejs_object_setprop (global, _ejs_atom_ArrayBuffer, _ejs_ArrayBuffer); _ejs_gc_add_root (&_ejs_ArrayBuffer_prototype); _ejs_ArrayBuffer_prototype = _ejs_object_new(_ejs_null, &_ejs_Object_specops); _ejs_object_setprop (_ejs_ArrayBuffer, _ejs_atom_prototype, _ejs_ArrayBuffer_prototype); PROTO_METHOD(ArrayBuffer, slice); _ejs_object_define_value_property (_ejs_ArrayBuffer_prototype, _ejs_Symbol_toStringTag, _ejs_atom_ArrayBuffer, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_NOT_WRITABLE | EJS_PROP_CONFIGURABLE); } // DataView { _ejs_DataView = _ejs_function_new_without_proto (_ejs_null, _ejs_atom_DataView, (EJSClosureFunc)_ejs_DataView_impl); _ejs_object_setprop (global, _ejs_atom_DataView, _ejs_DataView); _ejs_gc_add_root (&_ejs_DataView_prototype); _ejs_DataView_prototype = _ejs_object_new (_ejs_null, &_ejs_Object_specops); _ejs_object_setprop (_ejs_DataView, _ejs_atom_prototype, _ejs_DataView_prototype); PROTO_METHOD_IMPL(DataView, getInt8); PROTO_METHOD_IMPL(DataView, setInt8); PROTO_METHOD_IMPL(DataView, getInt16); PROTO_METHOD_IMPL(DataView, setInt16); PROTO_METHOD_IMPL(DataView, getInt32); PROTO_METHOD_IMPL(DataView, setInt32); PROTO_METHOD_IMPL(DataView, getFloat32); PROTO_METHOD_IMPL(DataView, setFloat32); PROTO_METHOD_IMPL(DataView, getFloat64); PROTO_METHOD_IMPL(DataView, setFloat64); _ejs_object_define_value_property (_ejs_DataView_prototype, _ejs_Symbol_toStringTag, _ejs_atom_DataView, EJS_PROP_NOT_ENUMERABLE | EJS_PROP_NOT_WRITABLE | EJS_PROP_CONFIGURABLE); } #define ADD_TYPEDARRAY(EnumType, ArrayType, arraytype, elementSizeInBytes) EJS_MACRO_START \ _ejs_##ArrayType##Array = _ejs_function_new_without_proto (_ejs_null, _ejs_atom_##ArrayType##Array, (EJSClosureFunc)_ejs_##ArrayType##Array_impl); \ _ejs_object_setprop (global, _ejs_atom_##ArrayType##Array, _ejs_##ArrayType##Array); \ \ _ejs_gc_add_root (&_ejs_##ArrayType##Array_prototype); \ _ejs_##ArrayType##Array_prototype = _ejs_object_new(_ejs_null, &_ejs_Object_specops); \ _ejs_object_setprop (_ejs_##ArrayType##Array, _ejs_atom_prototype, _ejs_##ArrayType##Array_prototype); \ \ /* make sure ctor.BYTES_PER_ELEMENT is defined */ \ _ejs_object_define_value_property (_ejs_##ArrayType##Array, _ejs_atom_BYTES_PER_ELEMENT, NUMBER_TO_EJSVAL(elementSizeInBytes), EJS_PROP_FLAGS_ENUMERABLE); \ \ _ejs_typed_array_elsizes[EJS_TYPEDARRAY_##EnumType] = elementSizeInBytes; \ _ejs_typed_array_protos[EJS_TYPEDARRAY_##EnumType] = _ejs_##ArrayType##Array_prototype; \ _ejs_typed_array_specops[EJS_TYPEDARRAY_##EnumType] = &_ejs_##arraytype##array_specops; \ \ PROTO_METHOD_IMPL(ArrayType##Array, get); \ PROTO_METHOD_IMPL(ArrayType##Array, set); \ PROTO_METHOD_IMPL(ArrayType##Array, subarray); \ PROTO_GETTER(ArrayType##Array, toStringTag); /* XXX needs to be enumerable: false, configurable: true */ \ EJS_MACRO_END ADD_TYPEDARRAY(INT8, Int8, int8, 1); ADD_TYPEDARRAY(UINT8, Uint8, uint8, 1); //ADD_TYPEDARRAY(UINT8CLAMPED, Uint8Clamped, uint8clamped, 1); ADD_TYPEDARRAY(INT16, Int16, int16, 2); ADD_TYPEDARRAY(UINT16, Uint16, uint16, 2); ADD_TYPEDARRAY(INT32, Int32, int32, 4); ADD_TYPEDARRAY(UINT32, Uint32, uint32, 4); ADD_TYPEDARRAY(FLOAT32, Float32, float32, 4); ADD_TYPEDARRAY(FLOAT64, Float64, float64, 8); }