aboutsummaryrefslogblamecommitdiffstats
path: root/vendor/gopkg.in/olebedev/go-duktape.v3/duk_v1_compat.c
blob: e4a44db729f670479b30a22e61a613b38b68e68c (plain) (tree)


































































































































                                                                                            
#include <stdio.h>
#include "duktape.h"
#include "duk_v1_compat.h"

/*
 *  duk_dump_context_{stdout,stderr}()
 */

void duk_dump_context_stdout(duk_context *ctx) {
    duk_push_context_dump(ctx);
    fprintf(stdout, "%s\n", duk_safe_to_string(ctx, -1));
    duk_pop(ctx);
}

void duk_dump_context_stderr(duk_context *ctx) {
    duk_push_context_dump(ctx);
    fprintf(stderr, "%s\n", duk_safe_to_string(ctx, -1));
    duk_pop(ctx);
}

/*
 *  duk_push_string_file() and duk_push_string_file_raw()
 */

const char *duk_push_string_file_raw(duk_context *ctx, const char *path, duk_uint_t flags) {
    FILE *f = NULL;
    char *buf;
    long sz;  /* ANSI C typing */

    if (!path) {
        goto fail;
    }
    f = fopen(path, "rb");
    if (!f) {
        goto fail;
    }
    if (fseek(f, 0, SEEK_END) < 0) {
        goto fail;
    }
    sz = ftell(f);
    if (sz < 0) {
        goto fail;
    }
    if (fseek(f, 0, SEEK_SET) < 0) {
        goto fail;
    }
    buf = (char *) duk_push_fixed_buffer(ctx, (duk_size_t) sz);
    if ((size_t) fread(buf, 1, (size_t) sz, f) != (size_t) sz) {
        duk_pop(ctx);
        goto fail;
    }
    (void) fclose(f);  /* ignore fclose() error */
    return duk_buffer_to_string(ctx, -1);

 fail:
    if (f) {
        (void) fclose(f);  /* ignore fclose() error */
    }

    if (flags & DUK_STRING_PUSH_SAFE) {
        duk_push_undefined(ctx);
    } else {
        (void) duk_type_error(ctx, "read file error");
    }
    return NULL;
}

/*
 *  duk_eval_file(), duk_compile_file(), and their variants
 */

void duk_eval_file(duk_context *ctx, const char *path) {
    duk_push_string_file_raw(ctx, path, 0);
    duk_push_string(ctx, path);
    duk_compile(ctx, DUK_COMPILE_EVAL);
    duk_push_global_object(ctx);  /* 'this' binding */
    duk_call_method(ctx, 0);
}

void duk_eval_file_noresult(duk_context *ctx, const char *path) {
    duk_eval_file(ctx, path);
    duk_pop(ctx);
}

duk_int_t duk_peval_file(duk_context *ctx, const char *path) {
    duk_int_t rc;

    duk_push_string_file_raw(ctx, path, DUK_STRING_PUSH_SAFE);
    duk_push_string(ctx, path);
    rc = duk_pcompile(ctx, DUK_COMPILE_EVAL);
    if (rc != 0) {
        return rc;
    }
    duk_push_global_object(ctx);  /* 'this' binding */
    rc = duk_pcall_method(ctx, 0);
    return rc;
}

duk_int_t duk_peval_file_noresult(duk_context *ctx, const char *path) {
    duk_int_t rc;

    rc = duk_peval_file(ctx, path);
    duk_pop(ctx);
    return rc;
}

void duk_compile_file(duk_context *ctx, duk_uint_t flags, const char *path) {
    duk_push_string_file_raw(ctx, path, 0);
    duk_push_string(ctx, path);
    duk_compile(ctx, flags);
}

duk_int_t duk_pcompile_file(duk_context *ctx, duk_uint_t flags, const char *path) {
    duk_int_t rc;

    duk_push_string_file_raw(ctx, path, DUK_STRING_PUSH_SAFE);
    duk_push_string(ctx, path);
    rc = duk_pcompile(ctx, flags);
    return rc;
}

/*
 *  duk_to_defaultvalue()
 */

void duk_to_defaultvalue(duk_context *ctx, duk_idx_t idx, duk_int_t hint) {
    duk_require_type_mask(ctx, idx, DUK_TYPE_MASK_OBJECT |
                                    DUK_TYPE_MASK_BUFFER |
                                    DUK_TYPE_MASK_LIGHTFUNC);
    duk_to_primitive(ctx, idx, hint);
}