static int File_ReadText(duk_context* ctx) { duk_push_this(ctx); File* file = js_to_class_instance<File>(ctx, -1, 0); String text; file->ReadText(text); duk_push_string(ctx, text.CString()); return 1; }
/* Constructor */ DUK_INTERNAL duk_ret_t duk_bi_logger_constructor(duk_context *ctx) { duk_hthread *thr = (duk_hthread *) ctx; duk_idx_t nargs; /* Calling as a non-constructor is not meaningful. */ if (!duk_is_constructor_call(ctx)) { return DUK_RET_TYPE_ERROR; } nargs = duk_get_top(ctx); duk_set_top(ctx, 1); duk_push_this(ctx); /* [ name this ] */ if (nargs == 0) { /* Automatic defaulting of logger name from caller. This would * work poorly with tail calls, but constructor calls are currently * never tail calls, so tail calls are not an issue now. */ if (thr->callstack_top >= 2) { duk_activation *act_caller = thr->callstack + thr->callstack_top - 2; duk_hobject *func_caller; func_caller = DUK_ACT_GET_FUNC(act_caller); if (func_caller) { /* Stripping the filename might be a good idea * ("/foo/bar/quux.js" -> logger name "quux"), * but now used verbatim. */ duk_push_hobject(ctx, func_caller); duk_get_prop_stridx(ctx, -1, DUK_STRIDX_FILE_NAME); duk_replace(ctx, 0); } } } /* the stack is unbalanced here on purpose; we only rely on the * initial two values: [ name this ]. */ if (duk_is_string(ctx, 0)) { duk_dup(ctx, 0); duk_put_prop_stridx(ctx, 1, DUK_STRIDX_LC_N); } else { /* don't set 'n' at all, inherited value is used as name */ } duk_compact(ctx, 1); return 0; /* keep default instance */ }
static duk_ret_t js_Font_clone(duk_context* ctx) { font_t* font; duk_push_this(ctx); duk_get_prop_string(ctx, -1, "\xFF" "ptr"); font = duk_get_pointer(ctx, -1); duk_pop(ctx); duk_pop(ctx); // TODO: actually clone font in Font:clone() duk_push_sphere_font(ctx, font); return 1; }
static GumDukStalker * gumjs_stalker_from_args (const GumDukArgs * args) { duk_context * ctx = args->ctx; GumDukStalker * self; duk_push_this (ctx); self = _gum_duk_require_data (ctx, -1); duk_pop (ctx); return self; }
static int NativeGetAllProps(duk_context* ctx) { if (!duk_is_string(ctx, 0)) { duk_error(ctx, DUK_ERR_TYPE_ERROR, "First argument must be the interface name"); } duk_push_c_lightfunc(ctx, AJS_MarshalMethodCall, 1, 0, 0); duk_push_this(ctx); MessageSetup(ctx, &AJ_PropertiesIface[0][1], "GetAll", NULL, AJ_MSG_METHOD_CALL); duk_dup(ctx, 0); duk_call_method(ctx, 1); return 1; }
static duk_ret_t js_Logger_write(duk_context* ctx) { const char* text = duk_to_string(ctx, 0); logger_t* logger; duk_push_this(ctx); logger = duk_require_sphere_obj(ctx, -1, "Logger"); write_log_line(logger, NULL, text); return 0; }
static duk_ret_t js_Sound_reset(duk_context* ctx) { sound_t* sound; duk_push_this(ctx); duk_get_prop_string(ctx, -1, "\xFF" "ptr"); sound = duk_get_pointer(ctx, -1); duk_pop(ctx); duk_pop(ctx); seek_sound(sound, 0); play_sound(sound); return 0; }
static int Light_SetShadowBias(duk_context* ctx) { float constantBias = (float) duk_to_number(ctx, 0); float slopeScaledBias = (float) duk_to_number(ctx, 1); BiasParameters bparms(constantBias, slopeScaledBias); duk_push_this(ctx); Light* light = js_to_class_instance<Light>(ctx, -1, 0); light->SetShadowBias(bparms); return 0; }
int duk_bi_error_prototype_to_string(duk_context *ctx) { /* FIXME: optimize with more direct internal access */ duk_push_this(ctx); if (!duk_is_object(ctx, -1)) { goto type_error; } /* [ ... this ] */ duk_get_prop_stridx(ctx, -1, DUK_STRIDX_NAME); if (duk_is_undefined(ctx, -1)) { duk_pop(ctx); duk_push_string(ctx, "Error"); } else { duk_to_string(ctx, -1); } /* [ ... this name ] */ /* FIXME: Are steps 6 and 7 in E5 Section 15.11.4.4 duplicated by * accident or are they actually needed? The first ToString() * could conceivably return 'undefined'. */ duk_get_prop_stridx(ctx, -2, DUK_STRIDX_MESSAGE); if (duk_is_undefined(ctx, -1)) { duk_pop(ctx); duk_push_string(ctx, ""); } else { duk_to_string(ctx, -1); } /* [ ... this name message ] */ if (duk_get_length(ctx, -2) == 0) { /* name is empty -> return message */ return 1; } if (duk_get_length(ctx, -1) == 0) { /* message is empty -> return name */ duk_pop(ctx); return 1; } duk_push_string(ctx, ": "); duk_insert(ctx, -2); /* ... name ': ' message */ duk_concat(ctx, 3); return 1; type_error: return DUK_RET_TYPE_ERROR; }
static duk_ret_t js_Font_getStringWidth(duk_context* ctx) { const char* text = duk_to_string(ctx, 0); font_t* font; duk_push_this(ctx); font = duk_require_sphere_obj(ctx, -1, "Font"); duk_pop(ctx); duk_push_int(ctx, get_text_width(font, text)); return 1; }
static duk_ret_t js_Sound_setPitch(duk_context* ctx) { float new_pitch = duk_require_number(ctx, 0); sound_t* sound; duk_push_this(ctx); duk_get_prop_string(ctx, -1, "\xFF" "ptr"); sound = duk_get_pointer(ctx, -1); duk_pop(ctx); duk_pop(ctx); set_sound_pitch(sound, new_pitch); return 0; }
static duk_ret_t js_Font_drawTextBox(duk_context* ctx) { int x = duk_require_int(ctx, 0); int y = duk_require_int(ctx, 1); int w = duk_require_int(ctx, 2); int h = duk_require_int(ctx, 3); int offset = duk_require_int(ctx, 4); const char* text = duk_to_string(ctx, 5); font_t* font; int line_height; const char* line_text; color_t mask; int num_lines; int i; duk_push_this(ctx); font = duk_require_sphere_obj(ctx, -1, "Font"); duk_get_prop_string(ctx, -1, "\xFF" "color_mask"); mask = duk_require_sphere_color(ctx, -1); duk_pop(ctx); duk_pop(ctx); if (!screen_is_skipframe(g_screen)) { duk_push_c_function(ctx, js_Font_wordWrapString, DUK_VARARGS); duk_push_this(ctx); duk_push_string(ctx, text); duk_push_int(ctx, w); duk_call_method(ctx, 2); duk_get_prop_string(ctx, -1, "length"); num_lines = duk_get_int(ctx, -1); duk_pop(ctx); line_height = get_font_line_height(font); for (i = 0; i < num_lines; ++i) { duk_get_prop_index(ctx, -1, i); line_text = duk_get_string(ctx, -1); duk_pop(ctx); draw_text(font, mask, x + offset, y, TEXT_ALIGN_LEFT, line_text); y += line_height; } duk_pop(ctx); } return 0; }
static duk_ret_t js_Font_getCharacterImage(duk_context* ctx) { int cp = duk_require_int(ctx, 0); font_t* font; duk_push_this(ctx); font = duk_require_sphere_obj(ctx, -1, "Font"); duk_pop(ctx); duk_push_sphere_image(ctx, get_glyph_image(font, cp)); return 1; }
static duk_ret_t js_Sound_setRepeat(duk_context* ctx) { bool is_looped = duk_require_boolean(ctx, 0); sound_t* sound; duk_push_this(ctx); duk_get_prop_string(ctx, -1, "\xFF" "ptr"); sound = duk_get_pointer(ctx, -1); duk_pop(ctx); duk_pop(ctx); set_sound_looping(sound, is_looped); return 0; }
static duk_ret_t js_Logger_beginBlock(duk_context* ctx) { const char* title = duk_to_string(ctx, 0); logger_t* logger; duk_push_this(ctx); logger = duk_require_sphere_obj(ctx, -1, "Logger"); if (!begin_log_block(logger, title)) duk_error_ni(ctx, -1, DUK_ERR_ERROR, "Log:beginBlock(): Failed to create new log block"); return 0; }
static duk_ret_t js_Sound_setVolume(duk_context* ctx) { float new_gain = duk_require_int(ctx, 0); sound_t* sound; duk_push_this(ctx); duk_get_prop_string(ctx, -1, "\xFF" "ptr"); sound = duk_get_pointer(ctx, -1); duk_pop(ctx); duk_pop(ctx); set_sound_gain(sound, (float)new_gain / 255); return 0; }
static duk_ret_t js_RawFile_get_position(duk_context* ctx) { FILE* file; duk_push_this(ctx); file = duk_require_sphere_obj(ctx, -1, "RawFile"); duk_pop(ctx); if (file == NULL) duk_error_ni(ctx, -1, DUK_ERR_ERROR, "RawFile:position - File has been closed"); duk_push_int(ctx, ftell(file)); return 1; }
// Binding int w_LocalStorage_constructor(duk_context *ctx) { LocalStorage *inst = new LocalStorage(); setNativePointer(ctx, inst); // Create an object property to save data duk_push_this(ctx); /* this */ duk_push_object(ctx); /* this, emptyObj */ duk_put_prop_string(ctx, -2, "__MURAL_DATA__"); /* this */ duk_pop(ctx); return 1; }
static duk_ret_t js_Font_getStringWidth(duk_context* ctx) { const char* text = duk_to_string(ctx, 0); font_t* font; duk_push_this(ctx); duk_get_prop_string(ctx, -1, "\xFF" "ptr"); font = duk_get_pointer(ctx, -1); duk_pop(ctx); duk_pop(ctx); duk_push_int(ctx, get_text_width(font, text)); return 1; }
static duk_ret_t js_Font_getCharacterImage(duk_context* ctx) { int cp = duk_require_int(ctx, 0); font_t* font; duk_push_this(ctx); duk_get_prop_string(ctx, -1, "\xFF" "ptr"); font = duk_get_pointer(ctx, -1); duk_pop(ctx); duk_pop(ctx); duk_push_sphere_image(ctx, get_glyph_image(font, cp)); return 1; }
static duk_ret_t js_Sound_setPosition(duk_context* ctx) { int new_pos = duk_require_int(ctx, 0); sound_t* sound; duk_push_this(ctx); duk_get_prop_string(ctx, -1, "\xFF" "ptr"); sound = duk_get_pointer(ctx, -1); duk_pop(ctx); duk_pop(ctx); seek_sound(sound, new_pos); return 0; }
static duk_ret_t js_Font_getStringHeight(duk_context* ctx) { const char* text = duk_to_string(ctx, 0); int width = duk_require_int(ctx, 1); font_t* font; int num_lines; duk_push_this(ctx); font = duk_require_sphere_obj(ctx, -1, "Font"); duk_pop(ctx); duk_push_c_function(ctx, js_Font_wordWrapString, DUK_VARARGS); duk_push_this(ctx); duk_push_string(ctx, text); duk_push_int(ctx, width); duk_call_method(ctx, 2); duk_get_prop_string(ctx, -1, "length"); num_lines = duk_get_int(ctx, -1); duk_pop(ctx); duk_pop(ctx); duk_push_int(ctx, get_font_line_height(font) * num_lines); return 1; }
static int Camera_GetScreenRay(duk_context* ctx) { float x = (float) duk_to_number(ctx, 0); float y = (float) duk_to_number(ctx, 1); duk_push_this(ctx); Camera* camera = js_to_class_instance<Camera>(ctx, -1, 0); Ray ray = camera->GetScreenRay(x, y); duk_push_new_ray(ctx, ray); return 1; }
static duk_ret_t dukky_before_unload_event_returnValue_setter(duk_context *ctx) { /* Get private data for method */ before_unload_event_private_t *priv = NULL; duk_push_this(ctx); duk_get_prop_string(ctx, -1, dukky_magic_string_private); priv = duk_get_pointer(ctx, -1); duk_pop_2(ctx); if (priv == NULL) { return 0; /* can do? No can do. */ } return 0; }
duk_ret_t duk_bi_number_constructor(duk_context *ctx) { duk_idx_t nargs; duk_hobject *h_this; /* * The Number constructor uses ToNumber(arg) for number coercion * (coercing an undefined argument to NaN). However, if the * argument is not given at all, +0 must be used instead. To do * this, a vararg function is used. */ nargs = duk_get_top(ctx); if (nargs == 0) { duk_push_int(ctx, 0); } duk_to_number(ctx, 0); duk_set_top(ctx, 1); DUK_ASSERT_TOP(ctx, 1); if (!duk_is_constructor_call(ctx)) { return 1; } /* * E5 Section 15.7.2.1 requires that the constructed object * must have the original Number.prototype as its internal * prototype. However, since Number.prototype is non-writable * and non-configurable, this doesn't have to be enforced here: * The default object (bound to 'this') is OK, though we have * to change its class. * * Internal value set to ToNumber(arg) or +0; if no arg given, * ToNumber(undefined) = NaN, so special treatment is needed * (above). String internal value is immutable. */ /* XXX: helper */ duk_push_this(ctx); h_this = duk_get_hobject(ctx, -1); DUK_ASSERT(h_this != NULL); DUK_HOBJECT_SET_CLASS_NUMBER(h_this, DUK_HOBJECT_CLASS_NUMBER); DUK_ASSERT(h_this->prototype == ((duk_hthread *) ctx)->builtins[DUK_BIDX_NUMBER_PROTOTYPE]); DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_this) == DUK_HOBJECT_CLASS_NUMBER); DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h_this)); duk_dup(ctx, 0); /* -> [ val obj val ] */ duk_def_prop_stridx(ctx, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); return 0; /* no return value -> don't replace created value */ }
static duk_ret_t dukky_video_track_kind_getter(duk_context *ctx) { /* Get private data for method */ video_track_private_t *priv = NULL; duk_push_this(ctx); duk_get_prop_string(ctx, -1, dukky_magic_string_private); priv = duk_get_pointer(ctx, -1); duk_pop_2(ctx); if (priv == NULL) { return 0; /* can do? No can do. */ } return 0; }
static duk_ret_t dukky_html_embed_element_name_setter(duk_context *ctx) { /* Get private data for method */ html_embed_element_private_t *priv = NULL; duk_push_this(ctx); duk_get_prop_string(ctx, -1, dukky_magic_string_private); priv = duk_get_pointer(ctx, -1); duk_pop_2(ctx); if (priv == NULL) { return 0; /* can do? No can do. */ } return 0; }
static duk_ret_t dukky_document_fragment_childElementCount_getter(duk_context *ctx) { /* Get private data for method */ document_fragment_private_t *priv = NULL; duk_push_this(ctx); duk_get_prop_string(ctx, -1, dukky_magic_string_private); priv = duk_get_pointer(ctx, -1); duk_pop_2(ctx); if (priv == NULL) { return 0; /* can do? No can do. */ } return 0; }
DUK_INTERNAL duk_ret_t duk_bi_object_prototype_defineaccessor(duk_hthread *thr) { duk_push_this(thr); duk_insert(thr, 0); duk_to_object(thr, 0); duk_require_callable(thr, 2); /* [ ToObject(this) key getter/setter ] */ /* ToPropertyKey() coercion is not needed, duk_def_prop() does it. */ duk_def_prop(thr, 0, DUK_DEFPROP_SET_ENUMERABLE | DUK_DEFPROP_SET_CONFIGURABLE | (duk_get_current_magic(thr) ? DUK_DEFPROP_HAVE_SETTER : DUK_DEFPROP_HAVE_GETTER)); return 0; }
int w_LocalStorage_prototype_getItem(duk_context *ctx) { const char *key = duk_require_string(ctx, 0); duk_push_this(ctx); /* this */ duk_get_prop_string(ctx, -1, "__MURAL_DATA__"); /* this, __MURAL_DATA__ */ duk_get_prop_string(ctx, -1, key); /* this, __MURAL_DATA__, value */ const char *value = duk_to_string(ctx, -1); /* this, __MURAL_DATA__, string(value) */ duk_pop_3(ctx); duk_push_string(ctx, value); return 1; }